rda-python-miscs 3.0.9__py3-none-any.whl → 3.0.10__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.
@@ -254,12 +254,47 @@ class GdexCp(PgFile):
254
254
  self.CINFO['fpath'] = (file if dosub else op.dirname(file)) + "/"
255
255
  if info['isfile']:
256
256
  self.CINFO['tcnt'] += self.dispatch_copy(file, info)
257
+ elif self.RDACP['r'] and self.can_upload_directory():
258
+ self.CINFO['tcnt'] += self.upload_directory(file, dosub)
257
259
  elif dosub or self.RDACP['R']:
258
260
  flist = self.gdex_glob(file, self.RDACP['fh'], 0, self.LGWNEX)
259
261
  if flist: self.copy_list(flist, 1, file)
260
262
  else:
261
263
  self.pglog("{}{}: Add option -r to copy directory".format(self.CINFO['fhost'], file), self.LGEREX)
262
264
 
265
+ # check if a local directory can go to the Object Store in one recursive upload
266
+ def can_upload_directory(self):
267
+ """Return True when a -r directory copy can be one recursive Object Store upload.
268
+
269
+ Needs a local source, an Object Store target and a key prefix from -t; with
270
+ the default target '.' the keys would start with '/', so such a copy goes
271
+ file by file instead.
272
+ """
273
+ if self.RDACP['fh'] or not self.RDACP['th']: return False
274
+ if self.pgcmp(self.strip_host_name(self.RDACP['th']), self.OHOST, 1): return False
275
+ return (self.CINFO['tpath'] != '.')
276
+
277
+ # upload a local directory to the Object Store in one recursive call
278
+ def upload_directory(self, fromdir, dosub):
279
+ """Upload a whole local directory to the Object Store with one isd_s3_cli call.
280
+
281
+ The files keep their layout under the -t key prefix: with the trailing '/'
282
+ form (dosub) they land at '{prefix}/{relative path}', otherwise the directory
283
+ name is kept too, at '{prefix}/{dirname}/{relative path}', the same keys a
284
+ file-by-file copy gives. -m is not used; isd_s3_cli uploads in parallel
285
+ threads of its own.
286
+
287
+ Args:
288
+ fromdir (str): Absolute source directory path.
289
+ dosub (int): 1 to upload the directory contents without the directory name.
290
+
291
+ Returns:
292
+ int: 1 if the directory was uploaded, 0 otherwise.
293
+ """
294
+ todir = self.CINFO['tpath'] if dosub else self.join_paths(self.CINFO['tpath'], op.basename(fromdir))
295
+ logact = self.LGWNEX | (self.OVRIDE if self.RDACP['O'] else 0)
296
+ return (1 if self.local_copy_object_directory(todir, fromdir, None, None, logact) else 0)
297
+
263
298
  # recursively copy directory/file
264
299
  def copy_list(self, tlist, level, cdir):
265
300
  """Recursively copy a directory listing up to the configured depth limit.
@@ -57,6 +57,12 @@
57
57
  COPY BEHAVIOR
58
58
 
59
59
  -r Copy directories and files recursively, with no depth limit.
60
+ A local directory copied to an Object Store bucket (-tb) with -r and a
61
+ -t key prefix is uploaded in a single isd_s3_cli call, which uploads
62
+ in parallel threads of its own (-m is not used for it). Its files
63
+ keep their layout under the prefix. The directory is skipped when
64
+ all its files are already in the bucket at the same size; otherwise
65
+ the whole directory is uploaded again.
60
66
 
61
67
  -R RecursiveLevel
62
68
  Copy recursively up to the given depth. -R 1 copies only the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rda_python_miscs
3
- Version: 3.0.9
3
+ Version: 3.0.10
4
4
  Summary: RDA Python package to hold RDA miscellaneous utility programs
5
5
  Author-email: Zaihua Ji <zji@ucar.edu>
6
6
  Project-URL: Homepage, https://github.com/NCAR/rda-python-miscs
@@ -11,7 +11,7 @@ Classifier: Development Status :: 5 - Production/Stable
11
11
  Requires-Python: >=3.7
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: rda_python_common
14
+ Requires-Dist: rda_python_common>=3.0.28
15
15
  Requires-Dist: rda_python_setuid
16
16
  Dynamic: license-file
17
17
 
@@ -7,8 +7,8 @@ rda_python_miscs/decsdata_restore.usg,sha256=jOD_AbNV4C-dOp9mTkV2MVcUgcf2kf5Q9Qq
7
7
  rda_python_miscs/decsdata_storage.py,sha256=5n8bOVIpGxnX7beDNGmrgj4z1OwmU4-9qVsDCbSuymY,8637
8
8
  rda_python_miscs/decsdata_storage.usg,sha256=5_OXsIxyKjA46xjycaTgVVIE0c39lkkSekcVliFNgaI,2812
9
9
  rda_python_miscs/gdex_ls.py,sha256=fg9jfYajOT8ps6eEhFUUqmQ791BdGwBkrT_pyjmGGvQ,8860
10
- rda_python_miscs/gdexcp.py,sha256=iVVIwfi9wDzfUmrq70SylNXY_Aj_1D8zAJHBq2XpQng,19761
11
- rda_python_miscs/gdexcp.usg,sha256=c87lceTBS2AeLZqSSB2BhpdprjWnVwgnQ56OnZWUSxo,6516
10
+ rda_python_miscs/gdexcp.py,sha256=r5-BuOCRQCEP-c-JVP2JSOcLh1Yk7qn6a3Bn3WkR0w8,21566
11
+ rda_python_miscs/gdexcp.usg,sha256=lT7ZXES8pzWVCkh2c9XJDmMYEpLBWQTWbDKw3QfURbE,6957
12
12
  rda_python_miscs/gdexdrop.py,sha256=xlD218htNrgHpgG3pipZ5xHUPKEaYfmn-U4tuGkCOgY,16474
13
13
  rda_python_miscs/gdexdrop.usg,sha256=3S0TT-Vdb9YNwTb5JcNQ4XjIIfTKrUqlokFM7vTEUQI,3883
14
14
  rda_python_miscs/gdexdrop_standalone.py,sha256=w5qOhlRqeAb_G5zfE1ORKguvgla-zbEr-cSg-3rg_gw,1047
@@ -48,9 +48,9 @@ rda_python_miscs/tcshqsub.usg,sha256=JYfhrK7cqme-Sij_JfquONOs3HMu-d5dDGI9K_RdudU
48
48
  rda_python_miscs/rst_templates/appendix.rst.temp,sha256=HCujxbj-R4_8FgOrLSlMZcBQHUu8f6kfBMWVRygl7jc,560
49
49
  rda_python_miscs/rst_templates/index.rst.temp,sha256=YSa1JM6X9x2SC6UiqJu_9xRrVYGLKwNI43DBJEGDX08,523
50
50
  rda_python_miscs/rst_templates/section.rst.temp,sha256=-CUtutvctG2tIdkqrkFxVEzmNN3atRJXBDQaTnMJ6Gw,572
51
- rda_python_miscs-3.0.9.dist-info/licenses/LICENSE,sha256=1dck4EAQwv8QweDWCXDx-4Or0S8YwiCstaso_H57Pno,1097
52
- rda_python_miscs-3.0.9.dist-info/METADATA,sha256=ZQBjKyzYKS0bDAw6BvuEOtx1-KT8U7dliIpEvrRDXJ4,9157
53
- rda_python_miscs-3.0.9.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
54
- rda_python_miscs-3.0.9.dist-info/entry_points.txt,sha256=cjZOhfF2ZcTvSMJqS-vj6jU3PhfM0Q8HEV_p5wdAFRQ,985
55
- rda_python_miscs-3.0.9.dist-info/top_level.txt,sha256=W5rz7DrWb7hXABUbGgWcwe6D644X338LR8_zdgmtLhg,17
56
- rda_python_miscs-3.0.9.dist-info/RECORD,,
51
+ rda_python_miscs-3.0.10.dist-info/licenses/LICENSE,sha256=1dck4EAQwv8QweDWCXDx-4Or0S8YwiCstaso_H57Pno,1097
52
+ rda_python_miscs-3.0.10.dist-info/METADATA,sha256=llSbWhobyloEH7EOjVl-XUsXVllIO1zvyQdRxy1j1rQ,9166
53
+ rda_python_miscs-3.0.10.dist-info/WHEEL,sha256=mOdXR9C3wMVov7cSY8PY-XCzo3SmmWCHvGQr5csJoao,91
54
+ rda_python_miscs-3.0.10.dist-info/entry_points.txt,sha256=cjZOhfF2ZcTvSMJqS-vj6jU3PhfM0Q8HEV_p5wdAFRQ,985
55
+ rda_python_miscs-3.0.10.dist-info/top_level.txt,sha256=W5rz7DrWb7hXABUbGgWcwe6D644X338LR8_zdgmtLhg,17
56
+ rda_python_miscs-3.0.10.dist-info/RECORD,,