hdx-python-api 6.7.3__py3-none-any.whl → 6.7.5__py3-none-any.whl

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.
hdx/api/_version.py CHANGED
@@ -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 = '6.7.3'
22
- __version_tuple__ = version_tuple = (6, 7, 3)
21
+ __version__ = version = '6.7.5'
22
+ __version_tuple__ = version_tuple = (6, 7, 5)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -4,12 +4,15 @@ from hdx.api.configuration import Configuration
4
4
  from hdx.data.hdxobject import HDXError
5
5
 
6
6
 
7
- def _call_stats_action(action: str, configuration: Configuration | None) -> dict:
7
+ def _call_stats_action(
8
+ action: str, configuration: Configuration | None, data: dict | None = None
9
+ ) -> dict:
8
10
  """Call an HDX statistics action
9
11
 
10
12
  Args:
11
13
  action: CKAN action name
12
14
  configuration: HDX configuration. Defaults to global configuration.
15
+ data: Parameters to pass to the action. Defaults to None.
13
16
 
14
17
  Returns:
15
18
  Statistics dictionary
@@ -17,7 +20,7 @@ def _call_stats_action(action: str, configuration: Configuration | None) -> dict
17
20
  if configuration is None:
18
21
  configuration = Configuration.read()
19
22
  try:
20
- return configuration.call_remoteckan(action, {})
23
+ return configuration.call_remoteckan(action, data or {})
21
24
  except Exception as e:
22
25
  raise HDXError(f"Failed when trying to call {action}!") from e
23
26
 
@@ -45,3 +48,39 @@ def push_general_stats(configuration: Configuration | None = None) -> dict:
45
48
  Statistics that were pushed
46
49
  """
47
50
  return _call_stats_action("hdx_push_general_stats", configuration)
51
+
52
+
53
+ def get_user_statistics(
54
+ start_date: str | None = None,
55
+ end_date: str | None = None,
56
+ configuration: Configuration | None = None,
57
+ ) -> dict:
58
+ """Get the number of activities of each active user on HDX, optionally
59
+ between start and end dates. Requires sysadmin.
60
+
61
+ Args:
62
+ start_date: Count activities on or after this date eg. 2026-01-01. Defaults to None.
63
+ end_date: Count activities on or before this date. Defaults to None.
64
+ configuration: HDX configuration. Defaults to global configuration.
65
+
66
+ Returns:
67
+ Dictionary from user id to dictionary with keys id, name and no_of_activities
68
+ """
69
+ data = {}
70
+ if start_date:
71
+ data["start_date"] = start_date
72
+ if end_date:
73
+ data["end_date"] = end_date
74
+ return _call_stats_action("hdx_user_statistics", configuration, data)
75
+
76
+
77
+ def get_organization_statistics(configuration: Configuration | None = None) -> dict:
78
+ """Get active and inactive organizations on HDX. Requires sysadmin.
79
+
80
+ Args:
81
+ configuration: HDX configuration. Defaults to global configuration.
82
+
83
+ Returns:
84
+ Dictionary with keys active_organizations and inactive_organizations
85
+ """
86
+ return _call_stats_action("hdx_organization_statistics", configuration)
hdx/data/dataset.py CHANGED
@@ -148,6 +148,13 @@ class Dataset(HDXObject):
148
148
  "autocomplete": "package_autocomplete",
149
149
  "create_default_views": "package_create_default_resource_views",
150
150
  "fs_check_info": "fs_check_info_show",
151
+ "fs_check_reset": "hdx_fs_check_package_reset",
152
+ "shape_info": "shape_info_show",
153
+ "recommend_tags": "hdx_recommend_tags",
154
+ "allowed_for_datastore": "hdx_is_package_allowed_for_datastore",
155
+ "push_to_datastore": "hdx_push_resource_to_datastore",
156
+ "qa_completed": "hdx_mark_qa_completed",
157
+ "qa_revise_resources": "hdx_qa_package_revise_resource",
151
158
  }
152
159
 
153
160
  def __setitem__(self, key: Any, value: Any) -> None:
@@ -2347,6 +2354,136 @@ class Dataset(HDXObject):
2347
2354
  return result
2348
2355
  return []
2349
2356
 
2357
+ def _set_from_package(self, package: dict) -> None:
2358
+ """Set the dataset's metadata and resources from a package metadata
2359
+ dictionary returned by HDX
2360
+
2361
+ Args:
2362
+ package: Package metadata dictionary
2363
+
2364
+ Returns:
2365
+ None
2366
+ """
2367
+ self.data = package
2368
+ self.init_resources()
2369
+ self.separate_resources()
2370
+
2371
+ def reset_fs_check(self, key: str = "fs_check_info") -> None:
2372
+ """Clear a file structure check field of all the dataset's resources
2373
+ in HDX. Requires sysadmin or permission to manage QA.
2374
+
2375
+ Args:
2376
+ key: Resource field to clear. Defaults to fs_check_info.
2377
+
2378
+ Returns:
2379
+ None
2380
+ """
2381
+ result = self._write_to_hdx(
2382
+ "fs_check_reset", {"package_id": self.data["id"], "key": key}, "package_id"
2383
+ )
2384
+ self._set_from_package(result["package"])
2385
+
2386
+ def set_qa_completed(self, qa_completed: bool) -> None:
2387
+ """Mark QA of the dataset in HDX as completed or not. Requires
2388
+ sysadmin or permission to manage QA.
2389
+
2390
+ Args:
2391
+ qa_completed: Whether QA is completed
2392
+
2393
+ Returns:
2394
+ None
2395
+ """
2396
+ result = self._write_to_hdx(
2397
+ "qa_completed", {"id": self.data["id"], "qa_completed": qa_completed}, "id"
2398
+ )
2399
+ self._set_from_package(result["package"])
2400
+
2401
+ def qa_revise_resources(self, key: str, value: Any) -> None:
2402
+ """Set a QA field of all the dataset's resources in HDX. Requires
2403
+ sysadmin or permission to manage QA.
2404
+
2405
+ Args:
2406
+ key: Resource field eg. pii
2407
+ value: Value to set
2408
+
2409
+ Returns:
2410
+ None
2411
+ """
2412
+ result = self._write_to_hdx(
2413
+ "qa_revise_resources",
2414
+ {"id": self.data["id"], "key": key, "value": value},
2415
+ "id",
2416
+ )
2417
+ self._set_from_package(result["package"])
2418
+
2419
+ def get_shape_info(self) -> list[dict]:
2420
+ """Get geopreview shape information for the dataset's resources from
2421
+ HDX
2422
+
2423
+ Returns:
2424
+ List of dictionaries from resource name to shape information
2425
+ """
2426
+ success, result = self._read_from_hdx(
2427
+ "dataset",
2428
+ self.get_name_or_id(prefer_name=False),
2429
+ "id",
2430
+ self.actions()["shape_info"],
2431
+ )
2432
+ if success:
2433
+ return result
2434
+ return []
2435
+
2436
+ def get_recommended_tags(self) -> list[str]:
2437
+ """Get tags recommended by HDX for the dataset based on its title and
2438
+ organization. Tags are ordered from most to least recommended.
2439
+
2440
+ Returns:
2441
+ List of recommended tags
2442
+ """
2443
+ data = {"title": self.data.get("title")}
2444
+ organization = self.data.get("owner_org")
2445
+ if organization:
2446
+ data["organization"] = organization
2447
+ try:
2448
+ result = self.configuration.call_remoteckan(
2449
+ self.actions()["recommend_tags"], data
2450
+ )
2451
+ except Exception as e:
2452
+ raise HDXError("Failed when trying to get recommended tags!") from e
2453
+ return [tag["name"] for tag in result]
2454
+
2455
+ def is_allowed_for_datastore(self) -> bool:
2456
+ """Return if the dataset or its organization is in HDX's allowlist for
2457
+ automatic loading of resources into the datastore
2458
+
2459
+ Returns:
2460
+ Whether dataset is allowed for datastore
2461
+ """
2462
+ success, result = self._read_from_hdx(
2463
+ "dataset",
2464
+ self.data["id"],
2465
+ "package_id",
2466
+ self.actions()["allowed_for_datastore"],
2467
+ )
2468
+ if success:
2469
+ return result
2470
+ logger.debug(result)
2471
+ return False
2472
+
2473
+ def push_to_datastore(self) -> bool:
2474
+ """Submit all the dataset's CSV resources to DataPusher+ using HDX's
2475
+ wrapper action. Requires sysadmin.
2476
+
2477
+ Returns:
2478
+ True if submitted, False if not (eg. no CSV resources)
2479
+ """
2480
+ result = self._write_to_hdx(
2481
+ "push_to_datastore", {"dataset_id": self.data["id"]}, "dataset_id"
2482
+ )
2483
+ if not result["success"]:
2484
+ logger.debug(result["message"])
2485
+ return result["success"]
2486
+
2350
2487
  def generate_resource(
2351
2488
  self,
2352
2489
  folder: Path | str,
hdx/data/location.py CHANGED
@@ -43,6 +43,8 @@ class Location(HDXObject):
43
43
  "delete": "group_delete",
44
44
  "list": "group_list",
45
45
  "autocomplete": "group_autocomplete",
46
+ "data_grid": "hdx_datagrid_show",
47
+ "invalidate_data_grid": "invalidate_data_completeness_for_location",
46
48
  }
