dryad2dataverse 0.6.2__tar.gz → 0.7.1__tar.gz

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.
Files changed (208) hide show
  1. {dryad2dataverse-0.6.2/src/dryad2dataverse.egg-info → dryad2dataverse-0.7.1}/PKG-INFO +9 -1
  2. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/api_reference.md +274 -34
  3. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/requirements.txt +1 -0
  4. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/__init__.py +1 -1
  5. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/serializer.py +5 -1
  6. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/transfer.py +63 -15
  7. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info}/PKG-INFO +9 -1
  8. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse.egg-info/requires.txt +1 -0
  9. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/.gitignore +0 -0
  10. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/README.md +0 -0
  11. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/_config.yml +0 -0
  12. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/changelog.md +0 -0
  13. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/compiling.md +0 -0
  14. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/credits.md +0 -0
  15. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/css/extra.css +0 -0
  16. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/anomalies.html +0 -0
  17. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/anomalies.js +0 -0
  18. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css +0 -0
  19. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css.map +0 -0
  20. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css +0 -0
  21. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css.map +0 -0
  22. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css +0 -0
  23. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css.map +0 -0
  24. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css +0 -0
  25. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css.map +0 -0
  26. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  27. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
  28. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  29. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  30. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  31. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.js +0 -0
  32. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.min.js +0 -0
  33. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/bootstrap/js/npm.js +0 -0
  34. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.js +0 -0
  35. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.min.js +0 -0
  36. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/jQuery/jquery-2.2.3.min.js +0 -0
  37. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.js +0 -0
  38. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.min.js +0 -0
  39. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.js +0 -0
  40. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.min.js +0 -0
  41. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/anchor-js/anchor.min.js +0 -0
  42. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/codemirror/codemirror.css +0 -0
  43. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/codemirror/codemirror.js +0 -0
  44. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/codemirror/sql.js +0 -0
  45. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net/jquery.dataTables.min.js +0 -0
  46. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.css +0 -0
  47. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.min.css +0 -0
  48. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.js +0 -0
  49. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.min.js +0 -0
  50. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.js +0 -0
  51. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.min.js +0 -0
  52. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.js +0 -0
  53. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.min.js +0 -0
  54. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.js +0 -0
  55. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.min.js +0 -0
  56. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.js +0 -0
  57. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.min.js +0 -0
  58. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.js +0 -0
  59. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.min.js +0 -0
  60. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.css +0 -0
  61. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.min.css +0 -0
  62. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.js +0 -0
  63. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.min.js +0 -0
  64. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/css/font-awesome.css +0 -0
  65. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/css/font-awesome.css.map +0 -0
  66. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/css/font-awesome.min.css +0 -0
  67. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/FontAwesome.otf +0 -0
  68. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  69. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.svg +0 -0
  70. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  71. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  72. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  73. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/html5shiv/html5shiv.min.js +0 -0
  74. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/css/ionicons.css +0 -0
  75. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/css/ionicons.min.css +0 -0
  76. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/fonts/ionicons.eot +0 -0
  77. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/fonts/ionicons.svg +0 -0
  78. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/fonts/ionicons.ttf +0 -0
  79. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/ionicons/fonts/ionicons.woff +0 -0
  80. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/jquery/jquery.js +0 -0
  81. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/js-xlsx/xlsx.full.min.js +0 -0
  82. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/pdfmake/pdfmake.min.js +0 -0
  83. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/pdfmake/vfs_fonts.js +0 -0
  84. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/respond/respond.min.js +0 -0
  85. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/salvattore/salvattore.css +0 -0
  86. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/bower/salvattore/salvattore.min.js +0 -0
  87. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/column.js +0 -0
  88. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/columns.html +0 -0
  89. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/constraint.js +0 -0
  90. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/constraints.html +0 -0
  91. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/deletionOrder.txt +0 -0
  92. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/orphans/orphans.dot +0 -0
  93. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/orphans/orphans.png +0 -0
  94. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/summary/relationships.real.compact.dot +0 -0
  95. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/summary/relationships.real.compact.png +0 -0
  96. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/summary/relationships.real.large.dot +0 -0
  97. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/summary/relationships.real.large.png +0 -0
  98. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.dot +0 -0
  99. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.png +0 -0
  100. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.dot +0 -0
  101. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.png +0 -0
  102. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.dot +0 -0
  103. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.png +0 -0
  104. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvFiles.1degree.dot +0 -0
  105. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvFiles.1degree.png +0 -0
  106. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.dot +0 -0
  107. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.png +0 -0
  108. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvStudy.1degree.dot +0 -0
  109. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvStudy.1degree.png +0 -0
  110. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.dot +0 -0
  111. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.png +0 -0
  112. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.dot +0 -0
  113. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.png +0 -0
  114. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.dot +0 -0
  115. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.png +0 -0
  116. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/lastcheck.1degree.dot +0 -0
  117. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/diagrams/tables/lastcheck.1degree.png +0 -0
  118. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/dryad_dataverse_monitor.sqlite3.%.xml +0 -0
  119. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/favicon.png +0 -0
  120. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.eot +0 -0
  121. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.svg +0 -0
  122. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.ttf +0 -0
  123. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff +0 -0
  124. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff2 +0 -0
  125. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/indieflower/indie-flower.css +0 -0
  126. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.eot +0 -0
  127. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.svg +0 -0
  128. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.ttf +0 -0
  129. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff +0 -0
  130. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff2 +0 -0
  131. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.eot +0 -0
  132. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.svg +0 -0
  133. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.ttf +0 -0
  134. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff +0 -0
  135. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff2 +0 -0
  136. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.eot +0 -0
  137. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.svg +0 -0
  138. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.ttf +0 -0
  139. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff +0 -0
  140. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff2 +0 -0
  141. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.eot +0 -0
  142. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.svg +0 -0
  143. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.ttf +0 -0
  144. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff +0 -0
  145. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff2 +0 -0
  146. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.eot +0 -0
  147. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.svg +0 -0
  148. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.ttf +0 -0
  149. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff +0 -0
  150. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff2 +0 -0
  151. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.eot +0 -0
  152. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.svg +0 -0
  153. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.ttf +0 -0
  154. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff +0 -0
  155. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff2 +0 -0
  156. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro.css +0 -0
  157. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/images/foreignKey.png +0 -0
  158. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/images/foreignKeys.png +0 -0
  159. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/images/primaryKey.png +0 -0
  160. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/images/primaryKeys.png +0 -0
  161. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/index.html +0 -0
  162. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/info-html.txt +0 -0
  163. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/insertionOrder.txt +0 -0
  164. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/main.js +0 -0
  165. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/orphans.html +0 -0
  166. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/relationships.html +0 -0
  167. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/relationships.js +0 -0
  168. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/routines/routine.js +0 -0
  169. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/routines.html +0 -0
  170. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/routines.js +0 -0
  171. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/schemaSpy.css +0 -0
  172. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/schemaSpy.js +0 -0
  173. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/dryadFiles.html +0 -0
  174. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/dryadStudy.html +0 -0
  175. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/dvFiles.html +0 -0
  176. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/dvStudy.html +0 -0
  177. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/failed_uploads.html +0 -0
  178. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/lastcheck.html +0 -0
  179. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/dbase_structure/tables/table.js +0 -0
  180. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/faq.md +0 -0
  181. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/images/dryad2dataverseLogo.png +0 -0
  182. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/images/dryad2dataverseLogo.svg +0 -0
  183. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/index.md +0 -0
  184. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/installation.md +0 -0
  185. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/other_utils.md +0 -0
  186. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/pydoc-markdown.yml +0 -0
  187. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/reference.md +0 -0
  188. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/script.md +0 -0
  189. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/docs/track.md +0 -0
  190. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/license.md +0 -0
  191. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/mkdocs.yml +0 -0
  192. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/pyproject.toml +0 -0
  193. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/setup.cfg +0 -0
  194. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/setup.py +0 -0
  195. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/constants.py +0 -0
  196. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/exceptions.py +0 -0
  197. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/handlers.py +0 -0
  198. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/monitor.py +0 -0
  199. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse/scripts/dryadd.py +0 -0
  200. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse.egg-info/SOURCES.txt +0 -0
  201. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse.egg-info/dependency_links.txt +0 -0
  202. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse.egg-info/entry_points.txt +0 -0
  203. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/src/dryad2dataverse.egg-info/top_level.txt +0 -0
  204. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/tests/__init__.py +0 -0
  205. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/tests/badURL.json +0 -0
  206. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/tests/tests_monitor.py +0 -0
  207. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/tests/tests_serializer.py +0 -0
  208. {dryad2dataverse-0.6.2 → dryad2dataverse-0.7.1}/tests/tests_transfer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dryad2dataverse
3
- Version: 0.6.2
3
+ Version: 0.7.1
4
4
  Summary: Utility for copying and syncing data from a Dryad data repository to a Dataverse repository
5
5
  Author-email: Paul Lesack <paul.lesack@ubc.ca>
6
6
  Project-URL: Homepage, https://ubc-library-rc.github.io/dryad2dataverse
@@ -17,6 +17,14 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
17
17
  Classifier: Topic :: Utilities
18
18
  Requires-Python: >=3.6
19
19
  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
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
20
28
 
21
29
  # dryad2dataverse
22
30
 
@@ -6,8 +6,6 @@ nav_order: 15
6
6
 
7
7
  # Complete API reference
8
8
 
9
- <a name="dryad2dataverse"></a>
10
-
11
9
  <a id="dryad2dataverse"></a>
12
10
 
13
11
  ## dryad2dataverse
@@ -279,14 +277,14 @@ to discover Dataverse file ids for deletion.
279
277
  filelist : list
280
278
  — List of Dryad file tuples: eg:
281
279
 
282
- ```
283
- [('https://datadryad.org/api/v2/files/385819/download',
284
- 'GCB_ACG_Mortality_2020.zip',
285
- 'application/x-zip-compressed', 23787587),
286
- ('https://datadryad.org/api/v2/files/385820/download',
287
- 'Readme_ACG_Mortality.txt',
288
- 'text/plain', 1350)]
289
- ```
280
+ ```
281
+ [('https://datadryad.org/api/v2/files/385819/download',
282
+ 'GCB_ACG_Mortality_2020.zip',
283
+ 'application/x-zip-compressed', 23787587),
284
+ ('https://datadryad.org/api/v2/files/385820/download',
285
+ 'Readme_ACG_Mortality.txt',
286
+ 'text/plain', 1350)]
287
+ ```
290
288
  ----------------------------------------
291
289
 
292
290
  <a id="dryad2dataverse.monitor.Monitor.get_json_dvfids"></a>
@@ -368,6 +366,12 @@ required to transfer data from Dryad to Dataverse.
368
366
  "Constants" may be a bit strong, but the only constant is the
369
367
  presence of change.
370
368
 
369
+ <a id="dryad2dataverse.constants.MAX_UPLOAD"></a>
370
+
371
+ ##### MAX\_UPLOAD
372
+
373
+ Max 3GB upload
374
+
371
375
  <a id="dryad2dataverse.handlers"></a>
372
376
 
373
377
  ## dryad2dataverse.handlers
@@ -625,37 +629,44 @@ Supplying a `targetDv` kwarg creates a new study and supplying a
625
629
  ##### download\_file
626
630
 
627
631
  ```python
628
- def download_file(url, filename, tmp=None, size=None, chk=None, timeout=45)
632
+ def download_file(url=None,
633
+ filename=None,
634
+ tmp=None,
635
+ size=None,
636
+ chk=None,
637
+ timeout=45,
638
+ **kwargs)
629
639
  ```
630
640
 
631
641
  Downloads a file via requests streaming and saves to constants.TMP.
632
- returns md5sum on success and an exception on failure.
642
+ returns checksum on success and an exception on failure.
633
643
 
634
644
  ----------------------------------------
645
+ Required keyword arguments:
635
646
 
636
- **Arguments**:
647
+ url : str
648
+ — URL of download.
637
649
 
638
-
639
- url : str
640
- — URL of download.
641
-
642
- filename : str
643
- — Output file name.
644
-
645
- timeout : int
646
- Requests timeout.
647
-
648
- tmp : str
649
- Temporary directory for downloads.
650
- Defaults to dryad2dataverse.constants.TMP.
651
-
652
- size : int
653
- Reported file size in bytes.
654
- Defaults to dryad2dataverse.constants.MAX_UPLOAD.
655
-
656
- chk : str
657
- - md5 sum of file (if available and known).
658
- ----------------------------------------
650
+ filename : str
651
+ Output file name.
652
+
653
+ timeout : int
654
+ Requests timeout.
655
+
656
+ tmp : str
657
+ Temporary directory for downloads.
658
+ Defaults to dryad2dataverse.constants.TMP.
659
+
660
+ size : int
661
+ Reported file size in bytes.
662
+ Defaults to dryad2dataverse.constants.MAX_UPLOAD.
663
+
664
+ digest_type: str
665
+ checksum type (ie, md5, sha-256, etc)
666
+
667
+ chk : str
668
+ checksum of file (if available and known).
669
+ ----------------------------------------
659
670
 
