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.
Files changed (1013) hide show
  1. ipakit-0.4.0/.github/workflows/ci.yml +297 -0
  2. ipakit-0.4.0/.github/workflows/publish.yml +68 -0
  3. ipakit-0.4.0/.pre-commit-config.yaml +64 -0
  4. ipakit-0.4.0/CHANGELOG.md +447 -0
  5. ipakit-0.4.0/MANIFEST.in +56 -0
  6. ipakit-0.4.0/Makefile +192 -0
  7. ipakit-0.4.0/PKG-INFO +399 -0
  8. ipakit-0.4.0/README.md +347 -0
  9. ipakit-0.4.0/conftest.py +56 -0
  10. ipakit-0.4.0/docs/README.md +124 -0
  11. ipakit-0.4.0/docs/articulatory-data.md +387 -0
  12. ipakit-0.4.0/docs/calculus.md +414 -0
  13. ipakit-0.4.0/docs/capabilities.md +235 -0
  14. ipakit-0.4.0/docs/cli-api-sync.md +75 -0
  15. ipakit-0.4.0/docs/clts-audit.md +212 -0
  16. ipakit-0.4.0/docs/clts-gaps.md +379 -0
  17. ipakit-0.4.0/docs/clts-import.md +99 -0
  18. ipakit-0.4.0/docs/clts-mapping.md +93 -0
  19. ipakit-0.4.0/docs/corpus-scaling-report.json +41 -0
  20. ipakit-0.4.0/docs/corpus.md +244 -0
  21. ipakit-0.4.0/docs/data/english-syllable-curation-2026-08-11.json +3071 -0
  22. ipakit-0.4.0/docs/design/README.md +10 -0
  23. ipakit-0.4.0/docs/design/archive/README.md +7 -0
  24. ipakit-0.4.0/docs/design/archive/ip-p1-store-approach.md +37 -0
  25. ipakit-0.4.0/docs/design/archive/piece1-canonical-store.md +118 -0
  26. ipakit-0.4.0/docs/design/braces.md +512 -0
  27. ipakit-0.4.0/docs/design/conlang.md +644 -0
  28. ipakit-0.4.0/docs/design/ecosystem.md +595 -0
  29. ipakit-0.4.0/docs/design/frontal-view.md +105 -0
  30. ipakit-0.4.0/docs/design/historical-linguistics.md +116 -0
  31. ipakit-0.4.0/docs/design/interop.md +798 -0
  32. ipakit-0.4.0/docs/design/mass-budget.md +95 -0
  33. ipakit-0.4.0/docs/design/residency-allowlist.json +10 -0
  34. ipakit-0.4.0/docs/design/samprosa.md +381 -0
  35. ipakit-0.4.0/docs/design/supplement-bridges.md +332 -0
  36. ipakit-0.4.0/docs/design/tiers.md +288 -0
  37. ipakit-0.4.0/docs/development-sources.md +127 -0
  38. ipakit-0.4.0/docs/distance.md +713 -0
  39. ipakit-0.4.0/docs/espeak-vocabularies.md +12 -0
  40. ipakit-0.4.0/docs/feature-transforms.md +169 -0
  41. ipakit-0.4.0/docs/figures/derived-from-boundaries.dot +876 -0
  42. ipakit-0.4.0/docs/figures/perhaps-i-am-a-bad-man.dot +442 -0
  43. ipakit-0.4.0/docs/figures/two-pane-timed.html +283 -0
  44. ipakit-0.4.0/docs/form.md +324 -0
  45. ipakit-0.4.0/docs/gestural-model.md +59 -0
  46. ipakit-0.4.0/docs/glossary.md +106 -0
  47. ipakit-0.4.0/docs/house-style-exhibits.md +74 -0
  48. ipakit-0.4.0/docs/house-style.md +161 -0
  49. ipakit-0.4.0/docs/inventories.md +361 -0
  50. ipakit-0.4.0/docs/inventories.src.md +69 -0
  51. ipakit-0.4.0/docs/inventory-operations.md +316 -0
  52. ipakit-0.4.0/docs/kana.md +133 -0
  53. ipakit-0.4.0/docs/model-operations.md +170 -0
  54. ipakit-0.4.0/docs/phoible.md +71 -0
  55. ipakit-0.4.0/docs/pinyin.md +170 -0
  56. ipakit-0.4.0/docs/releasing.md +166 -0
  57. ipakit-0.4.0/docs/representation.md +241 -0
  58. ipakit-0.4.0/docs/reviewing.md +197 -0
  59. ipakit-0.4.0/docs/rules.md +1124 -0
  60. ipakit-0.4.0/docs/similarity.md +186 -0
  61. ipakit-0.4.0/docs/source-receipts.md +61 -0
  62. ipakit-0.4.0/docs/state-of-the-work.md +89 -0
  63. ipakit-0.4.0/docs/supplements.md +186 -0
  64. ipakit-0.4.0/docs/syllabification.md +178 -0
  65. ipakit-0.4.0/docs/systems.md +73 -0
  66. ipakit-0.4.0/docs/tiergraph-acceptance.md +30 -0
  67. ipakit-0.4.0/docs/ties.md +183 -0
  68. ipakit-0.4.0/docs/tone.md +142 -0
  69. ipakit-0.4.0/docs/tract-anatomy.md +269 -0
  70. ipakit-0.4.0/docs/tract-figures.md +162 -0
  71. ipakit-0.4.0/docs/tract-reference.md +82 -0
  72. ipakit-0.4.0/docs/tutorial-basics.md +117 -0
  73. ipakit-0.4.0/docs/tutorial-basics.src.md +114 -0
  74. ipakit-0.4.0/docs/tutorial.md +1052 -0
  75. ipakit-0.4.0/docs/tutorial.src.md +890 -0
  76. ipakit-0.4.0/ipakit/__init__.py +1948 -0
  77. ipakit-0.4.0/ipakit/_base.py +153 -0
  78. ipakit-0.4.0/ipakit/_clts_import.py +600 -0
  79. ipakit-0.4.0/ipakit/_clts_input.py +139 -0
  80. ipakit-0.4.0/ipakit/_clts_profile.py +1155 -0
  81. ipakit-0.4.0/ipakit/_cmu_graph.py +186 -0
  82. ipakit-0.4.0/ipakit/_codecs.py +293 -0
  83. ipakit-0.4.0/ipakit/_containment_projection.py +1339 -0
  84. ipakit-0.4.0/ipakit/_convert.py +252 -0
  85. ipakit-0.4.0/ipakit/_corpus.py +746 -0
  86. ipakit-0.4.0/ipakit/_corpus_query.py +402 -0
  87. ipakit-0.4.0/ipakit/_fact_builder.py +564 -0
  88. ipakit-0.4.0/ipakit/_form_profile.py +1214 -0
  89. ipakit-0.4.0/ipakit/_gesture_backend.py +138 -0
  90. ipakit-0.4.0/ipakit/_gesture_graph.py +142 -0
  91. ipakit-0.4.0/ipakit/_graph_facts.py +315 -0
  92. ipakit-0.4.0/ipakit/_ipa_graph.py +244 -0
  93. ipakit-0.4.0/ipakit/_katakana_codec.py +18 -0
  94. ipakit-0.4.0/ipakit/_moraic.py +141 -0
  95. ipakit-0.4.0/ipakit/_pinyin_graph.py +185 -0
  96. ipakit-0.4.0/ipakit/_provenance.py +113 -0
  97. ipakit-0.4.0/ipakit/_rewrite_graph.py +398 -0
  98. ipakit-0.4.0/ipakit/_rule_model.py +384 -0
  99. ipakit-0.4.0/ipakit/_scalar_attribute.py +21 -0
  100. ipakit-0.4.0/ipakit/_source_receipt.py +230 -0
  101. ipakit-0.4.0/ipakit/_token_corpus.py +21 -0
  102. ipakit-0.4.0/ipakit/_warning_policy.py +56 -0
  103. ipakit-0.4.0/ipakit/align.py +275 -0
  104. ipakit-0.4.0/ipakit/analysis.py +1018 -0
  105. ipakit-0.4.0/ipakit/binary_cost.py +98 -0
  106. ipakit-0.4.0/ipakit/bridges/__init__.py +67 -0
  107. ipakit-0.4.0/ipakit/bridges/base.py +45 -0
  108. ipakit-0.4.0/ipakit/bridges/costmodel.py +835 -0
  109. ipakit-0.4.0/ipakit/bridges/espeak.py +39 -0
  110. ipakit-0.4.0/ipakit/bridges/kana.py +54 -0
  111. ipakit-0.4.0/ipakit/bridges/mfa.py +95 -0
  112. ipakit-0.4.0/ipakit/bridges/phoible.py +343 -0
  113. ipakit-0.4.0/ipakit/bridges/pinyin.py +175 -0
  114. ipakit-0.4.0/ipakit/bridges/vocabulary.py +610 -0
  115. ipakit-0.4.0/ipakit/cli/__init__.py +302 -0
  116. ipakit-0.4.0/ipakit/cli/analysis_cmds.py +338 -0
  117. ipakit-0.4.0/ipakit/cli/analyze.py +393 -0
  118. ipakit-0.4.0/ipakit/cli/base.py +453 -0
  119. ipakit-0.4.0/ipakit/cli/convert.py +804 -0
  120. ipakit-0.4.0/ipakit/cli/corpus.py +340 -0
  121. ipakit-0.4.0/ipakit/cli/distance.py +1298 -0
  122. ipakit-0.4.0/ipakit/cli/features.py +174 -0
  123. ipakit-0.4.0/ipakit/cli/graph_json.py +55 -0
  124. ipakit-0.4.0/ipakit/cli/hierarchy.py +191 -0
  125. ipakit-0.4.0/ipakit/cli/info.py +80 -0
  126. ipakit-0.4.0/ipakit/cli/inventory.py +194 -0
  127. ipakit-0.4.0/ipakit/cli/metrics.py +123 -0
  128. ipakit-0.4.0/ipakit/cli/model.py +390 -0
  129. ipakit-0.4.0/ipakit/cli/notebook.py +64 -0
  130. ipakit-0.4.0/ipakit/cli/phoible.py +116 -0
  131. ipakit-0.4.0/ipakit/cli/policy.py +109 -0
  132. ipakit-0.4.0/ipakit/cli/query.py +587 -0
  133. ipakit-0.4.0/ipakit/cli/rules.py +1189 -0
  134. ipakit-0.4.0/ipakit/cli/textgrid.py +144 -0
  135. ipakit-0.4.0/ipakit/cli/tract.py +181 -0
  136. ipakit-0.4.0/ipakit/clts.py +756 -0
  137. ipakit-0.4.0/ipakit/clts_mapping.py +838 -0
  138. ipakit-0.4.0/ipakit/data/bridges/kana/kana.xml +23 -0
  139. ipakit-0.4.0/ipakit/data/bridges/mfa/arabic.xml +81 -0
  140. ipakit-0.4.0/ipakit/data/bridges/mfa/bulgarian.xml +54 -0
  141. ipakit-0.4.0/ipakit/data/bridges/mfa/croatian.xml +73 -0
  142. ipakit-0.4.0/ipakit/data/bridges/mfa/czech.xml +56 -0
  143. ipakit-0.4.0/ipakit/data/bridges/mfa/english.xml +104 -0
  144. ipakit-0.4.0/ipakit/data/bridges/mfa/english_india.xml +73 -0
  145. ipakit-0.4.0/ipakit/data/bridges/mfa/english_nigeria.xml +75 -0
  146. ipakit-0.4.0/ipakit/data/bridges/mfa/english_nonnative.xml +100 -0
  147. ipakit-0.4.0/ipakit/data/bridges/mfa/english_uk.xml +85 -0
  148. ipakit-0.4.0/ipakit/data/bridges/mfa/english_us.xml +86 -0
  149. ipakit-0.4.0/ipakit/data/bridges/mfa/french.xml +51 -0
  150. ipakit-0.4.0/ipakit/data/bridges/mfa/german.xml +60 -0
  151. ipakit-0.4.0/ipakit/data/bridges/mfa/hausa.xml +84 -0
  152. ipakit-0.4.0/ipakit/data/bridges/mfa/japanese.xml +91 -0
  153. ipakit-0.4.0/ipakit/data/bridges/mfa/korean.xml +113 -0
  154. ipakit-0.4.0/ipakit/data/bridges/mfa/korean_jamo.xml +64 -0
  155. ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin.xml +127 -0
  156. ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_china.xml +147 -0
  157. ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_erhua.xml +127 -0
  158. ipakit-0.4.0/ipakit/data/bridges/mfa/mandarin_taiwan.xml +138 -0
  159. ipakit-0.4.0/ipakit/data/bridges/mfa/mfa.xml +851 -0
  160. ipakit-0.4.0/ipakit/data/bridges/mfa/polish.xml +58 -0
  161. ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese.xml +53 -0
  162. ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese_brazil.xml +48 -0
  163. ipakit-0.4.0/ipakit/data/bridges/mfa/portuguese_portugal.xml +52 -0
  164. ipakit-0.4.0/ipakit/data/bridges/mfa/russian.xml +102 -0
  165. ipakit-0.4.0/ipakit/data/bridges/mfa/serbocroatian.xml +69 -0
  166. ipakit-0.4.0/ipakit/data/bridges/mfa/spanish.xml +43 -0
  167. ipakit-0.4.0/ipakit/data/bridges/mfa/spanish_latin_america.xml +51 -0
  168. ipakit-0.4.0/ipakit/data/bridges/mfa/spanish_spain.xml +52 -0
  169. ipakit-0.4.0/ipakit/data/bridges/mfa/swahili.xml +49 -0
  170. ipakit-0.4.0/ipakit/data/bridges/mfa/swedish.xml +111 -0
  171. ipakit-0.4.0/ipakit/data/bridges/mfa/tamil.xml +63 -0
  172. ipakit-0.4.0/ipakit/data/bridges/mfa/thai.xml +137 -0
  173. ipakit-0.4.0/ipakit/data/bridges/mfa/turkish.xml +77 -0
  174. ipakit-0.4.0/ipakit/data/bridges/mfa/ukrainian.xml +92 -0
  175. ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese.xml +190 -0
  176. ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_hanoi.xml +169 -0
  177. ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_ho_chi_minh_city.xml +132 -0
  178. ipakit-0.4.0/ipakit/data/bridges/mfa/vietnamese_hue.xml +144 -0
  179. ipakit-0.4.0/ipakit/data/bridges/pinyin/pinyin.xml +72 -0
  180. ipakit-0.4.0/ipakit/data/bridges/vocabulary.rng +98 -0
  181. ipakit-0.4.0/ipakit/data/clts/MAPPING-NOTICE.txt +30 -0
  182. ipakit-0.4.0/ipakit/data/clts/NOTICE.txt +29 -0
  183. ipakit-0.4.0/ipakit/data/clts/core.json +18215 -0
  184. ipakit-0.4.0/ipakit/data/clts/import-result.schema.json +208 -0
  185. ipakit-0.4.0/ipakit/data/clts/manifest.json +131 -0
  186. ipakit-0.4.0/ipakit/data/clts/semantic-mapping.json +13191 -0
  187. ipakit-0.4.0/ipakit/data/clts/semantic-rules.json +166 -0
  188. ipakit-0.4.0/ipakit/data/clts/source.json +75 -0
  189. ipakit-0.4.0/ipakit/data/confusion.json +1 -0
  190. ipakit-0.4.0/ipakit/data/feature-models/NOTICE.md +33 -0
  191. ipakit-0.4.0/ipakit/data/feature-models/PANPHON-LICENSE.txt +8 -0
  192. ipakit-0.4.0/ipakit/data/feature-models/panphon-receipt.json +40 -0
  193. ipakit-0.4.0/ipakit/data/feature-models/panphon.xml +6453 -0
  194. ipakit-0.4.0/ipakit/data/heads.rng +286 -0
  195. ipakit-0.4.0/ipakit/data/inventory-cards.rng +28 -0
  196. ipakit-0.4.0/ipakit/data/inventory-cards.xml +71 -0
  197. ipakit-0.4.0/ipakit/data/ipa.rng +392 -0
  198. ipakit-0.4.0/ipakit/data/ipa.xml +1038 -0
  199. ipakit-0.4.0/ipakit/data/mfa-curation.json +18 -0
  200. ipakit-0.4.0/ipakit/data/phoible/CC-BY-SA-3.0.txt +359 -0
  201. ipakit-0.4.0/ipakit/data/phoible/MIT-upstream.txt +22 -0
  202. ipakit-0.4.0/ipakit/data/phoible/NOTICE.txt +33 -0
  203. ipakit-0.4.0/ipakit/data/phoible/data/phoible-references.bib.gz +0 -0
  204. ipakit-0.4.0/ipakit/data/phoible/data/phoible.csv.gz +0 -0
  205. ipakit-0.4.0/ipakit/data/phoible/manifest.json +48 -0
  206. ipakit-0.4.0/ipakit/data/phonemaps/cmu.xml +99 -0
  207. ipakit-0.4.0/ipakit/data/phonemaps/phonemap.rng +97 -0
  208. ipakit-0.4.0/ipakit/data/phonemaps/timit.xml +96 -0
  209. ipakit-0.4.0/ipakit/data/phonemaps/xsampa.xml +182 -0
  210. ipakit-0.4.0/ipakit/data/rules/american-english.rules +420 -0
  211. ipakit-0.4.0/ipakit/data/rules/japanese-moraic.rules +341 -0
  212. ipakit-0.4.0/ipakit/data/syllables/japanese.xml +17 -0
  213. ipakit-0.4.0/ipakit/data/syllables/mandarin.xml +4 -0
  214. ipakit-0.4.0/ipakit/disagreement.py +344 -0
  215. ipakit-0.4.0/ipakit/distance.py +1742 -0
  216. ipakit-0.4.0/ipakit/distance_model.py +913 -0
  217. ipakit-0.4.0/ipakit/distance_registry.py +419 -0
  218. ipakit-0.4.0/ipakit/espeak_source.py +761 -0
  219. ipakit-0.4.0/ipakit/extraction/__init__.py +82 -0
  220. ipakit-0.4.0/ipakit/extraction/mfa.py +464 -0
  221. ipakit-0.4.0/ipakit/extraction/phoible.py +109 -0
  222. ipakit-0.4.0/ipakit/feature_experiment.py +146 -0
  223. ipakit-0.4.0/ipakit/feature_models.py +36 -0
  224. ipakit-0.4.0/ipakit/feature_sets.py +81 -0
  225. ipakit-0.4.0/ipakit/feature_transform.py +339 -0
  226. ipakit-0.4.0/ipakit/features.py +4630 -0
  227. ipakit-0.4.0/ipakit/finite_declaration.py +230 -0
  228. ipakit-0.4.0/ipakit/finite_model.py +230 -0
  229. ipakit-0.4.0/ipakit/form.py +2552 -0
  230. ipakit-0.4.0/ipakit/graph_json.py +17 -0
  231. ipakit-0.4.0/ipakit/hierarchy.py +139 -0
  232. ipakit-0.4.0/ipakit/inventories.py +719 -0
  233. ipakit-0.4.0/ipakit/inventory_operations.py +224 -0
  234. ipakit-0.4.0/ipakit/metric.py +1082 -0
  235. ipakit-0.4.0/ipakit/model_graph.py +475 -0
  236. ipakit-0.4.0/ipakit/models.py +535 -0
  237. ipakit-0.4.0/ipakit/notebooks/ipakit-tutorial.ipynb +1680 -0
  238. ipakit-0.4.0/ipakit/panphon_source.py +113 -0
  239. ipakit-0.4.0/ipakit/phoible_source.py +193 -0
  240. ipakit-0.4.0/ipakit/phoneset_map.py +601 -0
  241. ipakit-0.4.0/ipakit/rules.py +4681 -0
  242. ipakit-0.4.0/ipakit/segment.py +1241 -0
  243. ipakit-0.4.0/ipakit/syllable.py +693 -0
  244. ipakit-0.4.0/ipakit/tiergraph_dot.py +215 -0
  245. ipakit-0.4.0/ipakit/tract.py +2677 -0
  246. ipakit-0.4.0/ipakit/tract_svg.py +2424 -0
  247. ipakit-0.4.0/ipakit.egg-info/PKG-INFO +399 -0
  248. ipakit-0.4.0/ipakit.egg-info/SOURCES.txt +621 -0
  249. ipakit-0.4.0/ipakit.egg-info/requires.txt +33 -0
  250. ipakit-0.4.0/pyproject.toml +207 -0
  251. ipakit-0.4.0/scripts/_comparison_order.py +28 -0
  252. ipakit-0.4.0/scripts/areafunctions.py +2233 -0
  253. ipakit-0.4.0/scripts/clts_import_fixtures.py +81 -0
  254. ipakit-0.4.0/scripts/clts_manifest.py +24 -0
  255. ipakit-0.4.0/scripts/clts_profile_example.py +62 -0
  256. ipakit-0.4.0/scripts/compare_inventories.py +419 -0
  257. ipakit-0.4.0/scripts/consolidation_parity.py +110 -0
  258. ipakit-0.4.0/scripts/consolidation_parity.sha256 +1 -0
  259. ipakit-0.4.0/scripts/containment_oracle.py +709 -0
  260. ipakit-0.4.0/scripts/costmodel_compare.py +288 -0
  261. ipakit-0.4.0/scripts/dev_sources.py +335 -0
  262. ipakit-0.4.0/scripts/docexamples.py +314 -0
  263. ipakit-0.4.0/scripts/espeak_vocabularies.py +654 -0
  264. ipakit-0.4.0/scripts/geometry.py +173 -0
  265. ipakit-0.4.0/scripts/interop.py +1741 -0
  266. ipakit-0.4.0/scripts/invariants.py +1286 -0
  267. ipakit-0.4.0/scripts/inventory_cards.py +464 -0
  268. ipakit-0.4.0/scripts/mfa_vocabularies.py +80 -0
  269. ipakit-0.4.0/scripts/panphon_geometry.py +374 -0
  270. ipakit-0.4.0/scripts/perceptual_validation.py +183 -0
  271. ipakit-0.4.0/scripts/piece1_oracle.py +369 -0
  272. ipakit-0.4.0/scripts/state_of_work.py +172 -0
  273. ipakit-0.4.0/scripts/sweep.py +420 -0
  274. ipakit-0.4.0/scripts/tiergraph_capture.py +656 -0
  275. ipakit-0.4.0/scripts/timit_map.py +240 -0
  276. ipakit-0.4.0/scripts/xsampa_table.py +279 -0
  277. ipakit-0.4.0/tests/ANIMATION_LIMITS.md +23 -0
  278. ipakit-0.4.0/tests/data/form_operation_classification.json +191 -0
  279. ipakit-0.4.0/tests/fixtures/alignment/README.md +17 -0
  280. ipakit-0.4.0/tests/fixtures/alignment/hello-world.json +35 -0
  281. ipakit-0.4.0/tests/fixtures/alignment/hello-world.wav +0 -0
  282. ipakit-0.4.0/tests/fixtures/animation_sha256.json +4 -0
  283. ipakit-0.4.0/tests/fixtures/clts_import/complete.json +1 -0
  284. ipakit-0.4.0/tests/fixtures/clts_import/empty.json +1 -0
  285. ipakit-0.4.0/tests/fixtures/clts_import/error.json +1 -0
  286. ipakit-0.4.0/tests/fixtures/clts_import/preserved.json +1 -0
  287. ipakit-0.4.0/tests/fixtures/clts_import/refused.json +1 -0
  288. ipakit-0.4.0/tests/fixtures/cmudict_excerpt.dict +106 -0
  289. ipakit-0.4.0/tests/fixtures/epiglottal_constriction.json +6 -0
  290. ipakit-0.4.0/tests/fixtures/espeak_cmn_1_52_0.txt +6 -0
  291. ipakit-0.4.0/tests/fixtures/espeak_en_1_52_0.txt +7 -0
  292. ipakit-0.4.0/tests/fixtures/ipa_dict_en_US.txt +7 -0
  293. ipakit-0.4.0/tests/fixtures/mfa_english_us_v3_1_0.dict +28 -0
  294. ipakit-0.4.0/tests/fixtures/phoible/README.md +15 -0
  295. ipakit-0.4.0/tests/fixtures/phoible/data/phoible.csv +4 -0
  296. ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-Bibtex.csv +3 -0
  297. ipakit-0.4.0/tests/fixtures/phoible/mappings/InventoryID-LanguageCodes.csv +3 -0
  298. ipakit-0.4.0/tests/fixtures/posture_golden.json +142 -0
  299. ipakit-0.4.0/tests/fixtures/reference_landmark_distances.json +20 -0
  300. ipakit-0.4.0/tests/fixtures/textgrid/cmudict.TextGrid +36 -0
  301. ipakit-0.4.0/tests/fixtures/textgrid/cmudict_stress.TextGrid +36 -0
  302. ipakit-0.4.0/tests/fixtures/textgrid/mfa_two_words.TextGrid +60 -0
  303. ipakit-0.4.0/tests/fixtures/textgrid/mfa_untied.TextGrid +36 -0
  304. ipakit-0.4.0/tests/fixtures/textgrid/prosody_hello.TextGrid +95 -0
  305. ipakit-0.4.0/tests/fixtures/velic_contrast.json +5 -0
  306. ipakit-0.4.0/tests/fixtures/xrmb_anchor_prompts.json +18 -0
  307. ipakit-0.4.0/tests/license-classes.json +168 -0
  308. ipakit-0.4.0/tests/panphon/panphon.rng +83 -0
  309. ipakit-0.4.0/tests/panphon/shared-corpus.txt +14 -0
  310. ipakit-0.4.0/tests/test_agreement.py +560 -0
  311. ipakit-0.4.0/tests/test_analysis.py +485 -0
  312. ipakit-0.4.0/tests/test_api.py +162 -0
  313. ipakit-0.4.0/tests/test_api_contracts.py +175 -0
  314. ipakit-0.4.0/tests/test_bilabial_nasal_release.py +64 -0
  315. ipakit-0.4.0/tests/test_boundary_distance.py +201 -0
  316. ipakit-0.4.0/tests/test_bridges.py +385 -0
  317. ipakit-0.4.0/tests/test_ci_contract.py +371 -0
  318. ipakit-0.4.0/tests/test_cli.py +2217 -0
  319. ipakit-0.4.0/tests/test_cli_distance_registry.py +80 -0
  320. ipakit-0.4.0/tests/test_cli_hygiene.py +922 -0
  321. ipakit-0.4.0/tests/test_cli_model.py +284 -0
  322. ipakit-0.4.0/tests/test_cli_model_query.py +72 -0
  323. ipakit-0.4.0/tests/test_cli_model_rules.py +487 -0
  324. ipakit-0.4.0/tests/test_cli_model_transform_compare.py +170 -0
  325. ipakit-0.4.0/tests/test_cli_version.py +17 -0
  326. ipakit-0.4.0/tests/test_clts_audit.py +300 -0
  327. ipakit-0.4.0/tests/test_clts_import.py +911 -0
  328. ipakit-0.4.0/tests/test_clts_import_schema.py +123 -0
  329. ipakit-0.4.0/tests/test_clts_input.py +172 -0
  330. ipakit-0.4.0/tests/test_clts_manifest.py +307 -0
  331. ipakit-0.4.0/tests/test_clts_mapping.py +1191 -0
  332. ipakit-0.4.0/tests/test_clts_packaging.py +128 -0
  333. ipakit-0.4.0/tests/test_clts_snapshot.py +390 -0
  334. ipakit-0.4.0/tests/test_coherent_composition.py +707 -0
  335. ipakit-0.4.0/tests/test_comparison_example.py +73 -0
  336. ipakit-0.4.0/tests/test_confusion.py +75 -0
  337. ipakit-0.4.0/tests/test_constriction_location.py +815 -0
  338. ipakit-0.4.0/tests/test_corpus_kernel.py +317 -0
  339. ipakit-0.4.0/tests/test_corpus_query.py +153 -0
  340. ipakit-0.4.0/tests/test_costmodel.py +464 -0
  341. ipakit-0.4.0/tests/test_costmodel_accumulation.py +86 -0
  342. ipakit-0.4.0/tests/test_costmodel_admission.py +69 -0
  343. ipakit-0.4.0/tests/test_costmodel_normalization.py +77 -0
  344. ipakit-0.4.0/tests/test_declared_not_hardcoded.py +1216 -0
  345. ipakit-0.4.0/tests/test_denominator.py +129 -0
  346. ipakit-0.4.0/tests/test_descriptions.py +77 -0
  347. ipakit-0.4.0/tests/test_dev_sources.py +484 -0
  348. ipakit-0.4.0/tests/test_distance.py +586 -0
  349. ipakit-0.4.0/tests/test_distance_model.py +828 -0
  350. ipakit-0.4.0/tests/test_distance_registry.py +300 -0
  351. ipakit-0.4.0/tests/test_distinctive_difference.py +102 -0
  352. ipakit-0.4.0/tests/test_espeak_generator.py +120 -0
  353. ipakit-0.4.0/tests/test_extraction.py +43 -0
  354. ipakit-0.4.0/tests/test_feature_experiment.py +349 -0
  355. ipakit-0.4.0/tests/test_feature_models.py +47 -0
  356. ipakit-0.4.0/tests/test_feature_reads.py +143 -0
  357. ipakit-0.4.0/tests/test_feature_realization.py +297 -0
  358. ipakit-0.4.0/tests/test_feature_transform.py +321 -0
  359. ipakit-0.4.0/tests/test_features.py +207 -0
  360. ipakit-0.4.0/tests/test_features_narrowing.py +738 -0
  361. ipakit-0.4.0/tests/test_finite_model.py +344 -0
  362. ipakit-0.4.0/tests/test_form.py +1033 -0
  363. ipakit-0.4.0/tests/test_form_native_profile.py +655 -0
  364. ipakit-0.4.0/tests/test_form_operation_classification.py +174 -0
  365. ipakit-0.4.0/tests/test_form_reader_admission.py +134 -0
  366. ipakit-0.4.0/tests/test_geometry_doc.py +50 -0
  367. ipakit-0.4.0/tests/test_indel_costs.py +679 -0
  368. ipakit-0.4.0/tests/test_inventories.py +820 -0
  369. ipakit-0.4.0/tests/test_inventory_cards.py +62 -0
  370. ipakit-0.4.0/tests/test_inventory_operations.py +210 -0
  371. ipakit-0.4.0/tests/test_japanese_mora_regressions.py +150 -0
  372. ipakit-0.4.0/tests/test_kana_provenance.py +45 -0
  373. ipakit-0.4.0/tests/test_library_hygiene.py +458 -0
  374. ipakit-0.4.0/tests/test_license.py +88 -0
  375. ipakit-0.4.0/tests/test_license_classes.py +457 -0
  376. ipakit-0.4.0/tests/test_ligature_aliases.py +481 -0
  377. ipakit-0.4.0/tests/test_linking_and_agreement.py +84 -0
  378. ipakit-0.4.0/tests/test_metric.py +1200 -0
  379. ipakit-0.4.0/tests/test_mfa_vocabularies.py +135 -0
  380. ipakit-0.4.0/tests/test_model_graph.py +333 -0
  381. ipakit-0.4.0/tests/test_model_rules.py +463 -0
  382. ipakit-0.4.0/tests/test_models.py +175 -0
  383. ipakit-0.4.0/tests/test_nearest_pronunciation.py +113 -0
  384. ipakit-0.4.0/tests/test_nonfinal_modifiers.py +273 -0
  385. ipakit-0.4.0/tests/test_one_composition.py +470 -0
  386. ipakit-0.4.0/tests/test_overlong.py +50 -0
  387. ipakit-0.4.0/tests/test_packaging.py +749 -0
  388. ipakit-0.4.0/tests/test_panphon_geometry.py +113 -0
  389. ipakit-0.4.0/tests/test_panphon_live_geometry.py +132 -0
  390. ipakit-0.4.0/tests/test_panphon_receipt.py +110 -0
  391. ipakit-0.4.0/tests/test_phoible.py +128 -0
  392. ipakit-0.4.0/tests/test_phoible_packaging.py +95 -0
  393. ipakit-0.4.0/tests/test_phoible_receipt.py +128 -0
  394. ipakit-0.4.0/tests/test_phoible_source.py +185 -0
  395. ipakit-0.4.0/tests/test_phoneset_comparison.py +206 -0
  396. ipakit-0.4.0/tests/test_posture_no_side_channel.py +199 -0
  397. ipakit-0.4.0/tests/test_projection_coherence.py +277 -0
  398. ipakit-0.4.0/tests/test_prosodic_riders.py +132 -0
  399. ipakit-0.4.0/tests/test_query.py +1113 -0
  400. ipakit-0.4.0/tests/test_query_dsl.py +174 -0
  401. ipakit-0.4.0/tests/test_redundant_marks.py +80 -0
  402. ipakit-0.4.0/tests/test_rule_sets.py +2303 -0
  403. ipakit-0.4.0/tests/test_rules.py +2994 -0
  404. ipakit-0.4.0/tests/test_scalar_reads.py +117 -0
  405. ipakit-0.4.0/tests/test_schema.py +848 -0
  406. ipakit-0.4.0/tests/test_search.py +277 -0
  407. ipakit-0.4.0/tests/test_sequence_scoring.py +188 -0
  408. ipakit-0.4.0/tests/test_superscript_releases.py +81 -0
  409. ipakit-0.4.0/tests/test_supplements.py +716 -0
  410. ipakit-0.4.0/tests/test_syllable_docs.py +42 -0
  411. ipakit-0.4.0/tests/test_syllable_japanese.py +82 -0
  412. ipakit-0.4.0/tests/test_tap_duration.py +327 -0
  413. ipakit-0.4.0/tests/test_textgrid.py +485 -0
  414. ipakit-0.4.0/tests/test_tie_sense.py +384 -0
  415. ipakit-0.4.0/tests/test_tiergraph_acceptance_docs.py +53 -0
  416. ipakit-0.4.0/tests/test_tiers.py +210 -0
  417. ipakit-0.4.0/tests/test_timit_map.py +66 -0
  418. ipakit-0.4.0/tests/test_tokenization.py +571 -0
  419. ipakit-0.4.0/tests/test_tone_contours.py +399 -0
  420. ipakit-0.4.0/tests/test_tract_figures.py +2331 -0
  421. ipakit-0.4.0/tests/test_transcription_distance.py +117 -0
  422. ipakit-0.4.0/tests/test_unicode_recomposition.py +101 -0
  423. ipakit-0.4.0/tests/test_unplaced_marks.py +344 -0
  424. ipakit-0.4.0/tests/test_unspelled_anchor.py +64 -0
  425. ipakit-0.4.0/tests/test_variable_width.py +228 -0
  426. ipakit-0.4.0/tests/test_vowel_tract_limit.py +407 -0
  427. ipakit-0.4.0/tests/test_xsampa.py +780 -0
  428. ipakit-0.4.0/tests/test_zero.py +818 -0
  429. ipakit-0.4.0/tests/tiergraph/baselines/MANIFEST.sha256 +13 -0
  430. ipakit-0.4.0/tests/tiergraph/baselines/README.md +15 -0
  431. ipakit-0.4.0/tests/tiergraph/baselines/capture-metadata.json +12 -0
  432. ipakit-0.4.0/tests/tiergraph/baselines/containment-navigation.json +12416 -0
  433. ipakit-0.4.0/tests/tiergraph/baselines/coordinates.json +1043 -0
  434. ipakit-0.4.0/tests/tiergraph/baselines/derived-artifacts.json +119 -0
  435. ipakit-0.4.0/tests/tiergraph/baselines/distance-alignments.json +820 -0
  436. ipakit-0.4.0/tests/tiergraph/baselines/perturbation-proof.json +23 -0
  437. ipakit-0.4.0/tests/tiergraph/baselines/piece1-canonical-store.json +248 -0
  438. ipakit-0.4.0/tests/tiergraph/choice_selection_v1.json +421 -0
  439. ipakit-0.4.0/tests/tiergraph/cmudict/pocketsphinx.tsv +4 -0
  440. ipakit-0.4.0/tests/tiergraph/cmudict/upstream.json +7 -0
  441. ipakit-0.4.0/tests/tiergraph/fixtures/choices_and_containment.json +14 -0
  442. ipakit-0.4.0/tests/tiergraph/fixtures/clock_and_ordering.json +10 -0
  443. ipakit-0.4.0/tests/tiergraph/fixtures/clts_core_bipa_profile.json +2106 -0
  444. ipakit-0.4.0/tests/tiergraph/fixtures/duration_and_relation_endpoints.json +17 -0
  445. ipakit-0.4.0/tests/tiergraph/fixtures/endpoints.json +13 -0
  446. ipakit-0.4.0/tests/tiergraph/fixtures/hot_bridge_projection.json +2931 -0
  447. ipakit-0.4.0/tests/tiergraph/fixtures/index.json +1 -0
  448. ipakit-0.4.0/tests/tiergraph/fixtures/prosodic_deliveries.json +11 -0
  449. ipakit-0.4.0/tests/tiergraph/fixtures/signature_edits.json +9 -0
  450. ipakit-0.4.0/tests/tiergraph/fixtures/unit_coordinates.json +10 -0
  451. ipakit-0.4.0/tests/tiergraph/structured_segment_v3.json +39 -0
  452. ipakit-0.4.0/tests/tiergraph/test_clts_profile.py +996 -0
  453. ipakit-0.4.0/tests/tiergraph/test_codecs.py +184 -0
  454. ipakit-0.4.0/tests/tiergraph/test_declared_values.py +529 -0
  455. ipakit-0.4.0/tests/tiergraph/test_dot.py +262 -0
  456. ipakit-0.4.0/tests/tiergraph/test_fixture_wellformedness.py +158 -0
  457. ipakit-0.4.0/tests/tiergraph/test_form_store.py +456 -0
  458. ipakit-0.4.0/tests/tiergraph/test_gesture_integration.py +167 -0
  459. ipakit-0.4.0/tests/tiergraph/test_ipa_graph.py +164 -0
  460. ipakit-0.4.0/tests/tiergraph/test_lane_m_stabilization.py +153 -0
  461. ipakit-0.4.0/tests/tiergraph/test_piece1_oracle.py +40 -0
  462. ipakit-0.4.0/tests/tiergraph/test_pinyin_correctness.py +244 -0
  463. ipakit-0.4.0/tests/tiergraph/test_rewrite_bridge.py +412 -0
  464. ipakit-0.4.0/tests/tiergraph/test_scalar_attribute.py +19 -0
  465. ipakit-0.2.0/CHANGELOG.md +0 -328
  466. ipakit-0.2.0/MANIFEST.in +0 -42
  467. ipakit-0.2.0/Makefile +0 -169
  468. ipakit-0.2.0/PKG-INFO +0 -367
  469. ipakit-0.2.0/README.md +0 -323
  470. ipakit-0.2.0/conftest.py +0 -32
  471. ipakit-0.2.0/docs/README.md +0 -107
  472. ipakit-0.2.0/docs/articulatory-data.md +0 -342
  473. ipakit-0.2.0/docs/calculus.md +0 -411
  474. ipakit-0.2.0/docs/cli-api-sync.md +0 -44
  475. ipakit-0.2.0/docs/corpus.md +0 -228
  476. ipakit-0.2.0/docs/design/braces.md +0 -512
  477. ipakit-0.2.0/docs/design/conlang.md +0 -644
  478. ipakit-0.2.0/docs/design/ecosystem.md +0 -613
  479. ipakit-0.2.0/docs/design/frontal-view.md +0 -100
  480. ipakit-0.2.0/docs/design/historical-linguistics.md +0 -109
  481. ipakit-0.2.0/docs/design/interop.md +0 -783
  482. ipakit-0.2.0/docs/design/ip-p1-store-approach.md +0 -37
  483. ipakit-0.2.0/docs/design/mass-budget.md +0 -85
  484. ipakit-0.2.0/docs/design/piece1-canonical-store.md +0 -118
  485. ipakit-0.2.0/docs/design/samprosa.md +0 -380
  486. ipakit-0.2.0/docs/design/supplement-bridges.md +0 -309
  487. ipakit-0.2.0/docs/design/tiers.md +0 -273
  488. ipakit-0.2.0/docs/distance.md +0 -567
  489. ipakit-0.2.0/docs/espeak-vocabularies.md +0 -12
  490. ipakit-0.2.0/docs/form.md +0 -312
  491. ipakit-0.2.0/docs/gestural-model.md +0 -59
  492. ipakit-0.2.0/docs/glossary.md +0 -86
  493. ipakit-0.2.0/docs/house-style-exhibits.md +0 -74
  494. ipakit-0.2.0/docs/house-style.md +0 -111
  495. ipakit-0.2.0/docs/inventories.md +0 -37
  496. ipakit-0.2.0/docs/releasing.md +0 -126
  497. ipakit-0.2.0/docs/representation.md +0 -113
  498. ipakit-0.2.0/docs/reviewing.md +0 -159
  499. ipakit-0.2.0/docs/rules.md +0 -919
  500. ipakit-0.2.0/docs/similarity.md +0 -147
  501. ipakit-0.2.0/docs/state-of-the-work.md +0 -89
  502. ipakit-0.2.0/docs/supplements.md +0 -186
  503. ipakit-0.2.0/docs/syllabification.md +0 -130
  504. ipakit-0.2.0/docs/tiergraph-acceptance.md +0 -30
  505. ipakit-0.2.0/docs/ties.md +0 -156
  506. ipakit-0.2.0/docs/tone.md +0 -142
  507. ipakit-0.2.0/docs/tract-anatomy.md +0 -235
  508. ipakit-0.2.0/docs/tract-figures.md +0 -152
  509. ipakit-0.2.0/docs/tract-reference.md +0 -68
  510. ipakit-0.2.0/docs/tutorial-basics.md +0 -117
  511. ipakit-0.2.0/docs/tutorial-basics.src.md +0 -114
  512. ipakit-0.2.0/docs/tutorial.md +0 -1011
  513. ipakit-0.2.0/docs/tutorial.src.md +0 -849
  514. ipakit-0.2.0/ipakit/__init__.py +0 -1901
  515. ipakit-0.2.0/ipakit/_base.py +0 -145
  516. ipakit-0.2.0/ipakit/_cmu_graph.py +0 -184
  517. ipakit-0.2.0/ipakit/_codecs.py +0 -289
  518. ipakit-0.2.0/ipakit/_containment_projection.py +0 -1134
  519. ipakit-0.2.0/ipakit/_convert.py +0 -248
  520. ipakit-0.2.0/ipakit/_corpus.py +0 -740
  521. ipakit-0.2.0/ipakit/_corpus_query.py +0 -420
  522. ipakit-0.2.0/ipakit/_fact_builder.py +0 -564
  523. ipakit-0.2.0/ipakit/_gesture_backend.py +0 -136
  524. ipakit-0.2.0/ipakit/_gesture_graph.py +0 -142
  525. ipakit-0.2.0/ipakit/_graph_facts.py +0 -274
  526. ipakit-0.2.0/ipakit/_ipa_graph.py +0 -244
  527. ipakit-0.2.0/ipakit/_katakana_codec.py +0 -17
  528. ipakit-0.2.0/ipakit/_pinyin_graph.py +0 -185
  529. ipakit-0.2.0/ipakit/_rewrite_graph.py +0 -382
  530. ipakit-0.2.0/ipakit/align.py +0 -275
  531. ipakit-0.2.0/ipakit/analysis.py +0 -934
  532. ipakit-0.2.0/ipakit/bridges/__init__.py +0 -67
  533. ipakit-0.2.0/ipakit/bridges/base.py +0 -42
  534. ipakit-0.2.0/ipakit/bridges/costmodel.py +0 -743
  535. ipakit-0.2.0/ipakit/bridges/espeak.py +0 -25
  536. ipakit-0.2.0/ipakit/bridges/kana.py +0 -53
  537. ipakit-0.2.0/ipakit/bridges/mfa.py +0 -84
  538. ipakit-0.2.0/ipakit/bridges/phoible.py +0 -299
  539. ipakit-0.2.0/ipakit/bridges/pinyin.py +0 -113
  540. ipakit-0.2.0/ipakit/bridges/vocabulary.py +0 -610
  541. ipakit-0.2.0/ipakit/cli/__init__.py +0 -242
  542. ipakit-0.2.0/ipakit/cli/analysis_cmds.py +0 -334
  543. ipakit-0.2.0/ipakit/cli/analyze.py +0 -381
  544. ipakit-0.2.0/ipakit/cli/base.py +0 -415
  545. ipakit-0.2.0/ipakit/cli/convert.py +0 -754
  546. ipakit-0.2.0/ipakit/cli/corpus.py +0 -334
  547. ipakit-0.2.0/ipakit/cli/distance.py +0 -1199
  548. ipakit-0.2.0/ipakit/cli/features.py +0 -174
  549. ipakit-0.2.0/ipakit/cli/hierarchy.py +0 -188
  550. ipakit-0.2.0/ipakit/cli/info.py +0 -79
  551. ipakit-0.2.0/ipakit/cli/inventory.py +0 -156
  552. ipakit-0.2.0/ipakit/cli/notebook.py +0 -63
  553. ipakit-0.2.0/ipakit/cli/phoible.py +0 -113
  554. ipakit-0.2.0/ipakit/cli/policy.py +0 -128
  555. ipakit-0.2.0/ipakit/cli/query.py +0 -581
  556. ipakit-0.2.0/ipakit/cli/rules.py +0 -1038
  557. ipakit-0.2.0/ipakit/cli/textgrid.py +0 -137
  558. ipakit-0.2.0/ipakit/cli/tract.py +0 -173
  559. ipakit-0.2.0/ipakit/data/bridges/espeak/af.xml +0 -181
  560. ipakit-0.2.0/ipakit/data/bridges/espeak/am.xml +0 -133
  561. ipakit-0.2.0/ipakit/data/bridges/espeak/an.xml +0 -164
  562. ipakit-0.2.0/ipakit/data/bridges/espeak/ar.xml +0 -136
  563. ipakit-0.2.0/ipakit/data/bridges/espeak/as.xml +0 -191
  564. ipakit-0.2.0/ipakit/data/bridges/espeak/az.xml +0 -164
  565. ipakit-0.2.0/ipakit/data/bridges/espeak/ba.xml +0 -147
  566. ipakit-0.2.0/ipakit/data/bridges/espeak/be.xml +0 -164
  567. ipakit-0.2.0/ipakit/data/bridges/espeak/bg.xml +0 -149
  568. ipakit-0.2.0/ipakit/data/bridges/espeak/bn.xml +0 -191
  569. ipakit-0.2.0/ipakit/data/bridges/espeak/bpy.xml +0 -191
  570. ipakit-0.2.0/ipakit/data/bridges/espeak/ca-ba.xml +0 -172
  571. ipakit-0.2.0/ipakit/data/bridges/espeak/ca-nw.xml +0 -172
  572. ipakit-0.2.0/ipakit/data/bridges/espeak/ca-va.xml +0 -172
  573. ipakit-0.2.0/ipakit/data/bridges/espeak/ca.xml +0 -172
  574. ipakit-0.2.0/ipakit/data/bridges/espeak/chr.xml +0 -192
  575. ipakit-0.2.0/ipakit/data/bridges/espeak/cmn.xml +0 -203
  576. ipakit-0.2.0/ipakit/data/bridges/espeak/cs.xml +0 -170
  577. ipakit-0.2.0/ipakit/data/bridges/espeak/cv.xml +0 -168
  578. ipakit-0.2.0/ipakit/data/bridges/espeak/cy.xml +0 -173
  579. ipakit-0.2.0/ipakit/data/bridges/espeak/da.xml +0 -181
  580. ipakit-0.2.0/ipakit/data/bridges/espeak/de.xml +0 -181
  581. ipakit-0.2.0/ipakit/data/bridges/espeak/el.xml +0 -157
  582. ipakit-0.2.0/ipakit/data/bridges/espeak/en-n.xml +0 -230
  583. ipakit-0.2.0/ipakit/data/bridges/espeak/en-rp.xml +0 -230
  584. ipakit-0.2.0/ipakit/data/bridges/espeak/en-sc.xml +0 -232
  585. ipakit-0.2.0/ipakit/data/bridges/espeak/en-us-nyc.xml +0 -229
  586. ipakit-0.2.0/ipakit/data/bridges/espeak/en-us.xml +0 -229
  587. ipakit-0.2.0/ipakit/data/bridges/espeak/en-wi.xml +0 -230
  588. ipakit-0.2.0/ipakit/data/bridges/espeak/en-wm.xml +0 -230
  589. ipakit-0.2.0/ipakit/data/bridges/espeak/en.xml +0 -70
  590. ipakit-0.2.0/ipakit/data/bridges/espeak/eo.xml +0 -140
  591. ipakit-0.2.0/ipakit/data/bridges/espeak/es-la.xml +0 -161
  592. ipakit-0.2.0/ipakit/data/bridges/espeak/es.xml +0 -161
  593. ipakit-0.2.0/ipakit/data/bridges/espeak/et.xml +0 -166
  594. ipakit-0.2.0/ipakit/data/bridges/espeak/eu.xml +0 -162
  595. ipakit-0.2.0/ipakit/data/bridges/espeak/fa.xml +0 -133
  596. ipakit-0.2.0/ipakit/data/bridges/espeak/fi.xml +0 -178
  597. ipakit-0.2.0/ipakit/data/bridges/espeak/fo.xml +0 -193
  598. ipakit-0.2.0/ipakit/data/bridges/espeak/fr.xml +0 -177
  599. ipakit-0.2.0/ipakit/data/bridges/espeak/ga.xml +0 -171
  600. ipakit-0.2.0/ipakit/data/bridges/espeak/gd.xml +0 -176
  601. ipakit-0.2.0/ipakit/data/bridges/espeak/gn.xml +0 -141
  602. ipakit-0.2.0/ipakit/data/bridges/espeak/grc.xml +0 -165
  603. ipakit-0.2.0/ipakit/data/bridges/espeak/gu.xml +0 -192
  604. ipakit-0.2.0/ipakit/data/bridges/espeak/hak.xml +0 -167
  605. ipakit-0.2.0/ipakit/data/bridges/espeak/haw.xml +0 -148
  606. ipakit-0.2.0/ipakit/data/bridges/espeak/he.xml +0 -127
  607. ipakit-0.2.0/ipakit/data/bridges/espeak/hi.xml +0 -188
  608. ipakit-0.2.0/ipakit/data/bridges/espeak/hr.xml +0 -179
  609. ipakit-0.2.0/ipakit/data/bridges/espeak/ht.xml +0 -177
  610. ipakit-0.2.0/ipakit/data/bridges/espeak/hu.xml +0 -146
  611. ipakit-0.2.0/ipakit/data/bridges/espeak/hy.xml +0 -144
  612. ipakit-0.2.0/ipakit/data/bridges/espeak/ia.xml +0 -140
  613. ipakit-0.2.0/ipakit/data/bridges/espeak/id.xml +0 -163
  614. ipakit-0.2.0/ipakit/data/bridges/espeak/is.xml +0 -171
  615. ipakit-0.2.0/ipakit/data/bridges/espeak/it.xml +0 -176
  616. ipakit-0.2.0/ipakit/data/bridges/espeak/ja.xml +0 -138
  617. ipakit-0.2.0/ipakit/data/bridges/espeak/jbo.xml +0 -140
  618. ipakit-0.2.0/ipakit/data/bridges/espeak/ka.xml +0 -134
  619. ipakit-0.2.0/ipakit/data/bridges/espeak/kaa.xml +0 -144
  620. ipakit-0.2.0/ipakit/data/bridges/espeak/kk.xml +0 -144
  621. ipakit-0.2.0/ipakit/data/bridges/espeak/kl.xml +0 -145
  622. ipakit-0.2.0/ipakit/data/bridges/espeak/kn.xml +0 -188
  623. ipakit-0.2.0/ipakit/data/bridges/espeak/ko.xml +0 -140
  624. ipakit-0.2.0/ipakit/data/bridges/espeak/kok.xml +0 -191
  625. ipakit-0.2.0/ipakit/data/bridges/espeak/ku.xml +0 -166
  626. ipakit-0.2.0/ipakit/data/bridges/espeak/ky.xml +0 -136
  627. ipakit-0.2.0/ipakit/data/bridges/espeak/la.xml +0 -154
  628. ipakit-0.2.0/ipakit/data/bridges/espeak/lb.xml +0 -171
  629. ipakit-0.2.0/ipakit/data/bridges/espeak/lt.xml +0 -179
  630. ipakit-0.2.0/ipakit/data/bridges/espeak/lv.xml +0 -164
  631. ipakit-0.2.0/ipakit/data/bridges/espeak/mi.xml +0 -163
  632. ipakit-0.2.0/ipakit/data/bridges/espeak/mk.xml +0 -180
  633. ipakit-0.2.0/ipakit/data/bridges/espeak/ml.xml +0 -193
  634. ipakit-0.2.0/ipakit/data/bridges/espeak/mr.xml +0 -192
  635. ipakit-0.2.0/ipakit/data/bridges/espeak/ms.xml +0 -163
  636. ipakit-0.2.0/ipakit/data/bridges/espeak/mt.xml +0 -167
  637. ipakit-0.2.0/ipakit/data/bridges/espeak/mto.xml +0 -170
  638. ipakit-0.2.0/ipakit/data/bridges/espeak/my.xml +0 -246
  639. ipakit-0.2.0/ipakit/data/bridges/espeak/nci.xml +0 -157
  640. ipakit-0.2.0/ipakit/data/bridges/espeak/ne.xml +0 -204
  641. ipakit-0.2.0/ipakit/data/bridges/espeak/nl.xml +0 -164
  642. ipakit-0.2.0/ipakit/data/bridges/espeak/no.xml +0 -168
  643. ipakit-0.2.0/ipakit/data/bridges/espeak/nog.xml +0 -144
  644. ipakit-0.2.0/ipakit/data/bridges/espeak/nso.xml +0 -133
  645. ipakit-0.2.0/ipakit/data/bridges/espeak/om.xml +0 -144
  646. ipakit-0.2.0/ipakit/data/bridges/espeak/or.xml +0 -191
  647. ipakit-0.2.0/ipakit/data/bridges/espeak/pa.xml +0 -191
  648. ipakit-0.2.0/ipakit/data/bridges/espeak/piqd.xml +0 -176
  649. ipakit-0.2.0/ipakit/data/bridges/espeak/pl.xml +0 -147
  650. ipakit-0.2.0/ipakit/data/bridges/espeak/prs.xml +0 -135
  651. ipakit-0.2.0/ipakit/data/bridges/espeak/pt-pt.xml +0 -185
  652. ipakit-0.2.0/ipakit/data/bridges/espeak/pt.xml +0 -185
  653. ipakit-0.2.0/ipakit/data/bridges/espeak/py.xml +0 -144
  654. ipakit-0.2.0/ipakit/data/bridges/espeak/qdb.xml +0 -230
  655. ipakit-0.2.0/ipakit/data/bridges/espeak/qu.xml +0 -132
  656. ipakit-0.2.0/ipakit/data/bridges/espeak/quc.xml +0 -127
  657. ipakit-0.2.0/ipakit/data/bridges/espeak/qya.xml +0 -159
  658. ipakit-0.2.0/ipakit/data/bridges/espeak/ro.xml +0 -191
  659. ipakit-0.2.0/ipakit/data/bridges/espeak/ru-lv.xml +0 -177
  660. ipakit-0.2.0/ipakit/data/bridges/espeak/ru.xml +0 -177
  661. ipakit-0.2.0/ipakit/data/bridges/espeak/sd.xml +0 -188
  662. ipakit-0.2.0/ipakit/data/bridges/espeak/shn.xml +0 -171
  663. ipakit-0.2.0/ipakit/data/bridges/espeak/si.xml +0 -194
  664. ipakit-0.2.0/ipakit/data/bridges/espeak/sjn.xml +0 -161
  665. ipakit-0.2.0/ipakit/data/bridges/espeak/sk.xml +0 -170
  666. ipakit-0.2.0/ipakit/data/bridges/espeak/sl.xml +0 -150
  667. ipakit-0.2.0/ipakit/data/bridges/espeak/smj.xml +0 -189
  668. ipakit-0.2.0/ipakit/data/bridges/espeak/sq.xml +0 -159
  669. ipakit-0.2.0/ipakit/data/bridges/espeak/sr.xml +0 -181
  670. ipakit-0.2.0/ipakit/data/bridges/espeak/sv.xml +0 -160
  671. ipakit-0.2.0/ipakit/data/bridges/espeak/sw.xml +0 -127
  672. ipakit-0.2.0/ipakit/data/bridges/espeak/ta.xml +0 -194
  673. ipakit-0.2.0/ipakit/data/bridges/espeak/te.xml +0 -188
  674. ipakit-0.2.0/ipakit/data/bridges/espeak/th.xml +0 -171
  675. ipakit-0.2.0/ipakit/data/bridges/espeak/ti.xml +0 -134
  676. ipakit-0.2.0/ipakit/data/bridges/espeak/tk.xml +0 -173
  677. ipakit-0.2.0/ipakit/data/bridges/espeak/tn.xml +0 -145
  678. ipakit-0.2.0/ipakit/data/bridges/espeak/tr.xml +0 -164
  679. ipakit-0.2.0/ipakit/data/bridges/espeak/tt.xml +0 -147
  680. ipakit-0.2.0/ipakit/data/bridges/espeak/ug.xml +0 -166
  681. ipakit-0.2.0/ipakit/data/bridges/espeak/uk.xml +0 -133
  682. ipakit-0.2.0/ipakit/data/bridges/espeak/ur.xml +0 -188
  683. ipakit-0.2.0/ipakit/data/bridges/espeak/uz.xml +0 -147
  684. ipakit-0.2.0/ipakit/data/bridges/espeak/vi-hue.xml +0 -193
  685. ipakit-0.2.0/ipakit/data/bridges/espeak/vi-sgn.xml +0 -191
  686. ipakit-0.2.0/ipakit/data/bridges/espeak/vi.xml +0 -200
  687. ipakit-0.2.0/ipakit/data/bridges/espeak/yue.xml +0 -180
  688. ipakit-0.2.0/ipakit/data/bridges/kana/kana.xml +0 -15
  689. ipakit-0.2.0/ipakit/data/bridges/mfa/arabic.xml +0 -81
  690. ipakit-0.2.0/ipakit/data/bridges/mfa/bulgarian.xml +0 -54
  691. ipakit-0.2.0/ipakit/data/bridges/mfa/croatian.xml +0 -73
  692. ipakit-0.2.0/ipakit/data/bridges/mfa/czech.xml +0 -56
  693. ipakit-0.2.0/ipakit/data/bridges/mfa/english.xml +0 -104
  694. ipakit-0.2.0/ipakit/data/bridges/mfa/english_india.xml +0 -73
  695. ipakit-0.2.0/ipakit/data/bridges/mfa/english_nigeria.xml +0 -75
  696. ipakit-0.2.0/ipakit/data/bridges/mfa/english_nonnative.xml +0 -100
  697. ipakit-0.2.0/ipakit/data/bridges/mfa/english_uk.xml +0 -85
  698. ipakit-0.2.0/ipakit/data/bridges/mfa/english_us.xml +0 -86
  699. ipakit-0.2.0/ipakit/data/bridges/mfa/french.xml +0 -51
  700. ipakit-0.2.0/ipakit/data/bridges/mfa/german.xml +0 -60
  701. ipakit-0.2.0/ipakit/data/bridges/mfa/hausa.xml +0 -84
  702. ipakit-0.2.0/ipakit/data/bridges/mfa/japanese.xml +0 -91
  703. ipakit-0.2.0/ipakit/data/bridges/mfa/korean.xml +0 -113
  704. ipakit-0.2.0/ipakit/data/bridges/mfa/korean_jamo.xml +0 -64
  705. ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin.xml +0 -127
  706. ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_china.xml +0 -147
  707. ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_erhua.xml +0 -127
  708. ipakit-0.2.0/ipakit/data/bridges/mfa/mandarin_taiwan.xml +0 -138
  709. ipakit-0.2.0/ipakit/data/bridges/mfa/mfa.xml +0 -851
  710. ipakit-0.2.0/ipakit/data/bridges/mfa/polish.xml +0 -58
  711. ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese.xml +0 -53
  712. ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese_brazil.xml +0 -48
  713. ipakit-0.2.0/ipakit/data/bridges/mfa/portuguese_portugal.xml +0 -52
  714. ipakit-0.2.0/ipakit/data/bridges/mfa/russian.xml +0 -102
  715. ipakit-0.2.0/ipakit/data/bridges/mfa/serbocroatian.xml +0 -69
  716. ipakit-0.2.0/ipakit/data/bridges/mfa/spanish.xml +0 -43
  717. ipakit-0.2.0/ipakit/data/bridges/mfa/spanish_latin_america.xml +0 -51
  718. ipakit-0.2.0/ipakit/data/bridges/mfa/spanish_spain.xml +0 -52
  719. ipakit-0.2.0/ipakit/data/bridges/mfa/swahili.xml +0 -49
  720. ipakit-0.2.0/ipakit/data/bridges/mfa/swedish.xml +0 -111
  721. ipakit-0.2.0/ipakit/data/bridges/mfa/tamil.xml +0 -63
  722. ipakit-0.2.0/ipakit/data/bridges/mfa/thai.xml +0 -137
  723. ipakit-0.2.0/ipakit/data/bridges/mfa/turkish.xml +0 -77
  724. ipakit-0.2.0/ipakit/data/bridges/mfa/ukrainian.xml +0 -92
  725. ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese.xml +0 -190
  726. ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_hanoi.xml +0 -169
  727. ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_ho_chi_minh_city.xml +0 -132
  728. ipakit-0.2.0/ipakit/data/bridges/mfa/vietnamese_hue.xml +0 -144
  729. ipakit-0.2.0/ipakit/data/bridges/pinyin/pinyin.xml +0 -49
  730. ipakit-0.2.0/ipakit/data/bridges/vocabulary.rng +0 -94
  731. ipakit-0.2.0/ipakit/data/confusion.json +0 -1
  732. ipakit-0.2.0/ipakit/data/heads.rng +0 -279
  733. ipakit-0.2.0/ipakit/data/ipa.rng +0 -379
  734. ipakit-0.2.0/ipakit/data/ipa.xml +0 -1011
  735. ipakit-0.2.0/ipakit/data/phonemaps/cmu.xml +0 -99
  736. ipakit-0.2.0/ipakit/data/phonemaps/phonemap.rng +0 -85
  737. ipakit-0.2.0/ipakit/data/phonemaps/timit.xml +0 -96
  738. ipakit-0.2.0/ipakit/data/phonemaps/xsampa.xml +0 -181
  739. ipakit-0.2.0/ipakit/data/rules/american-english.rules +0 -427
  740. ipakit-0.2.0/ipakit/data/rules/japanese-moraic.rules +0 -340
  741. ipakit-0.2.0/ipakit/data/syllables/japanese.xml +0 -11
  742. ipakit-0.2.0/ipakit/data/syllables/mandarin.xml +0 -4
  743. ipakit-0.2.0/ipakit/disagreement.py +0 -344
  744. ipakit-0.2.0/ipakit/distance.py +0 -1420
  745. ipakit-0.2.0/ipakit/distance_model.py +0 -815
  746. ipakit-0.2.0/ipakit/features.py +0 -4297
  747. ipakit-0.2.0/ipakit/form.py +0 -2553
  748. ipakit-0.2.0/ipakit/hierarchy.py +0 -139
  749. ipakit-0.2.0/ipakit/inventories.py +0 -602
  750. ipakit-0.2.0/ipakit/metric.py +0 -1081
  751. ipakit-0.2.0/ipakit/models.py +0 -478
  752. ipakit-0.2.0/ipakit/notebooks/ipakit-tutorial.ipynb +0 -1609
  753. ipakit-0.2.0/ipakit/phoneset_map.py +0 -538
  754. ipakit-0.2.0/ipakit/rules.py +0 -4304
  755. ipakit-0.2.0/ipakit/segment.py +0 -1170
  756. ipakit-0.2.0/ipakit/syllable.py +0 -616
  757. ipakit-0.2.0/ipakit/tiergraph_dot.py +0 -206
  758. ipakit-0.2.0/ipakit/tract.py +0 -2661
  759. ipakit-0.2.0/ipakit/tract_svg.py +0 -2424
  760. ipakit-0.2.0/ipakit.egg-info/PKG-INFO +0 -367
  761. ipakit-0.2.0/ipakit.egg-info/SOURCES.txt +0 -547
  762. ipakit-0.2.0/ipakit.egg-info/requires.txt +0 -24
  763. ipakit-0.2.0/pyproject.toml +0 -231
  764. ipakit-0.2.0/scripts/areafunctions.py +0 -2233
  765. ipakit-0.2.0/scripts/consolidation_parity.py +0 -110
  766. ipakit-0.2.0/scripts/containment_oracle.py +0 -687
  767. ipakit-0.2.0/scripts/costmodel_compare.py +0 -164
  768. ipakit-0.2.0/scripts/docexamples.py +0 -268
  769. ipakit-0.2.0/scripts/espeak_vocabularies.py +0 -631
  770. ipakit-0.2.0/scripts/interop.py +0 -1574
  771. ipakit-0.2.0/scripts/invariants.py +0 -1219
  772. ipakit-0.2.0/scripts/mfa_vocabularies.py +0 -503
  773. ipakit-0.2.0/scripts/panphon_geometry.py +0 -249
  774. ipakit-0.2.0/scripts/perceptual_validation.py +0 -183
  775. ipakit-0.2.0/scripts/piece1_oracle.py +0 -371
  776. ipakit-0.2.0/scripts/state_of_work.py +0 -159
  777. ipakit-0.2.0/scripts/sweep.py +0 -420
  778. ipakit-0.2.0/scripts/tiergraph_capture.py +0 -635
  779. ipakit-0.2.0/scripts/xsampa_table.py +0 -269
  780. ipakit-0.2.0/tests/test_agreement.py +0 -560
  781. ipakit-0.2.0/tests/test_analysis.py +0 -437
  782. ipakit-0.2.0/tests/test_api.py +0 -162
  783. ipakit-0.2.0/tests/test_api_contracts.py +0 -169
  784. ipakit-0.2.0/tests/test_bridges.py +0 -358
  785. ipakit-0.2.0/tests/test_ci_contract.py +0 -277
  786. ipakit-0.2.0/tests/test_cli.py +0 -2114
  787. ipakit-0.2.0/tests/test_cli_hygiene.py +0 -627
  788. ipakit-0.2.0/tests/test_coherent_composition.py +0 -635
  789. ipakit-0.2.0/tests/test_confusion.py +0 -75
  790. ipakit-0.2.0/tests/test_constriction_location.py +0 -813
  791. ipakit-0.2.0/tests/test_corpus_kernel.py +0 -302
  792. ipakit-0.2.0/tests/test_corpus_query.py +0 -146
  793. ipakit-0.2.0/tests/test_costmodel.py +0 -439
  794. ipakit-0.2.0/tests/test_declared_not_hardcoded.py +0 -1215
  795. ipakit-0.2.0/tests/test_denominator.py +0 -116
  796. ipakit-0.2.0/tests/test_descriptions.py +0 -147
  797. ipakit-0.2.0/tests/test_distance.py +0 -582
  798. ipakit-0.2.0/tests/test_distance_model.py +0 -649
  799. ipakit-0.2.0/tests/test_distinctive_difference.py +0 -135
  800. ipakit-0.2.0/tests/test_espeak_generator.py +0 -67
  801. ipakit-0.2.0/tests/test_feature_reads.py +0 -141
  802. ipakit-0.2.0/tests/test_feature_realization.py +0 -296
  803. ipakit-0.2.0/tests/test_features.py +0 -205
  804. ipakit-0.2.0/tests/test_form.py +0 -1016
  805. ipakit-0.2.0/tests/test_indel_costs.py +0 -666
  806. ipakit-0.2.0/tests/test_inventories.py +0 -575
  807. ipakit-0.2.0/tests/test_license.py +0 -88
  808. ipakit-0.2.0/tests/test_ligature_aliases.py +0 -478
  809. ipakit-0.2.0/tests/test_linking_and_agreement.py +0 -82
  810. ipakit-0.2.0/tests/test_metric.py +0 -1157
  811. ipakit-0.2.0/tests/test_mfa_vocabularies.py +0 -116
  812. ipakit-0.2.0/tests/test_models.py +0 -127
  813. ipakit-0.2.0/tests/test_nearest_pronunciation.py +0 -100
  814. ipakit-0.2.0/tests/test_nonfinal_modifiers.py +0 -273
  815. ipakit-0.2.0/tests/test_one_composition.py +0 -467
  816. ipakit-0.2.0/tests/test_packaging.py +0 -436
  817. ipakit-0.2.0/tests/test_panphon_geometry.py +0 -109
  818. ipakit-0.2.0/tests/test_panphon_live_geometry.py +0 -97
  819. ipakit-0.2.0/tests/test_phoible.py +0 -114
  820. ipakit-0.2.0/tests/test_phoneset_comparison.py +0 -148
  821. ipakit-0.2.0/tests/test_posture_no_side_channel.py +0 -177
  822. ipakit-0.2.0/tests/test_projection_coherence.py +0 -277
  823. ipakit-0.2.0/tests/test_prosodic_riders.py +0 -101
  824. ipakit-0.2.0/tests/test_query.py +0 -1102
  825. ipakit-0.2.0/tests/test_query_dsl.py +0 -122
  826. ipakit-0.2.0/tests/test_rule_sets.py +0 -2302
  827. ipakit-0.2.0/tests/test_rules.py +0 -2938
  828. ipakit-0.2.0/tests/test_schema.py +0 -830
  829. ipakit-0.2.0/tests/test_search.py +0 -274
  830. ipakit-0.2.0/tests/test_sequence_scoring.py +0 -121
  831. ipakit-0.2.0/tests/test_supplements.py +0 -673
  832. ipakit-0.2.0/tests/test_syllable_docs.py +0 -42
  833. ipakit-0.2.0/tests/test_syllable_japanese.py +0 -81
  834. ipakit-0.2.0/tests/test_textgrid.py +0 -485
  835. ipakit-0.2.0/tests/test_tie_sense.py +0 -384
  836. ipakit-0.2.0/tests/test_tiers.py +0 -210
  837. ipakit-0.2.0/tests/test_tokenization.py +0 -570
  838. ipakit-0.2.0/tests/test_tone_contours.py +0 -424
  839. ipakit-0.2.0/tests/test_tract_figures.py +0 -2319
  840. ipakit-0.2.0/tests/test_unicode_recomposition.py +0 -101
  841. ipakit-0.2.0/tests/test_unplaced_marks.py +0 -335
  842. ipakit-0.2.0/tests/test_variable_width.py +0 -228
  843. ipakit-0.2.0/tests/test_vowel_tract_limit.py +0 -407
  844. ipakit-0.2.0/tests/test_xsampa.py +0 -470
  845. ipakit-0.2.0/tests/test_zero.py +0 -817
  846. ipakit-0.2.0/tests/tiergraph/test_codecs.py +0 -167
  847. ipakit-0.2.0/tests/tiergraph/test_dot.py +0 -278
  848. ipakit-0.2.0/tests/tiergraph/test_fixture_wellformedness.py +0 -157
  849. ipakit-0.2.0/tests/tiergraph/test_form_store.py +0 -431
  850. ipakit-0.2.0/tests/tiergraph/test_gesture_integration.py +0 -167
  851. ipakit-0.2.0/tests/tiergraph/test_ipa_graph.py +0 -157
  852. ipakit-0.2.0/tests/tiergraph/test_lane_m_stabilization.py +0 -105
  853. ipakit-0.2.0/tests/tiergraph/test_piece1_oracle.py +0 -40
  854. ipakit-0.2.0/tests/tiergraph/test_rewrite_bridge.py +0 -266
  855. {ipakit-0.2.0 → ipakit-0.4.0}/LICENSE +0 -0
  856. {ipakit-0.2.0 → ipakit-0.4.0}/docs/anchor-study.md +0 -0
  857. {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/captures.md +0 -0
  858. {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/morph-boundary.md +0 -0
  859. {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/tract-validation.md +0 -0
  860. {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/vowel-chart-geometry.md +0 -0
  861. {ipakit-0.2.0 → ipakit-0.4.0}/docs/design/vowel-constriction.md +0 -0
  862. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-a.svg +0 -0
  863. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-i.svg +0 -0
  864. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-m.svg +0 -0
  865. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-reference.svg +0 -0
  866. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-rest.svg +0 -0
  867. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-t.svg +0 -0
  868. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/frontal-u.svg +0 -0
  869. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-a.svg +0 -0
  870. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-eng.svg +0 -0
  871. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-esh.svg +0 -0
  872. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-i.svg +0 -0
  873. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-k.svg +0 -0
  874. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-m.svg +0 -0
  875. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-n.svg +0 -0
  876. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-reference.svg +0 -0
  877. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-s.svg +0 -0
  878. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-silence.svg +0 -0
  879. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-t.svg +0 -0
  880. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-theta.svg +0 -0
  881. {ipakit-0.2.0 → ipakit-0.4.0}/docs/figures/tract-u.svg +0 -0
  882. {ipakit-0.2.0 → ipakit-0.4.0}/docs/mfa-vocabularies.md +0 -0
  883. {ipakit-0.2.0 → ipakit-0.4.0}/docs/perceptual-validation-exhibits.md +0 -0
  884. {ipakit-0.2.0 → ipakit-0.4.0}/docs/reading.md +0 -0
  885. {ipakit-0.2.0 → ipakit-0.4.0}/docs/textgrid.md +0 -0
  886. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/__main__.py +0 -0
  887. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_corpus_cmudict.py +0 -0
  888. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_identity.py +0 -0
  889. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_mora_graph.py +0 -0
  890. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_notebook.py +0 -0
  891. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_panphon_graph.py +0 -0
  892. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/_textgrid_graph.py +0 -0
  893. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/anatomy.py +0 -0
  894. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/generator.py +0 -0
  895. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/ipa_dict.py +0 -0
  896. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/notation.py +0 -0
  897. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/bridges/provider.py +0 -0
  898. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/__main__.py +0 -0
  899. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/syllabify.py +0 -0
  900. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/cli/tiergraph.py +0 -0
  901. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/closure.py +0 -0
  902. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/constants.py +0 -0
  903. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/corpus.py +0 -0
  904. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/attested/miller_nicely_1955.json +0 -0
  905. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/heads.xml +0 -0
  906. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/phonemaps/kirshenbaum.xml +0 -0
  907. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/phonemaps/lookalikes.xml +0 -0
  908. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/french-liaison.rules +0 -0
  909. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/german-final-devoicing.rules +0 -0
  910. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/rules/spanish-accented-english.rules +0 -0
  911. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/supplements/aspirated-stops.xml +0 -0
  912. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/supplements/supplement.rng +0 -0
  913. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/english.xml +0 -0
  914. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/spanish.xml +0 -0
  915. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/syllables/syllables.rng +0 -0
  916. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/mfa.json +0 -0
  917. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/prosody.json +0 -0
  918. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/segments.json +0 -0
  919. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/data/textgrid/words.json +0 -0
  920. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/experiment.py +0 -0
  921. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/mapper.py +0 -0
  922. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/phonemaps.py +0 -0
  923. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/py.typed +0 -0
  924. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/textgrid.py +0 -0
  925. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/validation.py +0 -0
  926. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit/xsampa.py +0 -0
  927. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/dependency_links.txt +0 -0
  928. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/entry_points.txt +0 -0
  929. {ipakit-0.2.0 → ipakit-0.4.0}/ipakit.egg-info/top_level.txt +0 -0
  930. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/anchor_study.py +0 -0
  931. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/articulatory.py +0 -0
  932. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/check_hrefs.py +0 -0
  933. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/confusion.py +0 -0
  934. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/corpus_scaling.py +0 -0
  935. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/disagreement_demo.py +0 -0
  936. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/docquotes.py +0 -0
  937. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/frontal_figures.py +0 -0
  938. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/gate_subject.py +0 -0
  939. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/house_style.py +0 -0
  940. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/projection_cache_characterization.py +0 -0
  941. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/syllable_curation.py +0 -0
  942. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tiergraph_example.py +0 -0
  943. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tract_svg.py +0 -0
  944. {ipakit-0.2.0 → ipakit-0.4.0}/scripts/tutorial.py +0 -0
  945. {ipakit-0.2.0 → ipakit-0.4.0}/setup.cfg +0 -0
  946. {ipakit-0.2.0 → ipakit-0.4.0}/tests/__init__.py +0 -0
  947. {ipakit-0.2.0 → ipakit-0.4.0}/tests/_renderers.py +0 -0
  948. {ipakit-0.2.0 → ipakit-0.4.0}/tests/conftest.py +0 -0
  949. {ipakit-0.2.0 → ipakit-0.4.0}/tests/corpus.py +0 -0
  950. {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_animation_sha256.py +0 -0
  951. {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_epiglottal_constriction.py +0 -0
  952. {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_posture_golden.py +0 -0
  953. {ipakit-0.2.0 → ipakit-0.4.0}/tests/fixtures/_capture_velic_contrast.py +0 -0
  954. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_align.py +0 -0
  955. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_anchor_study.py +0 -0
  956. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_animation_rest.py +0 -0
  957. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_calculus.py +0 -0
  958. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_capture_scripts.py +0 -0
  959. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_cli_query.py +0 -0
  960. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_closure.py +0 -0
  961. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_cmu.py +0 -0
  962. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_corpus_cmudict.py +0 -0
  963. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_degenerate_boundaries.py +0 -0
  964. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_determinism.py +0 -0
  965. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_disagreement.py +0 -0
  966. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_doc_citations.py +0 -0
  967. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_docquotes.py +0 -0
  968. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_espeak_binary.py +0 -0
  969. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_experiment.py +0 -0
  970. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_fortis.py +0 -0
  971. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_frontal.py +0 -0
  972. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_head_arcs.py +0 -0
  973. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_hierarchy.py +0 -0
  974. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_intervals.py +0 -0
  975. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_invertibility.py +0 -0
  976. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_ipa_dict.py +0 -0
  977. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_jaw_hinge.py +0 -0
  978. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_modifier_modes.py +0 -0
  979. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_multi_constriction.py +0 -0
  980. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_notation.py +0 -0
  981. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_notebook.py +0 -0
  982. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_one_classification.py +0 -0
  983. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_panphon_facts.py +0 -0
  984. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_perceptual_validation.py +0 -0
  985. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_phonemaps.py +0 -0
  986. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_phoneset_map.py +0 -0
  987. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_posture_animation.py +0 -0
  988. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_projection_cache.py +0 -0
  989. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_rank_agreement.py +0 -0
  990. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_scoring_parameters.py +0 -0
  991. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_segment.py +0 -0
  992. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_sentinels.py +0 -0
  993. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_stress.py +0 -0
  994. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_strict.py +0 -0
  995. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_surface_wave2.py +0 -0
  996. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_english.py +0 -0
  997. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_mandarin.py +0 -0
  998. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_mechanism.py +0 -0
  999. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_syllable_spanish.py +0 -0
  1000. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tie_convergence.py +0 -0
  1001. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tier_context.py +0 -0
  1002. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tier_rebase.py +0 -0
  1003. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_tract_blend.py +0 -0
  1004. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_trajectory_track.py +0 -0
  1005. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_two_marks.py +0 -0
  1006. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_unicode_normalization.py +0 -0
  1007. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_validation.py +0 -0
  1008. {ipakit-0.2.0 → ipakit-0.4.0}/tests/test_wiki.py +0 -0
  1009. {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_choice_selection_golden.py +0 -0
  1010. {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_consolidation_parity.py +0 -0
  1011. {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_j_panphon.py +0 -0
  1012. {ipakit-0.2.0 → ipakit-0.4.0}/tests/tiergraph/test_j_profiles.py +0 -0
  1013. {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"]