dryad2dataverse 0.7.1__tar.gz → 0.7.10__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 (209) hide show
  1. {dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info → dryad2dataverse-0.7.10}/PKG-INFO +27 -16
  2. dryad2dataverse-0.7.10/pyproject.toml +60 -0
  3. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/__init__.py +4 -2
  4. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/monitor.py +4 -1
  5. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/scripts/dryadd.py +115 -18
  6. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/serializer.py +4 -0
  7. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/transfer.py +38 -6
  8. dryad2dataverse-0.7.1/.gitignore +0 -42
  9. dryad2dataverse-0.7.1/PKG-INFO +0 -79
  10. dryad2dataverse-0.7.1/docs/_config.yml +0 -15
  11. dryad2dataverse-0.7.1/docs/api_reference.md +0 -1463
  12. dryad2dataverse-0.7.1/docs/changelog.md +0 -135
  13. dryad2dataverse-0.7.1/docs/compiling.md +0 -43
  14. dryad2dataverse-0.7.1/docs/credits.md +0 -20
  15. dryad2dataverse-0.7.1/docs/css/extra.css +0 -31
  16. dryad2dataverse-0.7.1/docs/dbase_structure/anomalies.html +0 -311
  17. dryad2dataverse-0.7.1/docs/dbase_structure/anomalies.js +0 -0
  18. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css +0 -587
  19. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css.map +0 -1
  20. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css +0 -6
  21. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css.map +0 -1
  22. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css +0 -6757
  23. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css.map +0 -1
  24. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css +0 -6
  25. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css.map +0 -1
  26. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  27. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
  28. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  29. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  30. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  31. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.js +0 -2377
  32. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.min.js +0 -7
  33. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/npm.js +0 -13
  34. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.js +0 -841
  35. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.min.js +0 -1
  36. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQuery/jquery-2.2.3.min.js +0 -4
  37. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.js +0 -16617
  38. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.min.js +0 -13
  39. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.js +0 -474
  40. dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.min.js +0 -16
  41. dryad2dataverse-0.7.1/docs/dbase_structure/bower/anchor-js/anchor.min.js +0 -6
  42. dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/codemirror.css +0 -340
  43. dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/codemirror.js +0 -9502
  44. dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/sql.js +0 -451
  45. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net/jquery.dataTables.min.js +0 -167
  46. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.css +0 -184
  47. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.min.css +0 -1
  48. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.js +0 -182
  49. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.min.js +0 -8
  50. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.js +0 -206
  51. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.min.js +0 -6
  52. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.js +0 -1441
  53. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.min.js +0 -31
  54. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.js +0 -1370
  55. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.min.js +0 -26
  56. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.js +0 -194
  57. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.min.js +0 -4
  58. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.js +0 -1705
  59. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.min.js +0 -37
  60. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.css +0 -158
  61. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.min.css +0 -1
  62. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.js +0 -68
  63. dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.min.js +0 -6
  64. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.css +0 -2337
  65. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.css.map +0 -7
  66. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.min.css +0 -4
  67. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/FontAwesome.otf +0 -0
  68. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  69. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.svg +0 -2671
  70. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  71. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  72. dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  73. dryad2dataverse-0.7.1/docs/dbase_structure/bower/html5shiv/html5shiv.min.js +0 -4
  74. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/css/ionicons.css +0 -1480
  75. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/css/ionicons.min.css +0 -11
  76. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.eot +0 -0
  77. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.svg +0 -2230
  78. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.ttf +0 -0
  79. dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.woff +0 -0
  80. dryad2dataverse-0.7.1/docs/dbase_structure/bower/jquery/jquery.js +0 -10253
  81. dryad2dataverse-0.7.1/docs/dbase_structure/bower/js-xlsx/xlsx.full.min.js +0 -22
  82. dryad2dataverse-0.7.1/docs/dbase_structure/bower/pdfmake/pdfmake.min.js +0 -29
  83. dryad2dataverse-0.7.1/docs/dbase_structure/bower/pdfmake/vfs_fonts.js +0 -6
  84. dryad2dataverse-0.7.1/docs/dbase_structure/bower/respond/respond.min.js +0 -5
  85. dryad2dataverse-0.7.1/docs/dbase_structure/bower/salvattore/salvattore.css +0 -53
  86. dryad2dataverse-0.7.1/docs/dbase_structure/bower/salvattore/salvattore.min.js +0 -7
  87. dryad2dataverse-0.7.1/docs/dbase_structure/column.js +0 -117
  88. dryad2dataverse-0.7.1/docs/dbase_structure/columns.html +0 -433
  89. dryad2dataverse-0.7.1/docs/dbase_structure/constraint.js +0 -14
  90. dryad2dataverse-0.7.1/docs/dbase_structure/constraints.html +0 -266
  91. dryad2dataverse-0.7.1/docs/dbase_structure/deletionOrder.txt +0 -6
  92. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/orphans/orphans.dot +0 -14
  93. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/orphans/orphans.png +0 -0
  94. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.compact.dot +0 -67
  95. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.compact.png +0 -0
  96. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.large.dot +0 -75
  97. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.large.png +0 -0
  98. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.dot +0 -28
  99. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.png +0 -0
  100. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.dot +0 -64
  101. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.png +0 -0
  102. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.dot +0 -70
  103. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.png +0 -0
  104. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.1degree.dot +0 -32
  105. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.1degree.png +0 -0
  106. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.dot +0 -68
  107. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.png +0 -0
  108. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.1degree.dot +0 -28
  109. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.1degree.png +0 -0
  110. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.dot +0 -64
  111. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.png +0 -0
  112. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.dot +0 -29
  113. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.png +0 -0
  114. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.dot +0 -65
  115. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.png +0 -0
  116. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/lastcheck.1degree.dot +0 -14
  117. dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/lastcheck.1degree.png +0 -0
  118. dryad2dataverse-0.7.1/docs/dbase_structure/dryad_dataverse_monitor.sqlite3.%.xml +0 -52
  119. dryad2dataverse-0.7.1/docs/dbase_structure/favicon.png +0 -0
  120. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.eot +0 -0
  121. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.svg +0 -659
  122. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.ttf +0 -0
  123. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff +0 -0
  124. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff2 +0 -0
  125. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower.css +0 -12
  126. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.eot +0 -0
  127. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.svg +0 -347
  128. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.ttf +0 -0
  129. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff +0 -0
  130. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff2 +0 -0
  131. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.eot +0 -0
  132. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.svg +0 -357
  133. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.ttf +0 -0
  134. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff +0 -0
  135. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff2 +0 -0
  136. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.eot +0 -0
  137. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.svg +0 -343
  138. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.ttf +0 -0
  139. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff +0 -0
  140. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff2 +0 -0
  141. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.eot +0 -0
  142. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.svg +0 -350
  143. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.ttf +0 -0
  144. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff +0 -0
  145. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff2 +0 -0
  146. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.eot +0 -0
  147. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.svg +0 -339
  148. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.ttf +0 -0
  149. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff +0 -0
  150. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff2 +0 -0
  151. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.eot +0 -0
  152. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.svg +0 -344
  153. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.ttf +0 -0
  154. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff +0 -0
  155. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff2 +0 -0
  156. dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro.css +0 -78
  157. dryad2dataverse-0.7.1/docs/dbase_structure/images/foreignKey.png +0 -0
  158. dryad2dataverse-0.7.1/docs/dbase_structure/images/foreignKeys.png +0 -0
  159. dryad2dataverse-0.7.1/docs/dbase_structure/images/primaryKey.png +0 -0
  160. dryad2dataverse-0.7.1/docs/dbase_structure/images/primaryKeys.png +0 -0
  161. dryad2dataverse-0.7.1/docs/dbase_structure/index.html +0 -312
  162. dryad2dataverse-0.7.1/docs/dbase_structure/info-html.txt +0 -5
  163. dryad2dataverse-0.7.1/docs/dbase_structure/insertionOrder.txt +0 -6
  164. dryad2dataverse-0.7.1/docs/dbase_structure/main.js +0 -69
  165. dryad2dataverse-0.7.1/docs/dbase_structure/orphans.html +0 -146
  166. dryad2dataverse-0.7.1/docs/dbase_structure/relationships.html +0 -168
  167. dryad2dataverse-0.7.1/docs/dbase_structure/relationships.js +0 -13
  168. dryad2dataverse-0.7.1/docs/dbase_structure/routines/routine.js +0 -34
  169. dryad2dataverse-0.7.1/docs/dbase_structure/routines.html +0 -164
  170. dryad2dataverse-0.7.1/docs/dbase_structure/routines.js +0 -70
  171. dryad2dataverse-0.7.1/docs/dbase_structure/schemaSpy.css +0 -162
  172. dryad2dataverse-0.7.1/docs/dbase_structure/schemaSpy.js +0 -45
  173. dryad2dataverse-0.7.1/docs/dbase_structure/tables/dryadFiles.html +0 -247
  174. dryad2dataverse-0.7.1/docs/dbase_structure/tables/dryadStudy.html +0 -341
  175. dryad2dataverse-0.7.1/docs/dbase_structure/tables/dvFiles.html +0 -315
  176. dryad2dataverse-0.7.1/docs/dbase_structure/tables/dvStudy.html +0 -247
  177. dryad2dataverse-0.7.1/docs/dbase_structure/tables/failed_uploads.html +0 -264
  178. dryad2dataverse-0.7.1/docs/dbase_structure/tables/lastcheck.html +0 -213
  179. dryad2dataverse-0.7.1/docs/dbase_structure/tables/table.js +0 -85
  180. dryad2dataverse-0.7.1/docs/faq.md +0 -109
  181. dryad2dataverse-0.7.1/docs/images/dryad2dataverseLogo.png +0 -0
  182. dryad2dataverse-0.7.1/docs/images/dryad2dataverseLogo.svg +0 -60
  183. dryad2dataverse-0.7.1/docs/index.md +0 -116
  184. dryad2dataverse-0.7.1/docs/installation.md +0 -72
  185. dryad2dataverse-0.7.1/docs/other_utils.md +0 -13
  186. dryad2dataverse-0.7.1/docs/pydoc-markdown.yml +0 -46
  187. dryad2dataverse-0.7.1/docs/reference.md +0 -92
  188. dryad2dataverse-0.7.1/docs/script.md +0 -118
  189. dryad2dataverse-0.7.1/docs/track.md +0 -5
  190. dryad2dataverse-0.7.1/license.md +0 -27
  191. dryad2dataverse-0.7.1/mkdocs.yml +0 -28
  192. dryad2dataverse-0.7.1/pyproject.toml +0 -46
  193. dryad2dataverse-0.7.1/requirements.txt +0 -8
  194. dryad2dataverse-0.7.1/setup.cfg +0 -4
  195. dryad2dataverse-0.7.1/setup.py +0 -19
  196. dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/SOURCES.txt +0 -206
  197. dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/dependency_links.txt +0 -1
  198. dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/entry_points.txt +0 -2
  199. dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/requires.txt +0 -8
  200. dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/top_level.txt +0 -1
  201. dryad2dataverse-0.7.1/tests/__init__.py +0 -0
  202. dryad2dataverse-0.7.1/tests/badURL.json +0 -1
  203. dryad2dataverse-0.7.1/tests/tests_monitor.py +0 -135
  204. dryad2dataverse-0.7.1/tests/tests_serializer.py +0 -236
  205. dryad2dataverse-0.7.1/tests/tests_transfer.py +0 -62
  206. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/README.md +0 -0
  207. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/constants.py +0 -0
  208. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/exceptions.py +0 -0
  209. {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/handlers.py +0 -0
@@ -1,30 +1,40 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: dryad2dataverse
3
- Version: 0.7.1
3
+ Version: 0.7.10
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 (>=2.6.1)
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
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,60 @@
1
+ [project]
2
+ name = "dryad2dataverse"
3
+ version = "0.7.10"
4
+ description = "Utility for copying and syncing data from a Dryad data repository to a Dataverse repository"
5
+ authors = [
6
+ {name = "Paul Lesack",email = "paul.lesack@ubc.ca"}
7
+ ]
8
+ license = {text = "MIT"}
9
+ readme = "README.md"
10
+ requires-python = ">=3.9, <4"
11
+ dependencies = [
12
+ "certifi (>=2022.12.7)",
13
+ "charset-normalizer (>=2.0.4)",
14
+ "chardet (>=3.0.4)",
15
+ "idna (>=2.10.0)",
16
+ "pycryptodome (>=3.20.0)",
17
+ "requests (>=2.26.0)",
18
+ "requests-toolbelt (>=0.9.1)",
19
+ "urllib3 (>=2.6.1)",
20
+ "pydoc-markdown (>=4.8.2,<5.0.0)",
21
+ "setuptools (>=80.8.0,<81.0.0)"
22
+ ]
23
+
24
+ keywords =['Harvard Dataverse',
25
+ 'Dataverse',
26
+ 'research data management',
27
+ 'data repository',
28
+ 'Dryad',
29
+ 'datadryad.org',
30
+ 'dataverse.org']
31
+
32
+
33
+ [project.scripts]
34
+ #This should be restructured one day
35
+ dryadd = 'dryad2dataverse.scripts.dryadd:main'
36
+
37
+ [project.urls]
38
+ Homepage = 'https://ubc-library-rc.github.io/dryad2dataverse'
39
+ Documentation = 'https://ubc-library-rc.github.io/dryad2dataverse'
40
+ Repository = 'https://github.com/ubc-library-rc/dryad2dataverse.git'
41
+ "Bug Tracker" = 'https://github.com/ubc-library-rc/dryad2dataverse/issues'
42
+
43
+
44
+ [tool.poetry]
45
+ classifiers = ['Development Status :: 4 - Beta',
46
+ 'Environment :: Console',
47
+ 'Intended Audience :: Education',
48
+ 'License :: OSI Approved :: MIT License',
49
+ 'Topic :: Education',
50
+ 'Topic :: Internet :: WWW/HTTP :: Site Management',
51
+ 'Topic :: Utilities']
52
+
53
+ [tool.poetry.group.dev.dependencies]
54
+ pylint = ">=3.3.6"
55
+ mkdocs = ">=1.6.1"
56
+ pydoc-markdown = ">=4.8.2"
57
+
58
+ [build-system]
59
+ requires = ["poetry-core>=2.0.0,<3.0.0"]
60
+ build-backend = "poetry.core.masonry.api"
@@ -22,7 +22,9 @@ Modules included:
22
22
 
23
23
  dryad2dataverse.exceptions : Custom exceptions.
24
24
  '''
25
+ import sys
25
26
 
26
- VERSION = (0, 7, 1)
27
-
27
+ VERSION = (0, 7, 10)
28
28
  __version__ = '.'.join([str(x) for x in VERSION])
29
+ USERAGENT = (f'dryad2dataverse/v{__version__} ({sys.platform.capitalize()}); '
30
+ f'Python {sys.version[:sys.version.find("(")-1]}')
@@ -325,7 +325,10 @@ class Monitor():
325
325
  # because of code duplication below.
326
326
  for f in oldFiles:
327
327
  #Download links are not persistent. Be warned
328
- downLink = f['_links']['stash:file-download']['href']
328
+ try:
329
+ downLink = f['_links']['stash:file-download']['href']
330
+ except KeyError:
331
+ downLink = f['_links']['stash:download']['href']
329
332
  downLink = f'{constants.DRYURL}{downLink}'
330
333
  name = f['path']
331
334
  mimeType = f['mimeType']
@@ -14,6 +14,8 @@ import glob
14
14
  import logging
15
15
  import logging.handlers
16
16
  import os
17
+ import pathlib
18
+ import pprint
17
19
  import shutil
18
20
  import smtplib
19
21
  import sys
@@ -27,9 +29,12 @@ import dryad2dataverse.serializer
27
29
  import dryad2dataverse.transfer
28
30
  from dryad2dataverse.handlers import SSLSMTPHandler
29
31
 
30
- VERSION = (0, 5, 3)
32
+ VERSION = (0, 7, 1)
31
33
  __version__ = '.'.join([str(x) for x in VERSION])
32
34
 
35
+ USER_AGENT = {'User-agent': dryad2dataverse.USERAGENT}
36
+
37
+
33
38
  DRY = 'https://datadryad.org/api/v2'
34
39
 
35
40
  def new_content(serial):
@@ -214,6 +219,7 @@ def get_records(ror: 'str', mod_date=None, verbosity=True, timeout=100):
214
219
  '''
215
220
  headers = {'accept':'application/json',
216
221
  'Content-Type':'application/json'}
222
+ headers.update(USER_AGENT)
217
223
  per_page = 1
218
224
  params = {'affiliation' : ror,
219
225
  'per_page' : per_page}
@@ -343,6 +349,24 @@ def argp():
343
349
  required=False,
344
350
  dest='log',
345
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'])
346
370
  parser.add_argument('-l', '--no_force_unlock',
347
371
  help='No forcible file unlock. Required '
348
372
  'if /lock endpint is restricted',
@@ -372,17 +396,30 @@ def argp():
372
396
  type=int,
373
397
  dest='warn',
374
398
  default=15)
399
+ parser.add_argument('--testmode-on',
400
+ help=('Turn on test mode. '
401
+ 'Number of transfers will be limited '
402
+ 'to the value in --testmode-limit '
403
+ 'or 5 if you don\'t set --testmode-limit '),
404
+ action='store_true',
405
+ dest='testmode')
406
+ parser.add_argument('--testmode-limit',
407
+ help=('Test mode - only transfer first [n] '
408
+ 'of the total number of (new) records. Old ones will '
409
+ 'still be updated, though. '
410
+ 'Default: 5'),
411
+ type=int,
412
+ default=5,
413
+ dest='testlimit')
375
414
  parser.add_argument('--version', action='version',
376
- version='%(prog)s '+__version__
377
- +'; dryad2dataverse '+
378
- dryad2dataverse.__version__,
415
+ version='dryad2dataverse ' + dryad2dataverse.__version__,
379
416
  help='Show version number and exit')
380
417
 
381
418
  return parser
382
419
 
383
420
  def set_constants(args):
384
421
  '''
385
- Set the appropriate dryad2dataverse constants
422
+ Set the appropriate dryad2dataverse "constants"
386
423
  '''
387
424
  dryad2dataverse.constants.DV_CONTACT_EMAIL = args.contact
388
425
  dryad2dataverse.constants.DV_CONTACT_ = args.contact
@@ -391,6 +428,8 @@ def set_constants(args):
391
428
  dryad2dataverse.constants.DVURL = args.url
392
429
  if args.dbase:
393
430
  dryad2dataverse.constants.DBASE = args.dbase
431
+ if args.tmp:
432
+ dryad2dataverse.constants.TMP = args.tmp
394
433
 
395
434
  def email_log(mailhost, fromaddr, toaddrs, credentials, port=465, secure=(),
396
435
  level=logging.WARNING, timeout=100):
@@ -416,7 +455,8 @@ def email_log(mailhost, fromaddr, toaddrs, credentials, port=465, secure=(),
416
455
  '''
417
456
  #pylint: disable=too-many-arguments
418
457
  #Because consistency is for suckers and yahoo requires full hostname
419
- subject = 'Dryad to Dataverse transfer error'
458
+ #subject = 'Dryad to Dataverse transfer error'
459
+ subject = 'Dryad to Dataverse logger message'
420
460
  elog = logging.getLogger('email_log')
421
461
  mailer = SSLSMTPHandler(mailhost=(mailhost, port),
422
462
  fromaddr=fromaddr,
@@ -491,11 +531,11 @@ def checkwarn(val:int, **kwargs) -> None:
491
531
  mess = ('Large number of updates detected. '
492
532
  f'{val} new studies exceeds threshold of {kwargs.get("warn", 0)}. '
493
533
  'Program execution halted.')
494
- subject = ('Dryad to Dataverse large update warning')
534
+ subject = 'Dryad to Dataverse large update warning'
495
535
  for logme in kwargs.get('loggers'):
496
536
  logme.warning(mess)
497
537
  notify(msgtxt=(subject, mess),
498
- **vars(kwargs))
538
+ **kwargs)
499
539
  sys.exit()
500
540
 
501
541
  def verbo(verbosity:bool, **kwargs)->None:
@@ -509,7 +549,31 @@ def verbo(verbosity:bool, **kwargs)->None:
509
549
  for key, value in kwargs.items():
510
550
  print(f'{key}: {value}')
511
551
 
512
- 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():
513
577
  '''
514
578
  Main Dryad transfer daemon
515
579
 
@@ -523,22 +587,41 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
523
587
  #pylint: disable=too-many-locals
524
588
  parser = argp()
525
589
  args = parser.parse_args()
526
- if args.log:
527
- log = args.log
528
- 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)
529
595
 
530
596
  set_constants(args)
597
+
598
+ logger = rotating_log(args.log,
599
+ level=logging.getLevelName(args.loglevel.upper()))
600
+
531
601
  elog = email_log(args.mailserv, args.email, args.recipients,
532
- (args.user, args.pwd), port=args.port)
602
+ (args.user, args.pwd), port=args.port,
603
+ level = logging.getLevelName(args.email_loglevel.upper()))
533
604
 
