csvpath 0.0.579__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.579 → csvpath-0.0.581}/PKG-INFO +3 -1
- csvpath-0.0.581/assets/config/extra-functions.imports +2 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-local-s3.ini +3 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/config/config.ini +4 -6
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/const.py +2 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/function_describer.py +100 -28
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/csvpath.py +74 -9
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/csvpaths.py +5 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/errors/error_manager.py +3 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/files/file_manager.py +10 -7
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/files/file_metadata.py +7 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/files/file_registrar.py +1 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/files/files_listener.py +1 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/paths/paths_manager.py +28 -10
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/paths/paths_registrar.py +4 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/result.py +1 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/all.py +0 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/andf.py +1 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/any.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/between.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/empty.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/exists.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/inf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/no.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/notf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/orf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/boolean/yes.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/count.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_bytes.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_headers.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_lines.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/count_scans.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/has_matches.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/increment.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/tally.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/dates/now.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/dates/part.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/dates/roll.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/function.py +12 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/function_factory.py +46 -9
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/function_finder.py +2 -11
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/append.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/collect.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/empty_stack.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/end.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/headers.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/headers_stack.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/insert.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/line_before.py +0 -1
- csvpath-0.0.581/csvpath/matching/functions/headers/remove.py +71 -0
- csvpath-0.0.581/csvpath/matching/functions/json/jsonpath.py +54 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/advance.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/after_blank.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/dups.py +0 -4
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/first.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/first_line.py +0 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/last.py +8 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/lines/stop.py +0 -4
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/above.py +0 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/add.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/divide.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/equals.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/intf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/mod.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/multiply.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/odd.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/round.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/subtotal.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/misc/fingerprint.py +0 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/misc/importf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/misc/random.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/print/jinjaf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/print/print_line.py +4 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/print/print_queue.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/print/table.py +0 -4
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/stats/minf.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/stats/nminmax.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/stats/percent.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/stats/percent_unique.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/stats/stdev.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/alter.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/caps.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/concat.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/contains.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/format.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/length.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/lower.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/metaphone.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/starts_with.py +0 -2
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/testing/debug.py +0 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/__init__.py +3 -1
- csvpath-0.0.581/csvpath/matching/functions/types/blank.py +113 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/boolean.py +30 -20
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/datatype.py +1 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/datef.py +12 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/decimal.py +7 -4
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/email.py +2 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/nonef.py +23 -37
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/string.py +2 -0
- csvpath-0.0.581/csvpath/matching/functions/types/type.py +32 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/types/url.py +2 -1
- csvpath-0.0.581/csvpath/matching/functions/types/wildcard.py +59 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/validity/line.py +36 -9
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/clear.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/get.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/index_of.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/pushpop.py +0 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/put.py +2 -3
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/track.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/variables/variables.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/xml/xpath.py +0 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/matcher.py +10 -5
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/qualified.py +26 -4
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/class_loader.py +1 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/config.py +2 -1
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/line_spooler.py +85 -42
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/log_utility.py +19 -10
- {csvpath-0.0.579 → csvpath-0.0.581}/pyproject.toml +3 -1
- csvpath-0.0.579/csvpath/matching/functions/types/type.py +0 -10
- {csvpath-0.0.579 → csvpath-0.0.581}/LICENSE +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/README.md +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/config.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/function.imports +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/config/env.json +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/results_manager.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/box.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/code.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/nos.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_nos.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.579 → csvpath-0.0.581}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.579 → 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
|
|
@@ -29,6 +29,7 @@ Requires-Dist: google-cloud-storage (>=3.1.0,<4.0.0)
|
|
|
29
29
|
Requires-Dist: inflect (>=7.4.0,<8.0.0)
|
|
30
30
|
Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
|
|
31
31
|
Requires-Dist: jsonlines (>=4.0.0,<5.0.0)
|
|
32
|
+
Requires-Dist: jsonpath-ng (>=1.7.0,<2.0.0)
|
|
32
33
|
Requires-Dist: lark (>=1.2.2,<2.0.0)
|
|
33
34
|
Requires-Dist: lxml (>=6.0.2,<7.0.0)
|
|
34
35
|
Requires-Dist: marquez-python (>=0.50.0,<0.51.0)
|
|
@@ -41,6 +42,7 @@ Requires-Dist: paramiko (>=3.5.0,<4.0.0)
|
|
|
41
42
|
Requires-Dist: pdoc (>=15.0.1,<16.0.0)
|
|
42
43
|
Requires-Dist: prompt-toolkit (>=3.0.50,<4.0.0)
|
|
43
44
|
Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
|
|
45
|
+
Requires-Dist: pyjson5 (>=2.0.0,<3.0.0)
|
|
44
46
|
Requires-Dist: pylightxl (>=1.61,<2.0)
|
|
45
47
|
Requires-Dist: pytest (>=8.3.3,<9.0.0)
|
|
46
48
|
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
@@ -31,7 +31,7 @@ path = cache
|
|
|
31
31
|
use_cache = no
|
|
32
32
|
|
|
33
33
|
[functions]
|
|
34
|
-
imports =
|
|
34
|
+
imports =
|
|
35
35
|
|
|
36
36
|
[results]
|
|
37
37
|
archive = tmp/s3/archive
|
|
@@ -90,7 +90,7 @@ port = SFTPPLUS_PORT
|
|
|
90
90
|
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
91
91
|
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
92
92
|
api_url = https://. . . :10020/json
|
|
93
|
-
scripts_dir =
|
|
93
|
+
scripts_dir =
|
|
94
94
|
execute_timeout = 300
|
|
95
95
|
|
|
96
96
|
[ckan]
|
|
@@ -105,5 +105,5 @@ timeout = 5
|
|
|
105
105
|
verify = False
|
|
106
106
|
|
|
107
107
|
[slack]
|
|
108
|
-
webhook_url =
|
|
108
|
+
webhook_url =
|
|
109
109
|
|
|
@@ -4,9 +4,8 @@ gcs.skip = yes
|
|
|
4
4
|
s3.skip = yes
|
|
5
5
|
sftp.skip = yes
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
[extensions]
|
|
9
|
-
csvpath_files
|
|
8
|
+
csvpath_files = txt, csvpath, csvpaths
|
|
10
9
|
csv_files = csv, tsv, dat, tab, psv, ssv
|
|
11
10
|
|
|
12
11
|
[errors]
|
|
@@ -33,7 +32,7 @@ path = cache
|
|
|
33
32
|
use_cache = yes
|
|
34
33
|
|
|
35
34
|
[functions]
|
|
36
|
-
imports =
|
|
35
|
+
imports =
|
|
37
36
|
|
|
38
37
|
[results]
|
|
39
38
|
archive = tmp/local/archive
|
|
@@ -103,7 +102,7 @@ port = SFTPPLUS_PORT
|
|
|
103
102
|
admin_username = SFTPPLUS_ADMIN_USERNAME
|
|
104
103
|
admin_password = SFTPPLUS_ADMIN_PASSWORD
|
|
105
104
|
api_url = https://. . . :10020/json
|
|
106
|
-
scripts_dir =
|
|
105
|
+
scripts_dir =
|
|
107
106
|
execute_timeout = 300
|
|
108
107
|
|
|
109
108
|
[ckan]
|
|
@@ -118,10 +117,9 @@ timeout = 5
|
|
|
118
117
|
verify = False
|
|
119
118
|
|
|
120
119
|
[slack]
|
|
121
|
-
webhook_url =
|
|
120
|
+
webhook_url =
|
|
122
121
|
|
|
123
122
|
[scripts]
|
|
124
123
|
run_scripts = yes
|
|
125
124
|
shell = /bin/bash
|
|
126
125
|
|
|
127
|
-
|
|
@@ -8,8 +8,18 @@ from .const import Const
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class FunctionDescriber:
|
|
11
|
+
|
|
12
|
+
CONST = Const
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def const(cls):
|
|
16
|
+
return FunctionDescriber.CONST
|
|
17
|
+
|
|
11
18
|
@classmethod
|
|
12
|
-
def describe(
|
|
19
|
+
def describe(
|
|
20
|
+
cls, function: Function, *, markdown=False, const=None, links: dict = None
|
|
21
|
+
) -> None:
|
|
22
|
+
print("")
|
|
13
23
|
if not function.args:
|
|
14
24
|
#
|
|
15
25
|
# today this will most of the time blow up because we're
|
|
@@ -21,16 +31,25 @@ class FunctionDescriber:
|
|
|
21
31
|
function.check_valid()
|
|
22
32
|
except Exception:
|
|
23
33
|
...
|
|
34
|
+
if markdown is True:
|
|
35
|
+
print(f"## {function.name}()\n")
|
|
36
|
+
else:
|
|
37
|
+
print(f"{cls.const().BOLD}{function.name}(){cls.const().REVERT}\n")
|
|
24
38
|
if function.description and len(function.description) > 0:
|
|
25
39
|
for i, _ in enumerate(function.description):
|
|
26
40
|
print(_)
|
|
27
|
-
print()
|
|
28
|
-
cls.print_tables(function)
|
|
41
|
+
print("")
|
|
42
|
+
cls.print_tables(function, markdown=markdown, links=links)
|
|
43
|
+
print("")
|
|
44
|
+
print(
|
|
45
|
+
"[[Back to index](https://github.com/csvpath/csvpath/blob/main/docs/func_gen/index.md)]"
|
|
46
|
+
)
|
|
29
47
|
|
|
30
48
|
@classmethod
|
|
31
|
-
def sigs(cls, function):
|
|
49
|
+
def sigs(cls, function, *, markdown=False, links: dict = None):
|
|
32
50
|
sigs = []
|
|
33
51
|
args = function.args
|
|
52
|
+
PIPE = " ǁ " if markdown else "|"
|
|
34
53
|
if not args:
|
|
35
54
|
#
|
|
36
55
|
# this is possibly due to the very small number of unrefactored functions. (3?)
|
|
@@ -45,11 +64,17 @@ class FunctionDescriber:
|
|
|
45
64
|
t += f"{_.name}: "
|
|
46
65
|
for j, act in enumerate(_.actuals):
|
|
47
66
|
an = cls._actual_name(act)
|
|
67
|
+
#
|
|
68
|
+
# add link if exact match and we have links
|
|
69
|
+
#
|
|
70
|
+
if markdown and links and an in links:
|
|
71
|
+
an = f"$${{\\color{{green}}{an}}}$$"
|
|
72
|
+
|
|
48
73
|
if an == "":
|
|
49
74
|
an = "''"
|
|
50
|
-
t += f"{
|
|
75
|
+
t += f"{cls.const().SIDEBAR_COLOR}{cls.const().ITALIC}{an}{cls.const().REVERT}"
|
|
51
76
|
if j < len(_.actuals) - 1:
|
|
52
|
-
t +=
|
|
77
|
+
t += PIPE
|
|
53
78
|
if _.is_noneable:
|
|
54
79
|
pa += f"[{t}]"
|
|
55
80
|
else:
|
|
@@ -65,9 +90,12 @@ class FunctionDescriber:
|
|
|
65
90
|
return sigs
|
|
66
91
|
|
|
67
92
|
@classmethod
|
|
68
|
-
def funcs(cls, function):
|
|
93
|
+
def funcs(cls, function, *, markdown=False, links=None):
|
|
69
94
|
sigs = []
|
|
70
95
|
args = function.args
|
|
96
|
+
PIPE = " ǁ " if markdown else "|"
|
|
97
|
+
if not args or not args.argsets or len(args.argsets) == 0:
|
|
98
|
+
return sigs
|
|
71
99
|
argsets = args.argsets
|
|
72
100
|
for ai, a in enumerate(argsets):
|
|
73
101
|
pa = ""
|
|
@@ -79,9 +107,12 @@ class FunctionDescriber:
|
|
|
79
107
|
an = cls._actual_name(act)
|
|
80
108
|
if an == "":
|
|
81
109
|
an = "''"
|
|
82
|
-
|
|
110
|
+
if markdown and links and an in links:
|
|
111
|
+
an = f"[{an}]({links[an]})"
|
|
112
|
+
|
|
113
|
+
t += f"{cls.const().SIDEBAR_COLOR}{cls.const().ITALIC}{an}{cls.const().REVERT}"
|
|
83
114
|
if j < len(_.types) - 1:
|
|
84
|
-
t +=
|
|
115
|
+
t += PIPE
|
|
85
116
|
if _.is_noneable:
|
|
86
117
|
pa += f"[{t}]"
|
|
87
118
|
else:
|
|
@@ -97,7 +128,7 @@ class FunctionDescriber:
|
|
|
97
128
|
return sigs
|
|
98
129
|
|
|
99
130
|
@classmethod
|
|
100
|
-
def focus_stmt(cls, function):
|
|
131
|
+
def focus_stmt(cls, function, *, markdown=False, links=None):
|
|
101
132
|
stmts = []
|
|
102
133
|
vp = isinstance(function, ValueProducer)
|
|
103
134
|
md = isinstance(function, MatchDecider)
|
|
@@ -114,7 +145,7 @@ class FunctionDescriber:
|
|
|
114
145
|
return stmts
|
|
115
146
|
|
|
116
147
|
@classmethod
|
|
117
|
-
def type_stmt(cls, function):
|
|
148
|
+
def type_stmt(cls, function, *, markdown=False, links: dict = None):
|
|
118
149
|
stmts = []
|
|
119
150
|
if isinstance(function, Type):
|
|
120
151
|
t = f"{function.name[0].upper()}{function.name[1:]}"
|
|
@@ -122,77 +153,118 @@ class FunctionDescriber:
|
|
|
122
153
|
return stmts
|
|
123
154
|
|
|
124
155
|
@classmethod
|
|
125
|
-
def aliases_stmt(cls, function):
|
|
156
|
+
def aliases_stmt(cls, function, *, markdown=False, links=None):
|
|
126
157
|
stmts = []
|
|
127
158
|
if len(function.aliases) > 0:
|
|
128
159
|
stmts.append(", ".join(function.aliases))
|
|
129
160
|
return stmts
|
|
130
161
|
|
|
131
162
|
@classmethod
|
|
132
|
-
def print_tables(cls, function):
|
|
163
|
+
def print_tables(cls, function, *, markdown=False, links: dict = None):
|
|
133
164
|
#
|
|
134
165
|
# data sigs
|
|
135
166
|
#
|
|
136
167
|
headers = ["Data signatures"]
|
|
137
168
|
rows = []
|
|
138
|
-
sigs = cls.sigs(function)
|
|
169
|
+
sigs = cls.sigs(function, markdown=markdown, links=links)
|
|
139
170
|
for v in sigs:
|
|
140
171
|
v = str(v)
|
|
141
172
|
rows.append([v])
|
|
142
173
|
if len(rows) > 0:
|
|
143
|
-
print(
|
|
174
|
+
print(
|
|
175
|
+
tabulate(
|
|
176
|
+
rows,
|
|
177
|
+
headers=headers,
|
|
178
|
+
tablefmt="pipe" if markdown else "simple_grid",
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
print("")
|
|
144
182
|
#
|
|
145
183
|
# call sigs
|
|
146
184
|
#
|
|
147
185
|
headers = ["Call signatures"]
|
|
148
186
|
rows = []
|
|
149
|
-
sigs = cls.funcs(function)
|
|
187
|
+
sigs = cls.funcs(function, markdown=markdown, links=links)
|
|
150
188
|
for v in sigs:
|
|
151
189
|
v = str(v)
|
|
152
190
|
rows.append([v])
|
|
153
191
|
if len(rows) > 0:
|
|
154
|
-
print(
|
|
192
|
+
print(
|
|
193
|
+
tabulate(
|
|
194
|
+
rows,
|
|
195
|
+
headers=headers,
|
|
196
|
+
tablefmt="pipe" if markdown else "simple_grid",
|
|
197
|
+
)
|
|
198
|
+
)
|
|
199
|
+
print("")
|
|
155
200
|
#
|
|
156
201
|
# type and focus
|
|
157
202
|
#
|
|
158
203
|
rows = []
|
|
159
|
-
headers = []
|
|
160
|
-
stmts = cls.focus_stmt(function)
|
|
204
|
+
headers = ["Purpose", "Value"]
|
|
205
|
+
stmts = cls.focus_stmt(function, links=links)
|
|
161
206
|
for v in stmts:
|
|
162
207
|
v = str(v)
|
|
163
|
-
rows.append(["
|
|
164
|
-
stmts = cls.type_stmt(function)
|
|
208
|
+
rows.append(["Main focus", v])
|
|
209
|
+
stmts = cls.type_stmt(function, links=links)
|
|
165
210
|
for v in stmts:
|
|
166
211
|
v = str(v)
|
|
167
212
|
rows.append(["Type", v])
|
|
168
|
-
stmts = cls.aliases_stmt(function)
|
|
213
|
+
stmts = cls.aliases_stmt(function, links=links)
|
|
169
214
|
for v in stmts:
|
|
170
215
|
v = str(v)
|
|
171
216
|
rows.append(["Aliases", v])
|
|
172
217
|
if len(rows) > 0:
|
|
173
|
-
print(
|
|
218
|
+
print(
|
|
219
|
+
tabulate(
|
|
220
|
+
rows,
|
|
221
|
+
headers=headers,
|
|
222
|
+
tablefmt="pipe" if markdown else "simple_grid",
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
print("")
|
|
174
226
|
#
|
|
175
227
|
# qualifiers
|
|
176
228
|
#
|
|
177
229
|
rows = []
|
|
178
|
-
headers = []
|
|
230
|
+
headers = ["Context", "Qualifier"]
|
|
179
231
|
stmts = function.match_qualifiers
|
|
180
|
-
stmts = [
|
|
232
|
+
stmts = [
|
|
233
|
+
f"{cls.const().SIDEBAR_COLOR}{cls.const().ITALIC}{s}{cls.const().REVERT}"
|
|
234
|
+
for s in stmts
|
|
235
|
+
]
|
|
181
236
|
if len(stmts) > 0:
|
|
237
|
+
for i, s in enumerate(stmts):
|
|
238
|
+
if markdown and links and s in links:
|
|
239
|
+
stmts[i] = f"[{s}]({links[s]})"
|
|
240
|
+
|
|
182
241
|
rows.append(["Match qualifiers", ", ".join(stmts)])
|
|
183
242
|
stmts = function.value_qualifiers
|
|
184
|
-
stmts = [
|
|
243
|
+
stmts = [
|
|
244
|
+
f"{cls.const().SIDEBAR_COLOR}{cls.const().ITALIC}{s}{cls.const().REVERT}"
|
|
245
|
+
for s in stmts
|
|
246
|
+
]
|
|
185
247
|
if len(stmts) > 0:
|
|
248
|
+
for i, s in enumerate(stmts):
|
|
249
|
+
if markdown and links and s in links:
|
|
250
|
+
stmts[i] = f"[{s}]({links[s]})"
|
|
186
251
|
rows.append(["Value qualifiers", ", ".join(stmts)])
|
|
187
252
|
if function.name_qualifier:
|
|
188
253
|
rows.append(
|
|
189
254
|
[
|
|
190
255
|
"Name qualifier",
|
|
191
|
-
f"{
|
|
256
|
+
f"{cls.const().SIDEBAR_COLOR}{cls.const().ITALIC}optionally expected{cls.const().REVERT}",
|
|
192
257
|
]
|
|
193
258
|
)
|
|
194
259
|
if len(rows) > 0:
|
|
195
|
-
print(
|
|
260
|
+
print(
|
|
261
|
+
tabulate(
|
|
262
|
+
rows,
|
|
263
|
+
headers=headers,
|
|
264
|
+
tablefmt="pipe" if markdown else "simple_grid",
|
|
265
|
+
)
|
|
266
|
+
)
|
|
267
|
+
print("")
|
|
196
268
|
|
|
197
269
|
@classmethod
|
|
198
270
|
def _actual_name(cls, a) -> str:
|
|
@@ -54,11 +54,14 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
54
54
|
print_default=True,
|
|
55
55
|
# config=None,
|
|
56
56
|
error_manager=None,
|
|
57
|
+
project_context="no_project_context",
|
|
58
|
+
project="no_project_name",
|
|
57
59
|
):
|
|
58
|
-
# re: R0913: all reasonable pass-ins with sensible defaults
|
|
59
60
|
#
|
|
60
|
-
# the
|
|
61
|
+
# these identifiers are for the logging system. they are optional but useful
|
|
61
62
|
#
|
|
63
|
+
self.project = project
|
|
64
|
+
self.project_context = project_context
|
|
62
65
|
"""
|
|
63
66
|
#
|
|
64
67
|
# passing in the config actually nets us nothing but a little unnecessary complexity that we don't use.
|
|
@@ -205,7 +208,7 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
205
208
|
# line, a.k.a columns) then are available. limiting headers returned
|
|
206
209
|
# can impact named results, reset_headers(), and other considerations.
|
|
207
210
|
#
|
|
208
|
-
self._limit_collection_to = []
|
|
211
|
+
self._limit_collection_to = None # []
|
|
209
212
|
#
|
|
210
213
|
# error collecting is at the CsvPath instance by default. CsvPath
|
|
211
214
|
# instances that are managed by a CsvPaths have their errors collected
|
|
@@ -705,6 +708,42 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
705
708
|
# - files-mode: all | no-data | no-unmatched | no-printouts | data | unmatched | errors | meta | vars | printouts
|
|
706
709
|
#
|
|
707
710
|
self.modes.update()
|
|
711
|
+
#
|
|
712
|
+
# if we find "use-delimiter" or "use-quotechar" we need to update ourselves. this is primarily for
|
|
713
|
+
# flightpath server (and other similar non-programmatic uses). these could be modes but it doesn't
|
|
714
|
+
# feel like we're changing the behavior of the framework so much as just passing a parameter
|
|
715
|
+
# declaratively, similar to the integrations and "test-delimiter", "test-quotechar".
|
|
716
|
+
#
|
|
717
|
+
d = self.metadata.get("use-delimiter")
|
|
718
|
+
if d:
|
|
719
|
+
v = ["pipe", "bar", "semi", "comma", "colon", "tab", "space"]
|
|
720
|
+
if d not in v:
|
|
721
|
+
raise ValueError(f"The use-delimiter directive must be one of {v}")
|
|
722
|
+
v = {
|
|
723
|
+
"pipe": "|",
|
|
724
|
+
"bar": "|",
|
|
725
|
+
"semi": ";",
|
|
726
|
+
"comma": ",",
|
|
727
|
+
"colon": ":",
|
|
728
|
+
"tab": "\t",
|
|
729
|
+
"space": " ",
|
|
730
|
+
}
|
|
731
|
+
self.delimiter = v[d]
|
|
732
|
+
|
|
733
|
+
q = self.metadata.get("use-quotechar")
|
|
734
|
+
if q:
|
|
735
|
+
v = ["quotes", "quote", "single-quote", "singlequote", "single", "tick"]
|
|
736
|
+
if q not in v:
|
|
737
|
+
raise ValueError(f"The use-quotechar directive must be one of {v}")
|
|
738
|
+
v = {
|
|
739
|
+
"quotes": '"',
|
|
740
|
+
"quote": '"',
|
|
741
|
+
"single-quote": "'",
|
|
742
|
+
"singlequote": "'",
|
|
743
|
+
"single": "'",
|
|
744
|
+
"tick": "`",
|
|
745
|
+
}
|
|
746
|
+
self.quotechar = v[q]
|
|
708
747
|
|
|
709
748
|
# =====================
|
|
710
749
|
# in principle the modes should come through the mode controller like:
|
|
@@ -1001,8 +1040,8 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
1001
1040
|
def limit_collection_to(self, indexes: List[int]) -> None:
|
|
1002
1041
|
"""@private"""
|
|
1003
1042
|
self._limit_collection_to = indexes
|
|
1004
|
-
if self._limit_collection_to and self._limit_collection_to != indexes:
|
|
1005
|
-
|
|
1043
|
+
# if self._limit_collection_to and self._limit_collection_to != indexes:
|
|
1044
|
+
self.logger.info("Limiting headers collected: %s", indexes)
|
|
1006
1045
|
|
|
1007
1046
|
def stop(self) -> None:
|
|
1008
1047
|
"""@private"""
|
|
@@ -1101,16 +1140,34 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
1101
1140
|
if self.will_run is True:
|
|
1102
1141
|
for line in self._next_line():
|
|
1103
1142
|
b = self._consider_line(line)
|
|
1143
|
+
#
|
|
1144
|
+
# exp. not workable. matcher doesn't hold the last match
|
|
1145
|
+
# value. we cannot look at the expressions because a) encapsulation and
|
|
1146
|
+
# b) too darn complex. so we cannot double check that b is actually the
|
|
1147
|
+
# result and not just the instruction to not return line.
|
|
1148
|
+
#
|
|
1149
|
+
# self.matcher.
|
|
1150
|
+
#
|
|
1151
|
+
#
|
|
1152
|
+
#
|
|
1104
1153
|
if b:
|
|
1105
1154
|
line = self.limit_collection(line)
|
|
1106
1155
|
if line is None:
|
|
1107
1156
|
msg = "Line cannot be None"
|
|
1108
1157
|
self.logger.error(msg)
|
|
1109
1158
|
raise MatchException(msg)
|
|
1159
|
+
#
|
|
1160
|
+
# with remove() now added we're allowing [] lines. why you might want one?
|
|
1161
|
+
# maybe you're removing all the data in order to put a blank line? maybe
|
|
1162
|
+
# collecting unexpected headers only? (imagine removing known headers and
|
|
1163
|
+
# skipping if no header mismatch, maybe?)
|
|
1164
|
+
#
|
|
1165
|
+
"""
|
|
1110
1166
|
if len(line) == 0:
|
|
1111
1167
|
msg = "Line cannot be len() == 0"
|
|
1112
1168
|
self.logger.error(msg)
|
|
1113
1169
|
raise MatchException(msg)
|
|
1170
|
+
"""
|
|
1114
1171
|
yield line
|
|
1115
1172
|
elif self.collecting and self.unmatched_available:
|
|
1116
1173
|
if self.unmatched is None:
|
|
@@ -1295,19 +1352,27 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
|
|
|
1295
1352
|
that the csvpath says to collect. headers for collection are indicated using
|
|
1296
1353
|
the collect() function.
|
|
1297
1354
|
"""
|
|
1298
|
-
if len(self.limit_collection_to) == 0:
|
|
1355
|
+
if self.limit_collection_to is None: # len(self.limit_collection_to) == 0:
|
|
1299
1356
|
return line
|
|
1300
1357
|
ls = []
|
|
1301
1358
|
for k in self.limit_collection_to:
|
|
1302
|
-
if k is None
|
|
1359
|
+
if k is None:
|
|
1303
1360
|
#
|
|
1304
1361
|
# FP change. didn't do do_i_raise and didn't handle w/error mgr
|
|
1305
1362
|
#
|
|
1306
|
-
msg = f"[{self.identity}] Line {self.line_monitor.physical_line_number}:
|
|
1363
|
+
msg = f"[{self.identity}] Line {self.line_monitor.physical_line_number}: header index: {k} >= {len(line)}. Attempting to limit line values {line} to: {self.limit_collection_to} in headers {self.headers}"
|
|
1307
1364
|
self.error_manager.handle_error(source=self, msg=msg)
|
|
1308
1365
|
if self.ecoms.do_i_raise():
|
|
1309
1366
|
raise InputException(msg)
|
|
1310
|
-
|
|
1367
|
+
#
|
|
1368
|
+
# should we crash out here? what would cause k to be None? would we ever be
|
|
1369
|
+
# in a recoverable state that would make it better to continue iterating?
|
|
1370
|
+
#
|
|
1371
|
+
break
|
|
1372
|
+
elif k >= len(line):
|
|
1373
|
+
ls.append("")
|
|
1374
|
+
else:
|
|
1375
|
+
ls.append(line[k])
|
|
1311
1376
|
return ls
|
|
1312
1377
|
|
|
1313
1378
|
def advance(self, ff: int = -1) -> None:
|
|
@@ -107,8 +107,8 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
107
107
|
quotechar='"',
|
|
108
108
|
skip_blank_lines=True,
|
|
109
109
|
print_default=True,
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
project_context=None,
|
|
111
|
+
project=None
|
|
112
112
|
# config: Config = None,
|
|
113
113
|
):
|
|
114
114
|
if CsvPaths.METRICS_WRAP_REG is False:
|
|
@@ -126,7 +126,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
|
|
|
126
126
|
#
|
|
127
127
|
# the expectation is that FlightPath Server will use API key as project context.
|
|
128
128
|
#
|
|
129
|
-
self._project =
|
|
129
|
+
self._project = project if project else "project"
|
|
130
130
|
self._project_context = project_context if project_context else "csvpaths"
|
|
131
131
|
#
|
|
132
132
|
# in a few cases, mainly s3 and sftp connection or config sharing
|
|
@@ -416,6 +416,8 @@ Cache: {cache}
|
|
|
416
416
|
# config=None,
|
|
417
417
|
print_default=self.print_default,
|
|
418
418
|
error_manager=self.error_manager,
|
|
419
|
+
project=self.project,
|
|
420
|
+
project_context=self.project_context,
|
|
419
421
|
)
|
|
420
422
|
if path.config.configpath != self.config.configpath:
|
|
421
423
|
path.config.set_config_path_and_reload(self.config.configpath)
|
|
@@ -123,9 +123,9 @@ class ErrorManager(Registrar, Listener):
|
|
|
123
123
|
instance = ""
|
|
124
124
|
chain = ""
|
|
125
125
|
line = (
|
|
126
|
-
|
|
127
|
-
if self.csvpath
|
|
128
|
-
else
|
|
126
|
+
-1
|
|
127
|
+
if (not self.csvpath or not self.csvpath.line_monitor)
|
|
128
|
+
else self.csvpath.line_monitor.physical_line_number
|
|
129
129
|
)
|
|
130
130
|
try:
|
|
131
131
|
if isinstance(source, Matchable):
|
|
@@ -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
|