csvpath 0.0.548__tar.gz → 0.0.550__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 (351) hide show
  1. {csvpath-0.0.548 → csvpath-0.0.550}/PKG-INFO +1 -1
  2. {csvpath-0.0.548 → csvpath-0.0.550/assets}/config/config.ini +1 -1
  3. csvpath-0.0.550/assets/config/jenkins-local-azure.ini +101 -0
  4. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-s3.ini +1 -1
  5. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-sftp.ini +4 -4
  6. {csvpath-0.0.548/assets → csvpath-0.0.550}/config/config.ini +1 -1
  7. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/csvpath.py +5 -2
  8. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_comms.py +8 -0
  9. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_manager.py +13 -4
  10. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_manager.py +4 -3
  11. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_registrar.py +11 -1
  12. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_manager.py +24 -7
  13. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_registrar.py +1 -0
  14. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_factory.py +2 -1
  15. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/last.py +9 -6
  16. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/above.py +4 -0
  17. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/expression_utility.py +81 -17
  18. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/config.py +5 -4
  19. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/nos.py +6 -0
  20. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_reference_finder_2.py +15 -16
  21. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_transformer.py +72 -44
  22. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_reference_finder_2.py +40 -12
  23. csvpath-0.0.550/csvpath/util/references/results_tools/data_finder.py +28 -0
  24. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/date_filter.py +61 -27
  25. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/identity_finder.py +9 -2
  26. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/path_filter.py +17 -4
  27. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/resolve_possibles.py +9 -0
  28. {csvpath-0.0.548 → csvpath-0.0.550}/pyproject.toml +1 -1
  29. csvpath-0.0.548/assets/config/jenkins-local-azure.ini +0 -138
  30. csvpath-0.0.548/csvpath/util/references/results_tools/data_finder.py +0 -19
  31. {csvpath-0.0.548 → csvpath-0.0.550}/LICENSE +0 -0
  32. {csvpath-0.0.548 → csvpath-0.0.550}/README.md +0 -0
  33. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/function.imports +0 -0
  34. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  35. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-local-gcs.ini +0 -0
  36. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-azure.ini +0 -0
  37. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-gcs.ini +0 -0
  38. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-local.ini +0 -0
  39. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-s3.ini +0 -0
  40. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/jenkins-windows-sftp.ini +0 -0
  41. {csvpath-0.0.548 → csvpath-0.0.550}/assets/config/local-localhost-sftp.ini +0 -0
  42. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  43. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/azure.sh +0 -0
  44. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
  45. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/gcs.sh +0 -0
  46. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  47. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/local.sh +0 -0
  48. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  49. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/s3.sh +0 -0
  50. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  51. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/mac/sftp.sh +0 -0
  52. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/azure.bat +0 -0
  53. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/gcs.bat +0 -0
  54. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/local.bat +0 -0
  55. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/s3.bat +0 -0
  56. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/sftp.bat +0 -0
  57. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  58. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  59. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  60. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  61. {csvpath-0.0.548 → csvpath-0.0.550}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  62. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  63. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  64. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  65. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  66. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  67. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  68. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sqlite/csvpath +0 -0
  69. {csvpath-0.0.548 → csvpath-0.0.550}/assets/integrations/sqlite/schema.sql +0 -0
  70. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/__init__.py +0 -0
  71. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/__init__.py +0 -0
  72. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/asker.py +0 -0
  73. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/cli.py +0 -0
  74. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/const.py +0 -0
  75. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/debug_config.py +0 -0
  76. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/drill_down.py +0 -0
  77. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/function_describer.py +0 -0
  78. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/function_lister.py +0 -0
  79. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/cli/selecter.py +0 -0
  80. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/csvpaths.py +0 -0
  81. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/__init__.py +0 -0
  82. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error.py +0 -0
  83. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_collector.py +0 -0
  84. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/errors/error_manager.py +0 -0
  85. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_metadata.py +0 -0
  86. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/file_registrar.py +0 -0
  87. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/files_listener.py +0 -0
  88. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  89. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  90. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  91. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  92. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  93. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event.py +0 -0
  94. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event_result.py +0 -0
  95. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  96. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/job.py +0 -0
  97. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  98. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  99. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  100. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  101. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run.py +0 -0
  102. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  103. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_state.py +0 -0
  104. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/ol/sender.py +0 -0
  105. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  106. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  107. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  108. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  109. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  110. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  111. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  112. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  113. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  114. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
  115. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
  116. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
  117. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
  118. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/slack/event.py +0 -0
  119. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/slack/sender.py +0 -0
  120. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/engine.py +0 -0
  121. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  122. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  123. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  124. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  125. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  126. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/tables.py +0 -0
  127. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sql/updates.py +0 -0
  128. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  129. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  130. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  131. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  132. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  133. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/listener.py +0 -0
  134. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/metadata.py +0 -0
  135. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_listener.py +0 -0
  136. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_metadata.py +0 -0
  137. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/paths/paths_registrar.py +0 -0
  138. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/registrar.py +0 -0
  139. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  140. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  141. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  142. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  143. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/readers/readers.py +0 -0
  144. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result.py +0 -0
  145. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_file_reader.py +0 -0
  146. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_metadata.py +0 -0
  147. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/result_serializer.py +0 -0
  148. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/results/results_metadata.py +0 -0
  149. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_listener_stdout.py +0 -0
  150. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_metadata.py +0 -0
  151. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/run/run_registrar.py +0 -0
  152. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/managers/test_listener.py +0 -0
  153. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/__init__.py +0 -0
  154. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/__init__.py +0 -0
  155. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/args.py +0 -0
  156. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/args_helper.py +0 -0
  157. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/all.py +0 -0
  158. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/andf.py +0 -0
  159. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/any.py +0 -0
  160. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/between.py +0 -0
  161. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/empty.py +0 -0
  162. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/exists.py +0 -0
  163. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/inf.py +0 -0
  164. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/no.py +0 -0
  165. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/notf.py +0 -0
  166. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/orf.py +0 -0
  167. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/boolean/yes.py +0 -0
  168. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count.py +0 -0
  169. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  170. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_headers.py +0 -0
  171. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_lines.py +0 -0
  172. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_scans.py +0 -0
  173. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/counter.py +0 -0
  174. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/every.py +0 -0
  175. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/has_matches.py +0 -0
  176. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/increment.py +0 -0
  177. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/tally.py +0 -0
  178. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/counting/total_lines.py +0 -0
  179. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/dates/now.py +0 -0
  180. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function.py +0 -0
  181. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_finder.py +0 -0
  182. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/function_focus.py +0 -0
  183. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/append.py +0 -0
  184. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/collect.py +0 -0
  185. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  186. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/end.py +0 -0
  187. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_name.py +0 -0
  188. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  189. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/headers.py +0 -0
  190. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/insert.py +0 -0
  191. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/mismatch.py +0 -0
  192. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/replace.py +0 -0
  193. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  194. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/advance.py +0 -0
  195. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/after_blank.py +0 -0
  196. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/dups.py +0 -0
  197. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/first.py +0 -0
  198. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/first_line.py +0 -0
  199. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/lines/stop.py +0 -0
  200. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/add.py +0 -0
  201. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/divide.py +0 -0
  202. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/equals.py +0 -0
  203. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/intf.py +0 -0
  204. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/mod.py +0 -0
  205. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/multiply.py +0 -0
  206. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/odd.py +0 -0
  207. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/round.py +0 -0
  208. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/subtotal.py +0 -0
  209. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/subtract.py +0 -0
  210. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/math/sum.py +0 -0
  211. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  212. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/importf.py +0 -0
  213. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/misc/random.py +0 -0
  214. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/jinjaf.py +0 -0
  215. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/print_line.py +0 -0
  216. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/print_queue.py +0 -0
  217. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/printf.py +0 -0
  218. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/print/table.py +0 -0
  219. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/minf.py +0 -0
  220. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/nminmax.py +0 -0
  221. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent.py +0 -0
  222. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  223. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/stats/stdev.py +0 -0
  224. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/alter.py +0 -0
  225. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/caps.py +0 -0
  226. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/concat.py +0 -0
  227. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/contains.py +0 -0
  228. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/length.py +0 -0
  229. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/lower.py +0 -0
  230. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/metaphone.py +0 -0
  231. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/regex.py +0 -0
  232. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/starts_with.py +0 -0
  233. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/strip.py +0 -0
  234. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/substring.py +0 -0
  235. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/strings/upper.py +0 -0
  236. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/testing/debug.py +0 -0
  237. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/__init__.py +0 -0
  238. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/boolean.py +0 -0
  239. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/datef.py +0 -0
  240. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/decimal.py +0 -0
  241. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/email.py +0 -0
  242. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/nonef.py +0 -0
  243. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/string.py +0 -0
  244. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/type.py +0 -0
  245. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/types/url.py +0 -0
  246. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/fail.py +0 -0
  247. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/failed.py +0 -0
  248. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/validity/line.py +0 -0
  249. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/get.py +0 -0
  250. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/pushpop.py +0 -0
  251. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/put.py +0 -0
  252. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/track.py +0 -0
  253. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/functions/variables/variables.py +0 -0
  254. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/lark_parser.py +0 -0
  255. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/lark_transformer.py +0 -0
  256. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/matcher.py +0 -0
  257. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/__init__.py +0 -0
  258. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/equality.py +0 -0
  259. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/expression.py +0 -0
  260. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/header.py +0 -0
  261. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/matchable.py +0 -0
  262. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/qualified.py +0 -0
  263. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/reference.py +0 -0
  264. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/term.py +0 -0
  265. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/productions/variable.py +0 -0
  266. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/exceptions.py +0 -0
  267. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/expression_encoder.py +0 -0
  268. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/lark_print_parser.py +0 -0
  269. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/print_parser.py +0 -0
  270. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/matching/util/runtime_data_collector.py +0 -0
  271. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/error_mode.py +0 -0
  272. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/explain_mode.py +0 -0
  273. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/files_mode.py +0 -0
  274. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/logic_mode.py +0 -0
  275. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/mode_controller.py +0 -0
  276. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/print_mode.py +0 -0
  277. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/return_mode.py +0 -0
  278. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/run_mode.py +0 -0
  279. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/source_mode.py +0 -0
  280. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/transfer_mode.py +0 -0
  281. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/unmatched_mode.py +0 -0
  282. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/modes/validation_mode.py +0 -0
  283. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/__init__.py +0 -0
  284. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/exceptions.py +0 -0
  285. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/parser.out +0 -0
  286. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/parsetab.py +0 -0
  287. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/scanner.py +0 -0
  288. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/scanning/scanning_lexer.py +0 -0
  289. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_data_reader.py +0 -0
  290. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_data_writer.py +0 -0
  291. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  292. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_nos.py +0 -0
  293. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_utils.py +0 -0
  294. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  295. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/box.py +0 -0
  296. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/cache.py +0 -0
  297. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/caser.py +0 -0
  298. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/class_loader.py +0 -0
  299. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/code.py +0 -0
  300. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/config_exception.py +0 -0
  301. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/date_util.py +0 -0
  302. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/exceptions.py +0 -0
  303. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_info.py +0 -0
  304. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_readers.py +0 -0
  305. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/file_writers.py +0 -0
  306. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  307. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  308. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  309. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_nos.py +0 -0
  310. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_utils.py +0 -0
  311. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  312. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/hasher.py +0 -0
  313. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/http/http_data_reader.py +0 -0
  314. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/intermediary.py +0 -0
  315. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/last_line_stats.py +0 -0
  316. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_counter.py +0 -0
  317. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_monitor.py +0 -0
  318. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/line_spooler.py +0 -0
  319. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/log_utility.py +0 -0
  320. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/metadata_parser.py +0 -0
  321. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/pandas_data_reader.py +0 -0
  322. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/path_util.py +0 -0
  323. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/printer.py +0 -0
  324. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  325. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/files_tools/range_finder.py +0 -0
  326. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/ref_utils.py +0 -0
  327. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_exceptions.py +0 -0
  328. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_grammar.py +1 -1
  329. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  330. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_parser.py +0 -0
  331. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/reference_results.py +0 -0
  332. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/token_filters.py +0 -0
  333. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  334. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/references/tools/date_completer.py +0 -0
  335. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/run_home_maker.py +0 -0
  336. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_data_reader.py +0 -0
  337. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_data_writer.py +0 -0
  338. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  339. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_nos.py +0 -0
  340. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_utils.py +0 -0
  341. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  342. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_config.py +0 -0
  343. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  344. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  345. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  346. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_nos.py +0 -0
  347. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_walk.py +0 -0
  348. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  349. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/sqliter.py +0 -0
  350. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/template_util.py +0 -0
  351. {csvpath-0.0.548 → csvpath-0.0.550}/csvpath/util/var_utility.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: csvpath
