csvpath 0.0.605__tar.gz → 0.0.606__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.605 → csvpath-0.0.606}/PKG-INFO +1 -1
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/.DS_Store +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/.DS_Store +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/csvpaths.py +5 -4
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/file_manager.py +5 -3
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/paths/paths_describer.py +0 -1
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/paths/paths_manager.py +1 -1
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/results_manager.py +0 -4
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_data_writer.py +4 -5
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_nos.py +0 -4
- csvpath-0.0.606/csvpath/util/azure/azure_timing_policy.py +14 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_utils.py +11 -4
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_fingerprinter.py +4 -3
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_nos.py +103 -55
- csvpath-0.0.606/csvpath/util/stopwatch.py +43 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/pyproject.toml +1 -1
- {csvpath-0.0.605 → csvpath-0.0.606}/LICENSE +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/README.md +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/config.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/function.imports +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/Mac.goenvironment.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/Windows.goenvironment.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/.DS_Store +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/config/config.ini +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/config/env.json +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/csvpath.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/file_activator.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/file_describer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/file_registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/files_activation_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/files_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/misc/parquet.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/sql/sql_in.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/format.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/validity/matches.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/validity/percent_matching.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/slice.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/sort.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/parquet_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/box.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/code.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/config.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/file_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/nos.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/referrer_printer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.605 → csvpath-0.0.606}/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.606
|
|
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
|
|
Binary file
|
|
Binary file
|
|
@@ -172,8 +172,8 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
172
172
|
#
|
|
173
173
|
#
|
|
174
174
|
#
|
|
175
|
-
self.info_dump()
|
|
176
|
-
|
|
175
|
+
# self.info_dump()
|
|
176
|
+
|
|
177
177
|
self._errors = []
|
|
178
178
|
# coordinator attributes
|
|
179
179
|
self._stop_all = False
|
|
@@ -269,8 +269,9 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
269
269
|
if subs not in ["env", "none"]:
|
|
270
270
|
subs = f"{subs} with keys:"
|
|
271
271
|
e = self.config.config_env.env
|
|
272
|
-
|
|
273
|
-
|
|
272
|
+
if e is not None:
|
|
273
|
+
for k, v in e.items():
|
|
274
|
+
subs = f"{subs}\n - {k}"
|
|
274
275
|
cache = self.config.get(section="cache", name="path")
|
|
275
276
|
cache = cache if self.config.get(section="cache", name="use_cache") else "none"
|
|
276
277
|
logstr = self.logger if self.logger else "pending"
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import json
|
|
3
|
-
import csv
|
|
4
2
|
import traceback
|
|
5
3
|
from typing import NewType
|
|
6
4
|
from json import JSONDecodeError
|
|
@@ -13,7 +11,7 @@ from csvpath.util.references.files_reference_finder_2 import (
|
|
|
13
11
|
from csvpath.util.references.results_reference_finder_2 import (
|
|
14
12
|
ResultsReferenceFinder2 as ResultsReferenceFinder,
|
|
15
13
|
)
|
|
16
|
-
from csvpath.util.exceptions import
|
|
14
|
+
from csvpath.util.exceptions import FileException
|
|
17
15
|
from csvpath.util.nos import Nos
|
|
18
16
|
from csvpath.util.box import Box
|
|
19
17
|
from csvpath.util.path_util import PathUtility as pathu
|
|
@@ -641,10 +639,12 @@ class FileManager:
|
|
|
641
639
|
#
|
|
642
640
|
self.csvpaths.logger.debug("Path after removing mark, if any: %s", path)
|
|
643
641
|
self._copy_in(path, home, template)
|
|
642
|
+
self.csvpaths.logger.debug("Done copying in")
|
|
644
643
|
#
|
|
645
644
|
#
|
|
646
645
|
#
|
|
647
646
|
self.assure_docs_and_discriptor(name)
|
|
647
|
+
self.csvpaths.logger.debug("Assured docs and discriptor")
|
|
648
648
|
#
|
|
649
649
|
# create the reference to the bytes/version added to the named-file.
|
|
650
650
|
# this is the most specific reference possible. we return it when we're
|
|
@@ -658,6 +658,7 @@ class FileManager:
|
|
|
658
658
|
# create the metadata event for this registration
|
|
659
659
|
#
|
|
660
660
|
name_home = self.named_file_home(name)
|
|
661
|
+
self.csvpaths.logger.debug("Name home is %s", name_home)
|
|
661
662
|
mdata = FileMetadata(self.csvpaths.config)
|
|
662
663
|
mdata.named_file_name = name
|
|
663
664
|
mdata.named_file_ref = ret
|
|
@@ -678,6 +679,7 @@ class FileManager:
|
|
|
678
679
|
mdata.name_home = name_home
|
|
679
680
|
mdata.mark = mark
|
|
680
681
|
mdata.template = template
|
|
682
|
+
self.csvpaths.logger.debug("Created metadata")
|
|
681
683
|
#
|
|
682
684
|
# TODO: add file_size. move FileInfo into Nos. for now it is 0.
|
|
683
685
|
#
|
|
@@ -390,7 +390,7 @@ class PathsManager:
|
|
|
390
390
|
assure_definition: bool = True,
|
|
391
391
|
) -> str:
|
|
392
392
|
self.last_add_metadata = None
|
|
393
|
-
if template is not None:
|
|
393
|
+
if template is not None and str(template).strip() != "":
|
|
394
394
|
#
|
|
395
395
|
# this will raise an error. if that's a problem use temu.validate
|
|
396
396
|
#
|
|
@@ -363,11 +363,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
363
363
|
print(f"regsman: me: {id(self)}")
|
|
364
364
|
print(f"regsman: my csvpaths: {id(self.csvpaths)}")
|
|
365
365
|
print(f"regsman: dylsi: {self.dynamic_run_listeners}")
|
|
366
|
-
from csvpath.util.log_utility import LogUtility as lout
|
|
367
|
-
|
|
368
|
-
lout.log_brief_trace()
|
|
369
366
|
for _ in self.dynamic_run_listeners:
|
|
370
|
-
print(f"regsman: adding int lsit: {_}")
|
|
371
367
|
rr.add_internal_listener(_)
|
|
372
368
|
rr.register_start(mdata)
|
|
373
369
|
#
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# pylint: disable=C0114
|
|
2
2
|
|
|
3
|
-
import os
|
|
4
3
|
from smart_open import open
|
|
5
4
|
from ..file_writers import DataFileWriter
|
|
6
5
|
from csvpath.util.azure.azure_utils import AzureUtility
|
|
6
|
+
from csvpath.util.stopwatch import Stopwatch
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class AzureDataWriter(DataFileWriter):
|
|
@@ -13,17 +13,16 @@ class AzureDataWriter(DataFileWriter):
|
|
|
13
13
|
if self.sink is None:
|
|
14
14
|
client = AzureUtility.make_client()
|
|
15
15
|
self.sink = open(
|
|
16
|
-
self.path,
|
|
17
|
-
self.mode,
|
|
18
|
-
transport_params={"client": client},
|
|
19
|
-
newline=''
|
|
16
|
+
self.path, self.mode, transport_params={"client": client}, newline=""
|
|
20
17
|
)
|
|
21
18
|
AzureDataWriter._write_file_count += 1
|
|
22
19
|
|
|
23
20
|
def write(self, data) -> None:
|
|
24
21
|
if self.is_binary and not isinstance(data, bytes):
|
|
25
22
|
data = data.encode(self.encoding)
|
|
23
|
+
s = Stopwatch()
|
|
26
24
|
self.sink.write(data)
|
|
25
|
+
s.end()
|
|
27
26
|
|
|
28
27
|
def file_info(self) -> dict[str, str | int | float]:
|
|
29
28
|
# TODO: what can/should we provide here?
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
# pylint: disable=C0114
|
|
2
|
-
import os
|
|
3
|
-
from azure.storage.blob import BlobServiceClient, ContainerClient
|
|
4
2
|
from azure.storage.blob._list_blobs_helper import BlobPrefix
|
|
5
3
|
from .azure_utils import AzureUtility
|
|
6
4
|
from ..path_util import PathUtility as pathu
|
|
@@ -100,8 +98,6 @@ class AzureDo:
|
|
|
100
98
|
if files_only is True and dirs_only is True:
|
|
101
99
|
raise ValueError("Cannot list with neither files nor dirs")
|
|
102
100
|
container, blob = AzureUtility.path_to_parts(path)
|
|
103
|
-
|
|
104
|
-
# listed = os.path.basename(self.path)
|
|
105
101
|
if not blob.endswith("/"):
|
|
106
102
|
blob = f"{blob}/"
|
|
107
103
|
if blob == "/":
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from azure.core.pipeline.policies import HTTPPolicy
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class TimingPolicy(HTTPPolicy):
|
|
6
|
+
def send(self, request):
|
|
7
|
+
start = time.perf_counter()
|
|
8
|
+
response = self.next.send(request)
|
|
9
|
+
elapsed = time.perf_counter() - start
|
|
10
|
+
url = request.http_request.url.split("?")[0] # strip query params
|
|
11
|
+
print(
|
|
12
|
+
f">>>>> timing policy: {elapsed:.3f}s — {request.http_request.method} {url} → {response.http_response.status_code}"
|
|
13
|
+
)
|
|
14
|
+
return response
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
from azure.storage.blob import BlobServiceClient, BlobClient
|
|
1
|
+
from azure.storage.blob import BlobServiceClient
|
|
3
2
|
from csvpath.util.box import Box
|
|
4
3
|
from csvpath.util.config import Config
|
|
5
4
|
|
|
@@ -48,14 +47,22 @@ class AzureUtility:
|
|
|
48
47
|
connection_string = config.get(
|
|
49
48
|
section=None, name=cls.AZURE_STORAGE_CONNECTION_STRING
|
|
50
49
|
)
|
|
51
|
-
# connection_string = os.getenv(cls.AZURE_STORAGE_CONNECTION_STRING)
|
|
52
50
|
if not connection_string:
|
|
53
51
|
raise ValueError(
|
|
54
52
|
f"{cls.AZURE_STORAGE_CONNECTION_STRING} environment variable not set."
|
|
55
53
|
)
|
|
56
54
|
client = BlobServiceClient.from_connection_string(connection_string)
|
|
57
55
|
#
|
|
58
|
-
#
|
|
56
|
+
# if needed, use the following to dump call timings
|
|
57
|
+
#
|
|
58
|
+
# from .azure_timing_policy import TimingPolicy
|
|
59
|
+
# client = BlobServiceClient.from_connection_string(
|
|
60
|
+
# connection_string,
|
|
61
|
+
# _additional_pipeline_policies=[TimingPolicy()],
|
|
62
|
+
# read_timeout=5
|
|
63
|
+
# )
|
|
64
|
+
#
|
|
65
|
+
#
|
|
59
66
|
#
|
|
60
67
|
client.close = MyClose(client.close).close
|
|
61
68
|
box.add(Box.AZURE_BLOB_CLIENT, client)
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import uuid
|
|
2
1
|
import tempfile
|
|
3
2
|
from smart_open import open
|
|
4
3
|
from csvpath.util.hasher import Hasher
|
|
@@ -22,7 +21,7 @@ class SftpFingerprinter:
|
|
|
22
21
|
Box().add(Box.CSVPATHS_CONFIG, config)
|
|
23
22
|
return config
|
|
24
23
|
|
|
25
|
-
def fingerprint(self, path: str) -> str:
|
|
24
|
+
def fingerprint(self, path: str, *, retry=True) -> str:
|
|
26
25
|
config = self._config
|
|
27
26
|
#
|
|
28
27
|
#
|
|
@@ -55,5 +54,7 @@ class SftpFingerprinter:
|
|
|
55
54
|
to.write(s)
|
|
56
55
|
h = Hasher().hash(to)
|
|
57
56
|
except Exception as e:
|
|
58
|
-
print(f"SftpFingerprinter: second
|
|
57
|
+
print(f"SftpFingerprinter: second method failed with {type(e)}: {e}")
|
|
58
|
+
if retry is True:
|
|
59
|
+
return self.fingerprint(path, retry=False)
|
|
59
60
|
return h
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
# pylint: disable=C0114
|
|
2
|
-
import os
|
|
3
2
|
import paramiko
|
|
4
3
|
import stat
|
|
5
|
-
from stat import S_ISDIR, S_ISREG
|
|
6
4
|
from csvpath import CsvPaths
|
|
7
5
|
from csvpath.util.box import Box
|
|
8
6
|
from ..path_util import PathUtility as pathu
|
|
@@ -10,6 +8,14 @@ from .sftp_config import SftpConfig
|
|
|
10
8
|
from .sftp_walk import SftpWalk
|
|
11
9
|
|
|
12
10
|
|
|
11
|
+
#
|
|
12
|
+
# apr 2026. this class now does 1x retry to attempt to manage sketchy
|
|
13
|
+
# network conditions. it covers SftpWalk and fingerprinter. it does not
|
|
14
|
+
# cover the read and write classes. retrying a simple atomic operation
|
|
15
|
+
# feels reasonable. retrying a read or write feels potentially less
|
|
16
|
+
# safe and less like something we should cover for, rather than draw
|
|
17
|
+
# attention to.
|
|
18
|
+
#
|
|
13
19
|
class SftpDo:
|
|
14
20
|
@property
|
|
15
21
|
def _config(self):
|
|
@@ -81,14 +87,19 @@ class SftpDo:
|
|
|
81
87
|
return f"{self._orig_path}/{name}"
|
|
82
88
|
# return f"{self.path}/{name}"
|
|
83
89
|
|
|
84
|
-
def remove(self) -> None:
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
self.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
def remove(self, *, retry=True) -> None:
|
|
91
|
+
try:
|
|
92
|
+
if self.path == "/":
|
|
93
|
+
raise ValueError("Cannot remove the root")
|
|
94
|
+
if self.isfile():
|
|
95
|
+
self._config.sftp_client.remove(self.path)
|
|
96
|
+
else:
|
|
97
|
+
walk = SftpWalk(self._config)
|
|
98
|
+
walk.remove(self.path)
|
|
99
|
+
except Exception:
|
|
100
|
+
if retry is True:
|
|
101
|
+
self._config.reset()
|
|
102
|
+
self.remove(retry=False)
|
|
92
103
|
|
|
93
104
|
def listdir(
|
|
94
105
|
self,
|
|
@@ -97,53 +108,74 @@ class SftpDo:
|
|
|
97
108
|
recurse: bool = False,
|
|
98
109
|
dirs_only: bool = False,
|
|
99
110
|
default=None,
|
|
111
|
+
retry=True,
|
|
100
112
|
) -> list[str]:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
113
|
+
try:
|
|
114
|
+
if files_only is True and dirs_only is True:
|
|
115
|
+
raise ValueError("Cannot list with neither files nor dirs")
|
|
116
|
+
walk = SftpWalk(self._config)
|
|
117
|
+
path = self.path
|
|
118
|
+
lst = walk.listdir(path=path, default=[], recurse=recurse)
|
|
119
|
+
if files_only is True:
|
|
120
|
+
lst = [_ for _ in lst if _[1] is True]
|
|
121
|
+
if dirs_only is True:
|
|
122
|
+
lst = [_ for _ in lst if _[1] is False]
|
|
123
|
+
if recurse is True:
|
|
124
|
+
lst = [_[0] for _ in lst]
|
|
125
|
+
else:
|
|
126
|
+
lst2 = []
|
|
127
|
+
path = path.lstrip("/")
|
|
128
|
+
for _ in lst:
|
|
129
|
+
t = _[0]
|
|
130
|
+
t = t.lstrip("/")
|
|
131
|
+
if t.startswith(path):
|
|
132
|
+
t = t[len(path) + 1 :]
|
|
133
|
+
if t.count("/") > 0:
|
|
134
|
+
continue
|
|
135
|
+
lst2.append(t)
|
|
136
|
+
lst = lst2
|
|
137
|
+
return lst
|
|
138
|
+
except Exception:
|
|
139
|
+
if retry is True:
|
|
140
|
+
self._config.reset()
|
|
141
|
+
return self.listdir(
|
|
142
|
+
files_only=files_only,
|
|
143
|
+
recurse=recurse,
|
|
144
|
+
dirs_only=dirs_only,
|
|
145
|
+
default=default,
|
|
146
|
+
retry=False,
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
def copy(self, to, *, retry=True) -> None:
|
|
150
|
+
try:
|
|
151
|
+
if not self.exists():
|
|
152
|
+
raise FileNotFoundError(f"Source {self.path} does not exist.")
|
|
153
|
+
a = self._config.ssh_client
|
|
154
|
+
a.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
155
|
+
a.connect(
|
|
156
|
+
self._config.server,
|
|
157
|
+
port=self._config.port,
|
|
158
|
+
username=self._config.username,
|
|
159
|
+
password=self._config.password,
|
|
160
|
+
allow_agent=False,
|
|
161
|
+
look_for_keys=False,
|
|
162
|
+
)
|
|
163
|
+
stdin, stdout, stderr = a.exec_command(f"cp {self.path} {to}")
|
|
164
|
+
except Exception:
|
|
165
|
+
if retry is True:
|
|
166
|
+
self._config.reset()
|
|
167
|
+
self.copy(self, to, retry=False)
|
|
168
|
+
|
|
169
|
+
def exists(self, *, retry=True) -> bool:
|
|
142
170
|
try:
|
|
143
171
|
self._config.sftp_client.stat(self.path)
|
|
144
172
|
return True
|
|
145
173
|
except FileNotFoundError:
|
|
146
174
|
return False
|
|
175
|
+
except Exception:
|
|
176
|
+
if retry is True:
|
|
177
|
+
self._config.reset()
|
|
178
|
+
return self.exists(retry=False)
|
|
147
179
|
|
|
148
180
|
def dir_exists(self) -> bool:
|
|
149
181
|
try:
|
|
@@ -160,12 +192,16 @@ class SftpDo:
|
|
|
160
192
|
except FileNotFoundError:
|
|
161
193
|
return False
|
|
162
194
|
|
|
163
|
-
def isdir(self, path) -> bool:
|
|
195
|
+
def isdir(self, path, *, retry=True) -> bool:
|
|
164
196
|
try:
|
|
165
197
|
attr = self._config.sftp_client.stat(path)
|
|
166
198
|
return stat.S_ISDIR(attr.st_mode)
|
|
167
199
|
except FileNotFoundError:
|
|
168
200
|
return False
|
|
201
|
+
except Exception:
|
|
202
|
+
if retry is True:
|
|
203
|
+
self._config.reset()
|
|
204
|
+
return self.isdir(path, retry=False)
|
|
169
205
|
|
|
170
206
|
def physical_dirs(self) -> bool:
|
|
171
207
|
return True
|
|
@@ -192,14 +228,18 @@ class SftpDo:
|
|
|
192
228
|
return r
|
|
193
229
|
"""
|
|
194
230
|
|
|
195
|
-
def _isfile(self, path) -> bool:
|
|
231
|
+
def _isfile(self, path, *, retry=True) -> bool:
|
|
196
232
|
try:
|
|
197
233
|
attr = self._config.sftp_client.stat(path)
|
|
198
234
|
return stat.S_ISREG(attr.st_mode)
|
|
199
235
|
except FileNotFoundError:
|
|
200
236
|
return False
|
|
237
|
+
except Exception:
|
|
238
|
+
if retry is True:
|
|
239
|
+
self._config.reset()
|
|
240
|
+
return self._isfile(path, retry=False)
|
|
201
241
|
|
|
202
|
-
def rename(self, new_path: str) -> None:
|
|
242
|
+
def rename(self, new_path: str, *, retry=True) -> None:
|
|
203
243
|
try:
|
|
204
244
|
np = pathu.resep(new_path, hint="posix")
|
|
205
245
|
np = pathu.stripp(np)
|
|
@@ -208,6 +248,10 @@ class SftpDo:
|
|
|
208
248
|
raise
|
|
209
249
|
except (IOError, PermissionError):
|
|
210
250
|
raise RuntimeError(f"Failed to rename {self.path} to {new_path}")
|
|
251
|
+
except Exception:
|
|
252
|
+
if retry is True:
|
|
253
|
+
self._config.reset()
|
|
254
|
+
self.rename(new_path, retry=False)
|
|
211
255
|
|
|
212
256
|
def makedirs(self) -> None:
|
|
213
257
|
lst = self.path.split("/")
|
|
@@ -216,7 +260,7 @@ class SftpDo:
|
|
|
216
260
|
path = f"{p}" if path == "" else f"{path}/{p}"
|
|
217
261
|
self._mkdirs(path)
|
|
218
262
|
|
|
219
|
-
def _mkdirs(self, path):
|
|
263
|
+
def _mkdirs(self, path, *, retry=False):
|
|
220
264
|
try:
|
|
221
265
|
self._config.sftp_client.mkdir(path)
|
|
222
266
|
except OSError:
|
|
@@ -225,6 +269,10 @@ class SftpDo:
|
|
|
225
269
|
except IOError:
|
|
226
270
|
...
|
|
227
271
|
# TODO: should log
|
|
272
|
+
except Exception:
|
|
273
|
+
if retry is True:
|
|
274
|
+
self._config.reset()
|
|
275
|
+
self._mkdirs(path, retry=False)
|
|
228
276
|
|
|
229
277
|
def makedir(self) -> None:
|
|
230
278
|
self.makedirs()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import time
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Stopwatch:
|
|
5
|
+
#
|
|
6
|
+
# slow is the slow threshold as a number of ms
|
|
7
|
+
#
|
|
8
|
+
def __init__(self, slow=150, *, mark=None) -> None:
|
|
9
|
+
self.start = time.perf_counter()
|
|
10
|
+
self.last = time.perf_counter()
|
|
11
|
+
self.clicks = 0
|
|
12
|
+
self.slow = slow
|
|
13
|
+
space = "" if mark is None else " "
|
|
14
|
+
mark = "" if mark is None else mark
|
|
15
|
+
print(f"Stopwatch: {mark}{space}start: {self.start}")
|
|
16
|
+
|
|
17
|
+
def show(self, mark: str = ""):
|
|
18
|
+
self.click(mark, show=True)
|
|
19
|
+
|
|
20
|
+
def click(self, mark: str = "", *, show=False) -> None:
|
|
21
|
+
self.clicks = self.clicks + 1
|
|
22
|
+
t = time.perf_counter()
|
|
23
|
+
c = t - self.last
|
|
24
|
+
if show or c > self.slow:
|
|
25
|
+
s = t - self.start
|
|
26
|
+
space = " " if mark else ""
|
|
27
|
+
print(
|
|
28
|
+
f"Stopwatch: slow click: {mark}{space}{self.clicks}: {c} at time: {s} "
|
|
29
|
+
)
|
|
30
|
+
self.last = t
|
|
31
|
+
|
|
32
|
+
def start(self) -> None:
|
|
33
|
+
self.start = time.perf_counter()
|
|
34
|
+
self.last = time.perf_counter()
|
|
35
|
+
self.clicks = 0
|
|
36
|
+
|
|
37
|
+
def end(self, mark=None) -> None:
|
|
38
|
+
self.clicks = self.clicks + 1
|
|
39
|
+
t = time.perf_counter()
|
|
40
|
+
s = t - self.start
|
|
41
|
+
space = "" if mark is None else " "
|
|
42
|
+
mark = "" if mark is None else mark
|
|
43
|
+
print(f"Stopwatch: {mark}{space}end: {self.clicks}: {s} ")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "csvpath"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.606"
|
|
4
4
|
description = "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
|
authors = ["David Kershaw <info@csvpath.org>"]
|
|
6
6
|
readme = "README.md"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl
RENAMED
|
File without changes
|
{csvpath-0.0.605 → csvpath-0.0.606}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl
RENAMED
|
File without changes
|