csvpath 0.0.461__tar.gz → 0.0.462__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 (195) hide show
  1. {csvpath-0.0.461 → csvpath-0.0.462}/PKG-INFO +1 -1
  2. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/last.py +12 -15
  3. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/equality.py +22 -0
  4. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/expression.py +2 -1
  5. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/qualified.py +10 -2
  6. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/util/expression_utility.py +7 -0
  7. {csvpath-0.0.461 → csvpath-0.0.462}/pyproject.toml +1 -1
  8. {csvpath-0.0.461 → csvpath-0.0.462}/LICENSE +0 -0
  9. {csvpath-0.0.461 → csvpath-0.0.462}/README.md +0 -0
  10. {csvpath-0.0.461 → csvpath-0.0.462}/config/config.ini +0 -0
  11. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/__init__.py +0 -0
  12. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/csvpath.py +0 -0
  13. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/csvpaths.py +0 -0
  14. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/managers/__init__.py +0 -0
  15. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/managers/csvpath_result.py +0 -0
  16. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/managers/csvpaths_manager.py +0 -0
  17. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/managers/files_manager.py +0 -0
  18. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/managers/results_manager.py +0 -0
  19. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/__init__.py +0 -0
  20. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/__init__.py +0 -0
  21. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/all.py +0 -0
  22. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/andf.py +0 -0
  23. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/any.py +0 -0
  24. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/between.py +0 -0
  25. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/empty.py +0 -0
  26. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/exists.py +0 -0
  27. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/inf.py +0 -0
  28. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/no.py +0 -0
  29. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/notf.py +0 -0
  30. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/orf.py +0 -0
  31. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/boolean/yes.py +0 -0
  32. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/count.py +0 -0
  33. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/count_headers.py +0 -0
  34. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/count_lines.py +0 -0
  35. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/count_scans.py +0 -0
  36. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/every.py +0 -0
  37. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/has_matches.py +0 -0
  38. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/increment.py +0 -0
  39. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/tally.py +0 -0
  40. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/counting/total_lines.py +0 -0
  41. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/function.py +0 -0
  42. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/function_factory.py +0 -0
  43. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/function_focus.py +0 -0
  44. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/end.py +0 -0
  45. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/header_name.py +0 -0
  46. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/header_names_mismatch.py +0 -0
  47. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/headers.py +0 -0
  48. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/mismatch.py +0 -0
  49. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/headers/reset_headers.py +0 -0
  50. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/advance.py +0 -0
  51. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/after_blank.py +0 -0
  52. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/dups.py +0 -0
  53. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/first.py +0 -0
  54. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/first_line.py +0 -0
  55. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/lines/stop.py +0 -0
  56. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/above.py +0 -0
  57. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/add.py +0 -0
  58. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/divide.py +0 -0
  59. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/equals.py +0 -0
  60. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/mod.py +0 -0
  61. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/multiply.py +0 -0
  62. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/round.py +0 -0
  63. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/subtract.py +0 -0
  64. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/math/sum.py +0 -0
  65. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/collect.py +0 -0
  66. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/datef.py +0 -0
  67. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/debug.py +0 -0
  68. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/get.py +0 -0
  69. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/importf.py +0 -0
  70. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/intf.py +0 -0
  71. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/nonef.py +0 -0
  72. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/now.py +0 -0
  73. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/pushpop.py +0 -0
  74. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/random.py +0 -0
  75. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/regex.py +0 -0
  76. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/replace.py +0 -0
  77. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/track.py +0 -0
  78. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/misc/variables.py +0 -0
  79. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/print/jinjaf.py +0 -0
  80. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/print/print_line.py +0 -0
  81. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/print/print_queue.py +0 -0
  82. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/print/printf.py +0 -0
  83. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/stats/correlate.py +0 -0
  84. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/stats/minf.py +0 -0
  85. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/stats/percent.py +0 -0
  86. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/stats/percent_unique.py +0 -0
  87. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/stats/stdev.py +0 -0
  88. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/concat.py +0 -0
  89. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/length.py +0 -0
  90. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/lower.py +0 -0
  91. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/metaphone.py +0 -0
  92. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/starts_with.py +0 -0
  93. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/strip.py +0 -0
  94. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/substring.py +0 -0
  95. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/strings/upper.py +0 -0
  96. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/validation.py +0 -0
  97. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/validity/fail.py +0 -0
  98. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/functions/validity/failed.py +0 -0
  99. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/lark_parser.py +0 -0
  100. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/lark_transformer.py +0 -0
  101. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/matcher.py +0 -0
  102. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/__init__.py +0 -0
  103. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/header.py +0 -0
  104. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/matchable.py +0 -0
  105. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/reference.py +0 -0
  106. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/term.py +0 -0
  107. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/productions/variable.py +0 -0
  108. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/util/exceptions.py +0 -0
  109. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/util/expression_encoder.py +0 -0
  110. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/util/lark_print_parser.py +0 -0
  111. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/matching/util/print_parser.py +0 -0
  112. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/__init__.py +0 -0
  113. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/exceptions.py +0 -0
  114. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/parser.out +0 -0
  115. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/parsetab.py +0 -0
  116. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/scanner.py +0 -0
  117. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/scanning/scanning_lexer.py +0 -0
  118. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/config.py +0 -0
  119. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/config_exception.py +0 -0
  120. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/error.py +0 -0
  121. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/exceptions.py +0 -0
  122. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/last_line_stats.py +0 -0
  123. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/line_monitor.py +0 -0
  124. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/log_utility.py +0 -0
  125. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/metadata_parser.py +0 -0
  126. {csvpath-0.0.461 → csvpath-0.0.462}/csvpath/util/printer.py +0 -0
  127. {csvpath-0.0.461 → csvpath-0.0.462}/docs/asbool.md +0 -0
  128. {csvpath-0.0.461 → csvpath-0.0.462}/docs/assignment.md +0 -0
  129. {csvpath-0.0.461 → csvpath-0.0.462}/docs/config.md +0 -0
  130. {csvpath-0.0.461 → csvpath-0.0.462}/docs/examples.md +0 -0
  131. {csvpath-0.0.461 → csvpath-0.0.462}/docs/files.md +0 -0
  132. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/above.md +0 -0
  133. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/advance.md +0 -0
  134. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/after_blank.md +0 -0
  135. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/all.md +0 -0
  136. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/andor.md +0 -0
  137. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/any.md +0 -0
  138. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/average.md +0 -0
  139. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/between.md +0 -0
  140. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/collect.md +0 -0
  141. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/correlate.md +0 -0
  142. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/count.md +0 -0
  143. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/count_headers.md +0 -0
  144. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/date.md +0 -0
  145. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/empty.md +0 -0
  146. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/end.md +0 -0
  147. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/every.md +0 -0
  148. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/fail.md +0 -0
  149. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/first.md +0 -0
  150. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/get.md +0 -0
  151. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/has_dups.md +0 -0
  152. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/header.md +0 -0
  153. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/header_name.md +0 -0
  154. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/header_names_mismatch.md +0 -0
  155. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/implementing_functions.md +0 -0
  156. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/import.md +0 -0
  157. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/in.md +0 -0
  158. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/increment.md +0 -0
  159. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/jinja.md +0 -0
  160. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/last.md +0 -0
  161. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/line_number.md +0 -0
  162. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/max.md +0 -0
  163. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/metaphone.md +0 -0
  164. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/mismatch.md +0 -0
  165. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/no.md +0 -0
  166. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/not.md +0 -0
  167. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/now.md +0 -0
  168. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/percent_unique.md +0 -0
  169. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/pop.md +0 -0
  170. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/print.md +0 -0
  171. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/print_line.md +0 -0
  172. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/print_queue.md +0 -0
  173. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/regex.md +0 -0
  174. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/replace.md +0 -0
  175. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/reset_headers.md +0 -0
  176. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/stdev.md +0 -0
  177. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/stop.md +0 -0
  178. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/string_functions.md +0 -0
  179. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/subtract.md +0 -0
  180. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/sum.md +0 -0
  181. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/tally.md +0 -0
  182. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/total_lines.md +0 -0
  183. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/track.md +0 -0
  184. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/variables.md +0 -0
  185. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions/variables_and_headers.md +0 -0
  186. {csvpath-0.0.461 → csvpath-0.0.462}/docs/functions.md +0 -0
  187. {csvpath-0.0.461 → csvpath-0.0.462}/docs/grammar.md +0 -0
  188. {csvpath-0.0.461 → csvpath-0.0.462}/docs/headers.md +0 -0
  189. {csvpath-0.0.461 → csvpath-0.0.462}/docs/images/logo-wordmark-white-on-black-trimmed-padded.png +0 -0
  190. {csvpath-0.0.461 → csvpath-0.0.462}/docs/images/logo-wordmark-white-trimmed.png +0 -0
  191. {csvpath-0.0.461 → csvpath-0.0.462}/docs/paths.md +0 -0
  192. {csvpath-0.0.461 → csvpath-0.0.462}/docs/qualifiers.md +0 -0
  193. {csvpath-0.0.461 → csvpath-0.0.462}/docs/references.md +0 -0
  194. {csvpath-0.0.461 → csvpath-0.0.462}/docs/terms.md +0 -0
  195. {csvpath-0.0.461 → csvpath-0.0.462}/docs/variables.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: csvpath
3
- Version: 0.0.461
3
+ Version: 0.0.462
4
4
  Summary: A declarative language for data extraction and validation of CSV files
5
5
  Author: David Kershaw
6
6
  Author-email: dk107dk@hotmail.com
@@ -30,20 +30,17 @@ class Last(MatchDecider):
30
30
  )
31
31
  )
32
32
  if last or last_scan:
33
- if not self.onmatch or self.line_matches():
34
- self.match = True
35
- if self.match:
36
- if len(self.children) == 1:
37
- self.matcher.csvpath.logger.debug(
38
- "Overriding frozen in last(): %s", self
39
- )
40
- self.matcher.csvpath.is_frozen = False
41
- self.children[0].matches(skip=[self])
42
- self.matcher.csvpath.is_frozen = True
43
- self.matcher.csvpath.logger.debug(
44
- "Resetting frozen after last(): %s", self
45
- )
46
- else:
47
- self.match = False
33
+ self.match = True
48
34
  else:
49
35
  self.match = False
36
+ if self.match:
37
+ if len(self.children) == 1:
38
+ self.matcher.csvpath.logger.debug(
39
+ "Overriding frozen in last(): %s", self
40
+ )
41
+ self.matcher.csvpath.is_frozen = False
42
+ self.children[0].matches(skip=[self])
43
+ self.matcher.csvpath.is_frozen = True
44
+ self.matcher.csvpath.logger.debug(
45
+ "Resetting frozen after last(): %s", self
46
+ )
@@ -27,11 +27,16 @@ class Equality(Matchable):
27
27
  # and the right-hand side was executed. This is so that a VoteStack-like
28
28
  # component could provide debugging access.
29
29
  self.DO_WHEN = None
30
+ self.sentinel = False
30
31
 
31
32
  def reset(self) -> None:
32
33
  self.value = None
33
34
  self.match = None
34
35
  self.DO_WHEN = False
36
+ #
37
+ # sentinel makes sure that the right-hand side is only executed 1x
38
+ #
39
+ self.sentinel = False
35
40
  super().reset()
36
41
 
37
42
  @property
@@ -48,6 +53,7 @@ class Equality(Matchable):
48
53
  while len(self.children) < 2:
49
54
  self.children.append(None)
50
55
  self.children[0] = o
56
+ o.parent = self
51
57
 
52
58
  @property
53
59
  def right(self): # pylint: disable=C0116
@@ -63,6 +69,7 @@ class Equality(Matchable):
63
69
  while len(self.children) < 2:
64
70
  self.children.append(None)
65
71
  self.children[1] = o
72
+ o.parent = self
66
73
 
67
74
  def other_child(self, o): # pylint: disable=C0116
68
75
  if self.left == o:
@@ -363,7 +370,22 @@ class Equality(Matchable):
363
370
  def _do_when(self, *, skip=None) -> bool:
364
371
  b = None
365
372
  if self.op == "->":
373
+ #
374
+ # when we use the skip list to prevent loops we are
375
+ # returning the default_match -- the affirmative --
376
+ # resulting in the right-hand side being considered
377
+ # early, before the left-hand side is ready. the
378
+ # sentinel makes sure we don't descend the right-hand
379
+ # side.
380
+ #
381
+ if self.sentinel:
382
+ return self.default_match()
383
+ else:
384
+ self.sentinel = True
385
+
366
386
  lm = self.left.matches(skip=skip)
387
+ pln = self.matcher.csvpath.line_monitor.physical_line_number
388
+
367
389
  if lm is True:
368
390
  b = True
369
391
  if self.matcher._AND is False and self._left_nocontrib(self.left):
@@ -2,6 +2,7 @@
2
2
  import traceback
3
3
  import warnings
4
4
  from csvpath.util.error import ErrorHandler
5
+ from csvpath.matching.util.expression_utility import ExpressionUtility
5
6
  from . import Matchable
6
7
 
7
8
 
@@ -25,7 +26,7 @@ class Expression(Matchable):
25
26
 
26
27
  def matches(self, *, skip=None) -> bool:
27
28
  if skip and self in skip:
28
- return True
29
+ return True # should be default_match
29
30
  if self.match is None:
30
31
  try:
31
32
  ret = True
@@ -259,7 +259,15 @@ class Qualified:
259
259
  by adding self to the skip list."""
260
260
  es = self.matcher.expressions # pylint: disable=E1101
261
261
  for e in es:
262
-
262
+ #
263
+ # this fix for 1 test (test_function_last1) is blowing 11 other tests!
264
+ #
265
+ # me = ExpressionUtility.get_my_expression(self)
266
+ # print(f"my expression: me: {me}")
267
+ # if e[0] == me: # added experiment
268
+ # print(f"found my expression!")
269
+ # continue
270
+ # print(f"not my expression: {e[0]}")
263
271
  m = e[1] is self.default_match() or e[0].matches(
264
272
  skip=[self]
265
273
  ) # pylint: disable=E1101
@@ -287,7 +295,7 @@ class Qualified:
287
295
  _id = f"{self.get_id()}_onchange" # pylint: disable=E1101
288
296
  v = self.matcher.get_variable(_id) # pylint: disable=E1101
289
297
  me = hashlib.sha256(
290
- f"{self.to_value()}".encode("utf-8") # pylint: disable=E1101
298
+ f"{self.to_value(skip=[self])}".encode("utf-8") # pylint: disable=E1101
291
299
  ).hexdigest()
292
300
  self.matcher.set_variable(_id, value=me) # pylint: disable=E1101
293
301
  # this might be better as an is True/is False test
@@ -200,3 +200,10 @@ class ExpressionUtility:
200
200
  if p:
201
201
  ret = p
202
202
  return ret
203
+
204
+ @classmethod
205
+ def any_of_my_descendants(cls, expression, skips) -> bool:
206
+ for c in skips:
207
+ if cls.get_my_expression(c) == expression:
208
+ return True
209
+ return False
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "csvpath"
3
- version = "0.0.461"
3
+ version = "0.0.462"
4
4
  description = "A declarative language for data extraction and validation of CSV files"
5
5
  authors = ["David Kershaw <dk107dk@hotmail.com>"]
6
6
  readme = "README.md"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes