dryad2dataverse 0.7.1__tar.gz → 0.7.5__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.5}/PKG-INFO +2 -2
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/requirements.txt +1 -1
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/__init__.py +4 -2
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/monitor.py +4 -1
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/scripts/dryadd.py +48 -8
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/serializer.py +4 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/transfer.py +38 -6
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5/src/dryad2dataverse.egg-info}/PKG-INFO +2 -2
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse.egg-info/requires.txt +1 -1
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/tests/tests_monitor.py +5 -2
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/tests/tests_serializer.py +3 -1
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/.gitignore +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/README.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/_config.yml +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/api_reference.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/changelog.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/compiling.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/credits.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/css/extra.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/anomalies.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/anomalies.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.css.map +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap-theme.min.css.map +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.css.map +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/css/bootstrap.min.css.map +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/js/bootstrap.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/bootstrap/js/npm.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/fastclick/fastclick.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/jQuery/jquery-2.2.3.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/jQueryUI/jquery-ui.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/admin-lte/plugins/slimScroll/jquery.slimscroll.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/anchor-js/anchor.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/codemirror.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/codemirror.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/sql.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net/jquery.dataTables.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-bs/css/dataTables.bootstrap.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-bs/js/dataTables.bootstrap.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.colVis.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.flash.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.html5.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/buttons.print.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons/dataTables.buttons.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons-bs/css/buttons.bootstrap.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/datatables.net-buttons-bs/js/buttons.bootstrap.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/css/font-awesome.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/css/font-awesome.css.map +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/css/font-awesome.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/FontAwesome.otf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/html5shiv/html5shiv.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/css/ionicons.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/css/ionicons.min.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/fonts/ionicons.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/fonts/ionicons.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/fonts/ionicons.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/fonts/ionicons.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/jquery/jquery.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/js-xlsx/xlsx.full.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/pdfmake/pdfmake.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/pdfmake/vfs_fonts.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/respond/respond.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/salvattore/salvattore.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/salvattore/salvattore.min.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/column.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/columns.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/constraint.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/constraints.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/deletionOrder.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/orphans/orphans.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/orphans/orphans.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/summary/relationships.real.compact.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/summary/relationships.real.compact.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/summary/relationships.real.large.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/summary/relationships.real.large.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadFiles.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadFiles.2degrees.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dryadStudy.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvFiles.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvFiles.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvFiles.2degrees.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvStudy.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvStudy.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/dvStudy.2degrees.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/failed_uploads.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/failed_uploads.2degrees.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/lastcheck.1degree.dot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/diagrams/tables/lastcheck.1degree.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/dryad_dataverse_monitor.sqlite3.%.xml +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/favicon.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower-v8-latin-regular.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/indieflower/indie-flower.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-300italic.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-600italic.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-700.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.eot +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.ttf +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro-v10-latin-regular.woff2 +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/fonts/source-sans-pro/source-sans-pro.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/images/foreignKey.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/images/foreignKeys.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/images/primaryKey.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/images/primaryKeys.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/index.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/info-html.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/insertionOrder.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/main.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/orphans.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/relationships.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/relationships.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/routines/routine.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/routines.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/routines.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/schemaSpy.css +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/schemaSpy.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/dryadFiles.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/dryadStudy.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/dvFiles.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/dvStudy.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/failed_uploads.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/lastcheck.html +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/tables/table.js +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/faq.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/images/dryad2dataverseLogo.png +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/images/dryad2dataverseLogo.svg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/index.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/installation.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/other_utils.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/pydoc-markdown.yml +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/reference.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/script.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/track.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/license.md +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/mkdocs.yml +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/pyproject.toml +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/setup.cfg +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/setup.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/constants.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/exceptions.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse/handlers.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse.egg-info/SOURCES.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse.egg-info/dependency_links.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse.egg-info/entry_points.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/src/dryad2dataverse.egg-info/top_level.txt +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/tests/__init__.py +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/tests/badURL.json +0 -0
- {dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/tests/tests_transfer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dryad2dataverse
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.5
|
|
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
|
|
@@ -20,7 +20,7 @@ Description-Content-Type: text/markdown
|
|
|
20
20
|
Requires-Dist: certifi>=2022.12.7
|
|
21
21
|
Requires-Dist: charset-normalizer>=2.0.4
|
|
22
22
|
Requires-Dist: chardet>=3.0.4
|
|
23
|
-
Requires-Dist: idna>=2.10
|
|
23
|
+
Requires-Dist: idna>=2.10.0
|
|
24
24
|
Requires-Dist: pycryptodome>=3.20.0
|
|
25
25
|
Requires-Dist: requests>=2.26.0
|
|
26
26
|
Requires-Dist: requests-toolbelt>=0.9.1
|
|
@@ -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, 5)
|
|
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,7 @@ import glob
|
|
|
14
14
|
import logging
|
|
15
15
|
import logging.handlers
|
|
16
16
|
import os
|
|
17
|
+
import pathlib
|
|
17
18
|
import shutil
|
|
18
19
|
import smtplib
|
|
19
20
|
import sys
|
|
@@ -27,7 +28,7 @@ import dryad2dataverse.serializer
|
|
|
27
28
|
import dryad2dataverse.transfer
|
|
28
29
|
from dryad2dataverse.handlers import SSLSMTPHandler
|
|
29
30
|
|
|
30
|
-
VERSION = (0,
|
|
31
|
+
VERSION = (0, 6, 2)
|
|
31
32
|
__version__ = '.'.join([str(x) for x in VERSION])
|
|
32
33
|
|
|
33
34
|
DRY = 'https://datadryad.org/api/v2'
|
|
@@ -372,6 +373,21 @@ def argp():
|
|
|
372
373
|
type=int,
|
|
373
374
|
dest='warn',
|
|
374
375
|
default=15)
|
|
376
|
+
parser.add_argument('--testmode-on',
|
|
377
|
+
help=('Turn on test mode. '
|
|
378
|
+
'Number of transfers will be limited '
|
|
379
|
+
'to the value in --testmode-limit '
|
|
380
|
+
'or 5 if you don\'t set --testmode-limit '),
|
|
381
|
+
action='store_true',
|
|
382
|
+
dest='testmode')
|
|
383
|
+
parser.add_argument('--testmode-limit',
|
|
384
|
+
help=('Test mode - only transfer first [n] '
|
|
385
|
+
'of the total number of (new) records. Old ones will '
|
|
386
|
+
'still be updated, though. '
|
|
387
|
+
'Default: 5'),
|
|
388
|
+
type=int,
|
|
389
|
+
default=5,
|
|
390
|
+
dest='testlimit')
|
|
375
391
|
parser.add_argument('--version', action='version',
|
|
376
392
|
version='%(prog)s '+__version__
|
|
377
393
|
+'; dryad2dataverse '+
|
|
@@ -416,7 +432,8 @@ def email_log(mailhost, fromaddr, toaddrs, credentials, port=465, secure=(),
|
|
|
416
432
|
'''
|
|
417
433
|
#pylint: disable=too-many-arguments
|
|
418
434
|
#Because consistency is for suckers and yahoo requires full hostname
|
|
419
|
-
subject = 'Dryad to Dataverse transfer error'
|
|
435
|
+
#subject = 'Dryad to Dataverse transfer error'
|
|
436
|
+
subject = 'Dryad to Dataverse logger message'
|
|
420
437
|
elog = logging.getLogger('email_log')
|
|
421
438
|
mailer = SSLSMTPHandler(mailhost=(mailhost, port),
|
|
422
439
|
fromaddr=fromaddr,
|
|
@@ -491,11 +508,11 @@ def checkwarn(val:int, **kwargs) -> None:
|
|
|
491
508
|
mess = ('Large number of updates detected. '
|
|
492
509
|
f'{val} new studies exceeds threshold of {kwargs.get("warn", 0)}. '
|
|
493
510
|
'Program execution halted.')
|
|
494
|
-
subject =
|
|
511
|
+
subject = 'Dryad to Dataverse large update warning'
|
|
495
512
|
for logme in kwargs.get('loggers'):
|
|
496
513
|
logme.warning(mess)
|
|
497
514
|
notify(msgtxt=(subject, mess),
|
|
498
|
-
**
|
|
515
|
+
**kwargs)
|
|
499
516
|
sys.exit()
|
|
500
517
|
|
|
501
518
|
def verbo(verbosity:bool, **kwargs)->None:
|
|
@@ -536,9 +553,18 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
|
|
|
536
553
|
monitor = dryad2dataverse.monitor.Monitor(args.dbase)
|
|
537
554
|
#copy the database to make a backup, because paranoia is your friend
|
|
538
555
|
if os.path.exists(dryad2dataverse.constants.DBASE):
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
556
|
+
bu_db = pathlib.Path(dryad2dataverse.constants.DBASE)
|
|
557
|
+
try:
|
|
558
|
+
shutil.copyfile( bu_db,
|
|
559
|
+
pathlib.Path(bu_db.parent,
|
|
560
|
+
bu_db.stem + '_' +
|
|
561
|
+
datetime.datetime.now().strftime('%Y-%m-%d-%H%M') +
|
|
562
|
+
bu_db.suffix)
|
|
563
|
+
)
|
|
564
|
+
except FileNotFoundError:
|
|
565
|
+
print(dryad2dataverse.constants.DBASE)
|
|
566
|
+
print(bu_db)
|
|
567
|
+
sys.exit()
|
|
542
568
|
#list comprehension includes untimestamped dbase name, hence 2+
|
|
543
569
|
fnames = glob.glob(os.path.abspath(dryad2dataverse.constants.DBASE)
|
|
544
570
|
+'*')
|
|
@@ -554,15 +580,24 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
|
|
|
554
580
|
logger.info('Total new files: %s', len(updates))
|
|
555
581
|
elog.info('Total new files: %s', len(updates))
|
|
556
582
|
|
|
557
|
-
checkwarn(val=len(updates)
|
|
583
|
+
checkwarn(val=len(updates) if not args.testmode else
|
|
584
|
+
min(args.testlimit, len(updates)),
|
|
558
585
|
loggers=[logger],
|
|
559
586
|
**vars(args))
|
|
587
|
+
if args.testmode:
|
|
588
|
+
logger.warning('Test mode is ON - number of updates limited to %s', args.testlimit)
|
|
589
|
+
elog.warning('Test mode is ON - number of updates limited to %s', args.testlimit)
|
|
560
590
|
|
|
561
591
|
#update all the new files
|
|
562
592
|
verbo(args.verbosity, **{'Total to process': len(updates)})
|
|
593
|
+
|
|
563
594
|
try:
|
|
564
595
|
count = 0
|
|
596
|
+
testcount = 0
|
|
565
597
|
for doi in updates:
|
|
598
|
+
if args.testmode and (testcount >= args.testlimit):
|
|
599
|
+
logger.info('Test limit of %s reached', args.testlimit)
|
|
600
|
+
break
|
|
566
601
|
count += 1
|
|
567
602
|
logger.info('Start processing %s of %s', count, len(updates))
|
|
568
603
|
logger.info('DOI: %s, Dryad URL: https://datadryad.org/stash/dataset/%s',
|
|
@@ -608,6 +643,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
|
|
|
608
643
|
transfer.set_correct_date()
|
|
609
644
|
notify(new_content(study),
|
|
610
645
|
**vars(args))
|
|
646
|
+
testcount+=1
|
|
611
647
|
|
|
612
648
|
elif update_type == 'updated':
|
|
613
649
|
logger.info('Updated metadata: %s', doi[0])
|
|
@@ -673,3 +709,7 @@ def main(log='/var/log/dryadd.log', level=logging.WARNING):
|
|
|
673
709
|
|
|
674
710
|
if __name__ == '__main__':
|
|
675
711
|
main()
|
|
712
|
+
_parser = argp()
|
|
713
|
+
_args = _parser.parse_args()
|
|
714
|
+
print('This is what you would have done had you actually run this')
|
|
715
|
+
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: dryad2dataverse
|
|
3
|
-
Version: 0.7.
|
|
3
|
+
Version: 0.7.5
|
|
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
|
|
@@ -20,7 +20,7 @@ Description-Content-Type: text/markdown
|
|
|
20
20
|
Requires-Dist: certifi>=2022.12.7
|
|
21
21
|
Requires-Dist: charset-normalizer>=2.0.4
|
|
22
22
|
Requires-Dist: chardet>=3.0.4
|
|
23
|
-
Requires-Dist: idna>=2.10
|
|
23
|
+
Requires-Dist: idna>=2.10.0
|
|
24
24
|
Requires-Dist: pycryptodome>=3.20.0
|
|
25
25
|
Requires-Dist: requests>=2.26.0
|
|
26
26
|
Requires-Dist: requests-toolbelt>=0.9.1
|
|
@@ -70,7 +70,9 @@ class TestMonitor(unittest.TestCase):
|
|
|
70
70
|
def test_07_added_files(self):
|
|
71
71
|
self.assertEqual.__self__.maxDiff = None
|
|
72
72
|
newdata=copy.copy(self.testCase.fileJson[0]['_embedded']['stash:files'][-1])
|
|
73
|
-
newdata['_links']['stash:file-download']['href'] = '/api/v2/files/999999/download'
|
|
73
|
+
#newdata['_links']['stash:file-download']['href'] = '/api/v2/files/999999/download'
|
|
74
|
+
#let's change API output for no reason!
|
|
75
|
+
newdata['_links']['stash:download']['href'] = '/api/v2/files/999999/download'
|
|
74
76
|
newdata['path'] = 'ubc_rand1.csv'
|
|
75
77
|
newdata['description'] = 'UBC random data 1'
|
|
76
78
|
newdata['digestType'] = 'md5'
|
|
@@ -100,7 +102,8 @@ class TestMonitor(unittest.TestCase):
|
|
|
100
102
|
'application/x-zip-compressed',
|
|
101
103
|
23787587,
|
|
102
104
|
'',
|
|
103
|
-
'', '')]}
|
|
105
|
+
#'', '')]}
|
|
106
|
+
'sha-256', 'cb1c4f28de8aaec8c8c4b1eca498eace1c2c8c847dd443bd5314d42a70d6e4ae')]}
|
|
104
107
|
self.assertEqual.__self__.maxDiff = None
|
|
105
108
|
self.assertEqual(expect, diff)
|
|
106
109
|
#and restore
|
|
@@ -155,7 +155,9 @@ class TestSerialize(unittest.TestCase):
|
|
|
155
155
|
notes = {'typeName': 'notesText',
|
|
156
156
|
'typeClass':'primitive',
|
|
157
157
|
'multiple':False,
|
|
158
|
-
'value': '<p><b>Dryad version number:</b> 4</p>\n<p><b>Version status:</b> submitted</p>\n<p><b>Dryad curation status:</b> Published</p>\n<p><b>Sharing link:</b> https://datadryad.org/stash/share/anFoRwjUzvjvpH8RA2T0mNipNsVst0s0N5mFzcTTcJE</p>\n<p><b>Storage size:</b> 23874866</p>\n<p><b>Visibility:</b> public</p>\n'}
|
|
158
|
+
#'value': '<p><b>Dryad version number:</b> 4</p>\n<p><b>Version status:</b> submitted</p>\n<p><b>Dryad curation status:</b> Published</p>\n<p><b>Sharing link:</b> https://datadryad.org/stash/share/anFoRwjUzvjvpH8RA2T0mNipNsVst0s0N5mFzcTTcJE</p>\n<p><b>Storage size:</b> 23874866</p>\n<p><b>Visibility:</b> public</p>\n'}
|
|
159
|
+
#Why keep something the same over time? That's for suckers!
|
|
160
|
+
'value': '<p><b>Dryad version number:</b> 4</p>\n<p><b>Version status:</b> submitted</p>\n<p><b>Dryad curation status:</b> Published</p>\n<p><b>Sharing link:</b> http://datadryad.org/stash/dataset/doi:10.5061/dryad.2rbnzs7jp</p>\n<p><b>Storage size:</b> 23874866</p>\n<p><b>Visibility:</b> public</p>\n'}
|
|
159
161
|
self.assertEqual(self.testCase._convert_notes(self.testCase.dryadJson), notes )
|
|
160
162
|
|
|
161
163
|
def test_pub_date(self):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/anchor-js/anchor.min.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/codemirror.css
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/codemirror.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/codemirror/sql.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/ionicons/css/ionicons.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/js-xlsx/xlsx.full.min.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/pdfmake/pdfmake.min.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/pdfmake/vfs_fonts.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/respond/respond.min.js
RENAMED
|
File without changes
|
{dryad2dataverse-0.7.1 → dryad2dataverse-0.7.5}/docs/dbase_structure/bower/salvattore/salvattore.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|