dcicutils 8.4.0.1b9__py3-none-any.whl → 8.4.0.1b11__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -37,6 +37,7 @@ ARRAY_NAME_SUFFIX_CHAR = "#"
37
37
  ARRAY_NAME_SUFFIX_REGEX = re.compile(rf"{ARRAY_NAME_SUFFIX_CHAR}\d+")
38
38
  DOTTED_NAME_DELIMITER_CHAR = "."
39
39
  FILE_SCHEMA_NAME = "File"
40
+ FILE_SCHEMA_NAME_PROPERTY = "filename"
40
41
 
41
42
  # Forward type references for type hints.
42
43
  Portal = Type["Portal"]
@@ -104,6 +105,17 @@ class StructuredDataSet:
104
105
  def resolved_refs(self) -> List[str]:
105
106
  return self._resolved_refs
106
107
 
108
+ @property
109
+ def upload_files(self) -> List[str]:
110
+ result = []
111
+ if self._portal:
112
+ for type_name in self.data:
113
+ if self._portal.is_file_schema(type_name):
114
+ for item in self.data[type_name]:
115
+ if (file_name := item.get(FILE_SCHEMA_NAME_PROPERTY)):
116
+ result.append({"type": type_name, "file": file_name})
117
+ return result
118
+
107
119
  def _load_file(self, file: str) -> None:
108
120
  # Returns a dictionary where each property is the name (i.e. the type) of the data,
109
121
  # and the value is array of dictionaries for the data itself. Handle these kinds of files:
@@ -531,11 +543,11 @@ class Schema:
531
543
  class PortalBase:
532
544
 
533
545
  def __init__(self,
534
- arg: Optional[Union[VirtualApp, TestApp, Router, Portal, dict, tuple, str]] = None,
546
+ arg: Optional[Union[VirtualApp, TestApp, Router, PortalBase, dict, tuple, str]] = None,
535
547
  env: Optional[str] = None, app: OrchestratedApp = APP_SMAHT, server: Optional[str] = None,
536
548
  key: Optional[Union[dict, tuple]] = None,
537
- portal: Optional[Union[VirtualApp, TestApp, Router, Portal, str]] = None) -> PortalBase:
538
- if ((isinstance(arg, (VirtualApp, TestApp, Router, Portal)) or
549
+ portal: Optional[Union[VirtualApp, TestApp, Router, PortalBase, str]] = None) -> PortalBase:
550
+ if ((isinstance(arg, (VirtualApp, TestApp, Router, PortalBase)) or
539
551
  isinstance(arg, str) and arg.endswith(".ini")) and not portal):
540
552
  portal = arg
541
553
  elif isinstance(arg, str) and not env:
@@ -545,8 +557,11 @@ class PortalBase:
545
557
  self._vapp = None
546
558
  self._key = None
547
559
  self._key_pair = None
560
+ self._key_file = None
561
+ self._env = env
562
+ self._app = app
548
563
  self._server = None
549
- if isinstance(portal, Portal):
564
+ if isinstance(portal, PortalBase):
550
565
  self._vapp = portal._vapp
551
566
  self._key = portal._key
552
567
  self._key_pair = portal._key_pair
@@ -573,6 +588,35 @@ class PortalBase:
573
588
  self._key = key_manager.get_keydict_for_server(server)
574
589
  self._server = server
575
590
  self._key_pair = key_manager.keydict_to_keypair(self._key) if self._key else None
591
+ self._key_file = key_manager.keys_file
592
+
593
+ @property
594
+ def env(self):
595
+ return self._env
596
+
597
+ @property
598
+ def app(self):
599
+ return self._app
600
+
601
+ @property
602
+ def key(self):
603
+ return self._key
604
+
605
+ @property
606
+ def key_pair(self):
607
+ return self._key_pair
608
+
609
+ @property
610
+ def key_file(self):
611
+ return self._key_file
612
+
613
+ @property
614
+ def server(self):
615
+ return self._server
616
+
617
+ @property
618
+ def vapp(self):
619
+ return self._vapp
576
620
 
577
621
  def get_metadata(self, object_id: str) -> Optional[dict]:
578
622
  return get_metadata(obj_id=object_id, vapp=self._vapp, key=self._key)
@@ -636,7 +680,7 @@ class PortalBase:
636
680
  def _response(self, response) -> Optional[RequestResponse]:
637
681
  if response and isinstance(getattr(response.__class__, "json"), property):
638
682
  class RequestResponseWrapper: # For consistency change json property to method.
639
- def __init__(self, respnose, **kwargs):
683
+ def __init__(self, response, **kwargs):
640
684
  super().__init__(**kwargs)
641
685
  self._response = response
642
686
  def __getattr__(self, attr): # noqa
@@ -649,15 +693,15 @@ class PortalBase:
649
693
  @staticmethod
650
694
  def create_for_testing(ini_file: Optional[str] = None) -> PortalBase:
651
695
  if isinstance(ini_file, str):
652
- return Portal(Portal._create_testapp(ini_file))
696
+ return PortalBase(PortalBase._create_testapp(ini_file))
653
697
  minimal_ini_for_unit_testing = "[app:app]\nuse = egg:encoded\nsqlalchemy.url = postgresql://dummy\n"
654
698
  with temporary_file(content=minimal_ini_for_unit_testing, suffix=".ini") as ini_file:
655
- return Portal(Portal._create_testapp(ini_file))
699
+ return PortalBase(PortalBase._create_testapp(ini_file))
656
700
 
657
701
  @staticmethod
658
- def create_for_testing_local(ini_file: Optional[str] = None) -> Portal:
702
+ def create_for_testing_local(ini_file: Optional[str] = None) -> PortalBase:
659
703
  if isinstance(ini_file, str) and ini_file:
660
- return Portal(Portal._create_testapp(ini_file))
704
+ return PortalBase(PortalBase._create_testapp(ini_file))
661
705
  minimal_ini_for_testing_local = "\n".join([
662
706
  "[app:app]\nuse = egg:encoded\nfile_upload_bucket = dummy",
663
707
  "sqlalchemy.url = postgresql://postgres@localhost:5441/postgres?host=/tmp/snovault/pgdata",
@@ -678,7 +722,7 @@ class PortalBase:
678
722
  "multiauth.policy.auth0.base = encoded.authentication.Auth0AuthenticationPolicy"
679
723
  ])
680
724
  with temporary_file(content=minimal_ini_for_testing_local, suffix=".ini") as minimal_ini_file:
681
- return Portal(Portal._create_testapp(minimal_ini_file))
725
+ return PortalBase(PortalBase._create_testapp(minimal_ini_file))
682
726
 
683
727
  @staticmethod
684
728
  def _create_testapp(value: Union[str, Router, TestApp] = "development.ini") -> TestApp:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.4.0.1b9
3
+ Version: 8.4.0.1b11
4
4
  Summary: Utility package for interacting with the 4DN Data Portal and other 4DN resources
5
5
  Home-page: https://github.com/4dn-dcic/utils
6
6
  License: MIT
@@ -55,14 +55,14 @@ dcicutils/secrets_utils.py,sha256=8dppXAsiHhJzI6NmOcvJV5ldvKkQZzh3Fl-cb8Wm7MI,19
55
55
  dcicutils/sheet_utils.py,sha256=VlmzteONW5VF_Q4vo0yA5vesz1ViUah1MZ_yA1rwZ0M,33629
56
56
  dcicutils/snapshot_utils.py,sha256=ymP7PXH6-yEiXAt75w0ldQFciGNqWBClNxC5gfX2FnY,22961
57
57
  dcicutils/ssl_certificate_utils.py,sha256=F0ifz_wnRRN9dfrfsz7aCp4UDLgHEY8LaK7PjnNvrAQ,9707
58
- dcicutils/structured_data.py,sha256=ODG3o6VMyFUVhdDChLTzAIbDCxZ3cPSdfL2DaKGN2c8,42995
58
+ dcicutils/structured_data.py,sha256=2kbilJVmGPsZh57xEreSEjTYWCjkOvDCO0L0QxWsIxQ,44093
59
59
  dcicutils/task_utils.py,sha256=MF8ujmTD6-O2AC2gRGPHyGdUrVKgtr8epT5XU8WtNjk,8082
60
60
  dcicutils/trace_utils.py,sha256=g8kwV4ebEy5kXW6oOrEAUsurBcCROvwtZqz9fczsGRE,1769
61
61
  dcicutils/validation_utils.py,sha256=cMZIU2cY98FYtzK52z5WUYck7urH6JcqOuz9jkXpqzg,14797
62
62
  dcicutils/variant_utils.py,sha256=2H9azNx3xAj-MySg-uZ2SFqbWs4kZvf61JnK6b-h4Qw,4343
63
63
  dcicutils/zip_utils.py,sha256=0OXR0aLNwyLIZOzIFTM_5DOun7dxIv6TIZbFiithkO0,3276
64
- dcicutils-8.4.0.1b9.dist-info/LICENSE.txt,sha256=t0_-jIjqxNnymZoNJe-OltRIuuF8qfhN0ATlHyrUJPk,1102
65
- dcicutils-8.4.0.1b9.dist-info/METADATA,sha256=twJ5fTqOriYRIy40WeEgOk_fwKHPRvkPK4CiIIYHMOs,3314
66
- dcicutils-8.4.0.1b9.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
67
- dcicutils-8.4.0.1b9.dist-info/entry_points.txt,sha256=8wbw5csMIgBXhkwfgsgJeuFcoUc0WsucUxmOyml2aoA,209
68
- dcicutils-8.4.0.1b9.dist-info/RECORD,,
64
+ dcicutils-8.4.0.1b11.dist-info/LICENSE.txt,sha256=t0_-jIjqxNnymZoNJe-OltRIuuF8qfhN0ATlHyrUJPk,1102
65
+ dcicutils-8.4.0.1b11.dist-info/METADATA,sha256=Uxe75Y_H7TDmO4UlOuw_VsaPcC7UEoxpS58zn8EjHQE,3315
66
+ dcicutils-8.4.0.1b11.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
67
+ dcicutils-8.4.0.1b11.dist-info/entry_points.txt,sha256=8wbw5csMIgBXhkwfgsgJeuFcoUc0WsucUxmOyml2aoA,209
68
+ dcicutils-8.4.0.1b11.dist-info/RECORD,,