hdx-python-pipelineutils 0.0.2__tar.gz → 0.0.4__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 (35) hide show
  1. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/.pre-commit-config.yaml +3 -4
  2. hdx_python_pipelineutils-0.0.4/CLAUDE.md +58 -0
  3. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/PKG-INFO +3 -3
  4. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/pyproject.toml +5 -5
  5. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/_version.py +2 -2
  6. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/hapi_admins.py +2 -2
  7. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/lookup.py +1 -1
  8. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/sector_configuration.yaml +17 -0
  9. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/conftest.py +2 -3
  10. hdx_python_pipelineutils-0.0.4/tests/fixtures/input/sahel-humanitarian-needs-overview.json +1 -0
  11. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/test_hapi_admins.py +2 -2
  12. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/test_lookup.py +2 -2
  13. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/test_readers.py +1 -1
  14. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/uv.lock +22 -23
  15. hdx_python_pipelineutils-0.0.2/tests/config/project_configuration.yaml +0 -1684
  16. hdx_python_pipelineutils-0.0.2/tests/fixtures/input/sahel-humanitarian-needs-overview.json +0 -1
  17. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/.github/workflows/publish.yaml +0 -0
  18. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/.github/workflows/run-python-tests.yaml +0 -0
  19. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/.gitignore +0 -0
  20. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/LICENSE +0 -0
  21. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/README.md +0 -0
  22. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/__init__.py +0 -0
  23. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/org_type.py +0 -0
  24. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/org_type_configuration.yaml +0 -0
  25. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/reader.py +0 -0
  26. {hdx_python_pipelineutils-0.0.2/src/hdx/python → hdx_python_pipelineutils-0.0.4/src/hdx}/pipelineutils/sector.py +0 -0
  27. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/download-global-pcode-lengths.csv +0 -0
  28. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/download-global-pcodes-adm-1-2.csv +0 -0
  29. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/education_closures_school_closures.csv +0 -0
  30. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/global-coordination-groups-beta.json +0 -0
  31. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/hno_2017_sahel_nutrition.csv +0 -0
  32. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/hno_2017_sahel_people_in_need.xlsx +0 -0
  33. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/org_type_organization_types_beta_csv_no_hxl.csv +0 -0
  34. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/organization-types-beta.json +0 -0
  35. {hdx_python_pipelineutils-0.0.2 → hdx_python_pipelineutils-0.0.4}/tests/fixtures/input/sector_global_coordination_groups_beta_csv_no_hxl.csv +0 -0
@@ -1,5 +1,5 @@
1
1
  default_language_version:
2
- python: python3.13
2
+ python: python3
3
3
 
4
4
  repos:
5
5
  - repo: https://github.com/pre-commit/pre-commit-hooks
@@ -7,11 +7,10 @@ repos:
7
7
  hooks:
8
8
  - id: trailing-whitespace
9
9
  - id: end-of-file-fixer
10
- exclude: test_scraper_.*\.json
11
10
  - id: check-ast
12
11
 
13
12
  - repo: https://github.com/astral-sh/ruff-pre-commit
14
- rev: v0.14.14
13
+ rev: v0.15.7
15
14
  hooks:
16
15
  # Run the linter.
17
16
  - id: ruff-check
@@ -20,7 +19,7 @@ repos:
20
19
  - id: ruff-format
21
20
 
22
21
  - repo: https://github.com/astral-sh/uv-pre-commit
23
- rev: 0.9.25
22
+ rev: 0.10.12
24
23
  hooks:
25
24
  # Ensure the lockfile is up-to-date with pyproject.toml
26
25
  - id: uv-lock
