chuk-mcp-solver 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 (64) hide show
  1. chuk_mcp_solver-0.1.2/.claude/settings.local.json +28 -0
  2. chuk_mcp_solver-0.1.2/.dockerignore +47 -0
  3. chuk_mcp_solver-0.1.2/.github/workflows/fly-deploy.yml +18 -0
  4. chuk_mcp_solver-0.1.2/.github/workflows/test.yml +65 -0
  5. chuk_mcp_solver-0.1.2/.gitignore +140 -0
  6. chuk_mcp_solver-0.1.2/CHANGELOG.md +134 -0
  7. chuk_mcp_solver-0.1.2/Dockerfile +81 -0
  8. chuk_mcp_solver-0.1.2/LICENSE +21 -0
  9. chuk_mcp_solver-0.1.2/MANIFEST.in +10 -0
  10. chuk_mcp_solver-0.1.2/Makefile +492 -0
  11. chuk_mcp_solver-0.1.2/PKG-INFO +1027 -0
  12. chuk_mcp_solver-0.1.2/README.md +993 -0
  13. chuk_mcp_solver-0.1.2/docker-compose.yml +44 -0
  14. chuk_mcp_solver-0.1.2/examples/README.md +162 -0
  15. chuk_mcp_solver-0.1.2/examples/advanced_search_demo.py +330 -0
  16. chuk_mcp_solver-0.1.2/examples/caching_demo.py +302 -0
  17. chuk_mcp_solver-0.1.2/examples/delivery_router.py +190 -0
  18. chuk_mcp_solver-0.1.2/examples/embedding_pipeline_scheduler.py +538 -0
  19. chuk_mcp_solver-0.1.2/examples/gpu_job_scheduler.py +547 -0
  20. chuk_mcp_solver-0.1.2/examples/inventory_manager.py +303 -0
  21. chuk_mcp_solver-0.1.2/examples/knapsack_optimizer.py +156 -0
  22. chuk_mcp_solver-0.1.2/examples/ml_pipeline_orchestrator.py +468 -0
  23. chuk_mcp_solver-0.1.2/examples/multi_objective_planner.py +291 -0
  24. chuk_mcp_solver-0.1.2/examples/project_scheduler.py +232 -0
  25. chuk_mcp_solver-0.1.2/examples/resource_scheduler.py +238 -0
  26. chuk_mcp_solver-0.1.2/examples/sudoku_solver.py +179 -0
  27. chuk_mcp_solver-0.1.2/examples/tool_selector.py +238 -0
  28. chuk_mcp_solver-0.1.2/examples/validation_demo.py +250 -0
  29. chuk_mcp_solver-0.1.2/fly.toml +22 -0
  30. chuk_mcp_solver-0.1.2/pyproject.toml +116 -0
  31. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/__init__.py +10 -0
  32. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/cache.py +164 -0
  33. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/config.py +77 -0
  34. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/diagnostics.py +273 -0
  35. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/models.py +585 -0
  36. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/observability.py +311 -0
  37. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/providers/__init__.py +28 -0
  38. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/server.py +165 -0
  39. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/__init__.py +32 -0
  40. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/__init__.py +9 -0
  41. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/constraints.py +310 -0
  42. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/objectives.py +99 -0
  43. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/responses.py +183 -0
  44. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/ortools/solver.py +281 -0
  45. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/solver/provider.py +33 -0
  46. chuk_mcp_solver-0.1.2/src/chuk_mcp_solver/validation.py +468 -0
  47. chuk_mcp_solver-0.1.2/tests/conftest.py +89 -0
  48. chuk_mcp_solver-0.1.2/tests/solver/__init__.py +0 -0
  49. chuk_mcp_solver-0.1.2/tests/solver/ortools/__init__.py +0 -0
  50. chuk_mcp_solver-0.1.2/tests/solver/ortools/test_constraints.py +591 -0
  51. chuk_mcp_solver-0.1.2/tests/solver/ortools/test_edge_cases.py +225 -0
  52. chuk_mcp_solver-0.1.2/tests/solver/ortools/test_responses.py +84 -0
  53. chuk_mcp_solver-0.1.2/tests/solver/ortools/test_solver.py +392 -0
  54. chuk_mcp_solver-0.1.2/tests/test_cache.py +381 -0
  55. chuk_mcp_solver-0.1.2/tests/test_config.py +66 -0
  56. chuk_mcp_solver-0.1.2/tests/test_diagnostics.py +433 -0
  57. chuk_mcp_solver-0.1.2/tests/test_imports.py +56 -0
  58. chuk_mcp_solver-0.1.2/tests/test_init.py +28 -0
  59. chuk_mcp_solver-0.1.2/tests/test_models.py +455 -0
  60. chuk_mcp_solver-0.1.2/tests/test_observability.py +291 -0
  61. chuk_mcp_solver-0.1.2/tests/test_performance.py +311 -0
  62. chuk_mcp_solver-0.1.2/tests/test_solver.py +25 -0
  63. chuk_mcp_solver-0.1.2/tests/test_validation.py +607 -0
  64. chuk_mcp_solver-0.1.2/uv.lock +1213 -0
@@ -0,0 +1,28 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(tree:*)",
5
+ "Bash(find:*)",
6
+ "Bash(uv pip install:*)",
7
+ "Bash(uv venv:*)",
8
+ "Bash(source .venv/bin/activate)",
9
+ "Bash(pytest:*)",
10
+ "Bash(python:*)",
11
+ "Bash(pip install:*)",
12
+ "Bash(=9.10.0)",
13
+ "Bash(uv pip list:*)",
14
+ "Bash(uv run pytest:*)",
15
+ "Bash(make check:*)",
16
+ "Bash(make format:*)",
17
+ "Bash(make typecheck:*)",
18
+ "Bash(cat:*)",
19
+ "Bash(uv run python:*)",
20
+ "Bash(timeout 10 uv run pytest:*)",
21
+ "Bash(make:*)",
22
+ "Bash(python3.11 -m pytest:*)",
23
+ "Bash(uv run mypy:*)"
24
+ ],
25
+ "deny": [],
26
+ "ask": []
27
+ }
28
+ }
@@ -0,0 +1,47 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+ *.egg
11
+
12
+ # Virtual environments
13
+ .venv/
14
+ venv/
15
+ ENV/
16
+ env/
17
+
18
+ # IDE
19
+ .vscode/
20
+ .idea/
21
+ *.swp
22
+ *.swo
23
+ *~
24
+
25
+ # Testing
26
+ .pytest_cache/
27
+ .coverage
28
+ htmlcov/
29
+ .tox/
30
+ .mypy_cache/
31
+
32
+ # Git
33
+ .git/
34
+ .gitignore
35
+ .gitattributes
36
+
37
+ # CI/CD
38
+ .github/
39
+
40
+ # Documentation
41
+ docs/
42
+
43
+ # Other
44
+ *.md
45
+ !README.md
46
+ .DS_Store
47
+ *.log
@@ -0,0 +1,18 @@
1
+ # See https://fly.io/docs/app-guides/continuous-deployment-with-github-actions/
2
+
3
+ name: Fly Deploy
4
+ on:
5
+ push:
6
+ branches:
7
+ - main
8
+ jobs:
9
+ deploy:
10
+ name: Deploy app
11
+ runs-on: ubuntu-latest
12
+ concurrency: deploy-group # optional: ensure only one action runs at a time
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: superfly/flyctl-actions/setup-flyctl@master
16
+ - run: flyctl deploy --remote-only
17
+ env:
18
+ FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
@@ -0,0 +1,65 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main, develop]
6
+ pull_request:
7
+ branches: [main, develop]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ${{ matrix.os }}
12
+ strategy:
13
+ matrix:
14
+ os: [ubuntu-latest, windows-latest, macos-latest]
15
+ python-version: ["3.11", "3.12", "3.13"]
16
+
17
+ steps:
18
+ - name: Checkout code
19
+ uses: actions/checkout@v4
20
+
21
+ - name: Set up uv
22
+ uses: astral-sh/setup-uv@v4
23
+ with:
24
+ enable-cache: true
25
+
26
+ - name: Set up Python ${{ matrix.python-version }}
27
+ run: uv python install ${{ matrix.python-version }}
28
+
29
+ - name: Install dependencies
30
+ run: |
31
+ uv sync --all-extras --dev
32
+
33
+ - name: Lint with ruff
34
+ run: |
35
+ uv run ruff check src/ tests/
36
+
37
+ - name: Format check with ruff
38
+ run: |
39
+ uv run ruff format --check src/ tests/
40
+
41
+ - name: Type check with mypy
42
+ run: |
43
+ uv run mypy src/
44
+
45
+ - name: Run tests
46
+ run: |
47
+ uv run pytest tests/ -v --tb=short -m "not network"
48
+
49
+ - name: Run tests with coverage
50
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
51
+ run: |
52
+ uv run pytest tests/ --cov=src/chuk_mcp_solver --cov-report=xml --cov-report=term -m "not network"
53
+
54
+ - name: Upload coverage to Codecov
55
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
56
+ uses: codecov/codecov-action@v4
57
+ with:
58
+ file: ./coverage.xml
59
+ fail_ci_if_error: false
60
+ token: ${{ secrets.CODECOV_TOKEN }}
61
+
62
+ - name: Check coverage threshold
63
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.12'
64
+ run: |
65
+ uv run pytest tests/ --cov=src/chuk_mcp_solver --cov-report=term --cov-fail-under=90 -m "not network"
@@ -0,0 +1,140 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ pip-wheel-metadata/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ *.manifest
32
+ *.spec
33
+
34
+ # Unit test / coverage reports
35
+ htmlcov/
36
+ .tox/
37
+ .nox/
38
+ .coverage
39
+ .coverage.*
40
+ .cache
41
+ nosetests.xml
42
+ coverage.xml
43
+ *.cover
44
+ *.py,cover
45
+ .hypothesis/
46
+ .pytest_cache/
47
+
48
+ # Translations
49
+ *.mo
50
+ *.pot
51
+
52
+ # Django stuff:
53
+ *.log
54
+ local_settings.py
55
+ db.sqlite3
56
+ db.sqlite3-journal
57
+
58
+ # Flask stuff:
59
+ instance/
60
+ .webassets-cache
61
+
62
+ # Scrapy stuff:
63
+ .scrapy
64
+
65
+ # Sphinx documentation
66
+ docs/_build/
67
+
68
+ # PyBuilder
69
+ target/
70
+
71
+ # Jupyter Notebook
72
+ .ipynb_checkpoints
73
+
74
+ # IPython
75
+ profile_default/
76
+ ipython_config.py
77
+
78
+ # pyenv
79
+ .python-version
80
+
81
+ # pipenv
82
+ Pipfile.lock
83
+
84
+ # PEP 582
85
+ __pypackages__/
86
+
87
+ # Celery stuff
88
+ celerybeat-schedule
89
+ celerybeat.pid
90
+
91
+ # SageMath parsed files
92
+ *.sage.py
93
+
94
+ # Environments
95
+ .env
96
+ .venv
97
+ env/
98
+ venv/
99
+ ENV/
100
+ env.bak/
101
+ venv.bak/
102
+
103
+ # Spyder project settings
104
+ .spyderproject
105
+ .spyproject
106
+
107
+ # Rope project settings
108
+ .ropeproject
109
+
110
+ # mkdocs documentation
111
+ /site
112
+
113
+ # mypy
114
+ .mypy_cache/
115
+ .dmypy.json
116
+ dmypy.json
117
+
118
+ # Pyre type checker
119
+ .pyre/
120
+
121
+ # Ruff
122
+ .ruff_cache/
123
+
124
+ # uv
125
+ .uv/
126
+
127
+ # IDE
128
+ .vscode/
129
+ .idea/
130
+ *.swp
131
+ *.swo
132
+ *~
133
+
134
+ # OS
135
+ .DS_Store
136
+ Thumbs.db
137
+
138
+ # Temporary files
139
+ *.tmp
140
+ *.bak
@@ -0,0 +1,134 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [0.1.1] - 2025-12-02
6
+
7
+ ### Fixed
8
+
9
+ #### Cache Deadlock Fix
10
+ - **Issue**: `test_cache_stats` test was hanging due to deadlock in `SolutionCache.stats()` method
11
+ - **Root Cause**: The `stats()` method acquired `self._lock`, then called the `hit_rate` property which tried to acquire the same lock again. Since `threading.Lock` is not reentrant, this caused a deadlock.
12
+ - **Fix**: Changed `threading.Lock` to `threading.RLock` (Reentrant Lock) in `src/chuk_mcp_solver/cache.py`
13
+ - Line 10: Updated import from `Lock` to `RLock`
14
+ - Line 38: Changed `self._lock = Lock()` to `self._lock = RLock()`
15
+ - **Impact**: All cache tests now pass without hanging
16
+
17
+ #### Performance Test Fix
18
+ - **Issue**: `test_partial_solution_on_timeout` was failing with timeout status instead of returning a partial solution
19
+ - **Root Cause**: Test timeout was too short (1ms) for OR-Tools CP-SAT to find even a trivial feasible solution before timing out
20
+ - **Fix**: Increased timeout in `tests/test_performance.py:178` from 1ms to 50ms
21
+ - **Additional**: Updated `src/chuk_mcp_solver/solver/ortools/solver.py:164` to check for both `cp_model.FEASIBLE` and `cp_model.OPTIMAL` statuses when handling partial solutions
22
+ - **Impact**: Test now reliably passes by giving solver enough time to find at least one feasible solution
23
+
24
+ ### Added
25
+
26
+ #### Docker Support
27
+ - **Dockerfile**: Multi-stage build for optimized image size (~300-400MB)
28
+ - Based on `python:3.11-slim`
29
+ - Runs as non-root user (`mcpuser`) for security
30
+ - Includes health check
31
+ - Default command: HTTP mode on port 8000
32
+ - **docker-compose.yml**: Service definition with resource limits and health checks
33
+ - **.dockerignore**: Optimizes Docker build context by excluding unnecessary files
34
+ - **DOCKER.md**: Comprehensive Docker usage guide with examples for:
35
+ - Building and running containers
36
+ - Configuration with environment variables
37
+ - Transport modes (HTTP vs STDIO)
38
+ - Production deployment
39
+ - CI/CD integration
40
+ - Troubleshooting
41
+
42
+ #### Makefile Docker Targets
43
+ - `docker-build`: Build Docker image
44
+ - `docker-run`: Run Docker container
45
+ - `docker-stop`: Stop running container
46
+ - `docker-clean`: Remove container and image
47
+ - `docker-test`: Run tests in Docker container
48
+ - `docker-shell`: Open shell in running container
49
+ - `docker-push`: Push image to registry
50
+ - `docker-compose-up`: Start services with docker-compose
51
+ - `docker-compose-down`: Stop services with docker-compose
52
+ - `docker-compose-rebuild`: Rebuild and restart services
53
+
54
+ #### Package Distribution
55
+ - **MANIFEST.in**: Ensures proper file inclusion in source distributions
56
+ - Includes README.md, LICENSE, pyproject.toml
57
+ - Recursively includes Python files from src/ and examples/
58
+ - Excludes compiled bytecode files
59
+
60
+ #### Public MCP Endpoint
61
+ - Added documentation for hosted solver at `https://solver.chukai.io/mcp`
62
+ - No installation required - use directly from Claude Desktop
63
+ - Perfect for testing, demos, or production use
64
+
65
+ #### Enhanced Installation Options
66
+ - Highlighted `uvx` as recommended installation method
67
+ - Added `uvx install` option for global installation
68
+ - Organized installation options by use case
69
+
70
+ ### Changed
71
+
72
+ #### Server Transport Handling
73
+ - **Breaking**: Simplified command-line argument parsing in `src/chuk_mcp_solver/server.py`
74
+ - **Removed**: `argparse` dependency
75
+ - **Default**: STDIO mode (for Claude Desktop compatibility)
76
+ - **HTTP Mode**: Pass `http` or `--http` argument
77
+ - **Logging**: Improved logging suppression in STDIO mode to reduce noise
78
+ - **Pattern**: Now matches chuk-mcp-celestial transport handling
79
+
80
+ #### Documentation Updates
81
+ - **README.md**:
82
+ - Updated test count from 151+ to 170 tests
83
+ - Added public MCP endpoint section
84
+ - Enhanced Quick Start with three options (Public, uvx, Development)
85
+ - Added Docker usage section
86
+ - Improved installation instructions with emojis and clear hierarchy
87
+ - **Test Count**: Updated badges and documentation to reflect 170 passing tests
88
+
89
+ ### Test Results
90
+
91
+ All 170 tests passing:
92
+ - Fixed hanging cache tests (test_cache_stats)
93
+ - Fixed failing performance test (test_partial_solution_on_timeout)
94
+ - All existing functionality preserved
95
+ - No breaking changes to core API
96
+
97
+ ### Migration Notes
98
+
99
+ #### For Users
100
+ - No action required - all changes are backward compatible
101
+ - Consider using the public endpoint at `https://solver.chukai.io/mcp` for quick testing
102
+ - For production use, consider Docker deployment for better isolation
103
+
104
+ #### For Developers
105
+ - If running the server programmatically, note the simplified transport handling:
106
+ - Default: STDIO mode (no arguments)
107
+ - HTTP mode: Pass `"http"` or `"--http"` as argument
108
+ - Old `--transport` flag is no longer supported
109
+
110
+ #### For Docker Users
111
+ - Use `make docker-build` and `make docker-run` for easy Docker operations
112
+ - Default container runs in HTTP mode on port 8000
113
+ - See DOCKER.md for comprehensive deployment guide
114
+
115
+ ### Security
116
+
117
+ - Docker image runs as non-root user (`mcpuser`)
118
+ - Minimal runtime dependencies reduce attack surface
119
+ - Health checks ensure service availability
120
+ - No secrets or credentials in Docker image
121
+
122
+ ### Performance
123
+
124
+ - Multi-stage Docker build reduces image size
125
+ - Cache now uses reentrant locks for better concurrency
126
+ - Partial solution timeout handling improved for better user experience
127
+
128
+ ---
129
+
130
+ ## [0.1.0] - 2024-12-01
131
+
132
+ Initial release with comprehensive constraint solving and optimization capabilities.
133
+
134
+ See README.md for full feature list.
@@ -0,0 +1,81 @@
1
+ # CHUK MCP Solver Dockerfile
2
+ # ========================================
3
+ # Multi-stage build for optimal image size
4
+ # Based on chuk-mcp-server patterns
5
+
6
+ # Build stage
7
+ FROM python:3.11-slim as builder
8
+
9
+ # Set working directory
10
+ WORKDIR /app
11
+
12
+ # Install system dependencies
13
+ RUN apt-get update && apt-get install -y \
14
+ build-essential \
15
+ curl \
16
+ git \
17
+ && rm -rf /var/lib/apt/lists/*
18
+
19
+ # Install uv for fast dependency management
20
+ RUN curl -LsSf https://astral.sh/uv/install.sh | sh
21
+ ENV PATH="/root/.local/bin:${PATH}"
22
+
23
+ # Copy project configuration
24
+ COPY pyproject.toml README.md ./
25
+ COPY src ./src
26
+
27
+ # Install the package with all dependencies
28
+ # Use --no-cache to reduce layer size
29
+ RUN uv pip install --system --no-cache -e .
30
+
31
+ # Runtime stage
32
+ FROM python:3.11-slim
33
+
34
+ # Set working directory
35
+ WORKDIR /app
36
+
37
+ # Install minimal runtime dependencies
38
+ RUN apt-get update && apt-get install -y \
39
+ ca-certificates \
40
+ curl \
41
+ && rm -rf /var/lib/apt/lists/*
42
+
43
+ # Copy Python environment from builder
44
+ COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
45
+ COPY --from=builder /usr/local/bin /usr/local/bin
46
+
47
+ # Copy application code
48
+ COPY --from=builder /app/src ./src
49
+ COPY --from=builder /app/README.md ./
50
+ COPY --from=builder /app/pyproject.toml ./
51
+
52
+ # Create non-root user for security
53
+ RUN useradd -m -u 1000 mcpuser && \
54
+ chown -R mcpuser:mcpuser /app
55
+
56
+ # Switch to non-root user
57
+ USER mcpuser
58
+
59
+ # Environment variables
60
+ ENV PYTHONUNBUFFERED=1 \
61
+ PYTHONDONTWRITEBYTECODE=1 \
62
+ PYTHONPATH=/app/src
63
+
64
+ # Health check
65
+ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
66
+ CMD python -c "import sys; sys.path.insert(0, '/app/src'); import chuk_mcp_solver; print('OK')" || exit 1
67
+
68
+ # Default command - run MCP server in HTTP mode for Docker
69
+ CMD ["python", "-m", "chuk_mcp_solver.server", "http"]
70
+
71
+ # Expose port for HTTP mode
72
+ EXPOSE 8000
73
+
74
+ # Labels for metadata
75
+ LABEL maintainer="info@chuk.ai" \
76
+ description="CHUK MCP Solver - General-purpose constraint and optimization solver" \
77
+ version="0.1.1" \
78
+ org.opencontainers.image.source="https://github.com/chuk-ai/chuk-mcp-solver" \
79
+ org.opencontainers.image.title="CHUK MCP Solver" \
80
+ org.opencontainers.image.description="MCP server for constraint satisfaction and optimization using OR-Tools" \
81
+ org.opencontainers.image.authors="CHUK AI <info@chuk.ai>"
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 CHUK AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ include README.md
2
+ include LICENSE
3
+ include pyproject.toml
4
+ recursive-include src *.py
5
+ recursive-include examples *.py *.sh *.json *.md
6
+ exclude examples/*.pyc
7
+ exclude **/__pycache__
8
+ global-exclude *.pyc
9
+ global-exclude *.pyo
10
+ global-exclude *~