csvpath 0.0.620__tar.gz → 0.0.621__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 (566) hide show
  1. {csvpath-0.0.620 → csvpath-0.0.621}/PKG-INFO +3 -1
  2. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-local-gcs.ini +3 -3
  3. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-local-s3.ini +3 -3
  4. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/csvpath.py +23 -12
  5. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/csvpaths.py +4 -0
  6. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_manager.py +41 -6
  7. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_registrar.py +4 -0
  8. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_results_listener.py +2 -0
  9. csvpath-0.0.621/csvpath/managers/paths/paths_asset_manager.py +78 -0
  10. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_manager.py +71 -11
  11. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/result_registrar.py +2 -0
  12. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/results_manager.py +31 -11
  13. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/results_metadata.py +17 -0
  14. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/results_registrar.py +5 -0
  15. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/function_factory.py +4 -0
  16. csvpath-0.0.621/csvpath/matching/functions/json/jsonschema.py +123 -0
  17. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/fingerprint.py +0 -3
  18. csvpath-0.0.621/csvpath/matching/functions/xml/xsd.py +143 -0
  19. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/files_mode.py +5 -2
  20. csvpath-0.0.621/csvpath/references/csvpaths_reference_finder_3.py +754 -0
  21. csvpath-0.0.621/csvpath/references/files_reference_finder_3.py +1430 -0
  22. csvpath-0.0.621/csvpath/references/function_describer_3.py +104 -0
  23. csvpath-0.0.621/csvpath/references/functions/__init__.py +0 -0
  24. csvpath-0.0.621/csvpath/references/functions/fields/__init__.py +0 -0
  25. csvpath-0.0.621/csvpath/references/functions/fields/actual_data_file_3.py +25 -0
  26. csvpath-0.0.621/csvpath/references/functions/fields/archive_3.py +50 -0
  27. csvpath-0.0.621/csvpath/references/functions/fields/archive_path_3.py +31 -0
  28. csvpath-0.0.621/csvpath/references/functions/fields/completed_3.py +27 -0
  29. csvpath-0.0.621/csvpath/references/functions/fields/destination_address_3.py +28 -0
  30. csvpath-0.0.621/csvpath/references/functions/fields/destination_password_3.py +25 -0
  31. csvpath-0.0.621/csvpath/references/functions/fields/destination_port_3.py +24 -0
  32. csvpath-0.0.621/csvpath/references/functions/fields/destination_username_3.py +25 -0
  33. csvpath-0.0.621/csvpath/references/functions/fields/destinations_3.py +28 -0
  34. csvpath-0.0.621/csvpath/references/functions/fields/error_count_3.py +22 -0
  35. csvpath-0.0.621/csvpath/references/functions/fields/file_fingerprints_3.py +31 -0
  36. csvpath-0.0.621/csvpath/references/functions/fields/file_home_3.py +25 -0
  37. csvpath-0.0.621/csvpath/references/functions/fields/file_manifest_3.py +30 -0
  38. csvpath-0.0.621/csvpath/references/functions/fields/file_path_3.py +28 -0
  39. csvpath-0.0.621/csvpath/references/functions/fields/files_complete_3.py +28 -0
  40. csvpath-0.0.621/csvpath/references/functions/fields/fingerprint_3.py +78 -0
  41. csvpath-0.0.621/csvpath/references/functions/fields/group_file_3.py +22 -0
  42. csvpath-0.0.621/csvpath/references/functions/fields/group_home_3.py +26 -0
  43. csvpath-0.0.621/csvpath/references/functions/fields/group_manifest_3.py +25 -0
  44. csvpath-0.0.621/csvpath/references/functions/fields/home_3.py +38 -0
  45. csvpath-0.0.621/csvpath/references/functions/fields/host_3.py +45 -0
  46. csvpath-0.0.621/csvpath/references/functions/fields/hostname_3.py +34 -0
  47. csvpath-0.0.621/csvpath/references/functions/fields/identity_3.py +25 -0
  48. csvpath-0.0.621/csvpath/references/functions/fields/instance_home_3.py +28 -0
  49. csvpath-0.0.621/csvpath/references/functions/fields/instance_index_3.py +22 -0
  50. csvpath-0.0.621/csvpath/references/functions/fields/manifest_path_3.py +32 -0
  51. csvpath-0.0.621/csvpath/references/functions/fields/mark_3.py +26 -0
  52. csvpath-0.0.621/csvpath/references/functions/fields/method_3.py +16 -0
  53. csvpath-0.0.621/csvpath/references/functions/fields/named_file_fingerprint_3.py +27 -0
  54. csvpath-0.0.621/csvpath/references/functions/fields/named_file_home_3.py +25 -0
  55. csvpath-0.0.621/csvpath/references/functions/fields/named_file_last_change_3.py +25 -0
  56. csvpath-0.0.621/csvpath/references/functions/fields/named_file_name_3.py +37 -0
  57. csvpath-0.0.621/csvpath/references/functions/fields/named_file_path_3.py +23 -0
  58. csvpath-0.0.621/csvpath/references/functions/fields/named_file_size_3.py +24 -0
  59. csvpath-0.0.621/csvpath/references/functions/fields/named_file_uuid_3.py +23 -0
  60. csvpath-0.0.621/csvpath/references/functions/fields/named_files_root_3.py +28 -0
  61. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_3.py +25 -0
  62. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_count_3.py +24 -0
  63. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_fingerprint_3.py +35 -0
  64. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_group_3.py +28 -0
  65. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_identities_3.py +25 -0
  66. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_name_3.py +34 -0
  67. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_root_3.py +28 -0
  68. csvpath-0.0.621/csvpath/references/functions/fields/named_paths_uuid_3.py +26 -0
  69. csvpath-0.0.621/csvpath/references/functions/fields/named_results_name_3.py +21 -0
  70. csvpath-0.0.621/csvpath/references/functions/fields/on_arrival_3.py +44 -0
  71. csvpath-0.0.621/csvpath/references/functions/fields/origin_3.py +37 -0
  72. csvpath-0.0.621/csvpath/references/functions/fields/origin_data_file_3.py +29 -0
  73. csvpath-0.0.621/csvpath/references/functions/fields/preceding_instance_identity_3.py +28 -0
  74. csvpath-0.0.621/csvpath/references/functions/fields/reference_field_3.py +29 -0
  75. csvpath-0.0.621/csvpath/references/functions/fields/run_dir_3.py +22 -0
  76. csvpath-0.0.621/csvpath/references/functions/fields/run_home_3.py +28 -0
  77. csvpath-0.0.621/csvpath/references/functions/fields/run_method_3.py +28 -0
  78. csvpath-0.0.621/csvpath/references/functions/fields/run_uuid_3.py +34 -0
  79. csvpath-0.0.621/csvpath/references/functions/fields/script_on_complete_all_3.py +30 -0
  80. csvpath-0.0.621/csvpath/references/functions/fields/script_on_complete_error_3.py +25 -0
  81. csvpath-0.0.621/csvpath/references/functions/fields/script_on_complete_invalid_3.py +25 -0
  82. csvpath-0.0.621/csvpath/references/functions/fields/script_on_complete_valid_3.py +25 -0
  83. csvpath-0.0.621/csvpath/references/functions/fields/scripts_3.py +27 -0
  84. csvpath-0.0.621/csvpath/references/functions/fields/serial_3.py +29 -0
  85. csvpath-0.0.621/csvpath/references/functions/fields/source_address_3.py +30 -0
  86. csvpath-0.0.621/csvpath/references/functions/fields/source_mode_preceding_3.py +19 -0
  87. csvpath-0.0.621/csvpath/references/functions/fields/source_password_3.py +24 -0
  88. csvpath-0.0.621/csvpath/references/functions/fields/source_port_3.py +24 -0
  89. csvpath-0.0.621/csvpath/references/functions/fields/source_username_3.py +24 -0
  90. csvpath-0.0.621/csvpath/references/functions/fields/sources_3.py +27 -0
  91. csvpath-0.0.621/csvpath/references/functions/fields/status_3.py +26 -0
  92. csvpath-0.0.621/csvpath/references/functions/fields/template_3.py +68 -0
  93. csvpath-0.0.621/csvpath/references/functions/fields/time_3.py +34 -0
  94. csvpath-0.0.621/csvpath/references/functions/fields/time_completed_3.py +33 -0
  95. csvpath-0.0.621/csvpath/references/functions/fields/transfer_on_complete_all_3.py +32 -0
  96. csvpath-0.0.621/csvpath/references/functions/fields/transfer_on_complete_error_3.py +29 -0
  97. csvpath-0.0.621/csvpath/references/functions/fields/transfer_on_complete_invalid_3.py +29 -0
  98. csvpath-0.0.621/csvpath/references/functions/fields/transfer_on_complete_valid_3.py +27 -0
  99. csvpath-0.0.621/csvpath/references/functions/fields/transfers_3.py +33 -0
  100. csvpath-0.0.621/csvpath/references/functions/fields/type_3.py +22 -0
  101. csvpath-0.0.621/csvpath/references/functions/fields/username_3.py +41 -0
  102. csvpath-0.0.621/csvpath/references/functions/fields/uuid_3.py +55 -0
  103. csvpath-0.0.621/csvpath/references/functions/fields/valid_3.py +33 -0
  104. csvpath-0.0.621/csvpath/references/functions/fields/webhooks_3.py +26 -0
  105. csvpath-0.0.621/csvpath/references/functions/fields/webhooks_on_complete_all_3.py +27 -0
  106. csvpath-0.0.621/csvpath/references/functions/fields/webhooks_on_complete_error_3.py +25 -0
  107. csvpath-0.0.621/csvpath/references/functions/fields/webhooks_on_complete_invalid_3.py +25 -0
  108. csvpath-0.0.621/csvpath/references/functions/fields/webhooks_on_complete_valid_3.py +25 -0
  109. csvpath-0.0.621/csvpath/references/functions/filters/__init__.py +0 -0
  110. csvpath-0.0.621/csvpath/references/functions/filters/empty_3.py +16 -0
  111. csvpath-0.0.621/csvpath/references/functions/filters/false_3.py +16 -0
  112. csvpath-0.0.621/csvpath/references/functions/filters/idchain_3.py +96 -0
  113. csvpath-0.0.621/csvpath/references/functions/filters/none_3.py +16 -0
  114. csvpath-0.0.621/csvpath/references/functions/filters/not_empty_3.py +16 -0
  115. csvpath-0.0.621/csvpath/references/functions/filters/not_none_3.py +21 -0
  116. csvpath-0.0.621/csvpath/references/functions/filters/predicate_function_3.py +22 -0
  117. csvpath-0.0.621/csvpath/references/functions/filters/true_3.py +29 -0
  118. csvpath-0.0.621/csvpath/references/functions/function_3.py +361 -0
  119. csvpath-0.0.621/csvpath/references/functions/reference_function_factory_3.py +347 -0
  120. csvpath-0.0.621/csvpath/references/functions/selectors/__init__.py +0 -0
  121. csvpath-0.0.621/csvpath/references/functions/selectors/all_3.py +39 -0
  122. csvpath-0.0.621/csvpath/references/functions/selectors/date_3.py +31 -0
  123. csvpath-0.0.621/csvpath/references/functions/selectors/first_3.py +19 -0
  124. csvpath-0.0.621/csvpath/references/functions/selectors/flatten_3.py +43 -0
  125. csvpath-0.0.621/csvpath/references/functions/selectors/from_3.py +68 -0
  126. csvpath-0.0.621/csvpath/references/functions/selectors/groups_3.py +41 -0
  127. csvpath-0.0.621/csvpath/references/functions/selectors/having_3.py +60 -0
  128. csvpath-0.0.621/csvpath/references/functions/selectors/index_3.py +25 -0
  129. csvpath-0.0.621/csvpath/references/functions/selectors/last_3.py +17 -0
  130. csvpath-0.0.621/csvpath/references/functions/selectors/name_3.py +71 -0
  131. csvpath-0.0.621/csvpath/references/functions/selectors/regex_3.py +92 -0
  132. csvpath-0.0.621/csvpath/references/functions/selectors/to_3.py +38 -0
  133. csvpath-0.0.621/csvpath/references/functions/values/__init__.py +0 -0
  134. csvpath-0.0.621/csvpath/references/functions/values/day_3.py +17 -0
  135. csvpath-0.0.621/csvpath/references/functions/values/day_name_3.py +17 -0
  136. csvpath-0.0.621/csvpath/references/functions/values/hour_24_3.py +18 -0
  137. csvpath-0.0.621/csvpath/references/functions/values/hour_3.py +19 -0
  138. csvpath-0.0.621/csvpath/references/functions/values/minute_3.py +17 -0
  139. csvpath-0.0.621/csvpath/references/functions/values/month_3.py +17 -0
  140. csvpath-0.0.621/csvpath/references/functions/values/month_name_3.py +17 -0
  141. csvpath-0.0.621/csvpath/references/functions/values/second_3.py +17 -0
  142. csvpath-0.0.621/csvpath/references/functions/values/today_3.py +23 -0
  143. csvpath-0.0.621/csvpath/references/functions/values/year_3.py +39 -0
  144. csvpath-0.0.621/csvpath/references/functions/values/yesterday_3.py +20 -0
  145. csvpath-0.0.621/csvpath/references/functions/well_known_files/__init__.py +0 -0
  146. csvpath-0.0.621/csvpath/references/functions/well_known_files/data_3.py +28 -0
  147. csvpath-0.0.621/csvpath/references/functions/well_known_files/definition_3.py +49 -0
  148. csvpath-0.0.621/csvpath/references/functions/well_known_files/errors_3.py +58 -0
  149. csvpath-0.0.621/csvpath/references/functions/well_known_files/file_3.py +45 -0
  150. csvpath-0.0.621/csvpath/references/functions/well_known_files/log_3.py +37 -0
  151. csvpath-0.0.621/csvpath/references/functions/well_known_files/manifest_3.py +65 -0
  152. csvpath-0.0.621/csvpath/references/functions/well_known_files/meta_3.py +27 -0
  153. csvpath-0.0.621/csvpath/references/functions/well_known_files/printouts_3.py +31 -0
  154. csvpath-0.0.621/csvpath/references/functions/well_known_files/unmatched_3.py +29 -0
  155. csvpath-0.0.621/csvpath/references/functions/well_known_files/vars_3.py +27 -0
  156. csvpath-0.0.621/csvpath/references/reference_3.py +598 -0
  157. csvpath-0.0.621/csvpath/references/reference_exceptions_3.py +37 -0
  158. csvpath-0.0.621/csvpath/references/reference_expression_3.py +382 -0
  159. csvpath-0.0.621/csvpath/references/reference_finder_3.py +874 -0
  160. csvpath-0.0.621/csvpath/references/reference_finder_factory_3.py +50 -0
  161. csvpath-0.0.621/csvpath/references/reference_grammar_3.py +199 -0
  162. csvpath-0.0.621/csvpath/references/reference_parser_3.py +112 -0
  163. csvpath-0.0.621/csvpath/references/reference_results_3.py +208 -0
  164. csvpath-0.0.621/csvpath/references/reference_transformer_3.py +267 -0
  165. csvpath-0.0.621/csvpath/references/results_reference_finder_3.py +1765 -0
  166. csvpath-0.0.621/csvpath/scanning/__init__.py +0 -0
  167. csvpath-0.0.621/csvpath/util/azure/azure_json_document_reader.py +8 -0
  168. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/cache.py +14 -9
  169. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/config.py +24 -0
  170. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/file_readers.py +8 -7
  171. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/file_writers.py +1 -1
  172. csvpath-0.0.621/csvpath/util/gcs/gcs_json_document_reader.py +8 -0
  173. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/json/json_data_reader.py +1 -5
  174. csvpath-0.0.621/csvpath/util/json/json_document_reader.py +38 -0
  175. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/json/json_reader_helper.py +28 -8
  176. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/last_line_stats.py +6 -2
  177. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/line_counter.py +6 -3
  178. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/line_monitor.py +3 -0
  179. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/line_spooler.py +93 -8
  180. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/nos.py +6 -2
  181. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/path_util.py +5 -1
  182. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/run_home_maker.py +1 -0
  183. csvpath-0.0.621/csvpath/util/s3/s3_json_document_reader.py +8 -0
  184. csvpath-0.0.621/csvpath/util/sftp/sftp_json_document_reader.py +8 -0
  185. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_nos.py +5 -3
  186. {csvpath-0.0.620 → csvpath-0.0.621}/pyproject.toml +3 -1
  187. {csvpath-0.0.620 → csvpath-0.0.621}/LICENSE +0 -0
  188. {csvpath-0.0.620 → csvpath-0.0.621}/README.md +0 -0
  189. {csvpath-0.0.620 → csvpath-0.0.621}/assets/.DS_Store +0 -0
  190. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/config.ini +0 -0
  191. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/extra-functions.imports +0 -0
  192. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/function.imports +0 -0
  193. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-local-azure.ini +0 -0
  194. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  195. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-local-sftp.ini +0 -0
  196. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-windows-azure.ini +0 -0
  197. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-windows-gcs.ini +0 -0
  198. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-windows-local.ini +0 -0
  199. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-windows-s3.ini +0 -0
  200. {csvpath-0.0.620 → csvpath-0.0.621}/assets/config/jenkins-windows-sftp.ini +0 -0
  201. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/.DS_Store +0 -0
  202. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/Mac.goenvironment.json +0 -0
  203. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/Windows.goenvironment.json +0 -0
  204. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  205. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/azure.sh +0 -0
  206. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/gcs.sh +0 -0
  207. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  208. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  209. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/local.sh +0 -0
  210. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  211. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/s3.sh +0 -0
  212. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  213. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/mac/sftp.sh +0 -0
  214. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/azure.bat +0 -0
  215. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/gcs.bat +0 -0
  216. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/local.bat +0 -0
  217. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/s3.bat +0 -0
  218. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/sftp.bat +0 -0
  219. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  220. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  221. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  222. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  223. {csvpath-0.0.620 → csvpath-0.0.621}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  224. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/.DS_Store +0 -0
  225. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  226. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  227. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  228. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  229. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  230. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  231. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sqlite/csvpath +0 -0
  232. {csvpath-0.0.620 → csvpath-0.0.621}/assets/integrations/sqlite/schema.sql +0 -0
  233. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
  234. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
  235. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
  236. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
  237. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
  238. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
  239. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
  240. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
  241. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
  242. {csvpath-0.0.620 → csvpath-0.0.621}/assets/libs/release_candidate_maker-0.0.36.tar.gz +0 -0
  243. {csvpath-0.0.620 → csvpath-0.0.621}/config/config.ini +0 -0
  244. {csvpath-0.0.620 → csvpath-0.0.621}/config/env.json +0 -0
  245. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/__init__.py +0 -0
  246. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/__init__.py +0 -0
  247. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/asker.py +0 -0
  248. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/cli.py +0 -0
  249. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/const.py +0 -0
  250. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/debug_config.py +0 -0
  251. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/drill_down.py +0 -0
  252. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/function_describer.py +0 -0
  253. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/function_lister.py +0 -0
  254. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/cli/selecter.py +0 -0
  255. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/__init__.py +0 -0
  256. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/errors/error.py +0 -0
  257. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/errors/error_collector.py +0 -0
  258. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/errors/error_comms.py +0 -0
  259. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/errors/error_manager.py +0 -0
  260. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_activator.py +0 -0
  261. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_describer.py +0 -0
  262. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_descriptor.py +0 -0
  263. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_metadata.py +0 -0
  264. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/file_names_rules.py +0 -0
  265. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/files_activation_listener.py +0 -0
  266. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/files_listener.py +0 -0
  267. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  268. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  269. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  270. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  271. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  272. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/event.py +0 -0
  273. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/event_result.py +0 -0
  274. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  275. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/job.py +0 -0
  276. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  277. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  278. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  279. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  280. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/run.py +0 -0
  281. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  282. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/run_state.py +0 -0
  283. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/ol/sender.py +0 -0
  284. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  285. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  286. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  287. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  288. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  289. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  290. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  291. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  292. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  293. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/slack/event.py +0 -0
  294. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/slack/sender.py +0 -0
  295. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/engine.py +0 -0
  296. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  297. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  298. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  299. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  300. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  301. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/tables.py +0 -0
  302. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sql/updates.py +0 -0
  303. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  304. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  305. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  306. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/webhook/webhook_listener.py +0 -0
  307. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  308. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/listener.py +0 -0
  309. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/metadata.py +0 -0
  310. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_describer.py +0 -0
  311. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_descriptor.py +0 -0
  312. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_listener.py +0 -0
  313. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_metadata.py +0 -0
  314. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/paths/paths_registrar.py +0 -0
  315. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/registrar.py +0 -0
  316. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  317. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  318. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  319. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  320. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/readers/readers.py +0 -0
  321. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/result.py +0 -0
  322. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/result_file_reader.py +0 -0
  323. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/result_metadata.py +0 -0
  324. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/result_serializer.py +0 -0
  325. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/results/transfers_manager.py +0 -0
  326. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/run/run_listener_stdout.py +0 -0
  327. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/run/run_metadata.py +0 -0
  328. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/run/run_registrar.py +0 -0
  329. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/server_config.py +0 -0
  330. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/managers/test_listener.py +0 -0
  331. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/__init__.py +0 -0
  332. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/__init__.py +0 -0
  333. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/args.py +0 -0
  334. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/args_helper.py +0 -0
  335. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/all.py +0 -0
  336. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/andf.py +0 -0
  337. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/any.py +0 -0
  338. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/between.py +0 -0
  339. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/empty.py +0 -0
  340. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/exists.py +0 -0
  341. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/inf.py +0 -0
  342. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/no.py +0 -0
  343. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/notf.py +0 -0
  344. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/orf.py +0 -0
  345. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/boolean/yes.py +0 -0
  346. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/count.py +0 -0
  347. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  348. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/count_headers.py +0 -0
  349. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/count_lines.py +0 -0
  350. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/count_scans.py +0 -0
  351. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/counter.py +0 -0
  352. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/every.py +0 -0
  353. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/has_matches.py +0 -0
  354. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/increment.py +0 -0
  355. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/tally.py +0 -0
  356. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/counting/total_lines.py +0 -0
  357. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/dates/now.py +0 -0
  358. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/dates/part.py +0 -0
  359. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/dates/roll.py +0 -0
  360. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/function.py +0 -0
  361. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/function_finder.py +0 -0
  362. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/function_focus.py +0 -0
  363. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/append.py +0 -0
  364. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/collect.py +0 -0
  365. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  366. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/end.py +0 -0
  367. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/header_name.py +0 -0
  368. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  369. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/headers.py +0 -0
  370. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  371. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/insert.py +0 -0
  372. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/line_before.py +0 -0
  373. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/mismatch.py +0 -0
  374. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/remove.py +0 -0
  375. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/rename.py +0 -0
  376. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/replace.py +0 -0
  377. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  378. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/json/jsonpath.py +0 -0
  379. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/advance.py +0 -0
  380. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/after_blank.py +0 -0
  381. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/dups.py +0 -0
  382. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/first.py +0 -0
  383. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/first_line.py +0 -0
  384. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/last.py +0 -0
  385. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/lines/stop.py +0 -0
  386. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/above.py +0 -0
  387. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/add.py +0 -0
  388. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/divide.py +0 -0
  389. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/equals.py +0 -0
  390. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/intf.py +0 -0
  391. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/mod.py +0 -0
  392. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/multiply.py +0 -0
  393. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/odd.py +0 -0
  394. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/round.py +0 -0
  395. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/subtotal.py +0 -0
  396. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/subtract.py +0 -0
  397. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/math/sum.py +0 -0
  398. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/env.py +0 -0
  399. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/importf.py +0 -0
  400. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/metadata.py +0 -0
  401. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/parquet.py +0 -0
  402. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/random.py +0 -0
  403. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/misc/runtime.py +0 -0
  404. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/print/jinjaf.py +0 -0
  405. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/print/print_line.py +0 -0
  406. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/print/print_queue.py +0 -0
  407. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/print/printf.py +0 -0
  408. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/print/table.py +0 -0
  409. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/sql/select.py +0 -0
  410. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/sql/sql_in.py +0 -0
  411. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/stats/minf.py +0 -0
  412. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/stats/nminmax.py +0 -0
  413. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/stats/percent.py +0 -0
  414. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  415. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/stats/stdev.py +0 -0
  416. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/alter.py +0 -0
  417. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/caps.py +0 -0
  418. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/concat.py +0 -0
  419. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/contains.py +0 -0
  420. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/format.py +0 -0
  421. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/length.py +0 -0
  422. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/lower.py +0 -0
  423. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/metaphone.py +0 -0
  424. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/regex.py +0 -0
  425. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/starts_with.py +0 -0
  426. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/strip.py +0 -0
  427. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/substring.py +0 -0
  428. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/strings/upper.py +0 -0
  429. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/testing/debug.py +0 -0
  430. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/__init__.py +0 -0
  431. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/blank.py +0 -0
  432. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/boolean.py +0 -0
  433. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/datatype.py +0 -0
  434. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/datef.py +0 -0
  435. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/decimal.py +0 -0
  436. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/email.py +0 -0
  437. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/nonef.py +0 -0
  438. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/string.py +0 -0
  439. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/type.py +0 -0
  440. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/url.py +0 -0
  441. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/uuid.py +0 -0
  442. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/types/wildcard.py +0 -0
  443. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/validity/fail.py +0 -0
  444. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/validity/failed.py +0 -0
  445. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/validity/line.py +0 -0
  446. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/validity/matches.py +0 -0
  447. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  448. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/clear.py +0 -0
  449. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/get.py +0 -0
  450. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/index_of.py +0 -0
  451. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/pushpop.py +0 -0
  452. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/put.py +0 -0
  453. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/slice.py +0 -0
  454. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/sort.py +0 -0
  455. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/track.py +0 -0
  456. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/variables/variables.py +0 -0
  457. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/functions/xml/xpath.py +0 -0
  458. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/lark_parser.py +0 -0
  459. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/lark_transformer.py +0 -0
  460. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/matcher.py +0 -0
  461. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/__init__.py +0 -0
  462. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/equality.py +0 -0
  463. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/expression.py +0 -0
  464. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/header.py +0 -0
  465. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/matchable.py +0 -0
  466. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/qualified.py +0 -0
  467. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/reference.py +0 -0
  468. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/term.py +0 -0
  469. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/productions/variable.py +0 -0
  470. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/exceptions.py +0 -0
  471. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/expression_encoder.py +0 -0
  472. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/expression_utility.py +0 -0
  473. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/lark_print_parser.py +0 -0
  474. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/parquet_utility.py +0 -0
  475. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/print_parser.py +0 -0
  476. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/matching/util/runtime_data_collector.py +0 -0
  477. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/error_mode.py +0 -0
  478. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/explain_mode.py +0 -0
  479. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/logic_mode.py +0 -0
  480. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/mode_controller.py +0 -0
  481. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/print_mode.py +0 -0
  482. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/return_mode.py +0 -0
  483. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/run_mode.py +0 -0
  484. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/source_mode.py +0 -0
  485. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/transfer_mode.py +0 -0
  486. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/unmatched_mode.py +0 -0
  487. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/modes/validation_mode.py +0 -0
  488. {csvpath-0.0.620/csvpath/scanning → csvpath-0.0.621/csvpath/references}/__init__.py +0 -0
  489. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/scanning/scanner2.py +0 -0
  490. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/scanning/scanner2_parser.py +0 -0
  491. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/scanning/scanner2_transformer.py +0 -0
  492. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_data_reader.py +0 -0
  493. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_data_writer.py +0 -0
  494. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  495. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  496. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_nos.py +0 -0
  497. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_timing_policy.py +0 -0
  498. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_utils.py +0 -0
  499. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  500. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/backend_check.py +0 -0
  501. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/box.py +0 -0
  502. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/caser.py +0 -0
  503. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/class_loader.py +0 -0
  504. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/code.py +0 -0
  505. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/config_env.py +0 -0
  506. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/config_exception.py +0 -0
  507. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/date_util.py +0 -0
  508. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/exceptions.py +0 -0
  509. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/file_info.py +0 -0
  510. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/file_utility.py +0 -0
  511. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  512. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  513. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  514. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  515. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_nos.py +0 -0
  516. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_utils.py +0 -0
  517. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  518. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/hasher.py +0 -0
  519. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/http/http_data_reader.py +0 -0
  520. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/intermediary.py +0 -0
  521. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/log_utility.py +0 -0
  522. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/metadata_parser.py +0 -0
  523. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/pandas_data_reader.py +0 -0
  524. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/printer.py +0 -0
  525. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/py_file_utility.py +0 -0
  526. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/files_reference_finder_2.py +0 -0
  527. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  528. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/files_tools/range_finder.py +0 -0
  529. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/ref_utils.py +0 -0
  530. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_exceptions.py +0 -0
  531. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_grammar.py +0 -0
  532. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  533. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_parser.py +0 -0
  534. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_results.py +0 -0
  535. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/reference_transformer.py +0 -0
  536. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_reference_finder_2.py +0 -0
  537. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/data_finder.py +0 -0
  538. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/date_filter.py +0 -0
  539. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  540. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/path_filter.py +0 -0
  541. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  542. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/token_filters.py +0 -0
  543. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  544. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/references/tools/date_completer.py +0 -0
  545. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/referrer_printer.py +0 -0
  546. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_data_reader.py +0 -0
  547. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_data_writer.py +0 -0
  548. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  549. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  550. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_nos.py +0 -0
  551. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_utils.py +0 -0
  552. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  553. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_config.py +0 -0
  554. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_data_reader.py +0 -0
  555. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  556. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  557. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  558. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_server_creds.py +0 -0
  559. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_walk.py +0 -0
  560. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  561. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/sqliter.py +0 -0
  562. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/stopwatch.py +0 -0
  563. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/template_util.py +0 -0
  564. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/var_utility.py +0 -0
  565. {csvpath-0.0.620 → csvpath-0.0.621}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  566. {csvpath-0.0.620 → csvpath-0.0.621}/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.620
3
+ Version: 0.0.621
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
@@ -33,6 +33,7 @@ Requires-Dist: jinja2 (==3.1.6)
33
33
  Requires-Dist: jsonlines (==4.0.0)
34
34
  Requires-Dist: jsonpath-ng (==1.8.0)
35
35
  Requires-Dist: jsonpickle (==4.1.1)
36
+ Requires-Dist: jsonschema (>=4.26.0,<5.0.0)
36
37
  Requires-Dist: lark (==1.3.1)
37
38
  Requires-Dist: lxml (==6.0.2)
38
39
  Requires-Dist: marquez-python (==0.50.0)
@@ -59,6 +60,7 @@ Requires-Dist: smart-open[all] (==7.5.1)
59
60
  Requires-Dist: sqlalchemy (==2.0.48)
60
61
  Requires-Dist: tabulate (==0.9.0)
61
62
  Requires-Dist: validators (==0.34.0)
63
+ Requires-Dist: xmlschema (>=4.3.2,<5.0.0)
62
64
  Project-URL: Csvpath.org, https://www.csvpath.org
63
65
  Project-URL: Github, https://github.com/csvpath/csvpath.git
64
66
  Description-Content-Type: text/markdown
@@ -31,7 +31,7 @@ path = cache
31
31
  use_cache = no
