csvpath 0.0.612__tar.gz → 0.0.613__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. {csvpath-0.0.612 → csvpath-0.0.613}/PKG-INFO +1 -1
  2. csvpath-0.0.613/assets/config/jenkins-windows-sftp.ini +114 -0
  3. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/csvpaths.py +79 -17
  4. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_manager.py +0 -22
  5. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/files_listener.py +3 -4
  6. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_listener.py +4 -6
  7. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_manager.py +2 -1
  8. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_registrar.py +0 -1
  9. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_manager.py +13 -6
  10. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_metadata.py +17 -1
  11. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/results_registrar.py +32 -6
  12. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/nos.py +2 -0
  13. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/run_home_maker.py +2 -0
  14. {csvpath-0.0.612 → csvpath-0.0.613}/pyproject.toml +1 -1
  15. csvpath-0.0.612/assets/config/jenkins-windows-sftp.ini +0 -158
  16. {csvpath-0.0.612 → csvpath-0.0.613}/LICENSE +0 -0
  17. {csvpath-0.0.612 → csvpath-0.0.613}/README.md +0 -0
  18. {csvpath-0.0.612 → csvpath-0.0.613}/assets/.DS_Store +0 -0
  19. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/config.ini +0 -0
  20. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/extra-functions.imports +0 -0
  21. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/function.imports +0 -0
  22. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-azure.ini +0 -0
  23. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  24. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-gcs.ini +0 -0
  25. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-s3.ini +0 -0
  26. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-local-sftp.ini +0 -0
  27. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-azure.ini +0 -0
  28. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-gcs.ini +0 -0
  29. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-local.ini +0 -0
  30. {csvpath-0.0.612 → csvpath-0.0.613}/assets/config/jenkins-windows-s3.ini +0 -0
  31. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/.DS_Store +0 -0
  32. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/Mac.goenvironment.json +0 -0
  33. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/Windows.goenvironment.json +0 -0
  34. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  35. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/azure.sh +0 -0
  36. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/gcs.sh +0 -0
  37. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  38. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  39. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/local.sh +0 -0
  40. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  41. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/s3.sh +0 -0
  42. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  43. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/mac/sftp.sh +0 -0
  44. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/azure.bat +0 -0
  45. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/gcs.bat +0 -0
  46. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/local.bat +0 -0
  47. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/s3.bat +0 -0
  48. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/sftp.bat +0 -0
  49. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  50. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  51. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  52. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  53. {csvpath-0.0.612 → csvpath-0.0.613}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  54. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/.DS_Store +0 -0
  55. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  56. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  57. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  58. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  59. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  60. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  61. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sqlite/csvpath +0 -0
  62. {csvpath-0.0.612 → csvpath-0.0.613}/assets/integrations/sqlite/schema.sql +0 -0
  63. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
  64. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
  65. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
  66. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
  67. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
  68. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
  69. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
  70. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
  71. {csvpath-0.0.612 → csvpath-0.0.613}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
  72. {csvpath-0.0.612 → csvpath-0.0.613}/config/config.ini +0 -0
  73. {csvpath-0.0.612 → csvpath-0.0.613}/config/env.json +0 -0
  74. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/__init__.py +0 -0
  75. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/__init__.py +0 -0
  76. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/asker.py +0 -0
  77. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/cli.py +0 -0
  78. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/const.py +0 -0
  79. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/debug_config.py +0 -0
  80. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/drill_down.py +0 -0
  81. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/function_describer.py +0 -0
  82. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/function_lister.py +0 -0
  83. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/cli/selecter.py +0 -0
  84. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/csvpath.py +0 -0
  85. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/__init__.py +0 -0
  86. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error.py +0 -0
  87. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_collector.py +0 -0
  88. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_comms.py +0 -0
  89. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/errors/error_manager.py +0 -0
  90. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_activator.py +0 -0
  91. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_describer.py +0 -0
  92. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_descriptor.py +0 -0
  93. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_metadata.py +0 -0
  94. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_names_rules.py +0 -0
  95. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/file_registrar.py +0 -0
  96. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/files_activation_listener.py +0 -0
  97. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  98. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  99. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  100. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  101. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  102. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/event.py +0 -0
  103. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/event_result.py +0 -0
  104. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  105. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/job.py +0 -0
  106. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  107. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  108. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  109. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  110. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run.py +0 -0
  111. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  112. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/run_state.py +0 -0
  113. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/ol/sender.py +0 -0
  114. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  115. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  116. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  117. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  118. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  119. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  120. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  121. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  122. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  123. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  124. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/slack/event.py +0 -0
  125. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/slack/sender.py +0 -0
  126. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/engine.py +0 -0
  127. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  128. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  129. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  130. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  131. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  132. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/tables.py +0 -0
  133. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sql/updates.py +0 -0
  134. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  135. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  136. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  137. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  138. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  139. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/listener.py +0 -0
  140. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/metadata.py +0 -0
  141. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_describer.py +0 -0
  142. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_descriptor.py +0 -0
  143. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_metadata.py +0 -0
  144. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/paths/paths_registrar.py +0 -0
  145. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/registrar.py +0 -0
  146. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  147. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  148. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  149. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  150. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/readers/readers.py +0 -0
  151. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result.py +0 -0
  152. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_file_reader.py +0 -0
  153. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_metadata.py +0 -0
  154. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/result_serializer.py +0 -0
  155. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/results/transfers_manager.py +0 -0
  156. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_listener_stdout.py +0 -0
  157. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_metadata.py +0 -0
  158. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/run/run_registrar.py +0 -0
  159. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/server_config.py +0 -0
  160. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/managers/test_listener.py +0 -0
  161. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/__init__.py +0 -0
  162. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/__init__.py +0 -0
  163. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/args.py +0 -0
  164. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/args_helper.py +0 -0
  165. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/all.py +0 -0
  166. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/andf.py +0 -0
  167. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/any.py +0 -0
  168. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/between.py +0 -0
  169. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/empty.py +0 -0
  170. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/exists.py +0 -0
  171. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/inf.py +0 -0
  172. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/no.py +0 -0
  173. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/notf.py +0 -0
  174. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/orf.py +0 -0
  175. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/boolean/yes.py +0 -0
  176. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count.py +0 -0
  177. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  178. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_headers.py +0 -0
  179. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_lines.py +0 -0
  180. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/count_scans.py +0 -0
  181. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/counter.py +0 -0
  182. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/every.py +0 -0
  183. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/has_matches.py +0 -0
  184. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/increment.py +0 -0
  185. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/tally.py +0 -0
  186. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/counting/total_lines.py +0 -0
  187. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/now.py +0 -0
  188. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/part.py +0 -0
  189. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/dates/roll.py +0 -0
  190. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function.py +0 -0
  191. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_factory.py +0 -0
  192. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_finder.py +0 -0
  193. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/function_focus.py +0 -0
  194. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/append.py +0 -0
  195. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/collect.py +0 -0
  196. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  197. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/end.py +0 -0
  198. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/header_name.py +0 -0
  199. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  200. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/headers.py +0 -0
  201. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  202. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/insert.py +0 -0
  203. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/line_before.py +0 -0
  204. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/mismatch.py +0 -0
  205. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/remove.py +0 -0
  206. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/rename.py +0 -0
  207. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/replace.py +0 -0
  208. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  209. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/json/jsonpath.py +0 -0
  210. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/advance.py +0 -0
  211. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/after_blank.py +0 -0
  212. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/dups.py +0 -0
  213. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/first.py +0 -0
  214. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/first_line.py +0 -0
  215. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/last.py +0 -0
  216. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/lines/stop.py +0 -0
  217. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/above.py +0 -0
  218. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/add.py +0 -0
  219. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/divide.py +0 -0
  220. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/equals.py +0 -0
  221. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/intf.py +0 -0
  222. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/mod.py +0 -0
  223. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/multiply.py +0 -0
  224. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/odd.py +0 -0
  225. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/round.py +0 -0
  226. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/subtotal.py +0 -0
  227. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/subtract.py +0 -0
  228. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/math/sum.py +0 -0
  229. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/env.py +0 -0
  230. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  231. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/importf.py +0 -0
  232. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/metadata.py +0 -0
  233. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/parquet.py +0 -0
  234. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/random.py +0 -0
  235. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/misc/runtime.py +0 -0
  236. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/jinjaf.py +0 -0
  237. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/print_line.py +0 -0
  238. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/print_queue.py +0 -0
  239. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/printf.py +0 -0
  240. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/print/table.py +0 -0
  241. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/sql/select.py +0 -0
  242. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/sql/sql_in.py +0 -0
  243. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/minf.py +0 -0
  244. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/nminmax.py +0 -0
  245. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/percent.py +0 -0
  246. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  247. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/stats/stdev.py +0 -0
  248. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/alter.py +0 -0
  249. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/caps.py +0 -0
  250. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/concat.py +0 -0
  251. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/contains.py +0 -0
  252. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/format.py +0 -0
  253. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/length.py +0 -0
  254. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/lower.py +0 -0
  255. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/metaphone.py +0 -0
  256. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/regex.py +0 -0
  257. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/starts_with.py +0 -0
  258. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/strip.py +0 -0
  259. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/substring.py +0 -0
  260. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/strings/upper.py +0 -0
  261. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/testing/debug.py +0 -0
  262. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/__init__.py +0 -0
  263. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/blank.py +0 -0
  264. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/boolean.py +0 -0
  265. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/datatype.py +0 -0
  266. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/datef.py +0 -0
  267. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/decimal.py +0 -0
  268. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/email.py +0 -0
  269. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/nonef.py +0 -0
  270. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/string.py +0 -0
  271. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/type.py +0 -0
  272. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/url.py +0 -0
  273. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/uuid.py +0 -0
  274. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/types/wildcard.py +0 -0
  275. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/fail.py +0 -0
  276. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/failed.py +0 -0
  277. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/line.py +0 -0
  278. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/matches.py +0 -0
  279. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  280. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/clear.py +0 -0
  281. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/get.py +0 -0
  282. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/index_of.py +0 -0
  283. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/pushpop.py +0 -0
  284. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/put.py +0 -0
  285. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/slice.py +0 -0
  286. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/sort.py +0 -0
  287. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/track.py +0 -0
  288. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/variables/variables.py +0 -0
  289. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/functions/xml/xpath.py +0 -0
  290. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/lark_parser.py +0 -0
  291. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/lark_transformer.py +0 -0
  292. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/matcher.py +0 -0
  293. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/__init__.py +0 -0
  294. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/equality.py +0 -0
  295. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/expression.py +0 -0
  296. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/header.py +0 -0
  297. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/matchable.py +0 -0
  298. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/qualified.py +0 -0
  299. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/reference.py +0 -0
  300. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/term.py +0 -0
  301. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/productions/variable.py +0 -0
  302. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/exceptions.py +0 -0
  303. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/expression_encoder.py +0 -0
  304. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/expression_utility.py +0 -0
  305. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/lark_print_parser.py +0 -0
  306. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/parquet_utility.py +0 -0
  307. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/print_parser.py +0 -0
  308. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/matching/util/runtime_data_collector.py +0 -0
  309. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/error_mode.py +0 -0
  310. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/explain_mode.py +0 -0
  311. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/files_mode.py +0 -0
  312. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/logic_mode.py +0 -0
  313. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/mode_controller.py +0 -0
  314. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/print_mode.py +0 -0
  315. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/return_mode.py +0 -0
  316. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/run_mode.py +0 -0
  317. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/source_mode.py +0 -0
  318. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/transfer_mode.py +0 -0
  319. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/unmatched_mode.py +0 -0
  320. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/modes/validation_mode.py +0 -0
  321. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/__init__.py +0 -0
  322. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2.py +0 -0
  323. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2_parser.py +0 -0
  324. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/scanning/scanner2_transformer.py +0 -0
  325. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_data_reader.py +0 -0
  326. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_data_writer.py +0 -0
  327. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  328. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  329. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_nos.py +0 -0
  330. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_timing_policy.py +0 -0
  331. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_utils.py +0 -0
  332. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  333. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/backend_check.py +0 -0
  334. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/box.py +0 -0
  335. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/cache.py +0 -0
  336. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/caser.py +0 -0
  337. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/class_loader.py +0 -0
  338. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/code.py +0 -0
  339. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config.py +0 -0
  340. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config_env.py +0 -0
  341. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/config_exception.py +0 -0
  342. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/date_util.py +0 -0
  343. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/exceptions.py +0 -0
  344. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_info.py +0 -0
  345. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_readers.py +0 -0
  346. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_utility.py +0 -0
  347. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/file_writers.py +0 -0
  348. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  349. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  350. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  351. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  352. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_nos.py +0 -0
  353. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_utils.py +0 -0
  354. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  355. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/hasher.py +0 -0
  356. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/http/http_data_reader.py +0 -0
  357. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/intermediary.py +0 -0
  358. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/json/json_data_reader.py +0 -0
  359. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/json/json_reader_helper.py +0 -0
  360. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/last_line_stats.py +0 -0
  361. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_counter.py +0 -0
  362. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_monitor.py +0 -0
  363. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/line_spooler.py +0 -0
  364. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/log_utility.py +0 -0
  365. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/metadata_parser.py +0 -0
  366. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/pandas_data_reader.py +0 -0
  367. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/path_util.py +0 -0
  368. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/printer.py +0 -0
  369. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/py_file_utility.py +0 -0
  370. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_reference_finder_2.py +0 -0
  371. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  372. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/files_tools/range_finder.py +0 -0
  373. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/ref_utils.py +0 -0
  374. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_exceptions.py +0 -0
  375. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_grammar.py +0 -0
  376. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  377. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_parser.py +0 -0
  378. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_results.py +0 -0
  379. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/reference_transformer.py +0 -0
  380. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_reference_finder_2.py +0 -0
  381. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/data_finder.py +0 -0
  382. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/date_filter.py +0 -0
  383. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  384. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/path_filter.py +0 -0
  385. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  386. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/token_filters.py +0 -0
  387. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  388. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/references/tools/date_completer.py +0 -0
  389. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/referrer_printer.py +0 -0
  390. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_data_reader.py +0 -0
  391. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_data_writer.py +0 -0
  392. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  393. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  394. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_nos.py +0 -0
  395. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_utils.py +0 -0
  396. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  397. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_config.py +0 -0
  398. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  399. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  400. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  401. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  402. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_nos.py +0 -0
  403. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_server_creds.py +0 -0
  404. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_walk.py +0 -0
  405. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  406. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/sqliter.py +0 -0
  407. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/stopwatch.py +0 -0
  408. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/template_util.py +0 -0
  409. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/var_utility.py +0 -0
  410. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  411. {csvpath-0.0.612 → csvpath-0.0.613}/csvpath/util/xlsx/xlsx_reader_helper.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: csvpath
