hdx-python-scraper 2.7.0__tar.gz → 2.7.1__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 (149) hide show
  1. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/PKG-INFO +4 -4
  2. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/pyproject.toml +3 -3
  3. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/requirements.txt +4 -4
  4. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/_version.py +2 -2
  5. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/outputs/excelfile.py +2 -1
  6. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/outputs/json.py +5 -4
  7. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/runner.py +3 -2
  8. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/resource_downloader.py +4 -4
  9. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/fallbacks.py +2 -1
  10. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/lookup.py +2 -1
  11. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/reader.py +11 -11
  12. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/conftest.py +7 -7
  13. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/outputs/test_output.py +9 -10
  14. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_resource_downloaders.py +2 -2
  15. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/.coveragerc +0 -0
  16. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/.github/workflows/publish.yaml +0 -0
  17. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/.github/workflows/run-python-tests.yaml +0 -0
  18. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/.gitignore +0 -0
  19. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/.pre-commit-config.yaml +0 -0
  20. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/CONTRIBUTING.md +0 -0
  21. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/LICENSE +0 -0
  22. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/README.md +0 -0
  23. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/documentation/.readthedocs.yaml +0 -0
  24. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/documentation/index.md +0 -0
  25. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/documentation/mkdocs.yaml +0 -0
  26. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/hatch.toml +0 -0
  27. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/pytest.ini +0 -0
  28. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/ruff.toml +0 -0
  29. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/__init__.py +0 -0
  30. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/base_scraper.py +0 -0
  31. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/outputs/__init__.py +0 -0
  32. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/outputs/base.py +0 -0
  33. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/outputs/googlesheets.py +0 -0
  34. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/__init__.py +0 -0
  35. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/aggregator.py +0 -0
  36. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/configurable_scraper.py +0 -0
  37. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/rowparser.py +0 -0
  38. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/scrapers/timeseries.py +0 -0
  39. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/__init__.py +0 -0
  40. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/hapi_admins.py +0 -0
  41. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/org_type.py +0 -0
  42. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/org_type_configuration.yaml +0 -0
  43. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/region_lookup.py +0 -0
  44. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/sector.py +0 -0
  45. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/sector_configuration.yaml +0 -0
  46. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/sources.py +0 -0
  47. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/src/hdx/scraper/framework/utilities/writer.py +0 -0
  48. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/config/project_configuration.yaml +0 -0
  49. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/access_2pacx-1vrszjzuyvt9i-mkrq2hbxrul2lx2vihkthqm-lae8nyhqty70zqtcufs3pxbhzgat1l2bkoa4-daoap-pub-gid-574237756-single-true-output-csv.csv +0 -0
  50. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/additional-json.json +0 -0
  51. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/altworldindata_data-tagger-match-all-on-tagger-01-header-location-tagger-01-tag.csv +0 -0
  52. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/casualties_2pacx-1vqidedbzz0ehrc0b4fswip14r7mdtu1mpmwakuxupelsah2awcurkgalfduhjvyjul8vzzat3r1b5qg-pub-gid-0-single-true-output-csv.csv +0 -0
  53. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cbpf-allocations-and-contributions.json +0 -0
  54. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cbpf2-allocations-and-contributions.json +0 -0
  55. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cerf-covid-19-allocations.json +0 -0
  56. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cerf2-covid-19-allocations.json +0 -0
  57. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cerf2_global_download-full-pfmb-allocations.csv +0 -0
  58. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/cerf_global_download-full-pfmb-allocations.csv +0 -0
  59. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/covax_2pacx-1vtvzu79pptfaa2syevoqfyrrjy63djwitqu0ffbxiqczoun9k9timwmrvfgg1rbsnlmgyugzseiaye2-pub-gid-992438980-single-true-output-csv.csv +0 -0
  60. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/covidtests_data-owid-covid-data.xlsx +0 -0
  61. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/download-global-pcode-lengths.csv +0 -0
  62. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/download-global-pcodes-adm-1-2.csv +0 -0
  63. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/education_closures_broken.xls +0 -0
  64. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/education_closures_school_closures.csv +0 -0
  65. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/education_enrolment_enrollment_data.xlsx +0 -0
  66. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ethiopia-drought-related-key-figures.json +0 -0
  67. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ethiopia-pin-targeted-reached-by-location-and-cluster.json +0 -0
  68. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ethiopia_drought_affected_targeted_reached_by_cluster.csv +0 -0
  69. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/fallbacks.json +0 -0
  70. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/gam_download-unicef-who-wb-global-expanded-databases-severe-wasting.xlsx +0 -0
  71. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/gam_other_download-unicef-who-wb-global-expanded-databases-severe-wasting.xlsx +0 -0
  72. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/global-coordination-groups-beta.json +0 -0
  73. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/global-school-closures-covid19.json +0 -0
  74. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/hno_2017_sahel_nutrition.csv +0 -0
  75. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/hno_2017_sahel_people_in_need.xlsx +0 -0
  76. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/idmc-internally-displaced-persons-idps.json +0 -0
  77. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/idps_download-displacement-data.csv +0 -0
  78. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/idps_override_population-widget-id-264111-geo-id-693-population-group-54074999.json +0 -0
  79. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/idps_somalia_som_unhcr_prmn_displacement_dataset.xlsx +0 -0
  80. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ipc_somalia_som_food_insecurity_oct_dec2022_projection.csv +0 -0
  81. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/kenya-drought-related-key-figures.json +0 -0
  82. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/kenya-pin-targeted-reached-by-location-and-cluster.json +0 -0
  83. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/kenya_drought_affected_targeted_reached_by_cluster.csv +0 -0
  84. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-0-single-true-output-csv.csv +0 -0
  85. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-1275038715-single-true-output-csv.csv +0 -0
  86. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-2015311116-single-true-output-csv.csv +0 -0
  87. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_eth_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-2015311116-single-true-output-csv.csv +0 -0
  88. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_ken_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-1275038715-single-true-output-csv.csv +0 -0
  89. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/key_figures_som_2pacx-1vrppqx8jtkkkrckmzfncmmtfecvcpkbp9pdhs1sqtuyacmbsx8tlaxpgblfce-lcehukregguxja-4s-pub-gid-0-single-true-output-csv.csv +0 -0
  90. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/org_type_organization_types_beta_csv.csv +0 -0
  91. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/organization-types-beta.json +0 -0
  92. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ourworldindata_data-tagger-match-all-on-tagger-01-header-location-tagger-01-tag.csv +0 -0
  93. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ourworldindata_other_data-tagger-match-all-on-tagger-01-header-location-tagger-01-tag.csv +0 -0
  94. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/oxcgrt_oxcgrt_csv.csv +0 -0
  95. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/oxford-covid-19-government-response-tracker.json +0 -0
  96. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/population.json +0 -0
  97. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/population_indicator-sp-pop-downloadformat-excel-dataformat-list-totl.xls +0 -0
  98. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/population_other_indicator-sp-pop-downloadformat-excel-dataformat-list-totl.xls +0 -0
  99. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/regions_tbl_regcov_2020_ocha.xlsx +0 -0
  100. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/resource_downloader_xlsx_ukr_border_crossings_090622.xlsx +0 -0
  101. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/sadd-countries-to-include.csv +0 -0
  102. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/sadd_covid-data-dataset-fullvars-extype-csv.csv +0 -0
  103. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/sahel-humanitarian-needs-overview.json +0 -0
  104. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/sahel-humanitarian-needs-overview_prefix.json +0 -0
  105. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/sector_global_coordination_groups_beta_csv.csv +0 -0
  106. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/somalia-acute-food-insecurity-country-data.json +0 -0
  107. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/somalia-drought-related-key-figures.json +0 -0
  108. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/somalia-internally-displaced-persons-idps.json +0 -0
  109. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/somalia-pin-targeted-reached-by-location-and-cluster.json +0 -0
  110. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/somalia_drought_affected_targeted_reached_by_cluster.csv +0 -0
  111. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/timeseries_casualties_2pacx-1vqidedbzz0ehrc0b4fswip14r7mdtu1mpmwakuxupelsah2awcurkgalfduhjvyjul8vzzat3r1b5qg-pub-gid-0-single-true-output-csv.csv +0 -0
  112. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/total-covid-19-tests-performed-by-country.json +0 -0
  113. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ukraine-border-crossings.json +0 -0
  114. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/ukraine-who-does-what-where-3w.json +0 -0
  115. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/unocha-office-locations.json +0 -0
  116. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/who_national2_who-covid-19-global-data.csv +0 -0
  117. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/who_national3_who-covid-19-global-data.csv +0 -0
  118. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/who_national_who-covid-19-global-data.csv +0 -0
  119. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/whowhatwhere_afg_3w_data.csv +0 -0
  120. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/input/whowhatwhere_notags_3w_data.csv +0 -0
  121. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/test_output.xlsx +0 -0
  122. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/test_scraper_all.json +0 -0
  123. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/test_scraper_other.json +0 -0
  124. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/fixtures/test_scraper_population.json +0 -0
  125. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/__init__.py +0 -0
  126. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/custom/__init__.py +0 -0
  127. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/custom/affected_targeted_reached.py +0 -0
  128. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/custom/education_closures.py +0 -0
  129. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/custom/education_enrolment.py +0 -0
  130. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/custom/test_custom.py +0 -0
  131. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/outputs/__init__.py +0 -0
  132. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/__init__.py +0 -0
  133. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_aggregation.py +0 -0
  134. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_appenddata.py +0 -0
  135. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_global.py +0 -0
  136. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_multipleurls.py +0 -0
  137. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_national.py +0 -0
  138. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_regionaltoplevel.py +0 -0
  139. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_subnational.py +0 -0
  140. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/test_timeseries.py +0 -0
  141. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/scrapers/unhcr_myanmar_idps.py +0 -0
  142. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/test_runner.py +0 -0
  143. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/__init__.py +0 -0
  144. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_hapi_admins.py +0 -0
  145. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_lookup.py +0 -0
  146. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_readers.py +0 -0
  147. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_regionlookup.py +0 -0
  148. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_sources.py +0 -0
  149. {hdx_python_scraper-2.7.0 → hdx_python_scraper-2.7.1}/tests/hdx/scraper/framework/utilities/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hdx-python-scraper
