_deprecated.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. """
  2. Contains all deprecated functions.
  3. .. autofunction: deprecated
  4. """
  5. import inspect
  6. import warnings
  7. from functools import partial, wraps
  8. from types import FrameType
  9. from typing import Type, Callable, Optional, cast
  10. from . import cli
  11. from .version import Version
  12. from ._types import Decorator, F
  13. def deprecated(
  14. func: Optional[F] = None,
  15. *,
  16. replace: Optional[str] = None,
  17. version: Optional[str] = None,
  18. remove: Optional[str] = None,
  19. category: Type[Warning] = DeprecationWarning,
  20. ) -> Decorator:
  21. """
  22. Decorates a function to output a deprecation warning.
  23. :param func: the function to decorate
  24. :param replace: the function to replace (use the full qualified
  25. name like ``semver.version.Version.bump_major``.
  26. :param version: the first version when this function was deprecated.
  27. :param category: allow you to specify the deprecation warning class
  28. of your choice. By default, it's :class:`DeprecationWarning`, but
  29. you can choose :class:`PendingDeprecationWarning` or a custom class.
  30. :return: decorated function which is marked as deprecated
  31. """
  32. if func is None:
  33. return partial(
  34. deprecated,
  35. replace=replace,
  36. version=version,
  37. remove=remove,
  38. category=category,
  39. )
  40. @wraps(func)
  41. def wrapper(*args, **kwargs) -> Callable[..., F]:
  42. msg_list = ["Function 'semver.{f}' is deprecated."]
  43. if version:
  44. msg_list.append("Deprecated since version {v}. ")
  45. if not remove:
  46. msg_list.append("This function will be removed in semver 3.")
  47. else:
  48. msg_list.append(str(remove))
  49. if replace:
  50. msg_list.append("Use {r!r} instead.")
  51. else:
  52. msg_list.append("Use the respective 'semver.Version.{r}' instead.")
  53. f = cast(F, func).__qualname__
  54. r = replace or f
  55. frame = cast(FrameType, cast(FrameType, inspect.currentframe()).f_back)
  56. msg = " ".join(msg_list)
  57. warnings.warn_explicit(
  58. msg.format(f=f, r=r, v=version),
  59. category=category,
  60. filename=inspect.getfile(frame.f_code),
  61. lineno=frame.f_lineno,
  62. )
  63. # As recommended in the Python documentation
  64. # https://docs.python.org/3/library/inspect.html#the-interpreter-stack
  65. # better remove the interpreter stack:
  66. del frame
  67. return func(*args, **kwargs) # type: ignore
  68. return wrapper
  69. @deprecated(
  70. version="3.0.0",
  71. remove="Still under investigation, see #258.",
  72. category=PendingDeprecationWarning,
  73. )
  74. def compare(ver1: str, ver2: str) -> int:
  75. """
  76. Compare two versions strings.
  77. .. deprecated:: 3.0.0
  78. The situation of this function is unclear and it might
  79. disappear in the future.
  80. If possible, use :meth:`semver.version.Version.compare`.
  81. See :gh:`258` for details.
  82. :param ver1: first version string
  83. :param ver2: second version string
  84. :return: The return value is negative if ver1 < ver2,
  85. zero if ver1 == ver2 and strictly positive if ver1 > ver2
  86. >>> semver.compare("1.0.0", "2.0.0")
  87. -1
  88. >>> semver.compare("2.0.0", "1.0.0")
  89. 1
  90. >>> semver.compare("2.0.0", "2.0.0")
  91. 0
  92. """
  93. return Version.parse(ver1).compare(ver2)
  94. @deprecated(version="2.10.0")
  95. def parse(version):
  96. """
  97. Parse version to major, minor, patch, pre-release, build parts.
  98. .. deprecated:: 2.10.0
  99. Use :meth:`~semver.version.Version.parse` instead.
  100. :param version: version string
  101. :return: dictionary with the keys 'build', 'major', 'minor', 'patch',
  102. and 'prerelease'. The prerelease or build keys can be None
  103. if not provided
  104. :rtype: dict
  105. >>> ver = semver.parse('3.4.5-pre.2+build.4')
  106. >>> ver['major']
  107. 3
  108. >>> ver['minor']
  109. 4
  110. >>> ver['patch']
  111. 5
  112. >>> ver['prerelease']
  113. 'pre.2'
  114. >>> ver['build']
  115. 'build.4'
  116. """
  117. return Version.parse(version).to_dict()
  118. @deprecated(replace="semver.version.Version.parse", version="2.10.0")
  119. def parse_version_info(version):
  120. """
  121. Parse version string to a Version instance.
  122. .. deprecated:: 2.10.0
  123. Use :meth:`~semver.version.Version.parse` instead.
  124. .. versionadded:: 2.7.2
  125. Added :func:`semver.parse_version_info`
  126. :param version: version string
  127. :return: a :class:`VersionInfo` instance
  128. >>> version_info = semver.Version.parse("3.4.5-pre.2+build.4")
  129. >>> version_info.major
  130. 3
  131. >>> version_info.minor
  132. 4
  133. >>> version_info.patch
  134. 5
  135. >>> version_info.prerelease
  136. 'pre.2'
  137. >>> version_info.build
  138. 'build.4'
  139. """
  140. return Version.parse(version)
  141. @deprecated(version="2.10.0")
  142. def match(version, match_expr):
  143. """
  144. Compare two versions strings through a comparison.
  145. .. deprecated:: 2.10.0
  146. Use :meth:`~semver.version.Version.match` instead.
  147. :param str version: a version string
  148. :param str match_expr: operator and version; valid operators are
  149. < smaller than
  150. > greater than
  151. >= greator or equal than
  152. <= smaller or equal than
  153. == equal
  154. != not equal
  155. :return: True if the expression matches the version, otherwise False
  156. :rtype: bool
  157. >>> semver.match("2.0.0", ">=1.0.0")
  158. True
  159. >>> semver.match("1.0.0", ">1.0.0")
  160. False
  161. """
  162. ver = Version.parse(version)
  163. return ver.match(match_expr)
  164. @deprecated(replace="max", version="2.10.2")
  165. def max_ver(ver1, ver2):
  166. """
  167. Returns the greater version of two versions strings.
  168. .. deprecated:: 2.10.2
  169. Use :func:`max` instead.
  170. :param ver1: version string 1
  171. :param ver2: version string 2
  172. :return: the greater version of the two
  173. :rtype: :class:`Version`
  174. >>> semver.max_ver("1.0.0", "2.0.0")
  175. '2.0.0'
  176. """
  177. return str(max(ver1, ver2, key=Version.parse))
  178. @deprecated(replace="min", version="2.10.2")
  179. def min_ver(ver1, ver2):
  180. """
  181. Returns the smaller version of two versions strings.
  182. .. deprecated:: 2.10.2
  183. Use Use :func:`min` instead.
  184. :param ver1: version string 1
  185. :param ver2: version string 2
  186. :return: the smaller version of the two
  187. :rtype: :class:`Version`
  188. >>> semver.min_ver("1.0.0", "2.0.0")
  189. '1.0.0'
  190. """
  191. return str(min(ver1, ver2, key=Version.parse))
  192. @deprecated(replace="str(versionobject)", version="2.10.0")
  193. def format_version(major, minor, patch, prerelease=None, build=None):
  194. """
  195. Format a version string according to the Semantic Versioning specification.
  196. .. deprecated:: 2.10.0
  197. Use ``str(Version(VERSION)`` instead.
  198. :param int major: the required major part of a version
  199. :param int minor: the required minor part of a version
  200. :param int patch: the required patch part of a version
  201. :param str prerelease: the optional prerelease part of a version
  202. :param str build: the optional build part of a version
  203. :return: the formatted string
  204. :rtype: str
  205. >>> semver.format_version(3, 4, 5, 'pre.2', 'build.4')
  206. '3.4.5-pre.2+build.4'
  207. """
  208. return str(Version(major, minor, patch, prerelease, build))
  209. @deprecated(version="2.10.0")
  210. def bump_major(version):
  211. """
  212. Raise the major part of the version string.
  213. .. deprecated:: 2.10.0
  214. Use :meth:`~semver.version.Version.bump_major` instead.
  215. :param: version string
  216. :return: the raised version string
  217. :rtype: str
  218. >>> semver.bump_major("3.4.5")
  219. '4.0.0'
  220. """
  221. return str(Version.parse(version).bump_major())
  222. @deprecated(version="2.10.0")
  223. def bump_minor(version):
  224. """
  225. Raise the minor part of the version string.
  226. .. deprecated:: 2.10.0
  227. Use :meth:`~semver.version.Version.bump_minor` instead.
  228. :param: version string
  229. :return: the raised version string
  230. :rtype: str
  231. >>> semver.bump_minor("3.4.5")
  232. '3.5.0'
  233. """
  234. return str(Version.parse(version).bump_minor())
  235. @deprecated(version="2.10.0")
  236. def bump_patch(version):
  237. """
  238. Raise the patch part of the version string.
  239. .. deprecated:: 2.10.0
  240. Use :meth:`~semver.version.Version.bump_patch` instead.
  241. :param: version string
  242. :return: the raised version string
  243. :rtype: str
  244. >>> semver.bump_patch("3.4.5")
  245. '3.4.6'
  246. """
  247. return str(Version.parse(version).bump_patch())
  248. @deprecated(version="2.10.0")
  249. def bump_prerelease(version, token="rc"):
  250. """
  251. Raise the prerelease part of the version string.
  252. .. deprecated:: 2.10.0
  253. Use :meth:`~semver.version.Version.bump_prerelease` instead.
  254. :param version: version string
  255. :param token: defaults to 'rc'
  256. :return: the raised version string
  257. :rtype: str
  258. >>> semver.bump_prerelease('3.4.5', 'dev')
  259. '3.4.5-dev.1'
  260. """
  261. return str(Version.parse(version).bump_prerelease(token))
  262. @deprecated(version="2.10.0")
  263. def bump_build(version, token="build"):
  264. """
  265. Raise the build part of the version string.
  266. .. deprecated:: 2.10.0
  267. Use :meth:`~semver.version.Version.bump_build` instead.
  268. :param version: version string
  269. :param token: defaults to 'build'
  270. :return: the raised version string
  271. :rtype: str
  272. >>> semver.bump_build('3.4.5-rc.1+build.9')
  273. '3.4.5-rc.1+build.10'
  274. """
  275. return str(Version.parse(version).bump_build(token))
  276. @deprecated(version="2.10.0")
  277. def finalize_version(version):
  278. """
  279. Remove any prerelease and build metadata from the version string.
  280. .. deprecated:: 2.10.0
  281. Use :meth:`~semver.version.Version.finalize_version` instead.
  282. .. versionadded:: 2.7.9
  283. Added :func:`finalize_version`
  284. :param version: version string
  285. :return: the finalized version string
  286. :rtype: str
  287. >>> semver.finalize_version('1.2.3-rc.5')
  288. '1.2.3'
  289. """
  290. verinfo = Version.parse(version)
  291. return str(verinfo.finalize_version())
  292. @deprecated(version="2.10.0")
  293. def replace(version, **parts):
  294. """
  295. Replace one or more parts of a version and return the new string.
  296. .. deprecated:: 2.10.0
  297. Use :meth:`~semver.version.Version.replace` instead.
  298. .. versionadded:: 2.9.0
  299. Added :func:`replace`
  300. :param version: the version string to replace
  301. :param parts: the parts to be updated. Valid keys are:
  302. ``major``, ``minor``, ``patch``, ``prerelease``, or ``build``
  303. :return: the replaced version string
  304. :raises TypeError: if ``parts`` contains invalid keys
  305. >>> import semver
  306. >>> semver.replace("1.2.3", major=2, patch=10)
  307. '2.2.10'
  308. """
  309. return str(Version.parse(version).replace(**parts))
  310. # CLI
  311. cmd_bump = deprecated(cli.cmd_bump, replace="semver.cli.cmd_bump", version="3.0.0")
  312. cmd_check = deprecated(cli.cmd_check, replace="semver.cli.cmd_check", version="3.0.0")
  313. cmd_compare = deprecated(
  314. cli.cmd_compare, replace="semver.cli.cmd_compare", version="3.0.0"
  315. )
  316. cmd_nextver = deprecated(
  317. cli.cmd_nextver, replace="semver.cli.cmd_nextver", version="3.0.0"
  318. )
  319. createparser = deprecated(
  320. cli.createparser, replace="semver.cli.createparser", version="3.0.0"
  321. )
  322. process = deprecated(cli.process, replace="semver.cli.process", version="3.0.0")
  323. main = deprecated(cli.main, replace="semver.cli.main", version="3.0.0")