csvpath 0.0.549__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 (349) hide show
  1. {csvpath-0.0.549 → csvpath-0.0.550}/PKG-INFO +1 -1
  2. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-local-sftp.ini +2 -2
  3. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/csvpath.py +5 -2
  4. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/errors/error_comms.py +8 -0
  5. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/result_registrar.py +11 -1
  6. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/results_manager.py +5 -2
  7. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/results_registrar.py +1 -0
  8. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/function_factory.py +2 -1
  9. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/last.py +9 -6
  10. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/above.py +4 -0
  11. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/expression_utility.py +81 -17
  12. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/files_reference_finder_2.py +11 -13
  13. {csvpath-0.0.549 → csvpath-0.0.550}/pyproject.toml +1 -1
  14. {csvpath-0.0.549 → csvpath-0.0.550}/LICENSE +0 -0
  15. {csvpath-0.0.549 → csvpath-0.0.550}/README.md +0 -0
  16. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/config.ini +0 -0
  17. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/function.imports +0 -0
  18. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-local-azure.ini +0 -0
  19. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  20. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-local-gcs.ini +0 -0
  21. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-local-s3.ini +0 -0
  22. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-windows-azure.ini +0 -0
  23. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-windows-gcs.ini +0 -0
  24. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-windows-local.ini +0 -0
  25. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-windows-s3.ini +0 -0
  26. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/jenkins-windows-sftp.ini +0 -0
  27. {csvpath-0.0.549 → csvpath-0.0.550}/assets/config/local-localhost-sftp.ini +0 -0
  28. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  29. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/azure.sh +0 -0
  30. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/gcs-pipeline.gopipeline.json +0 -0
  31. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/gcs.sh +0 -0
  32. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  33. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/local.sh +0 -0
  34. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  35. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/s3.sh +0 -0
  36. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  37. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/mac/sftp.sh +0 -0
  38. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/azure.bat +0 -0
  39. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/gcs.bat +0 -0
  40. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/local.bat +0 -0
  41. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/s3.bat +0 -0
  42. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/sftp.bat +0 -0
  43. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  44. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  45. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  46. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  47. {csvpath-0.0.549 → csvpath-0.0.550}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  48. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  49. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  50. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  51. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  52. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  53. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  54. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sqlite/csvpath +0 -0
  55. {csvpath-0.0.549 → csvpath-0.0.550}/assets/integrations/sqlite/schema.sql +0 -0
  56. {csvpath-0.0.549 → csvpath-0.0.550}/config/config.ini +0 -0
  57. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/__init__.py +0 -0
  58. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/__init__.py +0 -0
  59. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/asker.py +0 -0
  60. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/cli.py +0 -0
  61. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/const.py +0 -0
  62. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/debug_config.py +0 -0
  63. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/drill_down.py +0 -0
  64. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/function_describer.py +0 -0
  65. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/function_lister.py +0 -0
  66. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/cli/selecter.py +0 -0
  67. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/csvpaths.py +0 -0
  68. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/__init__.py +0 -0
  69. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/errors/error.py +0 -0
  70. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/errors/error_collector.py +0 -0
  71. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/errors/error_manager.py +0 -0
  72. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/files/file_manager.py +0 -0
  73. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/files/file_metadata.py +0 -0
  74. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/files/file_registrar.py +0 -0
  75. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/files/files_listener.py +0 -0
  76. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  77. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  78. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  79. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  80. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  81. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event.py +0 -0
  82. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/event_result.py +0 -0
  83. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  84. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/job.py +0 -0
  85. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  86. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  87. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  88. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  89. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run.py +0 -0
  90. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  91. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/run_state.py +0 -0
  92. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/ol/sender.py +0 -0
  93. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  94. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  95. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  96. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  97. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  98. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  99. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  100. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  101. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/arrival_handler.py +0 -0
  102. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/rpc.py +0 -0
  103. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/sftpplus_listener.py +0 -0
  104. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfer_creator.py +0 -0
  105. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sftpplus/transfers.py +0 -0
  106. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/slack/event.py +0 -0
  107. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/slack/sender.py +0 -0
  108. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/engine.py +0 -0
  109. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  110. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  111. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  112. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  113. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  114. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/tables.py +0 -0
  115. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sql/updates.py +0 -0
  116. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  117. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  118. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  119. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  120. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  121. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/listener.py +0 -0
  122. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/metadata.py +0 -0
  123. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/paths/paths_listener.py +0 -0
  124. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/paths/paths_manager.py +0 -0
  125. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/paths/paths_metadata.py +0 -0
  126. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/paths/paths_registrar.py +0 -0
  127. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/registrar.py +0 -0
  128. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  129. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  130. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  131. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  132. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/readers/readers.py +0 -0
  133. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/result.py +0 -0
  134. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/result_file_reader.py +0 -0
  135. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/result_metadata.py +0 -0
  136. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/result_serializer.py +0 -0
  137. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/results/results_metadata.py +0 -0
  138. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/run/run_listener_stdout.py +0 -0
  139. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/run/run_metadata.py +0 -0
  140. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/run/run_registrar.py +0 -0
  141. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/managers/test_listener.py +0 -0
  142. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/__init__.py +0 -0
  143. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/__init__.py +0 -0
  144. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/args.py +0 -0
  145. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/args_helper.py +0 -0
  146. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/all.py +0 -0
  147. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/andf.py +0 -0
  148. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/any.py +0 -0
  149. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/between.py +0 -0
  150. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/empty.py +0 -0
  151. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/exists.py +0 -0
  152. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/inf.py +0 -0
  153. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/no.py +0 -0
  154. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/notf.py +0 -0
  155. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/orf.py +0 -0
  156. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/boolean/yes.py +0 -0
  157. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/count.py +0 -0
  158. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  159. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_headers.py +0 -0
  160. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_lines.py +0 -0
  161. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/count_scans.py +0 -0
  162. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/counter.py +0 -0
  163. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/every.py +0 -0
  164. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/has_matches.py +0 -0
  165. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/increment.py +0 -0
  166. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/tally.py +0 -0
  167. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/counting/total_lines.py +0 -0
  168. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/dates/now.py +0 -0
  169. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/function.py +0 -0
  170. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/function_finder.py +0 -0
  171. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/function_focus.py +0 -0
  172. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/append.py +0 -0
  173. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/collect.py +0 -0
  174. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  175. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/end.py +0 -0
  176. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_name.py +0 -0
  177. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  178. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/headers.py +0 -0
  179. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/insert.py +0 -0
  180. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/mismatch.py +0 -0
  181. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/replace.py +0 -0
  182. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  183. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/advance.py +0 -0
  184. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/after_blank.py +0 -0
  185. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/dups.py +0 -0
  186. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/first.py +0 -0
  187. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/first_line.py +0 -0
  188. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/lines/stop.py +0 -0
  189. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/add.py +0 -0
  190. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/divide.py +0 -0
  191. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/equals.py +0 -0
  192. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/intf.py +0 -0
  193. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/mod.py +0 -0
  194. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/multiply.py +0 -0
  195. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/odd.py +0 -0
  196. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/round.py +0 -0
  197. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/subtotal.py +0 -0
  198. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/subtract.py +0 -0
  199. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/math/sum.py +0 -0
  200. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  201. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/misc/importf.py +0 -0
  202. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/misc/random.py +0 -0
  203. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/print/jinjaf.py +0 -0
  204. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/print/print_line.py +0 -0
  205. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/print/print_queue.py +0 -0
  206. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/print/printf.py +0 -0
  207. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/print/table.py +0 -0
  208. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/stats/minf.py +0 -0
  209. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/stats/nminmax.py +0 -0
  210. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent.py +0 -0
  211. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  212. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/stats/stdev.py +0 -0
  213. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/alter.py +0 -0
  214. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/caps.py +0 -0
  215. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/concat.py +0 -0
  216. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/contains.py +0 -0
  217. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/length.py +0 -0
  218. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/lower.py +0 -0
  219. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/metaphone.py +0 -0
  220. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/regex.py +0 -0
  221. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/starts_with.py +0 -0
  222. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/strip.py +0 -0
  223. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/substring.py +0 -0
  224. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/strings/upper.py +0 -0
  225. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/testing/debug.py +0 -0
  226. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/__init__.py +0 -0
  227. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/boolean.py +0 -0
  228. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/datef.py +0 -0
  229. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/decimal.py +0 -0
  230. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/email.py +0 -0
  231. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/nonef.py +0 -0
  232. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/string.py +0 -0
  233. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/type.py +0 -0
  234. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/types/url.py +0 -0
  235. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/validity/fail.py +0 -0
  236. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/validity/failed.py +0 -0
  237. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/validity/line.py +0 -0
  238. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/variables/get.py +0 -0
  239. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/variables/pushpop.py +0 -0
  240. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/variables/put.py +0 -0
  241. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/variables/track.py +0 -0
  242. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/functions/variables/variables.py +0 -0
  243. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/lark_parser.py +0 -0
  244. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/lark_transformer.py +0 -0
  245. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/matcher.py +0 -0
  246. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/__init__.py +0 -0
  247. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/equality.py +0 -0
  248. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/expression.py +0 -0
  249. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/header.py +0 -0
  250. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/matchable.py +0 -0
  251. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/qualified.py +0 -0
  252. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/reference.py +0 -0
  253. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/term.py +0 -0
  254. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/productions/variable.py +0 -0
  255. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/exceptions.py +0 -0
  256. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/expression_encoder.py +0 -0
  257. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/lark_print_parser.py +0 -0
  258. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/print_parser.py +0 -0
  259. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/matching/util/runtime_data_collector.py +0 -0
  260. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/error_mode.py +0 -0
  261. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/explain_mode.py +0 -0
  262. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/files_mode.py +0 -0
  263. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/logic_mode.py +0 -0
  264. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/mode_controller.py +0 -0
  265. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/print_mode.py +0 -0
  266. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/return_mode.py +0 -0
  267. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/run_mode.py +0 -0
  268. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/source_mode.py +0 -0
  269. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/transfer_mode.py +0 -0
  270. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/unmatched_mode.py +0 -0
  271. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/modes/validation_mode.py +0 -0
  272. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/__init__.py +0 -0
  273. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/exceptions.py +0 -0
  274. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/parser.out +0 -0
  275. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/parsetab.py +0 -0
  276. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/scanner.py +0 -0
  277. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/scanning/scanning_lexer.py +0 -0
  278. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_data_reader.py +0 -0
  279. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_data_writer.py +0 -0
  280. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  281. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_nos.py +0 -0
  282. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_utils.py +0 -0
  283. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  284. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/box.py +0 -0
  285. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/cache.py +0 -0
  286. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/caser.py +0 -0
  287. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/class_loader.py +0 -0
  288. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/code.py +0 -0
  289. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/config.py +0 -0
  290. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/config_exception.py +0 -0
  291. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/date_util.py +0 -0
  292. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/exceptions.py +0 -0
  293. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/file_info.py +0 -0
  294. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/file_readers.py +0 -0
  295. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/file_writers.py +0 -0
  296. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  297. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  298. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  299. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_nos.py +0 -0
  300. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_utils.py +0 -0
  301. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  302. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/hasher.py +0 -0
  303. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/http/http_data_reader.py +0 -0
  304. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/intermediary.py +0 -0
  305. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/last_line_stats.py +0 -0
  306. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/line_counter.py +0 -0
  307. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/line_monitor.py +0 -0
  308. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/line_spooler.py +0 -0
  309. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/log_utility.py +0 -0
  310. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/metadata_parser.py +0 -0
  311. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/nos.py +0 -0
  312. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/pandas_data_reader.py +0 -0
  313. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/path_util.py +0 -0
  314. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/printer.py +0 -0
  315. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  316. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/files_tools/range_finder.py +0 -0
  317. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/ref_utils.py +0 -0
  318. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_exceptions.py +0 -0
  319. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_grammar.py +0 -0
  320. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  321. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_parser.py +0 -0
  322. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_results.py +0 -0
  323. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/reference_transformer.py +0 -0
  324. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_reference_finder_2.py +0 -0
  325. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/data_finder.py +0 -0
  326. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/date_filter.py +0 -0
  327. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  328. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/path_filter.py +0 -0
  329. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  330. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/token_filters.py +0 -0
  331. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  332. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/references/tools/date_completer.py +0 -0
  333. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/run_home_maker.py +0 -0
  334. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_data_reader.py +0 -0
  335. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_data_writer.py +0 -0
  336. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  337. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_nos.py +0 -0
  338. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_utils.py +0 -0
  339. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  340. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_config.py +0 -0
  341. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  342. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  343. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  344. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_nos.py +0 -0
  345. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_walk.py +0 -0
  346. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  347. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/sqliter.py +0 -0
  348. {csvpath-0.0.549 → csvpath-0.0.550}/csvpath/util/template_util.py +0 -0
  349. {csvpath-0.0.549 → 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.549
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
@@ -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
 
@@ -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
@@ -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:
@@ -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
 
@@ -534,7 +538,6 @@ class ResultsManager: # pylint: disable=C0115
534
538
  # seems to be important for a handful of unit tests.
535
539
  #
536
540
  rs = self.named_results[name]
537
- # print(f"resultsmgr: returning named results from cache: {rs}")
538
541
  return rs
539
542
  """ """
540
543
  #
@@ -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:
@@ -52,7 +52,6 @@ class FilesReferenceFinder2:
52
52
  return lst
53
53
 
54
54
  def query(self) -> ReferenceResults:
55
- # print(f"starting to find files: {self.csvpaths.config.get(section='inputs', name='files')}")
56
55
  results = ReferenceResults(ref=self.ref, csvpaths=self.csvpaths)
57
56
  #
58
57
  # if we find fingerprint we are done
@@ -72,12 +71,17 @@ class FilesReferenceFinder2:
72
71
  # otherwise, path or date may exist and if either does, it
73
72
  # disallows the other.
74
73
  #
74
+ # print(f"75: starting name one")
75
75
  if not self._range_if_name_one(results=results, tokens=tokens):
76
76
  # print(f"65: results: {len(results)}")
77
77
  if not self._date_if_name_one(results=results, tokens=tokens):
78
- # print(f"66: results: {len(results)}")
78
+ print(f"66: results: {len(results)}")
79
79
  self._path_if_name_one(results=results, tokens=tokens)
80
80
  # print(f"69: results: {len(results)}")
81
+ #
82
+ # we need a date token filter here!
83
+ #
84
+
81
85
  #
82
86
  # ordinals simply pickout an item in results.files, if possible
83
87
  #
@@ -119,7 +123,6 @@ class FilesReferenceFinder2:
119
123
  rrange = self._get_range_from_tokens(results, tokens)
120
124
  if rrange is None:
121
125
  return False
122
- print(f"_range_if_name_one: results: {results}, tokens: {tokens}")
123
126
  #
124
127
  # a 3-parts range where the range tells the date which way to look:
125
128
  # path >> date >> range
@@ -224,17 +227,10 @@ class FilesReferenceFinder2:
224
227
  # gets the range of files that are after a point.
225
228
  # the point is a date or the first match of a path prefix.
226
229
  #
227
- print(
228
- f"_do_range_of_name_one: results: {results}, rrange: {rrange}, results.ref.name_one: {results.ref.name_one}"
229
- )
230
- for _ in mani:
231
- print(f" ...{_['file']}")
232
-
233
230
  date = DateCompleter.to_date(results.ref.name_one)
234
231
  px = -1
235
232
  if date is None:
236
233
  prefix, px = self._prefix(results) # os.path.join(inputs, named_file)
237
- print(f"_do_range_of_name_one: prefix: {prefix}, px: {px}")
238
234
  before = rrange in ["before", "to"]
239
235
  after = rrange in ["after", "from"]
240
236
  nameone = results.ref.name_one
@@ -247,8 +243,6 @@ class FilesReferenceFinder2:
247
243
  for i, _ in enumerate(mani):
248
244
  if date is None:
249
245
  path = _["file"]
250
- print(f"_do_range_of_name_one: path: {path}, nameone: {nameone}")
251
- # minus = self._path_minus_prolog(named_file_name=self.ref.root_major, path=path)
252
246
  sw = self._starts_with(path, nameone)
253
247
  if rrange == "all":
254
248
  if sw:
@@ -383,6 +377,11 @@ class FilesReferenceFinder2:
383
377
  first, last = None, None
384
378
  if len(tokens) > 0 and DateCompleter.is_date_or_date_prefix(tokens[0]):
385
379
  first, last = DateCompleter.get_bracket_dates(tokens[0])
380
+ #
381
+ # need to remove token[0] here, right? we consume tokens. if there is an ordinal and it doesn't
382
+ # move up into [0] we ignore it.
383
+ #
384
+ del tokens[0]
386
385
  #
387
386
  #
388
387
  #
@@ -405,7 +404,6 @@ class FilesReferenceFinder2:
405
404
 
406
405
  def _starts_with(self, path, prefix) -> bool:
407
406
  path = self._path_minus_prolog(path=path)
408
- print(f"_starts_with: path: {path}, prefix: {prefix}")
409
407
  if path.startswith(prefix):
410
408
  return True
411
409
  i = path.rfind(".")
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "csvpath"
3
- version = "0.0.549"
3
+ version = "0.0.550"
4
4
  description = "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
  authors = ["David Kershaw <dk107dk@hotmail.com>"]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes