Skip to content

Stage improved testing #351

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 34 commits into from
Apr 14, 2025
Merged

Stage improved testing #351

merged 34 commits into from
Apr 14, 2025

Conversation

reactive-firewall
Copy link
Collaborator

@reactive-firewall reactive-firewall commented Apr 7, 2025

Patch Notes v2.0.6

Impacted GHI

Included PRs


Comprehensive Overview: PR #351 - Stage improved testing

Executive Summary

PR #351 represents a substantial quality enhancement release for the multicast module, implementing version 2.0.6 with 1316 additions and 96 deletions across 27 files. The PR consolidates work from multiple development efforts (superseding PRs #348, #349, #350, #354, #359) and addresses 10 specific issues. This release focuses on four major areas: configurable buffer sizes, enhanced logging capabilities, improved security in testing contexts, and expanded test coverage.

Key Implementations

1. Configurable Buffer Size Feature

A new environment-configurable buffer size system has been implemented, replacing hardcoded buffer values with a dynamic configuration:

  • Introduced _MCAST_DEFAULT_BUFFER_SIZE (default: 1316) in multicast/__init__.py
  • Added validation through new functions in multicast/env.py:
    • validate_buffer_size(): Ensures buffer sizes meet RFC constraints
    • load_buffer_size(): Retrieves and validates the buffer size from environment variables
  • Updated both Send and Receive implementations to honor this configurable buffer size

This enhancement improves flexibility while maintaining standards compliance, closing issue #264.

2. Enhanced Logging System

A comprehensive logging framework has been implemented throughout the codebase:

  • Added the logging module to all core files
  • Established module-specific loggers for granular control
  • Refactored string formatting to use lazy evaluation for better performance
  • Added strategic log points to facilitate debugging and operational visibility
  • Updated configuration in .coveragerc to properly handle debug-conditional code

This work closes issue #233, significantly improving the module's observability.

3. Security Enhancements

Security has been strengthened, particularly in testing contexts:

  • Added taint_command_args() function to sanitize command arguments and prevent injection attacks
  • Implemented whitelist validation for command execution
  • Added type hints to improve code clarity and safety
  • Enhanced error handling for subprocess operations

These security improvements close issues #249 and address concerns in #134 and #276.

4. Testing Infrastructure Improvements

Testing capabilities have been substantially expanded:

  • Added a new test file tests/test_recv.py with comprehensive test coverage for the receiver functionality
  • Enhanced existing tests in tests/test_hear_data_processing.py to validate empty data handling
  • Improved mock implementations to ensure proper testing of internal methods
  • Added regression tests for typos in tests/check_spelling
  • Restructured test cleanup in the Makefile for better organization

These testing enhancements close issues #241, #273, and #357.

5. Additional Improvements

  • Version Updates: Bumped version to 2.0.6 across configuration files (setup.cfg, docs/conf.py, multicast/__init__.py)
  • Dependency Updates: Updated GitHub Actions dependencies (CodeQL and Scorecard actions)
  • Style Improvements: Fixed various linting issues (PYL-W1203, PYL-C0201)
  • AST Rules: Added new AST-grep rules for trailing commas and argument formatting
  • Documentation: Enhanced docstrings and comments throughout the codebase

Technical Impact

The PR introduces significant technical improvements while maintaining backward compatibility:

  1. Modularity: Separated buffer size configuration from core logic
  2. Standardization: Ensured buffer sizes comply with RFC specifications
  3. Observability: Implemented consistent logging patterns across modules
  4. Security: Hardened test command execution against potential injection
  5. Quality: Expanded test coverage for edge cases and error conditions

Development Context

This PR represents the culmination of work across multiple branches and issues, including:

The commits show an iterative development approach, with multiple review-driven refinements and collaborative improvements, including contributions from CodeRabbit AI.

Conclusion

PR #351 delivers a substantial quality enhancement to the multicast module through its comprehensive approach to addressing multiple aspects of the codebase simultaneously. The configurable buffer sizes, enhanced logging, security improvements, and expanded testing collectively strengthen the module's reliability, maintainability, and security posture.

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Introduced a configurable buffer size for multicast communication, allowing customization via environment settings.
  • Improvements

    • Enhanced logging capabilities throughout the multicast module for better traceability and debugging.
    • Improved validation and error handling for multicast data processing to ensure reliable and standards-compliant performance.
    • Updated documentation to clarify buffer size usage and data handling expectations.
  • Tests

    • Expanded test coverage for handling edge-case data scenarios, including empty and invalid inputs, and improved overall quality checks.
    • Added validation for command arguments to enhance security against command injection attacks.
  • Version Updates

    • Updated version to 2.0.6 across relevant components.

 * This is a Partial implementation
…ation (- WIP #264 -)

Changes in file multicast/__init__.py:
 * new global `_MCAST_DEFAULT_BUFFER_SIZE` which can be overriden by the environment variable 'MULTICAST_BUFFER_SIZE' if set.

Changes in file multicast/env.py:
 * load_config
   * related work

 * validate_buffer_size
   * implemented new validation function

 * load_buffer_size
   * implemented new helper function
Changes in file multicast/__init__.py:
 * cleaned up docstrings a bit.

Changes in file multicast/env.py:
 * Minor improvements to docstrings including doctests.
Changes in file multicast/env.py:
 * minor tweaks and related work

Changes in file multicast/recv.py:
 * RECV implementation now honors new environment variable for muticast message buffering (- WIP #264 -)
 * related work

Changes in file multicast/send.py:
 * SEND implementation now honors new environment variable for muticast message buffering (- WIP #264 -)
 * related work
Changes in file multicast/recv.py:
 * suppress false-positive PYL-W0212

Changes in file multicast/send.py:
 * suppress false-positive PYL-W0212
Changes in file multicast/send.py:
 * added a premptive comma
Changes in file multicast/recv.py:
 * fixed some typos 🙈

Changes in file tests/check_spelling:
 * added regression checks to prevent repeats of these typos 🚀
 * Hardenning for test subproccess calls in testing context.

Changes in file tests/context.py:
 * New function to taint args for shell commands
 * related work
Changes in file tests/context.py:
 * taint_command_args -- fixed another CWE-20 found in review
 * added related type hints too (- WIP #134 & #276 -)
 * related work (- WIP #249 -)
Changes in file tests/test_hear_data_processing.py:
 * improved mocking of handler tests to ensure
 - [x] Closes PR/MR #248
 - [x] Closes PR/MR #249
 - [x] Closes PR/MR #350
Changes in file docs/conf.py:
 * version bump to v2.0.6

Changes in file multicast/__init__.py:
 * version bump to v2.0.6

Changes in file setup.cfg:
 * version bump to v2.0.6
Copy link
Contributor

coderabbitai bot commented Apr 7, 2025

Walkthrough

The changes introduce a new global variable _MCAST_DEFAULT_BUFFER_SIZE in the multicast module, replacing the previous fixed buffer value. New functions (validate_buffer_size and load_buffer_size) in the environment module ensure that the buffer size is read from the environment variable and validated. The multicast sender and receiver now use this configurable value instead of a hardcoded constant. Additionally, test files have been updated to reflect the changes in configuration, improve spelling checks, and enhance command argument security through a new tainting function.

Changes

File(s) Change Summary
multicast/__init__.py, multicast/recv.py, multicast/send.py Introduced the _MCAST_DEFAULT_BUFFER_SIZE variable (default: 1316), removed the old variable, updated documentation, and replaced hardcoded buffer sizes with the dynamic variable for multicast communication.
multicast/env.py Added validate_buffer_size and load_buffer_size functions to validate and load the multicast buffer size from the environment. Modified load_config to call the new function, ensuring buffer size adheres to specified constraints.
tests/check_spelling Extended the SPECIFIC_TYPOS array with new entries for "reccomended:recommended" and "absolutly:absolutely", improving typo detection in test scripts.
tests/context.py Added the taint_command_args function to sanitize command arguments against injection. Updated checkPythonCommand and checkPythonFuzzing to incorporate these sanitization checks before executing commands.
tests/test_hear_data_processing.py Revised test cases for multicast sender/receiver functionality, introduced a fixture for the multicast address, and added checks to ensure proper handling of empty and invalid UTF-8 data.
docs/conf.py, setup.cfg Updated versioning from "2.0.5" to "2.0.6" in both documentation and setup configuration files to reflect the new release.

Possibly related PRs

  • Enhance Logging and Update Test and Coverage Workflows #354: The changes in the main PR, which enhance logging capabilities and introduce a new global variable for buffer size, are related to the retrieved PR as both involve significant logging improvements across various modules, including the addition of loggers and the replacement of print statements with logging calls.

Suggested labels

Documentation

Poem

Hoppin’ through the code with a cheerful hop,
A new buffer size makes our multicast pop!
Validated and loaded with care so bright,
Our tests and commands now work just right.
Coding with carrots, my world feels light! 🐇💻

Tip

⚡💬 Agentic Chat (Pro Plan, General Availability)
  • We're introducing multi-step agentic chat in review comments and issue comments, within and outside of PR's. This feature enhances review and issue discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments and add commits to existing pull requests.
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-project-automation github-project-automation bot moved this from Resolved to Done in Multicast Project Apr 14, 2025
reactive-firewall added a commit that referenced this pull request May 4, 2025
…bringing together improvements from over 40 previous PRs and addressing over 40 distinct issues. It serves as a comprehensive preparation for future development, establishing strong foundations for the upcoming 2.1 version.

These changes aim to enhance code quality, enforce best practices, and streamline CI/CD processes.

---

- **Files Changed**: 100 files across 10 directories
- **Code Volume**: 4,905 lines added, 1,059 lines deleted
- **Impact Scope**:
  - Core Python Files: 8 files (1,370 lines added, 447 lines deleted)
  - Documentation: 12 files (425 lines added, 145 lines deleted)
  - Configuration: 80 files (3,110+ lines added, ~467 lines deleted)
- **Issue Resolution**: Closes 44+ distinct issues
- **PR Consolidation**: Supersedes 42+ previous PRs
- **Milestone**: Concludes "Pre-Version 2.1 Chores" (milestone/13)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

- **New Features**
  - Introduced extensive static analysis and linting rule configurations for Python and YAML, enforcing documentation, naming conventions, code style, and GitHub Actions workflow patterns.
  - Added new GitHub Actions workflows for Flake8 and ShellCheck, and a continuous deployment workflow for PyPI publishing.
  - Implemented custom GitHub Actions for artifact management and pip upgrades on Windows.
  - Enhanced Makefile with new branding, improved build/install/test targets, and better environment compatibility.
  - Added a comprehensive CI/CD output formatting tool for GitHub Actions.

- **Bug Fixes**
  - Improved error handling, logging, and validation across core modules (`multicast`, `env`, `exceptions`, `recv`, `hear`, `send`, `skt`).
  - Standardized string literals and exception variable naming for clarity and consistency.

- **Documentation**
  - Expanded CI and environment configuration documentation, including new badges, usage examples, and copyright/license.
  - Improved docstrings, exception guides, and FAQ with clearer examples and error handling.

- **Chores**
  - Updated configuration files for coverage, pytest, and dependencies.
  - Enhanced `.gitignore` and labeling configuration for better project maintenance.
  - Added and updated test scripts and test suite organization for improved coverage and grouping.

- **Style**
  - Refactored codebase for consistent string usage, formatting, and logging practices.

- **Tests**
  - Reorganized and expanded test suite structure, added dynamic doctest loading, and improved test marker definitions.

- **Refactor**
  - Modularized and improved import logic, logging, and internal helper functions for maintainability and robustness.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

1. **Error Handling Improvements**:
   - Refactored exception handling for better traceability and maintainability.
   - Introduced `ShutdownCommandReceived` exception for explicit shutdown command handling.

2. **Documentation and Templates**:
   - Expanded CI and environment configuration documentation, including new badges, usage examples, and copyright/license.
   - Improved docstrings, exception guides, and FAQ with clearer examples and error handling.

- Added new tests for Python versions, workflows for minimal acceptance, and doctests.
- Enhanced test suite structure, added dynamic doctest loading, and improved test marker definitions.

1. **Static Analysis and Linting**:
   - Introduced extensive static analysis and linting rule configurations for Python and YAML, enforcing documentation, naming conventions, code style, and GitHub Actions workflow patterns.
   - Added 20 new AST-grep rules, including 16 multicast-specific, 3 Python-specific, and 1 GHA-specific rules.

2. **Enhanced GitHub Actions**:
   - New workflows for **Flake8**, **Shellcheck**, **CD-PyPi**, and **Makefile Lint**.
   - Updates to existing workflows for CI, testing, and code quality checks.
   - Improved automation for packaging, testing, and deployment.

3. **Housekeeping and Configuration**:
   - Revised `.gitignore` to exclude more development artifacts.
   - Enhanced `Makefile` with new targets (`branding`, `purge-coverage-artifacts`), dependencies management, and defaults.

- Improved error handling, logging, and validation across core modules (`multicast`, `env`, `exceptions`, `recv`, `hear`, `send`, `skt`).
- Standardized string literals and exception variable naming for clarity and consistency.

- **Removed Legacy Scripts**: Tools like `tool_checkmake.sh` and `tool_shlock_helper.sh` were replaced with symbolic links or moved under `.github/tools/`.
- **Workflow Adjustments**: Deprecated YAML configurations were replaced or updated with streamlined and secure alternatives.

The changes introduced in the `v2.0.8` release (compared to `v2.0.7`) are extensive and cover multiple areas of the repository.

   - **Refactoring Exception Handling:**
     - Changed exception variable naming from generic (e.g., `err`, `impErr`) to `_cause` for better traceability.
     - Improved `raise from` usage to maintain the original exception context.
     - Enhanced clarity and maintainability of error handling across the codebase.

   **Impact:**
   - These changes improve debugging and maintainability by providing more informative and granular error contexts. They also align with best practices for exception handling.

   - **`ShutdownCommandReceived` Exception:**
     - Added a new exception class to handle shutdown commands explicitly.
   - **AST-Grep Rules for Code Standardization:**
     - Introduced `.ast-grep` rules to enforce patterns for `doStep` and `setupArgs` implementations.
     - Added utility files for Python-specific AST validation.

   **Impact:**
   - These features enhance robustness by formalizing error handling for shutdown scenarios.
   - Enforcing code patterns ensures consistency in the implementation of core functions.

   - Updated exception handling examples in `Exception_Guide.md`.
   - Revised FAQ and usage documentation to reflect changes in error handling and function signatures.
   - Incremented version references in `docs/conf.py`.

   **Impact:**
   - Documentation is now more accurate and user-friendly, helping developers understand new conventions and best practices.

   - **Improved Coverage for Doctests:**
     - Added configurations to include only `multicast/*` files in coverage reports for doctests.
   - **Additional Test Cases:**
     - Added tests for edge cases and regression.
   - **Refinements in Test Utilities:**
     - Enhanced logging and output formatting using `cioutput.py`.

   **Impact:**
   - Enhanced test coverage and detailed reporting improve test reliability and debugging efficiency.

   - **New PyPI Deployment Workflow:**
     - Introduced `CD-PyPi.yml` workflow for automated publishing of releases to PyPI.
   - **Updated CI Workflows:**
     - Refined CI configurations to align with Python version updates and GitHub Action improvements.

   **Impact:**
   - The new deployment pipeline automates release publishing, reducing manual overhead.
   - Updated CI workflows leverage the latest tools and methodologies, ensuring compatibility and reliability.

   - **Consistency Improvements:**
     - Unified function type annotations for better static analysis.
     - Refactored redundant or deprecated patterns.
   - **Tooling Updates:**
     - Introduced `.github/tools/cioutput.py` for consistent CI/CD output formatting.
     - Enhanced Makefile with branding and improved task definitions.

   **Impact:**
   - These changes enhance code quality, readability, and maintainability.

   - **Deprecations:**
     - Removed obsolete shell scripts and replaced them with symbolic links or consolidated versions.
   - **Branding:**
     - Added branding to the Makefile for a more professional touch.

   **Impact:**
   - Streamlining and branding improve the overall developer experience and project presentation.

The `v2.0.8` release introduces significant improvements in exception handling, testing, build automation, and code quality. These changes enhance robustness, maintainability, and developer productivity.

- **Branding**: Added branding to the Makefile for a more professional touch.
- **Technical Debt Reduction**: Refactoring legacy code patterns and standardizing coding practices.

This release represents the culmination of numerous smaller efforts, bringing together improvements from over 40 previous PRs and addressing over 40 distinct issues. It serves as a comprehensive preparation for future development, establishing strong foundations for the upcoming 2.1 version.

The PR includes significant improvements to all core modules of the `multicast` package:
- **hear.py**: Substantial refactoring (348 additions, 53 deletions)
- **env.py**: Enhanced environment handling (263 additions, 51 deletions)
- **exceptions.py**: Improved error handling (189 additions, 50 deletions)
- **recv.py**: Optimized receiving functionality (183 additions, 54 deletions)
- **__init__.py**: Updated package initialization (162 additions, 75 deletions)

A major focus on code quality through:
- **20 New AST-grep Rules**: Including 16 multicast-specific, 3 Python-specific, and 1 GHA-specific rules
- **Code Style Standardization**: Consistent string handling and import organization
- **Documentation Requirements**: New rules for enforcing docstrings and test documentation

Comprehensive improvements to build and test infrastructure:
- **11 Workflow Files Updated**: Including 490+ lines of additions
- **New Workflows**: Added dedicated workflows for Flake8, ShellCheck, and PyPI deployment
- **Testing Improvements**: Enhanced pytest configuration (23 lines added)
- **GitHub Actions**: Multiple action upgrades for security and functionality

Significant documentation enhancements:
- **API Documentation**: Improved docstrings across the codebase
- **Usage Guidelines**: Updated USAGE.md, Exception_Guide.md, and FAQ.md
- **CI Documentation**: Added comprehensive CI.md (49 additions)
- **Documentation Tools**: Major improvements to docs/utils.py (216 additions)

This PR demonstrates systematic progression through:
1. **Dependency Maintenance**: 12 dependency updates via Dependabot
2. **Technical Debt Reduction**: Refactoring legacy code patterns
3. **Standardization**: Implementation of consistent coding standards
4. **Automation**: Enhanced testing and CI/CD capabilities
5. **Documentation**: Comprehensive documentation updates reflecting all changes

1. **Code Quality**: Implementation of robust static analysis rules
2. **Developer Experience**: Improved documentation and error handling
3. **Reliability**: Enhanced testing infrastructure and coverage
4. **Maintainability**: Standardized coding patterns and documentation requirements
5. **Build Process**: Streamlined CI/CD workflows with improved caching

> This release represents the culmination of numerous smaller efforts, bringing together improvements from over 40 previous PRs and addressing over 40 distinct issues. It serves as a comprehensive preparation for future development, establishing strong foundations for the upcoming 2.1 version.
>
> These changes aim to enhance code quality, enforce best practices, and streamline CI/CD processes.

 - [x] Closes #134
 - [x] Closes #135
 - [x] Closes #151
 - [x] Closes #165
 - [x] Closes #171
 - [x] Closes #199
 - [x] Closes #202
 - [x] Closes #203
 - [x] Closes #204
 - [x] Closes #205
 - [x] Closes #206
 - [x] Closes #207
 - [x] Closes #210
 - [x] Closes #213
 - [x] Closes #215
 - [x] Closes #222
 - [x] Closes #223
 - [x] Closes #224
 - [x] Closes #275
 - [x] Closes #232
 - [x] Closes #233
 * Contributes to #335
 - [x] Closes #239
 - [x] Closes #241
 - [x] Closes #254
 - [x] Closes #255
 - [x] Closes #264
 - [x] Closes #265
 - [x] Closes #266
 - [x] Closes #271
 - [x] Closes #272
 - [x] Closes #273
 - [x] Closes #276
 - [x] Closes #278
 - [x] Closes #279
 - [x] Closes #284
 - [x] Closes #299
 - [x] Closes #317
 - [x] Closes #320
 - [x] Closes #326
 - [x] Closes #332
 * Contributes to #338
 - [x] Closes #357
 - [x] Closes #371
 - [x] Closes #365
 * Concludes [Pre-Version 2.1 Chores](https://github.com/reactive-firewall/multicast/milestone/13)

 * Includes and Supersedes #280
 * Includes and Supersedes #285
 * Supersedes #286
 * Includes and Supersedes #287
 * Includes and Supersedes #290
 * Includes and Supersedes #291
 * Includes and Supersedes #293
 * Includes and Supersedes #296
 * Includes and Supersedes #305
 * Includes and Supersedes #309
 * Includes and Supersedes #312
 * Includes and Supersedes #318
 * Includes and Supersedes #321
 * Includes and Supersedes #322
 * Includes and Supersedes #323
 * Includes and Supersedes #325
 * Includes and Supersedes #327
 * Includes and Supersedes #328
 * Includes and Supersedes #329
 * Includes and Supersedes #330
 * Includes and Supersedes #334
 * Includes and Supersedes #339
 * Includes and Supersedes #340
 * Includes and Supersedes #341
 * Includes and Supersedes #342
 * Includes and Supersedes #343
 * Includes and Supersedes #344
 * Includes and Supersedes #345
 * Includes and Supersedes #346
 * Includes and Supersedes #347
 * Includes and Supersedes #348
 * Includes and Supersedes #349
 * Includes and Supersedes #351
 * Includes and Supersedes #354
 * Includes and Supersedes #359
 * Includes and Supersedes #361
 * Includes and Supersedes #373
 * Includes and Supersedes #379
 * Includes and Supersedes #384
 * Includes and Supersedes #385
 * Includes and Supersedes #388
 * Includes and Supersedes #389
 * Closes #390
@reactive-firewall reactive-firewall moved this from Done to Archive Backlog in Multicast Project May 4, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bash Lang Changes to the BASH scripts CI Continuous Integration Tooling Linter Any linter tool or setting file enhancements Multicast Any main project file changes Python Lang Changes to Python source code Testing Something can be verified
Projects
None yet
1 participant