32
32
 
33
33
  [functions]
34
- imports =
34
+ imports =
35
35
 
36
36
  [results]
37
37
  archive = tmp/gcs/archive
@@ -91,7 +91,7 @@ port = SFTPPLUS_PORT
91
91
  admin_username = SFTPPLUS_ADMIN_USERNAME
92
92
  admin_password = SFTPPLUS_ADMIN_PASSWORD
93
93
  api_url = https://. . . :10020/json
94
- scripts_dir =
94
+ scripts_dir =
95
95
  execute_timeout = 300
96
96
 
97
97
  [ckan]
@@ -106,5 +106,5 @@ timeout = 5
106
106
  verify = False
107
107
 
108
108
  [slack]
109
- webhook_url =
109
+ webhook_url =
110
110
 
@@ -31,7 +31,7 @@ path = cache
31
31
  use_cache = no
32
32
 
33
33
  [functions]
34
- imports =
34
+ imports =
35
35
 
36
36
  [results]
37
37
  archive = tmp/s3/archive
@@ -91,7 +91,7 @@ port = SFTPPLUS_PORT
91
91
  admin_username = SFTPPLUS_ADMIN_USERNAME
92
92
  admin_password = SFTPPLUS_ADMIN_PASSWORD
93
93
  api_url = https://. . . :10020/json
