csvpath 0.0.559__tar.gz → 0.0.561__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 (354) hide show
  1. {csvpath-0.0.559 → csvpath-0.0.561}/PKG-INFO +2 -1
  2. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-local-azure.ini +3 -3
  3. {csvpath-0.0.559 → csvpath-0.0.561}/config/config.ini +5 -5
  4. csvpath-0.0.561/config/env.json +1 -0
  5. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/csvpaths.py +41 -5
  6. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/metrics.py +52 -33
  7. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +8 -1
  8. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_results_listener.py +1 -0
  9. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/registrar.py +24 -19
  10. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/result.py +6 -0
  11. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/result_metadata.py +3 -3
  12. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/results_manager.py +26 -1
  13. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/results_metadata.py +10 -0
  14. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/results_registrar.py +1 -0
  15. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/run/run_metadata.py +9 -0
  16. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/validity/line.py +3 -2
  17. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/reference.py +1 -1
  18. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/config.py +207 -181
  19. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/config_env.py +1 -3
  20. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_utils.py +2 -4
  21. {csvpath-0.0.559 → csvpath-0.0.561}/pyproject.toml +2 -1
  22. csvpath-0.0.559/config/env.json +0 -1
  23. {csvpath-0.0.559 → csvpath-0.0.561}/LICENSE +0 -0
  24. {csvpath-0.0.559 → csvpath-0.0.561}/README.md +0 -0
  25. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/config.ini +0 -0
  26. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/function.imports +0 -0
  27. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  28. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-local-gcs.ini +0 -0
  29. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-local-s3.ini +0 -0
  30. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-local-sftp.ini +0 -0
  31. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-windows-azure.ini +0 -0
  32. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-windows-gcs.ini +0 -0
  33. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-windows-local.ini +0 -0
  34. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-windows-s3.ini +0 -0
  35. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/jenkins-windows-sftp.ini +0 -0
  36. {csvpath-0.0.559 → csvpath-0.0.561}/assets/config/local-localhost-sftp.ini +0 -0
  37. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  38. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/azure.sh +0 -0
  39. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
  40. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/gcs.sh +0 -0
  41. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  42. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/local.sh +0 -0
  43. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  44. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/s3.sh +0 -0
  45. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  46. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/mac/sftp.sh +0 -0
  47. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/azure.bat +0 -0
  48. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/gcs.bat +0 -0
  49. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/local.bat +0 -0
  50. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/s3.bat +0 -0
  51. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/sftp.bat +0 -0
  52. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  53. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  54. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  55. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  56. {csvpath-0.0.559 → csvpath-0.0.561}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  57. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  58. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  59. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  60. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  61. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  62. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  63. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sqlite/csvpath +0 -0
  64. {csvpath-0.0.559 → csvpath-0.0.561}/assets/integrations/sqlite/schema.sql +0 -0
  65. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/__init__.py +0 -0
  66. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/__init__.py +0 -0
  67. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/asker.py +0 -0
  68. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/cli.py +0 -0
  69. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/const.py +0 -0
  70. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/debug_config.py +0 -0
  71. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/drill_down.py +0 -0
  72. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/function_describer.py +0 -0
  73. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/function_lister.py +0 -0
  74. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/cli/selecter.py +0 -0
  75. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/csvpath.py +0 -0
  76. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/__init__.py +0 -0
  77. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/errors/error.py +0 -0
  78. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/errors/error_collector.py +0 -0
  79. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/errors/error_comms.py +0 -0
  80. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/errors/error_manager.py +0 -0
  81. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/files/file_manager.py +0 -0
  82. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/files/file_metadata.py +0 -0
  83. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/files/file_registrar.py +0 -0
  84. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/files/files_listener.py +0 -0
  85. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  86. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  87. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  88. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  89. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  90. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/event.py +0 -0
  91. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/event_result.py +0 -0
  92. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  93. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/job.py +0 -0
  94. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  95. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  96. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  97. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  98. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/run.py +0 -0
  99. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  100. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/run_state.py +0 -0
  101. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/ol/sender.py +0 -0
  102. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  103. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  104. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  105. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  106. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  107. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  108. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  109. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  110. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
  111. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
  112. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
  113. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
  114. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/slack/event.py +0 -0
  115. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/slack/sender.py +0 -0
  116. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/engine.py +0 -0
  117. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  118. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  119. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  120. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  121. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  122. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/tables.py +0 -0
  123. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sql/updates.py +0 -0
  124. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  125. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  126. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  127. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  128. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  129. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/listener.py +0 -0
  130. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/metadata.py +0 -0
  131. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/paths/paths_listener.py +0 -0
  132. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/paths/paths_manager.py +0 -0
  133. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/paths/paths_metadata.py +0 -0
  134. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/paths/paths_registrar.py +0 -0
  135. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  136. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  137. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  138. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  139. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/readers/readers.py +0 -0
  140. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/result_file_reader.py +0 -0
  141. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/result_registrar.py +0 -0
  142. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/results/result_serializer.py +0 -0
  143. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/run/run_listener_stdout.py +0 -0
  144. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/run/run_registrar.py +0 -0
  145. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/managers/test_listener.py +0 -0
  146. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/__init__.py +0 -0
  147. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/__init__.py +0 -0
  148. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/args.py +0 -0
  149. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/args_helper.py +0 -0
  150. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/all.py +0 -0
  151. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/andf.py +0 -0
  152. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/any.py +0 -0
  153. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/between.py +0 -0
  154. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/empty.py +0 -0
  155. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/exists.py +0 -0
  156. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/inf.py +0 -0
  157. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/no.py +0 -0
  158. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/notf.py +0 -0
  159. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/orf.py +0 -0
  160. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/boolean/yes.py +0 -0
  161. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/count.py +0 -0
  162. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  163. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/count_headers.py +0 -0
  164. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/count_lines.py +0 -0
  165. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/count_scans.py +0 -0
  166. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/counter.py +0 -0
  167. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/every.py +0 -0
  168. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/has_matches.py +0 -0
  169. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/increment.py +0 -0
  170. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/tally.py +0 -0
  171. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/counting/total_lines.py +0 -0
  172. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/dates/now.py +0 -0
  173. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/function.py +0 -0
  174. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/function_factory.py +0 -0
  175. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/function_finder.py +0 -0
  176. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/function_focus.py +0 -0
  177. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/append.py +0 -0
  178. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/collect.py +0 -0
  179. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  180. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/end.py +0 -0
  181. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/header_name.py +0 -0
  182. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  183. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/headers.py +0 -0
  184. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/insert.py +0 -0
  185. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/mismatch.py +0 -0
  186. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/replace.py +0 -0
  187. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  188. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/advance.py +0 -0
  189. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/after_blank.py +0 -0
  190. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/dups.py +0 -0
  191. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/first.py +0 -0
  192. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/first_line.py +0 -0
  193. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/last.py +0 -0
  194. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/lines/stop.py +0 -0
  195. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/above.py +0 -0
  196. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/add.py +0 -0
  197. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/divide.py +0 -0
  198. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/equals.py +0 -0
  199. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/intf.py +0 -0
  200. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/mod.py +0 -0
  201. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/multiply.py +0 -0
  202. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/odd.py +0 -0
  203. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/round.py +0 -0
  204. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/subtotal.py +0 -0
  205. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/subtract.py +0 -0
  206. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/math/sum.py +0 -0
  207. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  208. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/misc/importf.py +0 -0
  209. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/misc/random.py +0 -0
  210. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/print/jinjaf.py +0 -0
  211. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/print/print_line.py +0 -0
  212. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/print/print_queue.py +0 -0
  213. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/print/printf.py +0 -0
  214. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/print/table.py +0 -0
  215. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/stats/minf.py +0 -0
  216. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/stats/nminmax.py +0 -0
  217. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/stats/percent.py +0 -0
  218. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  219. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/stats/stdev.py +0 -0
  220. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/alter.py +0 -0
  221. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/caps.py +0 -0
  222. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/concat.py +0 -0
  223. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/contains.py +0 -0
  224. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/length.py +0 -0
  225. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/lower.py +0 -0
  226. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/metaphone.py +0 -0
  227. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/regex.py +0 -0
  228. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/starts_with.py +0 -0
  229. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/strip.py +0 -0
  230. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/substring.py +0 -0
  231. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/strings/upper.py +0 -0
  232. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/testing/debug.py +0 -0
  233. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/__init__.py +0 -0
  234. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/boolean.py +0 -0
  235. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/datatype.py +0 -0
  236. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/datef.py +0 -0
  237. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/decimal.py +0 -0
  238. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/email.py +0 -0
  239. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/nonef.py +0 -0
  240. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/string.py +0 -0
  241. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/type.py +0 -0
  242. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/types/url.py +0 -0
  243. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/validity/fail.py +0 -0
  244. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/validity/failed.py +0 -0
  245. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/variables/get.py +0 -0
  246. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/variables/pushpop.py +0 -0
  247. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/variables/put.py +0 -0
  248. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/variables/track.py +0 -0
  249. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/functions/variables/variables.py +0 -0
  250. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/lark_parser.py +0 -0
  251. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/lark_transformer.py +0 -0
  252. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/matcher.py +0 -0
  253. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/__init__.py +0 -0
  254. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/equality.py +0 -0
  255. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/expression.py +0 -0
  256. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/header.py +0 -0
  257. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/matchable.py +0 -0
  258. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/qualified.py +0 -0
  259. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/term.py +0 -0
  260. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/productions/variable.py +0 -0
  261. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/exceptions.py +0 -0
  262. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/expression_encoder.py +0 -0
  263. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/expression_utility.py +0 -0
  264. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/lark_print_parser.py +0 -0
  265. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/print_parser.py +0 -0
  266. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/matching/util/runtime_data_collector.py +0 -0
  267. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/error_mode.py +0 -0
  268. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/explain_mode.py +0 -0
  269. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/files_mode.py +0 -0
  270. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/logic_mode.py +0 -0
  271. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/mode_controller.py +0 -0
  272. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/print_mode.py +0 -0
  273. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/return_mode.py +0 -0
  274. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/run_mode.py +0 -0
  275. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/source_mode.py +0 -0
  276. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/transfer_mode.py +0 -0
  277. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/unmatched_mode.py +0 -0
  278. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/modes/validation_mode.py +0 -0
  279. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/scanning/__init__.py +0 -0
  280. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/scanning/scanner2.py +0 -0
  281. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/scanning/scanner2_parser.py +0 -0
  282. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/scanning/scanner2_transformer.py +0 -0
  283. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_data_reader.py +0 -0
  284. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_data_writer.py +0 -0
  285. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  286. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_nos.py +0 -0
  287. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_utils.py +0 -0
  288. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  289. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/backend_check.py +0 -0
  290. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/box.py +0 -0
  291. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/cache.py +0 -0
  292. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/caser.py +0 -0
  293. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/class_loader.py +0 -0
  294. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/code.py +0 -0
  295. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/config_exception.py +0 -0
  296. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/date_util.py +0 -0
  297. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/exceptions.py +0 -0
  298. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/file_info.py +0 -0
  299. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/file_readers.py +0 -0
  300. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/file_writers.py +0 -0
  301. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  302. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  303. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  304. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_nos.py +0 -0
  305. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_utils.py +0 -0
  306. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  307. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/hasher.py +0 -0
  308. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/http/http_data_reader.py +0 -0
  309. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/intermediary.py +0 -0
  310. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/last_line_stats.py +0 -0
  311. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/line_counter.py +0 -0
  312. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/line_monitor.py +0 -0
  313. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/line_spooler.py +0 -0
  314. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/log_utility.py +0 -0
  315. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/metadata_parser.py +0 -0
  316. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/nos.py +0 -0
  317. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/pandas_data_reader.py +0 -0
  318. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/path_util.py +0 -0
  319. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/printer.py +0 -0
  320. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/files_reference_finder_2.py +0 -0
  321. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  322. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/files_tools/range_finder.py +0 -0
  323. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/ref_utils.py +0 -0
  324. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_exceptions.py +0 -0
  325. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_grammar.py +0 -0
  326. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  327. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_parser.py +0 -0
  328. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_results.py +0 -0
  329. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/reference_transformer.py +0 -0
  330. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_reference_finder_2.py +0 -0
  331. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/data_finder.py +0 -0
  332. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/date_filter.py +0 -0
  333. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  334. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/path_filter.py +0 -0
  335. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  336. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/token_filters.py +0 -0
  337. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  338. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/references/tools/date_completer.py +0 -0
  339. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/run_home_maker.py +0 -0
  340. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_data_reader.py +0 -0
  341. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_data_writer.py +0 -0
  342. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  343. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_nos.py +0 -0
  344. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  345. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_config.py +0 -0
  346. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  347. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  348. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  349. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_nos.py +0 -0
  350. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_walk.py +0 -0
  351. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  352. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/sqliter.py +0 -0
  353. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/template_util.py +0 -0
  354. {csvpath-0.0.559 → csvpath-0.0.561}/csvpath/util/var_utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: csvpath
3
- Version: 0.0.559
3
+ Version: 0.0.561
4
4
  Summary: A data preboarding framework for managing and validating CSV, Excel, and other tabular data files using a Collect, Store, Validate, Publish pattern to create a trusted publisher for downstream data consumers.
5
5
  Author: David Kershaw
6
6
  Author-email: dk107dk@hotmail.com
@@ -34,6 +34,7 @@ Requires-Dist: metaphone (>=0.6,<0.7)
34
34
  Requires-Dist: mysqlclient (>=2.2.7,<3.0.0)
35
35
  Requires-Dist: openlineage-python (>=1.25.0,<2.0.0)
36
36
  Requires-Dist: opentelemetry-distro[otlp] (>=0.50b0,<0.51)
37
+ Requires-Dist: pandas (>=2.2.2,<3.0.0) ; extra == "pandas"
37
38
  Requires-Dist: paramiko (>=3.5.0,<4.0.0)
38
39
  Requires-Dist: pdoc (>=15.0.1,<16.0.0)
39
40
  Requires-Dist: prompt-toolkit (>=3.0.50,<4.0.0)
@@ -11,8 +11,8 @@ extensions = csvpath, csvpaths
11
11
  extensions = csv, tsv, dat, tab, psv, ssv
12
12
 
13
13
  [errors]
14
- csvpath = raise, collect, print
15
- csvpaths = raise, collect, print
14
+ csvpath = print,fail,collect
15
+ csvpaths = print,collect
16
16
  use_format = full
17
17
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
18
18
 
@@ -46,7 +46,7 @@ allow_http_files = True
46
46
  allow_local_files = True
47
47
 
48
48
  [listeners]
49
- groups =
49
+ groups = default
50
50
  sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
51
51
  sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
52
52
  default.file = from csvpath.managers.files.files_listener import FilesListener
@@ -17,15 +17,15 @@ use_format = full
17
17
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
18
18
 
19
19
  [logging]
20
- csvpath = info
21
- csvpaths = info
20
+ csvpath = debug
21
+ csvpaths = debug
22
22
  log_file = logs/csvpath.log
23
23
  log_files_to_keep = 100
24
24
  log_file_size = 52428800
25
25
  handler = file
26
26
 
27
27
  [config]
28
- path = assets/config/config.ini
28
+ path = config/config.ini
29
29
  allow_var_sub = True
30
30
  var_sub_source = env
31
31
 
@@ -104,7 +104,7 @@ port = SFTPPLUS_PORT
104
104
  admin_username = SFTPPLUS_ADMIN_USERNAME
105
105
  admin_password = SFTPPLUS_ADMIN_PASSWORD
106
106
  api_url = https://localhost:10020/json
107
- scripts_dir =
107
+ scripts_dir =
108
108
  execute_timeout = 300
109
109
 
110
110
  [ckan]
@@ -119,7 +119,7 @@ timeout = 5
119
119
  verify = False
120
120
 
121
121
  [slack]
122
- webhook_url =
122
+ webhook_url =
123
123
 
124
124
  [scripts]
125
125
  run_scripts = yes
@@ -0,0 +1 @@
1
+ {}
@@ -160,6 +160,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
160
160
  """ @private """
161
161
  self._config._assure_logs_path()
162
162
  self.logger = LogUtility.logger(self)
163
+ self.info_dump()
163
164
  """ @private """
164
165
  self._errors = []
165
166
  # coordinator attributes
@@ -200,9 +201,20 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
200
201
  """ @private """
201
202
 
202
203
  self.logger.info(
203
- "Initialized CsvPaths: {self} in thread: {threading.currentThread()}"
204
+ f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
204
205
  )
205
206
 
207
+ def info_dump(self) -> None:
208
+ self.logger.info(
209
+ "Initated logging on log path: %s",
210
+ self.config.get(section="logging", name="log_file"),
211
+ )
212
+ self.logger.info("Config file is at: %s", self.config.configpath)
213
+ intgs = self.config.get(section="listeners", name="groups")
214
+ self.logger.debug("Active integrations:")
215
+ for _ in intgs:
216
+ self.logger.debug(" - %s", _)
217
+
206
218
  def _set_managers(self) -> None:
207
219
  self.paths_manager = PathsManager(csvpaths=self)
208
220
  self.file_manager = FileManager(csvpaths=self)
@@ -670,6 +682,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
670
682
  filename=filename,
671
683
  file=file,
672
684
  run_uuid=run_uuid,
685
+ method="collect_paths",
673
686
  )
674
687
  #
675
688
  #
@@ -686,6 +699,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
686
699
  run_time=self.current_run_time,
687
700
  run_dir=crt,
688
701
  run_uuid=run_uuid,
702
+ method="collect_paths",
689
703
  )
690
704
  # casting a broad net because if "raise" not in the error policy we
691
705
  # want to never fail during a run
@@ -813,7 +827,11 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
813
827
  # run starts here
814
828
  #
815
829
  self.run_metadata = self.results_manager.start_run(
816
- run_dir=crt, pathsname=pathsname, filename=filename, run_uuid=run_uuid
830
+ run_dir=crt,
831
+ pathsname=pathsname,
832
+ filename=filename,
833
+ run_uuid=run_uuid,
834
+ method="fast_forward_paths",
817
835
  )
818
836
  #
819
837
  #
@@ -830,6 +848,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
830
848
  run_time=self.current_run_time,
831
849
  run_dir=crt,
832
850
  run_uuid=run_uuid,
851
+ method="fast_forward_paths",
833
852
  )
834
853
  try:
835
854
  self._load_csvpath(
@@ -923,7 +942,11 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
923
942
  # run starts here
924
943
  #
925
944
  self.run_metadata = self.results_manager.start_run(
926
- run_dir=crt, pathsname=pathsname, filename=filename, run_uuid=run_uuid
945
+ run_dir=crt,
946
+ pathsname=pathsname,
947
+ filename=filename,
948
+ run_uuid=run_uuid,
949
+ method="next_paths",
927
950
  )
928
951
  #
929
952
  #
@@ -956,6 +979,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
956
979
  run_time=self.current_run_time,
957
980
  run_dir=crt,
958
981
  run_uuid=run_uuid,
982
+ method="next_paths",
959
983
  )
960
984
  if self._fail_all:
961
985
  self.logger.warning(
@@ -1043,6 +1067,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1043
1067
  collect_when_not_matched=collect_when_not_matched,
1044
1068
  file=file,
1045
1069
  template=template,
1070
+ method="collect_by_line",
1046
1071
  ):
1047
1072
  # re: W0612: we need 'line' in order to do the iteration. we have to iterate.
1048
1073
  lines.append(line)
@@ -1091,6 +1116,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1091
1116
  collect_when_not_matched=collect_when_not_matched,
1092
1117
  file=file,
1093
1118
  template=template,
1119
+ method="fast_forward_by_line",
1094
1120
  ):
1095
1121
  # re: W0612: we need 'line' in order to do the iteration. we have to iterate.
1096
1122
  pass
@@ -1117,6 +1143,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1117
1143
  if_all_agree=False,
1118
1144
  collect_when_not_matched=False,
1119
1145
  template: str = None,
1146
+ method: str = None,
1120
1147
  ) -> List[Any]:
