csvpath 0.0.615__tar.gz → 0.0.617__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 (411) hide show
  1. {csvpath-0.0.615 → csvpath-0.0.617}/PKG-INFO +1 -1
  2. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-windows-azure.ini +6 -7
  3. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/csvpath.py +2 -1
  4. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/csvpaths.py +8 -1
  5. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_manager.py +89 -24
  6. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_registrar.py +4 -7
  7. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/files_listener.py +2 -0
  8. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/webhook/webhook_listener.py +7 -0
  9. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/metadata.py +1 -2
  10. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/result.py +7 -2
  11. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/results_manager.py +1 -0
  12. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/transfers_manager.py +35 -16
  13. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/run/run_metadata.py +10 -1
  14. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/run/run_registrar.py +1 -6
  15. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/config.py +5 -1
  16. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/file_writers.py +6 -3
  17. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/log_utility.py +1 -1
  18. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/template_util.py +7 -3
  19. {csvpath-0.0.615 → csvpath-0.0.617}/pyproject.toml +1 -1
  20. {csvpath-0.0.615 → csvpath-0.0.617}/LICENSE +0 -0
  21. {csvpath-0.0.615 → csvpath-0.0.617}/README.md +0 -0
  22. {csvpath-0.0.615 → csvpath-0.0.617}/assets/.DS_Store +0 -0
  23. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/config.ini +0 -0
  24. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/extra-functions.imports +0 -0
  25. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/function.imports +0 -0
  26. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-local-azure.ini +0 -0
  27. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  28. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-local-gcs.ini +0 -0
  29. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-local-s3.ini +0 -0
  30. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-local-sftp.ini +0 -0
  31. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-windows-gcs.ini +0 -0
  32. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-windows-local.ini +0 -0
  33. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-windows-s3.ini +0 -0
  34. {csvpath-0.0.615 → csvpath-0.0.617}/assets/config/jenkins-windows-sftp.ini +0 -0
  35. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/.DS_Store +0 -0
  36. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/Mac.goenvironment.json +0 -0
  37. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/Windows.goenvironment.json +0 -0
  38. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  39. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/azure.sh +0 -0
  40. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/gcs.sh +0 -0
  41. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  42. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  43. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/local.sh +0 -0
  44. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  45. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/s3.sh +0 -0
  46. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  47. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/mac/sftp.sh +0 -0
  48. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/azure.bat +0 -0
  49. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/gcs.bat +0 -0
  50. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/local.bat +0 -0
  51. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/s3.bat +0 -0
  52. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/sftp.bat +0 -0
  53. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  54. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  55. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  56. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  57. {csvpath-0.0.615 → csvpath-0.0.617}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  58. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/.DS_Store +0 -0
  59. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  60. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  61. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  62. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  63. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  64. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  65. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sqlite/csvpath +0 -0
  66. {csvpath-0.0.615 → csvpath-0.0.617}/assets/integrations/sqlite/schema.sql +0 -0
  67. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
  68. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
  69. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
  70. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
  71. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
  72. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
  73. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
  74. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
  75. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
  76. {csvpath-0.0.615 → csvpath-0.0.617}/assets/libs/release_candidate_maker-0.0.36.tar.gz +0 -0
  77. {csvpath-0.0.615 → csvpath-0.0.617}/config/config.ini +0 -0
  78. {csvpath-0.0.615 → csvpath-0.0.617}/config/env.json +0 -0
  79. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/__init__.py +0 -0
  80. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/__init__.py +0 -0
  81. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/asker.py +0 -0
  82. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/cli.py +0 -0
  83. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/const.py +0 -0
  84. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/debug_config.py +0 -0
  85. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/drill_down.py +0 -0
  86. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/function_describer.py +0 -0
  87. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/function_lister.py +0 -0
  88. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/cli/selecter.py +0 -0
  89. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/__init__.py +0 -0
  90. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/errors/error.py +0 -0
  91. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/errors/error_collector.py +0 -0
  92. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/errors/error_comms.py +0 -0
  93. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/errors/error_manager.py +0 -0
  94. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_activator.py +0 -0
  95. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_describer.py +0 -0
  96. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_descriptor.py +0 -0
  97. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_metadata.py +0 -0
  98. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/file_names_rules.py +0 -0
  99. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/files_activation_listener.py +0 -0
  100. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  101. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  102. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  103. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  104. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  105. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/event.py +0 -0
  106. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/event_result.py +0 -0
  107. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  108. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/job.py +0 -0
  109. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  110. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  111. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  112. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  113. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/run.py +0 -0
  114. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  115. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/run_state.py +0 -0
  116. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/ol/sender.py +0 -0
  117. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  118. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  119. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  120. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  121. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  122. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  123. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  124. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  125. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  126. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  127. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/slack/event.py +0 -0
  128. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/slack/sender.py +0 -0
  129. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/engine.py +0 -0
  130. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  131. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  132. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  133. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  134. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  135. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/tables.py +0 -0
  136. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sql/updates.py +0 -0
  137. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  138. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  139. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  140. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  141. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/listener.py +0 -0
  142. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_describer.py +0 -0
  143. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_descriptor.py +0 -0
  144. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_listener.py +0 -0
  145. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_manager.py +0 -0
  146. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_metadata.py +0 -0
  147. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/paths/paths_registrar.py +0 -0
  148. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/registrar.py +0 -0
  149. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  150. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  151. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  152. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  153. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/readers/readers.py +0 -0
  154. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/result_file_reader.py +0 -0
  155. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/result_metadata.py +0 -0
  156. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/result_registrar.py +0 -0
  157. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/result_serializer.py +0 -0
  158. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/results_metadata.py +0 -0
  159. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/results/results_registrar.py +0 -0
  160. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/run/run_listener_stdout.py +0 -0
  161. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/server_config.py +0 -0
  162. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/managers/test_listener.py +0 -0
  163. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/__init__.py +0 -0
  164. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/__init__.py +0 -0
  165. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/args.py +0 -0
  166. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/args_helper.py +0 -0
  167. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/all.py +0 -0
  168. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/andf.py +0 -0
  169. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/any.py +0 -0
  170. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/between.py +0 -0
  171. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/empty.py +0 -0
  172. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/exists.py +0 -0
  173. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/inf.py +0 -0
  174. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/no.py +0 -0
  175. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/notf.py +0 -0
  176. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/orf.py +0 -0
  177. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/boolean/yes.py +0 -0
  178. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/count.py +0 -0
  179. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  180. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/count_headers.py +0 -0
  181. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/count_lines.py +0 -0
  182. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/count_scans.py +0 -0
  183. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/counter.py +0 -0
  184. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/every.py +0 -0
  185. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/has_matches.py +0 -0
  186. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/increment.py +0 -0
  187. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/tally.py +0 -0
  188. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/counting/total_lines.py +0 -0
  189. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/dates/now.py +0 -0
  190. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/dates/part.py +0 -0
  191. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/dates/roll.py +0 -0
  192. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/function.py +0 -0
  193. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/function_factory.py +0 -0
  194. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/function_finder.py +0 -0
  195. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/function_focus.py +0 -0
  196. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/append.py +0 -0
  197. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/collect.py +0 -0
  198. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  199. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/end.py +0 -0
  200. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/header_name.py +0 -0
  201. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  202. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/headers.py +0 -0
  203. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  204. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/insert.py +0 -0
  205. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/line_before.py +0 -0
  206. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/mismatch.py +0 -0
  207. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/remove.py +0 -0
  208. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/rename.py +0 -0
  209. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/replace.py +0 -0
  210. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  211. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/json/jsonpath.py +0 -0
  212. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/advance.py +0 -0
  213. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/after_blank.py +0 -0
  214. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/dups.py +0 -0
  215. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/first.py +0 -0
  216. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/first_line.py +0 -0
  217. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/last.py +0 -0
  218. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/lines/stop.py +0 -0
  219. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/above.py +0 -0
  220. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/add.py +0 -0
  221. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/divide.py +0 -0
  222. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/equals.py +0 -0
  223. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/intf.py +0 -0
  224. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/mod.py +0 -0
  225. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/multiply.py +0 -0
  226. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/odd.py +0 -0
  227. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/round.py +0 -0
  228. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/subtotal.py +0 -0
  229. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/subtract.py +0 -0
  230. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/math/sum.py +0 -0
  231. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/env.py +0 -0
  232. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  233. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/importf.py +0 -0
  234. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/metadata.py +0 -0
  235. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/parquet.py +0 -0
  236. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/random.py +0 -0
  237. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/misc/runtime.py +0 -0
  238. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/print/jinjaf.py +0 -0
  239. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/print/print_line.py +0 -0
  240. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/print/print_queue.py +0 -0
  241. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/print/printf.py +0 -0
  242. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/print/table.py +0 -0
  243. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/sql/select.py +0 -0
  244. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/sql/sql_in.py +0 -0
  245. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/stats/minf.py +0 -0
  246. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/stats/nminmax.py +0 -0
  247. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/stats/percent.py +0 -0
  248. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  249. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/stats/stdev.py +0 -0
  250. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/alter.py +0 -0
  251. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/caps.py +0 -0
  252. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/concat.py +0 -0
  253. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/contains.py +0 -0
  254. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/format.py +0 -0
  255. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/length.py +0 -0
  256. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/lower.py +0 -0
  257. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/metaphone.py +0 -0
  258. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/regex.py +0 -0
  259. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/starts_with.py +0 -0
  260. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/strip.py +0 -0
  261. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/substring.py +0 -0
  262. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/strings/upper.py +0 -0
  263. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/testing/debug.py +0 -0
  264. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/__init__.py +0 -0
  265. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/blank.py +0 -0
  266. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/boolean.py +0 -0
  267. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/datatype.py +0 -0
  268. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/datef.py +0 -0
  269. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/decimal.py +0 -0
  270. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/email.py +0 -0
  271. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/nonef.py +0 -0
  272. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/string.py +0 -0
  273. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/type.py +0 -0
  274. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/url.py +0 -0
  275. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/uuid.py +0 -0
  276. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/types/wildcard.py +0 -0
  277. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/validity/fail.py +0 -0
  278. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/validity/failed.py +0 -0
  279. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/validity/line.py +0 -0
  280. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/validity/matches.py +0 -0
  281. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  282. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/clear.py +0 -0
  283. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/get.py +0 -0
  284. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/index_of.py +0 -0
  285. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/pushpop.py +0 -0
  286. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/put.py +0 -0
  287. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/slice.py +0 -0
  288. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/sort.py +0 -0
  289. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/track.py +0 -0
  290. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/variables/variables.py +0 -0
  291. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/functions/xml/xpath.py +0 -0
  292. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/lark_parser.py +0 -0
  293. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/lark_transformer.py +0 -0
  294. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/matcher.py +0 -0
  295. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/__init__.py +0 -0
  296. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/equality.py +0 -0
  297. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/expression.py +0 -0
  298. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/header.py +0 -0
  299. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/matchable.py +0 -0
  300. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/qualified.py +0 -0
  301. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/reference.py +0 -0
  302. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/term.py +0 -0
  303. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/productions/variable.py +0 -0
  304. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/exceptions.py +0 -0
  305. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/expression_encoder.py +0 -0
  306. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/expression_utility.py +0 -0
  307. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/lark_print_parser.py +0 -0
  308. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/parquet_utility.py +0 -0
  309. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/print_parser.py +0 -0
  310. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/matching/util/runtime_data_collector.py +0 -0
  311. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/error_mode.py +0 -0
  312. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/explain_mode.py +0 -0
  313. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/files_mode.py +0 -0
  314. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/logic_mode.py +0 -0
  315. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/mode_controller.py +0 -0
  316. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/print_mode.py +0 -0
  317. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/return_mode.py +0 -0
  318. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/run_mode.py +0 -0
  319. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/source_mode.py +0 -0
  320. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/transfer_mode.py +0 -0
  321. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/unmatched_mode.py +0 -0
  322. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/modes/validation_mode.py +0 -0
  323. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/scanning/__init__.py +0 -0
  324. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/scanning/scanner2.py +0 -0
  325. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/scanning/scanner2_parser.py +0 -0
  326. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/scanning/scanner2_transformer.py +0 -0
  327. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_data_reader.py +0 -0
  328. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_data_writer.py +0 -0
  329. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  330. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  331. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_nos.py +0 -0
  332. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_timing_policy.py +0 -0
  333. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_utils.py +0 -0
  334. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  335. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/backend_check.py +0 -0
  336. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/box.py +0 -0
  337. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/cache.py +0 -0
  338. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/caser.py +0 -0
  339. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/class_loader.py +0 -0
  340. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/code.py +0 -0
  341. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/config_env.py +0 -0
  342. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/config_exception.py +0 -0
  343. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/date_util.py +0 -0
  344. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/exceptions.py +0 -0
  345. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/file_info.py +0 -0
  346. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/file_readers.py +0 -0
  347. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/file_utility.py +0 -0
  348. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  349. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  350. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  351. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  352. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_nos.py +0 -0
  353. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_utils.py +0 -0
  354. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  355. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/hasher.py +0 -0
  356. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/http/http_data_reader.py +0 -0
  357. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/intermediary.py +0 -0
  358. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/json/json_data_reader.py +0 -0
  359. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/json/json_reader_helper.py +0 -0
  360. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/last_line_stats.py +0 -0
  361. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/line_counter.py +0 -0
  362. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/line_monitor.py +0 -0
  363. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/line_spooler.py +0 -0
  364. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/metadata_parser.py +0 -0
  365. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/nos.py +0 -0
  366. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/pandas_data_reader.py +0 -0
  367. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/path_util.py +0 -0
  368. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/printer.py +0 -0
  369. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/py_file_utility.py +0 -0
  370. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/files_reference_finder_2.py +0 -0
  371. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  372. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/files_tools/range_finder.py +0 -0
  373. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/ref_utils.py +0 -0
  374. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_exceptions.py +0 -0
  375. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_grammar.py +0 -0
  376. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  377. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_parser.py +0 -0
  378. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_results.py +0 -0
  379. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/reference_transformer.py +0 -0
  380. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_reference_finder_2.py +0 -0
  381. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/data_finder.py +0 -0
  382. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/date_filter.py +0 -0
  383. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  384. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/path_filter.py +0 -0
  385. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  386. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/token_filters.py +0 -0
  387. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  388. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/references/tools/date_completer.py +0 -0
  389. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/referrer_printer.py +0 -0
  390. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/run_home_maker.py +0 -0
  391. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_data_reader.py +0 -0
  392. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_data_writer.py +0 -0
  393. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  394. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  395. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_nos.py +0 -0
  396. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_utils.py +0 -0
  397. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  398. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_config.py +0 -0
  399. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  400. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  401. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  402. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  403. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_nos.py +0 -0
  404. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_server_creds.py +0 -0
  405. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_walk.py +0 -0
  406. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  407. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/sqliter.py +0 -0
  408. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/stopwatch.py +0 -0
  409. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/var_utility.py +0 -0
  410. {csvpath-0.0.615 → csvpath-0.0.617}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  411. {csvpath-0.0.615 → csvpath-0.0.617}/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.615
