mdfetch 0.9.4__tar.gz → 0.9.5__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 (268) hide show
  1. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/scripts/generate_resources.py +40 -7
  2. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/workflows/ci.yml +1 -1
  3. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/workflows/integration.yml +1 -1
  4. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/workflows/publish.yml +10 -4
  5. mdfetch-0.9.5/.python-version +1 -0
  6. {mdfetch-0.9.4 → mdfetch-0.9.5}/PKG-INFO +1 -1
  7. {mdfetch-0.9.4 → mdfetch-0.9.5}/pyproject.toml +1 -1
  8. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/medium.py +5 -3
  9. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/substack.py +1 -1
  10. mdfetch-0.9.5/uv.lock +945 -0
  11. mdfetch-0.9.4/.python-version +0 -1
  12. mdfetch-0.9.4/uv.lock +0 -767
  13. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-analyze/SKILL.md +0 -0
  14. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-checklist/SKILL.md +0 -0
  15. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-clarify/SKILL.md +0 -0
  16. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-constitution/SKILL.md +0 -0
  17. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-converge/SKILL.md +0 -0
  18. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-implement/SKILL.md +0 -0
  19. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-plan/SKILL.md +0 -0
  20. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-specify/SKILL.md +0 -0
  21. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-tasks/SKILL.md +0 -0
  22. {mdfetch-0.9.4 → mdfetch-0.9.5}/.agents/skills/speckit-taskstoissues/SKILL.md +0 -0
  23. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-analyze/SKILL.md +0 -0
  24. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-archive-run/SKILL.md +0 -0
  25. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-checklist/SKILL.md +0 -0
  26. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-clarify/SKILL.md +0 -0
  27. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-constitution/SKILL.md +0 -0
  28. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-converge/SKILL.md +0 -0
  29. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-git-commit/SKILL.md +0 -0
  30. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-git-feature/SKILL.md +0 -0
  31. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-git-initialize/SKILL.md +0 -0
  32. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-git-remote/SKILL.md +0 -0
  33. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-git-validate/SKILL.md +0 -0
  34. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-implement/SKILL.md +0 -0
  35. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-plan/SKILL.md +0 -0
  36. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-reconcile-run/SKILL.md +0 -0
  37. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-specify/SKILL.md +0 -0
  38. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-tasks/SKILL.md +0 -0
  39. {mdfetch-0.9.4 → mdfetch-0.9.5}/.claude/skills/speckit-taskstoissues/SKILL.md +0 -0
  40. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.analyze.toml +0 -0
  41. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.checklist.toml +0 -0
  42. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.clarify.toml +0 -0
  43. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.constitution.toml +0 -0
  44. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.implement.toml +0 -0
  45. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.plan.toml +0 -0
  46. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.specify.toml +0 -0
  47. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.tasks.toml +0 -0
  48. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gemini/commands/speckit.taskstoissues.toml +0 -0
  49. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gitattributes +0 -0
  50. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/copilot-instructions.md +0 -0
  51. {mdfetch-0.9.4 → mdfetch-0.9.5}/.github/dependabot.yml +0 -0
  52. {mdfetch-0.9.4 → mdfetch-0.9.5}/.gitignore +0 -0
  53. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/.registry +0 -0
  54. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/archive/LICENSE +0 -0
  55. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/archive/README.md +0 -0
  56. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/archive/commands/archive.md +0 -0
  57. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/archive/extension.yml +0 -0
  58. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/README.md +0 -0
  59. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/commands/speckit.git.commit.md +0 -0
  60. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/commands/speckit.git.feature.md +0 -0
  61. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/commands/speckit.git.initialize.md +0 -0
  62. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/commands/speckit.git.remote.md +0 -0
  63. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/commands/speckit.git.validate.md +0 -0
  64. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/config-template.yml +0 -0
  65. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/extension.yml +0 -0
  66. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/git-config.yml +0 -0
  67. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/bash/auto-commit.sh +0 -0
  68. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/bash/create-new-feature.sh +0 -0
  69. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/bash/git-common.sh +0 -0
  70. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/bash/initialize-repo.sh +0 -0
  71. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/powershell/auto-commit.ps1 +0 -0
  72. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/powershell/create-new-feature.ps1 +0 -0
  73. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/powershell/git-common.ps1 +0 -0
  74. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/git/scripts/powershell/initialize-repo.ps1 +0 -0
  75. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/reconcile/LICENSE +0 -0
  76. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/reconcile/README.md +0 -0
  77. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/reconcile/commands/reconcile.md +0 -0
  78. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions/reconcile/extension.yml +0 -0
  79. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/extensions.yml +0 -0
  80. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/feature.json +0 -0
  81. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/init-options.json +0 -0
  82. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/integration.json +0 -0
  83. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/integrations/agy.manifest.json +0 -0
  84. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/integrations/claude.manifest.json +0 -0
  85. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/integrations/gemini.manifest.json +0 -0
  86. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/integrations/speckit.manifest.json +0 -0
  87. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/memory/changelog.md +0 -0
  88. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/memory/constitution.md +0 -0
  89. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/memory/plan.md +0 -0
  90. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/memory/spec.md +0 -0
  91. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  92. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/scripts/bash/common.sh +0 -0
  93. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/scripts/bash/create-new-feature.sh +0 -0
  94. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/scripts/bash/setup-plan.sh +0 -0
  95. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/scripts/bash/setup-tasks.sh +0 -0
  96. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/templates/checklist-template.md +0 -0
  97. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/templates/constitution-template.md +0 -0
  98. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/templates/plan-template.md +0 -0
  99. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/templates/spec-template.md +0 -0
  100. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/templates/tasks-template.md +0 -0
  101. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/workflows/speckit/workflow.yml +0 -0
  102. {mdfetch-0.9.4 → mdfetch-0.9.5}/.specify/workflows/workflow-registry.json +0 -0
  103. /mdfetch-0.9.4/GEMINI.md → /mdfetch-0.9.5/AGENTS.md +0 -0
  104. {mdfetch-0.9.4 → mdfetch-0.9.5}/CLAUDE.md +0 -0
  105. {mdfetch-0.9.4 → mdfetch-0.9.5}/LICENSE +0 -0
  106. {mdfetch-0.9.4 → mdfetch-0.9.5}/Makefile +0 -0
  107. {mdfetch-0.9.4 → mdfetch-0.9.5}/README.md +0 -0
  108. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/checklists/requirements.md +0 -0
  109. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/contracts/api.md +0 -0
  110. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/data-model.md +0 -0
  111. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/plan.md +0 -0
  112. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/quickstart.md +0 -0
  113. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/research.md +0 -0
  114. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/spec.md +0 -0
  115. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/001-mdfetch-medium-extractor/tasks.md +0 -0
  116. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/checklists/requirements.md +0 -0
  117. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/contracts/public-api.md +0 -0
  118. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/data-model.md +0 -0
  119. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/plan.md +0 -0
  120. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/quickstart.md +0 -0
  121. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/research.md +0 -0
  122. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/spec.md +0 -0
  123. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/002-devto-provider/tasks.md +0 -0
  124. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/checklists/requirements.md +0 -0
  125. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/contracts/extract-api.md +0 -0
  126. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/plan.md +0 -0
  127. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/research.md +0 -0
  128. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/spec.md +0 -0
  129. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/003-medium-freedium-fallback/tasks.md +0 -0
  130. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/004-remove-backoff/checklists/requirements.md +0 -0
  131. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/004-remove-backoff/plan.md +0 -0
  132. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/004-remove-backoff/research.md +0 -0
  133. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/004-remove-backoff/spec.md +0 -0
  134. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/004-remove-backoff/tasks.md +0 -0
  135. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/checklists/requirements.md +0 -0
  136. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/contracts/extractor-api.md +0 -0
  137. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/data-model.md +0 -0
  138. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/plan.md +0 -0
  139. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/quickstart.md +0 -0
  140. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/research.md +0 -0
  141. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/spec.md +0 -0
  142. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/005-substack-provider/tasks.md +0 -0
  143. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/checklists/requirements.md +0 -0
  144. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/contracts/public-api.md +0 -0
  145. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/data-model.md +0 -0
  146. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/plan.md +0 -0
  147. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/quickstart.md +0 -0
  148. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/research.md +0 -0
  149. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/spec.md +0 -0
  150. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/006-thenewstack-provider/tasks.md +0 -0
  151. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/checklists/requirements.md +0 -0
  152. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/contracts/public-api.md +0 -0
  153. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/data-model.md +0 -0
  154. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/plan.md +0 -0
  155. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/quickstart.md +0 -0
  156. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/research.md +0 -0
  157. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/spec.md +0 -0
  158. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/007-dzone-provider/tasks.md +0 -0
  159. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/checklists/requirements.md +0 -0
  160. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/contracts/cli.md +0 -0
  161. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/data-model.md +0 -0
  162. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/plan.md +0 -0
  163. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/quickstart.md +0 -0
  164. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/research.md +0 -0
  165. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/spec.md +0 -0
  166. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/008-mdfetch-cli/tasks.md +0 -0
  167. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/checklists/requirements.md +0 -0
  168. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/contracts/formula.md +0 -0
  169. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/contracts/tap-update-job.md +0 -0
  170. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/data-model.md +0 -0
  171. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/plan.md +0 -0
  172. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/quickstart.md +0 -0
  173. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/research.md +0 -0
  174. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/spec.md +0 -0
  175. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/009-homebrew-tap-formula/tasks.md +0 -0
  176. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/checklists/requirements.md +0 -0
  177. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/contracts/extractor-contract.md +0 -0
  178. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/data-model.md +0 -0
  179. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/plan.md +0 -0
  180. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/quickstart.md +0 -0
  181. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/research.md +0 -0
  182. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/spec.md +0 -0
  183. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/010-boomi-blog-provider/tasks.md +0 -0
  184. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/checklists/requirements.md +0 -0
  185. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/contracts/extractor-contract.md +0 -0
  186. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/data-model.md +0 -0
  187. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/plan.md +0 -0
  188. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/quickstart.md +0 -0
  189. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/research.md +0 -0
  190. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/spec.md +0 -0
  191. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/011-konghq-blog-provider/tasks.md +0 -0
  192. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/checklists/requirements.md +0 -0
  193. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/contracts/cli.md +0 -0
  194. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/data-model.md +0 -0
  195. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/plan.md +0 -0
  196. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/quickstart.md +0 -0
  197. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/research.md +0 -0
  198. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/spec.md +0 -0
  199. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/012-list-platforms/tasks.md +0 -0
  200. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/checklists/requirements.md +0 -0
  201. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/contracts/api.md +0 -0
  202. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/contracts/cli.md +0 -0
  203. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/data-model.md +0 -0
  204. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/plan.md +0 -0
  205. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/quickstart.md +0 -0
  206. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/research.md +0 -0
  207. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/spec.md +0 -0
  208. {mdfetch-0.9.4 → mdfetch-0.9.5}/specs/013-tavily-fallback/tasks.md +0 -0
  209. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/__init__.py +0 -0
  210. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/base.py +0 -0
  211. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/cli.py +0 -0
  212. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/exceptions.py +0 -0
  213. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/fallback.py +0 -0
  214. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/__init__.py +0 -0
  215. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/boomi.py +0 -0
  216. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/devto.py +0 -0
  217. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/dzone.py +0 -0
  218. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/kong.py +0 -0
  219. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/providers/thenewstack.py +0 -0
  220. {mdfetch-0.9.4 → mdfetch-0.9.5}/src/mdfetch/router.py +0 -0
  221. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/__init__.py +0 -0
  222. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/conftest.py +0 -0
  223. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/__init__.py +0 -0
  224. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/conftest.py +0 -0
  225. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/architecting-the-asynchronous-agent.md +0 -0
  226. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/boomi-data-consistency-saas-on-prem.md +0 -0
  227. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/boomi-gartner-magic-quadrant-ipaas-2026.md +0 -0
  228. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/boomi-real-time-vs-batch-data-integration.md +0 -0
  229. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/devto-integration-digest-december-2025.md +0 -0
  230. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/devto-integration-digest-july-2025.md +0 -0
  231. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/devto-integration-digest-march-2026.md +0 -0
  232. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/dzone-image-classification-pipeline-camel-djl.md +0 -0
  233. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/dzone-integration-patterns-fail-production.md +0 -0
  234. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/dzone-kiro-feature-to-requirements-design-tasks.md +0 -0
  235. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/from-drift-to-parity.md +0 -0
  236. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/integration-digest-december-2025.md +0 -0
  237. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/kong-ai-gateway-vs-litellm.md +0 -0
  238. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/kong-gateway-3-14.md +0 -0
  239. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/kong-insomnia-12-6.md +0 -0
  240. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/substack-api-trends-2025.md +0 -0
  241. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/substack-kafka-topic-types.md +0 -0
  242. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/thenewstack-api-mcp-agent.md +0 -0
  243. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/thenewstack-async-apis.md +0 -0
  244. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/thenewstack-developer-portal-api.md +0 -0
  245. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/thenewstack-json-schema-ai.md +0 -0
  246. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/snapshots/thenewstack-mcp-api-governance.md +0 -0
  247. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_boomi_integration.py +0 -0
  248. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_cli_integration.py +0 -0
  249. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_devto_integration.py +0 -0
  250. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_dzone_integration.py +0 -0
  251. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_fallback_integration.py +0 -0
  252. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_kong_integration.py +0 -0
  253. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_medium_integration.py +0 -0
  254. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_substack_integration.py +0 -0
  255. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/integration/test_thenewstack_integration.py +0 -0
  256. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/__init__.py +0 -0
  257. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_boomi_extractor.py +0 -0
  258. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_cli.py +0 -0
  259. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_devto_extractor.py +0 -0
  260. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_dzone_extractor.py +0 -0
  261. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_fallback.py +0 -0
  262. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_fetch_errors.py +0 -0
  263. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_kong_extractor.py +0 -0
  264. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_medium_extractor.py +0 -0
  265. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_router.py +0 -0
  266. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_silent.py +0 -0
  267. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_substack_extractor.py +0 -0
  268. {mdfetch-0.9.4 → mdfetch-0.9.5}/tests/unit/test_thenewstack_extractor.py +0 -0
@@ -1,20 +1,39 @@
1
- import sys
1
+ import argparse
2
2
  import json
3
+ import sys
3
4
  import urllib.request
4
5
 
5
- def generate():
6
+ from packaging.markers import Marker, default_environment
7
+
8
+
9
+ def target_environment(python_version):
10
+ """Marker environment of the Homebrew install: macOS with the formula's Python."""
11
+ env = default_environment()
12
+ env.update(
13
+ python_version=python_version,
14
+ python_full_version=f"{python_version}.0",
15
+ sys_platform="darwin",
16
+ platform_system="Darwin",
17
+ os_name="posix",
18
+ )
19
+ return env
20
+
21
+
22
+ def generate(python_version):
23
+ env = target_environment(python_version)
24
+ seen = {}
6
25
  for line in sys.stdin:
7
26
  line = line.strip()
8
27
  # Skip empty lines, comments, and local editable installs
9
28
  if not line or line.startswith('#') or line.startswith('-e'):
10
29
  continue
11
30
 
12
- # Very basic environment marker filtering to skip Windows/Linux specific packages
31
+ # Keep only requirements whose environment marker holds for the Homebrew
32
+ # install. A lock resolved for several Python versions lists some
33
+ # packages once per version range, e.g. anyio for < 3.15 and >= 3.15.
13
34
  if ';' in line:
14
35
  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:
36
+ if not Marker(marker.strip()).evaluate(env):
18
37
  continue
19
38
  line = req.strip()
20
39
 
@@ -29,6 +48,16 @@ def generate():
29
48
  # We don't need a resource block for mdfetch itself
30
49
  if pkg == "mdfetch":
31
50
  continue
51
+
52
+ # Homebrew keeps only the first resource of a given name, so a second
53
+ # one would be dropped silently. Fail instead of guessing.
54
+ if pkg in seen:
55
+ print(
56
+ f"ERROR: {pkg} is pinned twice ({seen[pkg]} and {ver}) for Python {python_version}",
57
+ file=sys.stderr,
58
+ )
59
+ sys.exit(1)
60
+ seen[pkg] = ver
32
61
 
33
62
  url = f"https://pypi.org/pypi/{pkg}/{ver}/json"
34
63
  try:
@@ -56,4 +85,8 @@ def generate():
56
85
  print(f' end\n')
57
86
 
58
87
  if __name__ == "__main__":
59
- generate()
88
+ parser = argparse.ArgumentParser(
89
+ description="Generate Homebrew resource blocks from `uv export` output on stdin."
90
+ )
91
+ parser.add_argument("--python", required=True, help="Python version of the formula, e.g. 3.13")
92
+ generate(parser.parse_args().python)
@@ -19,7 +19,7 @@ jobs:
19
19
  enable-cache: true
20
20
  cache-dependency-glob: "uv.lock"
21
21
  - name: Set up Python
22
- run: uv python pin 3.12
22
+ run: uv python pin 3.14
23
23
  - name: Install dependencies
24
24
  run: uv sync --frozen --all-extras
25
25
  - name: Check formatting
@@ -23,7 +23,7 @@ jobs:
23
23
  cache-dependency-glob: "uv.lock"
24
24
 
25
25
  - name: Set up Python
26
- run: uv python pin 3.12
26
+ run: uv python pin 3.14
27
27
 
28
28
  - name: Install dependencies
29
29
  run: uv sync --frozen --all-extras
@@ -17,7 +17,7 @@ jobs:
17
17
  - name: Install uv
18
18
  uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
19
19
  - name: Set up Python
20
- run: uv python pin 3.12
20
+ run: uv python pin 3.14
21
21
  - name: Validate version
22
22
  run: |
23
23
  TAG_VERSION=${GITHUB_REF_NAME#v}
@@ -71,8 +71,10 @@ jobs:
71
71
  uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
72
72
 
73
73
  - name: Set up Python
74
- run: uv python pin 3.12
75
-
74
+ # Matches `depends_on "python@3.13"` in Formula/md-fetch.rb and the
75
+ # --python 3.13 flag below, not the 3.14 used by the other jobs.
76
+ run: uv python pin 3.13
77
+
76
78
  - name: Fetch sdist info from PyPI (with retry)
77
79
  env:
78
80
  VERSION: ${{ github.ref_name }}
@@ -104,7 +106,11 @@ jobs:
104
106
 
105
107
  - name: Generate PyPI resource blocks
106
108
  run: |
107
- uv export --no-dev --no-hashes --format requirements-txt | python3 .github/scripts/generate_resources.py > /tmp/resources.rb
109
+ # --python must match `depends_on "python@X.Y"` in Formula/md-fetch.rb,
110
+ # so environment markers are evaluated for the Python Homebrew uses.
111
+ uv export --no-dev --no-hashes --format requirements-txt \
112
+ | uv run --no-project --with packaging python .github/scripts/generate_resources.py --python 3.13 \
113
+ > /tmp/resources.rb
108
114
 
109
115
  - name: Clone homebrew-tap and update formula
110
116
  env:
@@ -0,0 +1 @@
1
+ 3.14
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mdfetch
3
- Version: 0.9.4
3
+ Version: 0.9.5
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.4"
7
+ version = "0.9.5"
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" }
@@ -46,13 +46,15 @@ class MediumExtractor(BaseExtractor):
46
46
  ):
47
47
  button.decompose()
48
48
 
49
- for element in article.find_all(attrs={"data-testid": "post-sidebar"}):
49
+ for element in article.find_all(None, attrs={"data-testid": "post-sidebar"}):
50
50
  element.decompose()
51
51
 
52
- for element in article.find_all(attrs={"data-testid": re.compile(r"share", re.IGNORECASE)}):
52
+ for element in article.find_all(
53
+ None, attrs={"data-testid": re.compile(r"share", re.IGNORECASE)}
54
+ ):
53
55
  element.decompose()
54
56
 
55
- for element in article.find_all(attrs={"data-testid": "post-footer"}):
57
+ for element in article.find_all(None, attrs={"data-testid": "post-footer"}):
56
58
  element.decompose()
57
59
 
58
60
  for section in article.find_all("section"):
@@ -40,7 +40,7 @@ class SubstackExtractor(BaseExtractor):
40
40
  self._replace_embeds_with_links(
41
41
  [
42
42
  e
43
- for e in body.find_all(attrs={"data-component-name": True})
43
+ for e in body.find_all(None, attrs={"data-component-name": True})
44
44
  if e.get("data-component-name") not in _safe_components
45
45
  ],
46
46
  soup,