words2num2 0.2.2__tar.gz → 0.3.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 (346) hide show
  1. {words2num2-0.2.2 → words2num2-0.3.0}/PKG-INFO +73 -27
  2. words2num2-0.2.2/words2num2.egg-info/PKG-INFO → words2num2-0.3.0/README.rst +59 -43
  3. words2num2-0.3.0/pyproject.toml +94 -0
  4. words2num2-0.3.0/rust/Cargo.lock +241 -0
  5. words2num2-0.3.0/rust/Cargo.toml +14 -0
  6. words2num2-0.3.0/rust/num2words2-core/Cargo.toml +12 -0
  7. words2num2-0.3.0/rust/num2words2-core/src/base.rs +750 -0
  8. words2num2-0.3.0/rust/num2words2-core/src/currency.rs +346 -0
  9. words2num2-0.3.0/rust/num2words2-core/src/floatpath.rs +270 -0
  10. words2num2-0.3.0/rust/num2words2-core/src/lang_af.rs +725 -0
  11. words2num2-0.3.0/rust/num2words2-core/src/lang_am.rs +1144 -0
  12. words2num2-0.3.0/rust/num2words2-core/src/lang_ar.rs +2622 -0
  13. words2num2-0.3.0/rust/num2words2-core/src/lang_as.rs +1312 -0
  14. words2num2-0.3.0/rust/num2words2-core/src/lang_az.rs +901 -0
  15. words2num2-0.3.0/rust/num2words2-core/src/lang_ba.rs +1232 -0
  16. words2num2-0.3.0/rust/num2words2-core/src/lang_ban.rs +1412 -0
  17. words2num2-0.3.0/rust/num2words2-core/src/lang_be.rs +1559 -0
  18. words2num2-0.3.0/rust/num2words2-core/src/lang_bg.rs +1638 -0
  19. words2num2-0.3.0/rust/num2words2-core/src/lang_bm.rs +1474 -0
  20. words2num2-0.3.0/rust/num2words2-core/src/lang_bn.rs +1407 -0
  21. words2num2-0.3.0/rust/num2words2-core/src/lang_bo.rs +1039 -0
  22. words2num2-0.3.0/rust/num2words2-core/src/lang_br.rs +1207 -0
  23. words2num2-0.3.0/rust/num2words2-core/src/lang_bs.rs +1473 -0
  24. words2num2-0.3.0/rust/num2words2-core/src/lang_ca.rs +1441 -0
  25. words2num2-0.3.0/rust/num2words2-core/src/lang_ce.rs +2142 -0
  26. words2num2-0.3.0/rust/num2words2-core/src/lang_ceb.rs +1272 -0
  27. words2num2-0.3.0/rust/num2words2-core/src/lang_ckb.rs +1017 -0
  28. words2num2-0.3.0/rust/num2words2-core/src/lang_cnh.rs +1159 -0
  29. words2num2-0.3.0/rust/num2words2-core/src/lang_cs.rs +994 -0
  30. words2num2-0.3.0/rust/num2words2-core/src/lang_cy.rs +1751 -0
  31. words2num2-0.3.0/rust/num2words2-core/src/lang_da.rs +966 -0
  32. words2num2-0.3.0/rust/num2words2-core/src/lang_de.rs +881 -0
  33. words2num2-0.3.0/rust/num2words2-core/src/lang_dv.rs +1877 -0
  34. words2num2-0.3.0/rust/num2words2-core/src/lang_el.rs +929 -0
  35. words2num2-0.3.0/rust/num2words2-core/src/lang_en.rs +660 -0
  36. words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero.rs +686 -0
  37. words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_faa.rs +635 -0
  38. words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_nato.rs +712 -0
  39. words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_us_army.rs +563 -0
  40. words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_usn.rs +680 -0
  41. words2num2-0.3.0/rust/num2words2-core/src/lang_en_in.rs +681 -0
  42. words2num2-0.3.0/rust/num2words2-core/src/lang_en_ne.rs +665 -0
  43. words2num2-0.3.0/rust/num2words2-core/src/lang_en_ng.rs +767 -0
  44. words2num2-0.3.0/rust/num2words2-core/src/lang_en_np.rs +738 -0
  45. words2num2-0.3.0/rust/num2words2-core/src/lang_eo.rs +446 -0
  46. words2num2-0.3.0/rust/num2words2-core/src/lang_es.rs +1016 -0
  47. words2num2-0.3.0/rust/num2words2-core/src/lang_es_co.rs +936 -0
  48. words2num2-0.3.0/rust/num2words2-core/src/lang_es_cr.rs +1391 -0
  49. words2num2-0.3.0/rust/num2words2-core/src/lang_es_gt.rs +1004 -0
  50. words2num2-0.3.0/rust/num2words2-core/src/lang_es_hn.rs +903 -0
  51. words2num2-0.3.0/rust/num2words2-core/src/lang_es_ni.rs +1260 -0
  52. words2num2-0.3.0/rust/num2words2-core/src/lang_es_ve.rs +1352 -0
  53. words2num2-0.3.0/rust/num2words2-core/src/lang_et.rs +1009 -0
  54. words2num2-0.3.0/rust/num2words2-core/src/lang_eu.rs +910 -0
  55. words2num2-0.3.0/rust/num2words2-core/src/lang_fa.rs +766 -0
  56. words2num2-0.3.0/rust/num2words2-core/src/lang_ff.rs +937 -0
  57. words2num2-0.3.0/rust/num2words2-core/src/lang_fi.rs +1694 -0
  58. words2num2-0.3.0/rust/num2words2-core/src/lang_fil.rs +787 -0
  59. words2num2-0.3.0/rust/num2words2-core/src/lang_fo.rs +825 -0
  60. words2num2-0.3.0/rust/num2words2-core/src/lang_fr.rs +754 -0
  61. words2num2-0.3.0/rust/num2words2-core/src/lang_fr_be.rs +804 -0
  62. words2num2-0.3.0/rust/num2words2-core/src/lang_fr_ch.rs +855 -0
  63. words2num2-0.3.0/rust/num2words2-core/src/lang_fr_dz.rs +823 -0
  64. words2num2-0.3.0/rust/num2words2-core/src/lang_gl.rs +910 -0
  65. words2num2-0.3.0/rust/num2words2-core/src/lang_gu.rs +1082 -0
  66. words2num2-0.3.0/rust/num2words2-core/src/lang_ha.rs +913 -0
  67. words2num2-0.3.0/rust/num2words2-core/src/lang_haw.rs +871 -0
  68. words2num2-0.3.0/rust/num2words2-core/src/lang_he.rs +1166 -0
  69. words2num2-0.3.0/rust/num2words2-core/src/lang_hi.rs +775 -0
  70. words2num2-0.3.0/rust/num2words2-core/src/lang_hmn.rs +1404 -0
  71. words2num2-0.3.0/rust/num2words2-core/src/lang_hr.rs +1372 -0
  72. words2num2-0.3.0/rust/num2words2-core/src/lang_ht.rs +998 -0
  73. words2num2-0.3.0/rust/num2words2-core/src/lang_hu.rs +1407 -0
  74. words2num2-0.3.0/rust/num2words2-core/src/lang_hy.rs +1504 -0
  75. words2num2-0.3.0/rust/num2words2-core/src/lang_id.rs +953 -0
  76. words2num2-0.3.0/rust/num2words2-core/src/lang_is.rs +1047 -0
  77. words2num2-0.3.0/rust/num2words2-core/src/lang_it.rs +1125 -0
  78. words2num2-0.3.0/rust/num2words2-core/src/lang_ja.rs +2239 -0
  79. words2num2-0.3.0/rust/num2words2-core/src/lang_jv.rs +1087 -0
  80. words2num2-0.3.0/rust/num2words2-core/src/lang_ka.rs +1289 -0
  81. words2num2-0.3.0/rust/num2words2-core/src/lang_ki.rs +897 -0
  82. words2num2-0.3.0/rust/num2words2-core/src/lang_kk.rs +886 -0
  83. words2num2-0.3.0/rust/num2words2-core/src/lang_km.rs +898 -0
  84. words2num2-0.3.0/rust/num2words2-core/src/lang_kn.rs +741 -0
  85. words2num2-0.3.0/rust/num2words2-core/src/lang_ko.rs +639 -0
  86. words2num2-0.3.0/rust/num2words2-core/src/lang_kok.rs +859 -0
  87. words2num2-0.3.0/rust/num2words2-core/src/lang_ksw.rs +766 -0
  88. words2num2-0.3.0/rust/num2words2-core/src/lang_ku.rs +1018 -0
  89. words2num2-0.3.0/rust/num2words2-core/src/lang_ky.rs +1474 -0
  90. words2num2-0.3.0/rust/num2words2-core/src/lang_kz.rs +701 -0
  91. words2num2-0.3.0/rust/num2words2-core/src/lang_la.rs +1191 -0
  92. words2num2-0.3.0/rust/num2words2-core/src/lang_lb.rs +1198 -0
  93. words2num2-0.3.0/rust/num2words2-core/src/lang_lg.rs +1129 -0
  94. words2num2-0.3.0/rust/num2words2-core/src/lang_lij.rs +1130 -0
  95. words2num2-0.3.0/rust/num2words2-core/src/lang_ln.rs +880 -0
  96. words2num2-0.3.0/rust/num2words2-core/src/lang_lo.rs +1053 -0
  97. words2num2-0.3.0/rust/num2words2-core/src/lang_lt.rs +1469 -0
  98. words2num2-0.3.0/rust/num2words2-core/src/lang_lus.rs +1016 -0
  99. words2num2-0.3.0/rust/num2words2-core/src/lang_lv.rs +893 -0
  100. words2num2-0.3.0/rust/num2words2-core/src/lang_mg.rs +892 -0
  101. words2num2-0.3.0/rust/num2words2-core/src/lang_mi.rs +848 -0
  102. words2num2-0.3.0/rust/num2words2-core/src/lang_mk.rs +846 -0
  103. words2num2-0.3.0/rust/num2words2-core/src/lang_ml.rs +967 -0
  104. words2num2-0.3.0/rust/num2words2-core/src/lang_mn.rs +1494 -0
  105. words2num2-0.3.0/rust/num2words2-core/src/lang_mr.rs +1096 -0
  106. words2num2-0.3.0/rust/num2words2-core/src/lang_ms.rs +1337 -0
  107. words2num2-0.3.0/rust/num2words2-core/src/lang_mt.rs +874 -0
  108. words2num2-0.3.0/rust/num2words2-core/src/lang_my.rs +795 -0
  109. words2num2-0.3.0/rust/num2words2-core/src/lang_nb.rs +891 -0
  110. words2num2-0.3.0/rust/num2words2-core/src/lang_ne.rs +954 -0
  111. words2num2-0.3.0/rust/num2words2-core/src/lang_nl.rs +764 -0
  112. words2num2-0.3.0/rust/num2words2-core/src/lang_nn.rs +700 -0
  113. words2num2-0.3.0/rust/num2words2-core/src/lang_oc.rs +1177 -0
  114. words2num2-0.3.0/rust/num2words2-core/src/lang_om.rs +1051 -0
  115. words2num2-0.3.0/rust/num2words2-core/src/lang_or.rs +931 -0
  116. words2num2-0.3.0/rust/num2words2-core/src/lang_pa.rs +1071 -0
  117. words2num2-0.3.0/rust/num2words2-core/src/lang_pap.rs +1079 -0
  118. words2num2-0.3.0/rust/num2words2-core/src/lang_pl.rs +1247 -0
  119. words2num2-0.3.0/rust/num2words2-core/src/lang_pli.rs +912 -0
  120. words2num2-0.3.0/rust/num2words2-core/src/lang_ps.rs +1027 -0
  121. words2num2-0.3.0/rust/num2words2-core/src/lang_pt.rs +1090 -0
  122. words2num2-0.3.0/rust/num2words2-core/src/lang_pt_br.rs +1682 -0
  123. words2num2-0.3.0/rust/num2words2-core/src/lang_rm.rs +956 -0
  124. words2num2-0.3.0/rust/num2words2-core/src/lang_rm_puter.rs +1063 -0
  125. words2num2-0.3.0/rust/num2words2-core/src/lang_rm_surmiran.rs +960 -0
  126. words2num2-0.3.0/rust/num2words2-core/src/lang_rm_sursilv.rs +956 -0
  127. words2num2-0.3.0/rust/num2words2-core/src/lang_rm_sutsilv.rs +856 -0
  128. words2num2-0.3.0/rust/num2words2-core/src/lang_rm_vallader.rs +977 -0
  129. words2num2-0.3.0/rust/num2words2-core/src/lang_ro.rs +1231 -0
  130. words2num2-0.3.0/rust/num2words2-core/src/lang_ru.rs +2205 -0
  131. words2num2-0.3.0/rust/num2words2-core/src/lang_rw.rs +1467 -0
  132. words2num2-0.3.0/rust/num2words2-core/src/lang_sa.rs +926 -0
  133. words2num2-0.3.0/rust/num2words2-core/src/lang_sd.rs +910 -0
  134. words2num2-0.3.0/rust/num2words2-core/src/lang_si.rs +966 -0
  135. words2num2-0.3.0/rust/num2words2-core/src/lang_sk.rs +1069 -0
  136. words2num2-0.3.0/rust/num2words2-core/src/lang_sl.rs +1258 -0
  137. words2num2-0.3.0/rust/num2words2-core/src/lang_sn.rs +1045 -0
  138. words2num2-0.3.0/rust/num2words2-core/src/lang_so.rs +902 -0
  139. words2num2-0.3.0/rust/num2words2-core/src/lang_sq.rs +863 -0
  140. words2num2-0.3.0/rust/num2words2-core/src/lang_sr.rs +1061 -0
  141. words2num2-0.3.0/rust/num2words2-core/src/lang_sr_latn.rs +1119 -0
  142. words2num2-0.3.0/rust/num2words2-core/src/lang_su.rs +790 -0
  143. words2num2-0.3.0/rust/num2words2-core/src/lang_sv.rs +815 -0
  144. words2num2-0.3.0/rust/num2words2-core/src/lang_sw.rs +601 -0
  145. words2num2-0.3.0/rust/num2words2-core/src/lang_ta.rs +1135 -0
  146. words2num2-0.3.0/rust/num2words2-core/src/lang_te.rs +778 -0
  147. words2num2-0.3.0/rust/num2words2-core/src/lang_tet.rs +980 -0
  148. words2num2-0.3.0/rust/num2words2-core/src/lang_tg.rs +493 -0
  149. words2num2-0.3.0/rust/num2words2-core/src/lang_th.rs +882 -0
  150. words2num2-0.3.0/rust/num2words2-core/src/lang_ti.rs +1382 -0
  151. words2num2-0.3.0/rust/num2words2-core/src/lang_tk.rs +1032 -0
  152. words2num2-0.3.0/rust/num2words2-core/src/lang_tl.rs +1022 -0
  153. words2num2-0.3.0/rust/num2words2-core/src/lang_tr.rs +1630 -0
  154. words2num2-0.3.0/rust/num2words2-core/src/lang_tt.rs +915 -0
  155. words2num2-0.3.0/rust/num2words2-core/src/lang_uk.rs +1692 -0
  156. words2num2-0.3.0/rust/num2words2-core/src/lang_ur.rs +1293 -0
  157. words2num2-0.3.0/rust/num2words2-core/src/lang_uz.rs +1045 -0
  158. words2num2-0.3.0/rust/num2words2-core/src/lang_uz_cyr.rs +1129 -0
  159. words2num2-0.3.0/rust/num2words2-core/src/lang_vi.rs +1097 -0
  160. words2num2-0.3.0/rust/num2words2-core/src/lang_wo.rs +1023 -0
  161. words2num2-0.3.0/rust/num2words2-core/src/lang_xh.rs +1320 -0
  162. words2num2-0.3.0/rust/num2words2-core/src/lang_yi.rs +1091 -0
  163. words2num2-0.3.0/rust/num2words2-core/src/lang_yo.rs +1176 -0
  164. words2num2-0.3.0/rust/num2words2-core/src/lang_zh.rs +1070 -0
  165. words2num2-0.3.0/rust/num2words2-core/src/lang_zh_hk.rs +1499 -0
  166. words2num2-0.3.0/rust/num2words2-core/src/lang_zh_tw.rs +1836 -0
  167. words2num2-0.3.0/rust/num2words2-core/src/lang_zu.rs +912 -0
  168. words2num2-0.3.0/rust/num2words2-core/src/lib.rs +658 -0
  169. words2num2-0.3.0/rust/num2words2-core/src/strnum.rs +286 -0
  170. words2num2-0.3.0/rust/words2num2-py/Cargo.toml +14 -0
  171. words2num2-0.3.0/rust/words2num2-py/src/lib.rs +378 -0
  172. words2num2-0.3.0/rust/words2num2-py/src/w2n_formats.rs +1059 -0
  173. words2num2-0.3.0/rust/words2num2-py/src/w2n_lang_en.rs +1000 -0
  174. words2num2-0.3.0/rust/words2num2-py/src/w2n_sentence.rs +2032 -0
  175. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/__init__.py +4 -3
  176. words2num2-0.3.0/words2num2/_version.py +5 -0
  177. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/base.py +56 -58
  178. words2num2-0.3.0/words2num2/converters/auto.py +185 -0
  179. words2num2-0.3.0/words2num2/converters/sentence.py +17 -0
  180. words2num2-0.3.0/words2num2/formats.py +101 -0
  181. words2num2-0.3.0/words2num2/lang_EN.py +34 -0
  182. words2num2-0.2.2/.flake8 +0 -11
  183. words2num2-0.2.2/.github/workflows/aur-publish.yml +0 -104
  184. words2num2-0.2.2/.github/workflows/ci.yml +0 -68
  185. words2num2-0.2.2/.github/workflows/codeql-analysis.yml +0 -38
  186. words2num2-0.2.2/.github/workflows/e2e-tests.yml +0 -73
  187. words2num2-0.2.2/.github/workflows/lint.yml +0 -47
  188. words2num2-0.2.2/.github/workflows/manual-publish.yml +0 -66
  189. words2num2-0.2.2/.github/workflows/manual-release.yml +0 -81
  190. words2num2-0.2.2/.github/workflows/pr-size.yml +0 -67
  191. words2num2-0.2.2/.github/workflows/publish-pypi.yml +0 -76
  192. words2num2-0.2.2/.github/workflows/python-publish.yml +0 -61
  193. words2num2-0.2.2/.github/workflows/release.yml +0 -166
  194. words2num2-0.2.2/.github/workflows/scheduled-test.yml +0 -44
  195. words2num2-0.2.2/.gitignore +0 -18
  196. words2num2-0.2.2/CHANGELOG.md +0 -139
  197. words2num2-0.2.2/CONTRIBUTING.md +0 -123
  198. words2num2-0.2.2/LOCAL_TESTING.md +0 -173
  199. words2num2-0.2.2/MANIFEST.in +0 -5
  200. words2num2-0.2.2/Makefile +0 -50
  201. words2num2-0.2.2/README.rst +0 -351
  202. words2num2-0.2.2/REFERENCE.md +0 -450
  203. words2num2-0.2.2/bin/words2num2 +0 -28
  204. words2num2-0.2.2/packaging/aur/python-words2num2/.SRCINFO +0 -20
  205. words2num2-0.2.2/packaging/aur/python-words2num2/PKGBUILD +0 -33
  206. words2num2-0.2.2/packaging/aur/python-words2num2/README.md +0 -88
  207. words2num2-0.2.2/pyproject.toml +0 -87
  208. words2num2-0.2.2/setup.cfg +0 -4
  209. words2num2-0.2.2/setup.py +0 -58
  210. words2num2-0.2.2/tests/__init__.py +0 -0
  211. words2num2-0.2.2/tests/test_auto_parse.py +0 -252
  212. words2num2-0.2.2/tests/test_dispatch.py +0 -28
  213. words2num2-0.2.2/tests/test_lang_EN.py +0 -113
  214. words2num2-0.2.2/tests/test_multilang.py +0 -49
  215. words2num2-0.2.2/words2num2/_version.py +0 -3
  216. words2num2-0.2.2/words2num2/converters/auto.py +0 -586
  217. words2num2-0.2.2/words2num2/converters/sentence.py +0 -116
  218. words2num2-0.2.2/words2num2/formats.py +0 -212
  219. words2num2-0.2.2/words2num2/lang_EN.py +0 -242
  220. words2num2-0.2.2/words2num2.egg-info/SOURCES.txt +0 -167
  221. words2num2-0.2.2/words2num2.egg-info/dependency_links.txt +0 -1
  222. words2num2-0.2.2/words2num2.egg-info/entry_points.txt +0 -2
  223. words2num2-0.2.2/words2num2.egg-info/requires.txt +0 -2
  224. words2num2-0.2.2/words2num2.egg-info/top_level.txt +0 -1
  225. {words2num2-0.2.2 → words2num2-0.3.0}/COPYING +0 -0
  226. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/__main__.py +0 -0
  227. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/compat.py +0 -0
  228. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/converters/__init__.py +0 -0
  229. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AF.py +0 -0
  230. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AM.py +0 -0
  231. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AR.py +0 -0
  232. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AS.py +0 -0
  233. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AZ.py +0 -0
  234. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BA.py +0 -0
  235. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BE.py +0 -0
  236. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BG.py +0 -0
  237. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BN.py +0 -0
  238. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BO.py +0 -0
  239. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BR.py +0 -0
  240. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BS.py +0 -0
  241. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CA.py +0 -0
  242. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CE.py +0 -0
  243. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CS.py +0 -0
  244. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CY.py +0 -0
  245. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_DA.py +0 -0
  246. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_DE.py +0 -0
  247. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EL.py +0 -0
  248. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EN_IN.py +0 -0
  249. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EN_NG.py +0 -0
  250. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EO.py +0 -0
  251. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES.py +0 -0
  252. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_CO.py +0 -0
  253. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_CR.py +0 -0
  254. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_GT.py +0 -0
  255. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_NI.py +0 -0
  256. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_VE.py +0 -0
  257. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ET.py +0 -0
  258. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EU.py +0 -0
  259. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FA.py +0 -0
  260. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FI.py +0 -0
  261. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FO.py +0 -0
  262. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR.py +0 -0
  263. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_BE.py +0 -0
  264. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_CH.py +0 -0
  265. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_DZ.py +0 -0
  266. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_GL.py +0 -0
  267. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_GU.py +0 -0
  268. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HA.py +0 -0
  269. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HAW.py +0 -0
  270. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HE.py +0 -0
  271. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HI.py +0 -0
  272. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HR.py +0 -0
  273. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HT.py +0 -0
  274. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HU.py +0 -0
  275. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HY.py +0 -0
  276. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ID.py +0 -0
  277. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_IS.py +0 -0
  278. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_IT.py +0 -0
  279. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_JA.py +0 -0
  280. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_JW.py +0 -0
  281. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KA.py +0 -0
  282. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KK.py +0 -0
  283. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KM.py +0 -0
  284. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KN.py +0 -0
  285. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KO.py +0 -0
  286. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KZ.py +0 -0
  287. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LA.py +0 -0
  288. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LB.py +0 -0
  289. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LN.py +0 -0
  290. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LO.py +0 -0
  291. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LT.py +0 -0
  292. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LV.py +0 -0
  293. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MG.py +0 -0
  294. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MI.py +0 -0
  295. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MK.py +0 -0
  296. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ML.py +0 -0
  297. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MN.py +0 -0
  298. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MR.py +0 -0
  299. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MS.py +0 -0
  300. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MT.py +0 -0
  301. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MY.py +0 -0
  302. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NE.py +0 -0
  303. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NL.py +0 -0
  304. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NN.py +0 -0
  305. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NO.py +0 -0
  306. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_OC.py +0 -0
  307. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PA.py +0 -0
  308. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PL.py +0 -0
  309. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PS.py +0 -0
  310. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PT.py +0 -0
  311. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PT_BR.py +0 -0
  312. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_RO.py +0 -0
  313. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_RU.py +0 -0
  314. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SA.py +0 -0
  315. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SD.py +0 -0
  316. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SI.py +0 -0
  317. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SK.py +0 -0
  318. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SL.py +0 -0
  319. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SN.py +0 -0
  320. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SO.py +0 -0
  321. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SQ.py +0 -0
  322. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SR.py +0 -0
  323. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SU.py +0 -0
  324. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SV.py +0 -0
  325. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SW.py +0 -0
  326. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TA.py +0 -0
  327. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TE.py +0 -0
  328. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TET.py +0 -0
  329. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TG.py +0 -0
  330. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TH.py +0 -0
  331. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TK.py +0 -0
  332. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TL.py +0 -0
  333. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TR.py +0 -0
  334. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TT.py +0 -0
  335. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UK.py +0 -0
  336. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UR.py +0 -0
  337. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UZ.py +0 -0
  338. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_VI.py +0 -0
  339. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_WO.py +0 -0
  340. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_YI.py +0 -0
  341. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_YO.py +0 -0
  342. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH.py +0 -0
  343. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_CN.py +0 -0
  344. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_HK.py +0 -0
  345. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_TW.py +0 -0
  346. {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/utils.py +0 -0
@@ -1,17 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: words2num2
3
- Version: 0.2.2
4
- Summary: Inverse of num2words2: convert spoken-form numbers back to numeric values across 100+ languages.
5
- Home-page: https://github.com/jqueguiner/words2num2
6
- Author: Jean-Louis Queguiner
7
- Author-email: Jean-Louis Queguiner <jlqueguiner@gladia.io>
8
- Maintainer: Jean-Louis Queguiner
9
- Maintainer-email: Jean-Louis Queguiner <jlqueguiner@gladia.io>
10
- License: LGPL-2.1
11
- Project-URL: Homepage, https://github.com/jqueguiner/words2num2
12
- Project-URL: Repository, https://github.com/jqueguiner/words2num2.git
13
- Project-URL: Bug Tracker, https://github.com/jqueguiner/words2num2/issues
14
- Keywords: number,word,numbers,words,parse,parser,convert,conversion,i18n,localisation,localization,internationalisation,internationalization,asr,speech,llm
3
+ Version: 0.3.0
15
4
  Classifier: Development Status :: 4 - Beta
16
5
  Classifier: Intended Audience :: Developers
17
6
  Classifier: Programming Language :: Python :: 3
@@ -20,21 +9,23 @@ Classifier: Programming Language :: Python :: 3.11
20
9
  Classifier: Programming Language :: Python :: 3.12
21
10
  Classifier: Programming Language :: Python :: 3.13
22
11
  Classifier: Programming Language :: Python :: 3.14
23
- Classifier: Programming Language :: Python :: 3.15
12
+ Classifier: Programming Language :: Rust
24
13
  Classifier: Topic :: Software Development :: Internationalization
25
14
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
15
  Classifier: Topic :: Software Development :: Localization
27
16
  Classifier: Topic :: Text Processing :: Linguistic
28
- Requires-Python: >=3.10
29
- Description-Content-Type: text/x-rst
30
17
  License-File: COPYING
31
- Requires-Dist: docopt>=0.6.2
32
- Requires-Dist: num2words2>=0.1.0.dev0
33
- Dynamic: author
34
- Dynamic: home-page
35
- Dynamic: license
36
- Dynamic: license-file
37
- Dynamic: maintainer
18
+ Summary: Rust-powered inverse of num2words2: parse spoken-form numbers back to numeric values across 100+ languages, optimized for ASR/LLM/speech.
19
+ Keywords: number,word,numbers,words,parse,parser,convert,conversion,i18n,localisation,localization,internationalisation,internationalization,asr,speech,llm,rust
20
+ Author-email: Jean-Louis Queguiner <jean-louis.queguiner@gmail.com>
21
+ Maintainer-email: Jean-Louis Queguiner <jean-louis.queguiner@gmail.com>
22
+ License-Expression: LGPL-2.1-only
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/x-rst; charset=UTF-8
25
+ Project-URL: Bug Tracker, https://github.com/jqueguiner/words2num2/issues
26
+ Project-URL: Documentation, https://github.com/jqueguiner/words2num2/wiki
27
+ Project-URL: Homepage, https://github.com/jqueguiner/words2num2
28
+ Project-URL: Repository, https://github.com/jqueguiner/words2num2.git
38
29
 
39
30
  words2num2 — words to numbers
40
31
  =============================
@@ -104,9 +95,20 @@ entries**) and adds a free-text *auto-parse* mode that handles
104
95
  currencies, units, configurable thousands/decimal separators, and
105
96
  ASR/LLM-style mixed text.
106
97
 
107
- The project is hosted on GitHub_. Contributions are welcome.
98
+ It is **Rust-powered with a thin Python binder**. The whole parsing engine —
99
+ the English grammar, the generic reverse-lookup backend, the sentence walker,
100
+ number-format parsing and auto-parse — runs in a compiled Rust core
101
+ (PyO3/``abi3``); Python only shapes arguments and results. The core embeds the
102
+ num2words2 conversion engine natively, so ``words2num2`` is **self-contained
103
+ and has no runtime dependencies**, while running several times faster than the
104
+ former pure-Python implementation. Output is unchanged — validated against a
105
+ frozen corpus of ~11,000 round-trip cases.
106
+
107
+ The project is hosted on GitHub_, and the full documentation is available
108
+ in the Wiki_. Contributions are welcome.
108
109
 
109
110
  .. _GitHub: https://github.com/jqueguiner/words2num2
111
+ .. _Wiki: https://github.com/jqueguiner/words2num2/wiki
110
112
 
111
113
  Why this library
112
114
  ----------------
@@ -130,6 +132,38 @@ the forward direction. ``words2num2``:
130
132
  * Pluralizes long-form units in expand mode (``5 dollars`` /
131
133
  ``1 dollar``, ``5 feet`` / ``1 foot``, ``5 yen`` / ``1 yen``).
132
134
 
135
+ Performance
136
+ -----------
137
+
138
+ The parsing engine is compiled Rust (PyO3/``abi3``), so there is no
139
+ Python-level tokenising or table walking on the hot path. Typical native
140
+ throughput (Apple M-series, nanoseconds per call, after warmup):
141
+
142
+ .. list-table::
143
+ :header-rows: 1
144
+ :widths: 60 20
145
+
146
+ * - Operation
147
+ - ns/call
148
+ * - English cardinal (``"eight thousand seven hundred sixty-five"``)
149
+ - ~5,900
150
+ * - English ordinal (``"forty-second"``)
151
+ - ~4,100
152
+ * - French cardinal (``"trois cent quatre"``)
153
+ - ~1,900
154
+ * - Russian cardinal (``"сорок два"``)
155
+ - ~1,700
156
+ * - ``parse_number_string("1.234.567,89", lang="de")``
157
+ - ~240
158
+ * - ``auto_parse("$12,345.00")``
159
+ - ~990
160
+
161
+ For the 100+ generic locales, the first call in a given language builds the
162
+ ``{words → number}`` reverse table once (~35 ms) and caches it in the core;
163
+ every call after that is a native lookup. Output is byte-for-byte identical to
164
+ the former pure-Python implementation, validated against a frozen corpus of
165
+ ~11,000 round-trip cases and the full test suite.
166
+
133
167
  Installation
