csvpath 0.0.616__tar.gz → 0.0.619__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.
- {csvpath-0.0.616 → csvpath-0.0.619}/PKG-INFO +1 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-local.ini +3 -3
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/azure.bat +11 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/gcs.bat +6 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/local.bat +7 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/s3.bat +8 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/sftp.bat +8 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/csvpath.py +2 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/csvpaths.py +19 -5
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_manager.py +145 -25
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_registrar.py +17 -16
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/files_listener.py +2 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/webhook/webhook_listener.py +7 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/metadata.py +1 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result.py +7 -2
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_manager.py +1 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/transfers_manager.py +41 -16
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_metadata.py +10 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_registrar.py +1 -6
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/sql/select.py +7 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/sql/sql_in.py +30 -15
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config.py +5 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/log_utility.py +1 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/nos.py +85 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/path_util.py +35 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_config.py +48 -9
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_data_reader.py +0 -30
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_nos.py +90 -9
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_server_creds.py +15 -5
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sqliter.py +2 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/template_util.py +7 -3
- {csvpath-0.0.616 → csvpath-0.0.619}/pyproject.toml +1 -1
- {csvpath-0.0.616 → csvpath-0.0.619}/LICENSE +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/README.md +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/.DS_Store +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/config.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/function.imports +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/.DS_Store +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/Mac.goenvironment.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/Windows.goenvironment.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/.DS_Store +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.36.tar.gz +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/config/config.ini +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/config/env.json +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_activator.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_describer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_descriptor.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_names_rules.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/files_activation_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_describer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_descriptor.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_manager.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/server_config.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/env.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/metadata.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/parquet.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/runtime.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/format.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/uuid.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/matches.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/percent_matching.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/slice.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/sort.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/parquet_utility.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_timing_policy.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/box.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/code.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_utility.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/referrer_printer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/stopwatch.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/xlsx/xlsx_reader_helper.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: csvpath
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.619
|
|
4
4
|
Summary: CsvPath Framework is a data preboarding automation library for receiving, validating, and tracking CSV, Excel, JSONL and other tabular data files before they can corrupt downstream data consumers.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: David Kershaw
|
|
@@ -26,7 +26,7 @@ path = cache
|
|
|
26
26
|
use_cache = no
|
|
27
27
|
|
|
28
28
|
[functions]
|
|
29
|
-
imports =
|
|
29
|
+
imports =
|
|
30
30
|
|
|
31
31
|
[results]
|
|
32
32
|
archive = tmp\local\archive
|
|
@@ -86,7 +86,7 @@ port = SFTPPLUS_PORT
|
|
|
86
86
|
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
87
87
|
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
88
88
|
api_url = https://. . . :10020/json
|
|
89
|
-
scripts_dir =
|
|
89
|
+
scripts_dir =
|
|
90
90
|
execute_timeout = 300
|
|
91
91
|
|
|
92
92
|
[ckan]
|
|
@@ -101,7 +101,7 @@ timeout = 5
|
|
|
101
101
|
verify = False
|
|
102
102
|
|
|
103
103
|
[slack]
|
|
104
|
-
webhook_url =
|
|
104
|
+
webhook_url =
|
|
105
105
|
|
|
106
106
|
[scripts]
|
|
107
107
|
run_scripts = yes
|
|
@@ -26,9 +26,18 @@ set OTEL_RESOURCE_ATTRIBUTES=""
|
|
|
26
26
|
|
|
27
27
|
echo %CSVPATH_CONFIG_PATH%
|
|
28
28
|
call c:\dev\win-exports.bat
|
|
29
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
|
|
30
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
|
|
31
29
|
|
|
30
|
+
IF NOT EXIST "%USERPROFILE%\.local\bin\poetry.exe" (
|
|
31
|
+
echo ERROR: The Poetry binary was not found.
|
|
32
|
+
EXIT /B 1
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
36
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
37
|
+
if %ERRORLEVEL% neq 0 (
|
|
38
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
39
|
+
exit /b %ERRORLEVEL%
|
|
40
|
+
)
|
|
32
41
|
|
|
33
42
|
net stop w32time
|
|
34
43
|
w32tm /unregister
|
|
@@ -25,9 +25,13 @@ set OTEL_SERVICE_NAME=""
|
|
|
25
25
|
set OTEL_RESOURCE_ATTRIBUTES=""
|
|
26
26
|
|
|
27
27
|
call c:\dev\win-exports.bat
|
|
28
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
|
|
29
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
|
|
30
28
|
|
|
29
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
30
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
31
|
+
IF %ERRORLEVEL% NEQ 0 (
|
|
32
|
+
echo "Tests failed. Failing the build..."
|
|
33
|
+
exit /b %ERRORLEVEL%
|
|
34
|
+
)
|
|
31
35
|
|
|
32
36
|
net stop w32time
|
|
33
37
|
w32tm /unregister
|
|
@@ -49,8 +49,13 @@ echo(
|
|
|
49
49
|
::
|
|
50
50
|
:: do the build
|
|
51
51
|
::
|
|
52
|
-
cmd.exe /C
|
|
53
|
-
cmd.exe /C
|
|
52
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
53
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
54
|
+
if %ERRORLEVEL% neq 0 (
|
|
55
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
56
|
+
exit /b %ERRORLEVEL%
|
|
57
|
+
)
|
|
58
|
+
|
|
54
59
|
|
|
55
60
|
|
|
56
61
|
net stop w32time
|
|
@@ -27,8 +27,14 @@ set OTEL_RESOURCE_ATTRIBUTES=""
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
call c:\dev\win-exports.bat
|
|
30
|
-
|
|
31
|
-
cmd.exe /C
|
|
30
|
+
|
|
31
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
32
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
33
|
+
if %ERRORLEVEL% neq 0 (
|
|
34
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
35
|
+
exit /b %ERRORLEVEL%
|
|
36
|
+
)
|
|
37
|
+
|
|
32
38
|
|
|
33
39
|
|
|
34
40
|
net stop w32time
|
|
@@ -25,8 +25,14 @@ set OTEL_SERVICE_NAME=""
|
|
|
25
25
|
set OTEL_RESOURCE_ATTRIBUTES=""
|
|
26
26
|
|
|
27
27
|
call c:\dev\win-exports.bat
|
|
28
|
-
|
|
29
|
-
cmd.exe /C
|
|
28
|
+
|
|
29
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
30
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
31
|
+
if %ERRORLEVEL% neq 0 (
|
|
32
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
33
|
+
exit /b %ERRORLEVEL%
|
|
34
|
+
)
|
|
35
|
+
|
|
30
36
|
|
|
31
37
|
|
|
32
38
|
net stop w32time
|
|
@@ -313,9 +313,10 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
313
313
|
self.error_manager.error_metrics.provider.shutdown()
|
|
314
314
|
self.error_manager.error_metrics = None
|
|
315
315
|
self.error_manager = None
|
|
316
|
-
lout.release_logger(self)
|
|
317
316
|
except Exception:
|
|
318
317
|
print(traceback.format_exc())
|
|
318
|
+
finally:
|
|
319
|
+
lout.release_logger(self)
|
|
319
320
|
|
|
320
321
|
#
|
|
321
322
|
# this method saves and reloads the config. if you don't want that use
|
|
@@ -4,7 +4,6 @@ of the CsvPath library. it makes it easier to scale your CSV quality control."""
|
|
|
4
4
|
import os
|
|
5
5
|
import traceback
|
|
6
6
|
import atexit
|
|
7
|
-
import threading
|
|
8
7
|
|
|
9
8
|
from uuid import uuid4
|
|
10
9
|
from abc import ABC, abstractmethod
|
|
@@ -226,9 +225,17 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
226
225
|
#
|
|
227
226
|
#
|
|
228
227
|
#
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
228
|
+
# this log line didn't add especial value. but it did set the logger
|
|
229
|
+
# to a certain log file before we had a chance to do a cd-and-reload
|
|
230
|
+
# to switch into a particular project. the fix isn't just to remove the
|
|
231
|
+
# line, it's also to make the logger travel with the config used. but
|
|
232
|
+
# removing the log line is easy enough and we don't lose much. And the
|
|
233
|
+
# real fix was already in set_config_path_and_reload() -- it was just
|
|
234
|
+
# releasing/renewing the logger.
|
|
235
|
+
#
|
|
236
|
+
# self.logger.info(
|
|
237
|
+
# f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
|
|
238
|
+
# )
|
|
232
239
|
|
|
233
240
|
@property
|
|
234
241
|
def logger(self):
|
|
@@ -588,9 +595,10 @@ Cache: {cache}
|
|
|
588
595
|
def __del__(self) -> None:
|
|
589
596
|
try:
|
|
590
597
|
self.wrap_up()
|
|
591
|
-
lout.release_logger(self)
|
|
592
598
|
except Exception:
|
|
593
599
|
print(traceback.format_exc())
|
|
600
|
+
finally:
|
|
601
|
+
lout.release_logger(self)
|
|
594
602
|
|
|
595
603
|
def _trim_archive_if(self, home: str) -> str:
|
|
596
604
|
archive = self.config.get(section="results", name="archive")
|
|
@@ -877,6 +885,7 @@ Cache: {cache}
|
|
|
877
885
|
run_dir=crt,
|
|
878
886
|
run_uuid=run_uuid,
|
|
879
887
|
method="collect_paths",
|
|
888
|
+
template=template,
|
|
880
889
|
)
|
|
881
890
|
# casting a broad net because if "raise" not in the error policy we
|
|
882
891
|
# want to never fail during a run
|
|
@@ -1047,6 +1056,7 @@ Cache: {cache}
|
|
|
1047
1056
|
run_dir=crt,
|
|
1048
1057
|
run_uuid=run_uuid,
|
|
1049
1058
|
method="fast_forward_paths",
|
|
1059
|
+
template=template,
|
|
1050
1060
|
)
|
|
1051
1061
|
try:
|
|
1052
1062
|
self._load_csvpath(
|
|
@@ -1181,6 +1191,7 @@ Cache: {cache}
|
|
|
1181
1191
|
run_dir=crt,
|
|
1182
1192
|
run_uuid=run_uuid,
|
|
1183
1193
|
method="next_paths",
|
|
1194
|
+
template=template,
|
|
1184
1195
|
)
|
|
1185
1196
|
if self._fail_all:
|
|
1186
1197
|
self.logger.warning(
|
|
@@ -1447,6 +1458,7 @@ Cache: {cache}
|
|
|
1447
1458
|
crt=crt,
|
|
1448
1459
|
method=method,
|
|
1449
1460
|
extra_data=extra_data,
|
|
1461
|
+
template=template,
|
|
1450
1462
|
)
|
|
1451
1463
|
#
|
|
1452
1464
|
# setting file into the csvpath is less obviously useful at CsvPaths
|
|
@@ -1624,6 +1636,7 @@ Cache: {cache}
|
|
|
1624
1636
|
crt: str,
|
|
1625
1637
|
method: str,
|
|
1626
1638
|
extra_data: Optional[dict[str, str]],
|
|
1639
|
+
template: str = "",
|
|
1627
1640
|
):
|
|
1628
1641
|
"""@private"""
|
|
1629
1642
|
#
|
|
@@ -1660,6 +1673,7 @@ Cache: {cache}
|
|
|
1660
1673
|
by_line=True,
|
|
1661
1674
|
run_uuid=run_uuid,
|
|
1662
1675
|
method=method,
|
|
1676
|
+
template=template,
|
|
1663
1677
|
)
|
|
1664
1678
|
csvpath[1] = result
|
|
1665
1679
|
#
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import re
|
|
2
2
|
import json
|
|
3
3
|
import traceback
|
|
4
|
-
from uuid import UUID
|
|
4
|
+
from uuid import UUID, uuid4
|
|
5
5
|
from typing import NewType
|
|
6
6
|
from json import JSONDecodeError
|
|
7
7
|
from csvpath.util.file_readers import DataFileReader
|
|
@@ -19,6 +19,7 @@ from csvpath.util.path_util import PathUtility as pathu
|
|
|
19
19
|
from csvpath.util.template_util import TemplateUtility as temu
|
|
20
20
|
from .file_registrar import FileRegistrar
|
|
21
21
|
from .lines_and_headers_cacher import LinesAndHeadersCacher
|
|
22
|
+
from .files_listener import FilesListener
|
|
22
23
|
from .file_metadata import FileMetadata
|
|
23
24
|
from .file_describer import NamedFileDescriber
|
|
24
25
|
from .file_activator import NamedFileActivator
|
|
@@ -219,8 +220,6 @@ class FileManager:
|
|
|
219
220
|
#
|
|
220
221
|
path = lst[0]
|
|
221
222
|
path = Nos(path).join("manifest.json")
|
|
222
|
-
# path = os.path.join(path, "manifest.json")
|
|
223
|
-
# nos = self.nos
|
|
224
223
|
nos = Nos(path)
|
|
225
224
|
if nos.exists():
|
|
226
225
|
mani = self.registrar.get_manifest(path)
|
|
@@ -284,6 +283,13 @@ class FileManager:
|
|
|
284
283
|
home = pathu.resep(home)
|
|
285
284
|
return home
|
|
286
285
|
|
|
286
|
+
#
|
|
287
|
+
# creates a named-file before registering any files.
|
|
288
|
+
#
|
|
289
|
+
def assure_named_file(self, name: NamedFileName) -> None:
|
|
290
|
+
home = self.assure_named_file_home(name)
|
|
291
|
+
self.registrar.manifest_path(home)
|
|
292
|
+
|
|
287
293
|
def configure_named_file(self, name: NamedFileName, descriptor: Config) -> None:
|
|
288
294
|
#
|
|
289
295
|
# updates the named-file's descriptor by replacement
|
|
@@ -634,11 +640,18 @@ class FileManager:
|
|
|
634
640
|
# issue driven by the 3rd party or business rules.
|
|
635
641
|
#
|
|
636
642
|
UUID(registration_uuid)
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
643
|
+
else:
|
|
644
|
+
#
|
|
645
|
+
# if we don't create the uuid here the metadata object will create one;
|
|
646
|
+
# however, if we want to tie log statements back we should have a uuid
|
|
647
|
+
# here, regardless of if the user creates it or we do.
|
|
648
|
+
#
|
|
649
|
+
registration_uuid = str(uuid4())
|
|
650
|
+
self.csvpaths.logger.info(
|
|
651
|
+
"Registration of %s will be associated with UUID %s",
|
|
652
|
+
path,
|
|
653
|
+
registration_uuid,
|
|
654
|
+
)
|
|
642
655
|
if not self.can_load(path):
|
|
643
656
|
#
|
|
644
657
|
# if False, can_load() will have already raised an error and/or, minimally,
|
|
@@ -648,14 +661,39 @@ class FileManager:
|
|
|
648
661
|
# will load any allowed files, even if some are not allowed -- but with the
|
|
649
662
|
# caveat that if an exception is raised we may stop in the middle of the load.
|
|
650
663
|
#
|
|
664
|
+
#
|
|
665
|
+
#
|
|
666
|
+
_ = {
|
|
667
|
+
"name": name,
|
|
668
|
+
"path": path,
|
|
669
|
+
"template": template,
|
|
670
|
+
"registration_uuid": registration_uuid,
|
|
671
|
+
}
|
|
672
|
+
self._registration_failed(_)
|
|
673
|
+
#
|
|
651
674
|
return
|
|
675
|
+
self.csvpaths.logger.info("Adding named file %s: can be loaded", name)
|
|
652
676
|
self.legal_name(name)
|
|
677
|
+
self.csvpaths.logger.info("Adding named file %s: name is legal", name)
|
|
653
678
|
if path is None or path.strip() == "":
|
|
679
|
+
_ = {
|
|
680
|
+
"name": name,
|
|
681
|
+
"path": path,
|
|
682
|
+
"template": template,
|
|
683
|
+
"registration_uuid": registration_uuid,
|
|
684
|
+
}
|
|
685
|
+
self._registration_failed(_)
|
|
654
686
|
raise ValueError("Path cannot be None or empty")
|
|
655
687
|
if template is None:
|
|
656
688
|
template = self.describer.get_template(name)
|
|
657
689
|
if template is not None:
|
|
690
|
+
self.csvpaths.logger.debug(
|
|
691
|
+
"Adding named file %s: checking template %s", name, template
|
|
692
|
+
)
|
|
658
693
|
temu.valid(template, file=True)
|
|
694
|
+
self.csvpaths.logger.info(
|
|
695
|
+
"Adding named file %s: template is valid or None: %s", name, template
|
|
696
|
+
)
|
|
659
697
|
if config is not None:
|
|
660
698
|
#
|
|
661
699
|
# doing config here enables copy_in() to pull down files
|
|
@@ -664,34 +702,58 @@ class FileManager:
|
|
|
664
702
|
# configured in advance, but that doesn't have to be the
|
|
665
703
|
# case.
|
|
666
704
|
#
|
|
705
|
+
self.csvpaths.logger.info(
|
|
706
|
+
"Adding named file %s: configuring named-file", name
|
|
707
|
+
)
|
|
667
708
|
self.configure_named_file(name, config)
|
|
668
709
|
path = pathu.resep(path)
|
|
669
|
-
self.csvpaths.logger.debug("Path after resep %s", path)
|
|
710
|
+
self.csvpaths.logger.debug("[%s] Path after resep %s", registration_uuid, path)
|
|
670
711
|
config = self.csvpaths.config
|
|
671
712
|
http = config.get(section="inputs", name="allow_http_files", default=False)
|
|
672
713
|
http = str(http).strip().lower() in ["on", "yes", "true"]
|
|
673
714
|
local = config.get(section="inputs", name="allow_local_files", default=False)
|
|
674
715
|
local = str(local).strip().lower() in ["on", "yes", "true"]
|
|
675
716
|
nos = Nos(path)
|
|
717
|
+
self.csvpaths.logger.info(
|
|
718
|
+
"Adding named file %s: checking permission, if needed, to register local and http files",
|
|
719
|
+
name,
|
|
720
|
+
)
|
|
676
721
|
#
|
|
677
722
|
# can the descriptor override the project's prohibition on http(s) loads?
|
|
678
723
|
# no. the project may be controlled by a context like FlightPath Server, where
|
|
679
724
|
# the user cannot just override certain settings.
|
|
680
725
|
#
|
|
681
726
|
if nos.is_http and http is not True:
|
|
682
|
-
|
|
727
|
+
_ = {
|
|
728
|
+
"name": name,
|
|
729
|
+
"path": path,
|
|
730
|
+
"template": template,
|
|
731
|
+
"registration_uuid": registration_uuid,
|
|
732
|
+
}
|
|
733
|
+
self._registration_failed(_)
|
|
734
|
+
msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading files over HTTP is not allowed"
|
|
683
735
|
self.csvpaths.logger.warning(msg)
|
|
684
736
|
self.csvpaths.error_manager.handle_error(source=self, msg=msg)
|
|
685
737
|
if self.csvpaths.ecoms.do_i_raise():
|
|
686
738
|
raise FileException(msg)
|
|
687
739
|
return
|
|
688
740
|
if nos.is_local and local is not True:
|
|
689
|
-
|
|
741
|
+
_ = {
|
|
742
|
+
"name": name,
|
|
743
|
+
"path": path,
|
|
744
|
+
"template": template,
|
|
745
|
+
"registration_uuid": registration_uuid,
|
|
746
|
+
}
|
|
747
|
+
self._registration_failed(_)
|
|
748
|
+
msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading local files is not allowed"
|
|
690
749
|
self.csvpaths.logger.warning(msg)
|
|
691
750
|
self.csvpaths.error_manager.handle_error(source=self, msg=msg)
|
|
692
751
|
if self.csvpaths.ecoms.do_i_raise():
|
|
693
752
|
raise FileException(msg)
|
|
694
753
|
return
|
|
754
|
+
self.csvpaths.logger.info(
|
|
755
|
+
"Adding named file %s: registration of %s permitted", name, path
|
|
756
|
+
)
|
|
695
757
|
#
|
|
696
758
|
# we should know enough to redirect if handed a dir path. we'll not recurse
|
|
697
759
|
# because the caller hasn't given us enough info to know if we should.
|
|
@@ -700,6 +762,7 @@ class FileManager:
|
|
|
700
762
|
# method. if using FlightPath Server, the server should allow them to be likewise
|
|
701
763
|
# more specific. this branch is essentially a fallback presumed to be covering for
|
|
702
764
|
# lazy developers and people who are working without better information.
|
|
765
|
+
#
|
|
703
766
|
if nos.path.find("#") > -1:
|
|
704
767
|
#
|
|
705
768
|
# if we passed in a root minor, a.k.a. "mark", we need to strip
|
|
@@ -707,15 +770,39 @@ class FileManager:
|
|
|
707
770
|
#
|
|
708
771
|
nos = Nos(nos.path[0 : nos.path.find("#")])
|
|
709
772
|
#
|
|
710
|
-
# note for now we treat any http as a file
|
|
773
|
+
# note for now we treat any http as a file.
|
|
774
|
+
#
|
|
775
|
+
# also note that this Nos must be savvy to any ServerConfig that may
|
|
776
|
+
# be available. it should use the possibly cached backend, if that
|
|
777
|
+
# matches, but if not, it must search any ServerConfig to configure
|
|
778
|
+
# itself to do operations on one of those servers.
|
|
779
|
+
#
|
|
780
|
+
# server config can be passed to a non-sftp nos. there won't be any
|
|
781
|
+
# complaints, but it won't do anything. atm, the judgement call is that
|
|
782
|
+
# we save an if-test by allowing any nos to receive server config and
|
|
783
|
+
# accepting the cost of searching for any server config in json.
|
|
784
|
+
#
|
|
785
|
+
config = self.describer.get_config(name)
|
|
786
|
+
servers = config.sources
|
|
787
|
+
nos.server_config = servers
|
|
788
|
+
#
|
|
789
|
+
# for _ in servers:
|
|
790
|
+
# if _.matches(nos.path):
|
|
791
|
+
# nos.do._config = SftpConfig(_)
|
|
711
792
|
#
|
|
712
793
|
isfile = nos.is_http or nos.isfile()
|
|
794
|
+
self.csvpaths.logger.debug(
|
|
795
|
+
"Adding named file %s: path %s is a file? %s", name, path, isfile
|
|
796
|
+
)
|
|
713
797
|
if not isfile:
|
|
714
798
|
return self.add_named_files_from_dir(
|
|
715
799
|
path, name=name, template=template, recurse=False
|
|
716
800
|
)
|
|
801
|
+
self.csvpaths.logger.debug("Adding named file %s: continuing with file", name)
|
|
717
802
|
try:
|
|
718
|
-
self.csvpaths.logger.debug(
|
|
803
|
+
self.csvpaths.logger.debug(
|
|
804
|
+
"[%s] Ready to register %s", registration_uuid, path
|
|
805
|
+
)
|
|
719
806
|
#
|
|
720
807
|
# path must end up with only legal filesystem chars.
|
|
721
808
|
# the read-only http backend will have ? and possibly other
|
|
@@ -750,13 +837,17 @@ class FileManager:
|
|
|
750
837
|
# exp: moving docs and descriptor to above copy_in()
|
|
751
838
|
#
|
|
752
839
|
self.assure_docs_and_discriptor(name)
|
|
753
|
-
self.csvpaths.logger.debug(
|
|
840
|
+
self.csvpaths.logger.debug(
|
|
841
|
+
"[%s] Assured docs and discriptor", registration_uuid
|
|
842
|
+
)
|
|
754
843
|
#
|
|
755
844
|
# copy file to its home location
|
|
756
845
|
#
|
|
757
|
-
self.csvpaths.logger.debug(
|
|
846
|
+
self.csvpaths.logger.debug(
|
|
847
|
+
"[%s] Path after removing mark, if any: %s", registration_uuid, path
|
|
848
|
+
)
|
|
758
849
|
self._copy_in(name=name, path=path, home=home, template=template)
|
|
759
|
-
self.csvpaths.logger.debug("Done copying in")
|
|
850
|
+
self.csvpaths.logger.debug("[%s] Done copying in", registration_uuid)
|
|
760
851
|
#
|
|
761
852
|
# self.assure_docs_and_discriptor(name)
|
|
762
853
|
# self.csvpaths.logger.debug("Assured docs and discriptor")
|
|
@@ -766,9 +857,13 @@ class FileManager:
|
|
|
766
857
|
# done here.
|
|
767
858
|
#
|
|
768
859
|
rpath, h = self._fingerprint(home)
|
|
769
|
-
self.csvpaths.logger.debug(
|
|
860
|
+
self.csvpaths.logger.debug(
|
|
861
|
+
"[%s] Fingerprint of %s: %s", registration_uuid, path, h
|
|
862
|
+
)
|
|
770
863
|
ret = f"${name}.files.{h}"
|
|
771
|
-
self.csvpaths.logger.debug(
|
|
864
|
+
self.csvpaths.logger.debug(
|
|
865
|
+
"[%s] Reference to named-file: %s", registration_uuid, ret
|
|
866
|
+
)
|
|
772
867
|
#
|
|
773
868
|
# ---------------------------
|
|
774
869
|
# maybe move the metadata handling to its own method?
|
|
@@ -777,7 +872,9 @@ class FileManager:
|
|
|
777
872
|
# create the metadata event for this registration
|
|
778
873
|
#
|
|
779
874
|
name_home = self.named_file_home(name)
|
|
780
|
-
self.csvpaths.logger.debug(
|
|
875
|
+
self.csvpaths.logger.debug(
|
|
876
|
+
"[%s] Name home is %s", registration_uuid, name_home
|
|
877
|
+
)
|
|
781
878
|
mdata = FileMetadata(self.csvpaths.config)
|
|
782
879
|
#
|
|
783
880
|
# add the ability to pass in a UUID. if received, use it here to
|
|
@@ -805,8 +902,8 @@ class FileManager:
|
|
|
805
902
|
mdata.file_name = file_home[file_home.rfind(nos.sep) + 1 :]
|
|
806
903
|
mdata.name_home = name_home
|
|
807
904
|
mdata.mark = mark
|
|
808
|
-
mdata.template = template
|
|
809
|
-
self.csvpaths.logger.debug("Created metadata")
|
|
905
|
+
mdata.template = template or ""
|
|
906
|
+
self.csvpaths.logger.debug("[%s] Created metadata", registration_uuid)
|
|
810
907
|
#
|
|
811
908
|
# TODO: add file_size. move FileInfo into Nos. for now it is 0.
|
|
812
909
|
#
|
|
@@ -815,17 +912,23 @@ class FileManager:
|
|
|
815
912
|
# the fingerprint is the most precise way of referencing a particular
|
|
816
913
|
# named-file version.
|
|
817
914
|
#
|
|
818
|
-
self.csvpaths.logger.debug("Registered %s", ret)
|
|
915
|
+
self.csvpaths.logger.debug("[%s] Registered %s", registration_uuid, ret)
|
|
819
916
|
return ret
|
|
820
917
|
except Exception as ex:
|
|
918
|
+
_ = {
|
|
919
|
+
"name": name,
|
|
920
|
+
"path": path,
|
|
921
|
+
"template": template,
|
|
922
|
+
"registration_uuid": registration_uuid,
|
|
923
|
+
}
|
|
924
|
+
self._registration_failed(_)
|
|
821
925
|
#
|
|
822
926
|
# remove me! tho, why you'd want quiet is not sure.
|
|
823
927
|
#
|
|
824
|
-
print(traceback.format_exc())
|
|
825
|
-
#
|
|
928
|
+
# print(traceback.format_exc())
|
|
826
929
|
#
|
|
827
930
|
#
|
|
828
|
-
msg = f"Error in loading named-file: {ex}"
|
|
931
|
+
msg = f"[{registration_uuid}] Error in loading named-file: {ex}"
|
|
829
932
|
self.csvpaths.logger.error(msg)
|
|
830
933
|
self.csvpaths.error_manager.handle_error(
|
|
831
934
|
source=traceback.format_exc(), msg=msg
|
|
@@ -833,6 +936,19 @@ class FileManager:
|
|
|
833
936
|
if self.csvpaths.ecoms.do_i_raise():
|
|
834
937
|
raise
|
|
835
938
|
|
|
939
|
+
def _registration_failed(self, data: dict[str, str]) -> None:
|
|
940
|
+
lst = FilesListener(self.csvpaths)
|
|
941
|
+
mdata = FileMetadata(self.csvpaths.config)
|
|
942
|
+
mdata.named_file_name = data.get("name")
|
|
943
|
+
mdata.origin_path = data.get("path")
|
|
944
|
+
mdata.template = data.get("template") or ""
|
|
945
|
+
mdata.uuid_string = data.get("registration_uuid")
|
|
946
|
+
mdata.status = "Registration failed"
|
|
947
|
+
self.csvpaths.logger.warn(
|
|
948
|
+
"[%s] Registration failed for %s", mdata.named_file_name, data
|
|
949
|
+
)
|
|
950
|
+
lst.metadata_update(mdata)
|
|
951
|
+
|
|
836
952
|
def _validate_xlsx_mark(self, path: str, mark: str) -> None:
|
|
837
953
|
if not XlsxReaderHelper.is_xlsx(path):
|
|
838
954
|
raise ValueError(f"Not an Excel file: {path}")
|
|
@@ -862,8 +978,12 @@ class FileManager:
|
|
|
862
978
|
fname = self._clean_file_name(fname)
|
|
863
979
|
temp = f"{home}{sep}{fname}"
|
|
864
980
|
copy = pathu.parts(path)[0] == pathu.parts(home)[0]
|
|
981
|
+
copy = copy and nos.is_local
|
|
865
982
|
if copy:
|
|
866
983
|
nos.path = path
|
|
984
|
+
config = self.describer.get_config(name)
|
|
985
|
+
servers = config.sources
|
|
986
|
+
nos.server_config = servers
|
|
867
987
|
nos.copy(temp)
|
|
868
988
|
else:
|
|
869
989
|
self._copy_down(name=name, path=path, temp=temp, mode="wb")
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import json
|
|
3
|
-
from datetime import datetime
|
|
4
2
|
from csvpath.util.exceptions import InputException, FileException
|
|
5
3
|
from csvpath.util.nos import Nos
|
|
6
4
|
from csvpath.managers.registrar import Registrar
|
|
@@ -110,9 +108,9 @@ class FileRegistrar(Registrar, Listener):
|
|
|
110
108
|
nos.path = old_home
|
|
111
109
|
nos.rename(new_home)
|
|
112
110
|
mani[index]["file_home"] = new_home
|
|
113
|
-
mani[index][
|
|
114
|
-
"
|
|
115
|
-
|
|
111
|
+
mani[index]["file"] = (
|
|
112
|
+
f"{new_home}{sep}{mani[index]['fingerprint']}.{mani[index]['type']}"
|
|
113
|
+
)
|
|
116
114
|
|
|
117
115
|
def metadata_update(self, mdata: Metadata) -> None:
|
|
118
116
|
path = mdata.origin_path
|
|
@@ -132,8 +130,7 @@ class FileRegistrar(Registrar, Listener):
|
|
|
132
130
|
mani["from"] = path
|
|
133
131
|
if mark is not None:
|
|
134
132
|
mani["mark"] = mark
|
|
135
|
-
|
|
136
|
-
mani["template"] = mdata.template
|
|
133
|
+
mani["template"] = mdata.template or ""
|
|
137
134
|
jdata = self.get_manifest(manifest_path)
|
|
138
135
|
jdata.append(mani)
|
|
139
136
|
self.intermediary.put_json(manifest_path, jdata)
|
|
@@ -157,15 +154,19 @@ class FileRegistrar(Registrar, Listener):
|
|
|
157
154
|
raise InputException(
|
|
158
155
|
f"File mgr and registrar marks should match: {mdata.mark}, {mark}"
|
|
159
156
|
)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
157
|
+
opath = Nos(path)
|
|
158
|
+
#
|
|
159
|
+
# if we're registering a non-local file and it's an sftp file it may be
|
|
160
|
+
# on an sftp server that is configured in the named-file description. so
|
|
161
|
+
# we setup nos to be able to check, just in case.
|
|
162
|
+
#
|
|
163
|
+
config = self.csvpaths.file_manager.describer.get_config(mdata.named_file_name)
|
|
164
|
+
servers = config.sources
|
|
165
|
+
opath.server_config = servers
|
|
166
|
+
|
|
167
|
+
if not opath.is_http:
|
|
168
|
+
if not opath.exists():
|
|
169
|
+
raise InputException(f"Path {opath.path} does not exist")
|
|
169
170
|
#
|
|
170
171
|
# if the fingerprint already exists we don't store the file again.
|
|
171
172
|
# we rename the file to the fingerprint. from this point the registrar
|
|
@@ -69,6 +69,8 @@ class FilesListener(Listener): # Registrar,
|
|
|
69
69
|
if mdata.mark is not None:
|
|
70
70
|
mani["mark"] = mdata.mark
|
|
71
71
|
mani["manifest_path"] = self.manifest_path()
|
|
72
|
+
if hasattr(mdata, "status"):
|
|
73
|
+
mani["status"] = mdata.status
|
|
72
74
|
return mani
|
|
73
75
|
|
|
74
76
|
def metadata_update(self, mdata: Metadata) -> None:
|
{csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/webhook/webhook_listener.py
RENAMED
|
@@ -165,4 +165,11 @@ class WebhookListener(Listener, threading.Thread):
|
|
|
165
165
|
...
|
|
166
166
|
|
|
167
167
|
def _do_send(self, *, url: str, payload: dict, headers: dict, timeout: int):
|
|
168
|
+
#
|
|
169
|
+
# this is an expected occurance. any empty block captured by the FlightPath form
|
|
170
|
+
# will have no url but will exist so will be attempted. we just want to ignore
|
|
171
|
+
# those attempts
|
|
172
|
+
#
|
|
173
|
+
if not url:
|
|
174
|
+
return
|
|
168
175
|
return requests.post(url, json=payload, headers=headers, timeout=timeout)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from uuid import uuid4, UUID
|
|
2
2
|
import os
|
|
3
3
|
from abc import ABC
|
|
4
|
-
from datetime import datetime
|
|
4
|
+
from datetime import datetime
|
|
5
5
|
from dateutil import parser
|
|
6
6
|
import getpass
|
|
7
7
|
import socket
|
|
@@ -150,7 +150,6 @@ class Metadata(ABC):
|
|
|
150
150
|
|
|
151
151
|
@time_started_string.setter
|
|
152
152
|
def time_started_string(self, s: str) -> None:
|
|
153
|
-
# self._time_started = datetime.date.fromisoformat(s)
|
|
154
153
|
self._time_started = parser.parse(s)
|
|
155
154
|
|
|
156
155
|
@property
|