3
- Version: 2.7.0
3
+ Version: 2.7.1
4
4
  Summary: HDX Python scraper utilities to assemble data from multiple sources
5
5
  Project-URL: Homepage, https://github.com/OCHA-DAP/hdx-python-scraper
6
6
  Author-email: Michael Rans <rans@email.com>
@@ -26,9 +26,9 @@ Classifier: Programming Language :: Python :: 3.12
26
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
27
  Requires-Python: >=3.10
28
28
  Requires-Dist: gspread
29
- Requires-Dist: hdx-python-api>=6.6.0
30
- Requires-Dist: hdx-python-country>=4.0.0
31
- Requires-Dist: hdx-python-utilities>=4.0.0
29
+ Requires-Dist: hdx-python-api>=6.6.1
30
+ Requires-Dist: hdx-python-country>=4.0.1
31
+ Requires-Dist: hdx-python-utilities>=4.0.2
32
32
  Requires-Dist: regex
33
33
  Provides-Extra: dev
34
34
  Requires-Dist: pre-commit; extra == 'dev'
@@ -34,9 +34,9 @@ classifiers = [
34
34
  requires-python = ">=3.10"
35
35
 
36
36
  dependencies = [
37
- "hdx-python-api>=6.6.0",
38
- "hdx-python-country>=4.0.0",
39
- "hdx-python-utilities>=4.0.0",
37
+ "hdx-python-api>=6.6.1",
38
+ "hdx-python-country>=4.0.1",
39
+ "hdx-python-utilities>=4.0.2",
40
40
  "gspread",
41
41
  "regex",
42
42
  ]
@@ -42,13 +42,13 @@ google-auth-oauthlib==1.2.2
42
42
  # via gspread
43
43
  gspread==6.2.1
44
44
  # via hdx-python-scraper (pyproject.toml)
45
- hdx-python-api==6.6.0
45
+ hdx-python-api==6.6.1
46
46
  # via hdx-python-scraper (pyproject.toml)
47
- hdx-python-country==4.0.0
47
+ hdx-python-country==4.0.1
48
48
  # via
49
49
  # hdx-python-scraper (pyproject.toml)
50
50
  # hdx-python-api
51
- hdx-python-utilities==4.0.0
51
+ hdx-python-utilities==4.0.2
52
52
  # via
53
53
  # hdx-python-scraper (pyproject.toml)
54
54
  # hdx-python-api
@@ -146,7 +146,7 @@ referencing==0.37.0
146
146
  # via
147
147
  # jsonschema
148
148
  # jsonschema-specifications
149
- regex==2025.11.3
149
+ regex==2026.1.15
150
150
  # via hdx-python-scraper (pyproject.toml)
151
151
  requests==2.32.5
152
152
  # via
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.7.0'
32
- __version_tuple__ = version_tuple = (2, 7, 0)
31
+ __version__ = version = '2.7.1'
32
+ __version_tuple__ = version_tuple = (2, 7, 1)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from pathlib import Path
2
3
 
3
4
  from openpyxl import Workbook
4
5
 
@@ -24,7 +25,7 @@ class ExcelFile(BaseOutput):
24
25
  """
25
26
 
26
27
  def __init__(
27
- self, excel_path: str, tabs: dict[str, str], updatetabs: list[str]
28
+ self, excel_path: Path | str, tabs: dict[str, str], updatetabs: list[str]
28
29
  ) -> None:
29
30
  super().__init__(updatetabs)
30
31
  self.workbook = Workbook()
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from os.path import join
2
+ from pathlib import Path
3
3
  from typing import Any
4
4
 
5
5
  from hdx.utilities.dictandlist import dict_of_lists_add
@@ -184,7 +184,7 @@ class JsonFile(BaseOutput):
184
184
  newrow[hxl_row[key]] = row[key]
185
185
  self.add_data_row(name, newrow)
186
186
 
187
- def save(self, folder: str | None = None, **kwargs: Any) -> list[str]:
187
+ def save(self, folder: Path | str | None = None, **kwargs: Any) -> list[Path]:
188
188
  """Save JSON file and any addition subsets of that JSON defined in the additional configuration
189
189
 
190
190
  Args:
@@ -197,7 +197,8 @@ class JsonFile(BaseOutput):
197
197
  filepaths = []
198
198
  filepath = self.configuration["output"]
199
199
  if folder:
200
- filepath = join(folder, filepath)
200
+ folder = Path(folder)
201
+ filepath = folder / filepath
201
202
  logger.info(f"Writing JSON to {filepath}")
202
203
  save_json(self.json, filepath)
203
204
  filepaths.append(filepath)
@@ -262,7 +263,7 @@ class JsonFile(BaseOutput):
262
263
  continue
263
264
  filedetailspath = filedetails["filepath"]
264
265
  if folder:
265
- filedetailspath = join(folder, filedetailspath)
266
+ filedetailspath = folder / filedetailspath
266
267
  logger.info(f"Writing JSON to {filedetailspath}")
267
268
  save_json(json, filedetailspath)
268
269
  filepaths.append(filedetailspath)
@@ -2,6 +2,7 @@ import logging
2
2
  from collections.abc import Callable, Sequence
3
3
  from copy import copy
4
4
  from datetime import datetime
5
+ from pathlib import Path
5
6
  from traceback import format_exc
6
7
  from typing import Any, Optional
7
8
 
@@ -422,7 +423,7 @@ class Runner:
422
423
  def add_resource_downloader(
423
424
  self,
424
425
  datasetinfo: dict,
425
- folder: str = "",
426
+ folder: Path | str = "",
426
427
  force_add_to_run: bool = False,
427
428
  ) -> str:
428
429
  """Add resource downloader to the run. If running specific scrapers rather than
@@ -445,7 +446,7 @@ class Runner:
445
446
  def add_resource_downloaders(
446
447
  self,
447
448
  configuration: dict,
448
- folder: str = "",
449
+ folder: Path | str = "",
449
450
  force_add_to_run: bool = False,
450
451
  ) -> list[str]:
451
452
  """Add multiple resource downloaders to the run. If running specific scrapers
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from os.path import join
2
+ from pathlib import Path
3
3
  from shutil import copy2
4
4
 
5
5
  from slugify import slugify
@@ -19,11 +19,11 @@ class ResourceDownloader(BaseScraper):
19
19
  folder: Folder to which to download. Default is "".
20
20
  """
21
21
 
22
- def __init__(self, datasetinfo, folder):
22
+ def __init__(self, datasetinfo: dict, folder: Path | str):
23
23
  # ResourceDownloader only outputs to sources
24
24
  name = f"resource_downloader_{slugify(datasetinfo['hxltag'].lower(), separator='_')}"
25
25
  super().__init__(name, datasetinfo, {})
26
- self.folder = folder
26
+ self.folder = Path(folder)
27
27
 
28
28
  def run(self) -> None:
29
29
  """Runs one resource downloader given dataset information
@@ -35,7 +35,7 @@ class ResourceDownloader(BaseScraper):
35
35
  resource = reader.read_hdx_metadata(self.datasetinfo)
36
36
  url, path = reader.download_resource(resource, file_prefix=self.name)
37
37
  logger.info(f"Downloading {url} to {path}")
38
- copy2(path, join(self.folder, self.datasetinfo["filename"]))
38
+ copy2(path, self.folder / self.datasetinfo["filename"])
39
39
 
40
40
  def add_sources(self) -> None:
41
41
  """Add source for resource download
@@ -1,4 +1,5 @@
1
1
  import logging
2
+ from pathlib import Path
2
3
 
3
4
  from hdx.utilities.loader import LoadError, load_json
4
5
 
@@ -25,7 +26,7 @@ class Fallbacks:
25
26
  @classmethod
26
27
  def add(
27
28
  cls,
28
- fallbacks_path: str,
29
+ fallbacks_path: Path | str,
29
30
  levels_mapping: dict[str, str] = default_levels_mapping,
30
31
  sources_key: str = "sources",
31
32
  admin_name_mapping: dict[str, str] = default_admin_name_mapping,
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  from copy import copy
3
+ from pathlib import Path
3
4
 
4
5
  from hdx.utilities.loader import load_yaml
5
6
  from hdx.utilities.matching import get_code_from_name
@@ -20,7 +21,7 @@ class Lookup:
20
21
  classobject: Child class
21
22
  """
22
23
 
23
- def __init__(self, yaml_config_path: str, classobject: type):
24
+ def __init__(self, yaml_config_path: Path | str, classobject: type):
24
25
  configuration = load_yaml(script_dir_plus_file(yaml_config_path, classobject))
25
26
  self._configuration = configuration
26
27
  initial_lookup = configuration.get("initial_lookup", {})
@@ -2,7 +2,7 @@ import glob
2
2
  import logging
3
3
  from collections.abc import Iterator, Sequence
4
4
  from datetime import datetime
5
- from os.path import join
5
+ from pathlib import Path
6
6
  from typing import Any
7
7
  from urllib.parse import parse_qsl
8
8
 
@@ -41,9 +41,9 @@ class Read(Retrieve):
41
41
  def __init__(
42
42
  self,
43
43
  downloader: Download,
44
- fallback_dir: str,
45
- saved_dir: str,
46
- temp_dir: str,
44
+ fallback_dir: Path | str,
45
+ saved_dir: Path | str,
46
+ temp_dir: Path | str,
47
47
  save: bool = False,
48
48
  use_saved: bool = False,
49
49
  prefix: str = "",
@@ -65,9 +65,9 @@ class Read(Retrieve):
65
65
  @classmethod
66
66
  def create_readers(
67
67
  cls,
68
- fallback_dir: str,
69
- saved_dir: str,
70
- temp_dir: str,
68
+ fallback_dir: Path | str,
69
+ saved_dir: Path | str,
70
+ temp_dir: Path | str,
71
71
  save: bool = False,
72
72
  use_saved: bool = False,
73
73
  ignore: Sequence[str] = tuple(),
@@ -275,7 +275,7 @@ class Read(Retrieve):
275
275
  Returns:
276
276
  The dataset that was read or None
277
277
  """
278
- saved_path = join(self.saved_dir, f"{dataset_name}.json")
278
+ saved_path = self.saved_dir / f"{dataset_name}.json"
279
279
  if self.use_saved:
280
280
  logger.info(f"Using saved dataset {dataset_name} in {saved_path}")
281
281
  dataset = Dataset.load_from_json(saved_path)
@@ -319,7 +319,7 @@ class Read(Retrieve):
319
319
  list of datasets resulting from query
320
320
  """
321
321
 
322
- saved_path = join(self.saved_dir, filename)
322
+ saved_path = self.saved_dir / filename
323
323
  if self.use_saved:
324
324
  logger.info(
325
325
  f"Using saved datasets in {filename}_n.json in {self.saved_dir}"
@@ -461,7 +461,7 @@ class Read(Retrieve):
461
461
  url = resource["url"]
462
462
  try:
463
463
  _, path = self.download_resource(resource, **kwargs)
464
- data = hxl.data(path, InputOptions(allow_local=True)).cache()
464
+ data = hxl.data(str(path), InputOptions(allow_local=True)).cache()
465
465
  data.display_tags
466
466
  return data
467
467
  except hxl.HXLException:
@@ -488,7 +488,7 @@ class Read(Retrieve):
488
488
  """
489
489
  try:
490
490
  _, path = self.construct_filename_and_download(name, format, url, **kwargs)
491
- return hxl.info(path, InputOptions(allow_local=True))
491
+ return hxl.info(str(path), InputOptions(allow_local=True))
492
492
  except hxl.HXLException:
493
493
  logger.warning(f"Could not process {url}. Maybe there are no HXL tags?")
494
494
  return None
@@ -1,6 +1,6 @@
1
1
  """Global fixtures"""
2
2
 
3
- from os.path import join
3
+ from pathlib import Path
4
4
 
5
5
  import pytest
6
6
  from hdx.api.configuration import Configuration
@@ -18,12 +18,12 @@ from . import bool_assert
18
18
 
19
19
  @pytest.fixture(scope="session")
20
20
  def fixtures():
21
- return join("tests", "fixtures")
21
+ return Path("tests") / "fixtures"
22
22
 
23
23
 
24
24
  @pytest.fixture(scope="session")
25
25
  def input_folder(fixtures):
26
- return join(fixtures, "input")
26
+ return fixtures / "input"
27
27
 
28
28
 
29
29
  @pytest.fixture(scope="session")
@@ -32,7 +32,7 @@ def configuration(fixtures, input_folder):
32
32
  hdx_read_only=True,
33
33
  hdx_site="prod",
34
34
  user_agent="test",
35
- project_config_yaml=join("tests", "config", "project_configuration.yaml"),
35
+ project_config_yaml=Path("tests") / "config" / "project_configuration.yaml",
36
36
  )
37
37
  Locations.set_validlocations(
38
38
  [
@@ -58,7 +58,7 @@ def configuration(fixtures, input_folder):
58
58
  if save:
59
59
  Read.create_readers(
60
60
  "",
61
- join(fixtures, "tmp"),
61
+ fixtures / "tmp",
62
62
  "",
63
63
  save=True,
64
64
  use_saved=False,
@@ -88,9 +88,9 @@ def configuration(fixtures, input_folder):
88
88
 
89
89
  @pytest.fixture(scope="function")
90
90
  def fallbacks_json(input_folder):
91
- path = join(input_folder, "fallbacks.json")
91
+ path = input_folder / "fallbacks.json"
92
92
  Fallbacks.add(path, sources_key="sources")
93
- return path
93
+ return str(path)
94
94
 
95
95
 
96
96
  def check_scrapers(
@@ -1,6 +1,5 @@
1
1
  import filecmp
2
2
  from os import getenv
3
- from os.path import join
4
3
 
5
4
  import numpy as np
6
5
  import pandas
@@ -29,7 +28,7 @@ class TestOutput:
29
28
  tabs = configuration["tabs"]
30
29
  sheetname = list(tabs.values())[0]
31
30
  noout = BaseOutput(tabs)
32
- excelout = ExcelFile(join(tempdir, "test_output.xlsx"), tabs, tabs)
31
+ excelout = ExcelFile(tempdir / "test_output.xlsx", tabs, tabs)
33
32
  gsheet_auth = getenv("GSHEET_AUTH")
34
33
  if not gsheet_auth:
35
34
  raise ValueError("No gsheet authorisation supplied!")
@@ -78,16 +77,16 @@ class TestOutput:
78
77
  result = googletab.get("A1:C3")
79
78
  result[2][2] = int(result[2][2])
80
79
  assert result == output
81
- assert filecmp.cmp(filepaths[0], join(fixtures, "test_scraper_all.json"))
80
+ assert filecmp.cmp(filepaths[0], fixtures / "test_scraper_all.json")
82
81
  assert filecmp.cmp(
83
82
  filepaths[1],
84
- join(fixtures, "test_scraper_population.json"),
83
+ fixtures / "test_scraper_population.json",
85
84
  )
86
85
  assert filecmp.cmp(
87
86
  filepaths[2],
88
- join(fixtures, "test_scraper_population.json"),
87
+ fixtures / "test_scraper_population.json",
89
88
  )
90
- assert filecmp.cmp(filepaths[3], join(fixtures, "test_scraper_other.json"))
89
+ assert filecmp.cmp(filepaths[3], fixtures / "test_scraper_other.json")
91
90
 
92
91
  jsonout.json = {}
93
92
  df = pandas.DataFrame(output[2:], columns=output[0])
@@ -101,16 +100,16 @@ class TestOutput:
101
100
  result = googletab.get("A1:C3")
102
101
  result[2][2] = int(result[2][2])
103
102
  assert result == output
104
- assert filecmp.cmp(filepaths[0], join(fixtures, "test_scraper_all.json"))
103
+ assert filecmp.cmp(filepaths[0], fixtures / "test_scraper_all.json")
105
104
  assert filecmp.cmp(
106
105
  filepaths[1],
107
- join(fixtures, "test_scraper_population.json"),
106
+ fixtures / "test_scraper_population.json",
108
107
  )
109
108
  assert filecmp.cmp(
110
109
  filepaths[2],
111
- join(fixtures, "test_scraper_population.json"),
110
+ fixtures / "test_scraper_population.json",
112
111
  )
113
- assert filecmp.cmp(filepaths[3], join(fixtures, "test_scraper_other.json"))
112
+ assert filecmp.cmp(filepaths[3], fixtures / "test_scraper_other.json")
114
113
 
115
114
  df = pandas.DataFrame(output[1:], columns=output[0])
116
115
  googleout.update_tab("national", df, limit=2)
@@ -1,4 +1,4 @@
1
- from os.path import exists, join
1
+ from os.path import exists
2
2
 
3
3
  import pytest
4
4
  from hdx.utilities.dateparse import parse_date
@@ -11,7 +11,7 @@ from hdx.scraper.framework.runner import Runner
11
11
  class TestResourceDownloader:
12
12
  @pytest.fixture(scope="function")
13
13
  def output_file(self, fixtures):
14
- return join(fixtures, "test_output.xlsx")
14
+ return fixtures / "test_output.xlsx"
15
15
 
16
16
  def test_resourcedownloader(self, configuration, output_file):
17
17
  with temp_dir(