534
605
 
535
606
  logger.info('Beginning update process')
607
+ for logme in [elog, logger]:
608
+ logme.debug('Command line arguments: %s' , pprint.pprint(anonymizer(args)))
609
+
536
610
  monitor = dryad2dataverse.monitor.Monitor(args.dbase)
537
611
  #copy the database to make a backup, because paranoia is your friend
538
612
  if os.path.exists(dryad2dataverse.constants.DBASE):
539
- shutil.copyfile(dryad2dataverse.constants.DBASE,
540
- dryad2dataverse.constants.DBASE+'.'+
541
- datetime.datetime.now().strftime('%Y-%m-%d-%H%M'))
613
+ bu_db = pathlib.Path(dryad2dataverse.constants.DBASE)
614
+ try:
615
+ shutil.copyfile( bu_db,
616
+ pathlib.Path(bu_db.parent,
617
+ bu_db.stem + '_' +
618
+ datetime.datetime.now().strftime('%Y-%m-%d-%H%M') +
619
+ bu_db.suffix)
620
+ )
621
+ except FileNotFoundError:
622
+ print(dryad2dataverse.constants.DBASE)
623
+ print(bu_db)
624
+ sys.exit()
542
625
  #list comprehension includes untimestamped dbase name, hence 2+
543
626
  fnames = glob.glob(os.path.abspath(dryad2dataverse.constants.DBASE)
544
627
  +'*')