1121
1148
  #
1122
1149
  # we're doing a programmatic use when we use next_by_line() so we don't allow
@@ -1147,6 +1174,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1147
1174
  collect_when_not_matched=False,
1148
1175
  template: str = None,
1149
1176
  file: str,
1177
+ method: str = "next_by_line",
1150
1178
  ) -> List[Any]:
1151
1179
  """Does a CsvPath.next() on filename where each row is considered
1152
1180
  by every named path before the next row starts.
@@ -1200,6 +1228,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1200
1228
  filename=filename,
1201
1229
  pathsname=pathsname,
1202
1230
  crt=crt,
1231
+ method=method,
1203
1232
  )
1204
1233
  #
1205
1234
  # setting file into the csvpath is less obviously useful at CsvPaths
@@ -1370,7 +1399,9 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1370
1399
  self.error_manager.handle_error(source=self, msg=f"{ex}")
1371
1400
  return csvpath_objects
1372
1401
 
1373
- def _prep_csvpath_results(self, *, csvpath_objects, filename, pathsname, crt: str):
1402
+ def _prep_csvpath_results(
1403
+ self, *, csvpath_objects, filename, pathsname, crt: str, method: str
1404
+ ):
1374
1405
  """@private"""
1375
1406
  #
1376
1407
  #
@@ -1380,7 +1411,11 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1380
1411
  # run starts here
1381
1412
  #
1382
1413
  self.run_metadata = self.results_manager.start_run(
1383
- run_dir=crt, pathsname=pathsname, filename=filename, run_uuid=run_uuid
1414
+ run_dir=crt,
1415
+ pathsname=pathsname,
1416
+ filename=filename,
1417
+ run_uuid=run_uuid,
1418
+ method="next_paths",
1384
1419
  )
1385
1420
  #
1386
1421
  #
@@ -1400,6 +1435,7 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
1400
1435
  run_dir=crt,
1401
1436
  by_line=True,
1402
1437
  run_uuid=run_uuid,
1438
+ method=method,
1403
1439
  )
1404
1440
  csvpath[1] = result
1405
1441
  #
@@ -64,39 +64,57 @@ class Metrics:
64
64
  @property
65
65
  def provider(self) -> LoggerProvider:
66
66
  if self._provider is None:
67
- # Add resource information
68
- resource = Resource.create(
69
- {"service.name": "CsvPath", "service.version": "1.0.0"}
70
- )
71
- self._provider = LoggerProvider(resource=resource)
72
- set_logger_provider(self._provider)
73
- #
74
- # these were working values for openobserve. I don't think we need
75
- # OTEL_EXPORTER_OTLP_PROTOCOL since we are programmatically instantiating
76
- # the protobuf
77
- #
78
- # OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
79
- # OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5080/api/default
80
- # OTEL_EXPORTER_OTLP_HEADERS=Authorization=Basic ZGsxMDdka0Bob3RtYWlsLmNvbTpoYW5nemhvdQ==,stream-name=FlightPath
81
- #
82
- # certificate_file=None,
83
- # client_key_file=None,
84
- # client_certificate_file=None,
85
- # timeout=None,
86
- # compression=None,
87
- # session=None
88
- #
89
- # in CsvPath and FlightPath Data these can come from regular env vars
90
- # but in FlightPath Server they must come from var_sub_source=config/env.json
91
- # because we plan to allow projects to push data to their own choice of OTLP
92
- # platform. FlightPath Data will have to provide an API for setting env.json
93
- # and assistence in copying its own env vars and the OS env vars to env.json
94
- # on the server.
95
- #
96
- endpoint = self._get(name="OTEL_EXPORTER_OTLP_ENDPOINT")
97
- headers = self._get(name="OTEL_EXPORTER_OTLP_HEADERS")
98
- exporter = OTLPLogExporter(endpoint=endpoint, headers=headers)
99
- self._provider.add_log_record_processor(BatchLogRecordProcessor(exporter))
67
+ try:
68
+ # Add resource information
69
+ resource = Resource.create(
70
+ {"service.name": "CsvPath", "service.version": "1.0.0"}
71
+ )
72
+ self._provider = LoggerProvider(resource=resource)
73
+ set_logger_provider(self._provider)
74
+ #
75
+ # these were working values for a local openobserve.
76
+ #
77
+ # OTEL_EXPORTER_OTLP_ENDPOINT=http://0.0.0.0:5080/api/default/v1/logs
78
+ # OTEL_EXPORTER_OTLP_HEADERS=Authorization=Basic ZGsxMDdka0Bob3RtYWlsLmNvbTpoYW5nemhvdQ==,stream-name=flightpath
79
+ #
80
+ # certificate_file=None,
81
+ # client_key_file=None,
82
+ # client_certificate_file=None,
83
+ # timeout=None,
84
+ # compression=None,
85
+ # session=None
86
+ #
87
+ # in CsvPath and FlightPath Data these can come from regular env vars
88
+ # but in FlightPath Server they must come from var_sub_source=config/env.json
89
+ # because we plan to allow projects to push data to their own choice of OTLP
90
+ # platform. FlightPath Data will have to provide an API for setting env.json
91
+ # and assistence in copying its own env vars and the OS env vars to env.json
92
+ # on the server.
93
+ #
94
+ endpoint = self._get(name="OTEL_EXPORTER_OTLP_LOGS_ENDPOINT")
95
+ if endpoint is None or endpoint == "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT":
96
+ endpoint = self._get(name="OTEL_EXPORTER_OTLP_ENDPOINT")
97
+ if endpoint is None or endpoint == "OTEL_EXPORTER_OTLP_ENDPOINT":
98
+ raise ValueError(
99
+ "You must pass either OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_LOGS_ENDPOINT, the latter preferred"
100
+ )
101
+ headers = self._get(name="OTEL_EXPORTER_OTLP_HEADERS")
102
+ if headers is None or headers == "OTEL_EXPORTER_OTLP_HEADERS":
103
+ raise ValueError("OTEL_EXPORTER_OTLP_HEADERS cannot be None")
104
+ headers = headers.split(",")
105
+ d = {}
106
+ for _ in headers:
107
+ k = _[0 : _.find("=")]
108
+ v = _[_.find("=") + 1 :]
109
+ d[k] = v
110
+ exporter = OTLPLogExporter(endpoint=endpoint, headers=d)
111
+ self._provider.add_log_record_processor(
112
+ BatchLogRecordProcessor(exporter)
113
+ )
114
+ except Exception as ex:
115
+ if self._csvpaths:
116
+ self._csvpaths.logger.error("Cannot configure OTLP")
117
+ self._csvpaths.logger.error(ex)
100
118
  return self._provider
101
119
 
102
120
  def logger(self, project: str = "csvpath") -> Logger:
@@ -114,4 +132,5 @@ class Metrics:
114
132
  # Prevent propagation to avoid duplicate logs
115
133
  logger.propagate = False
116
134
  Metrics.LOGGERS[project] = logger
135
+ # logging.basicConfig(level=logging.DEBUG)
117
136
  return logger
@@ -21,6 +21,13 @@ class OpenTelemetryPathsListener(OtlpListener):
21
21
  )
22
22
  self.assure_metrics()
23
23
  try:
24
+ ids = []
25
+ #
26
+ # otlp doesn't like Nones. should there not be any?
27
+ #
28
+ for _ in mdata.named_paths_identities:
29
+ if _:
30
+ ids.append(_)
24
31
  etype = "named-paths group load"
25
32
  extra = {
26
33
  "event_type": etype,
@@ -29,7 +36,7 @@ class OpenTelemetryPathsListener(OtlpListener):
29
36
  "named_paths_home": mdata.named_paths_home,
30
37
  "group_file_path": mdata.group_file_path,
31
38
  "named_paths_count": mdata.named_paths_count,
32
- "named_paths_identities": mdata.named_paths_identities,
39
+ "named_paths_identities": ids,
33
40
  "source_path": mdata.source_path,
34
41
  "template": mdata.template if mdata.template else "",
35
42
  **self.core_meta(mdata),
@@ -49,6 +49,7 @@ class OpenTelemetryResultsListener(OtlpListener):
49
49
  self.csvpaths.__class__.METRICS.logger().debug(
50
50
  "Csvpath completed", extra=extra
51
51
  )
52
+ self.csvpaths.logger.info("Csvpath shipped log entry to OTLP integration")
52
53
  except Exception as ex:
53
54
  print(traceback.format_exc())
54
55
  self.csvpaths.logger.error(ex)
@@ -51,13 +51,18 @@ class Registrar(ABC):
51
51
  # notable exception of errors, errors are not thrown in non-CsvPaths code.
52
52
  #
53
53
  if self.csvpaths is not None:
54
+ self.csvpaths.logger.info("Distributing updates to listeners")
54
55
  try:
55
56
  self.load_additional_listeners(self.type_name, listeners)
56
57
  except Exception as ex:
57
58
  print(traceback.format_exc())
58
59
  if self.csvpaths:
59
- self.csvpaths.logger(f"Error in loading listeners: {ex}")
60
+ self.csvpaths.logger.error(f"Error in loading listeners: {ex}")
60
61
  for lst in listeners:
62
+ if self.csvpaths:
63
+ self.csvpaths.logger.debug(
64
+ "Updating listener %s with metadata %s", lst, mdata
65
+ )
61
66
  try:
62
67
  lst.metadata_update(mdata)
63
68
  except Exception as ex:
@@ -75,27 +80,27 @@ class Registrar(ABC):
75
80
  """
