csvpath 0.0.580__tar.gz → 0.0.581__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.580 → csvpath-0.0.581}/PKG-INFO +1 -1
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/files/file_manager.py +10 -7
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/files/file_metadata.py +7 -2
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/files/file_registrar.py +1 -1
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/files/files_listener.py +1 -1
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/paths/paths_manager.py +23 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/paths/paths_registrar.py +4 -2
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/result.py +1 -2
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/line_spooler.py +85 -33
- {csvpath-0.0.580 → csvpath-0.0.581}/pyproject.toml +1 -1
- {csvpath-0.0.580 → csvpath-0.0.581}/LICENSE +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/README.md +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/config.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/function.imports +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/config/config.ini +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/config/env.json +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/csvpath.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/csvpaths.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/results_manager.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/format.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/box.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/code.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/config.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/nos.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_nos.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.580 → csvpath-0.0.581}/csvpath/util/xlsx/xlsx_reader_helper.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: csvpath
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.581
|
|
4
4
|
Summary: A data preboarding framework for ingesting, managing, and validating CSV, Excel, and other tabular data files using a Collect, Store, Validate, Publish architecture to create a trusted publisher for downstream data consumers.
|
|
5
5
|
Author: David Kershaw
|
|
6
6
|
Author-email: info@csvpath.org
|
|
@@ -387,8 +387,6 @@ class FileManager:
|
|
|
387
387
|
#
|
|
388
388
|
self.legal_name(name)
|
|
389
389
|
p = Nos(self.named_files_dir).join(name)
|
|
390
|
-
# p = os.path.join(self.named_files_dir, name)
|
|
391
|
-
# nos = self.nos
|
|
392
390
|
nos = Nos(p)
|
|
393
391
|
if nos.dir_exists():
|
|
394
392
|
nos.remove()
|
|
@@ -458,7 +456,8 @@ class FileManager:
|
|
|
458
456
|
#
|
|
459
457
|
def add_named_files_from_dir(
|
|
460
458
|
self, dirname: str, *, name=None, template: str = None, recurse=True
|
|
461
|
-
):
|
|
459
|
+
) -> list[str]:
|
|
460
|
+
ret = []
|
|
462
461
|
#
|
|
463
462
|
# legal_name handled at add_named_file
|
|
464
463
|
#
|
|
@@ -474,7 +473,6 @@ class FileManager:
|
|
|
474
473
|
dlist = nos.listdir(files_only=True, recurse=recurse)
|
|
475
474
|
for i, _ in enumerate(dlist):
|
|
476
475
|
dlist[i] = f"{nos.join(_)}"
|
|
477
|
-
|
|
478
476
|
base = dirname
|
|
479
477
|
#
|
|
480
478
|
# collect all full paths that are files and have correct extensions
|
|
@@ -499,11 +497,14 @@ class FileManager:
|
|
|
499
497
|
else:
|
|
500
498
|
# path = os.path.join(base, p)
|
|
501
499
|
path = Nos(base).join(p)
|
|
502
|
-
self.add_named_file(name=n, path=path, template=template)
|
|
500
|
+
ref = self.add_named_file(name=n, path=path, template=template)
|
|
501
|
+
if ref is not None:
|
|
502
|
+
ret.append(ref)
|
|
503
503
|
else:
|
|
504
504
|
self._csvpaths.logger.debug(
|
|
505
505
|
"%s is not in accept list", Nos(base).join(p)
|
|
506
506
|
)
|
|
507
|
+
return ret
|
|
507
508
|
|
|
508
509
|
def can_load(self, path: str) -> bool:
|
|
509
510
|
#
|
|
@@ -533,7 +534,7 @@ class FileManager:
|
|
|
533
534
|
|
|
534
535
|
def add_named_file(
|
|
535
536
|
self, *, name: NamedFileName, path: str, template: str = None
|
|
536
|
-
) -> None:
|
|
537
|
+
) -> str | None:
|
|
537
538
|
self.csvpaths.logger.info("Adding named file %s from %s", name, path)
|
|
538
539
|
if not self.can_load(path):
|
|
539
540
|
#
|
|
@@ -607,8 +608,11 @@ class FileManager:
|
|
|
607
608
|
name_home = self.named_file_home(name)
|
|
608
609
|
rpath, h = self._fingerprint(home)
|
|
609
610
|
self.csvpaths.logger.debug("Fingerprint of %s: %s", path, h)
|
|
611
|
+
ret = f"${name}.files.{h}"
|
|
612
|
+
self.csvpaths.logger.debug("Reference to named-file: %s", ret)
|
|
610
613
|
mdata = FileMetadata(self.csvpaths.config)
|
|
611
614
|
mdata.named_file_name = name
|
|
615
|
+
mdata.named_file_ref = ret
|
|
612
616
|
#
|
|
613
617
|
# we need the declared path, incl. any extra path info, in order
|
|
614
618
|
# to know if we are being pointed at a sub-portion of the data, e.g.
|
|
@@ -634,7 +638,6 @@ class FileManager:
|
|
|
634
638
|
# the fingerprint is the most precise way of referencing a particular
|
|
635
639
|
# named-file version.
|
|
636
640
|
#
|
|
637
|
-
ret = f"${name}.files.{h}"
|
|
638
641
|
self.csvpaths.logger.debug("Registered %s", ret)
|
|
639
642
|
return ret
|
|
640
643
|
except Exception as ex:
|
|
@@ -22,6 +22,11 @@ class FileMetadata(Metadata):
|
|
|
22
22
|
self.mark: str = None
|
|
23
23
|
# like csv
|
|
24
24
|
self.type: str = None
|
|
25
|
-
self.file_size = 0
|
|
25
|
+
self.file_size: int = 0
|
|
26
26
|
self.template: str = None
|
|
27
|
-
self.fingerprint = None
|
|
27
|
+
self.fingerprint: str = None
|
|
28
|
+
#
|
|
29
|
+
# named_file_ref is the most specific reference possible it is
|
|
30
|
+
# in the form $name.files.fingerprint
|
|
31
|
+
#
|
|
32
|
+
self.named_file_ref: str = None
|
|
@@ -38,7 +38,6 @@ class FileRegistrar(Registrar, Listener):
|
|
|
38
38
|
if nos.physical_dirs() and not nos.dir_exists():
|
|
39
39
|
raise InputException(f"Named file home does not exist: {home}")
|
|
40
40
|
mf = Nos(home).join("manifest.json")
|
|
41
|
-
# mf = os.path.join(home, "manifest.json")
|
|
42
41
|
nos.path = mf
|
|
43
42
|
if not nos.exists():
|
|
44
43
|
self.intermediary.put_json(mf, [])
|
|
@@ -124,6 +123,7 @@ class FileRegistrar(Registrar, Listener):
|
|
|
124
123
|
manifest_path = mdata.manifest_path
|
|
125
124
|
mani = {}
|
|
126
125
|
mani["type"] = t
|
|
126
|
+
mani["reference"] = mdata.named_file_ref
|
|
127
127
|
mani["file"] = rpath
|
|
128
128
|
mani["file_home"] = mdata.file_home
|
|
129
129
|
mani["fingerprint"] = h
|
|
@@ -33,7 +33,6 @@ class FilesListener(Listener): # Registrar,
|
|
|
33
33
|
def manifest_path(self) -> str:
|
|
34
34
|
root = self.config.get(section="inputs", name="files")
|
|
35
35
|
mf = Nos(root).join("manifest.json")
|
|
36
|
-
# mf = os.path.join(root, "manifest.json")
|
|
37
36
|
if not Nos(mf).exists():
|
|
38
37
|
with DataFileWriter(path=mf, mode="w") as writer:
|
|
39
38
|
writer.append("[]")
|
|
@@ -63,6 +62,7 @@ class FilesListener(Listener): # Registrar,
|
|
|
63
62
|
mani["named_file_name"] = mdata.named_file_name
|
|
64
63
|
mani["origin_path"] = mdata.origin_path
|
|
65
64
|
mani["fingerprint"] = mdata.fingerprint
|
|
65
|
+
mani["reference"] = mdata.named_file_ref
|
|
66
66
|
mani["file_path"] = mdata.file_path
|
|
67
67
|
mani["file_home"] = mdata.file_home
|
|
68
68
|
mani["file_name"] = mdata.file_name
|
|
@@ -412,6 +412,29 @@ class PathsManager:
|
|
|
412
412
|
self.csvpaths.logger.debug("Adding %s to %s", _, name)
|
|
413
413
|
s = self._str_from_list(paths)
|
|
414
414
|
group_file_path = self._copy_in(name, s, append=append)
|
|
415
|
+
#
|
|
416
|
+
# capture the fingerprint here before/as soon as we write the bytes
|
|
417
|
+
#
|
|
418
|
+
# self.registrar._fingerprint(s)
|
|
419
|
+
#
|
|
420
|
+
# we should capture the fingerprint here. the way we do it today, we
|
|
421
|
+
# have Hasher read the file. However, that opens up a race condition. may
|
|
422
|
+
# not be likely, but we could have a conflict. there are a few problems.
|
|
423
|
+
# for local files we can use the same Hasher code by writing a temp file
|
|
424
|
+
# and hashing that. non-local files are harder because we don't know for
|
|
425
|
+
# 100% certain that the same bytes will result in the same hash if we do
|
|
426
|
+
# the hashing ourselves vs get it from the backend. given that non-local
|
|
427
|
+
# backends are inherently performance challenged we would prefer to not
|
|
428
|
+
# push even the relatively small group files back and forth to check that
|
|
429
|
+
# they haven't changed. however, since we can see the point in time where
|
|
430
|
+
# an updated happened to compare it to the point in time when a run
|
|
431
|
+
# happened we can make a good guess if we have a race and analyze
|
|
432
|
+
# accordingly. not perfect, but also not a complete information gap, so
|
|
433
|
+
# this is probably good enough for now.
|
|
434
|
+
#
|
|
435
|
+
# h = Hasher().hash(s)
|
|
436
|
+
#
|
|
437
|
+
|
|
415
438
|
#
|
|
416
439
|
# the paths have to be reacquired because we might be appending.
|
|
417
440
|
#
|
|
@@ -120,7 +120,6 @@ class PathsRegistrar(Registrar, Listener):
|
|
|
120
120
|
def manifest_path(self, name: str) -> None:
|
|
121
121
|
nhome = self.manager.named_paths_home(name)
|
|
122
122
|
mf = Nos(nhome).join("manifest.json")
|
|
123
|
-
# mf = os.path.join(nhome, "manifest.json")
|
|
124
123
|
if not Nos(mf).exists():
|
|
125
124
|
self.intermediary.put_json(mf, [])
|
|
126
125
|
return mf
|
|
@@ -141,10 +140,13 @@ class PathsRegistrar(Registrar, Listener):
|
|
|
141
140
|
return sname
|
|
142
141
|
|
|
143
142
|
def _fingerprint(self, *, name=None, group_file_path=None) -> str:
|
|
143
|
+
#
|
|
144
|
+
# in a more perfect world this fingerprint would be generated at the time
|
|
145
|
+
# we write the group file bytes. as is looks like a fairly large race condition.
|
|
146
|
+
#
|
|
144
147
|
if group_file_path is None and name is not None:
|
|
145
148
|
home = self.manager.named_paths_home(name)
|
|
146
149
|
group_file_path = Nos(home).join("group.csvpaths")
|
|
147
|
-
# group_file_path = os.path.join(home, "group.csvpaths")
|
|
148
150
|
elif group_file_path is None and name is None:
|
|
149
151
|
raise InputException(
|
|
150
152
|
"Either the named-paths name or the path to the group file must be provided"
|
|
@@ -198,14 +198,13 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
|
|
|
198
198
|
def manifest(self) -> dict:
|
|
199
199
|
p = self.instance_dir
|
|
200
200
|
p = Nos(p).join("manifest.json")
|
|
201
|
-
# p = os.path.join(p, "manifest.json")
|
|
202
201
|
with DataFileReader(p) as reader:
|
|
203
202
|
return json.load(reader.source)
|
|
204
203
|
|
|
205
204
|
@property
|
|
206
205
|
def identity_or_index(self) -> str:
|
|
207
206
|
s = self._csvpath.identity
|
|
208
|
-
if f"{s}".strip() == "":
|
|
207
|
+
if s is None or f"{s}".strip() == "":
|
|
209
208
|
s = self.run_index
|
|
210
209
|
return s
|
|
211
210
|
|
|
@@ -2,8 +2,10 @@ import os
|
|
|
2
2
|
import csv
|
|
3
3
|
import json
|
|
4
4
|
import boto3
|
|
5
|
+
import logging
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from abc import ABC, abstractmethod
|
|
8
|
+
|
|
7
9
|
from .exceptions import InputException
|
|
8
10
|
from .file_readers import DataFileReader
|
|
9
11
|
from .file_writers import DataFileWriter
|
|
@@ -14,7 +16,7 @@ from .path_util import PathUtility as pathu
|
|
|
14
16
|
|
|
15
17
|
class LineSpooler(ABC):
|
|
16
18
|
def __init__(self, myresult) -> None:
|
|
17
|
-
self.result = myresult
|
|
19
|
+
self.result = myresult
|
|
18
20
|
self.sink = None
|
|
19
21
|
self._count = 0
|
|
20
22
|
self.closed = False
|
|
@@ -60,13 +62,26 @@ class ListLineSpooler(LineSpooler):
|
|
|
60
62
|
|
|
61
63
|
|
|
62
64
|
class CsvLineSpooler(LineSpooler):
|
|
63
|
-
def __init__(
|
|
65
|
+
def __init__(
|
|
66
|
+
self,
|
|
67
|
+
myresult,
|
|
68
|
+
*,
|
|
69
|
+
path: str = None,
|
|
70
|
+
logger: logging.Logger = None,
|
|
71
|
+
delimiter: str = ",",
|
|
72
|
+
quotechar: str = '"',
|
|
73
|
+
) -> None:
|
|
64
74
|
super().__init__(myresult)
|
|
65
|
-
self._path =
|
|
75
|
+
self._path = path
|
|
66
76
|
self.writer = None
|
|
77
|
+
self._logger = logger
|
|
78
|
+
self._delimiter = delimiter
|
|
79
|
+
self._quotechar = quotechar
|
|
67
80
|
|
|
68
81
|
@property
|
|
69
82
|
def path(self) -> str:
|
|
83
|
+
if self._path is None:
|
|
84
|
+
self._instance_data_file_path()
|
|
70
85
|
return self._path
|
|
71
86
|
|
|
72
87
|
@path.setter
|
|
@@ -74,14 +89,40 @@ class CsvLineSpooler(LineSpooler):
|
|
|
74
89
|
p = pathu.resep(p)
|
|
75
90
|
self._path = p
|
|
76
91
|
|
|
92
|
+
@property
|
|
93
|
+
def logger(self) -> logging.Logger:
|
|
94
|
+
if self._logger:
|
|
95
|
+
return self._logger
|
|
96
|
+
if self.result is not None and self.result.csvpath is not None:
|
|
97
|
+
return self.result.csvpath.logger
|
|
98
|
+
return logging.getLogger(self.__class__.__name__)
|
|
99
|
+
|
|
100
|
+
@property
|
|
101
|
+
def delimiter(self) -> str:
|
|
102
|
+
if self._delimiter is not None:
|
|
103
|
+
return self._delimiter
|
|
104
|
+
if self.result is not None and self.result.csvpath is not None:
|
|
105
|
+
return self.result.csvpath.delimiter
|
|
106
|
+
else:
|
|
107
|
+
self.logger.error("No delimiter available")
|
|
108
|
+
|
|
109
|
+
@property
|
|
110
|
+
def quotechar(self) -> str:
|
|
111
|
+
if self._quotechar is not None:
|
|
112
|
+
return self._quotechar
|
|
113
|
+
if self.result is not None and self.result.csvpath is not None:
|
|
114
|
+
return self.result.csvpath.quotechar
|
|
115
|
+
else:
|
|
116
|
+
self.logger.error("No quotechar available")
|
|
117
|
+
|
|
77
118
|
def __iter__(self):
|
|
78
119
|
return self
|
|
79
120
|
|
|
80
121
|
def to_list(self) -> list[str]:
|
|
81
|
-
if self.path
|
|
82
|
-
|
|
83
|
-
if Nos(self.path).exists() is False:
|
|
84
|
-
self.
|
|
122
|
+
if not self.path:
|
|
123
|
+
return []
|
|
124
|
+
if self.path is not None and Nos(self.path).exists() is False:
|
|
125
|
+
self.logger.debug(
|
|
85
126
|
"There is no data.csv at %s. This may or may not be a problem.",
|
|
86
127
|
self.path,
|
|
87
128
|
)
|
|
@@ -90,15 +131,15 @@ class CsvLineSpooler(LineSpooler):
|
|
|
90
131
|
for line in DataFileReader(
|
|
91
132
|
self.path,
|
|
92
133
|
filetype="csv",
|
|
93
|
-
delimiter=self.
|
|
94
|
-
quotechar=self.
|
|
134
|
+
delimiter=self.delimiter,
|
|
135
|
+
quotechar=self.quotechar,
|
|
95
136
|
).next():
|
|
96
137
|
lst.append(line)
|
|
97
138
|
return lst
|
|
98
139
|
|
|
99
140
|
def __len__(self) -> int:
|
|
100
141
|
if self._count is None or self._count <= 0:
|
|
101
|
-
if self.result is not None and self.result.instance_dir:
|
|
142
|
+
if self.result is not None and self.result.instance_dir is not None:
|
|
102
143
|
d = Nos(self.result.instance_dir).join("meta.json")
|
|
103
144
|
if Nos(d).exists() is True:
|
|
104
145
|
with DataFileReader(d) as file:
|
|
@@ -108,9 +149,10 @@ class CsvLineSpooler(LineSpooler):
|
|
|
108
149
|
return self._count
|
|
109
150
|
|
|
110
151
|
def load_if(self) -> None:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
152
|
+
if self.path is None:
|
|
153
|
+
...
|
|
154
|
+
else:
|
|
155
|
+
self.sink = self._open_file(self.path)
|
|
114
156
|
self.writer = csv.writer(self.sink)
|
|
115
157
|
|
|
116
158
|
def _open_file(self, path: str):
|
|
@@ -119,10 +161,10 @@ class CsvLineSpooler(LineSpooler):
|
|
|
119
161
|
return dw.sink
|
|
120
162
|
|
|
121
163
|
def next(self):
|
|
122
|
-
if self.path
|
|
123
|
-
|
|
164
|
+
if not self.path:
|
|
165
|
+
...
|
|
124
166
|
if Nos(self.path).exists() is False:
|
|
125
|
-
self.
|
|
167
|
+
self.logger.debug(
|
|
126
168
|
"There is no data.csv at %s. This may or may not be a problem.",
|
|
127
169
|
self.path,
|
|
128
170
|
)
|
|
@@ -130,31 +172,35 @@ class CsvLineSpooler(LineSpooler):
|
|
|
130
172
|
for line in DataFileReader(
|
|
131
173
|
self.path,
|
|
132
174
|
filetype="csv",
|
|
133
|
-
delimiter=self.
|
|
134
|
-
quotechar=self.
|
|
175
|
+
delimiter=self.delimiter,
|
|
176
|
+
quotechar=self.quotechar,
|
|
135
177
|
).next():
|
|
136
178
|
yield line
|
|
137
179
|
|
|
138
180
|
def _warn_if(self) -> None:
|
|
139
|
-
if self.result is not None and self.result.csvpath:
|
|
140
|
-
self.
|
|
141
|
-
"CsvLineSpooler cannot find
|
|
181
|
+
if self.result is not None and self.result.csvpath is not None:
|
|
182
|
+
self.logger.warning(
|
|
183
|
+
"CsvLineSpooler cannot find data file path yet within %s",
|
|
142
184
|
self.result.run_dir,
|
|
143
185
|
)
|
|
186
|
+
else:
|
|
187
|
+
self.logger.warning("No path available")
|
|
144
188
|
|
|
145
189
|
def _instance_data_file_path(self):
|
|
190
|
+
if self._path is not None:
|
|
191
|
+
return
|
|
146
192
|
if self.result is None:
|
|
147
193
|
self._warn_if()
|
|
148
|
-
return
|
|
194
|
+
return
|
|
149
195
|
if self.result.csvpath is None:
|
|
150
196
|
self._warn_if()
|
|
151
|
-
return
|
|
197
|
+
return
|
|
152
198
|
if self.result.csvpath.scanner is None:
|
|
153
199
|
self._warn_if()
|
|
154
|
-
return
|
|
200
|
+
return
|
|
155
201
|
if self.result.csvpath.scanner.filename is None:
|
|
156
202
|
self._warn_if()
|
|
157
|
-
return
|
|
203
|
+
return
|
|
158
204
|
#
|
|
159
205
|
# data file could be not there. we can in principle make sure that doesn't happen.
|
|
160
206
|
# if we did, tho, we would need to be sure we don't create the dir so early that
|
|
@@ -162,21 +208,23 @@ class CsvLineSpooler(LineSpooler):
|
|
|
162
208
|
# one case. leave the concern about the existence of the path aside for now.
|
|
163
209
|
#
|
|
164
210
|
self.path = self.result.data_file_path
|
|
165
|
-
return self.path
|
|
166
211
|
|
|
167
212
|
def append(self, line) -> None:
|
|
168
213
|
if not self.writer:
|
|
169
214
|
self.load_if()
|
|
170
215
|
if not self.writer:
|
|
171
|
-
|
|
216
|
+
msg = None
|
|
217
|
+
if self.result:
|
|
218
|
+
msg = f"Cannot write to data file for {self.result}"
|
|
219
|
+
else:
|
|
220
|
+
msg = f"Cannot write to {self.path}"
|
|
221
|
+
raise InputException(msg)
|
|
172
222
|
self.writer.writerows([line])
|
|
173
223
|
self._count += 1
|
|
174
224
|
|
|
175
225
|
def bytes_written(self) -> int:
|
|
176
|
-
p = self._instance_data_file_path()
|
|
177
|
-
# there may be no file if we're on/before line 0 of the data.csv. that is Ok.
|
|
178
226
|
try:
|
|
179
|
-
i = FileInfo.info(
|
|
227
|
+
i = FileInfo.info(self.path)
|
|
180
228
|
if i and "bytes" in i:
|
|
181
229
|
return i["bytes"]
|
|
182
230
|
else:
|
|
@@ -194,9 +242,13 @@ class CsvLineSpooler(LineSpooler):
|
|
|
194
242
|
# drop the sink so no chance for recurse
|
|
195
243
|
self.sink = None
|
|
196
244
|
try:
|
|
197
|
-
|
|
198
|
-
|
|
245
|
+
if self.csvpath:
|
|
246
|
+
self.csvpath.error_manager.handle_error(source=self, msg=f"{ex}")
|
|
247
|
+
elif self.csvpaths:
|
|
248
|
+
self.csvpaths.error_manager.handle_error(source=self, msg=f"{ex}")
|
|
249
|
+
else:
|
|
250
|
+
self.logger.error(str(ex))
|
|
199
251
|
except Exception as e:
|
|
200
|
-
self.
|
|
252
|
+
self.logger.error(
|
|
201
253
|
f"Caught {e}. Not raising an exception because closing."
|
|
202
254
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "csvpath"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.581"
|
|
4
4
|
description = "A data preboarding framework for ingesting, managing, and validating CSV, Excel, and other tabular data files using a Collect, Store, Validate, Publish architecture to create a trusted publisher for 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
|
|
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
|