csvpath 0.0.598__tar.gz → 0.0.599__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 (393) hide show
  1. {csvpath-0.0.598 → csvpath-0.0.599}/PKG-INFO +39 -36
  2. csvpath-0.0.599/assets/.DS_Store +0 -0
  3. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/config.ini +2 -2
  4. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-local-azure.ini +2 -2
  5. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-local-filesystem-mysql.ini +2 -2
  6. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-local-gcs.ini +6 -7
  7. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-local-s3.ini +2 -2
  8. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-local-sftp.ini +3 -3
  9. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-windows-azure.ini +2 -2
  10. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-windows-gcs.ini +2 -2
  11. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-windows-local.ini +5 -5
  12. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-windows-s3.ini +2 -2
  13. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/jenkins-windows-sftp.ini +3 -3
  14. csvpath-0.0.599/assets/gocd/.DS_Store +0 -0
  15. csvpath-0.0.599/assets/gocd/Mac.goenvironment.json +11 -0
  16. csvpath-0.0.599/assets/gocd/Windows.goenvironment.json +12 -0
  17. csvpath-0.0.599/assets/integrations/.DS_Store +0 -0
  18. {csvpath-0.0.598 → csvpath-0.0.599}/config/config.ini +4 -4
  19. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/csvpath.py +7 -0
  20. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/csvpaths.py +3 -1
  21. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/errors/error_comms.py +30 -17
  22. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/errors/error_manager.py +21 -11
  23. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftpplus/rpc.py +3 -1
  24. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/engine.py +15 -8
  25. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/sql_paths_listener.py +1 -1
  26. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/results_manager.py +12 -1
  27. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/function_factory.py +2 -1
  28. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/dups.py +1 -1
  29. csvpath-0.0.599/csvpath/matching/functions/sql/sql_in.py +115 -0
  30. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/mode_controller.py +7 -1
  31. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/config.py +42 -20
  32. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/config_env.py +12 -2
  33. csvpath-0.0.599/csvpath/util/file_utility.py +30 -0
  34. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/line_spooler.py +21 -9
  35. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/log_utility.py +16 -13
  36. csvpath-0.0.599/csvpath/util/referrer_printer.py +112 -0
  37. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/var_utility.py +116 -6
  38. {csvpath-0.0.598 → csvpath-0.0.599}/pyproject.toml +44 -43
  39. {csvpath-0.0.598 → csvpath-0.0.599}/LICENSE +0 -0
  40. {csvpath-0.0.598 → csvpath-0.0.599}/README.md +0 -0
  41. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/extra-functions.imports +0 -0
  42. {csvpath-0.0.598 → csvpath-0.0.599}/assets/config/function.imports +0 -0
  43. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  44. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/azure.sh +0 -0
  45. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/gcs.sh +0 -0
  46. /csvpath-0.0.598/assets/gocd/mac/gcs-pipeline.gopipeline.json → /csvpath-0.0.599/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  47. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  48. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/local.sh +0 -0
  49. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  50. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/s3.sh +0 -0
  51. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  52. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/mac/sftp.sh +0 -0
  53. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/azure.bat +0 -0
  54. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/gcs.bat +0 -0
  55. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/local.bat +0 -0
  56. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/s3.bat +0 -0
  57. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/sftp.bat +0 -0
  58. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  59. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  60. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  61. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  62. {csvpath-0.0.598 → csvpath-0.0.599}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  63. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  64. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  65. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  66. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  67. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  68. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  69. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sqlite/csvpath +0 -0
  70. {csvpath-0.0.598 → csvpath-0.0.599}/assets/integrations/sqlite/schema.sql +0 -0
  71. {csvpath-0.0.598 → csvpath-0.0.599}/config/env.json +0 -0
  72. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/__init__.py +0 -0
  73. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/__init__.py +0 -0
  74. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/asker.py +0 -0
  75. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/cli.py +0 -0
  76. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/const.py +0 -0
  77. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/debug_config.py +0 -0
  78. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/drill_down.py +0 -0
  79. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/function_describer.py +0 -0
  80. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/function_lister.py +0 -0
  81. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/cli/selecter.py +0 -0
  82. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/__init__.py +0 -0
  83. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/errors/error.py +0 -0
  84. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/errors/error_collector.py +0 -0
  85. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/file_activator.py +0 -0
  86. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/file_describer.py +0 -0
  87. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/file_manager.py +0 -0
  88. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/file_metadata.py +0 -0
  89. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/file_registrar.py +0 -0
  90. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/files_activation_listener.py +0 -0
  91. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/files_listener.py +0 -0
  92. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  93. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  94. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  95. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  96. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  97. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/event.py +0 -0
  98. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/event_result.py +0 -0
  99. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  100. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/job.py +0 -0
  101. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  102. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  103. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  104. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  105. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/run.py +0 -0
  106. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  107. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/run_state.py +0 -0
  108. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/ol/sender.py +0 -0
  109. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  110. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  111. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  112. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  113. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  114. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  115. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  116. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  117. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  118. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  119. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  120. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
  121. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
  122. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
  123. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/slack/event.py +0 -0
  124. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/slack/sender.py +0 -0
  125. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  126. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  127. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  128. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  129. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/tables.py +0 -0
  130. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sql/updates.py +0 -0
  131. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  132. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  133. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  134. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  135. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  136. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/listener.py +0 -0
  137. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/metadata.py +0 -0
  138. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/paths/paths_describer.py +0 -0
  139. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/paths/paths_listener.py +0 -0
  140. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/paths/paths_manager.py +0 -0
  141. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/paths/paths_metadata.py +0 -0
  142. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/paths/paths_registrar.py +0 -0
  143. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/registrar.py +0 -0
  144. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  145. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  146. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  147. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  148. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/readers/readers.py +0 -0
  149. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/result.py +0 -0
  150. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/result_file_reader.py +0 -0
  151. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/result_metadata.py +0 -0
  152. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/result_registrar.py +0 -0
  153. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/result_serializer.py +0 -0
  154. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/results_metadata.py +0 -0
  155. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/results/results_registrar.py +0 -0
  156. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/run/run_listener_stdout.py +0 -0
  157. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/run/run_metadata.py +0 -0
  158. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/run/run_registrar.py +0 -0
  159. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/managers/test_listener.py +0 -0
  160. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/__init__.py +0 -0
  161. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/__init__.py +0 -0
  162. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/args.py +0 -0
  163. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/args_helper.py +0 -0
  164. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/all.py +0 -0
  165. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/andf.py +0 -0
  166. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/any.py +0 -0
  167. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/between.py +0 -0
  168. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/empty.py +0 -0
  169. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/exists.py +0 -0
  170. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/inf.py +0 -0
  171. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/no.py +0 -0
  172. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/notf.py +0 -0
  173. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/orf.py +0 -0
  174. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/boolean/yes.py +0 -0
  175. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/count.py +0 -0
  176. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  177. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/count_headers.py +0 -0
  178. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/count_lines.py +0 -0
  179. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/count_scans.py +0 -0
  180. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/counter.py +0 -0
  181. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/every.py +0 -0
  182. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/has_matches.py +0 -0
  183. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/increment.py +0 -0
  184. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/tally.py +0 -0
  185. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/counting/total_lines.py +0 -0
  186. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/dates/now.py +0 -0
  187. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/dates/part.py +0 -0
  188. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/dates/roll.py +0 -0
  189. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/function.py +0 -0
  190. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/function_finder.py +0 -0
  191. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/function_focus.py +0 -0
  192. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/append.py +0 -0
  193. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/collect.py +0 -0
  194. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  195. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/end.py +0 -0
  196. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/header_name.py +0 -0
  197. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  198. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/headers.py +0 -0
  199. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  200. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/insert.py +0 -0
  201. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/line_before.py +0 -0
  202. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/mismatch.py +0 -0
  203. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/remove.py +0 -0
  204. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/rename.py +0 -0
  205. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/replace.py +0 -0
  206. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  207. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/json/jsonpath.py +0 -0
  208. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/advance.py +0 -0
  209. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/after_blank.py +0 -0
  210. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/first.py +0 -0
  211. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/first_line.py +0 -0
  212. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/last.py +0 -0
  213. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/lines/stop.py +0 -0
  214. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/above.py +0 -0
  215. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/add.py +0 -0
  216. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/divide.py +0 -0
  217. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/equals.py +0 -0
  218. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/intf.py +0 -0
  219. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/mod.py +0 -0
  220. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/multiply.py +0 -0
  221. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/odd.py +0 -0
  222. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/round.py +0 -0
  223. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/subtotal.py +0 -0
  224. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/subtract.py +0 -0
  225. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/math/sum.py +0 -0
  226. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  227. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/misc/importf.py +0 -0
  228. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/misc/parquet.py +0 -0
  229. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/misc/random.py +0 -0
  230. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/print/jinjaf.py +0 -0
  231. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/print/print_line.py +0 -0
  232. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/print/print_queue.py +0 -0
  233. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/print/printf.py +0 -0
  234. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/print/table.py +0 -0
  235. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/stats/minf.py +0 -0
  236. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/stats/nminmax.py +0 -0
  237. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/stats/percent.py +0 -0
  238. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  239. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/stats/stdev.py +0 -0
  240. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/alter.py +0 -0
  241. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/caps.py +0 -0
  242. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/concat.py +0 -0
  243. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/contains.py +0 -0
  244. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/format.py +0 -0
  245. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/length.py +0 -0
  246. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/lower.py +0 -0
  247. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/metaphone.py +0 -0
  248. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/regex.py +0 -0
  249. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/starts_with.py +0 -0
  250. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/strip.py +0 -0
  251. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/substring.py +0 -0
  252. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/strings/upper.py +0 -0
  253. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/testing/debug.py +0 -0
  254. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/__init__.py +0 -0
  255. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/blank.py +0 -0
  256. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/boolean.py +0 -0
  257. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/datatype.py +0 -0
  258. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/datef.py +0 -0
  259. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/decimal.py +0 -0
  260. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/email.py +0 -0
  261. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/nonef.py +0 -0
  262. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/string.py +0 -0
  263. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/type.py +0 -0
  264. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/url.py +0 -0
  265. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/types/wildcard.py +0 -0
  266. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/validity/fail.py +0 -0
  267. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/validity/failed.py +0 -0
  268. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/validity/line.py +0 -0
  269. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/validity/matches.py +0 -0
  270. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  271. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/clear.py +0 -0
  272. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/get.py +0 -0
  273. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/index_of.py +0 -0
  274. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/pushpop.py +0 -0
  275. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/put.py +0 -0
  276. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/slice.py +0 -0
  277. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/sort.py +0 -0
  278. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/track.py +0 -0
  279. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/variables/variables.py +0 -0
  280. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/functions/xml/xpath.py +0 -0
  281. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/lark_parser.py +0 -0
  282. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/lark_transformer.py +0 -0
  283. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/matcher.py +0 -0
  284. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/__init__.py +0 -0
  285. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/equality.py +0 -0
  286. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/expression.py +0 -0
  287. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/header.py +0 -0
  288. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/matchable.py +0 -0
  289. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/qualified.py +0 -0
  290. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/reference.py +0 -0
  291. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/term.py +0 -0
  292. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/productions/variable.py +0 -0
  293. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/exceptions.py +0 -0
  294. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/expression_encoder.py +0 -0
  295. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/expression_utility.py +0 -0
  296. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/lark_print_parser.py +0 -0
  297. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/parquet_utility.py +0 -0
  298. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/print_parser.py +0 -0
  299. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/matching/util/runtime_data_collector.py +0 -0
  300. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/error_mode.py +0 -0
  301. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/explain_mode.py +0 -0
  302. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/files_mode.py +0 -0
  303. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/logic_mode.py +0 -0
  304. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/print_mode.py +0 -0
  305. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/return_mode.py +0 -0
  306. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/run_mode.py +0 -0
  307. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/source_mode.py +0 -0
  308. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/transfer_mode.py +0 -0
  309. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/unmatched_mode.py +0 -0
  310. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/modes/validation_mode.py +0 -0
  311. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/scanning/__init__.py +0 -0
  312. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/scanning/scanner2.py +0 -0
  313. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/scanning/scanner2_parser.py +0 -0
  314. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/scanning/scanner2_transformer.py +0 -0
  315. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_data_reader.py +0 -0
  316. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_data_writer.py +0 -0
  317. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  318. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  319. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_nos.py +0 -0
  320. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_utils.py +0 -0
  321. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  322. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/backend_check.py +0 -0
  323. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/box.py +0 -0
  324. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/cache.py +0 -0
  325. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/caser.py +0 -0
  326. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/class_loader.py +0 -0
  327. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/code.py +0 -0
  328. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/config_exception.py +0 -0
  329. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/date_util.py +0 -0
  330. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/exceptions.py +0 -0
  331. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/file_info.py +0 -0
  332. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/file_readers.py +0 -0
  333. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/file_writers.py +0 -0
  334. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  335. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  336. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  337. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  338. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_nos.py +0 -0
  339. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_utils.py +0 -0
  340. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  341. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/hasher.py +0 -0
  342. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/http/http_data_reader.py +0 -0
  343. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/intermediary.py +0 -0
  344. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/json/json_data_reader.py +0 -0
  345. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/json/json_reader_helper.py +0 -0
  346. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/last_line_stats.py +0 -0
  347. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/line_counter.py +0 -0
  348. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/line_monitor.py +0 -0
  349. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/metadata_parser.py +0 -0
  350. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/nos.py +0 -0
  351. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/pandas_data_reader.py +0 -0
  352. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/path_util.py +0 -0
  353. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/printer.py +0 -0
  354. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/py_file_utility.py +0 -0
  355. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/files_reference_finder_2.py +0 -0
  356. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  357. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/files_tools/range_finder.py +0 -0
  358. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/ref_utils.py +0 -0
  359. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_exceptions.py +0 -0
  360. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_grammar.py +0 -0
  361. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  362. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_parser.py +0 -0
  363. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_results.py +0 -0
  364. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/reference_transformer.py +0 -0
  365. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_reference_finder_2.py +0 -0
  366. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/data_finder.py +0 -0
  367. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/date_filter.py +0 -0
  368. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  369. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/path_filter.py +0 -0
  370. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  371. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/token_filters.py +0 -0
  372. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  373. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/references/tools/date_completer.py +0 -0
  374. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/run_home_maker.py +0 -0
  375. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_data_reader.py +0 -0
  376. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_data_writer.py +0 -0
  377. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  378. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  379. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_nos.py +0 -0
  380. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_utils.py +0 -0
  381. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  382. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_config.py +0 -0
  383. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  384. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  385. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  386. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  387. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_nos.py +0 -0
  388. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_walk.py +0 -0
  389. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  390. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/sqliter.py +0 -0
  391. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/template_util.py +0 -0
  392. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  393. {csvpath-0.0.598 → csvpath-0.0.599}/csvpath/util/xlsx/xlsx_reader_helper.py +0 -0
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: csvpath
3
- Version: 0.0.598
3
+ Version: 0.0.599
4
4
  Summary: CsvPath Framework is a data preboarding automation library for receiving, validating, and tracking CSV, Excel, JSONL and other tabular data files before they can corrupt downstream data consumers.
5
+ License-File: LICENSE
5
6
  Author: David Kershaw
6
7
  Author-email: info@csvpath.org
7
8
  Requires-Python: >3.10,<4.0
@@ -13,6 +14,7 @@ Classifier: Programming Language :: Python :: 3
13
14
  Classifier: Programming Language :: Python :: 3.11
14
15
  Classifier: Programming Language :: Python :: 3.12
15
16
  Classifier: Programming Language :: Python :: 3.13
17
+ Classifier: Programming Language :: Python :: 3.14
16
18
  Classifier: Topic :: File Formats
17
19
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
18
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
@@ -21,40 +23,41 @@ Classifier: Topic :: Software Development :: Testing
21
23
  Classifier: Topic :: Text Processing
22
24
  Classifier: Topic :: Utilities
23
25
  Provides-Extra: pandas
24
- Requires-Dist: azure-storage-blob (>=12.24.1,<13.0.0)
25
- Requires-Dist: boto3 (>=1.35.91,<2.0.0)
26
- Requires-Dist: ckanapi (>=4.8,<5.0)
27
- Requires-Dist: email-validator (>=2.2.0,<3.0.0)
28
- Requires-Dist: google-cloud-storage (>=3.1.0,<4.0.0)
29
- Requires-Dist: inflect (>=7.4.0,<8.0.0)
30
- Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
31
- Requires-Dist: jsonlines (>=4.0.0,<5.0.0)
32
- Requires-Dist: jsonpath-ng (>=1.7.0,<2.0.0)
33
- Requires-Dist: jsonpickle (>=4.1.1,<5.0.0)
34
- Requires-Dist: lark (>=1.2.2,<2.0.0)
35
- Requires-Dist: lxml (>=6.0.2,<7.0.0)
36
- Requires-Dist: marquez-python (>=0.50.0,<0.51.0)
37
- Requires-Dist: metaphone (>=0.6,<0.7)
38
- Requires-Dist: mysqlclient (>=2.2.7,<3.0.0)
39
- Requires-Dist: openlineage-python (>=1.25.0,<2.0.0)
40
- Requires-Dist: opentelemetry-distro[otlp] (>=0.50b0,<0.51)
41
- Requires-Dist: pandas (>=2.2.2,<3.0.0) ; extra == "pandas"
42
- Requires-Dist: paramiko (>=3.5.0,<4.0.0)
43
- Requires-Dist: pdoc (>=15.0.1,<16.0.0)
44
- Requires-Dist: prompt-toolkit (>=3.0.50,<4.0.0)
45
- Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0)
46
- Requires-Dist: pyarrow (>=23.0.1,<24.0.0)
47
- Requires-Dist: pydantic (>=2.12.5,<3.0.0)
48
- Requires-Dist: pyjson5 (>=2.0.0,<3.0.0)
49
- Requires-Dist: pylightxl (>=1.61,<2.0)
50
- Requires-Dist: pytest (>=8.3.3,<9.0.0)
51
- Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
52
- Requires-Dist: pytz (>=2024.2,<2025.0)
53
- Requires-Dist: requests (>=2.32.3,<3.0.0)
54
- Requires-Dist: smart-open[all] (>=7.1.0,<8.0.0)
55
- Requires-Dist: sqlalchemy (>=2.0.38,<3.0.0)
56
- Requires-Dist: tabulate (>=0.9.0,<0.10.0)
57
- Requires-Dist: validators (>=0.34.0,<0.35.0)
26
+ Requires-Dist: azure-storage-blob (==12.28.0)
27
+ Requires-Dist: boto3 (==1.42.65)
28
+ Requires-Dist: ckanapi (==4.9)
29
+ Requires-Dist: email-validator (==2.3.0)
30
+ Requires-Dist: google-cloud-storage (==3.9.0)
31
+ Requires-Dist: inflect (==7.5.0)
32
+ Requires-Dist: jinja2 (==3.1.6)
33
+ Requires-Dist: jsonlines (==4.0.0)
34
+ Requires-Dist: jsonpath-ng (==1.8.0)
35
+ Requires-Dist: jsonpickle (==4.1.1)
36
+ Requires-Dist: lark (==1.3.1)
37
+ Requires-Dist: lxml (==6.0.2)
38
+ Requires-Dist: marquez-python (==0.50.0)
39
+ Requires-Dist: metaphone (==0.6)
40
+ Requires-Dist: mysqlclient (==2.2.8)
41
+ Requires-Dist: openlineage-python (==1.45.0)
42
+ Requires-Dist: opentelemetry-distro[otlp] (==0.50b0)
43
+ Requires-Dist: pandas (==2.3.3) ; extra == "pandas"
44
+ Requires-Dist: paramiko (==3.5.1)
45
+ Requires-Dist: pdoc (==15.0.4)
46
+ Requires-Dist: prompt-toolkit (==3.0.52)
47
+ Requires-Dist: psutil (>=7.2.2,<8.0.0)
48
+ Requires-Dist: psycopg2-binary (==2.9.11)
49
+ Requires-Dist: pyarrow (==23.0.1)
50
+ Requires-Dist: pydantic (==2.12.5)
51
+ Requires-Dist: pyjson5 (==2.0.0)
52
+ Requires-Dist: pylightxl (==1.61)
53
+ Requires-Dist: pytest (==8.4.2)
54
+ Requires-Dist: python-dateutil (==2.9.0.post0)
55
+ Requires-Dist: pytz (==2024.2)
56
+ Requires-Dist: requests (==2.32.5)
57
+ Requires-Dist: smart-open[all] (==7.5.1)
58
+ Requires-Dist: sqlalchemy (==2.0.48)
59
+ Requires-Dist: tabulate (==0.9.0)
60
+ Requires-Dist: validators (==0.34.0)
58
61
  Project-URL: Csvpath.org, https://www.csvpath.org
59
62
  Project-URL: Github, https://github.com/csvpath/csvpath.git
60
63
  Description-Content-Type: text/markdown
Binary file
@@ -81,8 +81,8 @@ slack.results = from csvpath.managers.integrations.slack.sender import SlackSend
81
81
  [gcs]
82
82
 
83
83
  [sftp]
84
- server = 192.168.1.152
85
- port = 2022
84
+ server = SFTP_SERVER
85
+ port = SFTP_PORT
86
86
  username = python
87
87
  password = hangzhou
88
88
 
@@ -74,8 +74,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
74
74
  [gcs]
75
75
 
76
76
  [sftp]
77
- server = 192.168.1.152
78
- port = 2022
77
+ server = SFTP_SERVER
78
+ port = SFTP_PORT
79
79
  username = python
80
80
  password = hangzhou
81
81
 
@@ -77,8 +77,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
77
77
  #
78
78
 
79
79
  [sftp]
80
- server = 192.168.1.152
81
- port = 2022
80
+ server = SFTP_SERVER
81
+ port = SFTP_PORT
82
82
  username = python
83
83
  password = hangzhou
84
84
 
@@ -31,7 +31,7 @@ path = cache
31
31
  use_cache = no
32
32
 
33
33
  [functions]
34
- imports =
34
+ imports =
35
35
 
36
36
  [results]
37
37
  archive = tmp/gcs/archive
@@ -44,7 +44,7 @@ allow_http_files = True
44
44
  allow_local_files = True
45
45
 
46
46
  [listeners]
47
- groups =
47
+ groups = default
48
48
  sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
49
49
  sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
50
50
  default.file = from csvpath.managers.files.files_listener import FilesListener
@@ -74,12 +74,11 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
74
74
  [gcs]
75
75
 
76
76
  [sftp]
77
- server = 192.168.1.152
78
- port = 2022
77
+ server = SFTP_SERVER
78
+ port = SFTP_PORT
79
79
  username = python
80
80
  password = hangzhou
81
81
 
82
-
83
82
  [sqlite]
84
83
  db = archive/csvpath.db
85
84
 
@@ -91,7 +90,7 @@ port = SFTPPLUS_PORT
91
90
  admin_username = SFTPPLUS_ADMIN_USERNAME
92
91
  admin_password = SFTPPLUS_ADMIN_PASSWORD
93
92
  api_url = https://. . . :10020/json
94
- scripts_dir =
93
+ scripts_dir =
95
94
  execute_timeout = 300
96
95
 
97
96
  [ckan]
@@ -106,5 +105,5 @@ timeout = 5
106
105
  verify = False
107
106
 
108
107
  [slack]
109
- webhook_url =
108
+ webhook_url =
110
109
 
@@ -74,8 +74,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
74
74
  [gcs]
75
75
 
76
76
  [sftp]
77
- server = 192.168.1.152
78
- port = 2022
77
+ server = SFTP_SERVER
78
+ port = SFTP_PORT
79
79
  username = python
80
80
  password = hangzhou
81
81
 
@@ -31,7 +31,7 @@ imports =
31
31
  archive = tmp/sftp/archive
32
32
 
33
33
  [inputs]
34
- files = sftp://192.168.1.152:2022/mac/inputs/named_files
34
+ files = sftp://{SFTP_SERVER}:{SFTP_PORT}/mac/inputs/named_files
35
35
  csvpaths = tmp/sftp/inputs/named_paths
36
36
  on_unmatched_file_fingerprints = halt
37
37
  allow_http_files = True
@@ -78,8 +78,8 @@ shell = /bin/bash
78
78
  [gcs]
79
79
 
80
80
  [sftp]
81
- server = 192.168.1.152
82
- port = 2022
81
+ server = SFTP_SERVER
82
+ port = SFTP_PORT
83
83
  username = python
84
84
  password = hangzhou
85
85
 
@@ -72,8 +72,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
72
72
  run_scripts=yes
73
73
 
74
74
  [sftp]
75
- server = 192.168.1.152
76
- port = 2022
75
+ server = SFTP_SERVER
76
+ port = SFTP_PORT
77
77
  username = python
78
78
  password = hangzhou
79
79
 
@@ -111,8 +111,8 @@ slack.results = from csvpath.managers.integrations.slack.sender import SlackSend
111
111
  #
112
112
 
113
113
  [sftp]
114
- server = 192.168.1.152
115
- port = 2022
114
+ server = SFTP_SERVER
115
+ port = SFTP_PORT
116
116
  username = python
117
117
  password = hangzhou
118
118
 
@@ -26,7 +26,7 @@ path = cache
26
26
  use_cache = no
27
27
 
28
28
  [functions]
29
- imports =
29
+ imports =
30
30
 
31
31
  [results]
32
32
  archive = tmp\local\archive
@@ -69,8 +69,8 @@ slack.results = from csvpath.managers.integrations.slack.sender import SlackSend
69
69
  [gcs]
70
70
 
71
71
  [sftp]
72
- server = 192.168.1.152
73
- port = 2022
72
+ server = SFTP_SERVER
73
+ port = SFTP_PORT
74
74
  username = python
75
75
  password = hangzhou
76
76
 
@@ -85,7 +85,7 @@ port = SFTPPLUS_PORT
85
85
  admin_username = SFTPPLUS_ADMIN_USERNAME
86
86
  admin_password = SFTPPLUS_ADMIN_PASSWORD
87
87
  api_url = https://. . . :10020/json
88
- scripts_dir =
88
+ scripts_dir =
89
89
  execute_timeout = 300
90
90
 
91
91
  [ckan]
@@ -100,7 +100,7 @@ timeout = 5
100
100
  verify = False
101
101
 
102
102
  [slack]
103
- webhook_url =
103
+ webhook_url =
104
104
 
105
105
  [scripts]
106
106
  run_scripts = yes
@@ -74,8 +74,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
74
74
  [gcs]
75
75
 
76
76
  [sftp]
77
- server = 192.168.1.152
78
- port = 2022
77
+ server = SFTP_SERVER
78
+ port = SFTP_PORT
79
79
  username = python
80
80
  password = hangzhou
81
81
 
@@ -40,7 +40,7 @@ imports =
40
40
  archive = tmp\sftp\archive
41
41
 
42
42
  [inputs]
43
- files = sftp://192.168.1.152:2022/windows/inputs\named_files
43
+ files = sftp://{SFTP_SERVER}:{SFTP_PORT}/windows/inputs/named_files
44
44
  csvpaths = tmp\sftp\inputs\named_paths
45
45
  on_unmatched_file_fingerprints = halt
46
46
  allow_http_files=True
@@ -112,8 +112,8 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
112
112
  #
113
113
 
114
114
  [sftp]
115
- server = 192.168.1.152
116
- port = 2022
115
+ server = SFTP_SERVER
116
+ port = SFTP_PORT
117
117
  username = python
118
118
  password = hangzhou
119
119
 
Binary file
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "Mac",
3
+ "pipelines": [
4
+ "azure-pipeline",
5
+ "google-pipeline",
6
+ "s3-pipeline",
7
+ "sftp-pipeline"
8
+ ],
9
+ "agents": []
10
+ }
11
+
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "Windows",
3
+ "pipelines": [
4
+ "windows-azure",
5
+ "windows-gcs",
6
+ "windows-s3",
7
+ "windows-sftp",
8
+ "windows-local"
9
+ ],
10
+ "agents": []
11
+ }
12
+
@@ -35,7 +35,7 @@ path = cache
35
35
  use_cache = yes
36
36
 
37
37
  [functions]
38
- imports =
38
+ imports =
39
39
 
40
40
  [results]
41
41
  archive = tmp/local/archive
@@ -85,7 +85,7 @@ slack.results = from csvpath.managers.integrations.slack.sender import SlackSend
85
85
  [gcs]
86
86
 
87
87
  [sftp]
88
- server = 192.168.1.152
88
+ server = SFTP_SERVER
89
89
  port = 2022
90
90
  username = python
91
91
  password = hangzhou
@@ -105,7 +105,7 @@ port = SFTPPLUS_PORT
105
105
  admin_username = SFTPPLUS_ADMIN_USERNAME
106
106
  admin_password = SFTPPLUS_ADMIN_PASSWORD
107
107
  api_url = https://. . . :10020/json
108
- scripts_dir =
108
+ scripts_dir =
109
109
  execute_timeout = 300
110
110
 
111
111
  [ckan]
@@ -120,7 +120,7 @@ timeout = 5
120
120
  verify = False
121
121
 
122
122
  [slack]
123
- webhook_url =
123
+ webhook_url =
124
124
 
125
125
  [scripts]
126
126
  run_scripts = yes
@@ -54,6 +54,13 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
54
54
  skip_blank_lines=True,
55
55
  print_default=True,
56
56
  # config=None,
57
+ #
58
+ # atm, we don't use this error manager reference. instead we make
59
+ # an error manager for this csvpath, and if we have a csvpaths we
60
+ # add its error_manager as an internal listener for error events
61
+ #
62
+ # we can refactor this reference away
63
+ #
57
64
  error_manager=None,
58
65
  project_context="no_project_context",
59
66
  project="no_project_name",
@@ -422,6 +422,9 @@ Cache: {cache}
422
422
  #
423
423
  # config=None,
424
424
  print_default=self.print_default,
425
+ #
426
+ # we don't use this error manager reference atm.
427
+ #
425
428
  error_manager=self.error_manager,
426
429
  project=self.project,
427
430
  project_context=self.project_context,
@@ -545,7 +548,6 @@ Cache: {cache}
545
548
  box = Box()
546
549
  ds = []
547
550
  for k, v in box.get_my_stuff().items():
548
- self.logger.debug(f"csvpaths.wrapping up: {k}: {v}")
549
551
  if hasattr(v, "close"):
550
552
  ds.append(k)
551
553
  for _ in ds:
@@ -1,3 +1,6 @@
1
+
2
+ import weakref
3
+
1
4
  from typing import Any, List
2
5
  from csvpath.util.config import OnError
3
6
  from csvpath.modes.error_mode import ErrorMode
@@ -22,32 +25,42 @@ class ErrorCommunications:
22
25
  """
23
26
 
24
27
  def __init__(self, csvpath=None, csvpaths=None) -> None:
25
- self._csvpath = csvpath
26
- self._csvpaths = csvpaths
27
28
  if not csvpath and not csvpaths:
28
29
  raise ValueError("Must have either a CsvPath or CsvPaths instance")
30
+ if csvpath and csvpaths:
31
+ raise ValueError("Cannot have both a csvpath and csvpaths handling the same errors")
32
+ self._csvpath = None if csvpath is None else weakref.ref(csvpath)
33
+ self._csvpaths = None if csvpaths is None else weakref.ref(csvpaths)
34
+
35
+ @property
36
+ def csvpath(self):
37
+ return None if self._csvpath is None else self._csvpath()
38
+
39
+ @property
40
+ def csvpaths(self):
41
+ return None if self._csvpaths is None else self._csvpaths()
29
42
 
30
43
  def do_i_quiet(self) -> bool:
31
44
  return self.in_policy(OnError.QUIET.value)
32
45
 
33
46
  def do_i_raise(self) -> bool:
34
- if self._csvpath and self._csvpath.raise_validation_errors is not None:
35
- return self._csvpath.raise_validation_errors
47
+ if self.csvpath and self.csvpath.raise_validation_errors is not None:
48
+ return self.csvpath.raise_validation_errors
36
49
  return self.in_policy(OnError.RAISE.value)
37
50
 
38
51
  def do_i_collect(self) -> bool:
39
- if self._csvpath and self._csvpath.collect_validation_errors is not None:
40
- return self._csvpath.collect_validation_errors
52
+ if self.csvpath and self.csvpath.collect_validation_errors is not None:
53
+ return self.csvpath.collect_validation_errors
41
54
  return self.in_policy(OnError.COLLECT.value)
42
55
 
43
56
  def do_i_print(self) -> bool:
44
- if self._csvpath and self._csvpath.print_validation_errors is not None:
45
- return self._csvpath.print_validation_errors
57
+ if self.csvpath and self.csvpath.print_validation_errors is not None:
58
+ return self.csvpath.print_validation_errors
46
59
  return self.in_policy(OnError.PRINT.value)
47
60
 
48
61
  def do_i_print_expanded(self) -> bool:
49
62
  ret = False
50
- c = self._csvpath if self._csvpath is not None else self._csvpaths
63
+ c = self.csvpath if self.csvpath is not None else self.csvpaths
51
64
  if c is not None:
52
65
  ret = (
53
66
  c.config.get(
@@ -55,7 +68,7 @@ class ErrorCommunications:
55
68
  )
56
69
  == ErrorMode.FULL
57
70
  )
58
- if self._csvpath and self._csvpath.error_mode == ErrorMode.FULL:
71
+ if self.csvpath and self.csvpath.error_mode == ErrorMode.FULL:
59
72
  ret = True
60
73
  return ret
61
74
 
@@ -63,8 +76,8 @@ class ErrorCommunications:
63
76
  #
64
77
  # stop is having problems. copying raise, which works fine.
65
78
  #
66
- if self._csvpath and self._csvpath.stop_on_validation_errors is not None:
67
- return self._csvpath.stop_on_validation_errors
79
+ if self.csvpath and self.csvpath.stop_on_validation_errors is not None:
80
+ return self.csvpath.stop_on_validation_errors
68
81
  return self.in_policy(OnError.STOP.value)
69
82
  """
70
83
  mode = None
@@ -83,11 +96,11 @@ class ErrorCommunications:
83
96
  """
84
97
 
85
98
  def do_i_fail(self) -> bool:
86
- if self._csvpath and self._csvpath.fail_on_validation_errors is not None:
87
- return self._csvpath.fail_on_validation_errors
99
+ if self.csvpath and self.csvpath.fail_on_validation_errors is not None:
100
+ return self.csvpath.fail_on_validation_errors
88
101
  return self.in_policy(OnError.FAIL.value)
89
102
 
90
103
  def in_policy(self, v) -> bool:
91
- if self._csvpath:
92
- return v in self._csvpath.config.csvpath_errors_policy
93
- return v in self._csvpaths.config.csvpaths_errors_policy
104
+ if self.csvpath:
105
+ return v in self.csvpath.config.csvpath_errors_policy
106
+ return v in self.csvpaths.config.csvpaths_errors_policy
@@ -1,4 +1,6 @@
1
1
  import os
2
+ import weakref
3
+
2
4
  from typing import Any
3
5
  from datetime import datetime, timezone
4
6
  from csvpath.util.config import OnError
@@ -16,7 +18,7 @@ class ErrorManager(Registrar, Listener):
16
18
  """creates errors uses the csvpaths's or csvpath's error policy to handle them."""
17
19
 
18
20
  def __init__(self, *, csvpaths=None, csvpath=None, error_collector=None):
19
- self.csvpath = csvpath
21
+ self._csvpath = None if csvpath is None else weakref.ref(csvpath)
20
22
  self._csvpaths = None
21
23
  if csvpaths is not None:
22
24
  self.csvpaths = csvpaths
@@ -24,7 +26,7 @@ class ErrorManager(Registrar, Listener):
24
26
  self.csvpaths = csvpath.csvpaths
25
27
  if self.csvpath is None and self.csvpaths is None:
26
28
  raise ValueError("CsvPaths and/or CsvPath must be provided")
27
- self._collector = csvpath if csvpath else csvpaths
29
+ #self._collector = csvpath if csvpath else csvpaths
28
30
  #
29
31
  #
30
32
  #
@@ -45,6 +47,14 @@ class ErrorManager(Registrar, Listener):
45
47
  self.error_metrics = None
46
48
  self.full_format = None
47
49
 
50
+ @property
51
+ def collector(self):
52
+ return self.csvpath if self.csvpath else self.csvpaths
53
+
54
+ @property
55
+ def csvpath(self):
56
+ return None if self._csvpath is None else self._csvpath()
57
+
48
58
  @property
49
59
  def csvpaths(self):
50
60
  return self._csvpaths
@@ -190,7 +200,7 @@ class ErrorManager(Registrar, Listener):
190
200
  #
191
201
  #
192
202
  #
193
- self._collector.logger.error(e)
203
+ self.collector.logger.error(e)
194
204
  if self.full_format is None:
195
205
  self.full_format = (
196
206
  "{time}:{file}:{line}:{paths}:{instance}:{chain}: {message}"
@@ -249,26 +259,26 @@ class ErrorManager(Registrar, Listener):
249
259
  # but not in the csvpath modes. both of these things could change.
250
260
  #
251
261
  if self.ecoms.do_i_quiet():
252
- self._collector.logger.error(
262
+ self.collector.logger.error(
253
263
  f"Qt {mdata.uuid_string}: message: {mdata.message}"
254
264
  )
255
- self._collector.logger.error(
265
+ self.collector.logger.error(
256
266
  f"Qt {mdata.uuid_string}: named_paths_name: {mdata.named_paths_name}"
257
267
  )
258
- self._collector.logger.error(
268
+ self.collector.logger.error(
259
269
  f"Qt {mdata.uuid_string}: path identity: {mdata.identity}"
260
270
  )
261
- self._collector.logger.error(
271
+ self.collector.logger.error(
262
272
  f"Qt {mdata.uuid_string}: file: {mdata.filename}"
263
273
  )
264
- self._collector.logger.error(
274
+ self.collector.logger.error(
265
275
  f"Qt {mdata.uuid_string}: line: {mdata.line_count}"
266
276
  )
267
- self._collector.logger.error(
277
+ self.collector.logger.error(
268
278
  f"Qt {mdata.uuid_string}: source: {mdata.source}"
269
279
  )
270
280
  else:
271
- self._collector.logger.error(f"{mdata}")
281
+ self.collector.logger.error(f"{mdata}")
272
282
  #
273
283
  #
274
284
  #
@@ -277,7 +287,7 @@ class ErrorManager(Registrar, Listener):
277
287
  # if we are held by a CsvPath we are the CsvPath's error listener so we're
278
288
  # pushing the error back to our parent's public access interface.
279
289
  #
280
- self._collector.collect_error(mdata)
290
+ self.collector.collect_error(mdata)
281
291
  if self.ecoms.do_i_stop() is True:
282
292
  if self.csvpath:
283
293
  self.csvpath.stopped = True
@@ -27,7 +27,7 @@ class Rpc:
27
27
  section="sftpplus",
28
28
  name="api_url",
29
29
  default="https://localhost:10020/json",
30
- config=self.csvpaths.config,
30
+ config=self.csvpaths.config
31
31
  )
32
32
  result = self.send("login", username=self.username, password=self.password)
33
33
  self._session_id = result["session_id"]
@@ -37,6 +37,7 @@ class Rpc:
37
37
  if self._username is None:
38
38
  self._username = VarUtility.get(
39
39
  section="sftpplus", name="admin_username", env="SFTPPLUS_ADMIN_USERNAME"
40
+ , config=self.csvpaths.config
40
41
  )
41
42
  return self._username
42
43
 
@@ -45,6 +46,7 @@ class Rpc:
45
46
  if self._password is None:
46
47
  self._password = VarUtility.get(
47
48
  section="sftpplus", name="admin_password", env="SFTPPLUS_ADMIN_PASSWORD"
49
+ , config=self.csvpaths.config
48
50
  )
49
51
  return self._password
50
52
 
@@ -1,30 +1,37 @@
1
1
  from sqlalchemy import create_engine, Engine
2
2
 
3
- # from sqlalchemy.orm import sessionmaker
4
3
  from csvpath.util.config import Config
5
4
  from csvpath.util.box import Box
6
5
 
7
6
 
8
7
  class Db:
9
8
  @classmethod
10
- def get(self, config: Config) -> Engine:
9
+ def get(cls, config: Config) -> Engine:
10
+ dialect = config.get(section="sql", name="dialect")
11
+ conn = config.get(section="sql", name="connection_string")
12
+ return cls.get_engine(conn=conn, dialect=dialect)
13
+
14
+ @classmethod
15
+ def get_engine(cls, *, conn:str, dialect:str="sqlite") -> Engine:
11
16
  box = Box()
12
17
  engine = box.get(key=Box.SQL_ENGINE)
13
18
  if engine is None:
14
- dialect = config.get(section="sql", name="dialect")
15
- c_str = config.get(section="sql", name="connection_string")
19
+ #
20
+ # atm there's nothing different about the dialects, but we'll
21
+ # leave the ifs just for docs purposes.
22
+ #
16
23
  if dialect == "sqlite":
17
24
  # sqlite:///example.db
18
- engine = create_engine(c_str)
25
+ engine = create_engine(conn)
19
26
  elif dialect == "postgres":
20
27
  # postgresql+psycopg2://user:password@localhost/dbname
21
- engine = create_engine(c_str)
28
+ engine = create_engine(conn)
22
29
  elif dialect == "mysql":
23
30
  # mysql+pymysql://user:password@localhost/dbname
24
- engine = create_engine(c_str)
31
+ engine = create_engine(conn)
25
32
  elif dialect == "sql_server":
26
33
  # mssql+pyodbc://user:password@localhost/dbname
27
- engine = create_engine(c_str)
34
+ engine = create_engine(conn)
28
35
  else:
29
36
  raise ValueError("Unknown RDBMS dialect %s", dialect)
30
37
  box.add(Box.SQL_ENGINE, engine)