ipakit 0.2.0__tar.gz → 0.4.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.
- ipakit-0.4.0/.github/workflows/ci.yml +297 -0
- ipakit-0.4.0/.github/workflows/publish.yml +68 -0
- ipakit-0.4.0/.pre-commit-config.yaml +64 -0
- ipakit-0.4.0/CHANGELOG.md +447 -0
- ipakit-0.4.0/MANIFEST.in +56 -0
- ipakit-0.4.0/Makefile +192 -0
- ipakit-0.4.0/PKG-INFO +399 -0
- ipakit-0.4.0/README.md +347 -0
- ipakit-0.4.0/conftest.py +56 -0
- ipakit-0.4.0/docs/README.md +124 -0
- ipakit-0.4.0/docs/articulatory-data.md +387 -0
- ipakit-0.4.0/docs/calculus.md +414 -0
- ipakit-0.4.0/docs/capabilities.md +235 -0
- ipakit-0.4.0/docs/cli-api-sync.md +75 -0
- ipakit-0.4.0/docs/clts-audit.md +212 -0
- ipakit-0.4.0/docs/clts-gaps.md +379 -0
- ipakit-0.4.0/docs/clts-import.md +99 -0
- ipakit-0.4.0/docs/clts-mapping.md +93 -0
- ipakit-0.4.0/docs/corpus-scaling-report.json +41 -0
- ipakit-0.4.0/docs/corpus.md +244 -0
- ipakit-0.4.0/docs/data/english-syllable-curation-2026-08-11.json +3071 -0
- ipakit-0.4.0/docs/design/README.md +10 -0
- ipakit-0.4.0/docs/design/archive/README.md +7 -0
- ipakit-0.4.0/docs/design/archive/ip-p1-store-approach.md +37 -0
- ipakit-0.4.0/docs/design/archive/piece1-canonical-store.md +118 -0
- ipakit-0.4.0/docs/design/braces.md +512 -0
- ipakit-0.4.0/docs/design/conlang.md +644 -0
- ipakit-0.4.0/docs/design/ecosystem.md +595 -0
- ipakit-0.4.0/docs/design/frontal-view.md +105 -0
- ipakit-0.4.0/docs/design/historical-linguistics.md +116 -0
- ipakit-0.4.0/docs/design/interop.md +798 -0
- ipakit-0.4.0/docs/design/mass-budget.md +95 -0
- ipakit-0.4.0/docs/design/residency-allowlist.json +10 -0
- ipakit-0.4.0/docs/design/samprosa.md +381 -0
- ipakit-0.4.0/docs/design/supplement-bridges.md +332 -0
- ipakit-0.4.0/docs/design/tiers.md +288 -0
- ipakit-0.4.0/docs/development-sources.md +127 -0
- ipakit-0.4.0/docs/distance.md +713 -0
- ipakit-0.4.0/docs/espeak-vocabularies.md +12 -0
- ipakit-0.4.0/docs/feature-transforms.md +169 -0
- ipakit-0.4.0/docs/figures/derived-from-boundaries.dot +876 -0
- ipakit-0.4.0/docs/figures/perhaps-i-am-a-bad-man.dot +442 -0
- ipakit-0.4.0/docs/figures/two-pane-timed.html +283 -0
- ipakit-0.4.0/docs/form.md +324 -0
- ipakit-0.4.0/docs/gestural-model.md +59 -0
- ipakit-0.4.0/docs/glossary.md +106 -0
- ipakit-0.4.0/docs/house-style-exhibits.md +74 -0
- ipakit-0.4.0/docs/house-style.md +161 -0
- ipakit-0.4.0/docs/inventories.md +361 -0
- ipakit-0.4.0/docs/inventories.src.md +69 -0
- ipakit-0.4.0/docs/inventory-operations.md +316 -0
- ipakit-0.4.0/docs/kana.md +133 -0
- ipakit-0.4.0/docs/model-operations.md +170 -0
- ipakit-0.4.0/docs/phoible.md +71 -0
- ipakit-0.4.0/docs/pinyin.md +170 -0
- ipakit-0.4.0/docs/releasing.md +166 -0
- ipakit-0.4.0/docs/representation.md +241 -0
- ipakit-0.4.0/docs/reviewing.md +197 -0
- ipakit-0.4.0/docs/rules.md +1124 -0
- ipakit-0.4.0/docs/similarity.md +186 -0
- ipakit-0.4.0/docs/source-receipts.md +61 -0
- ipakit-0.4.0/docs/state-of-the-work.md +89 -0
- ipakit-0.4.0/docs/supplements.md +186 -0
- ipakit-0.4.0/docs/syllabification.md +178 -0
- ipakit-0.4.0/docs/systems.md +73 -0
- ipakit-0.4.0/docs/tiergraph-acceptance.md +30 -0
- ipakit-0.4.0/docs/ties.md +183 -0
- ipakit-0.4.0/docs/tone.md +142 -0
- ipakit-0.4.0/docs/tract-anatomy.md +269 -0
- ipakit-0.4.0/docs/tract-figures.md +162 -0
- ipakit-0.4.0/docs/tract-reference.md +82 -0
- ipakit-0.4.0/docs/tutorial-basics.md +117 -0
- ipakit-0.4.0/docs/tutorial-basics.src.md +114 -0
- ipakit-0.4.0/docs/tutorial.md +1052 -0
- ipakit-0.4.0/docs/tutorial.src.md +890 -0
- ipakit-0.4.0/ipakit/__init__.py +1948 -0
- ipakit-0.4.0/ipakit/_base.py +153 -0
- ipakit-0.4.0/ipakit/_clts_import.py +600 -0
- ipakit-0.4.0/ipakit/_clts_input.py +139 -0
- ipakit-0.4.0/ipakit/_clts_profile.py +1155 -0
- ipakit-0.4.0/ipakit/_cmu_graph.py +186 -0
- ipakit-0.4.0/ipakit/_codecs.py +293 -0
- ipakit-0.4.0/ipakit/_containment_projection.py +1339 -0
- ipakit-0.4.0/ipakit/_convert.py +252 -0
- ipakit-0.4.0/ipakit/_corpus.py +746 -0
- ipakit-0.4.0/ipakit/_corpus_query.py +402 -0
- ipakit-0.4.0/ipakit/_fact_builder.py +564 -0
- ipakit-0.4.0/ipakit/_form_profile.py +1214 -0
- ipakit-0.4.0/ipakit/_gesture_backend.py +138 -0
- ipakit-0.4.0/ipakit/_gesture_graph.py +142 -0
- ipakit-0.4.0/ipakit/_graph_facts.py +315 -0
- ipakit-0.4.0/ipakit/_ipa_graph.py +244 -0
- ipakit-0.4.0/ipakit/_katakana_codec.py +18 -0
- ipakit-0.4.0/ipakit/_moraic.py +141 -0
- ipakit-0.4.0/ipakit/_pinyin_graph.py +185 -0
- ipakit-0.4.0/ipakit/_provenance.py +113 -0
- ipakit-0.4.0/ipakit/_rewrite_graph.py +398 -0
- ipakit-0.4.0/ipakit/_rule_model.py +384 -0
- ipakit-0.4.0/ipakit/_scalar_attribute.py +21 -0
- ipakit-0.4.0/ipakit/_source_receipt.py +230 -0
- ipakit-0.4.0/ipakit/_token_corpus.py +21 -0
- ipakit-0.4.0/ipakit/_warning_policy.py +56 -0
- ipakit-0.4.0/ipakit/align.py +275 -0
- ipakit-0.4.0/ipakit/analysis.py +1018 -0
- ipakit-0.4.0/ipakit/binary_cost.py +98 -0
- ipakit-0.4.0/ipakit/bridges/__init__.py +67 -0
- ipakit-0.4.0/ipakit/bridges/base.py +45 -0
- ipakit-0.4.0/ipakit/bridges/costmodel.py +835 -0
- ipakit-0.4.0/ipakit/bridges/espeak.py +39 -0
- ipakit-0.4.0/ipakit/bridges/kana.py +54 -0
- ipakit-0.4.0/ipakit/bridges/mfa.py +95 -0
- ipakit-0.4.0/ipakit/bridges/phoible.py +343 -0
- ipakit-0.4.0/ipakit/bridges/pinyin.py +175 -0
- ipakit-0.4.0/ipakit/bridges/vocabulary.py +610 -0
- ipakit-0.4.0/ipakit/cli/__init__.py +302 -0
- ipakit-0.4.0/ipakit/cli/analysis_cmds.py +338 -0
- ipakit-0.4.0/ipakit/cli/analyze.py +393 -0
- ipakit-0.4.0/ipakit/cli/base.py +453 -0
- ipakit-0.4.0/ipakit/cli/convert.py +804 -0
- ipakit-0.4.0/ipakit/cli/corpus.py +340 -0
- ipakit-0.4.0/ipakit/cli/distance.py +1298 -0
- ipakit-0.4.0/ipakit/cli/features.py +174 -0
- ipakit-0.4.0/ipakit/cli/graph_json.py +55 -0
- ipakit-0.4.0/ipakit/cli/hierarchy.py +191 -0
- ipakit-0.4.0/ipakit/cli/info.py +80 -0
- ipakit-0.4.0/ipakit/cli/inventory.py +194 -0
- ipakit-0.4.0/ipakit/cli/metrics.py +123 -0
- ipakit-0.4.0/ipakit/cli/model.py +390 -0
- ipakit-0.4.0/ipakit/cli/notebook.py +64 -0
- ipakit-0.4.0/ipakit/cli/phoible.py +116 -0
- ipakit-0.4.0/ipakit/cli/policy.py +109 -0
- ipakit-0.4.0/ipakit/cli/query.py +587 -0
- ipakit-0.4.0/ipakit/cli/rules.py +1189 -0
- ipakit-0.4.0/ipakit/cli/textgrid.py +144 -0
- ipakit-0.4.0/ipakit/cli/tract.py +181 -0
- ipakit-0.4.0/ipakit/clts.py +756 -0
- ipakit-0.4.0/ipakit/clts_mapping.py +838 -0
- ipakit-0.4.0/ipakit/data/bridges/kana/kana.xml +23 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/arabic.xml +81 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/bulgarian.xml +54 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/croatian.xml +73 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/czech.xml +56 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english.xml +104 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english_india.xml +73 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english_nigeria.xml +75 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english_nonnative.xml +100 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english_uk.xml +85 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/english_us.xml +86 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/french.xml +51 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/german.xml +60 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/hausa.xml +84 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/japanese.xml +91 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/korean.xml +113 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/korean_jamo.xml +64 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin.xml +127 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_china.xml +147 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_erhua.xml +127 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_taiwan.xml +138 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/mfa.xml +851 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/polish.xml +58 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese.xml +53 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese_brazil.xml +48 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese_portugal.xml +52 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/russian.xml +102 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/serbocroatian.xml +69 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/spanish.xml +43 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/spanish_latin_america.xml +51 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/spanish_spain.xml +52 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/swahili.xml +49 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/swedish.xml +111 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/tamil.xml +63 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/thai.xml +137 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/turkish.xml +77 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/ukrainian.xml +92 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese.xml +190 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_hanoi.xml +169 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_ho_chi_minh_city.xml +132 -0
- ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_hue.xml +144 -0
- ipakit-0.4.0/ipakit/data/bridges/pinyin/pinyin.xml +72 -0
- ipakit-0.4.0/ipakit/data/bridges/vocabulary.rng +98 -0
- ipakit-0.4.0/ipakit/data/clts/MAPPING-NOTICE.txt +30 -0
- ipakit-0.4.0/ipakit/data/clts/NOTICE.txt +29 -0
- ipakit-0.4.0/ipakit/data/clts/core.json +18215 -0
- ipakit-0.4.0/ipakit/data/clts/import-result.schema.json +208 -0
- ipakit-0.4.0/ipakit/data/clts/manifest.json +131 -0
- ipakit-0.4.0/ipakit/data/clts/semantic-mapping.json +13191 -0
- ipakit-0.4.0/ipakit/data/clts/semantic-rules.json +166 -0
- ipakit-0.4.0/ipakit/data/clts/source.json +75 -0
- ipakit-0.4.0/ipakit/data/confusion.json +1 -0
- ipakit-0.4.0/ipakit/data/feature-models/NOTICE.md +33 -0
- ipakit-0.4.0/ipakit/data/feature-models/PANPHON-LICENSE.txt +8 -0
- ipakit-0.4.0/ipakit/data/feature-models/panphon-receipt.json +40 -0
- ipakit-0.4.0/ipakit/data/feature-models/panphon.xml +6453 -0
- ipakit-0.4.0/ipakit/data/heads.rng +286 -0
- ipakit-0.4.0/ipakit/data/inventory-cards.rng +28 -0
- ipakit-0.4.0/ipakit/data/inventory-cards.xml +71 -0
- ipakit-0.4.0/ipakit/data/ipa.rng +392 -0
- ipakit-0.4.0/ipakit/data/ipa.xml +1038 -0
- ipakit-0.4.0/ipakit/data/mfa-curation.json +18 -0
- ipakit-0.4.0/ipakit/data/phoible/CC-BY-SA-3.0.txt +359 -0
- ipakit-0.4.0/ipakit/data/phoible/MIT-upstream.txt +22 -0
- ipakit-0.4.0/ipakit/data/phoible/NOTICE.txt +33 -0
- ipakit-0.4.0/ipakit/data/phoible/data/phoible-references.bib.gz +0 -0
- ipakit-0.4.0/ipakit/data/phoible/data/phoible.csv.gz +0 -0
- ipakit-0.4.0/ipakit/data/phoible/manifest.json +48 -0
- ipakit-0.4.0/ipakit/data/phonemaps/cmu.xml +99 -0
- ipakit-0.4.0/ipakit/data/phonemaps/phonemap.rng +97 -0
- ipakit-0.4.0/ipakit/data/phonemaps/timit.xml +96 -0
- ipakit-0.4.0/ipakit/data/phonemaps/xsampa.xml +182 -0
- ipakit-0.4.0/ipakit/data/rules/american-english.rules +420 -0
- ipakit-0.4.0/ipakit/data/rules/japanese-moraic.rules +341 -0
- ipakit-0.4.0/ipakit/data/syllables/japanese.xml +17 -0
- ipakit-0.4.0/ipakit/data/syllables/mandarin.xml +4 -0
- ipakit-0.4.0/ipakit/disagreement.py +344 -0
- ipakit-0.4.0/ipakit/distance.py +1742 -0
- ipakit-0.4.0/ipakit/distance_model.py +913 -0
- ipakit-0.4.0/ipakit/distance_registry.py +419 -0
- ipakit-0.4.0/ipakit/espeak_source.py +761 -0
- ipakit-0.4.0/ipakit/extraction/__init__.py +82 -0
- ipakit-0.4.0/ipakit/extraction/mfa.py +464 -0
- ipakit-0.4.0/ipakit/extraction/phoible.py +109 -0
- ipakit-0.4.0/ipakit/feature_experiment.py +146 -0
- ipakit-0.4.0/ipakit/feature_models.py +36 -0
- ipakit-0.4.0/ipakit/feature_sets.py +81 -0
- ipakit-0.4.0/ipakit/feature_transform.py +339 -0
- ipakit-0.4.0/ipakit/features.py +4630 -0
- ipakit-0.4.0/ipakit/finite_declaration.py +230 -0
- ipakit-0.4.0/ipakit/finite_model.py +230 -0
- ipakit-0.4.0/ipakit/form.py +2552 -0
- ipakit-0.4.0/ipakit/graph_json.py +17 -0
- ipakit-0.4.0/ipakit/hierarchy.py +139 -0
- ipakit-0.4.0/ipakit/inventories.py +719 -0
- ipakit-0.4.0/ipakit/inventory_operations.py +224 -0
- ipakit-0.4.0/ipakit/metric.py +1082 -0
- ipakit-0.4.0/ipakit/model_graph.py +475 -0
- ipakit-0.4.0/ipakit/models.py +535 -0
- ipakit-0.4.0/ipakit/notebooks/ipakit-tutorial.ipynb +1680 -0
- ipakit-0.4.0/ipakit/panphon_source.py +113 -0
- ipakit-0.4.0/ipakit/phoible_source.py +193 -0
- ipakit-0.4.0/ipakit/phoneset_map.py +601 -0
- ipakit-0.4.0/ipakit/rules.py +4681 -0
- ipakit-0.4.0/ipakit/segment.py +1241 -0
- ipakit-0.4.0/ipakit/syllable.py +693 -0
- ipakit-0.4.0/ipakit/tiergraph_dot.py +215 -0
- ipakit-0.4.0/ipakit/tract.py +2677 -0
- ipakit-0.4.0/ipakit/tract_svg.py +2424 -0
- ipakit-0.4.0/ipakit.egg-info/PKG-INFO +399 -0
- ipakit-0.4.0/ipakit.egg-info/SOURCES.txt +621 -0
- ipakit-0.4.0/ipakit.egg-info/requires.txt +33 -0
- ipakit-0.4.0/pyproject.toml +207 -0
- ipakit-0.4.0/scripts/_comparison_order.py +28 -0
- ipakit-0.4.0/scripts/areafunctions.py +2233 -0
- ipakit-0.4.0/scripts/clts_import_fixtures.py +81 -0
- ipakit-0.4.0/scripts/clts_manifest.py +24 -0
- ipakit-0.4.0/scripts/clts_profile_example.py +62 -0
- ipakit-0.4.0/scripts/compare_inventories.py +419 -0
- ipakit-0.4.0/scripts/consolidation_parity.py +110 -0
- ipakit-0.4.0/scripts/consolidation_parity.sha256 +1 -0
- ipakit-0.4.0/scripts/containment_oracle.py +709 -0
- ipakit-0.4.0/scripts/costmodel_compare.py +288 -0
- ipakit-0.4.0/scripts/dev_sources.py +335 -0
- ipakit-0.4.0/scripts/docexamples.py +314 -0
- ipakit-0.4.0/scripts/espeak_vocabularies.py +654 -0
- ipakit-0.4.0/scripts/geometry.py +173 -0
- ipakit-0.4.0/scripts/interop.py +1741 -0
- ipakit-0.4.0/scripts/invariants.py +1286 -0
- ipakit-0.4.0/scripts/inventory_cards.py +464 -0
- ipakit-0.4.0/scripts/mfa_vocabularies.py +80 -0
- ipakit-0.4.0/scripts/panphon_geometry.py +374 -0
- ipakit-0.4.0/scripts/perceptual_validation.py +183 -0
- ipakit-0.4.0/scripts/piece1_oracle.py +369 -0
- ipakit-0.4.0/scripts/state_of_work.py +172 -0
- ipakit-0.4.0/scripts/sweep.py +420 -0
- ipakit-0.4.0/scripts/tiergraph_capture.py +656 -0
- ipakit-0.4.0/scripts/timit_map.py +240 -0
- ipakit-0.4.0/scripts/xsampa_table.py +279 -0
- ipakit-0.4.0/tests/ANIMATION_LIMITS.md +23 -0
- ipakit-0.4.0/tests/data/form_operation_classification.json +191 -0
- ipakit-0.4.0/tests/fixtures/alignment/README.md +17 -0
- ipakit-0.4.0/tests/fixtures/alignment/hello-world.json +35 -0
- ipakit-0.4.0/tests/fixtures/alignment/hello-world.wav +0 -0
- ipakit-0.4.0/tests/fixtures/animation_sha256.json +4 -0
- ipakit-0.4.0/tests/fixtures/clts_import/complete.json +1 -0
- ipakit-0.4.0/tests/fixtures/clts_import/empty.json +1 -0
- ipakit-0.4.0/tests/fixtures/clts_import/error.json +1 -0
- ipakit-0.4.0/tests/fixtures/clts_import/preserved.json +1 -0
- ipakit-0.4.0/tests/fixtures/clts_import/refused.json +1 -0
- ipakit-0.4.0/tests/fixtures/cmudict_excerpt.dict +106 -0
- ipakit-0.4.0/tests/fixtures/epiglottal_constriction.json +6 -0
- ipakit-0.4.0/tests/fixtures/espeak_cmn_1_52_0.txt +6 -0
- ipakit-0.4.0/tests/fixtures/espeak_en_1_52_0.txt +7 -0
- ipakit-0.4.0/tests/fixtures/ipa_dict_en_US.txt +7 -0
- ipakit-0.4.0/tests/fixtures/mfa_english_us_v3_1_0.dict +28 -0
- ipakit-0.4.0/tests/fixtures/phoible/README.md +15 -0
- ipakit-0.4.0/tests/fixtures/phoible/data/phoible.csv +4 -0
- ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-Bibtex.csv +3 -0
- ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-LanguageCodes.csv +3 -0
- ipakit-0.4.0/tests/fixtures/posture_golden.json +142 -0
- ipakit-0.4.0/tests/fixtures/reference_landmark_distances.json +20 -0
- ipakit-0.4.0/tests/fixtures/textgrid/cmudict.TextGrid +36 -0
- ipakit-0.4.0/tests/fixtures/textgrid/cmudict_stress.TextGrid +36 -0
- ipakit-0.4.0/tests/fixtures/textgrid/mfa_two_words.TextGrid +60 -0
- ipakit-0.4.0/tests/fixtures/textgrid/mfa_untied.TextGrid +36 -0
- ipakit-0.4.0/tests/fixtures/textgrid/prosody_hello.TextGrid +95 -0
- ipakit-0.4.0/tests/fixtures/velic_contrast.json +5 -0
- ipakit-0.4.0/tests/fixtures/xrmb_anchor_prompts.json +18 -0
- ipakit-0.4.0/tests/license-classes.json +168 -0
- ipakit-0.4.0/tests/panphon/panphon.rng +83 -0
- ipakit-0.4.0/tests/panphon/shared-corpus.txt +14 -0
- ipakit-0.4.0/tests/test_agreement.py +560 -0
- ipakit-0.4.0/tests/test_analysis.py +485 -0
- ipakit-0.4.0/tests/test_api.py +162 -0
- ipakit-0.4.0/tests/test_api_contracts.py +175 -0
- ipakit-0.4.0/tests/test_bilabial_nasal_release.py +64 -0
- ipakit-0.4.0/tests/test_boundary_distance.py +201 -0
- ipakit-0.4.0/tests/test_bridges.py +385 -0
- ipakit-0.4.0/tests/test_ci_contract.py +371 -0
- ipakit-0.4.0/tests/test_cli.py +2217 -0
- ipakit-0.4.0/tests/test_cli_distance_registry.py +80 -0
- ipakit-0.4.0/tests/test_cli_hygiene.py +922 -0
- ipakit-0.4.0/tests/test_cli_model.py +284 -0
- ipakit-0.4.0/tests/test_cli_model_query.py +72 -0
- ipakit-0.4.0/tests/test_cli_model_rules.py +487 -0
- ipakit-0.4.0/tests/test_cli_model_transform_compare.py +170 -0
- ipakit-0.4.0/tests/test_cli_version.py +17 -0
- ipakit-0.4.0/tests/test_clts_audit.py +300 -0
- ipakit-0.4.0/tests/test_clts_import.py +911 -0
- ipakit-0.4.0/tests/test_clts_import_schema.py +123 -0
- ipakit-0.4.0/tests/test_clts_input.py +172 -0
- ipakit-0.4.0/tests/test_clts_manifest.py +307 -0
- ipakit-0.4.0/tests/test_clts_mapping.py +1191 -0
- ipakit-0.4.0/tests/test_clts_packaging.py +128 -0
- ipakit-0.4.0/tests/test_clts_snapshot.py +390 -0
- ipakit-0.4.0/tests/test_coherent_composition.py +707 -0
- ipakit-0.4.0/tests/test_comparison_example.py +73 -0
- ipakit-0.4.0/tests/test_confusion.py +75 -0
- ipakit-0.4.0/tests/test_constriction_location.py +815 -0
- ipakit-0.4.0/tests/test_corpus_kernel.py +317 -0
- ipakit-0.4.0/tests/test_corpus_query.py +153 -0
- ipakit-0.4.0/tests/test_costmodel.py +464 -0
- ipakit-0.4.0/tests/test_costmodel_accumulation.py +86 -0
- ipakit-0.4.0/tests/test_costmodel_admission.py +69 -0
- ipakit-0.4.0/tests/test_costmodel_normalization.py +77 -0
- ipakit-0.4.0/tests/test_declared_not_hardcoded.py +1216 -0
- ipakit-0.4.0/tests/test_denominator.py +129 -0
- ipakit-0.4.0/tests/test_descriptions.py +77 -0
- ipakit-0.4.0/tests/test_dev_sources.py +484 -0
- ipakit-0.4.0/tests/test_distance.py +586 -0
- ipakit-0.4.0/tests/test_distance_model.py +828 -0
- ipakit-0.4.0/tests/test_distance_registry.py +300 -0
- ipakit-0.4.0/tests/test_distinctive_difference.py +102 -0
- ipakit-0.4.0/tests/test_espeak_generator.py +120 -0
- ipakit-0.4.0/tests/test_extraction.py +43 -0
- ipakit-0.4.0/tests/test_feature_experiment.py +349 -0
- ipakit-0.4.0/tests/test_feature_models.py +47 -0
- ipakit-0.4.0/tests/test_feature_reads.py +143 -0
- ipakit-0.4.0/tests/test_feature_realization.py +297 -0
- ipakit-0.4.0/tests/test_feature_transform.py +321 -0
- ipakit-0.4.0/tests/test_features.py +207 -0
- ipakit-0.4.0/tests/test_features_narrowing.py +738 -0
- ipakit-0.4.0/tests/test_finite_model.py +344 -0
- ipakit-0.4.0/tests/test_form.py +1033 -0
- ipakit-0.4.0/tests/test_form_native_profile.py +655 -0
- ipakit-0.4.0/tests/test_form_operation_classification.py +174 -0
- ipakit-0.4.0/tests/test_form_reader_admission.py +134 -0
- ipakit-0.4.0/tests/test_geometry_doc.py +50 -0
- ipakit-0.4.0/tests/test_indel_costs.py +679 -0
- ipakit-0.4.0/tests/test_inventories.py +820 -0
- ipakit-0.4.0/tests/test_inventory_cards.py +62 -0
- ipakit-0.4.0/tests/test_inventory_operations.py +210 -0
- ipakit-0.4.0/tests/test_japanese_mora_regressions.py +150 -0
- ipakit-0.4.0/tests/test_kana_provenance.py +45 -0
- ipakit-0.4.0/tests/test_library_hygiene.py +458 -0
- ipakit-0.4.0/tests/test_license.py +88 -0
- ipakit-0.4.0/tests/test_license_classes.py +457 -0
- ipakit-0.4.0/tests/test_ligature_aliases.py +481 -0
- ipakit-0.4.0/tests/test_linking_and_agreement.py +84 -0
- ipakit-0.4.0/tests/test_metric.py +1200 -0
- ipakit-0.4.0/tests/test_mfa_vocabularies.py +135 -0
- ipakit-0.4.0/tests/test_model_graph.py +333 -0
- ipakit-0.4.0/tests/test_model_rules.py +463 -0
- ipakit-0.4.0/tests/test_models.py +175 -0
- ipakit-0.4.0/tests/test_nearest_pronunciation.py +113 -0
- ipakit-0.4.0/tests/test_nonfinal_modifiers.py +273 -0
- ipakit-0.4.0/tests/test_one_composition.py +470 -0
- ipakit-0.4.0/tests/test_overlong.py +50 -0
- ipakit-0.4.0/tests/test_packaging.py +749 -0
- ipakit-0.4.0/tests/test_panphon_geometry.py +113 -0
- ipakit-0.4.0/tests/test_panphon_live_geometry.py +132 -0
- ipakit-0.4.0/tests/test_panphon_receipt.py +110 -0
- ipakit-0.4.0/tests/test_phoible.py +128 -0
- ipakit-0.4.0/tests/test_phoible_packaging.py +95 -0
- ipakit-0.4.0/tests/test_phoible_receipt.py +128 -0
- ipakit-0.4.0/tests/test_phoible_source.py +185 -0
- ipakit-0.4.0/tests/test_phoneset_comparison.py +206 -0
- ipakit-0.4.0/tests/test_posture_no_side_channel.py +199 -0
- ipakit-0.4.0/tests/test_projection_coherence.py +277 -0
- ipakit-0.4.0/tests/test_prosodic_riders.py +132 -0
- ipakit-0.4.0/tests/test_query.py +1113 -0
- ipakit-0.4.0/tests/test_query_dsl.py +174 -0
- ipakit-0.4.0/tests/test_redundant_marks.py +80 -0
- ipakit-0.4.0/tests/test_rule_sets.py +2303 -0
- ipakit-0.4.0/tests/test_rules.py +2994 -0
- ipakit-0.4.0/tests/test_scalar_reads.py +117 -0
- ipakit-0.4.0/tests/test_schema.py +848 -0
- ipakit-0.4.0/tests/test_search.py +277 -0
- ipakit-0.4.0/tests/test_sequence_scoring.py +188 -0
- ipakit-0.4.0/tests/test_superscript_releases.py +81 -0
- ipakit-0.4.0/tests/test_supplements.py +716 -0
- ipakit-0.4.0/tests/test_syllable_docs.py +42 -0
- ipakit-0.4.0/tests/test_syllable_japanese.py +82 -0
- ipakit-0.4.0/tests/test_tap_duration.py +327 -0
- ipakit-0.4.0/tests/test_textgrid.py +485 -0
- ipakit-0.4.0/tests/test_tie_sense.py +384 -0
- ipakit-0.4.0/tests/test_tiergraph_acceptance_docs.py +53 -0
- ipakit-0.4.0/tests/test_tiers.py +210 -0
- ipakit-0.4.0/tests/test_timit_map.py +66 -0
- ipakit-0.4.0/tests/test_tokenization.py +571 -0
- ipakit-0.4.0/tests/test_tone_contours.py +399 -0
- ipakit-0.4.0/tests/test_tract_figures.py +2331 -0
- ipakit-0.4.0/tests/test_transcription_distance.py +117 -0
- ipakit-0.4.0/tests/test_unicode_recomposition.py +101 -0
- ipakit-0.4.0/tests/test_unplaced_marks.py +344 -0
- ipakit-0.4.0/tests/test_unspelled_anchor.py +64 -0
- ipakit-0.4.0/tests/test_variable_width.py +228 -0
- ipakit-0.4.0/tests/test_vowel_tract_limit.py +407 -0
- ipakit-0.4.0/tests/test_xsampa.py +780 -0
- ipakit-0.4.0/tests/test_zero.py +818 -0
- ipakit-0.4.0/tests/tiergraph/baselines/MANIFEST.sha256 +13 -0
- ipakit-0.4.0/tests/tiergraph/baselines/README.md +15 -0
- ipakit-0.4.0/tests/tiergraph/baselines/capture-metadata.json +12 -0
- ipakit-0.4.0/tests/tiergraph/baselines/containment-navigation.json +12416 -0
- ipakit-0.4.0/tests/tiergraph/baselines/coordinates.json +1043 -0
- ipakit-0.4.0/tests/tiergraph/baselines/derived-artifacts.json +119 -0
- ipakit-0.4.0/tests/tiergraph/baselines/distance-alignments.json +820 -0
- ipakit-0.4.0/tests/tiergraph/baselines/perturbation-proof.json +23 -0
- ipakit-0.4.0/tests/tiergraph/baselines/piece1-canonical-store.json +248 -0
- ipakit-0.4.0/tests/tiergraph/choice_selection_v1.json +421 -0
- ipakit-0.4.0/tests/tiergraph/cmudict/pocketsphinx.tsv +4 -0
- ipakit-0.4.0/tests/tiergraph/cmudict/upstream.json +7 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/choices_and_containment.json +14 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/clock_and_ordering.json +10 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/clts_core_bipa_profile.json +2106 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/duration_and_relation_endpoints.json +17 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/endpoints.json +13 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/hot_bridge_projection.json +2931 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/index.json +1 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/prosodic_deliveries.json +11 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/signature_edits.json +9 -0
- ipakit-0.4.0/tests/tiergraph/fixtures/unit_coordinates.json +10 -0
- ipakit-0.4.0/tests/tiergraph/structured_segment_v3.json +39 -0
- ipakit-0.4.0/tests/tiergraph/test_clts_profile.py +996 -0
- ipakit-0.4.0/tests/tiergraph/test_codecs.py +184 -0
- ipakit-0.4.0/tests/tiergraph/test_declared_values.py +529 -0
- ipakit-0.4.0/tests/tiergraph/test_dot.py +262 -0
- ipakit-0.4.0/tests/tiergraph/test_fixture_wellformedness.py +158 -0
- ipakit-0.4.0/tests/tiergraph/test_form_store.py +456 -0
- ipakit-0.4.0/tests/tiergraph/test_gesture_integration.py +167 -0
- ipakit-0.4.0/tests/tiergraph/test_ipa_graph.py +164 -0
- ipakit-0.4.0/tests/tiergraph/test_lane_m_stabilization.py +153 -0
- ipakit-0.4.0/tests/tiergraph/test_piece1_oracle.py +40 -0
- ipakit-0.4.0/tests/tiergraph/test_pinyin_correctness.py +244 -0
- ipakit-0.4.0/tests/tiergraph/test_rewrite_bridge.py +412 -0
- ipakit-0.4.0/tests/tiergraph/test_scalar_attribute.py +19 -0
- ipakit-0.2.0/CHANGELOG.md +0 -328
- ipakit-0.2.0/MANIFEST.in +0 -42
- ipakit-0.2.0/Makefile +0 -169
- ipakit-0.2.0/PKG-INFO +0 -367
- ipakit-0.2.0/README.md +0 -323
- ipakit-0.2.0/conftest.py +0 -32
- ipakit-0.2.0/docs/README.md +0 -107
- ipakit-0.2.0/docs/articulatory-data.md +0 -342
- ipakit-0.2.0/docs/calculus.md +0 -411
- ipakit-0.2.0/docs/cli-api-sync.md +0 -44
- ipakit-0.2.0/docs/corpus.md +0 -228
- ipakit-0.2.0/docs/design/braces.md +0 -512
- ipakit-0.2.0/docs/design/conlang.md +0 -644
- ipakit-0.2.0/docs/design/ecosystem.md +0 -613
- ipakit-0.2.0/docs/design/frontal-view.md +0 -100
- ipakit-0.2.0/docs/design/historical-linguistics.md +0 -109
- ipakit-0.2.0/docs/design/interop.md +0 -783
- ipakit-0.2.0/docs/design/ip-p1-store-approach.md +0 -37
- ipakit-0.2.0/docs/design/mass-budget.md +0 -85
- ipakit-0.2.0/docs/design/piece1-canonical-store.md +0 -118
- ipakit-0.2.0/docs/design/samprosa.md +0 -380
- ipakit-0.2.0/docs/design/supplement-bridges.md +0 -309
- ipakit-0.2.0/docs/design/tiers.md +0 -273
- ipakit-0.2.0/docs/distance.md +0 -567
- ipakit-0.2.0/docs/espeak-vocabularies.md +0 -12
- ipakit-0.2.0/docs/form.md +0 -312
- ipakit-0.2.0/docs/gestural-model.md +0 -59
- ipakit-0.2.0/docs/glossary.md +0 -86
- ipakit-0.2.0/docs/house-style-exhibits.md +0 -74
- ipakit-0.2.0/docs/house-style.md +0 -111
- ipakit-0.2.0/docs/inventories.md +0 -37
- ipakit-0.2.0/docs/releasing.md +0 -126
- ipakit-0.2.0/docs/representation.md +0 -113
- ipakit-0.2.0/docs/reviewing.md +0 -159
- ipakit-0.2.0/docs/rules.md +0 -919
- ipakit-0.2.0/docs/similarity.md +0 -147
- ipakit-0.2.0/docs/state-of-the-work.md +0 -89
- ipakit-0.2.0/docs/supplements.md +0 -186
- ipakit-0.2.0/docs/syllabification.md +0 -130
- ipakit-0.2.0/docs/tiergraph-acceptance.md +0 -30
- ipakit-0.2.0/docs/ties.md +0 -156
- ipakit-0.2.0/docs/tone.md +0 -142
- ipakit-0.2.0/docs/tract-anatomy.md +0 -235
- ipakit-0.2.0/docs/tract-figures.md +0 -152
- ipakit-0.2.0/docs/tract-reference.md +0 -68
- ipakit-0.2.0/docs/tutorial-basics.md +0 -117
- ipakit-0.2.0/docs/tutorial-basics.src.md +0 -114
- ipakit-0.2.0/docs/tutorial.md +0 -1011
- ipakit-0.2.0/docs/tutorial.src.md +0 -849
- ipakit-0.2.0/ipakit/__init__.py +0 -1901
- ipakit-0.2.0/ipakit/_base.py +0 -145
- ipakit-0.2.0/ipakit/_cmu_graph.py +0 -184
- ipakit-0.2.0/ipakit/_codecs.py +0 -289
- ipakit-0.2.0/ipakit/_containment_projection.py +0 -1134
- ipakit-0.2.0/ipakit/_convert.py +0 -248
- ipakit-0.2.0/ipakit/_corpus.py +0 -740
- ipakit-0.2.0/ipakit/_corpus_query.py +0 -420
- ipakit-0.2.0/ipakit/_fact_builder.py +0 -564
- ipakit-0.2.0/ipakit/_gesture_backend.py +0 -136
- ipakit-0.2.0/ipakit/_gesture_graph.py +0 -142
- ipakit-0.2.0/ipakit/_graph_facts.py +0 -274
- ipakit-0.2.0/ipakit/_ipa_graph.py +0 -244
- ipakit-0.2.0/ipakit/_katakana_codec.py +0 -17
- ipakit-0.2.0/ipakit/_pinyin_graph.py +0 -185
- ipakit-0.2.0/ipakit/_rewrite_graph.py +0 -382
- ipakit-0.2.0/ipakit/align.py +0 -275
- ipakit-0.2.0/ipakit/analysis.py +0 -934
- ipakit-0.2.0/ipakit/bridges/__init__.py +0 -67
- ipakit-0.2.0/ipakit/bridges/base.py +0 -42
- ipakit-0.2.0/ipakit/bridges/costmodel.py +0 -743
- ipakit-0.2.0/ipakit/bridges/espeak.py +0 -25
- ipakit-0.2.0/ipakit/bridges/kana.py +0 -53
- ipakit-0.2.0/ipakit/bridges/mfa.py +0 -84
- ipakit-0.2.0/ipakit/bridges/phoible.py +0 -299
- ipakit-0.2.0/ipakit/bridges/pinyin.py +0 -113
- ipakit-0.2.0/ipakit/bridges/vocabulary.py +0 -610
- ipakit-0.2.0/ipakit/cli/__init__.py +0 -242
- ipakit-0.2.0/ipakit/cli/analysis_cmds.py +0 -334
- ipakit-0.2.0/ipakit/cli/analyze.py +0 -381
- ipakit-0.2.0/ipakit/cli/base.py +0 -415
- ipakit-0.2.0/ipakit/cli/convert.py +0 -754
- ipakit-0.2.0/ipakit/cli/corpus.py +0 -334
- ipakit-0.2.0/ipakit/cli/distance.py +0 -1199
- ipakit-0.2.0/ipakit/cli/features.py +0 -174
- ipakit-0.2.0/ipakit/cli/hierarchy.py +0 -188
- ipakit-0.2.0/ipakit/cli/info.py +0 -79
- ipakit-0.2.0/ipakit/cli/inventory.py +0 -156
- ipakit-0.2.0/ipakit/cli/notebook.py +0 -63
- ipakit-0.2.0/ipakit/cli/phoible.py +0 -113
- ipakit-0.2.0/ipakit/cli/policy.py +0 -128
- ipakit-0.2.0/ipakit/cli/query.py +0 -581
- ipakit-0.2.0/ipakit/cli/rules.py +0 -1038
- ipakit-0.2.0/ipakit/cli/textgrid.py +0 -137
- ipakit-0.2.0/ipakit/cli/tract.py +0 -173
- ipakit-0.2.0/ipakit/data/bridges/espeak/af.xml +0 -181
- ipakit-0.2.0/ipakit/data/bridges/espeak/am.xml +0 -133
- ipakit-0.2.0/ipakit/data/bridges/espeak/an.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/ar.xml +0 -136
- ipakit-0.2.0/ipakit/data/bridges/espeak/as.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/az.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/ba.xml +0 -147
- ipakit-0.2.0/ipakit/data/bridges/espeak/be.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/bg.xml +0 -149
- ipakit-0.2.0/ipakit/data/bridges/espeak/bn.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/bpy.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/ca-ba.xml +0 -172
- ipakit-0.2.0/ipakit/data/bridges/espeak/ca-nw.xml +0 -172
- ipakit-0.2.0/ipakit/data/bridges/espeak/ca-va.xml +0 -172
- ipakit-0.2.0/ipakit/data/bridges/espeak/ca.xml +0 -172
- ipakit-0.2.0/ipakit/data/bridges/espeak/chr.xml +0 -192
- ipakit-0.2.0/ipakit/data/bridges/espeak/cmn.xml +0 -203
- ipakit-0.2.0/ipakit/data/bridges/espeak/cs.xml +0 -170
- ipakit-0.2.0/ipakit/data/bridges/espeak/cv.xml +0 -168
- ipakit-0.2.0/ipakit/data/bridges/espeak/cy.xml +0 -173
- ipakit-0.2.0/ipakit/data/bridges/espeak/da.xml +0 -181
- ipakit-0.2.0/ipakit/data/bridges/espeak/de.xml +0 -181
- ipakit-0.2.0/ipakit/data/bridges/espeak/el.xml +0 -157
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-n.xml +0 -230
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-rp.xml +0 -230
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-sc.xml +0 -232
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-us-nyc.xml +0 -229
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-us.xml +0 -229
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-wi.xml +0 -230
- ipakit-0.2.0/ipakit/data/bridges/espeak/en-wm.xml +0 -230
- ipakit-0.2.0/ipakit/data/bridges/espeak/en.xml +0 -70
- ipakit-0.2.0/ipakit/data/bridges/espeak/eo.xml +0 -140
- ipakit-0.2.0/ipakit/data/bridges/espeak/es-la.xml +0 -161
- ipakit-0.2.0/ipakit/data/bridges/espeak/es.xml +0 -161
- ipakit-0.2.0/ipakit/data/bridges/espeak/et.xml +0 -166
- ipakit-0.2.0/ipakit/data/bridges/espeak/eu.xml +0 -162
- ipakit-0.2.0/ipakit/data/bridges/espeak/fa.xml +0 -133
- ipakit-0.2.0/ipakit/data/bridges/espeak/fi.xml +0 -178
- ipakit-0.2.0/ipakit/data/bridges/espeak/fo.xml +0 -193
- ipakit-0.2.0/ipakit/data/bridges/espeak/fr.xml +0 -177
- ipakit-0.2.0/ipakit/data/bridges/espeak/ga.xml +0 -171
- ipakit-0.2.0/ipakit/data/bridges/espeak/gd.xml +0 -176
- ipakit-0.2.0/ipakit/data/bridges/espeak/gn.xml +0 -141
- ipakit-0.2.0/ipakit/data/bridges/espeak/grc.xml +0 -165
- ipakit-0.2.0/ipakit/data/bridges/espeak/gu.xml +0 -192
- ipakit-0.2.0/ipakit/data/bridges/espeak/hak.xml +0 -167
- ipakit-0.2.0/ipakit/data/bridges/espeak/haw.xml +0 -148
- ipakit-0.2.0/ipakit/data/bridges/espeak/he.xml +0 -127
- ipakit-0.2.0/ipakit/data/bridges/espeak/hi.xml +0 -188
- ipakit-0.2.0/ipakit/data/bridges/espeak/hr.xml +0 -179
- ipakit-0.2.0/ipakit/data/bridges/espeak/ht.xml +0 -177
- ipakit-0.2.0/ipakit/data/bridges/espeak/hu.xml +0 -146
- ipakit-0.2.0/ipakit/data/bridges/espeak/hy.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/ia.xml +0 -140
- ipakit-0.2.0/ipakit/data/bridges/espeak/id.xml +0 -163
- ipakit-0.2.0/ipakit/data/bridges/espeak/is.xml +0 -171
- ipakit-0.2.0/ipakit/data/bridges/espeak/it.xml +0 -176
- ipakit-0.2.0/ipakit/data/bridges/espeak/ja.xml +0 -138
- ipakit-0.2.0/ipakit/data/bridges/espeak/jbo.xml +0 -140
- ipakit-0.2.0/ipakit/data/bridges/espeak/ka.xml +0 -134
- ipakit-0.2.0/ipakit/data/bridges/espeak/kaa.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/kk.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/kl.xml +0 -145
- ipakit-0.2.0/ipakit/data/bridges/espeak/kn.xml +0 -188
- ipakit-0.2.0/ipakit/data/bridges/espeak/ko.xml +0 -140
- ipakit-0.2.0/ipakit/data/bridges/espeak/kok.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/ku.xml +0 -166
- ipakit-0.2.0/ipakit/data/bridges/espeak/ky.xml +0 -136
- ipakit-0.2.0/ipakit/data/bridges/espeak/la.xml +0 -154
- ipakit-0.2.0/ipakit/data/bridges/espeak/lb.xml +0 -171
- ipakit-0.2.0/ipakit/data/bridges/espeak/lt.xml +0 -179
- ipakit-0.2.0/ipakit/data/bridges/espeak/lv.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/mi.xml +0 -163
- ipakit-0.2.0/ipakit/data/bridges/espeak/mk.xml +0 -180
- ipakit-0.2.0/ipakit/data/bridges/espeak/ml.xml +0 -193
- ipakit-0.2.0/ipakit/data/bridges/espeak/mr.xml +0 -192
- ipakit-0.2.0/ipakit/data/bridges/espeak/ms.xml +0 -163
- ipakit-0.2.0/ipakit/data/bridges/espeak/mt.xml +0 -167
- ipakit-0.2.0/ipakit/data/bridges/espeak/mto.xml +0 -170
- ipakit-0.2.0/ipakit/data/bridges/espeak/my.xml +0 -246
- ipakit-0.2.0/ipakit/data/bridges/espeak/nci.xml +0 -157
- ipakit-0.2.0/ipakit/data/bridges/espeak/ne.xml +0 -204
- ipakit-0.2.0/ipakit/data/bridges/espeak/nl.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/no.xml +0 -168
- ipakit-0.2.0/ipakit/data/bridges/espeak/nog.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/nso.xml +0 -133
- ipakit-0.2.0/ipakit/data/bridges/espeak/om.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/or.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/pa.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/piqd.xml +0 -176
- ipakit-0.2.0/ipakit/data/bridges/espeak/pl.xml +0 -147
- ipakit-0.2.0/ipakit/data/bridges/espeak/prs.xml +0 -135
- ipakit-0.2.0/ipakit/data/bridges/espeak/pt-pt.xml +0 -185
- ipakit-0.2.0/ipakit/data/bridges/espeak/pt.xml +0 -185
- ipakit-0.2.0/ipakit/data/bridges/espeak/py.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/espeak/qdb.xml +0 -230
- ipakit-0.2.0/ipakit/data/bridges/espeak/qu.xml +0 -132
- ipakit-0.2.0/ipakit/data/bridges/espeak/quc.xml +0 -127
- ipakit-0.2.0/ipakit/data/bridges/espeak/qya.xml +0 -159
- ipakit-0.2.0/ipakit/data/bridges/espeak/ro.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/ru-lv.xml +0 -177
- ipakit-0.2.0/ipakit/data/bridges/espeak/ru.xml +0 -177
- ipakit-0.2.0/ipakit/data/bridges/espeak/sd.xml +0 -188
- ipakit-0.2.0/ipakit/data/bridges/espeak/shn.xml +0 -171
- ipakit-0.2.0/ipakit/data/bridges/espeak/si.xml +0 -194
- ipakit-0.2.0/ipakit/data/bridges/espeak/sjn.xml +0 -161
- ipakit-0.2.0/ipakit/data/bridges/espeak/sk.xml +0 -170
- ipakit-0.2.0/ipakit/data/bridges/espeak/sl.xml +0 -150
- ipakit-0.2.0/ipakit/data/bridges/espeak/smj.xml +0 -189
- ipakit-0.2.0/ipakit/data/bridges/espeak/sq.xml +0 -159
- ipakit-0.2.0/ipakit/data/bridges/espeak/sr.xml +0 -181
- ipakit-0.2.0/ipakit/data/bridges/espeak/sv.xml +0 -160
- ipakit-0.2.0/ipakit/data/bridges/espeak/sw.xml +0 -127
- ipakit-0.2.0/ipakit/data/bridges/espeak/ta.xml +0 -194
- ipakit-0.2.0/ipakit/data/bridges/espeak/te.xml +0 -188
- ipakit-0.2.0/ipakit/data/bridges/espeak/th.xml +0 -171
- ipakit-0.2.0/ipakit/data/bridges/espeak/ti.xml +0 -134
- ipakit-0.2.0/ipakit/data/bridges/espeak/tk.xml +0 -173
- ipakit-0.2.0/ipakit/data/bridges/espeak/tn.xml +0 -145
- ipakit-0.2.0/ipakit/data/bridges/espeak/tr.xml +0 -164
- ipakit-0.2.0/ipakit/data/bridges/espeak/tt.xml +0 -147
- ipakit-0.2.0/ipakit/data/bridges/espeak/ug.xml +0 -166
- ipakit-0.2.0/ipakit/data/bridges/espeak/uk.xml +0 -133
- ipakit-0.2.0/ipakit/data/bridges/espeak/ur.xml +0 -188
- ipakit-0.2.0/ipakit/data/bridges/espeak/uz.xml +0 -147
- ipakit-0.2.0/ipakit/data/bridges/espeak/vi-hue.xml +0 -193
- ipakit-0.2.0/ipakit/data/bridges/espeak/vi-sgn.xml +0 -191
- ipakit-0.2.0/ipakit/data/bridges/espeak/vi.xml +0 -200
- ipakit-0.2.0/ipakit/data/bridges/espeak/yue.xml +0 -180
- ipakit-0.2.0/ipakit/data/bridges/kana/kana.xml +0 -15
- ipakit-0.2.0/ipakit/data/bridges/mfa/arabic.xml +0 -81
- ipakit-0.2.0/ipakit/data/bridges/mfa/bulgarian.xml +0 -54
- ipakit-0.2.0/ipakit/data/bridges/mfa/croatian.xml +0 -73
- ipakit-0.2.0/ipakit/data/bridges/mfa/czech.xml +0 -56
- ipakit-0.2.0/ipakit/data/bridges/mfa/english.xml +0 -104
- ipakit-0.2.0/ipakit/data/bridges/mfa/english_india.xml +0 -73
- ipakit-0.2.0/ipakit/data/bridges/mfa/english_nigeria.xml +0 -75
- ipakit-0.2.0/ipakit/data/bridges/mfa/english_nonnative.xml +0 -100
- ipakit-0.2.0/ipakit/data/bridges/mfa/english_uk.xml +0 -85
- ipakit-0.2.0/ipakit/data/bridges/mfa/english_us.xml +0 -86
- ipakit-0.2.0/ipakit/data/bridges/mfa/french.xml +0 -51
- ipakit-0.2.0/ipakit/data/bridges/mfa/german.xml +0 -60
- ipakit-0.2.0/ipakit/data/bridges/mfa/hausa.xml +0 -84
- ipakit-0.2.0/ipakit/data/bridges/mfa/japanese.xml +0 -91
- ipakit-0.2.0/ipakit/data/bridges/mfa/korean.xml +0 -113
- ipakit-0.2.0/ipakit/data/bridges/mfa/korean_jamo.xml +0 -64
- ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin.xml +0 -127
- ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_china.xml +0 -147
- ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_erhua.xml +0 -127
- ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_taiwan.xml +0 -138
- ipakit-0.2.0/ipakit/data/bridges/mfa/mfa.xml +0 -851
- ipakit-0.2.0/ipakit/data/bridges/mfa/polish.xml +0 -58
- ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese.xml +0 -53
- ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese_brazil.xml +0 -48
- ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese_portugal.xml +0 -52
- ipakit-0.2.0/ipakit/data/bridges/mfa/russian.xml +0 -102
- ipakit-0.2.0/ipakit/data/bridges/mfa/serbocroatian.xml +0 -69
- ipakit-0.2.0/ipakit/data/bridges/mfa/spanish.xml +0 -43
- ipakit-0.2.0/ipakit/data/bridges/mfa/spanish_latin_america.xml +0 -51
- ipakit-0.2.0/ipakit/data/bridges/mfa/spanish_spain.xml +0 -52
- ipakit-0.2.0/ipakit/data/bridges/mfa/swahili.xml +0 -49
- ipakit-0.2.0/ipakit/data/bridges/mfa/swedish.xml +0 -111
- ipakit-0.2.0/ipakit/data/bridges/mfa/tamil.xml +0 -63
- ipakit-0.2.0/ipakit/data/bridges/mfa/thai.xml +0 -137
- ipakit-0.2.0/ipakit/data/bridges/mfa/turkish.xml +0 -77
- ipakit-0.2.0/ipakit/data/bridges/mfa/ukrainian.xml +0 -92
- ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese.xml +0 -190
- ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_hanoi.xml +0 -169
- ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_ho_chi_minh_city.xml +0 -132
- ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_hue.xml +0 -144
- ipakit-0.2.0/ipakit/data/bridges/pinyin/pinyin.xml +0 -49
- ipakit-0.2.0/ipakit/data/bridges/vocabulary.rng +0 -94
- ipakit-0.2.0/ipakit/data/confusion.json +0 -1
- ipakit-0.2.0/ipakit/data/heads.rng +0 -279
- ipakit-0.2.0/ipakit/data/ipa.rng +0 -379
- ipakit-0.2.0/ipakit/data/ipa.xml +0 -1011
- ipakit-0.2.0/ipakit/data/phonemaps/cmu.xml +0 -99
- ipakit-0.2.0/ipakit/data/phonemaps/phonemap.rng +0 -85
- ipakit-0.2.0/ipakit/data/phonemaps/timit.xml +0 -96
- ipakit-0.2.0/ipakit/data/phonemaps/xsampa.xml +0 -181
- ipakit-0.2.0/ipakit/data/rules/american-english.rules +0 -427
- ipakit-0.2.0/ipakit/data/rules/japanese-moraic.rules +0 -340
- ipakit-0.2.0/ipakit/data/syllables/japanese.xml +0 -11
- ipakit-0.2.0/ipakit/data/syllables/mandarin.xml +0 -4
- ipakit-0.2.0/ipakit/disagreement.py +0 -344
- ipakit-0.2.0/ipakit/distance.py +0 -1420
- ipakit-0.2.0/ipakit/distance_model.py +0 -815
- ipakit-0.2.0/ipakit/features.py +0 -4297
- ipakit-0.2.0/ipakit/form.py +0 -2553
- ipakit-0.2.0/ipakit/hierarchy.py +0 -139
- ipakit-0.2.0/ipakit/inventories.py +0 -602
- ipakit-0.2.0/ipakit/metric.py +0 -1081
- ipakit-0.2.0/ipakit/models.py +0 -478
- ipakit-0.2.0/ipakit/notebooks/ipakit-tutorial.ipynb +0 -1609
- ipakit-0.2.0/ipakit/phoneset_map.py +0 -538
- ipakit-0.2.0/ipakit/rules.py +0 -4304
- ipakit-0.2.0/ipakit/segment.py +0 -1170
- ipakit-0.2.0/ipakit/syllable.py +0 -616
- ipakit-0.2.0/ipakit/tiergraph_dot.py +0 -206
- ipakit-0.2.0/ipakit/tract.py +0 -2661
- ipakit-0.2.0/ipakit/tract_svg.py +0 -2424
- ipakit-0.2.0/ipakit.egg-info/PKG-INFO +0 -367
- ipakit-0.2.0/ipakit.egg-info/SOURCES.txt +0 -547
- ipakit-0.2.0/ipakit.egg-info/requires.txt +0 -24
- ipakit-0.2.0/pyproject.toml +0 -231
- ipakit-0.2.0/scripts/areafunctions.py +0 -2233
- ipakit-0.2.0/scripts/consolidation_parity.py +0 -110
- ipakit-0.2.0/scripts/containment_oracle.py +0 -687
- ipakit-0.2.0/scripts/costmodel_compare.py +0 -164
- ipakit-0.2.0/scripts/docexamples.py +0 -268
- ipakit-0.2.0/scripts/espeak_vocabularies.py +0 -631
- ipakit-0.2.0/scripts/interop.py +0 -1574
- ipakit-0.2.0/scripts/invariants.py +0 -1219
- ipakit-0.2.0/scripts/mfa_vocabularies.py +0 -503
- ipakit-0.2.0/scripts/panphon_geometry.py +0 -249
- ipakit-0.2.0/scripts/perceptual_validation.py +0 -183
- ipakit-0.2.0/scripts/piece1_oracle.py +0 -371
- ipakit-0.2.0/scripts/state_of_work.py +0 -159
- ipakit-0.2.0/scripts/sweep.py +0 -420
- ipakit-0.2.0/scripts/tiergraph_capture.py +0 -635
- ipakit-0.2.0/scripts/xsampa_table.py +0 -269
- ipakit-0.2.0/tests/test_agreement.py +0 -560
- ipakit-0.2.0/tests/test_analysis.py +0 -437
- ipakit-0.2.0/tests/test_api.py +0 -162
- ipakit-0.2.0/tests/test_api_contracts.py +0 -169
- ipakit-0.2.0/tests/test_bridges.py +0 -358
- ipakit-0.2.0/tests/test_ci_contract.py +0 -277
- ipakit-0.2.0/tests/test_cli.py +0 -2114
- ipakit-0.2.0/tests/test_cli_hygiene.py +0 -627
- ipakit-0.2.0/tests/test_coherent_composition.py +0 -635
- ipakit-0.2.0/tests/test_confusion.py +0 -75
- ipakit-0.2.0/tests/test_constriction_location.py +0 -813
- ipakit-0.2.0/tests/test_corpus_kernel.py +0 -302
- ipakit-0.2.0/tests/test_corpus_query.py +0 -146
- ipakit-0.2.0/tests/test_costmodel.py +0 -439
- ipakit-0.2.0/tests/test_declared_not_hardcoded.py +0 -1215
- ipakit-0.2.0/tests/test_denominator.py +0 -116
- ipakit-0.2.0/tests/test_descriptions.py +0 -147
- ipakit-0.2.0/tests/test_distance.py +0 -582
- ipakit-0.2.0/tests/test_distance_model.py +0 -649
- ipakit-0.2.0/tests/test_distinctive_difference.py +0 -135
- ipakit-0.2.0/tests/test_espeak_generator.py +0 -67
- ipakit-0.2.0/tests/test_feature_reads.py +0 -141
- ipakit-0.2.0/tests/test_feature_realization.py +0 -296
- ipakit-0.2.0/tests/test_features.py +0 -205
- ipakit-0.2.0/tests/test_form.py +0 -1016
- ipakit-0.2.0/tests/test_indel_costs.py +0 -666
- ipakit-0.2.0/tests/test_inventories.py +0 -575
- ipakit-0.2.0/tests/test_license.py +0 -88
- ipakit-0.2.0/tests/test_ligature_aliases.py +0 -478
- ipakit-0.2.0/tests/test_linking_and_agreement.py +0 -82
- ipakit-0.2.0/tests/test_metric.py +0 -1157
- ipakit-0.2.0/tests/test_mfa_vocabularies.py +0 -116
- ipakit-0.2.0/tests/test_models.py +0 -127
- ipakit-0.2.0/tests/test_nearest_pronunciation.py +0 -100
- ipakit-0.2.0/tests/test_nonfinal_modifiers.py +0 -273
- ipakit-0.2.0/tests/test_one_composition.py +0 -467
- ipakit-0.2.0/tests/test_packaging.py +0 -436
- ipakit-0.2.0/tests/test_panphon_geometry.py +0 -109
- ipakit-0.2.0/tests/test_panphon_live_geometry.py +0 -97
- ipakit-0.2.0/tests/test_phoible.py +0 -114
- ipakit-0.2.0/tests/test_phoneset_comparison.py +0 -148
- ipakit-0.2.0/tests/test_posture_no_side_channel.py +0 -177
- ipakit-0.2.0/tests/test_projection_coherence.py +0 -277
- ipakit-0.2.0/tests/test_prosodic_riders.py +0 -101
- ipakit-0.2.0/tests/test_query.py +0 -1102
- ipakit-0.2.0/tests/test_query_dsl.py +0 -122
- ipakit-0.2.0/tests/test_rule_sets.py +0 -2302
- ipakit-0.2.0/tests/test_rules.py +0 -2938
- ipakit-0.2.0/tests/test_schema.py +0 -830
- ipakit-0.2.0/tests/test_search.py +0 -274
- ipakit-0.2.0/tests/test_sequence_scoring.py +0 -121
- ipakit-0.2.0/tests/test_supplements.py +0 -673
- ipakit-0.2.0/tests/test_syllable_docs.py +0 -42
- ipakit-0.2.0/tests/test_syllable_japanese.py +0 -81
- ipakit-0.2.0/tests/test_textgrid.py +0 -485
- ipakit-0.2.0/tests/test_tie_sense.py +0 -384
- ipakit-0.2.0/tests/test_tiers.py +0 -210
- ipakit-0.2.0/tests/test_tokenization.py +0 -570
- ipakit-0.2.0/tests/test_tone_contours.py +0 -424
- ipakit-0.2.0/tests/test_tract_figures.py +0 -2319
- ipakit-0.2.0/tests/test_unicode_recomposition.py +0 -101
- ipakit-0.2.0/tests/test_unplaced_marks.py +0 -335
- ipakit-0.2.0/tests/test_variable_width.py +0 -228
- ipakit-0.2.0/tests/test_vowel_tract_limit.py +0 -407
- ipakit-0.2.0/tests/test_xsampa.py +0 -470
- ipakit-0.2.0/tests/test_zero.py +0 -817
- ipakit-0.2.0/tests/tiergraph/test_codecs.py +0 -167
- ipakit-0.2.0/tests/tiergraph/test_dot.py +0 -278
- ipakit-0.2.0/tests/tiergraph/test_fixture_wellformedness.py +0 -157
- ipakit-0.2.0/tests/tiergraph/test_form_store.py +0 -431
- ipakit-0.2.0/tests/tiergraph/test_gesture_integration.py +0 -167
- ipakit-0.2.0/tests/tiergraph/test_ipa_graph.py +0 -157
- ipakit-0.2.0/tests/tiergraph/test_lane_m_stabilization.py +0 -105
- ipakit-0.2.0/tests/tiergraph/test_piece1_oracle.py +0 -40
- ipakit-0.2.0/tests/tiergraph/test_rewrite_bridge.py +0 -266
- {ipakit-0.2.0 → ipakit-0.4.0}/LICENSE +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/anchor-study.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/captures.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/morph-boundary.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/tract-validation.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/vowel-chart-geometry.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/vowel-constriction.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-a.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-i.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-m.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-reference.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-rest.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-t.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-u.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-a.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-eng.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-esh.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-i.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-k.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-m.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-n.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-reference.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-s.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-silence.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-t.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-theta.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-u.svg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/mfa-vocabularies.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/perceptual-validation-exhibits.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/reading.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/docs/textgrid.md +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/__main__.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_corpus_cmudict.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_identity.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_mora_graph.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_notebook.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_panphon_graph.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_textgrid_graph.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/anatomy.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/generator.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/ipa_dict.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/notation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/provider.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/__main__.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/syllabify.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/tiergraph.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/closure.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/constants.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/corpus.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/attested/miller_nicely_1955.json +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/heads.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/phonemaps/kirshenbaum.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/phonemaps/lookalikes.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/french-liaison.rules +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/german-final-devoicing.rules +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/spanish-accented-english.rules +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/supplements/aspirated-stops.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/supplements/supplement.rng +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/english.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/spanish.xml +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/syllables.rng +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/mfa.json +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/prosody.json +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/segments.json +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/words.json +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/experiment.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/mapper.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/phonemaps.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/py.typed +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/textgrid.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/validation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/xsampa.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/dependency_links.txt +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/entry_points.txt +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/top_level.txt +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/anchor_study.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/articulatory.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/check_hrefs.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/confusion.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/corpus_scaling.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/disagreement_demo.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/docquotes.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/frontal_figures.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/gate_subject.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/house_style.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/projection_cache_characterization.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/syllable_curation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tiergraph_example.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tract_svg.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tutorial.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/setup.cfg +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/__init__.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/_renderers.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/conftest.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/corpus.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_animation_sha256.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_epiglottal_constriction.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_posture_golden.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_velic_contrast.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_align.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_anchor_study.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_animation_rest.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_calculus.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_capture_scripts.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_cli_query.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_closure.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_cmu.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_corpus_cmudict.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_degenerate_boundaries.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_determinism.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_disagreement.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_doc_citations.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_docquotes.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_espeak_binary.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_experiment.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_fortis.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_frontal.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_head_arcs.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_hierarchy.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_intervals.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_invertibility.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_ipa_dict.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_jaw_hinge.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_modifier_modes.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_multi_constriction.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_notation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_notebook.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_one_classification.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_panphon_facts.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_perceptual_validation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_phonemaps.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_phoneset_map.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_posture_animation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_projection_cache.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_rank_agreement.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_scoring_parameters.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_segment.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_sentinels.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_stress.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_strict.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_surface_wave2.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_english.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_mandarin.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_mechanism.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_spanish.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tie_convergence.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tier_context.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tier_rebase.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tract_blend.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_trajectory_track.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_two_marks.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_unicode_normalization.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_validation.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_wiki.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_choice_selection_golden.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_consolidation_parity.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_j_panphon.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_j_profiles.py +0 -0
- {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_prominence.py +0 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
schedule:
|
|
8
|
+
# Nightly full suite: runs the slow-marked sweep tests that per-PR CI skips.
|
|
9
|
+
- cron: "0 7 * * *"
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: ci-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
# Decide whether this push/PR touches anything but documentation. A doc-only
|
|
21
|
+
# change cannot move the metric, the derived artifacts or the Python surface,
|
|
22
|
+
# so the three build jobs below skip it and only `docs` runs. Every gate that
|
|
23
|
+
# reads the documents must therefore live in `docs` and not only in the
|
|
24
|
+
# pytest job, or a doc-only change skips its own check. The default is
|
|
25
|
+
# to run everything: anything we cannot cleanly diff sets code=true, so the
|
|
26
|
+
# optimization can only ever skip work it is sure is safe to skip.
|
|
27
|
+
changes:
|
|
28
|
+
name: detect doc-only changes
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
outputs:
|
|
31
|
+
code: ${{ steps.filter.outputs.code }}
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v7
|
|
34
|
+
with:
|
|
35
|
+
fetch-depth: 0
|
|
36
|
+
- id: filter
|
|
37
|
+
env:
|
|
38
|
+
BASE: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || github.event.before }}
|
|
39
|
+
HEAD: ${{ github.sha }}
|
|
40
|
+
run: |
|
|
41
|
+
set -eu
|
|
42
|
+
# Fail safe: no usable base (first push, force-push, missing SHA) runs
|
|
43
|
+
# the full build rather than guessing what changed.
|
|
44
|
+
if [ -z "${BASE:-}" ] || ! git cat-file -e "${BASE}^{commit}" 2>/dev/null; then
|
|
45
|
+
echo "no usable base ('${BASE:-}'); running full CI"
|
|
46
|
+
echo "code=true" >> "$GITHUB_OUTPUT"
|
|
47
|
+
exit 0
|
|
48
|
+
fi
|
|
49
|
+
changed="$(git diff --name-only "$BASE" "$HEAD")"
|
|
50
|
+
echo "changed files:"
|
|
51
|
+
printf ' %s\n' $changed
|
|
52
|
+
code=false
|
|
53
|
+
while IFS= read -r f; do
|
|
54
|
+
[ -z "$f" ] && continue
|
|
55
|
+
case "$f" in
|
|
56
|
+
# The doc set: docs/, any markdown, the generated tutorial
|
|
57
|
+
# notebook, and the license. Everything else is code.
|
|
58
|
+
docs/*|*.md|ipakit/notebooks/*|LICENSE*) ;;
|
|
59
|
+
*) code=true ;;
|
|
60
|
+
esac
|
|
61
|
+
done <<INNER
|
|
62
|
+
$changed
|
|
63
|
+
INNER
|
|
64
|
+
echo "run build jobs? code=$code"
|
|
65
|
+
echo "code=$code" >> "$GITHUB_OUTPUT"
|
|
66
|
+
|
|
67
|
+
lint:
|
|
68
|
+
name: lint (ruff / black / mypy)
|
|
69
|
+
needs: changes
|
|
70
|
+
if: ${{ needs.changes.outputs.code == 'true' }}
|
|
71
|
+
runs-on: ubuntu-latest
|
|
72
|
+
steps:
|
|
73
|
+
- uses: actions/checkout@v7
|
|
74
|
+
- uses: actions/setup-python@v7
|
|
75
|
+
with:
|
|
76
|
+
python-version: "3.12"
|
|
77
|
+
cache: pip
|
|
78
|
+
cache-dependency-path: pyproject.toml
|
|
79
|
+
- run: python -m pip install --upgrade pip
|
|
80
|
+
- run: pip install -e ".[lint]"
|
|
81
|
+
# `.`, matching the Makefile, because naming three directories left the
|
|
82
|
+
# tracked root `conftest.py` linted by neither -- and it configures the
|
|
83
|
+
# whole suite. An unused import added there passes this job and fails
|
|
84
|
+
# `make lint`, which is the wrong way round: the gate anyone reads was
|
|
85
|
+
# the looser one. ruff and black both honor .gitignore, so `.` is the
|
|
86
|
+
# same file set the release gate walks, not a wider one.
|
|
87
|
+
- run: ruff check .
|
|
88
|
+
- run: black --check .
|
|
89
|
+
- run: mypy --config-file=pyproject.toml
|
|
90
|
+
|
|
91
|
+
test:
|
|
92
|
+
name: test (py${{ matrix.python-version }})
|
|
93
|
+
needs: changes
|
|
94
|
+
if: ${{ needs.changes.outputs.code == 'true' }}
|
|
95
|
+
runs-on: ubuntu-latest
|
|
96
|
+
strategy:
|
|
97
|
+
fail-fast: false
|
|
98
|
+
matrix:
|
|
99
|
+
python-version: ["3.12", "3.13"]
|
|
100
|
+
steps:
|
|
101
|
+
- uses: actions/checkout@v7
|
|
102
|
+
- uses: actions/setup-python@v7
|
|
103
|
+
with:
|
|
104
|
+
python-version: ${{ matrix.python-version }}
|
|
105
|
+
cache: pip
|
|
106
|
+
cache-dependency-path: pyproject.toml
|
|
107
|
+
- run: python -m pip install --upgrade pip
|
|
108
|
+
# The test extra carries lxml, which is what validates the shipped XML
|
|
109
|
+
# against the grammars beside it; without a validator test_schema.py
|
|
110
|
+
# errors rather than skipping, so this job is where that is guaranteed
|
|
111
|
+
# to run. The ICU-backed X-SAMPA cross-check self-skips (importorskip);
|
|
112
|
+
# the confusion-matrix guard is stdlib and runs.
|
|
113
|
+
- run: pip install -e ".[test]"
|
|
114
|
+
# What is under test, asserted before anything tests it. The suite is
|
|
115
|
+
# only evidence about this branch if `import ipakit` resolves inside the
|
|
116
|
+
# checkout, and nothing here checked that: an install resolving to a
|
|
117
|
+
# published ipakit instead would run the whole suite green against code
|
|
118
|
+
# the branch does not contain. `make check` has run this since it
|
|
119
|
+
# existed; CI, which is the run anyone actually reads, did not.
|
|
120
|
+
# It also puts the tiergraph path and version in the log, which is the
|
|
121
|
+
# provenance a red run gets diagnosed against.
|
|
122
|
+
- name: The subject under test is this checkout
|
|
123
|
+
run: python -m scripts.gate_subject
|
|
124
|
+
# Across the runner's cores, as the Makefile does. A matrix job is three
|
|
125
|
+
# runs of the same suite, so the saving is paid three times per push.
|
|
126
|
+
# The default -m 'not slow' (pyproject addopts) keeps the O(n^2) sweep
|
|
127
|
+
# tests out of the per-PR run; the full-suite job below runs them.
|
|
128
|
+
- run: pytest -n auto
|
|
129
|
+
|
|
130
|
+
full-suite:
|
|
131
|
+
name: full suite (incl. slow)
|
|
132
|
+
needs: changes
|
|
133
|
+
# The per-PR test job skips slow-marked sweep tests to keep feedback fast.
|
|
134
|
+
# This job runs every test, slow included, where the wait is acceptable:
|
|
135
|
+
# merges to main, the nightly schedule, and manual dispatch — never on a
|
|
136
|
+
# pull_request.
|
|
137
|
+
if: ${{ github.event_name != 'pull_request' && needs.changes.outputs.code == 'true' }}
|
|
138
|
+
runs-on: ubuntu-latest
|
|
139
|
+
steps:
|
|
140
|
+
- uses: actions/checkout@v7
|
|
141
|
+
- uses: actions/setup-python@v7
|
|
142
|
+
with:
|
|
143
|
+
python-version: "3.12"
|
|
144
|
+
cache: pip
|
|
145
|
+
cache-dependency-path: pyproject.toml
|
|
146
|
+
- run: python -m pip install --upgrade pip
|
|
147
|
+
- run: pip install -e ".[test]"
|
|
148
|
+
# Override the addopts default (-m 'not slow') so every test runs.
|
|
149
|
+
- run: pytest -m "slow or not slow" -n auto
|
|
150
|
+
|
|
151
|
+
guards:
|
|
152
|
+
name: derived-artifact guards (ICU)
|
|
153
|
+
needs: changes
|
|
154
|
+
if: ${{ needs.changes.outputs.code == 'true' }}
|
|
155
|
+
runs-on: ubuntu-latest
|
|
156
|
+
steps:
|
|
157
|
+
- uses: actions/checkout@v7
|
|
158
|
+
- uses: actions/setup-python@v7
|
|
159
|
+
with:
|
|
160
|
+
python-version: "3.12"
|
|
161
|
+
cache: pip
|
|
162
|
+
cache-dependency-path: pyproject.toml
|
|
163
|
+
- run: python -m pip install --upgrade pip
|
|
164
|
+
# dev pulls icukit-pyicu (bundled ICU + PyICU) so the X-SAMPA table can be derived.
|
|
165
|
+
- run: pip install -e ".[dev]"
|
|
166
|
+
- name: X-SAMPA table matches ICU + overrides
|
|
167
|
+
run: python scripts/xsampa_table.py validate
|
|
168
|
+
- name: Confusion matrix matches the metric
|
|
169
|
+
run: python scripts/confusion.py validate
|
|
170
|
+
- name: Geometry figures in docs/distance.md match the metric (numpy; skipped in the matrix job)
|
|
171
|
+
env:
|
|
172
|
+
PYTHONHASHSEED: "0"
|
|
173
|
+
run: pytest tests/test_geometry_doc.py
|
|
174
|
+
- name: Committed tiergraph baselines match their manifest
|
|
175
|
+
run: PYTHONHASHSEED=0 python scripts/tiergraph_capture.py verify-baselines
|
|
176
|
+
# The full invariant sweep, including "derived artifacts current", which
|
|
177
|
+
# is what caught the stale figure record this commit repairs. `make
|
|
178
|
+
# check` has always run it and CI never did, so the only thing standing
|
|
179
|
+
# between a regenerated artifact and a stale record of it was whether
|
|
180
|
+
# somebody happened to run the release gate by hand. About 40 seconds.
|
|
181
|
+
- name: Invariants hold and derived artifacts are current
|
|
182
|
+
run: PYTHONHASHSEED=0 python scripts/invariants.py
|
|
183
|
+
# The last two release-gate steps CI did not reach. Both re-derive a
|
|
184
|
+
# committed golden and compare; the manifest above only proves those
|
|
185
|
+
# goldens have not been hand-edited, which is a different question from
|
|
186
|
+
# whether the code still produces them. Nothing else reads either file:
|
|
187
|
+
# containment-navigation.json is read only by containment_oracle.py, and
|
|
188
|
+
# consolidation_parity.sha256 only by consolidation_parity.py -- the
|
|
189
|
+
# parity test asserts a round-trip over the corpus, never that the
|
|
190
|
+
# committed digest still matches it. About four seconds together.
|
|
191
|
+
- name: Containment navigation matches its golden
|
|
192
|
+
run: PYTHONHASHSEED=0 python scripts/containment_oracle.py
|
|
193
|
+
- name: Consolidation parity digest matches the derived corpus
|
|
194
|
+
run: PYTHONHASHSEED=0 python scripts/consolidation_parity.py check
|
|
195
|
+
- name: ICU cross-check tests (skipped in the matrix job)
|
|
196
|
+
run: pytest tests/test_xsampa.py
|
|
197
|
+
- name: Panphon characterization tests (skipped in the matrix job)
|
|
198
|
+
run: pytest tests/test_panphon_facts.py tests/test_panphon_live_geometry.py tests/tiergraph/test_j_panphon.py
|
|
199
|
+
- name: Read accepted CLTS source identity
|
|
200
|
+
id: clts-source
|
|
201
|
+
run: |
|
|
202
|
+
python -c 'from ipakit.clts import source_policy; s = source_policy()["source"]; print("repository=" + s["upstream-url"].removeprefix("https://github.com/")); print("revision=" + s["version"])' >> "$GITHUB_OUTPUT"
|
|
203
|
+
- uses: actions/checkout@v7
|
|
204
|
+
with:
|
|
205
|
+
repository: ${{ steps.clts-source.outputs.repository }}
|
|
206
|
+
ref: ${{ steps.clts-source.outputs.revision }}
|
|
207
|
+
path: .clts-source
|
|
208
|
+
persist-credentials: false
|
|
209
|
+
- name: CLTS snapshot regeneration and exhaustive scorer parity
|
|
210
|
+
env:
|
|
211
|
+
IPAKIT_CLTS_DIR: ${{ github.workspace }}/.clts-source
|
|
212
|
+
run: pytest tests/test_clts_snapshot.py tests/test_clts_mapping.py tests/tiergraph/test_clts_profile.py
|
|
213
|
+
- name: Comparison extras tests (partition check skips in the matrix job)
|
|
214
|
+
run: pytest tests/test_comparison_example.py
|
|
215
|
+
|
|
216
|
+
render:
|
|
217
|
+
name: render (figure tests need real renderers)
|
|
218
|
+
needs: changes
|
|
219
|
+
if: ${{ needs.changes.outputs.code == 'true' }}
|
|
220
|
+
runs-on: ubuntu-latest
|
|
221
|
+
steps:
|
|
222
|
+
- uses: actions/checkout@v7
|
|
223
|
+
- uses: actions/setup-python@v7
|
|
224
|
+
with:
|
|
225
|
+
python-version: "3.12"
|
|
226
|
+
cache: pip
|
|
227
|
+
cache-dependency-path: pyproject.toml
|
|
228
|
+
- run: python -m pip install --upgrade pip
|
|
229
|
+
# The figure tests measure a rendered raster or layout, so they need a
|
|
230
|
+
# real renderer -- rsvg-convert (librsvg2-bin) for the SVG figures, dot
|
|
231
|
+
# (graphviz) for the tiergraph layout. No other job installs one, so
|
|
232
|
+
# everywhere else those figure tests skip. This job installs both and is
|
|
233
|
+
# the one place they run.
|
|
234
|
+
- run: sudo apt-get update && sudo apt-get install -y graphviz librsvg2-bin
|
|
235
|
+
- run: pip install -e ".[test]"
|
|
236
|
+
# REQUIRE_RENDERERS turns a missing renderer from a silent skip into a
|
|
237
|
+
# hard failure here (see tests/_renderers.py), so this job cannot go green
|
|
238
|
+
# having rendered nothing. `-m 'slow or not slow'` overrides the addopts
|
|
239
|
+
# default (`-m 'not slow'`) so the slow-marked figure tests run too.
|
|
240
|
+
- name: Figure tests run against installed renderers
|
|
241
|
+
env:
|
|
242
|
+
REQUIRE_RENDERERS: "1"
|
|
243
|
+
run: pytest tests/test_tract_figures.py tests/test_animation_rest.py tests/test_frontal.py tests/tiergraph/test_dot.py -m "slow or not slow" -q
|
|
244
|
+
|
|
245
|
+
docs:
|
|
246
|
+
name: docs (README + tutorial values current)
|
|
247
|
+
runs-on: ubuntu-latest
|
|
248
|
+
steps:
|
|
249
|
+
- uses: actions/checkout@v7
|
|
250
|
+
- uses: actions/setup-python@v7
|
|
251
|
+
with:
|
|
252
|
+
python-version: "3.12"
|
|
253
|
+
cache: pip
|
|
254
|
+
cache-dependency-path: pyproject.toml
|
|
255
|
+
- run: python -m pip install --upgrade pip
|
|
256
|
+
# The doc examples run against the installed package and its dependencies;
|
|
257
|
+
# scripts/docexamples.py, scripts/docquotes.py and scripts/tutorial.py
|
|
258
|
+
# are stdlib-only. scripts/inventory_cards.py is not: it validates every
|
|
259
|
+
# declared SPDX identifier through packaging, which is declared in the
|
|
260
|
+
# test extra because only a gate reads it. Installing the extra keeps that
|
|
261
|
+
# version constraint in pyproject.toml rather than spelling it here too.
|
|
262
|
+
- run: pip install -e ".[test]"
|
|
263
|
+
- name: README and docs Python examples produce their stated values
|
|
264
|
+
run: PYTHONHASHSEED=0 python scripts/docexamples.py
|
|
265
|
+
# Runs here, not only in the pytest job, because a doc-only change skips
|
|
266
|
+
# that job and a doc-only change is exactly what breaks a quotation.
|
|
267
|
+
- name: Quotations are in the documents they cite
|
|
268
|
+
run: python scripts/docquotes.py .
|
|
269
|
+
- name: Tutorial page and notebook are current
|
|
270
|
+
run: PYTHONHASHSEED=0 python scripts/tutorial.py check all
|
|
271
|
+
# Three more generated documents with a `check` mode each. `make check`
|
|
272
|
+
# has run all three for as long as they have existed; CI never has, so
|
|
273
|
+
# the regenerate-never-hand-edit rule held only for whoever ran the
|
|
274
|
+
# release gate by hand, and a drifting exhibit reached main green.
|
|
275
|
+
# They belong in this job rather than a code-triggered one because two
|
|
276
|
+
# of the three derive from code while the artifact lives under docs/:
|
|
277
|
+
# an exhibit goes stale when the metric moves, and it also goes stale
|
|
278
|
+
# when someone edits the document, and this is the only job that runs
|
|
279
|
+
# for both. Together they add about a second.
|
|
280
|
+
- name: House-style exhibits match ipa.xml
|
|
281
|
+
run: python scripts/house_style.py check
|
|
282
|
+
- name: Perceptual-validation exhibits match the data and the metric
|
|
283
|
+
run: PYTHONHASHSEED=0 python scripts/perceptual_validation.py check
|
|
284
|
+
- name: State of the work matches docs/design
|
|
285
|
+
run: python scripts/state_of_work.py check
|
|
286
|
+
# The declarations under ipakit/data and the summary page under docs/ are
|
|
287
|
+
# one generated artifact, so the check has to run for a change to either.
|
|
288
|
+
# `guards` skips a doc-only change, which would let a hand edit to the
|
|
289
|
+
# summary skip the gate that guards it; this job runs for every change.
|
|
290
|
+
# The clone is a sparse, blobless fetch of the dictionary metadata alone,
|
|
291
|
+
# about a megabyte.
|
|
292
|
+
- name: eSpeak declarations match the pinned eSpeak NG revision
|
|
293
|
+
run: python scripts/espeak_vocabularies.py check --fetch --source "${{ runner.temp }}/espeak-ng"
|
|
294
|
+
- name: MFA declarations match the pinned mfa-models revision
|
|
295
|
+
run: python scripts/mfa_vocabularies.py check --fetch --source "${{ runner.temp }}/mfa-models"
|
|
296
|
+
- name: Inventory cards match declarations and computed counts
|
|
297
|
+
run: python scripts/inventory_cards.py check --mfa-models "${{ runner.temp }}/mfa-models"
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
# Build once, then publish via PyPI Trusted Publishing (OIDC) -- no API tokens.
|
|
4
|
+
# Cut a GitHub Release (tag vX.Y.Z) to publish to PyPI.
|
|
5
|
+
#
|
|
6
|
+
# One-time setup (see docs/releasing.md):
|
|
7
|
+
# - PyPI: add a Trusted Publisher (project ipakit, this repo, workflow
|
|
8
|
+
# publish.yml, environment "pypi").
|
|
9
|
+
# - GitHub: create environment "pypi" (Settings > Environments).
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
release:
|
|
13
|
+
types: [published]
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
build:
|
|
20
|
+
name: build sdist + wheel
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- uses: actions/checkout@v7
|
|
24
|
+
- uses: actions/setup-python@v7
|
|
25
|
+
with:
|
|
26
|
+
python-version: "3.12"
|
|
27
|
+
- run: python -m pip install --upgrade pip build twine
|
|
28
|
+
- run: python -m build
|
|
29
|
+
- name: Check distribution metadata
|
|
30
|
+
run: python -m twine check dist/*
|
|
31
|
+
- name: Verify version matches release tag
|
|
32
|
+
# Read the version from the built wheel's metadata, which is what
|
|
33
|
+
# uploads, rather than importing ipakit: this job installs only the
|
|
34
|
+
# build tools, and importing the package needs its dependencies.
|
|
35
|
+
env:
|
|
36
|
+
TAG: ${{ github.event.release.tag_name }}
|
|
37
|
+
run: |
|
|
38
|
+
VERSION=$(python - <<'EOF'
|
|
39
|
+
import glob, zipfile
|
|
40
|
+
from email.parser import BytesParser
|
|
41
|
+
(wheel,) = glob.glob("dist/*.whl")
|
|
42
|
+
with zipfile.ZipFile(wheel) as archive:
|
|
43
|
+
(name,) = [n for n in archive.namelist() if n.endswith(".dist-info/METADATA")]
|
|
44
|
+
print(BytesParser().parsebytes(archive.read(name))["Version"])
|
|
45
|
+
EOF
|
|
46
|
+
)
|
|
47
|
+
echo "wheel metadata version=$VERSION release tag=$TAG"
|
|
48
|
+
test "$VERSION" = "${TAG#v}"
|
|
49
|
+
- uses: actions/upload-artifact@v7
|
|
50
|
+
with:
|
|
51
|
+
name: dist
|
|
52
|
+
path: dist/
|
|
53
|
+
|
|
54
|
+
publish-pypi:
|
|
55
|
+
name: publish to PyPI
|
|
56
|
+
needs: build
|
|
57
|
+
runs-on: ubuntu-latest
|
|
58
|
+
environment:
|
|
59
|
+
name: pypi
|
|
60
|
+
url: https://pypi.org/p/ipakit
|
|
61
|
+
permissions:
|
|
62
|
+
id-token: write
|
|
63
|
+
steps:
|
|
64
|
+
- uses: actions/download-artifact@v8
|
|
65
|
+
with:
|
|
66
|
+
name: dist
|
|
67
|
+
path: dist/
|
|
68
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Pre-commit hooks for ipakit.
|
|
2
|
+
# Mirrors the HSG repo's hook set, adapted for ipakit's flat layout (package at
|
|
3
|
+
# ./ipakit, tests at ./tests). Tool settings live in pyproject.toml.
|
|
4
|
+
# Install once with: pip install -e ".[dev]" && pre-commit install
|
|
5
|
+
minimum_pre_commit_version: "3.0.0"
|
|
6
|
+
|
|
7
|
+
repos:
|
|
8
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
9
|
+
rev: v6.0.0
|
|
10
|
+
hooks:
|
|
11
|
+
- id: trailing-whitespace
|
|
12
|
+
files: ^(ipakit|tests)/
|
|
13
|
+
# Praat's long TextGrid format writes a trailing space after every value.
|
|
14
|
+
exclude: ^tests/fixtures/textgrid/
|
|
15
|
+
- id: end-of-file-fixer
|
|
16
|
+
files: ^(ipakit|tests)/
|
|
17
|
+
# Verbatim upstream notice hashes are part of the PHOIBLE source pin.
|
|
18
|
+
exclude: ^ipakit/data/phoible/(MIT-upstream|GPL-3\.0)\.txt$
|
|
19
|
+
- id: check-yaml
|
|
20
|
+
- id: check-toml
|
|
21
|
+
- id: check-added-large-files
|
|
22
|
+
# The shipped Panphon XML is a 1.5 MB declaration of another
|
|
23
|
+
# project's feature table, generated by scripts/panphon_geometry.py
|
|
24
|
+
# and checked against the installed library. It is deliberately
|
|
25
|
+
# committed and distributed with attribution and its MIT notice.
|
|
26
|
+
# The guard stays at its default for everything else.
|
|
27
|
+
# PHOIBLE's full original catalog compresses to 877 KB; its exact
|
|
28
|
+
# source/transport hashes and wheel/sdist contents are tested.
|
|
29
|
+
exclude: ^(ipakit/data/feature-models/panphon\.xml|ipakit/data/phoible/data/phoible\.csv\.gz)$
|
|
30
|
+
- id: check-merge-conflict
|
|
31
|
+
|
|
32
|
+
- repo: https://github.com/psf/black-pre-commit-mirror
|
|
33
|
+
rev: 26.5.1
|
|
34
|
+
hooks:
|
|
35
|
+
- id: black
|
|
36
|
+
# Match the lint job's scope exactly. CI runs `black --check ipakit
|
|
37
|
+
# tests scripts`; leaving scripts out here made every local commit
|
|
38
|
+
# touching one report "Passed" for a file the hook never opened, and
|
|
39
|
+
# the divergence only surfaced in CI.
|
|
40
|
+
files: ^(ipakit|tests|scripts)/
|
|
41
|
+
|
|
42
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
43
|
+
rev: v0.16.5
|
|
44
|
+
hooks:
|
|
45
|
+
- id: ruff-check
|
|
46
|
+
args: ["--fix"]
|
|
47
|
+
# As above: CI runs `ruff check ipakit tests scripts`.
|
|
48
|
+
files: ^(ipakit|tests|scripts)/
|
|
49
|
+
|
|
50
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
51
|
+
rev: v2.3.1
|
|
52
|
+
hooks:
|
|
53
|
+
- id: mypy
|
|
54
|
+
# Native GraphProfile subclasses need the same runtime types CI installs.
|
|
55
|
+
# tests/test_ci_contract.py keeps this requirement equal to pyproject.
|
|
56
|
+
additional_dependencies: ["tiergraph>=0.4.0"]
|
|
57
|
+
# NOT widened to match the others. `pyproject.toml` sets
|
|
58
|
+
# `files = ["ipakit"]` deliberately, because the lint job installs
|
|
59
|
+
# `.[lint]`, which has no pytest -- a scope reaching a test file
|
|
60
|
+
# fails there while passing locally under `.[dev]`. This hook agrees
|
|
61
|
+
# with that scope; widening it would disagree with CI rather than
|
|
62
|
+
# match it.
|
|
63
|
+
files: ^ipakit/
|
|
64
|
+
args: ["--config-file=pyproject.toml"]
|