dateparser 1.2.0__tar.gz → 1.2.2__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.
- {dateparser-1.2.0 → dateparser-1.2.2}/CONTRIBUTING.rst +13 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/HISTORY.rst +37 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/MANIFEST.in +1 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/PKG-INFO +67 -16
- {dateparser-1.2.0 → dateparser-1.2.2}/README.rst +6 -6
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/__init__.py +1 -1
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/__init__.py +5 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/hijri_parser.py +10 -6
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/jalali_parser.py +6 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/conf.py +1 -1
- dateparser-1.2.2/dateparser/data/__init__.py +2 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/en.py +1 -1
- dateparser-1.2.2/dateparser/data/dateparser_tz_cache.pkl +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/date.py +0 -1
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/freshness_date_parser.py +2 -5
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/dictionary.py +27 -19
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/parser.py +28 -22
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/__init__.py +2 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/search.py +7 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/timezone_parser.py +49 -7
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/PKG-INFO +67 -16
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/SOURCES.txt +2 -2
- dateparser-1.2.2/dateparser.egg-info/requires.txt +15 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/custom_language_detection.rst +13 -13
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/introduction.rst +3 -3
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/settings.rst +2 -2
- dateparser-1.2.2/pyproject.toml +20 -0
- dateparser-1.2.2/setup.cfg +4 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/setup.py +10 -13
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_clean_api.py +81 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date.py +1 -1
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date_parser.py +102 -7
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_dateparser_data_integrity.py +4 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_hijri.py +6 -2
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_jalali.py +12 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_language_detect.py +4 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_languages.py +12 -10
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_search.py +30 -5
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_timezone_parser.py +10 -6
- dateparser-1.2.0/dateparser/data/__init__.py +0 -3
- dateparser-1.2.0/dateparser.egg-info/requires.txt +0 -14
- dateparser-1.2.0/setup.cfg +0 -21
- dateparser-1.2.0/tests/requirements.txt +0 -4
- {dateparser-1.2.0 → dateparser-1.2.2}/AUTHORS.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/LICENSE +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/hijri.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/jalali.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/fasttext.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/langdetect.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/language_mapping.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/af.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/agq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ak.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/am.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ar.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/as.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/asa.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ast.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az-Cyrl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az-Latn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bas.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/be.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bem.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bez.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bm.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/br.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/brx.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs-Cyrl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs-Latn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ca.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ce.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cgg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/chr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ckb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cs.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cy.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/da.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dav.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/de.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dje.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dsb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dua.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dyo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dz.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ebu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ee.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/el.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/eo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/es.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/et.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/eu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ewo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fa.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ff.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fi.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fil.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fur.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fy.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ga.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gd.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gsw.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/guz.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gv.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ha.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/haw.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/he.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hi.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hsb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hy.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/id.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ig.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ii.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/is.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/it.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ja.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/jgo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/jmc.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ka.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kab.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kam.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kde.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kea.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/khq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ki.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kk.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kln.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/km.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ko.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kok.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ks.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksf.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kw.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ky.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lag.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lkt.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ln.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lrc.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lt.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/luo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/luy.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lv.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mas.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mer.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mfe.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mgh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mgo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mk.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ml.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ms.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mt.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mua.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/my.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mzn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/naq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nb.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nd.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ne.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nmg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nnh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nus.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nyn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/om.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/or.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/os.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa-Arab.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa-Guru.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ps.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pt.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/qu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rm.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ro.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rof.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ru.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rw.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rwk.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sah.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/saq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sbp.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/se.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/seh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ses.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sg.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi-Latn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi-Tfng.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/si.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sk.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/smn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/so.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr-Cyrl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr-Latn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sv.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sw.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ta.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/te.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/teo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/th.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ti.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/to.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tr.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/twq.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tzm.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ug.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uk.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ur.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Arab.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Cyrl.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Latn.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/vi.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/vun.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/wae.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/xog.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yav.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yi.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yo.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yue.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zgh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh-Hans.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh-Hant.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zu.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/languages_info.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/date_parser.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/loader.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/locale.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/validation.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/detection.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/text_detection.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/timezones.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/utils/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/utils/strptime.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/dependency_links.txt +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/entry_points.txt +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/not-zip-safe +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/top_level.txt +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/cli.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/exceptions.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/fasttext_manager.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/utils.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_data/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_data/settings.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/get_cldr_data.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/order_languages.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/update_supported_languages_and_locales.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/utils.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/write_complete_data.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/Makefile +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/authors.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/conf.py +2 -2
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/contributing.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.calendars.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.languages.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/history.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/index.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/installation.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/make.bat +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/modules.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/supported_locales.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/template.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/docs/usage.rst +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/__init__.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_data.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date_data.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_freshness_date_parser.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_loading.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_parser.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_pickle.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_settings.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_utils.py +0 -0
- {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_utils_strptime.py +0 -0
|
@@ -179,3 +179,16 @@ Whenever the content of
|
|
|
179
179
|
the corresponding documentation table::
|
|
180
180
|
|
|
181
181
|
dateparser_scripts/update_supported_languages_and_locales.py
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
Updating the Timezone Cache
|
|
185
|
+
----------------------------------------------------
|
|
186
|
+
|
|
187
|
+
Whenever the content of
|
|
188
|
+
``dateparser/timezones.py`` is modified you need to rebuild the timezone cache.
|
|
189
|
+
|
|
190
|
+
Run this command:
|
|
191
|
+
``BUILD_TZ_CACHE=1 python -c "import dateparser"``
|
|
192
|
+
|
|
193
|
+
which should update
|
|
194
|
+
``dateparser/data/dateparser_tz_cache.pkl``
|
|
@@ -3,6 +3,43 @@
|
|
|
3
3
|
History
|
|
4
4
|
=======
|
|
5
5
|
|
|
6
|
+
1.2.2 (2025-06-26)
|
|
7
|
+
------------------
|
|
8
|
+
|
|
9
|
+
Fixes:
|
|
10
|
+
|
|
11
|
+
- Handle the Russian preposition “с” (#1261)
|
|
12
|
+
- Fix weekday search (#1274)
|
|
13
|
+
|
|
14
|
+
Improvements:
|
|
15
|
+
|
|
16
|
+
- Add Python 3.14 support (#1273)
|
|
17
|
+
- Cache timezone offsets to improve import time (#1250)
|
|
18
|
+
|
|
19
|
+
1.2.1 (2025-02-05)
|
|
20
|
+
------------------
|
|
21
|
+
|
|
22
|
+
Fixes:
|
|
23
|
+
|
|
24
|
+
- Fix PytzUsageWarning (#1109)
|
|
25
|
+
- Fix date_parser with prefer_month_of_year wrong results (#1224)
|
|
26
|
+
- Fix skipped day when UTC and tz are different days (#1183)
|
|
27
|
+
|
|
28
|
+
Improvements:
|
|
29
|
+
|
|
30
|
+
- Avoid repeated loop over timezones (#1238)
|
|
31
|
+
- Proofread README.rst (#1234)
|
|
32
|
+
- Check for derived types for configuration (#1223)
|
|
33
|
+
- Parse some abbreviated strings as relative dates (#1219)
|
|
34
|
+
- Migrate from hijri-converter to hijridate (#1211)
|
|
35
|
+
- Fixed ClusterFuzz build error by adding dateparser.data as a binary (#1208)
|
|
36
|
+
- Fix an issue detected by OSSFuzz (#1203)
|
|
37
|
+
- Support two-digit years in non-Gregorian calendars (#1187)
|
|
38
|
+
- Refactored CI to run extras separately and test minimum versions of dependencies, replaced flake8 with ruff, fixed tests (#1248)
|
|
39
|
+
- Set minimum versions for dependencies (#1248)
|
|
40
|
+
- Limited ``numpy`` to 1.x when installing ``dateparser[fasttext]`` (#1248)
|
|
41
|
+
|
|
42
|
+
|
|
6
43
|
1.2.0 (2023-11-17)
|
|
7
44
|
------------------
|
|
8
45
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: dateparser
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
4
4
|
Summary: Date parsing library designed to parse dates from HTML pages
|
|
5
5
|
Home-page: https://github.com/scrapinghub/dateparser
|
|
6
6
|
Author: Scrapinghub
|
|
@@ -13,26 +13,40 @@ Classifier: Intended Audience :: Developers
|
|
|
13
13
|
Classifier: License :: OSI Approved :: BSD License
|
|
14
14
|
Classifier: Natural Language :: English
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.7
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
18
16
|
Classifier: Programming Language :: Python :: 3.9
|
|
19
17
|
Classifier: Programming Language :: Python :: 3.10
|
|
20
18
|
Classifier: Programming Language :: Python :: 3.11
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
21
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
22
|
-
Requires-Python: >=3.
|
|
22
|
+
Requires-Python: >=3.8
|
|
23
23
|
License-File: LICENSE
|
|
24
24
|
License-File: AUTHORS.rst
|
|
25
|
-
Requires-Dist: python-dateutil
|
|
26
|
-
Requires-Dist: pytz
|
|
27
|
-
Requires-Dist: regex
|
|
28
|
-
Requires-Dist: tzlocal
|
|
25
|
+
Requires-Dist: python-dateutil>=2.7.0
|
|
26
|
+
Requires-Dist: pytz>=2024.2
|
|
27
|
+
Requires-Dist: regex>=2024.9.11
|
|
28
|
+
Requires-Dist: tzlocal>=0.2
|
|
29
29
|
Provides-Extra: calendars
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist:
|
|
30
|
+
Requires-Dist: convertdate>=2.2.1; extra == "calendars"
|
|
31
|
+
Requires-Dist: hijridate; extra == "calendars"
|
|
32
32
|
Provides-Extra: fasttext
|
|
33
|
-
Requires-Dist: fasttext; extra == "fasttext"
|
|
33
|
+
Requires-Dist: fasttext>=0.9.1; extra == "fasttext"
|
|
34
|
+
Requires-Dist: numpy<2,>=1.19.3; extra == "fasttext"
|
|
34
35
|
Provides-Extra: langdetect
|
|
35
|
-
Requires-Dist: langdetect; extra == "langdetect"
|
|
36
|
+
Requires-Dist: langdetect>=1.0.0; extra == "langdetect"
|
|
37
|
+
Dynamic: author
|
|
38
|
+
Dynamic: author-email
|
|
39
|
+
Dynamic: classifier
|
|
40
|
+
Dynamic: description
|
|
41
|
+
Dynamic: home-page
|
|
42
|
+
Dynamic: keywords
|
|
43
|
+
Dynamic: license
|
|
44
|
+
Dynamic: license-file
|
|
45
|
+
Dynamic: project-url
|
|
46
|
+
Dynamic: provides-extra
|
|
47
|
+
Dynamic: requires-dist
|
|
48
|
+
Dynamic: requires-python
|
|
49
|
+
Dynamic: summary
|
|
36
50
|
|
|
37
51
|
==========================
|
|
38
52
|
Introduction to dateparser
|
|
@@ -259,13 +273,13 @@ Dependencies
|
|
|
259
273
|
|
|
260
274
|
* dateutil_'s module ``relativedelta`` for its freshness parser.
|
|
261
275
|
* convertdate_ to convert *Jalali* dates to *Gregorian*.
|
|
262
|
-
*
|
|
276
|
+
* hijridate_ to convert *Hijri* dates to *Gregorian*.
|
|
263
277
|
* tzlocal_ to reliably get local timezone.
|
|
264
278
|
* ruamel.yaml_ (optional) for operations on language files.
|
|
265
279
|
|
|
266
280
|
.. _dateutil: https://pypi.python.org/pypi/python-dateutil
|
|
267
281
|
.. _convertdate: https://pypi.python.org/pypi/convertdate
|
|
268
|
-
..
|
|
282
|
+
.. _hijridate: https://pypi.python.org/pypi/hijridate
|
|
269
283
|
.. _tzlocal: https://pypi.python.org/pypi/tzlocal
|
|
270
284
|
.. _ruamel.yaml: https://pypi.python.org/pypi/ruamel.yaml
|
|
271
285
|
|
|
@@ -297,7 +311,7 @@ To be able to use them you need to install the `calendar` extra by typing:
|
|
|
297
311
|
>>> HijriCalendar('17-01-1437 هـ 08:30 مساءً').get_date()
|
|
298
312
|
DateData(date_obj=datetime.datetime(2015, 10, 30, 20, 30), period='day', locale=None)
|
|
299
313
|
|
|
300
|
-
.. note:: `HijriCalendar` only works with Python ≥ 3.
|
|
314
|
+
.. note:: `HijriCalendar` only works with Python ≥ 3.7.
|
|
301
315
|
|
|
302
316
|
|
|
303
317
|
.. :changelog:
|
|
@@ -305,6 +319,43 @@ To be able to use them you need to install the `calendar` extra by typing:
|
|
|
305
319
|
History
|
|
306
320
|
=======
|
|
307
321
|
|
|
322
|
+
1.2.2 (2025-06-26)
|
|
323
|
+
------------------
|
|
324
|
+
|
|
325
|
+
Fixes:
|
|
326
|
+
|
|
327
|
+
- Handle the Russian preposition “с” (#1261)
|
|
328
|
+
- Fix weekday search (#1274)
|
|
329
|
+
|
|
330
|
+
Improvements:
|
|
331
|
+
|
|
332
|
+
- Add Python 3.14 support (#1273)
|
|
333
|
+
- Cache timezone offsets to improve import time (#1250)
|
|
334
|
+
|
|
335
|
+
1.2.1 (2025-02-05)
|
|
336
|
+
------------------
|
|
337
|
+
|
|
338
|
+
Fixes:
|
|
339
|
+
|
|
340
|
+
- Fix PytzUsageWarning (#1109)
|
|
341
|
+
- Fix date_parser with prefer_month_of_year wrong results (#1224)
|
|
342
|
+
- Fix skipped day when UTC and tz are different days (#1183)
|
|
343
|
+
|
|
344
|
+
Improvements:
|
|
345
|
+
|
|
346
|
+
- Avoid repeated loop over timezones (#1238)
|
|
347
|
+
- Proofread README.rst (#1234)
|
|
348
|
+
- Check for derived types for configuration (#1223)
|
|
349
|
+
- Parse some abbreviated strings as relative dates (#1219)
|
|
350
|
+
- Migrate from hijri-converter to hijridate (#1211)
|
|
351
|
+
- Fixed ClusterFuzz build error by adding dateparser.data as a binary (#1208)
|
|
352
|
+
- Fix an issue detected by OSSFuzz (#1203)
|
|
353
|
+
- Support two-digit years in non-Gregorian calendars (#1187)
|
|
354
|
+
- Refactored CI to run extras separately and test minimum versions of dependencies, replaced flake8 with ruff, fixed tests (#1248)
|
|
355
|
+
- Set minimum versions for dependencies (#1248)
|
|
356
|
+
- Limited ``numpy`` to 1.x when installing ``dateparser[fasttext]`` (#1248)
|
|
357
|
+
|
|
358
|
+
|
|
308
359
|
1.2.0 (2023-11-17)
|
|
309
360
|
------------------
|
|
310
361
|
|
|
@@ -50,7 +50,7 @@ Key Features
|
|
|
50
50
|
locales <https://dateparser.readthedocs.io/en/latest/supported_locales.html>`__.
|
|
51
51
|
- Language autodetection
|
|
52
52
|
- Customizable behavior through
|
|
53
|
-
`settings <https://dateparser.readthedocs.io/en/latest/
|
|
53
|
+
`settings <https://dateparser.readthedocs.io/en/latest/settings.html>`__.
|
|
54
54
|
- Support for `non-Gregorian calendar
|
|
55
55
|
systems <https://dateparser.readthedocs.io/en/latest/introduction.html#supported-calendars>`__.
|
|
56
56
|
- Support for dates with timezones abbreviations or UTC offsets
|
|
@@ -144,8 +144,8 @@ For that reason it is important that the input is a valid date, otherwise it cou
|
|
|
144
144
|
|
|
145
145
|
To reduce the possibility of receiving false positives, make sure that:
|
|
146
146
|
|
|
147
|
-
- The input string
|
|
148
|
-
- If you know the language or languages beforehand you add them through the ``languages`` or ``locales`` properties.
|
|
147
|
+
- The input string is a valid date and doesn't contain any other words or numbers.
|
|
148
|
+
- If you know the language or languages beforehand, you add them through the ``languages`` or ``locales`` properties.
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
On the other hand, if you want to exclude any of the default parsers
|
|
@@ -156,7 +156,7 @@ are executed, you can do so through the
|
|
|
156
156
|
Installation
|
|
157
157
|
------------
|
|
158
158
|
|
|
159
|
-
Dateparser supports Python >= 3.
|
|
159
|
+
Dateparser supports Python >= 3.9. You can install it by doing:
|
|
160
160
|
|
|
161
161
|
::
|
|
162
162
|
|
|
@@ -172,7 +172,7 @@ If you want to use the jalali or hijri calendar, you need to install the
|
|
|
172
172
|
Common use cases
|
|
173
173
|
----------------
|
|
174
174
|
|
|
175
|
-
**dateparser** can be used
|
|
175
|
+
**dateparser** can be used for a wide variety of purposes,
|
|
176
176
|
but it stands out when it comes to:
|
|
177
177
|
|
|
178
178
|
Consuming data from different sources:
|
|
@@ -191,7 +191,7 @@ Offering natural interaction with users:
|
|
|
191
191
|
|
|
192
192
|
- **Tooling and CLI**: allow users to write “3 days ago” to retrieve
|
|
193
193
|
information.
|
|
194
|
-
- **Search engine**: allow people to search by date in an
|
|
194
|
+
- **Search engine**: allow people to search by date in an easy /
|
|
195
195
|
natural format.
|
|
196
196
|
- **Bots**: allow users to interact with a bot easily
|
|
197
197
|
|
|
@@ -76,6 +76,9 @@ class non_gregorian_parser(_parser):
|
|
|
76
76
|
|
|
77
77
|
return result
|
|
78
78
|
|
|
79
|
+
def handle_two_digit_year(self, year):
|
|
80
|
+
raise ValueError
|
|
81
|
+
|
|
79
82
|
def _get_datetime_obj(self, **params):
|
|
80
83
|
day = params["day"]
|
|
81
84
|
year = params["year"]
|
|
@@ -129,6 +132,8 @@ class non_gregorian_parser(_parser):
|
|
|
129
132
|
day = int(token)
|
|
130
133
|
elif directive == "%Y" and token_len == 4 and is_digit:
|
|
131
134
|
year = int(token)
|
|
135
|
+
elif directive == "%Y" and token_len == 2 and is_digit:
|
|
136
|
+
year = self.handle_two_digit_year(int(token))
|
|
132
137
|
else:
|
|
133
138
|
raise ValueError
|
|
134
139
|
return self.non_gregorian_date_cls(year, month, day)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from
|
|
1
|
+
from hijridate import Gregorian, Hijri
|
|
2
2
|
|
|
3
3
|
from dateparser.calendars import non_gregorian_parser
|
|
4
4
|
|
|
@@ -6,19 +6,17 @@ from dateparser.calendars import non_gregorian_parser
|
|
|
6
6
|
class hijri:
|
|
7
7
|
@classmethod
|
|
8
8
|
def to_gregorian(cls, year=None, month=None, day=None):
|
|
9
|
-
g =
|
|
10
|
-
year=year, month=month, day=day, validate=False
|
|
11
|
-
).to_gregorian()
|
|
9
|
+
g = Hijri(year=year, month=month, day=day, validate=False).to_gregorian()
|
|
12
10
|
return g.datetuple()
|
|
13
11
|
|
|
14
12
|
@classmethod
|
|
15
13
|
def from_gregorian(cls, year=None, month=None, day=None):
|
|
16
|
-
h =
|
|
14
|
+
h = Gregorian(year, month, day).to_hijri()
|
|
17
15
|
return h.datetuple()
|
|
18
16
|
|
|
19
17
|
@classmethod
|
|
20
18
|
def month_length(cls, year, month):
|
|
21
|
-
h =
|
|
19
|
+
h = Hijri(year=year, month=month, day=1)
|
|
22
20
|
return h.month_length()
|
|
23
21
|
|
|
24
22
|
|
|
@@ -54,3 +52,9 @@ class hijri_parser(non_gregorian_parser):
|
|
|
54
52
|
for arabic in arabics:
|
|
55
53
|
result = result.replace(arabic, latin)
|
|
56
54
|
return result
|
|
55
|
+
|
|
56
|
+
def handle_two_digit_year(self, year):
|
|
57
|
+
if year >= 90:
|
|
58
|
+
return year + 1300
|
|
59
|
+
else:
|
|
60
|
+
return year + 1400
|
|
@@ -243,7 +243,7 @@ def check_settings(settings):
|
|
|
243
243
|
setting_props = settings_values[setting_name]
|
|
244
244
|
|
|
245
245
|
# check type:
|
|
246
|
-
if not
|
|
246
|
+
if not isinstance(setting_value, setting_props["type"]):
|
|
247
247
|
raise SettingValidationError(
|
|
248
248
|
'"{}" must be "{}", not "{}".'.format(
|
|
249
249
|
setting_name, setting_props["type"].__name__, setting_type.__name__
|
|
Binary file
|
|
@@ -31,7 +31,7 @@ class FreshnessDateDataParser:
|
|
|
31
31
|
date_string = re.sub(r"\b(?:ago|in)\b", "", date_string)
|
|
32
32
|
try:
|
|
33
33
|
return time_parser(date_string)
|
|
34
|
-
except:
|
|
34
|
+
except Exception:
|
|
35
35
|
pass
|
|
36
36
|
|
|
37
37
|
def get_local_tz(self):
|
|
@@ -71,10 +71,7 @@ class FreshnessDateDataParser:
|
|
|
71
71
|
now = now.replace(tzinfo=ptz)
|
|
72
72
|
|
|
73
73
|
if not now.tzinfo:
|
|
74
|
-
|
|
75
|
-
now = self.get_local_tz().localize(now)
|
|
76
|
-
else:
|
|
77
|
-
now = now.replace(tzinfo=self.get_local_tz())
|
|
74
|
+
now = now.replace(tzinfo=self.get_local_tz())
|
|
78
75
|
|
|
79
76
|
elif ptz:
|
|
80
77
|
localized_now = datetime.now(ptz)
|
|
@@ -181,26 +181,34 @@ class Dictionary:
|
|
|
181
181
|
):
|
|
182
182
|
cache.pop(list(cache.keys())[0])
|
|
183
183
|
|
|
184
|
-
def _split_by_known_words(self, string, keep_formatting):
|
|
185
|
-
if not string:
|
|
186
|
-
return string
|
|
187
|
-
|
|
184
|
+
def _split_by_known_words(self, string: str, keep_formatting: bool):
|
|
188
185
|
regex = self._get_split_regex_cache()
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
186
|
+
splitted = []
|
|
187
|
+
unknown = string
|
|
188
|
+
|
|
189
|
+
while unknown:
|
|
190
|
+
match = regex.match(string)
|
|
191
|
+
|
|
192
|
+
if not match:
|
|
193
|
+
curr_split = (
|
|
194
|
+
self._split_by_numerals(string, keep_formatting)
|
|
195
|
+
if self._should_capture(string, keep_formatting)
|
|
196
|
+
else []
|
|
197
|
+
)
|
|
198
|
+
unknown = ""
|
|
199
|
+
else:
|
|
200
|
+
unparsed, known, unknown = match.groups()
|
|
201
|
+
curr_split = (
|
|
202
|
+
[known] if self._should_capture(known, keep_formatting) else []
|
|
203
|
+
)
|
|
204
|
+
if unparsed and self._should_capture(unparsed, keep_formatting):
|
|
205
|
+
curr_split = (
|
|
206
|
+
self._split_by_numerals(unparsed, keep_formatting) + curr_split
|
|
207
|
+
)
|
|
208
|
+
if unknown:
|
|
209
|
+
string = unknown if string != unknown else ""
|
|
210
|
+
|
|
211
|
+
splitted.extend(curr_split)
|
|
204
212
|
return splitted
|
|
205
213
|
|
|
206
214
|
def _split_by_numerals(self, string, keep_formatting):
|
|
@@ -182,7 +182,7 @@ class _no_spaces_parser:
|
|
|
182
182
|
dt = strptime(datestring, fmt), cls._get_period(fmt)
|
|
183
183
|
if len(str(dt[0].year)) == 4:
|
|
184
184
|
return dt
|
|
185
|
-
except:
|
|
185
|
+
except Exception:
|
|
186
186
|
pass
|
|
187
187
|
return None
|
|
188
188
|
|
|
@@ -216,7 +216,7 @@ class _no_spaces_parser:
|
|
|
216
216
|
missing = _get_missing_parts(fmt)
|
|
217
217
|
_check_strict_parsing(missing, settings)
|
|
218
218
|
return dt
|
|
219
|
-
except:
|
|
219
|
+
except Exception:
|
|
220
220
|
pass
|
|
221
221
|
else:
|
|
222
222
|
if ambiguous_date:
|
|
@@ -332,7 +332,7 @@ class _parser:
|
|
|
332
332
|
token.index(":")
|
|
333
333
|
# Is after period? raise ValueError if '.' can't be found:
|
|
334
334
|
self.tokens[self.tokens.index((token, 0)) + 1][0].index(".")
|
|
335
|
-
except:
|
|
335
|
+
except Exception:
|
|
336
336
|
microsecond = None
|
|
337
337
|
|
|
338
338
|
if microsecond:
|
|
@@ -342,7 +342,7 @@ class _parser:
|
|
|
342
342
|
meridian = MERIDIAN.search(
|
|
343
343
|
self.filtered_tokens[meridian_index][0]
|
|
344
344
|
).group()
|
|
345
|
-
except:
|
|
345
|
+
except Exception:
|
|
346
346
|
meridian = None
|
|
347
347
|
|
|
348
348
|
if any([":" in token, meridian, microsecond]):
|
|
@@ -399,8 +399,8 @@ class _parser:
|
|
|
399
399
|
return datetime(**params)
|
|
400
400
|
except ValueError as e:
|
|
401
401
|
error_text = e.__str__()
|
|
402
|
-
error_msgs = ["day is out of range", "day must be in"]
|
|
403
|
-
if
|
|
402
|
+
error_msgs = ["day is out of range", "day must be in", "must be in range"]
|
|
403
|
+
if any(msg in error_text for msg in error_msgs):
|
|
404
404
|
if not (self._token_day or hasattr(self, "_token_weekday")):
|
|
405
405
|
# if day is not available put last day of the month
|
|
406
406
|
params["day"] = get_last_day_of_month(
|
|
@@ -512,11 +512,15 @@ class _parser:
|
|
|
512
512
|
|
|
513
513
|
dateobj = dateobj + delta
|
|
514
514
|
|
|
515
|
+
# set the token_month here so that it is not subsequently
|
|
516
|
+
# altered by _correct_for_month
|
|
517
|
+
self._token_month = dateobj.month
|
|
518
|
+
|
|
515
519
|
# NOTE: If this assert fires, self.now needs to be made offset-aware in a similar
|
|
516
520
|
# way that dateobj is temporarily made offset-aware.
|
|
517
|
-
assert not (
|
|
518
|
-
self.now
|
|
519
|
-
)
|
|
521
|
+
assert not (self.now.tzinfo is None and dateobj.tzinfo is not None), (
|
|
522
|
+
"`self.now` doesn't have `tzinfo`. Review comment in code for details."
|
|
523
|
+
)
|
|
520
524
|
|
|
521
525
|
# Store the original dateobj values so that upon subsequent parsing everything is not
|
|
522
526
|
# treated as offset-aware if offset awareness is changed.
|
|
@@ -563,18 +567,15 @@ class _parser:
|
|
|
563
567
|
# Convert dateobj to utc time to compare with self.now
|
|
564
568
|
try:
|
|
565
569
|
tz = tz or get_timezone_from_tz_string(self.settings.TIMEZONE)
|
|
566
|
-
|
|
567
|
-
|
|
570
|
+
tz_offset = tz.utcoffset(dateobj)
|
|
571
|
+
except (pytz.UnknownTimeZoneError, pytz.NonExistentTimeError):
|
|
572
|
+
tz_offset = timedelta(hours=0)
|
|
568
573
|
|
|
569
|
-
if tz:
|
|
570
|
-
dateobj_time = (dateobj - tz.utcoffset(dateobj)).time()
|
|
571
|
-
else:
|
|
572
|
-
dateobj_time = dateobj.time()
|
|
573
574
|
if "past" in self.settings.PREFER_DATES_FROM:
|
|
574
|
-
if self.now
|
|
575
|
+
if self.now < dateobj - tz_offset:
|
|
575
576
|
dateobj = dateobj + timedelta(days=-1)
|
|
576
577
|
if "future" in self.settings.PREFER_DATES_FROM:
|
|
577
|
-
if self.now
|
|
578
|
+
if self.now > dateobj - tz_offset:
|
|
578
579
|
dateobj = dateobj + timedelta(days=1)
|
|
579
580
|
|
|
580
581
|
# Reset dateobj to the original value, thus removing any offset awareness that may
|
|
@@ -601,10 +602,13 @@ class _parser:
|
|
|
601
602
|
relative_base_month = (
|
|
602
603
|
relative_base.month if hasattr(relative_base, "month") else relative_base
|
|
603
604
|
)
|
|
604
|
-
|
|
605
|
+
|
|
606
|
+
if getattr(self, "_token_month", None):
|
|
605
607
|
return dateobj
|
|
606
608
|
|
|
607
|
-
dateobj = set_correct_month_from_settings(
|
|
609
|
+
dateobj = set_correct_month_from_settings(
|
|
610
|
+
dateobj, self.settings, relative_base_month
|
|
611
|
+
)
|
|
608
612
|
return dateobj
|
|
609
613
|
|
|
610
614
|
@classmethod
|
|
@@ -616,11 +620,13 @@ class _parser:
|
|
|
616
620
|
# correction for past, future if applicable
|
|
617
621
|
dateobj = po._correct_for_time_frame(dateobj, tz)
|
|
618
622
|
|
|
623
|
+
# correction for preference of month: beginning, current, end
|
|
624
|
+
# must happen before day so that day is derived from the correct month
|
|
625
|
+
dateobj = po._correct_for_month(dateobj)
|
|
626
|
+
|
|
619
627
|
# correction for preference of day: beginning, current, end
|
|
620
628
|
dateobj = po._correct_for_day(dateobj)
|
|
621
629
|
|
|
622
|
-
# correction for preference of month: beginning, current, end
|
|
623
|
-
dateobj = po._correct_for_month(dateobj)
|
|
624
630
|
period = po._get_period()
|
|
625
631
|
|
|
626
632
|
return dateobj, period
|
|
@@ -684,7 +690,7 @@ class _parser:
|
|
|
684
690
|
(component, getattr(do, component)),
|
|
685
691
|
("day", prev_value),
|
|
686
692
|
]
|
|
687
|
-
except:
|
|
693
|
+
except Exception:
|
|
688
694
|
pass
|
|
689
695
|
else:
|
|
690
696
|
raise ValueError("Unable to parse: %s" % token)
|
|
@@ -295,3 +295,10 @@ class DateSearchWithDetection:
|
|
|
295
295
|
language_shortname, text, settings=settings
|
|
296
296
|
),
|
|
297
297
|
}
|
|
298
|
+
|
|
299
|
+
def preprocess_text(self, text, languages):
|
|
300
|
+
"""Preprocess text to handle language-specific quirks."""
|
|
301
|
+
if languages and "ru" in languages:
|
|
302
|
+
# Replace "с" (from) before numbers with a placeholder
|
|
303
|
+
text = re.sub(r"\bс\s+(?=\d)", "[FROM] ", text)
|
|
304
|
+
return text
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pickle
|
|
3
|
+
import zlib
|
|
1
4
|
from datetime import datetime, timedelta, timezone, tzinfo
|
|
5
|
+
from pathlib import Path
|
|
2
6
|
|
|
3
7
|
import regex as re
|
|
4
8
|
|
|
@@ -72,9 +76,8 @@ def build_tz_offsets(search_regex_parts):
|
|
|
72
76
|
search_regex_parts.append(tz_obj[0])
|
|
73
77
|
yield get_offset(tz_obj, regex)
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
for tz_obj in tz_info["timezones"]:
|
|
79
|
+
# alternate patterns
|
|
80
|
+
for replace, replacewith in tz_info.get("replace", []):
|
|
78
81
|
search_regex_parts.append(re.sub(replace, replacewith, tz_obj[0]))
|
|
79
82
|
yield get_offset(tz_obj, regex, repl=replace, replw=replacewith)
|
|
80
83
|
|
|
@@ -85,8 +88,47 @@ def get_local_tz_offset():
|
|
|
85
88
|
return offset
|
|
86
89
|
|
|
87
90
|
|
|
88
|
-
_search_regex_parts = []
|
|
89
|
-
_tz_offsets = list(build_tz_offsets(_search_regex_parts))
|
|
90
|
-
_search_regex = re.compile("|".join(_search_regex_parts))
|
|
91
|
-
_search_regex_ignorecase = re.compile("|".join(_search_regex_parts), re.IGNORECASE)
|
|
92
91
|
local_tz_offset = get_local_tz_offset()
|
|
92
|
+
|
|
93
|
+
_tz_offsets = None
|
|
94
|
+
_search_regex = None
|
|
95
|
+
_search_regex_ignorecase = None
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _load_offsets(cache_path, current_hash):
|
|
99
|
+
global _tz_offsets, _search_regex, _search_regex_ignorecase
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
with open(cache_path, mode="rb") as file:
|
|
103
|
+
(
|
|
104
|
+
serialized_hash,
|
|
105
|
+
_tz_offsets,
|
|
106
|
+
_search_regex,
|
|
107
|
+
_search_regex_ignorecase,
|
|
108
|
+
) = pickle.load(file)
|
|
109
|
+
if current_hash is None or current_hash == serialized_hash:
|
|
110
|
+
return
|
|
111
|
+
except (FileNotFoundError, ValueError, TypeError):
|
|
112
|
+
pass
|
|
113
|
+
|
|
114
|
+
_search_regex_parts = []
|
|
115
|
+
_tz_offsets = list(build_tz_offsets(_search_regex_parts))
|
|
116
|
+
_search_regex = re.compile("|".join(_search_regex_parts))
|
|
117
|
+
_search_regex_ignorecase = re.compile("|".join(_search_regex_parts), re.IGNORECASE)
|
|
118
|
+
|
|
119
|
+
with open(cache_path, mode="wb") as file:
|
|
120
|
+
pickle.dump(
|
|
121
|
+
(current_hash, _tz_offsets, _search_regex, _search_regex_ignorecase),
|
|
122
|
+
file,
|
|
123
|
+
protocol=5,
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
CACHE_PATH = Path(__file__).parent.joinpath("data", "dateparser_tz_cache.pkl")
|
|
128
|
+
|
|
129
|
+
if "BUILD_TZ_CACHE" in os.environ:
|
|
130
|
+
current_hash = zlib.crc32(str(timezone_info_list).encode("utf-8"))
|
|
131
|
+
else:
|
|
132
|
+
current_hash = None
|
|
133
|
+
|
|
134
|
+
_load_offsets(CACHE_PATH, current_hash)
|