76
81
  if self.csvpaths:
77
82
  ss = self.csvpaths.config.additional_listeners(listener_type_name)
83
+ self.csvpaths.logger.info("Loading additional listener type(s) %s", ss)
78
84
  if ss and not isinstance(ss, list):
79
85
  ss = [ss]
80
86
  if ss and len(ss) > 0:
81
87
  for lst in ss:
82
- try:
83
- self.load_additional_listener(lst, listeners)
84
- except Exception as ex:
85
- print(traceback.format_exc())
86
- self.csvpaths.logger.error(
87
- f"Failed to load listener {lst}: {ex}"
88
- )
88
+ self.load_additional_listener(lst, listeners)
89
89
 
90
90
  def load_additional_listener(self, load_cmd: str, listeners: list) -> None:
91
- loader = ClassLoader()
92
- alistener = loader.load(load_cmd)
93
- if alistener is not None:
94
- if hasattr(alistener, "csvpaths"):
95
- setattr(alistener, "csvpaths", self.csvpaths)
96
- if hasattr(alistener, "result"):
97
- setattr(alistener, "result", self.result)
98
- if hasattr(self, "csvpath") and hasattr(alistener, "csvpath"):
99
- alistener.csvpath = self.csvpath
100
- alistener.config = self.csvpaths.config
101
- listeners.append(alistener)
91
+ self.csvpaths.logger.info("Loading additional listener %s", load_cmd)
92
+ try:
93
+ loader = ClassLoader()
94
+ alistener = loader.load(load_cmd)
95
+ if alistener is not None:
96
+ if hasattr(alistener, "csvpaths"):
97
+ setattr(alistener, "csvpaths", self.csvpaths)
98
+ if hasattr(alistener, "result"):
99
+ setattr(alistener, "result", self.result)
100
+ if hasattr(self, "csvpath") and hasattr(alistener, "csvpath"):
101
+ alistener.csvpath = self.csvpath
102
+ alistener.config = self.csvpaths.config
103
+ listeners.append(alistener)
104
+ except Exception as e:
105
+ print(traceback.format_exc())
106
+ self.csvpaths.logger.error(e)
@@ -39,6 +39,7 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
39
39
  runtime_data: dict = None,
40
40
  by_line: bool = False,
41
41
  run_uuid: UUID,
42
+ method: str = None,
42
43
  ):
43
44
  """@private"""
44
45
  ErrorCollector.__init__(self)
@@ -63,6 +64,7 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
63
64
  self._actual_data_file = None
64
65
  self._origin_data_file = None
65
66
  self._by_line = by_line
67
+ self._method = method
66
68
  #
67
69
  # data_file_path is the path to data.csv of this result
68
70
  #
@@ -167,6 +169,10 @@ class Result(ErrorCollector, Printer, Listener): # pylint: disable=R0902
167
169
  def by_line(self) -> bool:
168
170
  return self._by_line
169
171
 
172
+ @property
173
+ def method(self) -> bool:
174
+ return self._method
175
+
170
176
  @property
171
177
  def source_mode_preceding(self) -> bool:
172
178
  if self._preceding is None:
@@ -58,10 +58,8 @@ class ResultMetadata(Metadata):
58
58
  self.lines_scanned: int = 0
59
59
  self.lines_total: int = 0
60
60
  self.lines_matched: int = 0
61
- #
62
- # why do we need this here? the run knows.
63
- #
64
61
  self.by_line: bool = False
62
+ self.method: str = None
65
63
  #
66
64
  # transfer tuples:
67
65
  # 1: filename, no extension needed: data | unmatched
@@ -79,6 +77,7 @@ ResultMetadata(
79
77
  {self.run_home},{self.instance_home},
80
78
  {self.input_data_file},
81
79
  {self.file_fingerprints},
80
+ {self.method},
82
81
  {self.valid},{self.completed},{self.files_expected},{self.error_count},
83
82
  {self.transfers}
84
83
  )""" # {self.file_count},
@@ -98,6 +97,7 @@ ResultMetadata(
98
97
  #
99
98
  #
100
99
  self.run = m.get("run")
100
+ self.method = m.get("method")
101
101
  self.run_uuid_string = m.get("run_uuid")
102
102
  self.run_home = m.get("run_home")
103
103
  self.instance_home = m.get("instance_home")
@@ -88,7 +88,14 @@ class ResultsManager: # pylint: disable=C0115
88
88
  # and return that uuid.
89
89
  #
90
90
  def start_run(
91
- self, *, run_dir, pathsname, filename, file: str = None, run_uuid: UUID
91
+ self,
92
+ *,
93
+ run_dir: str,
94
+ pathsname: str,
95
+ filename: str,
96
+ file: str = None,
97
+ run_uuid: UUID,
98
+ method: str,
92
99
  ) -> ResultsMetadata:
93
100
  """@private"""
94
101
  rr = ResultsRegistrar(
@@ -121,6 +128,7 @@ class ResultsManager: # pylint: disable=C0115
121
128
  mdata.named_paths_name = pathsname
122
129
  mdata.named_paths_uuid_string = np_uuid
123
130
  mdata.named_results_name = pathsname
131
+ mdata.method = method
124
132
  rr.register_start(mdata)
125
133
  return mdata
126
134
 
@@ -323,6 +331,7 @@ class ResultsManager: # pylint: disable=C0115
323
331
  mdata.identity = result.identity_or_index
324
332
  mdata.named_paths_name = result.paths_name
325
333
  mdata.named_file_name = result.file_name
334
+ mdata.method = result.method
326
335
  rr = RunRegistrar(self.csvpaths)
327
336
  rr.register_start(mdata)
328
337
  #
@@ -331,6 +340,10 @@ class ResultsManager: # pylint: disable=C0115
331
340
  # we use the same UUID for both metadata updates because the
332
341
  # UUID represents the run, not the metadata object
333
342
  #
343
+ #
344
+ # collect_paths and collect_by_line expect a data.csv file, even if it has 0-bytes.
345
+ # we make sure of that here.
346
+ #
334
347
  mdata = ResultMetadata(self.csvpaths.config)
335
348
  mdata.uuid = result.uuid
336
349
  mdata.run_uuid = result.run_uuid
@@ -341,6 +354,18 @@ class ResultsManager: # pylint: disable=C0115
341
354
  mdata.run = result.run_dir[result.run_dir.rfind(sep) + 1 :]
342
355
  mdata.run_home = result.run_dir
343
356
  mdata.instance_home = result.instance_dir
357
+ mdata.method = result.method
358
+ #
359
+ # for the two CsvPaths methods that result in data.csv we want to make
360
+ # sure there is a data.csv, even if it ends up empty. we don't make this
361
+ # effort for unmatched.csv. perhaps we should but atm seems ok to pass.
362
+ #
363
+ if mdata.method in ["collect_paths", "collect_by_line"]:
364
+ path = Nos(mdata.instance_home).join("data.csv")
365
+ nos = Nos(path)
366
+ if not nos.exists():
367
+ with DataFileWriter(path=path) as file:
368
+ file.write("")
344
369
  mdata.instance_identity = result.identity_or_index
345
370
  mdata.input_data_file = result.file_name
346
371
  rs = ResultSerializer(self._csvpaths.config.archive_path)
@@ -26,6 +26,15 @@ class ResultsMetadata(Metadata):
26
26
  self.all_expected_files: bool = None
27
27
  self.by_line: bool = False
28
28
  self._run_uuid: UUID = None
29
+ self._method: str = None
30
+
31
+ @property
32
+ def method(self) -> str:
33
+ return self._method
34
+
35
+ @method.setter
36
+ def method(self, m: str) -> None:
37
+ self._method = m
29
38
 
30
39
  @property
31
40
  def run_uuid(self) -> UUID:
@@ -101,3 +110,4 @@ class ResultsMetadata(Metadata):
101
110
  self.all_valid = m.get("all_valid")
102
111
  self.error_count = m.get("error_count")
103
112
  self.all_expected_files = m.get("all_expected_files")
113
+ self.method = m.get("method")
@@ -122,6 +122,7 @@ class ResultsRegistrar(Registrar, Listener):
122
122
  m["hostname"] = mdata.hostname
123
123
  m["username"] = mdata.username
124
124
  m["ip_address"] = mdata.ip_address
125
+ m["method"] = mdata.method
125
126
  mp = mdata.manifest_path
126
127
  m["manifest_path"] = mp
127
128
  with DataFileWriter(path=mp) as file:
@@ -11,6 +11,7 @@ class RunMetadata(Metadata):
11
11
  self.named_file_name: str = None
12
12
  self.identity: str = None
13
13
  self._run_uuid: UUID = None
14
+ self._method: str = None
14
15
 
15
16
  @property
16
17
  def run_uuid(self) -> UUID:
@@ -29,3 +30,11 @@ class RunMetadata(Metadata):
29
30
  @run_uuid_string.setter
30
31
  def run_uuid_string(self, u: str) -> None:
31
32
  self._run_uuid = UUID(u)
33
+
34
+ @property
35
+ def method(self) -> str:
36
+ return self._method
37
+
38
+ @method.setter
39
+ def method(self, m: str) -> None:
40
+ self._method = m
@@ -248,7 +248,8 @@ class Line(MatchDecider):
248
248
  #
249
249
  if t and t.name != self.matcher.csvpath.headers[i] and t.name != f"{i}":
250
250
  ii = i + 1
251
- msg = f"The {ExpressionUtility._numeric_string(ii)} item, {t}, does not match the current header"
251
+
252
+ msg = f"The {ExpressionUtility._numeric_string(ii)} item, {t}, does not match the current header '{self.matcher.csvpath.headers[i]}'"
252
253
  errors.append(msg)
253
254
  return True
254
255
 
@@ -264,6 +265,6 @@ class Line(MatchDecider):
264
265
  #
265
266
  if t and t.name != self.matcher.csvpath.headers[i] and t.name != f"{i}":
266
267
  ii = i + 1
267
- msg = f"The {ExpressionUtility._numeric_string(ii)} item, {t}, does not match the current header"
268
+ msg = f"The {ExpressionUtility._numeric_string(ii)} item, {t}, does not match the current header '{self.matcher.csvpath.headers[i]}'"
268
269
  errors.append(msg)
269
270
  return True
@@ -198,7 +198,7 @@ class Reference(Matchable):
198
198
  else:
199
199
  ret = v
200
200
  else:
201
- msg = f"Results exist but the {ref['name']} variable is unknown: {self.my_chain}"
201
+ msg = f"The {ref['name']} variable is unknown: {self.my_chain}"
202
202
  self.matcher.csvpath.error_manager.handle_error(source=self, msg=msg)
203
203
  if self.matcher.csvpath.do_i_raise():
204
204
  raise DataException(msg)