ruff-sync 0.1.7.dev1__tar.gz → 0.1.7.dev2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. ruff_sync-0.1.7.dev2/.github/workflows/codspeed.yaml +37 -0
  2. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/PKG-INFO +3 -2
  3. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/README.md +1 -0
  4. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/gen_ref_pages.py +1 -1
  5. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/pyproject.toml +15 -3
  6. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/cli.py +1 -1
  7. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/config_io.py +1 -1
  8. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/core.py +7 -6
  9. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tasks.py +1 -1
  10. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/conftest.py +56 -3
  11. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_basic.py +18 -23
  12. ruff_sync-0.1.7.dev2/tests/test_benchmarks.py +338 -0
  13. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_check.py +43 -32
  14. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_config_validation.py +13 -8
  15. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_deprecation.py +6 -5
  16. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_e2e.py +13 -8
  17. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_formatters.py +2 -2
  18. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_git_fetch.py +1 -1
  19. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_scaffold.py +3 -3
  20. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_serialization.py +1 -1
  21. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_url_handling.py +7 -6
  22. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/uv.lock +355 -187
  23. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/DEPENDENCIES.md +0 -0
  24. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/TESTING.md +0 -0
  25. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/args_refactor_plan.md +0 -0
  26. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/cli_animation_plan.md +0 -0
  27. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/decisions/0001-type-refactoring-strategy.md +0 -0
  28. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/decisions/0002-tui-node-ast.md +0 -0
  29. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/decisions/0003-argument-resolution-layers.md +0 -0
  30. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/decisions/README.md +0 -0
  31. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/doc-fix.md +0 -0
  32. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/docs_update_plan.md +0 -0
  33. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/formatters-architecture.md +0 -0
  34. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/gitlab-reports.md +0 -0
  35. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/issue-102-context.md +0 -0
  36. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/plans/issue-100-roadmap-plan.md +0 -0
  37. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/plans/issue-116-config-validation.md +0 -0
  38. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/ruff.toml +0 -0
  39. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/adr/SKILL.md +0 -0
  40. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/dirty-equals/SKILL.md +0 -0
  41. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/dirty-equals/references/common-matchers.md +0 -0
  42. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/dirty-equals/references/toml-matching.md +0 -0
  43. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/dirty-equals/trigger_eval.json +0 -0
  44. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/gh-issues/SKILL.md +0 -0
  45. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mike/SKILL.md +0 -0
  46. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mike/references/commands.md +0 -0
  47. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/SKILL.md +0 -0
  48. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/examples.md +0 -0
  49. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/templates/api-reference.md +0 -0
  50. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/templates/getting-started.md +0 -0
  51. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/templates/index.md +0 -0
  52. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/mkdocs-generation/templates/mkdocs.yml +0 -0
  53. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/release-notes-generation/SKILL.md +0 -0
  54. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/ruff-sync-usage/SKILL.md +0 -0
  55. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/ruff-sync-usage/references/ci-integration.md +0 -0
  56. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/ruff-sync-usage/references/configuration.md +0 -0
  57. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/ruff-sync-usage/references/troubleshooting.md +0 -0
  58. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/SKILL.md +0 -0
  59. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/best-practices.md +0 -0
  60. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/evaluating-skills.md +0 -0
  61. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/optimizing-descriptions.md +0 -0
  62. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/quickstart.md +0 -0
  63. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/sources.md +0 -0
  64. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/references/using-scripts.md +0 -0
  65. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/skill-creator/scripts/scaffold_skill.py +0 -0
  66. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/SKILL.md +0 -0
  67. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/examples/basic_app.py +0 -0
  68. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/examples/reactive_example.py +0 -0
  69. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/references/events.md +0 -0
  70. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/references/styling.md +0 -0
  71. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/references/testing.md +0 -0
  72. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/textual/references/widgets.md +0 -0
  73. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/SKILL.md +0 -0
  74. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/evals.json +0 -0
  75. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/advanced-narrowing.md +0 -0
  76. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/error-code-lookup.md +0 -0
  77. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/generics.md +0 -0
  78. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/naming.md +0 -0
  79. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/protocol-patterns.md +0 -0
  80. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/quickstart.md +0 -0
  81. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/references/refactoring-patterns.md +0 -0
  82. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/type-checking/scripts/audit_types.py +0 -0
  83. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/skills/warnings-control/SKILL.md +0 -0
  84. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/tui_design.md +0 -0
  85. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/tui_requirements.md +0 -0
  86. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/tui_rule_browsing.md +0 -0
  87. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/tui_rule_browsing_design.md +0 -0
  88. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/workflows/add-test-case.md +0 -0
  89. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/workflows/update-recordings.md +0 -0
  90. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.agents/workflows/update-screenshots.md +0 -0
  91. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.git-blame-ignore-revs +0 -0
  92. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.github/dependabot.yml +0 -0
  93. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.github/workflows/ci.yaml +0 -0
  94. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.github/workflows/complexity.yaml +0 -0
  95. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.gitignore +0 -0
  96. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.pre-commit-config.yaml +0 -0
  97. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/.pre-commit-hooks.yaml +0 -0
  98. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/AGENTS.md +0 -0
  99. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/CONTRIBUTING.md +0 -0
  100. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/LICENSE.md +0 -0
  101. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/codecov.yml +0 -0
  102. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/configs/data-science-engineering/ruff.toml +0 -0
  103. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/configs/fastapi/ruff.toml +0 -0
  104. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/configs/kitchen-sink/ruff.toml +0 -0
  105. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/agent-skill.md +0 -0
  106. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/favicon.png +0 -0
  107. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/github-job-summary.png +0 -0
  108. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/github-pr-annotation.png +0 -0
  109. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/inspect-main.png +0 -0
  110. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/inspect-search.png +0 -0
  111. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/logo.png +0 -0
  112. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/check_drift.gif +0 -0
  113. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/check_in_sync.gif +0 -0
  114. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/help_overview.gif +0 -0
  115. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/init_project.gif +0 -0
  116. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/pull_basic.gif +0 -0
  117. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/recordings/validate_strict.gif +0 -0
  118. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/ruff_sync_banner.png +0 -0
  119. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/screenshots/dashboard.svg +0 -0
  120. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/screenshots/legend_help.svg +0 -0
  121. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/screenshots/rule_details.svg +0 -0
  122. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/screenshots/screenshot_sample.toml +0 -0
  123. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/assets/screenshots/search_omnibox.svg +0 -0
  124. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/best-practices.md +0 -0
  125. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/ci-integration.md +0 -0
  126. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/configuration.md +0 -0
  127. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/contributing.md +0 -0
  128. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/examples/advanced-config.toml +0 -0
  129. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/examples/basic-config.toml +0 -0
  130. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/index.md +0 -0
  131. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/inspect.md +0 -0
  132. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/installation.md +0 -0
  133. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/overrides/main.html +0 -0
  134. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/overrides/partials/version_warning.html +0 -0
  135. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/pre-commit.md +0 -0
  136. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/pre-defined-configs.md +0 -0
  137. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/troubleshooting.md +0 -0
  138. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/url-resolution.md +0 -0
  139. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/docs/usage.md +0 -0
  140. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/mkdocs.yml +0 -0
  141. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/scripts/check_dogfood.sh +0 -0
  142. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/scripts/generate_tui_screenshots.py +0 -0
  143. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/scripts/gitclone_dogfood.sh +0 -0
  144. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/scripts/pull_dogfood.sh +0 -0
  145. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/skills-lock.json +0 -0
  146. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/__init__.py +0 -0
  147. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/__main__.py +0 -0
  148. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/constants.py +0 -0
  149. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/dependencies.py +0 -0
  150. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/formatters.py +0 -0
  151. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/pre_commit.py +0 -0
  152. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/system.py +0 -0
  153. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/__init__.py +0 -0
  154. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/app.py +0 -0
  155. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/constants.py +0 -0
  156. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/screens.py +0 -0
  157. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/themes.py +0 -0
  158. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/types_.py +0 -0
  159. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/tui/widgets.py +0 -0
  160. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/types_.py +0 -0
  161. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/src/ruff_sync/validation.py +0 -0
  162. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/_common.tape +0 -0
  163. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/check_drift.tape +0 -0
  164. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/check_in_sync.tape +0 -0
  165. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/help_overview.tape +0 -0
  166. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/init_project.tape +0 -0
  167. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/pull_basic.tape +0 -0
  168. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tapes/validate_strict.tape +0 -0
  169. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/__init__.py +0 -0
  170. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/multi_upstream_final.toml +0 -0
  171. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/multi_upstream_initial.toml +0 -0
  172. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/multi_upstream_up1.toml +0 -0
  173. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/multi_upstream_up2.toml +0 -0
  174. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_changes_final.toml +0 -0
  175. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_changes_initial.toml +0 -0
  176. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_changes_upstream.toml +0 -0
  177. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_dotted_keys_final.toml +0 -0
  178. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_dotted_keys_initial.toml +0 -0
  179. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_dotted_keys_upstream.toml +0 -0
  180. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_ruff_cfg_final.toml +0 -0
  181. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_ruff_cfg_initial.toml +0 -0
  182. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/no_ruff_cfg_upstream.toml +0 -0
  183. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/readme_excludes_final.toml +0 -0
  184. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/readme_excludes_initial.toml +0 -0
  185. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/readme_excludes_upstream.toml +0 -0
  186. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/standard_final.toml +0 -0
  187. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/standard_initial.toml +0 -0
  188. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/lifecycle_tomls/standard_upstream.toml +0 -0
  189. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/ruff.toml +0 -0
  190. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_ci_integration.py +0 -0
  191. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_ci_validation.py +0 -0
  192. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_config_io.py +0 -0
  193. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_constants.py +0 -0
  194. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_corner_cases.py +0 -0
  195. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_dependencies.py +0 -0
  196. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_minimal_imports.sh +0 -0
  197. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_pre_commit.py +0 -0
  198. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_project.py +0 -0
  199. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_rule_logic.py +0 -0
  200. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_system.py +0 -0
  201. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_toml_operations.py +0 -0
  202. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/test_whitespace.py +0 -0
  203. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/tui/__init__.py +0 -0
  204. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/tui/conftest.py +0 -0
  205. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/tui/test_themes.py +0 -0
  206. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/tui/test_tui.py +0 -0
  207. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/tui/test_tui_types.py +0 -0
  208. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/w_ruff_sync_cfg/pyproject.toml +0 -0
  209. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/wo_ruff_cfg/pyproject.toml +0 -0
  210. {ruff_sync-0.1.7.dev1 → ruff_sync-0.1.7.dev2}/tests/wo_ruff_sync_cfg/pyproject.toml +0 -0
@@ -0,0 +1,37 @@
1
+ name: CodSpeed
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ pull_request:
8
+ # `workflow_dispatch` allows CodSpeed to trigger backtest
9
+ # performance analysis in order to generate initial data.
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: read
14
+ id-token: write
15
+
16
+ jobs:
17
+ benchmarks:
18
+ name: Run benchmarks
19
+ runs-on: ubuntu-latest
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v5
26
+
27
+ - name: Set up Python
28
+ run: uv python install 3.13
29
+
30
+ - name: Install dependencies
31
+ run: uv sync --group dev --frozen
32
+
33
+ - name: Run benchmarks
34
+ uses: CodSpeedHQ/action@v4
35
+ with:
36
+ mode: simulation
37
+ run: uv run pytest -m benchmark --codspeed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ruff-sync
3
- Version: 0.1.7.dev1
3
+ Version: 0.1.7.dev2
4
4
  Summary: Synchronize Ruff linter configuration across projects
5
5
  Project-URL: Homepage, https://github.com/Kilo59/ruff-sync
6
6
  Project-URL: Documentation, https://kilo59.github.io/ruff-sync/
@@ -24,7 +24,7 @@ Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Programming Language :: Python :: 3.14
25
25
  Classifier: Topic :: Software Development :: Quality Assurance
26
26
  Requires-Python: >=3.10
27
- Requires-Dist: httpx<1.0.0,>=0.27.0
27
+ Requires-Dist: httpx2>=2.3.0
28
28
  Requires-Dist: tomlkit<2.0.0,>=0.12.3
29
29
  Requires-Dist: typing-extensions>=4.5.0
30
30
  Provides-Extra: tui
@@ -42,6 +42,7 @@ Description-Content-Type: text/markdown
42
42
  <a href="https://results.pre-commit.ci/latest/github/Kilo59/ruff-sync/main"><img src="https://results.pre-commit.ci/badge/github/Kilo59/ruff-sync/main.svg" alt="pre-commit.ci status"></a>
43
43
  <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
44
44
  <a href="https://wily.readthedocs.io/"><img src="https://img.shields.io/badge/%F0%9F%A6%8A%20wily-passing-brightgreen.svg" alt="Wily"></a>
45
+ <a href="https://codspeed.io/Kilo59/ruff-sync?utm_source=badge"><img src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" alt="CodSpeed"/></a>
45
46
  </p>
46
47
 
47
48
  # ruff-sync
@@ -9,6 +9,7 @@
9
9
  <a href="https://results.pre-commit.ci/latest/github/Kilo59/ruff-sync/main"><img src="https://results.pre-commit.ci/badge/github/Kilo59/ruff-sync/main.svg" alt="pre-commit.ci status"></a>
