Repository navigation
feat: implement Phase 1 - core solvers, parsers, and CLI #18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -9,38 +9,123 @@ | |||||||||||
|
|
||||||||||||
| ## 🚀 Возможности | ||||||||||||
|
|
||||||||||||
| - **Поддержка множественных пакетных менеджеров**: pacman, apt, dnf, zypper, brew, Spack и другие | ||||||||||||
| - **Различные солверы**: Z3, PuLP, OR-Tools, MaxSAT, MiniSat | ||||||||||||
| - **Параллельное решение**: одновременный запуск нескольких солверов | ||||||||||||
| - **Веб-интерфейс**: интуитивный веб-интерфейс с визуализацией | ||||||||||||
| - **CLI инструменты**: мощный командный интерфейс | ||||||||||||
| - **Бенчмаркинг**: сравнение производительности солверов | ||||||||||||
| - **Модульная архитектура**: легко расширяемая система | ||||||||||||
| - **Поддержка пакетных менеджеров**: APT (Debian/Ubuntu), Pacman (Arch Linux), DNF (Fedora), Zypper (openSUSE), Brew (macOS), Spack и другие | ||||||||||||
| - **Реализованные солверы**: Greedy (жадный алгоритм), Z3 (SMT), PuLP (ILP), OR-Tools (CP-SAT) | ||||||||||||
| - **Парсеры**: APT parser для разбора вывода dpkg и apt | ||||||||||||
| - **Опциональные солверы**: MaxSAT, MiniSat (требуют установки дополнительных пакетов) | ||||||||||||
| - **CLI интерфейс**: Мощный командный интерфейс для работы | ||||||||||||
| - **Бенчмаркинг**: Встроенные тесты производительности | ||||||||||||
| - **Модульная архитектура**: Легко добавлять новые солверы и парсеры | ||||||||||||
|
|
||||||||||||
| ## 📋 Требования | ||||||||||||
|
|
||||||||||||
| - Python 3.8+ | ||||||||||||
| - Один или несколько поддерживаемых солверов | ||||||||||||
|
|
||||||||||||
| ## 🔧 Установка | ||||||||||||
| ## 📋 Установка | ||||||||||||
| ```bash | ||||||||||||
| # Из исходного кода | ||||||||||||
| git clone https://github.com/dominicusin/package-maximizer.git | ||||||||||||
| cd package-maximizer | ||||||||||||
| pip install -e ".[all]" | ||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| --- | ||||||||||||
|
|
||||||||||||
| 🔄 **Mirrors:** [](https://gitlab.com/dominicusin/package-maximizer) · GitHub is canonical. | ||||||||||||
| 🔹 **Mirrors:** [](https://gitlab.com/dominicusin/package-maximizer) · GitHub is canonical. | ||||||||||||
|
|
||||||||||||
| ## 🔧 Примеры использования | ||||||||||||
|
|
||||||||||||
| ### Пример 1: Простое использование CLI | ||||||||||||
| ```bash | ||||||||||||
| # Максимизировать множество пакетов с конфликтами | ||||||||||||
| package-maximizer pkg1 pkg2 pkg3 -c pkg1,pkg2 -s z3 | ||||||||||||
|
|
||||||||||||
| # С весами пакетов | ||||||||||||
| package-maximizer pkg1 pkg2 pkg3 -w pkg1,2.0 -w pkg2,1.5 | ||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| ### Пример 2: Использование в коде Python | ||||||||||||
| ```python | ||||||||||||
| from package_maximizer import PackageMaximizer, Package | ||||||||||||
|
|
||||||||||||
| # Создание пакетов | ||||||||||||
| pkg1 = Package(name="nginx", version="1.25.0") | ||||||||||||
| pkg2 = Package(name="apache2", version="2.4.57") | ||||||||||||
| pkg3 = Package(name="postgresql", version="15.0") | ||||||||||||
|
|
||||||||||||
| # Добавление конфликтов | ||||||||||||
| pkg1.conflicts = ["apache2"] # nginx конфликтует с apache2 | ||||||||||||
|
|
||||||||||||
| # Создание максимайзера | ||||||||||||
| maximizer = PackageMaximizer(manager="apt", solver="z3") | ||||||||||||
|
|
||||||||||||
| # Решение | ||||||||||||
| result = maximizer.maximize([pkg1, pkg2, pkg3]) | ||||||||||||
| print(f"Выбранные пакеты: {[p.name for p in result]}") | ||||||||||||
| # Вывод: Выбранные пакеты: ['nginx', 'postgresql'] | ||||||||||||
|
Comment on lines
+60
to
+61
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win The documented output is not guaranteed. Only one of 📝 Proposed wording print(f"Выбранные пакеты: {[p.name for p in result]}")
-# Вывод: Выбранные пакеты: ['nginx', 'postgresql']
+# Возможный вывод: Выбранные пакеты: ['nginx', 'postgresql']
+# (nginx и apache2 взаимоисключающие, поэтому солвер может выбрать apache2)📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| ### Пример 3: Использование с весами | ||||||||||||
| ```python | ||||||||||||
| from package_maximizer import PackageMaximizer, Package | ||||||||||||
|
|
||||||||||||
| # Пакеты с разными приоритетами | ||||||||||||
| packages = [ | ||||||||||||
| Package(name="python3", version="3.11"), | ||||||||||||
| Package(name="python3-dev", version="3.11"), | ||||||||||||
| Package(name="build-essential", version="12.9"), | ||||||||||||
| ] | ||||||||||||
|
|
||||||||||||
| # Веса (python3-dev важнее) | ||||||||||||
| weights = { | ||||||||||||
| "python3": 1.0, | ||||||||||||
| "python3-dev": 2.0, | ||||||||||||
| "build-essential": 1.5 | ||||||||||||
| } | ||||||||||||
|
|
||||||||||||
| maximizer = PackageMaximizer(solver="z3") | ||||||||||||
| result = maximizer.solve_with_weights(packages, weights) | ||||||||||||
| print(f"Выбранные пакеты: {result}") | ||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| ### Пример 4: Бенчмаркинг солверов | ||||||||||||
| ```bash | ||||||||||||
| # Сравнить производительность солверов | ||||||||||||
| package-maximizer benchmark --solvers greedy,z3,pulp --packages 100 --runs 5 | ||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| ## 📊 Solvers & Benchmarks | ||||||||||||
|
|
||||||||||||
| | Solver | Тип | Установка | Статус | | ||||||||||||
| |---|---|---|---| | ||||||||||||
| | **Z3** | SMT | `pip install package-maximizer[solvers]` (z3-solver) | ✅ основной | | ||||||||||||
| | **PuLP** | ILP/MIP | входит в `[solvers]` | ✅ основной | | ||||||||||||
| | **OR-Tools** | CP-SAT | входит в `[solvers]` | ✅ опционально | | ||||||||||||
| | **MaxSAT / MiniSat** | SAT | через `[all]` / python-sat | 🔬 экспериментально | | ||||||||||||
| | **Greedy** | Жадный алгоритм | Входит в базовый пакет | ✅ Работает | | ||||||||||||
| | **Z3** | SMT | `pip install package-maximizer[solvers]` (z3-solver) | ✅ Работает | | ||||||||||||
| | **PuLP** | ILP/MIP | Входит в `[solvers]` | ✅ Работает | | ||||||||||||
| | **OR-Tools** | CP-SAT | Входит в `[solvers]` | ✅ Работает | | ||||||||||||
| | **MaxSAT / MiniSat** | SAT | через `[all]` / python-sat | 🔧 Экспериментально | | ||||||||||||
|
|
||||||||||||
| Запуск бенчмарков: `python -m package_maximizer.cli.main benchmark --solvers z3,pulp --packages 500` | ||||||||||||
| (сравнение времени решения и качества решения для разных солверов на синтетических данных). | ||||||||||||
|
|
||||||||||||
| ## 📈 Требования | ||||||||||||
|
|
||||||||||||
| - Python 3.10+ | ||||||||||||
| - Один или несколько поддерживаемых солверов (z3-solver, pulp, ortools) | ||||||||||||
|
|
||||||||||||
| ## 🛠️ Разработка | ||||||||||||
|
|
||||||||||||
| ```bash | ||||||||||||
| # Установка для разработки | ||||||||||||
| pip install -e ".[dev,all]" | ||||||||||||
|
|
||||||||||||
| # Запуск тестов | ||||||||||||
| pytest tests/ -v | ||||||||||||
|
|
||||||||||||
| # Проверка кода | ||||||||||||
| flake8 package_maximizer/ tests/ | ||||||||||||
| mypy package_maximizer/ | ||||||||||||
|
|
||||||||||||
| # Форматирование кода | ||||||||||||
| black package_maximizer/ tests/ | ||||||||||||
| isort package_maximizer/ tests/ | ||||||||||||
| ``` | ||||||||||||
|
|
||||||||||||
| ## 📜 Лицензия | ||||||||||||
|
|
||||||||||||
| Запуск бенчмарков: `python -m package_maximizer.bench --solvers z3,pulp --packages 500` | ||||||||||||
| (сравнение времени решения и качества множества на синтетических зависимостных графах). | ||||||||||||
| MIT License - см. файл [LICENSE](LICENSE) | ||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| 8BD0 | @@ -1,29 +1,69 @@ | |
| """ | ||
| Package Maximizer - Модульная система для максимизации пакетов | ||
| Package Maximizer - Модульная система для максимизации непротиворечивого множества пакетов. | ||
|
|
||
| Система для решения задачи максимизации непротиворечивого множества пакетов | ||
| с использованием различных SAT/ILP/SMT солверов. | ||
| Использует различные SAT/ILP/SMT солверы для множественных пакетных менеджеров. | ||
| """ | ||
|
|
||
| __version__ = "0.1.0" | ||
| __version__ = "0.2.0" | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win 🔎 Supported by static analysis🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- package module ---'
cat -n package_maximizer/__init__.py
printf '%s\n' '--- packaging metadata files ---'
for f in pyproject.toml setup.py setup.cfg; do
if [ -f "$f" ]; then
printf '%s\n' "--- $f ---"
cat -n "$f"
fi
done
printf '%s\n' '--- version declarations in tracked files ---'
rg -n --glob '!*.lock' --glob '!*.sum' \
'(^|[^0-9])0\.([12])\.0([^0-9]|$)|(__version__|version\s*=|dynamic\s*=)' \
.Repository: dominicusin/package-maximizer Length of output: 6721 🌐 Web query:
💡 Result: To use setuptools_scm with a dynamic version and a fallback version, you must configure your pyproject.toml to handle dynamic metadata and specify the fallback behavior within the [tool.setuptools_scm] section [1][2]. 1. Dynamic Version Configuration In your pyproject.toml, you must indicate that the project version is dynamic. This informs the build backend that the version will be determined at build time rather than being hardcoded in the file [3][2]. [project] name = "your-package" dynamic = ["version"] 2. Fallback Version Configuration The fallback_version parameter is used to provide a version string if setuptools_scm cannot detect the version via SCM metadata (e.g., when building from a source archive, such as a tarball, that lacks metadata) [1][4][5]. By default, if this is not set, setuptools_scm will raise an error if version detection fails [1][6]. You can define this in the [tool.setuptools_scm] table [2]: [tool.setuptools_scm] fallback_version = "0.1.0" Summary of Requirements - Build System: Ensure setuptools and setuptools-scm are defined in your [build-system] requires [7][2]. - Configuration: All non-code configuration (like fallback_version) should reside in pyproject.toml [7][8]. Use a setup.py file only if you need to pass Python callables (e.g., custom version schemes) that cannot be expressed in TOML [7][8]. For additional stability, especially when building from archives that do not contain SCM metadata, ensure your build environment is correctly configured to support these settings [7]. Citations:
Update the distribution fallback version.
🤖 Prompt for AI Agents |
||
| __author__ = "Package Maximizer Team" | ||
| __email__ = "team@package-maximizer.dev" | ||
| __license__ = "MIT" | ||
|
|
||
| # Enums | ||
| from .core.enums import PackageManagerType, SolverType | ||
| # Core components | ||
| from .core.enums import PackageManagerType, SolverType, PackageStatus | ||
| from .core.interfaces import ConstraintSolver, PackageParser, ResultAnalyzer | ||
| from .core.maximizer import PackageMaximizer | ||
| from .core.package import Package, PackageConstraint | ||
|
|
||
| # Solvers | ||
| from .solvers import ( | ||
| GreedySolver, | ||
| Z3Solver, | ||
| PulPSolver, | ||
| ORToolsSolver, | ||
| get_solver, | ||
| SOLVER_REGISTRY, | ||
| ) | ||
|
|
||
| # Parsers | ||
| from .parsers import ( | ||
| APTParser, | ||
| get_parser, | ||
| PARSER_REGISTRY, | ||
| ) | ||
|
|
||
| __all__ = [ | ||
| # Version info | ||
| "__version__", | ||
| "__author__", | ||
| "__email__", | ||
| "__license__", | ||
|
|
||
| # Enums | ||
| "PackageManagerType", | ||
| "SolverType", | ||
| "PackageStatus", | ||
|
|
||
| # Interfaces | ||
| "ConstraintSolver", | ||
| "PackageParser", | ||
| "ResultAnalyzer", | ||
|
|
||
| # Core classes | ||
| "Package", | ||
| "PackageConstraint", | ||
| "PackageMaximizer", | ||
| "PackageParser", | ||
| "ConstraintSolver", | ||
| "ResultAnalyzer", | ||
| "PackageManagerType", | ||
| "SolverType", | ||
| "__version__", | ||
|
|
||
| # Solvers | ||
| "GreedySolver", | ||
| "Z3Solver", | ||
| "PulPSolver", | ||
| "ORToolsSolver", | ||
| "get_solver", | ||
| "SOLVER_REGISTRY", | ||
|
|
||
| # Parsers | ||
| "APTParser", | ||
| "get_parser", | ||
| "PARSER_REGISTRY", | ||
| ] | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| """ | ||
| CLI module for Package Maximizer. | ||
| """ | ||
|
|
||
| from .main import cli | ||
|
|
||
| __all__ = ['cli'] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
🔎 Supported by static analysis
🏁 Script executed:
Repository: dominicusin/package-maximizer
Length of output: 258
🏁 Script executed:
Repository: dominicusin/package-maximizer
Length of output: 29769
🏁 Script executed:
Repository: dominicusin/package-maximizer
Length of output: 6750
Use separate arguments for tuple-valued CLI options.
-cand-wrequire separate values. Use-c pkg1 pkg2and-w pkg1 2.0 -w pkg2 1.5. The documented-soption,benchmarkoptions,managerkeyword, andPackageMaximizer.solve_with_weightsexist.🤖 Prompt for AI Agents