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.

Potentially problematic release.


This version of dcicutils might be problematic. Click here for more details.

@@ -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,,