csvpath 0.0.599__tar.gz → 0.0.606__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 (404) hide show
  1. {csvpath-0.0.599 → csvpath-0.0.606}/PKG-INFO +2 -1
  2. {csvpath-0.0.599 → csvpath-0.0.606}/assets/.DS_Store +0 -0
  3. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/.DS_Store +0 -0
  4. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/azure.bat +8 -0
  5. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/gcs.bat +8 -0
  6. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/local.bat +8 -0
  7. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/s3.bat +8 -0
  8. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/sftp.bat +8 -0
  9. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
  10. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
  11. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
  12. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
  13. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
  14. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
  15. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
  16. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
  17. csvpath-0.0.606/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
  18. {csvpath-0.0.599 → csvpath-0.0.606}/config/config.ini +4 -4
  19. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/csvpaths.py +45 -36
  20. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/file_manager.py +5 -3
  21. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/webhook/webhook_results_listener.py +8 -10
  22. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/paths/paths_describer.py +27 -10
  23. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/paths/paths_manager.py +2 -4
  24. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/results_manager.py +51 -8
  25. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/test_listener.py +2 -2
  26. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_data_writer.py +4 -5
  27. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_nos.py +0 -4
  28. csvpath-0.0.606/csvpath/util/azure/azure_timing_policy.py +14 -0
  29. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_utils.py +11 -4
  30. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/config.py +61 -16
  31. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/log_utility.py +17 -5
  32. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/path_util.py +5 -8
  33. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_fingerprinter.py +4 -3
  34. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_nos.py +103 -55
  35. csvpath-0.0.606/csvpath/util/stopwatch.py +43 -0
  36. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/var_utility.py +21 -26
  37. {csvpath-0.0.599 → csvpath-0.0.606}/pyproject.toml +4 -3
  38. {csvpath-0.0.599 → csvpath-0.0.606}/LICENSE +0 -0
  39. {csvpath-0.0.599 → csvpath-0.0.606}/README.md +0 -0
  40. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/config.ini +0 -0
  41. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/extra-functions.imports +0 -0
  42. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/function.imports +0 -0
  43. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-local-azure.ini +0 -0
  44. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  45. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-local-gcs.ini +0 -0
  46. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-local-s3.ini +0 -0
  47. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-local-sftp.ini +0 -0
  48. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-windows-azure.ini +0 -0
  49. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-windows-gcs.ini +0 -0
  50. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-windows-local.ini +0 -0
  51. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-windows-s3.ini +0 -0
  52. {csvpath-0.0.599 → csvpath-0.0.606}/assets/config/jenkins-windows-sftp.ini +0 -0
  53. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/Mac.goenvironment.json +0 -0
  54. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/Windows.goenvironment.json +0 -0
  55. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  56. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/azure.sh +0 -0
  57. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/gcs.sh +0 -0
  58. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  59. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  60. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/local.sh +0 -0
  61. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  62. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/s3.sh +0 -0
  63. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  64. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/mac/sftp.sh +0 -0
  65. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  66. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  67. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  68. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  69. {csvpath-0.0.599 → csvpath-0.0.606}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  70. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/.DS_Store +0 -0
  71. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  72. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  73. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  74. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  75. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  76. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  77. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sqlite/csvpath +0 -0
  78. {csvpath-0.0.599 → csvpath-0.0.606}/assets/integrations/sqlite/schema.sql +0 -0
  79. {csvpath-0.0.599 → csvpath-0.0.606}/config/env.json +0 -0
  80. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/__init__.py +0 -0
  81. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/__init__.py +0 -0
  82. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/asker.py +0 -0
  83. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/cli.py +0 -0
  84. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/const.py +0 -0
  85. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/debug_config.py +0 -0
  86. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/drill_down.py +0 -0
  87. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/function_describer.py +0 -0
  88. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/function_lister.py +0 -0
  89. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/cli/selecter.py +0 -0
  90. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/csvpath.py +0 -0
  91. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/__init__.py +0 -0
  92. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/errors/error.py +0 -0
  93. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/errors/error_collector.py +0 -0
  94. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/errors/error_comms.py +0 -0
  95. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/errors/error_manager.py +0 -0
  96. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/file_activator.py +0 -0
  97. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/file_describer.py +0 -0
  98. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/file_metadata.py +0 -0
  99. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/file_registrar.py +0 -0
  100. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/files_activation_listener.py +0 -0
  101. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/files_listener.py +0 -0
  102. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  103. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  104. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  105. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  106. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  107. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/event.py +0 -0
  108. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/event_result.py +0 -0
  109. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  110. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/job.py +0 -0
  111. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  112. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  113. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  114. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  115. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run.py +0 -0
  116. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  117. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/run_state.py +0 -0
  118. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/ol/sender.py +0 -0
  119. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  120. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  121. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  122. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  123. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  124. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  125. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  126. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  127. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  128. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  129. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  130. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
  131. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
  132. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
  133. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
  134. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/slack/event.py +0 -0
  135. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/slack/sender.py +0 -0
  136. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/engine.py +0 -0
  137. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  138. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  139. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  140. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  141. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  142. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/tables.py +0 -0
  143. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sql/updates.py +0 -0
  144. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  145. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  146. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  147. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  148. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/listener.py +0 -0
  149. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/metadata.py +0 -0
  150. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/paths/paths_listener.py +0 -0
  151. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/paths/paths_metadata.py +0 -0
  152. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/paths/paths_registrar.py +0 -0
  153. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/registrar.py +0 -0
  154. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  155. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  156. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  157. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  158. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/readers/readers.py +0 -0
  159. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/result.py +0 -0
  160. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/result_file_reader.py +0 -0
  161. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/result_metadata.py +0 -0
  162. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/result_registrar.py +0 -0
  163. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/result_serializer.py +0 -0
  164. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/results_metadata.py +0 -0
  165. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/results/results_registrar.py +0 -0
  166. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/run/run_listener_stdout.py +0 -0
  167. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/run/run_metadata.py +0 -0
  168. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/managers/run/run_registrar.py +0 -0
  169. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/__init__.py +0 -0
  170. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/__init__.py +0 -0
  171. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/args.py +0 -0
  172. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/args_helper.py +0 -0
  173. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/all.py +0 -0
  174. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/andf.py +0 -0
  175. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/any.py +0 -0
  176. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/between.py +0 -0
  177. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/empty.py +0 -0
  178. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/exists.py +0 -0
  179. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/inf.py +0 -0
  180. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/no.py +0 -0
  181. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/notf.py +0 -0
  182. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/orf.py +0 -0
  183. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/boolean/yes.py +0 -0
  184. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/count.py +0 -0
  185. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  186. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_headers.py +0 -0
  187. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_lines.py +0 -0
  188. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/count_scans.py +0 -0
  189. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/counter.py +0 -0
  190. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/every.py +0 -0
  191. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/has_matches.py +0 -0
  192. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/increment.py +0 -0
  193. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/tally.py +0 -0
  194. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/counting/total_lines.py +0 -0
  195. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/dates/now.py +0 -0
  196. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/dates/part.py +0 -0
  197. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/dates/roll.py +0 -0
  198. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/function.py +0 -0
  199. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/function_factory.py +0 -0
  200. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/function_finder.py +0 -0
  201. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/function_focus.py +0 -0
  202. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/append.py +0 -0
  203. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/collect.py +0 -0
  204. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  205. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/end.py +0 -0
  206. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/header_name.py +0 -0
  207. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  208. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/headers.py +0 -0
  209. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  210. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/insert.py +0 -0
  211. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/line_before.py +0 -0
  212. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/mismatch.py +0 -0
  213. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/remove.py +0 -0
  214. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/rename.py +0 -0
  215. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/replace.py +0 -0
  216. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  217. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/json/jsonpath.py +0 -0
  218. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/advance.py +0 -0
  219. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/after_blank.py +0 -0
  220. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/dups.py +0 -0
  221. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/first.py +0 -0
  222. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/first_line.py +0 -0
  223. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/last.py +0 -0
  224. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/lines/stop.py +0 -0
  225. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/above.py +0 -0
  226. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/add.py +0 -0
  227. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/divide.py +0 -0
  228. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/equals.py +0 -0
  229. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/intf.py +0 -0
  230. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/mod.py +0 -0
  231. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/multiply.py +0 -0
  232. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/odd.py +0 -0
  233. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/round.py +0 -0
  234. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/subtotal.py +0 -0
  235. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/subtract.py +0 -0
  236. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/math/sum.py +0 -0
  237. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  238. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/misc/importf.py +0 -0
  239. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/misc/parquet.py +0 -0
  240. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/misc/random.py +0 -0
  241. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/print/jinjaf.py +0 -0
  242. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/print/print_line.py +0 -0
  243. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/print/print_queue.py +0 -0
  244. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/print/printf.py +0 -0
  245. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/print/table.py +0 -0
  246. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/sql/sql_in.py +0 -0
  247. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/stats/minf.py +0 -0
  248. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/stats/nminmax.py +0 -0
  249. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/stats/percent.py +0 -0
  250. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  251. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/stats/stdev.py +0 -0
  252. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/alter.py +0 -0
  253. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/caps.py +0 -0
  254. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/concat.py +0 -0
  255. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/contains.py +0 -0
  256. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/format.py +0 -0
  257. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/length.py +0 -0
  258. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/lower.py +0 -0
  259. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/metaphone.py +0 -0
  260. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/regex.py +0 -0
  261. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/starts_with.py +0 -0
  262. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/strip.py +0 -0
  263. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/substring.py +0 -0
  264. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/strings/upper.py +0 -0
  265. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/testing/debug.py +0 -0
  266. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/__init__.py +0 -0
  267. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/blank.py +0 -0
  268. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/boolean.py +0 -0
  269. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/datatype.py +0 -0
  270. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/datef.py +0 -0
  271. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/decimal.py +0 -0
  272. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/email.py +0 -0
  273. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/nonef.py +0 -0
  274. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/string.py +0 -0
  275. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/type.py +0 -0
  276. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/url.py +0 -0
  277. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/types/wildcard.py +0 -0
  278. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/validity/fail.py +0 -0
  279. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/validity/failed.py +0 -0
  280. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/validity/line.py +0 -0
  281. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/validity/matches.py +0 -0
  282. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  283. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/clear.py +0 -0
  284. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/get.py +0 -0
  285. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/index_of.py +0 -0
  286. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/pushpop.py +0 -0
  287. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/put.py +0 -0
  288. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/slice.py +0 -0
  289. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/sort.py +0 -0
  290. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/track.py +0 -0
  291. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/variables/variables.py +0 -0
  292. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/functions/xml/xpath.py +0 -0
  293. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/lark_parser.py +0 -0
  294. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/lark_transformer.py +0 -0
  295. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/matcher.py +0 -0
  296. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/__init__.py +0 -0
  297. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/equality.py +0 -0
  298. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/expression.py +0 -0
  299. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/header.py +0 -0
  300. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/matchable.py +0 -0
  301. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/qualified.py +0 -0
  302. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/reference.py +0 -0
  303. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/term.py +0 -0
  304. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/productions/variable.py +0 -0
  305. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/exceptions.py +0 -0
  306. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/expression_encoder.py +0 -0
  307. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/expression_utility.py +0 -0
  308. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/lark_print_parser.py +0 -0
  309. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/parquet_utility.py +0 -0
  310. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/print_parser.py +0 -0
  311. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/matching/util/runtime_data_collector.py +0 -0
  312. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/error_mode.py +0 -0
  313. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/explain_mode.py +0 -0
  314. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/files_mode.py +0 -0
  315. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/logic_mode.py +0 -0
  316. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/mode_controller.py +0 -0
  317. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/print_mode.py +0 -0
  318. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/return_mode.py +0 -0
  319. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/run_mode.py +0 -0
  320. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/source_mode.py +0 -0
  321. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/transfer_mode.py +0 -0
  322. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/unmatched_mode.py +0 -0
  323. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/modes/validation_mode.py +0 -0
  324. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/scanning/__init__.py +0 -0
  325. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/scanning/scanner2.py +0 -0
  326. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/scanning/scanner2_parser.py +0 -0
  327. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/scanning/scanner2_transformer.py +0 -0
  328. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_data_reader.py +0 -0
  329. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  330. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  331. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  332. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/backend_check.py +0 -0
  333. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/box.py +0 -0
  334. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/cache.py +0 -0
  335. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/caser.py +0 -0
  336. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/class_loader.py +0 -0
  337. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/code.py +0 -0
  338. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/config_env.py +0 -0
  339. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/config_exception.py +0 -0
  340. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/date_util.py +0 -0
  341. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/exceptions.py +0 -0
  342. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/file_info.py +0 -0
  343. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/file_readers.py +0 -0
  344. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/file_utility.py +0 -0
  345. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/file_writers.py +0 -0
  346. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  347. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  348. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  349. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  350. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_nos.py +0 -0
  351. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_utils.py +0 -0
  352. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  353. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/hasher.py +0 -0
  354. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/http/http_data_reader.py +0 -0
  355. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/intermediary.py +0 -0
  356. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/json/json_data_reader.py +0 -0
  357. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/json/json_reader_helper.py +0 -0
  358. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/last_line_stats.py +0 -0
  359. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/line_counter.py +0 -0
  360. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/line_monitor.py +0 -0
  361. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/line_spooler.py +0 -0
  362. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/metadata_parser.py +0 -0
  363. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/nos.py +0 -0
  364. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/pandas_data_reader.py +0 -0
  365. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/printer.py +0 -0
  366. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/py_file_utility.py +0 -0
  367. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/files_reference_finder_2.py +0 -0
  368. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  369. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/files_tools/range_finder.py +0 -0
  370. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/ref_utils.py +0 -0
  371. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_exceptions.py +0 -0
  372. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_grammar.py +0 -0
  373. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  374. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_parser.py +0 -0
  375. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_results.py +0 -0
  376. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/reference_transformer.py +0 -0
  377. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_reference_finder_2.py +0 -0
  378. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/data_finder.py +0 -0
  379. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/date_filter.py +0 -0
  380. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  381. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/path_filter.py +0 -0
  382. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  383. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/token_filters.py +0 -0
  384. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  385. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/references/tools/date_completer.py +0 -0
  386. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/referrer_printer.py +0 -0
  387. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/run_home_maker.py +0 -0
  388. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_data_reader.py +0 -0
  389. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_data_writer.py +0 -0
  390. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  391. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  392. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_nos.py +0 -0
  393. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_utils.py +0 -0
  394. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  395. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_config.py +0 -0
  396. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  397. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  398. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  399. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_walk.py +0 -0
  400. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  401. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/sqliter.py +0 -0
  402. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/template_util.py +0 -0
  403. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  404. {csvpath-0.0.599 → csvpath-0.0.606}/csvpath/util/xlsx/xlsx_reader_helper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csvpath
3
- Version: 0.0.599
3
+ Version: 0.0.606
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
5
  License-File: LICENSE
6
6
  Author: David Kershaw
@@ -54,6 +54,7 @@ Requires-Dist: pytest (==8.4.2)
54
54
  Requires-Dist: python-dateutil (==2.9.0.post0)
55
55
  Requires-Dist: pytz (==2024.2)
56
56
  Requires-Dist: requests (==2.32.5)
57
+ Requires-Dist: ruff (>=0.15.8,<0.16.0)
57
58
  Requires-Dist: smart-open[all] (==7.5.1)
58
59
  Requires-Dist: sqlalchemy (==2.0.48)
59
60
  Requires-Dist: tabulate (==0.9.0)
@@ -30,3 +30,11 @@ cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
30
30
  cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
31
31
 
32
32
 
33
+ net stop w32time
34
+ w32tm /unregister
35
+ w32tm /register
36
+ net start w32time
37
+ timeout /t 1
38
+ w32tm /resync
39
+
40
+
@@ -29,3 +29,11 @@ cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
29
29
  cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
30
30
 
31
31
 
32
+ net stop w32time
33
+ w32tm /unregister
34
+ w32tm /register
35
+ net start w32time
36
+ timeout /t 1
37
+ w32tm /resync
38
+
39
+
@@ -53,3 +53,11 @@ cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
53
53
  cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
