dateparser 1.2.1__tar.gz → 1.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. {dateparser-1.2.1 → dateparser-1.3.0}/CONTRIBUTING.rst +13 -0
  2. {dateparser-1.2.1 → dateparser-1.3.0}/HISTORY.rst +38 -0
  3. {dateparser-1.2.1 → dateparser-1.3.0}/MANIFEST.in +1 -0
  4. {dateparser-1.2.1 → dateparser-1.3.0}/PKG-INFO +56 -6
  5. {dateparser-1.2.1 → dateparser-1.3.0}/README.rst +2 -1
  6. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/__init__.py +1 -1
  7. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/conf.py +11 -0
  8. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/en.py +15 -6
  9. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fi.py +1 -0
  10. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ru.py +56 -23
  11. dateparser-1.3.0/dateparser/data/dateparser_tz_cache.pkl +0 -0
  12. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/date.py +2 -1
  13. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/freshness_date_parser.py +35 -9
  14. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/languages/dictionary.py +12 -1
  15. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/languages/locale.py +28 -1
  16. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/parser.py +6 -2
  17. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/search/__init__.py +2 -0
  18. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/search/search.py +25 -1
  19. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/timezone_parser.py +47 -4
  20. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/utils/strptime.py +28 -1
  21. dateparser-1.3.0/dateparser/utils/time_spans.py +152 -0
  22. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/PKG-INFO +56 -6
  23. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/SOURCES.txt +2 -0
  24. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/requires.txt +2 -2
  25. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_data/settings.py +4 -0
  26. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/write_complete_data.py +5 -3
  27. {dateparser-1.2.1 → dateparser-1.3.0}/docs/introduction.rst +11 -0
  28. {dateparser-1.2.1 → dateparser-1.3.0}/docs/settings.rst +21 -0
  29. {dateparser-1.2.1 → dateparser-1.3.0}/pyproject.toml +1 -1
  30. {dateparser-1.2.1 → dateparser-1.3.0}/setup.py +4 -4
  31. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_date.py +63 -6
  32. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_date_parser.py +132 -1
  33. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_freshness_date_parser.py +4 -7
  34. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_languages.py +1 -0
  35. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_parser.py +25 -0
  36. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_search.py +244 -1
  37. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_utils_strptime.py +65 -0
  38. {dateparser-1.2.1 → dateparser-1.3.0}/AUTHORS.rst +0 -0
  39. {dateparser-1.2.1 → dateparser-1.3.0}/LICENSE +0 -0
  40. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/calendars/__init__.py +0 -0
  41. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/calendars/hijri.py +0 -0
  42. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/calendars/hijri_parser.py +0 -0
  43. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/calendars/jalali.py +0 -0
  44. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/calendars/jalali_parser.py +0 -0
  45. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/custom_language_detection/__init__.py +0 -0
  46. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/custom_language_detection/fasttext.py +0 -0
  47. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/custom_language_detection/langdetect.py +0 -0
  48. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/custom_language_detection/language_mapping.py +0 -0
  49. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/__init__.py +0 -0
  50. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/__init__.py +0 -0
  51. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/af.py +0 -0
  52. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/agq.py +0 -0
  53. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ak.py +0 -0
  54. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/am.py +0 -0
  55. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ar.py +0 -0
  56. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/as.py +0 -0
  57. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/asa.py +0 -0
  58. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ast.py +0 -0
  59. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/az-Cyrl.py +0 -0
  60. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/az-Latn.py +0 -0
  61. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/az.py +0 -0
  62. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bas.py +0 -0
  63. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/be.py +0 -0
  64. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bem.py +0 -0
  65. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bez.py +0 -0
  66. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bg.py +0 -0
  67. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bm.py +0 -0
  68. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bn.py +0 -0
  69. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bo.py +0 -0
  70. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/br.py +0 -0
  71. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/brx.py +0 -0
  72. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs-Cyrl.py +0 -0
  73. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs-Latn.py +0 -0
  74. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs.py +0 -0
  75. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ca.py +0 -0
  76. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ce.py +0 -0
  77. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/cgg.py +0 -0
  78. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/chr.py +0 -0
  79. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ckb.py +0 -0
  80. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/cs.py +0 -0
  81. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/cy.py +0 -0
  82. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/da.py +0 -0
  83. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dav.py +0 -0
  84. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/de.py +0 -0
  85. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dje.py +0 -0
  86. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dsb.py +0 -0
  87. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dua.py +0 -0
  88. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dyo.py +0 -0
  89. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/dz.py +0 -0
  90. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ebu.py +0 -0
  91. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ee.py +0 -0
  92. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/el.py +0 -0
  93. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/eo.py +0 -0
  94. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/es.py +0 -0
  95. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/et.py +0 -0
  96. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/eu.py +0 -0
  97. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ewo.py +0 -0
  98. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fa.py +0 -0
  99. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ff.py +0 -0
  100. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fil.py +0 -0
  101. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fo.py +0 -0
  102. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fr.py +0 -0
  103. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fur.py +0 -0
  104. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/fy.py +0 -0
  105. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ga.py +0 -0
  106. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/gd.py +0 -0
  107. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/gl.py +0 -0
  108. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/gsw.py +0 -0
  109. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/gu.py +0 -0
  110. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/guz.py +0 -0
  111. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/gv.py +0 -0
  112. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ha.py +0 -0
  113. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/haw.py +0 -0
  114. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/he.py +0 -0
  115. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/hi.py +0 -0
  116. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/hr.py +0 -0
  117. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/hsb.py +0 -0
  118. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/hu.py +0 -0
  119. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/hy.py +0 -0
  120. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/id.py +0 -0
  121. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ig.py +0 -0
  122. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ii.py +0 -0
  123. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/is.py +0 -0
  124. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/it.py +0 -0
  125. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ja.py +0 -0
  126. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/jgo.py +0 -0
  127. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/jmc.py +0 -0
  128. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ka.py +0 -0
  129. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kab.py +0 -0
  130. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kam.py +0 -0
  131. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kde.py +0 -0
  132. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kea.py +0 -0
  133. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/khq.py +0 -0
  134. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ki.py +0 -0
  135. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kk.py +0 -0
  136. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kl.py +0 -0
  137. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kln.py +0 -0
  138. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/km.py +0 -0
  139. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kn.py +0 -0
  140. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ko.py +0 -0
  141. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kok.py +0 -0
  142. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ks.py +0 -0
  143. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksb.py +0 -0
  144. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksf.py +0 -0
  145. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksh.py +0 -0
  146. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/kw.py +0 -0
  147. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ky.py +0 -0
  148. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lag.py +0 -0
  149. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lb.py +0 -0
  150. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lg.py +0 -0
  151. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lkt.py +0 -0
  152. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ln.py +0 -0
  153. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lo.py +0 -0
  154. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lrc.py +0 -0
  155. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lt.py +0 -0
  156. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lu.py +0 -0
  157. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/luo.py +0 -0
  158. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/luy.py +0 -0
  159. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/lv.py +0 -0
  160. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mas.py +0 -0
  161. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mer.py +0 -0
  162. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mfe.py +0 -0
  163. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mg.py +0 -0
  164. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mgh.py +0 -0
  165. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mgo.py +0 -0
  166. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mk.py +0 -0
  167. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ml.py +0 -0
  168. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mn.py +0 -0
  169. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mr.py +0 -0
  170. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ms.py +0 -0
  171. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mt.py +0 -0
  172. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mua.py +0 -0
  173. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/my.py +0 -0
  174. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/mzn.py +0 -0
  175. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/naq.py +0 -0
  176. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nb.py +0 -0
  177. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nd.py +0 -0
  178. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ne.py +0 -0
  179. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nl.py +0 -0
  180. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nmg.py +0 -0
  181. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nn.py +0 -0
  182. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nnh.py +0 -0
  183. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nus.py +0 -0
  184. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/nyn.py +0 -0
  185. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/om.py +0 -0
  186. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/or.py +0 -0
  187. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/os.py +0 -0
  188. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa-Arab.py +0 -0
  189. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa-Guru.py +0 -0
  190. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa.py +0 -0
  191. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/pl.py +0 -0
  192. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ps.py +0 -0
  193. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/pt.py +0 -0
  194. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/qu.py +0 -0
  195. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/rm.py +0 -0
  196. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/rn.py +0 -0
  197. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ro.py +0 -0
  198. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/rof.py +0 -0
  199. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/rw.py +0 -0
  200. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/rwk.py +0 -0
  201. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sah.py +0 -0
  202. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/saq.py +0 -0
  203. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sbp.py +0 -0
  204. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/se.py +0 -0
  205. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/seh.py +0 -0
  206. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ses.py +0 -0
  207. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sg.py +0 -0
  208. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi-Latn.py +0 -0
  209. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi-Tfng.py +0 -0
  210. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi.py +0 -0
  211. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/si.py +0 -0
  212. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sk.py +0 -0
  213. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sl.py +0 -0
  214. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/smn.py +0 -0
  215. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sn.py +0 -0
  216. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/so.py +0 -0
  217. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sq.py +0 -0
  218. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr-Cyrl.py +0 -0
  219. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr-Latn.py +0 -0
  220. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr.py +0 -0
  221. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sv.py +0 -0
  222. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/sw.py +0 -0
  223. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ta.py +0 -0
  224. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/te.py +0 -0
  225. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/teo.py +0 -0
  226. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/th.py +0 -0
  227. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ti.py +0 -0
  228. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/tl.py +0 -0
  229. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/to.py +0 -0
  230. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/tr.py +0 -0
  231. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/twq.py +0 -0
  232. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/tzm.py +0 -0
  233. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ug.py +0 -0
  234. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/uk.py +0 -0
  235. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/ur.py +0 -0
  236. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Arab.py +0 -0
  237. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Cyrl.py +0 -0
  238. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Latn.py +0 -0
  239. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz.py +0 -0
  240. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/vi.py +0 -0
  241. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/vun.py +0 -0
  242. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/wae.py +0 -0
  243. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/xog.py +0 -0
  244. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/yav.py +0 -0
  245. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/yi.py +0 -0
  246. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/yo.py +0 -0
  247. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/yue.py +0 -0
  248. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/zgh.py +0 -0
  249. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh-Hans.py +0 -0
  250. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh-Hant.py +0 -0
  251. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh.py +0 -0
  252. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/date_translation_data/zu.py +0 -0
  253. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/data/languages_info.py +0 -0
  254. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/date_parser.py +0 -0
  255. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/languages/__init__.py +0 -0
  256. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/languages/loader.py +0 -0
  257. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/languages/validation.py +0 -0
  258. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/search/detection.py +0 -0
  259. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/search/text_detection.py +0 -0
  260. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/timezones.py +0 -0
  261. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser/utils/__init__.py +0 -0
  262. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/dependency_links.txt +0 -0
  263. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/entry_points.txt +0 -0
  264. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/not-zip-safe +0 -0
  265. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser.egg-info/top_level.txt +0 -0
  266. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_cli/__init__.py +0 -0
  267. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_cli/cli.py +0 -0
  268. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_cli/exceptions.py +0 -0
  269. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_cli/fasttext_manager.py +0 -0
  270. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_cli/utils.py +0 -0
  271. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_data/__init__.py +0 -0
  272. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/__init__.py +0 -0
  273. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/get_cldr_data.py +0 -0
  274. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/order_languages.py +0 -0
  275. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/update_supported_languages_and_locales.py +0 -0
  276. {dateparser-1.2.1 → dateparser-1.3.0}/dateparser_scripts/utils.py +0 -0
  277. {dateparser-1.2.1 → dateparser-1.3.0}/docs/Makefile +0 -0
  278. {dateparser-1.2.1 → dateparser-1.3.0}/docs/authors.rst +0 -0
  279. {dateparser-1.2.1 → dateparser-1.3.0}/docs/conf.py +0 -0
  280. {dateparser-1.2.1 → dateparser-1.3.0}/docs/contributing.rst +0 -0
  281. {dateparser-1.2.1 → dateparser-1.3.0}/docs/custom_language_detection.rst +0 -0
  282. {dateparser-1.2.1 → dateparser-1.3.0}/docs/dateparser.calendars.rst +0 -0
  283. {dateparser-1.2.1 → dateparser-1.3.0}/docs/dateparser.languages.rst +0 -0
  284. {dateparser-1.2.1 → dateparser-1.3.0}/docs/dateparser.rst +0 -0
  285. {dateparser-1.2.1 → dateparser-1.3.0}/docs/history.rst +0 -0
  286. {dateparser-1.2.1 → dateparser-1.3.0}/docs/index.rst +0 -0
  287. {dateparser-1.2.1 → dateparser-1.3.0}/docs/installation.rst +0 -0
  288. {dateparser-1.2.1 → dateparser-1.3.0}/docs/make.bat +0 -0
  289. {dateparser-1.2.1 → dateparser-1.3.0}/docs/modules.rst +0 -0
  290. {dateparser-1.2.1 → dateparser-1.3.0}/docs/supported_locales.rst +0 -0
  291. {dateparser-1.2.1 → dateparser-1.3.0}/docs/template.rst +0 -0
  292. {dateparser-1.2.1 → dateparser-1.3.0}/docs/usage.rst +0 -0
  293. {dateparser-1.2.1 → dateparser-1.3.0}/setup.cfg +0 -0
  294. {dateparser-1.2.1 → dateparser-1.3.0}/tests/__init__.py +0 -0
  295. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_clean_api.py +0 -0
  296. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_data.py +0 -0
  297. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_date_data.py +0 -0
  298. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_dateparser_data_integrity.py +0 -0
  299. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_hijri.py +0 -0
  300. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_jalali.py +0 -0
  301. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_language_detect.py +0 -0
  302. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_loading.py +0 -0
  303. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_pickle.py +0 -0
  304. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_settings.py +0 -0
  305. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_timezone_parser.py +0 -0
  306. {dateparser-1.2.1 → dateparser-1.3.0}/tests/test_utils.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,44 @@
3
3
  History
4
4
  =======
5
5
 
6
+ 1.3.0 (2026-02-04)
7
+ ------------------
8
+
9
+ Dropped Python 3.9 support. (#1296)
10
+
11
+ New features:
12
+
13
+ - ``search_dates()`` can now detect time spans from expressions like “past
14
+ month”, “last week”, etc. For details, see the “Time Span Detection” section
15
+ and the ``RETURN_TIME_SPAN``, ``DEFAULT_START_OF_WEEK`` and
16
+ ``DEFAULT_DAYS_IN_MONTH`` settings in the documentation. (#1284)
17
+
18
+ Fixes:
19
+
20
+ - Assume the current year if not specified (#1288)
21
+ - Support expressions like “yesterday +1h” (#1303)
22
+ - English: Support most 2-letter day-of-the-week names (#1214)
23
+ - English: Support “in N weeks' time” (#1283)
24
+ - Finnish: Support dates with “klo” (#1301)
25
+ - Russian: Support compound ordinals (#1280)
26
+
27
+ Cleanups and internal improvements:
28
+
29
+ - Fixed year expectation issues in tests. (#1294)
30
+
31
+ 1.2.2 (2025-06-26)
32
+ ------------------
33
+
34
+ Fixes:
35
+
36
+ - Handle the Russian preposition “с” (#1261)
37
+ - Fix weekday search (#1274)
38
+
39
+ Improvements:
40
+
41
+ - Add Python 3.14 support (#1273)
42
+ - Cache timezone offsets to improve import time (#1250)
43
+
6
44
  1.2.1 (2025-02-05)
7
45
  ------------------
8
46
 
@@ -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.2
1
+ Metadata-Version: 2.4
2
2
  Name: dateparser
3
- Version: 1.2.1
3
+ Version: 1.3.0
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,25 +13,25 @@ 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.9
17
16
  Classifier: Programming Language :: Python :: 3.10
18
17
  Classifier: Programming Language :: Python :: 3.11
19
18
  Classifier: Programming Language :: Python :: 3.12
20
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
21
  Classifier: Programming Language :: Python :: Implementation :: CPython
22
- Requires-Python: >=3.8
22
+ Requires-Python: >=3.10
23
23
  License-File: LICENSE
24
24
  License-File: AUTHORS.rst
25
25
  Requires-Dist: python-dateutil>=2.7.0
26
26
  Requires-Dist: pytz>=2024.2
27
- Requires-Dist: regex!=2019.02.19,!=2021.8.27,>=2015.06.24
27
+ Requires-Dist: regex>=2024.9.11
28
28
  Requires-Dist: tzlocal>=0.2
29
29
  Provides-Extra: calendars
30
30
  Requires-Dist: convertdate>=2.2.1; extra == "calendars"
31
31
  Requires-Dist: hijridate; extra == "calendars"
32
32
  Provides-Extra: fasttext
33
33
  Requires-Dist: fasttext>=0.9.1; extra == "fasttext"
34
- Requires-Dist: numpy<2,>=1.19.3; extra == "fasttext"
34
+ Requires-Dist: numpy<2,>=1.22.0; extra == "fasttext"
35
35
  Provides-Extra: langdetect
36
36
  Requires-Dist: langdetect>=1.0.0; extra == "langdetect"
37
37
  Dynamic: author
@@ -41,6 +41,7 @@ Dynamic: description
41
41
  Dynamic: home-page
42
42
  Dynamic: keywords
43
43
  Dynamic: license
44
+ Dynamic: license-file
44
45
  Dynamic: project-url
45
46
  Dynamic: provides-extra
46
47
  Dynamic: requires-dist
@@ -260,6 +261,17 @@ You can extract dates from longer strings of text. They are returned as list of
260
261
 
261
262
  :noindex:
262
263
 
264
+ Time Span Detection
265
+ -------------------
266
+
267
+ The `search_dates` function can detect time spans from expressions like "past month", "last week", etc. When `RETURN_TIME_SPAN` is enabled, it returns start and end dates for the detected period.
268
+
269
+ .. code-block:: python
270
+
271
+ >>> search_dates("Messages from the past month", settings={'RETURN_TIME_SPAN': True})
272
+ [('past month (start)', datetime.datetime(2024, 11, 7, 0, 0)),
273
+ ('past month (end)', datetime.datetime(2024, 12, 7, 23, 59, 59, 999999))]
274
+
263
275
  Advanced Usage
264
276
  ==============
265
277
  If you need more control over what is being parser check the `settings` section as well as the `using-datedataparser` section.
@@ -318,6 +330,44 @@ To be able to use them you need to install the `calendar` extra by typing:
318
330
  History
319
331
  =======
320
332
 
333
+ 1.3.0 (2026-02-04)
334
+ ------------------
335
+
336
+ Dropped Python 3.9 support. (#1296)
337
+
338
+ New features:
339
+
340
+ - ``search_dates()`` can now detect time spans from expressions like “past
341
+ month”, “last week”, etc. For details, see the “Time Span Detection” section
342
+ and the ``RETURN_TIME_SPAN``, ``DEFAULT_START_OF_WEEK`` and
343
+ ``DEFAULT_DAYS_IN_MONTH`` settings in the documentation. (#1284)
344
+
345
+ Fixes:
346
+
347
+ - Assume the current year if not specified (#1288)
348
+ - Support expressions like “yesterday +1h” (#1303)
349
+ - English: Support most 2-letter day-of-the-week names (#1214)
350
+ - English: Support “in N weeks' time” (#1283)
351
+ - Finnish: Support dates with “klo” (#1301)
352
+ - Russian: Support compound ordinals (#1280)
353
+
354
+ Cleanups and internal improvements:
355
+
356
+ - Fixed year expectation issues in tests. (#1294)
357
+
358
+ 1.2.2 (2025-06-26)
359
+ ------------------
360
+
361
+ Fixes:
362
+
363
+ - Handle the Russian preposition “с” (#1261)
364
+ - Fix weekday search (#1274)
365
+
366
+ Improvements:
367
+
368
+ - Add Python 3.14 support (#1273)
369
+ - Cache timezone offsets to improve import time (#1250)
370
+
321
371
  1.2.1 (2025-02-05)
322
372
  ------------------
323
373
 
@@ -58,6 +58,7 @@ Key Features
58
58
  - `Search
59
59
  dates <https://dateparser.readthedocs.io/en/latest/introduction.html#search-for-dates-in-longer-chunks-of-text>`__
60
60
  in longer texts.
61
+ - Time span detection for expressions like "past month", "last week".
61
62
 
62
63
  Online demo
63
64
  -----------
@@ -156,7 +157,7 @@ are executed, you can do so through the
156
157
  Installation
157
158
  ------------
158
159
 
159
- Dateparser supports Python >= 3.9. You can install it by doing:
160
+ Dateparser supports Python 3.10+. You can install it by doing:
160
161
 
161
162
  ::
162
163
 
@@ -1,4 +1,4 @@
1
- __version__ = "1.2.1"
1
+ __version__ = "1.3.0"
2
2
 
3
3
  from .conf import apply_settings
4
4
  from .date import DateDataParser
@@ -27,6 +27,9 @@ class Settings:
27
27
  * `SKIP_TOKENS`
28
28
  * `NORMALIZE`
29
29
  * `RETURN_TIME_AS_PERIOD`
30
+ * `RETURN_TIME_SPAN`
31
+ * `DEFAULT_START_OF_WEEK`
32
+ * `DEFAULT_DAYS_IN_MONTH`
30
33
  * `PARSERS`
31
34
  * `DEFAULT_LANGUAGES`
32
35
  * `LANGUAGE_DETECTION_CONFIDENCE_THRESHOLD`
@@ -229,6 +232,14 @@ def check_settings(settings):
229
232
  "CACHE_SIZE_LIMIT": {
230
233
  "type": int,
231
234
  },
235
+ "RETURN_TIME_SPAN": {"type": bool},
236
+ "DEFAULT_START_OF_WEEK": {
237
+ "values": ("monday", "sunday"),
238
+ "type": str,
239
+ },
240
+ "DEFAULT_DAYS_IN_MONTH": {
241
+ "type": int,
242
+ },
232
243
  }
233
244
 
234
245
  modified_settings = settings._mod_settings # check only modified settings
@@ -51,32 +51,39 @@ info = {
51
51
  ],
52
52
  "monday": [
53
53
  "mon",
54
- "monday"
54
+ "monday",
55
+ "mo"
55
56
  ],
56
57
  "tuesday": [
57
58
  "tue",
58
59
  "tuesday",
60
+ "tu",
59
61
  "Tues"
60
62
  ],
61
63
  "wednesday": [
62
64
  "wed",
63
- "wednesday"
65
+ "wednesday",
66
+ "we"
64
67
  ],
65
68
  "thursday": [
66
69
  "thu",
67
- "thursday"
70
+ "thursday",
71
+ "th"
68
72
  ],
69
73
  "friday": [
70
74
  "fri",
71
- "friday"
75
+ "friday",
76
+ "fr"
72
77
  ],
73
78
  "saturday": [
74
79
  "sat",
75
- "saturday"
80
+ "saturday",
81
+ "sa"
76
82
  ],
77
83
  "sunday": [
78
84
  "sun",
79
- "sunday"
85
+ "sunday",
86
+ "su"
80
87
  ],
81
88
  "am": [
82
89
  "am"
@@ -258,6 +265,8 @@ info = {
258
265
  "in \\1 week": [
259
266
  "in (\\d+[.,]?\\d*) week",
260
267
  "in (\\d+[.,]?\\d*) weeks",
268
+ "in (\\d+[.,]?\\d*) weeks time",
269
+ "in (\\d+[.,]?\\d*) weeks' time",
261
270
  "in (\\d+[.,]?\\d*) wk"
262
271
  ],
263
272
  "in \\1 year": [
@@ -316,6 +316,7 @@ info = {
316
316
  "locale_specific": {},
317
317
  "skip": [
318
318
  ":n",
319
+ "klo",
319
320
  " ",
320
321
  "'",
321
322
  ",",
@@ -340,73 +340,91 @@ info = {
340
340
  ],
341
341
  "simplifications": [
342
342
  {
343
- "од(на|ну|ни|ной|ин)": "1"
343
+ "од(ин|на|ну|ни|ной|ною|но|ного|ному|ним|нем)": "1"
344
344
  },
345
345
  {
346
- "дв(а|е|ое|ух)": "2"
346
+ "перв(ой|ого|ому|ым|ом|ая|ую|ое|ые|ых|ыми)": "1"
347
347
  },
348
348
  {
349
- "пар[ауы]": "2"
349
+ "дв(а|е|ух|ум|умя|ое)": "2"
350
350
  },
351
351
  {
352
- "три": "3"
352
+ "пар(а|ы|е|у|ой|ою|ам|ами|ах)": "2"
353
353
  },
354
354
  {
355
- "четыре": "4"
355
+ "втор(ой|ого|ому|ым|ом|ая|ую|ое|ые|ых|ыми)": "2"
356
356
  },
357
357
  {
358
- "пять": "5"
358
+ "тр(и|ёх|ем|ём|емя|етье)": "3"
359
359
  },
360
360
  {
361
- "шесть": "6"
361
+ "трети(й|его|ему|им|ем|я|ей|ею|ую|е|и|их|ими)": "3"
362
362
  },
363
363
  {
364
- "семь": "7"
364
+ "четыр(е|ёх|ем|ём|ьмя)": "4"
365
365
  },
366
366
  {
367
- "восемь": "8"
367
+ "четвёрт(ый|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "4"
368
368
  },
369
369
  {
370
- "девять": "9"
370
+ "четверт(ый|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "4"
371
371
  },
372
372
  {
373
- "десять": "10"
373
+ "пят(ь|и|ью)": "5"
374
374
  },
375
375
  {
376
- "одиннадцать": "11"
376
+ "пят(ый|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "5"
377
377
  },
378
378
  {
379
- "двенадцать": "12"
379
+ "шест(ь|и|ью)": "6"
380
380
  },
381
381
  {
382
- "пятнадцать": "15"
382
+ "шест(ый|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "6"
383
383
  },
384
384
  {
385
- "двадцать": "20"
385
+ "сем(ь|и|ью)": "7"
386
386
  },
387
387
  {
388
- "тридцать": "30"
388
+ "седьм(ой|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "7"
389
389
  },
390
390
  {
391
- "сорок": "40"
391
+ "восьм(и|ью|ьею)|восем(ь|ью)": "8"
392
392
  },
393
393
  {
394
- "пятьдесят": "50"
394
+ "восьм(ой|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "8"
395
395
  },
396
396
  {
397
- "несколько секунд": "44 секунды"
397
+ "девят(ь|и|ью)": "9"
398
398
  },
399
399
  {
400
- "полчаса": "30 минут"
400
+ "девят(ый|ого|ому|ым|ом|ая|ой|ою|ую|ое|ые|ых|ыми)": "9"
401
401
  },
402
402
  {
403
- "полгода": "6 месяцев"
403
+ "десять": "10"
404
404
  },
405
405
  {
406
- "полтора часа": "90 минут"
406
+ "одиннадцать": "11"
407
407
  },
408
408
  {
409
- "полтора года": "18 месяцев"
409
+ "двенадцать": "12"
410
+ },
411
+ {
412
+ "пятнадцать": "15"
413
+ },
414
+ {
415
+ "двадцат(ь|ое)": "20"
416
+ },
417
+ {
418
+ "тридцат(ь|ое)": "30"
419
+ },
420
+ {
421
+ "соро(к|ка|ковое)": "40"
422
+ },
423
+ {
424
+ "пятьдесят": "50"
425
+ },
426
+ {
427
+ "пятидесятое": "50"
410
428
  },
411
429
  {
412
430
  "((?<=(через|спустя|в течение)\\s+)секунд[уы]|(?<=[^\\d]\\s+|^)секунду(?=(\\s+назад)))": "1 секунду"
@@ -426,12 +444,27 @@ info = {
426
444
  {
427
445
  "((?<=(через|спустя|в течение)\\s+)недел[юи]|(?<=[^\\d]\\s+|^)неделю(?=(\\s+назад)))": "1 неделю"
428
446
  },
447
+ {
448
+ "полгода": "6 месяцев"
449
+ },
429
450
  {
430
451
  "((?<=(через|спустя|в течение)\\s+)месяца?|(?<=[^\\d]\\s+|^)месяц(?=(\\s+назад)))": "1 месяц"
431
452
  },
432
453
  {
433
454
  "((?<=(через|спустя|в течение)\\s+)года?|(?<=[^\\d]\\s+|^)год(?=(\\s+назад)))": "1 год"
434
455
  },
456
+ {
457
+ "полтора года": "18 месяцев"
458
+ },
459
+ {
460
+ "полчаса": "30 минут"
461
+ },
462
+ {
463
+ "несколько секунд": "44 секунды"
464
+ },
465
+ {
466
+ "полтора часа": "90 минут"
467
+ },
435
468
  {
436
469
  "(\\d{3,}1)\\s*год\\s*$": "\\1"
437
470
  },
@@ -19,6 +19,7 @@ from dateparser.utils import (
19
19
  set_correct_day_from_settings,
20
20
  set_correct_month_from_settings,
21
21
  )
22
+ from dateparser.utils.strptime import strptime as patched_strptime
22
23
 
23
24
  APOSTROPHE_LOOK_ALIKE_CHARS = [
24
25
  "\N{RIGHT SINGLE QUOTATION MARK}", # '\u2019'
@@ -182,7 +183,7 @@ def parse_with_formats(date_string, date_formats, settings):
182
183
  period = "day"
183
184
  for date_format in date_formats:
184
185
  try:
185
- date_obj = datetime.strptime(date_string, date_format)
186
+ date_obj = patched_strptime(date_string, date_format)
186
187
  except ValueError:
187
188
  continue
188
189
  else:
@@ -10,7 +10,7 @@ from .parser import time_parser
10
10
  from .timezone_parser import pop_tz_offset_from_string
11
11
 
12
12
  _UNITS = r"decade|year|month|week|day|hour|minute|second"
13
- PATTERN = re.compile(r"(\d+[.,]?\d*)\s*(%s)\b" % _UNITS, re.I | re.S | re.U)
13
+ PATTERN = re.compile(r"([+-]?\d+[.,]?\d*)\s*(%s)\b" % _UNITS, re.I | re.S | re.U)
14
14
 
15
15
 
16
16
  class FreshnessDateDataParser:
@@ -112,7 +112,13 @@ class FreshnessDateDataParser:
112
112
  if not self._are_all_words_units(date_string):
113
113
  return None, None
114
114
 
115
- kwargs = self.get_kwargs(date_string)
115
+ result = self.get_kwargs(date_string)
116
+ if isinstance(result, tuple):
117
+ kwargs, explicit_signs = result
118
+ else:
119
+ kwargs = result
120
+ explicit_signs = {}
121
+
116
122
  if not kwargs:
117
123
  return None, None
118
124
  period = "day"
@@ -121,16 +127,27 @@ class FreshnessDateDataParser:
121
127
  if k in kwargs:
122
128
  period = k[:-1]
123
129
  break
124
- td = relativedelta(**kwargs)
125
130
 
126
- if (
131
+ going_forward = (
127
132
  re.search(r"\bin\b", date_string)
128
133
  or re.search(r"\bfuture\b", prefer_dates_from)
129
134
  and not re.search(r"\bago\b", date_string)
130
- ):
131
- date = now + td
132
- else:
133
- date = now - td
135
+ )
136
+
137
+ adjusted_kwargs = {}
138
+ for key, value in kwargs.items():
139
+ if explicit_signs.get(key, False):
140
+ adjusted_kwargs[key] = value
141
+ else:
142
+ if going_forward:
143
+ adjusted_kwargs[key] = value
144
+ else:
145
+ adjusted_kwargs[key] = -value
146
+
147
+ td = relativedelta(**adjusted_kwargs)
148
+
149
+ date = now + td
150
+
134
151
  return date, period
135
152
 
136
153
  def get_kwargs(self, date_string):
@@ -139,12 +156,21 @@ class FreshnessDateDataParser:
139
156
  return {}
140
157
 
141
158
  kwargs = {}
159
+ explicit_signs = {}
160
+
142
161
  for num, unit in m:
162
+ has_explicit_sign = num.startswith("+") or num.startswith("-")
163
+ explicit_signs[unit + "s"] = has_explicit_sign
143
164
  kwargs[unit + "s"] = float(num.replace(",", "."))
165
+
144
166
  if "decades" in kwargs:
145
167
  kwargs["years"] = 10 * kwargs["decades"] + kwargs.get("years", 0)
168
+ if "decades" in explicit_signs:
169
+ explicit_signs["years"] = explicit_signs["decades"]
146
170
  del kwargs["decades"]
147
- return kwargs
171
+ explicit_signs.pop("decades", None)
172
+
173
+ return kwargs, explicit_signs
148
174
 
149
175
  def get_date_data(self, date_string, settings=None):
150
176
  from dateparser.date import DateData
@@ -201,14 +201,25 @@ class Dictionary:
201
201
  curr_split = (
202
202
  [known] if self._should_capture(known, keep_formatting) else []
203
203
  )
204
+
204
205
  if unparsed and self._should_capture(unparsed, keep_formatting):
205
206
  curr_split = (
206
207
  self._split_by_numerals(unparsed, keep_formatting) + curr_split
207
208
  )
209
+
208
210
  if unknown:
209
211
  string = unknown if string != unknown else ""
210
212
 
211
- splitted.extend(curr_split)
213
+ for token in curr_split:
214
+ if (
215
+ splitted
216
+ and splitted[-1].isdigit()
217
+ and token in {"st", "nd", "rd", "th"}
218
+ ):
219
+ continue
220
+
221
+ splitted.append(token)
222
+
212
223
  return splitted
213
224
 
214
225
  def _split_by_numerals(self, string, keep_formatting):
@@ -144,7 +144,6 @@ class Locale:
144
144
  date_string_tokens[i] = dictionary[word] or fallback
145
145
  if "in" in date_string_tokens:
146
146
  date_string_tokens = self._clear_future_words(date_string_tokens)
147
-
148
147
  return self._join(
149
148
  list(filter(bool, date_string_tokens)),
150
149
  separator="" if keep_formatting else " ",
@@ -426,11 +425,39 @@ class Locale:
426
425
  def _simplify(self, date_string, settings=None):
427
426
  date_string = date_string.lower()
428
427
  simplifications = self._get_simplifications(settings=settings)
428
+
429
+ if self.info.get("name") == "ru":
430
+ date_string = self._process_russian_compound_ordinals(
431
+ date_string, simplifications
432
+ )
433
+ else:
434
+ date_string = self._apply_simplifications(date_string, simplifications)
435
+
436
+ return date_string
437
+
438
+ def _apply_simplifications(self, date_string, simplifications):
429
439
  for simplification in simplifications:
430
440
  pattern, replacement = list(simplification.items())[0]
431
441
  date_string = pattern.sub(replacement, date_string).lower()
432
442
  return date_string
433
443
 
444
+ def _process_russian_compound_ordinals(self, date_string, simplifications):
445
+ """Process Russian compound ordinals mathematically (двадцать + первое = 21)."""
446
+ date_string = self._apply_simplifications(date_string, simplifications)
447
+
448
+ def replace_number_pairs(match):
449
+ first_num = int(match.group(1))
450
+ second_num = int(match.group(2))
451
+ result = first_num + second_num
452
+ if 1 <= result <= 31 and first_num in [20, 30] and 1 <= second_num <= 9:
453
+ return str(result)
454
+ return match.group(0)
455
+
456
+ number_pair_pattern = r"\b(\d+)\s+(\d+)\b"
457
+ date_string = re.sub(number_pair_pattern, replace_number_pairs, date_string)
458
+
459
+ return date_string
460
+
434
461
  def _get_simplifications(self, settings=None):
435
462
  no_word_spacing = eval(self.info.get("no_word_spacing", "False"))
436
463
  if settings.NORMALIZE:
@@ -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,6 +512,10 @@ 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
521
  assert not (self.now.tzinfo is None and dateobj.tzinfo is not None), (
@@ -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,