3
- Version: 0.0.612
3
+ Version: 0.0.613
4
4
  Summary: CsvPath Framework is a data preboarding automation library for receiving, validating, and tracking CSV, Excel, JSONL and other tabular data files before they can corrupt downstream data consumers.
5
5
  License-File: LICENSE
6
6
  Author: David Kershaw
@@ -0,0 +1,114 @@
1
+ [testing]
2
+ azure.skip = yes
3
+ gcs.skip = yes
4
+ s3.skip = yes
5
+ sftp.skip = no
6
+
7
+ [extensions]
8
+ csvpath_files = csvpath, csvpaths
9
+ csv_files = csv, tsv, dat, tab, psv, ssv
10
+
11
+ [errors]
12
+ csvpath = raise, collect, print
13
+ csvpaths = raise, collect, print
14
+ use_format = full
15
+ pattern = {time}:{file}:{line}:{paths}:{instance}:{chain}: {message}
16
+
17
+ [logging]
18
+ csvpath = info
19
+ csvpaths = debug
20
+ log_file = logs\csvpath.log
21
+ log_files_to_keep = 100
22
+ log_file_size = 52428800
23
+ handler = file
24
+
25
+ [config]
26
+ path = assets\config\jenkins-windows-sftp.ini
27
+ allow_var_sub = True
28
+ var_sub_source = env
29
+
30
+ [cache]
31
+ path = cache
32
+ use_cache = no
33
+
34
+ [functions]
35
+ imports =
36
+
37
+ [results]
38
+ archive = tmp\sftp\archive
39
+ transfers = tmp\sftp\transfers
40
+
41
+ [inputs]
42
+ files = sftp://{SFTP_SERVER}:{SFTP_PORT}/windows/inputs/named_files
43
+ csvpaths = tmp\sftp\inputs\named_paths
44
+ on_unmatched_file_fingerprints = halt
45
+ allow_http_files = True
46
+ allow_local_files = True
47
+
48
+ [listeners]
49
+ groups = default
50
+ sqlite.result = from csvpath.managers.integrations.sqlite.sqlite_result_listener import SqliteResultListener
51
+ sqlite.results = from csvpath.managers.integrations.sqlite.sqlite_results_listener import SqliteResultsListener
52
+ default.file = from csvpath.managers.files.files_listener import FilesListener
53
+ default.paths = from csvpath.managers.paths.paths_listener import PathsListener
54
+ otlp.result = from csvpath.managers.integrations.otlp.otlp_result_listener import OpenTelemetryResultListener
55
+ otlp.results = from csvpath.managers.integrations.otlp.otlp_results_listener import OpenTelemetryResultsListener
56
+ otlp.errors = from csvpath.managers.integrations.otlp.otlp_error_listener import OpenTelemetryErrorListener
57
+ sftpplus.paths = from csvpath.managers.integrations.sftpplus.sftpplus_listener import SftpPlusListener
58
+ sftp.results = from csvpath.managers.integrations.sftp.sftp_listener import SftpListener
59
+ ckan.results = from csvpath.managers.integrations.ckan.ckan_listener import CkanListener
60
+ openlineage.file = from csvpath.managers.integrations.ol.file_listener_ol import OpenLineageFileListener
61
+ openlineage.paths = from csvpath.managers.integrations.ol.paths_listener_ol import OpenLineagePathsListener
62
+ openlineage.result = from csvpath.managers.integrations.ol.result_listener_ol import OpenLineageResultListener
63
+ openlineage.results = from csvpath.managers.integrations.ol.results_listener_ol import OpenLineageResultsListener
64
+ slack.file = from csvpath.managers.integrations.slack.sender import SlackSender
65
+ slack.paths = from csvpath.managers.integrations.slack.sender import SlackSender
66
+ slack.result = from csvpath.managers.integrations.slack.sender import SlackSender
67
+ slack.results = from csvpath.managers.integrations.slack.sender import SlackSender
68
+ scripts.results = from csvpath.managers.integrations.scripts.scripts_results_listener import ScriptsResultsListener
69
+
70
+ [otlp]
71
+
72
+ [aws]
73
+
74
+ [azure]
75
+
76
+ [gcs]
77
+
78
+ [sftp]
79
+ server = SFTP_SERVER
80
+ port = SFTP_PORT
81
+ username = python
82
+ password = hangzhou
83
+
84
+ [sqlite]
85
+ db = archive\csvpath.db
86
+
87
+ [sftpplus]
88
+ mailbox_user = MAILBOX_USER
89
+ mailbox_password = MAILBOX_PASSWORD
90
+ server = SFTPPLUS_SERVER
91
+ port = SFTPPLUS_PORT
92
+ admin_username = SFTPPLUS_ADMIN_USERNAME
93
+ admin_password = SFTPPLUS_ADMIN_PASSWORD
94
+ api_url = https://. . . :10020/json
95
+ scripts_dir =
96
+ execute_timeout = 300
97
+
98
+ [ckan]
99
+ server = http://. . . :80
100
+ api_token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3akJwc1ZuSkVrZm1aNnBtVTJfTW5CNlJXZ211YjdOOHVXZ1l1cUFDa0Q4IiwiaWF0IjoxNzM0NzE4NDQ3fQ.QXWXoJoSxVES4NwXYBteYUD7enX9D5T2htmETLGFzrs
101
+
102
+ [scripts]
103
+ run_scripts = yes
104
+
105
+ [openlineage]
106
+ base_url = http://. . . :5000
107
+ endpoint = api/v1/lineage
108
+ api_key = "none"
109
+ timeout = 5
110
+ verify = False
111
+
112
+ [slack]
113
+ webhook_url =
114
+
@@ -8,7 +8,7 @@ import threading
8
8
 
9
9
  from uuid import uuid4
10
10
  from abc import ABC, abstractmethod
11
- from typing import List, Any, NewType
11
+ from typing import Any, NewType, Optional
12
12
  from datetime import datetime
13
13
  from .managers.errors.error import Error
14
14
  from .managers.errors.error_comms import ErrorCommunications
@@ -459,7 +459,7 @@ Cache: {cache}
459
459
  self._advance_all = lines
460
460
 
461
461
  @property
462
- def errors(self) -> List[Error]: # pylint: disable=C0116
462
+ def errors(self) -> list[Error]: # pylint: disable=C0116
463
463
  """@private
464
464
  generally you should be looking at results_manager or error_manager for errors.
465
465
  """
@@ -758,7 +758,12 @@ Cache: {cache}
758
758
  # case data.csv is the default.
759
759
  #
760
760
  def collect_paths(
761
- self, *, pathsname: str, filename: str, template: str = None
761
+ self,
762
+ *,
763
+ pathsname: str,
764
+ filename: str,
765
+ template: str = None,
766
+ extra_data: Optional[dict[str, str]] = None,
762
767
  ) -> Reference:
763
768
  """
764
769
  Sequentially does a CsvPath.collect() on filename for every named-path in the
@@ -783,11 +788,19 @@ Cache: {cache}
783
788
  if isinstance(files, list):
784
789
  for file in files:
785
790
  ref = self._collect_paths(
786
- pathsname=pathsname, filename=filename, template=template, file=file
791
+ pathsname=pathsname,
792
+ filename=filename,
793
+ template=template,
794
+ file=file,
795
+ extra_data=extra_data,
787
796
  )
788
797
  else:
789
798
  ref = self._collect_paths(
790
- pathsname=pathsname, filename=filename, template=template, file=files
799
+ pathsname=pathsname,
800
+ filename=filename,
801
+ template=template,
802
+ file=files,
803
+ extra_data=extra_data,
791
804
  )
792
805
  #
793
806
  # absolute reference to the results
@@ -795,7 +808,13 @@ Cache: {cache}
795
808
  return ref
796
809
 
797
810
  def _collect_paths(
798
- self, *, pathsname: str, file: str, filename: str, template: str = None
811
+ self,
812
+ *,
813
+ pathsname: str,
814
+ file: str,
815
+ filename: str,
816
+ template: str = None,
817
+ extra_data: Optional[dict[str, str]] = None,
799
818
  ) -> Reference:
800
819
  #
801
820
  # if template is None we need to go find any template that was given when
@@ -828,7 +847,6 @@ Cache: {cache}
828
847
 
829
848
  results = []
830
849
  #
831
- # exp
832
850
  # adding uuid for the run as a whole
833
851
  run_uuid = uuid4()
834
852
  #
@@ -841,6 +859,7 @@ Cache: {cache}
841
859
  file=file,
842
860
  run_uuid=run_uuid,
843
861
  method="collect_paths",
862
+ extra_data=extra_data,
844
863
  )
845
864
  #
846
865
  #
@@ -930,7 +949,12 @@ Cache: {cache}
930
949
  return ret
931
950
 
932
951
  def fast_forward_paths(
933
- self, *, pathsname: str, filename: str, template: str = None
952
+ self,
953
+ *,
954
+ pathsname: str,
955
+ filename: str,
956
+ template: str = None,
957
+ extra_data: Optional[dict[str, str]] = None,
934
958
  ) -> Reference:
935
959
  """
