pyflexicon 4.1.0__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 (236) hide show
  1. pyflexicon-4.1.0/CHANGELOG.md +532 -0
  2. pyflexicon-4.1.0/LICENSE.txt +472 -0
  3. pyflexicon-4.1.0/MANIFEST.in +8 -0
  4. pyflexicon-4.1.0/NOTICE +32 -0
  5. pyflexicon-4.1.0/PKG-INFO +205 -0
  6. pyflexicon-4.1.0/README.rst +178 -0
  7. pyflexicon-4.1.0/flexicon/__init__.py +253 -0
  8. pyflexicon-4.1.0/flexicon/__init__.pyi +32 -0
  9. pyflexicon-4.1.0/flexicon/code/BaseOperations.py +2226 -0
  10. pyflexicon-4.1.0/flexicon/code/BaseOperations.pyi +37 -0
  11. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartCellTagOperations.py +200 -0
  12. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartClauseMarkerOperations.py +447 -0
  13. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartMarkerOperations.py +317 -0
  14. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartMovedTextOperations.py +441 -0
  15. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartOperations.py +565 -0
  16. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartRowOperations.py +608 -0
  17. pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartWordGroupOperations.py +535 -0
  18. pyflexicon-4.1.0/flexicon/code/Discourse/__init__.py +1 -0
  19. pyflexicon-4.1.0/flexicon/code/FLExGlobals.py +166 -0
  20. pyflexicon-4.1.0/flexicon/code/FLExInit.py +82 -0
  21. pyflexicon-4.1.0/flexicon/code/FLExLCM.py +105 -0
  22. pyflexicon-4.1.0/flexicon/code/FLExProject.py +4423 -0
  23. pyflexicon-4.1.0/flexicon/code/FLExProject.pyi +191 -0
  24. pyflexicon-4.1.0/flexicon/code/Grammar/AllomorphOperations.pyi +22 -0
  25. pyflexicon-4.1.0/flexicon/code/Grammar/EnvironmentOperations.py +790 -0
  26. pyflexicon-4.1.0/flexicon/code/Grammar/EnvironmentOperations.pyi +22 -0
  27. pyflexicon-4.1.0/flexicon/code/Grammar/GramCatOperations.py +723 -0
  28. pyflexicon-4.1.0/flexicon/code/Grammar/GramCatOperations.pyi +22 -0
  29. pyflexicon-4.1.0/flexicon/code/Grammar/InflectionFeatureOperations.py +1831 -0
  30. pyflexicon-4.1.0/flexicon/code/Grammar/InflectionFeatureOperations.pyi +22 -0
  31. pyflexicon-4.1.0/flexicon/code/Grammar/MorphRuleOperations.py +989 -0
  32. pyflexicon-4.1.0/flexicon/code/Grammar/MorphRuleOperations.pyi +22 -0
  33. pyflexicon-4.1.0/flexicon/code/Grammar/NaturalClassOperations.py +1150 -0
  34. pyflexicon-4.1.0/flexicon/code/Grammar/NaturalClassOperations.pyi +22 -0
  35. pyflexicon-4.1.0/flexicon/code/Grammar/POSOperations.py +1245 -0
  36. pyflexicon-4.1.0/flexicon/code/Grammar/POSOperations.pyi +28 -0
  37. pyflexicon-4.1.0/flexicon/code/Grammar/PhonFeatureOperations.py +889 -0
  38. pyflexicon-4.1.0/flexicon/code/Grammar/PhonemeOperations.py +1707 -0
  39. pyflexicon-4.1.0/flexicon/code/Grammar/PhonemeOperations.pyi +22 -0
  40. pyflexicon-4.1.0/flexicon/code/Grammar/PhonologicalRuleOperations.py +1531 -0
  41. pyflexicon-4.1.0/flexicon/code/Grammar/PhonologicalRuleOperations.pyi +22 -0
  42. pyflexicon-4.1.0/flexicon/code/Grammar/StratumOperations.py +362 -0
  43. pyflexicon-4.1.0/flexicon/code/Grammar/__init__.py +24 -0
  44. pyflexicon-4.1.0/flexicon/code/Grammar/adhoc_prohibition.py +290 -0
  45. pyflexicon-4.1.0/flexicon/code/Grammar/affix_template.py +523 -0
  46. pyflexicon-4.1.0/flexicon/code/Grammar/affix_template_collection.py +398 -0
  47. pyflexicon-4.1.0/flexicon/code/Grammar/compound_rule.py +405 -0
  48. pyflexicon-4.1.0/flexicon/code/Grammar/compound_rule_collection.py +244 -0
  49. pyflexicon-4.1.0/flexicon/code/Grammar/phonological_rule.py +520 -0
  50. pyflexicon-4.1.0/flexicon/code/Grammar/prohibition_collection.py +301 -0
  51. pyflexicon-4.1.0/flexicon/code/Grammar/rule_collection.py +288 -0
  52. pyflexicon-4.1.0/flexicon/code/Lexicon/AllomorphOperations.py +1169 -0
  53. pyflexicon-4.1.0/flexicon/code/Lexicon/EtymologyOperations.py +1275 -0
  54. pyflexicon-4.1.0/flexicon/code/Lexicon/EtymologyOperations.pyi +22 -0
  55. pyflexicon-4.1.0/flexicon/code/Lexicon/ExampleOperations.py +1669 -0
  56. pyflexicon-4.1.0/flexicon/code/Lexicon/ExampleOperations.pyi +22 -0
  57. pyflexicon-4.1.0/flexicon/code/Lexicon/LexEntryOperations.py +3203 -0
  58. pyflexicon-4.1.0/flexicon/code/Lexicon/LexEntryOperations.pyi +29 -0
  59. pyflexicon-4.1.0/flexicon/code/Lexicon/LexReferenceOperations.py +1459 -0
  60. pyflexicon-4.1.0/flexicon/code/Lexicon/LexReferenceOperations.pyi +22 -0
  61. pyflexicon-4.1.0/flexicon/code/Lexicon/LexSenseOperations.py +3875 -0
  62. pyflexicon-4.1.0/flexicon/code/Lexicon/LexSenseOperations.pyi +29 -0
  63. pyflexicon-4.1.0/flexicon/code/Lexicon/MSAOperations.py +632 -0
  64. pyflexicon-4.1.0/flexicon/code/Lexicon/PronunciationOperations.py +1070 -0
  65. pyflexicon-4.1.0/flexicon/code/Lexicon/PronunciationOperations.pyi +22 -0
  66. pyflexicon-4.1.0/flexicon/code/Lexicon/SemanticDomainOperations.py +1337 -0
  67. pyflexicon-4.1.0/flexicon/code/Lexicon/SemanticDomainOperations.pyi +22 -0
  68. pyflexicon-4.1.0/flexicon/code/Lexicon/VariantOperations.py +1154 -0
  69. pyflexicon-4.1.0/flexicon/code/Lexicon/VariantOperations.pyi +22 -0
  70. pyflexicon-4.1.0/flexicon/code/Lexicon/__init__.py +0 -0
  71. pyflexicon-4.1.0/flexicon/code/Lexicon/allomorph.py +409 -0
  72. pyflexicon-4.1.0/flexicon/code/Lexicon/allomorph_collection.py +255 -0
  73. pyflexicon-4.1.0/flexicon/code/Lexicon/morphosyntax_analysis.py +435 -0
  74. pyflexicon-4.1.0/flexicon/code/Lexicon/msa_collection.py +316 -0
  75. pyflexicon-4.1.0/flexicon/code/Lists/AgentOperations.py +827 -0
  76. pyflexicon-4.1.0/flexicon/code/Lists/AgentOperations.pyi +22 -0
  77. pyflexicon-4.1.0/flexicon/code/Lists/ConfidenceOperations.py +282 -0
  78. pyflexicon-4.1.0/flexicon/code/Lists/ConfidenceOperations.pyi +22 -0
  79. pyflexicon-4.1.0/flexicon/code/Lists/LocalizedListsOperations.py +334 -0
  80. pyflexicon-4.1.0/flexicon/code/Lists/OverlayOperations.py +560 -0
  81. pyflexicon-4.1.0/flexicon/code/Lists/OverlayOperations.pyi +22 -0
  82. pyflexicon-4.1.0/flexicon/code/Lists/PossibilityListOperations.py +1548 -0
  83. pyflexicon-4.1.0/flexicon/code/Lists/PossibilityListOperations.pyi +22 -0
  84. pyflexicon-4.1.0/flexicon/code/Lists/PublicationOperations.py +975 -0
  85. pyflexicon-4.1.0/flexicon/code/Lists/PublicationOperations.pyi +22 -0
  86. pyflexicon-4.1.0/flexicon/code/Lists/TranslationTypeOperations.py +626 -0
  87. pyflexicon-4.1.0/flexicon/code/Lists/TranslationTypeOperations.pyi +22 -0
  88. pyflexicon-4.1.0/flexicon/code/Lists/__init__.py +0 -0
  89. pyflexicon-4.1.0/flexicon/code/Lists/possibility_item_base.py +490 -0
  90. pyflexicon-4.1.0/flexicon/code/Notebook/AnthropologyOperations.py +2111 -0
  91. pyflexicon-4.1.0/flexicon/code/Notebook/AnthropologyOperations.pyi +22 -0
  92. pyflexicon-4.1.0/flexicon/code/Notebook/DataNotebookOperations.py +2745 -0
  93. pyflexicon-4.1.0/flexicon/code/Notebook/DataNotebookOperations.pyi +22 -0
  94. pyflexicon-4.1.0/flexicon/code/Notebook/LocationOperations.py +1709 -0
  95. pyflexicon-4.1.0/flexicon/code/Notebook/LocationOperations.pyi +22 -0
  96. pyflexicon-4.1.0/flexicon/code/Notebook/NoteOperations.py +1055 -0
  97. pyflexicon-4.1.0/flexicon/code/Notebook/NoteOperations.pyi +22 -0
  98. pyflexicon-4.1.0/flexicon/code/Notebook/PersonOperations.py +1581 -0
  99. pyflexicon-4.1.0/flexicon/code/Notebook/PersonOperations.pyi +22 -0
  100. pyflexicon-4.1.0/flexicon/code/Notebook/__init__.py +0 -0
  101. pyflexicon-4.1.0/flexicon/code/Notebook/annotation.py +554 -0
  102. pyflexicon-4.1.0/flexicon/code/Notebook/annotation_collection.py +579 -0
  103. pyflexicon-4.1.0/flexicon/code/PythonicWrapper.py +240 -0
  104. pyflexicon-4.1.0/flexicon/code/Reversal/ReversalIndexEntryOperations.py +628 -0
  105. pyflexicon-4.1.0/flexicon/code/Reversal/ReversalIndexOperations.py +520 -0
  106. pyflexicon-4.1.0/flexicon/code/Reversal/__init__.py +1 -0
  107. pyflexicon-4.1.0/flexicon/code/Scripture/ScrAnnotationsOperations.py +288 -0
  108. pyflexicon-4.1.0/flexicon/code/Scripture/ScrBookOperations.py +530 -0
  109. pyflexicon-4.1.0/flexicon/code/Scripture/ScrDraftOperations.py +417 -0
  110. pyflexicon-4.1.0/flexicon/code/Scripture/ScrNoteOperations.py +640 -0
  111. pyflexicon-4.1.0/flexicon/code/Scripture/ScrSectionOperations.py +525 -0
  112. pyflexicon-4.1.0/flexicon/code/Scripture/ScrTxtParaOperations.py +536 -0
  113. pyflexicon-4.1.0/flexicon/code/Scripture/__init__.py +1 -0
  114. pyflexicon-4.1.0/flexicon/code/Shared/FilterOperations.py +1402 -0
  115. pyflexicon-4.1.0/flexicon/code/Shared/MediaOperations.py +1582 -0
  116. pyflexicon-4.1.0/flexicon/code/Shared/__init__.py +29 -0
  117. pyflexicon-4.1.0/flexicon/code/Shared/catalog.py +533 -0
  118. pyflexicon-4.1.0/flexicon/code/Shared/catalog_backed.py +776 -0
  119. pyflexicon-4.1.0/flexicon/code/Shared/lcm_constants.py +61 -0
  120. pyflexicon-4.1.0/flexicon/code/Shared/rule_patterns.py +98 -0
  121. pyflexicon-4.1.0/flexicon/code/Shared/smart_collection.py +316 -0
  122. pyflexicon-4.1.0/flexicon/code/Shared/string_utils.py +225 -0
  123. pyflexicon-4.1.0/flexicon/code/Shared/wrapper_base.py +227 -0
  124. pyflexicon-4.1.0/flexicon/code/System/AnnotationDefOperations.py +1252 -0
  125. pyflexicon-4.1.0/flexicon/code/System/AnnotationDefOperations.pyi +22 -0
  126. pyflexicon-4.1.0/flexicon/code/System/CheckOperations.py +1470 -0
  127. pyflexicon-4.1.0/flexicon/code/System/CheckOperations.pyi +22 -0
  128. pyflexicon-4.1.0/flexicon/code/System/CustomFieldOperations.py +1444 -0
  129. pyflexicon-4.1.0/flexicon/code/System/CustomFieldOperations.pyi +22 -0
  130. pyflexicon-4.1.0/flexicon/code/System/ProjectSettingsOperations.py +1170 -0
  131. pyflexicon-4.1.0/flexicon/code/System/ProjectSettingsOperations.pyi +22 -0
  132. pyflexicon-4.1.0/flexicon/code/System/WritingSystemOperations.py +1042 -0
  133. pyflexicon-4.1.0/flexicon/code/System/WritingSystemOperations.pyi +22 -0
  134. pyflexicon-4.1.0/flexicon/code/System/__init__.py +0 -0
  135. pyflexicon-4.1.0/flexicon/code/System/context_collection.py +344 -0
  136. pyflexicon-4.1.0/flexicon/code/System/phonological_context.py +557 -0
  137. pyflexicon-4.1.0/flexicon/code/TextsWords/DiscourseOperations.py +1209 -0
  138. pyflexicon-4.1.0/flexicon/code/TextsWords/DiscourseOperations.pyi +22 -0
  139. pyflexicon-4.1.0/flexicon/code/TextsWords/FilterOperations.pyi +22 -0
  140. pyflexicon-4.1.0/flexicon/code/TextsWords/MediaOperations.pyi +22 -0
  141. pyflexicon-4.1.0/flexicon/code/TextsWords/ParagraphOperations.py +740 -0
  142. pyflexicon-4.1.0/flexicon/code/TextsWords/ParagraphOperations.pyi +22 -0
  143. pyflexicon-4.1.0/flexicon/code/TextsWords/SegmentOperations.py +1254 -0
  144. pyflexicon-4.1.0/flexicon/code/TextsWords/SegmentOperations.pyi +22 -0
  145. pyflexicon-4.1.0/flexicon/code/TextsWords/TextOperations.py +1036 -0
  146. pyflexicon-4.1.0/flexicon/code/TextsWords/TextOperations.pyi +22 -0
  147. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiAnalysisOperations.py +1492 -0
  148. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiAnalysisOperations.pyi +22 -0
  149. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiGlossOperations.py +983 -0
  150. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiGlossOperations.pyi +22 -0
  151. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiMorphBundleOperations.py +1334 -0
  152. pyflexicon-4.1.0/flexicon/code/TextsWords/WfiMorphBundleOperations.pyi +22 -0
  153. pyflexicon-4.1.0/flexicon/code/TextsWords/WordformOperations.py +959 -0
  154. pyflexicon-4.1.0/flexicon/code/TextsWords/WordformOperations.pyi +22 -0
  155. pyflexicon-4.1.0/flexicon/code/TextsWords/__init__.py +0 -0
  156. pyflexicon-4.1.0/flexicon/code/__init__.py +7 -0
  157. pyflexicon-4.1.0/flexicon/code/__init__.pyi +27 -0
  158. pyflexicon-4.1.0/flexicon/code/_context_manager_base.py +57 -0
  159. pyflexicon-4.1.0/flexicon/code/exceptions.py +89 -0
  160. pyflexicon-4.1.0/flexicon/code/lcm_casting.py +889 -0
  161. pyflexicon-4.1.0/flexicon/code/transaction.py +193 -0
  162. pyflexicon-4.1.0/flexicon/code/undoable_operation.py +122 -0
  163. pyflexicon-4.1.0/flexicon/examples/demo_lexicon.py +102 -0
  164. pyflexicon-4.1.0/flexicon/examples/demo_openproject.py +95 -0
  165. pyflexicon-4.1.0/flexicon/examples/demo_pos_operations.py +98 -0
  166. pyflexicon-4.1.0/flexicon/examples/demo_writing_systems.py +183 -0
  167. pyflexicon-4.1.0/flexicon/py.typed +0 -0
  168. pyflexicon-4.1.0/flexicon/sync/__init__.py +84 -0
  169. pyflexicon-4.1.0/flexicon/sync/conflict_resolvers.py +263 -0
  170. pyflexicon-4.1.0/flexicon/sync/dependency_graph.py +396 -0
  171. pyflexicon-4.1.0/flexicon/sync/dependency_resolver.py +365 -0
  172. pyflexicon-4.1.0/flexicon/sync/diff.py +617 -0
  173. pyflexicon-4.1.0/flexicon/sync/engine.py +660 -0
  174. pyflexicon-4.1.0/flexicon/sync/export.py +96 -0
  175. pyflexicon-4.1.0/flexicon/sync/hierarchical_importer.py +463 -0
  176. pyflexicon-4.1.0/flexicon/sync/match_strategies.py +339 -0
  177. pyflexicon-4.1.0/flexicon/sync/merge_ops.py +477 -0
  178. pyflexicon-4.1.0/flexicon/sync/selective_import.py +352 -0
  179. pyflexicon-4.1.0/flexicon/sync/tests/__init__.py +6 -0
  180. pyflexicon-4.1.0/flexicon/sync/tests/test_base_operations.py +476 -0
  181. pyflexicon-4.1.0/flexicon/sync/tests/test_dependency_graph.py +443 -0
  182. pyflexicon-4.1.0/flexicon/sync/tests/test_diff_engine.py +330 -0
  183. pyflexicon-4.1.0/flexicon/sync/tests/test_duplicate_operations.py +2290 -0
  184. pyflexicon-4.1.0/flexicon/sync/tests/test_match_strategies.py +243 -0
  185. pyflexicon-4.1.0/flexicon/sync/tests/test_merge_ops.py +394 -0
  186. pyflexicon-4.1.0/flexicon/sync/tests/test_selective_import.py +719 -0
  187. pyflexicon-4.1.0/flexicon/sync/tests/test_sync_engine.py +533 -0
  188. pyflexicon-4.1.0/flexicon/sync/tests/test_sync_result.py +339 -0
  189. pyflexicon-4.1.0/flexicon/sync/tests/test_validation.py +478 -0
  190. pyflexicon-4.1.0/flexicon/sync/validation.py +448 -0
  191. pyflexicon-4.1.0/flexicon/tests/test_CustomFields.py +72 -0
  192. pyflexicon-4.1.0/flexicon/tests/test_FLExInit.py +38 -0
  193. pyflexicon-4.1.0/flexicon/tests/test_FLExProject.py +58 -0
  194. pyflexicon-4.1.0/flexlibs2/__init__.py +72 -0
  195. pyflexicon-4.1.0/pyflexicon.egg-info/PKG-INFO +205 -0
  196. pyflexicon-4.1.0/pyflexicon.egg-info/SOURCES.txt +234 -0
  197. pyflexicon-4.1.0/pyflexicon.egg-info/dependency_links.txt +1 -0
  198. pyflexicon-4.1.0/pyflexicon.egg-info/requires.txt +1 -0
  199. pyflexicon-4.1.0/pyflexicon.egg-info/top_level.txt +2 -0
  200. pyflexicon-4.1.0/pyproject.toml +50 -0
  201. pyflexicon-4.1.0/setup.cfg +4 -0
  202. pyflexicon-4.1.0/tests/test_affix_template_wrappers.py +651 -0
  203. pyflexicon-4.1.0/tests/test_allomorph_wrappers.py +389 -0
  204. pyflexicon-4.1.0/tests/test_annotation_wrappers.py +432 -0
  205. pyflexicon-4.1.0/tests/test_catalog.py +747 -0
  206. pyflexicon-4.1.0/tests/test_collections.py +703 -0
  207. pyflexicon-4.1.0/tests/test_compound_rule_wrappers.py +553 -0
  208. pyflexicon-4.1.0/tests/test_consolidation_coverage.py +345 -0
  209. pyflexicon-4.1.0/tests/test_context_wrappers.py +441 -0
  210. pyflexicon-4.1.0/tests/test_custom_field_create_refusal.py +142 -0
  211. pyflexicon-4.1.0/tests/test_exception_handling.py +389 -0
  212. pyflexicon-4.1.0/tests/test_fixtures.py +127 -0
  213. pyflexicon-4.1.0/tests/test_flexproject_discoverability.py +419 -0
  214. pyflexicon-4.1.0/tests/test_helpers.py +551 -0
  215. pyflexicon-4.1.0/tests/test_homographs.py +642 -0
  216. pyflexicon-4.1.0/tests/test_itsstring_fix.py +89 -0
  217. pyflexicon-4.1.0/tests/test_lcm_api_real.py +200 -0
  218. pyflexicon-4.1.0/tests/test_lcm_api_usage.py +291 -0
  219. pyflexicon-4.1.0/tests/test_lcm_direct.py +114 -0
  220. pyflexicon-4.1.0/tests/test_lcm_method_verification.py +340 -0
  221. pyflexicon-4.1.0/tests/test_msa_wrappers.py +484 -0
  222. pyflexicon-4.1.0/tests/test_normalize_match_key.py +181 -0
  223. pyflexicon-4.1.0/tests/test_normalize_ws_handle.py +94 -0
  224. pyflexicon-4.1.0/tests/test_operations_baseline.py +472 -0
  225. pyflexicon-4.1.0/tests/test_pattern_g_owner_of_class.py +252 -0
  226. pyflexicon-4.1.0/tests/test_pattern_writing_systems_enumeration.py +162 -0
  227. pyflexicon-4.1.0/tests/test_phoneme_duplicate_fix.py +90 -0
  228. pyflexicon-4.1.0/tests/test_phonological_rules_wrappers.py +355 -0
  229. pyflexicon-4.1.0/tests/test_prohibition_wrappers.py +622 -0
  230. pyflexicon-4.1.0/tests/test_rule_patterns.py +142 -0
  231. pyflexicon-4.1.0/tests/test_segment_baseline_text.py +319 -0
  232. pyflexicon-4.1.0/tests/test_sense_lookups.py +534 -0
  233. pyflexicon-4.1.0/tests/test_validation_base.py +494 -0
  234. pyflexicon-4.1.0/tests/test_wfianalysis_agent_import.py +25 -0
  235. pyflexicon-4.1.0/tests/test_wrappers.py +570 -0
  236. pyflexicon-4.1.0/tests/test_write_enabled_fix.py +126 -0
@@ -0,0 +1,532 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Future breaking changes go under `[Unreleased]` until the next version cut.
9
+
10
+ ---
11
+
12
+ ## [Unreleased]
13
+
14
+ _Nothing yet. Non-breaking fixes and breaking changes accumulate here until the next version cut._
15
+
16
+ ---
17
+
18
+ ## [4.1.0]
19
+
20
+ ### Changed
21
+ - **Renamed the library from `flexlibs2` to `flexicon`** (distribution name on
22
+ PyPI: `pyflexicon`). flexicon is now maintained as an independent successor
23
+ to cdfarrow/flexlibs rather than a fork; it no longer tracks the upstream
24
+ codebase. Original LGPL-2.1 attribution (Craig Farrow) is retained in
25
+ `LICENSE.txt` / `NOTICE`.
26
+ - Packaging consolidated to a single `pyproject.toml` (removed `setup.cfg`);
27
+ corrected the license metadata from `GPL-2.0-or-later` to the actual
28
+ `LGPL-2.1-or-later`.
29
+
30
+ ### Added
31
+ - `flexlibs2` compatibility alias: `import flexlibs2` (and deep submodule
32
+ imports such as `flexlibs2.code.lcm_casting`) transparently resolve to the
33
+ identical `flexicon` objects via a meta-path finder, so existing FlexTools /
34
+ FlexTrans scripts keep working. Emits a `DeprecationWarning`.
35
+
36
+ ### Deprecated
37
+ - The `flexlibs2` import alias is deprecated and will be **removed in v5.0.0**.
38
+ Update imports to `flexicon`.
39
+
40
+ ---
41
+
42
+ ## [4.0.1] - 2026-06-30
43
+
44
+ ### Fixed
45
+
46
+ - **`LexEntryOperations.GetComplexFormsNotSubentries`** — none-guard the
47
+ `sense.OwnerOfClass(LexEntryTags.kClassId)` cast. When `OwnerOfClass`
48
+ returns `None` (orphaned sense or test-double context), the unconditional
49
+ `ILexEntry()` cast raised `TypeError`; now returns an empty result,
50
+ mirroring the safer cast pattern already used elsewhere in that file.
51
+ (66b8eb3)
52
+
53
+ - **`sync/tests/test_base_operations.py`** — corrected a stale import from
54
+ the nonexistent `flexlibs2.flexlibs` module (v1 leftover). The bad import
55
+ raised `ModuleNotFoundError` at collection time and aborted the entire
56
+ pytest session. Corrected to import from the package root `flexlibs2`.
57
+ (742b9b4)
58
+
59
+ - **`SemanticDomainOperations.GetSubdomains`** — yield `ICmSemanticDomain`
60
+ (typed cast) instead of the base `ICmPossibility` object, for both the
61
+ fast path and the recursive walk.
62
+
63
+ - **`LocationOperations.GetSublocations`** — yield `ICmLocation` (typed
64
+ cast) for both fast path and recursive walk.
65
+
66
+ - **`InflectionFeatureOperations.InflectionClassGetAll`** — yield
67
+ `IMoInflClass` (typed cast) instead of the raw base-interface object.
68
+ These three close the Category 5 cast-on-yield gaps. (92762fa)
69
+
70
+ - **`ProjectSettingsOperations`** — added LCM-backed accessors:
71
+ `GetProjectGuid`, `GetProjectDescription`, `GetExternalLink`,
72
+ `GetAnalysisWritingSystem`, `GetVernacularWritingSystem`. Both WS getters
73
+ return `None` safely when `project.lp` is unavailable. (92762fa, fd156ee)
74
+
75
+ - **`ReversalIndexEntryOperations.__GetEntryWS`** — raises
76
+ `FP_ParameterError` (naming `entry.Hvo`) when `entry.ReversalIndex` is
77
+ `None`, replacing the `NullReferenceException` that previously surfaced
78
+ during reversal cleanup of orphaned or cascade-deleted entries
79
+ (Category 7). (fd156ee)
80
+
81
+ ### Tests
82
+
83
+ - **Grammar live tests** (phon-feature, natural-class, phon-rule) refactored
84
+ as self-restoring round-trips. Removed top-of-test pre-clean calls that
85
+ masked incremental failures; each test now follows create -> assert ->
86
+ delete -> assert-gone so a failed test leaves evidence rather than being
87
+ silently swept. 18 tests verified to pass twice back-to-back without a
88
+ DB restore in between. (ddbfe3c)
89
+
90
+ ### Docs
91
+
92
+ - **`docs/API_ISSUES_CATEGORIZED.md`**: Category 5 marked RESOLVED;
93
+ Category 4 / ProjectSettings table updated to reflect new accessors;
94
+ Category 7 reversal NullReferenceException entry updated with the
95
+ `__GetEntryWS` null-guard fix; additional latent-gap notes added to
96
+ Category 3. (a1d4bb3, 57ed7a0)
97
+
98
+ ---
99
+
100
+ ## [4.0.0] - 2026-06-23
101
+
102
+ ### Changed (Breaking)
103
+
104
+ - **`flat=` parameter renamed to `recursive=` (inverted semantics) on every hierarchical-list `GetAll()` accessor.** Collection queries default to `recursive=True` (returns every descendant). Passing `flat=` raises `TypeError`. Affected modules:
105
+ - `POSOperations.GetAll`, `LexSenseOperations.GetAll`, `SemanticDomainOperations.GetAll`,
106
+ `AnthropologyOperations.GetAll`, `LocationOperations.GetAll`,
107
+ `PublicationOperations.GetAll`, `PossibilityListOperations.GetAll`,
108
+ plus the inline `GetSubcategories` / `GetSubdomains` / `GetSubitems` helpers.
109
+ - `FLExProject.GetAllSemanticDomains` now also raises `TypeError` on `flat=` (the one-release deprecation shim has been removed).
110
+ - **`include_subcategories=` parameter renamed to `recursive=`** on `LexEntryOperations.GetAvailableMorphTypes`. Same semantics, more consistent naming.
111
+ - **Counting queries default to `recursive=False`** (FLEx UI parity). `POSOperations.GetEntryCount` was briefly flipped to `recursive=True` in d423e83 and reverted by #101 to match every count column in FLEx's UI (Categories tool, Lexicon Browse, Tools > Statistics — all direct-tag only). `SemanticDomainOperations.GetSenseCount` now accepts the same `recursive=` parameter (default `False`), so caller code looks identical across all `Get*Count` methods. Pass `recursive=True` when you actually want the descendant roll-up.
112
+
113
+ ### Fixed
114
+
115
+ #### LCM Owner Typing — Pattern A Sweep (2026-05-30)
116
+
117
+ - **14 raw `Owner` return sites converted to typed casts** across 10 files in
118
+ the Lexicon and TextsWords modules. Untyped `Owner` references silently
119
+ produced wrong parent relationships in `Duplicate` operations and returned
120
+ objects that callers could not navigate without manual casting. All 14 sites
121
+ now cast to the correct interface (e.g. `ILexEntry(obj.Owner)`,
122
+ `ILexSense(obj.Owner)`). (closes #166, closes #168, closes #159)
123
+ - Affected: ExampleOperations, VariantOperations, PronunciationOperations,
124
+ LexReferenceOperations, LexSenseOperations, WfiAnalysisOperations,
125
+ WfiGlossOperations, WfiMorphBundleOperations, SegmentOperations,
126
+ ParagraphOperations
127
+
128
+ #### API Documentation — Category 8 Correction (2026-05-30)
129
+
130
+ - **`docs/API_ISSUES_CATEGORIZED.md` Category 8 corrected.** The `Source` field
131
+ row previously listed `ICmBaseAnnotation` as the owner; the field actually
132
+ lives on `IStText`. The stale `ICmBaseAnnotation.Source` is unused dead
133
+ interface; any code relying on it would silently return nothing. Row updated
134
+ to reflect the correct `IStText.Source` owner. (closes #173)
135
+ - **`ISegment.BaselineText` entry added** to Category 8. Documents that this is
136
+ an `ITsString` single-WS read-only computed property (backed by
137
+ `IStTxtPara.Contents`) and that writing must go through the
138
+ `Contents`/`ContentsSideEffects`/`AnalysisAdjuster` chain, not direct segment
139
+ assignment.
140
+
141
+ #### SegmentOperations BaselineText — Partial Fix (2026-05-30, refs #172)
142
+
143
+ - **`SetBaselineText` write idiom corrected.** Was attempting direct segment
144
+ mutation; now uses `para.Contents.GetBldr().ReplaceTsString(begin, end,
145
+ new_run)` + `para.Contents = bldr.GetString()`, which fires
146
+ `ContentsSideEffects` and lets `AnalysisAdjuster.AdjustAnalysis` maintain
147
+ segment consistency.
148
+ - **`GetSyncableProperties` BaselineText read corrected.** Was calling
149
+ `GetMultiStringDict` on an `ITsString` (type mismatch). Now reads the WS
150
+ handle via `bt.get_Properties(0).GetIntPropValues(1, 0)[0]`, verified against
151
+ a live Sena 3 project.
152
+ - **Defensive `None` guard** added in `SetBaselineText`; raises
153
+ `FP_ParameterError` on null paragraph.
154
+ - **`DeprecationWarning` silenced** in three `SplitSegment`/`MergeSegments`
155
+ internal callers that were passing a deprecated `ws` argument to
156
+ `GetBaselineText`.
157
+ - 7 new regression tests (`TestGetSyncablePropertiesBaselineText`) added to
158
+ `tests/test_segment_baseline_text.py`.
159
+ - Note: 5 entangled methods (Create, Duplicate, SplitSegment, MergeSegments,
160
+ RebuildSegments) still manually mutate `SegmentsOS`; these require
161
+ architectural rework tracked at #174. **#172 remains open.**
162
+
163
+ ---
164
+
165
+ ## [3.0.0] - 2026-04-07
166
+
167
+ ### Breaking Changes
168
+
169
+ #### Reversal API Removed (GROUP 6)
170
+ - **`project.Reversal` API entirely removed** — 1,343 LOC deleted.
171
+ Migrate to `project.ReversalIndexes` and `project.ReversalEntries`.
172
+ See [docs/REVERSAL_API_MIGRATION.md](docs/REVERSAL_API_MIGRATION.md) for the full per-method table and code examples.
173
+ - `project.Reversal.GetAllIndexes()` → `project.ReversalIndexes.GetAll()`
174
+ - `project.Reversal.GetAll(index)` → `project.ReversalEntries.GetAll(index)`
175
+ - `project.Reversal.GetForm(entry)` → `project.ReversalEntries.GetForm(entry)`
176
+ - `project.Reversal.SetForm(entry, text)` → `project.ReversalEntries.SetForm(entry, text)`
177
+ - `project.Reversal.Create(index, form, ws)` → `project.ReversalEntries.Create(index, form, ws)`
178
+
179
+ #### Lists Consolidation (GROUP 8)
180
+ - **`AgentOperations`, `PublicationOperations`, `TranslationTypeOperations`, and `OverlayOperations`
181
+ now inherit from `PossibilityItemOperations`** instead of duplicating CRUD methods.
182
+ Most caller code is unchanged; see [docs/RELEASE_v3_0_0.md](docs/RELEASE_v3_0_0.md) for full details.
183
+ Known follow-up issues: `AgentOperations` (#54) and `OverlayOperations` (#149) have partial
184
+ parent-class fit problems; some inherited methods may not function correctly.
185
+
186
+ ### Changed
187
+ - Net -3,686 LOC since v2.4.0 (6,583 deletions, 2,897 additions) from deprecated-code removal.
188
+
189
+ ---
190
+
191
+ ## [2.4.0] - 2026-03-22
192
+
193
+ ### Added
194
+
195
+ #### Transaction & Undo/Redo Framework (MAJOR)
196
+ - **Safe Transaction Rollback** - Phase 1 implementation for safe undo/redo operations
197
+ - Automatic transaction state tracking
198
+ - Rollback recovery for failed operations
199
+ - Integration with FieldWorks LCM transactions
200
+ - Comprehensive testing guide in docs/TESTING_UNDO_REDO.md
201
+
202
+ #### Security Enhancements
203
+ - **Write-Enable Guards** - 7 untagged mutating methods now protected
204
+ - Prevents accidental modifications in read-only mode
205
+ - `_EnsureWriteEnabled()` guards on all mutation points
206
+ - Protects data integrity across all Operations classes
207
+
208
+ #### Pre-commit Hooks & Quality Control
209
+ - Custom decorator validator prevents duplicate decorators
210
+ - Black code formatting enforcement
211
+ - Flake8 linting (unused imports, complexity)
212
+ - Detect-secrets for credential detection
213
+ - Setup documentation in docs/PRE_COMMIT_SETUP.md
214
+ - Decorator checking script in scripts/check_decorators.py
215
+
216
+ ### Fixed
217
+
218
+ #### Decorator Bugs
219
+ - **Duplicate `@OperationsMethod` decorators** - Fixed `'OperationsMethod' object is not callable'` errors
220
+ - BaseOperations.py: Removed duplicates from 9 reordering/sync methods
221
+ - POSOperations.py: Removed duplicates from 17 methods (including GetAll)
222
+ - LexEntryOperations.py: Removed duplicates from 5 methods
223
+ - All 64 operation files verified clean
224
+
225
+ ### Documentation
226
+
227
+ #### New Guides
228
+ - **TESTING_UNDO_REDO.md** - Comprehensive undo/redo testing strategy and examples
229
+ - **TRANSACTION_GUIDE.md** - Transaction management and error recovery patterns
230
+ - **CONTRACT_TESTING.md** - LibLCM contract testing for API compatibility
231
+
232
+ ### Tested Against
233
+
234
+ - LibLCM Contract Test Suite - Validates API compatibility across versions
235
+ - Unit tests for undo/redo implementation
236
+ - Pre-commit hooks prevent regression
237
+
238
+ ### Breaking Changes
239
+
240
+ None. Fully backward compatible with v2.3.x APIs.
241
+
242
+ ---
243
+
244
+ ## [2.3.0] - 2026-02-28
245
+
246
+ ### Added
247
+
248
+ #### Extended Wrapper Classes
249
+ - **Allomorph**: Wrapper for allomorph variants and forms
250
+ - Form and gloss access with normalization
251
+ - Environment context tracking
252
+ - Variant relationship management
253
+
254
+ - **CompoundRule**: Wrapper for compound rule definitions
255
+ - Rule component access
256
+ - Directional compound rules
257
+ - Integration with morpheme inventories
258
+
259
+ - **AdhocProhibition**: Wrapper for morphosyntactic prohibitions
260
+ - Prohibited morpheme combinations
261
+ - Context-aware blocking rules
262
+ - Exception handling
263
+
264
+ - **Annotation**: Wrapper for project annotations and notes
265
+ - Annotation type identification
266
+ - Content and metadata access
267
+ - Author and timestamp tracking
268
+
269
+ - **AffixTemplate**: Wrapper for morpheme slot templates
270
+ - Slot configuration and ordering
271
+ - Prefix and suffix slot management
272
+ - Obligatory/optional slot constraints
273
+
274
+ #### Smart Collections (Extended)
275
+ - **AllomorphCollection**: Type-aware collection for allomorphs
276
+ - **CompoundRuleCollection**: Unified collection for compound rules
277
+ - **ProhibitionCollection**: Collection for morphosyntactic prohibitions
278
+ - **AnnotationCollection**: Collection for project annotations
279
+ - **AffixTemplateCollection**: Collection for affix templates
280
+
281
+ #### Type Hints and IDE Support
282
+ - Python type hints on all wrapper class properties (18+ properties)
283
+ - Improved IDE autocomplete and type checking
284
+ - Better static analysis support
285
+
286
+ #### Documentation
287
+ - **USAGE_ALLOMORPHS.md**: Allomorph operations guide
288
+ - **USAGE_COMPOUND_RULES.md**: Compound rule operations guide
289
+ - **USAGE_PROHIBITIONS.md**: Morphosyntactic prohibition guide
290
+ - **USAGE_ANNOTATIONS.md**: Annotation operations guide
291
+ - **USAGE_AFFIX_TEMPLATES.md**: Affix template operations guide
292
+
293
+ ### Improved
294
+
295
+ - **Code Quality**: Type hints across all wrapper classes
296
+ - **Documentation**: Usage guides for all new domains
297
+ - **Test Coverage**: Extended test suite for new wrappers
298
+ - **API Consistency**: All collections follow unified interface
299
+
300
+ ### Backward Compatibility
301
+
302
+ - **100% Maintained**: All v2.0 and v2.1 APIs unchanged
303
+ - **Additive Only**: New wrappers don't modify existing functionality
304
+ - **Mixed Usage**: Old and new approaches coexist seamlessly
305
+
306
+ ### Deprecation Notices
307
+
308
+ None. All previous APIs remain fully functional.
309
+
310
+ ---
311
+
312
+ ## [2.2.0] - 2025-02-28
313
+
314
+ ### Added
315
+
316
+ #### Wrapper Classes
317
+ - **PhonologicalRule**: Unified wrapper for PhRegularRule, PhMetathesisRule, and PhReduplicationRule
318
+ - Transparent casting to concrete types
319
+ - Capability-based API (`has_output_specs`, `has_metathesis_parts`, `has_reduplication_parts`)
320
+ - Convenience properties for common operations
321
+ - Full backward compatibility with base interface
322
+
323
+ - **MorphosyntaxAnalysis**: Unified wrapper for MoStemMsa, MoDerivAffMsa, MoInflAffMsa, and MoUnclassifiedAffMsa
324
+ - Type identification properties (`is_stem_msa`, `is_deriv_aff`, `is_infl_aff`)
325
+ - Automatic casting based on actual type
326
+ - Convenience properties for POS access
327
+ - Proper string representation showing actual type
328
+
329
+ - **PhonologicalContext**: Unified wrapper for PhSimpleContextSeg, PhSimpleContextNC, PhComplexContext, and PhBoundaryContext
330
+ - Context type detection (`is_simple_context`, `is_complex_context`, `is_boundary_context`)
331
+ - Segment-based vs natural class detection
332
+ - Convenience properties for accessing context-specific data
333
+ - Clear display of context type
334
+
335
+ #### Smart Collections
336
+ - **RuleCollection**: Collection class for phonological rules
337
+ - Type-aware display showing breakdown of rule types
338
+ - Convenience filter methods (`regular_rules`, `metathesis_rules`, `reduplication_rules`)
339
+ - Custom filtering with `filter_where()` across all rule types
340
+ - Support for method chaining
341
+
342
+ - **MSACollection**: Collection class for morphosyntactic analyses
343
+ - Type-aware display showing MSA type breakdown
344
+ - Convenience filters (`stem_msas`, `deriv_aff_msas`, `infl_aff_msas`, `unclassified_aff_msas`)
345
+ - POS-based filtering (`filter_by_pos()`)
346
+ - Advanced filtering with `filter_by_has_pos()`, `filter_where()`
347
+
348
+ - **ContextCollection**: Collection class for phonological contexts
349
+ - Type-aware display with context type breakdown
350
+ - Convenience filters for all context types
351
+ - Custom filtering capabilities
352
+ - Full iteration and indexing support
353
+
354
+ #### Base Infrastructure
355
+ - **LCMObjectWrapper**: Base class for all wrapper implementations
356
+ - Automatic delegation to concrete interfaces
357
+ - Consistent property access across types
358
+ - Exception handling for missing properties
359
+ - `__getattr__` delegation pattern for seamless access
360
+
361
+ - **SmartCollection**: Base class for all collection types
362
+ - Type-aware string representation
363
+ - By-type filtering with `by_type()`
364
+ - Generic filtering framework
365
+ - Standard collection operations (append, extend, clear)
366
+
367
+ ### Improved
368
+
369
+ - **Type Transparency**: Users no longer need to manually check `ClassName` and cast to concrete types
370
+ - **IDE Support**: Wrapper classes provide better autocomplete and type hints
371
+ - **Error Messages**: Type mismatches produce clear, actionable error messages
372
+ - **Filtering**: Unified filtering across type hierarchies without manual type checking
373
+ - **Documentation**: Comprehensive examples in docstrings and test suite
374
+ - **Code Maintainability**: Internal casting hidden from public API, reducing complexity
375
+
376
+ ### Fixed
377
+
378
+ - **AttributeError Prevention**: Capability checks prevent accessing unavailable properties
379
+ - **Type Safety**: Automatic casting ensures correct interface access
380
+ - **Method Chaining**: Collections support fluent filtering patterns
381
+
382
+ ### Documentation
383
+
384
+ - **MIGRATION.md**: Complete migration guide showing old vs new API
385
+ - Side-by-side examples for all three domains
386
+ - Backward compatibility notes
387
+ - Gradual vs immediate migration strategies
388
+ - Feature comparison table
389
+
390
+ - **Wrapper Classes Documentation**: Comprehensive docstrings
391
+ - Usage examples in all wrapper classes
392
+ - Capability-based API documented
393
+ - Type detection methods explained
394
+
395
+ - **Smart Collections Guide**: Collection usage patterns
396
+ - Filtering examples
397
+ - Type-aware display explanation
398
+ - Convenience method documentation
399
+
400
+ ### Backward Compatibility
401
+
402
+ - **Zero Breaking Changes**: All existing v2.1 code runs unchanged
403
+ - **Additive Design**: New wrappers are purely additive, don't modify existing API
404
+ - **Mixed Usage**: Old and new approaches can coexist in same codebase
405
+ - **Gradual Migration**: Users can migrate at their own pace
406
+ - **Base Interface Access**: Direct access to base ILcmObjects still available
407
+
408
+ ### Tests
409
+
410
+ **Core Wrapper Tests** (41 tests)
411
+ - LCM Object wrapper initialization and delegation
412
+ - Concrete property access across types
413
+ - Exception handling and edge cases
414
+ - Attribute error prevention
415
+
416
+ **Collection Tests** (70 tests)
417
+ - SmartCollection initialization and operations
418
+ - Indexing, slicing, iteration
419
+ - Type-aware string representation
420
+ - By-type filtering and custom filtering
421
+
422
+ **Domain-Specific Tests** (68 tests)
423
+ - **Phonological Rules**: RuleCollection and PhonologicalRule wrapper
424
+ - Regular rule properties
425
+ - Metathesis rule properties
426
+ - Reduplication rule properties
427
+ - Convenience filters and chaining
428
+
429
+ - **MSAs**: MSACollection and MorphosyntaxAnalysis wrapper
430
+ - Stem MSA properties and filters
431
+ - Derivational affixal MSA properties
432
+ - Inflectional affixal MSA properties
433
+ - POS-based filtering and detection
434
+
435
+ - **Contexts**: ContextCollection and PhonologicalContext wrapper
436
+ - Simple context (segment-based) properties
437
+ - Simple context (natural class) properties
438
+ - Complex context properties
439
+ - Boundary context properties
440
+ - Type convenience filters
441
+
442
+ **Total: 179 tests passing, 0 failures, 0 regressions**
443
+
444
+ ### Performance
445
+
446
+ - No performance degradation compared to v2.1
447
+ - Wrapper overhead minimal (delegation pattern)
448
+ - Collection operations O(n) as expected
449
+ - Lazy evaluation in filter chains
450
+
451
+ ### Known Limitations
452
+
453
+ - Wrappers currently available for three domains:
454
+ - Grammar: Phonological Rules
455
+ - Lexicon: Morphosyntactic Analyses
456
+ - Grammar: Phonological Contexts
457
+ - Other domains will receive wrapper support in v2.3+
458
+ - Direct operations still available for all domains
459
+
460
+ ### Deprecation Notices
461
+
462
+ None. All v2.1 API remains fully functional.
463
+
464
+ ---
465
+
466
+ ## [2.1.0] - Previous Release
467
+
468
+ See git history for previous changelog entries.
469
+
470
+ ---
471
+
472
+ ## How to Upgrade
473
+
474
+ ### From Earlier Versions to v2.3.0
475
+
476
+ No action required. Simply upgrade the package:
477
+
478
+ ```bash
479
+ pip install flexlibs2==2.3.0
480
+ ```
481
+
482
+ Existing code will continue to work unchanged. All v2.0, v2.1, and v2.2 APIs remain fully functional.
483
+
484
+ ### Using Wrapper Classes
485
+
486
+ To use the latest wrappers for additional domains:
487
+
488
+ ```python
489
+ from flexlibs2.wrappers import Allomorph, CompoundRule, AffixTemplate
490
+ from flexlibs2.collections import AllomorphCollection, CompoundRuleCollection
491
+
492
+ # Work with allomorphs transparently
493
+ allomorphs = project.Allomorph.GetAll()
494
+ for allomorph in allomorphs:
495
+ print(f"{allomorph.form}: {allomorph.gloss}")
496
+ ```
497
+
498
+ Existing code continues to work without modification.
499
+
500
+ ---
501
+
502
+ ## Future Roadmap
503
+
504
+ ### v2.4.0 (Planned)
505
+
506
+ - Performance optimizations for large collections
507
+ - Advanced query builder pattern
508
+ - Integration with FLEx import/export
509
+ - Extended wrapper support for remaining domains
510
+
511
+ ### v3.0.0 (Future)
512
+
513
+ - Complete wrapper coverage for all domains
514
+ - Potential breaking changes for major improvements
515
+ - Enhanced type safety with static typing
516
+
517
+ ---
518
+
519
+ ## Contributing
520
+
521
+ See CONTRIBUTING.md for guidelines on contributing to FlexLibs2.
522
+
523
+ ---
524
+
525
+ ## Version Support
526
+
527
+ - **v2.3.x**: Current stable release, actively maintained
528
+ - **v2.2.x**: Previous stable, maintenance only
529
+ - **v2.1.x**: Legacy, security fixes only
530
+ - **v2.0.x**: End of life
531
+ - **v1.x**: End of life
532
+