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.
- {dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info → dryad2dataverse-0.7.10}/PKG-INFO +27 -16
- dryad2dataverse-0.7.10/pyproject.toml +60 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/__init__.py +4 -2
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/monitor.py +4 -1
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/scripts/dryadd.py +115 -18
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/serializer.py +4 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/transfer.py +38 -6
- dryad2dataverse-0.7.1/.gitignore +0 -42
- dryad2dataverse-0.7.1/PKG-INFO +0 -79
- dryad2dataverse-0.7.1/docs/_config.yml +0 -15
- dryad2dataverse-0.7.1/docs/api_reference.md +0 -1463
- dryad2dataverse-0.7.1/docs/changelog.md +0 -135
- dryad2dataverse-0.7.1/docs/compiling.md +0 -43
- dryad2dataverse-0.7.1/docs/credits.md +0 -20
- dryad2dataverse-0.7.1/docs/css/extra.css +0 -31
- dryad2dataverse-0.7.1/docs/dbase_structure/anomalies.html +0 -311
- dryad2dataverse-0.7.1/docs/dbase_structure/anomalies.js +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css +0 -587
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css.map +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css.map +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css +0 -6757
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css.map +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css.map +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -288
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.js +0 -2377
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.min.js +0 -7
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/bootstrap/js/npm.js +0 -13
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.js +0 -841
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.min.js +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQuery/jquery-2.2.3.min.js +0 -4
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.js +0 -16617
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.min.js +0 -13
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.js +0 -474
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.min.js +0 -16
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/anchor-js/anchor.min.js +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/codemirror.css +0 -340
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/codemirror.js +0 -9502
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/codemirror/sql.js +0 -451
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net/jquery.dataTables.min.js +0 -167
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.css +0 -184
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.min.css +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.js +0 -182
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.min.js +0 -8
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.js +0 -206
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.min.js +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.js +0 -1441
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.min.js +0 -31
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.js +0 -1370
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.min.js +0 -26
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.js +0 -194
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.min.js +0 -4
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.js +0 -1705
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.min.js +0 -37
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.css +0 -158
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.min.css +0 -1
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.js +0 -68
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.min.js +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.css +0 -2337
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.css.map +0 -7
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/css/font-awesome.min.css +0 -4
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/FontAwesome.otf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.svg +0 -2671
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/html5shiv/html5shiv.min.js +0 -4
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/css/ionicons.css +0 -1480
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/css/ionicons.min.css +0 -11
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.svg +0 -2230
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/ionicons/fonts/ionicons.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/jquery/jquery.js +0 -10253
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/js-xlsx/xlsx.full.min.js +0 -22
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/pdfmake/pdfmake.min.js +0 -29
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/pdfmake/vfs_fonts.js +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/respond/respond.min.js +0 -5
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/salvattore/salvattore.css +0 -53
- dryad2dataverse-0.7.1/docs/dbase_structure/bower/salvattore/salvattore.min.js +0 -7
- dryad2dataverse-0.7.1/docs/dbase_structure/column.js +0 -117
- dryad2dataverse-0.7.1/docs/dbase_structure/columns.html +0 -433
- dryad2dataverse-0.7.1/docs/dbase_structure/constraint.js +0 -14
- dryad2dataverse-0.7.1/docs/dbase_structure/constraints.html +0 -266
- dryad2dataverse-0.7.1/docs/dbase_structure/deletionOrder.txt +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/orphans/orphans.dot +0 -14
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/orphans/orphans.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.compact.dot +0 -67
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.compact.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.large.dot +0 -75
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/summary/relationships.real.large.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.dot +0 -28
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.dot +0 -64
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.dot +0 -70
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.1degree.dot +0 -32
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.dot +0 -68
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.1degree.dot +0 -28
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.dot +0 -64
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.dot +0 -29
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.dot +0 -65
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/lastcheck.1degree.dot +0 -14
- dryad2dataverse-0.7.1/docs/dbase_structure/diagrams/tables/lastcheck.1degree.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/dryad_dataverse_monitor.sqlite3.%.xml +0 -52
- dryad2dataverse-0.7.1/docs/dbase_structure/favicon.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.svg +0 -659
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/indieflower/indie-flower.css +0 -12
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.svg +0 -347
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.svg +0 -357
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.svg +0 -343
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.svg +0 -350
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.svg +0 -339
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.eot +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.svg +0 -344
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.ttf +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff2 +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro.css +0 -78
- dryad2dataverse-0.7.1/docs/dbase_structure/images/foreignKey.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/images/foreignKeys.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/images/primaryKey.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/images/primaryKeys.png +0 -0
- dryad2dataverse-0.7.1/docs/dbase_structure/index.html +0 -312
- dryad2dataverse-0.7.1/docs/dbase_structure/info-html.txt +0 -5
- dryad2dataverse-0.7.1/docs/dbase_structure/insertionOrder.txt +0 -6
- dryad2dataverse-0.7.1/docs/dbase_structure/main.js +0 -69
- dryad2dataverse-0.7.1/docs/dbase_structure/orphans.html +0 -146
- dryad2dataverse-0.7.1/docs/dbase_structure/relationships.html +0 -168
- dryad2dataverse-0.7.1/docs/dbase_structure/relationships.js +0 -13
- dryad2dataverse-0.7.1/docs/dbase_structure/routines/routine.js +0 -34
- dryad2dataverse-0.7.1/docs/dbase_structure/routines.html +0 -164
- dryad2dataverse-0.7.1/docs/dbase_structure/routines.js +0 -70
- dryad2dataverse-0.7.1/docs/dbase_structure/schemaSpy.css +0 -162
- dryad2dataverse-0.7.1/docs/dbase_structure/schemaSpy.js +0 -45
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/dryadFiles.html +0 -247
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/dryadStudy.html +0 -341
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/dvFiles.html +0 -315
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/dvStudy.html +0 -247
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/failed_uploads.html +0 -264
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/lastcheck.html +0 -213
- dryad2dataverse-0.7.1/docs/dbase_structure/tables/table.js +0 -85
- dryad2dataverse-0.7.1/docs/faq.md +0 -109
- dryad2dataverse-0.7.1/docs/images/dryad2dataverseLogo.png +0 -0
- dryad2dataverse-0.7.1/docs/images/dryad2dataverseLogo.svg +0 -60
- dryad2dataverse-0.7.1/docs/index.md +0 -116
- dryad2dataverse-0.7.1/docs/installation.md +0 -72
- dryad2dataverse-0.7.1/docs/other_utils.md +0 -13
- dryad2dataverse-0.7.1/docs/pydoc-markdown.yml +0 -46
- dryad2dataverse-0.7.1/docs/reference.md +0 -92
- dryad2dataverse-0.7.1/docs/script.md +0 -118
- dryad2dataverse-0.7.1/docs/track.md +0 -5
- dryad2dataverse-0.7.1/license.md +0 -27
- dryad2dataverse-0.7.1/mkdocs.yml +0 -28
- dryad2dataverse-0.7.1/pyproject.toml +0 -46
- dryad2dataverse-0.7.1/requirements.txt +0 -8
- dryad2dataverse-0.7.1/setup.cfg +0 -4
- dryad2dataverse-0.7.1/setup.py +0 -19
- dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/SOURCES.txt +0 -206
- dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/dependency_links.txt +0 -1
- dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/entry_points.txt +0 -2
- dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/requires.txt +0 -8
- dryad2dataverse-0.7.1/src/dryad2dataverse.egg-info/top_level.txt +0 -1
- dryad2dataverse-0.7.1/tests/__init__.py +0 -0
- dryad2dataverse-0.7.1/tests/badURL.json +0 -1
- dryad2dataverse-0.7.1/tests/tests_monitor.py +0 -135
- dryad2dataverse-0.7.1/tests/tests_serializer.py +0 -236
- dryad2dataverse-0.7.1/tests/tests_transfer.py +0 -62
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/README.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/constants.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/exceptions.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.10}/src/dryad2dataverse/handlers.py +0 -0
|
@@ -1,30 +1,40 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: dryad2dataverse
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.10
|
|
4
4
|
Summary: Utility for copying and syncing data from a Dryad data repository to a Dataverse repository
|
|
5
|
-
|
|
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-
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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='
|
|
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 =
|
|
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
|
-
**
|
|
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
|
|
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
|
-
|
|
527
|
-
|
|
528
|
-
|
|
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
|
-
|
|
540
|
-
|
|
541
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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'
|
|
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
|
dryad2dataverse-0.7.1/.gitignore
DELETED
|
@@ -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/**
|