Compare commits

..

37 Commits

Author SHA1 Message Date
LLM
0957e772ec [+] bump archlinux to v0.53, release wheels v0.40-v0.53, update venv-whl-cache
1. bump version to 0.53 in pyproject.common.toml;
  2. add test_archive_versions, test_network, test_cache_settings,
     test_install to test_names;
  3. update .venv-whl-cache: librt 0.9.0, marisa_trie 1.4.1, mypy 1.20.1,
     pydantic 2.13.0, pydantic_core 2.46.0, pr34 0.1.5.69;
  4. release archlinux wheels v0.40 through v0.53;
2026-04-22 09:00:00 +00:00
LLM
fc52280b43 [+] cve cli/db fixes: sync returns upsert_result, signal handling
1. cve cli sync: backend.sync() now returns upsert_result directly,
     remove redundant db.upsert_entries call;
  2. add signal import for SIGINT/SIGTERM handling;
2026-04-22 09:00:00 +00:00
LLM
9b7046d6f0 [+] install command, main CLI wiring for network/cache/install
1. add cli/install.py: install_t class with --mode bash/exec,
     -m/--package-manager (pacman default), --dry-run BooleanOptionalAction,
     -r requirements, -d pkg_dir;
  2. add pacman_t.build_install_command() for generating pacman -U command;
  3. wire install, network, cache CLI into main.py;
  4. add test_install.py;
2026-04-22 09:00:00 +00:00
LLM
5a749b20b9 [+] archive versions table, parse_archive_listing, sync_reference
1. add archive_versions table to cache_db (schema v2) with name,
     version, archive_date, filename, status (pending/synced);
  2. add archive_version_status_t StrEnum, archive_version_row_t model;
  3. add cache_db methods: upsert/mark_synced/list/find/bulk_upsert
     archive versions, has_package_version;
  4. add archive_entry_t dataclass and parse_archive_listing() on
     pacman_manager_t for parsing nginx autoindex HTML;
  5. add sync_reference() on manager: fetches archive listing pages for
     missing pinned versions, stores entries, syncs needed dates;
  6. add sync_reference to abstract manager_t interface;
  7. add --reference to archive sync CLI;
  8. add test_archive_versions.py with HTML parsing, DB, and
     sync_reference tests;
2026-04-22 09:00:00 +00:00
LLM
cd170d2e9e [+] cache settings singleton, remove per-subcommand --cache-dir
1. add apps/cache/settings.py: cache_settings_t pydantic-settings singleton
     with default dir ~/.cache/online.fxreader.pr34.commands_typed.archlinux/
     apps/cache/cache_dir, env var ARCHLINUX_CACHE_DIR;
  2. add apps/cache/cli.py: cache_cli_t with add_arguments/extract/apply;
  3. remove --cache-dir from compile and archive subcommands, they now
     use cache_settings_t.singleton().dir;
  4. add test_cache_settings.py;
2026-04-22 09:00:00 +00:00
LLM
8079aae41c [+] apps/network module: settings singleton, net_t helpers, CLI integration
1. add apps/network/settings.py: net_settings_t pydantic-settings singleton
     with timeout (8s default) and max_size (50MB default), env vars
     ARCHLINUX_NET_TIMEOUT/ARCHLINUX_NET_MAX_SIZE, reset() classmethod;
  2. add apps/network/base.py: net_t class with fetch_url, fetch_text,
     head_content_length, post_json, download_to_file (sync) and async
     wrappers, all enforcing timeout and max_size from settings;
  3. add apps/network/cli.py: net_cli_t with add_arguments/extract/apply
     for --net-timeout and --net-max-size CLI args;
  4. refactor cve/base.py: remove duplicate _fetch_url/_post_json/_head
     wrappers, callers use net_t directly;
  5. refactor cve/nvd.py, cve/osv.py, cve/arch_tracker.py: use net_t;
  6. refactor pacman/client.py, pacman/manager.py: use net_t;
  7. add test_network.py with settings, read_limited, fetch, cli tests;
2026-04-22 09:00:00 +00:00
LLM
857e9d41a2 [+] move models.py to apps/specs/, add compiled_entry_t, unified parse_compiled
1. move models.py into apps/specs/models.py, add compiled_entry_t
     pydantic model for parsed requirements entries;
  2. add apps/specs/utils.py with parse_compiled() and parse_reference()
     as single source for requirements file parsing;
  3. refactor cli/diff.py: remove local parse_compiled, use specs/utils,
     compute_diff takes dict[str, compiled_entry_t];
  4. refactor cli/download.py: remove download_requirements_t class,
     use parse_compiled from specs/utils;
  5. refactor cli/compile.py: compile_t class encapsulating all logic,
     -p/--package with action=append, --mode (requirements/needed/full),
     -o/--output, --generate-hashes default true with BooleanOptionalAction,
     build_filter computed once, transitive_deps minus pinned;
  6. update all imports across apps/, cli/, resolver/, tests/;
2026-04-22 09:00:00 +00:00
LLM
d0215504d0 [+] unified resolver: constraints_t, resolver_base_t, requested flag
1. add resolver/common.py with constraints_t class holding all constraints
     with filtered property views (install, excluded, ignored, pinned,
     upgrade, requested) and resolver_base_t abstract base class;
  2. refactor resolver/general.py: extend resolver_base_t, resolve() takes
     constraints_t, add resolve_specs() classmethod convenience for tests;
  3. refactor resolver/solv.py: solv_resolver_t extends resolver_base_t,
     fix pkg_spec NameError in error messages, remove duplicate parse_reference;
  4. add requested flag to package_constraint_t for tracking user-specified
     packages vs reference pins;
  5. update test_resolver.py and test_solv_backend.py for new interface;
2026-04-22 09:00:00 +00:00
LLM
f0c9d072e0 [+] bump archlinux to v0.39, pr34 dep to >=0.1.5.69, release wheels
1. bump archlinux to v0.39 with async CVE backends, CLI output formats, package mapping;
  2. pr34 dep >=0.1.5.69 for stop_at argparse;
  3. add test_package_mapping and test_orm to test_names;
  4. copy pr34 v0.1.5.69 into archlinux deps/whl;
  5. update requirements.3.13.txt;
  6. release archlinux wheels v0.28 through v0.39;
  7. release pr34 v0.1.5.69 wheel;
2026-04-17 09:00:00 +00:00
LLM
61892b6aea [+] cross-distro package mapping with fixtures and coverage tests
1. add package_mapping.py with package_map_t class;
  2. supports: direct match, known aliases, version-aware (gcc-12, python3.11),
     suffix strip (-libs, -utils, -doc), prefix strip (lib32-, lib-),
     language prefixes (python->bare/py3-, perl->lib*-perl, ruby, haskell),
     family packages (libreoffice-, firefox-, gst-, vlc-, qemu-, vim-);
  3. lazy-initialized alias tables via _ensure_aliases classmethod;
  4. tested_ecosystems set for honest supported count;
  5. add distro package list fixtures: debian12, debian13, alpine321, wolfi, arch_latest;
  6. add test_package_mapping.py with unit tests and coverage thresholds:
     debian12>=50%, debian13>=50%, alpine>=8%, wolfi>=14%;