@@ -554,15 +637,24 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
554
637
  logger.info('Total new files: %s', len(updates))
555
638
  elog.info('Total new files: %s', len(updates))
556
639
 
557
- checkwarn(val=len(updates),
640
+ checkwarn(val=len(updates) if not args.testmode else
641
+ min(args.testlimit, len(updates)),
558
642
  loggers=[logger],
559
643
  **vars(args))
644
+ if args.testmode:
645
+ logger.warning('Test mode is ON - number of updates limited to %s', args.testlimit)
646
+ elog.warning('Test mode is ON - number of updates limited to %s', args.testlimit)
560
647
 
561
648
  #update all the new files
562
649
  verbo(args.verbosity, **{'Total to process': len(updates)})
650
+
563
651
  try:
564
652
  count = 0
653
+ testcount = 0
565
654
  for doi in updates:
655
+ if args.testmode and (testcount >= args.testlimit):
656
+ logger.info('Test limit of %s reached', args.testlimit)
657
+ break
566
658
  count += 1
567
659
  logger.info('Start processing %s of %s', count, len(updates))
568
660
  logger.info('DOI: %s, Dryad URL: https://datadryad.org/stash/dataset/%s',
@@ -608,6 +700,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
608
700
  transfer.set_correct_date()
609
701
  notify(new_content(study),
610
702
  **vars(args))
703
+ testcount+=1
611
704
 
612
705
  elif update_type == 'updated':
613
706
  logger.info('Updated metadata: %s', doi[0])
@@ -652,7 +745,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
652
745
  elog.info('Completed update process')
653
746
  finished = ('Dryad to Dataverse transfers completed',
654
747
  ('Dryad to Dataverse transfer daemon has completed.\n'
655
- f'Log available at: {log}'))
748
+ f'Log available at: {args.log}'))
656
749
  notify(finished, **vars(args))
657
750
 
658
751
  except dryad2dataverse.exceptions.DataverseBadApiKeyError as api_err:
@@ -673,3 +766,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
673
766
 
674
767
  if __name__ == '__main__':
675
768
  main()
769
+ _parser = argp()
770
+ _args = _parser.parse_args()
771
+ print('This is what you would have done had you actually run this')
772
+ print(_args)
@@ -11,11 +11,13 @@ import requests
11
11
  from requests.adapters import HTTPAdapter
12
12
 
13
13
  from dryad2dataverse import constants
14
+ from dryad2dataverse import USERAGENT
14
15
 
15
16
  LOGGER = logging.getLogger(__name__)
16
17
  #Connection monitoring as per
17
18
  #https://stackoverflow.com/questions/16337511/log-all-requests-from-the-python-requests-module
18
19
  URL_LOGGER = logging.getLogger('urllib3')
20
+ USER_AGENT = {'User-agent': USERAGENT}
19
21
 
20
22
  class Serializer():
21
23
  '''
@@ -72,6 +74,7 @@ class Serializer():
72
74
  try:
73
75
  headers = {'accept':'application/json',
74
76
  'Content-Type':'application/json'}
77
+ headers.update(USER_AGENT)
75
78
  doiClean = urllib.parse.quote(self.doi, safe='')
76
79
  resp = self.session.get(f'{url}/api/v2/datasets/{doiClean}',
77
80
  headers=headers, timeout=timeout)
@@ -164,6 +167,7 @@ class Serializer():
164
167
  self._fileJson = []
165
168
  headers = {'accept':'application/json',
166
169
  'Content-Type':'application/json'}
170
+ headers.update(USER_AGENT)
167
171
  fileList = self.session.get(f'{constants.DRYURL}/api/v2/versions/{self.id}/files',
168
172
  headers=headers,
169
173
  timeout=timeout)
@@ -2,6 +2,7 @@
2
2
  This module handles data downloads and uploads from a Dryad instance to a Dataverse instance
3
3
  '''
4
4
 
5
+ #TODO harmonize headers instead of hideous copypasta
5
6
  import hashlib
6
7
  import io
7
8
  import json
@@ -18,7 +19,9 @@ from requests_toolbelt.multipart.encoder import MultipartEncoder
18
19
 
19
20
  from dryad2dataverse import constants
20
21
  from dryad2dataverse import exceptions
22
+ from dryad2dataverse import USERAGENT
21
23
 
24
+ USER_AGENT = {'User-agent': USERAGENT}
22
25
  LOGGER = logging.getLogger(__name__)
23
26
  URL_LOGGER = logging.getLogger('urllib3')
24
27
 
@@ -85,6 +88,7 @@ class Transfer():
85
88
  if not url:
86
89
  url = constants.DVURL
87
90
  headers = {'X-Dataverse-key': apikey if apikey else constants.APIKEY}
91
+ headers.update(USER_AGENT)
88
92
  bad_test = self.session.get(f'{url}/api/datasets/:persistentId',
89
93
  headers=headers,
90
94
  params=params)
@@ -232,6 +236,7 @@ class Transfer():
232
236
  else:
233
237
  headers = {'X-Dataverse-key' : constants.APIKEY}
234
238
 
239
+ headers.update(USER_AGENT)
235
240
  params = {'persistentId': hdl}
