mdfetch 0.9.0__tar.gz → 0.9.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.
Files changed (267) hide show
  1. mdfetch-0.9.2/.github/scripts/generate_resources.py +59 -0
  2. {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/publish.yml +21 -1
  3. {mdfetch-0.9.0 → mdfetch-0.9.2}/PKG-INFO +1 -1
  4. {mdfetch-0.9.0 → mdfetch-0.9.2}/pyproject.toml +1 -1
  5. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/fallback.py +8 -2
  6. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_fallback.py +4 -4
  7. {mdfetch-0.9.0 → mdfetch-0.9.2}/uv.lock +1 -1
  8. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-analyze/SKILL.md +0 -0
  9. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-checklist/SKILL.md +0 -0
  10. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-clarify/SKILL.md +0 -0
  11. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-constitution/SKILL.md +0 -0
  12. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-converge/SKILL.md +0 -0
  13. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-implement/SKILL.md +0 -0
  14. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-plan/SKILL.md +0 -0
  15. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-specify/SKILL.md +0 -0
  16. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-tasks/SKILL.md +0 -0
  17. {mdfetch-0.9.0 → mdfetch-0.9.2}/.agents/skills/speckit-taskstoissues/SKILL.md +0 -0
  18. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  19. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-archive-run/SKILL.md +0 -0
  20. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  21. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  22. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  23. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-converge/SKILL.md +0 -0
  24. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  25. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  26. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  27. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  28. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  29. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-implement/SKILL.md +0 -0
  30. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-plan/SKILL.md +0 -0
  31. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-reconcile-run/SKILL.md +0 -0
  32. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-specify/SKILL.md +0 -0
  33. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  34. {mdfetch-0.9.0 → mdfetch-0.9.2}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  35. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.analyze.toml +0 -0
  36. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.checklist.toml +0 -0
  37. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.clarify.toml +0 -0
  38. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.constitution.toml +0 -0
  39. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.implement.toml +0 -0
  40. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.plan.toml +0 -0
  41. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.specify.toml +0 -0
  42. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.tasks.toml +0 -0
  43. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gemini/commands/speckit.taskstoissues.toml +0 -0
  44. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gitattributes +0 -0
  45. {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/copilot-instructions.md +0 -0
  46. {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/ci.yml +0 -0
  47. {mdfetch-0.9.0 → mdfetch-0.9.2}/.github/workflows/integration.yml +0 -0
  48. {mdfetch-0.9.0 → mdfetch-0.9.2}/.gitignore +0 -0
  49. {mdfetch-0.9.0 → mdfetch-0.9.2}/.python-version +0 -0
  50. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/.registry +0 -0
  51. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/LICENSE +0 -0
  52. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/README.md +0 -0
  53. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/commands/archive.md +0 -0
  54. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/archive/extension.yml +0 -0
  55. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/README.md +0 -0
  56. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  57. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  58. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  59. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  60. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  61. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/config-template.yml +0 -0
  62. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/extension.yml +0 -0
  63. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/git-config.yml +0 -0
  64. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  65. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  66. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  67. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  68. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  69. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  70. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  71. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  72. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/LICENSE +0 -0
  73. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/README.md +0 -0
  74. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/commands/reconcile.md +0 -0
  75. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions/reconcile/extension.yml +0 -0
  76. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/extensions.yml +0 -0
  77. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/feature.json +0 -0
  78. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/init-options.json +0 -0
  79. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integration.json +0 -0
  80. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/agy.manifest.json +0 -0
  81. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/claude.manifest.json +0 -0
  82. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/gemini.manifest.json +0 -0
  83. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/integrations/speckit.manifest.json +0 -0
  84. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/changelog.md +0 -0
  85. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/constitution.md +0 -0
  86. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/plan.md +0 -0
  87. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/memory/spec.md +0 -0
  88. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  89. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/common.sh +0 -0
  90. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
  91. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/setup-plan.sh +0 -0
  92. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/scripts/bash/setup-tasks.sh +0 -0
  93. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/checklist-template.md +0 -0
  94. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/constitution-template.md +0 -0
  95. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/plan-template.md +0 -0
  96. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/spec-template.md +0 -0
  97. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/templates/tasks-template.md +0 -0
  98. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/workflows/speckit/workflow.yml +0 -0
  99. {mdfetch-0.9.0 → mdfetch-0.9.2}/.specify/workflows/workflow-registry.json +0 -0
  100. {mdfetch-0.9.0 → mdfetch-0.9.2}/.vscode/settings.json +0 -0
  101. {mdfetch-0.9.0 → mdfetch-0.9.2}/CLAUDE.md +0 -0
  102. {mdfetch-0.9.0 → mdfetch-0.9.2}/GEMINI.md +0 -0
  103. {mdfetch-0.9.0 → mdfetch-0.9.2}/LICENSE +0 -0
  104. {mdfetch-0.9.0 → mdfetch-0.9.2}/Makefile +0 -0
  105. {mdfetch-0.9.0 → mdfetch-0.9.2}/README.md +0 -0
  106. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/checklists/requirements.md +0 -0
  107. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/contracts/api.md +0 -0
  108. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/data-model.md +0 -0
  109. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/plan.md +0 -0
  110. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/quickstart.md +0 -0
  111. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/research.md +0 -0
  112. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/spec.md +0 -0
  113. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/001-mdfetch-medium-extractor/tasks.md +0 -0
  114. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/checklists/requirements.md +0 -0
  115. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/contracts/public-api.md +0 -0
  116. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/data-model.md +0 -0
  117. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/plan.md +0 -0
  118. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/quickstart.md +0 -0
  119. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/research.md +0 -0
  120. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/spec.md +0 -0
  121. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/002-devto-provider/tasks.md +0 -0
  122. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/checklists/requirements.md +0 -0
  123. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/contracts/extract-api.md +0 -0
  124. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/plan.md +0 -0
  125. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/research.md +0 -0
  126. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/spec.md +0 -0
  127. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/003-medium-freedium-fallback/tasks.md +0 -0
  128. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/checklists/requirements.md +0 -0
  129. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/plan.md +0 -0
  130. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/research.md +0 -0
  131. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/spec.md +0 -0
  132. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/004-remove-backoff/tasks.md +0 -0
  133. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/checklists/requirements.md +0 -0
  134. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/contracts/extractor-api.md +0 -0
  135. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/data-model.md +0 -0
  136. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/plan.md +0 -0
  137. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/quickstart.md +0 -0
  138. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/research.md +0 -0
  139. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/spec.md +0 -0
  140. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/005-substack-provider/tasks.md +0 -0
  141. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/checklists/requirements.md +0 -0
  142. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/contracts/public-api.md +0 -0
  143. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/data-model.md +0 -0
  144. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/plan.md +0 -0
  145. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/quickstart.md +0 -0
  146. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/research.md +0 -0
  147. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/spec.md +0 -0
  148. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/006-thenewstack-provider/tasks.md +0 -0
  149. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/checklists/requirements.md +0 -0
  150. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/contracts/public-api.md +0 -0
  151. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/data-model.md +0 -0
  152. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/plan.md +0 -0
  153. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/quickstart.md +0 -0
  154. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/research.md +0 -0
  155. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/spec.md +0 -0
  156. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/007-dzone-provider/tasks.md +0 -0
  157. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/checklists/requirements.md +0 -0
  158. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/contracts/cli.md +0 -0
  159. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/data-model.md +0 -0
  160. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/plan.md +0 -0
  161. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/quickstart.md +0 -0
  162. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/research.md +0 -0
  163. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/spec.md +0 -0
  164. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/008-mdfetch-cli/tasks.md +0 -0
  165. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/checklists/requirements.md +0 -0
  166. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/contracts/formula.md +0 -0
  167. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/contracts/tap-update-job.md +0 -0
  168. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/data-model.md +0 -0
  169. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/plan.md +0 -0
  170. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/quickstart.md +0 -0
  171. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/research.md +0 -0
  172. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/spec.md +0 -0
  173. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/009-homebrew-tap-formula/tasks.md +0 -0
  174. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/checklists/requirements.md +0 -0
  175. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/contracts/extractor-contract.md +0 -0
  176. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/data-model.md +0 -0
  177. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/plan.md +0 -0
  178. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/quickstart.md +0 -0
  179. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/research.md +0 -0
  180. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/spec.md +0 -0
  181. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/010-boomi-blog-provider/tasks.md +0 -0
  182. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/checklists/requirements.md +0 -0
  183. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/contracts/extractor-contract.md +0 -0
  184. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/data-model.md +0 -0
  185. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/plan.md +0 -0
  186. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/quickstart.md +0 -0
  187. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/research.md +0 -0
  188. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/spec.md +0 -0
  189. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/011-konghq-blog-provider/tasks.md +0 -0
  190. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/checklists/requirements.md +0 -0
  191. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/contracts/cli.md +0 -0
  192. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/data-model.md +0 -0
  193. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/plan.md +0 -0
  194. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/quickstart.md +0 -0
  195. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/research.md +0 -0
  196. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/spec.md +0 -0
  197. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/012-list-platforms/tasks.md +0 -0
  198. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/checklists/requirements.md +0 -0
  199. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/contracts/api.md +0 -0
  200. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/contracts/cli.md +0 -0
  201. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/data-model.md +0 -0
  202. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/plan.md +0 -0
  203. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/quickstart.md +0 -0
  204. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/research.md +0 -0
  205. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/spec.md +0 -0
  206. {mdfetch-0.9.0 → mdfetch-0.9.2}/specs/013-tavily-fallback/tasks.md +0 -0
  207. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/__init__.py +0 -0
  208. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/base.py +0 -0
  209. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/cli.py +0 -0
  210. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/exceptions.py +0 -0
  211. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/__init__.py +0 -0
  212. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/boomi.py +0 -0
  213. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/devto.py +0 -0
  214. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/dzone.py +0 -0
  215. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/kong.py +0 -0
  216. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/medium.py +0 -0
  217. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/substack.py +0 -0
  218. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/providers/thenewstack.py +0 -0
  219. {mdfetch-0.9.0 → mdfetch-0.9.2}/src/mdfetch/router.py +0 -0
  220. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/__init__.py +0 -0
  221. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/conftest.py +0 -0
  222. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/__init__.py +0 -0
  223. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/conftest.py +0 -0
  224. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/architecting-the-asynchronous-agent.md +0 -0
  225. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-data-consistency-saas-on-prem.md +0 -0
  226. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-gartner-magic-quadrant-ipaas-2026.md +0 -0
  227. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/boomi-real-time-vs-batch-data-integration.md +0 -0
  228. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-december-2025.md +0 -0
  229. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-july-2025.md +0 -0
  230. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/devto-integration-digest-march-2026.md +0 -0
  231. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-image-classification-pipeline-camel-djl.md +0 -0
  232. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-integration-patterns-fail-production.md +0 -0
  233. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/dzone-kiro-feature-to-requirements-design-tasks.md +0 -0
  234. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/from-drift-to-parity.md +0 -0
  235. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/integration-digest-december-2025.md +0 -0
  236. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-ai-gateway-vs-litellm.md +0 -0
  237. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-gateway-3-14.md +0 -0
  238. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/kong-insomnia-12-6.md +0 -0
  239. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/substack-api-trends-2025.md +0 -0
  240. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/substack-kafka-topic-types.md +0 -0
  241. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-api-mcp-agent.md +0 -0
  242. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-async-apis.md +0 -0
  243. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-developer-portal-api.md +0 -0
  244. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-json-schema-ai.md +0 -0
  245. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/snapshots/thenewstack-mcp-api-governance.md +0 -0
  246. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_boomi_integration.py +0 -0
  247. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_cli_integration.py +0 -0
  248. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_devto_integration.py +0 -0
  249. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_dzone_integration.py +0 -0
  250. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_fallback_integration.py +0 -0
  251. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_kong_integration.py +0 -0
  252. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_medium_integration.py +0 -0
  253. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_substack_integration.py +0 -0
  254. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration/test_thenewstack_integration.py +0 -0
  255. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/integration_log.txt +0 -0
  256. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/__init__.py +0 -0
  257. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_boomi_extractor.py +0 -0
  258. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_cli.py +0 -0
  259. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_devto_extractor.py +0 -0
  260. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_dzone_extractor.py +0 -0
  261. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_fetch_errors.py +0 -0
  262. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_kong_extractor.py +0 -0
  263. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_medium_extractor.py +0 -0
  264. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_router.py +0 -0
  265. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_silent.py +0 -0
  266. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_substack_extractor.py +0 -0
  267. {mdfetch-0.9.0 → mdfetch-0.9.2}/tests/unit/test_thenewstack_extractor.py +0 -0
@@ -0,0 +1,59 @@
1
+ import sys
2
+ import json
3
+ import urllib.request
4
+
5
+ def generate():
6
+ for line in sys.stdin:
7
+ line = line.strip()
8
+ # Skip empty lines, comments, and local editable installs
9
+ if not line or line.startswith('#') or line.startswith('-e'):
10
+ continue
11
+
12
+ # Very basic environment marker filtering to skip Windows/Linux specific packages
13
+ if ';' in line:
14
+ req, marker = line.split(';', 1)
15
+ # Remove whitespace and quotes for simple matching
16
+ marker_clean = marker.replace(' ', '').replace('"', '').replace("'", "")
17
+ if 'sys_platform==win32' in marker_clean or 'sys_platform==linux' in marker_clean:
18
+ continue
19
+ line = req.strip()
20
+
21
+ # We only care about pinned packages
22
+ if '==' not in line:
23
+ continue
24
+
25
+ pkg, ver = line.split('==', 1)
26
+ pkg = pkg.strip()
27
+ ver = ver.strip()
28
+
29
+ # We don't need a resource block for mdfetch itself
30
+ if pkg == "mdfetch":
31
+ continue
32
+
33
+ url = f"https://pypi.org/pypi/{pkg}/{ver}/json"
34
+ try:
35
+ req = urllib.request.Request(url)
36
+ with urllib.request.urlopen(req, timeout=15) as resp:
37
+ data = json.loads(resp.read().decode('utf-8'))
38
+ except Exception as e:
39
+ print(f"ERROR: Failed fetching {pkg}: {e}", file=sys.stderr)
40
+ sys.exit(1)
41
+
42
+ urls = data.get("urls", [])
43
+ if not urls:
44
+ print(f"ERROR: {pkg} has no urls on PyPI", file=sys.stderr)
45
+ sys.exit(1)
46
+
47
+ # Require sdist (source tarball) to ensure architecture independence
48
+ sdist = next((u for u in urls if u["packagetype"] == "sdist"), None)
49
+ if not sdist:
50
+ print(f"ERROR: {pkg} has no sdist (source tarball) available on PyPI", file=sys.stderr)
51
+ sys.exit(1)
52
+
53
+ print(f' resource "{pkg}" do')
54
+ print(f' url "{sdist["url"]}"')
55
+ print(f' sha256 "{sdist["digests"]["sha256"]}"')
56
+ print(f' end\n')
57
+
58
+ if __name__ == "__main__":
59
+ generate()
@@ -65,6 +65,14 @@ jobs:
65
65
  contents: read
66
66
 
67
67
  steps:
68
+ - uses: actions/checkout@v4
69
+
70
+ - name: Install uv
71
+ uses: astral-sh/setup-uv@v4
72
+
73
+ - name: Set up Python
74
+ run: uv python pin 3.12
75
+
68
76
  - name: Fetch sdist info from PyPI (with retry)
69
77
  env:
70
78
  VERSION: ${{ github.ref_name }}
@@ -94,6 +102,10 @@ jobs:
94
102
  echo "SHA256=${SHA256}" >> "$GITHUB_ENV"
95
103
  echo "VERSION=${VERSION}" >> "$GITHUB_ENV"
96
104
 
105
+ - name: Generate PyPI resource blocks
106
+ run: |
107
+ uv export --no-dev --no-hashes --format requirements-txt | python3 .github/scripts/generate_resources.py > /tmp/resources.rb
108
+
97
109
  - name: Clone homebrew-tap and update formula
98
110
  env:
99
111
  TAP_GITHUB_TOKEN: ${{ secrets.TAP_GITHUB_TOKEN }}
@@ -114,7 +126,15 @@ jobs:
114
126
  echo "ERROR: SHA256 substitution made no change — formula sha256 pattern may have drifted" >&2; exit 1
115
127
  fi
116
128
 
129
+ # Replace everything between uses_from_macos "libxslt" and def install with the new resources
130
+ awk '
131
+ /uses_from_macos "libxslt"/ { print; print ""; system("cat /tmp/resources.rb"); skip=1; next }
132
+ /def install/ { skip=0 }
133
+ !skip { print }
134
+ ' Formula/md-fetch.rb > Formula/md-fetch.rb.new
135
+ mv Formula/md-fetch.rb.new Formula/md-fetch.rb
136
+
117
137
  git add Formula/md-fetch.rb
118
- git commit -m "chore: bump md-fetch to v${VERSION}"
138
+ git commit -m "chore: bump md-fetch to v${VERSION} and sync resources"
119
139
  git pull --rebase
120
140
  git push
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mdfetch
3
- Version: 0.9.0
3
+ Version: 0.9.2
4
4
  Summary: Extract article content from web platforms and return it as clean Markdown.
5
5
  Project-URL: Homepage, https://github.com/stn1slv/md-fetch
6
6
  Project-URL: Source, https://github.com/stn1slv/md-fetch
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mdfetch"
7
- version = "0.9.0"
7
+ version = "0.9.2"
8
8
  description = "Extract article content from web platforms and return it as clean Markdown."
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -2,13 +2,19 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from tavily import TavilyClient # type: ignore[import-untyped]
6
-
7
5
  from mdfetch.exceptions import EmptyContentError, FetchError, MissingAPIKeyError
8
6
 
9
7
 
10
8
  def tavily_extract(url: str, timeout: float = 30.0) -> str:
11
9
  """Extract content using the Tavily API fallback."""
10
+ try:
11
+ from tavily import TavilyClient # type: ignore[import-untyped]
12
+ except ImportError as e:
13
+ raise MissingAPIKeyError(
14
+ "tavily-python package is not installed. Please install it "
15
+ f"to use the fallback feature. {e}"
16
+ ) from e
17
+
12
18
  try:
13
19
  client = TavilyClient()
14
20
  except Exception as e:
@@ -12,7 +12,7 @@ from mdfetch.fallback import tavily_extract
12
12
 
13
13
 
14
14
  class TestTavilyExtract:
15
- @patch("mdfetch.fallback.TavilyClient")
15
+ @patch("tavily.TavilyClient")
16
16
  def test_basic_depth_success(self, mock_tavily_client: MagicMock) -> None:
17
17
  mock_instance = mock_tavily_client.return_value
18
18
  mock_instance.extract.return_value = {"results": [{"raw_content": "# Hello"}]}
@@ -24,7 +24,7 @@ class TestTavilyExtract:
24
24
  urls=["https://example.com"], extract_depth="basic"
25
25
  )
26
26
 
27
- @patch("mdfetch.fallback.TavilyClient")
27
+ @patch("tavily.TavilyClient")
28
28
  def test_fallback_to_advanced_on_empty(self, mock_tavily_client: MagicMock) -> None:
29
29
  mock_instance = mock_tavily_client.return_value
30
30
  # First call fails (empty), second call succeeds
@@ -41,7 +41,7 @@ class TestTavilyExtract:
41
41
  urls=["https://example.com"], extract_depth="advanced"
42
42
  )
43
43
 
44
- @patch("mdfetch.fallback.TavilyClient")
44
+ @patch("tavily.TavilyClient")
45
45
  def test_fallback_to_advanced_on_exception(self, mock_tavily_client: MagicMock) -> None:
46
46
  mock_instance = mock_tavily_client.return_value
47
47
  # First call raises exception, second call succeeds
@@ -55,7 +55,7 @@ class TestTavilyExtract:
55
55
  assert result == "# Advanced"
56
56
  assert mock_instance.extract.call_count == 2
57
57
 
58
- @patch("mdfetch.fallback.TavilyClient")
58
+ @patch("tavily.TavilyClient")
59
59
  def test_advanced_failure_raises_fetch_error(self, mock_tavily_client: MagicMock) -> None:
60
60
  mock_instance = mock_tavily_client.return_value
61
61
  mock_instance.extract.side_effect = Exception("API Error")
@@ -371,7 +371,7 @@ wheels = [
371
371
 
372
372
  [[package]]
373
373
  name = "mdfetch"
374
- version = "0.9.0"
374
+ version = "0.9.2"
375
375
  source = { editable = "." }
376
376
  dependencies = [
377
377
  { name = "beautifulsoup4" },
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