csvpath 0.0.616__tar.gz → 0.0.619__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.616 → csvpath-0.0.619}/PKG-INFO +1 -1
  2. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-local.ini +3 -3
  3. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/azure.bat +11 -2
  4. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/gcs.bat +6 -2
  5. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/local.bat +7 -2
  6. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/s3.bat +8 -2
  7. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/sftp.bat +8 -2
  8. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/csvpath.py +2 -1
  9. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/csvpaths.py +19 -5
  10. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_manager.py +145 -25
  11. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_registrar.py +17 -16
  12. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/files_listener.py +2 -0
  13. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/webhook/webhook_listener.py +7 -0
  14. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/metadata.py +1 -2
  15. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result.py +7 -2
  16. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_manager.py +1 -0
  17. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/transfers_manager.py +41 -16
  18. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_metadata.py +10 -1
  19. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_registrar.py +1 -6
  20. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/sql/select.py +7 -0
  21. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/sql/sql_in.py +30 -15
  22. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config.py +5 -1
  23. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/log_utility.py +1 -1
  24. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/nos.py +85 -0
  25. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/path_util.py +35 -0
  26. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_config.py +48 -9
  27. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_data_reader.py +0 -30
  28. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_nos.py +90 -9
  29. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_server_creds.py +15 -5
  30. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sqliter.py +2 -1
  31. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/template_util.py +7 -3
  32. {csvpath-0.0.616 → csvpath-0.0.619}/pyproject.toml +1 -1
  33. {csvpath-0.0.616 → csvpath-0.0.619}/LICENSE +0 -0
  34. {csvpath-0.0.616 → csvpath-0.0.619}/README.md +0 -0
  35. {csvpath-0.0.616 → csvpath-0.0.619}/assets/.DS_Store +0 -0
  36. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/config.ini +0 -0
  37. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/extra-functions.imports +0 -0
  38. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/function.imports +0 -0
  39. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-azure.ini +0 -0
  40. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-filesystem-mysql.ini +0 -0
  41. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-gcs.ini +0 -0
  42. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-s3.ini +0 -0
  43. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-local-sftp.ini +0 -0
  44. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-azure.ini +0 -0
  45. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-gcs.ini +0 -0
  46. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-s3.ini +0 -0
  47. {csvpath-0.0.616 → csvpath-0.0.619}/assets/config/jenkins-windows-sftp.ini +0 -0
  48. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/.DS_Store +0 -0
  49. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/Mac.goenvironment.json +0 -0
  50. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/Windows.goenvironment.json +0 -0
  51. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/azure-pipeline.gopipeline.json +0 -0
  52. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/azure.sh +0 -0
  53. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/gcs.sh +0 -0
  54. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/google-pipeline.gopipeline.json +0 -0
  55. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/local-pipeline.gopipeline copy.json +0 -0
  56. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/local.sh +0 -0
  57. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/s3-pipeline.gopipeline.json +0 -0
  58. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/s3.sh +0 -0
  59. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/sftp-pipeline.gopipeline.json +0 -0
  60. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/mac/sftp.sh +0 -0
  61. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-azure.gopipeline.json +0 -0
  62. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-gcs.gopipeline.json +0 -0
  63. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-local.gopipeline.json +0 -0
  64. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-s3.gopipeline.json +0 -0
  65. {csvpath-0.0.616 → csvpath-0.0.619}/assets/gocd/windows/windows-sftp.gopipeline.json +0 -0
  66. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/.DS_Store +0 -0
  67. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.bat +0 -0
  68. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.py +0 -0
  69. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_auto_arrival.sh +0 -0
  70. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.bat +0 -0
  71. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.py +0 -0
  72. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sftpplus/handle_mailbox_arrival.sh +0 -0
  73. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sqlite/csvpath +0 -0
  74. {csvpath-0.0.616 → csvpath-0.0.619}/assets/integrations/sqlite/schema.sql +0 -0
  75. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.25-py3-none-any.whl +0 -0
  76. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.27-py3-none-any.whl +0 -0
  77. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.28-py3-none-any.whl +0 -0
  78. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.29-py3-none-any.whl +0 -0
  79. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.30.tar.gz +0 -0
  80. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.31.tar.gz +0 -0
  81. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.33.tar.gz +0 -0
  82. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.34.tar.gz +0 -0
  83. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.35.tar.gz +0 -0
  84. {csvpath-0.0.616 → csvpath-0.0.619}/assets/libs/release_candidate_maker-0.0.36.tar.gz +0 -0
  85. {csvpath-0.0.616 → csvpath-0.0.619}/config/config.ini +0 -0
  86. {csvpath-0.0.616 → csvpath-0.0.619}/config/env.json +0 -0
  87. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/__init__.py +0 -0
  88. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/__init__.py +0 -0
  89. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/asker.py +0 -0
  90. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/cli.py +0 -0
  91. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/const.py +0 -0
  92. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/debug_config.py +0 -0
  93. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/drill_down.py +0 -0
  94. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/function_describer.py +0 -0
  95. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/function_lister.py +0 -0
  96. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/cli/selecter.py +0 -0
  97. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/__init__.py +0 -0
  98. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error.py +0 -0
  99. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_collector.py +0 -0
  100. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_comms.py +0 -0
  101. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/errors/error_manager.py +0 -0
  102. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_activator.py +0 -0
  103. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_describer.py +0 -0
  104. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_descriptor.py +0 -0
  105. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_metadata.py +0 -0
  106. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/file_names_rules.py +0 -0
  107. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/files_activation_listener.py +0 -0
  108. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/files/lines_and_headers_cacher.py +0 -0
  109. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/ckan.py +0 -0
  110. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/ckan_listener.py +0 -0
  111. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/datafile.py +0 -0
  112. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ckan/dataset.py +0 -0
  113. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/event.py +0 -0
  114. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/event_result.py +0 -0
  115. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/file_listener_ol.py +0 -0
  116. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/job.py +0 -0
  117. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/ol_listener.py +0 -0
  118. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/paths_listener_ol.py +0 -0
  119. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/result_listener_ol.py +0 -0
  120. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/results_listener_ol.py +0 -0
  121. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run.py +0 -0
  122. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run_listener_ol.py +0 -0
  123. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/run_state.py +0 -0
  124. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/ol/sender.py +0 -0
  125. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/error_metrics.py +0 -0
  126. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/metrics.py +0 -0
  127. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_error_listener.py +0 -0
  128. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_file_listener.py +0 -0
  129. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_listener.py +0 -0
  130. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_paths_listener.py +0 -0
  131. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_result_listener.py +0 -0
  132. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/otlp/otlp_results_listener.py +0 -0
  133. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/scripts/scripts_results_listener.py +0 -0
  134. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sftp/sftp_sender.py +0 -0
  135. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/slack/event.py +0 -0
  136. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/slack/sender.py +0 -0
  137. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/engine.py +0 -0
  138. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_file_listener.py +0 -0
  139. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_listener.py +0 -0
  140. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_paths_listener.py +0 -0
  141. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_result_listener.py +0 -0
  142. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/sql_results_listener.py +0 -0
  143. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/tables.py +0 -0
  144. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sql/updates.py +0 -0
  145. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/schema.sql +0 -0
  146. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/sqlite_result_listener.py +0 -0
  147. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/sqlite/sqlite_results_listener.py +0 -0
  148. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/integrations/webhook/webhook_results_listener.py +0 -0
  149. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/listener.py +0 -0
  150. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_describer.py +0 -0
  151. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_descriptor.py +0 -0
  152. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_listener.py +0 -0
  153. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_manager.py +0 -0
  154. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_metadata.py +0 -0
  155. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/paths/paths_registrar.py +0 -0
  156. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/registrar.py +0 -0
  157. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_errors_reader.py +0 -0
  158. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_lines_reader.py +0 -0
  159. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_printouts_reader.py +0 -0
  160. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/file_unmatched_reader.py +0 -0
  161. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/readers/readers.py +0 -0
  162. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_file_reader.py +0 -0
  163. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_metadata.py +0 -0
  164. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_registrar.py +0 -0
  165. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/result_serializer.py +0 -0
  166. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_metadata.py +0 -0
  167. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/results/results_registrar.py +0 -0
  168. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/run/run_listener_stdout.py +0 -0
  169. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/server_config.py +0 -0
  170. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/managers/test_listener.py +0 -0
  171. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/__init__.py +0 -0
  172. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/__init__.py +0 -0
  173. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/args.py +0 -0
  174. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/args_helper.py +0 -0
  175. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/all.py +0 -0
  176. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/andf.py +0 -0
  177. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/any.py +0 -0
  178. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/between.py +0 -0
  179. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/empty.py +0 -0
  180. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/exists.py +0 -0
  181. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/inf.py +0 -0
  182. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/no.py +0 -0
  183. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/notf.py +0 -0
  184. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/orf.py +0 -0
  185. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/boolean/yes.py +0 -0
  186. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count.py +0 -0
  187. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_bytes.py +0 -0
  188. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_headers.py +0 -0
  189. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_lines.py +0 -0
  190. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/count_scans.py +0 -0
  191. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/counter.py +0 -0
  192. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/every.py +0 -0
  193. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/has_matches.py +0 -0
  194. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/increment.py +0 -0
  195. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/tally.py +0 -0
  196. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/counting/total_lines.py +0 -0
  197. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/now.py +0 -0
  198. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/part.py +0 -0
  199. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/dates/roll.py +0 -0
  200. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function.py +0 -0
  201. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_factory.py +0 -0
  202. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_finder.py +0 -0
  203. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/function_focus.py +0 -0
  204. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/append.py +0 -0
  205. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/collect.py +0 -0
  206. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/empty_stack.py +0 -0
  207. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/end.py +0 -0
  208. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/header_name.py +0 -0
  209. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  210. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/headers.py +0 -0
  211. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/headers_stack.py +0 -0
  212. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/insert.py +0 -0
  213. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/line_before.py +0 -0
  214. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/mismatch.py +0 -0
  215. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/remove.py +0 -0
  216. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/rename.py +0 -0
  217. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/replace.py +0 -0
  218. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  219. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/json/jsonpath.py +0 -0
  220. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/advance.py +0 -0
  221. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/after_blank.py +0 -0
  222. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/dups.py +0 -0
  223. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/first.py +0 -0
  224. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/first_line.py +0 -0
  225. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/last.py +0 -0
  226. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/lines/stop.py +0 -0
  227. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/above.py +0 -0
  228. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/add.py +0 -0
  229. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/divide.py +0 -0
  230. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/equals.py +0 -0
  231. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/intf.py +0 -0
  232. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/mod.py +0 -0
  233. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/multiply.py +0 -0
  234. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/odd.py +0 -0
  235. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/round.py +0 -0
  236. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/subtotal.py +0 -0
  237. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/subtract.py +0 -0
  238. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/math/sum.py +0 -0
  239. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/env.py +0 -0
  240. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/fingerprint.py +0 -0
  241. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/importf.py +0 -0
  242. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/metadata.py +0 -0
  243. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/parquet.py +0 -0
  244. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/random.py +0 -0
  245. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/misc/runtime.py +0 -0
  246. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/jinjaf.py +0 -0
  247. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/print_line.py +0 -0
  248. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/print_queue.py +0 -0
  249. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/printf.py +0 -0
  250. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/print/table.py +0 -0
  251. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/minf.py +0 -0
  252. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/nminmax.py +0 -0
  253. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/percent.py +0 -0
  254. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  255. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/stats/stdev.py +0 -0
  256. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/alter.py +0 -0
  257. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/caps.py +0 -0
  258. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/concat.py +0 -0
  259. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/contains.py +0 -0
  260. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/format.py +0 -0
  261. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/length.py +0 -0
  262. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/lower.py +0 -0
  263. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/metaphone.py +0 -0
  264. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/regex.py +0 -0
  265. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/starts_with.py +0 -0
  266. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/strip.py +0 -0
  267. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/substring.py +0 -0
  268. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/strings/upper.py +0 -0
  269. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/testing/debug.py +0 -0
  270. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/__init__.py +0 -0
  271. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/blank.py +0 -0
  272. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/boolean.py +0 -0
  273. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/datatype.py +0 -0
  274. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/datef.py +0 -0
  275. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/decimal.py +0 -0
  276. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/email.py +0 -0
  277. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/nonef.py +0 -0
  278. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/string.py +0 -0
  279. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/type.py +0 -0
  280. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/url.py +0 -0
  281. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/uuid.py +0 -0
  282. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/types/wildcard.py +0 -0
  283. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/fail.py +0 -0
  284. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/failed.py +0 -0
  285. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/line.py +0 -0
  286. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/matches.py +0 -0
  287. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/validity/percent_matching.py +0 -0
  288. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/clear.py +0 -0
  289. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/get.py +0 -0
  290. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/index_of.py +0 -0
  291. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/pushpop.py +0 -0
  292. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/put.py +0 -0
  293. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/slice.py +0 -0
  294. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/sort.py +0 -0
  295. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/track.py +0 -0
  296. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/variables/variables.py +0 -0
  297. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/functions/xml/xpath.py +0 -0
  298. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/lark_parser.py +0 -0
  299. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/lark_transformer.py +0 -0
  300. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/matcher.py +0 -0
  301. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/__init__.py +0 -0
  302. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/equality.py +0 -0
  303. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/expression.py +0 -0
  304. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/header.py +0 -0
  305. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/matchable.py +0 -0
  306. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/qualified.py +0 -0
  307. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/reference.py +0 -0
  308. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/term.py +0 -0
  309. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/productions/variable.py +0 -0
  310. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/exceptions.py +0 -0
  311. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/expression_encoder.py +0 -0
  312. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/expression_utility.py +0 -0
  313. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/lark_print_parser.py +0 -0
  314. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/parquet_utility.py +0 -0
  315. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/print_parser.py +0 -0
  316. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/matching/util/runtime_data_collector.py +0 -0
  317. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/error_mode.py +0 -0
  318. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/explain_mode.py +0 -0
  319. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/files_mode.py +0 -0
  320. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/logic_mode.py +0 -0
  321. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/mode_controller.py +0 -0
  322. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/print_mode.py +0 -0
  323. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/return_mode.py +0 -0
  324. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/run_mode.py +0 -0
  325. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/source_mode.py +0 -0
  326. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/transfer_mode.py +0 -0
  327. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/unmatched_mode.py +0 -0
  328. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/modes/validation_mode.py +0 -0
  329. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/__init__.py +0 -0
  330. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2.py +0 -0
  331. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2_parser.py +0 -0
  332. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/scanning/scanner2_transformer.py +0 -0
  333. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_data_reader.py +0 -0
  334. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_data_writer.py +0 -0
  335. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_fingerprinter.py +0 -0
  336. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_json_data_reader.py +0 -0
  337. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_nos.py +0 -0
  338. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_timing_policy.py +0 -0
  339. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_utils.py +0 -0
  340. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/azure/azure_xlsx_data_reader.py +0 -0
  341. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/backend_check.py +0 -0
  342. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/box.py +0 -0
  343. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/cache.py +0 -0
  344. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/caser.py +0 -0
  345. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/class_loader.py +0 -0
  346. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/code.py +0 -0
  347. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config_env.py +0 -0
  348. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/config_exception.py +0 -0
  349. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/date_util.py +0 -0
  350. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/exceptions.py +0 -0
  351. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_info.py +0 -0
  352. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_readers.py +0 -0
  353. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_utility.py +0 -0
  354. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/file_writers.py +0 -0
  355. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_data_reader.py +0 -0
  356. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_data_writer.py +0 -0
  357. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_fingerprinter.py +0 -0
  358. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_json_data_reader.py +0 -0
  359. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_nos.py +0 -0
  360. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_utils.py +0 -0
  361. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/gcs/gcs_xlsx_data_reader.py +0 -0
  362. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/hasher.py +0 -0
  363. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/http/http_data_reader.py +0 -0
  364. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/intermediary.py +0 -0
  365. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/json/json_data_reader.py +0 -0
  366. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/json/json_reader_helper.py +0 -0
  367. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/last_line_stats.py +0 -0
  368. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_counter.py +0 -0
  369. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_monitor.py +0 -0
  370. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/line_spooler.py +0 -0
  371. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/metadata_parser.py +0 -0
  372. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/pandas_data_reader.py +0 -0
  373. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/printer.py +0 -0
  374. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/py_file_utility.py +0 -0
  375. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_reference_finder_2.py +0 -0
  376. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_tools/fingerprint_finder.py +0 -0
  377. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/files_tools/range_finder.py +0 -0
  378. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/ref_utils.py +0 -0
  379. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_exceptions.py +0 -0
  380. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_grammar.py +0 -0
  381. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_manifest_entry_finder.py +0 -0
  382. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_parser.py +0 -0
  383. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_results.py +0 -0
  384. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/reference_transformer.py +0 -0
  385. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_reference_finder_2.py +0 -0
  386. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/data_finder.py +0 -0
  387. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/date_filter.py +0 -0
  388. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/identity_finder.py +0 -0
  389. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/path_filter.py +0 -0
  390. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/resolve_possibles.py +0 -0
  391. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/token_filters.py +0 -0
  392. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/results_tools/yesterday_or_today_translator.py +0 -0
  393. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/references/tools/date_completer.py +0 -0
  394. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/referrer_printer.py +0 -0
  395. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/run_home_maker.py +0 -0
  396. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_data_reader.py +0 -0
  397. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_data_writer.py +0 -0
  398. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_fingerprinter.py +0 -0
  399. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_json_data_reader.py +0 -0
  400. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_nos.py +0 -0
  401. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_utils.py +0 -0
  402. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/s3/s3_xlsx_data_reader.py +0 -0
  403. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_data_writer.py +0 -0
  404. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_fingerprinter.py +0 -0
  405. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_json_data_reader.py +0 -0
  406. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_walk.py +0 -0
  407. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/sftp/sftp_xlsx_data_reader.py +0 -0
  408. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/stopwatch.py +0 -0
  409. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/var_utility.py +0 -0
  410. {csvpath-0.0.616 → csvpath-0.0.619}/csvpath/util/xlsx/xlsx_data_reader.py +0 -0
  411. {csvpath-0.0.616 → csvpath-0.0.619}/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.616
3
+ Version: 0.0.619
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
@@ -26,7 +26,7 @@ path = cache
26
26
  use_cache = no
27
27
 
28
28
  [functions]
29
- imports =
29
+ imports =
30
30
 
31
31
  [results]
32
32
  archive = tmp\local\archive
@@ -86,7 +86,7 @@ port = SFTPPLUS_PORT
86
86
  admin_username = SFTPPLUS_ADMIN_USERNAME
87
87
  admin_password = SFTPPLUS_ADMIN_PASSWORD
88
88
  api_url = https://. . . :10020/json
89
- scripts_dir =
89
+ scripts_dir =
90
90
  execute_timeout = 300
91
91
 
92
92
  [ckan]
@@ -101,7 +101,7 @@ timeout = 5
101
101
  verify = False
102
102
 
103
103
  [slack]
104
- webhook_url =
104
+ webhook_url =
105
105
 
106
106
  [scripts]
107
107
  run_scripts = yes
@@ -26,9 +26,18 @@ set OTEL_RESOURCE_ATTRIBUTES=""
26
26
 
27
27
  echo %CSVPATH_CONFIG_PATH%
28
28
  call c:\dev\win-exports.bat
29
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
30
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
31
29
 
30
+ IF NOT EXIST "%USERPROFILE%\.local\bin\poetry.exe" (
31
+ echo ERROR: The Poetry binary was not found.
32
+ EXIT /B 1
33
+ )
34
+
35
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
36
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
37
+ if %ERRORLEVEL% neq 0 (
38
+ echo [ERROR] The pytest failed with code %ERRORLEVEL%.
39
+ exit /b %ERRORLEVEL%
40
+ )
32
41
 
33
42
  net stop w32time
34
43
  w32tm /unregister
@@ -25,9 +25,13 @@ set OTEL_SERVICE_NAME=""
25
25
  set OTEL_RESOURCE_ATTRIBUTES=""
26
26
 
27
27
  call c:\dev\win-exports.bat
28
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
29
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
30
28
 
29
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
30
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
31
+ IF %ERRORLEVEL% NEQ 0 (
32
+ echo "Tests failed. Failing the build..."
33
+ exit /b %ERRORLEVEL%
34
+ )
31
35
 
32
36
  net stop w32time
33
37
  w32tm /unregister
@@ -49,8 +49,13 @@ echo(
49
49
  ::
50
50
  :: do the build
51
51
  ::
52
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
53
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
52
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
53
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
54
+ if %ERRORLEVEL% neq 0 (
55
+ echo [ERROR] The pytest failed with code %ERRORLEVEL%.
56
+ exit /b %ERRORLEVEL%
57
+ )
58
+
54
59
 
55
60
 
56
61
  net stop w32time
@@ -27,8 +27,14 @@ set OTEL_RESOURCE_ATTRIBUTES=""
27
27
 
28
28
 
29
29
  call c:\dev\win-exports.bat
30
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
31
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
30
+
31
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
32
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
33
+ if %ERRORLEVEL% neq 0 (
34
+ echo [ERROR] The pytest failed with code %ERRORLEVEL%.
35
+ exit /b %ERRORLEVEL%
36
+ )
37
+
32
38
 
33
39
 
34
40
  net stop w32time
@@ -25,8 +25,14 @@ set OTEL_SERVICE_NAME=""
25
25
  set OTEL_RESOURCE_ATTRIBUTES=""
26
26
 
27
27
  call c:\dev\win-exports.bat
28
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe install
29
- cmd.exe /C c:\Users\python\.local\bin\poetry.exe run pytest
28
+
29
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" install
30
+ cmd.exe /C "%USERPROFILE%\.local\bin\poetry.exe" run pytest
31
+ if %ERRORLEVEL% neq 0 (
32
+ echo [ERROR] The pytest failed with code %ERRORLEVEL%.
33
+ exit /b %ERRORLEVEL%
34
+ )
35
+
30
36
 
31
37
 
32
38
  net stop w32time
@@ -313,9 +313,10 @@ class CsvPath(ErrorCollector, Printer): # pylint: disable=R0902, R0904
313
313
  self.error_manager.error_metrics.provider.shutdown()
314
314
  self.error_manager.error_metrics = None
315
315
  self.error_manager = None
316
- lout.release_logger(self)
317
316
  except Exception:
318
317
  print(traceback.format_exc())
318
+ finally:
319
+ lout.release_logger(self)
319
320
 
320
321
  #
321
322
  # this method saves and reloads the config. if you don't want that use
@@ -4,7 +4,6 @@ of the CsvPath library. it makes it easier to scale your CSV quality control."""
4
4
  import os
5
5
  import traceback
6
6
  import atexit
7
- import threading
8
7
 
9
8
  from uuid import uuid4
10
9
  from abc import ABC, abstractmethod
@@ -226,9 +225,17 @@ class CsvPaths(CsvPathsCoordinator, ErrorCollector):
226
225
  #
227
226
  #
228
227
  #
229
- self.logger.info(
230
- f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
231
- )
228
+ # this log line didn't add especial value. but it did set the logger
229
+ # to a certain log file before we had a chance to do a cd-and-reload
230
+ # to switch into a particular project. the fix isn't just to remove the
231
+ # line, it's also to make the logger travel with the config used. but
232
+ # removing the log line is easy enough and we don't lose much. And the
233
+ # real fix was already in set_config_path_and_reload() -- it was just
234
+ # releasing/renewing the logger.
235
+ #
236
+ # self.logger.info(
237
+ # f"Initialized CsvPaths: {self} in thread: {threading.current_thread()}"
238
+ # )
232
239
 
233
240
  @property
234
241
  def logger(self):
@@ -588,9 +595,10 @@ Cache: {cache}
588
595
  def __del__(self) -> None:
589
596
  try:
590
597
  self.wrap_up()
591
- lout.release_logger(self)
592
598
  except Exception:
593
599
  print(traceback.format_exc())
600
+ finally:
601
+ lout.release_logger(self)
594
602
 
595
603
  def _trim_archive_if(self, home: str) -> str:
596
604
  archive = self.config.get(section="results", name="archive")
@@ -877,6 +885,7 @@ Cache: {cache}
877
885
  run_dir=crt,
878
886
  run_uuid=run_uuid,
879
887
  method="collect_paths",
888
+ template=template,
880
889
  )
881
890
  # casting a broad net because if "raise" not in the error policy we
882
891
  # want to never fail during a run
@@ -1047,6 +1056,7 @@ Cache: {cache}
1047
1056
  run_dir=crt,
1048
1057
  run_uuid=run_uuid,
1049
1058
  method="fast_forward_paths",
1059
+ template=template,
1050
1060
  )
1051
1061
  try:
1052
1062
  self._load_csvpath(
@@ -1181,6 +1191,7 @@ Cache: {cache}
1181
1191
  run_dir=crt,
1182
1192
  run_uuid=run_uuid,
1183
1193
  method="next_paths",
1194
+ template=template,
1184
1195
  )
1185
1196
  if self._fail_all:
1186
1197
  self.logger.warning(
@@ -1447,6 +1458,7 @@ Cache: {cache}
1447
1458
  crt=crt,
1448
1459
  method=method,
1449
1460
  extra_data=extra_data,
1461
+ template=template,
1450
1462
  )
1451
1463
  #
1452
1464
  # setting file into the csvpath is less obviously useful at CsvPaths
@@ -1624,6 +1636,7 @@ Cache: {cache}
1624
1636
  crt: str,
1625
1637
  method: str,
1626
1638
  extra_data: Optional[dict[str, str]],
1639
+ template: str = "",
1627
1640
  ):
1628
1641
  """@private"""
1629
1642
  #
@@ -1660,6 +1673,7 @@ Cache: {cache}
1660
1673
  by_line=True,
1661
1674
  run_uuid=run_uuid,
1662
1675
  method=method,
1676
+ template=template,
1663
1677
  )
1664
1678
  csvpath[1] = result
1665
1679
  #
@@ -1,7 +1,7 @@
1
1
  import re
2
2
  import json
3
3
  import traceback
4
- from uuid import UUID
4
+ from uuid import UUID, uuid4
5
5
  from typing import NewType
6
6
  from json import JSONDecodeError
7
7
  from csvpath.util.file_readers import DataFileReader
@@ -19,6 +19,7 @@ from csvpath.util.path_util import PathUtility as pathu
19
19
  from csvpath.util.template_util import TemplateUtility as temu
20
20
  from .file_registrar import FileRegistrar
21
21
  from .lines_and_headers_cacher import LinesAndHeadersCacher
22
+ from .files_listener import FilesListener
22
23
  from .file_metadata import FileMetadata
23
24
  from .file_describer import NamedFileDescriber
24
25
  from .file_activator import NamedFileActivator
@@ -219,8 +220,6 @@ class FileManager:
219
220
  #
220
221
  path = lst[0]
221
222
  path = Nos(path).join("manifest.json")
222
- # path = os.path.join(path, "manifest.json")
223
- # nos = self.nos
224
223
  nos = Nos(path)
225
224
  if nos.exists():
226
225
  mani = self.registrar.get_manifest(path)
@@ -284,6 +283,13 @@ class FileManager:
284
283
  home = pathu.resep(home)
285
284
  return home
286
285
 
286
+ #
287
+ # creates a named-file before registering any files.
288
+ #
289
+ def assure_named_file(self, name: NamedFileName) -> None:
290
+ home = self.assure_named_file_home(name)
291
+ self.registrar.manifest_path(home)
292
+
287
293
  def configure_named_file(self, name: NamedFileName, descriptor: Config) -> None:
288
294
  #
289
295
  # updates the named-file's descriptor by replacement
@@ -634,11 +640,18 @@ class FileManager:
634
640
  # issue driven by the 3rd party or business rules.
635
641
  #
636
642
  UUID(registration_uuid)
637
- self.csvpaths.logger.info(
638
- "Registration of %s will be associated with UUID %s",
639
- path,
640
- registration_uuid,
641
- )
643
+ else:
644
+ #
645
+ # if we don't create the uuid here the metadata object will create one;
646
+ # however, if we want to tie log statements back we should have a uuid
647
+ # here, regardless of if the user creates it or we do.
648
+ #
649
+ registration_uuid = str(uuid4())
650
+ self.csvpaths.logger.info(
651
+ "Registration of %s will be associated with UUID %s",
652
+ path,
653
+ registration_uuid,
654
+ )
642
655
  if not self.can_load(path):
643
656
  #
644
657
  # if False, can_load() will have already raised an error and/or, minimally,
@@ -648,14 +661,39 @@ class FileManager:
648
661
  # will load any allowed files, even if some are not allowed -- but with the
649
662
  # caveat that if an exception is raised we may stop in the middle of the load.
650
663
  #
664
+ #
665
+ #
666
+ _ = {
667
+ "name": name,
668
+ "path": path,
669
+ "template": template,
670
+ "registration_uuid": registration_uuid,
671
+ }
672
+ self._registration_failed(_)
673
+ #
651
674
  return
675
+ self.csvpaths.logger.info("Adding named file %s: can be loaded", name)
652
676
  self.legal_name(name)
677
+ self.csvpaths.logger.info("Adding named file %s: name is legal", name)
653
678
  if path is None or path.strip() == "":
679
+ _ = {
680
+ "name": name,
681
+ "path": path,
682
+ "template": template,
683
+ "registration_uuid": registration_uuid,
684
+ }
685
+ self._registration_failed(_)
654
686
  raise ValueError("Path cannot be None or empty")
655
687
  if template is None:
656
688
  template = self.describer.get_template(name)
657
689
  if template is not None:
690
+ self.csvpaths.logger.debug(
691
+ "Adding named file %s: checking template %s", name, template
692
+ )
658
693
  temu.valid(template, file=True)
694
+ self.csvpaths.logger.info(
695
+ "Adding named file %s: template is valid or None: %s", name, template
696
+ )
659
697
  if config is not None:
660
698
  #
661
699
  # doing config here enables copy_in() to pull down files
@@ -664,34 +702,58 @@ class FileManager:
664
702
  # configured in advance, but that doesn't have to be the
665
703
  # case.
666
704
  #
705
+ self.csvpaths.logger.info(
706
+ "Adding named file %s: configuring named-file", name
707
+ )
667
708
  self.configure_named_file(name, config)
668
709
  path = pathu.resep(path)
669
- self.csvpaths.logger.debug("Path after resep %s", path)
710
+ self.csvpaths.logger.debug("[%s] Path after resep %s", registration_uuid, path)
670
711
  config = self.csvpaths.config
671
712
  http = config.get(section="inputs", name="allow_http_files", default=False)
672
713
  http = str(http).strip().lower() in ["on", "yes", "true"]
673
714
  local = config.get(section="inputs", name="allow_local_files", default=False)
674
715
  local = str(local).strip().lower() in ["on", "yes", "true"]
675
716
  nos = Nos(path)
717
+ self.csvpaths.logger.info(
718
+ "Adding named file %s: checking permission, if needed, to register local and http files",
719
+ name,
720
+ )
676
721
  #
677
722
  # can the descriptor override the project's prohibition on http(s) loads?
678
723
  # no. the project may be controlled by a context like FlightPath Server, where
679
724
  # the user cannot just override certain settings.
680
725
  #
681
726
  if nos.is_http and http is not True:
682
- msg = f"Cannot add {path} as {name} because loading files over HTTP is not allowed"
727
+ _ = {
728
+ "name": name,
729
+ "path": path,
730
+ "template": template,
731
+ "registration_uuid": registration_uuid,
732
+ }
733
+ self._registration_failed(_)
734
+ msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading files over HTTP is not allowed"
683
735
  self.csvpaths.logger.warning(msg)
684
736
  self.csvpaths.error_manager.handle_error(source=self, msg=msg)
685
737
  if self.csvpaths.ecoms.do_i_raise():
686
738
  raise FileException(msg)
687
739
  return
688
740
  if nos.is_local and local is not True:
689
- msg = f"Cannot add {path} as {name} because loading local files is not allowed"
741
+ _ = {
742
+ "name": name,
743
+ "path": path,
744
+ "template": template,
745
+ "registration_uuid": registration_uuid,
746
+ }
747
+ self._registration_failed(_)
748
+ msg = f"[{registration_uuid}] Cannot add {path} as {name} because loading local files is not allowed"
690
749
  self.csvpaths.logger.warning(msg)
691
750
  self.csvpaths.error_manager.handle_error(source=self, msg=msg)
692
751
  if self.csvpaths.ecoms.do_i_raise():
693
752
  raise FileException(msg)
694
753
  return
754
+ self.csvpaths.logger.info(
755
+ "Adding named file %s: registration of %s permitted", name, path
756
+ )
695
757
  #
696
758
  # we should know enough to redirect if handed a dir path. we'll not recurse
697
759
  # because the caller hasn't given us enough info to know if we should.
@@ -700,6 +762,7 @@ class FileManager:
700
762
  # method. if using FlightPath Server, the server should allow them to be likewise
701
763
  # more specific. this branch is essentially a fallback presumed to be covering for
702
764
  # lazy developers and people who are working without better information.
765
+ #
703
766
  if nos.path.find("#") > -1:
704
767
  #
705
768
  # if we passed in a root minor, a.k.a. "mark", we need to strip
@@ -707,15 +770,39 @@ class FileManager:
707
770
  #
708
771
  nos = Nos(nos.path[0 : nos.path.find("#")])
709
772
  #
710
- # note for now we treat any http as a file
773
+ # note for now we treat any http as a file.
774
+ #
775
+ # also note that this Nos must be savvy to any ServerConfig that may
776
+ # be available. it should use the possibly cached backend, if that
777
+ # matches, but if not, it must search any ServerConfig to configure
778
+ # itself to do operations on one of those servers.
779
+ #
780
+ # server config can be passed to a non-sftp nos. there won't be any
781
+ # complaints, but it won't do anything. atm, the judgement call is that
782
+ # we save an if-test by allowing any nos to receive server config and
783
+ # accepting the cost of searching for any server config in json.
784
+ #
785
+ config = self.describer.get_config(name)
786
+ servers = config.sources
787
+ nos.server_config = servers
788
+ #
789
+ # for _ in servers:
790
+ # if _.matches(nos.path):
791
+ # nos.do._config = SftpConfig(_)
711
792
  #
712
793
  isfile = nos.is_http or nos.isfile()
794
+ self.csvpaths.logger.debug(
795
+ "Adding named file %s: path %s is a file? %s", name, path, isfile
796
+ )
713
797
  if not isfile:
714
798
  return self.add_named_files_from_dir(
715
799
  path, name=name, template=template, recurse=False
716
800
  )
801
+ self.csvpaths.logger.debug("Adding named file %s: continuing with file", name)
717
802
  try:
718
- self.csvpaths.logger.debug("Ready to register %s", path)
803
+ self.csvpaths.logger.debug(
804
+ "[%s] Ready to register %s", registration_uuid, path
805
+ )
719
806
  #
720
807
  # path must end up with only legal filesystem chars.
721
808
  # the read-only http backend will have ? and possibly other
@@ -750,13 +837,17 @@ class FileManager:
750
837
  # exp: moving docs and descriptor to above copy_in()
751
838
  #
752
839
  self.assure_docs_and_discriptor(name)
753
- self.csvpaths.logger.debug("Assured docs and discriptor")
840
+ self.csvpaths.logger.debug(
841
+ "[%s] Assured docs and discriptor", registration_uuid
842
+ )
754
843
  #
755
844
  # copy file to its home location
756
845
  #
757
- self.csvpaths.logger.debug("Path after removing mark, if any: %s", path)
846
+ self.csvpaths.logger.debug(
847
+ "[%s] Path after removing mark, if any: %s", registration_uuid, path
848
+ )
758
849
  self._copy_in(name=name, path=path, home=home, template=template)
759
- self.csvpaths.logger.debug("Done copying in")
850
+ self.csvpaths.logger.debug("[%s] Done copying in", registration_uuid)
760
851
  #
761
852
  # self.assure_docs_and_discriptor(name)
762
853
  # self.csvpaths.logger.debug("Assured docs and discriptor")
@@ -766,9 +857,13 @@ class FileManager:
766
857
  # done here.
767
858
  #
768
859
  rpath, h = self._fingerprint(home)
769
- self.csvpaths.logger.debug("Fingerprint of %s: %s", path, h)
860
+ self.csvpaths.logger.debug(
861
+ "[%s] Fingerprint of %s: %s", registration_uuid, path, h
862
+ )
770
863
  ret = f"${name}.files.{h}"
771
- self.csvpaths.logger.debug("Reference to named-file: %s", ret)
864
+ self.csvpaths.logger.debug(
865
+ "[%s] Reference to named-file: %s", registration_uuid, ret
866
+ )
772
867
  #
773
868
  # ---------------------------
774
869
  # maybe move the metadata handling to its own method?
@@ -777,7 +872,9 @@ class FileManager:
777
872
  # create the metadata event for this registration
778
873
  #
779
874
  name_home = self.named_file_home(name)
780
- self.csvpaths.logger.debug("Name home is %s", name_home)
875
+ self.csvpaths.logger.debug(
876
+ "[%s] Name home is %s", registration_uuid, name_home
877
+ )
781
878
  mdata = FileMetadata(self.csvpaths.config)
782
879
  #
783
880
  # add the ability to pass in a UUID. if received, use it here to
@@ -805,8 +902,8 @@ class FileManager:
805
902
  mdata.file_name = file_home[file_home.rfind(nos.sep) + 1 :]
806
903
  mdata.name_home = name_home
807
904
  mdata.mark = mark
808
- mdata.template = template
809
- self.csvpaths.logger.debug("Created metadata")
905
+ mdata.template = template or ""
906
+ self.csvpaths.logger.debug("[%s] Created metadata", registration_uuid)
810
907
  #
811
908
  # TODO: add file_size. move FileInfo into Nos. for now it is 0.
812
909
  #
@@ -815,17 +912,23 @@ class FileManager:
815
912
  # the fingerprint is the most precise way of referencing a particular
816
913
  # named-file version.
817
914
  #
818
- self.csvpaths.logger.debug("Registered %s", ret)
915
+ self.csvpaths.logger.debug("[%s] Registered %s", registration_uuid, ret)
819
916
  return ret
820
917
  except Exception as ex:
918
+ _ = {
919
+ "name": name,
920
+ "path": path,
921
+ "template": template,
922
+ "registration_uuid": registration_uuid,
923
+ }
924
+ self._registration_failed(_)
821
925
  #
822
926
  # remove me! tho, why you'd want quiet is not sure.
823
927
  #
824
- print(traceback.format_exc())
825
- #
928
+ # print(traceback.format_exc())
826
929
  #
827
930
  #
828
- msg = f"Error in loading named-file: {ex}"
931
+ msg = f"[{registration_uuid}] Error in loading named-file: {ex}"
829
932
  self.csvpaths.logger.error(msg)
830
933
  self.csvpaths.error_manager.handle_error(
831
934
  source=traceback.format_exc(), msg=msg
@@ -833,6 +936,19 @@ class FileManager:
833
936
  if self.csvpaths.ecoms.do_i_raise():
834
937
  raise
835
938
 
939
+ def _registration_failed(self, data: dict[str, str]) -> None:
940
+ lst = FilesListener(self.csvpaths)
941
+ mdata = FileMetadata(self.csvpaths.config)
942
+ mdata.named_file_name = data.get("name")
943
+ mdata.origin_path = data.get("path")
944
+ mdata.template = data.get("template") or ""
945
+ mdata.uuid_string = data.get("registration_uuid")
946
+ mdata.status = "Registration failed"
947
+ self.csvpaths.logger.warn(
948
+ "[%s] Registration failed for %s", mdata.named_file_name, data
949
+ )
950
+ lst.metadata_update(mdata)
951
+
836
952
  def _validate_xlsx_mark(self, path: str, mark: str) -> None:
837
953
  if not XlsxReaderHelper.is_xlsx(path):
838
954
  raise ValueError(f"Not an Excel file: {path}")
@@ -862,8 +978,12 @@ class FileManager:
862
978
  fname = self._clean_file_name(fname)
863
979
  temp = f"{home}{sep}{fname}"
864
980
  copy = pathu.parts(path)[0] == pathu.parts(home)[0]
981
+ copy = copy and nos.is_local
865
982
  if copy:
866
983
  nos.path = path
984
+ config = self.describer.get_config(name)
985
+ servers = config.sources
986
+ nos.server_config = servers
867
987
  nos.copy(temp)
868
988
  else:
869
989
  self._copy_down(name=name, path=path, temp=temp, mode="wb")
@@ -1,6 +1,4 @@
1
1
  import os
2
- import json
3
- from datetime import datetime
4
2
  from csvpath.util.exceptions import InputException, FileException
5
3
  from csvpath.util.nos import Nos
6
4
  from csvpath.managers.registrar import Registrar
@@ -110,9 +108,9 @@ class FileRegistrar(Registrar, Listener):
110
108
  nos.path = old_home
111
109
  nos.rename(new_home)
112
110
  mani[index]["file_home"] = new_home
113
- mani[index][
114
- "file"
115
- ] = f"{new_home}{sep}{mani[index]['fingerprint']}.{mani[index]['type']}"
111
+ mani[index]["file"] = (
112
+ f"{new_home}{sep}{mani[index]['fingerprint']}.{mani[index]['type']}"
113
+ )
116
114
 
117
115
  def metadata_update(self, mdata: Metadata) -> None:
118
116
  path = mdata.origin_path
@@ -132,8 +130,7 @@ class FileRegistrar(Registrar, Listener):
132
130
  mani["from"] = path
133
131
  if mark is not None:
134
132
  mani["mark"] = mark
135
- if mdata.template is not None:
136
- mani["template"] = mdata.template
133
+ mani["template"] = mdata.template or ""
137
134
  jdata = self.get_manifest(manifest_path)
138
135
  jdata.append(mani)
139
136
  self.intermediary.put_json(manifest_path, jdata)
@@ -157,15 +154,19 @@ class FileRegistrar(Registrar, Listener):
157
154
  raise InputException(
158
155
  f"File mgr and registrar marks should match: {mdata.mark}, {mark}"
159
156
  )
160
- if (
161
- # Nos doesn't handle http files. they are special--inbound only.
162
- not path.startswith("http:")
163
- and not path.startswith("https:")
164
- and not Nos(path).exists()
165
- ):
166
- # if not path.startswith("s3:") and not os.path.exists(path):
167
- #
168
- raise InputException(f"Path {path} does not exist")
157
+ opath = Nos(path)
158
+ #
159
+ # if we're registering a non-local file and it's an sftp file it may be
160
+ # on an sftp server that is configured in the named-file description. so
161
+ # we setup nos to be able to check, just in case.
162
+ #
163
+ config = self.csvpaths.file_manager.describer.get_config(mdata.named_file_name)
164
+ servers = config.sources
165
+ opath.server_config = servers
166
+
167
+ if not opath.is_http:
168
+ if not opath.exists():
169
+ raise InputException(f"Path {opath.path} does not exist")
169
170
  #
170
171
  # if the fingerprint already exists we don't store the file again.
171
172
  # we rename the file to the fingerprint. from this point the registrar
@@ -69,6 +69,8 @@ class FilesListener(Listener): # Registrar,
69
69
  if mdata.mark is not None:
70
70
  mani["mark"] = mdata.mark
71
71
  mani["manifest_path"] = self.manifest_path()
72
+ if hasattr(mdata, "status"):
73
+ mani["status"] = mdata.status
72
74
  return mani
73
75
 
74
76
  def metadata_update(self, mdata: Metadata) -> None:
@@ -165,4 +165,11 @@ class WebhookListener(Listener, threading.Thread):
165
165
  ...
166
166
 
167
167
  def _do_send(self, *, url: str, payload: dict, headers: dict, timeout: int):
168
+ #
169
+ # this is an expected occurance. any empty block captured by the FlightPath form
170
+ # will have no url but will exist so will be attempted. we just want to ignore
171
+ # those attempts
172
+ #
173
+ if not url:
174
+ return
168
175
  return requests.post(url, json=payload, headers=headers, timeout=timeout)
@@ -1,7 +1,7 @@
1
1
  from uuid import uuid4, UUID
2
2
  import os
3
3
  from abc import ABC
4
- from datetime import datetime, timezone
4
+ from datetime import datetime
5
5
  from dateutil import parser
6
6
  import getpass
7
7
  import socket
@@ -150,7 +150,6 @@ class Metadata(ABC):
150
150
 
151
151
  @time_started_string.setter
152
152
  def time_started_string(self, s: str) -> None:
153
- # self._time_started = datetime.date.fromisoformat(s)
154
153
  self._time_started = parser.parse(s)
155
154
 
156
155
  @property