660
671
  <a id="dryad2dataverse.transfer.Transfer.download_files"></a>
661
672
 
@@ -935,6 +946,235 @@ a Dataverse installation.
935
946
  — API key for Dataverse. Defaults to dryad2dataverse.constants.APIKEY.
936
947
  ----------------------------------------
937
948
 
949
+ <a id="dryad2dataverse.scripts.dryadd"></a>
950
+
951
+ ## dryad2dataverse.scripts.dryadd
952
+
953
+ Dryad daemon for monitoring and automatically uploading studies associated with a particular ROR
954
+
955
+ Requires Python 3.6+ and requests library
956
+
957
+ <a id="dryad2dataverse.scripts.dryadd.new_content"></a>
958
+
959
+ ##### new\_content
960
+
961
+ ```python
962
+ def new_content(serial)
963
+ ```
964
+
965
+ Creates content for new study upload message (potentially redundant
966
+ with Dataverse emailer).
967
+ serial : dryad2dataverse.serializer.Serializer instance
968
+
969
+ <a id="dryad2dataverse.scripts.dryadd.changed_content"></a>
970
+
971
+ ##### changed\_content
972
+
973
+ ```python
974
+ def changed_content(serial, monitor)
975
+ ```
976
+
977
+ Creates content for file update message.
978
+ serial : dryad2dataverse.serializer.Serializer instance
979
+ monitor : dryad2dataverse.monitor.Monitor instance
980
+
981
+ <a id="dryad2dataverse.scripts.dryadd.notify"></a>
982
+
983
+ ##### notify
984
+
985
+ ```python
986
+ def notify(msgtxt, width=100, **kwargs)
987
+ ```
988
+
989
+ Basic email change notifier. Will sent email outlining metadata changes
990
+ to recipient. Uses SSL.
991
+
992
+ Has only really been tested with Gmail (although it should work with anything,
993
+ and Gmail requires 'Allow less secure apps' or whatever they call it.
994
+ If you are having troubles with GMail:
995
+
996
+ 1. Enable less secure access
997
+
998
+ 2. Disable the CAPTCHA:
999
+ https://accounts.google.com/DisplayUnlockCaptcha
1000
+
1001
+ Note: Google will automatically revert settings after some arbitrary period
1002
+ of time. You have been warned.
1003
+
1004
+ If your application worked before but suddenly it crashes with authenication
1005
+ errors, this is why.
1006
+
1007
+ msgtext : tuple
1008
+ Tuple containing strings of ('subject', 'message content')
1009
+ width : int
1010
+ Maximum line length. Max 1000
1011
+
1012
+ From the argument parser these keys and values are required:
1013
+ email : str
1014
+ From address for account
1015
+ user : str
1016
+ User name for email account
1017
+ pwd : str
1018
+ Password for email account
1019
+ mailserv : str
1020
+ SMTP server for sending mail
1021
+ port : int
1022
+ Mailserver port. Default 465
1023
+ recipients : list
1024
+ List of email addresses of recipients
1025
+
1026
+ <a id="dryad2dataverse.scripts.dryadd.get_records"></a>
1027
+
1028
+ ##### get\_records
1029
+
1030
+ ```python
1031
+ def get_records(ror: 'str', mod_date=None, verbosity=True, timeout=100)
1032
+ ```
1033
+
1034
+ returns a tuple of ((doi, metadata), ...). Dryad searches return complete
1035
+ study metadata from the search, surprisingly.
1036
+
1037
+ ror : str
1038
+ ROR string including http. To find your ROR, see
1039
+ https://ror.org/
1040
+
1041
+ mod_date : str
1042
+ UTC datetime string in the format suitable for the Dryad API.
1043
+ eg. 2021-01-21T21:42:40Z
1044
+ or .strftime('%Y-%m-%dT%H:%M:%SZ')
1045
+ if no mod_date is passed, all studies will be retrieved
1046
+
1047
+ verbosity : bool
1048
+ Output some data to stdout
1049
+
1050
+ timeout : int
1051
+ request timeout in seconds
1052
+
1053
+ <a id="dryad2dataverse.scripts.dryadd.argp"></a>
1054
+
1055
+ ##### argp
1056
+
1057
+ ```python
1058
+ def argp()
1059
+ ```
1060
+
1061
+ Argument parser
1062
+
1063
+ <a id="dryad2dataverse.scripts.dryadd.set_constants"></a>
1064
+
1065
+ ##### set\_constants
1066
+
1067
+ ```python
1068
+ def set_constants(args)
1069
+ ```
1070
+
1071
+ Set the appropriate dryad2dataverse constants
1072
+
1073
+ <a id="dryad2dataverse.scripts.dryadd.email_log"></a>
1074
+
1075
+ ##### email\_log
1076
+
1077
+ ```python
1078
+ def email_log(mailhost,
1079
+ fromaddr,
1080
+ toaddrs,
1081
+ credentials,
1082
+ port=465,
1083
+ secure=(),
1084
+ level=logging.WARNING,
1085
+ timeout=100)
1086
+ ```
1087
+
1088
+ Emails log error messages to recipient
1089
+
1090
+ mailhost : str
1091
+ Address of mail server. Eg. smtp.gmail.com
1092
+ fromaddr : str
1093
+ "From" address for email
1094
+ toaddrs :
1095
+ Recipient of email
1096
+ credentials : tuple
1097
+ (Username, password) tuple
1098
+ port : Mailserver port. Default 465
1099
+ secure : tuple
1100
+ The tuple should be either an empty tuple, or a single-value tuple with
1101
+ the name of a keyfile, or a 2-value tuple with the names of the keyfile
1102
+ and certificate file.
1103
+ See https://docs.python.org/3/library/logging.handlers.html
1104
+ level : int
1105
+ logging level. Default logging.WARNING
1106
+
1107
+ <a id="dryad2dataverse.scripts.dryadd.rotating_log"></a>
1108
+
1109
+ ##### rotating\_log
1110
+
1111
+ ```python
1112
+ def rotating_log(path, level)
1113
+ ```
1114
+
1115
+ Create log of transactions
1116
+
1117
+ path : str
1118
+ Complete path to log
1119
+ level : logging.LOGLEVEL
1120
+ logging level (eg, logging.DEBUG)
1121
+
1122
+ <a id="dryad2dataverse.scripts.dryadd.checkwarn"></a>
1123
+
1124
+ ##### checkwarn
1125
+
1126
+ ```python
1127
+ def checkwarn(val: int, **kwargs) -> None
1128
+ ```
1129
+
1130
+ Halt program execution before processing if threshold value of modified
1131
+ Dryad studies exceeded. Useful for checking if the Dryad API has changed
1132
+ and caused havoc.
1133
+
1134
+ val: int
1135
+ Number of modified or new studies
1136
+ kwargs: dict
1137
+ Email notification information.
1138
+ {'user': user email,
1139
+ 'recipients':[list of recipients],
1140
+ 'pwd' ; email server password],
1141
+ 'mailserv' : smtp mail server,
1142
+ 'warn': Threshold for number of warnings (int)}
1143
+ see dryadd.notify for full details of parameters.
1144
+
1145
+ Include log info:
1146
+ {loggers: [logging.logger, logging.logger,...]}
1147
+ Skip check
1148
+ {'warn_too_many': bool}
1149
+
1150
+ <a id="dryad2dataverse.scripts.dryadd.verbo"></a>
1151
+
1152
+ ##### verbo
1153
+
1154
+ ```python
1155
+ def verbo(verbosity: bool, **kwargs) -> None
1156
+ ```
1157
+
1158
+ verbosity: bool
1159
+ if True, print dict
1160
+ kwargs : dict
1161
+ Dictionary to print out
1162
+
1163
+ <a id="dryad2dataverse.scripts.dryadd.main"></a>
1164
+
1165
+ ##### main
1166
+
1167
+ ```python
1168
+ def main(log='/var/log/dryadd.log', level=logging.WARNING)
1169
+ ```
1170
+
1171
+ Main Dryad transfer daemon
1172
+
1173
+ log : str
1174
+ path to logfile
1175
+ level : int
1176
+ log level, usually one of logging.LOGLEVEL (ie, logging.warning)
1177
+
938
1178
  <a id="dryad2dataverse.serializer"></a>
