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.
- {words2num2-0.2.2 → words2num2-0.3.0}/PKG-INFO +73 -27
- words2num2-0.2.2/words2num2.egg-info/PKG-INFO → words2num2-0.3.0/README.rst +59 -43
- words2num2-0.3.0/pyproject.toml +94 -0
- words2num2-0.3.0/rust/Cargo.lock +241 -0
- words2num2-0.3.0/rust/Cargo.toml +14 -0
- words2num2-0.3.0/rust/num2words2-core/Cargo.toml +12 -0
- words2num2-0.3.0/rust/num2words2-core/src/base.rs +750 -0
- words2num2-0.3.0/rust/num2words2-core/src/currency.rs +346 -0
- words2num2-0.3.0/rust/num2words2-core/src/floatpath.rs +270 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_af.rs +725 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_am.rs +1144 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ar.rs +2622 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_as.rs +1312 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_az.rs +901 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ba.rs +1232 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ban.rs +1412 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_be.rs +1559 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_bg.rs +1638 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_bm.rs +1474 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_bn.rs +1407 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_bo.rs +1039 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_br.rs +1207 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_bs.rs +1473 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ca.rs +1441 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ce.rs +2142 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ceb.rs +1272 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ckb.rs +1017 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_cnh.rs +1159 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_cs.rs +994 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_cy.rs +1751 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_da.rs +966 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_de.rs +881 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_dv.rs +1877 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_el.rs +929 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en.rs +660 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero.rs +686 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_faa.rs +635 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_nato.rs +712 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_us_army.rs +563 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_aero_usn.rs +680 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_in.rs +681 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_ne.rs +665 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_ng.rs +767 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_en_np.rs +738 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_eo.rs +446 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es.rs +1016 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_co.rs +936 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_cr.rs +1391 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_gt.rs +1004 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_hn.rs +903 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_ni.rs +1260 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_es_ve.rs +1352 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_et.rs +1009 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_eu.rs +910 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fa.rs +766 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ff.rs +937 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fi.rs +1694 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fil.rs +787 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fo.rs +825 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fr.rs +754 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fr_be.rs +804 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fr_ch.rs +855 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_fr_dz.rs +823 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_gl.rs +910 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_gu.rs +1082 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ha.rs +913 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_haw.rs +871 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_he.rs +1166 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_hi.rs +775 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_hmn.rs +1404 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_hr.rs +1372 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ht.rs +998 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_hu.rs +1407 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_hy.rs +1504 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_id.rs +953 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_is.rs +1047 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_it.rs +1125 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ja.rs +2239 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_jv.rs +1087 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ka.rs +1289 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ki.rs +897 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_kk.rs +886 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_km.rs +898 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_kn.rs +741 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ko.rs +639 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_kok.rs +859 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ksw.rs +766 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ku.rs +1018 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ky.rs +1474 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_kz.rs +701 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_la.rs +1191 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lb.rs +1198 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lg.rs +1129 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lij.rs +1130 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ln.rs +880 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lo.rs +1053 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lt.rs +1469 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lus.rs +1016 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_lv.rs +893 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mg.rs +892 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mi.rs +848 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mk.rs +846 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ml.rs +967 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mn.rs +1494 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mr.rs +1096 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ms.rs +1337 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_mt.rs +874 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_my.rs +795 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_nb.rs +891 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ne.rs +954 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_nl.rs +764 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_nn.rs +700 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_oc.rs +1177 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_om.rs +1051 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_or.rs +931 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pa.rs +1071 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pap.rs +1079 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pl.rs +1247 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pli.rs +912 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ps.rs +1027 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pt.rs +1090 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_pt_br.rs +1682 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm.rs +956 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm_puter.rs +1063 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm_surmiran.rs +960 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm_sursilv.rs +956 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm_sutsilv.rs +856 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rm_vallader.rs +977 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ro.rs +1231 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ru.rs +2205 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_rw.rs +1467 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sa.rs +926 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sd.rs +910 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_si.rs +966 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sk.rs +1069 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sl.rs +1258 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sn.rs +1045 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_so.rs +902 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sq.rs +863 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sr.rs +1061 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sr_latn.rs +1119 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_su.rs +790 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sv.rs +815 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_sw.rs +601 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ta.rs +1135 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_te.rs +778 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tet.rs +980 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tg.rs +493 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_th.rs +882 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ti.rs +1382 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tk.rs +1032 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tl.rs +1022 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tr.rs +1630 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_tt.rs +915 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_uk.rs +1692 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_ur.rs +1293 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_uz.rs +1045 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_uz_cyr.rs +1129 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_vi.rs +1097 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_wo.rs +1023 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_xh.rs +1320 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_yi.rs +1091 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_yo.rs +1176 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_zh.rs +1070 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_zh_hk.rs +1499 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_zh_tw.rs +1836 -0
- words2num2-0.3.0/rust/num2words2-core/src/lang_zu.rs +912 -0
- words2num2-0.3.0/rust/num2words2-core/src/lib.rs +658 -0
- words2num2-0.3.0/rust/num2words2-core/src/strnum.rs +286 -0
- words2num2-0.3.0/rust/words2num2-py/Cargo.toml +14 -0
- words2num2-0.3.0/rust/words2num2-py/src/lib.rs +378 -0
- words2num2-0.3.0/rust/words2num2-py/src/w2n_formats.rs +1059 -0
- words2num2-0.3.0/rust/words2num2-py/src/w2n_lang_en.rs +1000 -0
- words2num2-0.3.0/rust/words2num2-py/src/w2n_sentence.rs +2032 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/__init__.py +4 -3
- words2num2-0.3.0/words2num2/_version.py +5 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/base.py +56 -58
- words2num2-0.3.0/words2num2/converters/auto.py +185 -0
- words2num2-0.3.0/words2num2/converters/sentence.py +17 -0
- words2num2-0.3.0/words2num2/formats.py +101 -0
- words2num2-0.3.0/words2num2/lang_EN.py +34 -0
- words2num2-0.2.2/.flake8 +0 -11
- words2num2-0.2.2/.github/workflows/aur-publish.yml +0 -104
- words2num2-0.2.2/.github/workflows/ci.yml +0 -68
- words2num2-0.2.2/.github/workflows/codeql-analysis.yml +0 -38
- words2num2-0.2.2/.github/workflows/e2e-tests.yml +0 -73
- words2num2-0.2.2/.github/workflows/lint.yml +0 -47
- words2num2-0.2.2/.github/workflows/manual-publish.yml +0 -66
- words2num2-0.2.2/.github/workflows/manual-release.yml +0 -81
- words2num2-0.2.2/.github/workflows/pr-size.yml +0 -67
- words2num2-0.2.2/.github/workflows/publish-pypi.yml +0 -76
- words2num2-0.2.2/.github/workflows/python-publish.yml +0 -61
- words2num2-0.2.2/.github/workflows/release.yml +0 -166
- words2num2-0.2.2/.github/workflows/scheduled-test.yml +0 -44
- words2num2-0.2.2/.gitignore +0 -18
- words2num2-0.2.2/CHANGELOG.md +0 -139
- words2num2-0.2.2/CONTRIBUTING.md +0 -123
- words2num2-0.2.2/LOCAL_TESTING.md +0 -173
- words2num2-0.2.2/MANIFEST.in +0 -5
- words2num2-0.2.2/Makefile +0 -50
- words2num2-0.2.2/README.rst +0 -351
- words2num2-0.2.2/REFERENCE.md +0 -450
- words2num2-0.2.2/bin/words2num2 +0 -28
- words2num2-0.2.2/packaging/aur/python-words2num2/.SRCINFO +0 -20
- words2num2-0.2.2/packaging/aur/python-words2num2/PKGBUILD +0 -33
- words2num2-0.2.2/packaging/aur/python-words2num2/README.md +0 -88
- words2num2-0.2.2/pyproject.toml +0 -87
- words2num2-0.2.2/setup.cfg +0 -4
- words2num2-0.2.2/setup.py +0 -58
- words2num2-0.2.2/tests/__init__.py +0 -0
- words2num2-0.2.2/tests/test_auto_parse.py +0 -252
- words2num2-0.2.2/tests/test_dispatch.py +0 -28
- words2num2-0.2.2/tests/test_lang_EN.py +0 -113
- words2num2-0.2.2/tests/test_multilang.py +0 -49
- words2num2-0.2.2/words2num2/_version.py +0 -3
- words2num2-0.2.2/words2num2/converters/auto.py +0 -586
- words2num2-0.2.2/words2num2/converters/sentence.py +0 -116
- words2num2-0.2.2/words2num2/formats.py +0 -212
- words2num2-0.2.2/words2num2/lang_EN.py +0 -242
- words2num2-0.2.2/words2num2.egg-info/SOURCES.txt +0 -167
- words2num2-0.2.2/words2num2.egg-info/dependency_links.txt +0 -1
- words2num2-0.2.2/words2num2.egg-info/entry_points.txt +0 -2
- words2num2-0.2.2/words2num2.egg-info/requires.txt +0 -2
- words2num2-0.2.2/words2num2.egg-info/top_level.txt +0 -1
- {words2num2-0.2.2 → words2num2-0.3.0}/COPYING +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/__main__.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/compat.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/converters/__init__.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AF.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AM.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_AZ.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BG.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_BS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_CY.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_DA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_DE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EN_IN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EN_NG.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_CO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_CR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_GT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_NI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ES_VE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ET.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_EU.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_BE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_CH.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_FR_DZ.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_GL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_GU.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HAW.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HU.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_HY.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ID.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_IS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_IT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_JA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_JW.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KM.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_KZ.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LB.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_LV.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MG.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ML.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_MY.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_NO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_OC.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PS.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_PT_BR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_RO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_RU.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SD.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SQ.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SU.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SV.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_SW.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TA.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TE.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TET.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TG.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TH.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TL.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_TT.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UR.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_UZ.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_VI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_WO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_YI.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_YO.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_CN.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_HK.py +0 -0
- {words2num2-0.2.2 → words2num2-0.3.0}/words2num2/lang_ZH_TW.py +0 -0
- {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.
|
|
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 ::
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
``
|
|
160
|
-
|
|
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
|
-
|
|
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
|
-
``
|
|
160
|
-
|
|
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,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"
|