simple-autonomous-car 0.1.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. simple_autonomous_car-0.1.2/.github/workflows/ci.yml +74 -0
  2. simple_autonomous_car-0.1.2/.github/workflows/publish.yml +103 -0
  3. simple_autonomous_car-0.1.2/.gitignore +60 -0
  4. simple_autonomous_car-0.1.2/.pre-commit-config.yaml +31 -0
  5. simple_autonomous_car-0.1.2/CHANGELOG.md +95 -0
  6. simple_autonomous_car-0.1.2/CONTRIBUTING.md +60 -0
  7. simple_autonomous_car-0.1.2/PKG-INFO +324 -0
  8. simple_autonomous_car-0.1.2/README.md +289 -0
  9. simple_autonomous_car-0.1.2/docs/api/modules.md +259 -0
  10. simple_autonomous_car-0.1.2/docs/api/overview.md +179 -0
  11. simple_autonomous_car-0.1.2/docs/getting-started/installation.md +138 -0
  12. simple_autonomous_car-0.1.2/docs/getting-started/quickstart.md +131 -0
  13. simple_autonomous_car-0.1.2/docs/guides/building-alert-systems.md +342 -0
  14. simple_autonomous_car-0.1.2/docs/guides/component_visualization.md +181 -0
  15. simple_autonomous_car-0.1.2/docs/guides/costmap.md +252 -0
  16. simple_autonomous_car-0.1.2/docs/guides/footprint_guide.md +241 -0
  17. simple_autonomous_car-0.1.2/docs/guides/frame-conversions.md +214 -0
  18. simple_autonomous_car-0.1.2/docs/guides/grid_map_navigation.md +123 -0
  19. simple_autonomous_car-0.1.2/docs/guides/track-bounds-alert.md +266 -0
  20. simple_autonomous_car-0.1.2/docs/guides/visualization.md +399 -0
  21. simple_autonomous_car-0.1.2/docs/index.md +76 -0
  22. simple_autonomous_car-0.1.2/examples/costmap_example.py +210 -0
  23. simple_autonomous_car-0.1.2/examples/grid_map_example.py +210 -0
  24. simple_autonomous_car-0.1.2/examples/visualization_example.py +179 -0
  25. simple_autonomous_car-0.1.2/notebooks/README.md +31 -0
  26. simple_autonomous_car-0.1.2/notebooks/building/README.md +20 -0
  27. simple_autonomous_car-0.1.2/notebooks/building/building_controller.ipynb +526 -0
  28. simple_autonomous_car-0.1.2/notebooks/building/building_custom_planners.ipynb +316 -0
  29. simple_autonomous_car-0.1.2/notebooks/building/building_custom_sensors.ipynb +507 -0
  30. simple_autonomous_car-0.1.2/notebooks/building/building_simulation.ipynb +438 -0
  31. simple_autonomous_car-0.1.2/notebooks/examples/README.md +16 -0
  32. simple_autonomous_car-0.1.2/notebooks/learning/README.md +79 -0
  33. simple_autonomous_car-0.1.2/notebooks/learning/algorithms/advanced_planning_algorithms.ipynb +560 -0
  34. simple_autonomous_car-0.1.2/notebooks/learning/algorithms/control_algorithms.ipynb +485 -0
  35. simple_autonomous_car-0.1.2/notebooks/learning/algorithms/dynamic_obstacles.ipynb +831 -0
  36. simple_autonomous_car-0.1.2/notebooks/learning/algorithms/sensor_algorithms.ipynb +371 -0
  37. simple_autonomous_car-0.1.2/notebooks/learning/control/learning_build_controller.ipynb +420 -0
  38. simple_autonomous_car-0.1.2/notebooks/learning/costmaps/footprint_integration.ipynb +636 -0
  39. simple_autonomous_car-0.1.2/notebooks/learning/costmaps/learning_build_costmap.ipynb +510 -0
  40. simple_autonomous_car-0.1.2/notebooks/learning/oop_fundamentals/understanding_classes_and_oop.ipynb +715 -0
  41. simple_autonomous_car-0.1.2/notebooks/learning/planning/learning_build_planner.ipynb +453 -0
  42. simple_autonomous_car-0.1.2/notebooks/learning/sensors/learning_build_sensor.ipynb +289 -0
  43. simple_autonomous_car-0.1.2/notebooks/tutorials/README.md +21 -0
  44. simple_autonomous_car-0.1.2/notebooks/tutorials/costmap_tutorial.ipynb +654 -0
  45. simple_autonomous_car-0.1.2/notebooks/tutorials/performance_optimization.ipynb +307 -0
  46. simple_autonomous_car-0.1.2/notebooks/tutorials/planner_tutorial.ipynb +643 -0
  47. simple_autonomous_car-0.1.2/notebooks/tutorials/sensor_fusion_tutorial.ipynb +298 -0
  48. simple_autonomous_car-0.1.2/notebooks/tutorials/track_bounds_alert.ipynb +1235 -0
  49. simple_autonomous_car-0.1.2/pyproject.toml +99 -0
  50. simple_autonomous_car-0.1.2/requirements.txt +14 -0
  51. simple_autonomous_car-0.1.2/src/simple_autonomous_car/__init__.py +96 -0
  52. simple_autonomous_car-0.1.2/src/simple_autonomous_car/alerts/__init__.py +5 -0
  53. simple_autonomous_car-0.1.2/src/simple_autonomous_car/alerts/track_bounds_alert.py +276 -0
  54. simple_autonomous_car-0.1.2/src/simple_autonomous_car/car/__init__.py +5 -0
  55. simple_autonomous_car-0.1.2/src/simple_autonomous_car/car/car.py +234 -0
  56. simple_autonomous_car-0.1.2/src/simple_autonomous_car/constants.py +112 -0
  57. simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/__init__.py +7 -0
  58. simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/base_controller.py +152 -0
  59. simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/controller_viz.py +282 -0
  60. simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/pid_controller.py +153 -0
  61. simple_autonomous_car-0.1.2/src/simple_autonomous_car/control/pure_pursuit_controller.py +578 -0
  62. simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/__init__.py +12 -0
  63. simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/base_costmap.py +187 -0
  64. simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/grid_costmap.py +507 -0
  65. simple_autonomous_car-0.1.2/src/simple_autonomous_car/costmap/inflation.py +126 -0
  66. simple_autonomous_car-0.1.2/src/simple_autonomous_car/detection/__init__.py +5 -0
  67. simple_autonomous_car-0.1.2/src/simple_autonomous_car/detection/error_detector.py +165 -0
  68. simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/__init__.py +7 -0
  69. simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/base_filter.py +119 -0
  70. simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/kalman_filter.py +131 -0
  71. simple_autonomous_car-0.1.2/src/simple_autonomous_car/filters/particle_filter.py +162 -0
  72. simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/__init__.py +7 -0
  73. simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/base_footprint.py +128 -0
  74. simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/circular_footprint.py +73 -0
  75. simple_autonomous_car-0.1.2/src/simple_autonomous_car/footprint/rectangular_footprint.py +123 -0
  76. simple_autonomous_car-0.1.2/src/simple_autonomous_car/frames/__init__.py +21 -0
  77. simple_autonomous_car-0.1.2/src/simple_autonomous_car/frames/frenet.py +267 -0
  78. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/__init__.py +9 -0
  79. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/frenet_map.py +97 -0
  80. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/grid_ground_truth_map.py +83 -0
  81. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/grid_map.py +361 -0
  82. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/ground_truth_map.py +64 -0
  83. simple_autonomous_car-0.1.2/src/simple_autonomous_car/maps/perceived_map.py +169 -0
  84. simple_autonomous_car-0.1.2/src/simple_autonomous_car/perception/__init__.py +5 -0
  85. simple_autonomous_car-0.1.2/src/simple_autonomous_car/perception/perception.py +107 -0
  86. simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/__init__.py +7 -0
  87. simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/base_planner.py +184 -0
  88. simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/goal_planner.py +261 -0
  89. simple_autonomous_car-0.1.2/src/simple_autonomous_car/planning/track_planner.py +199 -0
  90. simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/__init__.py +6 -0
  91. simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/base_sensor.py +105 -0
  92. simple_autonomous_car-0.1.2/src/simple_autonomous_car/sensors/lidar_sensor.py +145 -0
  93. simple_autonomous_car-0.1.2/src/simple_autonomous_car/track/__init__.py +5 -0
  94. simple_autonomous_car-0.1.2/src/simple_autonomous_car/track/track.py +463 -0
  95. simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/__init__.py +25 -0
  96. simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/alert_viz.py +316 -0
  97. simple_autonomous_car-0.1.2/src/simple_autonomous_car/visualization/utils.py +169 -0
  98. simple_autonomous_car-0.1.2/src/simulations/README.md +71 -0
  99. simple_autonomous_car-0.1.2/src/simulations/__init__.py +1 -0
  100. simple_autonomous_car-0.1.2/src/simulations/configs/__init__.py +7 -0
  101. simple_autonomous_car-0.1.2/src/simulations/configs/grid_map.py +65 -0
  102. simple_autonomous_car-0.1.2/src/simulations/configs/race_track.py +36 -0
  103. simple_autonomous_car-0.1.2/src/simulations/configs/simple_track.py +42 -0
  104. simple_autonomous_car-0.1.2/src/simulations/enhanced_visualization.py +393 -0
  105. simple_autonomous_car-0.1.2/src/simulations/simulation.py +521 -0
  106. simple_autonomous_car-0.1.2/tests/__init__.py +1 -0
  107. simple_autonomous_car-0.1.2/tests/test_car.py +64 -0
  108. simple_autonomous_car-0.1.2/tests/test_detection.py +61 -0
  109. simple_autonomous_car-0.1.2/tests/test_filters.py +134 -0
  110. simple_autonomous_car-0.1.2/tests/test_grid_map.py +117 -0
  111. simple_autonomous_car-0.1.2/tests/test_maps.py +76 -0
  112. simple_autonomous_car-0.1.2/tests/test_track.py +46 -0
  113. simple_autonomous_car-0.1.2/uv.lock +3506 -0
@@ -0,0 +1,74 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ lint:
11
+ name: Lint
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - name: Set up Python
16
+ uses: actions/setup-python@v5
17
+ with:
18
+ python-version: "3.11"
19
+ - name: Install dependencies
20
+ run: |
21
+ python -m pip install --upgrade pip
22
+ pip install -e ".[dev]"
23
+ - name: Run black
24
+ run: black --check .
25
+ - name: Run ruff
26
+ run: ruff check .
27
+ - name: Run mypy
28
+ run: mypy .
29
+
30
+ test:
31
+ name: Test Python ${{ matrix.python-version }}
32
+ runs-on: ubuntu-latest
33
+ strategy:
34
+ matrix:
35
+ python-version: ["3.10", "3.11", "3.12"]
36
+ steps:
37
+ - uses: actions/checkout@v4
38
+ - name: Set up Python ${{ matrix.python-version }}
39
+ uses: actions/setup-python@v5
40
+ with:
41
+ python-version: ${{ matrix.python-version }}
42
+ - name: Install dependencies
43
+ run: |
44
+ python -m pip install --upgrade pip
45
+ pip install -e ".[dev]"
46
+ - name: Run tests
47
+ run: pytest --cov=src --cov-report=xml --cov-report=term-missing
48
+ - name: Upload coverage reports to Codecov
49
+ uses: codecov/codecov-action@v5
50
+ with:
51
+ token: ${{ secrets.CODECOV_TOKEN }}
52
+ file: ./coverage.xml
53
+ flags: unittests
54
+ name: codecov-umbrella
55
+ fail_ci_if_error: false
56
+
57
+ build:
58
+ name: Build package
59
+ runs-on: ubuntu-latest
60
+ needs: [lint, test]
61
+ steps:
62
+ - uses: actions/checkout@v4
63
+ - name: Set up Python
64
+ uses: actions/setup-python@v5
65
+ with:
66
+ python-version: ${{ matrix.python-version }}
67
+ - name: Install build dependencies
68
+ run: |
69
+ python -m pip install --upgrade pip
70
+ pip install build
71
+ - name: Build package
72
+ run: python -m build
73
+ - name: Check package
74
+ run: pip install twine && twine check dist/*
@@ -0,0 +1,103 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published, edited]
6
+ # Note: We use GitHub Releases instead of direct tag pushes for:
7
+ # - Better visibility and release notes
8
+ # - More intentional publishing (less accidental)
9
+ # - Better control with environment protection rules
10
+ # 'edited' type allows re-running by editing the release
11
+ # If you need tag-only publishing, uncomment below:
12
+ # push:
13
+ # tags:
14
+ # - "v*"
15
+
16
+ jobs:
17
+ publish:
18
+ name: Publish to PyPI
19
+ runs-on: ubuntu-latest
20
+ environment:
21
+ name: pypi
22
+ url: https://pypi.org/project/simple_autonomous_car/
23
+ permissions:
24
+ contents: read
25
+ id-token: write # Required for PyPI trusted publishing
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ with:
29
+ fetch-depth: 0 # Fetch all history for version detection
30
+
31
+ - name: Set up Python
32
+ uses: actions/setup-python@v5
33
+ with:
34
+ python-version: "3.11"
35
+
36
+ - name: Extract version from release tag
37
+ id: tag_version
38
+ env:
39
+ TAG_NAME: ${{ github.event.release.tag_name }}
40
+ run: |
41
+ # GitHub releases provide the tag in github.event.release.tag_name
42
+ # Remove 'v' prefix if present
43
+ if [[ "$TAG_NAME" == v* ]]; then
44
+ VERSION=${TAG_NAME#v}
45
+ else
46
+ VERSION="$TAG_NAME"
47
+ fi
48
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
49
+ echo "Release tag: $TAG_NAME"
50
+ echo "Release version: $VERSION"
51
+
52
+ - name: Verify version matches pyproject.toml
53
+ run: |
54
+ pip install tomli
55
+ PYPROJECT_VERSION=$(python -c "import tomli; print(tomli.load(open('pyproject.toml', 'rb'))['project']['version'])")
56
+ TAG_VERSION="${{ steps.tag_version.outputs.version }}"
57
+ if [ "$PYPROJECT_VERSION" != "$TAG_VERSION" ]; then
58
+ echo "Error: Version mismatch!"
59
+ echo "pyproject.toml version: $PYPROJECT_VERSION"
60
+ echo "Tag version: $TAG_VERSION"
61
+ exit 1
62
+ fi
63
+ echo "✓ Version matches: $PYPROJECT_VERSION"
64
+
65
+ - name: Install build dependencies
66
+ run: |
67
+ python -m pip install --upgrade pip
68
+ pip install build twine
69
+
70
+ - name: Build package
71
+ run: python -m build
72
+
73
+ - name: Check package
74
+ run: twine check dist/*
75
+
76
+ - name: Check if pre-release
77
+ id: check_prerelease
78
+ run: |
79
+ if [ "${{ github.event.release.prerelease }}" == "true" ]; then
80
+ echo "skip=true" >> $GITHUB_OUTPUT
81
+ echo "⚠️ Pre-release detected - skipping PyPI publish"
82
+ else
83
+ echo "skip=false" >> $GITHUB_OUTPUT
84
+ echo "✓ Final release - will publish to PyPI"
85
+ fi
86
+
87
+ - name: Publish to PyPI
88
+ if: steps.check_prerelease.outputs.skip == 'false'
89
+ # Option 1: PyPI Trusted Publishing (Recommended)
90
+ # Configure at: https://pypi.org/manage/account/publishing/
91
+ # Add your repository URL and workflow name
92
+ uses: pypa/gh-action-pypi-publish@release/v1
93
+ with:
94
+ packages-dir: dist/
95
+ print-hash: true
96
+
97
+ # Option 2: Using API Token (Alternative)
98
+ # Uncomment below and comment out the above step if using API token
99
+ # - name: Publish to PyPI
100
+ # env:
101
+ # TWINE_USERNAME: __token__
102
+ # TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
103
+ # run: twine upload dist/* --verbose
@@ -0,0 +1,60 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments
24
+ venv/
25
+ env/
26
+ ENV/
27
+ .venv
28
+
29
+ # IDE
30
+ .vscode/
31
+ .idea/
32
+ *.swp
33
+ *.swo
34
+ *~
35
+
36
+ # Testing
37
+ .pytest_cache/
38
+ .coverage
39
+ htmlcov/
40
+ .tox/
41
+ .hypothesis/
42
+
43
+ # Type checking
44
+ .mypy_cache/
45
+ .dmypy.json
46
+ dmypy.json
47
+
48
+ # Pre-commit
49
+ .pre-commit-cache/
50
+
51
+ # Project specific
52
+ *.png
53
+ *.jpg
54
+ *.gif
55
+ outputs/
56
+ logs/
57
+
58
+ # OS
59
+ .DS_Store
60
+ Thumbs.db
@@ -0,0 +1,31 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ - id: check-added-large-files
9
+ - id: check-json
10
+ - id: check-toml
11
+ - id: check-merge-conflict
12
+ - id: debug-statements
13
+
14
+ - repo: https://github.com/psf/black
15
+ rev: 23.12.1
16
+ hooks:
17
+ - id: black
18
+ language_version: python3
19
+
20
+ - repo: https://github.com/astral-sh/ruff-pre-commit
21
+ rev: v0.1.9
22
+ hooks:
23
+ - id: ruff
24
+ args: [--fix, --exit-non-zero-on-fix]
25
+
26
+ - repo: https://github.com/pre-commit/mirrors-mypy
27
+ rev: v1.8.0
28
+ hooks:
29
+ - id: mypy
30
+ additional_dependencies: [types-all]
31
+ args: [--ignore-missing-imports]
@@ -0,0 +1,95 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.1.0] - 2026-XX-XX
6
+
7
+ ### Added
8
+ - **Modular Sensor System**: Complete sensor architecture
9
+ - `BaseSensor` abstract class for all sensors
10
+ - `LiDARSensor` implementation
11
+ - Car can have multiple sensors via `car.add_sensor()`
12
+ - Sensors can be enabled/disabled individually
13
+
14
+ - **Control System**: Complete control architecture
15
+ - `BaseController` abstract class
16
+ - `PurePursuitController` for path following
17
+ - `PIDController` for PID control
18
+ - Controllers work with plans from planners
19
+
20
+ - **Planning System**: Path planning framework
21
+ - `BasePlanner` abstract class
22
+ - `TrackPlanner` for track following
23
+ - Planners generate waypoints for controllers
24
+
25
+ - **Enhanced Car Class**:
26
+ - Support for multiple sensors
27
+ - `car.add_sensor()`, `car.remove_sensor()`, `car.get_sensor()`
28
+ - `car.sense_all()` to get data from all sensors
29
+
30
+ - **Controller Notebook**: Interactive tutorial for building controllers
31
+
32
+ ### Changed
33
+ - **Project Renamed**: From `car-loc-viz` to `simple-autonomous-car`
34
+ - **Package Renamed**: From `car_loc_viz` to `simple_autonomous_car`
35
+ - **Architecture**: Modular OOP design with pluggable components
36
+ - **Sensor System**: Replaced single `Sensor` class with modular `BaseSensor` system
37
+
38
+ ### Removed
39
+ - Old `Sensor` class (replaced by modular sensor system)
40
+
41
+ ## [0.0.2] - 2026-XX-XX
42
+
43
+ ### Added
44
+ - **Frenet Frame Support**: Complete Frenet coordinate system implementation
45
+ - `FrenetFrame` class for path-aligned coordinates
46
+ - Conversion utilities: `global_to_frenet`, `frenet_to_global`, `ego_to_frenet`, `frenet_to_ego`, `sensor_to_ego`, `ego_to_sensor`
47
+ - `FrenetMap` for map representation in Frenet coordinates
48
+
49
+ - **PerceptionPoints**: New data structure for perception data
50
+ - Vector of points in local (ego) frame
51
+ - Frame conversion utilities
52
+ - Distance filtering
53
+
54
+ - **Alert System**: Track Bounds Alert System
55
+ - `TrackBoundsAlert` class for detecting boundary deviations
56
+ - Comprehensive documentation
57
+ - Jupyter notebook with examples
58
+
59
+ - **Documentation**:
60
+ - Building on Top guide
61
+ - Track Bounds Alert System documentation
62
+ - Jupyter notebook tutorials
63
+
64
+ - **CI/CD**:
65
+ - GitHub Actions workflows for lint, test, and build
66
+ - PyPI publishing workflow
67
+ - Multi-platform testing (Linux, Windows, macOS)
68
+ - Multiple Python version support (3.10, 3.11, 3.12)
69
+
70
+ - **SDK Structure**:
71
+ - Clean module organization
72
+ - Comprehensive `__init__.py` exports
73
+ - Type hints throughout
74
+ - Error handling
75
+
76
+ ### Changed
77
+ - Refactored code structure for better modularity
78
+ - Updated sensor to return `PerceptionPoints` instead of raw arrays
79
+ - Improved project metadata for PyPI publishing
80
+ - Enhanced documentation structure
81
+
82
+ ### Fixed
83
+ - Frame conversion utilities
84
+ - Error handling in alert system
85
+ - Import structure
86
+
87
+ ## [0.0.1] - 2026-XX-XX
88
+
89
+ ### Added
90
+ - Initial release
91
+ - Basic track generation
92
+ - Car model and dynamics
93
+ - Ground truth and perceived maps
94
+ - Basic visualization
95
+ - Error detection
@@ -0,0 +1,60 @@
1
+ # Contributing to Car Loc Viz SDK
2
+
3
+ Thank you for your interest in contributing! This document provides guidelines for contributing to the project.
4
+
5
+ ## Development Setup
6
+
7
+ 1. Fork the repository
8
+ 2. Clone your fork:
9
+ ```bash
10
+ git clone https://github.com/yourusername/car-loc-viz.git
11
+ cd car-loc-viz
12
+ ```
13
+ 3. Install development dependencies:
14
+ ```bash
15
+ uv sync --dev
16
+ ```
17
+ 4. Install pre-commit hooks:
18
+ ```bash
19
+ uv run pre-commit install
20
+ ```
21
+
22
+ ## Code Style
23
+
24
+ - Follow PEP 8 style guidelines
25
+ - Use `black` for formatting (line length: 100)
26
+ - Use `ruff` for linting
27
+ - Use `mypy` for type checking
28
+ - Maximum line length: 100 characters
29
+
30
+ ## Testing
31
+
32
+ - Write tests for all new features
33
+ - Ensure all tests pass: `uv run pytest`
34
+ - Aim for high test coverage
35
+ - Add tests to appropriate files in `tests/`
36
+
37
+ ## Documentation
38
+
39
+ - Update docstrings for all new functions/classes
40
+ - Follow NumPy docstring format
41
+ - Update relevant documentation files
42
+ - Add examples if applicable
43
+
44
+ ## Pull Request Process
45
+
46
+ 1. Create a feature branch from `main`
47
+ 2. Make your changes
48
+ 3. Ensure tests pass and code is linted
49
+ 4. Update documentation
50
+ 5. Submit a pull request with a clear description
51
+
52
+ ## Commit Messages
53
+
54
+ - Use clear, descriptive commit messages
55
+ - Reference issues when applicable
56
+ - Follow conventional commit format when possible
57
+
58
+ ## Questions?
59
+
60
+ Open an issue for questions or discussions about contributions.