{"id":15056392,"url":"https://github.com/jelly-beam/verl","last_synced_at":"2025-05-08T04:23:20.155Z","repository":{"id":51172759,"uuid":"164269497","full_name":"jelly-beam/verl","owner":"jelly-beam","description":"SemVer 2.0  parsing, matching, and comparisons for Erlang","archived":false,"fork":false,"pushed_at":"2021-05-28T13:23:58.000Z","size":94,"stargazers_count":33,"open_issues_count":2,"forks_count":5,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-06T06:11:41.142Z","etag":null,"topics":["erlang","jellybeam","semver"],"latest_commit_sha":null,"homepage":"","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jelly-beam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-06T02:44:24.000Z","updated_at":"2024-09-10T11:00:36.000Z","dependencies_parsed_at":"2022-08-26T04:10:30.427Z","dependency_job_id":null,"html_url":"https://github.com/jelly-beam/verl","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelly-beam%2Fverl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelly-beam%2Fverl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelly-beam%2Fverl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jelly-beam%2Fverl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jelly-beam","download_url":"https://codeload.github.com/jelly-beam/verl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252997607,"owners_count":21837842,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["erlang","jellybeam","semver"],"created_at":"2024-09-24T21:50:40.462Z","updated_at":"2025-05-08T04:23:20.130Z","avatar_url":"https://github.com/jelly-beam.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# verl \n[![Hex Version](https://img.shields.io/hexpm/v/verl.svg)](https://hex.pm/packages/verl) [![GitHub Actions CI](https://github.com/jelly-beam/verl/workflows/build/badge.svg)](https://github.com/jelly-beam/verl\n) [![codecov](https://codecov.io/gh/jelly-beam/verl/branch/main/graph/badge.svg)](https://codecov.io/gh/jelly-beam/verl)\n\nSemVer 2.0 version and requirements parsing, matching, and comparisons.\n\nAll parsing of versions and requirements adhere to the [SemVer 2.0 schema](http://semver.org/)\n\n - [Build](#build)\n -  [Usage](#usage)\n    * [Comparisons](#comparisons)\n    * [Version, Requirements, and Matching](#version--requirements--and-matching)\n      - [Matching](#matching)\n      - [Compiled requirements for ludicious speed matching](#compiled-requirements-for-ludicious-speed-matching)\n      - [Version parsing](#version-parsing)\n        * [Requirements parsing](#requirements-parsing)\n - [Credits](#credits)\n\n\n## Build\n\n```bash\n$ rebar3 compile\n```\n\n## Test\n\n```bash\n$ rebar3 test\n```\n\n## Usage\n\nAdd to you deps configuration in rebar.config for your project : \n\n```erlang\n{deps, [{verl, \"1.1.0\"}]}.\n```\n\n### Comparisons\n\n```erlang\n1\u003e verl:compare(\u003c\u003c\"1.0.0\"\u003e\u003e, \u003c\u003c\"1.0.1\"\u003e\u003e).\nlt\n2\u003e verl:compare(\u003c\u003c\"1.0.0\"\u003e\u003e, \u003c\u003c\"1.0.0\"\u003e\u003e).\neq\n3\u003e verl:compare(\u003c\u003c\"2.0.0\"\u003e\u003e, \u003c\u003c\"1.0.0\"\u003e\u003e).\ngt\n4\u003e verl:compare(\u003c\u003c\"1.0.0-pre\"\u003e\u003e, \u003c\u003c\"1.0.0\"\u003e\u003e).\nlt\n5\u003e verl:compare(\u003c\u003c\"1.0.0\"\u003e\u003e, \u003c\u003c\"1.0.0-pre\"\u003e\u003e).\ngt\n```\n\n### Version, Requirements, and Matching\n\n#### Matching\n\n```erlang\n1\u003e verl:is_match(\u003c\u003c\"1.0.0\"\u003e\u003e, \u003c\u003c\"~\u003e 1.0.0\"\u003e\u003e).\ntrue\n2\u003e verl:is_match(\u003c\u003c\"1.0.0\"\u003e\u003e, \u003c\u003c\"~\u003e 2.0.0\"\u003e\u003e).\nfalse\n3\u003e verl:is_match(\u003c\u003c\"3.2.0\"\u003e\u003e, \u003c\u003c\"~\u003e 3.0.0\"\u003e\u003e).\nfalse\n4\u003e verl:is_match(\u003c\u003c\"3.2.0\"\u003e\u003e, \u003c\u003c\"~\u003e 3.0\"\u003e\u003e).\ntrue\n```\n\n#### Compiled requirements for ludicious speed matching\n\n```erlang\n1\u003e {ok, Req} = verl:parse_requirement(\u003c\u003c\"~\u003e 3.0\"\u003e\u003e).\n{ok,#{compiled =\u003e false,\n  string =\u003e \u003c\u003c\"~\u003e 3.0\"\u003e\u003e,\n  matchspec =\u003e [{{'$1','$2','$3','$4','$5'}...}],\n  string =\u003e \u003c\u003c\"~\u003e 3.0\"\u003e\u003e}}\n2\u003e verl:is_match(\u003c\u003c\"3.0.0-dev\"\u003e\u003e, Req).\n  false\n3\u003e verl:is_match(\u003c\u003c\"1.2.3\"\u003e\u003e, Req).\n  false\n4\u003e verl:is_match(\u003c\u003c\"3.1.0\"\u003e\u003e, Req).\n  true\n```\n\n#### Version parsing\n\n```erlang\n1\u003e verl:parse(\u003c\u003c\"1.2.3\"\u003e\u003e).\n#{build =\u003e undefined,major =\u003e 1,minor =\u003e 2,patch =\u003e 3,\n  pre =\u003e []}\n2\u003e verl:parse(\u003c\u003c\"1.2.3+build\"\u003e\u003e).\n#{build =\u003e \u003c\u003c\"build\"\u003e\u003e,major =\u003e 1,minor =\u003e 2,patch =\u003e 3,\n  pre =\u003e []}\n3\u003e verl:parse(\u003c\u003c\"1.2.3-pre+build\"\u003e\u003e).\n#{build =\u003e \u003c\u003c\"build\"\u003e\u003e,major =\u003e 1,minor =\u003e 2,patch =\u003e 3,\n  pre =\u003e [\u003c\u003c\"pre\"\u003e\u003e]}\n4\u003e verl:parse(\u003c\u003c\"1\"\u003e\u003e).\n{error, invalid_version}\n5\u003e verl:parse(\u003c\u003c\"2\"\u003e\u003e).\n{error, invalid_version}\n```\n\nDon't want a map? Use the `verl_parser` module...\n\n```erlang\n1\u003e verl_parser:parse_version(\u003c\u003c\"1.2.3\"\u003e\u003e).\n{ok,{1,2,3,[],[]}}\n2\u003e verl_parser:parse_version(\u003c\u003c\"1.2.3+build\"\u003e\u003e).\n{ok,{1,2,3,[],[\u003c\u003c\"build\"\u003e\u003e]}}\n3\u003e verl_parser:parse_version(\u003c\u003c\"1.2.3-pre+build\"\u003e\u003e).\n{ok,{1,2,3,[\u003c\u003c\"pre\"\u003e\u003e],[\u003c\u003c\"build\"\u003e\u003e]}}\n4\u003e verl_parser:parse_version(\u003c\u003c\"1\"\u003e\u003e).\n{error, invalid_version}\n```\n\n##### Requirements parsing\n\n```erlang\n1\u003e verl:parse_requirement(\u003c\u003c\"~\u003e 2.1.0-dev\"\u003e\u003e).\n{ok,#{compiled =\u003e false,\n  string =\u003e \u003c\u003c\"~\u003e 2.1.0-dev\"\u003e\u003e,\n  matchspec =\u003e\n      [{{'$1','$2','$3','$4','$5'}...] }}\n2\u003e verl:parse_requirement(\u003c\u003c\"~\u003e 2.1.0-\"\u003e\u003e).\n{error,invalid_requirement}\n```\n\nDon't want a map? User the `verl_parser` module...\n\n```erlang\n1\u003e verl_parser:parse_requirement(\u003c\u003c\"~\u003e 2.1.0-dev\"\u003e\u003e).\n{ok, [{{'$1','$2','$3','$4','$5'}...]}\n2\u003e verl:parse_requirement(\u003c\u003c\"~\u003e 2.1.0-\"\u003e\u003e).\n{error,invalid_requirement}\n```\n\n## Credits\n\n- All credit goes to the Elixir team and contributors to Version and\nVersion.Parser in the Elixir standard lib for the algorithm and original\nimplementation.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjelly-beam%2Fverl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjelly-beam%2Fverl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjelly-beam%2Fverl/lists"}