deriva 1.7.0__py3-none-any.whl → 1.7.3__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.
@@ -7,7 +7,8 @@ import requests
7
7
  from requests.exceptions import HTTPError, ConnectionError
8
8
  from deriva.transfer import GenericDownloader
9
9
  from deriva.transfer.download import DerivaDownloadError, DerivaDownloadConfigurationError, \
10
- DerivaDownloadAuthenticationError, DerivaDownloadAuthorizationError, DerivaDownloadTimeoutError
10
+ DerivaDownloadAuthenticationError, DerivaDownloadAuthorizationError, DerivaDownloadTimeoutError, \
11
+ DerivaDownloadBaggingError
11
12
  from deriva.core import BaseCLI, KeyValuePairArgs, format_credential, format_exception, urlparse
12
13
 
13
14
 
@@ -71,7 +72,7 @@ class DerivaDownloadCLI(BaseCLI):
71
72
  raise DerivaDownloadAuthorizationError(
72
73
  "A requested operation was forbidden. Server responded: %s" % e)
73
74
  except (DerivaDownloadError, DerivaDownloadConfigurationError, DerivaDownloadAuthenticationError,
74
- DerivaDownloadAuthorizationError, DerivaDownloadTimeoutError) as e:
75
+ DerivaDownloadAuthorizationError, DerivaDownloadTimeoutError, DerivaDownloadBaggingError) as e:
75
76
  sys.stderr.write(("\n" if not args.quiet else "") + format_exception(e))
76
77
  if args.debug:
77
78
  traceback.print_exc()
@@ -21,8 +21,8 @@ class BaseQueryProcessor(BaseProcessor):
21
21
  self.catalog = kwargs["catalog"]
22
22
  self.store = kwargs["store"]
23
23
  self.base_path = kwargs["base_path"]
24
- self.query = self.parameters["query_path"]
25
- if self.envars:
24
+ self.query = self.parameters.get("query_path", "")
25
+ if self.query and self.envars:
26
26
  self.query = self.query.format(**self.envars)
27
27
  self.sub_path = self.parameters.get("output_path")
28
28
  self.output_filename = self.parameters.get("output_filename")
@@ -59,6 +59,9 @@ class BaseQueryProcessor(BaseProcessor):
59
59
  return self.outputs
60
60
 
61
61
  def catalogQuery(self, headers=None, as_file=True):
62
+ if not self.query:
63
+ return {}
64
+
62
65
  if not headers:
63
66
  headers = self.HEADERS.copy()
64
67
  else:
@@ -175,8 +178,9 @@ class BaseQueryProcessor(BaseProcessor):
175
178
  envars=self.envars)
176
179
 
177
180
  def __del__(self):
178
- for session in self.sessions.values():
179
- session.close()
181
+ if self.sessions:
182
+ for session in self.sessions.values():
183
+ session.close()
180
184
 
181
185
 
182
186
  class CSVQueryProcessor(BaseQueryProcessor):
@@ -232,3 +236,4 @@ class CreateDirProcessor(JSONEnvUpdateProcessor):
232
236
  self.create_default_paths()
233
237
  make_dirs(self.output_abspath)
234
238
 
239
+ return self.outputs
@@ -12,3 +12,7 @@ class DerivaUploadCatalogCreateError (RuntimeError):
12
12
 
13
13
  class DerivaUploadCatalogUpdateError (RuntimeError):
14
14
  pass
15
+
16
+
17
+ class DerivaUploadAuthenticationError (RuntimeError):
18
+ pass
@@ -233,8 +233,11 @@ class DerivaUpload(object):
233
233
  self.credentials = credentials
234
234
  self.catalog.set_credentials(self.credentials, host)
235
235
  self.store.set_credentials(self.credentials, host)
236
- attributes = self.catalog.get_authn_session().json()
237
- self.identity = attributes.get("client", self.identity)
236
+ try:
237
+ attributes = self.catalog.get_authn_session().json()
238
+ self.identity = attributes.get("client", self.identity)
239
+ except Exception as e:
240
+ logger.warning("Unable to determine user identity: %s" % e)
238
241
 
239
242
  def setConfig(self, config_file):
240
243
  if not config_file:
@@ -557,6 +560,10 @@ class DerivaUpload(object):
557
560
  return None, None, None
558
561
 
559
562
  def uploadFiles(self, status_callback=None, file_callback=None):
563
+ if not self.identity:
564
+ raise DerivaUploadAuthenticationError("Unable to determine user identity for %s. "
565
+ "Please ensure that you are authenticated successfully." %
566
+ self.server_url)
560
567
  completed = 0
561
568
  for group, assets in self.file_list.items():
562
569
  if self.cancelled:
@@ -3,7 +3,7 @@ import sys
3
3
  import json
4
4
  import traceback
5
5
  from deriva.transfer import DerivaUpload, DerivaUploadError, DerivaUploadConfigurationError, \
6
- DerivaUploadCatalogCreateError, DerivaUploadCatalogUpdateError
6
+ DerivaUploadCatalogCreateError, DerivaUploadCatalogUpdateError, DerivaUploadAuthenticationError
7
7
  from deriva.core import BaseCLI, write_config, format_credential, format_exception, urlparse
8
8
 
9
9
 
@@ -95,7 +95,7 @@ class DerivaUploadCLI(BaseCLI):
95
95
  args.dry_run,
96
96
  args.output_file)
97
97
  except (RuntimeError, FileNotFoundError, DerivaUploadError, DerivaUploadConfigurationError,
98
- DerivaUploadCatalogCreateError, DerivaUploadCatalogUpdateError) as e:
98
+ DerivaUploadCatalogCreateError, DerivaUploadCatalogUpdateError, DerivaUploadAuthenticationError) as e:
99
99
  sys.stderr.write(("\n" if not args.quiet else "") + format_exception(e))
100
100
  if args.debug:
101
101
  traceback.print_exc()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deriva
3
- Version: 1.7.0
3
+ Version: 1.7.3
4
4
  Summary: Python APIs and CLIs (Command-Line Interfaces) for the DERIVA platform.
5
5
  Home-page: https://github.com/informatics-isi-edu/deriva-py
6
6
  Author: USC Information Sciences Institute, Informatics Systems Research Division
@@ -29,7 +29,7 @@ Requires-Dist: certifi
29
29
  Requires-Dist: pika
30
30
  Requires-Dist: urllib3 <3,>=1.26
31
31
  Requires-Dist: portalocker >=1.2.1
32
- Requires-Dist: bdbag >=1.7.2
32
+ Requires-Dist: bdbag >=1.7.3
33
33
  Requires-Dist: globus-sdk <4,>=3
34
34
  Requires-Dist: fair-research-login >=0.3.1
35
35
  Requires-Dist: fair-identifiers-client >=0.5.1
@@ -1,23 +1,23 @@
1
1
  deriva/__init__.py,sha256=h-QyvMVzDNpT3jyVskcSbUVFXxGCRxieFPrvTveZG9k,64
2
2
  deriva/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  deriva/config/acl_config.py,sha256=yZ0g_Cwv1MZXajUP2sVbc928XakUDu5Q97w9aK3VCCE,23946
4
- deriva/config/annotation_config.py,sha256=DQHPn4bKVYUxWPKyHkPfwLbdtOuBWpIyW_Uln-p10K0,11732
4
+ deriva/config/annotation_config.py,sha256=sWcJnRfS5vcb85IdUOd420cmFHRyb4br5OxLCOssbec,11714
5
5
  deriva/config/annotation_validate.py,sha256=ZN0jq6As49hfsAmWONUxAStqFG9TeYzvCmRU9TQ-zD8,5228
6
6
  deriva/config/base_config.py,sha256=Y5sFotuAWWyo-LZvzbzVY2ZDaC-zhwbMXusgBF1OJYM,20724
7
7
  deriva/config/dump_catalog_annotations.py,sha256=QzaWDLfWIAQ0eWVV11zeceWgwDBOYIePJnDQgRydwTE,9362
8
8
  deriva/config/rollback_annotation.py,sha256=EMVpuaMh2VaXXoHhsr3ldc7g7e92ngszEswdGNEmGFQ,3020
9
9
  deriva/config/examples/group_owner_policy.json,sha256=8v3GWM1F_BWnYD9x_f6Eo4kBDvyy8g7mRqujfoEKLNc,2408
10
10
  deriva/config/examples/self_serve_policy.json,sha256=pW-cqWz4rJNNXwY4eVZFkQ8gKCHclC9yDa22ylfcDqY,1676
11
- deriva/core/__init__.py,sha256=0FEjx_-XAJR5j5-KizIuB71NDiRNC18yF4uHRiRV7Ow,4945
11
+ deriva/core/__init__.py,sha256=ZjDR3suQoZV7qrKaA7JdSLjopu6XDHXRC7_yfM6rgmE,4945
12
12
  deriva/core/annotation.py,sha256=PkAkPkxX1brQsb8_drR1Qj5QjQA5mjkpXhkq9NuZ1g8,13432
13
13
  deriva/core/base_cli.py,sha256=EkLXOTeaFWUbPaYV-eLuLGga1PbkFVWi3Jjo-e_Vb-U,2681
14
- deriva/core/catalog_cli.py,sha256=qGZ2s6g0UROJGb_9lHl-xMFIdpDsM2F2IWCmgl9Bn28,21253
15
- deriva/core/datapath.py,sha256=96wNx6Exm6lfMOPAYwrPXqfMnlp3I_VnweCJWt7jWO8,67548
14
+ deriva/core/catalog_cli.py,sha256=-6Bo6GLWFWap7y3VxkzPs73HAe_XzRXIJMW-Ri84m3M,23273
15
+ deriva/core/datapath.py,sha256=HmmV3dZtEe9lHr2b9dYyyVdvzZwy6p07ZUF9ocbFvo0,89248
16
16
  deriva/core/deriva_binding.py,sha256=_sA9HGrcVRqT-OhrneMDMOquyVOFOxLq3WzBQhasLIM,12970
17
17
  deriva/core/deriva_server.py,sha256=nsW3gwg1sIaHl3BTf-nL41AkSj3dEpcEBlatvjvN8CQ,200
18
- deriva/core/ermrest_catalog.py,sha256=B8XdzDScxad4PVUxRxT3GLUkV5vSsNnvMA5a76cUdsc,50817
19
- deriva/core/ermrest_model.py,sha256=opQunJOl4Vm62U5LBbO8w77dz9l11B0DvGDU6Sfe2FQ,85916
20
- deriva/core/hatrac_cli.py,sha256=l9QmneLRHSMiG_z9S83ea0QGVhTS3Wq1KGPEKEDpecM,14522
18
+ deriva/core/ermrest_catalog.py,sha256=_eqQg16i1aA95R99B7tLZxHWQlYk-rLpN_0zghfNWRc,54991
19
+ deriva/core/ermrest_model.py,sha256=pf8HC_ecm2NiMF0rg6UjbAuTR4ZKMhf5o5JmMYYuV8I,101855
20
+ deriva/core/hatrac_cli.py,sha256=J8Vg2BPMqNrRC3egr0IUml-_Eo3UxuhCvk_dInjbCiw,14554
21
21
  deriva/core/hatrac_store.py,sha256=t7gEsZ3SJqt1RefSGc3728PQoVs9E5UWEBNGGbbG6Bw,22582
22
22
  deriva/core/polling_ermrest_catalog.py,sha256=KsjiFqPQaHWnJZCVF5i77sdzfubqZHgMBbQ1p8V8D3s,10351
23
23
  deriva/core/schemas/app_links.schema.json,sha256=AxrkC2scxomM6N7jyjtdYA73BbZzPrmuqU8PYWe7okI,954
@@ -44,7 +44,7 @@ deriva/core/schemas/visible_foreign_keys.schema.json,sha256=K-oa2qzj5EbmJCEyN6mN
44
44
  deriva/core/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  deriva/core/utils/__init__.py,sha256=XSbGaWe44hebxYvoh5huFzZkMY6TSKPOCRSjUOvaY70,124
46
46
  deriva/core/utils/core_utils.py,sha256=5xUjJ-1QrPFKOiwfSWFDdH8Hm5a-AEhzCvy2GJPjx4A,19500
47
- deriva/core/utils/globus_auth_utils.py,sha256=M7u6rN1IeQDb3RRN6bM3YIJMitPEP3Usugp-cLgsAr8,55601
47
+ deriva/core/utils/globus_auth_utils.py,sha256=huPzKSr0d2NirpLzyp6CSyR1gIAdlRuP-X0jRo5W_p8,55732
48
48
  deriva/core/utils/hash_utils.py,sha256=JqUYVB3jXusCQYX9fkKmweUKBC0WQi8ZI2N8m-uKygQ,2299
49
49
  deriva/core/utils/mime_utils.py,sha256=ZT7pMjY2kQWBsgsGC3jY6kjfygdsIyiYW3BKNw_pPyg,1128
50
50
  deriva/core/utils/version_utils.py,sha256=HWNUQAZrPXu0oGjhG6gMNm3kWtfa3nR50vfH2uQxBA0,2954
@@ -52,15 +52,15 @@ deriva/core/utils/webauthn_utils.py,sha256=rD0HQZAjUKp4NfqHQG1FhH3x7uKog2et7w7LB
52
52
  deriva/seo/__init__.py,sha256=dYn48A7blbeYf40b4T3KVofrQK4u5K5MfxXWfIGloig,54
53
53
  deriva/seo/sitemap_builder.py,sha256=Ht_AbodEERDofIoCcd4kPlrl1pVW670WN5dT4cc05LQ,13948
54
54
  deriva/seo/sitemap_cli.py,sha256=miCqRfpSj5Dx5BfJGSd8Pi2e4OOQjotDzP_JubukhCM,2654
55
- deriva/transfer/__init__.py,sha256=BTXIXdI18bOks20aTizoP9hy_iYLCMaKZCtHAdss0uI,1099
55
+ deriva/transfer/__init__.py,sha256=Xbp-s9vmzFbumJZ743PEXE8rI1s6-s234F66C_ioC_E,1172
56
56
  deriva/transfer/backup/__init__.py,sha256=vxsZiDLMTJQPybXT89G-07GsUoLhnItTCbLdXcDSyeA,465
57
57
  deriva/transfer/backup/__main__.py,sha256=dT12--8C6sKGEtMhsYuy013ebXKpVnBJfhcQNlVtv6Y,361
58
58
  deriva/transfer/backup/deriva_backup.py,sha256=IO9Tmzx6jHfUCkP-41nSsAeOFLn9T-0HwQcpRLpM_zs,5228
59
59
  deriva/transfer/backup/deriva_backup_cli.py,sha256=T0tvPKWniRinMQt0qG7FI8AoK3GgtlT6EyBZmZCAjL8,2157
60
- deriva/transfer/download/__init__.py,sha256=eNzozhBmUdthI3H0bM8irxe-qTLm06J0Mnrq34qzh-o,294
60
+ deriva/transfer/download/__init__.py,sha256=Pr7Zud4AFsIWwopTxeC_pupslgCG_lzycO9w9Xyh88Q,350
61
61
  deriva/transfer/download/__main__.py,sha256=YUg7AZ07t_xaOgtfJnU_l1nkEHCCPR8sU5X-l1An6SY,363
62
- deriva/transfer/download/deriva_download.py,sha256=CdVRcsL5n6C72j4fgW4ySmUjca5oQMv_ekcj3Pd4AUY,16201
63
- deriva/transfer/download/deriva_download_cli.py,sha256=m7hylccfhL7kMyba3D3kWq7W4d0P10txbQl6N05U9nE,3878
62
+ deriva/transfer/download/deriva_download.py,sha256=9WHX0iBUsXv3iT0pEy95kpVN-Oh4vc6ywI5tYmJWpfk,17145
63
+ deriva/transfer/download/deriva_download_cli.py,sha256=wN8tyQDv1AIE_aDqjECbmkoEWN050vlEdJyteYbdgSs,3940
64
64
  deriva/transfer/download/processors/__init__.py,sha256=evLp36tZn-Z_AMshdfV3JJO8w1es5owsnRN0IFJUwIo,4507
65
65
  deriva/transfer/download/processors/base_processor.py,sha256=R6IIHSa_euv4X2Dyhd8fvQAiVYDGJTWMQtPoukHQn-Q,3837
66
66
  deriva/transfer/download/processors/postprocess/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -69,7 +69,7 @@ deriva/transfer/download/processors/postprocess/transfer_post_processor.py,sha25
69
69
  deriva/transfer/download/processors/postprocess/url_post_processor.py,sha256=s68iIYqQSZHtbv4y-fCG8pjhApAeMEG6hYcKx2Pvf5Y,2745
70
70
  deriva/transfer/download/processors/query/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
71
  deriva/transfer/download/processors/query/bag_fetch_query_processor.py,sha256=tiQtfuy01YgOFFD5b_sP7TGjMnt0Jqcg2gp1KNWqeLE,5645
72
- deriva/transfer/download/processors/query/base_query_processor.py,sha256=6h-BpqccAONyyiTYWQHT0dR_AT158xbFljQl5ABrgDI,10192
72
+ deriva/transfer/download/processors/query/base_query_processor.py,sha256=oM1pbsbpnPV12h3FLtxo8Sp0OCUQYiRhg22AVqf4N50,10327
73
73
  deriva/transfer/download/processors/query/file_download_query_processor.py,sha256=Hg1NbKsaGJh9cB86yIyL7Fm7ywSNVop837Dv8aFXUes,7257
74
74
  deriva/transfer/download/processors/transform/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  deriva/transfer/download/processors/transform/base_transform_processor.py,sha256=Ddw5gsNpDANeuLvUaF4utp8psaxOtAzlgXtOg8gb-Pc,4109
@@ -83,10 +83,10 @@ deriva/transfer/restore/__init__.py,sha256=l_VNbzpfjL8aVSASctsqSMbWO6m_9aVhkq5Lq
83
83
  deriva/transfer/restore/__main__.py,sha256=iGGSF4_q3gUTLU3pPHYL9PNi9T6XNRHOBeTf1obhOjc,364
84
84
  deriva/transfer/restore/deriva_restore.py,sha256=s0h7cXit2USSdjrIfrj0dr7BJ0rrHHMxYr6AxsuoDiI,30298
85
85
  deriva/transfer/restore/deriva_restore_cli.py,sha256=2ViZ1Lyl5ndXPKeJFCHHGnwzkg3DfHhTuRa_bN7eJm8,5603
86
- deriva/transfer/upload/__init__.py,sha256=oq1Jq0bpuRdXnqehmeXDGYPWwhNT_g-yBb7WMVUO87o,239
86
+ deriva/transfer/upload/__init__.py,sha256=4mlc_iUX-v7SpXzlCZmhxQtSiW5JeDGb2FX7bb1E6tY,304
87
87
  deriva/transfer/upload/__main__.py,sha256=hqnXtGpRqPthwpO6uvrnf_TQm7McheeyOt960hStSMY,340
88
- deriva/transfer/upload/deriva_upload.py,sha256=z7uT-thzzmV3HqdgsAqE_8vEm276wgETnnNFqGB5Kdg,60075
89
- deriva/transfer/upload/deriva_upload_cli.py,sha256=76lBxiWkbveOZcKwYRK-IVZtWexSP2xkKTDowugEiEU,5016
88
+ deriva/transfer/upload/deriva_upload.py,sha256=GuQb_-PBKR0JstEifXqSOZpF1zTyaPLfM0PCDlu2Qw8,60500
89
+ deriva/transfer/upload/deriva_upload_cli.py,sha256=-Q6xgiYabQziTQcMQdGNDAv-eLxCCHO-BCSo4umbDE4,5082
90
90
  deriva/transfer/upload/processors/__init__.py,sha256=sMM5xdJ82UIRdB1lGMKk7ft0BgtjS2oJ0sI4SQSqiIU,2481
91
91
  deriva/transfer/upload/processors/archive_processor.py,sha256=ID0lDwDn4vPe5nbxy6m28Ssj_TsZpK4df2xRrM6nJRQ,2015
92
92
  deriva/transfer/upload/processors/base_processor.py,sha256=Nsr-BP_0TvCtW7sb7s2QbYDEJoijONpQDDdnkVcbmng,666
@@ -97,10 +97,10 @@ deriva/transfer/upload/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
97
97
  deriva/utils/__init__.py,sha256=jv2YF__bseklT3OWEzlqJ5qE24c4aWd5F4r0TTjOrWQ,65
98
98
  tests/deriva/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
99
  tests/deriva/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
- tests/deriva/core/test_datapath.py,sha256=KTHs3jf0p7tWKJGZsrbu1aEpQ6AIy_1VYECQBKDaIlo,36023
101
- deriva-1.7.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
102
- deriva-1.7.0.dist-info/METADATA,sha256=cOo4GQhTw5Pi8b62t_Ut00wFYfYFy5VwnAS8GXCmBCs,1623
103
- deriva-1.7.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
104
- deriva-1.7.0.dist-info/entry_points.txt,sha256=72BEmEE4Bes5QhVxUHrl7EvUARrgISWxI2KGa8BbNZ8,786
105
- deriva-1.7.0.dist-info/top_level.txt,sha256=_LHDie5-O53wFlexfrxjewpVkf04oydf3CqX5h75DXE,13
106
- deriva-1.7.0.dist-info/RECORD,,
100
+ tests/deriva/core/test_datapath.py,sha256=hC5PqyL9zqNOV4ydY5L4pHdt8r7Or7OgZnX-F52P2nU,37308
101
+ deriva-1.7.3.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
102
+ deriva-1.7.3.dist-info/METADATA,sha256=u8fofL_SdxidGBInnPPmjbb5qDgZWN6iBFzFwGvsJT0,1623
103
+ deriva-1.7.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
104
+ deriva-1.7.3.dist-info/entry_points.txt,sha256=72BEmEE4Bes5QhVxUHrl7EvUARrgISWxI2KGa8BbNZ8,786
105
+ deriva-1.7.3.dist-info/top_level.txt,sha256=_LHDie5-O53wFlexfrxjewpVkf04oydf3CqX5h75DXE,13
106
+ deriva-1.7.3.dist-info/RECORD,,
@@ -12,7 +12,8 @@ import os
12
12
  import unittest
13
13
  import sys
14
14
  from deriva.core import DerivaServer, get_credential, ermrest_model as _em, __version__
15
- from deriva.core.datapath import DataPathException, Min, Max, Sum, Avg, Cnt, CntD, Array, ArrayD, Bin
15
+ from deriva.core.datapath import DataPathException, Min, Max, Sum, Avg, Cnt, CntD, Array, ArrayD, Bin, \
16
+ simple_denormalization_with_whole_entities
16
17
 
17
18
  try:
18
19
  from pandas import DataFrame
@@ -129,11 +130,12 @@ def populate_test_catalog(catalog):
129
130
  """Populate the test catalog."""
130
131
  paths = catalog.getPathBuilder()
131
132
  logger.debug("Inserting project...")
132
- logger.debug("Inserting experiment types...")
133
133
  proj_table = paths.schemas[SNAME_ISA].tables[TNAME_PROJECT]
134
+ logger.debug("Inserting investigators...")
134
135
  proj_table.insert([
135
136
  {"Investigator": TEST_PROJ_INVESTIGATOR, "Num": TEST_PROJ_NUM}
136
137
  ])
138
+ logger.debug("Inserting experiment types...")
137
139
  type_table = paths.schemas[SNAME_VOCAB].tables[TNAME_EXPERIMENT_TYPE]
138
140
  types = type_table.insert([
139
141
  {"Name": "{}".format(name), "Description": "NA"} for name in range(TEST_EXPTYPE_MAX)
@@ -806,6 +808,26 @@ class DatapathTests (unittest.TestCase):
806
808
  self.assertEqual(path.context._name, path3.context._name, "Context of composed paths should equal far right-hand path's context")
807
809
  self.assertGreater(len(path.Experiment.entities()), 0, "Should have returned results")
808
810
 
811
+ def test_simple_denormalization(self):
812
+ entities = self.experiment.entities()
813
+ results = self.experiment.denormalize()
814
+ self.assertEqual(len(entities), len(results))
815
+ self.assertNotEqual(entities[0].keys(), results[0].keys())
816
+ self.assertIn('Type', results[0])
817
+ self.assertTrue(entities[0]['Type'].startswith('TEST:'))
818
+ self.assertTrue(results[0]['Type'])
819
+ self.assertFalse(results[0]['Type'].startswith('TEST:'))
820
+
821
+ def test_simple_denormalization_w_entities(self):
822
+ entities = self.experiment.entities()
823
+ results = self.experiment.denormalize(heuristic=simple_denormalization_with_whole_entities)
824
+ self.assertEqual(len(entities), len(results))
825
+ self.assertLess(len(entities[0].keys()), len(results[0].keys()))
826
+ self.assertIn('Experiment_Project Investigator_Project_Num_fkey', results[0])
827
+ self.assertIsInstance(results[0]['Experiment_Project Investigator_Project_Num_fkey'], list)
828
+ self.assertIsInstance(results[0]['Experiment_Project Investigator_Project_Num_fkey'][0], dict)
829
+ self.assertIn('RID', results[0]['Experiment_Project Investigator_Project_Num_fkey'][0])
830
+
809
831
 
810
832
  if __name__ == '__main__':
811
833
  sys.exit(unittest.main())
File without changes