10
10
  <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
11
11
  <a href="https://wily.readthedocs.io/"><img src="https://img.shields.io/badge/%F0%9F%A6%8A%20wily-passing-brightgreen.svg" alt="Wily"></a>
12
+ <a href="https://codspeed.io/Kilo59/ruff-sync?utm_source=badge"><img src="https://img.shields.io/endpoint?url=https://codspeed.io/badge.json" alt="CodSpeed"/></a>
12
13
  </p>
13
14
 
14
15
  # ruff-sync
@@ -7,7 +7,7 @@ import pathlib
7
7
  import mkdocs_gen_files
8
8
  from mkdocs_gen_files.nav import Nav
9
9
 
10
- nav = Nav() # type: ignore[no-untyped-call]
10
+ nav = Nav()
11
11
 
12
12
  for path in sorted(pathlib.Path("src").rglob("*.py")):
13
13
  module_path = path.relative_to("src").with_suffix("")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ruff-sync"
3
- version = "0.1.7.dev1"
3
+ version = "0.1.7.dev2"
4
4
  description = "Synchronize Ruff linter configuration across projects"
5
5
  keywords = ["ruff", "linter", "config", "synchronize", "python", "linting", "automation", "tomlkit", "pre-commit"]
6
6
  authors = [
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Software Development :: Quality Assurance",
25
25
  ]
26
26
  dependencies = [
27
- "httpx>=0.27.0,<1.0.0",
27
+ "httpx2>=2.3.0",
28
28
  "tomlkit>=0.12.3,<2.0.0",
29
29
  "typing-extensions>=4.5.0",
30
30
  ]
@@ -54,9 +54,10 @@ dev = [
54
54
  "pyfakefs>=5.4.1",
55
55
  "pytest>=8.0.0",
56
56
  "pytest-asyncio>=0.23.5",
57
+ "pytest-codspeed>=4.3.0",
57
58
  "pytest-icdiff>=0.9",
58
59
  "pytest-textual-snapshot>=1.0.0",
59
- "respx>=0.21.1",
60
+ "pytest-httpx2",
60
61
  "ruamel-yaml>=0.18.6",
61
62
  "ruff>=0.15.0",
62
63
  "textual>=8.2.2",
@@ -99,6 +100,10 @@ exclude = 'site/.*'
99
100
  module = "tests.*"
100
101
  disable_error_code = ['type-arg', 'no-untyped-def']
101
102
 
103
+ [[tool.mypy.overrides]]
104
+ module = "ruff_sync.core"
105
+ disable_error_code = ["union-attr", "unused-ignore"]
106
+
102
107
  [tool.ruff-sync]
103
108
  upstream = "https://github.com/Kilo59/ruff-sync/"
104
109
  to = "pyproject.toml"
@@ -231,6 +236,7 @@ docstring-code-line-length = "dynamic"
231
236
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
232
237
  "unittest.mock".msg = "Prefer dedicated libraries to mock at external dependencies, such as `httpx` or `pyfakefs`."
233
238
  "typing.cast".msg = "Please fix the underlying type issues instead of using typing.cast."
239
+ "httpx".msg = "Use httpx2 instead."
234
240
 
235
241
  [tool.ruff.lint.flake8-import-conventions]
236
242
  # Declare the banned `from` imports.
@@ -241,6 +247,7 @@ banned-from = ["pathlib", "datetime"]
241
247
  datetime = "dt"
242
248
  "pprint.pprint" = "pp"
243
249
  "pprint.pformat" = "pf"
250
+ httpx2 = "httpx"
244
251
 
245
252
  [tool.ruff.lint.isort]
246
253
  required-imports = ["from __future__ import annotations"]
@@ -249,4 +256,9 @@ required-imports = ["from __future__ import annotations"]
249
256
  include = ["src/ruff_sync/*.py"]
250
257
 
251
258
  [tool.pytest]
259
+ addopts = ["-p pytest_httpx2"]
252
260
  log_level = "INFO"
261
+ markers = [
262
+ "benchmark: marks performance benchmarks (run separately for CodSpeed)",
263
+ "httpx2: configure the httpx2_mock fixture",
264
+ ]
@@ -24,7 +24,7 @@ from typing import (
24
24
  )
25
25
 
26
26
  import tomlkit
27
- from httpx import URL
27
+ from httpx2 import URL
28
28
  from typing_extensions import deprecated, override
29
29
 
30
30
  from ruff_sync.constants import (
@@ -13,7 +13,7 @@ from tomlkit.items import Table
13
13
  from typing_extensions import override
14
14
 
15
15
  if TYPE_CHECKING:
16
- from httpx import URL
16
+ from httpx2 import URL
17
17
 
18
18
 
19
19
  @enum.unique
@@ -22,9 +22,9 @@ from typing import (
22
22
  overload,
23
23
  )
24
24
 
25
- import httpx
25
+ import httpx2 as httpx
26
26
  import tomlkit
27
- from httpx import URL
27
+ from httpx2 import URL
28
28
  from tomlkit import TOMLDocument, table
29
29
  from tomlkit.items import Item, Table
30
30
  from tomlkit.toml_file import TOMLFile
@@ -330,12 +330,13 @@ def _get_discovery_candidates(base: pathlib.Path) -> list[pathlib.Path]: ...
330
330
  def _get_discovery_candidates(base: URL | pathlib.Path) -> list[URL] | list[pathlib.Path]:
331
331
  """Return a list of candidate configuration files, prioritizing the requested one."""
332
332
  # If it's a URL, use PurePosixPath. If it's a Path, use it directly.
333
- name = base.path if isinstance(base, URL) else base.name
333
+ is_url = not isinstance(base, pathlib.Path)
334
+ name = base.path if is_url else base.name
334
335
  if pathlib.PurePosixPath(name).name != RuffConfigFileName.PYPROJECT_TOML:
335
336
  return [base] # type: ignore[return-value]
336
337
 
337
338
  # Try pyproject.toml first, then fall back to ruff.toml variants.
338
- if isinstance(base, URL):
339
+ if is_url:
339
340
  base_url = base.join(".")
340
341
  return [base] + [
341
342
  base_url.join(str(f))
@@ -935,7 +936,7 @@ async def check(
935
936
  Examples:
936
937
  >>> import asyncio
937
938
  >>> from ruff_sync.cli import Arguments
938
- >>> from httpx import URL
939
+ >>> from httpx2 import URL
939
940
  >>> import pathlib
940
941
  >>> args = Arguments(
941
942
  ... command="check",
@@ -1122,7 +1123,7 @@ async def pull(
1122
1123
  Examples:
1123
1124
  >>> import asyncio
1124
1125
  >>> from ruff_sync.cli import Arguments
1125
- >>> from httpx import URL
1126
+ >>> from httpx2 import URL
1126
1127
  >>> import pathlib
1127
1128
  >>> args = Arguments(
1128
1129
  ... command="pull",
@@ -14,7 +14,7 @@ import os
14
14
  import pathlib
15
15
  from typing import TYPE_CHECKING, Final, Literal
16
16
 
17
- import httpx
17
+ import httpx2 as httpx
18
18
  from invoke.exceptions import Exit
19
19
  from invoke.tasks import task
20
20
  from packaging.version import Version
@@ -3,11 +3,24 @@ from __future__ import annotations
3
3
  import logging
4
4
  import os
5
5
  import sys
6
- from typing import Literal, Protocol, runtime_checkable
6
+ from typing import TYPE_CHECKING, Literal, Protocol, runtime_checkable
7
+
8
+ if TYPE_CHECKING:
9
+ from collections.abc import Generator
10
+
11
+ import contextlib
7
12
 
8
13
  import pytest
14
+ import respx
15
+ import truststore
16
+ from respx.router import DEFAULT as RESPX_DEFAULT
17
+ from respx.router import MockRouter
9
18
  from typing_extensions import override
10
19
 
20
+ with contextlib.suppress(Exception):
21
+ truststore.SSLContext()
22
+
23
+
11
24
  import ruff_sync
12
25
 
13
26
  LOGGER = logging.getLogger(__name__)
@@ -38,7 +51,7 @@ class TestStreamHandler(logging.Handler):
38
51
 
39
52
 
40
53
  @pytest.fixture
41
- def configure_logging():
54
+ def configure_logging() -> Generator[logging.Logger, None, None]:
42
55
  """Configure ruff_sync logger for tests to ensure capsys can capture log output."""
43
56
  logger = logging.getLogger("ruff_sync")
44
57
  old_handlers = logger.handlers[:]
@@ -62,7 +75,7 @@ def configure_logging():
62
75
 
63
76
 
64
77
  @pytest.fixture
65
- def clear_ruff_sync_caches():
78
+ def clear_ruff_sync_caches() -> None:
66
79
  """Clear all lru_caches in ruff_sync."""
67
80
  ruff_sync.get_config.cache_clear()
68
81
  ruff_sync.Arguments.fields.cache_clear()
@@ -137,3 +150,43 @@ def cli_run(
137
150
  return exit_code, captured.out, captured.err
138
151
 
139
152
  return _run
153
+
154
+
155
+ class HTTPX2MockRouter(MockRouter):
156
+ @override
157
+ def __call__(
158
+ self,
159
+ func=None,
160
+ *,
161
+ assert_all_called=None,
162
+ assert_all_mocked=None,
163
+ base_url=None,
164
+ using=RESPX_DEFAULT,
165
+ ):
166
+ """Override __call__ to set using='httpcore2' by default for nested mocks."""
167
+ if using is RESPX_DEFAULT:
168
+ using = "httpcore2"
169
+ return super().__call__(
170
+ func=func,
171
+ assert_all_called=assert_all_called,
172
+ assert_all_mocked=assert_all_mocked,
173
+ base_url=base_url,
174
+ using=using,
175
+ )
176
+
177
+
178
+ @pytest.fixture
179
+ def httpx2_mock(request: pytest.FixtureRequest) -> Generator[respx.Router, None, None]:
180
+ options = {}
181
+ if (marker := request.node.get_closest_marker("httpx2")) is not None:
182
+ options.update(marker.kwargs)
183
+ options.setdefault("using", "httpcore2")
184
+ router = HTTPX2MockRouter(**options)
185
+ with router:
186
+ yield router
187
+
188
+
189
+ @pytest.fixture
190
+ def respx_mock(httpx2_mock):
191
+ """Fixture that maps respx_mock to httpx2_mock for httpx2 compatibility."""
192
+ return httpx2_mock
@@ -11,12 +11,13 @@ import sys
11
11
  from pprint import pformat as pf
12
12
  from typing import TYPE_CHECKING, Any, Final, NamedTuple, cast
13
13
 
14
- import httpx
14
+ import httpx as original_httpx
15
+ import httpx2 as httpx
15
16
  import pytest
16
17
  import respx
17
18
  import tomlkit
18
19
  from dirty_equals import IsPartialDict
19
- from httpx import URL
20
+ from httpx2 import URL
20
21
  from pytest import param
21
22
  from tomlkit import TOMLDocument, document
22
23
  from tomlkit.items import Table
@@ -279,14 +280,14 @@ def test_merge_ruff_toml(source: str, toml_s: str, sep_str: str):
279
280
 
280
281
 
281
282
  @pytest.fixture
282
- def mock_http(toml_s: str) -> Generator[respx.MockRouter, None, None]:
283
- with respx.mock(base_url="https://example.com/") as respx_mock:
284
- respx_mock.get("/pyproject.toml").respond(
283
+ def mock_http(toml_s: str, respx_mock: respx.MockRouter) -> Generator[respx.MockRouter, None, None]:
284
+ with respx_mock(base_url="https://example.com/") as mock:
285
+ mock.get("/pyproject.toml").respond(
285
286
  200,
286
287
  content_type="text/plain",
287
288
  content=toml_s,
288
289
  )
289
- yield respx_mock
290
+ yield mock
290
291
 
291
292
 
292
293
  @pytest.fixture
@@ -596,7 +597,7 @@ def test_verbosity_log_level(
596
597
 
597
598
 
598
599
  @pytest.mark.asyncio
599
- async def test_sync_default_exclude(fs: FakeFilesystem):
600
+ async def test_sync_default_exclude(fs: FakeFilesystem, respx_mock: respx.MockRouter):
600
601
  """Integration style test for default exclude functionality."""
601
602
  source_toml = """[tool.ruff]
602
603
  target-version = "py310"
@@ -609,8 +610,8 @@ target-version = "py311"
609
610
  ff = fs.create_file("pyproject.toml", contents=source_toml)
610
611
  ff_path = pathlib.Path(ff.path) # type: ignore[arg-type]
611
612
 
612
- with respx.mock(base_url="https://example.com/") as respx_mock:
613
- respx_mock.get("/pyproject.toml").respond(
613
+ with respx_mock(base_url="https://example.com/") as mock:
614
+ mock.get("/pyproject.toml").respond(
614
615
  200,
615
616
  content_type="text/plain",
616
617
  content=upstream_toml,
@@ -684,12 +685,8 @@ async def test_merge_multiple_upstreams_preserves_order(respx_mock: respx.Router
684
685
  )
685
686
 
686
687
  # Mock HTTP responses using respx
687
- respx_mock.get("http://one.toml").return_value = httpx.Response(
688
- 200, text="[tool.ruff]\nline-length = 80"
689
- )
690
- respx_mock.get("http://two.toml").return_value = httpx.Response(
691
- 200, text="[tool.ruff]\nline-length = 100"
692
- )
688
+ respx_mock.get("http://one.toml").respond(200, text="[tool.ruff]\nline-length = 80")
689
+ respx_mock.get("http://two.toml").respond(200, text="[tool.ruff]\nline-length = 100")
693
690
 
694
691
  async with httpx.AsyncClient() as client:
695
692
  result_doc = await _merge_multiple_upstreams(target_doc, False, args.resolve(), client)
@@ -708,17 +705,17 @@ async def test_fetch_upstreams_concurrently_verified(respx_mock: respx.Router):
708
705
  """Verify that fetch_upstreams_concurrently actually runs tasks in parallel."""
709
706
  events = []
710
707
 
711
- async def side_effect_one(request: httpx.Request) -> httpx.Response:
708
+ async def side_effect_one(request: original_httpx.Request) -> original_httpx.Response:
712
709
  events.append("start_one")
713
710
  await asyncio.sleep(0.05)
714
711
  events.append("end_one")
715
- return httpx.Response(200, text="[tool.ruff]\n")
712
+ return original_httpx.Response(200, text="[tool.ruff]\n")
716
713
 
717
- async def side_effect_two(request: httpx.Request) -> httpx.Response:
714
+ async def side_effect_two(request: original_httpx.Request) -> original_httpx.Response:
718
715
  events.append("start_two")
719
716
  await asyncio.sleep(0.05)
720
717
  events.append("end_two")
721
- return httpx.Response(200, text="[tool.ruff]\n")
718
+ return original_httpx.Response(200, text="[tool.ruff]\n")
722
719
 
723
720
  respx_mock.get("http://one.toml").mock(side_effect=side_effect_one)
724
721
  respx_mock.get("http://two.toml").mock(side_effect=side_effect_two)
@@ -771,10 +768,8 @@ async def test_merge_multiple_upstreams_handles_errors(respx_mock: respx.Router)
771
768
  )
772
769
 
773
770
  # Mock HTTP responses using respx
774
- respx_mock.get("http://ok.toml").return_value = httpx.Response(
775
- 200, text="[tool.ruff]\nline-length = 80"
776
- )
777
- respx_mock.get("http://fail.toml").return_value = httpx.Response(404)
771
+ respx_mock.get("http://ok.toml").respond(200, text="[tool.ruff]\nline-length = 80")
772
+ respx_mock.get("http://fail.toml").respond(404)
778
773
 
779
774
  async with httpx.AsyncClient() as client:
780
775
  with pytest.raises(UpstreamError) as excinfo: