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.
Files changed (309) hide show
  1. {dateparser-1.2.0 → dateparser-1.2.2}/CONTRIBUTING.rst +13 -0
  2. {dateparser-1.2.0 → dateparser-1.2.2}/HISTORY.rst +37 -0
  3. {dateparser-1.2.0 → dateparser-1.2.2}/MANIFEST.in +1 -0
  4. {dateparser-1.2.0 → dateparser-1.2.2}/PKG-INFO +67 -16
  5. {dateparser-1.2.0 → dateparser-1.2.2}/README.rst +6 -6
  6. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/__init__.py +1 -1
  7. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/__init__.py +5 -0
  8. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/hijri_parser.py +10 -6
  9. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/jalali_parser.py +6 -0
  10. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/conf.py +1 -1
  11. dateparser-1.2.2/dateparser/data/__init__.py +2 -0
  12. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/en.py +1 -1
  13. dateparser-1.2.2/dateparser/data/dateparser_tz_cache.pkl +0 -0
  14. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/date.py +0 -1
  15. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/freshness_date_parser.py +2 -5
  16. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/dictionary.py +27 -19
  17. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/parser.py +28 -22
  18. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/__init__.py +2 -0
  19. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/search.py +7 -0
  20. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/timezone_parser.py +49 -7
  21. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/PKG-INFO +67 -16
  22. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/SOURCES.txt +2 -2
  23. dateparser-1.2.2/dateparser.egg-info/requires.txt +15 -0
  24. {dateparser-1.2.0 → dateparser-1.2.2}/docs/custom_language_detection.rst +13 -13
  25. {dateparser-1.2.0 → dateparser-1.2.2}/docs/introduction.rst +3 -3
  26. {dateparser-1.2.0 → dateparser-1.2.2}/docs/settings.rst +2 -2
  27. dateparser-1.2.2/pyproject.toml +20 -0
  28. dateparser-1.2.2/setup.cfg +4 -0
  29. {dateparser-1.2.0 → dateparser-1.2.2}/setup.py +10 -13
  30. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_clean_api.py +81 -0
  31. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date.py +1 -1
  32. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date_parser.py +102 -7
  33. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_dateparser_data_integrity.py +4 -0
  34. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_hijri.py +6 -2
  35. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_jalali.py +12 -0
  36. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_language_detect.py +4 -0
  37. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_languages.py +12 -10
  38. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_search.py +30 -5
  39. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_timezone_parser.py +10 -6
  40. dateparser-1.2.0/dateparser/data/__init__.py +0 -3
  41. dateparser-1.2.0/dateparser.egg-info/requires.txt +0 -14
  42. dateparser-1.2.0/setup.cfg +0 -21
  43. dateparser-1.2.0/tests/requirements.txt +0 -4
  44. {dateparser-1.2.0 → dateparser-1.2.2}/AUTHORS.rst +0 -0
  45. {dateparser-1.2.0 → dateparser-1.2.2}/LICENSE +0 -0
  46. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/hijri.py +0 -0
  47. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/calendars/jalali.py +0 -0
  48. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/__init__.py +0 -0
  49. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/fasttext.py +0 -0
  50. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/langdetect.py +0 -0
  51. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/custom_language_detection/language_mapping.py +0 -0
  52. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/__init__.py +0 -0
  53. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/af.py +0 -0
  54. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/agq.py +0 -0
  55. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ak.py +0 -0
  56. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/am.py +0 -0
  57. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ar.py +0 -0
  58. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/as.py +0 -0
  59. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/asa.py +0 -0
  60. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ast.py +0 -0
  61. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az-Cyrl.py +0 -0
  62. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az-Latn.py +0 -0
  63. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/az.py +0 -0
  64. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bas.py +0 -0
  65. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/be.py +0 -0
  66. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bem.py +0 -0
  67. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bez.py +0 -0
  68. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bg.py +0 -0
  69. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bm.py +0 -0
  70. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bn.py +0 -0
  71. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bo.py +0 -0
  72. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/br.py +0 -0
  73. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/brx.py +0 -0
  74. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs-Cyrl.py +0 -0
  75. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs-Latn.py +0 -0
  76. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/bs.py +0 -0
  77. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ca.py +0 -0
  78. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ce.py +0 -0
  79. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cgg.py +0 -0
  80. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/chr.py +0 -0
  81. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ckb.py +0 -0
  82. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cs.py +0 -0
  83. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/cy.py +0 -0
  84. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/da.py +0 -0
  85. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dav.py +0 -0
  86. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/de.py +0 -0
  87. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dje.py +0 -0
  88. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dsb.py +0 -0
  89. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dua.py +0 -0
  90. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dyo.py +0 -0
  91. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/dz.py +0 -0
  92. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ebu.py +0 -0
  93. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ee.py +0 -0
  94. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/el.py +0 -0
  95. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/eo.py +0 -0
  96. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/es.py +0 -0
  97. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/et.py +0 -0
  98. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/eu.py +0 -0
  99. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ewo.py +0 -0
  100. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fa.py +0 -0
  101. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ff.py +0 -0
  102. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fi.py +0 -0
  103. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fil.py +0 -0
  104. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fo.py +0 -0
  105. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fr.py +0 -0
  106. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fur.py +0 -0
  107. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/fy.py +0 -0
  108. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ga.py +0 -0
  109. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gd.py +0 -0
  110. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gl.py +0 -0
  111. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gsw.py +0 -0
  112. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gu.py +0 -0
  113. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/guz.py +0 -0
  114. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/gv.py +0 -0
  115. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ha.py +0 -0
  116. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/haw.py +0 -0
  117. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/he.py +0 -0
  118. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hi.py +0 -0
  119. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hr.py +0 -0
  120. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hsb.py +0 -0
  121. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hu.py +0 -0
  122. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/hy.py +0 -0
  123. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/id.py +0 -0
  124. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ig.py +0 -0
  125. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ii.py +0 -0
  126. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/is.py +0 -0
  127. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/it.py +0 -0
  128. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ja.py +0 -0
  129. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/jgo.py +0 -0
  130. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/jmc.py +0 -0
  131. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ka.py +0 -0
  132. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kab.py +0 -0
  133. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kam.py +0 -0
  134. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kde.py +0 -0
  135. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kea.py +0 -0
  136. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/khq.py +0 -0
  137. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ki.py +0 -0
  138. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kk.py +0 -0
  139. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kl.py +0 -0
  140. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kln.py +0 -0
  141. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/km.py +0 -0
  142. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kn.py +0 -0
  143. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ko.py +0 -0
  144. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kok.py +0 -0
  145. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ks.py +0 -0
  146. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksb.py +0 -0
  147. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksf.py +0 -0
  148. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ksh.py +0 -0
  149. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/kw.py +0 -0
  150. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ky.py +0 -0
  151. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lag.py +0 -0
  152. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lb.py +0 -0
  153. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lg.py +0 -0
  154. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lkt.py +0 -0
  155. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ln.py +0 -0
  156. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lo.py +0 -0
  157. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lrc.py +0 -0
  158. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lt.py +0 -0
  159. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lu.py +0 -0
  160. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/luo.py +0 -0
  161. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/luy.py +0 -0
  162. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/lv.py +0 -0
  163. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mas.py +0 -0
  164. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mer.py +0 -0
  165. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mfe.py +0 -0
  166. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mg.py +0 -0
  167. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mgh.py +0 -0
  168. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mgo.py +0 -0
  169. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mk.py +0 -0
  170. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ml.py +0 -0
  171. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mn.py +0 -0
  172. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mr.py +0 -0
  173. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ms.py +0 -0
  174. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mt.py +0 -0
  175. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mua.py +0 -0
  176. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/my.py +0 -0
  177. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/mzn.py +0 -0
  178. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/naq.py +0 -0
  179. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nb.py +0 -0
  180. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nd.py +0 -0
  181. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ne.py +0 -0
  182. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nl.py +0 -0
  183. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nmg.py +0 -0
  184. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nn.py +0 -0
  185. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nnh.py +0 -0
  186. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nus.py +0 -0
  187. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/nyn.py +0 -0
  188. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/om.py +0 -0
  189. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/or.py +0 -0
  190. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/os.py +0 -0
  191. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa-Arab.py +0 -0
  192. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa-Guru.py +0 -0
  193. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pa.py +0 -0
  194. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pl.py +0 -0
  195. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ps.py +0 -0
  196. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/pt.py +0 -0
  197. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/qu.py +0 -0
  198. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rm.py +0 -0
  199. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rn.py +0 -0
  200. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ro.py +0 -0
  201. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rof.py +0 -0
  202. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ru.py +0 -0
  203. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rw.py +0 -0
  204. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/rwk.py +0 -0
  205. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sah.py +0 -0
  206. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/saq.py +0 -0
  207. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sbp.py +0 -0
  208. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/se.py +0 -0
  209. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/seh.py +0 -0
  210. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ses.py +0 -0
  211. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sg.py +0 -0
  212. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi-Latn.py +0 -0
  213. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi-Tfng.py +0 -0
  214. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/shi.py +0 -0
  215. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/si.py +0 -0
  216. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sk.py +0 -0
  217. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sl.py +0 -0
  218. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/smn.py +0 -0
  219. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sn.py +0 -0
  220. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/so.py +0 -0
  221. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sq.py +0 -0
  222. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr-Cyrl.py +0 -0
  223. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr-Latn.py +0 -0
  224. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sr.py +0 -0
  225. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sv.py +0 -0
  226. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/sw.py +0 -0
  227. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ta.py +0 -0
  228. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/te.py +0 -0
  229. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/teo.py +0 -0
  230. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/th.py +0 -0
  231. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ti.py +0 -0
  232. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tl.py +0 -0
  233. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/to.py +0 -0
  234. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tr.py +0 -0
  235. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/twq.py +0 -0
  236. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/tzm.py +0 -0
  237. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ug.py +0 -0
  238. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uk.py +0 -0
  239. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/ur.py +0 -0
  240. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Arab.py +0 -0
  241. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Cyrl.py +0 -0
  242. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz-Latn.py +0 -0
  243. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/uz.py +0 -0
  244. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/vi.py +0 -0
  245. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/vun.py +0 -0
  246. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/wae.py +0 -0
  247. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/xog.py +0 -0
  248. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yav.py +0 -0
  249. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yi.py +0 -0
  250. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yo.py +0 -0
  251. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/yue.py +0 -0
  252. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zgh.py +0 -0
  253. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh-Hans.py +0 -0
  254. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh-Hant.py +0 -0
  255. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zh.py +0 -0
  256. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/date_translation_data/zu.py +0 -0
  257. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/data/languages_info.py +0 -0
  258. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/date_parser.py +0 -0
  259. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/__init__.py +0 -0
  260. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/loader.py +0 -0
  261. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/locale.py +0 -0
  262. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/languages/validation.py +0 -0
  263. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/detection.py +0 -0
  264. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/search/text_detection.py +0 -0
  265. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/timezones.py +0 -0
  266. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/utils/__init__.py +0 -0
  267. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser/utils/strptime.py +0 -0
  268. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/dependency_links.txt +0 -0
  269. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/entry_points.txt +0 -0
  270. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/not-zip-safe +0 -0
  271. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser.egg-info/top_level.txt +0 -0
  272. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/__init__.py +0 -0
  273. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/cli.py +0 -0
  274. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/exceptions.py +0 -0
  275. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/fasttext_manager.py +0 -0
  276. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_cli/utils.py +0 -0
  277. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_data/__init__.py +0 -0
  278. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_data/settings.py +0 -0
  279. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/__init__.py +0 -0
  280. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/get_cldr_data.py +0 -0
  281. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/order_languages.py +0 -0
  282. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/update_supported_languages_and_locales.py +0 -0
  283. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/utils.py +0 -0
  284. {dateparser-1.2.0 → dateparser-1.2.2}/dateparser_scripts/write_complete_data.py +0 -0
  285. {dateparser-1.2.0 → dateparser-1.2.2}/docs/Makefile +0 -0
  286. {dateparser-1.2.0 → dateparser-1.2.2}/docs/authors.rst +0 -0
  287. {dateparser-1.2.0 → dateparser-1.2.2}/docs/conf.py +2 -2
  288. {dateparser-1.2.0 → dateparser-1.2.2}/docs/contributing.rst +0 -0
  289. {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.calendars.rst +0 -0
  290. {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.languages.rst +0 -0
  291. {dateparser-1.2.0 → dateparser-1.2.2}/docs/dateparser.rst +0 -0
  292. {dateparser-1.2.0 → dateparser-1.2.2}/docs/history.rst +0 -0
  293. {dateparser-1.2.0 → dateparser-1.2.2}/docs/index.rst +0 -0
  294. {dateparser-1.2.0 → dateparser-1.2.2}/docs/installation.rst +0 -0
  295. {dateparser-1.2.0 → dateparser-1.2.2}/docs/make.bat +0 -0
  296. {dateparser-1.2.0 → dateparser-1.2.2}/docs/modules.rst +0 -0
  297. {dateparser-1.2.0 → dateparser-1.2.2}/docs/supported_locales.rst +0 -0
  298. {dateparser-1.2.0 → dateparser-1.2.2}/docs/template.rst +0 -0
  299. {dateparser-1.2.0 → dateparser-1.2.2}/docs/usage.rst +0 -0
  300. {dateparser-1.2.0 → dateparser-1.2.2}/tests/__init__.py +0 -0
  301. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_data.py +0 -0
  302. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_date_data.py +0 -0
  303. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_freshness_date_parser.py +0 -0
  304. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_loading.py +0 -0
  305. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_parser.py +0 -0
  306. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_pickle.py +0 -0
  307. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_settings.py +0 -0
  308. {dateparser-1.2.0 → dateparser-1.2.2}/tests/test_utils.py +0 -0
  309. {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
 
@@ -3,6 +3,7 @@ include CONTRIBUTING.rst
3
3
  include HISTORY.rst
4
4
  include LICENSE
5
5
  include README.rst
6
+ include dateparser/data/dateparser_tz_cache.pkl
6
7
  include dateparser_data/settings.py
7
8
  include requirements.txt
8
9
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: dateparser
3
- Version: 1.2.0
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.7
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!=2019.02.19,!=2021.8.27
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: hijri-converter; extra == "calendars"
31
- Requires-Dist: convertdate; extra == "calendars"
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
- * hijri-converter_ to convert *Hijri* dates to *Gregorian*.
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
- .. _hijri-converter: https://pypi.python.org/pypi/hijri-converter
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.6.
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/usage.html#settings>`__.
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 it's a valid date and it 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.
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.7. You can install it by doing:
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 with a really different number of purposes,
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 easiest /
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
 
@@ -1,4 +1,4 @@
1
- __version__ = "1.2.0"
1
+ __version__ = "1.2.2"
2
2
 
3
3
  from .conf import apply_settings
4
4
  from .date import DateDataParser
@@ -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 hijri_converter import convert
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 = convert.Hijri(
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 = convert.Gregorian(year, month, day).to_hijri()
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 = convert.Hijri(year=year, month=month, day=1)
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
@@ -176,3 +176,9 @@ class jalali_parser(non_gregorian_parser):
176
176
  ):
177
177
  result = result.replace(persian_number, str(number))
178
178
  return result
179
+
180
+ def handle_two_digit_year(self, year):
181
+ if year > 60:
182
+ return year + 1300
183
+ else:
184
+ 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 setting_type == setting_props["type"]:
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__
@@ -0,0 +1,2 @@
1
+ from dateparser.data import date_translation_data
2
+ from .languages_info import language_order, language_locale_dict
@@ -800,7 +800,7 @@ info = {
800
800
  "(?:12\\s+)?midnight": "00:00"
801
801
  },
802
802
  {
803
- "(\\d+[.,]?\\d*)h(\\d+[.,]?\\d*)m?": "\\1:\\2"
803
+ "(\\d+[.,]?\\d*)h(\\d+[.,]?\\d*)": "\\1:\\2"
804
804
  },
805
805
  {
806
806
  "(?<=from\\s+)now": "in"
@@ -1,5 +1,4 @@
1
1
  import collections
2
- import sys
3
2
  from collections.abc import Set
4
3
  from datetime import datetime, timedelta
5
4
 
@@ -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
- if hasattr(self.get_local_tz(), "localize"):
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
- match = regex.match(string)
190
- if not match:
191
- return (
192
- self._split_by_numerals(string, keep_formatting)
193
- if self._should_capture(string, keep_formatting)
194
- else []
195
- )
196
-
197
- unparsed, known, unknown = match.groups()
198
- splitted = [known] if self._should_capture(known, keep_formatting) else []
199
- if unparsed and self._should_capture(unparsed, keep_formatting):
200
- splitted = self._split_by_numerals(unparsed, keep_formatting) + splitted
201
- if unknown:
202
- splitted.extend(self._split_by_known_words(unknown, keep_formatting))
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 error_msgs[0] in error_text or error_msgs[1] in error_text:
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.tzinfo is None and dateobj.tzinfo is not None
519
- ), "`self.now` doesn't have `tzinfo`. Review comment in code for details."
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
- except pytz.UnknownTimeZoneError:
567
- tz = None
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.time() < dateobj_time:
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.time() > dateobj_time:
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
- if getattr(self, "_token_month", None) or relative_base_month:
605
+
606
+ if getattr(self, "_token_month", None):
605
607
  return dateobj
606
608
 
607
- dateobj = set_correct_month_from_settings(dateobj, self.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)
@@ -57,6 +57,8 @@ def search_dates(
57
57
  ('on May 6th 2004', datetime.datetime(2004, 5, 6, 0, 0))]
58
58
 
59
59
  """
60
+ text = _search_with_detection.preprocess_text(text, languages)
61
+
60
62
  result = _search_with_detection.search_dates(
61
63
  text=text,
62
64
  languages=languages,
@@ -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
- # alternate patterns
76
- for replace, replacewith in tz_info.get("replace", []):
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)