94
- scripts_dir =
94
+ scripts_dir =
95
95
  execute_timeout = 300
96
96
 
97
97
  [ckan]
@@ -106,5 +106,5 @@ timeout = 5
106
106
  verify = False
107
107
 
108
108
  [slack]
109
- webhook_url =
109
+ webhook_url =
110
110
 
@@ -1163,6 +1163,13 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
1163
1163
  lines = []
1164
1164
  self.lines = ListLineSpooler(lines=lines)
1165
1165
  for _ in self.next():
1166
+ if _ is None:
1167
+ raise ValueError("Next line cannot be None")
1168
+ #
1169
+ # the line can be a non list if it is not CSV data
1170
+ #
1171
+ elif not isinstance(_, (list, tuple)):
1172
+ _ = [_]
1166
1173
  _ = _[:]
1167
1174
  self.lines.append(_)
1168
1175
  if nexts == -1:
@@ -1311,22 +1318,26 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
1311
1318
  raise FileException("There is no filename")
1312
1319
  #
1313
1320
  # DataFileReader is abstract. instantiating it results in a concrete subclass.
1314
- # pylint doesn't like that just because it doesn't see what we're doing.
1315
- # otoh, is this a bad way to do it? it works fine.
1321
+ # ideally we use it as a context mgr.
1316
1322
  #
1323
+ """
1317
1324
  reader = DataFileReader( # pylint: disable=E0110
1318
1325
  self.scanner.filename, delimiter=self.delimiter, quotechar=self.quotechar
1319
1326
  )
1320
- for line in reader.next():
1321
- self.track_line(line=line)
1322
- #
1323
- # some formats embed headers in each line. JSONL headers are the dict keys in
1324
- # each line that uses a dict
1325
- #
1326
- if reader.updates_headers:
1327
- _ = reader.current_headers
1328
- self.headers = self.headers if _ is None else _
1329
- yield line
1327
+ """
1328
+ with DataFileReader(
1329
+ self.scanner.filename, delimiter=self.delimiter, quotechar=self.quotechar
1330
+ ) as reader:
1331
+ for line in reader.next():
1332
+ self.track_line(line=line)
1333
+ #
1334
+ # some formats embed headers in each line. JSONL headers are the dict keys in
1335
+ # each line that uses a dict
1336
+ #
1337
+ if reader.updates_headers:
1338
+ _ = reader.current_headers
1339
+ self.headers = self.headers if _ is None else _
1340
+ yield line
1330
1341
  self.finalize()
1331
1342
 
1332
1343
  def finalize(self) -> None:
@@ -867,6 +867,7 @@ Cache: {cache}
867
867
  file=file,
868
868
  run_uuid=run_uuid,
869
869
  method="collect_paths",
870
+ template=template,
870
871
  extra_data=extra_data,
871
872
  )
872
873
  #
@@ -1038,6 +1039,7 @@ Cache: {cache}
1038
1039
  filename=filename,
1039
1040
  run_uuid=run_uuid,
1040
1041
  method="fast_forward_paths",
1042
+ template=template,
1041
1043
  extra_data=extra_data,
1042
1044
  )
1043
1045
  #
@@ -1157,6 +1159,7 @@ Cache: {cache}
1157
1159
  filename=filename,
1158
1160
  run_uuid=run_uuid,
1159
1161
  method="next_paths",
1162
+ template=template,
1160
1163
  extra_data=extra_data,
1161
1164
  )
1162
1165
  #
@@ -1652,6 +1655,7 @@ Cache: {cache}
1652
1655
  filename=filename,
1653
1656
  run_uuid=run_uuid,
1654
1657
  method="next_paths",
1658
+ template=template,
1655
1659
  extra_data=extra_data,
1656
1660
  )
1657
1661
  #
@@ -199,6 +199,31 @@ class FileManager:
199
199
  return _["reference"]
200
200
  return None
201
201
 
202
+ @property
203
+ def files_root_manifest_path(self) -> str:
204
+ """@private"""
205
+ r = self.csvpaths.config.get(section="inputs", name="files")
206
+ p = Nos(r).join("manifest.json")
207
+ nos = Nos(r)
208
+ if not nos.dir_exists():
209
+ nos.makedirs()
210
+ nos.path = p
211
+ if not nos.exists():
212
+ with DataFileWriter(path=p) as file:
213
+ file.write("[]")
214
+ return p
215
+
216
+ @property
217
+ def files_root_manifest(self) -> list:
218
+ """the Named-File Arrivals Manifest -- a single global ledger
219
+ tracking every named-file arrival across every name, distinct
220
+ from get_manifest()'s per-name manifest. mirrors PathsManager's
221
+ paths_root_manifest. used by FilesReferenceFinder3 to resolve
222
+ "*" root_major references (bare :manifest(), optionally with a
223
+ pointer to select one entry by ordinal)."""
224
+ with DataFileReader(self.files_root_manifest_path) as reader:
225
+ return json.load(reader.source)
226
+
202
227
  def get_manifest(self, name: NamedFileName) -> json:
203
228
  if name is None:
204
229
  raise ValueError("Paths name cannot be None")
@@ -519,6 +544,7 @@ class FileManager:
519
544
  recurse=True,
520
545
  regex: str = None,
521
546
  ) -> list[str]:
547
+ self.csvpaths.logger.info("Starting add_named_files_from_dir for: %s", dirname)
522
548
  ret = []
523
549
  #
524
550
  # legal_name check handled at add_named_file
@@ -542,6 +568,9 @@ class FileManager:
542
568
  if regex is not None:
543
569
  m = re.search(regex, p)
544
570
  if not m:
571
+ self.csvpaths.logger.info(
572
+ "Skipping file: %s doesn't match %s", p, regex
573
+ )
545
574
  continue
546
575
  #
547
576
  #
@@ -560,6 +589,7 @@ class FileManager:
560
589
  # this should be consistent across backends, if ever not, fix it there, not here.
561
590
  #
562
591
  ref = self.add_named_file(name=n, path=p, template=template)
592
+ self.csvpaths.logger.info("add_named_files_from_dir added: %s", ref)
563
593
  if ref is not None:
564
594
  ret.append(ref)
565
595
  else:
@@ -709,7 +739,6 @@ class FileManager:
709
739
  http = str(http).strip().lower() in ["on", "yes", "true"]
710
740
  local = config.get(section="inputs", name="allow_local_files", default=False)
711
741
  local = str(local).strip().lower() in ["on", "yes", "true"]
712
- nos = Nos(path)
713
742
  self.csvpaths.logger.info(
714
743
  "Adding named file %s: checking permission, if needed, to register local and http files",
715
744
  name,
@@ -719,6 +748,7 @@ class FileManager:
719
748
  # no. the project may be controlled by a context like FlightPath Server, where
720
749
  # the user cannot just override certain settings.
721
750
  #
751
+ nos = Nos(path)
722
752
  if nos.is_http and http is not True:
723
753
  _ = {
724
754
  "name": name,
@@ -780,12 +810,10 @@ class FileManager:
780
810
  #
781
811
  config = self.describer.get_config(name)
782
812
  servers = config.sources
813
+ self.csvpaths.logger.debug(
814
+ "Adding named file. Available server configs: %s", servers
815
+ )
783
816
  nos.server_config = servers
784
- #
785
- # for _ in servers:
786
- # if _.matches(nos.path):
787
- # nos.do._config = SftpConfig(_)
788
- #
789
817
  isfile = nos.is_http or nos.isfile()
790
818
  self.csvpaths.logger.debug(
791
819
  "Adding named file %s: path %s is a file? %s", name, path, isfile
@@ -809,6 +837,7 @@ class FileManager:
809
837
  # create folder tree in inputs/named_files/name/filename
810
838
  #
811
839
  home = self.assure_file_home(name, path, template)
840
+ self.csvpaths.logger.debug("File home is %s", home)
812
841
  file_home = home
813
842
  mark = None
814
843
  #
@@ -824,6 +853,7 @@ class FileManager:
824
853
  if pm > -1:
825
854
  mark = path[pm + 1 :]
826
855
  path = path[0:pm]
856
+ self.csvpaths.logger.debug("File path, mark: %s, %s", path, mark)
827
857
  #
828
858
  # we're registering with a mark, so we need to be Xlsx and have a tab with that name.
829
859
  #
@@ -976,6 +1006,9 @@ class FileManager:
976
1006
  copy = pathu.parts(path)[0] == pathu.parts(home)[0]
977
1007
  copy = copy and nos.is_local
978
1008
  if copy:
1009
+ self.csvpaths.logger.debug(
1010
+ "Above nos copy: path: %s, name: %s, temp: %s", path, name, temp
1011
+ )
979
1012
  nos.path = path
980
1013
  config = self.describer.get_config(name)
981
1014
  servers = config.sources
@@ -1012,6 +1045,7 @@ class FileManager:
1012
1045
  #
1013
1046
  nos = Nos(path)
1014
1047
  if nos.is_sftp:
1048
+ self.csvpaths.logger.debug("Doing copy_down with sftp path %s", path)
1015
1049
  reader = DataFileReader(path)
1016
1050
  #
1017
1051
  # adding config to the reader allows the reader to look to the config
@@ -1028,6 +1062,7 @@ class FileManager:
1028
1062
  with DataFileWriter(path=temp, mode=mode) as writer:
1029
1063
  writer.write(lines)
1030
1064
  else:
1065
+ self.csvpaths.logger.debug("Doing copy_down with non-sftp path %s", path)
1031
1066
  with DataFileReader(path) as reader:
1032
1067
  with DataFileWriter(path=temp, mode=mode) as writer:
1033
1068
  for line in reader.next_raw():
@@ -131,6 +131,10 @@ class FileRegistrar(Registrar, Listener):
131
131
  if mark is not None:
132
132
  mani["mark"] = mark
133
133
  mani["template"] = mdata.template or ""
134
+ mani["manifest_path"] = manifest_path
135
+ mani["file_name"] = mdata.file_name
136
+ mani["username"] = mdata.username
137
+ mani["hostname"] = mdata.hostname
134
138
  jdata = self.get_manifest(manifest_path)
135
139
  jdata.append(mani)
136
140
  self.intermediary.put_json(manifest_path, jdata)
@@ -60,4 +60,6 @@ class OpenTelemetryResultsListener(OtlpListener):
60
60
  cmeta["time_completed"] = mdata.time_completed_string
61
61
  if mdata.named_paths_uuid_string:
62
62
  cmeta["named_paths_uuid_string"] = mdata.named_paths_uuid_string
63
+ if mdata.named_paths_fingerprint:
64
+ cmeta["named_paths_fingerprint"] = mdata.named_paths_fingerprint
63
65
  return cmeta
@@ -0,0 +1,78 @@
1
+ from typing import NewType
2
+
3
+
4
+ from csvpath.util.nos import Nos
5
+ from csvpath.util.file_writers import DataFileWriter
6
+ from csvpath.util.file_readers import DataFileReader
7
+ from csvpath.util.references.reference_parser import ReferenceParser
8
+
9
+ NamedPathsName = NewType("NamedPathsName", str)
10
+
11
+ #
12
+ # TODO: scripts should be handled as assets, not config. move here
13
+ # from the describer.
14
+ #
15
+
16
+
17
+ class PathsAssetManager:
18
+ ASSETS = "assets"
19
+
20
+ def __init__(self, paths_manager) -> None:
21
+ self.paths_manager = paths_manager
22
+
23
+ def _name_for_name(self, name: NamedPathsName) -> str:
24
+ if name.startswith("$"):
25
+ ref = ReferenceParser(name, csvpaths=self.paths_manager.csvpaths)
26
+ return ref.root_major
27
+ return name
28
+
29
+ def assets_dir_path(self, name: NamedPathsName) -> str:
30
+ name = self._name_for_name(name)
31
+ if not self.paths_manager.has_named_paths(name):
32
+ raise ValueError(f"No such named-paths group: {name}")
33
+ home = self.paths_manager.named_paths_home(name)
34
+ return Nos(home).join(self.ASSETS)
35
+
36
+ def assure_assets_dir(self, name: NamedPathsName) -> None:
37
+ p = self.assets_dir_path
38
+ nos = Nos(p)
39
+ if not nos.direxists():
40
+ Nos(p).makedirs()
41
+
42
+ def make_asset_file_path(self, name: NamedPathsName, filename: str) -> str:
43
+ path = self.assets_dir_path(name)
44
+ if not Nos(path).dir_exists():
45
+ Nos(path).makedirs()
46
+ path = Nos(path).join(filename)
47
+ return path
48
+
49
+ def store_asset_file(
50
+ self,
51
+ *,
52
+ name: NamedPathsName,
53
+ filename: str,
54
+ contents: str,
55
+ mode: str = "w",
56
+ overwrite: bool = True,
57
+ ) -> None:
58
+ path = self.make_asset_file_path(name, filename)
59
+ if overwrite is False and Nos(path).exists():
60
+ raise ValueError(f"Cannot overwrite {path}")
61
+ with DataFileWriter(path=path, mode=mode) as writer:
62
+ writer.write(contents)
63
+
64
+ def get_asset_file(self, name: NamedPathsName, filename: str) -> None:
65
+ path = self.make_asset_file_path(name, filename)
66
+ if not Nos(path).exists():
67
+ return None
68
+ with DataFileReader(path=path) as reader:
69
+ return reader.read()
70
+
71
+ def delete_asset_file(self, name: NamedPathsName, filename: str) -> None:
72
+ path = self.make_asset_file_path(name, filename)
73
+ if Nos(path).exists():
74
+ return Nos(path).remove()
75
+
76
+ def list_asset_files(self, name: NamedPathsName) -> None:
77
+ path = self.assets_dir_path(name)
78
+ return Nos(path).listdir(files_only=True)
@@ -13,6 +13,7 @@ from csvpath.util.nos import Nos
13
13
  from .paths_registrar import PathsRegistrar
14
14
  from .paths_metadata import PathsMetadata
15
15
  from .paths_describer import NamedPathsDescriber
16
+ from .paths_asset_manager import PathsAssetManager
16
17
  from csvpath.util.template_util import TemplateUtility as temu
17
18
  from csvpath.matching.util.expression_utility import ExpressionUtility as expu
18
19
 
@@ -51,6 +52,17 @@ class PathsManager:
51
52
  def describer(self) -> NamedPathsDescriber:
52
53
  return NamedPathsDescriber(self)
53
54
 
55
+ @property
56
+ def asset_manager(self) -> PathsAssetManager:
57
+ return PathsAssetManager(self)
58
+
59
+ @property
60
+ def registrar(self) -> PathsRegistrar:
61
+ """@private"""
62
+ if self._registrar is None:
63
+ self._registrar = PathsRegistrar(self.csvpaths)
64
+ return self._registrar
65
+
54
66
  @property
55
67
  def last_add_metadata(self) -> PathsMetadata:
56
68
  #
@@ -115,18 +127,9 @@ class PathsManager:
115
127
  # home = os.path.join(home, "manifest.json")
116
128
  return self.registrar.get_manifest(home)
117
129
 
118
- @property
119
- def registrar(self) -> PathsRegistrar:
120
- """@private"""
121
- if self._registrar is None:
122
- self._registrar = PathsRegistrar(self.csvpaths)
123
- return self._registrar
124
-
125
130
  def named_paths_home(self, name: NamedPathsName) -> str:
126
131
  """@private"""
127
132
  home = Nos(self.named_paths_dir).join(name)
128
- # home = os.path.join(self.named_paths_dir, name)
129
- # nos = self.nos
130
133
  nos = Nos(home)
131
134
  b = nos.dir_exists()
132
135
  if not b:
@@ -148,7 +151,6 @@ class PathsManager:
148
151
 
149
152
  path = self.named_paths_home(name)
150
153
  path = Nos(path).join("manifest.json")
151
- # nos = self.nos
152
154
  nos = Nos(path)
153
155
  if nos.exists():
154
156
  with DataFileReader(path) as reader:
@@ -156,6 +158,39 @@ class PathsManager:
156
158
  return m[len(m) - 1]["uuid"]
157
159
  raise ValueError(f"No manifest for path named {name}")
158
160
 
161
+ def get_fingerprint_for_name(self, name: NamedPathsName) -> str:
162
+ """@private -- the most recently registered version's own
163
+ content fingerprint for named-paths group `name` (the group's
164
+ own group.csvpaths text, not any run's copy of it) -- mirrors
165
+ get_named_paths_uuid's own name/reference resolution exactly,
166
+ just returning "fingerprint" instead of "uuid" off the same last
167
+ manifest entry. Used by ResultsRegistrar to record which
168
+ named-paths CONTENT drove a run (Results Run Manifest's own
169
+ named_paths_fingerprint field), distinct from named_paths_uuid,
170
+ which only records the group version's registration identity --
171
+ two groups loaded from identical group.csvpaths text under
172
+ different names get different uuids but identical fingerprints."""
173
+ if name is None:
174
+ raise ValueError("Paths name cannot be None")
175
+ if name.find("#") > -1:
176
+ name = name[0 : name.find("#")]
177
+ if name.startswith("$"):
178
+ ref = ReferenceParser(name, csvpaths=self.csvpaths)
179
+ if ref.datatype != ReferenceParser.CSVPATHS:
180
+ raise ValueError(
181
+ "Must be a reference of type {ReferenceParser.CSVPATHS}"
182
+ )
183
+ name = ref.root_major
184
+
185
+ path = self.named_paths_home(name)
186
+ path = Nos(path).join("manifest.json")
187
+ nos = Nos(path)
188
+ if nos.exists():
189
+ with DataFileReader(path) as reader:
190
+ m = json.load(reader.source)
191
+ return m[len(m) - 1]["fingerprint"]
192
+ raise ValueError(f"No manifest for path named {name}")
193
+
159
194
  @property
160
195
  def named_paths_dir(self) -> str:
161
196
  """@private"""
@@ -592,6 +627,10 @@ class PathsManager:
592
627
  ####################################################
593
628
 
594
629
  def store_json_paths_file(self, name: NamedPathsName, jsonpath: str) -> None:
630
+ #
631
+ # this method stores the definition.json file. it is not general purpose
632
+ # for any other json files
633
+ #
595
634
  if name is None:
596
635
  raise ValueError("Name cannot be None")
597
636
  if name.startswith("$"):
@@ -702,7 +741,7 @@ class PathsManager:
702
741
  return self.total_named_paths()
703
742
 
704
743
  #
705
- # ================== internals =====================
744
+ # ==============================
706
745
  #
707
746
 
708
747
  def _get_named_paths(self, name: NamedPathsName) -> list[Csvpath]:
@@ -764,9 +803,30 @@ class PathsManager:
764
803
  return temp
765
804
 
766
805
  def _group_file_path(self, name: NamedPathsName) -> str:
806
+ #
807
+ # TODO: note that in principle name could be a reference. should we allow
808
+ # that? We would just check for '$' and use ReferenceParser.
809
+ #
767
810
  temp = Nos(self.named_paths_home(name)).join("group.csvpaths")
768
811
  return temp
769
812
 
813
+ def group_file_path(self, name: NamedPathsName) -> str:
814
+ #
815
+ # supports references as well as names
816
+ #
817
+ if name is None:
818
+ raise ValueError("Name cannot be None")
819
+ name = str(name).strip()
820
+ if len(name) == 0:
821
+ raise ValueError("Name cannot be length 0")
822
+ if name[0] == "$":
823
+ name = ReferenceParser(name, csvpaths=self.csvpaths).root_major
824
+ #
825
+ # TODO: future state references v3 can return * or a function. that might
826
+ # not be supported (quite reasonably) but it would be a legal root_major.
827
+ #
828
+ return self._group_file_path(name)
829
+
770
830
  def _get_csvpaths_from_file(self, file_path: str) -> list[Csvpath]:
771
831
  if self.can_load(file_path) is not True:
772
832
  return []
@@ -148,6 +148,8 @@ class ResultRegistrar(Registrar, Listener):
148
148
  m["number_of_files_generated"] = mdata.number_of_files_generated
149
149
  m["valid"] = mdata.valid if mdata.valid is not None else ""
150
150
  m["completed"] = mdata.completed
151
+ m["error_count"] = mdata.error_count
152
+ m["method"] = mdata.method
151
153
  m["source_mode_preceding"] = mdata.source_mode_preceding
152
154
  if mdata.source_mode_preceding:
153
155
  m["preceding_instance_identity"] = mdata.preceding_instance_identity
@@ -1,4 +1,5 @@
1
1
  # pylint: disable=C0114
2
+ import json
2
3
  import os
3
4
  import re
4
5
  from uuid import UUID
@@ -10,6 +11,7 @@ from csvpath.util.references.reference_parser import ReferenceParser
10
11
  from csvpath.util.references.results_reference_finder_2 import (
11
12
  ResultsReferenceFinder2 as ResultsReferenceFinder,
12
13
  )
14
+ from csvpath.util.file_readers import DataFileReader
13
15
  from csvpath.util.file_writers import DataFileWriter
14
16
  from csvpath.util.nos import Nos
15
17
 
@@ -61,6 +63,32 @@ class ResultsManager: # pylint: disable=C0115
61
63
  """@private"""
62
64
  self._csvpaths = cs
63
65
 
66
+ @property
67
+ def results_root_manifest_path(self) -> str:
68
+ """@private"""
69
+ r = self.csvpaths.config.get(section="results", name="archive")
70
+ p = Nos(r).join("manifest.json")
71
+ nos = Nos(r)
72
+ if not nos.dir_exists():
73
+ nos.makedirs()
74
+ nos.path = p
75
+ if not nos.exists():
76
+ with DataFileWriter(path=p) as file:
77
+ file.write("[]")
78
+ return p
79
+
80
+ @property
81
+ def results_root_manifest(self) -> list:
82
+ """the Archive Run Manifest -- a single global ledger tracking
83
+ every run across every named-results group, at the archive
84
+ root. distinct from any per-group results manifest. mirrors
85
+ PathsManager's paths_root_manifest. used by
86
+ ResultsReferenceFinder3 to resolve "*" root_major references
87
+ (bare :manifest(), optionally with a pointer to select one
88
+ entry by ordinal)."""
89
+ with DataFileReader(self.results_root_manifest_path) as reader:
90
+ return json.load(reader.source)
91
+
64
92
  def complete_run(self, *, run_dir, pathsname, results) -> None:
65
93
  """@private"""
66
94
  rr = ResultsRegistrar(
@@ -112,6 +140,7 @@ class ResultsManager: # pylint: disable=C0115
112
140
  file: str = None,
113
141
  run_uuid: UUID,
114
142
  method: str,
143
+ template: str = None,
115
144
  extra_data: Optional[dict[str, str]] = None,
116
145
  ) -> ResultsMetadata:
117
146
  """@private"""
@@ -158,6 +187,7 @@ class ResultsManager: # pylint: disable=C0115
158
187
  mdata.named_paths_uuid_string = np_uuid
159
188
  mdata.named_results_name = pathsname
160
189
  mdata.method = method
190
+ mdata.template = template or ""
161
191
  rr.register_start(mdata)
162
192
  return mdata
163
193
 
@@ -757,10 +787,6 @@ class ResultsManager: # pylint: disable=C0115
757
787
  rs = [None for inst in instances if inst != "manifest.json"]
758
788
  for inst in instances:
759
789
  if inst.endswith(".json") or inst == "_extra_data":
760
- #
761
- # exp ^^^^
762
- #
763
- # if inst == "manifest.json":
764
790
  continue
765
791
  r = self.get_named_result_for_instance(
766
792
  name=name, run_dir=path, run=run, instance=inst
@@ -788,13 +814,6 @@ class ResultsManager: # pylint: disable=C0115
788
814
  # it should be deleted.
789
815
  #
790
816
  _ = ""
791
-
792
- """
793
- print(
794
- f"resman: get_named_result_for_instance: {name}, {run_dir}, {run}, {instance}"
795
- )
796
- """
797
-
798
817
  if run_dir.endswith(f"/{instance}") or run_dir.endswith(f"\\{instance}"):
799
818
  instance_dir = run_dir
800
819
  else:
@@ -823,6 +842,7 @@ class ResultsManager: # pylint: disable=C0115
823
842
  csvpath.match = meta["runtime_data"]["match_part"]
824
843
  csvpath.delimiter = meta["runtime_data"]["delimiter"]
825
844
  csvpath.quotechar = meta["runtime_data"]["quotechar"]
845
+ csvpath.is_valid = meta["runtime_data"]["valid"]
826
846
  vars = ResultFileReader.vars(instance_dir)
827
847
  if vars:
828
848
  csvpath.variables = vars