54
54
 
55
55
 
56
+ net stop w32time
57
+ w32tm /unregister
58
+ w32tm /register
59
+ net start w32time
60
+ timeout /t 1
61
+ w32tm /resync
62
+
63
+
@@ -31,3 +31,11 @@ cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
31
31
  cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
32
32
 
33
33
 
34
+ net stop w32time
35
+ w32tm /unregister
36
+ w32tm /register
37
+ net start w32time
38
+ timeout /t 1
39
+ w32tm /resync
40
+
41
+
@@ -29,3 +29,11 @@ cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
29
29
  cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
30
30
 
31
31
 
32
+ net stop w32time
33
+ w32tm /unregister
34
+ w32tm /register
35
+ net start w32time
36
+ timeout /t 1
37
+ w32tm /resync
38
+
39
+
@@ -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
@@ -48,7 +48,7 @@ allow_http_files = True
48
48
  allow_local_files = True
49
49
 
50
50
  [listeners]
51
- groups = default,scripts
51
+ groups = default
52
52
  webhook.results = from csvpath.managers.integrations.webhook.webhook_results_listener import WebhookResultsListener
53
53
  scripts.results = from csvpath.managers.integrations.scripts.scripts_results_listener import ScriptsResultsListener
54
54
  sql.file = from csvpath.managers.integrations.sql.sql_file_listener import SqlFileListener
