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.
Files changed (304) hide show
  1. {csvpath-0.0.507 → csvpath-0.0.508}/PKG-INFO +2 -3
  2. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/csvpath.py +10 -1
  3. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +1 -1
  4. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/transfer_creator.py +5 -6
  5. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_serializer.py +7 -5
  6. csvpath-0.0.508/csvpath/util/box.py +18 -0
  7. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/config.py +9 -0
  8. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_data_reader.py +12 -7
  9. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_data_writer.py +21 -17
  10. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_xlsx_data_reader.py +9 -5
  11. {csvpath-0.0.507 → csvpath-0.0.508}/pyproject.toml +3 -5
  12. {csvpath-0.0.507 → csvpath-0.0.508}/LICENSE +0 -0
  13. {csvpath-0.0.507 → csvpath-0.0.508}/README.md +0 -0
  14. {csvpath-0.0.507 → csvpath-0.0.508}/config/config.ini +0 -0
  15. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/__init__.py +0 -0
  16. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/__init__.py +0 -0
  17. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/cli.py +0 -0
  18. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/cli/drill_down.py +0 -0
  19. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/csvpaths.py +0 -0
  20. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/__init__.py +0 -0
  21. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_cacher.py +0 -0
  22. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_manager.py +0 -0
  23. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_metadata.py +0 -0
  24. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/files/file_registrar.py +0 -0
  25. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  26. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  27. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  28. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  29. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/event.py +0 -0
  30. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/event_result.py +0 -0
  31. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  32. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/job.py +0 -0
  33. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  34. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  35. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  36. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  37. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run.py +0 -0
  38. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  39. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/run_state.py +0 -0
  40. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/ol/sender.py +0 -0
  41. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  42. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  43. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/slack/event.py +0 -0
  44. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/integrations/slack/sender.py +0 -0
  45. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/listener.py +0 -0
  46. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/metadata.py +0 -0
  47. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_manager.py +0 -0
  48. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_metadata.py +0 -0
  49. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/paths/paths_registrar.py +0 -0
  50. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/registrar.py +0 -0
  51. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  52. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  53. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  54. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  55. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/readers/readers.py +0 -0
  56. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result.py +0 -0
  57. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_file_reader.py +0 -0
  58. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_metadata.py +0 -0
  59. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/result_registrar.py +0 -0
  60. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_manager.py +0 -0
  61. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_metadata.py +0 -0
  62. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/results/results_registrar.py +0 -0
  63. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_listener_stdout.py +0 -0
  64. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_metadata.py +0 -0
  65. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/managers/run/run_registrar.py +0 -0
  66. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/__init__.py +0 -0
  67. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/__init__.py +0 -0
  68. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/args.py +0 -0
  69. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/all.py +0 -0
  70. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/andf.py +0 -0
  71. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/any.py +0 -0
  72. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/between.py +0 -0
  73. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/empty.py +0 -0
  74. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/exists.py +0 -0
  75. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/inf.py +0 -0
  76. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/no.py +0 -0
  77. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/notf.py +0 -0
  78. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/orf.py +0 -0
  79. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/boolean/yes.py +0 -0
  80. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count.py +0 -0
  81. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  82. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_headers.py +0 -0
  83. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_lines.py +0 -0
  84. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/count_scans.py +0 -0
  85. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/counter.py +0 -0
  86. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/every.py +0 -0
  87. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/has_matches.py +0 -0
  88. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/increment.py +0 -0
  89. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/tally.py +0 -0
  90. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/counting/total_lines.py +0 -0
  91. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/dates/now.py +0 -0
  92. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function.py +0 -0
  93. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_factory.py +0 -0
  94. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_finder.py +0 -0
  95. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/function_focus.py +0 -0
  96. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/append.py +0 -0
  97. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/collect.py +0 -0
  98. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  99. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/end.py +0 -0
  100. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/header_name.py +0 -0
  101. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  102. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/headers.py +0 -0
  103. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/mismatch.py +0 -0
  104. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/replace.py +0 -0
  105. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  106. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/advance.py +0 -0
  107. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/after_blank.py +0 -0
  108. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/dups.py +0 -0
  109. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/first.py +0 -0
  110. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/first_line.py +0 -0
  111. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/last.py +0 -0
  112. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/lines/stop.py +0 -0
  113. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/above.py +0 -0
  114. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/add.py +0 -0
  115. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/divide.py +0 -0
  116. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/equals.py +0 -0
  117. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/intf.py +0 -0
  118. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/mod.py +0 -0
  119. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/multiply.py +0 -0
  120. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/round.py +0 -0
  121. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/subtotal.py +0 -0
  122. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/subtract.py +0 -0
  123. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/math/sum.py +0 -0
  124. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  125. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/importf.py +0 -0
  126. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/misc/random.py +0 -0
  127. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/jinjaf.py +0 -0
  128. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/print_line.py +0 -0
  129. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/print_queue.py +0 -0
  130. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/printf.py +0 -0
  131. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/print/table.py +0 -0
  132. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/minf.py +0 -0
  133. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/percent.py +0 -0
  134. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  135. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/stats/stdev.py +0 -0
  136. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/concat.py +0 -0
  137. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/length.py +0 -0
  138. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/lower.py +0 -0
  139. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/metaphone.py +0 -0
  140. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/regex.py +0 -0
  141. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/starts_with.py +0 -0
  142. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/strip.py +0 -0
  143. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/substring.py +0 -0
  144. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/strings/upper.py +0 -0
  145. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/testing/debug.py +0 -0
  146. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/__init__.py +0 -0
  147. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/boolean.py +0 -0
  148. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/datef.py +0 -0
  149. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/decimal.py +0 -0
  150. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/nonef.py +0 -0
  151. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/string.py +0 -0
  152. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/types/type.py +0 -0
  153. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/fail.py +0 -0
  154. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/failed.py +0 -0
  155. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/validity/line.py +0 -0
  156. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/get.py +0 -0
  157. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/pushpop.py +0 -0
  158. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/put.py +0 -0
  159. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/track.py +0 -0
  160. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/functions/variables/variables.py +0 -0
  161. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/lark_parser.py +0 -0
  162. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/lark_transformer.py +0 -0
  163. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/matcher.py +0 -0
  164. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/__init__.py +0 -0
  165. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/equality.py +0 -0
  166. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/expression.py +0 -0
  167. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/header.py +0 -0
  168. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/matchable.py +0 -0
  169. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/qualified.py +0 -0
  170. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/reference.py +0 -0
  171. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/term.py +0 -0
  172. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/productions/variable.py +0 -0
  173. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/exceptions.py +0 -0
  174. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/expression_encoder.py +0 -0
  175. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/expression_utility.py +0 -0
  176. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/lark_print_parser.py +0 -0
  177. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/print_parser.py +0 -0
  178. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/matching/util/runtime_data_collector.py +0 -0
  179. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/explain_mode.py +0 -0
  180. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/files_mode.py +0 -0
  181. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/logic_mode.py +0 -0
  182. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/mode_controller.py +0 -0
  183. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/print_mode.py +0 -0
  184. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/return_mode.py +0 -0
  185. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/run_mode.py +0 -0
  186. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/source_mode.py +0 -0
  187. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/transfer_mode.py +0 -0
  188. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/unmatched_mode.py +0 -0
  189. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/modes/validation_mode.py +0 -0
  190. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/__init__.py +0 -0
  191. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/exceptions.py +0 -0
  192. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/parser.out +0 -0
  193. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/parsetab.py +0 -0
  194. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/scanner.py +0 -0
  195. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/scanning/scanning_lexer.py +0 -0
  196. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/cache.py +0 -0
  197. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/class_loader.py +0 -0
  198. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/config_exception.py +0 -0
  199. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/error.py +0 -0
  200. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/exceptions.py +0 -0
  201. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_info.py +0 -0
  202. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_readers.py +0 -0
  203. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/file_writers.py +0 -0
  204. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/last_line_stats.py +0 -0
  205. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_counter.py +0 -0
  206. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_monitor.py +0 -0
  207. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/line_spooler.py +0 -0
  208. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/log_utility.py +0 -0
  209. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/metadata_parser.py +0 -0
  210. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/nos.py +0 -0
  211. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/pandas_data_reader.py +0 -0
  212. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/printer.py +0 -0
  213. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/reference_parser.py +0 -0
  214. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  215. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/s3/s3_utils.py +0 -0
  216. {csvpath-0.0.507 → csvpath-0.0.508}/csvpath/util/var_utility.py +0 -0
  217. {csvpath-0.0.507 → csvpath-0.0.508}/docs/asbool.md +0 -0
  218. {csvpath-0.0.507 → csvpath-0.0.508}/docs/assignment.md +0 -0
  219. {csvpath-0.0.507 → csvpath-0.0.508}/docs/comments.md +0 -0
  220. {csvpath-0.0.507 → csvpath-0.0.508}/docs/config.md +0 -0
  221. {csvpath-0.0.507 → csvpath-0.0.508}/docs/examples.md +0 -0
  222. {csvpath-0.0.507 → csvpath-0.0.508}/docs/files.md +0 -0
  223. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/above.md +0 -0
  224. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/advance.md +0 -0
  225. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/after_blank.md +0 -0
  226. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/all.md +0 -0
  227. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/andor.md +0 -0
  228. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/any.md +0 -0
  229. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/average.md +0 -0
  230. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/between.md +0 -0
  231. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/collect.md +0 -0
  232. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/correlate.md +0 -0
  233. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count.md +0 -0
  234. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count_bytes.md +0 -0
  235. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/count_headers.md +0 -0
  236. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/counter.md +0 -0
  237. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/date.md +0 -0
  238. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/empty.md +0 -0
  239. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/empty_stack.md +0 -0
  240. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/end.md +0 -0
  241. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/every.md +0 -0
  242. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/fail.md +0 -0
  243. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/fingerprint.md +0 -0
  244. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/first.md +0 -0
  245. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/get.md +0 -0
  246. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/has_dups.md +0 -0
  247. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/has_matches.md +0 -0
  248. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header.md +0 -0
  249. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header_name.md +0 -0
  250. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/header_names_mismatch.md +0 -0
  251. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/implementing_functions.md +0 -0
  252. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/import.md +0 -0
  253. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/in.md +0 -0
  254. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/increment.md +0 -0
  255. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/intf.md +0 -0
  256. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/jinja.md +0 -0
  257. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/last.md +0 -0
  258. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/line.md +0 -0
  259. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/line_number.md +0 -0
  260. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/max.md +0 -0
  261. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/metaphone.md +0 -0
  262. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/mismatch.md +0 -0
  263. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/no.md +0 -0
  264. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/not.md +0 -0
  265. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/now.md +0 -0
  266. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/percent_unique.md +0 -0
  267. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/pop.md +0 -0
  268. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print.md +0 -0
  269. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print_line.md +0 -0
  270. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/print_queue.md +0 -0
  271. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/random.md +0 -0
  272. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/regex.md +0 -0
  273. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/replace.md +0 -0
  274. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/reset_headers.md +0 -0
  275. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/stdev.md +0 -0
  276. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/stop.md +0 -0
  277. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/string_functions.md +0 -0
  278. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/subtotal.md +0 -0
  279. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/subtract.md +0 -0
  280. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/sum.md +0 -0
  281. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/tally.md +0 -0
  282. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/total_lines.md +0 -0
  283. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/track.md +0 -0
  284. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/types.md +0 -0
  285. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/variables.md +0 -0
  286. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions/variables_and_headers.md +0 -0
  287. {csvpath-0.0.507 → csvpath-0.0.508}/docs/functions.md +0 -0
  288. {csvpath-0.0.507 → csvpath-0.0.508}/docs/grammar.md +0 -0
  289. {csvpath-0.0.507 → csvpath-0.0.508}/docs/headers.md +0 -0
  290. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/ckan-logo-sm.png +0 -0
  291. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/csvpath-icon-sm.png +0 -0
  292. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/csvpath-logo-wordmark-tight-2.svg +0 -0
  293. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-3.svg +0 -0
  294. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-4.svg +0 -0
  295. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-white-on-black-trimmed-padded.png +0 -0
  296. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/logo-wordmark-white-trimmed.png +0 -0
  297. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/marquez-logo-sm.png +0 -0
  298. {csvpath-0.0.507 → csvpath-0.0.508}/docs/images/openlineage-logo-sm.png +0 -0
  299. {csvpath-0.0.507 → csvpath-0.0.508}/docs/paths.md +0 -0
  300. {csvpath-0.0.507 → csvpath-0.0.508}/docs/printing.md +0 -0
  301. {csvpath-0.0.507 → csvpath-0.0.508}/docs/qualifiers.md +0 -0
  302. {csvpath-0.0.507 → csvpath-0.0.508}/docs/references.md +0 -0
  303. {csvpath-0.0.507 → csvpath-0.0.508}/docs/terms.md +0 -0
  304. {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.507
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) ; extra == "smartopen"
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
- if self.csvpaths:
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
  )
@@ -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._account_name}/{self.metadata.uuid_string}.txt"
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()
@@ -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
- path = self._execute_before_script
231
- print(f"transfer script path is: {path}")
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
- # add named_file_name, filename here (and named_paths_name?)
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(path, "w", encoding="utf-8") as file:
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(path, "w", encoding="utf-8") as file:
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 os.path.exists(run_dir):
162
- os.makedirs(run_dir, exist_ok=True)
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 os.path.exists(run_dir):
173
+ if Nos(run_dir).dir_exists():
173
174
  i = 0
174
175
  adir = f"{run_dir}.{i}"
175
- while os.path.exists(adir):
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
- os.makedirs(run_dir, exist_ok=True)
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
- session = boto3.Session(
19
- aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
20
- aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
21
- )
22
- try:
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
- session = boto3.Session(
13
- aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
14
- aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
15
- )
16
- import warnings
17
-
18
- warnings.filterwarnings(
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": session.client("s3")},
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
- session = boto3.Session(
34
- aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
35
- aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"],
36
- )
37
- with open(
38
- self._path, "wb", transport_params={"client": session.client("s3")}
39
- ) as file:
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
- 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"],
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": session.client("s3")}
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.507"
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