hdx-python-utilities 3.9.0__tar.gz → 3.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 (130) hide show
  1. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/PKG-INFO +1 -1
  2. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/requirements.txt +29 -28
  3. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/_version.py +16 -3
  4. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/downloader.py +9 -2
  5. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/loader.py +14 -12
  6. hdx_python_utilities-3.9.2/tests/fixtures/loader/empty.yaml +0 -0
  7. hdx_python_utilities-3.9.2/tests/fixtures/loader/empty_list.json +1 -0
  8. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_downloader.py +23 -0
  9. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_loader.py +24 -8
  10. hdx_python_utilities-3.9.0/tests/fixtures/loader/empty.json +0 -1
  11. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.coveragerc +0 -0
  12. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.github/workflows/publish-test.yaml +0 -0
  13. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.github/workflows/publish.yaml +0 -0
  14. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.github/workflows/run-python-tests.yaml +0 -0
  15. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.gitignore +0 -0
  16. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/.pre-commit-config.yaml +0 -0
  17. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/CONTRIBUTING.md +0 -0
  18. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/LICENSE +0 -0
  19. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/README.md +0 -0
  20. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/documentation/.readthedocs.yaml +0 -0
  21. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/documentation/index.md +0 -0
  22. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/documentation/mkdocs.yaml +0 -0
  23. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/hatch.toml +0 -0
  24. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/pyproject.toml +0 -0
  25. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/pytest.ini +0 -0
  26. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/ruff.toml +0 -0
  27. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/__init__.py +0 -0
  28. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/base_downloader.py +0 -0
  29. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/compare.py +0 -0
  30. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/dateparse.py +0 -0
  31. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/dictandlist.py +0 -0
  32. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/easy_logging.py +0 -0
  33. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/email.py +0 -0
  34. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/encoding.py +0 -0
  35. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/error_handler.py +0 -0
  36. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/errors_onexit.py +0 -0
  37. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/frictionless_wrapper.py +0 -0
  38. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/html.py +0 -0
  39. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/matching.py +0 -0
  40. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/path.py +0 -0
  41. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/retriever.py +0 -0
  42. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/saver.py +0 -0
  43. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/session.py +0 -0
  44. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/state.py +0 -0
  45. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/text.py +0 -0
  46. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/typehint.py +0 -0
  47. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/useragent.py +0 -0
  48. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/src/hdx/utilities/uuid.py +0 -0
  49. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/compare/test_csv_processing.csv +0 -0
  50. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/compare/test_csv_processing2.csv +0 -0
  51. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/empty.yaml +0 -0
  52. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/hdx_config.json +0 -0
  53. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/hdx_config.yaml +0 -0
  54. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/hdx_email_configuration.json +0 -0
  55. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/hdx_email_configuration.yaml +0 -0
  56. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/json_csv.yaml +0 -0
  57. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/logging_config.json +0 -0
  58. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/logging_config.yaml +0 -0
  59. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/project_configuration.json +0 -0
  60. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/project_configuration.yaml +0 -0
  61. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/smtp_config.json +0 -0
  62. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/smtp_config.yaml +0 -0
  63. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/user_agent_config.yaml +0 -0
  64. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/user_agent_config2.yaml +0 -0
  65. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/user_agent_config3.yaml +0 -0
  66. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/config/user_agent_config_wrong.yaml +0 -0
  67. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/basicauth.txt +0 -0
  68. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/bearertoken.txt +0 -0
  69. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/extra_params.json +0 -0
  70. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/extra_params.yaml +0 -0
  71. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/extra_params_tree.yaml +0 -0
  72. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_csv_processing.csv +0 -0
  73. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_csv_processing_blanks.csv +0 -0
  74. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_data.csv +0 -0
  75. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_data.xlsx +0 -0
  76. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_data1.csv/empty.txt +0 -0
  77. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_data2.csv +0 -0
  78. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_json_processing.json +0 -0
  79. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_xls_processing.xls +0 -0
  80. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/downloader/test_xlsx_processing.xlsx +0 -0
  81. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/html/response.html +0 -0
  82. /hdx_python_utilities-3.9.0/tests/fixtures/loader/empty.yaml → /hdx_python_utilities-3.9.2/tests/fixtures/loader/empty.json +0 -0
  83. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/fallbacks/test.csv +0 -0
  84. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/fallbacks/test.json +0 -0
  85. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/fallbacks/test.txt +0 -0
  86. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/fallbacks/test.yaml +0 -0
  87. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/retriever-test.csv +0 -0
  88. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/test.csv +0 -0
  89. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/test.json +0 -0
  90. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/test.txt +0 -0
  91. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/test.yaml +0 -0
  92. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/retriever/test_hxl.csv +0 -0
  93. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out.csv +0 -0
  94. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out.json +0 -0
  95. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out2.csv +0 -0
  96. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out2.json +0 -0
  97. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out5.json +0 -0
  98. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out6.json +0 -0
  99. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out7.json +0 -0
  100. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out8.csv +0 -0
  101. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/out8.json +0 -0
  102. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-false_sortkeys-false.json +0 -0
  103. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-false_sortkeys-false.yaml +0 -0
  104. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-false_sortkeys-true.json +0 -0
  105. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-false_sortkeys-true.yaml +0 -0
  106. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-true_sortkeys-false.json +0 -0
  107. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-true_sortkeys-false.yaml +0 -0
  108. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-true_sortkeys-true.json +0 -0
  109. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/saver/pretty-true_sortkeys-true.yaml +0 -0
  110. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/state/analysis_dates.txt +0 -0
  111. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/state/last_build_date.txt +0 -0
  112. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/fixtures/test_data.csv +0 -0
  113. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/conftest.py +0 -0
  114. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_compare.py +0 -0
  115. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_dateparse.py +0 -0
  116. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_dictandlist.py +0 -0
  117. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_easy_logging.py +0 -0
  118. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_email.py +0 -0
  119. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_encoding.py +0 -0
  120. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_error_handler.py +0 -0
  121. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_html.py +0 -0
  122. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_matching.py +0 -0
  123. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_path.py +0 -0
  124. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_retriever.py +0 -0
  125. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_saver.py +0 -0
  126. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_state.py +0 -0
  127. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_text.py +0 -0
  128. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_useragent.py +0 -0
  129. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/test_uuid.py +0 -0
  130. {hdx_python_utilities-3.9.0 → hdx_python_utilities-3.9.2}/tests/hdx/utilities/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hdx-python-utilities
3
- Version: 3.9.0
3
+ Version: 3.9.2
4
4
  Summary: HDX Python Utilities for streaming tabular data, date and time handling and other helpful functions
5
5
  Project-URL: Homepage, https://github.com/OCHA-DAP/hdx-python-utilities
6
6
  Author-email: Michael Rans <rans@email.com>
@@ -2,7 +2,7 @@
2
2
  # uv pip compile pyproject.toml --resolver=backtracking --all-extras -o requirements.txt
3
3
  annotated-types==0.7.0
4
4
  # via pydantic
5
- astdoc==1.3.1
5
+ astdoc==1.3.2
6
6
  # via mkapi
7
7
  attrs==25.3.0
8
8
  # via
@@ -14,7 +14,7 @@ babel==2.17.0
14
14
  # via mkdocs-material
15
15
  backrefs==5.9
16
16
  # via mkdocs-material
17
- beautifulsoup4==4.13.4
17
+ beautifulsoup4==4.13.5
18
18
  # via hdx-python-utilities (pyproject.toml)
19
19
  certifi==2025.8.3
20
20
  # via requests
@@ -22,27 +22,28 @@ cfgv==3.4.0
22
22
  # via pre-commit
23
23
  chardet==5.2.0
24
24
  # via frictionless
25
- charset-normalizer==3.4.2
25
+ charset-normalizer==3.4.3
26
26
  # via requests
