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.
- package_maximizer-0.20.0/.github/ISSUE_TEMPLATE/bug_report.md +28 -0
- package_maximizer-0.20.0/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
- package_maximizer-0.20.0/.github/dependabot.yml +12 -0
- package_maximizer-0.20.0/.github/pull_request_template.md +25 -0
- package_maximizer-0.20.0/.github/release-template.md +14 -0
- package_maximizer-0.20.0/.github/workflows/ci.yml +200 -0
- package_maximizer-0.20.0/.github/workflows/publish-test.yml +40 -0
- package_maximizer-0.20.0/.github/workflows/publish.yml +42 -0
- package_maximizer-0.20.0/.gitignore +160 -0
- package_maximizer-0.20.0/.gitleaks.toml +18 -0
- package_maximizer-0.20.0/.readthedocs.yaml +18 -0
- package_maximizer-0.20.0/CHANGELOG.md +128 -0
- package_maximizer-0.20.0/CITATION.cff +11 -0
- package_maximizer-0.20.0/CODEOWNERS +1 -0
- package_maximizer-0.20.0/CODE_OF_CONDUCT.md +12 -0
- package_maximizer-0.20.0/CONTRIBUTING.md +39 -0
- package_maximizer-0.20.0/Dockerfile +50 -0
- package_maximizer-0.20.0/LICENSE +21 -0
- package_maximizer-0.20.0/Makefile +51 -0
- package_maximizer-0.20.0/PKG-INFO +329 -0
- package_maximizer-0.20.0/PROJECT_PLAN.md +279 -0
- package_maximizer-0.20.0/README.md +272 -0
- package_maximizer-0.20.0/SECURITY.md +21 -0
- package_maximizer-0.20.0/STRATEGIC_PLAN.md +36 -0
- package_maximizer-0.20.0/docs/analyzers.rst +16 -0
- package_maximizer-0.20.0/docs/api-reference.rst +16 -0
- package_maximizer-0.20.0/docs/cli.rst +7 -0
- package_maximizer-0.20.0/docs/conf.py +63 -0
- package_maximizer-0.20.0/docs/core.rst +7 -0
- package_maximizer-0.20.0/docs/guides/custom-solver.md +22 -0
- package_maximizer-0.20.0/docs/index.rst +51 -0
- package_maximizer-0.20.0/docs/integrations.rst +15 -0
- package_maximizer-0.20.0/docs/parsers.rst +7 -0
- package_maximizer-0.20.0/docs/solvers.rst +7 -0
- package_maximizer-0.20.0/docs/tui.rst +7 -0
- package_maximizer-0.20.0/docs/tutorials/advanced-solvers.md +28 -0
- package_maximizer-0.20.0/docs/tutorials/basic-usage.md +32 -0
- package_maximizer-0.20.0/docs/utils.rst +52 -0
- package_maximizer-0.20.0/docs/web.rst +7 -0
- package_maximizer-0.20.0/package_maximizer/__init__.py +143 -0
- package_maximizer-0.20.0/package_maximizer/adapters/__init__.py +508 -0
- package_maximizer-0.20.0/package_maximizer/analyzers/__init__.py +41 -0
- package_maximizer-0.20.0/package_maximizer/analyzers/result_analyzer.py +278 -0
- package_maximizer-0.20.0/package_maximizer/cli/__init__.py +33 -0
- package_maximizer-0.20.0/package_maximizer/cli/main.py +1301 -0
- package_maximizer-0.20.0/package_maximizer/config/__init__.py +0 -0
- package_maximizer-0.20.0/package_maximizer/core/__init__.py +33 -0
- package_maximizer-0.20.0/package_maximizer/core/config.py +134 -0
- package_maximizer-0.20.0/package_maximizer/core/constraints.py +307 -0
- package_maximizer-0.20.0/package_maximizer/core/enums.py +50 -0
- package_maximizer-0.20.0/package_maximizer/core/interfaces.py +33 -0
- package_maximizer-0.20.0/package_maximizer/core/maximizer.py +422 -0
- package_maximizer-0.20.0/package_maximizer/core/model_encoder.py +82 -0
- package_maximizer-0.20.0/package_maximizer/core/package.py +41 -0
- package_maximizer-0.20.0/package_maximizer/di/__init__.py +21 -0
- package_maximizer-0.20.0/package_maximizer/di/container.py +178 -0
- package_maximizer-0.20.0/package_maximizer/di/factories.py +172 -0
- package_maximizer-0.20.0/package_maximizer/integrations/__init__.py +9 -0
- package_maximizer-0.20.0/package_maximizer/integrations/real_repo_integration.py +700 -0
- package_maximizer-0.20.0/package_maximizer/parsers/__init__.py +187 -0
- package_maximizer-0.20.0/package_maximizer/parsers/apt_parser.py +201 -0
- package_maximizer-0.20.0/package_maximizer/parsers/brew_parser.py +222 -0
- package_maximizer-0.20.0/package_maximizer/parsers/dnf_parser.py +206 -0
- package_maximizer-0.20.0/package_maximizer/parsers/extra_parsers.py +726 -0
- package_maximizer-0.20.0/package_maximizer/parsers/pacman_parser.py +186 -0
- package_maximizer-0.20.0/package_maximizer/solvers/__init__.py +169 -0
- package_maximizer-0.20.0/package_maximizer/solvers/enhanced_greedy.py +170 -0
- package_maximizer-0.20.0/package_maximizer/solvers/greedy.py +103 -0
- package_maximizer-0.20.0/package_maximizer/solvers/maxsat_solver.py +157 -0
- package_maximizer-0.20.0/package_maximizer/solvers/minisat_solver.py +160 -0
- package_maximizer-0.20.0/package_maximizer/solvers/ortools_solver.py +140 -0
- package_maximizer-0.20.0/package_maximizer/solvers/pulp_solver.py +138 -0
- package_maximizer-0.20.0/package_maximizer/solvers/z3_solver.py +132 -0
- package_maximizer-0.20.0/package_maximizer/tui/app.py +166 -0
- package_maximizer-0.20.0/package_maximizer/tui/shell.py +331 -0
- package_maximizer-0.20.0/package_maximizer/utils/__init__.py +11 -0
- package_maximizer-0.20.0/package_maximizer/utils/benchmark.py +348 -0
- package_maximizer-0.20.0/package_maximizer/utils/cache.py +284 -0
- package_maximizer-0.20.0/package_maximizer/utils/exporters.py +157 -0
- package_maximizer-0.20.0/package_maximizer/utils/logging_config.py +75 -0
- package_maximizer-0.20.0/package_maximizer/utils/lru_cache.py +35 -0
- package_maximizer-0.20.0/package_maximizer/web/__init__.py +3 -0
- package_maximizer-0.20.0/package_maximizer/web/app.py +1215 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/PKG-INFO +329 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/SOURCES.txt +149 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/dependency_links.txt +1 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/entry_points.txt +14 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/requires.txt +36 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/scm_file_list.json +145 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/scm_version.json +8 -0
- package_maximizer-0.20.0/package_maximizer.egg-info/top_level.txt +1 -0
- package_maximizer-0.20.0/pyproject.toml +114 -0
- package_maximizer-0.20.0/real_world_runner.py +310 -0
- package_maximizer-0.20.0/requirements-core.txt +12 -0
- package_maximizer-0.20.0/requirements-dev.txt +11 -0
- package_maximizer-0.20.0/requirements-solvers.txt +5 -0
- package_maximizer-0.20.0/requirements-web.txt +4 -0
- package_maximizer-0.20.0/requirements.txt +14 -0
- package_maximizer-0.20.0/setup.cfg +4 -0
- package_maximizer-0.20.0/tests/__init__.py +3 -0
- package_maximizer-0.20.0/tests/conftest.py +7 -0
- package_maximizer-0.20.0/tests/test_adapters.py +275 -0
- package_maximizer-0.20.0/tests/test_adapters_extra.py +233 -0
- package_maximizer-0.20.0/tests/test_analyzers.py +221 -0
- package_maximizer-0.20.0/tests/test_basic.py +36 -0
- package_maximizer-0.20.0/tests/test_benchmark.py +196 -0
- package_maximizer-0.20.0/tests/test_benchmark_export.py +54 -0
- package_maximizer-0.20.0/tests/test_brew_parser.py +158 -0
- package_maximizer-0.20.0/tests/test_cli_analyze_compare.py +208 -0
- package_maximizer-0.20.0/tests/test_cli_commands.py +213 -0
- package_maximizer-0.20.0/tests/test_cli_extended.py +269 -0
- package_maximizer-0.20.0/tests/test_cli_extended_coverage.py +304 -0
- package_maximizer-0.20.0/tests/test_cli_shell.py +295 -0
- package_maximizer-0.20.0/tests/test_config_logging.py +93 -0
- package_maximizer-0.20.0/tests/test_constraints.py +192 -0
- package_maximizer-0.20.0/tests/test_core_maximizer.py +446 -0
- package_maximizer-0.20.0/tests/test_di.py +195 -0
- package_maximizer-0.20.0/tests/test_di_container.py +236 -0
- package_maximizer-0.20.0/tests/test_exporters.py +55 -0
- package_maximizer-0.20.0/tests/test_golden_fixtures.py +158 -0
- package_maximizer-0.20.0/tests/test_history.py +102 -0
- package_maximizer-0.20.0/tests/test_hypothesis_properties.py +78 -0
- package_maximizer-0.20.0/tests/test_integration.py +513 -0
- package_maximizer-0.20.0/tests/test_integrations.py +128 -0
- package_maximizer-0.20.0/tests/test_integrations_real_repo.py +187 -0
- package_maximizer-0.20.0/tests/test_lazy_registries.py +82 -0
- package_maximizer-0.20.0/tests/test_maximizer.py +183 -0
- package_maximizer-0.20.0/tests/test_metadata_flag.py +84 -0
- package_maximizer-0.20.0/tests/test_minisat_solver.py +138 -0
- package_maximizer-0.20.0/tests/test_ortools_solver.py +240 -0
- package_maximizer-0.20.0/tests/test_pacman_parser.py +122 -0
- package_maximizer-0.20.0/tests/test_parsers.py +91 -0
- package_maximizer-0.20.0/tests/test_parsers_conda_portage.py +51 -0
- package_maximizer-0.20.0/tests/test_parsers_extended.py +224 -0
- package_maximizer-0.20.0/tests/test_parsers_extra.py +323 -0
- package_maximizer-0.20.0/tests/test_propose_command.py +188 -0
- package_maximizer-0.20.0/tests/test_pulp_solver.py +278 -0
- package_maximizer-0.20.0/tests/test_solver_dependencies.py +93 -0
- package_maximizer-0.20.0/tests/test_solver_fallbacks.py +37 -0
- package_maximizer-0.20.0/tests/test_solvers.py +273 -0
- package_maximizer-0.20.0/tests/test_solvers_enhanced.py +156 -0
- package_maximizer-0.20.0/tests/test_solvers_extended.py +213 -0
- package_maximizer-0.20.0/tests/test_solvers_ortools_pulp.py +64 -0
- package_maximizer-0.20.0/tests/test_solvers_unified.py +122 -0
- package_maximizer-0.20.0/tests/test_solvers_weighted.py +85 -0
- package_maximizer-0.20.0/tests/test_tui.py +30 -0
- package_maximizer-0.20.0/tests/test_tui_app.py +24 -0
- package_maximizer-0.20.0/tests/test_tui_deep.py +116 -0
- package_maximizer-0.20.0/tests/test_utils.py +289 -0
- package_maximizer-0.20.0/tests/test_web_api.py +410 -0
- 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,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
|