@@ -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
@@ -1,15 +1,15 @@
1
- """ CsvPaths' intent is to help you manage and automate your use
2
- of the CsvPath library. it makes it easier to scale your CSV quality control. """
1
+ """CsvPaths' intent is to help you manage and automate your use
2
+ of the CsvPath library. it makes it easier to scale your CSV quality control."""
3
3
 
4
4
  import os
5
5
  import traceback
6
6
  import atexit
7
7
  import threading
8
8
 
9
- from uuid import uuid4, UUID
9
+ from uuid import uuid4
10
10
  from abc import ABC, abstractmethod
11
11
  from typing import List, Any, NewType
12
- from datetime import datetime, timezone
12
+ from datetime import datetime
13
13
  from .managers.errors.error import Error
14
14
  from .managers.errors.error_comms import ErrorCommunications
15
15
  from .managers.errors.error_manager import ErrorManager
@@ -26,7 +26,6 @@ from .managers.results.results_manager import ResultsManager
26
26
  from .managers.results.result import Result
27
27
  from .util.box import Box
28
28
  from . import CsvPath
29
- from .managers.integrations.otlp.metrics import Metrics
30
29
 
31
30
 
32
31
  # types for clarity
@@ -108,7 +107,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
108
107
  skip_blank_lines=True,
109
108
  print_default=True,
110
109
  project_context=None,
111
- project=None
110
+ project=None,
112
111
  # config: Config = None,
113
112
  ):
114
113
  if CsvPaths.METRICS_WRAP_REG is False:
@@ -173,8 +172,8 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
173
172
  #
174
173
  #
175
174
  #
176
- self.info_dump()
177
- """ @private """
175
+ # self.info_dump()
176
+
178
177
  self._errors = []
179
178
  # coordinator attributes
180
179
  self._stop_all = False
@@ -219,7 +218,14 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
219
218
  # that need to know about the run during the run; e.g. parquet()
220
219
  #
221
220
  self._csvpath_instances = []
222
-
221
+ #
222
+ # any listeners added here will be added to the internal_listeners of
223
+ # the csvpath instances that run.
224
+ #
225
+ self.dynamic_csvpath_error_listeners = []
226
+ #
227
+ #
228
+ #
223
229
  self.logger.info(
224
230
  f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
225
231
  )
@@ -263,8 +269,9 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
263
269
  if subs not in ["env", "none"]:
264
270
  subs = f"{subs} with keys:"
265
271
  e = self.config.config_env.env
266
- for k, v in e.items():
267
- subs = f"{subs}\n - {k}"
272
+ if e is not None:
273
+ for k, v in e.items():
274
+ subs = f"{subs}\n - {k}"
268
275
  cache = self.config.get(section="cache", name="path")
269
276
  cache = cache if self.config.get(section="cache", name="use_cache") else "none"
270
277
  logstr = self.logger if self.logger else "pending"
@@ -278,40 +285,42 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
278
285
  return f"""
279
286
  Context: {self.project_context}.{self.project}
280
287
  Logger: {logstr}
281
- Configured log path: {self.config.get(section='logging', name='log_file')}
288
+ Configured log path: {self.config.get(section="logging", name="log_file")}
282
289
  Current log paths: {logpath}
283
290
  Config file: {self.config.configpath}
284
- Var sub source: {self.config.get(section='config', name='var_sub_source')}
291
+ Var sub source: {self.config.get(section="config", name="var_sub_source")}
285
292
  Var subs: {subs}
286
293
  Errors:
287
- - csvpath: {self.config.get(section='errors', name='csvpath')}
288
- - csvpaths: {self.config.get(section='errors', name='csvpaths')}
289
- Named-files: {self.config.get(section='inputs', name='files')}
290
- Named-paths: {self.config.get(section='inputs', name='files')}
291
- Archive: {self.config.get(section='results', name='archive')}
294
+ - csvpath: {self.config.get(section="errors", name="csvpath")}
295
+ - csvpaths: {self.config.get(section="errors", name="csvpaths")}
296
+ Named-files: {self.config.get(section="inputs", name="files")}
297
+ Named-paths: {self.config.get(section="inputs", name="files")}
298
+ Archive: {self.config.get(section="results", name="archive")}
292
299
  Cache: {cache}
293
300
  {lstrs}
294
301
  """
295
302
 
296
- """
297
- def info_dump(self) -> None:
298
- self.logger.info(
299
- "Initated logging on log path: %s",
300
- self.config.get(section="logging", name="log_file"),
301
- )
302
- self.logger.info("Config file is at: %s", self.config.configpath)
303
- intgs = self.config.get(section="listeners", name="groups")
304
- self.logger.debug("Active integrations:")
305
- for _ in intgs:
306
- self.logger.debug(" - %s", _)
307
- """
308
-
309
303
  def _set_managers(self) -> None:
310
304
  self.paths_manager = PathsManager(csvpaths=self)
311
305
  self.file_manager = FileManager(csvpaths=self)
312
- self.results_manager = ResultsManager(csvpaths=self)
313
306
  self.ecoms = ErrorCommunications(csvpaths=self)
314
307
  self.error_manager = ErrorManager(csvpaths=self)
308
+ #
309
+ # we take a bit more care with resman because it may have listeners
310
+ # that are set programmatically. other managers deal with their
311
+ # registrars differently and don't have the problem of maintaining
312
+ # lists of listeners at the csvpaths level
313
+ #
314
+ resman = ResultsManager(csvpaths=self)
315
+ if self.results_manager:
316
+ resman.dynamic_result_listeners = (
317
+ self.results_manager.dynamic_result_listeners
318
+ )
319
+ resman.dynamic_results_listeners = (
320
+ self.results_manager.dynamic_results_listeners
321
+ )
322
+ resman.dynamic_run_listeners = self.results_manager.dynamic_run_listeners
323
+ self.results_manager = resman
315
324
 
316
325
  @property
317
326
  def project(self) -> str:
@@ -432,6 +441,8 @@ Cache: {cache}
432
441
  if path.config.configpath != self.config.configpath:
433
442
  path.config.set_config_path_and_reload(self.config.configpath)
434
443
  path.logger = None
444
+ for _ in self.dynamic_csvpath_error_listeners:
445
+ path.error_manager.add_internal_listener(_)
435
446
  return path
436
447
 
437
448
  def stop_all(self) -> None: # pragma: no cover
@@ -1448,10 +1459,8 @@ Cache: {cache}
1448
1459
  #
1449
1460
  # re: W0212: treating _consider_line something like package private
1450
1461
  #
1451
- matched = (
1452
- self.current_matcher._consider_line( # pylint:disable=W0212
1453
- line
1454
- )
1462
+ matched = self.current_matcher._consider_line( # pylint:disable=W0212
1463
+ line
1455
1464
  )
1456
1465
  if self.current_matcher.stopped:
1457
1466
  stopped_count.append(1)
@@ -1,6 +1,4 @@
1
- import os
2
1
  import json
3
- import csv
4
2
  import traceback
5
3
  from typing import NewType
6
4
  from json import JSONDecodeError
@@ -13,7 +11,7 @@ from csvpath.util.references.files_reference_finder_2 import (
13
11
  from csvpath.util.references.results_reference_finder_2 import (
14
12
  ResultsReferenceFinder2 as ResultsReferenceFinder,
15
13
  )
16
- from csvpath.util.exceptions import InputException, FileException
14
+ from csvpath.util.exceptions import FileException
17
15
  from csvpath.util.nos import Nos
18
16
  from csvpath.util.box import Box
19
17
  from csvpath.util.path_util import PathUtility as pathu
@@ -641,10 +639,12 @@ class FileManager:
641
639
  #
642
640
  self.csvpaths.logger.debug("Path after removing mark, if any: %s", path)
643
641
  self._copy_in(path, home, template)
642
+ self.csvpaths.logger.debug("Done copying in")
644
643
  #
645
644
  #
646
645
  #
647
646
  self.assure_docs_and_discriptor(name)
647
+ self.csvpaths.logger.debug("Assured docs and discriptor")
648
648
  #
649
649
  # create the reference to the bytes/version added to the named-file.
650
650
  # this is the most specific reference possible. we return it when we're
@@ -658,6 +658,7 @@ class FileManager:
658
658
  # create the metadata event for this registration
659
659
  #
660
660
  name_home = self.named_file_home(name)
661
+ self.csvpaths.logger.debug("Name home is %s", name_home)
661
662
  mdata = FileMetadata(self.csvpaths.config)
662
663
  mdata.named_file_name = name
663
664
  mdata.named_file_ref = ret
@@ -678,6 +679,7 @@ class FileManager:
678
679
  mdata.name_home = name_home
679
680
  mdata.mark = mark
680
681
  mdata.template = template
682
+ self.csvpaths.logger.debug("Created metadata")
681
683
  #
682
684
  # TODO: add file_size. move FileInfo into Nos. for now it is 0.
683
685
  #
@@ -1,4 +1,3 @@
1
- import os
2
1
  import json
3
2
  from csvpath.managers.metadata import Metadata
4
3
  from csvpath.managers.results.results_metadata import ResultsMetadata
@@ -70,13 +69,13 @@ class WebhookResultsListener(WebhookListener):
70
69
  if cfg is None:
71
70
  return None
72
71
  if atype.find("all") > -1:
73
- return cfg.all_url
72
+ return cfg.on_complete_all.url
74
73
  elif atype.find("invalid") > -1:
75
- return cfg.invalid_url
74
+ return cfg.on_complete_invalid.url
76
75
  elif atype.find("valid") > -1:
77
- return cfg.valid_url
76
+ return cfg.on_complete_valid.url
78
77
  elif atype.find("error") > -1:
79
- return cfg.error_url
78
+ return cfg.on_complete_error.url
80
79
  else:
81
80
  raise ValueError(f"Unknown type: {atype}")
82
81
 
@@ -106,13 +105,13 @@ class WebhookResultsListener(WebhookListener):
106
105
  return {}
107
106
  on = None
108
107
  if atype.find("all") > -1:
109
- on = cfg.on_complete_all
108
+ on = cfg.on_complete_all.payload
110
109
  elif atype.find("invalid") > -1:
111
- on = cfg.on_complete_invalid
110
+ on = cfg.on_complete_invalid.payload
112
111
  elif atype.find("valid") > -1:
113
- on = cfg.on_complete_valid
112
+ on = cfg.on_complete_valid.payload
114
113
  elif atype.find("error") > -1:
115
- on = cfg.on_complete_error
114
+ on = cfg.on_complete_error.payload
116
115
  else:
117
116
  raise ValueError(f"Unknown type: {atype}")
118
117
  if on and len(on) > 0:
@@ -122,7 +121,6 @@ class WebhookResultsListener(WebhookListener):
122
121
  return None
123
122
 
124
123
  def _payload(self, *, mdata: Metadata, atype: str, cfg, hook: str) -> dict:
125
-
126
124
  metadata = self.get_data(mdata, "meta.json")
127
125
  variables = self.get_data(mdata, "vars.json")
128
126
  pairs = VarUtility.get_value_pairs_from_value(
@@ -20,15 +20,16 @@ class Scripts(BaseModel):
20
20
  on_complete_error: Optional[str] = None
21
21
 
22
22
 
23
+ class Webhook(BaseModel):
24
+ url: Optional[str] = None
25
+ payload: Optional[str] = None
26
+
27
+
23
28
  class Webhooks(BaseModel):
24
- on_complete_all: Optional[str] = None
25
- on_complete_invalid: Optional[str] = None
26
- on_complete_valid: Optional[str] = None
27
- on_complete_error: Optional[str] = None
28
- all_url: Optional[str] = None
29
- valid_url: Optional[str] = None
30
- invalid_url: Optional[str] = None
31
- error_url: Optional[str] = None
29
+ on_complete_all: Optional[Webhook] = None
30
+ on_complete_invalid: Optional[Webhook] = None
31
+ on_complete_valid: Optional[Webhook] = None
32
+ on_complete_error: Optional[Webhook] = None
32
33
 
33
34
 
34
35
  class GroupConfig(BaseModel):
@@ -42,7 +43,6 @@ class Config(BaseModel):
42
43
 
43
44
 
44
45
  class NamedPathsDescriber:
45
-
46
46
  README = "README.md"
47
47
  DEFAULT_README = "# Named-Paths Documentation\n\n"
48
48
  JSON_FILE = "definition.json"
@@ -78,6 +78,23 @@ class NamedPathsDescriber:
78
78
  #
79
79
  if self.CONFIG in j:
80
80
  GroupConfig(**j[self.CONFIG])
81
+ #
82
+ # clear out the Nones
83
+ #
84
+ if self.CONFIG in j:
85
+ configs = j[self.CONFIG]
86
+ if "groups" in configs:
87
+ configs = configs["groups"]
88
+ for _k, _v in j[self.CONFIG].items():
89
+ rms = []
90
+ for k, v in _v.items():
91
+ if v is None:
92
+ rms.append(k)
93
+ for rm in rms:
94
+ del _v[rm]
95
+ #
96
+ #
97
+ #
81
98
  p = Nos(home).join(self.JSON_FILE)
82
99
  with DataFileWriter(path=p) as writer:
83
100
  json.dump(j, writer.sink, indent=2)
@@ -125,7 +142,7 @@ class NamedPathsDescriber:
125
142
  config.groups[name] = gc
126
143
  else:
127
144
  config.groups[name] = j
128
- _[self.CONFIG] = config.model_dump()
145
+ _[self.CONFIG] = config.model_dump(exclude_none=True)
129
146
  self.store_json(name, _)
130
147
 
131
148
  def get_config(self, name: NamedPathsName) -> GroupConfig:
@@ -1,5 +1,4 @@
1
1
  # pylint: disable=C0114
2
- import os
3
2
  import json
4
3
  import traceback
5
4
  from typing import NewType
@@ -10,7 +9,6 @@ from csvpath.util.metadata_parser import MetadataParser
10
9
  from csvpath.util.references.reference_parser import ReferenceParser
11
10
  from csvpath.util.file_readers import DataFileReader
12
11
  from csvpath.util.file_writers import DataFileWriter
13
- from csvpath.util.box import Box
14
12
  from csvpath.util.nos import Nos
15
13
  from .paths_registrar import PathsRegistrar
16
14
  from .paths_metadata import PathsMetadata
@@ -392,7 +390,7 @@ class PathsManager:
392
390
  assure_definition: bool = True,
393
391
  ) -> str:
394
392
  self.last_add_metadata = None
395
- if template is not None:
393
+ if template is not None and str(template).strip() != "":
396
394
  #
397
395
  # this will raise an error. if that's a problem use temu.validate
398
396
  #
@@ -470,7 +468,7 @@ class PathsManager:
470
468
  if assure_definition is True:
471
469
  t = self.get_json_paths_file(name)
472
470
  if t is None:
473
- raise ValueError(f"JSON definitionn for {name} cannot be None")
471
+ raise ValueError(f"JSON definition for {name} cannot be None")
474
472
  if name not in t:
475
473
  t[name] = []
476
474
  self.describer.store_json(name, t)
@@ -1,11 +1,7 @@
1
1
  # pylint: disable=C0114
2
2
  import os
3
- import json
4
3
  import re
5
- import traceback
6
4
  from uuid import UUID
7
- from pathlib import Path
8
- import datetime
9
5
  import dateutil.parser
10
6
  from typing import Dict, List, Any
11
7
  from csvpath.util.line_spooler import LineSpooler
@@ -40,6 +36,19 @@ class ResultsManager: # pylint: disable=C0115
40
36
  # use property
41
37
  self.csvpaths = csvpaths
42
38
  """@private"""
39
+ #
40
+ # the dynamic listeners are added to each Registrar before
41
+ # it distributes updates. we don't need this for the other
42
+ # managers (paths, files, errors) because they don't create
43
+ # new registrars each time. we can just do:
44
+ # paths.error_manager.registrar.add_internal_listeners(lst)
45
+ # but with these we cannot do that. we could change how this
46
+ # class handles listeners but it feels like a small additive
47
+ # is better than an unknown impact
48
+ #
49
+ self.dynamic_result_listeners = []
50
+ self.dynamic_results_listeners = []
51
+ self.dynamic_run_listeners = []
43
52
 
44
53
  @property
45
54
  def csvpaths(self):
@@ -59,6 +68,11 @@ class ResultsManager: # pylint: disable=C0115
59
68
  pathsname=pathsname,
60
69
  results=results,
61
70
  )
71
+ for _ in self.dynamic_results_listeners:
72
+ rr.add_internal_listener(_)
73
+ #
74
+ # add any dynamic listeners to the registrar here
75
+ #
62
76
  m = rr.manifest
63
77
  mdata = ResultsMetadata(self.csvpaths.config)
64
78
  if "time" not in m or m["time"] is None:
@@ -104,6 +118,12 @@ class ResultsManager: # pylint: disable=C0115
104
118
  run_dir=run_dir,
105
119
  pathsname=pathsname,
106
120
  )
121
+ #
122
+ # add any dynamic listeners to the registrar here
123
+ #
124
+ for _ in self.dynamic_results_listeners:
125
+ rr.add_internal_listener(_)
126
+
107
127
  #
108
128
  # collect the named-paths and named-file uuids. these may
109
129
  # need to come from a different source at some point but
@@ -337,6 +357,14 @@ class ResultsManager: # pylint: disable=C0115
337
357
  mdata.named_file_name = result.file_name
338
358
  mdata.method = result.method
339
359
  rr = RunRegistrar(self.csvpaths)
360
+ #
361
+ # add any dynamic listeners to the registrar here
362
+ #
363
+ print(f"regsman: me: {id(self)}")
364
+ print(f"regsman: my csvpaths: {id(self.csvpaths)}")
365
+ print(f"regsman: dylsi: {self.dynamic_run_listeners}")
366
+ for _ in self.dynamic_run_listeners:
367
+ rr.add_internal_listener(_)
340
368
  rr.register_start(mdata)
341
369
  #
342
370
  # we prep the results event
@@ -376,6 +404,11 @@ class ResultsManager: # pylint: disable=C0115
376
404
  rr = ResultRegistrar(
377
405
  csvpaths=self.csvpaths, result=result, result_serializer=rs
378
406
  )
407
+ #
408
+ # add any dynamic listeners to the registrar here
409
+ #
410
+ for _ in self.dynamic_result_listeners:
411
+ rr.add_internal_listener(_)
379
412
  rr.register_start(mdata)
380
413
 
381
414
  def set_named_results(self, results: Dict[str, List[Result]]) -> None:
@@ -464,8 +497,12 @@ class ResultsManager: # pylint: disable=C0115
464
497
  # exp! it would be good to offer a var sub here
465
498
  #
466
499
  if pathto:
467
- result.csvpath.config.set(section="_dummy-section", name="_dummy-name", value=pathto)
468
- pathto = result.csvpath.config.get(section="_dummy-section", name="_dummy-name")
500
+ result.csvpath.config.set(
501
+ section="_dummy-section", name="_dummy-name", value=pathto
502
+ )
503
+ pathto = result.csvpath.config.get(
504
+ section="_dummy-section", name="_dummy-name"
505
+ )
469
506
  #
470
507
  #
471
508
  #
@@ -559,9 +596,15 @@ class ResultsManager: # pylint: disable=C0115
559
596
  self.do_transfers_if(result)
560
597
  rs = ResultSerializer(self._csvpaths.config.archive_path)
561
598
  rs.save_result(result)
562
- ResultRegistrar(
599
+ rr = ResultRegistrar(
563
600
  csvpaths=self.csvpaths, result=result, result_serializer=rs
564
- ).register_complete()
601
+ )
602
+ #
603
+ # add any dynamic listeners to the registrar here
604
+ #
605
+ for _ in self.dynamic_result_listeners:
606
+ rr.add_internal_listener(_)
607
+ rr.register_complete()
565
608
 
566
609
  def remove_named_results(self, name: str) -> None:
567
610
  """@private"""
@@ -1,6 +1,4 @@
1
- from abc import ABC, abstractmethod
2
1
  from .metadata import Metadata
3
- from ..util.config import Config
4
2
  from .listener import Listener
5
3
 
6
4
 
@@ -13,6 +11,8 @@ class TestListener(Listener):
13
11
  def __init__(self, config=None) -> None:
14
12
  self._config = None
15
13
  super().__init__(config)
14
+ self.mine = None
16
15
 
17
16
  def metadata_update(self, mdata: Metadata) -> None:
18
17
  TestListener.METADATA = mdata
18
+ self.mine = mdata
@@ -1,9 +1,9 @@
1
1
  # pylint: disable=C0114
2
2
 
3
- import os
4
3
  from smart_open import open
5
4
  from ..file_writers import DataFileWriter
6
5
  from csvpath.util.azure.azure_utils import AzureUtility
6
+ from csvpath.util.stopwatch import Stopwatch
7
7
 
8
8
 
9
9
  class AzureDataWriter(DataFileWriter):
@@ -13,17 +13,16 @@ class AzureDataWriter(DataFileWriter):
13
13
  if self.sink is None:
14
14
  client = AzureUtility.make_client()
15
15
  self.sink = open(
16
- self.path,
17
- self.mode,
18
- transport_params={"client": client},
19
- newline=''
16
+ self.path, self.mode, transport_params={"client": client}, newline=""
20
17
  )
21
18
  AzureDataWriter._write_file_count += 1
22
19
 
23
20
  def write(self, data) -> None:
24
21
  if self.is_binary and not isinstance(data, bytes):
25
22
  data = data.encode(self.encoding)
23
+ s = Stopwatch()
26
24
  self.sink.write(data)
25
+ s.end()
27
26
 
28
27
  def file_info(self) -> dict[str, str | int | float]:
29
28
  # TODO: what can/should we provide here?
@@ -1,6 +1,4 @@
1
1
  # pylint: disable=C0114
2
- import os
3
- from azure.storage.blob import BlobServiceClient, ContainerClient
4
2
  from azure.storage.blob._list_blobs_helper import BlobPrefix
5
3
  from .azure_utils import AzureUtility
6
4
  from ..path_util import PathUtility as pathu
@@ -100,8 +98,6 @@ class AzureDo:
100
98
  if files_only is True and dirs_only is True:
101
99
  raise ValueError("Cannot list with neither files nor dirs")
102
100
  container, blob = AzureUtility.path_to_parts(path)
103
-
104
- # listed = os.path.basename(self.path)
105
101
  if not blob.endswith("/"):
106
102
  blob = f"{blob}/"
107
103
  if blob == "/":