134
168
  ------------
135
169
 
@@ -150,14 +184,18 @@ Installation
150
184
  cd python-words2num2
151
185
  makepkg -si
152
186
 
153
- **From source**::
187
+ **From source** (needs a stable Rust toolchain and `maturin
188
+ <https://www.maturin.rs>`_)::
154
189
 
155
190
  git clone https://github.com/jqueguiner/words2num2
156
191
  cd words2num2
157
- pip install -e .
192
+ pip install -e . # builds the Rust extension via maturin
193
+ # or, to produce a wheel: maturin build --release
158
194
 
159
- ``num2words2`` is a runtime dependency for the generic multi-language
160
- backend and is installed automatically.
195
+ ``words2num2`` is self-contained: the num2words2 conversion engine is compiled
196
+ into the extension, so there is **no runtime dependency** on the num2words2
197
+ package (or anything else). Wheels on PyPI are prebuilt per platform, so a
198
+ plain ``pip install words2num2`` needs no Rust toolchain.
161
199
 
162
200
  Quickstart
163
201
  ----------
@@ -303,6 +341,13 @@ entries** including:
303
341
 
304
342
  Aliases: ``jp`` → ``ja``, ``cn`` → ``zh_CN``.
305
343
 
344
+ Wiki
345
+ ----
346
+ For the full documentation, including installation, API details, CLI
347
+ usage, supported locales, sentence conversion, auto-parse behavior, and
348
+ migration guidance, please check the Wiki_. Feel free to propose wiki
349
+ enhancements.
350
+
306
351
  Conversion types