3
+ Version: 0.0.617
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
@@ -4,7 +4,7 @@ csv_files = csv, tsv, dat, tab, psv, ssv
4
4
 
5
5
  [errors]
6
6
  csvpath = raise, collect, print
7
- csvpaths = raise, collect
7
+ csvpaths = raise, collect, print
8
8
  use_format = full
9
9
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
10
10
 
@@ -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\azure\archive
@@ -40,7 +40,7 @@ allow_http_files = True
40
40
  allow_local_files = True
41
41
 
42
42
  [listeners]
43
- groups =
43
+ groups = default
44
44
  sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
45
45
  sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
46
46
  default.file = from csvpath.managers.files.files_listener import FilesListener
@@ -70,7 +70,7 @@ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_lis
70
70
  [gcs]
71
71
 
72
72
  [scripts]
73
- run_scripts=yes
73
+ run_scripts = yes
74
74
 
75
75
  [sftp]
76
76
  server = SFTP_SERVER
@@ -89,7 +89,7 @@ port = SFTPPLUS_PORT
89
89
  admin_username = SFTPPLUS_ADMIN_USERNAME
90
90
  admin_password = SFTPPLUS_ADMIN_PASSWORD
91
91
  api_url = https://. . . :10020/json
92
- scripts_dir =
92
+ scripts_dir =
93
93
  execute_timeout = 300
94
94
 
95
95
  [ckan]
@@ -104,6 +104,5 @@ timeout = 5
104
104
  verify = False
105
105
 
106
106
  [slack]
107
- webhook_url =
108
-
107
+ webhook_url =
109
108
 
@@ -313,9 +313,10 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
313
313
  self.error_manager.error_metrics.provider.shutdown()
314
314
  self.error_manager.error_metrics = None
315
315
  self.error_manager = None
316
- lout.release_logger(self)
317
316
  except Exception:
318
317
  print(traceback.format_exc())
318
+ finally:
319
+ lout.release_logger(self)
319
320
 
320
321
  #
321
322
  # this method saves and reloads the config. if you don't want that use
@@ -588,9 +588,10 @@ Cache: {cache}
588
588
  def __del__(self) -> None:
589
589
  try:
590
590
  self.wrap_up()
591
- lout.release_logger(self)
592
591
  except Exception:
593
592
  print(traceback.format_exc())
593
+ finally:
594
+ lout.release_logger(self)
594
595
 
595
596
  def _trim_archive_if(self, home: str) -> str:
596
597
  archive = self.config.get(section="results", name="archive")
@@ -877,6 +878,7 @@ Cache: {cache}
877
878
  run_dir=crt,
878
879
  run_uuid=run_uuid,