936
960
  Sequentially does a CsvPath.fast_forward() on filename for every named path. No matches are collected.
@@ -942,16 +966,30 @@ Cache: {cache}
942
966
  if isinstance(files, list):
943
967
  for file in files:
944
968
  ref = self._fast_forward_paths(
945
- pathsname=pathsname, filename=filename, template=template, file=file
969
+ pathsname=pathsname,
970
+ filename=filename,
971
+ template=template,
972
+ file=file,
973
+ extra_data=extra_data,
946
974
  )
947
975
  else:
948
976
  ref = self._fast_forward_paths(
949
- pathsname=pathsname, filename=filename, template=template, file=files
977
+ pathsname=pathsname,
978
+ filename=filename,
979
+ template=template,
980
+ file=files,
981
+ extra_data=extra_data,
950
982
  )
951
983
  return ref
952
984
 
953
985
  def _fast_forward_paths(
954
- self, *, pathsname: str, file: str, filename: str, template: str = None
986
+ self,
987
+ *,
988
+ pathsname: str,
989
+ file: str,
990
+ filename: str,
991
+ template: str = None,
992
+ extra_data: Optional[dict[str, str]] = None,
955
993
  ) -> Reference:
956
994
  """Sequentially does a CsvPath.fast_forward() on filename for every named path. No matches are collected."""
