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.
- pyflexicon-4.1.0/CHANGELOG.md +532 -0
- pyflexicon-4.1.0/LICENSE.txt +472 -0
- pyflexicon-4.1.0/MANIFEST.in +8 -0
- pyflexicon-4.1.0/NOTICE +32 -0
- pyflexicon-4.1.0/PKG-INFO +205 -0
- pyflexicon-4.1.0/README.rst +178 -0
- pyflexicon-4.1.0/flexicon/__init__.py +253 -0
- pyflexicon-4.1.0/flexicon/__init__.pyi +32 -0
- pyflexicon-4.1.0/flexicon/code/BaseOperations.py +2226 -0
- pyflexicon-4.1.0/flexicon/code/BaseOperations.pyi +37 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartCellTagOperations.py +200 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartClauseMarkerOperations.py +447 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartMarkerOperations.py +317 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartMovedTextOperations.py +441 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartOperations.py +565 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartRowOperations.py +608 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/ConstChartWordGroupOperations.py +535 -0
- pyflexicon-4.1.0/flexicon/code/Discourse/__init__.py +1 -0
- pyflexicon-4.1.0/flexicon/code/FLExGlobals.py +166 -0
- pyflexicon-4.1.0/flexicon/code/FLExInit.py +82 -0
- pyflexicon-4.1.0/flexicon/code/FLExLCM.py +105 -0
- pyflexicon-4.1.0/flexicon/code/FLExProject.py +4423 -0
- pyflexicon-4.1.0/flexicon/code/FLExProject.pyi +191 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/AllomorphOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/EnvironmentOperations.py +790 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/EnvironmentOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/GramCatOperations.py +723 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/GramCatOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/InflectionFeatureOperations.py +1831 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/InflectionFeatureOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/MorphRuleOperations.py +989 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/MorphRuleOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/NaturalClassOperations.py +1150 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/NaturalClassOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/POSOperations.py +1245 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/POSOperations.pyi +28 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/PhonFeatureOperations.py +889 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/PhonemeOperations.py +1707 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/PhonemeOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/PhonologicalRuleOperations.py +1531 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/PhonologicalRuleOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/StratumOperations.py +362 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/__init__.py +24 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/adhoc_prohibition.py +290 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/affix_template.py +523 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/affix_template_collection.py +398 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/compound_rule.py +405 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/compound_rule_collection.py +244 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/phonological_rule.py +520 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/prohibition_collection.py +301 -0
- pyflexicon-4.1.0/flexicon/code/Grammar/rule_collection.py +288 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/AllomorphOperations.py +1169 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/EtymologyOperations.py +1275 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/EtymologyOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/ExampleOperations.py +1669 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/ExampleOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexEntryOperations.py +3203 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexEntryOperations.pyi +29 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexReferenceOperations.py +1459 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexReferenceOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexSenseOperations.py +3875 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/LexSenseOperations.pyi +29 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/MSAOperations.py +632 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/PronunciationOperations.py +1070 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/PronunciationOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/SemanticDomainOperations.py +1337 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/SemanticDomainOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/VariantOperations.py +1154 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/VariantOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/__init__.py +0 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/allomorph.py +409 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/allomorph_collection.py +255 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/morphosyntax_analysis.py +435 -0
- pyflexicon-4.1.0/flexicon/code/Lexicon/msa_collection.py +316 -0
- pyflexicon-4.1.0/flexicon/code/Lists/AgentOperations.py +827 -0
- pyflexicon-4.1.0/flexicon/code/Lists/AgentOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/ConfidenceOperations.py +282 -0
- pyflexicon-4.1.0/flexicon/code/Lists/ConfidenceOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/LocalizedListsOperations.py +334 -0
- pyflexicon-4.1.0/flexicon/code/Lists/OverlayOperations.py +560 -0
- pyflexicon-4.1.0/flexicon/code/Lists/OverlayOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/PossibilityListOperations.py +1548 -0
- pyflexicon-4.1.0/flexicon/code/Lists/PossibilityListOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/PublicationOperations.py +975 -0
- pyflexicon-4.1.0/flexicon/code/Lists/PublicationOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/TranslationTypeOperations.py +626 -0
- pyflexicon-4.1.0/flexicon/code/Lists/TranslationTypeOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Lists/__init__.py +0 -0
- pyflexicon-4.1.0/flexicon/code/Lists/possibility_item_base.py +490 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/AnthropologyOperations.py +2111 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/AnthropologyOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/DataNotebookOperations.py +2745 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/DataNotebookOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/LocationOperations.py +1709 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/LocationOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/NoteOperations.py +1055 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/NoteOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/PersonOperations.py +1581 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/PersonOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/__init__.py +0 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/annotation.py +554 -0
- pyflexicon-4.1.0/flexicon/code/Notebook/annotation_collection.py +579 -0
- pyflexicon-4.1.0/flexicon/code/PythonicWrapper.py +240 -0
- pyflexicon-4.1.0/flexicon/code/Reversal/ReversalIndexEntryOperations.py +628 -0
- pyflexicon-4.1.0/flexicon/code/Reversal/ReversalIndexOperations.py +520 -0
- pyflexicon-4.1.0/flexicon/code/Reversal/__init__.py +1 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrAnnotationsOperations.py +288 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrBookOperations.py +530 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrDraftOperations.py +417 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrNoteOperations.py +640 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrSectionOperations.py +525 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/ScrTxtParaOperations.py +536 -0
- pyflexicon-4.1.0/flexicon/code/Scripture/__init__.py +1 -0
- pyflexicon-4.1.0/flexicon/code/Shared/FilterOperations.py +1402 -0
- pyflexicon-4.1.0/flexicon/code/Shared/MediaOperations.py +1582 -0
- pyflexicon-4.1.0/flexicon/code/Shared/__init__.py +29 -0
- pyflexicon-4.1.0/flexicon/code/Shared/catalog.py +533 -0
- pyflexicon-4.1.0/flexicon/code/Shared/catalog_backed.py +776 -0
- pyflexicon-4.1.0/flexicon/code/Shared/lcm_constants.py +61 -0
- pyflexicon-4.1.0/flexicon/code/Shared/rule_patterns.py +98 -0
- pyflexicon-4.1.0/flexicon/code/Shared/smart_collection.py +316 -0
- pyflexicon-4.1.0/flexicon/code/Shared/string_utils.py +225 -0
- pyflexicon-4.1.0/flexicon/code/Shared/wrapper_base.py +227 -0
- pyflexicon-4.1.0/flexicon/code/System/AnnotationDefOperations.py +1252 -0
- pyflexicon-4.1.0/flexicon/code/System/AnnotationDefOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/System/CheckOperations.py +1470 -0
- pyflexicon-4.1.0/flexicon/code/System/CheckOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/System/CustomFieldOperations.py +1444 -0
- pyflexicon-4.1.0/flexicon/code/System/CustomFieldOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/System/ProjectSettingsOperations.py +1170 -0
- pyflexicon-4.1.0/flexicon/code/System/ProjectSettingsOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/System/WritingSystemOperations.py +1042 -0
- pyflexicon-4.1.0/flexicon/code/System/WritingSystemOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/System/__init__.py +0 -0
- pyflexicon-4.1.0/flexicon/code/System/context_collection.py +344 -0
- pyflexicon-4.1.0/flexicon/code/System/phonological_context.py +557 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/DiscourseOperations.py +1209 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/DiscourseOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/FilterOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/MediaOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/ParagraphOperations.py +740 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/ParagraphOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/SegmentOperations.py +1254 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/SegmentOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/TextOperations.py +1036 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/TextOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiAnalysisOperations.py +1492 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiAnalysisOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiGlossOperations.py +983 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiGlossOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiMorphBundleOperations.py +1334 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WfiMorphBundleOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WordformOperations.py +959 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/WordformOperations.pyi +22 -0
- pyflexicon-4.1.0/flexicon/code/TextsWords/__init__.py +0 -0
- pyflexicon-4.1.0/flexicon/code/__init__.py +7 -0
- pyflexicon-4.1.0/flexicon/code/__init__.pyi +27 -0
- pyflexicon-4.1.0/flexicon/code/_context_manager_base.py +57 -0
- pyflexicon-4.1.0/flexicon/code/exceptions.py +89 -0
- pyflexicon-4.1.0/flexicon/code/lcm_casting.py +889 -0
- pyflexicon-4.1.0/flexicon/code/transaction.py +193 -0
- pyflexicon-4.1.0/flexicon/code/undoable_operation.py +122 -0
- pyflexicon-4.1.0/flexicon/examples/demo_lexicon.py +102 -0
- pyflexicon-4.1.0/flexicon/examples/demo_openproject.py +95 -0
- pyflexicon-4.1.0/flexicon/examples/demo_pos_operations.py +98 -0
- pyflexicon-4.1.0/flexicon/examples/demo_writing_systems.py +183 -0
- pyflexicon-4.1.0/flexicon/py.typed +0 -0
- pyflexicon-4.1.0/flexicon/sync/__init__.py +84 -0
- pyflexicon-4.1.0/flexicon/sync/conflict_resolvers.py +263 -0
- pyflexicon-4.1.0/flexicon/sync/dependency_graph.py +396 -0
- pyflexicon-4.1.0/flexicon/sync/dependency_resolver.py +365 -0
- pyflexicon-4.1.0/flexicon/sync/diff.py +617 -0
- pyflexicon-4.1.0/flexicon/sync/engine.py +660 -0
- pyflexicon-4.1.0/flexicon/sync/export.py +96 -0
- pyflexicon-4.1.0/flexicon/sync/hierarchical_importer.py +463 -0
- pyflexicon-4.1.0/flexicon/sync/match_strategies.py +339 -0
- pyflexicon-4.1.0/flexicon/sync/merge_ops.py +477 -0
- pyflexicon-4.1.0/flexicon/sync/selective_import.py +352 -0
- pyflexicon-4.1.0/flexicon/sync/tests/__init__.py +6 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_base_operations.py +476 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_dependency_graph.py +443 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_diff_engine.py +330 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_duplicate_operations.py +2290 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_match_strategies.py +243 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_merge_ops.py +394 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_selective_import.py +719 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_sync_engine.py +533 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_sync_result.py +339 -0
- pyflexicon-4.1.0/flexicon/sync/tests/test_validation.py +478 -0
- pyflexicon-4.1.0/flexicon/sync/validation.py +448 -0
- pyflexicon-4.1.0/flexicon/tests/test_CustomFields.py +72 -0
- pyflexicon-4.1.0/flexicon/tests/test_FLExInit.py +38 -0
- pyflexicon-4.1.0/flexicon/tests/test_FLExProject.py +58 -0
- pyflexicon-4.1.0/flexlibs2/__init__.py +72 -0
- pyflexicon-4.1.0/pyflexicon.egg-info/PKG-INFO +205 -0
- pyflexicon-4.1.0/pyflexicon.egg-info/SOURCES.txt +234 -0
- pyflexicon-4.1.0/pyflexicon.egg-info/dependency_links.txt +1 -0
- pyflexicon-4.1.0/pyflexicon.egg-info/requires.txt +1 -0
- pyflexicon-4.1.0/pyflexicon.egg-info/top_level.txt +2 -0
- pyflexicon-4.1.0/pyproject.toml +50 -0
- pyflexicon-4.1.0/setup.cfg +4 -0
- pyflexicon-4.1.0/tests/test_affix_template_wrappers.py +651 -0
- pyflexicon-4.1.0/tests/test_allomorph_wrappers.py +389 -0
- pyflexicon-4.1.0/tests/test_annotation_wrappers.py +432 -0
- pyflexicon-4.1.0/tests/test_catalog.py +747 -0
- pyflexicon-4.1.0/tests/test_collections.py +703 -0
- pyflexicon-4.1.0/tests/test_compound_rule_wrappers.py +553 -0
- pyflexicon-4.1.0/tests/test_consolidation_coverage.py +345 -0
- pyflexicon-4.1.0/tests/test_context_wrappers.py +441 -0
- pyflexicon-4.1.0/tests/test_custom_field_create_refusal.py +142 -0
- pyflexicon-4.1.0/tests/test_exception_handling.py +389 -0
- pyflexicon-4.1.0/tests/test_fixtures.py +127 -0
- pyflexicon-4.1.0/tests/test_flexproject_discoverability.py +419 -0
- pyflexicon-4.1.0/tests/test_helpers.py +551 -0
- pyflexicon-4.1.0/tests/test_homographs.py +642 -0
- pyflexicon-4.1.0/tests/test_itsstring_fix.py +89 -0
- pyflexicon-4.1.0/tests/test_lcm_api_real.py +200 -0
- pyflexicon-4.1.0/tests/test_lcm_api_usage.py +291 -0
- pyflexicon-4.1.0/tests/test_lcm_direct.py +114 -0
- pyflexicon-4.1.0/tests/test_lcm_method_verification.py +340 -0
- pyflexicon-4.1.0/tests/test_msa_wrappers.py +484 -0
- pyflexicon-4.1.0/tests/test_normalize_match_key.py +181 -0
- pyflexicon-4.1.0/tests/test_normalize_ws_handle.py +94 -0
- pyflexicon-4.1.0/tests/test_operations_baseline.py +472 -0
- pyflexicon-4.1.0/tests/test_pattern_g_owner_of_class.py +252 -0
- pyflexicon-4.1.0/tests/test_pattern_writing_systems_enumeration.py +162 -0
- pyflexicon-4.1.0/tests/test_phoneme_duplicate_fix.py +90 -0
- pyflexicon-4.1.0/tests/test_phonological_rules_wrappers.py +355 -0
- pyflexicon-4.1.0/tests/test_prohibition_wrappers.py +622 -0
- pyflexicon-4.1.0/tests/test_rule_patterns.py +142 -0
- pyflexicon-4.1.0/tests/test_segment_baseline_text.py +319 -0
- pyflexicon-4.1.0/tests/test_sense_lookups.py +534 -0
- pyflexicon-4.1.0/tests/test_validation_base.py +494 -0
- pyflexicon-4.1.0/tests/test_wfianalysis_agent_import.py +25 -0
- pyflexicon-4.1.0/tests/test_wrappers.py +570 -0
- 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
|
+
|