csvpath 0.0.612__tar.gz → 0.0.613__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.612 → csvpath-0.0.613}/PKG-INFO +1 -1
- csvpath-0.0.613/assets/config/jenkins-windows-sftp.ini +114 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/csvpaths.py +79 -17
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_manager.py +0 -22
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/files_listener.py +3 -4
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_listener.py +4 -6
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_manager.py +2 -1
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_registrar.py +0 -1
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_manager.py +13 -6
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_metadata.py +17 -1
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_registrar.py +32 -6
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/nos.py +2 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/run_home_maker.py +2 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/pyproject.toml +1 -1
- csvpath-0.0.612/assets/config/jenkins-windows-sftp.ini +0 -158
- {csvpath-0.0.612 → csvpath-0.0.613}/LICENSE +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/README.md +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/.DS_Store +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/config.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/function.imports +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/.DS_Store +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/Mac.goenvironment.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/Windows.goenvironment.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/.DS_Store +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/config/config.ini +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/config/env.json +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/csvpath.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_activator.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_describer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_descriptor.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_names_rules.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_registrar.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/files_activation_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_describer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_descriptor.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/transfers_manager.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/server_config.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/env.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/metadata.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/parquet.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/runtime.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/sql/select.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/sql/sql_in.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/format.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/uuid.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/matches.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/percent_matching.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/slice.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/sort.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/parquet_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_timing_policy.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/box.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/code.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/referrer_printer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_nos.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_server_creds.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/stopwatch.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.612 → csvpath-0.0.613}/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.613
|
|
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
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
[testing]
|
|
2
|
+
azure.skip = yes
|
|
3
|
+
gcs.skip = yes
|
|
4
|
+
s3.skip = yes
|
|
5
|
+
sftp.skip = no
|
|
6
|
+
|
|
7
|
+
[extensions]
|
|
8
|
+
csvpath_files = csvpath, csvpaths
|
|
9
|
+
csv_files = csv, tsv, dat, tab, psv, ssv
|
|
10
|
+
|
|
11
|
+
[errors]
|
|
12
|
+
csvpath = raise, collect, print
|
|
13
|
+
csvpaths = raise, collect, print
|
|
14
|
+
use_format = full
|
|
15
|
+
pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
|
|
16
|
+
|
|
17
|
+
[logging]
|
|
18
|
+
csvpath = info
|
|
19
|
+
csvpaths = debug
|
|
20
|
+
log_file = logs\csvpath.log
|
|
21
|
+
log_files_to_keep = 100
|
|
22
|
+
log_file_size = 52428800
|
|
23
|
+
handler = file
|
|
24
|
+
|
|
25
|
+
[config]
|
|
26
|
+
path = assets\config\jenkins-windows-sftp.ini
|
|
27
|
+
allow_var_sub = True
|
|
28
|
+
var_sub_source = env
|
|
29
|
+
|
|
30
|
+
[cache]
|
|
31
|
+
path = cache
|
|
32
|
+
use_cache = no
|
|
33
|
+
|
|
34
|
+
[functions]
|
|
35
|
+
imports =
|
|
36
|
+
|
|
37
|
+
[results]
|
|
38
|
+
archive = tmp\sftp\archive
|
|
39
|
+
transfers = tmp\sftp\transfers
|
|
40
|
+
|
|
41
|
+
[inputs]
|
|
42
|
+
files = sftp://{SFTP_SERVER}:{SFTP_PORT}/windows/inputs/named_files
|
|
43
|
+
csvpaths = tmp\sftp\inputs\named_paths
|
|
44
|
+
on_unmatched_file_fingerprints = halt
|
|
45
|
+
allow_http_files = True
|
|
46
|
+
allow_local_files = True
|
|
47
|
+
|
|
48
|
+
[listeners]
|
|
49
|
+
groups = default
|
|
50
|
+
sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
|
|
51
|
+
sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
|
|
52
|
+
default.file = from csvpath.managers.files.files_listener import FilesListener
|
|
53
|
+
default.paths = from csvpath.managers.paths.paths_listener import PathsListener
|
|
54
|
+
otlp.result = from csvpath.managers.integrations.otlp.otlp_result_listener import OpenTelemetryResultListener
|
|
55
|
+
otlp.results = from csvpath.managers.integrations.otlp.otlp_results_listener import OpenTelemetryResultsListener
|
|
56
|
+
otlp.errors = from csvpath.managers.integrations.otlp.otlp_error_listener import OpenTelemetryErrorListener
|
|
57
|
+
sftpplus.paths = from csvpath.managers.integrations.sftpplus.sftpplus_listener import SftpPlusListener
|
|
58
|
+
sftp.results = from csvpath.managers.integrations.sftp.sftp_listener import SftpListener
|
|
59
|
+
ckan.results = from csvpath.managers.integrations.ckan.ckan_listener import CkanListener
|
|
60
|
+
openlineage.file = from csvpath.managers.integrations.ol.file_listener_ol import OpenLineageFileListener
|
|
61
|
+
openlineage.paths = from csvpath.managers.integrations.ol.paths_listener_ol import OpenLineagePathsListener
|
|
62
|
+
openlineage.result = from csvpath.managers.integrations.ol.result_listener_ol import OpenLineageResultListener
|
|
63
|
+
openlineage.results = from csvpath.managers.integrations.ol.results_listener_ol import OpenLineageResultsListener
|
|
64
|
+
slack.file = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
65
|
+
slack.paths = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
66
|
+
slack.result = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
67
|
+
slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
68
|
+
scripts.results = from csvpath.managers.integrations.scripts.scripts_results_listener import ScriptsResultsListener
|
|
69
|
+
|
|
70
|
+
[otlp]
|
|
71
|
+
|
|
72
|
+
[aws]
|
|
73
|
+
|
|
74
|
+
[azure]
|
|
75
|
+
|
|
76
|
+
[gcs]
|
|
77
|
+
|
|
78
|
+
[sftp]
|
|
79
|
+
server = SFTP_SERVER
|
|
80
|
+
port = SFTP_PORT
|
|
81
|
+
username = python
|
|
82
|
+
password = hangzhou
|
|
83
|
+
|
|
84
|
+
[sqlite]
|
|
85
|
+
db = archive\csvpath.db
|
|
86
|
+
|
|
87
|
+
[sftpplus]
|
|
88
|
+
mailbox_user = MAILBOX_USER
|
|
89
|
+
mailbox_password = MAILBOX_PASSWORD
|
|
90
|
+
server = SFTPPLUS_SERVER
|
|
91
|
+
port = SFTPPLUS_PORT
|
|
92
|
+
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
93
|
+
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
94
|
+
api_url = https://. . . :10020/json
|
|
95
|
+
scripts_dir =
|
|
96
|
+
execute_timeout = 300
|
|
97
|
+
|
|
98
|
+
[ckan]
|
|
99
|
+
server = http://. . . :80
|
|
100
|
+
api_token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3akJwc1ZuSkVrZm1aNnBtVTJfTW5CNlJXZ211YjdOOHVXZ1l1cUFDa0Q4IiwiaWF0IjoxNzM0NzE4NDQ3fQ.QXWXoJoSxVES4NwXYBteYUD7enX9D5T2htmETLGFzrs
|
|
101
|
+
|
|
102
|
+
[scripts]
|
|
103
|
+
run_scripts = yes
|
|
104
|
+
|
|
105
|
+
[openlineage]
|
|
106
|
+
base_url = http://. . . :5000
|
|
107
|
+
endpoint = api/v1/lineage
|
|
108
|
+
api_key = "none"
|
|
109
|
+
timeout = 5
|
|
110
|
+
verify = False
|
|
111
|
+
|
|
112
|
+
[slack]
|
|
113
|
+
webhook_url =
|
|
114
|
+
|
|
@@ -8,7 +8,7 @@ import threading
|
|
|
8
8
|
|
|
9
9
|
from uuid import uuid4
|
|
10
10
|
from abc import ABC, abstractmethod
|
|
11
|
-
from typing import
|
|
11
|
+
from typing import Any, NewType, Optional
|
|
12
12
|
from datetime import datetime
|
|
13
13
|
from .managers.errors.error import Error
|
|
14
14
|
from .managers.errors.error_comms import ErrorCommunications
|
|
@@ -459,7 +459,7 @@ Cache: {cache}
|
|
|
459
459
|
self._advance_all = lines
|
|
460
460
|
|
|
461
461
|
@property
|
|
462
|
-
def errors(self) ->
|
|
462
|
+
def errors(self) -> list[Error]: # pylint: disable=C0116
|
|
463
463
|
"""@private
|
|
464
464
|
generally you should be looking at results_manager or error_manager for errors.
|
|
465
465
|
"""
|
|
@@ -758,7 +758,12 @@ Cache: {cache}
|
|
|
758
758
|
# case data.csv is the default.
|
|
759
759
|
#
|
|
760
760
|
def collect_paths(
|
|
761
|
-
self,
|
|
761
|
+
self,
|
|
762
|
+
*,
|
|
763
|
+
pathsname: str,
|
|
764
|
+
filename: str,
|
|
765
|
+
template: str = None,
|
|
766
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
762
767
|
) -> Reference:
|
|
763
768
|
"""
|
|
764
769
|
Sequentially does a CsvPath.collect() on filename for every named-path in the
|
|
@@ -783,11 +788,19 @@ Cache: {cache}
|
|
|
783
788
|
if isinstance(files, list):
|
|
784
789
|
for file in files:
|
|
785
790
|
ref = self._collect_paths(
|
|
786
|
-
pathsname=pathsname,
|
|
791
|
+
pathsname=pathsname,
|
|
792
|
+
filename=filename,
|
|
793
|
+
template=template,
|
|
794
|
+
file=file,
|
|
795
|
+
extra_data=extra_data,
|
|
787
796
|
)
|
|
788
797
|
else:
|
|
789
798
|
ref = self._collect_paths(
|
|
790
|
-
pathsname=pathsname,
|
|
799
|
+
pathsname=pathsname,
|
|
800
|
+
filename=filename,
|
|
801
|
+
template=template,
|
|
802
|
+
file=files,
|
|
803
|
+
extra_data=extra_data,
|
|
791
804
|
)
|
|
792
805
|
#
|
|
793
806
|
# absolute reference to the results
|
|
@@ -795,7 +808,13 @@ Cache: {cache}
|
|
|
795
808
|
return ref
|
|
796
809
|
|
|
797
810
|
def _collect_paths(
|
|
798
|
-
self,
|
|
811
|
+
self,
|
|
812
|
+
*,
|
|
813
|
+
pathsname: str,
|
|
814
|
+
file: str,
|
|
815
|
+
filename: str,
|
|
816
|
+
template: str = None,
|
|
817
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
799
818
|
) -> Reference:
|
|
800
819
|
#
|
|
801
820
|
# if template is None we need to go find any template that was given when
|
|
@@ -828,7 +847,6 @@ Cache: {cache}
|
|
|
828
847
|
|
|
829
848
|
results = []
|
|
830
849
|
#
|
|
831
|
-
# exp
|
|
832
850
|
# adding uuid for the run as a whole
|
|
833
851
|
run_uuid = uuid4()
|
|
834
852
|
#
|
|
@@ -841,6 +859,7 @@ Cache: {cache}
|
|
|
841
859
|
file=file,
|
|
842
860
|
run_uuid=run_uuid,
|
|
843
861
|
method="collect_paths",
|
|
862
|
+
extra_data=extra_data,
|
|
844
863
|
)
|
|
845
864
|
#
|
|
846
865
|
#
|
|
@@ -930,7 +949,12 @@ Cache: {cache}
|
|
|
930
949
|
return ret
|
|
931
950
|
|
|
932
951
|
def fast_forward_paths(
|
|
933
|
-
self,
|
|
952
|
+
self,
|
|
953
|
+
*,
|
|
954
|
+
pathsname: str,
|
|
955
|
+
filename: str,
|
|
956
|
+
template: str = None,
|
|
957
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
934
958
|
) -> Reference:
|
|
935
959
|
"""
|
|
936
960
|
Sequentially does a CsvPath.fast_forward() on filename for every named path. No matches are collected.
|
|
@@ -942,16 +966,30 @@ Cache: {cache}
|
|
|
942
966
|
if isinstance(files, list):
|
|
943
967
|
for file in files:
|
|
944
968
|
ref = self._fast_forward_paths(
|
|
945
|
-
pathsname=pathsname,
|
|
969
|
+
pathsname=pathsname,
|
|
970
|
+
filename=filename,
|
|
971
|
+
template=template,
|
|
972
|
+
file=file,
|
|
973
|
+
extra_data=extra_data,
|
|
946
974
|
)
|
|
947
975
|
else:
|
|
948
976
|
ref = self._fast_forward_paths(
|
|
949
|
-
pathsname=pathsname,
|
|
977
|
+
pathsname=pathsname,
|
|
978
|
+
filename=filename,
|
|
979
|
+
template=template,
|
|
980
|
+
file=files,
|
|
981
|
+
extra_data=extra_data,
|
|
950
982
|
)
|
|
951
983
|
return ref
|
|
952
984
|
|
|
953
985
|
def _fast_forward_paths(
|
|
954
|
-
self,
|
|
986
|
+
self,
|
|
987
|
+
*,
|
|
988
|
+
pathsname: str,
|
|
989
|
+
file: str,
|
|
990
|
+
filename: str,
|
|
991
|
+
template: str = None,
|
|
992
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
955
993
|
) -> Reference:
|
|
956
994
|
"""Sequentially does a CsvPath.fast_forward() on filename for every named path. No matches are collected."""
|
|
957
995
|
paths = self._get_named_paths(pathsname)
|
|
@@ -991,6 +1029,7 @@ Cache: {cache}
|
|
|
991
1029
|
filename=filename,
|
|
992
1030
|
run_uuid=run_uuid,
|
|
993
1031
|
method="fast_forward_paths",
|
|
1032
|
+
extra_data=extra_data,
|
|
994
1033
|
)
|
|
995
1034
|
#
|
|
996
1035
|
#
|
|
@@ -1066,7 +1105,8 @@ Cache: {cache}
|
|
|
1066
1105
|
filename: str,
|
|
1067
1106
|
collect: bool = False,
|
|
1068
1107
|
template: str = None,
|
|
1069
|
-
|
|
1108
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
1109
|
+
) -> list[Any]: # pylint: disable=R0914
|
|
1070
1110
|
"""
|
|
1071
1111
|
Does a CsvPath.next() on filename for every line against every named path in sequence
|
|
1072
1112
|
"""
|
|
@@ -1107,6 +1147,7 @@ Cache: {cache}
|
|
|
1107
1147
|
filename=filename,
|
|
1108
1148
|
run_uuid=run_uuid,
|
|
1109
1149
|
method="next_paths",
|
|
1150
|
+
extra_data=extra_data,
|
|
1110
1151
|
)
|
|
1111
1152
|
#
|
|
1112
1153
|
#
|
|
@@ -1200,6 +1241,7 @@ Cache: {cache}
|
|
|
1200
1241
|
collect_when_not_matched=False,
|
|
1201
1242
|
template: str = None,
|
|
1202
1243
|
lines: list = None,
|
|
1244
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
1203
1245
|
) -> Reference:
|
|
1204
1246
|
"""
|
|
1205
1247
|
Does a CsvPath.collect() on filename where each row is considered by
|
|
@@ -1228,6 +1270,7 @@ Cache: {cache}
|
|
|
1228
1270
|
file=file,
|
|
1229
1271
|
template=template,
|
|
1230
1272
|
method="collect_by_line",
|
|
1273
|
+
extra_data=extra_data,
|
|
1231
1274
|
):
|
|
1232
1275
|
# re: W0612: we need 'line' in order to do the iteration. we have to iterate.
|
|
1233
1276
|
lines.append(line)
|
|
@@ -1254,6 +1297,7 @@ Cache: {cache}
|
|
|
1254
1297
|
if_all_agree=False,
|
|
1255
1298
|
collect_when_not_matched=False,
|
|
1256
1299
|
template: str = None,
|
|
1300
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
1257
1301
|
) -> Reference:
|
|
1258
1302
|
"""
|
|
1259
1303
|
Does a CsvPath.fast_forward() on filename where each row is considered by
|
|
@@ -1279,6 +1323,7 @@ Cache: {cache}
|
|
|
1279
1323
|
file=file,
|
|
1280
1324
|
template=template,
|
|
1281
1325
|
method="fast_forward_by_line",
|
|
1326
|
+
extra_data=extra_data,
|
|
1282
1327
|
):
|
|
1283
1328
|
# re: W0612: we need 'line' in order to do the iteration. we have to iterate.
|
|
1284
1329
|
pass
|
|
@@ -1308,7 +1353,8 @@ Cache: {cache}
|
|
|
1308
1353
|
collect_when_not_matched=False,
|
|
1309
1354
|
template: str = None,
|
|
1310
1355
|
method: str = None,
|
|
1311
|
-
|
|
1356
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
1357
|
+
) -> list[Any]:
|
|
1312
1358
|
#
|
|
1313
1359
|
# we're doing a programmatic use when we use next_by_line() so we don't allow
|
|
1314
1360
|
# multiple file runs. we check that here; the other _by_line()s skip it.
|
|
@@ -1326,6 +1372,7 @@ Cache: {cache}
|
|
|
1326
1372
|
collect_when_not_matched=collect_when_not_matched,
|
|
1327
1373
|
template=template,
|
|
1328
1374
|
file=file,
|
|
1375
|
+
extra_data=extra_data,
|
|
1329
1376
|
)
|
|
1330
1377
|
|
|
1331
1378
|
def _next_by_line( # pylint: disable=R0912,R0915,R0914
|
|
@@ -1339,7 +1386,8 @@ Cache: {cache}
|
|
|
1339
1386
|
template: str = None,
|
|
1340
1387
|
file: str,
|
|
1341
1388
|
method: str = "next_by_line",
|
|
1342
|
-
|
|
1389
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
1390
|
+
) -> list[Any]:
|
|
1343
1391
|
"""Does a CsvPath.next() on filename where each row is considered
|
|
1344
1392
|
by every named path before the next row starts.
|
|
1345
1393
|
|
|
@@ -1350,6 +1398,11 @@ Cache: {cache}
|
|
|
1350
1398
|
|
|
1351
1399
|
collect_when_not_matched=True inverts the match so that lines
|
|
1352
1400
|
which did not match are returned, rather than the default behavior.
|
|
1401
|
+
|
|
1402
|
+
extra_data is a flat dict of values that are meaningful to the caller.
|
|
1403
|
+
the results registrar stores them as an extra.json file in the
|
|
1404
|
+
run_dir within an _extra_data directory. the directory can be used
|
|
1405
|
+
by any listener as a scratch space
|
|
1353
1406
|
"""
|
|
1354
1407
|
# re: R0912 -- absolutely. plan to refactor.
|
|
1355
1408
|
if isinstance(file, list):
|
|
@@ -1393,6 +1446,7 @@ Cache: {cache}
|
|
|
1393
1446
|
pathsname=pathsname,
|
|
1394
1447
|
crt=crt,
|
|
1395
1448
|
method=method,
|
|
1449
|
+
extra_data=extra_data,
|
|
1396
1450
|
)
|
|
1397
1451
|
#
|
|
1398
1452
|
# setting file into the csvpath is less obviously useful at CsvPaths
|
|
@@ -1402,7 +1456,7 @@ Cache: {cache}
|
|
|
1402
1456
|
reader = FileManager.get_reader(
|
|
1403
1457
|
file, delimiter=self.delimiter, quotechar=self.quotechar
|
|
1404
1458
|
)
|
|
1405
|
-
stopped_count:
|
|
1459
|
+
stopped_count: list[int] = []
|
|
1406
1460
|
for line in reader.next():
|
|
1407
1461
|
# for line in reader: # pylint: disable=R1702
|
|
1408
1462
|
# question to self: should this default be in a central place
|
|
@@ -1524,7 +1578,7 @@ Cache: {cache}
|
|
|
1524
1578
|
def _load_csvpath_objects(
|
|
1525
1579
|
self,
|
|
1526
1580
|
*,
|
|
1527
|
-
paths:
|
|
1581
|
+
paths: list[str],
|
|
1528
1582
|
named_file: str,
|
|
1529
1583
|
collect_when_not_matched=False,
|
|
1530
1584
|
filename,
|
|
@@ -1562,7 +1616,14 @@ Cache: {cache}
|
|
|
1562
1616
|
return csvpath_objects
|
|
1563
1617
|
|
|
1564
1618
|
def _prep_csvpath_results(
|
|
1565
|
-
self,
|
|
1619
|
+
self,
|
|
1620
|
+
*,
|
|
1621
|
+
csvpath_objects,
|
|
1622
|
+
filename,
|
|
1623
|
+
pathsname,
|
|
1624
|
+
crt: str,
|
|
1625
|
+
method: str,
|
|
1626
|
+
extra_data: Optional[dict[str, str]],
|
|
1566
1627
|
):
|
|
1567
1628
|
"""@private"""
|
|
1568
1629
|
#
|
|
@@ -1578,6 +1639,7 @@ Cache: {cache}
|
|
|
1578
1639
|
filename=filename,
|
|
1579
1640
|
run_uuid=run_uuid,
|
|
1580
1641
|
method="next_paths",
|
|
1642
|
+
extra_data=extra_data,
|
|
1581
1643
|
)
|
|
1582
1644
|
#
|
|
1583
1645
|
#
|
|
@@ -87,7 +87,6 @@ class FileManager:
|
|
|
87
87
|
def files_root_manifest(self) -> dict:
|
|
88
88
|
"""@private"""
|
|
89
89
|
p = self.files_root_manifest_path
|
|
90
|
-
# nos = self.nos
|
|
91
90
|
nos = Nos(p)
|
|
92
91
|
if nos.exists():
|
|
93
92
|
with DataFileReader(p) as reader:
|
|
@@ -344,28 +343,7 @@ class FileManager:
|
|
|
344
343
|
# and then, once fingerprinted:
|
|
345
344
|
# -> d/b/myfile.csv/0b849c9c1ef....csv
|
|
346
345
|
#
|
|
347
|
-
"""
|
|
348
|
-
_t = t
|
|
349
|
-
parts = pathu.parts(path)
|
|
350
|
-
for i, part in enumerate(parts):
|
|
351
|
-
t = t.replace(f":{i}", part)
|
|
352
|
-
#
|
|
353
|
-
# TODO: replace dynamic tokens: :day_of_week, :day, :month, :month_of_year, :year, :quarter
|
|
354
|
-
#
|
|
355
|
-
t = t.replace(":filename", parts[-1])
|
|
356
|
-
"""
|
|
357
|
-
#
|
|
358
|
-
# this is what we need to do instead of the above ^^^^
|
|
359
|
-
#
|
|
360
346
|
t = temu.transform_file_template(template=t, file=path)
|
|
361
|
-
"""
|
|
362
|
-
print(f"xt2: path: {path}")
|
|
363
|
-
print(f"xt2: parts: {parts}")
|
|
364
|
-
print(f"xt2: _t: {_t}")
|
|
365
|
-
print(f"xt2: _2: {_t2}")
|
|
366
|
-
print(f"xt2: t: {t}")
|
|
367
|
-
print("")
|
|
368
|
-
"""
|
|
369
347
|
#
|
|
370
348
|
#
|
|
371
349
|
#
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import json
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
from csvpath.util.exceptions import InputException, FileException
|
|
5
2
|
from csvpath.util.file_readers import DataFileReader
|
|
6
3
|
from csvpath.util.file_writers import DataFileWriter
|
|
7
4
|
from csvpath.util.nos import Nos
|
|
@@ -87,4 +84,6 @@ class FilesListener(Listener): # Registrar,
|
|
|
87
84
|
jdata = self.get_manifest(manifest_path)
|
|
88
85
|
jdata.append(mani)
|
|
89
86
|
with DataFileWriter(path=manifest_path, mode="w") as writer:
|
|
90
|
-
json.
|
|
87
|
+
j = json.dumps(jdata, indent=2)
|
|
88
|
+
writer.sink.write(j)
|
|
89
|
+
writer.sink.flush()
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import json
|
|
3
|
-
from csvpath.util.exceptions import InputException
|
|
4
2
|
from csvpath.util.file_readers import DataFileReader
|
|
5
3
|
from csvpath.util.file_writers import DataFileWriter
|
|
6
4
|
from csvpath.util.nos import Nos
|
|
7
|
-
from .paths_metadata import PathsMetadata
|
|
8
5
|
from ..listener import Listener
|
|
9
6
|
from ..metadata import Metadata
|
|
10
7
|
|
|
@@ -37,14 +34,13 @@ class PathsListener(Listener):
|
|
|
37
34
|
mpath = self.manifest_path
|
|
38
35
|
with DataFileReader(mpath, encoding="utf-8") as file:
|
|
39
36
|
contents = file.read()
|
|
37
|
+
# print(f"pathslist: mpath: {mpath}: {contents}")
|
|
40
38
|
j = json.loads(contents)
|
|
41
|
-
# j = json.load(file.source)
|
|
42
39
|
return j
|
|
43
40
|
|
|
44
41
|
@property
|
|
45
42
|
def manifest_path(self) -> None:
|
|
46
43
|
mf = Nos(self.csvpaths.config.inputs_csvpaths_path).join("manifest.json")
|
|
47
|
-
# mf = os.path.join(self.csvpaths.config.inputs_csvpaths_path, "manifest.json")
|
|
48
44
|
if not Nos(mf).exists():
|
|
49
45
|
with DataFileWriter(path=mf) as file:
|
|
50
46
|
file.append("[]")
|
|
@@ -74,4 +70,6 @@ class PathsListener(Listener):
|
|
|
74
70
|
jdata = self.manifest
|
|
75
71
|
jdata.append(mani)
|
|
76
72
|
with DataFileWriter(path=self.manifest_path) as file:
|
|
77
|
-
json.
|
|
73
|
+
j = json.dumps(jdata, indent=2)
|
|
74
|
+
file.sink.write(j)
|
|
75
|
+
file.sink.flush()
|
|
@@ -616,7 +616,8 @@ class PathsManager:
|
|
|
616
616
|
return t
|
|
617
617
|
|
|
618
618
|
def get_template_for_paths(self, name: NamedPathsName) -> str:
|
|
619
|
-
|
|
619
|
+
t = self.describer.get_template(name)
|
|
620
|
+
return "" if t is None else t
|
|
620
621
|
|
|
621
622
|
def store_template_for_paths(self, name: NamedPathsName, template: str) -> None:
|
|
622
623
|
self.describer.store_template(name, template)
|
|
@@ -3,7 +3,7 @@ import os
|
|
|
3
3
|
import re
|
|
4
4
|
from uuid import UUID
|
|
5
5
|
import dateutil.parser
|
|
6
|
-
from typing import
|
|
6
|
+
from typing import Any, Optional
|
|
7
7
|
from csvpath.util.line_spooler import LineSpooler
|
|
8
8
|
from csvpath.util.exceptions import InputException, CsvPathsException
|
|
9
9
|
from csvpath.util.references.reference_parser import ReferenceParser
|
|
@@ -112,6 +112,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
112
112
|
file: str = None,
|
|
113
113
|
run_uuid: UUID,
|
|
114
114
|
method: str,
|
|
115
|
+
extra_data: Optional[dict[str, str]] = None,
|
|
115
116
|
) -> ResultsMetadata:
|
|
116
117
|
"""@private"""
|
|
117
118
|
rr = ResultsRegistrar(
|
|
@@ -142,6 +143,12 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
142
143
|
#
|
|
143
144
|
#
|
|
144
145
|
mdata = ResultsMetadata(self.csvpaths.config)
|
|
146
|
+
#
|
|
147
|
+
# extra data is a flat list of dict[str,str] determined by the user and saved by some
|
|
148
|
+
# listener. we don't do anything with it, other than save it in the default listener
|
|
149
|
+
# when we first create the run manifest.json.
|
|
150
|
+
#
|
|
151
|
+
mdata.extra_data = extra_data
|
|
145
152
|
mdata.archive_name = self.csvpaths.config.archive_name
|
|
146
153
|
mdata.run_home = run_dir
|
|
147
154
|
mdata.run_uuid = run_uuid
|
|
@@ -410,13 +417,13 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
410
417
|
rr.add_internal_listener(_)
|
|
411
418
|
rr.register_start(mdata)
|
|
412
419
|
|
|
413
|
-
def set_named_results(self, results:
|
|
420
|
+
def set_named_results(self, results: dict[str, list[Result]]) -> None:
|
|
414
421
|
"""@private"""
|
|
415
422
|
self.named_results = {}
|
|
416
423
|
for value in results.values():
|
|
417
424
|
self.add_named_results(value)
|
|
418
425
|
|
|
419
|
-
def add_named_results(self, results:
|
|
426
|
+
def add_named_results(self, results: list[Result]) -> None:
|
|
420
427
|
"""@private"""
|
|
421
428
|
for r in results:
|
|
422
429
|
self.add_named_result(r)
|
|
@@ -522,7 +529,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
522
529
|
mydirs[os.path.dirname(path)] = path
|
|
523
530
|
return mydirs
|
|
524
531
|
|
|
525
|
-
def _get_named_results_for_reference(self, name: str) ->
|
|
532
|
+
def _get_named_results_for_reference(self, name: str) -> list[list[Any]]:
|
|
526
533
|
#
|
|
527
534
|
# $mygroup.results.orders/acme/2025:first.myinstance
|
|
528
535
|
#
|
|
@@ -592,7 +599,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
592
599
|
#
|
|
593
600
|
# this gets the results of a single run. it does not get all runs under the name.
|
|
594
601
|
#
|
|
595
|
-
def get_named_results(self, name) ->
|
|
602
|
+
def get_named_results(self, name) -> list[list[Any]]:
|
|
596
603
|
#
|
|
597
604
|
# as it turns out, references are (finally!) the easiest, so let's do that
|
|
598
605
|
# first.
|
|
@@ -748,7 +755,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
748
755
|
instances = Nos(path).listdir()
|
|
749
756
|
rs = [None for inst in instances if inst != "manifest.json"]
|
|
750
757
|
for inst in instances:
|
|
751
|
-
if inst.endswith(".json"):
|
|
758
|
+
if inst.endswith(".json") or inst == "_extra_data":
|
|
752
759
|
#
|
|
753
760
|
# exp ^^^^
|
|
754
761
|
#
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
from typing import Optional
|
|
1
2
|
from csvpath.managers.metadata import Metadata
|
|
2
|
-
from datetime import datetime
|
|
3
3
|
from uuid import UUID
|
|
4
4
|
|
|
5
5
|
|
|
@@ -8,6 +8,7 @@ class ResultsMetadata(Metadata):
|
|
|
8
8
|
|
|
9
9
|
def __init__(self, config):
|
|
10
10
|
super().__init__(config)
|
|
11
|
+
self._extra_data: Optional[dict[str, str]] = None
|
|
11
12
|
self.run_home: str = None
|
|
12
13
|
self.named_paths_name: str = None
|
|
13
14
|
self.named_paths_uuid: UUID = None
|
|
@@ -28,6 +29,21 @@ class ResultsMetadata(Metadata):
|
|
|
28
29
|
self._run_uuid: UUID = None
|
|
29
30
|
self._method: str = None
|
|
30
31
|
|
|
32
|
+
@property
|
|
33
|
+
def extra_data(self) -> dict[str, str]:
|
|
34
|
+
return self._extra_data
|
|
35
|
+
|
|
36
|
+
@extra_data.setter
|
|
37
|
+
def extra_data(self, extra: dict[str, str]) -> None:
|
|
38
|
+
if extra is None:
|
|
39
|
+
return
|
|
40
|
+
if not isinstance(extra, dict):
|
|
41
|
+
raise ValueError(f"Extra data must be a dictionary, not a {type(extra)}")
|
|
42
|
+
for k, v in extra.items():
|
|
43
|
+
if not isinstance(v, str):
|
|
44
|
+
raise ValueError(f"Extra data items must be strings, not {type(extra)}")
|
|
45
|
+
self._extra_data = extra
|
|
46
|
+
|
|
31
47
|
@property
|
|
32
48
|
def method(self) -> str:
|
|
33
49
|
return self._method
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from datetime import datetime, timezone
|
|
3
1
|
import json
|
|
4
|
-
import time
|
|
5
2
|
from csvpath.util.nos import Nos
|
|
6
3
|
from csvpath.util.file_info import FileInfo
|
|
7
4
|
from csvpath.util.exceptions import FileException
|
|
@@ -11,7 +8,6 @@ from .result import Result
|
|
|
11
8
|
from .result_serializer import ResultSerializer
|
|
12
9
|
from .result_registrar import ResultRegistrar
|
|
13
10
|
from .results_metadata import ResultsMetadata
|
|
14
|
-
from ..run.run_metadata import RunMetadata
|
|
15
11
|
from ..registrar import Registrar
|
|
16
12
|
from ..listener import Listener
|
|
17
13
|
from ..metadata import Metadata
|
|
@@ -26,7 +22,6 @@ class ResultsRegistrar(Registrar, Listener):
|
|
|
26
22
|
def __init__(
|
|
27
23
|
self, *, csvpaths, run_dir: str, pathsname: str, results: list[Result] = None
|
|
28
24
|
) -> None:
|
|
29
|
-
# super().__init__(csvpaths=csvpaths)
|
|
30
25
|
Registrar.__init__(self, csvpaths)
|
|
31
26
|
Listener.__init__(self, csvpaths.config)
|
|
32
27
|
self.pathsname = pathsname
|
|
@@ -127,6 +122,38 @@ class ResultsRegistrar(Registrar, Listener):
|
|
|
127
122
|
m["manifest_path"] = mp
|
|
128
123
|
with DataFileWriter(path=mp) as file:
|
|
129
124
|
json.dump(m, file.sink, indent=2)
|
|
125
|
+
#
|
|
126
|
+
# extra data is a flat str->str dict that is provided by the CsvPaths caller at
|
|
127
|
+
# run start time. we store it in the _extra_data directory within the run. we
|
|
128
|
+
# don't do anything else with it, but an integration or an end user can look
|
|
129
|
+
# there to find any user provided metadata. this is in addition to and has nothing
|
|
130
|
+
# to do with the metadata fields that csvpath writers can add to the external
|
|
131
|
+
# comment of a csvpath.
|
|
132
|
+
#
|
|
133
|
+
self._save_extra_data_if(mdata)
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def extra_data_path(self) -> str:
|
|
137
|
+
path = Nos(self.run_dir).join("_extra_data")
|
|
138
|
+
if not Nos(path).exists():
|
|
139
|
+
Nos(path).makedirs()
|
|
140
|
+
path = Nos(path).join("extra.json")
|
|
141
|
+
return path
|
|
142
|
+
|
|
143
|
+
def _save_extra_data_if(self, mdata: Metadata) -> None:
|
|
144
|
+
if mdata.extra_data is None:
|
|
145
|
+
return
|
|
146
|
+
self._save_extra_data(self.extra_data_path, mdata.extra_data)
|
|
147
|
+
|
|
148
|
+
def _save_extra_data(self, path: str, extra: dict[str, str]) -> None:
|
|
149
|
+
if Nos(path).exists():
|
|
150
|
+
with DataFileReader(path) as reader:
|
|
151
|
+
ed = json.load(reader.source)
|
|
152
|
+
if not isinstance(ed, dict):
|
|
153
|
+
raise ValueError(f"Extra data must be a dictionary, not {type(ed)}")
|
|
154
|
+
extra = extra | ed
|
|
155
|
+
with DataFileWriter(path=path) as writer:
|
|
156
|
+
json.dump(extra, writer.sink)
|
|
130
157
|
|
|
131
158
|
def _fingerprint_file(self, path) -> str:
|
|
132
159
|
with DataFileReader(path) as f:
|
|
@@ -186,5 +213,4 @@ class ResultsRegistrar(Registrar, Listener):
|
|
|
186
213
|
if not Nos(self.run_dir).exists():
|
|
187
214
|
Nos(self.run_dir).makedir()
|
|
188
215
|
mp = Nos(self.run_dir).join("manifest.json")
|
|
189
|
-
# mp = os.path.join(self.run_dir, "manifest.json")
|
|
190
216
|
return mp
|
|
@@ -178,6 +178,8 @@ class Nos:
|
|
|
178
178
|
# posix/cloud seps?
|
|
179
179
|
#
|
|
180
180
|
# return "/" if self.path.find("\\") == -1 else os.sep
|
|
181
|
+
if self.path.startswith("http://") or self.path.startswith("https://"):
|
|
182
|
+
return "/"
|
|
181
183
|
return self.do.sep
|
|
182
184
|
|
|
183
185
|
def join(self, name: str) -> str:
|