27
27
  click==8.2.1
28
28
  # via
29
29
  # mkdocs
30
+ # mkdocs-material
30
31
  # typer
31
32
  colorama==0.4.6
32
33
  # via mkdocs-material
33
- coverage==7.10.2
34
+ coverage==7.10.7
34
35
  # via pytest-cov
35
36
  cydifflib==1.2.0
36
37
  # via hdx-python-utilities (pyproject.toml)
37
38
  distlib==0.4.0
38
39
  # via virtualenv
39
- dnspython==2.7.0
40
+ dnspython==2.8.0
40
41
  # via email-validator
41
- email-validator==2.2.0
42
+ email-validator==2.3.0
42
43
  # via hdx-python-utilities (pyproject.toml)
43
44
  et-xmlfile==2.0.0
44
45
  # via openpyxl
45
- filelock==3.18.0
46
+ filelock==3.19.1
46
47
  # via virtualenv
47
48
  frictionless==5.18.1
48
49
  # via hdx-python-utilities (pyproject.toml)
@@ -50,9 +51,9 @@ ghp-import==2.1.0
50
51
  # via mkdocs
51
52
  html5lib==1.1
52
53
  # via hdx-python-utilities (pyproject.toml)
53
- humanize==4.12.3
54
+ humanize==4.13.0
54
55
  # via frictionless
55
- identify==2.6.12
56
+ identify==2.6.14
56
57
  # via pre-commit
57
58
  idna==3.10
58
59
  # via
@@ -72,24 +73,24 @@ jinja2==3.1.6
72
73
  # mkdocs-material
73
74
  jsonlines==4.0.0
74
75
  # via hdx-python-utilities (pyproject.toml)
75
- jsonschema==4.25.0
76
+ jsonschema==4.25.1
76
77
  # via
77
78
  # frictionless
78
79
  # tableschema-to-template
79
- jsonschema-specifications==2025.4.1
80
+ jsonschema-specifications==2025.9.1
80
81
  # via jsonschema
81
82
  loguru==0.7.3
82
83
  # via
83
84
  # hdx-python-utilities (pyproject.toml)
84
85
  # pytest-loguru
85
- markdown==3.8.2
86
+ markdown==3.9
86
87
  # via
87
88
  # mkdocs
88
89
  # mkdocs-material
89
90
  # pymdown-extensions
90
- markdown-it-py==3.0.0
91
+ markdown-it-py==4.0.0
91
92
  # via rich
92
- marko==2.1.4
93
+ marko==2.2.0
93
94
  # via frictionless
94
95
  markupsafe==3.0.2
95
96
  # via
@@ -109,7 +110,7 @@ mkdocs==1.6.1
109
110
  # mkdocs-material
110
111
  mkdocs-get-deps==0.2.0
111
112
  # via mkdocs
112
- mkdocs-material==9.6.16
113
+ mkdocs-material==9.6.20
113
114
  # via mkapi
114
115
  mkdocs-material-extensions==1.3.1
115
116
  # via mkdocs-material
@@ -127,7 +128,7 @@ pathspec==0.12.1
127
128
  # via mkdocs
128
129
  petl==1.7.17
129
130
  # via frictionless
130
- platformdirs==4.3.8
131
+ platformdirs==4.4.0
131
132
  # via
132
133
  # mkdocs-get-deps
133
134
  # virtualenv
@@ -135,9 +136,9 @@ pluggy==1.6.0
135
136
  # via
136
137
  # pytest
137
138
  # pytest-cov
138
- pre-commit==4.2.0
139
+ pre-commit==4.3.0
139
140
  # via hdx-python-utilities (pyproject.toml)
140
- pydantic==2.11.7
141
+ pydantic==2.11.9
141
142
  # via frictionless
142
143
  pydantic-core==2.33.2
143
144
  # via pydantic
@@ -150,11 +151,11 @@ pymdown-extensions==10.16.1
150
151
  # via mkdocs-material
