stage-cli 1.1.1__tar.gz → 1.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {stage_cli-1.1.1 → stage_cli-1.1.2}/CHANGELOG.md +14 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/PKG-INFO +4 -4
- {stage_cli-1.1.1 → stage_cli-1.1.2}/README.md +3 -3
- {stage_cli-1.1.1 → stage_cli-1.1.2}/SECURITY.md +1 -1
- {stage_cli-1.1.1 → stage_cli-1.1.2}/assets/ci-flow.svg +1 -1
- stage_cli-1.1.2/src/stage/__init__.py +1 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/http/client.py +32 -3
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_http_client.py +43 -1
- {stage_cli-1.1.1 → stage_cli-1.1.2}/uv.lock +24 -24
- stage_cli-1.1.1/src/stage/__init__.py +0 -1
- {stage_cli-1.1.1 → stage_cli-1.1.2}/.gitattributes +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/.gitignore +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/.python-version +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/LICENSE +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/assets/cli.png +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/assets/tui.png +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/pyproject.toml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/__main__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/banner.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/bootstrap/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/bootstrap/openjobs.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/classify/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/classify/eligibility.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/classify/internship.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/classify/role.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/classify/scope.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/app.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/discovery.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/insight.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/pipeline.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/postings.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/commands/schedule.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/housekeeping.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/logfile.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/notify.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/options.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/render.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/runlock.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/schedule.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/schedule_state.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/selection.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/cli/serialize.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/companies.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/a.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/b.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/c.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/d.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/e.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/f.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/g.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/h.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/i.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/j.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/k.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/l.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/m.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/n.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/o.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/other.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/p.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/q.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/r.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/s.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/t.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/u.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/v.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/w.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/x.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/y.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/companies/z.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/fonts/DejaVuSans.LICENSE.txt +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/fonts/DejaVuSans.ttf +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/company_tokens.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/eligibility.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/inclusive_suffixes.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/internship.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/language.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/locations.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/roles.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/terms.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/lexicon/workday_facets.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/data/seed_companies.yaml +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/dedup/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/dedup/identity.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/dedup/resolve.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/company.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/coverage.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/custom_board.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/discovery.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/enums.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/events.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/filters.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/health.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/ids.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/job.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/matching.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/priority.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/quarantine.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/rate_state.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/retention.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/rotation.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/signals.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/sync_run.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/text.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/validator.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/visits.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/domain/workday.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/http/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/http/breaker.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/http/cache.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/http/profiles.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/lexicon.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/normalize/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/normalize/language.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/normalize/location.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/normalize/terms.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/normalize/urls.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/paths.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/py.typed +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/canary.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/coverage.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/discover.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/export.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/health.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/maintenance.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/quarantine.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/query.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/services/sync.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/_text.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/ashby.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/bamboohr.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/base.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/breezy.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/collage.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/community_feeds.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/curated_markdown.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/custom_json.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/espresso.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/feed.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/greenhouse.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/jobbank.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/jobvite.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/lever.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/oracle_cloud.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/platforms.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/quebec_emploi.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/recruitee.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/simplify.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/smartrecruiters.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/speedyapply.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/themuse.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/workable.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/workday.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/sources/zshah.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/migrations/0001_initial.sql +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/migrations/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/repository.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/search.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/sqlite_repo.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/storage/writer.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/app.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/help.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/safe.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/boards.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/postings.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/review.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/splash.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/stats.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/screens/sync.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/state.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/theme.tcss +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/src/stage/tui/widgets/__init__.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/conftest.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/bilingual_titles.json +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/blackrock_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/croesus_career.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/disney_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/ea_searchjobs.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/espresso_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/gildan_openpositions.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/greenhouse_jobs.json +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/jobbank_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/jobvite_agscareer.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/jobvite_resolver.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/l3harris_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/lightspeed_openings.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/loblaw_jobs.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/nbc_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/parsons_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/publicissapient_sitemap.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/rentec_careers.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/sega_vacancies.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/sfrmk_search.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/shopify_internships.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/fixtures/twosigma_openroles.html +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/golden/classification.json +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_adapter_salvage.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_adopt_unregistered.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_board_identity.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_board_rest.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_canary.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_canary_events.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_classify.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_cli_help.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_cli_options.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_collage_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_companies_registry.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_company_fold_key.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_coverage.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_curated_markdown.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_custom_json.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_custom_json_buckets.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_custom_json_formats.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_custom_json_pagination.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_dedup.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_degree_and_disciplines.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_detail_queue.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_discover.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_eligibility.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_export.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_feed_adapters.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_feeds.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_fetch_authority.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_fold_inclusive.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_golden.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_greenhouse_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_health.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_housekeeping.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_html_boards.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_html_text.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_http_akamai.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_http_conditional.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_http_resilience.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_integrity_repair.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_jobvite_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_language.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_layering.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_lever_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_lexicon.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_location.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_malformed_input.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_migrations.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_new_adapters.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_notify.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_openjobs_crossref.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_oracle_cloud_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_paths.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_permissions.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_platform_shapes.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_profiles.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_quarantine.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_quarantine_relabel.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_quebec_emploi.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_rate_state.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_recall_limits.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_recheck.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_registry_shards.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_render.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_request_log.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_rescreen.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_review_contradictions.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_rotation.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_run_budget.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_schedule.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_schedule_state.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_schema_baseline.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_search.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_serialize.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_show.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_signals_persist.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_smartrecruiters_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_speedyapply.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_startup_budget.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_sync_e2e.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_sync_shape.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_sync_step2.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_terms.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_tombstones.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_tui.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_unregistered_quarantine.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_untrusted_display.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_update_badges.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_verify_registry.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_workday_adapter.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_workday_urls.py +0 -0
- {stage_cli-1.1.1 → stage_cli-1.1.2}/tests/test_writer.py +0 -0
|
@@ -4,6 +4,19 @@ All notable changes to this project are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
|
|
5
5
|
follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [1.1.2] - 2026-09-09
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Job Bank has returned nothing since 31 August. Its server drops the connection
|
|
12
|
+
on any client offering TLS 1.3, so no request ever reached the board. That one
|
|
13
|
+
host is capped at TLS 1.2 now. Certificates are still checked and every other
|
|
14
|
+
board still gets TLS 1.3.
|
|
15
|
+
- A connection that died before the server answered was logged as `ConnectError:`
|
|
16
|
+
with nothing after the colon, which is why Job Bank looked fine for eight days.
|
|
17
|
+
The cause is carried through now:
|
|
18
|
+
`ConnectError: ConnectionResetError: [Errno 54] Connection reset by peer`.
|
|
19
|
+
|
|
7
20
|
## [1.1.1] - 2026-09-07
|
|
8
21
|
|
|
9
22
|
### Fixed
|
|
@@ -94,6 +107,7 @@ them in a SQLite database on your own machine.
|
|
|
94
107
|
|
|
95
108
|
Python 3.12, 3.13 or 3.14 on macOS, Linux or Windows.
|
|
96
109
|
|
|
110
|
+
[1.1.2]: https://github.com/NicholasXydis/Stage/releases/tag/v1.1.2
|
|
97
111
|
[1.1.1]: https://github.com/NicholasXydis/Stage/releases/tag/v1.1.1
|
|
98
112
|
[1.1.0]: https://github.com/NicholasXydis/Stage/releases/tag/v1.1.0
|
|
99
113
|
[1.0.0]: https://github.com/NicholasXydis/Stage/releases/tag/v1.0.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: stage-cli
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.2
|
|
4
4
|
Summary: Aggregates CS internship postings (Canada/US, EN + FR) into a local SQLite database
|
|
5
5
|
Project-URL: Homepage, https://github.com/NicholasXydis/Stage
|
|
6
6
|
Project-URL: Repository, https://github.com/NicholasXydis/Stage
|
|
@@ -59,7 +59,7 @@ Free and open source. No account, no server, no telemetry.
|
|
|
59
59
|
|
|
60
60
|

|
|
61
61
|
|
|
62
|
-
  [](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
|
|
63
63
|
|
|
64
64
|
<br>
|
|
65
65
|
|
|
@@ -272,7 +272,7 @@ Stage/
|
|
|
272
272
|
│ ├─ http/ rate posture, circuit breaker, validator cache
|
|
273
273
|
│ ├─ storage/ SQLite repository, migrations, FTS
|
|
274
274
|
│ └─ data/ packaged registry (a directory) and lexicons
|
|
275
|
-
├─ tests/ 2,
|
|
275
|
+
├─ tests/ 2,414 tests, 89% branch coverage
|
|
276
276
|
└─ .github/workflows/ CI, CodeQL, scheduled canary, release
|
|
277
277
|
```
|
|
278
278
|
|
|
@@ -318,7 +318,7 @@ Stage/
|
|
|
318
318
|
|
|
319
319
|
| Workflow | File | Purpose |
|
|
320
320
|
| --- | --- | --- |
|
|
321
|
-
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,
|
|
321
|
+
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,414 tests, coverage floor, badge drift |
|
|
322
322
|
| Supported Pythons | `.github/workflows/ci.yml` | The full suite again on 3.13 and 3.14 |
|
|
323
323
|
| Wheel | `.github/workflows/ci.yml` | Builds and smoke-tests the wheel on Ubuntu, Windows and macOS |
|
|
324
324
|
| CodeQL | `.github/workflows/codeql.yml` | Static analysis for Python and the workflows themselves |
|
|
@@ -20,7 +20,7 @@ Free and open source. No account, no server, no telemetry.
|
|
|
20
20
|
|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
  [](https://github.com/NicholasXydis/Stage/actions/workflows/ci.yml)
|
|
24
24
|
|
|
25
25
|
<br>
|
|
26
26
|
|
|
@@ -233,7 +233,7 @@ Stage/
|
|
|
233
233
|
│ ├─ http/ rate posture, circuit breaker, validator cache
|
|
234
234
|
│ ├─ storage/ SQLite repository, migrations, FTS
|
|
235
235
|
│ └─ data/ packaged registry (a directory) and lexicons
|
|
236
|
-
├─ tests/ 2,
|
|
236
|
+
├─ tests/ 2,414 tests, 89% branch coverage
|
|
237
237
|
└─ .github/workflows/ CI, CodeQL, scheduled canary, release
|
|
238
238
|
```
|
|
239
239
|
|
|
@@ -279,7 +279,7 @@ Stage/
|
|
|
279
279
|
|
|
280
280
|
| Workflow | File | Purpose |
|
|
281
281
|
| --- | --- | --- |
|
|
282
|
-
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,
|
|
282
|
+
| CI | `.github/workflows/ci.yml` | Ruff, format, mypy strict, 2,414 tests, coverage floor, badge drift |
|
|
283
283
|
| Supported Pythons | `.github/workflows/ci.yml` | The full suite again on 3.13 and 3.14 |
|
|
284
284
|
| Wheel | `.github/workflows/ci.yml` | Builds and smoke-tests the wheel on Ubuntu, Windows and macOS |
|
|
285
285
|
| CodeQL | `.github/workflows/codeql.yml` | Static analysis for Python and the workflows themselves |
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
<rect x="240" y="42" width="180" height="58" rx="12" fill="#111C30" stroke="#3B82F6" stroke-width="2"/>
|
|
24
24
|
<text x="330" y="66" fill="#F0F6FC" font-size="14">ruff, format, mypy</text>
|
|
25
|
-
<text x="330" y="86" fill="#F0F6FC" font-size="14">2,
|
|
25
|
+
<text x="330" y="86" fill="#F0F6FC" font-size="14">2,414 tests, 89%</text>
|
|
26
26
|
|
|
27
27
|
<path d="M420 71H470" stroke="#3B82F6" stroke-width="3" marker-end="url(#arrow)"/>
|
|
28
28
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.1.2"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import json
|
|
3
3
|
import random
|
|
4
|
+
import ssl
|
|
4
5
|
import time
|
|
5
6
|
from collections.abc import Mapping
|
|
6
7
|
from dataclasses import dataclass, field
|
|
@@ -38,6 +39,7 @@ RETRYABLE_STATUSES = frozenset({429, 500, 502, 503, 504})
|
|
|
38
39
|
BLOCKING_STATUSES = frozenset({401, 403})
|
|
39
40
|
BLOCKED_COOLDOWN_S = 1800.0
|
|
40
41
|
DENIED_HOSTS_BEFORE_BLOCK = 2
|
|
42
|
+
TLS12_ONLY_HOSTS = frozenset({"www.jobbank.gc.ca"})
|
|
41
43
|
MAX_REDIRECTS = 3
|
|
42
44
|
ORIGIN_BOUND_HEADERS = frozenset(
|
|
43
45
|
{"authorization", "cookie", "origin", "referer", "proxy-authorization", "x-csrf-token"}
|
|
@@ -229,6 +231,25 @@ class HostBudget:
|
|
|
229
231
|
return state
|
|
230
232
|
|
|
231
233
|
|
|
234
|
+
def _tls12_context() -> ssl.SSLContext:
|
|
235
|
+
context = httpx.create_ssl_context()
|
|
236
|
+
context.maximum_version = ssl.TLSVersion.TLSv1_2
|
|
237
|
+
return context
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _describe(exc: BaseException) -> str:
|
|
241
|
+
detail = str(exc)
|
|
242
|
+
seen = {id(exc)}
|
|
243
|
+
cause = exc.__cause__ or exc.__context__
|
|
244
|
+
while not detail and cause is not None and id(cause) not in seen:
|
|
245
|
+
detail = str(cause)
|
|
246
|
+
seen.add(id(cause))
|
|
247
|
+
if detail:
|
|
248
|
+
return f"{type(exc).__name__}: {type(cause).__name__}: {detail}"
|
|
249
|
+
cause = cause.__cause__ or cause.__context__
|
|
250
|
+
return f"{type(exc).__name__}: {detail}"
|
|
251
|
+
|
|
252
|
+
|
|
232
253
|
def _origin_of(url: httpx.URL) -> tuple[str, str, int | None]:
|
|
233
254
|
return (url.scheme, (url.host or "").lower(), url.port)
|
|
234
255
|
|
|
@@ -269,11 +290,19 @@ class HttpClient:
|
|
|
269
290
|
for bucket, state in self._rate_state.items()
|
|
270
291
|
if state.is_blocked(self._now)
|
|
271
292
|
}
|
|
293
|
+
mounts: dict[str, httpx.AsyncBaseTransport] | None = None
|
|
294
|
+
if transport is None:
|
|
295
|
+
capped = self._allowed_hosts & TLS12_ONLY_HOSTS
|
|
296
|
+
mounts = {
|
|
297
|
+
f"https://{host}": httpx.AsyncHTTPTransport(verify=_tls12_context())
|
|
298
|
+
for host in sorted(capped)
|
|
299
|
+
} or None
|
|
272
300
|
self._client = httpx.AsyncClient(
|
|
273
301
|
timeout=timeout or DEFAULT_TIMEOUT,
|
|
274
302
|
headers={"User-Agent": USER_AGENT, "Accept": "application/json"},
|
|
275
303
|
follow_redirects=False,
|
|
276
304
|
transport=transport,
|
|
305
|
+
mounts=mounts or {},
|
|
277
306
|
)
|
|
278
307
|
|
|
279
308
|
async def __aenter__(self) -> Self:
|
|
@@ -556,7 +585,7 @@ class HttpClient:
|
|
|
556
585
|
status=None,
|
|
557
586
|
elapsed_ms=(time.perf_counter() - started) * 1000,
|
|
558
587
|
attempt=attempt,
|
|
559
|
-
error=
|
|
588
|
+
error=_describe(exc),
|
|
560
589
|
)
|
|
561
590
|
)
|
|
562
591
|
raise
|
|
@@ -564,7 +593,7 @@ class HttpClient:
|
|
|
564
593
|
elapsed = (time.perf_counter() - started) * 1000
|
|
565
594
|
budget.metrics.failures += 1
|
|
566
595
|
budget.breaker.record_failure()
|
|
567
|
-
budget.last_error =
|
|
596
|
+
budget.last_error = _describe(exc)
|
|
568
597
|
self._log.append(
|
|
569
598
|
RequestRecord(
|
|
570
599
|
method=method,
|
|
@@ -572,7 +601,7 @@ class HttpClient:
|
|
|
572
601
|
status=None,
|
|
573
602
|
elapsed_ms=elapsed,
|
|
574
603
|
attempt=attempt,
|
|
575
|
-
error=
|
|
604
|
+
error=_describe(exc),
|
|
576
605
|
)
|
|
577
606
|
)
|
|
578
607
|
raise
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import asyncio
|
|
2
|
+
import ssl
|
|
2
3
|
import time
|
|
3
4
|
from collections.abc import AsyncIterator
|
|
4
5
|
|
|
@@ -7,7 +8,7 @@ import pytest
|
|
|
7
8
|
import respx
|
|
8
9
|
|
|
9
10
|
from stage.http import HostBudgetExceededError, HttpClient, RatePosture
|
|
10
|
-
from stage.http.client import USER_AGENT
|
|
11
|
+
from stage.http.client import USER_AGENT, _describe, _tls12_context
|
|
11
12
|
|
|
12
13
|
ENDPOINT = "https://boards-api.greenhouse.io/v1/boards/acme/jobs"
|
|
13
14
|
|
|
@@ -328,3 +329,44 @@ async def test_a_plain_http_url_is_refused_before_it_is_sent() -> None:
|
|
|
328
329
|
) as client:
|
|
329
330
|
with pytest.raises(RedirectNotAllowedError):
|
|
330
331
|
await client.get_json("http://one.example.test/jobs")
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def test_a_tls12_only_host_gets_a_capped_transport() -> None:
|
|
335
|
+
client = HttpClient(allowed_hosts=frozenset({"www.jobbank.gc.ca"}))
|
|
336
|
+
mounted = client._client._mounts
|
|
337
|
+
assert any(key.pattern.endswith("www.jobbank.gc.ca") for key in mounted)
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def test_an_ordinary_host_keeps_the_default_transport() -> None:
|
|
341
|
+
client = HttpClient(allowed_hosts=frozenset({"boards-api.greenhouse.io"}))
|
|
342
|
+
assert not client._client._mounts
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def test_the_capped_context_still_verifies_certificates() -> None:
|
|
346
|
+
context = _tls12_context()
|
|
347
|
+
assert context.maximum_version is ssl.TLSVersion.TLSv1_2
|
|
348
|
+
assert context.verify_mode is ssl.CERT_REQUIRED
|
|
349
|
+
assert context.check_hostname
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def test_an_injected_transport_is_never_overridden() -> None:
|
|
353
|
+
transport = httpx.MockTransport(lambda _: httpx.Response(200))
|
|
354
|
+
client = HttpClient(allowed_hosts=frozenset({"www.jobbank.gc.ca"}), transport=transport)
|
|
355
|
+
assert not client._client._mounts
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def test_an_empty_error_reports_its_underlying_cause() -> None:
|
|
359
|
+
try:
|
|
360
|
+
try:
|
|
361
|
+
raise ConnectionResetError(54, "Connection reset by peer")
|
|
362
|
+
except OSError as inner:
|
|
363
|
+
raise httpx.ConnectError("") from inner
|
|
364
|
+
except httpx.ConnectError as exc:
|
|
365
|
+
described = _describe(exc)
|
|
366
|
+
assert described == "ConnectError: ConnectionResetError: [Errno 54] Connection reset by peer"
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def test_an_error_that_speaks_for_itself_is_unchanged() -> None:
|
|
370
|
+
assert _describe(httpx.ConnectError("all attempts failed")) == (
|
|
371
|
+
"ConnectError: all attempts failed"
|
|
372
|
+
)
|
|
@@ -531,11 +531,11 @@ wheels = [
|
|
|
531
531
|
|
|
532
532
|
[[package]]
|
|
533
533
|
name = "platformdirs"
|
|
534
|
-
version = "4.11.
|
|
534
|
+
version = "4.11.7"
|
|
535
535
|
source = { registry = "https://pypi.org/simple" }
|
|
536
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
536
|
+
sdist = { url = "https://files.pythonhosted.org/packages/69/b7/802a56eca9f2fac455b8bab5375a2647b0f0e14a2cd63ef077de3c4a7658/platformdirs-4.11.7.tar.gz", hash = "sha256:4f41487eeeeeb07f3a6625e61d9bc0ae6809f92d3386dbd74392fbb76108104d", size = 35127, upload-time = "2026-09-01T13:35:10.502Z" }
|
|
537
537
|
wheels = [
|
|
538
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
538
|
+
{ url = "https://files.pythonhosted.org/packages/27/6e/80993e10a0482f630cef528635789233224f36b1ffd11592aa15d13ff9ce/platformdirs-4.11.7-py3-none-any.whl", hash = "sha256:8a02cb259042c79d1cd0450facc2fe6dc9d303ae7901afbe33bf8ea0b188cef6", size = 23938, upload-time = "2026-09-01T13:35:09.02Z" },
|
|
539
539
|
]
|
|
540
540
|
|
|
541
541
|
[[package]]
|
|
@@ -775,27 +775,27 @@ wheels = [
|
|
|
775
775
|
|
|
776
776
|
[[package]]
|
|
777
777
|
name = "ruff"
|
|
778
|
-
version = "0.16.
|
|
779
|
-
source = { registry = "https://pypi.org/simple" }
|
|
780
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
781
|
-
wheels = [
|
|
782
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
783
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
784
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
785
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
786
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
787
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
788
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
789
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
790
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
791
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
792
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
793
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
794
|
-
{ url = "https://files.pythonhosted.org/packages/39/
|
|
795
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
796
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
797
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
798
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
778
|
+
version = "0.16.6"
|
|
779
|
+
source = { registry = "https://pypi.org/simple" }
|
|
780
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a4/7c/6adb35d70e7c027e308274557901c7e00fb3407750faf3620c184ae058cb/ruff-0.16.6.tar.gz", hash = "sha256:dcf8a73d2ff77e99dde91244b4da16feba7f14e6beeb4015dee7c5a909e99050", size = 4921251, upload-time = "2026-09-03T16:57:29.037Z" }
|
|
781
|
+
wheels = [
|
|
782
|
+
{ url = "https://files.pythonhosted.org/packages/a4/28/9cc1b79639e284ec103f43c88c644db4eb58cbd0ea1ca11f1193435369ac/ruff-0.16.6-py3-none-linux_armv6l.whl", hash = "sha256:61c368c26bf8e973e5ab14a2772de587bc068ea3f9a277f673380749b4898fb8", size = 10015638, upload-time = "2026-09-03T16:56:40.986Z" },
|
|
783
|
+
{ url = "https://files.pythonhosted.org/packages/71/11/627d342ef727ea7794edf74fe23d60a074b02c3acc2e9436684e782286ca/ruff-0.16.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ecf4f068e2e123e43a26e9db4e19524cc56563912404e83bbfca375757e45a32", size = 10220762, upload-time = "2026-09-03T16:56:44.681Z" },
|
|
784
|
+
{ url = "https://files.pythonhosted.org/packages/43/d9/b75668ce41e4c8d073d18d6d08672ba6906ce45d5c06ea4fdb2e84ce3853/ruff-0.16.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:99b62ea33baf130f50368798d841f0d95527b6d817bf31817b65dd058f1d314c", size = 9835082, upload-time = "2026-09-03T16:56:47.142Z" },
|
|
785
|
+
{ url = "https://files.pythonhosted.org/packages/99/97/123ab10b05cde889c107c20f5a9774955104b5552796a2a8584b089ae8eb/ruff-0.16.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fbf89013f2bb3f6835a6038ff658dc8a1b38c98dc8e724b964168ad4e881876", size = 9949304, upload-time = "2026-09-03T16:56:49.813Z" },
|
|
786
|
+
{ url = "https://files.pythonhosted.org/packages/3e/58/a4a2c59dd2e5b85929c912d9cac3056eb9ee8c7e75e9b9fe3e109174966b/ruff-0.16.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56a67065e22efa6bc4d498299d3bb06c0c90aace8fac2068b5a12f9dc4d8d51d", size = 9840612, upload-time = "2026-09-03T16:56:52.368Z" },
|
|
787
|
+
{ url = "https://files.pythonhosted.org/packages/61/6a/ff8c8626a786c4f49d48ced4a752dadbca65f5263005f9c2416578194694/ruff-0.16.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e25cc89174874b176a157e4428d66761c2c0c006654419bf384f967f361ff1b1", size = 10543465, upload-time = "2026-09-03T16:56:55.089Z" },
|
|
788
|
+
{ url = "https://files.pythonhosted.org/packages/ad/bb/c47535923365f337b82e28192e4e9eef2176511007cfd99a62fc22df5dad/ruff-0.16.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700580ed5303723cb3c11c2f1d2a8913ce77b7ea86646dddb887f5417a9ba70", size = 11267576, upload-time = "2026-09-03T16:56:57.791Z" },
|
|
789
|
+
{ url = "https://files.pythonhosted.org/packages/ba/50/e5119a5212b5cd63b51e1f4b25e7bd636a6668fc069a3160b108ad7e3c16/ruff-0.16.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15f1d0b6e165a6e56567befb6629f8209271311d990bae0f37e6d065035ef5f3", size = 10781993, upload-time = "2026-09-03T16:57:00.666Z" },
|
|
790
|
+
{ url = "https://files.pythonhosted.org/packages/8b/98/083d8b4ef3c51a0d19db84367791cbe9f44e4b53343d19dfa83556e1cd9a/ruff-0.16.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72c591a96986ee4268860e2b7235082129ca5e4cb9cbba653a4b57c11893757", size = 10317748, upload-time = "2026-09-03T16:57:03.428Z" },
|
|
791
|
+
{ url = "https://files.pythonhosted.org/packages/9a/29/68f7ff2c5ad95f19f00627ac2de95644e25fe47371ea60b2db1fd952315e/ruff-0.16.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:65a006baa18f33324325814c864daef03541d51564b98c517610ea756ab7003e", size = 10540096, upload-time = "2026-09-03T16:57:06.182Z" },
|
|
792
|
+
{ url = "https://files.pythonhosted.org/packages/c4/f9/79a8f6de85968641d68a7863aeec577551924ef066a990a48ff93167beab/ruff-0.16.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:cd02a7bf1a21a8735228a3e8c95a9dc5cf86bd2a52194f4aaae2a5755b4de0f4", size = 10100494, upload-time = "2026-09-03T16:57:09.194Z" },
|
|
793
|
+
{ url = "https://files.pythonhosted.org/packages/d9/e8/b81a22d9b90c00b892ccf2fa2ac36fa95de4c13ab85aea3e73795cfe4651/ruff-0.16.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:31b36f1e5ad85e0737f09d2be4e512e2e283583c14015da3b9dc07359ac0fc88", size = 9843663, upload-time = "2026-09-03T16:57:12.168Z" },
|
|
794
|
+
{ url = "https://files.pythonhosted.org/packages/39/aa/54f516ec5e5a11c4afdceb1c454ebb054ffb96e4f4a1705580b4346abd35/ruff-0.16.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:61029b4ab4aa723fd3064fab96b1d814492596bf0c792679fffcbde1e1679953", size = 10282461, upload-time = "2026-09-03T16:57:15.077Z" },
|
|
795
|
+
{ url = "https://files.pythonhosted.org/packages/52/0b/38d0aa8aa32372b96dc44f97b22e576c4147808271aab7b2cb1e353d4445/ruff-0.16.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9ac8998457832c2061709d900856b7ad271dace0cb41f346588d540162bfa718", size = 10728808, upload-time = "2026-09-03T16:57:17.797Z" },
|
|
796
|
+
{ url = "https://files.pythonhosted.org/packages/5e/e5/9e274e24eeb027640ffc7442f21239f16d17f47acec15ae34f32e03a5c79/ruff-0.16.6-py3-none-win32.whl", hash = "sha256:0b87d9d16fcb63e8018423ca1d50b7260f15cb2da33e30db4baad4183a948c25", size = 10049212, upload-time = "2026-09-03T16:57:20.55Z" },
|
|
797
|
+
{ url = "https://files.pythonhosted.org/packages/22/31/72472449414223ed1a2da236b992adbb1a2ae59e34794574810f60ce068e/ruff-0.16.6-py3-none-win_amd64.whl", hash = "sha256:10d21c51c3495d8eaea7b703a16592117ea6eb1d649e36335aa965ff1173eb39", size = 10556402, upload-time = "2026-09-03T16:57:23.501Z" },
|
|
798
|
+
{ url = "https://files.pythonhosted.org/packages/fc/07/d781f8f8e1ac24bef9f3269cf62ffb1407ca24c3a8f12e5e22874f90528c/ruff-0.16.6-py3-none-win_arm64.whl", hash = "sha256:7a976c79b958f94e50a022a19f0f8c87387448020935ec14fc74331bd0a7f2c5", size = 10412850, upload-time = "2026-09-03T16:57:26.416Z" },
|
|
799
799
|
]
|
|
800
800
|
|
|
801
801
|
[[package]]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.1.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|