Contributing to fsspeckit¶
We welcome contributions to fsspeckit! Your help makes this project better. This guide outlines how you can contribute, from reporting issues to submitting pull requests.
How to Contribute¶
Reporting Issues¶
If you encounter any bugs, unexpected behavior, or have suggestions for new features, please open an issue on our GitHub Issues page.
When reporting an issue, please include:
- A clear and concise description of the problem.
- Steps to reproduce the behavior.
- Expected behavior.
- Screenshots or error messages if applicable.
- Your fsspeckit version and Python environment details.
Submitting Pull Requests¶
We gladly accept pull requests for bug fixes, new features, and improvements. To submit a pull request:
- Fork the Repository: Start by forking the
fsspeckitrepository on GitHub. - Clone Your Fork: Clone your forked repository to your local machine.
- Create a New Branch: Create a new branch for your changes.
- Make Your Changes: Implement your bug fix or feature.
- Write Tests: Ensure your changes are covered by appropriate unit tests.
- Run Tests: Verify all tests pass before submitting.
- Format Code: Ensure your code adheres to the project's style guidelines. The project uses
rufffor linting and formatting. - Commit Your Changes: Write clear and concise commit messages.
- Push to Your Fork: Push your branch to your forked repository.
- Open a Pull Request: Go to the original
fsspeckitrepository on GitHub and open a pull request from your new branch. Provide a detailed description of your changes.
Development Setup¶
To set up your development environment, follow these steps:
- Clone the repository:
- Install
uv:fsspeckitusesuvfor dependency management and running commands. If you don't haveuvinstalled, you can install it viapip: - Install Development Dependencies:
The project uses
uvto manage dependencies. Install thedevdependency group which includes tools for testing, linting, and documentation generation.This command installs the project in editable mode (-e) and includes all development-related dependencies specified inpyproject.tomlunder the[project.optional-dependencies] devsection.
Best Practices for Contributions¶
- Code Style: Adhere to the existing code style. We use
rufffor linting and formatting. - Testing: All new features and bug fixes should be accompanied by relevant unit tests.
- Documentation: If your changes introduce new features or modify existing behavior, please update the documentation accordingly.
- Commit Messages: Write descriptive commit messages that explain the purpose of your changes.
- Atomic Commits: Try to keep your commits focused on a single logical change.
- Branch Naming: Use clear and concise branch names (e.g.,
feature/new-feature,bugfix/fix-issue-123).
Coding Guidelines¶
Avoid Mutable Default Arguments¶
Core helper functions SHALL avoid mutable default arguments (e.g., def func(param=[]): or def func(param={}):). Instead use None and initialize inside the function:
Avoid Unreachable Code¶
Ensure all code branches can be exercised. Avoid patterns like:
Type Annotations¶
The project uses mypy for static type checking. Type annotations help catch bugs early and improve code documentation.
Requirements:
- All new public functions and methods SHOULD have type hints for parameters and return values
- Type hints are REQUIRED for changes to core modules (core.*, datasets.*)
- Use precise types instead of overly broad ones (e.g., prefer list[str] over list[Any])
Running Type Checks:
Common Type Patterns:
Testing Expectations¶
All contributions MUST include appropriate tests. The project maintains a minimum of 80% code coverage.
Testing Requirements: 1. New Features: Add unit tests for all public APIs 2. Bug Fixes: Add regression tests to ensure the bug doesn't reoccur 3. Refactors: Ensure existing tests continue to pass; add new tests for new behavior
Running Tests:
Testing for Refactors:
When refactoring code (especially large module decomposition): - Preserve Behavior: Ensure all existing functionality is maintained - Add Unit Tests: For new submodules, add focused unit tests - Keep Integration Tests: Maintain existing integration tests to verify end-to-end behavior - Coverage: Refactors should not decrease test coverage below 80%
Example: If splitting large_module.py into submodule_a.py and submodule_b.py:
High-Risk Changes:
Changes to the following modules REQUIRE both type checking AND comprehensive tests:
- core/filesystem.py and core submodules
- core/ext*.py and core submodules
- datasets/pyarrow*.py and dataset submodules
- datasets/duckdb*.py and dataset submodules
For these changes: