dateparser 1.2.2__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.2 → dateparser-1.3.0}/HISTORY.rst +25 -0
  2. {dateparser-1.2.2 → dateparser-1.3.0}/PKG-INFO +40 -4
  3. {dateparser-1.2.2 → dateparser-1.3.0}/README.rst +2 -1
  4. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/__init__.py +1 -1
  5. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/conf.py +11 -0
  6. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/en.py +15 -6
  7. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fi.py +1 -0
  8. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ru.py +56 -23
  9. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/date.py +2 -1
  10. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/freshness_date_parser.py +35 -9
  11. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/languages/dictionary.py +12 -1
  12. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/languages/locale.py +28 -1
  13. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/search/search.py +18 -1
  14. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/utils/strptime.py +28 -1
  15. dateparser-1.3.0/dateparser/utils/time_spans.py +152 -0
  16. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/PKG-INFO +40 -4
  17. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/SOURCES.txt +1 -0
  18. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/requires.txt +1 -1
  19. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_data/settings.py +4 -0
  20. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/write_complete_data.py +5 -3
  21. {dateparser-1.2.2 → dateparser-1.3.0}/docs/introduction.rst +11 -0
  22. {dateparser-1.2.2 → dateparser-1.3.0}/docs/settings.rst +21 -0
  23. {dateparser-1.2.2 → dateparser-1.3.0}/pyproject.toml +1 -1
  24. {dateparser-1.2.2 → dateparser-1.3.0}/setup.py +3 -3
  25. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_date.py +63 -6
  26. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_date_parser.py +112 -0
  27. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_freshness_date_parser.py +4 -7
  28. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_languages.py +1 -0
  29. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_parser.py +25 -0
  30. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_search.py +232 -2
  31. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_utils_strptime.py +65 -0
  32. {dateparser-1.2.2 → dateparser-1.3.0}/AUTHORS.rst +0 -0
  33. {dateparser-1.2.2 → dateparser-1.3.0}/CONTRIBUTING.rst +0 -0
  34. {dateparser-1.2.2 → dateparser-1.3.0}/LICENSE +0 -0
  35. {dateparser-1.2.2 → dateparser-1.3.0}/MANIFEST.in +0 -0
  36. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/calendars/__init__.py +0 -0
  37. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/calendars/hijri.py +0 -0
  38. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/calendars/hijri_parser.py +0 -0
  39. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/calendars/jalali.py +0 -0
  40. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/calendars/jalali_parser.py +0 -0
  41. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/custom_language_detection/__init__.py +0 -0
  42. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/custom_language_detection/fasttext.py +0 -0
  43. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/custom_language_detection/langdetect.py +0 -0
  44. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/custom_language_detection/language_mapping.py +0 -0
  45. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/__init__.py +0 -0
  46. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/__init__.py +0 -0
  47. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/af.py +0 -0
  48. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/agq.py +0 -0
  49. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ak.py +0 -0
  50. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/am.py +0 -0
  51. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ar.py +0 -0
  52. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/as.py +0 -0
  53. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/asa.py +0 -0
  54. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ast.py +0 -0
  55. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/az-Cyrl.py +0 -0
  56. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/az-Latn.py +0 -0
  57. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/az.py +0 -0
  58. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bas.py +0 -0
  59. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/be.py +0 -0
  60. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bem.py +0 -0
  61. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bez.py +0 -0
  62. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bg.py +0 -0
  63. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bm.py +0 -0
  64. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bn.py +0 -0
  65. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bo.py +0 -0
  66. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/br.py +0 -0
  67. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/brx.py +0 -0
  68. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs-Cyrl.py +0 -0
  69. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs-Latn.py +0 -0
  70. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/bs.py +0 -0
  71. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ca.py +0 -0
  72. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ce.py +0 -0
  73. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/cgg.py +0 -0
  74. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/chr.py +0 -0
  75. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ckb.py +0 -0
  76. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/cs.py +0 -0
  77. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/cy.py +0 -0
  78. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/da.py +0 -0
  79. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dav.py +0 -0
  80. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/de.py +0 -0
  81. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dje.py +0 -0
  82. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dsb.py +0 -0
  83. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dua.py +0 -0
  84. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dyo.py +0 -0
  85. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/dz.py +0 -0
  86. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ebu.py +0 -0
  87. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ee.py +0 -0
  88. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/el.py +0 -0
  89. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/eo.py +0 -0
  90. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/es.py +0 -0
  91. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/et.py +0 -0
  92. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/eu.py +0 -0
  93. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ewo.py +0 -0
  94. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fa.py +0 -0
  95. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ff.py +0 -0
  96. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fil.py +0 -0
  97. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fo.py +0 -0
  98. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fr.py +0 -0
  99. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fur.py +0 -0
  100. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/fy.py +0 -0
  101. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ga.py +0 -0
  102. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/gd.py +0 -0
  103. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/gl.py +0 -0
  104. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/gsw.py +0 -0
  105. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/gu.py +0 -0
  106. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/guz.py +0 -0
  107. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/gv.py +0 -0
  108. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ha.py +0 -0
  109. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/haw.py +0 -0
  110. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/he.py +0 -0
  111. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/hi.py +0 -0
  112. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/hr.py +0 -0
  113. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/hsb.py +0 -0
  114. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/hu.py +0 -0
  115. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/hy.py +0 -0
  116. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/id.py +0 -0
  117. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ig.py +0 -0
  118. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ii.py +0 -0
  119. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/is.py +0 -0
  120. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/it.py +0 -0
  121. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ja.py +0 -0
  122. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/jgo.py +0 -0
  123. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/jmc.py +0 -0
  124. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ka.py +0 -0
  125. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kab.py +0 -0
  126. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kam.py +0 -0
  127. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kde.py +0 -0
  128. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kea.py +0 -0
  129. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/khq.py +0 -0
  130. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ki.py +0 -0
  131. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kk.py +0 -0
  132. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kl.py +0 -0
  133. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kln.py +0 -0
  134. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/km.py +0 -0
  135. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kn.py +0 -0
  136. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ko.py +0 -0
  137. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kok.py +0 -0
  138. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ks.py +0 -0
  139. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksb.py +0 -0
  140. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksf.py +0 -0
  141. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ksh.py +0 -0
  142. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/kw.py +0 -0
  143. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ky.py +0 -0
  144. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lag.py +0 -0
  145. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lb.py +0 -0
  146. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lg.py +0 -0
  147. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lkt.py +0 -0
  148. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ln.py +0 -0
  149. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lo.py +0 -0
  150. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lrc.py +0 -0
  151. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lt.py +0 -0
  152. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lu.py +0 -0
  153. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/luo.py +0 -0
  154. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/luy.py +0 -0
  155. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/lv.py +0 -0
  156. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mas.py +0 -0
  157. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mer.py +0 -0
  158. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mfe.py +0 -0
  159. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mg.py +0 -0
  160. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mgh.py +0 -0
  161. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mgo.py +0 -0
  162. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mk.py +0 -0
  163. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ml.py +0 -0
  164. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mn.py +0 -0
  165. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mr.py +0 -0
  166. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ms.py +0 -0
  167. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mt.py +0 -0
  168. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mua.py +0 -0
  169. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/my.py +0 -0
  170. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/mzn.py +0 -0
  171. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/naq.py +0 -0
  172. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nb.py +0 -0
  173. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nd.py +0 -0
  174. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ne.py +0 -0
  175. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nl.py +0 -0
  176. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nmg.py +0 -0
  177. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nn.py +0 -0
  178. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nnh.py +0 -0
  179. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nus.py +0 -0
  180. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/nyn.py +0 -0
  181. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/om.py +0 -0
  182. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/or.py +0 -0
  183. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/os.py +0 -0
  184. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa-Arab.py +0 -0
  185. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa-Guru.py +0 -0
  186. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/pa.py +0 -0
  187. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/pl.py +0 -0
  188. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ps.py +0 -0
  189. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/pt.py +0 -0
  190. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/qu.py +0 -0
  191. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/rm.py +0 -0
  192. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/rn.py +0 -0
  193. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ro.py +0 -0
  194. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/rof.py +0 -0
  195. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/rw.py +0 -0
  196. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/rwk.py +0 -0
  197. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sah.py +0 -0
  198. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/saq.py +0 -0
  199. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sbp.py +0 -0
  200. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/se.py +0 -0
  201. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/seh.py +0 -0
  202. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ses.py +0 -0
  203. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sg.py +0 -0
  204. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi-Latn.py +0 -0
  205. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi-Tfng.py +0 -0
  206. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/shi.py +0 -0
  207. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/si.py +0 -0
  208. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sk.py +0 -0
  209. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sl.py +0 -0
  210. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/smn.py +0 -0
  211. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sn.py +0 -0
  212. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/so.py +0 -0
  213. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sq.py +0 -0
  214. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr-Cyrl.py +0 -0
  215. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr-Latn.py +0 -0
  216. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sr.py +0 -0
  217. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sv.py +0 -0
  218. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/sw.py +0 -0
  219. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ta.py +0 -0
  220. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/te.py +0 -0
  221. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/teo.py +0 -0
  222. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/th.py +0 -0
  223. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ti.py +0 -0
  224. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/tl.py +0 -0
  225. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/to.py +0 -0
  226. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/tr.py +0 -0
  227. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/twq.py +0 -0
  228. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/tzm.py +0 -0
  229. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ug.py +0 -0
  230. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/uk.py +0 -0
  231. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/ur.py +0 -0
  232. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Arab.py +0 -0
  233. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Cyrl.py +0 -0
  234. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz-Latn.py +0 -0
  235. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/uz.py +0 -0
  236. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/vi.py +0 -0
  237. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/vun.py +0 -0
  238. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/wae.py +0 -0
  239. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/xog.py +0 -0
  240. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/yav.py +0 -0
  241. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/yi.py +0 -0
  242. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/yo.py +0 -0
  243. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/yue.py +0 -0
  244. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/zgh.py +0 -0
  245. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh-Hans.py +0 -0
  246. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh-Hant.py +0 -0
  247. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/zh.py +0 -0
  248. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/date_translation_data/zu.py +0 -0
  249. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/dateparser_tz_cache.pkl +0 -0
  250. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/data/languages_info.py +0 -0
  251. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/date_parser.py +0 -0
  252. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/languages/__init__.py +0 -0
  253. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/languages/loader.py +0 -0
  254. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/languages/validation.py +0 -0
  255. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/parser.py +0 -0
  256. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/search/__init__.py +0 -0
  257. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/search/detection.py +0 -0
  258. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/search/text_detection.py +0 -0
  259. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/timezone_parser.py +0 -0
  260. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/timezones.py +0 -0
  261. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser/utils/__init__.py +0 -0
  262. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/dependency_links.txt +0 -0
  263. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/entry_points.txt +0 -0
  264. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/not-zip-safe +0 -0
  265. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser.egg-info/top_level.txt +0 -0
  266. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_cli/__init__.py +0 -0
  267. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_cli/cli.py +0 -0
  268. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_cli/exceptions.py +0 -0
  269. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_cli/fasttext_manager.py +0 -0
  270. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_cli/utils.py +0 -0
  271. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_data/__init__.py +0 -0
  272. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/__init__.py +0 -0
  273. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/get_cldr_data.py +0 -0
  274. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/order_languages.py +0 -0
  275. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/update_supported_languages_and_locales.py +0 -0
  276. {dateparser-1.2.2 → dateparser-1.3.0}/dateparser_scripts/utils.py +0 -0
  277. {dateparser-1.2.2 → dateparser-1.3.0}/docs/Makefile +0 -0
  278. {dateparser-1.2.2 → dateparser-1.3.0}/docs/authors.rst +0 -0
  279. {dateparser-1.2.2 → dateparser-1.3.0}/docs/conf.py +0 -0
  280. {dateparser-1.2.2 → dateparser-1.3.0}/docs/contributing.rst +0 -0
  281. {dateparser-1.2.2 → dateparser-1.3.0}/docs/custom_language_detection.rst +0 -0
  282. {dateparser-1.2.2 → dateparser-1.3.0}/docs/dateparser.calendars.rst +0 -0
  283. {dateparser-1.2.2 → dateparser-1.3.0}/docs/dateparser.languages.rst +0 -0
  284. {dateparser-1.2.2 → dateparser-1.3.0}/docs/dateparser.rst +0 -0
  285. {dateparser-1.2.2 → dateparser-1.3.0}/docs/history.rst +0 -0
  286. {dateparser-1.2.2 → dateparser-1.3.0}/docs/index.rst +0 -0
  287. {dateparser-1.2.2 → dateparser-1.3.0}/docs/installation.rst +0 -0
  288. {dateparser-1.2.2 → dateparser-1.3.0}/docs/make.bat +0 -0
  289. {dateparser-1.2.2 → dateparser-1.3.0}/docs/modules.rst +0 -0
  290. {dateparser-1.2.2 → dateparser-1.3.0}/docs/supported_locales.rst +0 -0
  291. {dateparser-1.2.2 → dateparser-1.3.0}/docs/template.rst +0 -0
  292. {dateparser-1.2.2 → dateparser-1.3.0}/docs/usage.rst +0 -0
  293. {dateparser-1.2.2 → dateparser-1.3.0}/setup.cfg +0 -0
  294. {dateparser-1.2.2 → dateparser-1.3.0}/tests/__init__.py +0 -0
  295. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_clean_api.py +0 -0
  296. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_data.py +0 -0
  297. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_date_data.py +0 -0
  298. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_dateparser_data_integrity.py +0 -0
  299. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_hijri.py +0 -0
  300. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_jalali.py +0 -0
  301. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_language_detect.py +0 -0
  302. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_loading.py +0 -0
  303. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_pickle.py +0 -0
  304. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_settings.py +0 -0
  305. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_timezone_parser.py +0 -0
  306. {dateparser-1.2.2 → dateparser-1.3.0}/tests/test_utils.py +0 -0
@@ -3,6 +3,31 @@
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
+
6
31
  1.2.2 (2025-06-26)
7
32
  ------------------
8
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dateparser
3
- Version: 1.2.2
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,13 +13,13 @@ 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
@@ -31,7 +31,7 @@ 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
@@ -261,6 +261,17 @@ You can extract dates from longer strings of text. They are returned as list of
261
261
 
262
262
  :noindex:
263
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
+
264
275
  Advanced Usage
265
276
  ==============
266
277
  If you need more control over what is being parser check the `settings` section as well as the `using-datedataparser` section.
@@ -319,6 +330,31 @@ To be able to use them you need to install the `calendar` extra by typing:
319
330
  History
320
331
  =======
321
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
+
322
358
  1.2.2 (2025-06-26)
323
359
  ------------------
324
360
 
@@ -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.2"
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:
@@ -1,4 +1,5 @@
1
1
  from collections.abc import Set
2
+ from datetime import datetime
2
3
 
3
4
  import regex as re
4
5
 
@@ -7,6 +8,7 @@ from dateparser.custom_language_detection.language_mapping import map_languages
7
8
  from dateparser.date import DateDataParser
8
9
  from dateparser.languages.loader import LocaleDataLoader
9
10
  from dateparser.search.text_detection import FullTextLanguageDetector
11
+ from dateparser.utils.time_spans import detect_time_span, generate_time_span
10
12
 
11
13
  RELATIVE_REG = re.compile("(ago|in|from now|tomorrow|today|yesterday)")
12
14
 
@@ -185,8 +187,23 @@ class _ExactLanguageSearch:
185
187
  translated=translated,
186
188
  settings=settings,
187
189
  )
190
+
191
+ results = list(zip(substrings, [i[0]["date_obj"] for i in parsed]))
192
+
193
+ if getattr(settings, "RETURN_TIME_SPAN", False):
194
+ span_info = detect_time_span(text)
195
+ if span_info:
196
+ base_date = getattr(settings, "RELATIVE_BASE", None) or datetime.now()
197
+ start_date, end_date = generate_time_span(
198
+ span_info, base_date, settings
199
+ )
200
+
201
+ matched_text = span_info["matched_text"]
202
+ results.append((matched_text + " (start)", start_date))
203
+ results.append((matched_text + " (end)", end_date))
204
+
188
205
  parser._settings = Settings()
189
- return list(zip(substrings, [i[0]["date_obj"] for i in parsed]))
206
+ return results
190
207
 
191
208
 
192
209
  class DateSearchWithDetection:
@@ -90,7 +90,34 @@ def patch_strptime():
90
90
  __strptime = patch_strptime()