3
- Version: 0.0.548
3
+ Version: 0.0.550
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
@@ -12,7 +12,7 @@ extensions = csv, tsv, dat, tab, psv, ssv
12
12
 
13
13
  [errors]
14
14
  csvpath = raise, collect, print
15
- csvpaths = raise, collect, print
15
+ csvpaths = raise, print
16
16
  use_format = full
17
17
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
18
18
 
@@ -0,0 +1,101 @@
1
+ [testing]
2
+ azure.skip = no
3
+ gcs.skip = yes
4
+ s3.skip = yes
5
+ sftp.skip = yes
6
+
7
+ [csvpath_files]
8
+ extensions = csvpath, csvpaths
9
+
10
+ [csv_files]
11
+ extensions = csv, tsv, dat, tab, psv, ssv
12
+
13
+ [errors]
14
+ csvpath = raise, collect, print
15
+ csvpaths = raise, collect, print
16
+ use_format = full
17
+ pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
18
+
19
+ [logging]
20
+ csvpath = debug
21
+ csvpaths = debug
22
+ log_file = logs/csvpath.log
23
+ log_files_to_keep = 100
24
+ log_file_size = 52428800
25
+
26
+ [config]
27
+ path = assets/config/jenkins-local-azure.ini
28
+
29
+ [cache]
30
+ path = cache
31
+ use_cache = no
32
+
33
+ [functions]
34
+ imports = config/functions.imports
35
+
36
+ [results]
37
+ archive = archive
38
+
39
+ [inputs]
40
+ files = azure://csvpath/inputs/named_files
41
+ csvpaths = inputs/named_paths
42
+ on_unmatched_file_fingerprints = halt
43
+
44
+ [listeners]
45
+ groups =
46
+ sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
47
+ sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
48
+ default.file = from csvpath.managers.files.files_listener import FilesListener
49
+ default.paths = from csvpath.managers.paths.paths_listener import PathsListener
50
+ otlp.result = from csvpath.managers.integrations.otlp.otlp_result_listener import OpenTelemetryResultListener
51
+ otlp.results = from csvpath.managers.integrations.otlp.otlp_results_listener import OpenTelemetryResultsListener
52
+ otlp.errors = from csvpath.managers.integrations.otlp.otlp_error_listener import OpenTelemetryErrorListener
53
+ sftpplus.paths = from csvpath.managers.integrations.sftpplus.sftpplus_listener import SftpPlusListener
54
+ sftp.results = from csvpath.managers.integrations.sftp.sftp_listener import SftpListener
55
+ ckan.results = from csvpath.managers.integrations.ckan.ckan_listener import CkanListener
56
+ marquez.file = from csvpath.managers.integrations.ol.file_listener_ol import OpenLineageFileListener
57
+ marquez.paths = from csvpath.managers.integrations.ol.paths_listener_ol import OpenLineagePathsListener
58
+ marquez.result = from csvpath.managers.integrations.ol.result_listener_ol import OpenLineageResultListener
59
+ marquez.results = from csvpath.managers.integrations.ol.results_listener_ol import OpenLineageResultsListener
60
+ slack.file = from csvpath.managers.integrations.slack.sender import SlackSender
61
+ slack.paths = from csvpath.managers.integrations.slack.sender import SlackSender
62
+ slack.result = from csvpath.managers.integrations.slack.sender import SlackSender
63
+ slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
64
+
65
+ [sftp]
66
+ server = 172.17.0.3
67
+ port = 10022
68
+ username = tinpenny
69
+ password = tinpenny
70
+
71
+ [sqlite]
72
+ db = archive/csvpath.db
73
+
74
+ [sftpplus]
75
+ mailbox_user = MAILBOX_USER
76
+ mailbox_password = MAILBOX_PASSWORD
77
+ server = SFTPPLUS_SERVER
78
+ port = SFTPPLUS_PORT
79
+ admin_username = SFTPPLUS_ADMIN_USERNAME
80
+ admin_password = SFTPPLUS_ADMIN_PASSWORD
81
+ api_url = https://localhost:10020/json
82
+ scripts_dir =
83
+ execute_timeout = 300
84
+
85
+ [ckan]
86
+ server = http://localhost:80
87
+ api_token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3akJwc1ZuSkVrZm1aNnBtVTJfTW5CNlJXZ211YjdOOHVXZ1l1cUFDa0Q4IiwiaWF0IjoxNzM0NzE4NDQ3fQ.QXWXoJoSxVES4NwXYBteYUD7enX9D5T2htmETLGFzrs
88
+
89
+ [marquez]
90
+ base_url = http://localhost:5000
91
+ endpoint = api/v1/lineage
92
+ api_key = "none"
93
+ timeout = 5
94
+ verify = False
95
+
96
+ [slack]
97
+ webhook_url =
98
+
99
+ [extensions]
100
+ csvpath_files = None
101
+
@@ -38,7 +38,7 @@ archive = archive
38
38
 
