dryad2dataverse 0.7.6__py3-none-any.whl → 0.7.9__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, 6)
27
+ VERSION = (0, 7, 9)
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, 3)
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
@@ -528,7 +549,31 @@ def verbo(verbosity:bool, **kwargs)->None:
528
549
  for key, value in kwargs.items():
529
550
  print(f'{key}: {value}')
530
551
 
531
- 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():
532
577
  '''
533
578
  Main Dryad transfer daemon
534
579
 
@@ -542,16 +587,26 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
542
587
  #pylint: disable=too-many-locals
543
588
  parser = argp()
544
589
  args = parser.parse_args()
545
- if args.log:
546
- log = args.log
547
- 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)
548
595
 
549
596
  set_constants(args)
597
+
598
+ logger = rotating_log(args.log,
599
+ level=logging.getLevelName(args.loglevel.upper()))
600
+
550
601
  elog = email_log(args.mailserv, args.email, args.recipients,
551
- (args.user, args.pwd), port=args.port)
602
+ (args.user, args.pwd), port=args.port,
603
+ level = logging.getLevelName(args.email_loglevel.upper()))
552
604
 
553
605
 
554
606
  logger.info('Beginning update process')
607
+ for logme in [elog, logger]:
608
+ logme.debug('Command line arguments: %s' , pprint.pprint(anonymizer(args)))
609
+
555
610
  monitor = dryad2dataverse.monitor.Monitor(args.dbase)
556
611
  #copy the database to make a backup, because paranoia is your friend
557
612
  if os.path.exists(dryad2dataverse.constants.DBASE):
@@ -690,7 +745,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
690
745
  elog.info('Completed update process')
691
746
  finished = ('Dryad to Dataverse transfers completed',
692
747
  ('Dryad to Dataverse transfer daemon has completed.\n'
693
- f'Log available at: {log}'))
748
+ f'Log available at: {args.log}'))
694
749
  notify(finished, **vars(args))
695
750
 
696
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.6
3
+ Version: 0.7.9
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=wL2bRwLbZdS0_SIsHNr2a9MQfQsmH8_BHxBu-GwQhVI,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/scripts/dryadd.py,sha256=uNroXVEvE_OUqvxtw9iYaPaSXaZmGEryZ82JgfvcP10,30297
7
+ dryad2dataverse/serializer.py,sha256=DoIjHYKtoH047X5Gd-WUdoLpL-kvTtSAPg-lUElCx8c,33865
8
+ dryad2dataverse/transfer.py,sha256=83tju_o4DSgSkF7JDLsgTpAwm03b0CMb0OjcKAEACuY,37548
9
+ dryad2dataverse-0.7.9.dist-info/METADATA,sha256=E7zJDsqwLf8W0e56FDme5o_nmTruM4uqjahwUS39tFI,3737
10
+ dryad2dataverse-0.7.9.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
11
+ dryad2dataverse-0.7.9.dist-info/entry_points.txt,sha256=P-Wu7phJ2dGqaZT6OzHEgy3I-TXXq_7ad67r--O8IcA,62
12
+ dryad2dataverse-0.7.9.dist-info/RECORD,,
@@ -1,5 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.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=jAPJzOKbatarco3wW4I_BI9wbfR8tqcOk-ePPq5VQig,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=WQUbibzbeNamRntMyJBFYLXSk5qVjgJffQSRQuIls0I,28192
9
- dryad2dataverse-0.7.6.dist-info/METADATA,sha256=yqKN__bCVpVu2ImSIwwSSVLjetF1DX3HQDoHOHvvL78,3299
10
- dryad2dataverse-0.7.6.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
11
- dryad2dataverse-0.7.6.dist-info/entry_points.txt,sha256=9kBsBa5SivAtfAox__vZGL7H-HI7Vd-jGztCh_eIJEc,63
12
- dryad2dataverse-0.7.6.dist-info/top_level.txt,sha256=0X45AghpKfL69Oc51sRddeiHtq8o-OyOhFX3AMal6YI,16
13
- dryad2dataverse-0.7.6.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- dryadd = dryad2dataverse.scripts.dryadd:main
@@ -1 +0,0 @@
1
- dryad2dataverse