csvpath 0.0.548__tar.gz → 0.0.550__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.548 → csvpath-0.0.550}/PKG-INFO +1 -1
- {csvpath-0.0.548 → csvpath-0.0.550/assets}/config/config.ini +1 -1
- csvpath-0.0.550/assets/config/jenkins-local-azure.ini +101 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-s3.ini +1 -1
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-sftp.ini +4 -4
- {csvpath-0.0.548/assets → csvpath-0.0.550}/config/config.ini +1 -1
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/csvpath.py +5 -2
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_comms.py +8 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_manager.py +13 -4
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_manager.py +4 -3
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_registrar.py +11 -1
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_manager.py +24 -7
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_registrar.py +1 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_factory.py +2 -1
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/last.py +9 -6
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/above.py +4 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/expression_utility.py +81 -17
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/config.py +5 -4
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/nos.py +6 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_reference_finder_2.py +15 -16
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_transformer.py +72 -44
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_reference_finder_2.py +40 -12
- csvpath-0.0.550/csvpath/util/references/results_tools/data_finder.py +28 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/date_filter.py +61 -27
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/identity_finder.py +9 -2
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/path_filter.py +17 -4
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/resolve_possibles.py +9 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/pyproject.toml +1 -1
- csvpath-0.0.548/assets/config/jenkins-local-azure.ini +0 -138
- csvpath-0.0.548/csvpath/util/references/results_tools/data_finder.py +0 -19
- {csvpath-0.0.548 → csvpath-0.0.550}/LICENSE +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/README.md +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/function.imports +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/local-localhost-sftp.ini +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/csvpaths.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_registrar.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/files_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/exceptions.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/parser.out +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/parsetab.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/scanner.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/scanning_lexer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/box.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/code.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_grammar.py +1 -1
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_nos.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/var_utility.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: csvpath
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.550
|
|
4
4
|
Summary: A data preboarding framework for managing and validating CSV, Excel, and other tabular data files using a Collect, Store, Validate, Publish pattern to create a trusted publisher for downstream data consumers.
|
|
5
5
|
Author: David Kershaw
|
|
6
6
|
Author-email: dk107dk@hotmail.com
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
[testing]
|
|
2
|
+
azure.skip = no
|
|
3
|
+
gcs.skip = yes
|
|
4
|
+
s3.skip = yes
|
|
5
|
+
sftp.skip = yes
|
|
6
|
+
|
|
7
|
+
[csvpath_files]
|
|
8
|
+
extensions = csvpath, csvpaths
|
|
9
|
+
|
|
10
|
+
[csv_files]
|
|
11
|
+
extensions = csv, tsv, dat, tab, psv, ssv
|
|
12
|
+
|
|
13
|
+
[errors]
|
|
14
|
+
csvpath = raise, collect, print
|
|
15
|
+
csvpaths = raise, collect, print
|
|
16
|
+
use_format = full
|
|
17
|
+
pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
|
|
18
|
+
|
|
19
|
+
[logging]
|
|
20
|
+
csvpath = debug
|
|
21
|
+
csvpaths = debug
|
|
22
|
+
log_file = logs/csvpath.log
|
|
23
|
+
log_files_to_keep = 100
|
|
24
|
+
log_file_size = 52428800
|
|
25
|
+
|
|
26
|
+
[config]
|
|
27
|
+
path = assets/config/jenkins-local-azure.ini
|
|
28
|
+
|
|
29
|
+
[cache]
|
|
30
|
+
path = cache
|
|
31
|
+
use_cache = no
|
|
32
|
+
|
|
33
|
+
[functions]
|
|
34
|
+
imports = config/functions.imports
|
|
35
|
+
|
|
36
|
+
[results]
|
|
37
|
+
archive = archive
|
|
38
|
+
|
|
39
|
+
[inputs]
|
|
40
|
+
files = azure://csvpath/inputs/named_files
|
|
41
|
+
csvpaths = inputs/named_paths
|
|
42
|
+
on_unmatched_file_fingerprints = halt
|
|
43
|
+
|
|
44
|
+
[listeners]
|
|
45
|
+
groups =
|
|
46
|
+
sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
|
|
47
|
+
sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
|
|
48
|
+
default.file = from csvpath.managers.files.files_listener import FilesListener
|
|
49
|
+
default.paths = from csvpath.managers.paths.paths_listener import PathsListener
|
|
50
|
+
otlp.result = from csvpath.managers.integrations.otlp.otlp_result_listener import OpenTelemetryResultListener
|
|
51
|
+
otlp.results = from csvpath.managers.integrations.otlp.otlp_results_listener import OpenTelemetryResultsListener
|
|
52
|
+
otlp.errors = from csvpath.managers.integrations.otlp.otlp_error_listener import OpenTelemetryErrorListener
|
|
53
|
+
sftpplus.paths = from csvpath.managers.integrations.sftpplus.sftpplus_listener import SftpPlusListener
|
|
54
|
+
sftp.results = from csvpath.managers.integrations.sftp.sftp_listener import SftpListener
|
|
55
|
+
ckan.results = from csvpath.managers.integrations.ckan.ckan_listener import CkanListener
|
|
56
|
+
marquez.file = from csvpath.managers.integrations.ol.file_listener_ol import OpenLineageFileListener
|
|
57
|
+
marquez.paths = from csvpath.managers.integrations.ol.paths_listener_ol import OpenLineagePathsListener
|
|
58
|
+
marquez.result = from csvpath.managers.integrations.ol.result_listener_ol import OpenLineageResultListener
|
|
59
|
+
marquez.results = from csvpath.managers.integrations.ol.results_listener_ol import OpenLineageResultsListener
|
|
60
|
+
slack.file = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
61
|
+
slack.paths = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
62
|
+
slack.result = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
63
|
+
slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
64
|
+
|
|
65
|
+
[sftp]
|
|
66
|
+
server = 172.17.0.3
|
|
67
|
+
port = 10022
|
|
68
|
+
username = tinpenny
|
|
69
|
+
password = tinpenny
|
|
70
|
+
|
|
71
|
+
[sqlite]
|
|
72
|
+
db = archive/csvpath.db
|
|
73
|
+
|
|
74
|
+
[sftpplus]
|
|
75
|
+
mailbox_user = MAILBOX_USER
|
|
76
|
+
mailbox_password = MAILBOX_PASSWORD
|
|
77
|
+
server = SFTPPLUS_SERVER
|
|
78
|
+
port = SFTPPLUS_PORT
|
|
79
|
+
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
80
|
+
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
81
|
+
api_url = https://localhost:10020/json
|
|
82
|
+
scripts_dir =
|
|
83
|
+
execute_timeout = 300
|
|
84
|
+
|
|
85
|
+
[ckan]
|
|
86
|
+
server = http://localhost:80
|
|
87
|
+
api_token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3akJwc1ZuSkVrZm1aNnBtVTJfTW5CNlJXZ211YjdOOHVXZ1l1cUFDa0Q4IiwiaWF0IjoxNzM0NzE4NDQ3fQ.QXWXoJoSxVES4NwXYBteYUD7enX9D5T2htmETLGFzrs
|
|
88
|
+
|
|
89
|
+
[marquez]
|
|
90
|
+
base_url = http://localhost:5000
|
|
91
|
+
endpoint = api/v1/lineage
|
|
92
|
+
api_key = "none"
|
|
93
|
+
timeout = 5
|
|
94
|
+
verify = False
|
|
95
|
+
|
|
96
|
+
[slack]
|
|
97
|
+
webhook_url =
|
|
98
|
+
|
|
99
|
+
[extensions]
|
|
100
|
+
csvpath_files = None
|
|
101
|
+
|
|
@@ -6,7 +6,7 @@ extensions = csv, tsv, dat, tab, psv, ssv
|
|
|
6
6
|
|
|
7
7
|
[errors]
|
|
8
8
|
csvpath = raise, collect, print
|
|
9
|
-
csvpaths = raise,
|
|
9
|
+
csvpaths = raise, print
|
|
10
10
|
use_format = full
|
|
11
11
|
pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
|
|
12
12
|
|
|
@@ -32,7 +32,7 @@ archive = archive
|
|
|
32
32
|
|
|
33
33
|
[inputs]
|
|
34
34
|
files = inputs/named_files
|
|
35
|
-
csvpaths = sftp://192.168.
|
|
35
|
+
csvpaths = sftp://192.168.72.2:2022/inputs/named_paths
|
|
36
36
|
on_unmatched_file_fingerprints = halt
|
|
37
37
|
|
|
38
38
|
[testing]
|
|
@@ -42,7 +42,7 @@ s3.skip = yes
|
|
|
42
42
|
sftp.skip = no
|
|
43
43
|
|
|
44
44
|
[listeners]
|
|
45
|
-
groups =
|
|
45
|
+
groups = default
|
|
46
46
|
sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
|
|
47
47
|
sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
|
|
48
48
|
default.file = from csvpath.managers.files.files_listener import FilesListener
|
|
@@ -63,7 +63,7 @@ slack.result = from csvpath.managers.integrations.slack.sender import SlackSende
|
|
|
63
63
|
slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
|
|
64
64
|
|
|
65
65
|
[sftp]
|
|
66
|
-
server = 192.168.
|
|
66
|
+
server = 192.168.72.2
|
|
67
67
|
port = 2022
|
|
68
68
|
username = python
|
|
69
69
|
password = hangzhou
|
|
@@ -1222,10 +1222,13 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
1222
1222
|
"CsvPath.matches:703: %s: matches: %s", self.identity, matches
|
|
1223
1223
|
)
|
|
1224
1224
|
#
|
|
1225
|
-
# if we are done scanning we can stop
|
|
1225
|
+
# if we are done scanning we can stop. however, if the file is ending on its own
|
|
1226
|
+
# -- we are scanning right to the last line -- we don't call stop because we aren't
|
|
1227
|
+
# actively stopping the run, we're just letting it run out.
|
|
1226
1228
|
#
|
|
1227
1229
|
if self.scanner.is_last(self.line_monitor.physical_line_number):
|
|
1228
|
-
self.
|
|
1230
|
+
if not self.line_monitor.is_last_line():
|
|
1231
|
+
self.stop()
|
|
1229
1232
|
if matches is True:
|
|
1230
1233
|
#
|
|
1231
1234
|
# _current_match_count is a placeholder that
|
|
@@ -60,6 +60,13 @@ class ErrorCommunications:
|
|
|
60
60
|
return ret
|
|
61
61
|
|
|
62
62
|
def do_i_stop(self) -> bool:
|
|
63
|
+
#
|
|
64
|
+
# stop is having problems. copying raise, which works fine.
|
|
65
|
+
#
|
|
66
|
+
if self._csvpath and self._csvpath.stop_on_validation_errors is not None:
|
|
67
|
+
return self._csvpath.stop_on_validation_errors
|
|
68
|
+
return self.in_policy(OnError.STOP.value)
|
|
69
|
+
"""
|
|
63
70
|
mode = None
|
|
64
71
|
if self._csvpath and self._csvpath.stop_on_validation_errors is not None:
|
|
65
72
|
#
|
|
@@ -73,6 +80,7 @@ class ErrorCommunications:
|
|
|
73
80
|
# return self._csvpath.stop_on_validation_errors
|
|
74
81
|
policy = self.in_policy(OnError.STOP.value)
|
|
75
82
|
return mode is True or policy is True
|
|
83
|
+
"""
|
|
76
84
|
|
|
77
85
|
def do_i_fail(self) -> bool:
|
|
78
86
|
if self._csvpath and self._csvpath.fail_on_validation_errors is not None:
|
|
@@ -101,7 +101,11 @@ class FileManager:
|
|
|
101
101
|
if name is None:
|
|
102
102
|
raise ValueError("File can be None but named-file name must be passed")
|
|
103
103
|
|
|
104
|
-
ref =
|
|
104
|
+
ref = (
|
|
105
|
+
ReferenceParser(name, csvpaths=self.csvpaths)
|
|
106
|
+
if name.startswith("$")
|
|
107
|
+
else None
|
|
108
|
+
)
|
|
105
109
|
if ref is not None and file is None:
|
|
106
110
|
if ref.datatype != ref.RESULTS:
|
|
107
111
|
raise ValueError("Reference must be results, not {ref.datatype}")
|
|
@@ -263,11 +267,15 @@ class FileManager:
|
|
|
263
267
|
# nos sep is backend aware. it doesn't know what backend is handling
|
|
264
268
|
# files, only what backend it is itself.
|
|
265
269
|
#
|
|
266
|
-
#sep = self.csvpaths.config.files_sep
|
|
270
|
+
# sep = self.csvpaths.config.files_sep
|
|
267
271
|
#
|
|
268
272
|
# sadly we don't have an https backend at this time. so we have to test for the protocol.
|
|
269
273
|
#
|
|
270
|
-
sep =
|
|
274
|
+
sep = (
|
|
275
|
+
"/"
|
|
276
|
+
if path.startswith("https://") or path.startswith("http://")
|
|
277
|
+
else nos.sep
|
|
278
|
+
)
|
|
271
279
|
f = path.rfind(sep)
|
|
272
280
|
fname = path if f == -1 else path[f + 1 :]
|
|
273
281
|
fname = self._clean_file_name(fname)
|
|
@@ -449,6 +457,7 @@ class FileManager:
|
|
|
449
457
|
nos = self.nos
|
|
450
458
|
nos.path = dirname
|
|
451
459
|
dlist = nos.listdir(files_only=True, recurse=recurse)
|
|
460
|
+
# print(f"add_named_files_from_dir: dirname: {dirname}, dlist: {dlist}")
|
|
452
461
|
base = dirname
|
|
453
462
|
#
|
|
454
463
|
# collect all full paths that are files and have correct extensions
|
|
@@ -556,7 +565,7 @@ class FileManager:
|
|
|
556
565
|
nos = self.nos
|
|
557
566
|
nos.path = path
|
|
558
567
|
sep = nos.sep
|
|
559
|
-
sep =
|
|
568
|
+
sep = "/" if path.startswith("https://") or path.startswith("http://") else sep
|
|
560
569
|
fname = path if path.rfind(sep) == -1 else path[path.rfind(sep) + 1 :]
|
|
561
570
|
#
|
|
562
571
|
# creates
|
|
@@ -446,8 +446,8 @@ class PathsManager:
|
|
|
446
446
|
#
|
|
447
447
|
# exp. improved for FP
|
|
448
448
|
#
|
|
449
|
-
|
|
450
|
-
definition[name] =
|
|
449
|
+
self._get_named_paths(name)
|
|
450
|
+
definition[name] = []
|
|
451
451
|
#
|
|
452
452
|
# end exp.
|
|
453
453
|
#
|
|
@@ -665,7 +665,8 @@ class PathsManager:
|
|
|
665
665
|
|
|
666
666
|
def number_of_named_paths(self, name: NamedPathsName) -> int:
|
|
667
667
|
"""@private"""
|
|
668
|
-
|
|
668
|
+
paths = self._get_named_paths(name)
|
|
669
|
+
return 0 if not paths else len(paths)
|
|
669
670
|
|
|
670
671
|
def total_named_paths(self) -> int:
|
|
671
672
|
"""@private"""
|
|
@@ -3,8 +3,10 @@ import json
|
|
|
3
3
|
from datetime import datetime
|
|
4
4
|
from csvpath.util.file_readers import DataFileReader
|
|
5
5
|
from csvpath.util.file_writers import DataFileWriter
|
|
6
|
+
from csvpath.util.references.reference_parser import ReferenceParser
|
|
6
7
|
from csvpath.util.nos import Nos
|
|
7
8
|
from csvpath.util.box import Box
|
|
9
|
+
|
|
8
10
|
from ..listener import Listener
|
|
9
11
|
from ..metadata import Metadata
|
|
10
12
|
from ..registrar import Registrar
|
|
@@ -66,7 +68,15 @@ class ResultRegistrar(Registrar, Listener):
|
|
|
66
68
|
mdata = ResultMetadata(config=self.csvpaths.config)
|
|
67
69
|
mdata.from_manifest(m)
|
|
68
70
|
mdata.archive_name = self.archive_name
|
|
69
|
-
|
|
71
|
+
#
|
|
72
|
+
# if the paths_name has a $ we need to be more general
|
|
73
|
+
#
|
|
74
|
+
if "$" in self.result.paths_name:
|
|
75
|
+
ref = ReferenceParser(self.result.paths_name)
|
|
76
|
+
mdata.named_results_name = ref.root_major
|
|
77
|
+
else:
|
|
78
|
+
mdata.named_results_name = self.result.paths_name
|
|
79
|
+
|
|
70
80
|
mdata.named_paths_name = self.result.paths_name
|
|
71
81
|
mdata.named_paths_uuid_string = self.csvpaths.run_metadata.named_paths_uuid
|
|
72
82
|
mdata.named_file_name = self.result.file_name
|
|
@@ -16,6 +16,7 @@ from csvpath.util.references.results_reference_finder_2 import (
|
|
|
16
16
|
from csvpath.util.file_readers import DataFileReader
|
|
17
17
|
from csvpath.util.file_writers import DataFileWriter
|
|
18
18
|
from csvpath.util.nos import Nos
|
|
19
|
+
|
|
19
20
|
from csvpath.scanning.scanner import Scanner
|
|
20
21
|
from ..run.run_metadata import RunMetadata
|
|
21
22
|
from ..run.run_registrar import RunRegistrar
|
|
@@ -71,7 +72,10 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
71
72
|
mdata.named_file_path = m["named_file_path"]
|
|
72
73
|
mdata.run_home = run_dir
|
|
73
74
|
mdata.named_paths_name = pathsname
|
|
74
|
-
|
|
75
|
+
if "$" in pathsname:
|
|
76
|
+
mdata.named_results_name = ReferenceParser(pathsname).root_major
|
|
77
|
+
else:
|
|
78
|
+
mdata.named_results_name = pathsname
|
|
75
79
|
mdata.number_of_files_expected = -1
|
|
76
80
|
mdata.number_of_files_generated = -1
|
|
77
81
|
|
|
@@ -421,14 +425,17 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
421
425
|
|
|
422
426
|
def remove_named_results(self, name: str) -> None:
|
|
423
427
|
"""@private"""
|
|
424
|
-
#
|
|
425
|
-
# TODO: does not get rid of results on disk
|
|
426
|
-
#
|
|
427
428
|
if name in self.named_results:
|
|
428
429
|
del self.named_results[name]
|
|
429
430
|
self._variables = None
|
|
430
431
|
else:
|
|
431
432
|
self.csvpaths.logger.warning(f"Results '{name}' not found")
|
|
433
|
+
path = self.get_named_results_home(name)
|
|
434
|
+
if path is None:
|
|
435
|
+
return
|
|
436
|
+
nos = Nos(path)
|
|
437
|
+
if nos.dir_exists():
|
|
438
|
+
nos.remove()
|
|
432
439
|
|
|
433
440
|
#
|
|
434
441
|
# @deprecated. use remove_named_results
|
|
@@ -506,6 +513,8 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
506
513
|
#
|
|
507
514
|
# effectively, get last named results. use reference for anything more specific.
|
|
508
515
|
#
|
|
516
|
+
# this gets the results of a run. it does not get the runs under the name.
|
|
517
|
+
#
|
|
509
518
|
def get_named_results(self, name) -> List[List[Any]]:
|
|
510
519
|
#
|
|
511
520
|
# as it turns out, references are (finally!) the easiest, so let's do that
|
|
@@ -520,6 +529,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
520
529
|
# agents. for each new run, unless there is a reason to not create a new
|
|
521
530
|
# CsvPaths instance, we would create a new one.
|
|
522
531
|
#
|
|
532
|
+
""" """
|
|
523
533
|
if name in self.named_results:
|
|
524
534
|
#
|
|
525
535
|
# exp. removed 4 May.
|
|
@@ -529,6 +539,7 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
529
539
|
#
|
|
530
540
|
rs = self.named_results[name]
|
|
531
541
|
return rs
|
|
542
|
+
""" """
|
|
532
543
|
#
|
|
533
544
|
# find and load the result, if exists. we find results home with the name. run_home is the
|
|
534
545
|
# last run dir. the results we're looking for are the instance dirs in the run dir.
|
|
@@ -621,15 +632,21 @@ class ResultsManager: # pylint: disable=C0115
|
|
|
621
632
|
msg = (
|
|
622
633
|
f"Results '{name}' does not exist. Has has that named-paths group been run?"
|
|
623
634
|
)
|
|
624
|
-
self.csvpaths.logger.
|
|
625
|
-
|
|
626
|
-
|
|
635
|
+
self.csvpaths.logger.warning(msg)
|
|
636
|
+
#
|
|
637
|
+
# it seems reasonable to request results that don't exist, if not ideal. a warn
|
|
638
|
+
# should be good enough, probably.
|
|
639
|
+
#
|
|
640
|
+
# if self.csvpaths.ecoms.do_i_raise():
|
|
641
|
+
# raise InputException(msg)
|
|
627
642
|
|
|
628
643
|
def get_named_results_home(self, name: str) -> str:
|
|
629
644
|
path = os.path.join(self.csvpaths.config.archive_path, name)
|
|
630
645
|
return path
|
|
631
646
|
|
|
632
647
|
def get_named_results_for_run(self, *, name: str, run: str) -> list[list[Any]]:
|
|
648
|
+
if run is None:
|
|
649
|
+
return None
|
|
633
650
|
path = os.path.join(self.csvpaths.config.archive_path, name)
|
|
634
651
|
path = os.path.join(path, run)
|
|
635
652
|
return self._get_named_results_for_run(name=name, run=run, path=path)
|
|
@@ -107,6 +107,7 @@ class ResultsRegistrar(Registrar, Listener):
|
|
|
107
107
|
m["status"] = mdata.status
|
|
108
108
|
m["run_home"] = mdata.run_home
|
|
109
109
|
m["named_results_name"] = mdata.named_results_name
|
|
110
|
+
|
|
110
111
|
#
|
|
111
112
|
m["named_paths_name"] = mdata.named_paths_name
|
|
112
113
|
m["named_paths_uuid"] = mdata.named_paths_uuid
|
|
@@ -230,13 +230,14 @@ class FunctionFactory:
|
|
|
230
230
|
fs["alter"] = Alter
|
|
231
231
|
fs["percent"] = Percent
|
|
232
232
|
#
|
|
233
|
-
#
|
|
233
|
+
# less than
|
|
234
234
|
#
|
|
235
235
|
fs["below"] = AboveBelow
|
|
236
236
|
fs["lt"] = AboveBelow
|
|
237
237
|
fs["before"] = AboveBelow
|
|
238
238
|
fs["lte"] = AboveBelow
|
|
239
239
|
fs["le"] = AboveBelow
|
|
240
|
+
# greater than
|
|
240
241
|
fs["above"] = AboveBelow
|
|
241
242
|
fs["gt"] = AboveBelow
|
|
242
243
|
fs["after"] = AboveBelow
|
|
@@ -17,13 +17,16 @@ class Last(MatchDecider):
|
|
|
17
17
|
"""\
|
|
18
18
|
Evaluates True on the last line to be scanned.
|
|
19
19
|
|
|
20
|
-
last() will always run, even if its line turns out to be
|
|
21
|
-
blank and would otherwise be skipped.
|
|
20
|
+
last() used by itself will always run, even if its line turns out to be
|
|
21
|
+
blank and would otherwise be skipped. When last() is composed within other
|
|
22
|
+
functions it loses that ability to run no matter what. For e.g.
|
|
23
|
+
last() -> print("will always run")
|
|
24
|
+
vs.
|
|
25
|
+
and(yes(), last()) -> print("runs if the last scanned line is not blank")
|
|
22
26
|
|
|
23
|
-
Optionally, last() can take a function that will be
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
only on the last line.
|
|
27
|
+
Optionally, last() can take a function that will be evaluated when last()
|
|
28
|
+
evaluates to True. This function, if provided, will not necessarily be the
|
|
29
|
+
last evaluation of the run, but will happen only on the last line.
|
|
27
30
|
"""
|
|
28
31
|
),
|
|
29
32
|
]
|
|
@@ -99,6 +99,8 @@ class AboveBelow(MatchDecider):
|
|
|
99
99
|
|
|
100
100
|
def _try_dates(self, a, b) -> bool:
|
|
101
101
|
if ExpressionUtility.all([a, b], [datetime]):
|
|
102
|
+
a = ExpressionUtility.to_datetime(a)
|
|
103
|
+
b = ExpressionUtility.to_datetime(b)
|
|
102
104
|
if self._above() and self.name != "gte":
|
|
103
105
|
return a.timestamp() > b.timestamp()
|
|
104
106
|
elif self._above():
|
|
@@ -107,6 +109,8 @@ class AboveBelow(MatchDecider):
|
|
|
107
109
|
a.timestamp() < b.timestamp()
|
|
108
110
|
return a.timestamp() <= b.timestamp()
|
|
109
111
|
if ExpressionUtility.all([a, b], [date]):
|
|
112
|
+
a = ExpressionUtility.to_date(a)
|
|
113
|
+
b = ExpressionUtility.to_date(b)
|
|
110
114
|
if self._above() and self.name != "gte":
|
|
111
115
|
return a > b
|
|
112
116
|
elif self._above():
|
|
@@ -30,33 +30,97 @@ class ExpressionUtility:
|
|
|
30
30
|
else:
|
|
31
31
|
return f"{i}th"
|
|
32
32
|
|
|
33
|
+
#
|
|
34
|
+
# this uses to_bool so it will translate "true" to True.
|
|
35
|
+
#
|
|
33
36
|
@classmethod
|
|
34
37
|
def all(cls, objects: List, classlist: tuple = None) -> bool:
|
|
35
|
-
|
|
38
|
+
#
|
|
39
|
+
# we don't match None isa None
|
|
40
|
+
#
|
|
41
|
+
if objects is None and classlist is None:
|
|
36
42
|
return False
|
|
37
|
-
if
|
|
43
|
+
if objects is None:
|
|
44
|
+
objects = [None]
|
|
45
|
+
if not isinstance(objects, list):
|
|
46
|
+
objects = [objects]
|
|
47
|
+
#
|
|
48
|
+
# if we don't pass a list of types or [], just None, we're
|
|
49
|
+
# True if all items in objects are non-None.
|
|
50
|
+
#
|
|
51
|
+
if classlist is None:
|
|
52
|
+
for o in objects:
|
|
53
|
+
if o is None:
|
|
54
|
+
return False
|
|
38
55
|
return True
|
|
39
|
-
|
|
56
|
+
for o in objects:
|
|
57
|
+
if not cls.isa(o, classlist):
|
|
58
|
+
return False
|
|
59
|
+
return True
|
|
60
|
+
|
|
61
|
+
@classmethod
|
|
62
|
+
def safe_isinstance(cls, obj, classes: type[type]) -> bool:
|
|
63
|
+
try:
|
|
64
|
+
if isinstance(obj, classes):
|
|
65
|
+
return True
|
|
66
|
+
except Exception:
|
|
67
|
+
...
|
|
68
|
+
return False
|
|
69
|
+
|
|
70
|
+
#
|
|
71
|
+
# this uses to_bool so it will translate "true" to True.
|
|
72
|
+
#
|
|
73
|
+
@classmethod
|
|
74
|
+
def isa(cls, obj: List, classes: tuple = None) -> bool:
|
|
75
|
+
if obj is None and classes is None:
|
|
40
76
|
return True
|
|
77
|
+
if classes is None:
|
|
78
|
+
classes = []
|
|
41
79
|
#
|
|
42
|
-
#
|
|
80
|
+
# make sure we have a tuple of types
|
|
43
81
|
#
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
82
|
+
lst = []
|
|
83
|
+
for t in classes:
|
|
84
|
+
if t is None:
|
|
85
|
+
if obj is None:
|
|
86
|
+
return True
|
|
87
|
+
elif cls.safe_isinstance(t, type):
|
|
88
|
+
lst.append(t)
|
|
89
|
+
else:
|
|
90
|
+
lst.append(type(t))
|
|
91
|
+
classes = lst
|
|
92
|
+
#
|
|
93
|
+
# isinstance
|
|
94
|
+
#
|
|
95
|
+
if cls.safe_isinstance(obj, classes):
|
|
96
|
+
return True
|
|
50
97
|
#
|
|
51
|
-
#
|
|
98
|
+
# cross-class cast
|
|
52
99
|
#
|
|
53
|
-
|
|
54
|
-
if i == 0:
|
|
55
|
-
continue
|
|
56
|
-
if isinstance(o, type(objects[i - 1])):
|
|
57
|
-
continue
|
|
100
|
+
if f"{obj}".strip() == "":
|
|
58
101
|
return False
|
|
59
|
-
|
|
102
|
+
for t in classes:
|
|
103
|
+
if t == int:
|
|
104
|
+
o = cls.to_int(obj)
|
|
105
|
+
if cls.safe_isinstance(o, int):
|
|
106
|
+
return True
|
|
107
|
+
if t == float:
|
|
108
|
+
o = cls.to_float(obj)
|
|
109
|
+
if cls.safe_isinstance(o, float):
|
|
110
|
+
return True
|
|
111
|
+
if t == datetime:
|
|
112
|
+
o = cls.to_datetime(obj)
|
|
113
|
+
if cls.safe_isinstance(o, datetime):
|
|
114
|
+
return True
|
|
115
|
+
elif t == datetime.date:
|
|
116
|
+
o = cls.to_date(obj)
|
|
117
|
+
if cls.safe_isinstance(o, datetime.date):
|
|
118
|
+
return True
|
|
119
|
+
elif t == bool:
|
|
120
|
+
o = cls.to_bool(obj)
|
|
121
|
+
if cls.safe_isinstance(o, bool):
|
|
122
|
+
return True
|
|
123
|
+
return False
|
|
60
124
|
|
|
61
125
|
@classmethod
|
|
62
126
|
def is_number(cls, v: Any) -> bool:
|
|
@@ -106,7 +106,6 @@ class Config:
|
|
|
106
106
|
if path == "":
|
|
107
107
|
path = None
|
|
108
108
|
if path is None:
|
|
109
|
-
print(f"configpath 3: {self._configpath}, path: {path}")
|
|
110
109
|
path = Config.CONFIG
|
|
111
110
|
self._configpath = path
|
|
112
111
|
self._load_config()
|
|
@@ -429,14 +428,16 @@ shell = /bin/bash
|
|
|
429
428
|
|
|
430
429
|
@property
|
|
431
430
|
def csvpaths_sep(self) -> None:
|
|
432
|
-
if
|
|
431
|
+
if (
|
|
432
|
+
self._assure_inputs_csvpaths_path is None
|
|
433
|
+
or self._assure_inputs_csvpaths_path.strip() == ""
|
|
434
|
+
):
|
|
433
435
|
return os.sep
|
|
434
436
|
a = self._assure_inputs_csvpaths_path.strip().lower()
|
|
435
437
|
if a.find("://") > -1:
|
|
436
438
|
return "/"
|
|
437
439
|
return os.sep
|
|
438
440
|
|
|
439
|
-
|
|
440
441
|
def _assure_transfer_root(self) -> None:
|
|
441
442
|
if self.load:
|
|
442
443
|
if self.transfer_root is None or self.transfer_root.strip() == "":
|
|
@@ -675,7 +676,7 @@ shell = /bin/bash
|
|
|
675
676
|
def archive_name(self) -> str:
|
|
676
677
|
p = self.archive_path
|
|
677
678
|
if p.find(self.archive_sep) > -1:
|
|
678
|
-
|
|
679
|
+
# if p.find(os.sep) > -1:
|
|
679
680
|
p = p[p.rfind(os.sep) + 1 :]
|
|
680
681
|
return p
|
|
681
682
|
|
|
@@ -203,6 +203,12 @@ class FileDo:
|
|
|
203
203
|
) -> list[str]:
|
|
204
204
|
if files_only is True and dirs_only is True:
|
|
205
205
|
raise ValueError("Cannot list with neither files nor dirs")
|
|
206
|
+
if not self.dir_exists():
|
|
207
|
+
#
|
|
208
|
+
# this seems odd. an error or None seems better for a missing dir.
|
|
209
|
+
# however, this is the way it has always been so better to continue.
|
|
210
|
+
#
|
|
211
|
+
return []
|
|
206
212
|
if recurse is True:
|
|
207
213
|
lst = []
|
|
208
214
|
for root, dirs, files in os.walk(self.path):
|