47
49
 
48
50
  @classmethod
@@ -218,6 +220,47 @@ class Location(HDXObject):
218
220
  if len(group["name"]) == 3 and group.get("data_completeness") == "active"
219
221
  )
220
222
 
223
+ @staticmethod
224
+ def get_data_grid(
225
+ iso3: str, configuration: Configuration | None = None
226
+ ) -> dict | None:
227
+ """Get the Data Grid of a country. The dictionary has keys including
228
+ title, date, stats and categories. Each category has subcategories,
229
+ each with a list of datasets. Complementary datasets have
230
+ is_complementary set to True. Requires sysadmin.
231
+
232
+ Args:
233
+ iso3: Country ISO 3-letter code
234
+ configuration: HDX configuration. Defaults to global configuration.
235
+
236
+ Returns:
237
+ Data Grid dictionary or None if not found
238
+ """
239
+ location = Location(configuration=configuration)
240
+ success, result = location._read_from_hdx(
241
+ "location", iso3.lower(), "id", location.actions()["data_grid"]
242
+ )
243
+ if success:
244
+ return result
245
+ logger.debug(result)
246
+ return None
247
+
248
+ @staticmethod
249
+ def invalidate_data_grid(
250
+ iso3: str, configuration: Configuration | None = None
251
+ ) -> None:
252
+ """Clear HDX's cached Data Grid of a country. Requires sysadmin.
253
+
254
+ Args:
255
+ iso3: Country ISO 3-letter code
256
+ configuration: HDX configuration. Defaults to global configuration.
257
+
258
+ Returns:
259
+ None
260
+ """
261
+ location = Location(configuration=configuration)
262
+ location._write_to_hdx("invalidate_data_grid", {"name": iso3.lower()}, "name")
263
+
221
264
  def get_activities(self, all_pages: bool = False, **kwargs: Any) -> list[Activity]:
222
265
  """Get the activity stream of this location. One page of results (whose size
223
266
  is given by limit) is returned unless all_pages is True.
hdx/data/resource.py CHANGED
@@ -74,6 +74,13 @@ class Resource(HDXObject):
74
74
  "datastore_search_sql": "datastore_search_sql",
75
75
  "datapusher_submit": "datapusher_submit",
76
76
  "datapusher_status": "datapusher_status",
77
+ "push_to_datastore": "hdx_push_resource_to_datastore",
78
+ "p_coded": "hdx_p_coded_resource_update",
79
+ "in_hapi": "hdx_mark_resource_in_hapi",
80
+ "in_quarantine": "hdx_mark_resource_in_quarantine",
81
+ "qa_patch": "hdx_qa_resource_patch",
82
+ "fs_check_revise": "hdx_fs_check_resource_revise",
83
+ "fs_check_reset": "hdx_fs_check_resource_reset",
77
84
  }
78
85
 
79
86
  def update_from_yaml(
@@ -1113,6 +1120,20 @@ class Resource(HDXObject):
1113
1120
  "resource_id",
1114
1121
  )
1115
1122
 
1123
+ def push_to_datastore(self) -> bool:
1124
+ """Submit the resource to DataPusher+ using HDX's wrapper action.
1125
+ Unlike submit_to_datapusher, this requires sysadmin.
1126
+
1127
+ Returns:
1128
+ True if submitted, False if not
1129
+ """
1130
+ result = self._write_to_hdx(
1131
+ "push_to_datastore", {"resource_id": self.data["id"]}, "resource_id"
1132
+ )
1133
+ if not result["success"]:
1134
+ logger.debug(result["message"])
1135
+ return result["success"]
1136
+
1116
1137
  def get_datapusher_status(self) -> dict | None:
1117
1138
  """Get the status of the resource's latest DataPusher+ job
1118
1139
 
@@ -1304,6 +1325,159 @@ class Resource(HDXObject):
1304
1325
  return json.loads(fs_check_info)
1305
1326
  return fs_check_info
1306
1327
 
1328
+ def _set_from_package(self, package: dict) -> None:
1329
+ """Set the resource's metadata from the matching resource in a package
1330
+ metadata dictionary returned by HDX
1331
+
1332
+ Args:
1333
+ package: Package metadata dictionary
1334
+
1335
+ Returns:
1336
+ None
1337
+ """
1338
+ for resource in package.get("resources", []):
1339
+ if resource["id"] == self.data["id"]:
1340
+ self.data = resource
1341
+ return
1342
+
1343
+ def revise_fs_check(self, key: str, value: Any) -> None:
1344
+ """Set a file structure check field of the resource in HDX. If key is
1345
+ fs_check_info and value is a dictionary, it is appended to the
1346
+ existing check events (the last 20 are kept) rather than replacing
1347
+ them. Requires sysadmin or permission to manage QA.
1348
+
1349
+ Args:
1350
+ key: Resource field eg. fs_check_info
1351
+ value: Value to set
1352
+
1353
+ Returns:
1354
+ None
1355
+ """
1356
+ result = self._write_to_hdx(
1357
+ "fs_check_revise",
1358
+ {
1359
+ "package_id": self.data["package_id"],
1360
+ "id": self.data["id"],
1361
+ "key": key,
1362
+ "value": value,
1363
+ },
1364
+ "id",
1365
+ )
1366
+ self._set_from_package(result["package"])
1367
+
1368
+ def reset_fs_check(self, key: str = "fs_check_info") -> None:
1369
+ """Clear a file structure check field of the resource in HDX. Requires
1370
+ sysadmin or permission to manage QA.
1371
+
1372
+ Args:
1373
+ key: Resource field to clear. Defaults to fs_check_info.
1374
+
1375
+ Returns:
1376
+ None
1377
+ """
1378
+ result = self._write_to_hdx(
1379
+ "fs_check_reset",
1380
+ {"package_id": self.data["package_id"], "id": self.data["id"], "key": key},
1381
+ "id",
1382
+ )
1383
+ self._set_from_package(result["package"])
1384
+
1385
+ def is_p_coded(self) -> bool | None:
1386
+ """Return if the resource is marked as containing p-codes
1387
+
1388
+ Returns:
1389
+ Whether resource is p-coded or None if not set
1390
+ """
1391
+ p_coded = self.data.get("p_coded")
1392
+ if p_coded is None:
1393
+ return None
1394
+ if isinstance(p_coded, str):
1395
+ return p_coded.lower() == "true"
1396
+ return p_coded
1397
+
1398
+ def set_p_coded(self, p_coded: bool) -> None:
1399
+ """Mark the resource in HDX as containing p-codes or not. Requires
1400
+ sysadmin or permission to manage p-codes.
1401
+
1402
+ Args:
1403
+ p_coded: Whether resource is p-coded
1404
+
1405
+ Returns:
1406
+ None
1407
+ """
1408
+ self.data = self._write_to_hdx(
1409
+ "p_coded", {"id": self.data["id"], "p_coded": p_coded}, "id"
1410
+ )
1411
+
1412
+ def is_in_hapi(self) -> bool:
1413
+ """Return if the resource is marked as being in HAPI
1414
+
1415
+ Returns:
1416
+ Whether resource is in HAPI
1417
+ """
1418
+ return self.data.get("in_hapi") == "yes"
1419
+
1420
+ def set_in_hapi(self, in_hapi: bool) -> None:
1421
+ """Mark the resource in HDX as being in HAPI or not. Requires sysadmin
1422
+ or permission to manage the in HAPI flag.
1423
+
1424
+ Args:
1425
+ in_hapi: Whether resource is in HAPI
1426
+
1427
+ Returns:
1428
+ None
1429
+ """
1430
+ self.data = self._write_to_hdx(
1431
+ "in_hapi",
1432
+ {"id": self.data["id"], "in_hapi": "yes" if in_hapi else "no-data"},
1433
+ "id",
1434
+ )
1435
+
1436
+ def is_in_quarantine(self) -> bool:
1437
+ """Return if the resource is in quarantine
1438
+
1439
+ Returns:
1440
+ Whether resource is in quarantine
1441
+ """
1442
+ in_quarantine = self.data.get("in_quarantine", False)
1443
+ if isinstance(in_quarantine, str):
1444
+ return in_quarantine.lower() == "true"
1445
+ return in_quarantine
1446
+
1447
+ def set_in_quarantine(self, in_quarantine: bool) -> None:
1448
+ """Put the resource in HDX in quarantine or take it out. Quarantining
1449
+ also removes the resource's shape_info and geopreview. Requires
1450
+ sysadmin or permission to manage QA.
1451
+
1452
+ Args:
1453
+ in_quarantine: Whether resource is in quarantine
1454
+
1455
+ Returns:
1456
+ None
1457
+ """
1458
+ self.data = self._write_to_hdx(
1459
+ "in_quarantine",
1460
+ {
1461
+ "id": self.data["id"],
1462
+ "in_quarantine": "true" if in_quarantine else "false",
1463
+ },
1464
+ "id",
1465
+ )
1466
+
1467
+ def qa_patch(self, **kwargs: Any) -> None:
1468
+ """Patch QA fields of the resource in HDX eg. pii, sdc_report_flag,
1469
+ broken_link. Requires sysadmin or permission to manage QA.
1470
+
1471
+ Args:
1472
+ **kwargs: Resource fields to patch
1473
+
1474
+ Returns:
1475
+ None
1476
+ """
1477
+ self.data = self._write_to_hdx(
1478
+ "qa_patch", {"id": self.data["id"], **kwargs}, "id"
1479
+ )
1480
+
1307
1481
  def is_marked_data_updated(self) -> bool:
1308
1482
  """Return if the resource's data is marked to be updated
1309
1483
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hdx-python-api
3
- Version: 6.7.3
3
+ Version: 6.7.5
4
4
  Summary: HDX Python API for interacting with the Humanitarian Data Exchange
5
5
  Project-URL: Homepage, https://github.com/OCHA-DAP/hdx-python-api
6
6
  Author: Michael Rans
@@ -28,8 +28,8 @@ Requires-Python: >=3.10
28
28
  Requires-Dist: ckanapi>=4.11
29
29
  Requires-Dist: defopt>=7.0.0
30
30
  Requires-Dist: email-validator
31
- Requires-Dist: hdx-python-country>=4.2.3
32
- Requires-Dist: hdx-python-utilities>=4.2.1
31
+ Requires-Dist: hdx-python-country>=4.2.4
32
+ Requires-Dist: hdx-python-utilities>=4.2.3
33
33
  Requires-Dist: makefun
34
34
  Requires-Dist: requests
35
35
  Provides-Extra: docs
@@ -1,5 +1,5 @@
1
1
  hdx/api/__init__.py,sha256=11ozJKiUsqDCZ3_mcAHhGYUyGK_Unl54djVSBBExFB4,59
2
- hdx/api/_version.py,sha256=O7pvZmvSWCf7hJuRAdEJClOMPVWnCFeffbn1fVR7KII,520
2
+ hdx/api/_version.py,sha256=COiFxfgYaSnJUzlrh0vxGDx6Wn8d0Gbr-1uNuoVlOao,520
3
3
  hdx/api/configuration.py,sha256=9WvuVI-3th2Dv70_t_4VoyrlJwB_9qUSN5_zUKbp4sQ,23805
4
4
  hdx/api/hdx_base_configuration.yaml,sha256=jj2t5b7NnI499rHVwOjj3Q5BAjE8i7NDGVKnWZ5P5-4,2222
5
5
  hdx/api/locations.py,sha256=bFl_cKz_AEQzkE_xWOkrRlUQ0GT2LMPSk-G_LsbV-Ns,4099
@@ -9,15 +9,15 @@ hdx/api/utilities/date_helper.py,sha256=sXxjRtXz-2rpBVZBbJAk80gfjpYKl_AtHplWr-rn
9
9
  hdx/api/utilities/filestore_helper.py,sha256=0FcUpGHpYlAzlNDpDxdXbSqV6VHFfGCLakCmK37hieU,6917
10
10
  hdx/api/utilities/hdx_error_handler.py,sha256=x1rb2qBO0C6CJjqToSFj_XB1F3pf3nHpA8otxXfTFzA,8711
11
11
  hdx/api/utilities/hdx_state.py,sha256=KzrK0A-H5R6cRPqwF4d23_S_zfIa1ow4K5u46FesGmY,2442
12
- hdx/api/utilities/hdx_stats.py,sha256=Vc3CesIbROeumOmSyVItmUaGjFv0MF4r4mlKbpI0rxo,1474
12
+ hdx/api/utilities/hdx_stats.py,sha256=JlEcF9LN-OjcVeh6C0te-nAlcO7W-JIpD5JJWTiWxs0,2847
13
13
  hdx/api/utilities/url_utils.py,sha256=Pb4r-BAqIHYmeoB_i7QjutDp6nOAUh_OHvCtiNLda3Y,4534
14
14
  hdx/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  hdx/data/activity.py,sha256=YNa7hAgsMP96EIUX7UMInxAXnJ8TynE1KpecRrv8Vso,9200
16
- hdx/data/dataset.py,sha256=BdNPybJklyhI_IeyY0QGrohau6yTEv-jeFVFLjs5CeQ,101301
16
+ hdx/data/dataset.py,sha256=-GQO08PK8u19O0qRWttg3AuPskPCwjffcE2mPq-7dQE,105903
17
17
  hdx/data/hdxobject.py,sha256=EG5KkVpi-yF6m6HVF79EqDneq1W7mo5M-bPJHG79T0I,28383
18
- hdx/data/location.py,sha256=CvDGfzQnPIB0aT7WOc60zhnAfvDFMJFcrbfacOsYR-U,9598
18
+ hdx/data/location.py,sha256=UJPGKc8euAYFJsUFkdQtViLUwqNWYOWwaLELApAMHk4,11168
19
19
  hdx/data/organization.py,sha256=IRen2F2NsXLC8r-PVTS9eQp7LTn_44OcDUa1S7SCKiQ,13140
20
- hdx/data/resource.py,sha256=KuO9UB6OP7G2rcKcwTCjdfseQpcub-aK6LscXtI8IM8,50909
20
+ hdx/data/resource.py,sha256=QDQJp7XoCDn9DmyWPgA2YCn8Z4HGwezEkFyae_YlFKI,56507
21
21
  hdx/data/resource_matcher.py,sha256=Yzk9pWa4zk1p09m6zcZMj0XZf5Y16Pa3KToOdUt7rP8,4247
22
22
  hdx/data/resource_view.py,sha256=GcYkh0iDAe6_m2ErY_A6i3Z7ZFX949eGt1TLnLZv_8s,7346
23
23
  hdx/data/showcase.py,sha256=vnRZ45xd9Ct65eFQkWZtMIJPFifZfKOrH4obO5D5Pvc,14062
@@ -27,7 +27,7 @@ hdx/facades/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  hdx/facades/infer_arguments.py,sha256=DvyDuozfOPmoaV7HjhQySojGIrMWW9nos31auQBVVl8,4032
28
28
  hdx/facades/keyword_arguments.py,sha256=aVapHCfqBO6H7xxBgTdK9ISdgrBFsNypPDWihfQ3edU,1125
29
29
  hdx/facades/simple.py,sha256=QWsBkaHG_UM6X3Zu2u3LWVOQzeR24q-EUClrfsL_mkM,1064
30
- hdx_python_api-6.7.3.dist-info/METADATA,sha256=UI9iCTmytO8zgeetqK5dfGaRHW3d4qzu0ex1r8WE8c0,4946
31
- hdx_python_api-6.7.3.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
32
- hdx_python_api-6.7.3.dist-info/licenses/LICENSE,sha256=wc-4GpMn-ODs-U_bTe1YCiPVgvcjzrpYOx2wPuyAeII,1079
33
- hdx_python_api-6.7.3.dist-info/RECORD,,
30
+ hdx_python_api-6.7.5.dist-info/METADATA,sha256=C2mT_Q4SPSXjrlmzR_lHKSCdrO4YwxJPaMFHgsVcHHc,4946
31
+ hdx_python_api-6.7.5.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
32
+ hdx_python_api-6.7.5.dist-info/licenses/LICENSE,sha256=wc-4GpMn-ODs-U_bTe1YCiPVgvcjzrpYOx2wPuyAeII,1079
33
+ hdx_python_api-6.7.5.dist-info/RECORD,,