151
152
  pyphonetics==0.5.3
152
153
  # via hdx-python-utilities (pyproject.toml)
153
- pytest==8.4.1
154
+ pytest==8.4.2
154
155
  # via
155
156
  # hdx-python-utilities (pyproject.toml)
156
157
  # pytest-cov
157
- pytest-cov==6.2.1
158
+ pytest-cov==7.0.0
158
159
  # via hdx-python-utilities (pyproject.toml)
159
160
  pytest-loguru==0.4.0
160
161
  # via hdx-python-utilities (pyproject.toml)
@@ -182,7 +183,7 @@ referencing==0.36.2
182
183
  # via
183
184
  # jsonschema
184
185
  # jsonschema-specifications
185
- requests==2.32.4
186
+ requests==2.32.5
186
187
  # via
187
188
  # frictionless
188
189
  # mkdocs-material
@@ -193,11 +194,11 @@ rfc3986==2.0.0
193
194
  # via frictionless
194
195
  rich==14.1.0
195
196
  # via typer
196
- rpds-py==0.26.0
197
+ rpds-py==0.27.1
197
198
  # via
198
199
  # jsonschema
199
200
  # referencing
200
- ruamel-yaml==0.18.14
201
+ ruamel-yaml==0.18.15
201
202
  # via hdx-python-utilities (pyproject.toml)
202
203
  ruamel-yaml-clib==0.2.12
203
204
  # via ruamel-yaml
@@ -209,7 +210,7 @@ six==1.17.0
209
210
  # via
210
211
  # html5lib
211
212
  # python-dateutil
212
- soupsieve==2.7
213
+ soupsieve==2.8
213
214
  # via beautifulsoup4
214
215
  tableschema-to-template==0.0.13
215
216
  # via hdx-python-utilities (pyproject.toml)
@@ -217,9 +218,9 @@ tabulate==0.9.0
217
218
  # via frictionless
218
219
  text-unidecode==1.3
219
220
  # via python-slugify
220
- typer==0.16.0
221
+ typer==0.19.1
221
222
  # via frictionless
222
- typing-extensions==4.14.1
223
+ typing-extensions==4.15.0
223
224
  # via
224
225
  # beautifulsoup4
225
226
  # frictionless
@@ -235,7 +236,7 @@ urllib3==2.5.0
235
236
  # via requests
236
237
  validators==0.35.0
237
238
  # via frictionless
238
- virtualenv==20.33.0
239
+ virtualenv==20.34.0
239
240
  # via pre-commit
240
241
  watchdog==6.0.0
241
242
  # via mkdocs
@@ -245,7 +246,7 @@ xlrd==2.0.2
245
246
  # via hdx-python-utilities (pyproject.toml)
246
247
  xlsx2csv==0.8.4
247
248
  # via hdx-python-utilities (pyproject.toml)
248
- xlsxwriter==3.2.5
249
+ xlsxwriter==3.2.9
249
250
  # via tableschema-to-template
250
251
  xlwt==1.3.0
251
252
  # via hdx-python-utilities (pyproject.toml)
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '3.9.0'
21
- __version_tuple__ = version_tuple = (3, 9, 0)
31
+ __version__ = version = '3.9.2'
32
+ __version_tuple__ = version_tuple = (3, 9, 2)
33
+
34
+ __commit_id__ = commit_id = None
@@ -261,6 +261,7 @@ class Download(BaseDownload):
261
261
  timeout: Optional[float] = None,
262
262
  headers: Optional[Dict] = None,
263
263
  encoding: Optional[str] = None,
264
+ json_string: bool = False,
264
265
  ) -> requests.Response:
265
266
  """Setup download from provided url returning the response.
266
267
 
@@ -272,6 +273,7 @@ class Download(BaseDownload):
272
273
  timeout (Optional[float]): Timeout for connecting to URL. Defaults to None (no timeout).
273
274
  headers (Optional[Dict]): Headers to pass. Defaults to None.
274
275
  encoding (Optional[str]): Encoding to use for text response. Defaults to None (best guess).
276
+ json_string (bool): Whether to post parameters as JSON string. Defaults to False.
275
277
 
276
278
  Returns:
277
279
  requests.Response: requests.Response object
@@ -288,10 +290,11 @@ class Download(BaseDownload):
288
290
  url = urlunsplit(spliturl)
289
291
  if post:
290
292
  full_url, parameters = self.get_url_params_for_post(url, parameters)
291
- json_parameters = json.dumps(parameters)
293
+ if json_string:
294
+ parameters = json.dumps(parameters)
292
295
  self.response = self.session.post(
293
296
  full_url,
294
- data=json_parameters,
297
+ data=parameters,
295
298
  stream=stream,
296
299
  timeout=timeout,
297
300
  headers=headers,
@@ -423,6 +426,7 @@ class Download(BaseDownload):
423
426
  timeout (float): Timeout for connecting to URL. Defaults to None (no timeout).
424
427
  headers (Dict): Headers to pass. Defaults to None.
425
428
  encoding (str): Encoding to use for text response. Defaults to None (best guess).
429
+ json_string (bool): Whether to post parameters as JSON string. Defaults to False.
426
430
 
427
431
  Returns:
428
432
  str: Path of downloaded file
@@ -443,6 +447,7 @@ class Download(BaseDownload):
443
447
  timeout=kwargs.get("timeout"),
444
448
  headers=kwargs.get("headers"),
445
449
  encoding=kwargs.get("encoding"),
450
+ json_string=kwargs.get("json_string", False),
446
451
  )
447
452
  return self.stream_path(
448
453
  path, f"Download of {url} failed in retrieval of stream!"
@@ -459,6 +464,7 @@ class Download(BaseDownload):
459
464
  timeout (float): Timeout for connecting to URL. Defaults to None (no timeout).
460
465
  headers (Dict): Headers to pass. Defaults to None.
461
466
  encoding (str): Encoding to use for text response. Defaults to None (best guess).
467
+ json_string (bool): Whether to post parameters as JSON string. Defaults to False.
462
468
 
463
469
  Returns:
464
470
  requests.Response: Response
@@ -471,6 +477,7 @@ class Download(BaseDownload):
471
477
  timeout=kwargs.get("timeout"),
472
478
  headers=kwargs.get("headers"),
473
479
  encoding=kwargs.get("encoding"),
480
+ json_string=kwargs.get("json_string", False),
474
481
  )
475
482
 
476
483
  def get_header(self, header: str) -> Any:
@@ -72,13 +72,14 @@ def load_yaml(
72
72
  Any: The data from the YAML file
73
73
  """
74
74
  with open(path, encoding=encoding) as f:
75
+ data = f.read()
76
+ if not data:
77
+ if loaderror_if_empty:
78
+ raise LoadError(f"YAML file: {path} is empty!")
79
+ return None
75
80
  yaml = YAML()
76
- yamlobj = yaml.load(f.read())
77
- if not yamlobj:
78
- if loaderror_if_empty:
79
- raise LoadError(f"YAML file: {path} is empty!")
80
- return None
81
- return yamlobj
81
+ yamlobj = yaml.load(data)
82
+ return yamlobj
82
83
 
83
84
 