@@ -0,0 +1,58 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## Project Overview
6
+
7
+ **hdx-python-pipelineutils** is a shared utility library for HDX data pipeline scrapers. It provides reusable components for reading data, resolving admin levels, and looking up sector and org-type codes from YAML-driven configuration.
8
+
9
+ ## Commands
10
+
11
+ Install dependencies:
12
+ ```bash
13
+ uv sync
14
+ ```
15
+
16
+ Run tests:
17
+ ```bash
18
+ uv run pytest
19
+ ```
20
+
21
+ Run a single test:
22
+ ```bash
23
+ uv run pytest tests/test_lookup.py
24
+ ```
25
+
26
+ Lint check:
27
+ ```bash
28
+ pre-commit run --all-files
29
+ ```
30
+
31
+ ## Architecture
32
+
33
+ Source lives under `src/hdx/pipelineutils/`:
34
+
35
+ - **`reader.py`** — `Read` (subclass of `hdx-python-utilities` `Retrieve`): downloads and caches tabular data (CSV, XLS, XLSX), with save/use-saved modes, date extraction from time periods, and HDX dataset/resource helpers.
36
+ - **`lookup.py`** — `Lookup`: base class for YAML-driven code lookups. Loads a configuration YAML, builds normalised name→code mappings, and resolves codes via `hdx-python-country`'s fuzzy matching.
37
+ - **`org_type.py`** — `OrgType(Lookup)`: resolves organisation-type codes using `org_type_configuration.yaml`.
38
+ - **`sector.py`** — `Sector(Lookup)`: resolves sector codes using `sector_configuration.yaml`.
39
+ - **`hapi_admins.py`** — `complete_admins()`: populates adm-level names from p-codes and vice-versa using `hdx-python-country` `AdminLevel` objects; returns the resolved level and a list of warnings.
40
+ - **`__init__.py`** — shared helpers: `string_params_to_dict`, `match_template` (extracts `{{...}}` placeholders), `get_startend_dates_from_time_period`.
41
+
42
+ ## Testing
43
+
44
+ Tests are in `tests/` and use `pytest`. No live HDX connection is required — data is mocked or loaded from `tests/fixtures/`. Coverage is written to `coverage.lcov` and JUnit XML to `test-results.xml`.
45
+
46
+ ## Code Style
47
+
48
+ Formatted and linted with `ruff` (rules: E, F, I, UP; line-length not enforced). Python ≥ 3.10. Use `X | Y` union syntax (PEP 604), not `Optional`/`Union`. Google-style docstrings with `Args:` and `Returns:` sections.
49
+
50
+ ## Collaboration Style
51
+
52
+ - Be objective, not agreeable. Act as a partner, not a sycophant. Push back when you disagree, flag tradeoffs honestly, and don't sugarcoat problems.
53
+ - Keep explanations brief and to the point.
54
+ - Don't rely on recalled knowledge for facts that could be stale (API behaviour, library versions, external systems). Search or read the actual source first.
55
+
56
+ ## Scope of Changes
57
+
58
+ When fixing a bug or addressing PR feedback, change only what is necessary to resolve the specific issue. Do not refactor surrounding code, rename variables, adjust formatting, or make improvements in the same commit unless they are directly required by the fix.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hdx-python-pipelineutils
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: HDX Python Pipeline Utilities
5
5
  Project-URL: Homepage, https://github.com/OCHA-DAP/hdx-python-pipelineutils
6
6
  Author-email: Michael Rans <rans@email.com>
@@ -18,11 +18,11 @@ Classifier: Operating System :: Unix
18
18
  Classifier: Programming Language :: Python
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Programming Language :: Python :: 3.8
22
- Classifier: Programming Language :: Python :: 3.9
23
21
  Classifier: Programming Language :: Python :: 3.10
24
22
  Classifier: Programming Language :: Python :: 3.11
25
23
  Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
26
26
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
27
  Requires-Python: >=3.10
28
28
  Requires-Dist: hdx-python-api>=6.6.7