39
39
  [inputs]
40
40
  files = s3://csvpath-example-1/inputs/named_files
41
- csvpaths = inputs/named_paths
41
+ csvpaths = s3://csvpath-example-1/inputs/named_paths
42
42
  on_unmatched_file_fingerprints = halt
43
43
 
44
44
  [listeners]
@@ -6,7 +6,7 @@ extensions = csv, tsv, dat, tab, psv, ssv
6
6
 
7
7
  [errors]
8
8
  csvpath = raise, collect, print
9
- csvpaths = raise, collect, print
9
+ csvpaths = raise, print
10
10
  use_format = full
11
11
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
12
12
 
@@ -32,7 +32,7 @@ archive = archive
32
32
 
33
33
  [inputs]
34
34
  files = inputs/named_files
35
- csvpaths = sftp://192.168.70.1:2022/inputs/named_paths
35
+ csvpaths = sftp://192.168.72.2:2022/inputs/named_paths
36
36
  on_unmatched_file_fingerprints = halt
37
37
 
38
38
  [testing]
@@ -42,7 +42,7 @@ s3.skip = yes
42
42
  sftp.skip = no
43
43
 
44
44
  [listeners]
45
- groups =
45
+ groups = default
46
46
  sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
47
47
  sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
48
48
  default.file = from csvpath.managers.files.files_listener import FilesListener
