We welcome contributions to the Universal DJ USB Playlist Converter! This document provides guidelines for contributing to the project.
- Python 3.8 or higher
- Rust toolchain (for rekordcrate dependency)
- Git
-
Fork the repository
-
Clone your fork:
git clone https://github.com/your-username/universal-dj-usb.git cd universal-dj-usb -
Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install dependencies:
pip install -e ".[dev]" -
Install rekordcrate:
cargo install rekordcrate
- Follow PEP 8 conventions
- Use type hints for all functions
- Add docstrings to all public functions and classes
- Keep line length under 88 characters
- Use meaningful variable and function names
- Write tests for all new functionality
- Ensure all tests pass before submitting a PR
- Aim for high test coverage
- Use pytest for testing
Run tests:
pytestRun tests with coverage:
pytest --cov=src/universal_dj_usb --cov-report=htmlWe use several tools to maintain code quality:
- Black: Code formatting
- flake8: Linting
- mypy: Type checking
Run all checks:
black src tests
flake8 src tests
mypy srcInstall pre-commit hooks to ensure code quality:
pre-commit installUse descriptive branch names:
feature/playlist-filteringbugfix/nml-encoding-issuedocs/api-documentation
Write clear, descriptive commit messages:
- Use present tense ("Add feature" not "Added feature")
- Use imperative mood ("Move cursor to..." not "Moves cursor to...")
- Limit the first line to 72 characters
- Reference issues and pull requests when applicable
Example:
Add support for cue point colors in NML export
- Map Rekordbox cue colors to Traktor hotcue numbers
- Add color conversion utility function
- Update tests for color mapping
Fixes #123
- Ensure your code follows the style guidelines
- Add or update tests as needed
- Update documentation if necessary
- Ensure all tests pass
- Create a pull request with a clear title and description
When filing a bug report, please include:
- Clear description of the issue
- Steps to reproduce
- Expected vs actual behavior
- System information (OS, Python version)
- Sample files (if applicable)
For feature requests, please include:
- Clear description of the feature
- Use case and benefits
- Possible implementation approach
- Any relevant examples or mockups
We welcome contributions for:
- Bug fixes
- New features
- Performance improvements
- Documentation improvements
- Test coverage improvements
Help improve our documentation:
- API documentation
- User guides
- Code examples
- README improvements
universal-dj-usb/
├── src/universal_dj_usb/
│ ├── __init__.py
│ ├── models.py # Data models
│ ├── converter.py # Main converter class
│ ├── rekordbox_parser.py # Rekordbox database parser
│ ├── nml_generator.py # Traktor NML generator
│ ├── cli.py # Command-line interface
│ ├── gui.py # Graphical user interface
│ └── utils.py # Utility functions
├── tests/ # Test files
├── docs/ # Documentation
├── pyproject.toml # Project configuration
└── README.md
- Update version in
pyproject.toml - Update CHANGELOG.md
- Create a release PR
- Tag the release
- Build and publish to PyPI
- Be respectful and inclusive
- Help others learn and contribute
- Follow the Python Community Code of Conduct
If you have questions about contributing, please:
- Open an issue for discussion
- Join our Discord community
- Email us at contributors@universal-dj-usb.com
Thank you for contributing to Universal DJ USB Playlist Converter!