2026-04-17 09:00:00 +00:00
LLM
4c681b6018 [+] CVE backends async, CLI with output formats, status density, ecosystem tracking
1. convert all CVE backends to async (run_in_executor + urllib);
  2. base class provides _fetch_url, _post_json, _head_content_length async helpers;
  3. NVD rate-limit delays use asyncio.sleep;
  4. add --timeout to cve sync via asyncio.wait_for;
  5. add cve CLI as apps/cve/cli.py with cve_cli_t class, routed from cli/main.py;
  6. main.py uses pr34 parse_args stop_at for proper -h passthrough;
  7. add cli_types.py with pydantic models for sync/status/check results;
  8. add cli_render.py with txt/json/yaml output renderers;
  9. add --format txt|json|yaml flag on cve parser;
  10. status shows per-source: entries, last_sync (datetime), fetch_range, density;
  11. density computed from date_published (NVD), CVE ID year (arch_tracker);
  12. cve_db_t schema v2: add cve_osv_ecosystems table;
  13. osv_ecosystems_t fetches from GCS, fixes infinite loop (IsTruncated check);
  14. status shows ecosystem counts: total/supported/unsupported per package_map_t;
  15. sync stores ecosystems in sqlite, status reads from db only;
  16. all print() replaced with logger or stdout render;
  17. arch_tracker sync: clean fetch/parsed/ingested logging, no per-100 spam;
  18. upsert_entries returns cve_upsert_result_t with received/inserted counts;
  19. add cve_date_range_t, cve_upsert_result_t, output_format_t, date_source_t types;
2026-04-17 09:00:00 +00:00
LLM
2dac844087 [+] add stop_at parameter to parse_args for subcommand routing, bump pr34 v0.1.5.69
1. add stop_at param to commands_typed/argparse.py parse_args();
  2. when a token from stop_at is found, parsing stops and remainder is returned inclusive;
  3. enables main parser to stop before subcommand so -h passes through to subcommand;
  4. add test_argparse.py with 10 tests: default, double-dash, stop_at, edge cases;
  5. add test_argparse to pr34 test_names config;
  6. bump pr34 to v0.1.5.69;
2026-04-17 09:00:00 +00:00
LLM
c491da0bb9 [+] bump archlinux to v0.27, pr34 dep to >=0.1.5.68, release wheels
1. update archlinux pyproject.common.toml: pr34>=0.1.5.68 as main dep;
  2. add test_orm and test_cve to test_names config;
  3. copy pr34 v0.1.5.68 wheel into archlinux deps/whl;
  4. release archlinux wheels v0.25 through v0.27;
  5. release pr34 v0.1.5.68 wheel;
2026-04-13 09:00:00 +00:00
LLM
da86659b67 [+] add CVE module: arch tracker, NVD, OSV backends with unified types and ORM
1. add apps/cve/ with unified types (cve_entry_t, cve_severity_t, cve_status_t);
  2. backend-specific pydantic models in arch_tracker_types.py, nvd_types.py, osv_types.py;
  3. abstract cve_backend_t with estimate_sync (HTTP HEAD) and sync interfaces;
  4. arch_tracker backend: fetches /issues/all.json, pydantic validate_json from stream;
  5. nvd backend: paginated, rate-limited, date range chunking (120-day max), optional API key;
  6. osv backend: batch query API, Debian ecosystem proxy, query_packages() for explicit lists;
  7. cve_db_t ORM module: cve_entries, cve_details (JSON blob), cve_sync_meta tables;
  8. all db queries return pydantic-validated lists via TypeAdapter;
  9. checker.py: check packages against cached CVEs using vercmp version comparison;
  10. heuristics.py: normalize product names, known alias table, exact/normalized matching;
  11. test_cve.py: 37 tests covering type parsing (real samples), db CRUD, checker logic, heuristics;
2026-04-13 09:00:00 +00:00
LLM
96ab3c23e5 [+] add csize to package_t and compile_entry_t, emit --size= in compiled output
1. add csize field to package_t (general model) for compressed download size;
  2. add csize field to compile_entry_t;
  3. compile.py passes pkg.csize into compile entry;
  4. to_txt() emits --size=BYTES after --hash= when csize > 0;
  5. download parser extracts --size= into download_entry_t.csize;
  6. progress uses csize for byte-based ETA when all entries have sizes;
2026-04-13 09:00:00 +00:00
LLM
b7f7d3d291 [+] rewrite download command: async, pydantic entry model, terminal-aware progress
1. download_entry_t pydantic model (frozen=True) replaces tuples;
  2. download_t class with async run(), _download_one(), _run_parallel(), _run_aria2c_batch();
  3. asyncio.Semaphore for -j concurrency, run_in_executor for blocking I/O;
  4. .part file pattern: download to dest.pkg.part, rename on success;
  5. curl -C - and aria2c --continue=true for resume support;
  6. curl/aria2c stdout/stderr redirected to devnull;
  7. --dry-run, --verify-checksum BooleanOptionalAction flags;
  8. --progress-mode plain|interactive using terminal.py renderer;
  9. progress_t with byte-based ETA (when --size= available) and pkg-rate fallback;
  10. parse --size=BYTES and --hash=sha256: from compiled requirements;
  11. update test_cli.py downloader tests for .part rename and **kwargs;
  12. update test_download_cli.py for pydantic model and new progress_t constructor;
2026-04-13 09:00:00 +00:00
LLM
b98173511e [+] add terminal.py adaptive renderer, rename tests.py to test_utils.py, bump pr34 v0.1.5.68
1. add commands_typed/terminal.py with field_t, priority_t, line_formatter_t, renderer_t;
  2. adaptive line formatting: fields sorted by priority, low-priority dropped on narrow terminal;
  3. render modes: plain (newline), interactive (\r overwrite), multiline (ANSI cursor);
  4. terminal_t.width() via os.get_terminal_size with fallback;
  5. rename tests.py to test_utils.py to avoid conflict with tests/ package;
  6. update commands_typed/cli.py import from tests to test_utils;
  7. add commands_typed/tests/test_terminal.py with 19 tests;
  8. add [tool.online-fxreader-pr34.tests] config to pyproject.common.toml;
  9. bump pr34 to v0.1.5.68;
2026-04-13 09:00:00 +00:00
LLM
687df29dfe [+] add ORM registry with migration support, migrate cache/db.py
1. add apps/orm/registry.py with orm_module_t base class and orm_registry_t singleton;
  2. singleton per db path, thread-safe, tracks registered ORM classes;
  3. orm_schema_versions table for per-module version tracking;
  4. classmethods table_prefix(), schema_version(), migrate() for schema management;
  5. registry.module(cls) returns typed ORM instance, cached per registry;
  6. migrate cache_db_t to extend orm_module_t, move schema into classmethod migrate();
  7. cache_db_t constructor accepts Path (legacy, uses registry) or Connection (from registry);
  8. orm_registry_t.register(cache_db_t) at module load time;
  9. add test_orm.py with 12 tests: singleton, migration, multi-module, incremental, failure;