879
880
  method="collect_paths",
881
+ template=template,
880
882
  )
881
883
  # casting a broad net because if "raise" not in the error policy we
882
884
  # want to never fail during a run
@@ -1047,6 +1049,7 @@ Cache: {cache}
1047
1049
  run_dir=crt,
1048
1050
  run_uuid=run_uuid,
1049
1051
  method="fast_forward_paths",
1052
+ template=template,
1050
1053
  )
1051
1054
  try:
1052
1055
  self._load_csvpath(
@@ -1181,6 +1184,7 @@ Cache: {cache}
1181
1184
  run_dir=crt,
1182
1185
  run_uuid=run_uuid,
1183
1186
  method="next_paths",
1187
+ template=template,
1184
1188
  )
1185
1189
  if self._fail_all:
1186
1190
  self.logger.warning(
@@ -1447,6 +1451,7 @@ Cache: {cache}
1447
1451
  crt=crt,
1448
1452
  method=method,
1449
1453
  extra_data=extra_data,
1454
+ template=template,
1450
1455
  )
1451
1456
  #
1452
1457
  # setting file into the csvpath is less obviously useful at CsvPaths
@@ -1624,6 +1629,7 @@ Cache: {cache}
1624
1629
  crt: str,
1625
1630
  method: str,
1626
1631
  extra_data: Optional[dict[str, str]],
1632
+ template: str = "",
1627
1633
  ):
1628
1634
  """@private"""
1629
1635
  #
@@ -1660,6 +1666,7 @@ Cache: {cache}
1660
1666
  by_line=True,
1661
1667
  run_uuid=run_uuid,
1662
1668
  method=method,
1669
+ template=template,
1663
1670
  )
1664
1671
  csvpath[1] = result
1665
1672
  #
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  import json
3
3
  import traceback
4
- from uuid import UUID
4
+ from uuid import UUID, uuid4
5
5
  from typing import NewType
6
6
  from json import JSONDecodeError
7
7
  from csvpath.util.file_readers import DataFileReader
@@ -19,6 +19,7 @@ from csvpath.util.path_util import PathUtility as pathu
19
19
  from csvpath.util.template_util import TemplateUtility as temu
20
20
  from .file_registrar import FileRegistrar
21
21
  from .lines_and_headers_cacher import LinesAndHeadersCacher
22
+ from .files_listener import FilesListener
22
23
  from .file_metadata import FileMetadata
23
24
  from .file_describer import NamedFileDescriber
24
25
  from .file_activator import NamedFileActivator
@@ -219,8 +220,6 @@ class FileManager:
219
220
  #
220
221
  path = lst[0]
221
222
  path = Nos(path).join("manifest.json")
222
- # path = os.path.join(path, "manifest.json")
223
- # nos = self.nos
224
223
  nos = Nos(path)
225
224
  if nos.exists():
226
225
  mani = self.registrar.get_manifest(path)
@@ -634,11 +633,18 @@ class FileManager:
634
633
  # issue driven by the 3rd party or business rules.
635
634
  #
636
635
  UUID(registration_uuid)
637
- self.csvpaths.logger.info(
638
- "Registration of %s will be associated with UUID %s",
639
- path,
640
- registration_uuid,
641
- )
636
+ else:
637
+ #
638
+ # if we don't create the uuid here the metadata object will create one;
639
+ # however, if we want to tie log statements back we should have a uuid
640
+ # here, regardless of if the user creates it or we do.
641
+ #
642
+ registration_uuid = str(uuid4())
643
+ self.csvpaths.logger.info(
644
+ "Registration of %s will be associated with UUID %s",
645
+ path,
646
+ registration_uuid,
647
+ )
642
648
  if not self.can_load(path):
643
649
  #
644
650
  # if False, can_load() will have already raised an error and/or, minimally,
@@ -648,9 +654,26 @@ class FileManager:
648
654
  # will load any allowed files, even if some are not allowed -- but with the
649
655
  # caveat that if an exception is raised we may stop in the middle of the load.
650
656
  #
657
+ #
658
+ #
659
+ _ = {
660
+ "name": name,
661
+ "path": path,
662
+ "template": template,
663
+ "registration_uuid": registration_uuid,
664
+ }
665
+ self._registration_failed(_)
666
+ #
651
667
  return
652
668
  self.legal_name(name)
653
669
  if path is None or path.strip() == "":
670
+ _ = {
671
+ "name": name,
672
+ "path": path,
673
+ "template": template,
674
+ "registration_uuid": registration_uuid,
675
+ }
676
+ self._registration_failed(_)
654
677
  raise ValueError("Path cannot be None or empty")
655
678
  if template is None:
656
679
  template = self.describer.get_template(name)
@@ -666,7 +689,7 @@ class FileManager:
666
689
  #
667
690
  self.configure_named_file(name, config)
668
691
  path = pathu.resep(path)
669
- self.csvpaths.logger.debug("Path after resep %s", path)
692
+ self.csvpaths.logger.debug("[%s] Path after resep %s", registration_uuid, path)
670
693
  config = self.csvpaths.config
671
694
  http = config.get(section="inputs", name="allow_http_files", default=False)
672
695
  http = str(http).strip().lower() in ["on", "yes", "true"]
@@ -679,14 +702,28 @@ class FileManager:
679
702
  # the user cannot just override certain settings.
680
703
  #
681
704
  if nos.is_http and http is not True:
682
- msg = f"Cannot add {path} as {name} because loading files over HTTP is not allowed"
705
+ _ = {
706
+ "name": name,
707
+ "path": path,
708
+ "template": template,
709
+ "registration_uuid": registration_uuid,
710
+ }
711
+ self._registration_failed(_)
712
+ msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading files over HTTP is not allowed"
683
713
  self.csvpaths.logger.warning(msg)
684
714
  self.csvpaths.error_manager.handle_error(source=self, msg=msg)
685
715
  if self.csvpaths.ecoms.do_i_raise():
686
716
  raise FileException(msg)
687
717
  return
688
718
  if nos.is_local and local is not True:
689
- msg = f"Cannot add {path} as {name} because loading local files is not allowed"
719
+ _ = {
720
+ "name": name,
721
+ "path": path,
722
+ "template": template,
723
+ "registration_uuid": registration_uuid,
724
+ }
725
+ self._registration_failed(_)
726
+ msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading local files is not allowed"
690
727
  self.csvpaths.logger.warning(msg)
691
728
  self.csvpaths.error_manager.handle_error(source=self, msg=msg)
692
729
  if self.csvpaths.ecoms.do_i_raise():
@@ -715,7 +752,9 @@ class FileManager:
715
752
  path, name=name, template=template, recurse=False
716
753
  )
717
754
  try:
718
- self.csvpaths.logger.debug("Ready to register %s", path)
755
+ self.csvpaths.logger.debug(
756
+ "[%s] Ready to register %s", registration_uuid, path
757
+ )
719
758
  #
720
759
  # path must end up with only legal filesystem chars.
721
760
  # the read-only http backend will have ? and possibly other
@@ -750,13 +789,17 @@ class FileManager:
750
789
  # exp: moving docs and descriptor to above copy_in()
751
790
  #
752
791
  self.assure_docs_and_discriptor(name)
753
- self.csvpaths.logger.debug("Assured docs and discriptor")
792
+ self.csvpaths.logger.debug(
793
+ "[%s] Assured docs and discriptor", registration_uuid
794
+ )
754
795
  #
755
796
  # copy file to its home location
756
797
  #
757
- self.csvpaths.logger.debug("Path after removing mark, if any: %s", path)
798
+ self.csvpaths.logger.debug(
799
+ "[%s] Path after removing mark, if any: %s", registration_uuid, path
800
+ )
758
801
  self._copy_in(name=name, path=path, home=home, template=template)
759
- self.csvpaths.logger.debug("Done copying in")
802
+ self.csvpaths.logger.debug("[%s] Done copying in", registration_uuid)
760
803
  #
761
804
  # self.assure_docs_and_discriptor(name)
762
805
  # self.csvpaths.logger.debug("Assured docs and discriptor")
