package-maximizer 0.20.0__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 (151) hide show
  1. package_maximizer-0.20.0/.github/ISSUE_TEMPLATE/bug_report.md +28 -0
  2. package_maximizer-0.20.0/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
  3. package_maximizer-0.20.0/.github/dependabot.yml +12 -0
  4. package_maximizer-0.20.0/.github/pull_request_template.md +25 -0
  5. package_maximizer-0.20.0/.github/release-template.md +14 -0
  6. package_maximizer-0.20.0/.github/workflows/ci.yml +200 -0
  7. package_maximizer-0.20.0/.github/workflows/publish-test.yml +40 -0
  8. package_maximizer-0.20.0/.github/workflows/publish.yml +42 -0
  9. package_maximizer-0.20.0/.gitignore +160 -0
  10. package_maximizer-0.20.0/.gitleaks.toml +18 -0
  11. package_maximizer-0.20.0/.readthedocs.yaml +18 -0
  12. package_maximizer-0.20.0/CHANGELOG.md +128 -0
  13. package_maximizer-0.20.0/CITATION.cff +11 -0
  14. package_maximizer-0.20.0/CODEOWNERS +1 -0
  15. package_maximizer-0.20.0/CODE_OF_CONDUCT.md +12 -0
  16. package_maximizer-0.20.0/CONTRIBUTING.md +39 -0
  17. package_maximizer-0.20.0/Dockerfile +50 -0
  18. package_maximizer-0.20.0/LICENSE +21 -0
  19. package_maximizer-0.20.0/Makefile +51 -0
  20. package_maximizer-0.20.0/PKG-INFO +329 -0
  21. package_maximizer-0.20.0/PROJECT_PLAN.md +279 -0
  22. package_maximizer-0.20.0/README.md +272 -0
  23. package_maximizer-0.20.0/SECURITY.md +21 -0
  24. package_maximizer-0.20.0/STRATEGIC_PLAN.md +36 -0
  25. package_maximizer-0.20.0/docs/analyzers.rst +16 -0
  26. package_maximizer-0.20.0/docs/api-reference.rst +16 -0
  27. package_maximizer-0.20.0/docs/cli.rst +7 -0
  28. package_maximizer-0.20.0/docs/conf.py +63 -0
  29. package_maximizer-0.20.0/docs/core.rst +7 -0
  30. package_maximizer-0.20.0/docs/guides/custom-solver.md +22 -0
  31. package_maximizer-0.20.0/docs/index.rst +51 -0
  32. package_maximizer-0.20.0/docs/integrations.rst +15 -0
  33. package_maximizer-0.20.0/docs/parsers.rst +7 -0
  34. package_maximizer-0.20.0/docs/solvers.rst +7 -0
  35. package_maximizer-0.20.0/docs/tui.rst +7 -0
  36. package_maximizer-0.20.0/docs/tutorials/advanced-solvers.md +28 -0
  37. package_maximizer-0.20.0/docs/tutorials/basic-usage.md +32 -0
  38. package_maximizer-0.20.0/docs/utils.rst +52 -0
  39. package_maximizer-0.20.0/docs/web.rst +7 -0
  40. package_maximizer-0.20.0/package_maximizer/__init__.py +143 -0
  41. package_maximizer-0.20.0/package_maximizer/adapters/__init__.py +508 -0
  42. package_maximizer-0.20.0/package_maximizer/analyzers/__init__.py +41 -0
  43. package_maximizer-0.20.0/package_maximizer/analyzers/result_analyzer.py +278 -0
  44. package_maximizer-0.20.0/package_maximizer/cli/__init__.py +33 -0
  45. package_maximizer-0.20.0/package_maximizer/cli/main.py +1301 -0
  46. package_maximizer-0.20.0/package_maximizer/config/__init__.py +0 -0
  47. package_maximizer-0.20.0/package_maximizer/core/__init__.py +33 -0
  48. package_maximizer-0.20.0/package_maximizer/core/config.py +134 -0
  49. package_maximizer-0.20.0/package_maximizer/core/constraints.py +307 -0
  50. package_maximizer-0.20.0/package_maximizer/core/enums.py +50 -0
  51. package_maximizer-0.20.0/package_maximizer/core/interfaces.py +33 -0
  52. package_maximizer-0.20.0/package_maximizer/core/maximizer.py +422 -0
  53. package_maximizer-0.20.0/package_maximizer/core/model_encoder.py +82 -0
  54. package_maximizer-0.20.0/package_maximizer/core/package.py +41 -0
  55. package_maximizer-0.20.0/package_maximizer/di/__init__.py +21 -0
  56. package_maximizer-0.20.0/package_maximizer/di/container.py +178 -0
  57. package_maximizer-0.20.0/package_maximizer/di/factories.py +172 -0
  58. package_maximizer-0.20.0/package_maximizer/integrations/__init__.py +9 -0
  59. package_maximizer-0.20.0/package_maximizer/integrations/real_repo_integration.py +700 -0
  60. package_maximizer-0.20.0/package_maximizer/parsers/__init__.py +187 -0
  61. package_maximizer-0.20.0/package_maximizer/parsers/apt_parser.py +201 -0
  62. package_maximizer-0.20.0/package_maximizer/parsers/brew_parser.py +222 -0
  63. package_maximizer-0.20.0/package_maximizer/parsers/dnf_parser.py +206 -0
  64. package_maximizer-0.20.0/package_maximizer/parsers/extra_parsers.py +726 -0
  65. package_maximizer-0.20.0/package_maximizer/parsers/pacman_parser.py +186 -0
  66. package_maximizer-0.20.0/package_maximizer/solvers/__init__.py +169 -0
  67. package_maximizer-0.20.0/package_maximizer/solvers/enhanced_greedy.py +170 -0
  68. package_maximizer-0.20.0/package_maximizer/solvers/greedy.py +103 -0
  69. package_maximizer-0.20.0/package_maximizer/solvers/maxsat_solver.py +157 -0
  70. package_maximizer-0.20.0/package_maximizer/solvers/minisat_solver.py +160 -0
  71. package_maximizer-0.20.0/package_maximizer/solvers/ortools_solver.py +140 -0
  72. package_maximizer-0.20.0/package_maximizer/solvers/pulp_solver.py +138 -0
  73. package_maximizer-0.20.0/package_maximizer/solvers/z3_solver.py +132 -0
  74. package_maximizer-0.20.0/package_maximizer/tui/app.py +166 -0
  75. package_maximizer-0.20.0/package_maximizer/tui/shell.py +331 -0
  76. package_maximizer-0.20.0/package_maximizer/utils/__init__.py +11 -0
  77. package_maximizer-0.20.0/package_maximizer/utils/benchmark.py +348 -0
  78. package_maximizer-0.20.0/package_maximizer/utils/cache.py +284 -0
  79. package_maximizer-0.20.0/package_maximizer/utils/exporters.py +157 -0
  80. package_maximizer-0.20.0/package_maximizer/utils/logging_config.py +75 -0
  81. package_maximizer-0.20.0/package_maximizer/utils/lru_cache.py +35 -0
  82. package_maximizer-0.20.0/package_maximizer/web/__init__.py +3 -0
  83. package_maximizer-0.20.0/package_maximizer/web/app.py +1215 -0
  84. package_maximizer-0.20.0/package_maximizer.egg-info/PKG-INFO +329 -0
  85. package_maximizer-0.20.0/package_maximizer.egg-info/SOURCES.txt +149 -0
  86. package_maximizer-0.20.0/package_maximizer.egg-info/dependency_links.txt +1 -0
  87. package_maximizer-0.20.0/package_maximizer.egg-info/entry_points.txt +14 -0
  88. package_maximizer-0.20.0/package_maximizer.egg-info/requires.txt +36 -0
  89. package_maximizer-0.20.0/package_maximizer.egg-info/scm_file_list.json +145 -0
  90. package_maximizer-0.20.0/package_maximizer.egg-info/scm_version.json +8 -0
  91. package_maximizer-0.20.0/package_maximizer.egg-info/top_level.txt +1 -0
  92. package_maximizer-0.20.0/pyproject.toml +114 -0
  93. package_maximizer-0.20.0/real_world_runner.py +310 -0
  94. package_maximizer-0.20.0/requirements-core.txt +12 -0
  95. package_maximizer-0.20.0/requirements-dev.txt +11 -0
  96. package_maximizer-0.20.0/requirements-solvers.txt +5 -0
  97. package_maximizer-0.20.0/requirements-web.txt +4 -0
  98. package_maximizer-0.20.0/requirements.txt +14 -0
  99. package_maximizer-0.20.0/setup.cfg +4 -0
  100. package_maximizer-0.20.0/tests/__init__.py +3 -0
  101. package_maximizer-0.20.0/tests/conftest.py +7 -0
  102. package_maximizer-0.20.0/tests/test_adapters.py +275 -0
  103. package_maximizer-0.20.0/tests/test_adapters_extra.py +233 -0
  104. package_maximizer-0.20.0/tests/test_analyzers.py +221 -0
  105. package_maximizer-0.20.0/tests/test_basic.py +36 -0
  106. package_maximizer-0.20.0/tests/test_benchmark.py +196 -0
  107. package_maximizer-0.20.0/tests/test_benchmark_export.py +54 -0
  108. package_maximizer-0.20.0/tests/test_brew_parser.py +158 -0
  109. package_maximizer-0.20.0/tests/test_cli_analyze_compare.py +208 -0
  110. package_maximizer-0.20.0/tests/test_cli_commands.py +213 -0
  111. package_maximizer-0.20.0/tests/test_cli_extended.py +269 -0
  112. package_maximizer-0.20.0/tests/test_cli_extended_coverage.py +304 -0
  113. package_maximizer-0.20.0/tests/test_cli_shell.py +295 -0
  114. package_maximizer-0.20.0/tests/test_config_logging.py +93 -0
  115. package_maximizer-0.20.0/tests/test_constraints.py +192 -0
  116. package_maximizer-0.20.0/tests/test_core_maximizer.py +446 -0
  117. package_maximizer-0.20.0/tests/test_di.py +195 -0
  118. package_maximizer-0.20.0/tests/test_di_container.py +236 -0
  119. package_maximizer-0.20.0/tests/test_exporters.py +55 -0
  120. package_maximizer-0.20.0/tests/test_golden_fixtures.py +158 -0
  121. package_maximizer-0.20.0/tests/test_history.py +102 -0
  122. package_maximizer-0.20.0/tests/test_hypothesis_properties.py +78 -0
  123. package_maximizer-0.20.0/tests/test_integration.py +513 -0
  124. package_maximizer-0.20.0/tests/test_integrations.py +128 -0
  125. package_maximizer-0.20.0/tests/test_integrations_real_repo.py +187 -0
  126. package_maximizer-0.20.0/tests/test_lazy_registries.py +82 -0
  127. package_maximizer-0.20.0/tests/test_maximizer.py +183 -0
  128. package_maximizer-0.20.0/tests/test_metadata_flag.py +84 -0
  129. package_maximizer-0.20.0/tests/test_minisat_solver.py +138 -0
  130. package_maximizer-0.20.0/tests/test_ortools_solver.py +240 -0
  131. package_maximizer-0.20.0/tests/test_pacman_parser.py +122 -0
  132. package_maximizer-0.20.0/tests/test_parsers.py +91 -0
  133. package_maximizer-0.20.0/tests/test_parsers_conda_portage.py +51 -0
  134. package_maximizer-0.20.0/tests/test_parsers_extended.py +224 -0
  135. package_maximizer-0.20.0/tests/test_parsers_extra.py +323 -0
  136. package_maximizer-0.20.0/tests/test_propose_command.py +188 -0
  137. package_maximizer-0.20.0/tests/test_pulp_solver.py +278 -0
  138. package_maximizer-0.20.0/tests/test_solver_dependencies.py +93 -0
  139. package_maximizer-0.20.0/tests/test_solver_fallbacks.py +37 -0
  140. package_maximizer-0.20.0/tests/test_solvers.py +273 -0
  141. package_maximizer-0.20.0/tests/test_solvers_enhanced.py +156 -0
  142. package_maximizer-0.20.0/tests/test_solvers_extended.py +213 -0
  143. package_maximizer-0.20.0/tests/test_solvers_ortools_pulp.py +64 -0
  144. package_maximizer-0.20.0/tests/test_solvers_unified.py +122 -0
  145. package_maximizer-0.20.0/tests/test_solvers_weighted.py +85 -0
  146. package_maximizer-0.20.0/tests/test_tui.py +30 -0
  147. package_maximizer-0.20.0/tests/test_tui_app.py +24 -0
  148. package_maximizer-0.20.0/tests/test_tui_deep.py +116 -0
  149. package_maximizer-0.20.0/tests/test_utils.py +289 -0
  150. package_maximizer-0.20.0/tests/test_web_api.py +410 -0
  151. package_maximizer-0.20.0/tests/test_z3_solver.py +158 -0
@@ -0,0 +1,28 @@
1
+ name: Bug report
2
+ about: Create a report to help us improve
3
+ title: ''
4
+ labels: bug
5
+ assignees: dominicusin
6
+
7
+ body:
8
+ - type: textarea
9
+ id: description
10
+ attributes:
11
+ label: Description
12
+ description: What went wrong?
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: reproduction
17
+ attributes:
18
+ label: Reproduction
19
+ description: Steps or minimal example
20
+ validations:
21
+ required: true
22
+ - type: input
23
+ id: version
24
+ attributes:
25
+ label: Version
26
+ description: Package Maximizer version
27
+ validations:
28
+ required: true
@@ -0,0 +1,21 @@
1
+ name: Feature request
2
+ about: Suggest an idea for this project
3
+ title: ''
4
+ labels: enhancement
5
+ assignees: dominicusin
6
+
7
+ body:
8
+ - type: textarea
9
+ id: summary
10
+ attributes:
11
+ label: Summary
12
+ description: What problem does this solve?
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: motivation
17
+ attributes:
18
+ label: Motivation
19
+ description: Why is this useful?
20
+ validations:
21
+ required: false
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ allow:
8
+ - dependency-type: direct
9
+ - package-ecosystem: github-actions
10
+ directory: "/"
11
+ schedule:
12
+ interval: weekly
@@ -0,0 +1,25 @@
1
+ name: Pull request
2
+ about: Submit a change for review
3
+ title: ''
4
+ labels: ''
5
+ assignees: dominicusin
6
+
7
+ body:
8
+ - type: textarea
9
+ id: summary
10
+ attributes:
11
+ label: Summary
12
+ description: What changed and why?
13
+ validations:
14
+ required: true
15
+ - type: textarea
16
+ id: checks
17
+ attributes:
18
+ label: Checks
19
+ description: Confirm local verification
20
+ value: |
21
+ - [ ] make test passes
22
+ - [ ] flake8 critical check passes
23
+ - [ ] docs updated if behavior changed
24
+ validations:
25
+ required: true
@@ -0,0 +1,14 @@
1
+ # GitHub release notes template.
2
+
3
+ ## What's changed
4
+
5
+ - {Add a summary of user-facing changes}
6
+
7
+ ## Compatibility
8
+
9
+ - {Breaking changes or migration notes, if any}
10
+
11
+ ## Verification
12
+
13
+ - `make test`
14
+ - Local CLI checks for affected commands
@@ -0,0 +1,200 @@
1
+ name: Package Maximizer CI/CD
2
+
3
+ on:
4
+ push:
5
+ branches: [ main, develop ]
6
+ pull_request:
7
+ branches: [ main ]
8
+ release:
9
+ types: [ published ]
10
+
11
+ env:
12
+ PYTHON_VERSION: "3.11"
13
+
14
+ jobs:
15
+ # ─── Security checks ────────────────────────────────────────
16
+ security:
17
+ name: Security Audit
18
+ runs-on: ubuntu-latest
19
+ steps:
20
+ - uses: actions/checkout@v7
21
+
22
+ - name: Set up Python
23
+ uses: actions/setup-python@v7
24
+ with:
25
+ python-version: "3.11"
26
+
27
+ - name: Install dependencies
28
+ run: |
29
+ python -m pip install --upgrade pip
30
+ pip install -r requirements.txt
31
+ pip install bandit safety
32
+
33
+ - name: Run Bandit security linter
34
+ run: |
35
+ bandit -r package_maximizer/ -ii -f json -o bandit-report.json || true
36
+ bandit -r package_maximizer/ -ii --severity-level medium
37
+
38
+ - name: Check for known vulnerabilities
39
+ run: safety check -r requirements.txt --full-report || true
40
+
41
+ - name: Upload security report
42
+ if: always()
43
+ uses: actions/upload-artifact@v4
44
+ with:
45
+ name: security-report
46
+ path: bandit-report.json
47
+
48
+ # ─── Linting ────────────────────────────────────────────────
49
+ lint:
50
+ name: Code Quality
51
+ runs-on: ubuntu-latest
52
+ steps:
53
+ - uses: actions/checkout@v7
54
+
55
+ - name: Set up Python
56
+ uses: actions/setup-python@v7
57
+ with:
58
+ python-version: "3.11"
59
+
60
+ - name: Install dependencies
61
+ run: |
62
+ python -m pip install --upgrade pip
63
+ pip install -r requirements-dev.txt
64
+
65
+ - name: Lint with flake8 (critical only)
66
+ run: |
67
+ flake8 package_maximizer/ tests/ --count --select=E9,F63,F7,F82 --show-source --statistics
68
+
69
+ - name: Lint with flake8 (style, non-blocking)
70
+ run: |
71
+ flake8 package_maximizer/ tests/ --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
72
+
73
+ # Blocking checks — no || true (CI must catch regressions)
74
+ # Safe: these commands have no user-controlled input
75
+ - name: Type check with mypy
76
+ run: mypy package_maximizer/core/ package_maximizer/solvers/ package_maximizer/adapters/ --ignore-missing-imports
77
+
78
+ - name: Check formatting with black
79
+ run: black --check package_maximizer/ tests/
80
+
81
+ - name: Check imports with isort
82
+ run: isort --check-only package_maximizer/ tests/
83
+
84
+ # ─── Tests across matrix ────────────────────────────────────
85
+ test:
86
+ name: Test (${{ matrix.os }}, Python ${{ matrix.python-version }})
87
+ needs: [security, lint]
88
+ runs-on: ${{ matrix.os }}
89
+ strategy:
90
+ fail-fast: false
91
+ matrix:
92
+ os: [ubuntu-latest, windows-latest, macos-latest]
93
+ python-version: ["3.10", "3.11", "3.12"]
94
+
95
+ steps:
96
+ - uses: actions/checkout@v7
97
+ with:
98
+ fetch-depth: 0
99
+ fetch-tags: true
100
+
101
+ - name: Set up Python ${{ matrix.python-version }}
102
+ uses: actions/setup-python@v7
103
+ with:
104
+ python-version: ${{ matrix.python-version }}
105
+
106
+ - name: Cache pip packages
107
+ uses: actions/cache@v6
108
+ with:
109
+ path: ~/.cache/pip
110
+ key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}
111
+ restore-keys: |
112
+ ${{ runner.os }}-pip-
113
+
114
+ - name: Install system dependencies (Ubuntu)
115
+ if: matrix.os == 'ubuntu-latest'
116
+ run: |
117
+ sudo apt-get update
118
+ sudo apt-get install -y gcc g++ libffi-dev
119
+
120
+ - name: Install Python dependencies
121
+ run: |
122
+ python -m pip install --upgrade pip
123
+ pip install -r requirements.txt
124
+ pip install -e ".[dev,web,solvers,tui]"
125
+ pip install pytest-xdist
126
+
127
+ - name: Run tests with pytest
128
+ env:
129
+ # Fatals coverage gate only where all heavy solvers build (ubuntu).
130
+ # On macOS/Windows ortools/pysat cannot always compile, so their
131
+ # modules stay uncovered and a hard gate would always fail there.
132
+ COV_FAIL_UNDER: ${{ matrix.os == 'ubuntu-latest' && '85' || '' }}
133
+ shell: bash
134
+ run: |
135
+ GATE_FLAG=""
136
+ if [ -n "$COV_FAIL_UNDER" ]; then
137
+ GATE_FLAG="--cov-fail-under=$COV_FAIL_UNDER"
138
+ fi
139
+ pytest tests/ -v --cov=package_maximizer --cov-report=xml --cov-report=term $GATE_FLAG --tb=short
140
+
141
+ - name: Upload coverage to Codecov
142
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11'
143
+ uses: codecov/codecov-action@v7
144
+ continue-on-error: true
145
+ with:
146
+ file: ./coverage.xml
147
+ flags: unittests
148
+ name: codecov-ubuntu-py311
149
+
150
+ # ─── Build package ─────────────────────────────────────────
151
+ build:
152
+ name: Build Distribution
153
+ runs-on: ubuntu-latest
154
+ needs: [test]
155
+ steps:
156
+ - uses: actions/checkout@v7
157
+ with:
158
+ fetch-depth: 0
159
+ fetch-tags: true
160
+
161
+ - name: Set up Python
162
+ uses: actions/setup-python@v7
163
+ with:
164
+ python-version: "3.11"
165
+
166
+ - name: Install build tools
167
+ run: |
168
+ python -m pip install --upgrade pip
169
+ pip install build twine
170
+
171
+ - name: Build package
172
+ run: python -m build
173
+
174
+ - name: Check package with twine
175
+ run: twine check dist/*
176
+
177
+ - name: Upload build artifacts
178
+ uses: actions/upload-artifact@v4
179
+ with:
180
+ name: dist
181
+ path: dist/
182
+
183
+ # ─── Publish to PyPI ────────────────────────────────────────
184
+ publish:
185
+ name: Publish to PyPI
186
+ needs: [build]
187
+ runs-on: ubuntu-latest
188
+ if: github.event_name == 'release' && github.event.action == 'published'
189
+ environment: production
190
+ permissions:
191
+ id-token: write
192
+
193
+ steps:
194
+ - uses: actions/download-artifact@v8
195
+ with:
196
+ name: dist
197
+ path: dist/
198
+
199
+ - name: Publish to PyPI
200
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,40 @@
1
+ name: Publish to TestPyPI
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions: {}
7
+
8
+ jobs:
9
+ build:
10
+ name: Build distribution
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v7
14
+ with: {fetch-depth: 0, fetch-tags: true}
15
+ - uses: actions/setup-python@v7
16
+ with: {python-version: "3.11"}
17
+ - run: python -m pip install --upgrade build setuptools_scm
18
+ - run: python -m build
19
+ - uses: actions/upload-artifact@v4
20
+ with:
21
+ name: dist-test
22
+ path: dist/
23
+
24
+ testpypi-publish:
25
+ needs: build
26
+ runs-on: ubuntu-latest
27
+ environment:
28
+ name: testpypi
29
+ url: https://test.pypi.org/p/package-maximizer
30
+ permissions:
31
+ id-token: write
32
+ steps:
33
+ - uses: actions/download-artifact@v8
34
+ with: {name: dist-test, path: dist}
35
+ - name: Publish to TestPyPI
36
+ uses: pypa/gh-action-pypi-publish@v1.14.2
37
+ with:
38
+ repository-url: https://test.pypi.org/legacy/
39
+ # Uses GitHub OIDC Trusted Publishing (permissions: id-token: write above).
40
+ # The TestPyPI project "package-maximizer" must have a trusted publisher configured.
@@ -0,0 +1,42 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+ workflow_dispatch:
7
+
8
+ permissions: {}
9
+
10
+ jobs:
11
+ build:
12
+ name: Build distribution
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v7
16
+ with: {fetch-depth: 0, fetch-tags: true}
17
+ - uses: actions/setup-python@v7
18
+ with: {python-version: "3.11"}
19
+ - name: Install build tools
20
+ run: python -m pip install --upgrade build setuptools_scm
21
+ - name: Build sdist and wheel
22
+ run: python -m build
23
+ - uses: actions/upload-artifact@v4
24
+ with:
25
+ name: dist
26
+ path: dist/
27
+
28
+ pypi-publish:
29
+ name: Upload to PyPI
30
+ needs: build
31
+ runs-on: ubuntu-latest
32
+ environment:
33
+ name: pypi
34
+ url: https://pypi.org/p/package-maximizer
35
+ permissions: {}
36
+ steps:
37
+ - uses: actions/download-artifact@v8
38
+ with: {name: dist, path: dist}
39
+ - name: Publish to PyPI
40
+ uses: pypa/gh-action-pypi-publish@v1.14.2
41
+ with:
42
+ password: ${{ secrets.PYPI_API_TOKEN }}
@@ -0,0 +1,160 @@
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
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ *.manifest
31
+ *.spec
32
+
33
+ # Installer logs
34
+ pip-log.txt
35
+ pip-delete-this-directory.txt
36
+
37
+ # Unit test / coverage reports
38
+ htmlcov/
39
+ .tox/
40
+ .nox/
41
+ .coverage
42
+ .coverage.*
43
+ .cache
44
+ nosetests.xml
45
+ coverage.xml
46
+ *.cover
47
+ *.py,cover
48
+ .hypothesis/
49
+ .pytest_cache/
50
+ cover/
51
+
52
+ # Translations
53
+ *.mo
54
+ *.pot
55
+
56
+ # Django stuff:
57
+ *.log
58
+ local_settings.py
59
+ db.sqlite3
60
+ db.sqlite3-journal
61
+
62
+ # Flask stuff:
63
+ instance/
64
+ .webassets-cache
65
+
66
+ # Scrapy stuff:
67
+ .scrapy
68
+
69
+ # Sphinx documentation
70
+ docs/_build/
71
+ docs/build/
72
+
73
+ # PyBuilder
74
+ .pybuilder/
75
+ target/
76
+
77
+ # Jupyter Notebook
78
+ .ipynb_checkpoints
79
+
80
+ # IPython
81
+ profile_default/
82
+ ipython_config.py
83
+
84
+ # pyenv
85
+ .python-version
86
+
87
+ # pipenv
88
+ Pipfile.lock
89
+
90
+ # poetry
91
+ poetry.lock
92
+
93
+ # pdm
94
+ .pdm.toml
95
+
96
+ # PEP 582
97
+ __pypackages__/
98
+
99
+ # Celery stuff
100
+ celerybeat-schedule
101
+ celerybeat.pid
102
+
103
+ # SageMath parsed files
104
+ *.sage.py
105
+
106
+ # Environments
107
+ .env
108
+ .venv
109
+ env/
110
+ venv/
111
+ ENV/
112
+ env.bak/
113
+ venv.bak/
114
+
115
+ # Spyder project settings
116
+ .spyderproject
117
+ .spyproject
118
+
119
+ # Rope project settings
120
+ .ropeproject
121
+
122
+ # mkdocs documentation
123
+ /site
124
+
125
+ # mypy
126
+ .mypy_cache/
127
+ .dmypy.json
128
+ dmypy.json
129
+
130
+ # Pyre type checker
131
+ .pyre/
132
+
133
+ # pytype static type analyzer
134
+ .pytype/
135
+
136
+ # Cython debug symbols
137
+ cython_debug/
138
+
139
+ # IDEs
140
+ .vscode/
141
+ .idea/
142
+ *.swp
143
+ *.swo
144
+ *~
145
+
146
+ # OS
147
+ .DS_Store
148
+ Thumbs.db
149
+
150
+ # Project specific
151
+ *.db
152
+ *.sqlite
153
+ benchmark_results/
154
+ cache/
155
+ logs/
156
+ temp/
157
+ optimization_results.db
158
+ package_maximizer.log
159
+ *.optimized.Dockerfile
160
+ optimal_modules.sh
@@ -0,0 +1,18 @@
1
+ # .gitleaks.toml — Gitleaks secret-scan config for Package Maximizer.
2
+
3
+ title = "gitleaks config for Package Maximizer"
4
+
5
+ [extend]
6
+ useDefault = true
7
+
8
+ [allowlist]
9
+ description = "Allowlist non-sensitive patterns in docs/tests/config"
10
+ paths = [
11
+ '''^\.github/ISSUE_TEMPLATE/''',
12
+ '''^\.github/pull_request_template\.md$''',
13
+ '''^tests/''',
14
+ '''^docs/''',
15
+ '''^CHANGELOG\.md$''',
16
+ '''^CONTRIBUTING\.md$''',
17
+ '''^SECURITY\.md$''',
18
+ ]
@@ -0,0 +1,18 @@
1
+ # .readthedocs.yaml — ReadTheDocs build configuration.
2
+ # Docs are built from the /docs directory using Sphinx.
3
+
4
+ version: 2
5
+
6
+ build:
7
+ os: ubuntu-22.04
8
+ tools:
9
+ python: "3.11"
10
+
11
+ commands:
12
+ - python -m pip install --upgrade pip
13
+ - python -m pip install -e ".[dev,web,tui]"
14
+ - python -m pip install sphinx sphinx-rtd-theme myst-parser
15
+ - sphinx-build -b html docs $READTHEDOCS_OUTPUT/html
16
+
17
+ sphinx:
18
+ configuration: docs/conf.py