@@ -63,7 +63,7 @@ slack.result = from csvpath.managers.integrations.slack.sender import SlackSende
63
63
  slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
64
64
 
65
65
  [sftp]
66
- server = 192.168.70.1
66
+ server = 192.168.72.2
67
67
  port = 2022
68
68
  username = python
69
69
  password = hangzhou
@@ -12,7 +12,7 @@ extensions = csv, tsv, dat, tab, psv, ssv
12
12
 
13
13
  [errors]
14
14
  csvpath = raise, collect, print
15
- csvpaths = raise, collect, print
15
+ csvpaths = raise, print
16
16
  use_format = full
17
17
  pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
18
18
 
@@ -1222,10 +1222,13 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
1222
1222
  "CsvPath.matches:703: %s: matches: %s", self.identity, matches
1223
1223
  )
1224
1224
  #
1225
- # if we are done scanning we can stop
1225
+ # if we are done scanning we can stop. however, if the file is ending on its own
1226
+ # -- we are scanning right to the last line -- we don't call stop because we aren't
1227
+ # actively stopping the run, we're just letting it run out.
1226
1228
  #
1227
1229
  if self.scanner.is_last(self.line_monitor.physical_line_number):
1228
- self.stop()
1230
+ if not self.line_monitor.is_last_line():
1231
+ self.stop()
1229
1232
  if matches is True:
1230
1233
  #
1231
1234
  # _current_match_count is a placeholder that
@@ -60,6 +60,13 @@ class ErrorCommunications:
60
60
  return ret
61
61
 
62
62
  def do_i_stop(self) -> bool:
63
+ #
64
+ # stop is having problems. copying raise, which works fine.
65
+ #
66
+ if self._csvpath and self._csvpath.stop_on_validation_errors is not None:
67
+ return self._csvpath.stop_on_validation_errors
68
+ return self.in_policy(OnError.STOP.value)
69
+ """
63
70
  mode = None
64
71
  if self._csvpath and self._csvpath.stop_on_validation_errors is not None:
65
72
  #
@@ -73,6 +80,7 @@ class ErrorCommunications:
73
80
  # return self._csvpath.stop_on_validation_errors
74
81
  policy = self.in_policy(OnError.STOP.value)
75
82
  return mode is True or policy is True
83
+ """
76
84
 
77
85
  def do_i_fail(self) -> bool:
78
86
  if self._csvpath and self._csvpath.fail_on_validation_errors is not None:
@@ -101,7 +101,11 @@ class FileManager:
101
101
  if name is None:
102
102
  raise ValueError("File can be None but named-file name must be passed")
103
103
 
104
- ref = ReferenceParser(name, csvpaths=self.csvpaths) if name.startswith("$") else None
104
+ ref = (
105
+ ReferenceParser(name, csvpaths=self.csvpaths)
106
+ if name.startswith("$")
107
+ else None
108
+ )
105
109
  if ref is not None and file is None:
106
110
  if ref.datatype != ref.RESULTS:
107
111
  raise ValueError("Reference must be results, not {ref.datatype}")
@@ -263,11 +267,15 @@ class FileManager:
263
267
  # nos sep is backend aware. it doesn't know what backend is handling
264
268
  # files, only what backend it is itself.
265
269
  #
266
- #sep = self.csvpaths.config.files_sep
270
+ # sep = self.csvpaths.config.files_sep
267
271
  #
268
272
  # sadly we don't have an https backend at this time. so we have to test for the protocol.
269
273
  #
270
- sep = '/' if path.startswith("https://") or path.startswith("http://") else nos.sep
274
+ sep = (
275
+ "/"
276
+ if path.startswith("https://") or path.startswith("http://")
277
+ else nos.sep
278
+ )
271
279
  f = path.rfind(sep)
272
280
  fname = path if f == -1 else path[f + 1 :]
273
281
  fname = self._clean_file_name(fname)
@@ -449,6 +457,7 @@ class FileManager:
449
457
  nos = self.nos
450
458
  nos.path = dirname
451
459
  dlist = nos.listdir(files_only=True, recurse=recurse)
460
+ # print(f"add_named_files_from_dir: dirname: {dirname}, dlist: {dlist}")
452
461
  base = dirname
453
462
  #
454
463
  # collect all full paths that are files and have correct extensions
@@ -556,7 +565,7 @@ class FileManager:
556
565
  nos = self.nos
557
566
  nos.path = path
558
567
  sep = nos.sep
559
- sep = '/' if path.startswith("https://") or path.startswith("http://") else sep
568
+ sep = "/" if path.startswith("https://") or path.startswith("http://") else sep
560
569
  fname = path if path.rfind(sep) == -1 else path[path.rfind(sep) + 1 :]
561
570
  #
562
571
  # creates
@@ -446,8 +446,8 @@ class PathsManager:
446
446
  #
447
447
  # exp. improved for FP
448
448
  #
449
- paths = self._get_named_paths(name)
450
- definition[name] = paths
449
+ self._get_named_paths(name)
450
+ definition[name] = []
451
451
  #
452
452
  # end exp.
453
453
  #
@@ -665,7 +665,8 @@ class PathsManager:
665
665
 
666
666
  def number_of_named_paths(self, name: NamedPathsName) -> int:
667
667
  """@private"""
668
- return len(self._get_named_paths(name))
668
+ paths = self._get_named_paths(name)
669
+ return 0 if not paths else len(paths)
669
670
 
670
671
  def total_named_paths(self) -> int:
671
672
  """@private"""
@@ -3,8 +3,10 @@ import json
3
3
  from datetime import datetime
4
4
  from csvpath.util.file_readers import DataFileReader
5
5
  from csvpath.util.file_writers import DataFileWriter
6
+ from csvpath.util.references.reference_parser import ReferenceParser
6
7
  from csvpath.util.nos import Nos
7
8
  from csvpath.util.box import Box
9
+
8
10
  from ..listener import Listener
9
11
  from ..metadata import Metadata
10
12
  from ..registrar import Registrar
@@ -66,7 +68,15 @@ class ResultRegistrar(Registrar, Listener):
66
68
  mdata = ResultMetadata(config=self.csvpaths.config)
67
69
  mdata.from_manifest(m)
68
70
  mdata.archive_name = self.archive_name
69
- mdata.named_results_name = self.result.paths_name
71
+ #
72
+ # if the paths_name has a $ we need to be more general
73
+ #
74
+ if "$" in self.result.paths_name:
75
+ ref = ReferenceParser(self.result.paths_name)
76
+ mdata.named_results_name = ref.root_major
77
+ else:
78
+ mdata.named_results_name = self.result.paths_name
79
+
70
80
  mdata.named_paths_name = self.result.paths_name
71
81
  mdata.named_paths_uuid_string = self.csvpaths.run_metadata.named_paths_uuid
72
82
  mdata.named_file_name = self.result.file_name
@@ -16,6 +16,7 @@ from csvpath.util.references.results_reference_finder_2 import (
16
16
  from csvpath.util.file_readers import DataFileReader
17
17
  from csvpath.util.file_writers import DataFileWriter
18
18
  from csvpath.util.nos import Nos
19
+
19
20
  from csvpath.scanning.scanner import Scanner
20
21
  from ..run.run_metadata import RunMetadata
21
22
  from ..run.run_registrar import RunRegistrar
@@ -71,7 +72,10 @@ class ResultsManager: # pylint: disable=C0115
71
72
  mdata.named_file_path = m["named_file_path"]
72
73
  mdata.run_home = run_dir
73
74
  mdata.named_paths_name = pathsname
74
- mdata.named_results_name = pathsname
75
+ if "$" in pathsname:
76
+ mdata.named_results_name = ReferenceParser(pathsname).root_major
77
+ else:
78
+ mdata.named_results_name = pathsname
75
79
  mdata.number_of_files_expected = -1
76
80
  mdata.number_of_files_generated = -1
77
81
 
@@ -421,14 +425,17 @@ class ResultsManager: # pylint: disable=C0115
421
425
 
422
426
  def remove_named_results(self, name: str) -> None:
423
427
  """@private"""
424
- #
425
- # TODO: does not get rid of results on disk
426
- #
427
428
  if name in self.named_results:
428
429
  del self.named_results[name]
429
430
  self._variables = None
430
431
  else:
431
432
  self.csvpaths.logger.warning(f"Results '{name}' not found")
433
+ path = self.get_named_results_home(name)
434
+ if path is None:
435
+ return
436
+ nos = Nos(path)
437
+ if nos.dir_exists():
438
+ nos.remove()
432
439
 
433
440
  #
434
441
  # @deprecated. use remove_named_results
@@ -506,6 +513,8 @@ class ResultsManager: # pylint: disable=C0115
506
513
  #
507
514
  # effectively, get last named results. use reference for anything more specific.
508
515
  #
516
+ # this gets the results of a run. it does not get the runs under the name.
517
+ #
509
518
  def get_named_results(self, name) -> List[List[Any]]:
510
519
  #
511
520
  # as it turns out, references are (finally!) the easiest, so let's do that
@@ -520,6 +529,7 @@ class ResultsManager: # pylint: disable=C0115
520
529
  # agents. for each new run, unless there is a reason to not create a new
521
530
  # CsvPaths instance, we would create a new one.
522
531
  #
532
+ """ """
523
533
  if name in self.named_results:
524
534
  #
525
535
  # exp. removed 4 May.
@@ -529,6 +539,7 @@ class ResultsManager: # pylint: disable=C0115
529
539
  #
530
540
  rs = self.named_results[name]
531
541
  return rs
542
+ """ """
532
543
  #
533
544
  # find and load the result, if exists. we find results home with the name. run_home is the
534
545
  # last run dir. the results we're looking for are the instance dirs in the run dir.
@@ -621,15 +632,21 @@ class ResultsManager: # pylint: disable=C0115
621
632
  msg = (
622
633
  f"Results '{name}' does not exist. Has has that named-paths group been run?"
623
634
  )
624
- self.csvpaths.logger.error(msg)
625
- if self.csvpaths.ecoms.do_i_raise():
626
- raise InputException(msg)
635
+ self.csvpaths.logger.warning(msg)
636
+ #
637
+ # it seems reasonable to request results that don't exist, if not ideal. a warn
638
+ # should be good enough, probably.
639
+ #
640
+ # if self.csvpaths.ecoms.do_i_raise():
641
+ # raise InputException(msg)
627
642
 
628
643
  def get_named_results_home(self, name: str) -> str:
629
644
  path = os.path.join(self.csvpaths.config.archive_path, name)
630
645
  return path
631
646
 
632
647
  def get_named_results_for_run(self, *, name: str, run: str) -> list[list[Any]]:
648
+ if run is None:
649
+ return None
633
650
  path = os.path.join(self.csvpaths.config.archive_path, name)
634
651
  path = os.path.join(path, run)
635
652
  return self._get_named_results_for_run(name=name, run=run, path=path)
@@ -107,6 +107,7 @@ class ResultsRegistrar(Registrar, Listener):
107
107
  m["status"] = mdata.status
108
108
  m["run_home"] = mdata.run_home
109
109
  m["named_results_name"] = mdata.named_results_name
110
+
110
111
  #
111
112
  m["named_paths_name"] = mdata.named_paths_name
112
113
  m["named_paths_uuid"] = mdata.named_paths_uuid
@@ -230,13 +230,14 @@ class FunctionFactory:
230
230
  fs["alter"] = Alter
231
231
  fs["percent"] = Percent
232
232
  #
233
- # aliases
233
+ # less than
234
234
  #
235
235
  fs["below"] = AboveBelow
236
236
  fs["lt"] = AboveBelow
237
237
  fs["before"] = AboveBelow
238
238
  fs["lte"] = AboveBelow
239
239
  fs["le"] = AboveBelow
240
+ # greater than
240
241
  fs["above"] = AboveBelow
241
242
  fs["gt"] = AboveBelow
242
243
  fs["after"] = AboveBelow
@@ -17,13 +17,16 @@ class Last(MatchDecider):
17
17
  """\
18
18
  Evaluates True on the last line to be scanned.
19
19
 
20
- last() will always run, even if its line turns out to be
21
- blank and would otherwise be skipped.
20
+ last() used by itself will always run, even if its line turns out to be
21
+ blank and would otherwise be skipped. When last() is composed within other
22
+ functions it loses that ability to run no matter what. For e.g.
23
+ last() -> print("will always run")
24
+ vs.
25
+ and(yes(), last()) -> print("runs if the last scanned line is not blank")
22
26
 
23
- Optionally, last() can take a function that will be
24
- evaluated when last() evaluates to True. This function, if provided,
25
- will not necessarily be the last evaluation of the run, but will happen
26
- only on the last line.
27
+ Optionally, last() can take a function that will be evaluated when last()
28
+ evaluates to True. This function, if provided, will not necessarily be the
29
+ last evaluation of the run, but will happen only on the last line.
27
30
  """
28
31
  ),
29
32
  ]
@@ -99,6 +99,8 @@ class AboveBelow(MatchDecider):
99
99
 
100
100
  def _try_dates(self, a, b) -> bool:
101
101
  if ExpressionUtility.all([a, b], [datetime]):
102
+ a = ExpressionUtility.to_datetime(a)
103
+ b = ExpressionUtility.to_datetime(b)
102
104
  if self._above() and self.name != "gte":
103
105
  return a.timestamp() > b.timestamp()
104
106
  elif self._above():
@@ -107,6 +109,8 @@ class AboveBelow(MatchDecider):
107
109
  a.timestamp() < b.timestamp()
108
110
  return a.timestamp() <= b.timestamp()
109
111
  if ExpressionUtility.all([a, b], [date]):
112
+ a = ExpressionUtility.to_date(a)
113
+ b = ExpressionUtility.to_date(b)
110
114
  if self._above() and self.name != "gte":
111
115
  return a > b
112
116
  elif self._above():
@@ -30,33 +30,97 @@ class ExpressionUtility:
30
30
  else:
31
31
  return f"{i}th"
32
32
 
33
+ #
34
+ # this uses to_bool so it will translate "true" to True.
35
+ #
33
36
  @classmethod
34
37
  def all(cls, objects: List, classlist: tuple = None) -> bool:
35
- if objects is None:
38
+ #
39
+ # we don't match None isa None
40
+ #
41
+ if objects is None and classlist is None:
36
42
  return False
37
- if not isinstance(objects, (list, tuple)):
43
+ if objects is None:
44
+ objects = [None]
45
+ if not isinstance(objects, list):
46
+ objects = [objects]
47
+ #
48
+ # if we don't pass a list of types or [], just None, we're
49
+ # True if all items in objects are non-None.
50
+ #
51
+ if classlist is None:
52
+ for o in objects:
53
+ if o is None:
54
+ return False
38
55
  return True
39
- if len(objects) == 0:
56
+ for o in objects:
57
+ if not cls.isa(o, classlist):
58
+ return False
59
+ return True
60
+
61
+ @classmethod
62
+ def safe_isinstance(cls, obj, classes: type[type]) -> bool:
63
+ try:
64
+ if isinstance(obj, classes):
65
+ return True
66
+ except Exception:
67
+ ...
68
+ return False
69
+
70
+ #
71
+ # this uses to_bool so it will translate "true" to True.
72
+ #
73
+ @classmethod
74
+ def isa(cls, obj: List, classes: tuple = None) -> bool:
75
+ if obj is None and classes is None:
40
76
  return True
77
+ if classes is None:
78
+ classes = []
41
79
  #
42
- # check first item
80
+ # make sure we have a tuple of types
43
81
  #
44
- if classlist is not None:
45
- tup = classlist
46
- if not isinstance(classlist, tuple):
47
- tup = tuple(classlist)
48
- if not isinstance(objects[0], tup):
49
- return False
82
+ lst = []
83
+ for t in classes:
84
+ if t is None:
85
+ if obj is None:
86
+ return True
87
+ elif cls.safe_isinstance(t, type):
88
+ lst.append(t)
89
+ else:
90
+ lst.append(type(t))
91
+ classes = lst
92
+ #
93
+ # isinstance
94
+ #
95
+ if cls.safe_isinstance(obj, classes):
96
+ return True
50
97
  #
51
- # check all items against each other
98
+ # cross-class cast
52
99
  #
53
- for i, o in enumerate(objects):
54
- if i == 0:
55
- continue
56
- if isinstance(o, type(objects[i - 1])):
57
- continue
100
+ if f"{obj}".strip() == "":
58
101
  return False
59
- return True
102
+ for t in classes:
103
+ if t == int:
104
+ o = cls.to_int(obj)
105
+ if cls.safe_isinstance(o, int):
106
+ return True
107
+ if t == float:
108
+ o = cls.to_float(obj)
109
+ if cls.safe_isinstance(o, float):
110
+ return True
111
+ if t == datetime:
112
+ o = cls.to_datetime(obj)
113
+ if cls.safe_isinstance(o, datetime):
114
+ return True
115
+ elif t == datetime.date:
116
+ o = cls.to_date(obj)
117
+ if cls.safe_isinstance(o, datetime.date):
118
+ return True
119
+ elif t == bool:
120
+ o = cls.to_bool(obj)
121
+ if cls.safe_isinstance(o, bool):
122
+ return True
123
+ return False
60
124
 
61
125
  @classmethod
62
126
  def is_number(cls, v: Any) -> bool:
@@ -106,7 +106,6 @@ class Config:
106
106
  if path == "":
107
107
  path = None
108
108
  if path is None:
109
- print(f"configpath 3: {self._configpath}, path: {path}")
110
109
  path = Config.CONFIG
111
110
  self._configpath = path
112
111
  self._load_config()
@@ -429,14 +428,16 @@ shell = /bin/bash
429
428
 
430
429
  @property
431
430
  def csvpaths_sep(self) -> None:
432
- if self._assure_inputs_csvpaths_path is None or self._assure_inputs_csvpaths_path.strip() == "":
431
+ if (
432
+ self._assure_inputs_csvpaths_path is None
433
+ or self._assure_inputs_csvpaths_path.strip() == ""
434
+ ):
433
435
  return os.sep
434
436
  a = self._assure_inputs_csvpaths_path.strip().lower()
435
437
  if a.find("://") > -1:
436
438
  return "/"
437
439
  return os.sep
438
440
 
439
-
440
441
  def _assure_transfer_root(self) -> None:
441
442
  if self.load:
442
443
  if self.transfer_root is None or self.transfer_root.strip() == "":
@@ -675,7 +676,7 @@ shell = /bin/bash
675
676
  def archive_name(self) -> str:
676
677
  p = self.archive_path
677
678
  if p.find(self.archive_sep) > -1:
678
- #if p.find(os.sep) > -1:
679
+ # if p.find(os.sep) > -1:
679
680
  p = p[p.rfind(os.sep) + 1 :]
680
681
  return p
681
682
 
@@ -203,6 +203,12 @@ class FileDo:
203
203
  ) -> list[str]:
204
204
  if files_only is True and dirs_only is True:
205
205
  raise ValueError("Cannot list with neither files nor dirs")
206
+ if not self.dir_exists():
207
+ #
208
+ # this seems odd. an error or None seems better for a missing dir.
209
+ # however, this is the way it has always been so better to continue.
210
+ #
211
+ return []
206
212
  if recurse is True:
207
213
  lst = []
208
214
  for root, dirs, files in os.walk(self.path):