307
352
  ~~~~~~~~~~~~~~~~
308
353
 
@@ -387,3 +432,4 @@ License
387
432
  -------
388
433
 
389
434
  LGPL-2.1, mirroring ``num2words2``. See `COPYING`.
435
+
@@ -1,41 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: words2num2
3
- Version: 0.2.2
4
- Summary: Inverse of num2words2: convert spoken-form numbers back to numeric values across 100+ languages.
5
- Home-page: https://github.com/jqueguiner/words2num2
6
- Author: Jean-Louis Queguiner
7
- Author-email: Jean-Louis Queguiner <jlqueguiner@gladia.io>
8
- Maintainer: Jean-Louis Queguiner
9
- Maintainer-email: Jean-Louis Queguiner <jlqueguiner@gladia.io>
10
- License: LGPL-2.1
11
- Project-URL: Homepage, https://github.com/jqueguiner/words2num2
12
- Project-URL: Repository, https://github.com/jqueguiner/words2num2.git
13
- Project-URL: Bug Tracker, https://github.com/jqueguiner/words2num2/issues
14
- Keywords: number,word,numbers,words,parse,parser,convert,conversion,i18n,localisation,localization,internationalisation,internationalization,asr,speech,llm
15
- Classifier: Development Status :: 4 - Beta
16
- Classifier: Intended Audience :: Developers
17
- Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.10
19
- Classifier: Programming Language :: Python :: 3.11
20
- Classifier: Programming Language :: Python :: 3.12
21
- Classifier: Programming Language :: Python :: 3.13
22
- Classifier: Programming Language :: Python :: 3.14
23
- Classifier: Programming Language :: Python :: 3.15
24
- Classifier: Topic :: Software Development :: Internationalization
25
- Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
- Classifier: Topic :: Software Development :: Localization
27
- Classifier: Topic :: Text Processing :: Linguistic
28
- Requires-Python: >=3.10
29
- Description-Content-Type: text/x-rst
30
- License-File: COPYING
31
- Requires-Dist: docopt>=0.6.2
32
- Requires-Dist: num2words2>=0.1.0.dev0
33
- Dynamic: author
34
- Dynamic: home-page
35
- Dynamic: license
36
- Dynamic: license-file
37
- Dynamic: maintainer
38
-
39
1
  words2num2 — words to numbers