939
1179
 
940
1180
  ## dryad2dataverse.serializer
@@ -2,6 +2,7 @@ certifi>=2022.12.7
2
2
  charset-normalizer>=2.0.4
3
3
  chardet>=3.0.4
4
4
  idna>=2.10
5
+ pycryptodome>=3.20.0
5
6
  requests>=2.26.0
6
7
  requests-toolbelt>=0.9.1
7
8
  urllib3>=1.26.6
@@ -23,6 +23,6 @@ Modules included:
23
23
  dryad2dataverse.exceptions : Custom exceptions.
24
24
  '''
25
25
 
26
- VERSION = (0, 6, 2)
26
+ VERSION = (0, 7, 1)
27
27
 
28
28
  __version__ = '.'.join([str(x) for x in VERSION])
@@ -202,7 +202,11 @@ class Serializer():
202
202
  files = page['_embedded'].get('stash:files')
203
203
  if files:
204
204
  for f in files:
205
- downLink = f['_links']['stash:file-download']['href']
205
+ #This broke with this commit:
206
+ # https://github.com/datadryad/dryad-app/commit/b8a333ba34b14e55cbc1d7ed5aa4451e0f41db66
207
+
208
+ #downLink = f['_links']['stash:file-download']['href']
209
+ downLink = f['_links']['stash:download']['href']
206
210
  downLink = f'{constants.DRYURL}{downLink}'
207
211
  name = f['path']
208
212
  mimeType = f['mimeType']
@@ -9,7 +9,9 @@ import logging
9
9
  import os
10
10
  import time
11
11
  import traceback
12
+ import zlib #crc32, adler32
12
13
 
14
+ import Crypto.Hash.MD2 #md2
13
15
  import requests
14
16
  from requests.adapters import HTTPAdapter
15
17
  from requests_toolbelt.multipart.encoder import MultipartEncoder
@@ -20,6 +22,15 @@ from dryad2dataverse import exceptions
20
22
  LOGGER = logging.getLogger(__name__)
21
23
  URL_LOGGER = logging.getLogger('urllib3')
22
24
 
25
+ HASHTABLE = {'adler-32' : zlib.adler32, #zlib?
26
+ 'crc-32' : zlib.crc32, #zlib
27
+ 'md2' : Crypto.Hash.MD2, #insecure
28
+ 'md5' : hashlib.md5,
29
+ 'sha-1' : hashlib.sha1,
30
+ 'sha-256' : hashlib.sha256,
31
+ 'sha-384' : hashlib.sha384,
32
+ 'sha-512': hashlib.sha512}
33
+
23
34
  class Transfer():
24
35
  '''
25
36
  Transfers metadata and data files from a
@@ -342,7 +353,7 @@ class Transfer():
342
353
  return self.dvpid
343
354
 
344
355
  @staticmethod
345
- def _check_md5(infile):
356
+ def _check_md5(infile, dig_type):
346
357
  '''
347
358
  Returns the md5 checksum of a file.
348
359
 
@@ -351,25 +362,51 @@ class Transfer():
351
362
 
352
363
  infile : str
353
364
  — Complete path to target file.
365
+
366
+ dig_type : str or None
367
+ — Digest type
354
368
  ----------------------------------------
355
369
  '''
370
+ #From Ryan Scherle
371
+ #When Dryad calculates a digest, it only uses MD5.
372
+ #But if you have precomputed some other type of digest, we should accept it.
373
+ #The list of allowed values is:
374
+ #('adler-32','crc-32','md2','md5','sha-1','sha-256','sha-384','sha-512')
375
+ #hashlib doesn't support adler-32, crc-32, md2
376
+
356
377
  blocksize = 2**16
378
+ #Well, this is inelegant
357
379
  with open(infile, 'rb') as m:
358
- fmd5 = hashlib.md5()
359
- fblock = m.read(blocksize)
360
- while fblock:
361
- fmd5.update(fblock)
380
+ #fmd5 = hashlib.md5()
381
+ ## var name kept for posterity. Maybe refactor
382
+ if dig_type in ['sha-1', 'sha-256', 'sha-384', 'sha-512', 'md5', 'md2']:
383
+ if dig_type == 'md2':
384
+ fmd5 = Crypto.Hash.MD2.new()
385
+ else:
386
+ fmd5 = HASHTABLE[dig_type]()
387
+ fblock = m.read(blocksize)
388
+ while fblock:
389
+ fmd5.update(fblock)
390
+ fblock = m.read(blocksize)
391
+ return fmd5.hexdigest()
392
+ if dig_type in ['adler-32', 'crc-32']:
362
393
  fblock = m.read(blocksize)