84
85
  def load_json(
@@ -95,12 +96,13 @@ def load_json(
95
96
  Any: The data from the JSON file
96
97
  """
97
98
  with open(path, encoding=encoding) as f:
98
- jsonobj = json.loads(f.read())
99
- if not jsonobj:
100
- if loaderror_if_empty:
101
- raise LoadError(f"JSON file: {path} is empty!")
102
- return None
103
- return jsonobj
99
+ data = f.read()
100
+ if not data:
101
+ if loaderror_if_empty:
102
+ raise LoadError(f"JSON file: {path} is empty!")
103
+ return None
104
+ jsonobj = json.loads(data)
105
+ return jsonobj
104
106
 
105
107
 
106
108
  def load_and_merge_yaml(
@@ -386,6 +386,18 @@ class TestDownloader:
386
386
  parameters=OrderedDict([("a", "3"), ("c", "2")]),
387
387
  )
388
388
  json = downloader.get_json()
389
+ assert list(json["form"].items()) == list(
390
+ OrderedDict(
391
+ [("a", "3"), ("c", "2"), ("id", "3"), ("lala", "b")]
392
+ ).items()
393
+ )
394
+ downloader.setup(
395
+ f"{postfixtureurl}?id=3&lala=b",
396
+ post=True,
397
+ parameters=OrderedDict([("a", "3"), ("c", "2")]),
398
+ json_string=True,
399
+ )
400
+ json = downloader.get_json()
389
401
  assert list(json["json"].items()) == list(
390
402
  OrderedDict(
391
403
  [("a", "3"), ("c", "2"), ("id", "3"), ("lala", "b")]
@@ -526,6 +538,17 @@ class TestDownloader:
526
538
  post=True,
527
539
  parameters=OrderedDict([("a", "3"), ("c", "2")]),
528
540
  )
541
+ assert list(json["form"].items()) == list(
542
+ OrderedDict(
543
+ [("a", "3"), ("c", "2"), ("id", "3"), ("lala", "b")]
544
+ ).items()
545
+ )
546
+ json = downloader.download_json(
547
+ f"{postfixtureurl}?id=3&lala=b",
548
+ post=True,
549
+ parameters=OrderedDict([("a", "3"), ("c", "2")]),
550
+ json_string=True,
551
+ )
529
552
  assert list(json["json"].items()) == list(
530
553
  OrderedDict(
531
554
  [("a", "3"), ("c", "2"), ("id", "3"), ("lala", "b")]
@@ -113,17 +113,33 @@ a
113
113
  test"""
114
114
  expected_text_newlines_to_spaces = """ hello this is a test """
115
115
 
116
- def test_load_empty(self, fixturesfolder):
117
- loaderfolder = join(fixturesfolder, "loader")
116
+ @pytest.fixture(scope="class")
117
+ def loaderfolder(self, fixturesfolder):
118
+ return join(fixturesfolder, "loader")
119
+
120
+ @pytest.fixture(scope="class")
121
+ def empty_yaml(self, loaderfolder):
122
+ return join(loaderfolder, "empty.yaml")
123
+
124
+ @pytest.fixture(scope="class")
125
+ def empty_json(self, loaderfolder):
126
+ return join(loaderfolder, "empty.json")
127
+
128
+ @pytest.fixture(scope="class")
129
+ def empty_list(self, loaderfolder):
130
+ return join(loaderfolder, "empty_list.json")
131
+
132
+ def test_load_empty(self, empty_yaml, empty_json, empty_list):
118
133
  with pytest.raises(LoadError):
119
- load_text(join(loaderfolder, "empty.yaml"))
120
- load_text(join(loaderfolder, "empty.yaml"), loaderror_if_empty=False) == ""
134
+ load_text(empty_yaml)
135
+ load_text(empty_yaml, loaderror_if_empty=False) == ""
121
136
  with pytest.raises(LoadError):
122
- load_yaml(join(loaderfolder, "empty.yaml"))
123
- load_yaml(join(loaderfolder, "empty.yaml"), loaderror_if_empty=False) is None
137
+ load_yaml(empty_yaml)
138
+ load_yaml(empty_yaml, loaderror_if_empty=False) is None
124
139
  with pytest.raises(LoadError):
125
- load_json(join(loaderfolder, "empty.json"))
126
- load_json(join(loaderfolder, "empty.json"), loaderror_if_empty=False) is None
140
+ load_json(empty_json)
141
+ load_json(empty_json, loaderror_if_empty=False) is None
142
+ load_json(empty_list)
127
143
 
128
144
  def test_load_and_merge_yaml(self, configfolder):
129
145
  result = load_and_merge_yaml(