91
91
 
92
92
 
93
- def strptime(date_string, format):
93
+ def _prepare_format(date_string: str, og_format: str) -> tuple[str, str]:
94
+ # Adapted from std lib: https://github.com/python/cpython/blob/e34a5e33049ce845de646cf24a498766a2da3586/Lib/_strptime.py#L448
95
+ format = re.sub(r"([\\.^$*+?\(\){}\[\]|])", r"\\\1", og_format)
96
+ format = re.sub(r"\s+", r"\\s+", format)
97
+ format = re.sub(r"'", "['\u02bc]", format)
98
+ year_in_format = False
99
+ day_of_month_in_format = False
100
+
101
+ def repl(m: re.Match[str]) -> str:
102
+ format_char = m[1]
103
+ if format_char in ("Y", "y", "G"):
104
+ nonlocal year_in_format
105
+ year_in_format = True
106
+ elif format_char in ("d",):
107
+ nonlocal day_of_month_in_format
108
+ day_of_month_in_format = True
109
+
110
+ return ""
111
+
112
+ _ = re.sub(r"%[-_0^#]*[0-9]*([OE]?\\?.?)", repl, format)
113
+ if day_of_month_in_format and not year_in_format:
114
+ current_year = datetime.today().year
115
+ return f"{current_year} {date_string}", f"%Y {og_format}"
116
+ return date_string, og_format
117
+
118
+
119
+ def strptime(date_string: str, format: str) -> datetime:
120
+ date_string, format = _prepare_format(date_string, format)
94
121
  obj = datetime(*__strptime(date_string, format)[:-3])
95
122
 
96
123
  if "%f" in format: