dryad2dataverse 0.7.5__py3-none-any.whl → 0.7.9a0__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.
@@ -24,7 +24,7 @@ Modules included:
24
24
  '''
25
25
  import sys
26
26
 
27
- VERSION = (0, 7, 5)
27
+ VERSION = (0, 7, '9a0')
28
28
  __version__ = '.'.join([str(x) for x in VERSION])
29
29
  USERAGENT = (f'dryad2dataverse/v{__version__} ({sys.platform.capitalize()}); '
30
30
  f'Python {sys.version[:sys.version.find("(")-1]}')
@@ -15,6 +15,7 @@ import logging
15
15
  import logging.handlers
16
16
  import os
17
17
  import pathlib
18
+ import pprint
18
19
  import shutil
19
20
  import smtplib
20
21
  import sys
@@ -28,9 +29,12 @@ import dryad2dataverse.serializer
28
29
  import dryad2dataverse.transfer
29
30
  from dryad2dataverse.handlers import SSLSMTPHandler
30
31
 
31
- VERSION = (0, 6, 2)
32
+ VERSION = (0, 7, 1)
32
33
  __version__ = '.'.join([str(x) for x in VERSION])
33
34
 
35
+ USER_AGENT = {'User-agent': dryad2dataverse.USERAGENT}
36
+
37
+
34
38
  DRY = 'https://datadryad.org/api/v2'
35
39
 
36
40
  def new_content(serial):
@@ -215,6 +219,7 @@ def get_records(ror: 'str', mod_date=None, verbosity=True, timeout=100):
215
219
  '''
216
220
  headers = {'accept':'application/json',
217
221
  'Content-Type':'application/json'}
222
+ headers.update(USER_AGENT)
218
223
  per_page = 1
219
224
  params = {'affiliation' : ror,
220
225
  'per_page' : per_page}
@@ -344,6 +349,24 @@ def argp():
344
349
  required=False,
345
350
  dest='log',
346
351
  default='/var/log/dryadd.log')
352
+ parser.add_argument('--loglevel',
353
+ help='Log level of server rotating log. Choose one of '
354
+ 'debug, info, warning, error or critical. '
355
+ 'Note: case sensitive. '
356
+ 'Default: logging.warning.',
357
+ required=False,
358
+ dest='loglevel',
359
+ default='warning',
360
+ choices=['debug', 'info', 'warning','error','critical'])
361
+ parser.add_argument('--email-loglevel',
362
+ help='Log level of email log. Choose one of '
363
+ 'debug, info, warning, error or critical. '
364
+ 'Note: case sensitive. '
365
+ 'Default: warning',
366
+ required=False,
367
+ dest='email_loglevel',
368
+ default='warning',
369
+ choices=['debug', 'info', 'warning','error','critical'])
347
370
  parser.add_argument('-l', '--no_force_unlock',
348
371
  help='No forcible file unlock. Required '
349
372
  'if /lock endpint is restricted',
@@ -389,16 +412,14 @@ def argp():
389
412
  default=5,
390
413
  dest='testlimit')
391
414
  parser.add_argument('--version', action='version',
392
- version='%(prog)s '+__version__
393
- +'; dryad2dataverse '+
394
- dryad2dataverse.__version__,
415
+ version='dryad2dataverse ' + dryad2dataverse.__version__,
395
416
  help='Show version number and exit')
396
417
 
397
418
  return parser
398
419
 
399
420
  def set_constants(args):
400
421
  '''
401
- Set the appropriate dryad2dataverse constants
422
+ Set the appropriate dryad2dataverse "constants"
402
423
  '''
403
424
  dryad2dataverse.constants.DV_CONTACT_EMAIL = args.contact
404
425
  dryad2dataverse.constants.DV_CONTACT_ = args.contact
@@ -407,6 +428,8 @@ def set_constants(args):
407
428
  dryad2dataverse.constants.DVURL = args.url
408
429
  if args.dbase:
409
430
  dryad2dataverse.constants.DBASE = args.dbase
431
+ if args.tmp:
432
+ dryad2dataverse.constants.TMP = args.tmp
410
433
 
411
434
  def email_log(mailhost, fromaddr, toaddrs, credentials, port=465, secure=(),
412
435
  level=logging.WARNING, timeout=100):
@@ -526,7 +549,31 @@ def verbo(verbosity:bool, **kwargs)->None:
526
549
  for key, value in kwargs.items():
527
550
  print(f'{key}: {value}')
528
551
 
529
- def main(log='/var/log/dryadd.log', level=logging.WARNING):
552
+ def anonymizer(args: argparse.Namespace) -> dict:
553
+ '''
554
+ Redacts sensitive info for the log when parsing arguments and returns a dictionary
555
+ with cleaner values.
556
+ '''
557
+ clean_me = args.__dict__.copy()#Don't work on the real thing!
558
+ cleanser = {x : 'REDACTED' for x in ['email', 'mailserve',
559
+ 'key', 'mailserve',
560
+ 'pwd', 'recipients',
561
+ 'user']}
562
+ clean_me.update(cleanser)
563
+ return clean_me
564
+
565
+ def bulklog(message, *logfuncs):
566
+ '''
567
+ Convenience logging function
568
+
569
+ message : str
570
+ log message
571
+ logfuncs: logging.Logger[.debug, .info, etc. method]
572
+ '''
573
+ for log in logfuncs:
574
+ log('%s', message)
575
+
576
+ def main():
530
577
  '''
531
578
  Main Dryad transfer daemon
532
579
 
@@ -540,16 +587,26 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
540
587
  #pylint: disable=too-many-locals
541
588
  parser = argp()
542
589
  args = parser.parse_args()
543
- if args.log:
544
- log = args.log
545
- logger = rotating_log(log, level)
590
+
591
+ #Ensure log can be written
592
+ logpath = pathlib.Path(args.log)
593
+ if not logpath.parent.exists():
594
+ os.makedirs(logpath.parent)
546
595
 
547
596
  set_constants(args)
597
+
598
+ logger = rotating_log(args.log,
599
+ level=logging.getLevelName(args.loglevel.upper()))
600
+
548
601
  elog = email_log(args.mailserv, args.email, args.recipients,
549
- (args.user, args.pwd), port=args.port)
602
+ (args.user, args.pwd), port=args.port,
603
+ level = logging.getLevelName(args.email_log_level.upper()))
550
604
 
551
605
 
552
606
  logger.info('Beginning update process')
607
+ for logme in [elog, logger]:
608
+ logme.debug('Command line arguments: %s' , pprint.pprint(anonymizer(args)))
609
+
553
610
  monitor = dryad2dataverse.monitor.Monitor(args.dbase)
554
611
  #copy the database to make a backup, because paranoia is your friend
555
612
  if os.path.exists(dryad2dataverse.constants.DBASE):
@@ -688,7 +745,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
688
745
  elog.info('Completed update process')
689
746
  finished = ('Dryad to Dataverse transfers completed',
690
747
  ('Dryad to Dataverse transfer daemon has completed.\n'
691
- f'Log available at: {log}'))
748
+ f'Log available at: {args.log}'))
692
749
  notify(finished, **vars(args))
693
750
 
694
751
  except dryad2dataverse.exceptions.DataverseBadApiKeyError as api_err:
@@ -1,30 +1,40 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: dryad2dataverse
3
- Version: 0.7.5
3
+ Version: 0.7.9a0
4
4
  Summary: Utility for copying and syncing data from a Dryad data repository to a Dataverse repository
5
- Author-email: Paul Lesack <paul.lesack@ubc.ca>
6
- Project-URL: Homepage, https://ubc-library-rc.github.io/dryad2dataverse
7
- Project-URL: Documentation, https://ubc-library-rc.github.io/dryad2dataverse
8
- Project-URL: Repository, https://github.com/ubc-library-rc/dryad2dataverse.git
9
- Project-URL: Tracker, https://github.com/ubc-library-rc/dryad2dataverse/issues
5
+ License: MIT
10
6
  Keywords: Harvard Dataverse,Dataverse,research data management,data repository,Dryad,datadryad.org,dataverse.org
7
+ Author: Paul Lesack
8
+ Author-email: paul.lesack@ubc.ca
9
+ Requires-Python: >=3.9, <4
11
10
  Classifier: Development Status :: 4 - Beta
12
11
  Classifier: Environment :: Console
13
12
  Classifier: Intended Audience :: Education
14
13
  Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
15
20
  Classifier: Topic :: Education
16
21
  Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
17
22
  Classifier: Topic :: Utilities
18
- Requires-Python: >=3.6
23
+ Requires-Dist: certifi (>=2022.12.7)
24
+ Requires-Dist: chardet (>=3.0.4)
25
+ Requires-Dist: charset-normalizer (>=2.0.4)
26
+ Requires-Dist: idna (>=2.10.0)
27
+ Requires-Dist: pycryptodome (>=3.20.0)
28
+ Requires-Dist: pydoc-markdown (>=4.8.2,<5.0.0)
29
+ Requires-Dist: requests (>=2.26.0)
30
+ Requires-Dist: requests-toolbelt (>=0.9.1)
31
+ Requires-Dist: setuptools (>=80.8.0,<81.0.0)
32
+ Requires-Dist: urllib3 (>=1.26.6)
33
+ Project-URL: Bug Tracker, https://github.com/ubc-library-rc/dryad2dataverse/issues
34
+ Project-URL: Documentation, https://ubc-library-rc.github.io/dryad2dataverse
35
+ Project-URL: Homepage, https://ubc-library-rc.github.io/dryad2dataverse
36
+ Project-URL: Repository, https://github.com/ubc-library-rc/dryad2dataverse.git
19
37
  Description-Content-Type: text/markdown
20
- Requires-Dist: certifi >=2022.12.7
21
- Requires-Dist: charset-normalizer >=2.0.4
22
- Requires-Dist: chardet >=3.0.4
23
- Requires-Dist: idna >=2.10.0
24
- Requires-Dist: pycryptodome >=3.20.0
25
- Requires-Dist: requests >=2.26.0
26
- Requires-Dist: requests-toolbelt >=0.9.1
27
- Requires-Dist: urllib3 >=1.26.6
28
38
 
29
39
  # dryad2dataverse
30
40
 
@@ -77,3 +87,4 @@ This very terse description is by no means the entirety of the documentation. Co
77
87
  A (much) more user-friendly version of the documentation is available at <https://ubc-library-rc.github.io/dryad2dataverse>, including full `dryadd` documentation and API information.
78
88
 
79
89
  Or if you've cloned the git repostory above, you can use [mkdocs](https://www.mkdocs.org/) and `mkdocs serve` to have a local server version of the documentation.
90
+
@@ -0,0 +1,12 @@
1
+ dryad2dataverse/__init__.py,sha256=3ZL8VNeOtYUFOuYHcZuSGJ5YUjdmZI3Od6kJwRa_uiM,869
2
+ dryad2dataverse/constants.py,sha256=ZfD2N0f742nnP8NPUV0QsDdVVAbrW-3Py8Lg9al1Z5c,1429
3
+ dryad2dataverse/exceptions.py,sha256=oIP1_fSEvLF3HpK6gOYb05vUisY-IAxwXZDeNoAvCPM,1008
4
+ dryad2dataverse/handlers.py,sha256=Xb0vvs1HE92qaK6g-Gu3eyHkLrSwU0-RQjLcl6FZPUY,1487
5
+ dryad2dataverse/monitor.py,sha256=KOyWCpPTZLYRStB-RN0e5kgHTfbxHsByD72K1VtEPP8,26406
6
+ dryad2dataverse/scripts/dryadd.py,sha256=SZfwsl46CBey3tboNdZJ1FBBm8qn5IcHxXm5MgAsa3w,30298
7
+ dryad2dataverse/serializer.py,sha256=DoIjHYKtoH047X5Gd-WUdoLpL-kvTtSAPg-lUElCx8c,33865
8
+ dryad2dataverse/transfer.py,sha256=83tju_o4DSgSkF7JDLsgTpAwm03b0CMb0OjcKAEACuY,37548
9
+ dryad2dataverse-0.7.9a0.dist-info/METADATA,sha256=MB6oPkUsIkdICI_D2LCRMjUbTSeE1xgGvqjBKHr11Cw,3739
10
+ dryad2dataverse-0.7.9a0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
11
+ dryad2dataverse-0.7.9a0.dist-info/entry_points.txt,sha256=P-Wu7phJ2dGqaZT6OzHEgy3I-TXXq_7ad67r--O8IcA,62
12
+ dryad2dataverse-0.7.9a0.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.2.0)
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
-
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ dryadd=dryad2dataverse.scripts.dryadd:main
3
+
@@ -1,13 +0,0 @@
1
- dryad2dataverse/__init__.py,sha256=RfOrzdCc9OUYlQfBAapkPy_D_SyHziQTob_N5EqAKEM,865
2
- dryad2dataverse/constants.py,sha256=ZfD2N0f742nnP8NPUV0QsDdVVAbrW-3Py8Lg9al1Z5c,1429
3
- dryad2dataverse/exceptions.py,sha256=oIP1_fSEvLF3HpK6gOYb05vUisY-IAxwXZDeNoAvCPM,1008
4
- dryad2dataverse/handlers.py,sha256=Xb0vvs1HE92qaK6g-Gu3eyHkLrSwU0-RQjLcl6FZPUY,1487
5
- dryad2dataverse/monitor.py,sha256=KOyWCpPTZLYRStB-RN0e5kgHTfbxHsByD72K1VtEPP8,26406
6
- dryad2dataverse/serializer.py,sha256=DoIjHYKtoH047X5Gd-WUdoLpL-kvTtSAPg-lUElCx8c,33865
7
- dryad2dataverse/transfer.py,sha256=83tju_o4DSgSkF7JDLsgTpAwm03b0CMb0OjcKAEACuY,37548
8
- dryad2dataverse/scripts/dryadd.py,sha256=i_y5V0dLz32_nYUFsKfqD_Nz0HIsr4dLV-PQKKH1GhM,28126
9
- dryad2dataverse-0.7.5.dist-info/METADATA,sha256=9VL4v5kgaGXdCGMV8x3kUS7LbLdZBJXDy7ZDw_Ybvb4,3299
10
- dryad2dataverse-0.7.5.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
11
- dryad2dataverse-0.7.5.dist-info/entry_points.txt,sha256=9kBsBa5SivAtfAox__vZGL7H-HI7Vd-jGztCh_eIJEc,63
12
- dryad2dataverse-0.7.5.dist-info/top_level.txt,sha256=0X45AghpKfL69Oc51sRddeiHtq8o-OyOhFX3AMal6YI,16
13
- dryad2dataverse-0.7.5.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- dryadd = dryad2dataverse.scripts.dryadd:main
@@ -1 +0,0 @@
1
- dryad2dataverse