NGPIris 5.4.0__tar.gz → 5.4.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.
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/cli/__init__.py +1 -1
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hcp/hcp.py +28 -10
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/PKG-INFO +3 -2
- {ngpiris-5.4.0 → ngpiris-5.4.1}/PKG-INFO +3 -2
- {ngpiris-5.4.0 → ngpiris-5.4.1}/pyproject.toml +1 -1
- {ngpiris-5.4.0 → ngpiris-5.4.1}/LICENSE +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/MANIFEST.in +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/__init__.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hci/__init__.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hci/exceptions.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hci/hci.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hci/helpers.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hcp/__init__.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hcp/exceptions.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hcp/helpers.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/hcp/statistics.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/parse_credentials/__init__.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/parse_credentials/parse_credentials.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/utils/__init__.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris/utils/utils.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/SOURCES.txt +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/dependency_links.txt +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/entry_points.txt +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/requires.txt +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/NGPIris.egg-info/top_level.txt +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/README.md +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/IRIS_5_changelog.md +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/Makefile +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.cli.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.hci.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.hcp.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.parse_credentials.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/NGPIris.utils.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/Tutorial.md +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/conf.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/index.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/make.bat +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/docs/modules.rst +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/setup.cfg +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/80MB_test_file +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/a folder of data/80MB_test_file_0 +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/a folder of data/80MB_test_file_1 +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/complete_creds_0.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/complete_creds_1.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/complete_creds_2.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/incomplete_creds_0.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/incomplete_creds_1.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/incomplete_creds_2.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/incomplete_creds_3.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/data/incomplete_creds_4.json +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/test_hci.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/test_hcp.py +0 -0
- {ngpiris-5.4.0 → ngpiris-5.4.1}/tests/test_parse_credentials.py +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
from NGPIris.parse_credentials import CredentialsHandler
|
|
3
2
|
from NGPIris.hcp.helpers import (
|
|
4
3
|
raise_path_error,
|
|
@@ -41,7 +40,6 @@ from rapidfuzz import (
|
|
|
41
40
|
from requests import get
|
|
42
41
|
from urllib3 import disable_warnings
|
|
43
42
|
from tqdm import tqdm
|
|
44
|
-
|
|
45
43
|
from bitmath import TiB, Byte
|
|
46
44
|
|
|
47
45
|
from typing import Generator
|
|
@@ -258,22 +256,33 @@ class HCPHandler:
|
|
|
258
256
|
return list_of_buckets
|
|
259
257
|
|
|
260
258
|
@check_mounted
|
|
261
|
-
def list_objects(
|
|
259
|
+
def list_objects(
|
|
260
|
+
self,
|
|
261
|
+
path_key : str = "",
|
|
262
|
+
list_all_bucket_objects : bool = False,
|
|
263
|
+
name_only : bool = False,
|
|
264
|
+
files_only : bool = False
|
|
265
|
+
) -> Generator:
|
|
262
266
|
"""
|
|
263
267
|
List all objects in the mounted bucket as a generator. If one wishes to
|
|
264
268
|
get the result as a list, use :py:function:`list` to type cast the generator
|
|
265
269
|
|
|
266
270
|
:param path_key: Filter string for which keys to list, specifically for finding objects in certain folders. Defaults to \"the root\" of the bucket
|
|
267
271
|
:type path_key: str, optional
|
|
272
|
+
:param list_all_bucket_objects: If True, the value of `path_key` will be ignored and instead will list all objects in the bucket. Defaults to False
|
|
273
|
+
:type list_all_bucket_objects: bool, optional
|
|
268
274
|
:param name_only: If True, yield only a the object names. If False, yield the full metadata about each object. Defaults to False.
|
|
269
275
|
:type name_only: bool, optional
|
|
270
|
-
:param files_only: If
|
|
276
|
+
:param files_only: If True, only yield file objects. Defaults to False
|
|
271
277
|
:type files_only: bool, optional
|
|
272
278
|
:yield: A generator of all objects in specified folder in a bucket
|
|
273
279
|
:rtype: Generator
|
|
274
280
|
"""
|
|
275
281
|
paginator : Paginator = self.s3_client.get_paginator("list_objects_v2")
|
|
276
|
-
|
|
282
|
+
if list_all_bucket_objects:
|
|
283
|
+
pages : PageIterator = paginator.paginate(Bucket = self.bucket_name)
|
|
284
|
+
else:
|
|
285
|
+
pages : PageIterator = paginator.paginate(Bucket = self.bucket_name, Prefix = path_key, Delimiter = "/")
|
|
277
286
|
|
|
278
287
|
for page in pages:
|
|
279
288
|
page : dict | None
|
|
@@ -440,10 +449,18 @@ class HCPHandler:
|
|
|
440
449
|
raise ObjectDoesNotExist("Could not find object", "\"" + folder_key + "\"", "in bucket", "\"" + str(self.bucket_name) + "\"")
|
|
441
450
|
if Path(local_folder_path).is_dir():
|
|
442
451
|
current_download_size_in_bytes = Byte(0) # For tracking download limit
|
|
443
|
-
|
|
452
|
+
(Path(local_folder_path) / Path(folder_key)).mkdir(parents = True) # Create "base folder"
|
|
453
|
+
for object in self.list_objects(folder_key): # Build the tree with directories or add files:
|
|
444
454
|
p = Path(local_folder_path) / Path(object["Key"])
|
|
445
|
-
if object["
|
|
446
|
-
p.mkdir()
|
|
455
|
+
if not object["IsFile"]: # If the object is a "folder"
|
|
456
|
+
p.mkdir(parents = True)
|
|
457
|
+
self.download_folder(
|
|
458
|
+
folder_key = str(object["Key"]),
|
|
459
|
+
local_folder_path = local_folder_path,
|
|
460
|
+
use_download_limit = use_download_limit,
|
|
461
|
+
show_progress_bar = show_progress_bar,
|
|
462
|
+
download_limit_in_bytes = download_limit_in_bytes - current_download_size_in_bytes
|
|
463
|
+
)
|
|
447
464
|
else: # If the object is a file
|
|
448
465
|
current_download_size_in_bytes += Byte(object["Size"])
|
|
449
466
|
if current_download_size_in_bytes >= download_limit_in_bytes and use_download_limit:
|
|
@@ -586,6 +603,7 @@ class HCPHandler:
|
|
|
586
603
|
key += "/"
|
|
587
604
|
|
|
588
605
|
objects : list[str] = list(self.list_objects(key, name_only = True))
|
|
606
|
+
objects.append(key) # Include the object "folder" path to be deleted
|
|
589
607
|
|
|
590
608
|
if not objects:
|
|
591
609
|
raise RuntimeError("\"" + key + "\"" + " is not a valid path") #TODO: change this error
|
|
@@ -653,11 +671,11 @@ class HCPHandler:
|
|
|
653
671
|
processor = utils.default_process
|
|
654
672
|
|
|
655
673
|
if not name_only:
|
|
656
|
-
full_list = list(self.list_objects())
|
|
674
|
+
full_list = list(self.list_objects(list_all_bucket_objects = True))
|
|
657
675
|
|
|
658
676
|
for item, score, index in process.extract_iter(
|
|
659
677
|
search_string,
|
|
660
|
-
self.list_objects(name_only = True),
|
|
678
|
+
self.list_objects(list_all_bucket_objects = True, name_only = True),
|
|
661
679
|
scorer = fuzz.partial_ratio,
|
|
662
680
|
processor = processor
|
|
663
681
|
):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: NGPIris
|
|
3
|
-
Version: 5.4.
|
|
3
|
+
Version: 5.4.1
|
|
4
4
|
Author-email: Erik Brink <erik.brink@gu.se>, Isak Sylvin <isak.sylvin@gu.se>
|
|
5
5
|
Description-Content-Type: text/markdown
|
|
6
6
|
License-File: LICENSE
|
|
@@ -13,6 +13,7 @@ Requires-Dist: tqdm>=4.66.2
|
|
|
13
13
|
Requires-Dist: click>=8.1.7
|
|
14
14
|
Requires-Dist: bitmath==1.3.3.1
|
|
15
15
|
Requires-Dist: tabulate==0.9.0
|
|
16
|
+
Dynamic: license-file
|
|
16
17
|
|
|
17
18
|
# NGP IRIS 👀
|
|
18
19
|
NGP IRIS, or just Iris, is a tool for interacting with a Hitachi Content Platform (HCP) using S3 in the `boto3` package. NGP Iris is designed with two use cases in mind:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: NGPIris
|
|
3
|
-
Version: 5.4.
|
|
3
|
+
Version: 5.4.1
|
|
4
4
|
Author-email: Erik Brink <erik.brink@gu.se>, Isak Sylvin <isak.sylvin@gu.se>
|
|
5
5
|
Description-Content-Type: text/markdown
|
|
6
6
|
License-File: LICENSE
|
|
@@ -13,6 +13,7 @@ Requires-Dist: tqdm>=4.66.2
|
|
|
13
13
|
Requires-Dist: click>=8.1.7
|
|
14
14
|
Requires-Dist: bitmath==1.3.3.1
|
|
15
15
|
Requires-Dist: tabulate==0.9.0
|
|
16
|
+
Dynamic: license-file
|
|
16
17
|
|
|
17
18
|
# NGP IRIS 👀
|
|
18
19
|
NGP IRIS, or just Iris, is a tool for interacting with a Hitachi Content Platform (HCP) using S3 in the `boto3` package. NGP Iris is designed with two use cases in mind:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|