@@ -766,9 +809,13 @@ class FileManager:
766
809
  # done here.
767
810
  #
768
811
  rpath, h = self._fingerprint(home)
769
- self.csvpaths.logger.debug("Fingerprint of %s: %s", path, h)
812
+ self.csvpaths.logger.debug(
813
+ "[%s] Fingerprint of %s: %s", registration_uuid, path, h
814
+ )
770
815
  ret = f"${name}.files.{h}"
771
- self.csvpaths.logger.debug("Reference to named-file: %s", ret)
816
+ self.csvpaths.logger.debug(
817
+ "[%s] Reference to named-file: %s", registration_uuid, ret
818
+ )
772
819
  #
773
820
  # ---------------------------
774
821
  # maybe move the metadata handling to its own method?
@@ -777,7 +824,9 @@ class FileManager:
777
824
  # create the metadata event for this registration
778
825
  #
779
826
  name_home = self.named_file_home(name)
780
- self.csvpaths.logger.debug("Name home is %s", name_home)
827
+ self.csvpaths.logger.debug(
828
+ "[%s] Name home is %s", registration_uuid, name_home
829
+ )
781
830
  mdata = FileMetadata(self.csvpaths.config)
782
831
  #
783
832
  # add the ability to pass in a UUID. if received, use it here to
@@ -805,8 +854,8 @@ class FileManager:
805
854
  mdata.file_name = file_home[file_home.rfind(nos.sep) + 1 :]
806
855
  mdata.name_home = name_home
807
856
  mdata.mark = mark
808
- mdata.template = template
809
- self.csvpaths.logger.debug("Created metadata")
857
+ mdata.template = template or ""
858
+ self.csvpaths.logger.debug("[%s] Created metadata", registration_uuid)
810
859
  #
811
860
  # TODO: add file_size. move FileInfo into Nos. for now it is 0.
812
861
  #
@@ -815,17 +864,23 @@ class FileManager:
815
864
  # the fingerprint is the most precise way of referencing a particular
816
865
  # named-file version.
817
866
  #
818
- self.csvpaths.logger.debug("Registered %s", ret)
867
+ self.csvpaths.logger.debug("[%s] Registered %s", registration_uuid, ret)
819
868
  return ret
820
869
  except Exception as ex:
870
+ _ = {
871
+ "name": name,
872
+ "path": path,
873
+ "template": template,
874
+ "registration_uuid": registration_uuid,
875
+ }
876
+ self._registration_failed(_)
821
877
  #
822
878
  # remove me! tho, why you'd want quiet is not sure.
823
879
  #
824
- print(traceback.format_exc())
880
+ # print(traceback.format_exc())
825
881
  #
826
882
  #
827
- #
828
- msg = f"Error in loading named-file: {ex}"
883
+ msg = f"[{registration_uuid}] Error in loading named-file: {ex}"
829
884
  self.csvpaths.logger.error(msg)
830
885
  self.csvpaths.error_manager.handle_error(
831
886
  source=traceback.format_exc(), msg=msg
@@ -833,6 +888,16 @@ class FileManager:
833
888
  if self.csvpaths.ecoms.do_i_raise():
834
889
  raise
835
890
 
891
+ def _registration_failed(self, data: dict[str, str]) -> None:
892
+ lst = FilesListener(self.csvpaths)
893
+ mdata = FileMetadata(self.csvpaths.config)
894
+ mdata.named_file_name = data.get("name")
895
+ mdata.origin_path = data.get("path")
896
+ mdata.template = data.get("template") or ""
897
+ mdata.uuid_string = data.get("registration_uuid")
898
+ mdata.status = "Registration failed"
899
+ lst.metadata_update(mdata)
900
+
836
901
  def _validate_xlsx_mark(self, path: str, mark: str) -> None:
837
902
  if not XlsxReaderHelper.is_xlsx(path):
838
903
  raise ValueError(f"Not an Excel file: {path}")
@@ -1,6 +1,4 @@
1
1
  import os
2
- import json
3
- from datetime import datetime
4
2
  from csvpath.util.exceptions import InputException, FileException
5
3
  from csvpath.util.nos import Nos
6
4
  from csvpath.managers.registrar import Registrar
@@ -110,9 +108,9 @@ class FileRegistrar(Registrar, Listener):
110
108
  nos.path = old_home
111
109
  nos.rename(new_home)
112
110
  mani[index]["file_home"] = new_home
113
- mani[index][
114
- "file"
115
- ] = f"{new_home}{sep}{mani[index]['fingerprint']}.{mani[index]['type']}"
111
+ mani[index]["file"] = (
112
+ f"{new_home}{sep}{mani[index]['fingerprint']}.{mani[index]['type']}"
113
+ )
116
114
 
117
115
  def metadata_update(self, mdata: Metadata) -> None:
118
116
  path = mdata.origin_path
@@ -132,8 +130,7 @@ class FileRegistrar(Registrar, Listener):
132
130
  mani["from"] = path
133
131
  if mark is not None:
134
132
  mani["mark"] = mark
135
- if mdata.template is not None:
136
- mani["template"] = mdata.template
133
+ mani["template"] = mdata.template or ""
137
134
  jdata = self.get_manifest(manifest_path)
138
135
  jdata.append(mani)
139
136
  self.intermediary.put_json(manifest_path, jdata)
@@ -69,6 +69,8 @@ class FilesListener(Listener): # Registrar,
69
69
  if mdata.mark is not None:
70
70
  mani["mark"] = mdata.mark
71
71
  mani["manifest_path"] = self.manifest_path()
72
+ if hasattr(mdata, "status"):
73
+ mani["status"] = mdata.status
72
74
  return mani
73
75
 
74
76
  def metadata_update(self, mdata: Metadata) -> None:
@@ -165,4 +165,11 @@ class WebhookListener(Listener, threading.Thread):
165
165
  ...
166
166
 
167
167
  def _do_send(self, *, url: str, payload: dict, headers: dict, timeout: int):
168
+ #
169
+ # this is an expected occurance. any empty block captured by the FlightPath form
170
+ # will have no url but will exist so will be attempted. we just want to ignore
171
+ # those attempts
172
+ #
173
+ if not url:
174
+ return
168
175
  return requests.post(url, json=payload, headers=headers, timeout=timeout)
@@ -1,7 +1,7 @@
1
1
  from uuid import uuid4, UUID
2
2
  import os
3
3
  from abc import ABC
4
- from datetime import datetime, timezone
4
+ from datetime import datetime
5
5
  from dateutil import parser
6
6
  import getpass
7
7
  import socket
@@ -150,7 +150,6 @@ class Metadata(ABC):
150
150
 
151
151
  @time_started_string.setter
152
152
  def time_started_string(self, s: str) -> None:
153
- # self._time_started = datetime.date.fromisoformat(s)
154
153
  self._time_started = parser.parse(s)
155
154
 
156
155
  @property
@@ -1,5 +1,4 @@
1
1
  # pylint: disable=C0114
2
- import os
3
2
  from uuid import UUID
4
3
  import uuid
5
4
  import json
@@ -12,7 +11,7 @@ from csvpath.managers.listener import Listener
12
11
  from csvpath.managers.metadata import Metadata
13
12
  from csvpath.util.printer import Printer
14
13
  from csvpath.util.exceptions import CsvPathsException
15
- from csvpath.util.line_spooler import LineSpooler, CsvLineSpooler
14
+ from csvpath.util.line_spooler import LineSpooler
16
15
  from .result_serializer import ResultSerializer
17
16
  from .readers.readers import ResultReadersFacade
18
17
  from csvpath.matching.util.expression_utility import ExpressionUtility
@@ -40,6 +39,7 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
40
39
  by_line: bool = False,
41
40
  run_uuid: UUID,
42
41
  method: str = None,
42
+ template: str = None,
43
43
  ):
44
44
  """@private"""
45
45
  ErrorCollector.__init__(self)
@@ -105,6 +105,7 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
105
105
  self._lines: list[list[Any]] = None
106
106
  self._readers_facade = ResultReadersFacade(self)
107
107
  self._run_uuid = run_uuid
108
+ self._template = template or ""
108
109
 
109
110
  @property
110
111
  def actual_data_file(self) -> str:
@@ -121,6 +122,10 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
121
122
  )
122
123
  return self._origin_data_file
123
124
 
125
+ @property
126
+ def template(self) -> str:
127
+ return self._template
128
+
124
129
  @property
125
130
  def uuid(self) -> UUID:
126
131
  if self._uuid is None:
@@ -365,6 +365,7 @@ class ResultsManager: # pylint: disable=C0115
365
365
  mdata.named_paths_name = result.paths_name
366
366
  mdata.named_file_name = result.file_name
367
367
  mdata.method = result.method
368
+ mdata.template = result.template or ""
368
369
  rr = RunRegistrar(self.csvpaths)
369
370
  #
370
371
  # add any dynamic listeners to the registrar here
@@ -12,6 +12,10 @@ class TransfersManager:
12
12
  def __init__(self, *, results_manager):
13
13
  self._results_manager = results_manager
14
14
 
15
+ @property
16
+ def logger(self):
17
+ return self.csvpaths.logger
18
+
15
19
  @property
16
20
  def csvpaths(self):
17
21
  return self.results_manager.csvpaths
@@ -22,21 +26,25 @@ class TransfersManager:
22
26
 
23
27
  def do_transfers_if(self, result) -> None:
24
28
  try:
29
+ self.logger.info(
30
+ "Checking for transfers from run: %s declared on named-paths group: %s for statement: %s",
31
+ result.run_uuid,
32
+ result.paths_name,
33
+ result.identity_or_index,
34
+ )
25
35
  self.do_transfer_mode_if(result)
26
- except Exception as ex:
27
- #
28
- # handle better!
29
- #
30
- print(traceback.format_exc())
31
- self.results_manager.csvpaths.logger.error(ex)
36
+ except Exception:
37
+ self.logger.error(traceback.format_exc())
32
38
  try:
39
+ self.logger.info(
40
+ "Checking for transfers from run: %s in named-paths group: %s declared by statement: %s",
41
+ result.run_uuid,
42
+ result.paths_name,
43
+ result.identity_or_index,
44
+ )
33
45
  self.do_description_transfers_if(result)
