csvpath 0.0.589__tar.gz → 0.0.591__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.589 → csvpath-0.0.591}/PKG-INFO +1 -1
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/function_factory.py +6 -2
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/function_finder.py +3 -2
- csvpath-0.0.591/csvpath/util/class_loader.py +123 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/pyproject.toml +1 -1
- csvpath-0.0.589/csvpath/util/class_loader.py +0 -218
- {csvpath-0.0.589 → csvpath-0.0.591}/LICENSE +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/README.md +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/config.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/extra-functions.imports +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/function.imports +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-local-azure.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-local-gcs.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-local-s3.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-local-sftp.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-windows-azure.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-windows-gcs.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-windows-local.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-windows-s3.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/config/jenkins-windows-sftp.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/azure.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/gcs.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/local.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/s3.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/mac/sftp.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/azure.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/gcs.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/local.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/s3.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/sftp.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sqlite/csvpath +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/assets/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/config/config.ini +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/config/env.json +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/asker.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/const.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/debug_config.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/function_describer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/function_lister.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/cli/selecter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/csvpath.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/csvpaths.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/errors/error.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/errors/error_collector.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/errors/error_comms.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/errors/error_manager.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/files/file_manager.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/files/file_registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/files/files_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/metrics.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/engine.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/tables.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sql/updates.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/paths/paths_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/paths/paths_manager.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/result_serializer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/results_manager.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/test_listener.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/args_helper.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/dates/part.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/dates/roll.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/headers_stack.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/insert.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/line_before.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/remove.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/rename.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/json/jsonpath.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/odd.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/stats/nminmax.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/alter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/caps.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/contains.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/format.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/blank.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/datatype.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/email.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/url.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/types/wildcard.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/clear.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/index_of.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/functions/xml/xpath.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/error_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/scanning/scanner2.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/scanning/scanner2_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/scanning/scanner2_transformer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_data_writer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_fingerprinter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_json_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_nos.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_utils.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/backend_check.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/box.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/caser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/code.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/config.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/config_env.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/date_util.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_data_writer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_nos.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_utils.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/hasher.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/http/http_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/intermediary.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/json/json_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/json/json_reader_helper.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/nos.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/path_util.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/py_file_utility.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/files_reference_finder_2.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/files_tools/range_finder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/ref_utils.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_exceptions.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_grammar.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_parser.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_results.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/reference_transformer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_reference_finder_2.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/data_finder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/date_filter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/identity_finder.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/path_filter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/token_filters.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/references/tools/date_completer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/run_home_maker.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_data_writer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_json_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_nos.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_config.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_data_writer.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_nos.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_walk.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/sqliter.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/template_util.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
- {csvpath-0.0.589 → csvpath-0.0.591}/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.591
|
|
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
|
|
@@ -151,7 +151,9 @@ class FunctionFactory:
|
|
|
151
151
|
raise InvalidNameException("Name must not be an empty string")
|
|
152
152
|
if not cls.valid_function_name(name): # name.isalpha():
|
|
153
153
|
raise InvalidNameException(f"Name {name} is not valid")
|
|
154
|
-
cls._debug_one(
|
|
154
|
+
cls._debug_one(
|
|
155
|
+
function.matcher, "Looking for an existing function named %s", name
|
|
156
|
+
)
|
|
155
157
|
if cls.get_function(None, name=name, find_external_functions=False) is not None:
|
|
156
158
|
function.matcher.csvpath.logger.warning(
|
|
157
159
|
"Internal function is overriden by external function: %s", name
|
|
@@ -161,7 +163,9 @@ class FunctionFactory:
|
|
|
161
163
|
raise InvalidChildException(
|
|
162
164
|
"Function being registered must be passed as an instance"
|
|
163
165
|
)
|
|
164
|
-
cls._debug_two(
|
|
166
|
+
cls._debug_two(
|
|
167
|
+
function.matcher, "Adding %s as key to %s", name, function.__class__
|
|
168
|
+
)
|
|
165
169
|
cls.NOT_MY_FUNCTION[name] = function.__class__
|
|
166
170
|
|
|
167
171
|
@classmethod
|
|
@@ -70,7 +70,6 @@ class FunctionFinder: # pylint: disable=R0903
|
|
|
70
70
|
return
|
|
71
71
|
matcher.csvpath.logger.debug(txt, str(obj), str(obj2))
|
|
72
72
|
|
|
73
|
-
|
|
74
73
|
@classmethod
|
|
75
74
|
def externals_sentinel(cls, matcher) -> str:
|
|
76
75
|
if matcher and matcher.csvpath:
|
|
@@ -111,7 +110,9 @@ class FunctionFinder: # pylint: disable=R0903
|
|
|
111
110
|
try:
|
|
112
111
|
instance = ClassLoader.load_private_function(config, s, matcher, cs[5])
|
|
113
112
|
qname = func_fact.qname(matcher=matcher, name=cs[5])
|
|
114
|
-
cls._debug_two(
|
|
113
|
+
cls._debug_two(
|
|
114
|
+
matcher, "Adding custom function %s: %s", qname, instance
|
|
115
|
+
)
|
|
115
116
|
func_fact.add_function(qname, instance)
|
|
116
117
|
except Exception:
|
|
117
118
|
if matcher is not None and matcher.csvpath is not None:
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import py_compile
|
|
3
|
+
import os
|
|
4
|
+
import traceback
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ClassLoadingError(RuntimeError):
|
|
9
|
+
...
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ClassLoader:
|
|
13
|
+
#
|
|
14
|
+
# load is fine for classes we expect. e.g. we load specific types of data readers and writers
|
|
15
|
+
# using this method without any concerns about different projects needing to not collide. today
|
|
16
|
+
# we treat integration listeners the same way, but longer term we need those to be able to be
|
|
17
|
+
# custom loaded too.
|
|
18
|
+
#
|
|
19
|
+
@classmethod
|
|
20
|
+
def load(cls, s: str, args: list = None, kwargs: dict = None) -> Any:
|
|
21
|
+
s = s.strip()
|
|
22
|
+
if s != "":
|
|
23
|
+
instance = None
|
|
24
|
+
cs = s.split(" ")
|
|
25
|
+
#
|
|
26
|
+
# lines in config are like:
|
|
27
|
+
# from module import class
|
|
28
|
+
#
|
|
29
|
+
if len(cs) == 4 and cs[0] == "from" and cs[2] == "import":
|
|
30
|
+
module = importlib.import_module(cs[1])
|
|
31
|
+
class_ = getattr(module, cs[3])
|
|
32
|
+
args = args if args is not None else []
|
|
33
|
+
kwargs = kwargs if kwargs is not None else {}
|
|
34
|
+
instance = class_(*args, **kwargs)
|
|
35
|
+
return instance
|
|
36
|
+
else:
|
|
37
|
+
raise ClassLoadingError(f"Unclear class loading import statement: {s}")
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# this loads a custom function using a name that is distinct across projects so there
|
|
42
|
+
# is no risk of name collisions.
|
|
43
|
+
#
|
|
44
|
+
@classmethod
|
|
45
|
+
def load_private_function(cls, config, stmt: str, *args, **kwargs):
|
|
46
|
+
imports = config.get(section="functions", name="imports")
|
|
47
|
+
if not imports or str(imports).strip() == "":
|
|
48
|
+
raise ValueError("Imports cannot be None or ''")
|
|
49
|
+
imports = os.path.dirname(imports)
|
|
50
|
+
return cls.load_private_class(imports, stmt, *args, **kwargs)
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def load_private_class(cls, base_path: str, stmt: str, *args, **kwargs):
|
|
54
|
+
if not stmt or stmt.strip() == "":
|
|
55
|
+
raise ValueError("Load statement cannot be None or ''")
|
|
56
|
+
module_name = None
|
|
57
|
+
class_name = None
|
|
58
|
+
#
|
|
59
|
+
# remove the imports file name. functions must be in or below the dir
|
|
60
|
+
# where the functions file is.
|
|
61
|
+
#
|
|
62
|
+
# /x/y/z/function.imports
|
|
63
|
+
# /x/y/z
|
|
64
|
+
# from a.b.c import C as cone
|
|
65
|
+
#
|
|
66
|
+
# we look in /x/y/z/a/b/c.py for class C
|
|
67
|
+
# base module clss
|
|
68
|
+
#
|
|
69
|
+
cs = stmt.split(" ")
|
|
70
|
+
if len(cs) >= 4 and cs[0] == "from" and cs[2] == "import":
|
|
71
|
+
module_name = cs[1]
|
|
72
|
+
class_name = cs[3]
|
|
73
|
+
else:
|
|
74
|
+
raise ClassLoadingError(f"Unclear class loading import statement: {stmt}")
|
|
75
|
+
#
|
|
76
|
+
# Resolve the file path for the module
|
|
77
|
+
#
|
|
78
|
+
module_path = os.path.join(base_path, module_name)
|
|
79
|
+
|
|
80
|
+
_i = module_path.rfind(os.sep)
|
|
81
|
+
mpt = module_path[0:_i]
|
|
82
|
+
mpb = module_path[_i:]
|
|
83
|
+
mpb = mpb.replace(".", os.sep)
|
|
84
|
+
module_path = f"{mpt}{mpb}"
|
|
85
|
+
module_path = f"{module_path}.py"
|
|
86
|
+
|
|
87
|
+
if not os.path.exists(module_path):
|
|
88
|
+
raise ImportError(f"Module {module_name} not found in {module_path}")
|
|
89
|
+
#
|
|
90
|
+
# create a unique module spec. we hash the full path to the bytes in order
|
|
91
|
+
# to make sure we have a distinct class, even if one project names and locates
|
|
92
|
+
# a class in the exact same relative location.
|
|
93
|
+
#
|
|
94
|
+
# e.g. project A has a function.imports file at config/function.imports that defines a class B as:
|
|
95
|
+
# from b import B as bee
|
|
96
|
+
# project B has a function.imports file at config/function.imports that defines a class B as:
|
|
97
|
+
# from b import B as bee
|
|
98
|
+
# These two class Bs would be identified exactly the same way even though they are different. We
|
|
99
|
+
# don't ever want a request for project B's class B to be returned when project A requests a
|
|
100
|
+
# class B. The hash keeps the names distinct.
|
|
101
|
+
#
|
|
102
|
+
compiled_path = None
|
|
103
|
+
try:
|
|
104
|
+
compiled_path = py_compile.compile(
|
|
105
|
+
str(module_path),
|
|
106
|
+
cfile=str(module_path) + "c", # or any path you choose
|
|
107
|
+
doraise=True,
|
|
108
|
+
)
|
|
109
|
+
except Exception:
|
|
110
|
+
print(traceback.format_exc())
|
|
111
|
+
spec = importlib.util.spec_from_file_location(
|
|
112
|
+
f"{module_name}_{hash(compiled_path)}", compiled_path
|
|
113
|
+
)
|
|
114
|
+
module = importlib.util.module_from_spec(spec)
|
|
115
|
+
loader = spec.loader
|
|
116
|
+
if loader is None:
|
|
117
|
+
raise ImportError(
|
|
118
|
+
f"Classloader: could not load spec for {module_name} at {module_path}"
|
|
119
|
+
)
|
|
120
|
+
loader.exec_module(module)
|
|
121
|
+
cls = getattr(module, class_name)
|
|
122
|
+
instance = cls(*args, **kwargs)
|
|
123
|
+
return instance
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "csvpath"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.591"
|
|
4
4
|
description = "A data preboarding framework for ingesting, managing, and validating CSV, Excel, and other tabular data files using a Collect, Store, Validate, Publish architecture to create a trusted publisher for downstream data consumers."
|
|
5
5
|
authors = ["David Kershaw <info@csvpath.org>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import importlib
|
|
2
|
-
import os
|
|
3
|
-
from typing import Any
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class ClassLoadingError(RuntimeError):
|
|
7
|
-
...
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class ClassLoader:
|
|
11
|
-
#
|
|
12
|
-
# load is fine for classes we expect. e.g. we load specific types of data readers and writers
|
|
13
|
-
# using this method without any concerns about different projects needing to not collide. today
|
|
14
|
-
# we treat integration listeners the same way, but longer term we need those to be able to be
|
|
15
|
-
# custom loaded too.
|
|
16
|
-
#
|
|
17
|
-
@classmethod
|
|
18
|
-
def load(cls, s: str, args: list = None, kwargs: dict = None) -> Any:
|
|
19
|
-
s = s.strip()
|
|
20
|
-
if s != "":
|
|
21
|
-
instance = None
|
|
22
|
-
cs = s.split(" ")
|
|
23
|
-
#
|
|
24
|
-
# lines in config are like:
|
|
25
|
-
# from module import class
|
|
26
|
-
#
|
|
27
|
-
if len(cs) == 4 and cs[0] == "from" and cs[2] == "import":
|
|
28
|
-
module = importlib.import_module(cs[1])
|
|
29
|
-
class_ = getattr(module, cs[3])
|
|
30
|
-
args = args if args is not None else []
|
|
31
|
-
kwargs = kwargs if kwargs is not None else {}
|
|
32
|
-
instance = class_(*args, **kwargs)
|
|
33
|
-
return instance
|
|
34
|
-
else:
|
|
35
|
-
raise ClassLoadingError(f"Unclear class loading import statement: {s}")
|
|
36
|
-
return None
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
# this loads a custom function using a name that is distinct across projects so there
|
|
40
|
-
# is no risk of name collisions.
|
|
41
|
-
#
|
|
42
|
-
@classmethod
|
|
43
|
-
def load_private_function(cls, config, stmt: str, *args, **kwargs):
|
|
44
|
-
imports = config.get(section="functions", name="imports")
|
|
45
|
-
if not imports or str(imports).strip() == "":
|
|
46
|
-
raise ValueError("Imports cannot be None or ''")
|
|
47
|
-
imports = os.path.dirname(imports)
|
|
48
|
-
return cls.load_private_class(imports, stmt, *args, **kwargs)
|
|
49
|
-
|
|
50
|
-
"""
|
|
51
|
-
@classmethod
|
|
52
|
-
def load_private_class(cls, base_path: str, stmt: str, *args, **kwargs):
|
|
53
|
-
if not stmt or stmt.strip() == "":
|
|
54
|
-
raise ValueError("Load statement cannot be None or ''")
|
|
55
|
-
module_name = None
|
|
56
|
-
class_name = None
|
|
57
|
-
#
|
|
58
|
-
# remove the imports file name. functions must be in or below the dir
|
|
59
|
-
# where the functions file is.
|
|
60
|
-
#
|
|
61
|
-
# /x/y/z/function.imports
|
|
62
|
-
# /x/y/z
|
|
63
|
-
# from a.b.c import C as cone
|
|
64
|
-
#
|
|
65
|
-
# we look in /x/y/z/a/b/c.py for class C
|
|
66
|
-
# base module clss
|
|
67
|
-
#
|
|
68
|
-
cs = stmt.split(" ")
|
|
69
|
-
if len(cs) >= 4 and cs[0] == "from" and cs[2] == "import":
|
|
70
|
-
module_name = cs[1]
|
|
71
|
-
class_name = cs[3]
|
|
72
|
-
else:
|
|
73
|
-
raise ClassLoadingError(f"Unclear class loading import statement: {stmt}")
|
|
74
|
-
#
|
|
75
|
-
# Resolve the file path for the module
|
|
76
|
-
#
|
|
77
|
-
module_path = os.path.join(base_path, module_name)
|
|
78
|
-
module_path = module_path.replace(".", os.sep)
|
|
79
|
-
module_path = f"{module_path}.py"
|
|
80
|
-
if not os.path.exists(module_path):
|
|
81
|
-
raise ImportError(f"Module {module_name} not found in {module_path}")
|
|
82
|
-
#
|
|
83
|
-
# create a unique module spec. we hash the full path to the bytes in order
|
|
84
|
-
# to make sure we have a distinct class, even if one project names and locates
|
|
85
|
-
# a class in the exact same relative location.
|
|
86
|
-
#
|
|
87
|
-
# e.g. project A has a function.imports file at config/function.imports that defines a class B as:
|
|
88
|
-
# from b import B as bee
|
|
89
|
-
# project B has a function.imports file at config/function.imports that defines a class B as:
|
|
90
|
-
# from b import B as bee
|
|
91
|
-
# These two class Bs would be identified exactly the same way even though they are different. We
|
|
92
|
-
# don't ever want a request for project B's class B to be returned when project A requests a
|
|
93
|
-
# class B. The hash keeps the names distinct.
|
|
94
|
-
#
|
|
95
|
-
try:
|
|
96
|
-
import py_compile
|
|
97
|
-
py_compile.compile(str(module_path), doraise=True)
|
|
98
|
-
print(f"Compiled fine")
|
|
99
|
-
except Exception as ex:
|
|
100
|
-
print(f"Cannot compile: {ex}")
|
|
101
|
-
|
|
102
|
-
try:
|
|
103
|
-
print("ABS:", os.path.abspath(module_path))
|
|
104
|
-
print("REAL:", os.path.realpath(module_path))
|
|
105
|
-
print("EXISTS:", os.path.exists(module_path))
|
|
106
|
-
print("ISFILE:", os.path.isfile(module_path))
|
|
107
|
-
print("ACCESS_R:", os.access(module_path, os.R_OK))
|
|
108
|
-
print("ACCESS_X:", os.access(module_path, os.X_OK))
|
|
109
|
-
except Exception as ex:
|
|
110
|
-
print(f"Cannot print module_path attributes: {ex}")
|
|
111
|
-
|
|
112
|
-
spec = importlib.util.spec_from_file_location(
|
|
113
|
-
f"{module_name}_{hash(module_path)}", # unique name per loader instance
|
|
114
|
-
str(module_path),
|
|
115
|
-
)
|
|
116
|
-
module = importlib.util.module_from_spec(spec)
|
|
117
|
-
loader = spec.loader
|
|
118
|
-
if loader is None:
|
|
119
|
-
raise ImportError(f"Could not load spec for {module_name} at {module_path}")
|
|
120
|
-
loader.exec_module(module)
|
|
121
|
-
cls = getattr(module, class_name)
|
|
122
|
-
instance = cls(*args, **kwargs)
|
|
123
|
-
return instance
|
|
124
|
-
"""
|
|
125
|
-
|
|
126
|
-
@classmethod
|
|
127
|
-
def load_private_class(cls, base_path: str, stmt: str, *args, **kwargs):
|
|
128
|
-
if not stmt or stmt.strip() == "":
|
|
129
|
-
raise ValueError("Load statement cannot be None or ''")
|
|
130
|
-
module_name = None
|
|
131
|
-
class_name = None
|
|
132
|
-
#
|
|
133
|
-
# remove the imports file name. functions must be in or below the dir
|
|
134
|
-
# where the functions file is.
|
|
135
|
-
#
|
|
136
|
-
# /x/y/z/function.imports
|
|
137
|
-
# /x/y/z
|
|
138
|
-
# from a.b.c import C as cone
|
|
139
|
-
#
|
|
140
|
-
# we look in /x/y/z/a/b/c.py for class C
|
|
141
|
-
# base module clss
|
|
142
|
-
#
|
|
143
|
-
cs = stmt.split(" ")
|
|
144
|
-
if len(cs) >= 4 and cs[0] == "from" and cs[2] == "import":
|
|
145
|
-
module_name = cs[1]
|
|
146
|
-
class_name = cs[3]
|
|
147
|
-
else:
|
|
148
|
-
raise ClassLoadingError(f"Unclear class loading import statement: {stmt}")
|
|
149
|
-
#
|
|
150
|
-
# Resolve the file path for the module
|
|
151
|
-
#
|
|
152
|
-
module_path = os.path.join(base_path, module_name)
|
|
153
|
-
module_path = module_path.replace(".", os.sep)
|
|
154
|
-
module_path = f"{module_path}.py"
|
|
155
|
-
if not os.path.exists(module_path):
|
|
156
|
-
raise ImportError(f"Module {module_name} not found in {module_path}")
|
|
157
|
-
#
|
|
158
|
-
# create a unique module spec. we hash the full path to the bytes in order
|
|
159
|
-
# to make sure we have a distinct class, even if one project names and locates
|
|
160
|
-
# a class in the exact same relative location.
|
|
161
|
-
#
|
|
162
|
-
# e.g. project A has a function.imports file at config/function.imports that defines a class B as:
|
|
163
|
-
# from b import B as bee
|
|
164
|
-
# project B has a function.imports file at config/function.imports that defines a class B as:
|
|
165
|
-
# from b import B as bee
|
|
166
|
-
# These two class Bs would be identified exactly the same way even though they are different. We
|
|
167
|
-
# don't ever want a request for project B's class B to be returned when project A requests a
|
|
168
|
-
# class B. The hash keeps the names distinct.
|
|
169
|
-
#
|
|
170
|
-
compiled_path = None
|
|
171
|
-
try:
|
|
172
|
-
import py_compile
|
|
173
|
-
# py_compile.compile(str(module_path), doraise=True)
|
|
174
|
-
compiled_path = py_compile.compile(
|
|
175
|
-
str(module_path),
|
|
176
|
-
cfile=str(module_path) + "c", # or any path you choose
|
|
177
|
-
doraise=True,
|
|
178
|
-
)
|
|
179
|
-
print(f"Classloader: compiled fine to: {compiled_path}")
|
|
180
|
-
|
|
181
|
-
except Exception as ex:
|
|
182
|
-
print(f"Classloader: cannot compile: {ex}")
|
|
183
|
-
#
|
|
184
|
-
# debugging. can remove
|
|
185
|
-
#
|
|
186
|
-
try:
|
|
187
|
-
print("Classloader: ABS:", os.path.abspath(module_path))
|
|
188
|
-
print("Classloader: REAL:", os.path.realpath(module_path))
|
|
189
|
-
print("Classloader: EXISTS:", os.path.exists(module_path))
|
|
190
|
-
print("Classloader: ISFILE:", os.path.isfile(module_path))
|
|
191
|
-
print("Classloader: ACCESS_R:", os.access(module_path, os.R_OK))
|
|
192
|
-
print("Classloader: ACCESS_X:", os.access(module_path, os.X_OK))
|
|
193
|
-
except Exception as ex:
|
|
194
|
-
print(f"Classloader: cannot print module_path attributes: {ex}")
|
|
195
|
-
#
|
|
196
|
-
# end debugging.
|
|
197
|
-
#
|
|
198
|
-
"""
|
|
199
|
-
spec = importlib.util.spec_from_file_location(
|
|
200
|
-
f"{module_name}_{hash(module_path)}", # unique name per loader instance
|
|
201
|
-
str(module_path),
|
|
202
|
-
)
|
|
203
|
-
"""
|
|
204
|
-
spec = importlib.util.spec_from_file_location(
|
|
205
|
-
f"{module_name}_{hash(compiled_path)}", compiled_path
|
|
206
|
-
)
|
|
207
|
-
# module = importlib.util.module_from_spec(spec)
|
|
208
|
-
# spec.loader.exec_module(module)
|
|
209
|
-
|
|
210
|
-
module = importlib.util.module_from_spec(spec)
|
|
211
|
-
loader = spec.loader
|
|
212
|
-
if loader is None:
|
|
213
|
-
raise ImportError(f"Classloader: could not load spec for {module_name} at {module_path}")
|
|
214
|
-
loader.exec_module(module)
|
|
215
|
-
cls = getattr(module, class_name)
|
|
216
|
-
instance = cls(*args, **kwargs)
|
|
217
|
-
print(f"Classloader: returning instance: {instance}")
|
|
218
|
-
return instance
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_error_listener.py
RENAMED
|
File without changes
|
{csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_file_listener.py
RENAMED
|
File without changes
|
|
File without changes
|
{csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_paths_listener.py
RENAMED
|
File without changes
|
{csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_result_listener.py
RENAMED
|
File without changes
|
{csvpath-0.0.589 → csvpath-0.0.591}/csvpath/managers/integrations/otlp/otlp_results_listener.py
RENAMED
|
File without changes
|
|
File without changes
|