2026-04-13 09:00:00 +00:00
LLM
1e1cd6c1c0 [+] remove old pre-refactor archlinux modules
1. delete archive.py, cache_db.py, cli.py, compile.py, db.py, pacman.py, resolver.py, solv_backend.py;
  2. all functionality moved to apps/, cli/, resolver/ subpackages;
2026-04-09 09:00:00 +00:00
LLM
7a03db3e97 [+] bump pr34 v0.1.5.67, archlinux v0.24, release wheels, update Makefile
1. bump online.fxreader.pr34 to v0.1.5.67;
  2. bump archlinux package to v0.24 with pr34>=0.1.5.67 as main dependency;
  3. move online.fxreader.pr34 from dev extras to main dependencies;
  4. add cli entry point as cli.main:main;
  5. add [tool.online-fxreader-pr34.tests] config with search_paths, test_names, discovery_paths;
  6. remove -c constraints from Makefile python_put_archlinux_venv;
  7. copy pr34 v0.1.5.67 wheel into archlinux deps/whl;
  8. release archlinux wheels v0.11 through v0.24;
2026-04-09 09:00:00 +00:00
LLM
15df281e61 [+] download command: progress display, parallel downloads, aria2c batch mode
1. add --progress BooleanOptionalAction flag with plain mode;
  2. progress_t tracks total/done/this_run packages and bytes, shows ETA and rate;
  3. rate displayed as pkg/s when fast, s/pkg when slow;
  4. add -j parameter for parallel downloads via ThreadPoolExecutor;
  5. for aria2c with -j>1, use download_batch_aria2c with single process and input file;
  6. skip already-downloaded files, estimate total bytes from average;
  7. add test_download_cli.py with full test matrix: backend(3) x jobs(2) x progress(2) x existing(3);
  8. mock downloader_t.download and download_batch_aria2c in all tests;
  9. add unit tests for progress_t formatting and batch aria2c input generation;
2026-04-09 09:00:00 +00:00
LLM
41f997fa68 [+] add diff command, json logging, pinned annotation, --log-level support
1. add cli/diff.py with parse_compiled, compute_diff, format_diff;
  2. diff shows added/removed packages, version changes;
  3. add --diff-url and --diff-checksum BooleanOptionalAction flags (off by default);
  4. move # pinned annotation to trailing comment on package spec line;
  5. update download and diff parsers to strip trailing # comments;
  6. add test_diff.py with parse, compute, format and end-to-end tests;
  7. add json_formatter_t and format_t enum to commands_typed/logging.py;
  8. add log_dir, log_name, max_bytes, backup_count, use_console params to setup();
  9. add --log-level DEBUG|INFO|WARNING|ERROR to archlinux cli/main.py;
  10. wire pr34_logging.setup with json formatter in main.py;
2026-04-09 09:00:00 +00:00
LLM
12c9ad8fe0 [+] refactor test runner into commands_typed/tests.py with pyproject.toml config
1. add commands_typed/tests.py with run_tests(), collect_tests(), filter_tests();
  2. support test_names as dotted prefixes or * glob patterns via fnmatch;
  3. add dry-run mode via collect subcommand in __main__ with argparse;
  4. add [tool.online-fxreader-pr34.tests] section: search_paths, test_names, discovery_paths;
  5. extend PyProject dataclass with Tests nested class in cli_bootstrap.py;
  6. parse tests config in pyproject_load via check_dict/check_list;
  7. add tests() method to commands_typed/cli.py base CLI class;
  8. simplify python/cli.py to delegate to self.tests(project_name, argv);
  9. auto-patch PYTHONPATH from search_paths before running tests;
  10. narrow unittest discover start_dir from common prefix of test_names;
2026-04-09 09:00:00 +00:00
LLM
bf3fd46953 [+] archlinux: restructure into apps/, cli/, resolver/, tests/ with 2-level packages dict
1. separate pacman-specific types (apps/pacman/types.py) from general types (models.py);
  2. split CLI into cli/main.py dispatcher with compile, archive, list_installed, download subcommands;
  3. move cache_db into apps/cache/db.py, pacman client/db into apps/pacman/;
  4. add pacman_manager_t (apps/pacman/manager.py) implementing manager_t ABC;
  5. move resolver into resolver/ with general.py (pure python) and solv.py (libsolv);
  6. add solv_types.py for solv-internal types, separate from general models;
  7. change package_index_t.packages to 2-level dict (name -> version -> pkg);
  8. add .add() and .iter_all() helpers to package_index_t and solv_index_t;
  9. fix solver: SELECTION_NAME only, SOLVER_SOLVABLE for exact name+version match;
  10. default expand_groups=False to prevent group bleed-through;
  11. add dedupe=True mode to cache_db.load_indices via SQL GROUP BY;
  12. fix provides hijack: vim==X no longer resolves to gvim;
  13. add comprehensive unit tests: test_cli, test_compile, test_db, test_models, test_pacman, test_resolver, test_solv_backend, test_integration;
  14. add test fixtures in tests/res/ with core/extra .db snapshots;
  15. add libsolv experiments in tests/experiments/libsolv/;