957
995
  paths = self._get_named_paths(pathsname)
@@ -991,6 +1029,7 @@ Cache: {cache}
991
1029
  filename=filename,
992
1030
  run_uuid=run_uuid,
993
1031
  method="fast_forward_paths",
1032
+ extra_data=extra_data,
994
1033
  )
995
1034
  #
996
1035
  #
@@ -1066,7 +1105,8 @@ Cache: {cache}
1066
1105
  filename: str,
1067
1106
  collect: bool = False,
1068
1107
  template: str = None,
1069
- ) -> List[Any]: # pylint: disable=R0914
1108
+ extra_data: Optional[dict[str, str]] = None,
1109
+ ) -> list[Any]: # pylint: disable=R0914
1070
1110
  """
1071
1111
  Does a CsvPath.next() on filename for every line against every named path in sequence
1072
1112
  """
@@ -1107,6 +1147,7 @@ Cache: {cache}
1107
1147
  filename=filename,
1108
1148
  run_uuid=run_uuid,
1109
1149
  method="next_paths",
1150
+ extra_data=extra_data,
1110
1151
  )
1111
1152
  #
1112
1153
  #
@@ -1200,6 +1241,7 @@ Cache: {cache}
1200
1241
  collect_when_not_matched=False,
1201
1242
  template: str = None,
1202
1243
  lines: list = None,
1244
+ extra_data: Optional[dict[str, str]] = None,
1203
1245
  ) -> Reference:
1204
1246
  """
1205
1247
  Does a CsvPath.collect() on filename where each row is considered by
@@ -1228,6 +1270,7 @@ Cache: {cache}
1228
1270
  file=file,
1229
1271
  template=template,
1230
1272
  method="collect_by_line",
1273
+ extra_data=extra_data,
1231
1274
  ):
1232
1275
  # re: W0612: we need 'line' in order to do the iteration. we have to iterate.
1233
1276
  lines.append(line)
@@ -1254,6 +1297,7 @@ Cache: {cache}
1254
1297
  if_all_agree=False,
1255
1298
  collect_when_not_matched=False,
1256
1299
  template: str = None,
1300
+ extra_data: Optional[dict[str, str]] = None,
1257
1301
  ) -> Reference:
1258
1302
  """
1259
1303
  Does a CsvPath.fast_forward() on filename where each row is considered by
@@ -1279,6 +1323,7 @@ Cache: {cache}
1279
1323
  file=file,
1280
1324
  template=template,
1281
1325
  method="fast_forward_by_line",
1326
+ extra_data=extra_data,
1282
1327
  ):
1283
1328
  # re: W0612: we need 'line' in order to do the iteration. we have to iterate.
1284
1329
  pass
@@ -1308,7 +1353,8 @@ Cache: {cache}
1308
1353
  collect_when_not_matched=False,
1309
1354
  template: str = None,
1310
1355
  method: str = None,
1311
- ) -> List[Any]:
1356
+ extra_data: Optional[dict[str, str]] = None,
1357
+ ) -> list[Any]:
1312
1358
  #
1313
1359
  # we're doing a programmatic use when we use next_by_line() so we don't allow
1314
1360
  # multiple file runs. we check that here; the other _by_line()s skip it.
@@ -1326,6 +1372,7 @@ Cache: {cache}
1326
1372
  collect_when_not_matched=collect_when_not_matched,
1327
1373
  template=template,
1328
1374
  file=file,
1375
+ extra_data=extra_data,
1329
1376
  )
1330
1377
 
1331
1378
  def _next_by_line( # pylint: disable=R0912,R0915,R0914
@@ -1339,7 +1386,8 @@ Cache: {cache}
1339
1386
  template: str = None,
1340
1387
  file: str,
1341
1388
  method: str = "next_by_line",
1342
- ) -> List[Any]:
1389
+ extra_data: Optional[dict[str, str]] = None,
1390
+ ) -> list[Any]:
1343
1391
  """Does a CsvPath.next() on filename where each row is considered
1344
1392
  by every named path before the next row starts.
1345
1393
 
@@ -1350,6 +1398,11 @@ Cache: {cache}
1350
1398
 
1351
1399
  collect_when_not_matched=True inverts the match so that lines
1352
1400
  which did not match are returned, rather than the default behavior.
1401
+
1402
+ extra_data is a flat dict of values that are meaningful to the caller.
1403
+ the results registrar stores them as an extra.json file in the
1404
+ run_dir within an _extra_data directory. the directory can be used
1405
+ by any listener as a scratch space
1353
1406
  """
1354
1407
  # re: R0912 -- absolutely. plan to refactor.
1355
1408
  if isinstance(file, list):
@@ -1393,6 +1446,7 @@ Cache: {cache}
1393
1446
  pathsname=pathsname,
1394
1447
  crt=crt,
1395
1448
  method=method,
1449
+ extra_data=extra_data,
1396
1450
  )
1397
1451
  #
1398
1452
  # setting file into the csvpath is less obviously useful at CsvPaths
@@ -1402,7 +1456,7 @@ Cache: {cache}
1402
1456
  reader = FileManager.get_reader(
1403
1457
  file, delimiter=self.delimiter, quotechar=self.quotechar
1404
1458
  )
1405
- stopped_count: List[int] = []
1459
+ stopped_count: list[int] = []
1406
1460
  for line in reader.next():
1407
1461
  # for line in reader: # pylint: disable=R1702
1408
1462
  # question to self: should this default be in a central place
@@ -1524,7 +1578,7 @@ Cache: {cache}
1524
1578
  def _load_csvpath_objects(
1525
1579
  self,
1526
1580
  *,
1527
- paths: List[str],
1581
+ paths: list[str],
1528
1582
  named_file: str,
1529
1583
  collect_when_not_matched=False,
1530
1584
  filename,
@@ -1562,7 +1616,14 @@ Cache: {cache}
1562
1616
  return csvpath_objects
1563
1617
 
1564
1618
  def _prep_csvpath_results(
1565
- self, *, csvpath_objects, filename, pathsname, crt: str, method: str
1619
+ self,
1620
+ *,
1621
+ csvpath_objects,
1622
+ filename,
1623
+ pathsname,
1624
+ crt: str,
1625
+ method: str,
1626
+ extra_data: Optional[dict[str, str]],
1566
1627
  ):
1567
1628
  """@private"""
1568
1629
  #
@@ -1578,6 +1639,7 @@ Cache: {cache}
1578
1639
  filename=filename,
1579
1640
  run_uuid=run_uuid,
1580
1641
  method="next_paths",
1642
+ extra_data=extra_data,
1581
1643
  )
1582
1644
  #
1583
1645
  #
@@ -87,7 +87,6 @@ class FileManager:
87
87
  def files_root_manifest(self) -> dict:
88
88
  """@private"""
89
89
  p = self.files_root_manifest_path
90
- # nos = self.nos
91
90
  nos = Nos(p)
92
91
  if nos.exists():
93
92
  with DataFileReader(p) as reader:
@@ -344,28 +343,7 @@ class FileManager:
344
343
  # and then, once fingerprinted:
345
344
  # -> d/b/myfile.csv/0b849c9c1ef....csv
346
345
  #
347
- """
348
- _t = t
349
- parts = pathu.parts(path)
350
- for i, part in enumerate(parts):
351
- t = t.replace(f":{i}", part)
352
- #
353
- # TODO: replace dynamic tokens: :day_of_week, :day, :month, :month_of_year, :year, :quarter
354
- #
355
- t = t.replace(":filename", parts[-1])
356
- """
357
- #
358
- # this is what we need to do instead of the above ^^^^
359
- #
360
346
  t = temu.transform_file_template(template=t, file=path)
361
- """
362
- print(f"xt2: path: {path}")
363
- print(f"xt2: parts: {parts}")
364
- print(f"xt2: _t: {_t}")
365
- print(f"xt2: _2: {_t2}")
366
- print(f"xt2: t: {t}")
367
- print("")
368
- """
369
347
  #
370
348
  #
371
349
  #
@@ -1,7 +1,4 @@
1
- import os
2
1
  import json
3
- from datetime import datetime
4
- from csvpath.util.exceptions import InputException, FileException
5
2
  from csvpath.util.file_readers import DataFileReader
6
3
  from csvpath.util.file_writers import DataFileWriter
7
4
  from csvpath.util.nos import Nos
@@ -87,4 +84,6 @@ class FilesListener(Listener): # Registrar,
87
84
  jdata = self.get_manifest(manifest_path)
88
85
  jdata.append(mani)
89
86
  with DataFileWriter(path=manifest_path, mode="w") as writer:
90
- json.dump(jdata, writer.sink, indent=2)
87
+ j = json.dumps(jdata, indent=2)
88
+ writer.sink.write(j)
89
+ writer.sink.flush()
@@ -1,10 +1,7 @@
1
- import os
2
1
  import json
3
- from csvpath.util.exceptions import InputException
4
2
  from csvpath.util.file_readers import DataFileReader
5
3
  from csvpath.util.file_writers import DataFileWriter
6
4
  from csvpath.util.nos import Nos
7
- from .paths_metadata import PathsMetadata
8
5
  from ..listener import Listener
9
6
  from ..metadata import Metadata
10
7
 
@@ -37,14 +34,13 @@ class PathsListener(Listener):
37
34
  mpath = self.manifest_path
38
35
  with DataFileReader(mpath, encoding="utf-8") as file:
39
36
  contents = file.read()
37
+ # print(f"pathslist: mpath: {mpath}: {contents}")
40
38
  j = json.loads(contents)
41
- # j = json.load(file.source)
42
39
  return j
43
40
 
44
41
  @property
45
42
  def manifest_path(self) -> None:
46
43
  mf = Nos(self.csvpaths.config.inputs_csvpaths_path).join("manifest.json")
47
- # mf = os.path.join(self.csvpaths.config.inputs_csvpaths_path, "manifest.json")
48
44
  if not Nos(mf).exists():
49
45
  with DataFileWriter(path=mf) as file:
50
46
  file.append("[]")
@@ -74,4 +70,6 @@ class PathsListener(Listener):
74
70
  jdata = self.manifest
75
71
  jdata.append(mani)
76
72
  with DataFileWriter(path=self.manifest_path) as file:
77
- json.dump(jdata, file.sink, indent=2)
73
+ j = json.dumps(jdata, indent=2)
74
+ file.sink.write(j)
75
+ file.sink.flush()
@@ -616,7 +616,8 @@ class PathsManager:
616
616
  return t
617
617
 
618
618
  def get_template_for_paths(self, name: NamedPathsName) -> str:
619
- return self.describer.get_template(name)
619
+ t = self.describer.get_template(name)
620
+ return "" if t is None else t
620
621
 
621
622
  def store_template_for_paths(self, name: NamedPathsName, template: str) -> None:
622
623
  self.describer.store_template(name, template)
@@ -209,7 +209,6 @@ class ResultRegistrar(Registrar, Listener):
209
209
  @property
210
210
  def manifest_path(self) -> str:
211
211
  h = Nos(self.result_path).join("manifest.json")
212
- # h = os.path.join(self.result_path, "manifest.json")
213
212
  return h
214
213
 
215
214
  @property
@@ -3,7 +3,7 @@ import os
3
3
  import re
4
4
  from uuid import UUID
5
5
  import dateutil.parser
6
- from typing import Dict, List, Any
6
+ from typing import Any, Optional
7
7
  from csvpath.util.line_spooler import LineSpooler
8
8
  from csvpath.util.exceptions import InputException, CsvPathsException
9
9
  from csvpath.util.references.reference_parser import ReferenceParser
@@ -112,6 +112,7 @@ class ResultsManager: # pylint: disable=C0115
112
112
  file: str = None,
113
113
  run_uuid: UUID,
114
114
  method: str,
115
+ extra_data: Optional[dict[str, str]] = None,
115
116
  ) -> ResultsMetadata:
116
117
  """@private"""
117
118
  rr = ResultsRegistrar(
@@ -142,6 +143,12 @@ class ResultsManager: # pylint: disable=C0115
142
143
  #
143
144
  #
144
145
  mdata = ResultsMetadata(self.csvpaths.config)
146
+ #
147
+ # extra data is a flat list of dict[str,str] determined by the user and saved by some
148
+ # listener. we don't do anything with it, other than save it in the default listener
149
+ # when we first create the run manifest.json.
150
+ #
151
+ mdata.extra_data = extra_data
145
152
  mdata.archive_name = self.csvpaths.config.archive_name
146
153
  mdata.run_home = run_dir
147
154
  mdata.run_uuid = run_uuid
@@ -410,13 +417,13 @@ class ResultsManager: # pylint: disable=C0115
410
417
  rr.add_internal_listener(_)
411
418
  rr.register_start(mdata)
412
419
 
413
- def set_named_results(self, results: Dict[str, List[Result]]) -> None:
420
+ def set_named_results(self, results: dict[str, list[Result]]) -> None:
414
421
  """@private"""
415
422
  self.named_results = {}
416
423
  for value in results.values():
417
424
  self.add_named_results(value)
418
425
 
419
- def add_named_results(self, results: List[Result]) -> None:
426
+ def add_named_results(self, results: list[Result]) -> None:
420
427
  """@private"""
421
428
  for r in results:
422
429
  self.add_named_result(r)
@@ -522,7 +529,7 @@ class ResultsManager: # pylint: disable=C0115
522
529
  mydirs[os.path.dirname(path)] = path
523
530
  return mydirs
524
531
 
525
- def _get_named_results_for_reference(self, name: str) -> List[List[Any]]:
532
+ def _get_named_results_for_reference(self, name: str) -> list[list[Any]]:
526
533
  #
527
534
  # $mygroup.results.orders/acme/2025:first.myinstance
528
535
  #
@@ -592,7 +599,7 @@ class ResultsManager: # pylint: disable=C0115
592
599
  #
593
600
  # this gets the results of a single run. it does not get all runs under the name.
594
601
  #
595
- def get_named_results(self, name) -> List[List[Any]]:
602
+ def get_named_results(self, name) -> list[list[Any]]:
596
603
  #
597
604
  # as it turns out, references are (finally!) the easiest, so let's do that
598
605
  # first.
@@ -748,7 +755,7 @@ class ResultsManager: # pylint: disable=C0115
748
755
  instances = Nos(path).listdir()
749
756
  rs = [None for inst in instances if inst != "manifest.json"]
750
757
  for inst in instances:
751
- if inst.endswith(".json"):
758
+ if inst.endswith(".json") or inst == "_extra_data":
752
759
  #
753
760
  # exp ^^^^
754
761
  #
@@ -1,5 +1,5 @@
1
+ from typing import Optional
1
2
  from csvpath.managers.metadata import Metadata
2
- from datetime import datetime
3
3
  from uuid import UUID
4
4
 
5
5
 
@@ -8,6 +8,7 @@ class ResultsMetadata(Metadata):
8
8
 
9
9
  def __init__(self, config):
10
10
  super().__init__(config)
11
+ self._extra_data: Optional[dict[str, str]] = None
11
12
  self.run_home: str = None
12
13
  self.named_paths_name: str = None
13
14
  self.named_paths_uuid: UUID = None
@@ -28,6 +29,21 @@ class ResultsMetadata(Metadata):
28
29
  self._run_uuid: UUID = None
29
30
  self._method: str = None
30
31
 
32
+ @property
33
+ def extra_data(self) -> dict[str, str]:
34
+ return self._extra_data
35
+
36
+ @extra_data.setter
37
+ def extra_data(self, extra: dict[str, str]) -> None:
38
+ if extra is None:
39
+ return
40
+ if not isinstance(extra, dict):
41
+ raise ValueError(f"Extra data must be a dictionary, not a {type(extra)}")
42
+ for k, v in extra.items():
43
+ if not isinstance(v, str):
44
+ raise ValueError(f"Extra data items must be strings, not {type(extra)}")
45
+ self._extra_data = extra
46
+
31
47
  @property
32
48
  def method(self) -> str:
33
49
  return self._method
@@ -1,7 +1,4 @@
1
- import os
2
- from datetime import datetime, timezone
3
1
  import json
4
- import time
5
2
  from csvpath.util.nos import Nos
6
3
  from csvpath.util.file_info import FileInfo
7
4
  from csvpath.util.exceptions import FileException
@@ -11,7 +8,6 @@ from .result import Result
11
8
  from .result_serializer import ResultSerializer
12
9
  from .result_registrar import ResultRegistrar
13
10
  from .results_metadata import ResultsMetadata
14
- from ..run.run_metadata import RunMetadata
15
11
  from ..registrar import Registrar
16
12
  from ..listener import Listener
17
13
  from ..metadata import Metadata
@@ -26,7 +22,6 @@ class ResultsRegistrar(Registrar, Listener):
26
22
  def __init__(
27
23
  self, *, csvpaths, run_dir: str, pathsname: str, results: list[Result] = None
28
24
  ) -> None:
29
- # super().__init__(csvpaths=csvpaths)
30
25
  Registrar.__init__(self, csvpaths)
31
26
  Listener.__init__(self, csvpaths.config)
32
27
  self.pathsname = pathsname
@@ -127,6 +122,38 @@ class ResultsRegistrar(Registrar, Listener):
127
122
  m["manifest_path"] = mp
128
123
  with DataFileWriter(path=mp) as file:
129
124
  json.dump(m, file.sink, indent=2)
125
+ #
126
+ # extra data is a flat str->str dict that is provided by the CsvPaths caller at
127
+ # run start time. we store it in the _extra_data directory within the run. we
128
+ # don't do anything else with it, but an integration or an end user can look
129
+ # there to find any user provided metadata. this is in addition to and has nothing
130
+ # to do with the metadata fields that csvpath writers can add to the external
131
+ # comment of a csvpath.
132
+ #
133
+ self._save_extra_data_if(mdata)
134
+
135
+ @property
136
+ def extra_data_path(self) -> str:
137
+ path = Nos(self.run_dir).join("_extra_data")
138
+ if not Nos(path).exists():
139
+ Nos(path).makedirs()
140
+ path = Nos(path).join("extra.json")
141
+ return path
142
+
143
+ def _save_extra_data_if(self, mdata: Metadata) -> None:
144
+ if mdata.extra_data is None:
145
+ return
146
+ self._save_extra_data(self.extra_data_path, mdata.extra_data)
147
+
148
+ def _save_extra_data(self, path: str, extra: dict[str, str]) -> None:
149
+ if Nos(path).exists():
150
+ with DataFileReader(path) as reader:
151
+ ed = json.load(reader.source)
152
+ if not isinstance(ed, dict):
153
+ raise ValueError(f"Extra data must be a dictionary, not {type(ed)}")
154
+ extra = extra | ed
155
+ with DataFileWriter(path=path) as writer:
156
+ json.dump(extra, writer.sink)
130
157
 
131
158
  def _fingerprint_file(self, path) -> str:
132
159
  with DataFileReader(path) as f:
@@ -186,5 +213,4 @@ class ResultsRegistrar(Registrar, Listener):
186
213
  if not Nos(self.run_dir).exists():
187
214
  Nos(self.run_dir).makedir()
188
215
  mp = Nos(self.run_dir).join("manifest.json")
189
- # mp = os.path.join(self.run_dir, "manifest.json")
190
216
  return mp
@@ -178,6 +178,8 @@ class Nos:
178
178
  # posix/cloud seps?
179
179
  #
180
180
  # return "/" if self.path.find("\\") == -1 else os.sep
181
+ if self.path.startswith("http://") or self.path.startswith("https://"):
182
+ return "/"
181
183
  return self.do.sep
182
184
 
183
185
  def join(self, name: str) -> str: