Thanks for your interest in contributing! This guide explains how to propose changes and what we expect.
- Code of Conduct
- Support Matrix
- How Can I Contribute?
- Development Setup
- Coding Standards
- Submitting Changes
- Adding a New Parser
- Security
- License
Participation is governed by our Code of Conduct. By contributing, you agree to uphold it.
- Python: 3.10, 3.11, 3.12
- OS: Linux, macOS, Windows
- Package manager: pip (editable installs supported)
- Tooling: ruff ≥ 0.6, pytest ≥ 7.0
- Search existing Issues first
- Include: steps to reproduce, expected vs actual behavior, environment (OS, Python version), and a minimal reproducible example
- Explain the use case and proposed behavior
- Why would this benefit most users?
- Link to prior art if helpful
We welcome:
- Bug fixes
- New parsers for additional data formats
- Performance improvements
- Documentation & examples
- Test coverage improvements
- Fork & clone
git clone https://github.com/usurobor/tsc.git
cd tsc- Install dev dependencies
python3 -m pip install --upgrade pip
pip install -e ".[dev]"- Run tests & linters
pytest
make lint # or: ruff check .
make fmt # or: ruff format .No-make fallbacks (all platforms):
ruff format .
ruff check .
pytest- Follow PEP 8
- Use Python 3.10+ type hints:
X | Noneinstead ofOptional[X] - Maximum line length: 100 characters
- Use
rufffor linting and formatting
- Functional style preferred: pure functions, immutable data structures
- Use
@dataclass(frozen=True)for immutable data - Keep functions small and focused
- Avoid classes unless necessary
# Good
def parse_file(path: str, seed: int | None = None) -> ParsedInput:
...
# Avoid
def parse_file(path, seed=None):
...- Document all public functions
- Use NumPy-style docstrings for complex functions
- Add inline comments for non-obvious logic
git checkout -b feat/your-feature-name
# or: fix/bug-name, docs/topic, test/areafeat: add time-series parser
fix: correct temporal coherence calculation
docs: update QUICKSTART with new examples
test: add conformance test for audio data
Types: feat, fix, docs, test, refactor, perf, chore
Use BREAKING CHANGE: in commit footer for breaking API changes.
- Ensure tests pass:
pytest - Run linting:
ruff check . - Format code:
ruff format . - Update
CHANGELOG.mdfor significant changes - Push to your fork
- Create PR with clear description
PR Requirements:
- All tests pass
- Code is linted and formatted
- New features have tests
- Documentation updated (if applicable)
- CI is green
- At least one maintainer approval
Merge policy: Squash merges by default
See QUICKSTART.md for full guide.
Quick checklist:
- Create
reference/python/parsers/your_format.py - Implement:
is_your_format(path: str) -> bool(predicate)your_format_parser(path: str, seed: int | None) -> ParsedInput(parser)
- Register in
reference/python/parsers/__init__.py - Add example:
examples/your_format/ - Add test:
tests/conformance/ - Update docs
Parser requirements:
- Pure function (file I/O allowed)
- Returns valid
ParsedInput - Deterministic given
seed - Graceful error handling
- Full type hints + docstring
Do not file security issues publicly. Email peter@lisovin.com with "[SECURITY]" in subject line. We'll respond within 72 hours.
- Code (
reference/,tests/): Apache-2.0 - Specifications (
spec/): CC BY 4.0 - Examples (
examples/): CC0 (Public Domain)
By contributing, you agree your contributions are licensed under the same terms as the project files you're modifying.
See LICENSE for full text.
- Open an issue with the
questionlabel - Email: peter@lisovin.com
- Check existing issues first
Thank you for contributing to TSC! 🎉