csvpath 0.0.617__tar.gz → 0.0.620__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.617 → csvpath-0.0.620}/PKG-INFO +2 -3
- {csvpath-0.0.617 → csvpath-0.0.620}/README.md +1 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-windows-local.ini +3 -3
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/azure.bat +11 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/gcs.bat +6 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/local.bat +7 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/s3.bat +8 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/sftp.bat +8 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/csvpaths.py +11 -4
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_describer.py +16 -10
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_manager.py +56 -5
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_registrar.py +13 -9
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/webhook/webhook_listener.py +1 -1
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/transfers_manager.py +6 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/sql/select.py +7 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/sql/sql_in.py +30 -15
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/format.py +2 -2
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/nos.py +85 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/path_util.py +35 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_config.py +48 -9
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_data_reader.py +0 -30
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_nos.py +90 -9
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_server_creds.py +15 -5
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sqliter.py +2 -1
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/var_utility.py +1 -1
- {csvpath-0.0.617 → csvpath-0.0.620}/pyproject.toml +1 -1
- {csvpath-0.0.617 → csvpath-0.0.620}/LICENSE +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/.DS_Store +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/config.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/function.imports +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/.DS_Store +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/Mac.goenvironment.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/Windows.goenvironment.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/.DS_Store +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/assets/libs/release_candidate_maker-0.0.36.tar.gz +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/config/config.ini +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/config/env.json +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/csvpath.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_activator.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_descriptor.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/file_names_rules.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/files_activation_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/files_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_describer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_descriptor.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_manager.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/results_manager.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/server_config.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/env.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/metadata.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/parquet.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/misc/runtime.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/uuid.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/validity/matches.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/validity/percent_matching.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/slice.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/sort.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/parquet_utility.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_timing_policy.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/box.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/code.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/config.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/file_utility.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/referrer_printer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/stopwatch.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.617 → csvpath-0.0.620}/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.620
|
|
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
|
|
@@ -113,8 +113,7 @@ If you need help getting started, there are lots of ways to reach us.
|
|
|
113
113
|
- Email support@csvpath.org
|
|
114
114
|
- Or reach out to one of our [sponsors, below](#sponsors).
|
|
115
115
|
|
|
116
|
-
   [](https://pepy.tech/projects/csvpath)
|
|
118
117
|
|
|
119
118
|
# Contents
|
|
120
119
|
|
|
@@ -48,8 +48,7 @@ If you need help getting started, there are lots of ways to reach us.
|
|
|
48
48
|
- Email support@csvpath.org
|
|
49
49
|
- Or reach out to one of our [sponsors, below](#sponsors).
|
|
50
50
|
|
|
51
|
-
   [](https://pepy.tech/projects/csvpath)
|
|
53
52
|
|
|
54
53
|
# Contents
|
|
55
54
|
|
|
@@ -26,7 +26,7 @@ path = cache
|
|
|
26
26
|
use_cache = no
|
|
27
27
|
|
|
28
28
|
[functions]
|
|
29
|
-
imports =
|
|
29
|
+
imports =
|
|
30
30
|
|
|
31
31
|
[results]
|
|
32
32
|
archive = tmp\local\archive
|
|
@@ -86,7 +86,7 @@ port = SFTPPLUS_PORT
|
|
|
86
86
|
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
87
87
|
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
88
88
|
api_url = https://. . . :10020/json
|
|
89
|
-
scripts_dir =
|
|
89
|
+
scripts_dir =
|
|
90
90
|
execute_timeout = 300
|
|
91
91
|
|
|
92
92
|
[ckan]
|
|
@@ -101,7 +101,7 @@ timeout = 5
|
|
|
101
101
|
verify = False
|
|
102
102
|
|
|
103
103
|
[slack]
|
|
104
|
-
webhook_url =
|
|
104
|
+
webhook_url =
|
|
105
105
|
|
|
106
106
|
[scripts]
|
|
107
107
|
run_scripts = yes
|
|
@@ -26,9 +26,18 @@ set OTEL_RESOURCE_ATTRIBUTES=""
|
|
|
26
26
|
|
|
27
27
|
echo %CSVPATH_CONFIG_PATH%
|
|
28
28
|
call c:\dev\win-exports.bat
|
|
29
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
|
|
30
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
|
|
31
29
|
|
|
30
|
+
IF NOT EXIST "%USERPROFILE%\.local\bin\poetry.exe" (
|
|
31
|
+
echo ERROR: The Poetry binary was not found.
|
|
32
|
+
EXIT /B 1
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
36
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
37
|
+
if %ERRORLEVEL% neq 0 (
|
|
38
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
39
|
+
exit /b %ERRORLEVEL%
|
|
40
|
+
)
|
|
32
41
|
|
|
33
42
|
net stop w32time
|
|
34
43
|
w32tm /unregister
|
|
@@ -25,9 +25,13 @@ set OTEL_SERVICE_NAME=""
|
|
|
25
25
|
set OTEL_RESOURCE_ATTRIBUTES=""
|
|
26
26
|
|
|
27
27
|
call c:\dev\win-exports.bat
|
|
28
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
|
|
29
|
-
cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
|
|
30
28
|
|
|
29
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
30
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
31
|
+
IF %ERRORLEVEL% NEQ 0 (
|
|
32
|
+
echo "Tests failed. Failing the build..."
|
|
33
|
+
exit /b %ERRORLEVEL%
|
|
34
|
+
)
|
|
31
35
|
|
|
32
36
|
net stop w32time
|
|
33
37
|
w32tm /unregister
|
|
@@ -49,8 +49,13 @@ echo(
|
|
|
49
49
|
::
|
|
50
50
|
:: do the build
|
|
51
51
|
::
|
|
52
|
-
cmd.exe /C
|
|
53
|
-
cmd.exe /C
|
|
52
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
53
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
54
|
+
if %ERRORLEVEL% neq 0 (
|
|
55
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
56
|
+
exit /b %ERRORLEVEL%
|
|
57
|
+
)
|
|
58
|
+
|
|
54
59
|
|
|
55
60
|
|
|
56
61
|
net stop w32time
|
|
@@ -27,8 +27,14 @@ set OTEL_RESOURCE_ATTRIBUTES=""
|
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
call c:\dev\win-exports.bat
|
|
30
|
-
|
|
31
|
-
cmd.exe /C
|
|
30
|
+
|
|
31
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
32
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
33
|
+
if %ERRORLEVEL% neq 0 (
|
|
34
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
35
|
+
exit /b %ERRORLEVEL%
|
|
36
|
+
)
|
|
37
|
+
|
|
32
38
|
|
|
33
39
|
|
|
34
40
|
net stop w32time
|
|
@@ -25,8 +25,14 @@ set OTEL_SERVICE_NAME=""
|
|
|
25
25
|
set OTEL_RESOURCE_ATTRIBUTES=""
|
|
26
26
|
|
|
27
27
|
call c:\dev\win-exports.bat
|
|
28
|
-
|
|
29
|
-
cmd.exe /C
|
|
28
|
+
|
|
29
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
|
|
30
|
+
cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
|
|
31
|
+
if %ERRORLEVEL% neq 0 (
|
|
32
|
+
echo [ERROR] The pytest failed with code %ERRORLEVEL%.
|
|
33
|
+
exit /b %ERRORLEVEL%
|
|
34
|
+
)
|
|
35
|
+
|
|
30
36
|
|
|
31
37
|
|
|
32
38
|
net stop w32time
|
|
@@ -4,7 +4,6 @@ of the CsvPath library. it makes it easier to scale your CSV quality control."""
|
|
|
4
4
|
import os
|
|
5
5
|
import traceback
|
|
6
6
|
import atexit
|
|
7
|
-
import threading
|
|
8
7
|
|
|
9
8
|
from uuid import uuid4
|
|
10
9
|
from abc import ABC, abstractmethod
|
|
@@ -226,9 +225,17 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
226
225
|
#
|
|
227
226
|
#
|
|
228
227
|
#
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
228
|
+
# this log line didn't add especial value. but it did set the logger
|
|
229
|
+
# to a certain log file before we had a chance to do a cd-and-reload
|
|
230
|
+
# to switch into a particular project. the fix isn't just to remove the
|
|
231
|
+
# line, it's also to make the logger travel with the config used. but
|
|
232
|
+
# removing the log line is easy enough and we don't lose much. And the
|
|
233
|
+
# real fix was already in set_config_path_and_reload() -- it was just
|
|
234
|
+
# releasing/renewing the logger.
|
|
235
|
+
#
|
|
236
|
+
# self.logger.info(
|
|
237
|
+
# f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
|
|
238
|
+
# )
|
|
232
239
|
|
|
233
240
|
@property
|
|
234
241
|
def logger(self):
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import traceback
|
|
2
3
|
from typing import NewType
|
|
3
4
|
|
|
4
5
|
from csvpath.util.nos import Nos
|
|
@@ -57,16 +58,21 @@ class NamedFileDescriber:
|
|
|
57
58
|
home = self.file_manager.named_file_home(name)
|
|
58
59
|
path = Nos(home).join(self.JSON_FILE)
|
|
59
60
|
nos = Nos(path)
|
|
60
|
-
if nos.exists() is
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
61
|
+
if nos.exists() is True:
|
|
62
|
+
with DataFileReader(path) as file:
|
|
63
|
+
try:
|
|
64
|
+
return json.load(file.source)
|
|
65
|
+
except Exception:
|
|
66
|
+
msg = "Error getting named-file discriptor JSON for {name}: {ex}"
|
|
67
|
+
self.file_manager.csvpaths.logger.error(msg)
|
|
68
|
+
msg = traceback.format_exc()
|
|
69
|
+
self.file_manager.csvpaths.logger.debug(msg)
|
|
70
|
+
#
|
|
71
|
+
# cannot return None (today; << explain?) and we definitely should not
|
|
72
|
+
# create+save a new json file. (<< reasoning?) returning None may be
|
|
73
|
+
# better (<< why?) but for today this works.
|
|
74
|
+
#
|
|
75
|
+
return {}
|
|
70
76
|
|
|
71
77
|
# ========== Templates ============
|
|
72
78
|
|
|
@@ -57,7 +57,6 @@ class FileManager:
|
|
|
57
57
|
|
|
58
58
|
@property
|
|
59
59
|
def csvpaths(self):
|
|
60
|
-
"""@private"""
|
|
61
60
|
return self._csvpaths
|
|
62
61
|
|
|
63
62
|
#
|
|
@@ -65,7 +64,6 @@ class FileManager:
|
|
|
65
64
|
#
|
|
66
65
|
@property
|
|
67
66
|
def named_files_dir(self) -> str:
|
|
68
|
-
"""@private"""
|
|
69
67
|
return self._csvpaths.config.inputs_files_path
|
|
70
68
|
|
|
71
69
|
#
|
|
@@ -75,7 +73,6 @@ class FileManager:
|
|
|
75
73
|
#
|
|
76
74
|
@property
|
|
77
75
|
def files_root_manifest(self) -> dict:
|
|
78
|
-
"""@private"""
|
|
79
76
|
p = self.files_root_manifest_path
|
|
80
77
|
nos = Nos(p)
|
|
81
78
|
if nos.exists():
|
|
@@ -85,7 +82,6 @@ class FileManager:
|
|
|
85
82
|
|
|
86
83
|
@property
|
|
87
84
|
def files_root_manifest_path(self) -> dict:
|
|
88
|
-
"""@private"""
|
|
89
85
|
return Nos(self.named_files_dir).join("manifest.json")
|
|
90
86
|
|
|
91
87
|
def _named_file_ref_to_uuid(self, ref: ReferenceParser) -> str:
|
|
@@ -283,6 +279,13 @@ class FileManager:
|
|
|
283
279
|
home = pathu.resep(home)
|
|
284
280
|
return home
|
|
285
281
|
|
|
282
|
+
#
|
|
283
|
+
# creates a named-file before registering any files.
|
|
284
|
+
#
|
|
285
|
+
def assure_named_file(self, name: NamedFileName) -> None:
|
|
286
|
+
home = self.assure_named_file_home(name)
|
|
287
|
+
self.registrar.manifest_path(home)
|
|
288
|
+
|
|
286
289
|
def configure_named_file(self, name: NamedFileName, descriptor: Config) -> None:
|
|
287
290
|
#
|
|
288
291
|
# updates the named-file's descriptor by replacement
|
|
@@ -665,7 +668,9 @@ class FileManager:
|
|
|
665
668
|
self._registration_failed(_)
|
|
666
669
|
#
|
|
667
670
|
return
|
|
671
|
+
self.csvpaths.logger.info("Adding named file %s: can be loaded", name)
|
|
668
672
|
self.legal_name(name)
|
|
673
|
+
self.csvpaths.logger.info("Adding named file %s: name is legal", name)
|
|
669
674
|
if path is None or path.strip() == "":
|
|
670
675
|
_ = {
|
|
671
676
|
"name": name,
|
|
@@ -678,7 +683,13 @@ class FileManager:
|
|
|
678
683
|
if template is None:
|
|
679
684
|
template = self.describer.get_template(name)
|
|
680
685
|
if template is not None:
|
|
686
|
+
self.csvpaths.logger.debug(
|
|
687
|
+
"Adding named file %s: checking template %s", name, template
|
|
688
|
+
)
|
|
681
689
|
temu.valid(template, file=True)
|
|
690
|
+
self.csvpaths.logger.info(
|
|
691
|
+
"Adding named file %s: template is valid or None: %s", name, template
|
|
692
|
+
)
|
|
682
693
|
if config is not None:
|
|
683
694
|
#
|
|
684
695
|
# doing config here enables copy_in() to pull down files
|
|
@@ -687,6 +698,9 @@ class FileManager:
|
|
|
687
698
|
# configured in advance, but that doesn't have to be the
|
|
688
699
|
# case.
|
|
689
700
|
#
|
|
701
|
+
self.csvpaths.logger.info(
|
|
702
|
+
"Adding named file %s: configuring named-file", name
|
|
703
|
+
)
|
|
690
704
|
self.configure_named_file(name, config)
|
|
691
705
|
path = pathu.resep(path)
|
|
692
706
|
self.csvpaths.logger.debug("[%s] Path after resep %s", registration_uuid, path)
|
|
@@ -696,6 +710,10 @@ class FileManager:
|
|
|
696
710
|
local = config.get(section="inputs", name="allow_local_files", default=False)
|
|
697
711
|
local = str(local).strip().lower() in ["on", "yes", "true"]
|
|
698
712
|
nos = Nos(path)
|
|
713
|
+
self.csvpaths.logger.info(
|
|
714
|
+
"Adding named file %s: checking permission, if needed, to register local and http files",
|
|
715
|
+
name,
|
|
716
|
+
)
|
|
699
717
|
#
|
|
700
718
|
# can the descriptor override the project's prohibition on http(s) loads?
|
|
701
719
|
# no. the project may be controlled by a context like FlightPath Server, where
|
|
@@ -729,6 +747,9 @@ class FileManager:
|
|
|
729
747
|
if self.csvpaths.ecoms.do_i_raise():
|
|
730
748
|
raise FileException(msg)
|
|
731
749
|
return
|
|
750
|
+
self.csvpaths.logger.info(
|
|
751
|
+
"Adding named file %s: registration of %s permitted", name, path
|
|
752
|
+
)
|
|
732
753
|
#
|
|
733
754
|
# we should know enough to redirect if handed a dir path. we'll not recurse
|
|
734
755
|
# because the caller hasn't given us enough info to know if we should.
|
|
@@ -737,6 +758,7 @@ class FileManager:
|
|
|
737
758
|
# method. if using FlightPath Server, the server should allow them to be likewise
|
|
738
759
|
# more specific. this branch is essentially a fallback presumed to be covering for
|
|
739
760
|
# lazy developers and people who are working without better information.
|
|
761
|
+
#
|
|
740
762
|
if nos.path.find("#") > -1:
|
|
741
763
|
#
|
|
742
764
|
# if we passed in a root minor, a.k.a. "mark", we need to strip
|
|
@@ -744,13 +766,35 @@ class FileManager:
|
|
|
744
766
|
#
|
|
745
767
|
nos = Nos(nos.path[0 : nos.path.find("#")])
|
|
746
768
|
#
|
|
747
|
-
# note for now we treat any http as a file
|
|
769
|
+
# note for now we treat any http as a file.
|
|
770
|
+
#
|
|
771
|
+
# also note that this Nos must be savvy to any ServerConfig that may
|
|
772
|
+
# be available. it should use the possibly cached backend, if that
|
|
773
|
+
# matches, but if not, it must search any ServerConfig to configure
|
|
774
|
+
# itself to do operations on one of those servers.
|
|
775
|
+
#
|
|
776
|
+
# server config can be passed to a non-sftp nos. there won't be any
|
|
777
|
+
# complaints, but it won't do anything. atm, the judgement call is that
|
|
778
|
+
# we save an if-test by allowing any nos to receive server config and
|
|
779
|
+
# accepting the cost of searching for any server config in json.
|
|
780
|
+
#
|
|
781
|
+
config = self.describer.get_config(name)
|
|
782
|
+
servers = config.sources
|
|
783
|
+
nos.server_config = servers
|
|
784
|
+
#
|
|
785
|
+
# for _ in servers:
|
|
786
|
+
# if _.matches(nos.path):
|
|
787
|
+
# nos.do._config = SftpConfig(_)
|
|
748
788
|
#
|
|
749
789
|
isfile = nos.is_http or nos.isfile()
|
|
790
|
+
self.csvpaths.logger.debug(
|
|
791
|
+
"Adding named file %s: path %s is a file? %s", name, path, isfile
|
|
792
|
+
)
|
|
750
793
|
if not isfile:
|
|
751
794
|
return self.add_named_files_from_dir(
|
|
752
795
|
path, name=name, template=template, recurse=False
|
|
753
796
|
)
|
|
797
|
+
self.csvpaths.logger.debug("Adding named file %s: continuing with file", name)
|
|
754
798
|
try:
|
|
755
799
|
self.csvpaths.logger.debug(
|
|
756
800
|
"[%s] Ready to register %s", registration_uuid, path
|
|
@@ -896,6 +940,9 @@ class FileManager:
|
|
|
896
940
|
mdata.template = data.get("template") or ""
|
|
897
941
|
mdata.uuid_string = data.get("registration_uuid")
|
|
898
942
|
mdata.status = "Registration failed"
|
|
943
|
+
self.csvpaths.logger.warning(
|
|
944
|
+
"[%s] Registration failed for %s", mdata.named_file_name, data
|
|
945
|
+
)
|
|
899
946
|
lst.metadata_update(mdata)
|
|
900
947
|
|
|
901
948
|
def _validate_xlsx_mark(self, path: str, mark: str) -> None:
|
|
@@ -927,8 +974,12 @@ class FileManager:
|
|
|
927
974
|
fname = self._clean_file_name(fname)
|
|
928
975
|
temp = f"{home}{sep}{fname}"
|
|
929
976
|
copy = pathu.parts(path)[0] == pathu.parts(home)[0]
|
|
977
|
+
copy = copy and nos.is_local
|
|
930
978
|
if copy:
|
|
931
979
|
nos.path = path
|
|
980
|
+
config = self.describer.get_config(name)
|
|
981
|
+
servers = config.sources
|
|
982
|
+
nos.server_config = servers
|
|
932
983
|
nos.copy(temp)
|
|
933
984
|
else:
|
|
934
985
|
self._copy_down(name=name, path=path, temp=temp, mode="wb")
|
|
@@ -154,15 +154,19 @@ class FileRegistrar(Registrar, Listener):
|
|
|
154
154
|
raise InputException(
|
|
155
155
|
f"File mgr and registrar marks should match: {mdata.mark}, {mark}"
|
|
156
156
|
)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
157
|
+
opath = Nos(path)
|
|
158
|
+
#
|
|
159
|
+
# if we're registering a non-local file and it's an sftp file it may be
|
|
160
|
+
# on an sftp server that is configured in the named-file description. so
|
|
161
|
+
# we setup nos to be able to check, just in case.
|
|
162
|
+
#
|
|
163
|
+
config = self.csvpaths.file_manager.describer.get_config(mdata.named_file_name)
|
|
164
|
+
servers = config.sources
|
|
165
|
+
opath.server_config = servers
|
|
166
|
+
|
|
167
|
+
if not opath.is_http:
|
|
168
|
+
if not opath.exists():
|
|
169
|
+
raise InputException(f"Path {opath.path} does not exist")
|
|
166
170
|
#
|
|
167
171
|
# if the fingerprint already exists we don't store the file again.
|
|
168
172
|
# we rename the file to the fingerprint. from this point the registrar
|
{csvpath-0.0.617 → csvpath-0.0.620}/csvpath/managers/integrations/webhook/webhook_listener.py
RENAMED
|
@@ -128,7 +128,7 @@ class WebhookListener(Listener, threading.Thread):
|
|
|
128
128
|
url=url, payload=payload, headers=headers, timeout=self.timeout
|
|
129
129
|
)
|
|
130
130
|
# x = requests.post(url, json=payload, headers=headers, timeout=self.timeout)
|
|
131
|
-
if x and x.status_code
|
|
131
|
+
if x and x.status_code >= 200 and x.status_code < 300:
|
|
132
132
|
if self.csvpaths is not None:
|
|
133
133
|
self.csvpaths.logger.warning(
|
|
134
134
|
"WebhookListener received status code %s from %s",
|
|
@@ -6,6 +6,7 @@ from csvpath.managers.paths.paths_descriptor import Transfer, Transfers
|
|
|
6
6
|
|
|
7
7
|
from csvpath.util.nos import Nos
|
|
8
8
|
from csvpath.util.path_util import PathUtility as pathu
|
|
9
|
+
from csvpath.util.var_utility import VarUtility as vaut
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
class TransfersManager:
|
|
@@ -299,6 +300,11 @@ class TransfersManager:
|
|
|
299
300
|
msg = f"Variable {t} is invalid: {f}"
|
|
300
301
|
self.csvpaths.error_manager.handle_error(source=self, msg=msg)
|
|
301
302
|
raise InputException(msg)
|
|
303
|
+
|
|
304
|
+
#
|
|
305
|
+
# make sure we have vars interpolated
|
|
306
|
+
#
|
|
307
|
+
f = vaut.parse_var_value(self.csvpaths.config, t, f)
|
|
302
308
|
#
|
|
303
309
|
# if we're shipping to another backend, we don't need to change the target location
|
|
304
310
|
#
|
|
@@ -79,6 +79,7 @@ class Select(ValueProducer):
|
|
|
79
79
|
##################
|
|
80
80
|
|
|
81
81
|
def _query(self, *, table: str, column: str, where: str, conn: str) -> bool:
|
|
82
|
+
engine = None
|
|
82
83
|
try:
|
|
83
84
|
engine = Db.get_engine(conn=conn)
|
|
84
85
|
return self._do_query(
|
|
@@ -86,6 +87,12 @@ class Select(ValueProducer):
|
|
|
86
87
|
)
|
|
87
88
|
except Exception:
|
|
88
89
|
print(traceback.format_exc())
|
|
90
|
+
finally:
|
|
91
|
+
if engine is not None:
|
|
92
|
+
try:
|
|
93
|
+
engine.dispose()
|
|
94
|
+
except Exception:
|
|
95
|
+
...
|
|
89
96
|
|
|
90
97
|
def _do_query(self, *, table: str, column: str, where: str, engine: Engine) -> list:
|
|
91
98
|
table = sa.table(table, sa.column(column))
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from typing import Any
|
|
2
|
-
from sqlalchemy import
|
|
2
|
+
from sqlalchemy import Engine
|
|
3
3
|
import sqlalchemy as sa
|
|
4
4
|
import traceback
|
|
5
5
|
|
|
@@ -11,7 +11,6 @@ from csvpath.matching.functions.args import Args
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class SqlIn(ValueProducer, MatchDecider):
|
|
14
|
-
|
|
15
14
|
def __init__(self, matcher: Any, name: str, child: Matchable = None) -> None:
|
|
16
15
|
super().__init__(matcher, name=name, child=child)
|
|
17
16
|
self._cached = None
|
|
@@ -69,38 +68,56 @@ class SqlIn(ValueProducer, MatchDecider):
|
|
|
69
68
|
conn = self._value_four(skip=skip)
|
|
70
69
|
cache = self._value_five(skip=skip)
|
|
71
70
|
cache = False if cache is None else cache
|
|
72
|
-
self.value = self._query(
|
|
71
|
+
self.value = self._query(
|
|
72
|
+
table=table, column=column, value=v, conn=conn, cache=cache
|
|
73
|
+
)
|
|
73
74
|
|
|
74
75
|
def _decide_match(self, skip=None) -> None:
|
|
75
76
|
self.match = self.to_value(skip=skip)
|
|
76
77
|
|
|
77
|
-
##################
|
|
78
|
+
##################
|
|
78
79
|
|
|
79
|
-
def _query(
|
|
80
|
+
def _query(
|
|
81
|
+
self, *, table: str, column: str, value: Any, cache: bool, conn: str
|
|
82
|
+
) -> bool:
|
|
83
|
+
engine = None
|
|
80
84
|
try:
|
|
81
85
|
engine = Db.get_engine(conn=conn)
|
|
82
|
-
return self._do_query(
|
|
83
|
-
|
|
86
|
+
return self._do_query(
|
|
87
|
+
table=table, column=column, value=value, cache=cache, engine=engine
|
|
88
|
+
)
|
|
89
|
+
except Exception:
|
|
84
90
|
print(traceback.format_exc())
|
|
85
|
-
|
|
86
|
-
|
|
91
|
+
finally:
|
|
92
|
+
if engine is not None:
|
|
93
|
+
try:
|
|
94
|
+
engine.dispose()
|
|
95
|
+
except Exception:
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
def _do_query(
|
|
99
|
+
self, *, table: str, column: str, value: Any, cache: bool, engine: Engine
|
|
100
|
+
) -> bool:
|
|
87
101
|
if cache is True:
|
|
88
102
|
if self._cached is None:
|
|
89
103
|
self._do_cache(value=value, table=table, column=column, engine=engine)
|
|
90
104
|
return value in self._cached
|
|
91
105
|
else:
|
|
92
|
-
return self._do_lookup(
|
|
106
|
+
return self._do_lookup(
|
|
107
|
+
value=value, table=table, column=column, engine=engine
|
|
108
|
+
)
|
|
93
109
|
|
|
94
|
-
def _do_cache(self, *, value:Any, table:str, column:str, engine:Engine) -> bool:
|
|
110
|
+
def _do_cache(self, *, value: Any, table: str, column: str, engine: Engine) -> bool:
|
|
95
111
|
table = sa.table(table, sa.column(column))
|
|
96
112
|
sql = sa.select(sa.column(column)).select_from(table)
|
|
97
113
|
|
|
98
|
-
|
|
99
114
|
with engine.connect() as conn:
|
|
100
115
|
rows = conn.execute(sql).fetchall()
|
|
101
116
|
self._cached = {row[0]: None for row in rows}
|
|
102
117
|
|
|
103
|
-
def _do_lookup(
|
|
118
|
+
def _do_lookup(
|
|
119
|
+
self, *, value: Any, table: str, column: str, engine: Engine
|
|
120
|
+
) -> bool:
|
|
104
121
|
table = sa.table(table, sa.column(column))
|
|
105
122
|
query = (
|
|
106
123
|
sa.select(sa.column(column))
|
|
@@ -111,5 +128,3 @@ class SqlIn(ValueProducer, MatchDecider):
|
|
|
111
128
|
with engine.connect() as conn:
|
|
112
129
|
result = conn.execute(query).fetchone()
|
|
113
130
|
return result is not None
|
|
114
|
-
|
|
115
|
-
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from typing import Any
|
|
2
2
|
from csvpath.matching.productions import Term, Variable, Header, Reference
|
|
3
3
|
from csvpath.matching.functions.function import Function
|
|
4
|
-
from csvpath.matching.util.exceptions import ChildrenException, MatchException
|
|
5
4
|
from ..args import Args
|
|
6
5
|
from ..function_focus import ValueProducer
|
|
7
6
|
|
|
@@ -21,7 +20,8 @@ class Format(ValueProducer):
|
|
|
21
20
|
if self.name == "interpolate":
|
|
22
21
|
s = self.wrap(
|
|
23
22
|
"""Interpolates a complete Pythonic formatting string with one replacement value.
|
|
24
|
-
Use {{ and }} to demarcate your replacement pattern.
|
|
23
|
+
Use {{ and }} to demarcate your replacement pattern. For example, to set a variable
|
|
24
|
+
to a value as a string, use: @a = interpolate(uuid(), "{}")"""
|
|
25
25
|
)
|
|
26
26
|
self.description.append(s)
|
|
27
27
|
|