363
- return fmd5.hexdigest()
394
+ curvalue = HASHTABLE[dig_type](fblock)
395
+ while fblock:
396
+ fblock = m.read(blocksize)
397
+ curvalue = HASHTABLE[dig_type](fblock, curvalue)
398
+ return curvalue
399
+ raise exceptions.HashError(f'Unable to determine hash type for{infile}: {dig_type}')
364
400
 
365
- def download_file(self, url, filename, tmp=None,
366
- size=None, chk=None, timeout=45):
401
+
402
+ def download_file(self, url=None, filename=None, tmp=None,
403
+ size=None, chk=None, timeout=45, **kwargs):
367
404
  '''
368
405
  Downloads a file via requests streaming and saves to constants.TMP.
369
- returns md5sum on success and an exception on failure.
406
+ returns checksum on success and an exception on failure.
370
407
 
371
408
  ----------------------------------------
372
- Parameters:
409
+ Required keyword arguments:
373
410
 
374
411
  url : str
375
412
  — URL of download.
@@ -388,8 +425,11 @@ class Transfer():
388
425
  — Reported file size in bytes.
389
426
  Defaults to dryad2dataverse.constants.MAX_UPLOAD.
390
427
 
428
+ digest_type: str
429
+ — checksum type (ie, md5, sha-256, etc)
430
+
391
431
  chk : str
392
- - md5 sum of file (if available and known).
432
+ — checksum of file (if available and known).
393
433
  ----------------------------------------
394
434
  '''
395
435
  LOGGER.debug('Start download sequence')
@@ -430,11 +470,13 @@ class Transfer():
430
470
  LOGGER.exception(e)
431
471
  raise
432
472
  #now check the md5
433
- md5 = Transfer._check_md5(f'{tmp}{os.sep}{filename}')
434
- if chk:
473
+ md5 = None
474
+ if chk and kwargs.get('digest_type') in HASHTABLE:
475
+ md5 = Transfer._check_md5(f'{tmp}{os.sep}{filename}',
476
+ kwargs['digest_type'])
435
477
  if md5 != chk:
436
478
  try:
437
- raise exceptions.HashError('Hex digest mismatch: {md5} : {chk}')
479
+ raise exceptions.HashError(f'Hex digest mismatch: {md5} : {chk}')
438
480
  #is this really what I want to do on a bad checksum?
439
481
  except exceptions.HashError as e:
440
482
  LOGGER.exception(e)
@@ -474,7 +516,13 @@ class Transfer():
474
516
  files = self.files
475
517
  try:
476
518
  for f in files:
477
- self.download_file(f[0], f[1], size=f[3], chk=f[-1])
519
+ self.download_file(url=f[0],
520
+ filename=f[1],
521
+ mimetype=f[2],
522
+ size=f[3],
523
+ descr=f[4],
524
+ digest_type=f[5],
525
+ chk=f[-1])
478
526
  except exceptions.DataverseDownloadError as e:
479
527
  LOGGER.exception('Unable to download file with info %s\n%s', f, e)
480
528
  raise
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dryad2dataverse
3
- Version: 0.6.2
3
+ Version: 0.7.1
4
4
  Summary: Utility for copying and syncing data from a Dryad data repository to a Dataverse repository
5
5
  Author-email: Paul Lesack <paul.lesack@ubc.ca>
6
6
  Project-URL: Homepage, https://ubc-library-rc.github.io/dryad2dataverse
@@ -17,6 +17,14 @@ Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
17
17
  Classifier: Topic :: Utilities
18
18
  Requires-Python: >=3.6
19
19
  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
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
20
28
 
21
29
  # dryad2dataverse
22
30
 
@@ -2,6 +2,7 @@ certifi>=2022.12.7
2
2
  charset-normalizer>=2.0.4
3
3
  chardet>=3.0.4
4
4
  idna>=2.10
5
+ pycryptodome>=3.20.0
5
6
  requests>=2.26.0
6
7
  requests-toolbelt>=0.9.1
7
8
  urllib3>=1.26.6