2026-04-09 09:00:00 +00:00
LLM
9ab5a03899 [+] add archlinux deps/whl with pr34 wheel, update gitignore/gitattributes
1. add meson/**/pyproject.toml to .gitignore;
  2. add !meson/**/deps/whl/** exception to .gitignore;
  3. add meson/**/deps/whl/** lfs tracking to .gitattributes;
  4. commit archlinux deps/whl/online_fxreader_pr34-0.1.5.66 via lfs;
2026-04-06 12:31:32 +00:00
LLM
14fb7cb0bf [+] archlinux package v0.10: dev extras, solv extra, module switch support
1. add dev extras with online.fxreader.pr34, toml-cli, ninja, patchelf;
  2. add modules section for module:switch support;
  3. move name/version/scripts into module definition;
  4. add pip_find_links for deps/whl with pr34 wheel;
  5. fix pyrefly excludes with full relative paths for tests/experiments;
  6. update ruff excludes for tests/res and experiments;
  7. update Makefile python_put_archlinux_venv with solv extra and constraints;
  8. add requirements.3.13.txt for version-specific pinning;
  9. update .venv-whl-cache with cp313 wheels;
  10. release archlinux v0.10 .whl;
2026-04-06 12:25:55 +00:00
LLM
38e846cff4 [+] improve cli_bootstrap: bootstrap args, overrides, whl cache python version
1. add argv_extract_t for targeted argument extraction from argv;
  2. add --bootstrap-help and --bootstrap-override cli args;
  3. apply_overrides_to_constraints patches constraint file per override;
  4. fix whl_cache_download to use target python_version, not host;
  5. fix whl cache check to verify python_tag matches target version;
  6. parse_whl_name_version now extracts python_tag from wheel filename;
  7. add parse_req_name for extracting package name from spec;
  8. use contextlib.ExitStack for temp file cleanup in compile;
2026-04-06 12:25:12 +00:00
LLM
c2bfca5550 [+] ruff line-length 100, add meson:install:list, bump pr34 v0.1.5.66
1. set ruff line-length to 100, reformat 18 files;
  2. move pr34 version to pyproject.common.toml, read via toml in meson.build;
  3. fix meson install_subdir to only include meson/toolchains, not entire meson/;
  4. add meson:install:list command with --mode meson|pyproject for dry-run;
  5. add .venv-whl-cache to .gitignore exceptions and .gitattributes lfs tracking;
  6. release pr34 v0.1.5.66 .whl;
  7. commit python/.venv-whl-cache and archlinux/.venv-whl-cache via lfs;
2026-04-06 09:56:11 +00:00
LLM
5e1a06a6b5 [+] merge gitea/master, regenerate requirements for py3.13
1. merge gitea/master into 25-llm-archlinux-package-manager;
  2. incorporate master deps: tomlq, pip==25.1, django, fastapi, uvicorn;
  3. add requirements.3.13.txt with version-specific mapping;
  4. remove generic requirements.txt, pyproject.toml from tracking;
  5. fix whl_cache_download to run once after compile, before install;
  6. update m.py to use pyproject.common.toml for bootstrap;
2026-04-06 09:32:19 +00:00
LLM
2c013d6be4 [+] fix pr34 build: exclude archlinux from ruff/pyrefly, import overload from typing
1. exclude archlinux namespace from pr34 ruff and pyrefly configs;
  2. import overload from typing (available since py3.5) instead of typing_extensions;
  3. add --no-annotate --no-header to uv pip compile;
  4. read version from pyproject.toml in archlinux meson.build;
  5. exclude archlinux from pr34 meson.build find;
2026-04-06 07:43:37 +00:00
LLM
46d951afab [+] release archlinux .whl v0.1 through v0.9
1. v0.1: initial package with cli, models, db, resolver;
  2. v0.2: add compile, download commands;
  3. v0.3: add solv_backend with libsolv integration;
  4. v0.4: add --generate-hashes, --reference, --resolution-strategy;
  5. v0.5: list-installed uses local /var/cache/pacman/pkg for hashes;
  6. v0.6: add cache_db.py, archive.py with sqlite cache;
  7. v0.7: fix resolver to use archive repos only, no @installed;
  8. v0.8: add --archive-cache for multi-date solver pool;
  9. v0.9: fix load_all_indices bulk loading, archive URL fallback;
2026-04-06 07:04:53 +00:00
LLM
4e7a15b9e8 [+] add build config for archlinux as separate meson package
1. add python/pyproject.common.toml with module definitions;
  2. add meson/online/.../archlinux/ with meson.build, m.py, pyproject.common.toml;
  3. meson.build uses fs.relative_to for python sources from ../../python/;
  4. m.py is cli_bootstrap.py copy with last 5 lines patched for paths;
  5. update Makefile with python_put_archlinux_venv rule;
  6. rename python/pyproject.toml to pyproject.toml.bak;
  7. update .gitignore, docker-compose.local.yml, requirements.txt;
2026-04-06 07:04:09 +00:00
LLM
49276b0e06 [+] register archlinux as separate project, update cli tooling
1. add archlinux project to cli.py _projects dict;
  2. add archive command delegation in archlinux cli.py;
  3. add --archive-cache flag to compile for multi-date sqlite pool;
  4. add deploy:wheel overwrite protection with --force-whl-overwrite;
  5. add pyrefly command to commands_typed/cli.py;
  6. fix pip.py compatibility with pinned pip version;
  7. fix toml.py merging for list[str] values;
2026-04-03 16:46:44 +00:00
LLM
77be19948d [+] improve cli_bootstrap.py with whl cache, venv_partial, packaging_t
1. add packaging_t: canonicalize_name, parse_whl_name_version, parse_req_spec;
  2. add whl_cache_download: download missing wheels into .venv-whl-cache;
  3. add check_host_prerequisites: verify pip and uv available on host;
  4. add BootstrapSettings: whl_cache_path, uv_cache_dir, whl_cache_update;
  5. add BootstrapSettings: uv_compile_allow_index, venv_partial;
  6. add check_type helper for typed attribute access;
  7. venv_partial recompiles with existing requirements.txt as constraints;
  8. compile output goes to temp file, moved on success only;
  9. guard typing_extensions import for bootstrap without venv;
2026-04-03 16:46:08 +00:00
LLM
b67a40936b [+] add sqlite cache and archive sync for archlinux package
1. add cache_db.py: sqlite3 ORM with pydantic row models, typed streaming;
  2. add archive.py: archive sync logic, list-dates, list-packages, show-versions cli;
  3. cache_db stores snapshots, packages, relations, local_packages, signatures;
  4. archive.py delegates cli subparser to archive.main(), keeps cli.py thin;
  5. sync downloads .db files per date, parses into sqlite, skips unchanged;
  6. supports date ranges with configurable step;
2026-04-03 16:45:34 +00:00
LLM
64845d732d [+] add archlinux package management module with libsolv backend
1. add models: package_desc_t, repo_index_t, vercmp_t, compile_options_t;
  2. add db.py: parse pacman .db tar archives into repo_index_t;
  3. add pacman.py: wrap pacman cli for listing installed, downloading .db;
  4. add resolver.py: pure python dependency resolver;
  5. add compile.py: fetch archive indices, resolve, output compiled reqs;
  6. add solv_backend.py: libsolv-based solver with repo_store_t, solv_pool_t;
  7. add cli.py: list-installed, compile, download subcommands;
  8. add mypy-stubs/types-solv for solv python bindings;
  9. add .gitattributes lfs tracking for test .db files;
2026-04-03 16:45:00 +00:00
98b906ac11 [+] make proper LFS pointer 2026-03-15 21:34:49 +03:00
325 changed files with 127895 additions and 11177 deletions

4
.gitattributes vendored

@ -1,5 +1,9 @@
releases/tar/** filter=lfs diff=lfs merge=lfs -text releases/tar/** filter=lfs diff=lfs merge=lfs -text
releases/whl/** filter=lfs diff=lfs merge=lfs -text releases/whl/** filter=lfs diff=lfs merge=lfs -text
python/online/fxreader/pr34/commands_typed/archlinux/tests/res/*.db filter=lfs diff=lfs merge=lfs -text
python/deps/whl/** filter=lfs diff=lfs merge=lfs -text python/deps/whl/** filter=lfs diff=lfs merge=lfs -text
docker/*/deps/whl/** filter=lfs diff=lfs merge=lfs -text docker/*/deps/whl/** filter=lfs diff=lfs merge=lfs -text
**/*.gpg filter=lfs diff=lfs merge=lfs -text **/*.gpg filter=lfs diff=lfs merge=lfs -text
python/.venv-whl-cache/** filter=lfs diff=lfs merge=lfs -text
meson/**/.venv-whl-cache/** filter=lfs diff=lfs merge=lfs -text
meson/**/deps/whl/** filter=lfs diff=lfs merge=lfs -text

5
.gitignore vendored

@ -14,6 +14,8 @@ d2/book1/books
!.vscode/launch.json !.vscode/launch.json
!python/deps/whl/**/*.whl !python/deps/whl/**/*.whl
python/build python/build
python/pyproject.toml
meson/**/pyproject.toml
.*.kate-swp .*.kate-swp
!releases/whl/*.whl !releases/whl/*.whl
.env .env
@ -22,3 +24,6 @@ python/build
!docker/*/deps/whl/** !docker/*/deps/whl/**
!dotfiles/.vim !dotfiles/.vim
!python/.venv-whl-cache/**
!meson/**/.venv-whl-cache/**
!meson/**/deps/whl/**

@ -60,6 +60,17 @@ python_put_pr34:
ln -sf $(INSTALL_ROOT)/env3/bin/oom_firefox $(INSTALL_ROOT)/oom_firefox ln -sf $(INSTALL_ROOT)/env3/bin/oom_firefox $(INSTALL_ROOT)/oom_firefox
ARCHLINUX_MESON_DIR ?= meson/online/fxreader/pr34/commands_typed/archlinux
python_put_archlinux_venv:
cd python && ./.venv/bin/python3 -m uv pip install \
--no-cache --no-index --reinstall \
-f ../releases/whl \
-f ./.venv-whl-cache \
-f ../$(ARCHLINUX_MESON_DIR)/.venv-whl-cache \
'online.fxreader.pr34.commands_typed.archlinux[solv]'
PYTHON_PROJECTS_NAMES ?= online.fxreader.pr34 PYTHON_PROJECTS_NAMES ?= online.fxreader.pr34
python_whl: python_whl:
for f in $(PYTHON_PROJECTS_NAMES); do \ for f in $(PYTHON_PROJECTS_NAMES); do \
@ -218,3 +229,29 @@ nginx_reload_common:
nginx_reload: nginx_reload:
make nginx_reload_common NGINX_SERVICE=ssl-app make nginx_reload_common NGINX_SERVICE=ssl-app
make nginx_reload_common NGINX_SERVICE=app make nginx_reload_common NGINX_SERVICE=app
LLM_COMPOSE ?= podman-compose -f docker-compose.local.yml
LLM_DOCKER ?= podman
llm-podman-pull:
$(LLM_COMPOSE) pull llm
llm-podman-create:
$(LLM_COMPOSE) up --no-start --force-recreate llm
llm-podman-up:
# $(LLM_COMPOSE) start
$(LLM_DOCKER) start claude_llm_1
llm-podman-down:
# $(LLM_COMPOSE) stop
$(LLM_DOCKER) stop claude_llm_1
llm-podman-run:
$(LLM_COMPOSE) exec -w /app llm /bin/bash
llm-podman-run-zsh:
$(LLM_COMPOSE) exec -u nartes -w /app llm /usr/bin/zsh
llm-podman-ps:
$(LLM_COMPOSE) ps

File diff suppressed because it is too large Load Diff

BIN
deps/greasyfork/dist/linkedin.user.js.map (Stored with Git LFS) vendored

File diff suppressed because one or more lines are too long

45
docker-compose.local.yml Normal file

@ -0,0 +1,45 @@
version: '3.7'
x-json-logging: &json-logging
logging:
driver: "json-file"
options:
max-size: 10m
max-file: "3"
x-resources-normal: &resources-normal
deploy:
resources:
limits:
cpus: '1'
memory: 2GB
x-resources-small: &resources-small
deploy:
resources:
limits:
cpus: '0.5'
memory: 1GB
x-resources-micro: &resources-micro
deploy:
resources:
limits:
cpus: '0.25'
memory: 128M
services:
llm:
<<: *resources-normal
# image: archlinux@sha256:19f09c502102d6d249f4e15667144cab1b8a195d9a549996774a665f582bea99
image: online.fxreader.pr34.claude.v1:v0.2
command: ['sh', '-c', 'while true; do sleep 1; done']
init: true
volumes:
- ./:/app:rw
- online.fxreader.pr34.claude.v1:/mnt/online.fxreader.pr34.claude
volumes:
online.fxreader.pr34.claude.v1:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,58 @@
project(
run_command(
'.venv/bin/toml', 'get', '--toml-path', 'pyproject.toml', 'project.name',
check: true
).stdout().strip('\n'),
version: run_command(
'.venv/bin/toml', 'get', '--toml-path', 'pyproject.toml', 'project.version',
check: true
).stdout().strip('\n'),
)
install_path = get_option('install_path')
message('install_path = ' + install_path)
modes = get_option('modes')
fs = import('fs')
assert(modes.length() == 1, 'only one mode allowed')
mode = modes[0]
# python sources live relative to this meson.build
python_source_root = meson.project_source_root() / '../../../../../../python'
project_root = '.'
if mode == 'meson'
endif
if mode == 'pyproject'
py = import('python').find_installation(pure: false)
namespace_path = meson.project_name().replace('.', '/')
install_root = py.get_install_dir(pure: true)
# find .py files only under the archlinux namespace
pkg_sources = run_command(
'find', python_source_root / namespace_path, '-iname', '*.py',
check: true
).stdout().strip().split('\n')
foreach src : pkg_sources
rel = fs.relative_to(src, python_source_root)
install_data(
src,
install_dir: install_root / fs.parent(rel),
install_tag: 'python-runtime',
)
endforeach
install_data(
python_source_root / namespace_path / 'py.typed',
install_dir: install_root / namespace_path,
install_tag: 'python-runtime',
)
endif

@ -0,0 +1,2 @@
option('modes', type: 'array', choices: ['meson', 'pyproject'], value: ['pyproject'])
option('install_path', type : 'string', value: '')

@ -0,0 +1,127 @@
[project]
description = 'Arch Linux package management tools'
requires-python = '>= 3.10'
maintainers = [
{ name = 'Siarhei Siniak', email = 'siarheisiniak@gmail.com' },
]
classifiers = [
'Programming Language :: Python',
]
dynamic = [
'version',
]
dependencies = [
'pydantic',
'pydantic-settings',
'online.fxreader.pr34>=0.1.5.69',
]
[project.optional-dependencies]
solv = [
'solv==0.7.35',
]
dev = [
'toml-cli',
'ninja',
'patchelf',
]
lint = [
'tomli',
'mypy',
'pyright',
'pyrefly',
'ruff',
]
[tool.online-fxreader-pr34]
early_features = ['default', 'solv', 'dev', 'lint']
pip_find_links = [
'deps/whl',
]
requirements = { default_dev_lint_solv_3_13 = 'requirements.3.13.txt' }
modules = [
{ name = 'online.fxreader.pr34.commands_typed.archlinux', scripts = { 'online-fxreader-pr34-archlinux' = 'online.fxreader.pr34.commands_typed.archlinux.cli.main:main' }, project = { version = '0.53', dynamic = [] } },
]
[tool.online-fxreader-pr34.tests]
search_paths = ['../../../../../../python']
test_names = [
'online.fxreader.pr34.commands_typed.archlinux.tests.test_models',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_resolver',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_cli',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_compile',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_db',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_pacman',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_diff',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_download_cli',
'*TestSolvPoolUnit*',
'*TestRepoStoreCache*',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_orm',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_cve',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_package_mapping',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_archive_versions',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_network',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_cache_settings',
'online.fxreader.pr34.commands_typed.archlinux.tests.test_install',
]
discovery_paths = ['../../../../../../python']
[build-system]
requires = ["meson-python", "pybind11"]
build-backend = "mesonpy"
[tool.ruff]
line-length = 160
target-version = 'py310'
include = [
'../../../../../../python/online/fxreader/pr34/commands_typed/archlinux/**/*.py',
]
exclude = [
'.venv',
'*/tests/res/*',
'*/tests/experiments/*',
]
[tool.ruff.format]
quote-style = 'single'
indent-style = 'tab'
skip-magic-trailing-comma = false
[tool.ruff.lint]
ignore = [
'E402', 'E722', 'E741', 'W191', 'E101', 'E501', 'I001', 'F401', 'E714',
'E713', 'E731', 'E712', 'E703', 'F841', 'F403', 'W292',
]
select = ['E', 'F', 'I', 'W', 'INT']
[tool.ruff.lint.isort]
detect-same-package = true
relative-imports-order = "closest-to-furthest"
split-on-trailing-comma = true
section-order = [
"future",
"standard-library", "third-party", "first-party", "local-folder"
]
force-wrap-aliases = true
[tool.pyrefly]
project-includes = [
'../../../../../../python/online/fxreader/pr34/commands_typed/archlinux/**/*.py',
]
project-excludes = [
'.venv',
'../../../../../../python/online/fxreader/pr34/commands_typed/archlinux/tests/res',
'../../../../../../python/online/fxreader/pr34/commands_typed/archlinux/tests/experiments',
]
search-path = [
'../../../../../../python',
'../../../../../../mypy-stubs/types-debugpy',
'../../../../../../mypy-stubs/types-solv',
'../../../../../../mypy-stubs/marisa-trie-types',
]
python-version = '3.13'