@@ -18,11 +18,11 @@ classifiers = [
18
18
  "Programming Language :: Python",
19
19
  "Programming Language :: Python :: 3",
20
20
  "Programming Language :: Python :: 3 :: Only",
21
- "Programming Language :: Python :: 3.8",
22
- "Programming Language :: Python :: 3.9",
23
21
  "Programming Language :: Python :: 3.10",
24
22
  "Programming Language :: Python :: 3.11",
25
23
  "Programming Language :: Python :: 3.12",
24
+ "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
26
26
  "Intended Audience :: Developers",
27
27
  "License :: OSI Approved :: MIT License",
28
28
  "Natural Language :: English",
@@ -50,7 +50,7 @@ dev = [
50
50
  "pytest",
51
51
  "pytest-cov",
52
52
  "pre-commit",
53
- "ruff==0.14.14",
53
+ "ruff==0.15.7",
54
54
  ]
55
55
 
56
56
  [project.urls]
@@ -68,7 +68,7 @@ local_scheme = "no-local-version"
68
68
  version_scheme = "python-simplified-semver"
69
69
 
70
70
  [tool.hatch.build.hooks.vcs]
71
- version-file = "src/hdx/python/pipelineutils/_version.py"
71
+ version-file = "src/hdx/pipelineutils/_version.py"
72
72
 
73
73
  [tool.hatch.build.targets.wheel]
74
74
  packages = ["src/hdx"]
@@ -96,7 +96,7 @@ ignore = [
96
96
  ]
97
97
 
98
98
  [tool.ruff.lint.isort]
99
- known-local-folder = ["hdx.python.pipelineutils"]
99
+ known-local-folder = ["hdx.pipelineutils"]
100
100
  known-third-party = [
101
101
  "hdx.api",
102
102
  "hdx.data",
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.0.2'
22
- __version_tuple__ = version_tuple = (0, 0, 2)
21
+ __version__ = version = '0.0.4'
22
+ __version_tuple__ = version_tuple = (0, 0, 4)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -10,8 +10,8 @@ def complete_admins(
10
10
  fuzzy_match: bool = True,
11
11
  ) -> tuple[int, list[str]]:
12
12
  """Use information from adm_codes to populate adm_names and from
13
- provider_adm_names to populate adm_codes with outptu of the admin level
14
- and arnings for unknown and mismatched p-codes. All provided lists
13
+ provider_adm_names to populate adm_codes with output of the admin level
14
+ and warnings for unknown and mismatched p-codes. All provided lists
15
15
  should be of the same length.
16
16
 
17
17
  Args:
@@ -7,7 +7,7 @@ from hdx.utilities.matching import get_code_from_name
7
7
  from hdx.utilities.path import script_dir_plus_file
8
8
  from hdx.utilities.text import normalise
9
9
 
10
- from hdx.python.pipelineutils.reader import Read
10
+ from hdx.pipelineutils.reader import Read
11
11
 
12
12
  logger = logging.getLogger(__name__)
13
13
 
@@ -32,6 +32,7 @@ initial_lookup:
32
32
  agriculture: "FSC"
33
33
  agua saneamiento e higiene: "WSH"
34
34
  all: "Intersectoral"
35
+ alojamiento: "SHL"
35
36
  alojamiento de emergencia: "SHL"
36
37
  alojamiento de emergencia shelter: "SHL"
37
38
  alojamiento energía y enseres: "SHL"
@@ -46,6 +47,7 @@ initial_lookup:
46
47
  cccm: "CCM"
47
48
  ccs: "CCM"
48
49
  cluster coordination: "CCM"
50
+ coord log support services: "CCM"
49
51
  coord services support: "CCM"
50
52
  coordinacion informacion: "CCM"
51
53
  coord support services: "CCM"
@@ -55,6 +57,7 @@ initial_lookup:
55
57
  cp: "PRO-CPN"
56
58
  css: "CCM"
57
59
  eah: "WSH"
60
+ early recovery livelihoods: "ERY"
58
61
  eau: "WSH"
59
62
  eau assainissement et hygiene: "WSH"
60
63
  eau hygiene: "WSH"
@@ -75,6 +78,7 @@ initial_lookup:
75
78
  food: "FSC"
76
79
  food safety: "FSC"
77
80
  food security and agriculture: "FSC"
81
+ food security and agriculture working group: "FSC"
78
82
  food security and livelihoods: "FSC"
79
83
  food security and nutrition: "FSC"
80
84
  food security livelihood: "FSC"
@@ -84,6 +88,7 @@ initial_lookup:
84
88
  gbv: "PRO-GBV"
85
89
  general protection: "PRO"
86
90
  global protection: "PRO"
91
+ grupo de trabajo de infraestructura y alojamientos temporales: "SHL"
87
92
  hlp: "PRO-HLP"
88
93
  housing land property: "PRO-HLP"
89
94
  humanitaire: "Hum"
@@ -106,6 +111,13 @@ initial_lookup:
106
111
  nutricion: "NUT"
107
112
  nutrition: "NUT"
108
113
  operatioanl presence water sanitation hygiene: "WSH"
114
+ operational capacity education in emergencies: "EDU"
115
+ operational capacity emergency shelter non food items: "SHL"
116
+ operational capacity food security agriculture: "FSC"
117
+ operational capacity health: "HEA"
118
+ operational capacity nutrition: "NUT"
119
+ operational capacity protection: "PRO"
120
+ operational capacity water sanitation hygiene: "WSH"
109
121
  operational presence education in emergencies: "EDU"
110
122
  operational presence emergency shelter non food items: "SHL"
111
123
  operational presence food security agriculture: "FSC"
@@ -115,6 +127,7 @@ initial_lookup:
115
127
  pro cpm: "PRO-CPN"
116
128
  pronna: "PRO-CPN"
117
129
  propg: "PRO"
130
+ proteccion accion contra minas: "PRO-MIN"
118
131
  proteccion infantil: "PRO-CPN"
119
132
  proteccion ninos ninas adolescentes: "PRO-CPN"
120
133
  proteccion violencia de genero: "PRO-GBV"
@@ -151,6 +164,7 @@ initial_lookup:
151
164
  same: "FSC"
152
165
  samv: "FSC"
153
166
  sante: "HEA"
167
+ secal: "FSC"
154
168
  securite alimentaire: "FSC"
155
169
  securite alimentaire et moyen dexistence: "FSC"
156
170
  seguridad alimentaria: "FSC"
@@ -160,6 +174,7 @@ initial_lookup:
160
174
  shelter: "SHL"
161
175
  shelter nfi: "SHL"
162
176
  shelter nfis: "SHL"
177
+ shelter non food items: "SHL"
163
178
  shelter and nfi: "SHL"
164
179
  shelter and nfis: "SHL"
165
180
  shelter and non food items: "SHL"
@@ -170,7 +185,9 @@ initial_lookup:
170
185
  telecommunications: "TEL"
171
186
  telecommunications durgence: "TEL"
172
187
  telecomunicaciones de emergencia: "TEL"
188
+ transferencias monetarias multiproposito: "Cash"
173
189
  transversal: "Multi"
190
+ transversal peas: "PRO-GBV"
174
191
  vbg: "PRO-GBV"
175
192
  violences basees sur le genre: "PRO-GBV"
176
193
  violence basee sur le genre: "PRO-GBV"
@@ -8,8 +8,8 @@ from hdx.api.locations import Locations
8
8
  from hdx.location.country import Country
9
9
  from hdx.utilities.dateparse import parse_date
10
10
 
11
- from hdx.python.pipelineutils import string_params_to_dict
12
- from hdx.python.pipelineutils.reader import Read
11
+ from hdx.pipelineutils import string_params_to_dict
12
+ from hdx.pipelineutils.reader import Read
13
13
 
14
14
 
15
15
  @pytest.fixture(scope="session")
@@ -28,7 +28,6 @@ def configuration(fixtures, input_folder):
28
28
  hdx_read_only=True,
29
29
  hdx_site="prod",
30
30
  user_agent="test",
31
- project_config_yaml=Path("tests") / "config" / "project_configuration.yaml",
32
31
  )
33
32
  Locations.set_validlocations(
34
33
  [
@@ -0,0 +1 @@
1
+ {"owner_org": "ac91832d-2477-4e1f-8520-9a591a7c3d69", "maintainer": "f240651d-52d6-4a3c-b229-b5dd0443d642", "relationships_as_object": [], "package_creator": "nafissah", "private": false, "dataset_date": "[2016-09-01T00:00:00 TO 2016-09-01T23:59:59]", "num_tags": 3, "solr_additions": "{\"countries\": [\"Benin\", \"Burkina Faso\", \"Cameroon\", \"Chad\", \"Gambia\", \"Mali\", \"Niger\", \"Nigeria\", \"Senegal\"]}", "id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "metadata_created": "2017-03-10T09:30:34.278280", "archived": false, "methodology_other": "Countries data aggregation. ", "metadata_modified": "2019-09-11T16:15:43.873688", "title": "Sahel : Humanitarian Needs Overview", "tags": [{"vocabulary_id": "b891512e-9516-4bf5-962a-7a289772a2a1", "state": "active", "display_name": "humanitarian needs overview - hno", "id": "bfd4300a-b35f-4c3d-a14b-05e0f040ad29", "name": "humanitarian needs overview - hno"}, {"vocabulary_id": "b891512e-9516-4bf5-962a-7a289772a2a1", "state": "active", "display_name": "people in need - pin", "id": "47dd0671-78c8-4359-9f96-5cfe4b86b48c", "name": "people in need - pin"}], "state": "active", "relationships_as_subject": [], "methodology": "Other", "version": null, "is_requestdata_type": false, "creator_user_id": "7711391a-7647-4432-a71b-294e7f901a2c", "type": "dataset", "has_showcases": true, "due_date": "2018-03-10T10:08:37", "dataset_preview": "first_resource", "num_resources": 5, "dataset_source": "Multiple organisations", "subnational": "1", "last_modified": "2017-03-10T10:08:37.690970", "groups": [{"display_name": "Benin", "description": "", "title": "Benin", "image_display_url": "", "id": "ben", "name": "ben"}, {"display_name": "Burkina Faso", "description": "", "title": "Burkina Faso", "image_display_url": "", "id": "bfa", "name": "bfa"}, {"display_name": "Cameroon", "description": "", "title": "Cameroon", "image_display_url": "", "id": "cmr", "name": "cmr"}, {"display_name": "Chad", "description": "", "title": "Chad", "image_display_url": "", "id": "tcd", "name": "tcd"}, {"display_name": "Gambia", "description": "", "title": "Gambia", "image_display_url": "", "id": "gmb", "name": "gmb"}, {"display_name": "Mali", "description": "", "title": "Mali", "image_display_url": "", "id": "mli", "name": "mli"}, {"display_name": "Niger", "description": "", "title": "Niger", "image_display_url": "", "id": "ner", "name": "ner"}, {"display_name": "Nigeria", "description": "", "title": "Nigeria", "image_display_url": "", "id": "nga", "name": "nga"}, {"display_name": "Senegal", "description": "", "title": "Senegal", "image_display_url": "", "id": "sen", "name": "sen"}], "license_id": "cc-by", "has_quickcharts": true, "has_geodata": false, "overdue_date": "2018-05-09T10:08:37", "total_res_downloads": 3083, "qa_completed": true, "name": "sahel-humanitarian-needs-overview", "isopen": true, "url": null, "notes": "This dataset is produced by the United Nations for the Coordination of Humanitarian Affairs (OCHA) in collaboration with humanitarian partners. It covers the period from January to December 2017 and was issued on December 2016.", "license_title": "Creative Commons Attribution International", "batch": "7c91002c-9c43-4c56-ac78-02a20ba9575e", "license_url": "http://www.opendefinition.org/licenses/cc-by", "pageviews_last_14_days": 4, "organization": {"description": "OCHA Regional Office for West and Central Africa (ROWCA).\r\n\r\nDans les pays de l'Afrique de l\u2019Ouest et du Centre, l'ins\u00e9curit\u00e9 alimentaire et la malnutrition s\u2019aggravent avec l'impact des catastrophes naturelles, le changement climatique, l\u2019\u00e9volution d\u00e9mographique, l'urbanisation mal g\u00e9r\u00e9e, les \u00e9pid\u00e9mies et les conflits violents.", "title": "OCHA West and Central Africa (ROWCA)", "created": "2014-09-26T15:15:48.616313", "approval_status": "approved", "is_organization": true, "state": "active", "image_url": "", "type": "organization", "id": "ac91832d-2477-4e1f-8520-9a591a7c3d69", "name": "ocha-rowca"}, "data_update_frequency": "365", "is_fresh": false, "update_status": "needs_update", "x_resource_grouping": [], "resources": [{"cache_last_updated": null, "package_id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "datastore_active": false, "id": "2527ac5b-66fe-46f0-8b9b-7086d2c4ddd3", "size": 1291, "metadata_modified": "2017-03-10T09:43:15.837967", "download_url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/2527ac5b-66fe-46f0-8b9b-7086d2c4ddd3/download/hno-2017-sahel-nutrition.csv", "state": "active", "hash": "", "description": "HNO 2017 Sahel - Nutrition ", "format": "CSV", "hdx_rel_url": "/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/2527ac5b-66fe-46f0-8b9b-7086d2c4ddd3/download/hno-2017-sahel-nutrition.csv", "mimetype_inner": null, "url_type": "upload", "originalHash": "1719647142", "mimetype": null, "cache_url": null, "name": "HNO -2017 -Sahel-nutrition.csv", "created": "2017-03-10T09:43:15.837967", "url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/2527ac5b-66fe-46f0-8b9b-7086d2c4ddd3/download/hno-2017-sahel-nutrition.csv", "tracking_summary[recent]": "0", "last_modified": "2017-03-10T10:08:37.690970", "tracking_summary[total]": "0", "position": 0, "resource_type": "file.upload"}, {"cache_last_updated": null, "package_id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "datastore_active": false, "id": "487e329d-3959-49bf-8e12-2675be7008ae", "size": 2306, "metadata_modified": "2017-03-10T09:46:28.411331", "download_url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/487e329d-3959-49bf-8e12-2675be7008ae/download/hno-2017-sahel-lake-chad-nutrition-as-of-25_11_2016.csv", "state": "active", "hash": "", "description": "HNO 2017 sahel - Lake Chad - Nutrition", "format": "CSV", "hdx_rel_url": "/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/487e329d-3959-49bf-8e12-2675be7008ae/download/hno-2017-sahel-lake-chad-nutrition-as-of-25_11_2016.csv", "mimetype_inner": null, "url_type": "upload", "originalHash": "97196323", "mimetype": null, "cache_url": null, "name": "HNO 2017 Sahel-Lake Chad Nutrition as of 25_11_2016.csv", "created": "2017-03-10T09:46:28.411331", "url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/487e329d-3959-49bf-8e12-2675be7008ae/download/hno-2017-sahel-lake-chad-nutrition-as-of-25_11_2016.csv", "last_modified": "2017-03-10T10:08:37.690970", "position": 1, "resource_type": "file.upload"}, {"cache_last_updated": null, "package_id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "datastore_active": false, "id": "d648d73f-8e66-461f-864f-0d66b19bcfa2", "size": 10348, "metadata_modified": "2017-03-10T10:01:38.716006", "download_url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d648d73f-8e66-461f-864f-0d66b19bcfa2/download/hno-2017-sahel-displacement_per_country.xlsx", "state": "active", "hash": "", "description": "HNO 2017 Sahel - Displacement per country", "format": "XLSX", "hdx_rel_url": "/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d648d73f-8e66-461f-864f-0d66b19bcfa2/download/hno-2017-sahel-displacement_per_country.xlsx", "mimetype_inner": null, "url_type": "upload", "originalHash": "1345568791", "mimetype": null, "cache_url": null, "name": "HNO-2017-Sahel- Displacement_per_country.xlsx", "created": "2017-03-10T10:01:38.716006", "url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d648d73f-8e66-461f-864f-0d66b19bcfa2/download/hno-2017-sahel-displacement_per_country.xlsx", "last_modified": "2017-03-10T10:08:37.690970", "position": 2, "resource_type": "file.upload"}, {"cache_last_updated": null, "package_id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "datastore_active": false, "id": "d9248be4-7bfb-4a81-a7aa-c035dcb737a2", "size": 10275, "metadata_modified": "2017-03-10T10:03:01.842877", "download_url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d9248be4-7bfb-4a81-a7aa-c035dcb737a2/download/hno-2017-sahel-people-in-need.xlsx", "state": "active", "hash": "", "description": "HNO 2017 Sahel - People in need", "format": "XLSX", "hdx_rel_url": "/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d9248be4-7bfb-4a81-a7aa-c035dcb737a2/download/hno-2017-sahel-people-in-need.xlsx", "mimetype_inner": null, "url_type": "upload", "originalHash": "97196323", "mimetype": null, "cache_url": null, "name": "HNO-2017-Sahel- People in need.xlsx", "created": "2017-03-10T10:03:01.842877", "url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/d9248be4-7bfb-4a81-a7aa-c035dcb737a2/download/hno-2017-sahel-people-in-need.xlsx", "last_modified": "2017-03-10T10:08:37.690970", "position": 3, "resource_type": "file.upload"}, {"cache_last_updated": null, "package_id": "47f6ef46-500f-421a-9fa2-fefd93facf95", "datastore_active": false, "id": "798b6a50-75da-4c8c-8034-4a4439630a3a", "size": 9430, "metadata_modified": "2017-03-10T10:04:40.479364", "download_url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/798b6a50-75da-4c8c-8034-4a4439630a3a/download/hno-2017-sahel-food-insecurity.xlsx", "state": "active", "hash": "", "description": "HNO 2017 Sahel - Food Insecurity", "format": "XLSX", "hdx_rel_url": "/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/798b6a50-75da-4c8c-8034-4a4439630a3a/download/hno-2017-sahel-food-insecurity.xlsx", "mimetype_inner": null, "url_type": "upload", "originalHash": "97196323", "mimetype": null, "cache_url": null, "name": "HNO-2017-Sahel-Food Insecurity.xlsx", "created": "2017-03-10T10:04:40.479364", "url": "https://data.humdata.org/dataset/47f6ef46-500f-421a-9fa2-fefd93facf95/resource/798b6a50-75da-4c8c-8034-4a4439630a3a/download/hno-2017-sahel-food-insecurity.xlsx", "last_modified": "2017-03-10T10:08:37.690970", "position": 4, "resource_type": "file.upload"}]}
@@ -1,10 +1,10 @@
1
1
  from hdx.location.adminlevel import AdminLevel
2
2
 
3
- from hdx.python.pipelineutils.hapi_admins import (
3
+ from hdx.pipelineutils.hapi_admins import (
4
4
  complete_admins,
5
5
  pad_admins,
6
6
  )
7
- from hdx.python.pipelineutils.reader import Read
7
+ from hdx.pipelineutils.reader import Read
8
8
 
9
9
 
10
10
  class TestAdmins:
@@ -1,5 +1,5 @@
1
- from hdx.python.pipelineutils.org_type import OrgType
2
- from hdx.python.pipelineutils.sector import Sector
1
+ from hdx.pipelineutils.org_type import OrgType
2
+ from hdx.pipelineutils.sector import Sector
3
3
 
4
4
 
5
5
  class TestLookup:
@@ -7,7 +7,7 @@ from hdx.utilities.dateparse import parse_date
7
7
  from hdx.utilities.downloader import Download
8
8
  from hdx.utilities.path import temp_dir
9
9
 
10
- from hdx.python.pipelineutils.reader import Read
10
+ from hdx.pipelineutils.reader import Read
11
11
 
12
12
 
13
13
  class TestReaders:
@@ -590,7 +590,7 @@ dev = [
590
590
  { name = "pre-commit" },
591
591
  { name = "pytest" },
592
592
  { name = "pytest-cov" },
593
- { name = "ruff", specifier = "==0.14.14" },
593
+ { name = "ruff", specifier = "==0.15.7" },
594
594
  ]
595
595
 
596
596
  [[package]]
@@ -1661,28 +1661,27 @@ wheels = [
1661
1661
 
1662
1662
  [[package]]
1663
1663
  name = "ruff"
1664
- version = "0.14.14"
1665
- source = { registry = "https://pypi.org/simple" }
1666
- sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" }
1667
- wheels = [
1668
- { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" },
1669
- { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" },
1670
- { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" },
1671
- { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" },
1672
- { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" },
1673
- { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" },
1674
- { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" },
1675
- { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" },
1676
- { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" },
1677
- { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" },
1678
- { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" },
1679
- { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" },
1680
- { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" },
1681
- { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" },
1682
- { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" },
1683
- { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" },
1684
- { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" },
1685
- { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" },
1664
+ version = "0.15.7"
1665
+ source = { registry = "https://pypi.org/simple" }
1666
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/22/9e4f66ee588588dc6c9af6a994e12d26e19efbe874d1a909d09a6dac7a59/ruff-0.15.7.tar.gz", hash = "sha256:04f1ae61fc20fe0b148617c324d9d009b5f63412c0b16474f3d5f1a1a665f7ac", size = 4601277, upload-time = "2026-03-19T16:26:22.605Z" }
1667
+ wheels = [
1668
+ { url = "https://files.pythonhosted.org/packages/41/2f/0b08ced94412af091807b6119ca03755d651d3d93a242682bf020189db94/ruff-0.15.7-py3-none-linux_armv6l.whl", hash = "sha256:a81cc5b6910fb7dfc7c32d20652e50fa05963f6e13ead3c5915c41ac5d16668e", size = 10489037, upload-time = "2026-03-19T16:26:32.47Z" },
1669
+ { url = "https://files.pythonhosted.org/packages/91/4a/82e0fa632e5c8b1eba5ee86ecd929e8ff327bbdbfb3c6ac5d81631bef605/ruff-0.15.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:722d165bd52403f3bdabc0ce9e41fc47070ac56d7a91b4e0d097b516a53a3477", size = 10955433, upload-time = "2026-03-19T16:27:00.205Z" },
1670
+ { url = "https://files.pythonhosted.org/packages/ab/10/12586735d0ff42526ad78c049bf51d7428618c8b5c467e72508c694119df/ruff-0.15.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:7fbc2448094262552146cbe1b9643a92f66559d3761f1ad0656d4991491af49e", size = 10269302, upload-time = "2026-03-19T16:26:26.183Z" },
1671
+ { url = "https://files.pythonhosted.org/packages/eb/5d/32b5c44ccf149a26623671df49cbfbd0a0ae511ff3df9d9d2426966a8d57/ruff-0.15.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b39329b60eba44156d138275323cc726bbfbddcec3063da57caa8a8b1d50adf", size = 10607625, upload-time = "2026-03-19T16:27:03.263Z" },
1672
+ { url = "https://files.pythonhosted.org/packages/5d/f1/f0001cabe86173aaacb6eb9bb734aa0605f9a6aa6fa7d43cb49cbc4af9c9/ruff-0.15.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:87768c151808505f2bfc93ae44e5f9e7c8518943e5074f76ac21558ef5627c85", size = 10324743, upload-time = "2026-03-19T16:27:09.791Z" },
1673
+ { url = "https://files.pythonhosted.org/packages/7a/87/b8a8f3d56b8d848008559e7c9d8bf367934d5367f6d932ba779456e2f73b/ruff-0.15.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb0511670002c6c529ec66c0e30641c976c8963de26a113f3a30456b702468b0", size = 11138536, upload-time = "2026-03-19T16:27:06.101Z" },
1674
+ { url = "https://files.pythonhosted.org/packages/e4/f2/4fd0d05aab0c5934b2e1464784f85ba2eab9d54bffc53fb5430d1ed8b829/ruff-0.15.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0d19644f801849229db8345180a71bee5407b429dd217f853ec515e968a6912", size = 11994292, upload-time = "2026-03-19T16:26:48.718Z" },
1675
+ { url = "https://files.pythonhosted.org/packages/64/22/fc4483871e767e5e95d1622ad83dad5ebb830f762ed0420fde7dfa9d9b08/ruff-0.15.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4806d8e09ef5e84eb19ba833d0442f7e300b23fe3f0981cae159a248a10f0036", size = 11398981, upload-time = "2026-03-19T16:26:54.513Z" },
1676
+ { url = "https://files.pythonhosted.org/packages/b0/99/66f0343176d5eab02c3f7fcd2de7a8e0dd7a41f0d982bee56cd1c24db62b/ruff-0.15.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dce0896488562f09a27b9c91b1f58a097457143931f3c4d519690dea54e624c5", size = 11242422, upload-time = "2026-03-19T16:26:29.277Z" },
1677
+ { url = "https://files.pythonhosted.org/packages/5d/3a/a7060f145bfdcce4c987ea27788b30c60e2c81d6e9a65157ca8afe646328/ruff-0.15.7-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1852ce241d2bc89e5dc823e03cff4ce73d816b5c6cdadd27dbfe7b03217d2a12", size = 11232158, upload-time = "2026-03-19T16:26:42.321Z" },
1678
+ { url = "https://files.pythonhosted.org/packages/a7/53/90fbb9e08b29c048c403558d3cdd0adf2668b02ce9d50602452e187cd4af/ruff-0.15.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5f3e4b221fb4bd293f79912fc5e93a9063ebd6d0dcbd528f91b89172a9b8436c", size = 10577861, upload-time = "2026-03-19T16:26:57.459Z" },
1679
+ { url = "https://files.pythonhosted.org/packages/2f/aa/5f486226538fe4d0f0439e2da1716e1acf895e2a232b26f2459c55f8ddad/ruff-0.15.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b15e48602c9c1d9bdc504b472e90b90c97dc7d46c7028011ae67f3861ceba7b4", size = 10327310, upload-time = "2026-03-19T16:26:35.909Z" },
1680
+ { url = "https://files.pythonhosted.org/packages/99/9e/271afdffb81fe7bfc8c43ba079e9d96238f674380099457a74ccb3863857/ruff-0.15.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1b4705e0e85cedc74b0a23cf6a179dbb3df184cb227761979cc76c0440b5ab0d", size = 10840752, upload-time = "2026-03-19T16:26:45.723Z" },
1681
+ { url = "https://files.pythonhosted.org/packages/bf/29/a4ae78394f76c7759953c47884eb44de271b03a66634148d9f7d11e721bd/ruff-0.15.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:112c1fa316a558bb34319282c1200a8bf0495f1b735aeb78bfcb2991e6087580", size = 11336961, upload-time = "2026-03-19T16:26:39.076Z" },
1682
+ { url = "https://files.pythonhosted.org/packages/26/6b/8786ba5736562220d588a2f6653e6c17e90c59ced34a2d7b512ef8956103/ruff-0.15.7-py3-none-win32.whl", hash = "sha256:6d39e2d3505b082323352f733599f28169d12e891f7dd407f2d4f54b4c2886de", size = 10582538, upload-time = "2026-03-19T16:26:15.992Z" },
1683
+ { url = "https://files.pythonhosted.org/packages/2b/e9/346d4d3fffc6871125e877dae8d9a1966b254fbd92a50f8561078b88b099/ruff-0.15.7-py3-none-win_amd64.whl", hash = "sha256:4d53d712ddebcd7dace1bc395367aec12c057aacfe9adbb6d832302575f4d3a1", size = 11755839, upload-time = "2026-03-19T16:26:19.897Z" },
1684
+ { url = "https://files.pythonhosted.org/packages/8f/e8/726643a3ea68c727da31570bde48c7a10f1aa60eddd628d94078fec586ff/ruff-0.15.7-py3-none-win_arm64.whl", hash = "sha256:18e8d73f1c3fdf27931497972250340f92e8c861722161a9caeb89a58ead6ed2", size = 11023304, upload-time = "2026-03-19T16:26:51.669Z" },
1686
1685
  ]
1687
1686
 
1688
1687
  [[package]]