236
241
  set_date = self.session.put(f'{url}/api/datasets/:persistentId/citationdate',
237
242
  headers=headers,
@@ -284,7 +289,7 @@ class Transfer():
284
289
  if not apikey:
285
290
  apikey = constants.APIKEY
286
291
  headers = {'X-Dataverse-key' : apikey}
287
-
292
+ headers.update(USER_AGENT)
288
293
  targetDv = kwargs.get('targetDv')
289
294
  dvpid = kwargs.get('dvpid')
290
295
  #dryFid = kwargs.get('dryFid') #Why did I put this here?
@@ -355,7 +360,7 @@ class Transfer():
355
360
  @staticmethod
356
361
  def _check_md5(infile, dig_type):
357
362
  '''
358
- Returns the md5 checksum of a file.
363
+ Returns the hex digest of a file (formerly just md5sum).
359
364
 
360
365
  ----------------------------------------
361
366
  Parameters:
@@ -442,6 +447,7 @@ class Transfer():
442
447
 
443
448
  if size:
444
449
  if size > constants.MAX_UPLOAD:
450
+ #TOO BIG
445
451
  LOGGER.warning('%s: File %s exceeds '
446
452
  'Dataverse MAX_UPLOAD size. Skipping download.',
447
453
  self.doi, filename)
@@ -485,6 +491,7 @@ class Transfer():
485
491
  if url == i[0]:
486
492
  i[-1] = md5
487
493
  LOGGER.debug('Complete download sequence')
494
+ #This doesn't actually return an md5, just the hash value
488
495
  return md5
489
496
  except (requests.exceptions.HTTPError,
490
497
  requests.exceptions.ConnectionError) as err:
@@ -560,6 +567,8 @@ class Transfer():
560
567
  headers = {'X-Dataverse-key': apikey}
561
568
  else:
562
569
  headers = self.auth
570
+
571
+ headers.update(USER_AGENT)
563
572
  params = {'persistentId': study}
564
573
  try:
565
574
  lock_status = self.session.get(f'{dv_url}/api/datasets/:persistentId/locks',
@@ -608,6 +617,8 @@ class Transfer():
608
617
  headers = {'X-Dataverse-key': apikey}
609
618
  else:
610
619
  headers = self.auth
620
+
621
+ headers.update(USER_AGENT)
611
622
  params = {'persistentId': study}
612
623
  lock_status = self.session.get(f'{dv_url}/api/datasets/:persistentId/locks',
613
624
  headers=headers,
@@ -641,7 +652,9 @@ class Transfer():
641
652
 
642
653
  def upload_file(self, dryadUrl=None, filename=None,
643
654
  mimetype=None, size=None, descr=None,
644
- md5=None, studyId=None, dest=None,
655
+ hashtype=None,
656
+ #md5=None, studyId=None, dest=None,
657
+ digest=None, studyId=None, dest=None,
645
658
  fprefix=None, force_unlock=False, timeout=300):
646
659
  '''
647
660
  Uploads file to Dataverse study. Returns a tuple of the
@@ -668,8 +681,11 @@ class Transfer():
668
681
  dest : str
669
682
  — Destination dataverse installation url.
670
683
  Defaults to constants.DVURL.
684
+ hashtype: str
685
+ original Dryad hash type
671
686
 
672
- md5 : str
687
+ #md5 : str
688
+ digest
673
689
  — md5 checksum for file.
674
690
 
675
691
  fprefix : str
@@ -692,6 +708,8 @@ class Transfer():
692
708
 
693
709
  ----------------------------------------
694
710
  '''
711
+ #return locals()
712
+ #TODONE remove above
695
713
  if not studyId:
696
714
  studyId = self.dvpid
697
715
  if not dest:
@@ -730,6 +748,7 @@ class Transfer():
730
748
  ctype = {'Content-type' : multi.content_type}
731
749
  tmphead = self.auth.copy()
732
750
  tmphead.update(ctype)
751
+ tmphead.update(USER_AGENT)
733
752
  url = dest + '/api/datasets/:persistentId/add'
734
753
  try:
735
754
  upload = self.session.post(url, params=params,
@@ -739,9 +758,22 @@ class Transfer():
739
758
  upload.raise_for_status()
740
759
  self.fileUpRecord.append((fid, upload.json()))
741
760
  upmd5 = upload.json()['data']['files'][0]['dataFile']['checksum']['value']
742
- if md5 and upmd5 != md5:
761
+ #Dataverse hash type
762
+ _type = upload.json()['data']['files'][0]['dataFile']['checksum']['type']
763
+ if _type.lower() != hashtype.lower():
764
+ comparator = self._check_md5(upfile, _type.lower())
765
+ else:
766
+ comparator = digest
767
+ #if hashtype.lower () != 'md5':
768
+ # #get an md5 because dataverse uses md5s. Or most of them do anyway.
769
+ # #One day this will be rewritten properly.
770
+ # md5 = self._check_md5(filename, 'md5')
771
+ #else:
772
+ # md5 = digest
773
+ #if md5 and (upmd5 != md5):
774
+ if upmd5 != comparator:
743
775
  try:
744
- raise exceptions.HashError(f'md5sum mismatch:\nlocal: {md5}\nuploaded: {upmd5}')
776
+ raise exceptions.HashError(f'{_type} mismatch:\nlocal: {comparator}\nuploaded: {upmd5}')
745
777
  except exceptions.HashError as e:
746
778
  LOGGER.exception(e)
747
779
  raise
@@ -1,42 +0,0 @@
1
- **/__pycache__/**
2
- **pyc
3
- **~
4
- *cfg
5
- *log
6
- analysis/crosswalk/.~*
7
- bin
8
- bin/**
9
- dryad2dataverse.egg-info
10
- filediff.py
11
- flake8.txt
12
- gitnotes.md
13
- include
14
- include/**
15
- lib
16
- lib/**
17
- tests/junk*.db
18
- tests/*bak.json
19
- tmp
20
- tmp/**
21
- x.py
22
- minisample.py
23
- man
24
- man/**
25
- daemon*
26
- daemon.cmd.soroban_test.txt
27
- daemon*.cmd.txt
28
- .readthedocs**
29
- docs/.readthe*
30
- scripts/dryadd_testing.py
31
- site/
32
- tests/basic_file_JSON.json
33
- binary_files
34
- binary_files/**
35
- scripts/testpickle
36
- scripts/dryadd_t.py
37
- dist/
38
- dist/**
39
- build/
40
- build/**
41
- bin/
42
- bin/**