34
- except Exception as ex:
35
- #
36
- # handle better!
37
- #
38
- print(traceback.format_exc())
39
- self.results_manager.csvpaths.logger.error(ex)
46
+ except Exception:
47
+ self.logger.error(traceback.format_exc())
40
48
 
41
49
  def do_description_transfers_if(self, result) -> None:
42
50
  #
@@ -226,6 +234,12 @@ class TransfersManager:
226
234
  for t in tpaths:
227
235
  pathfrom = t[2]
228
236
  pathto = t[3]
237
+ self.logger.info(
238
+ "Attempting transfer of %s to %s for named-paths group %s",
239
+ pathfrom,
240
+ pathto,
241
+ name,
242
+ )
229
243
  try:
230
244
  rmode = "rb" if "b" in t[4] else "r"
231
245
  n = pathu.dir_name(pathto)
@@ -253,12 +267,17 @@ class TransfersManager:
253
267
  writer.sink.write(pf.read())
254
268
  finally:
255
269
  writer.close()
270
+ self.logger.info(
271
+ "Done transfering %s to %s for named-paths group %s",
272
+ pathfrom,
273
+ pathto,
274
+ name,
275
+ )
256
276
  except Exception:
257
- print(traceback.format_exc())
258
- logger = self.results_manager.csvpaths.logger
259
- logger.warning(
260
- "Cannot transfer %s to %s", pathfrom, pathto, exc_info=True
277
+ self.logger.error(
278
+ "Error in transfers of %s for named-paths group %s", tpaths, name
261
279
  )
280
+ self.logger.error(traceback.format_exc())
262
281
 
263
282
  def _path_to_transfer_to(self, result, t) -> str:
264
283
  if result is None:
@@ -1,6 +1,6 @@
1
1
  from csvpath.managers.metadata import Metadata
2
2
 
3
- from uuid import uuid4, UUID
3
+ from uuid import UUID
4
4
 
5
5
 
6
6
  class RunMetadata(Metadata):
@@ -12,6 +12,15 @@ class RunMetadata(Metadata):
12
12
  self.identity: str = None
13
13
  self._run_uuid: UUID = None
14
14
  self._method: str = None
15
+ self._template: str = ""
16
+
17
+ @property
18
+ def template(self) -> str:
19
+ return self._template
20
+
21
+ @template.setter
22
+ def template(self, t: str) -> None:
23
+ self._template = t
15
24
 
16
25
  @property
17
26
  def run_uuid(self) -> UUID:
@@ -1,8 +1,4 @@
1
- import os
2
- import time
3
1
  import json
4
- from abc import ABC, abstractmethod
5
- from csvpath.util.exceptions import FileException
6
2
  from csvpath.util.file_writers import DataFileWriter
7
3
  from csvpath.util.file_readers import DataFileReader
8
4
  from csvpath.util.nos import Nos
@@ -13,7 +9,6 @@ from ..metadata import Metadata
13
9
 
14
10
  class RunRegistrar(Registrar, Listener):
15
11
  def __init__(self, csvpaths):
16
- # super().__init__(csvpaths)
17
12
  Registrar.__init__(self, csvpaths)
18
13
  Listener.__init__(self, csvpaths.config)
19
14
  self.type_name = "run"
@@ -22,7 +17,6 @@ class RunRegistrar(Registrar, Listener):
22
17
  @property
23
18
  def manifest_path(self) -> str:
24
19
  return Nos(self.archive).join("manifest.json")
25
- # return os.path.join(self.archive, "manifest.json")
26
20
 
27
21
  @property
28
22
  def manifest(self) -> list:
@@ -54,6 +48,7 @@ class RunRegistrar(Registrar, Listener):
54
48
  m["base_path"] = mdata.base_path
55
49
  m["named_files_root"] = mdata.named_files_root
56
50
  m["named_paths_root"] = mdata.named_paths_root
51
+ m["template"] = mdata.template or ""
57
52
  #
58
53
  #
59
54
  #
@@ -113,7 +113,11 @@ allow_http_files=True
113
113
  allow_local_files=True
114
114
 
115
115
  [listeners]
116
- # add listener group names to send events to the channel they represent
116
+ #
117
+ # add listener group names to send events to the channel they represent. default
118
+ # tracks registrations, loads, and (soon) results at the highest level. it isn't
119
+ # required, but it is highly recommended.
120
+ #
117
121
  groups = default,activation
118
122
  #slack, openlineage, ckan, sftp, sftpplus, otlp, sqlite, sql
119
123
 
@@ -34,9 +34,12 @@ class DataFileWriter(ABC):
34
34
 
35
35
  def close(self) -> None:
36
36
  if self.sink is not None:
37
- self.sink.flush()
38
- self.sink.close()
39
- self.sink = None
37
+ try:
38
+ self.sink.flush()
39
+ self.sink.close()
40
+ self.sink = None
41
+ except Exception as e:
42
+ ...
40
43
 
41
44
  @abstractmethod
42
45
  def load_if(self) -> None:
@@ -294,7 +294,7 @@ class LogUtility:
294
294
  #
295
295
  # there will be 0, 1, or 2 handlers. we clear them and start fresh.
296
296
  #
297
- for _ in logger.handlers:
297
+ for _ in logger.handlers[:]:
298
298
  _.flush()
299
299
  _.close()
300
300
  logger.removeHandler(_)