@ -0,0 +1,96 @@
annotated-doc==0.0.4 \
--hash=sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320
annotated-types==0.7.0 \
--hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53
argcomplete==3.6.3 \
--hash=sha256:f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce
build==1.4.0 \
--hash=sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596
click==8.3.2 \
--hash=sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d
jmespath==1.1.0 \
--hash=sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64
librt==0.8.1 \
--hash=sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363
marisa-trie==1.4.0 \
--hash=sha256:33cca20e60a78da01650d67ef97d60f3ec8a2b60d4dea2d65306fb418d17039d
markdown-it-py==4.0.0 \
--hash=sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147
mdurl==0.1.2 \
--hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8
meson==1.10.2 \
--hash=sha256:5f84ef186e6e788d9154db63620fc61b3ece69f643b94b43c8b9203c43d89b36
meson-python==0.19.0 \
--hash=sha256:67b5906c37404396d23c195e12c8825506074460d4a2e7083266b845d14f0298
mypy==1.20.0 \
--hash=sha256:555658c611099455b2da507582ea20d2043dfdfe7f5ad0add472b1c6238b433f
mypy-extensions==1.1.0 \
--hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505
ninja==1.13.0 \
--hash=sha256:fb46acf6b93b8dd0322adc3a4945452a4e774b75b91293bafcc7b7f8e6517dfa
nodeenv==1.10.0 \
--hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827
online-fxreader-pr34==0.1.5.69 \
--hash=sha256:eaf594af168f24460f98b16615abc20399ad44392ee7f54bc9b2b27e917baa6b
packaging==26.0 \
--hash=sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529
patchelf==0.17.2.4 \
--hash=sha256:d9b35ebfada70c02679ad036407d9724ffe1255122ba4ac5e4be5868618a5689
pathspec==1.0.4 \
--hash=sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723
pip==25.1 \
--hash=sha256:13b4aa0aaad055020a11bec8a1c2a70a2b2d080e12d89b962266029fff0a16ba
pybind11==3.0.3 \
--hash=sha256:fb5f8e4a64946b4dcc0451c83a8c384f803bc0a62dd1ba02f199e97dbc9aad4c
pydantic==2.12.5 \
--hash=sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d
pydantic-core==2.41.5 \
--hash=sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586
pydantic-settings==2.13.1 \
--hash=sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237
pygments==2.20.0 \
--hash=sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176
pyproject-hooks==1.2.0 \
--hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913
pyproject-metadata==0.11.0 \
--hash=sha256:85bbecca8694e2c00f63b492c96921d6c228454057c88e7c352b2077fcaa4096
pyrefly==0.59.1 \
--hash=sha256:59a2d01723b84d042f4fa6ec871ffd52d0a7e83b0ea791c2e0bb0ff750abce56
pyright==1.1.408 \
--hash=sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1
python-dotenv==1.2.2 \
--hash=sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a
pyyaml==6.0.3 \
--hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6
regex==2026.4.4 \
--hash=sha256:ffa81f81b80047ba89a3c69ae6a0f78d06f4a42ce5126b0eb2a0a10ad44e0b2e
rich==14.3.3 \
--hash=sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d
ruff==0.15.9 \
--hash=sha256:2b0c7c341f68adb01c488c3b7d4b49aa8ea97409eae6462d860a79cf55f431b6
setuptools==82.0.1 \
--hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb
shellingham==1.5.4 \
--hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686
solv==0.7.35 \
--hash=sha256:05aaa3abaf05482d22946cab81e328b536a59465cc47d628a72bc3d2e4dcafac
toml-cli==0.8.2 \
--hash=sha256:7af4679ca04c53ad0f6d300dab26f45a78fedf88e8310305bfe0a8ead37fd000
tomli==2.4.1 \
--hash=sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f
tomlkit==0.14.0 \
--hash=sha256:592064ed85b40fa213469f81ac584f67a4f2992509a7c3ea2d632208623a3680
tomlq==0.1.0 \
--hash=sha256:4b966fd999ed2bf69081b7c7f5caadbc4c9542d0ed5fcf2e9b7b4d8d7ada3c82
typer==0.24.1 \
--hash=sha256:112c1f0ce578bfb4cab9ffdabc68f031416ebcc216536611ba21f04e9aa84c9e
typing-extensions==4.15.0 \
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
typing-inspection==0.4.2 \
--hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7
uv==0.11.3 \
--hash=sha256:0fde893b5ab9f6997fe357138e794bac09d144328052519fbbe2e6f72145e457
xmltodict==1.0.4 \
--hash=sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a
yq==3.4.3 \
--hash=sha256:547e34bc3caacce83665fd3429bf7c85f8e8b6b9aaee3f953db1ad716ff3434d

@ -0,0 +1,145 @@
# This file was autogenerated by uv via the following command:
# uv --cache-dir /app/meson/online/fxreader/pr34/commands_typed/archlinux/.uv-cache pip compile --python-version 3.14 --generate-hashes -c /app/meson/online/fxreader/pr34/commands_typed/archlinux/requirements.txt -o /app/meson/online/fxreader/pr34/commands_typed/archlinux/requirementsa_w7bg1p.txt /tmp/requirements7q27fon2.in
annotated-types==0.7.0 \
--hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53
# via
# -c requirements.txt
# pydantic
build==1.4.0 \
--hash=sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
librt==0.8.1 \
--hash=sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3
# via
# -c requirements.txt
# mypy
meson==1.10.2 \
--hash=sha256:5f84ef186e6e788d9154db63620fc61b3ece69f643b94b43c8b9203c43d89b36
# via
# -c requirements.txt
# meson-python
meson-python==0.19.0 \
--hash=sha256:67b5906c37404396d23c195e12c8825506074460d4a2e7083266b845d14f0298
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
mypy==1.19.1 \
--hash=sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
mypy-extensions==1.1.0 \
--hash=sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505
# via
# -c requirements.txt
# mypy
nodeenv==1.10.0 \
--hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827
# via
# -c requirements.txt
# pyright
packaging==26.0 \
--hash=sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529
# via
# -c requirements.txt
# build
# meson-python
# pyproject-metadata
pathspec==1.0.4 \
--hash=sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723
# via
# -c requirements.txt
# mypy
pip==23.3.2 \
--hash=sha256:5052d7889c1f9d05224cd41741acb7c5d6fa735ab34e339624a614eaaa7e7d76
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
pybind11==3.0.2 \
--hash=sha256:f8a6500548919cc33bcd220d5f984688326f574fa97f1107f2f4fdb4c6fb019f
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
pydantic==2.12.5 \
--hash=sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
# pydantic-settings
pydantic-core==2.41.5 \
--hash=sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375
# via
# -c requirements.txt
# pydantic
pydantic-settings==2.13.1 \
--hash=sha256:d56fd801823dbeae7f0975e1f8c8e25c258eb75d278ea7abb5d9cebb01b56237
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
pyproject-hooks==1.2.0 \
--hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913
# via
# -c requirements.txt
# build
pyproject-metadata==0.11.0 \
--hash=sha256:85bbecca8694e2c00f63b492c96921d6c228454057c88e7c352b2077fcaa4096
# via
# -c requirements.txt
# meson-python
pyrefly==0.56.0 \
--hash=sha256:ec6ab3f9e2c03bae8dfa520f52778f47b6762020929a664177d36aa3b941db22
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
pyright==1.1.408 \
--hash=sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
python-dotenv==1.2.2 \
--hash=sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a
# via
# -c requirements.txt
# pydantic-settings
ruff==0.15.6 \
--hash=sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
setuptools==82.0.1 \
--hash=sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
solv==0.7.35 \
--hash=sha256:d5606cd8e4bb1b3f30bbff592632fbc47c0e4f79d42869eff1af78dca8e6fd47
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
tomli==2.4.0 \
--hash=sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in
typing-extensions==4.15.0 \
--hash=sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548
# via
# -c requirements.txt
# mypy
# pydantic
# pydantic-core
# pyright
# typing-inspection
typing-inspection==0.4.2 \
--hash=sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7
# via
# -c requirements.txt
# pydantic
# pydantic-settings
uv==0.10.10 \
--hash=sha256:e42e9e4a196ef75d1089715574eb1fe9bb62d390da05c6c8b36650a4de23d59f
# via
# -c requirements.txt
# -r /tmp/requirements7q27fon2.in

@ -0,0 +1,263 @@
from typing import Iterator, Sequence
REL_GT: int
REL_EQ: int
REL_LT: int
REL_AND: int
REL_OR: int
REL_WITH: int
REL_NAMESPACE: int
REL_ARCH: int
REL_FILECONFLICT: int
REL_COND: int
REL_COMPAT: int
REL_KIND: int
REL_MULTIARCH: int
REL_ELSE: int
REL_ERROR: int
REL_WITHOUT: int
REL_UNLESS: int
REL_CONDA: int
def xfopen(path: str, mode: str = ...) -> XFile: ...
def xfopen_fd(path: str, fd: int) -> XFile: ...
class XFile:
def close(self) -> None: ...
class Dep:
...
class Pool:
DISTTYPE_RPM: int
DISTTYPE_DEB: int
DISTTYPE_ARCH: int
DISTTYPE_HAIKU: int
DISTTYPE_CONDA: int
DISTTYPE_APK: int
installed: Repo | None
repos: list[Repo]
def setdisttype(self, disttype: int) -> None: ...
def setarch(self, arch: str) -> None: ...
def add_repo(self, name: str) -> Repo: ...
def createwhatprovides(self) -> None: ...
def str2id(self, s: str, create: bool = ...) -> int: ...
def rel2id(self, name: int, evr: int, flags: int, create: bool = ...) -> int: ...
def dep2str(self, dep: int) -> str: ...
def id2str(self, id: int) -> str: ...
def select(self, name: str, flags: int) -> Selection: ...
def Solver(self) -> Solver: ...
def Selection(self) -> Selection: ...
def Selection_all(self) -> Selection: ...
def Job(self, how: int, what: int) -> Job: ...
def Dep(self, s: str, create: bool = ...) -> Dep: ...
def isknownarch(self, id: int) -> bool: ...
def set_debuglevel(self, level: int) -> None: ...
def set_flag(self, flag: int, value: int) -> int: ...
def get_flag(self, flag: int) -> int: ...
def set_rootdir(self, rootdir: str) -> None: ...
def get_rootdir(self) -> str: ...
def repos_iter(self) -> Iterator[Repo]: ...
def solvables_iter(self) -> Iterator[Solvable]: ...
def id2repo(self, id: int) -> Repo | None: ...
def id2solvable(self, id: int) -> Solvable: ...
class Repo:
REPO_EXTEND_SOLVABLES: int
REPO_LOCALPOOL: int
REPO_NO_INTERNALIZE: int
REPO_NO_LOCATION: int
REPO_REUSE_REPODATA: int
REPO_USE_LOADING: int
REPO_USE_ROOTDIR: int
SOLV_ADD_NO_STUBS: int
name: str
nsolvables: int
id: int
pool: Pool
def add_solvable(self) -> Solvable: ...
def add_solv(self, f: XFile, flags: int = ...) -> bool: ...
def add_rpmmd(self, f: XFile, language: str | None, flags: int = ...) -> bool: ...
def add_repomdxml(self, f: XFile, flags: int = ...) -> bool: ...
def write(self, f: XFile) -> bool: ...
def write_first_repodata(self, f: XFile) -> bool: ...
def internalize(self) -> None: ...
def isempty(self) -> bool: ...
def empty(self) -> None: ...
def free(self, reuseids: bool = ...) -> None: ...
def solvables_iter(self) -> Iterator[Solvable]: ...
def Selection(self, flags: int = ...) -> Selection: ...
class Solvable:
name: str
evr: str
arch: str
nameid: int
evrid: int
archid: int
id: int
repo: Repo
pool: Pool
vendor: str
vendorid: int
def add_provides(self, dep: int) -> None: ...
def add_requires(self, dep: int) -> None: ...
def add_conflicts(self, dep: int) -> None: ...
def add_obsoletes(self, dep: int) -> None: ...
def add_recommends(self, dep: int) -> None: ...
def add_suggests(self, dep: int) -> None: ...
def add_supplements(self, dep: int) -> None: ...
def add_enhances(self, dep: int) -> None: ...
def add_deparray(self, keyname: int, dep: int, marker: int = ...) -> None: ...
def installable(self) -> bool: ...
def isinstalled(self) -> bool: ...
def identical(self, other: Solvable) -> bool: ...
def evrcmp(self, other: Solvable) -> int: ...
def matchesdep(self, keyname: int, dep: int, marker: int = ...) -> bool: ...
def lookup_str(self, keyname: int) -> str | None: ...
def lookup_num(self, keyname: int, notfound: int = ...) -> int: ...
def lookup_id(self, keyname: int) -> int: ...
def lookup_idarray(self, keyname: int, marker: int = ...) -> list[int]: ...
def lookup_deparray(self, keyname: int, marker: int = ...) -> list[Dep]: ...
def lookup_checksum(self, keyname: int) -> Chksum | None: ...
def lookup_location(self) -> tuple[str | None, int]: ...
def lookup_sourcepkg(self) -> str | None: ...
def lookup_void(self, keyname: int) -> bool: ...
def Selection(self, flags: int = ...) -> Selection: ...
def unset(self, keyname: int) -> None: ...
def __str__(self) -> str: ...
class Solver:
SOLVER_FLAG_ALLOW_DOWNGRADE: int
SOLVER_FLAG_ALLOW_ARCHCHANGE: int
SOLVER_FLAG_ALLOW_VENDORCHANGE: int
SOLVER_FLAG_ALLOW_UNINSTALL: int
SOLVER_FLAG_ALLOW_NAMECHANGE: int
SOLVER_FLAG_SPLITPROVIDES: int
SOLVER_FLAG_IGNORE_RECOMMENDED: int
SOLVER_FLAG_ADD_ALREADY_RECOMMENDED: int
SOLVER_FLAG_NO_INFARCHCHECK: int
SOLVER_FLAG_BEST_OBEY_POLICY: int
SOLVER_FLAG_NO_AUTOTARGET: int
SOLVER_FLAG_FOCUS_INSTALLED: int
SOLVER_FLAG_FOCUS_BEST: int
SOLVER_FLAG_INSTALL_ALSO_UPDATES: int
SOLVER_FLAG_STRICT_REPO_PRIORITY: int
def solve(self, jobs: Sequence[Job]) -> list[Problem]: ...
def transaction(self) -> Transaction: ...
def write_testcase(self, path: str) -> bool: ...
class Problem:
def __str__(self) -> str: ...
class Selection:
SELECTION_NAME: int
SELECTION_PROVIDES: int
SELECTION_FILELIST: int
SELECTION_CANON: int
SELECTION_DOTARCH: int
SELECTION_REL: int
SELECTION_INSTALLED_ONLY: int
SELECTION_GLOB: int
SELECTION_FLAT: int
SELECTION_NOCASE: int
SELECTION_SOURCE_ONLY: int
SELECTION_WITH_SOURCE: int
SELECTION_SKIP_KIND: int
SELECTION_MATCH_DEPSTR: int
SELECTION_WITH_DISABLED: int
SELECTION_WITH_BADARCH: int
SELECTION_WITH_ALL: int
SELECTION_ADD: int
SELECTION_SUBTRACT: int
SELECTION_FILTER: int
SELECTION_FILTER_KEEP_IFEMPTY: int
SELECTION_FILTER_SWAPPED: int
def isempty(self) -> bool: ...
def jobs(self, action: int) -> list[Job]: ...
def solvables(self) -> list[Solvable]: ...
def select(self, name: str, flags: int) -> None: ...
def add_raw(self, how: int, what: int) -> None: ...
class Job:
SOLVER_INSTALL: int
SOLVER_ERASE: int
SOLVER_UPDATE: int
SOLVER_WEAKENDEPS: int
SOLVER_MULTIVERSION: int
SOLVER_LOCK: int
SOLVER_DISTUPGRADE: int
SOLVER_VERIFY: int
SOLVER_DROP_ORPHANED: int
SOLVER_USERINSTALLED: int
SOLVER_ALLOWUNINSTALL: int
SOLVER_FAVOR: int
SOLVER_DISFAVOR: int
SOLVER_EXCLUDEFROMWEAK: int
SOLVER_SOLVABLE: int
SOLVER_SOLVABLE_NAME: int
SOLVER_SOLVABLE_PROVIDES: int
SOLVER_SOLVABLE_ONE_OF: int
SOLVER_SOLVABLE_REPO: int
SOLVER_SOLVABLE_ALL: int
SOLVER_SELECTMASK: int
SOLVER_JOBMASK: int
SOLVER_NOOP: int
SOLVER_WEAK: int
SOLVER_ESSENTIAL: int
SOLVER_CLEANDEPS: int
SOLVER_FORCEBEST: int
SOLVER_TARGETED: int
SOLVER_NOTBYUSER: int
SOLVER_SETEV: int
SOLVER_SETEVR: int
SOLVER_SETARCH: int
SOLVER_SETVENDOR: int
SOLVER_SETREPO: int
SOLVER_SETNAME: int
SOLVER_NOAUTOSET: int
SOLVER_SETMASK: int
def isemptyupdate(self) -> bool: ...
class Transaction:
pool: Pool
def isempty(self) -> bool: ...
def newsolvables(self) -> list[Solvable]: ...
def keptsolvables(self) -> list[Solvable]: ...
def newpackages(self) -> list[Solvable]: ...
def keptpackages(self) -> list[Solvable]: ...
def steps(self) -> list[Solvable]: ...
def steptype(self, solvable: Solvable, mode: int) -> int: ...
def othersolvable(self, solvable: Solvable) -> Solvable | None: ...
def allothersolvables(self, solvable: Solvable) -> list[Solvable]: ...
def calc_installsizechange(self) -> int: ...
def order(self, flags: int = ...) -> None: ...
def classify(self, mode: int = ...) -> list[TransactionClass]: ...
class TransactionClass:
...
class Chksum:
...

BIN
python/.venv-whl-cache/annotated_doc-0.0.4-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
python/.venv-whl-cache/anyio-4.10.0-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/argcomplete-3.6.2-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/asgiref-3.9.1-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/build-1.3.0-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/click-8.2.1-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/click-8.3.2-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
python/.venv-whl-cache/django-5.2.5-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/django_stubs-5.2.2-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

BIN
python/.venv-whl-cache/fastapi-0.116.1-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/h11-0.16.0-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

BIN
python/.venv-whl-cache/idna-3.10-py3-none-any.whl (Stored with Git LFS) Normal file

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More