csvpath 0.0.507__tar.gz → 0.0.508__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.507 → csvpath-0.0.508}/PKG-INFO +2 -3
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/csvpath.py +10 -1
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +1 -1
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/transfer_creator.py +5 -6
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_serializer.py +7 -5
- csvpath-0.0.508/csvpath/util/box.py +18 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/config.py +9 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_data_reader.py +12 -7
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_data_writer.py +21 -17
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_xlsx_data_reader.py +9 -5
- {csvpath-0.0.507 → csvpath-0.0.508}/pyproject.toml +3 -5
- {csvpath-0.0.507 → csvpath-0.0.508}/LICENSE +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/README.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/config/config.ini +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/cli.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/drill_down.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/csvpaths.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_cacher.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_manager.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/ckan.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/datafile.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/dataset.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/event.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/event_result.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/job.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run_state.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/sender.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/slack/event.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/slack/sender.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/listener.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_manager.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/readers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_file_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_manager.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_listener_stdout.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_metadata.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_registrar.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/args.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/all.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/andf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/any.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/between.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/empty.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/exists.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/inf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/no.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/notf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/orf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/yes.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_bytes.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_headers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_lines.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_scans.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/counter.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/every.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/has_matches.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/increment.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/tally.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/total_lines.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/dates/now.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_factory.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_finder.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_focus.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/append.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/collect.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/empty_stack.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/end.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/header_name.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/headers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/mismatch.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/replace.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/reset_headers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/advance.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/after_blank.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/dups.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/first.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/first_line.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/last.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/stop.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/above.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/add.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/divide.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/equals.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/intf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/mod.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/multiply.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/round.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/subtotal.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/subtract.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/sum.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/fingerprint.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/importf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/random.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/jinjaf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/print_line.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/print_queue.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/printf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/table.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/minf.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/percent.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/percent_unique.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/stdev.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/concat.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/length.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/lower.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/metaphone.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/regex.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/starts_with.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/strip.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/substring.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/upper.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/testing/debug.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/boolean.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/datef.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/decimal.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/nonef.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/string.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/type.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/fail.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/failed.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/line.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/get.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/pushpop.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/put.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/track.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/variables.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/lark_parser.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/lark_transformer.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/matcher.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/equality.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/expression.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/header.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/matchable.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/qualified.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/reference.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/term.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/variable.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/exceptions.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/expression_encoder.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/expression_utility.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/lark_print_parser.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/print_parser.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/runtime_data_collector.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/explain_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/files_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/logic_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/mode_controller.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/print_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/return_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/run_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/source_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/transfer_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/unmatched_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/validation_mode.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/__init__.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/exceptions.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/parser.out +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/parsetab.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/scanner.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/scanning_lexer.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/cache.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/class_loader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/config_exception.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/error.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/exceptions.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_info.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_readers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_writers.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/last_line_stats.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_counter.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_monitor.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_spooler.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/log_utility.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/metadata_parser.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/nos.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/pandas_data_reader.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/printer.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/reference_parser.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_fingerprinter.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_utils.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/var_utility.py +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/asbool.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/assignment.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/comments.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/config.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/examples.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/files.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/above.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/advance.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/after_blank.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/all.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/andor.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/any.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/average.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/between.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/collect.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/correlate.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count_bytes.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count_headers.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/counter.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/date.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/empty.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/empty_stack.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/end.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/every.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/fail.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/fingerprint.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/first.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/get.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/has_dups.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/has_matches.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header_name.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header_names_mismatch.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/implementing_functions.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/import.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/in.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/increment.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/intf.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/jinja.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/last.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/line.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/line_number.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/max.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/metaphone.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/mismatch.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/no.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/not.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/now.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/percent_unique.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/pop.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print_line.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print_queue.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/random.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/regex.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/replace.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/reset_headers.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/stdev.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/stop.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/string_functions.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/subtotal.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/subtract.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/sum.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/tally.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/total_lines.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/track.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/types.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/variables.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/variables_and_headers.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/grammar.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/headers.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/ckan-logo-sm.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/csvpath-icon-sm.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/csvpath-logo-wordmark-tight-2.svg +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-3.svg +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-4.svg +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-white-on-black-trimmed-padded.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-white-trimmed.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/marquez-logo-sm.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/openlineage-logo-sm.png +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/paths.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/printing.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/qualifiers.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/references.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/terms.md +0 -0
- {csvpath-0.0.507 → csvpath-0.0.508}/docs/variables.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: csvpath
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.508
|
|
4
4
|
Summary: An edge governance framework for managing and validating CSV, Excel, and other tabular data files
|
|
5
5
|
Author: David Kershaw
|
|
6
6
|
Author-email: dk107dk@hotmail.com
|
|
@@ -23,7 +23,6 @@ Classifier: Topic :: Software Development :: Testing
|
|
|
23
23
|
Classifier: Topic :: Text Processing
|
|
24
24
|
Classifier: Topic :: Utilities
|
|
25
25
|
Provides-Extra: pandas
|
|
26
|
-
Provides-Extra: smartopen
|
|
27
26
|
Requires-Dist: boto3 (>=1.35.91,<2.0.0)
|
|
28
27
|
Requires-Dist: bullet (>=2.2.0,<3.0.0)
|
|
29
28
|
Requires-Dist: ckanapi (>=4.8,<5.0)
|
|
@@ -40,7 +39,7 @@ Requires-Dist: pytest (>=8.3.3,<9.0.0)
|
|
|
40
39
|
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
41
40
|
Requires-Dist: pytz (>=2024.2,<2025.0)
|
|
42
41
|
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
43
|
-
Requires-Dist: smart-open (>=7.1.0,<8.0.0)
|
|
42
|
+
Requires-Dist: smart-open (>=7.1.0,<8.0.0)
|
|
44
43
|
Requires-Dist: tabulate (>=0.9.0,<0.10.0)
|
|
45
44
|
Project-URL: Csvpath.org, https://www.csvpath.org
|
|
46
45
|
Project-URL: Github, https://github.com/csvpath/csvpath.git
|
|
@@ -1204,7 +1204,16 @@ class CsvPath(CsvPathPublic, ErrorCollector, Printer): # pylint: disable=R0902,
|
|
|
1204
1204
|
"Csvpath identified as %s has no filename. Since we could be error handling an exception is not raised.",
|
|
1205
1205
|
self.identity,
|
|
1206
1206
|
)
|
|
1207
|
-
|
|
1207
|
+
#
|
|
1208
|
+
# there are times, e.g. when using Lambda, when it may be better to
|
|
1209
|
+
# not use a cache. in the case of Lambda the reason is to avoid working
|
|
1210
|
+
# around the read-only filesystem.
|
|
1211
|
+
#
|
|
1212
|
+
use_cache = self.csvpaths is not None
|
|
1213
|
+
if use_cache:
|
|
1214
|
+
uc = self.csvpaths.config.get(section="cache", name="use_cache")
|
|
1215
|
+
use_cache = uc is None or uc.strip().lower() != "no"
|
|
1216
|
+
if self.csvpaths and use_cache is True:
|
|
1208
1217
|
self.line_monitor = self.csvpaths.file_manager.cacher.get_new_line_monitor(
|
|
1209
1218
|
self.scanner.filename
|
|
1210
1219
|
)
|
{csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py
RENAMED
|
@@ -162,7 +162,7 @@ class SftpPlusListener(Listener, threading.Thread):
|
|
|
162
162
|
# land the file at the UUID so that if anything weird we'll only ever
|
|
163
163
|
# interfere with ourselves.
|
|
164
164
|
#
|
|
165
|
-
remote_path = f"{self.
|
|
165
|
+
remote_path = f"{self.metadata.uuid_string}.json"
|
|
166
166
|
self.csvpaths.logger.info("Putting %s to %s", file, remote_path)
|
|
167
167
|
sftp.putfo(file, remote_path)
|
|
168
168
|
sftp.close()
|
{csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/transfer_creator.py
RENAMED
|
@@ -227,17 +227,16 @@ class SftpPlusTransferCreator:
|
|
|
227
227
|
return f"{self.csvpaths.config.get(section='sftpplus', name='python_cmd')} "
|
|
228
228
|
|
|
229
229
|
def _generate_and_place_scripts(self, msg: dict) -> str:
|
|
230
|
-
|
|
231
|
-
print(f"transfer script path is: {
|
|
230
|
+
before_script = self._execute_before_script
|
|
231
|
+
print(f"transfer script path is: {before_script}")
|
|
232
232
|
s = f"""
|
|
233
233
|
#
|
|
234
234
|
# THIS FILE IS GENERATED AT RUNTIME. DO NOT EDIT IT.
|
|
235
235
|
#
|
|
236
|
-
|
|
237
|
-
{self.python_cmd} {path} "$1"
|
|
236
|
+
{self.python_cmd} {self._execute_before_python_main} "$1"
|
|
238
237
|
"""
|
|
239
238
|
print(f"_generate_and_place_scripts: python runner script: {s}")
|
|
240
|
-
with open(
|
|
239
|
+
with open(before_script, "w", encoding="utf-8") as file:
|
|
241
240
|
file.write(s)
|
|
242
241
|
#
|
|
243
242
|
# do we need to +x the script?
|
|
@@ -276,5 +275,5 @@ if __name__ == "__main__":
|
|
|
276
275
|
h.named_paths_name = "{named_paths_name}"
|
|
277
276
|
h.process_arrival()
|
|
278
277
|
"""
|
|
279
|
-
with open(
|
|
278
|
+
with open(self._execute_before_python_main, "w", encoding="utf-8") as file:
|
|
280
279
|
file.write(s)
|
|
@@ -7,6 +7,7 @@ from csvpath import CsvPath
|
|
|
7
7
|
from csvpath.matching.util.runtime_data_collector import RuntimeDataCollector
|
|
8
8
|
from csvpath.util.line_spooler import LineSpooler
|
|
9
9
|
from csvpath.util.file_writers import DataFileWriter
|
|
10
|
+
from csvpath.util.nos import Nos
|
|
10
11
|
|
|
11
12
|
Simpledata = NewType("Simpledata", Union[None | str | int | float | bool])
|
|
12
13
|
Listdata = NewType("Listdata", list[None | str | int | float | bool])
|
|
@@ -158,8 +159,8 @@ class ResultSerializer:
|
|
|
158
159
|
def get_run_dir(self, *, paths_name, run_time):
|
|
159
160
|
paths_name = self._deref_paths_name(paths_name)
|
|
160
161
|
run_dir = os.path.join(self.base_dir, paths_name)
|
|
161
|
-
if not
|
|
162
|
-
|
|
162
|
+
if not Nos(run_dir).dir_exists():
|
|
163
|
+
Nos(run_dir).makedirs()
|
|
163
164
|
if not isinstance(run_time, str):
|
|
164
165
|
run_time = self.get_run_dir_name_from_datetime(run_time)
|
|
165
166
|
run_dir = os.path.join(run_dir, f"{run_time}")
|
|
@@ -169,10 +170,10 @@ class ResultSerializer:
|
|
|
169
170
|
# atm. a server process would namespace each CsvPaths instance
|
|
170
171
|
# to prevent conflicts. if there is a conflict the two runs would
|
|
171
172
|
# overwrite each other. this prevents that.
|
|
172
|
-
if
|
|
173
|
+
if Nos(run_dir).dir_exists():
|
|
173
174
|
i = 0
|
|
174
175
|
adir = f"{run_dir}.{i}"
|
|
175
|
-
while
|
|
176
|
+
while Nos(adir).dir_exists():
|
|
176
177
|
i += 1
|
|
177
178
|
adir = f"{run_dir}.{i}"
|
|
178
179
|
run_dir = adir
|
|
@@ -180,5 +181,6 @@ class ResultSerializer:
|
|
|
180
181
|
|
|
181
182
|
def get_instance_dir(self, run_dir, identity) -> str:
|
|
182
183
|
run_dir = os.path.join(run_dir, identity)
|
|
183
|
-
|
|
184
|
+
if not Nos(run_dir).exists():
|
|
185
|
+
Nos(run_dir).makedirs()
|
|
184
186
|
return run_dir
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#
|
|
2
|
+
# just a box to put things in. initial use is
|
|
3
|
+
# sharing a boto3 client under "boto_client".
|
|
4
|
+
#
|
|
5
|
+
class Box:
|
|
6
|
+
STUFF = {}
|
|
7
|
+
|
|
8
|
+
def __enter__(self):
|
|
9
|
+
return self
|
|
10
|
+
|
|
11
|
+
def __exit__(self, exc_type, exc_value, exc_traceback):
|
|
12
|
+
Box.STUFF = {}
|
|
13
|
+
|
|
14
|
+
def add(self, key: str, value) -> None:
|
|
15
|
+
Box.STUFF[key] = value
|
|
16
|
+
|
|
17
|
+
def get(self, key: str):
|
|
18
|
+
return Box.STUFF.get(key)
|
|
@@ -254,6 +254,8 @@ on_unmatched_file_fingerprints = halt
|
|
|
254
254
|
if self.load:
|
|
255
255
|
if self.archive_path is None or self.archive_path.strip() == "":
|
|
256
256
|
self.archive_path = "archive"
|
|
257
|
+
if self.archive_path.strip().lower().startswith("s3://"):
|
|
258
|
+
return
|
|
257
259
|
if not path.exists(self.archive_path):
|
|
258
260
|
os.makedirs(self.archive_path)
|
|
259
261
|
|
|
@@ -268,6 +270,8 @@ on_unmatched_file_fingerprints = halt
|
|
|
268
270
|
if self.load:
|
|
269
271
|
if self.inputs_files_path is None or self.inputs_files_path.strip() == "":
|
|
270
272
|
self.inputs_files_path = "inputs/named_files"
|
|
273
|
+
if self.inputs_files_path.strip().lower().startswith("s3://"):
|
|
274
|
+
return
|
|
271
275
|
if not path.exists(self.inputs_files_path):
|
|
272
276
|
os.makedirs(self.inputs_files_path)
|
|
273
277
|
|
|
@@ -278,10 +282,15 @@ on_unmatched_file_fingerprints = halt
|
|
|
278
282
|
or self.inputs_csvpaths_path.strip() == ""
|
|
279
283
|
):
|
|
280
284
|
self.inputs_csvpaths_path = "inputs/named_paths"
|
|
285
|
+
if self.inputs_csvpaths_path.strip().lower().startswith("s3://"):
|
|
286
|
+
return
|
|
281
287
|
if not path.exists(self.inputs_csvpaths_path):
|
|
282
288
|
os.makedirs(self.inputs_csvpaths_path)
|
|
283
289
|
|
|
284
290
|
def _assure_cache_path(self) -> None:
|
|
291
|
+
uc = self.get(section="cache", name="use_cache")
|
|
292
|
+
if uc and uc.strip().lower() == "no":
|
|
293
|
+
return
|
|
285
294
|
if self.load:
|
|
286
295
|
if self.cache_dir_path is None or self.cache_dir_path.strip() == "":
|
|
287
296
|
self.cache_dir_path = "cache"
|
|
@@ -7,6 +7,7 @@ from smart_open import open
|
|
|
7
7
|
from ..file_readers import CsvDataReader
|
|
8
8
|
from .s3_utils import S3Utils
|
|
9
9
|
from .s3_fingerprinter import S3Fingerprinter
|
|
10
|
+
from csvpath.util.box import Box
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
#
|
|
@@ -15,18 +16,22 @@ from .s3_fingerprinter import S3Fingerprinter
|
|
|
15
16
|
class S3DataReader(CsvDataReader):
|
|
16
17
|
def load_if(self) -> None:
|
|
17
18
|
if self.source is None:
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
self.source = open(
|
|
24
|
-
self._path, "r", transport_params={"client": session.client("s3")}
|
|
19
|
+
client = Box.STUFF.get("boto_client")
|
|
20
|
+
if client is None:
|
|
21
|
+
session = boto3.Session(
|
|
22
|
+
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
23
|
+
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
25
24
|
)
|
|
25
|
+
client = session.client("s3")
|
|
26
|
+
try:
|
|
27
|
+
self.source = open(self._path, "r", transport_params={"client": client})
|
|
26
28
|
except DeprecationWarning:
|
|
27
29
|
...
|
|
28
30
|
|
|
29
31
|
def next(self) -> list[str]:
|
|
32
|
+
#
|
|
33
|
+
# TODO: check if smart-open is in play and open w/o client is correct
|
|
34
|
+
#
|
|
30
35
|
with open(uri=self._path, mode="r") as file:
|
|
31
36
|
reader = csv.reader(
|
|
32
37
|
file, delimiter=self._delimiter, quotechar=self._quotechar
|
|
@@ -4,25 +4,28 @@ import os
|
|
|
4
4
|
import boto3
|
|
5
5
|
from smart_open import open
|
|
6
6
|
from ..file_writers import DataFileWriter
|
|
7
|
+
from csvpath.util.box import Box
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class S3DataWriter(DataFileWriter):
|
|
10
11
|
def load_if(self) -> None:
|
|
11
12
|
if self.sink is None:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
action="ignore", message=r"datetime.datetime.utcnow"
|
|
20
|
-
)
|
|
13
|
+
client = Box.STUFF.get("boto_client")
|
|
14
|
+
if client is None:
|
|
15
|
+
session = boto3.Session(
|
|
16
|
+
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
17
|
+
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
18
|
+
)
|
|
19
|
+
import warnings
|
|
21
20
|
|
|
21
|
+
warnings.filterwarnings(
|
|
22
|
+
action="ignore", message=r"datetime.datetime.utcnow"
|
|
23
|
+
)
|
|
24
|
+
client = session.client("s3")
|
|
22
25
|
self.sink = open(
|
|
23
26
|
self._path,
|
|
24
27
|
self._mode,
|
|
25
|
-
transport_params={"client":
|
|
28
|
+
transport_params={"client": client},
|
|
26
29
|
)
|
|
27
30
|
|
|
28
31
|
def write(self, data) -> None:
|
|
@@ -30,13 +33,14 @@ class S3DataWriter(DataFileWriter):
|
|
|
30
33
|
as a context manager for this method. for multiple write
|
|
31
34
|
calls to the same file handle use append().
|
|
32
35
|
"""
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
client = Box.STUFF.get("boto_client")
|
|
37
|
+
if client is None:
|
|
38
|
+
session = boto3.Session(
|
|
39
|
+
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
40
|
+
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
41
|
+
)
|
|
42
|
+
client = session.client("s3")
|
|
43
|
+
with open(self._path, "wb", transport_params={"client": client}) as file:
|
|
40
44
|
file.write(data.encode("utf-8"))
|
|
41
45
|
|
|
42
46
|
def file_info(self) -> dict[str, str | int | float]:
|
|
@@ -5,6 +5,7 @@ import boto3
|
|
|
5
5
|
from smart_open import open
|
|
6
6
|
from ..file_readers import XlsxDataReader
|
|
7
7
|
from .s3_fingerprinter import S3Fingerprinter
|
|
8
|
+
from csvpath.util.box import Box
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class S3XlsxDataReader(XlsxDataReader):
|
|
@@ -18,13 +19,16 @@ class S3XlsxDataReader(XlsxDataReader):
|
|
|
18
19
|
|
|
19
20
|
def load_if(self) -> None:
|
|
20
21
|
if self.source is None:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
client = Box.STUFF.get("boto_client")
|
|
23
|
+
if client is None:
|
|
24
|
+
session = boto3.Session(
|
|
25
|
+
aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
|
|
26
|
+
aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
|
|
27
|
+
)
|
|
28
|
+
client = session.client("s3")
|
|
25
29
|
try:
|
|
26
30
|
self.source = open(
|
|
27
|
-
self._path, "rb", transport_params={"client":
|
|
31
|
+
self._path, "rb", transport_params={"client": client}
|
|
28
32
|
)
|
|
29
33
|
except DeprecationWarning:
|
|
30
34
|
...
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "csvpath"
|
|
3
|
-
version = "0.0.
|
|
3
|
+
version = "0.0.508"
|
|
4
4
|
description = "An edge governance framework for managing and validating CSV, Excel, and other tabular data files"
|
|
5
5
|
authors = ["David Kershaw <dk107dk@hotmail.com>"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -21,8 +21,6 @@ include = ["config", "logs", "docs"]
|
|
|
21
21
|
|
|
22
22
|
[tool.pytest.ini_options]
|
|
23
23
|
#testpaths = ["tests"]
|
|
24
|
-
#norecursedirs = ["old"]
|
|
25
|
-
#filterwarnings = ["ignore::DeprecationWarning"]
|
|
26
24
|
|
|
27
25
|
[tool.poetry.urls]
|
|
28
26
|
"Github" = "https://github.com/csvpath/csvpath.git"
|
|
@@ -48,13 +46,13 @@ bullet = "^2.2.0"
|
|
|
48
46
|
pytz = "^2024.2"
|
|
49
47
|
openlineage-python = "^1.25.0"
|
|
50
48
|
ckanapi = "^4.8"
|
|
51
|
-
boto3 = "^1.35.91"
|
|
52
49
|
smart-open = "^7.1.0"
|
|
53
50
|
paramiko = "^3.5.0"
|
|
51
|
+
boto3 = "^1.35.91"
|
|
54
52
|
|
|
55
53
|
[tool.poetry.extras]
|
|
56
54
|
pandas = ["pandas"]
|
|
57
|
-
smartopen = ["smart-open"]
|
|
55
|
+
#smartopen = ["smart-open"]
|
|
58
56
|
|
|
59
57
|
[tool.poetry.group.dev.dependencies]
|
|
60
58
|
flake8 = "^7.1.0"
|
|
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.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/arrival_handler.py
RENAMED
|
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.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_printouts_reader.py
RENAMED
|
File without changes
|
{csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_unmatched_reader.py
RENAMED
|
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.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/header_names_mismatch.py
RENAMED
|
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
|