40
2
  =============================
41
3
 
@@ -104,9 +66,20 @@ entries**) and adds a free-text *auto-parse* mode that handles
104
66
  currencies, units, configurable thousands/decimal separators, and
105
67
  ASR/LLM-style mixed text.
106
68
 
107
- The project is hosted on GitHub_. Contributions are welcome.
69
+ It is **Rust-powered with a thin Python binder**. The whole parsing engine —
70
+ the English grammar, the generic reverse-lookup backend, the sentence walker,
71
+ number-format parsing and auto-parse — runs in a compiled Rust core
72
+ (PyO3/``abi3``); Python only shapes arguments and results. The core embeds the
73
+ num2words2 conversion engine natively, so ``words2num2`` is **self-contained
74
+ and has no runtime dependencies**, while running several times faster than the
75
+ former pure-Python implementation. Output is unchanged — validated against a
76
+ frozen corpus of ~11,000 round-trip cases.
77
+
78
+ The project is hosted on GitHub_, and the full documentation is available
79
+ in the Wiki_. Contributions are welcome.
108
80
 
109
81
  .. _GitHub: https://github.com/jqueguiner/words2num2
82
+ .. _Wiki: https://github.com/jqueguiner/words2num2/wiki
110
83
 
111
84
  Why this library
112
85
  ----------------
@@ -130,6 +103,38 @@ the forward direction. ``words2num2``:
130
103
  * Pluralizes long-form units in expand mode (``5 dollars`` /
131
104
  ``1 dollar``, ``5 feet`` / ``1 foot``, ``5 yen`` / ``1 yen``).
132
105
 
106
+ Performance
107
+ -----------
108
+
109
+ The parsing engine is compiled Rust (PyO3/``abi3``), so there is no
110
+ Python-level tokenising or table walking on the hot path. Typical native
111
+ throughput (Apple M-series, nanoseconds per call, after warmup):
112
+
113
+ .. list-table::
114
+ :header-rows: 1
115
+ :widths: 60 20
116
+
117
+ * - Operation
118
+ - ns/call
119
+ * - English cardinal (``"eight thousand seven hundred sixty-five"``)
120
+ - ~5,900
121
+ * - English ordinal (``"forty-second"``)
122
+ - ~4,100
123
+ * - French cardinal (``"trois cent quatre"``)
124
+ - ~1,900
125
+ * - Russian cardinal (``"сорок два"``)
126
+ - ~1,700
127
+ * - ``parse_number_string("1.234.567,89", lang="de")``
128
+ - ~240
129
+ * - ``auto_parse("$12,345.00")``
130
+ - ~990
131
+
132
+ For the 100+ generic locales, the first call in a given language builds the
133
+ ``{words → number}`` reverse table once (~35 ms) and caches it in the core;
134
+ every call after that is a native lookup. Output is byte-for-byte identical to
135
+ the former pure-Python implementation, validated against a frozen corpus of
136
+ ~11,000 round-trip cases and the full test suite.
137
+
133
138
  Installation
134
139
  ------------
135
140
 
@@ -150,14 +155,18 @@ Installation
150
155
  cd python-words2num2
151
156
  makepkg -si
152
157
 
153
- **From source**::
158
+ **From source** (needs a stable Rust toolchain and `maturin
159
+ <https://www.maturin.rs>`_)::
154
160
 
155
161
  git clone https://github.com/jqueguiner/words2num2
156
162
  cd words2num2
157
- pip install -e .
163
+ pip install -e . # builds the Rust extension via maturin
164
+ # or, to produce a wheel: maturin build --release
158
165
 
159
- ``num2words2`` is a runtime dependency for the generic multi-language
160
- backend and is installed automatically.
166
+ ``words2num2`` is self-contained: the num2words2 conversion engine is compiled
167
+ into the extension, so there is **no runtime dependency** on the num2words2
168
+ package (or anything else). Wheels on PyPI are prebuilt per platform, so a
169
+ plain ``pip install words2num2`` needs no Rust toolchain.
161
170
 
162
171
  Quickstart
163
172
  ----------
@@ -303,6 +312,13 @@ entries** including:
303
312
 
304
313
  Aliases: ``jp`` → ``ja``, ``cn`` → ``zh_CN``.
305
314
 
315
+ Wiki
316
+ ----
317
+ For the full documentation, including installation, API details, CLI
318
+ usage, supported locales, sentence conversion, auto-parse behavior, and
319
+ migration guidance, please check the Wiki_. Feel free to propose wiki
320
+ enhancements.
321
+
306
322
  Conversion types
307
323
  ~~~~~~~~~~~~~~~~
308
324
 
@@ -0,0 +1,94 @@
1
+ [build-system]
2
+ requires = ["maturin>=1.5,<2.0"]
3
+ build-backend = "maturin"
4
+
5
+ [project]
6
+ name = "words2num2"
7
+ # Static base version. The release CI overrides it from the pushed git tag
8
+ # (see .github/workflows/release.yml); bump here for local source builds.
9
+ version = "0.3.0"
10
+ license = "LGPL-2.1-only"
11
+ license-files = ["COPYING"]
12
+ description = "Rust-powered inverse of num2words2: parse spoken-form numbers back to numeric values across 100+ languages, optimized for ASR/LLM/speech."
13
+ readme = "README.rst"
14
+ requires-python = ">=3.10"
15
+ # Self-contained: the num2words2 conversion engine is embedded in the compiled
16
+ # core (num2words2-core), so there is no runtime dependency on the num2words2
17
+ # package and no docopt (the CLI uses only the standard library).
18
+ dependencies = []
19
+ authors = [
20
+ {name = "Jean-Louis Queguiner", email = "jean-louis.queguiner@gmail.com"}
21
+ ]
22
+ maintainers = [
23
+ {name = "Jean-Louis Queguiner", email = "jean-louis.queguiner@gmail.com"}
24
+ ]
25
+ keywords = ["number", "word", "numbers", "words", "parse", "parser", "convert",
26
+ "conversion", "i18n", "localisation", "localization",
27
+ "internationalisation", "internationalization", "asr", "speech",
28
+ "llm", "rust"]
29
+ classifiers = [
30
+ "Development Status :: 4 - Beta",
31
+ "Intended Audience :: Developers",
32
+ "Programming Language :: Python :: 3",
33
+ "Programming Language :: Python :: 3.10",
34
+ "Programming Language :: Python :: 3.11",
35
+ "Programming Language :: Python :: 3.12",
36
+ "Programming Language :: Python :: 3.13",
37
+ "Programming Language :: Python :: 3.14",
38
+ "Programming Language :: Rust",
39
+ "Topic :: Software Development :: Internationalization",
40
+ "Topic :: Software Development :: Libraries :: Python Modules",
41
+ "Topic :: Software Development :: Localization",
42
+ "Topic :: Text Processing :: Linguistic",
43
+ ]
44
+
45
+ [project.urls]
46
+ Homepage = "https://github.com/jqueguiner/words2num2"
47
+ Documentation = "https://github.com/jqueguiner/words2num2/wiki"
48
+ Repository = "https://github.com/jqueguiner/words2num2.git"
49
+ "Bug Tracker" = "https://github.com/jqueguiner/words2num2/issues"
50
+
51
+ [project.scripts]
52
+ words2num2 = "words2num2.__main__:main"
53
+
54
+ # ---- maturin: mixed Rust/Python project -------------------------------------
55
+ # The compiled engine lives in ./rust (vendored crates `words2num2-py`, lib
56
+ # `_rust`, plus its `num2words2-core` dependency); the thin Python binder is
57
+ # ./words2num2. maturin bundles both into a single per-platform wheel. The
58
+ # wheel embeds num2words2-core natively — no lingua-rs models, so it stays
59
+ # small (~4MB), and there is only one variant.
60
+ [tool.maturin]
61
+ manifest-path = "rust/words2num2-py/Cargo.toml"
62
+ python-source = "."
63
+ module-name = "words2num2._rust"
64
+ features = ["pyo3/extension-module"]
65
+ strip = true
66
+
67
+ [tool.isort]
68
+ profile = "black"
69
+ line_length = 88
70
+ skip = ["words2num2/_version.py"]
71
+ multi_line_output = 3
72
+ include_trailing_comma = true
73
+ force_grid_wrap = 0
74
+ use_parentheses = true
75
+ ensure_newline_before_comments = true
76
+
77
+ [tool.black]
78
+ line-length = 88
79
+ target-version = ['py310']
80
+ include = '\.pyi?$'
81
+ exclude = '''
82
+ /(
83
+ \.git
84
+ | \.hg
85
+ | \.mypy_cache
86
+ | \.tox
87
+ | \.venv
88
+ | _build
89
+ | buck-out
90
+ | build
91
+ | dist
92
+ | words2num2/_version.py
93
+ )/
94
+ '''
@@ -0,0 +1,241 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 4
4
+
5
+ [[package]]
6
+ name = "autocfg"
7
+ version = "1.5.1"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
10
+
11
+ [[package]]
12
+ name = "bigdecimal"
13
+ version = "0.4.10"
14
+ source = "registry+https://github.com/rust-lang/crates.io-index"
15
+ checksum = "4d6867f1565b3aad85681f1015055b087fcfd840d6aeee6eee7f2da317603695"
16
+ dependencies = [
17
+ "autocfg",
18
+ "libm",
19
+ "num-bigint",
20
+ "num-integer",
21
+ "num-traits",
22
+ ]
23
+
24
+ [[package]]
25
+ name = "cfg-if"
26
+ version = "1.0.4"
27
+ source = "registry+https://github.com/rust-lang/crates.io-index"
28
+ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
29
+
30
+ [[package]]
31
+ name = "heck"
32
+ version = "0.5.0"
33
+ source = "registry+https://github.com/rust-lang/crates.io-index"
34
+ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
35
+
36
+ [[package]]
37
+ name = "indoc"
38
+ version = "2.0.7"
39
+ source = "registry+https://github.com/rust-lang/crates.io-index"
40
+ checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
41
+ dependencies = [
42
+ "rustversion",
43
+ ]
44
+
45
+ [[package]]
46
+ name = "libc"
47
+ version = "0.2.186"
48
+ source = "registry+https://github.com/rust-lang/crates.io-index"
49
+ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
50
+
51
+ [[package]]
52
+ name = "libm"
53
+ version = "0.2.16"
54
+ source = "registry+https://github.com/rust-lang/crates.io-index"
55
+ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981"
56
+
57
+ [[package]]
58
+ name = "memoffset"
59
+ version = "0.9.1"
60
+ source = "registry+https://github.com/rust-lang/crates.io-index"
61
+ checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
62
+ dependencies = [
63
+ "autocfg",
64
+ ]
65
+
66
+ [[package]]
67
+ name = "num-bigint"
68
+ version = "0.4.8"
69
+ source = "registry+https://github.com/rust-lang/crates.io-index"
70
+ checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
71
+ dependencies = [
72
+ "num-integer",
73
+ "num-traits",
74
+ ]
75
+
76
+ [[package]]
77
+ name = "num-integer"
78
+ version = "0.1.46"
79
+ source = "registry+https://github.com/rust-lang/crates.io-index"
80
+ checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
81
+ dependencies = [
82
+ "num-traits",
83
+ ]
84
+
85
+ [[package]]
86
+ name = "num-traits"
87
+ version = "0.2.19"
88
+ source = "registry+https://github.com/rust-lang/crates.io-index"
89
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
90
+ dependencies = [
91
+ "autocfg",
92
+ ]
93
+
94
+ [[package]]
95
+ name = "num2words2-core"
96
+ version = "0.1.0"
97
+ dependencies = [
98
+ "bigdecimal",
99
+ "num-bigint",
100
+ "num-integer",
101
+ "num-traits",
102
+ ]
103
+
104
+ [[package]]
105
+ name = "once_cell"
106
+ version = "1.21.4"
107
+ source = "registry+https://github.com/rust-lang/crates.io-index"
108
+ checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
109
+
110
+ [[package]]
111
+ name = "portable-atomic"
112
+ version = "1.13.1"
113
+ source = "registry+https://github.com/rust-lang/crates.io-index"
114
+ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49"
115
+
116
+ [[package]]
117
+ name = "proc-macro2"
118
+ version = "1.0.106"
119
+ source = "registry+https://github.com/rust-lang/crates.io-index"
120
+ checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
121
+ dependencies = [
122
+ "unicode-ident",
123
+ ]
124
+
125
+ [[package]]
126
+ name = "pyo3"
127
+ version = "0.23.5"
128
+ source = "registry+https://github.com/rust-lang/crates.io-index"
129
+ checksum = "7778bffd85cf38175ac1f545509665d0b9b92a198ca7941f131f85f7a4f9a872"
130
+ dependencies = [
131
+ "cfg-if",
132
+ "indoc",
133
+ "libc",
134
+ "memoffset",
135
+ "num-bigint",
136
+ "once_cell",
137
+ "portable-atomic",
138
+ "pyo3-build-config",
139
+ "pyo3-ffi",
140
+ "pyo3-macros",
141
+ "unindent",
142
+ ]
143
+
144
+ [[package]]
145
+ name = "pyo3-build-config"
146
+ version = "0.23.5"
147
+ source = "registry+https://github.com/rust-lang/crates.io-index"
148
+ checksum = "94f6cbe86ef3bf18998d9df6e0f3fc1050a8c5efa409bf712e661a4366e010fb"
149
+ dependencies = [
150
+ "once_cell",
151
+ "target-lexicon",
152
+ ]
153
+
154
+ [[package]]
155
+ name = "pyo3-ffi"
156
+ version = "0.23.5"
157
+ source = "registry+https://github.com/rust-lang/crates.io-index"
158
+ checksum = "e9f1b4c431c0bb1c8fb0a338709859eed0d030ff6daa34368d3b152a63dfdd8d"
159
+ dependencies = [
160
+ "libc",
161
+ "pyo3-build-config",
162
+ ]
163
+
164
+ [[package]]
165
+ name = "pyo3-macros"
166
+ version = "0.23.5"
167
+ source = "registry+https://github.com/rust-lang/crates.io-index"
168
+ checksum = "fbc2201328f63c4710f68abdf653c89d8dbc2858b88c5d88b0ff38a75288a9da"
169
+ dependencies = [
170
+ "proc-macro2",
171
+ "pyo3-macros-backend",
172
+ "quote",
173
+ "syn",
174
+ ]
175
+
176
+ [[package]]
177
+ name = "pyo3-macros-backend"
178
+ version = "0.23.5"
179
+ source = "registry+https://github.com/rust-lang/crates.io-index"
180
+ checksum = "fca6726ad0f3da9c9de093d6f116a93c1a38e417ed73bf138472cf4064f72028"
181
+ dependencies = [
182
+ "heck",
183
+ "proc-macro2",
184
+ "pyo3-build-config",
185
+ "quote",
186
+ "syn",
187
+ ]
188
+
189
+ [[package]]
190
+ name = "quote"
191
+ version = "1.0.46"
192
+ source = "registry+https://github.com/rust-lang/crates.io-index"
193
+ checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
194
+ dependencies = [
195
+ "proc-macro2",
196
+ ]
197
+
198
+ [[package]]
199
+ name = "rustversion"
200
+ version = "1.0.23"
201
+ source = "registry+https://github.com/rust-lang/crates.io-index"
202
+ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
203
+
204
+ [[package]]
205
+ name = "syn"
206
+ version = "2.0.119"
207
+ source = "registry+https://github.com/rust-lang/crates.io-index"
208
+ checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
209
+ dependencies = [
210
+ "proc-macro2",
211
+ "quote",
212
+ "unicode-ident",
213
+ ]
214
+
215
+ [[package]]
216
+ name = "target-lexicon"
217
+ version = "0.12.16"
218
+ source = "registry+https://github.com/rust-lang/crates.io-index"
219
+ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
220
+
221
+ [[package]]
222
+ name = "unicode-ident"
223
+ version = "1.0.24"
224
+ source = "registry+https://github.com/rust-lang/crates.io-index"
225
+ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
226
+
227
+ [[package]]
228
+ name = "unindent"
229
+ version = "0.2.4"
230
+ source = "registry+https://github.com/rust-lang/crates.io-index"
231
+ checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3"
232
+
233
+ [[package]]
234
+ name = "words2num2-py"
235
+ version = "0.1.0"
236
+ dependencies = [
237
+ "bigdecimal",
238
+ "num-bigint",
239
+ "num2words2-core",
240
+ "pyo3",
241
+ ]
@@ -0,0 +1,14 @@
1
+ [workspace]
2
+ members = ["num2words2-core", "words2num2-py"]
3
+ resolver = "2"
4
+
5
+ [workspace.package]
6
+ version = "0.1.0"
7
+ edition = "2021"
8
+
9
+ [profile.release]
10
+ opt-level = 3
11
+ lto = "fat"
12
+ codegen-units = 1
13
+ panic = "abort"
14
+ strip = true
@@ -0,0 +1,12 @@
1
+ [package]
2
+ name = "num2words2-core"
3
+ version.workspace = true
4
+ edition.workspace = true
5
+
6
+ [dependencies]
7
+ num-bigint = "0.4"
8
+ num-traits = "0.2"
9
+ num-integer = "0.1"
10
+ # Python does Decimal(str(value)); the shim passes that exact string across,
11
+ # so the core needs arbitrary-precision decimal parsing to match it.
12
+ bigdecimal = "0.4"