{"id":577,"library":"semver","title":"Semantic Versioning (semver)","description":"The `semver` library in Python helps developers work with Semantic Versioning (SemVer) specifications (semver.org). It provides tools for parsing, comparing, bumping, and formatting version strings according to the MAJOR.MINOR.PATCH scheme, including pre-release and build metadata. The library is actively maintained with releases as needed to address bugs and introduce new features, currently at version 3.0.4.","status":"active","version":"3.0.4","language":"python","source_language":"en","source_url":"https://github.com/python-semver/python-semver","tags":["semantic-versioning","semver","versioning","packaging"],"install":[{"cmd":"pip install semver","lang":"bash","label":"Install stable version"}],"dependencies":[],"imports":[{"symbol":"VersionInfo","correct":"from semver import VersionInfo"},{"note":"Module-level functions like `semver.parse()` were deprecated in 2.10.0 and removed in 3.x. Use `VersionInfo.parse()` instead.","wrong":"import semver; semver.parse('1.2.3')","symbol":"parse","correct":"from semver import VersionInfo"},{"note":"Module-level comparison functions like `semver.compare()` were deprecated in 2.10.0 and removed in 3.x. Use `VersionInfo` objects with standard comparison operators.","wrong":"import semver; semver.compare('1.0.0', '2.0.0')","symbol":"compare","correct":"from semver import VersionInfo; v1 = VersionInfo.parse('1.0.0'); v2 = VersionInfo.parse('2.0.0'); v1 < v2"}],"quickstart":{"code":"from semver import VersionInfo\n\n# Parse a version string\nversion = VersionInfo.parse(\"1.2.3-alpha.1+build.123\")\nprint(f\"Parsed version: {version}\")\nprint(f\"Major: {version.major}, Minor: {version.minor}, Patch: {version.patch}\")\n\n# Compare versions\nv1 = VersionInfo.parse(\"1.0.0\")\nv2 = VersionInfo.parse(\"1.0.1\")\nv3 = VersionInfo.parse(\"2.0.0\")\n\nprint(f\"Is v1 < v2? {v1 < v2}\")\nprint(f\"Is v3 > v1? {v3 > v1}\")\nprint(f\"Is v1 == '1.0.0'? {v1 == '1.0.0'}\") # Can compare with strings too\n\n# Bump a version\nnext_minor = version.bump_minor()\nprint(f\"Next minor version: {next_minor}\")\n\n# Check if a version matches an expression\nprint(f\"Does {version} match '>=1.2.0 <2.0.0'? {version.match('>=1.2.0 <2.0.0')}\")","lang":"python","description":"This quickstart demonstrates how to parse version strings into `VersionInfo` objects, access their components, compare different versions using standard operators, bump version parts, and check against match expressions. This uses the recommended object-oriented approach."},"warnings":[{"fix":"Migrate to the object-oriented `VersionInfo` class. For parsing, use `VersionInfo.parse()`. For comparisons, instantiate `VersionInfo` objects and use standard Python comparison operators (e.g., `v1 < v2`). For bumping, use `version_obj.bump_major()`, `version_obj.bump_minor()`, etc.","message":"Major breaking change in `semver` version 3.x: All module-level functions (e.g., `semver.parse()`, `semver.compare()`, `semver.bump_major()`) have been removed.","severity":"breaking","affected_versions":">=3.0.0"},{"fix":"While still functional in 2.x, it's recommended to update your code to use the `VersionInfo` class methods to ensure compatibility with 3.x.","message":"Module-level functions were deprecated in `semver` version 2.10.0 and above.","severity":"deprecated","affected_versions":">=2.10.0, <3.0.0"},{"fix":"When checking for multiple conditions (e.g., a version range), make separate `match()` calls and combine them with logical operators. For example, instead of `version.match('>=1.2.0 <2.0.0')`, use `version.match('>=1.2.0') and version.match('<2.0.0')`.","message":"The `VersionInfo.match()` method expects a single comparison expression (e.g., `'>=1.2.0'`, `'~=1.0.0'`, `'^1.0.0'`) as its argument. Passing multiple conditions combined in a single string (e.g., `'>=1.2.0 <2.0.0'`) will result in a `ValueError` because it attempts to parse the entire string as a single invalid semantic version.","severity":"gotcha","affected_versions":"All"}],"env_vars":null,"last_verified":"2026-05-12T16:15:05.767Z","next_check":"2026-06-26T00:00:00.000Z","problems":[{"fix":"Ensure the version string adheres to the 'MAJOR.MINOR.PATCH' format, e.g., '1.2.0' instead of '1.2'.","cause":"The input string to `semver.Version.parse()` does not conform to the strict MAJOR.MINOR.PATCH format required by Semantic Versioning.","error":"ValueError: Invalid version string: '1.2'"},{"fix":"Use `semver.Version.parse()` instead of `semver.parse()` to parse a version string.","cause":"In `semver` library version 3.x, the `parse` function is a static method of the `Version` class, not a top-level module function.","error":"AttributeError: module 'semver' has no attribute 'parse'"},{"fix":"Ensure the input to `semver.Version.parse()` is a valid string representation of a semantic version.","cause":"The `semver.Version.parse()` method expects a string input, but received a non-string type (e.g., `None`, an integer, or a list).","error":"TypeError: expected string or bytes-like object, got NoneType"},{"fix":"Provide integer values for the major, minor, and patch components, e.g., `semver.Version(1, 2, 3)`.","cause":"When directly constructing a `semver.Version` object, the major, minor, and patch components must be valid integers, but a non-integer or non-numeric string was provided.","error":"TypeError: 'a' is not a valid int for patch"},{"fix":"To modify a version, use the provided `bump_*` methods (e.g., `v.bump_major()`) or create a new `Version` object with the desired changes.","cause":"`semver.Version` objects are immutable; their attributes (major, minor, patch, prerelease, etc.) cannot be changed directly after creation.","error":"AttributeError: can't set attribute 'major'"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"3.0.4","install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.7,"disk_size":"17.9M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.7,"disk_size":"17.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.02,"mem_mb":1.7,"disk_size":"18M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.02,"mem_mb":1.7,"disk_size":"18M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2,"disk_size":"19.7M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.07,"mem_mb":2,"disk_size":"19.7M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.6,"import_time_s":0.05,"mem_mb":2,"disk_size":"20M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.05,"mem_mb":2,"disk_size":"20M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.07,"mem_mb":1.8,"disk_size":"11.6M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":1.8,"disk_size":"11.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.06,"mem_mb":1.8,"disk_size":"12M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":1.8,"disk_size":"12M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.05,"mem_mb":2.2,"disk_size":"11.4M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2.2,"disk_size":"11.3M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.5,"import_time_s":0.05,"mem_mb":2,"disk_size":"12M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.06,"mem_mb":2,"disk_size":"12M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.6,"disk_size":"17.4M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.6,"disk_size":"17.4M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":1.8,"import_time_s":0.03,"mem_mb":1.6,"disk_size":"18M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.03,"mem_mb":1.6,"disk_size":"18M"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}