{"id":615,"name":null,"description":"Parsing Expressions for Ruby","url":"https://github.com/mjackson/citrus","last_synced_at":"2026-05-01T02:00:45.667Z","repository":{"id":881694,"uuid":"626919","full_name":"mjackson/citrus","owner":"mjackson","description":"Parsing Expressions for Ruby","archived":false,"fork":false,"pushed_at":"2021-08-28T16:49:08.000Z","size":3647,"stargazers_count":409,"open_issues_count":12,"forks_count":22,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-04-20T07:03:16.394Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://mjackson.github.io/citrus","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mjackson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-04-24T16:10:33.000Z","updated_at":"2026-04-07T20:42:40.000Z","dependencies_parsed_at":"2022-08-16T11:25:08.153Z","dependency_job_id":null,"html_url":"https://github.com/mjackson/citrus","commit_stats":null,"previous_names":["mjijackson/citrus"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/mjackson/citrus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson","download_url":"https://codeload.github.com/mjackson/citrus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32243803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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"}},"owner":{"login":"mjackson","name":"Michael Jackson","uuid":"92839","kind":"user","description":"Founder @remix-run, creator @unpkg. Thriller.","email":"michael@jackson.us","website":"https://remix.run","location":"Carlsbad, California","twitter":"mjackson","company":"@Shopify","icon_url":"https://avatars.githubusercontent.com/u/92839?u=2727b5ab382f6b2f3be84a257c2dcdc50243d78f\u0026v=4","repositories_count":193,"last_synced_at":"2026-02-10T03:17:28.414Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/mjackson","funding_links":["https://github.com/sponsors/mjackson"],"total_stars":8428,"followers":7399,"following":36,"created_at":"2022-11-02T16:24:20.041Z","updated_at":"2026-02-10T03:17:28.414Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson/repositories"},"packages":[{"id":13778581,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T13:14:23.701Z","latest_release_published_at":"2026-02-13T13:14:23.701Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-13T13:36:22.468Z","created_at":"2026-02-13T13:14:23.536Z","updated_at":"2026-03-13T13:36:22.469Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{"id":881694,"uuid":"626919","full_name":"mjackson/citrus","owner":"mjackson","description":"Parsing Expressions for Ruby","archived":false,"fork":false,"pushed_at":"2021-08-28T16:49:08.000Z","size":3647,"stargazers_count":409,"open_issues_count":12,"forks_count":22,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-01-27T22:52:27.901Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://mjackson.github.io/citrus","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mjackson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-04-24T16:10:33.000Z","updated_at":"2026-01-20T10:41:06.000Z","dependencies_parsed_at":"2022-08-16T11:25:08.153Z","dependency_job_id":null,"html_url":"https://github.com/mjackson/citrus","commit_stats":null,"previous_names":["mjijackson/citrus"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/mjackson/citrus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson","download_url":"https://codeload.github.com/mjackson/citrus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28932532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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"}},"repo_metadata_updated_at":"2026-02-13T13:14:25.059Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":0.8282539589955963,"forks_count":1.417364169267112,"docker_downloads_count":null,"average":0.5614045320656771},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-22.04\u0026repository_url=https://launchpad.net/ubuntu/jammy","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-22.04","url":"https://launchpad.net/ubuntu/jammy","ecosystem":"ubuntu","default":false,"packages_count":34289,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"jammy"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:46.486Z","updated_at":"2026-04-27T18:20:36.155Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-22.04/namespaces"}},{"id":13750860,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"http://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T07:11:19.411Z","latest_release_published_at":"2026-02-13T07:11:19.411Z","latest_release_number":"3.0.2-1","last_synced_at":"2026-03-13T14:23:38.193Z","created_at":"2026-02-13T07:11:19.205Z","updated_at":"2026-03-13T14:23:38.193Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"3.9.8","maintainer":"Debian Ruby Extras Maintainers \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper (\u003e= 9~), gem2deb, rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{"id":881694,"uuid":"626919","full_name":"mjackson/citrus","owner":"mjackson","description":"Parsing Expressions for Ruby","archived":false,"fork":false,"pushed_at":"2021-08-28T16:49:08.000Z","size":3647,"stargazers_count":409,"open_issues_count":12,"forks_count":22,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-01-27T22:52:27.901Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://mjackson.github.io/citrus","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mjackson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-04-24T16:10:33.000Z","updated_at":"2026-01-20T10:41:06.000Z","dependencies_parsed_at":"2022-08-16T11:25:08.153Z","dependency_job_id":null,"html_url":"https://github.com/mjackson/citrus","commit_stats":null,"previous_names":["mjijackson/citrus"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/mjackson/citrus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson","download_url":"https://codeload.github.com/mjackson/citrus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28932532,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T04:05:25.756Z","status":"ssl_error","status_checked_at":"2026-01-31T04:02:35.005Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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"}},"repo_metadata_updated_at":"2026-02-13T07:11:22.344Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-20.04\u0026repository_url=https://launchpad.net/ubuntu/focal","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2026-01-14T23:00:22.230Z","issues_count":48,"pull_requests_count":16,"avg_time_to_close_issue":16948378.051282052,"avg_time_to_close_pull_request":24523866.384615384,"issues_closed_count":39,"pull_requests_closed_count":13,"pull_request_authors_count":12,"issue_authors_count":39,"avg_comments_per_issue":2.2916666666666665,"avg_comments_per_pull_request":2.0,"merged_pull_requests_count":9,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/issues","maintainers":[{"login":"blambeau","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/blambeau"}],"active_maintainers":[]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-20.04","url":"https://launchpad.net/ubuntu/focal","ecosystem":"ubuntu","default":false,"packages_count":30789,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"focal"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:47.233Z","updated_at":"2026-04-27T18:20:36.874Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-20.04/namespaces"}},{"id":13406470,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-06T15:01:40.769Z","latest_release_published_at":"2026-02-06T15:01:40.769Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-06T15:57:58.717Z","created_at":"2026-02-06T15:01:40.400Z","updated_at":"2026-03-06T16:04:51.224Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":null,"dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-24.04","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-24.04","url":"https://launchpad.net/ubuntu/noble","ecosystem":"ubuntu","default":true,"packages_count":37306,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"noble"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:45.928Z","updated_at":"2026-04-27T18:20:35.701Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.04/namespaces"}},{"id":13605228,"name":"ruby-citrus","ecosystem":"debian","description":null,"homepage":"http://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-11T11:19:14.054Z","latest_release_published_at":"2026-02-11T11:19:14.054Z","latest_release_number":"3.0.2-1","last_synced_at":"2026-03-13T20:01:41.839Z","created_at":"2026-02-11T11:19:13.838Z","updated_at":"2026-03-13T20:01:41.840Z","registry_url":"https://tracker.debian.org/pkg/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":"https://packages.debian.org/buster/ruby-citrus","metadata":{"component":"main","architecture":"all","priority":"extra","binary":"ruby-citrus","standards_version":"3.9.8","maintainer":"Debian Ruby Extras Maintainers \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper (\u003e= 9~), gem2deb, rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T15:15:03.099Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-citrus?arch=source\u0026distro=debian-10\u0026repository_url=https://packages.debian.org/buster","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"debian-10","url":"https://packages.debian.org/buster","ecosystem":"debian","default":false,"packages_count":28836,"maintainers_count":0,"namespaces_count":3,"keywords_count":915,"github":"debian","metadata":{"codename":"buster","mirror":"http://archive.debian.org/debian"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:50.156Z","updated_at":"2026-04-27T18:20:39.693Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-10/namespaces"}},{"id":13566211,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-11T06:36:54.546Z","latest_release_published_at":"2026-02-11T06:36:54.546Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-11T14:11:14.139Z","created_at":"2026-02-11T06:36:54.342Z","updated_at":"2026-03-11T14:11:14.139Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T14:56:13.693Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-23.04\u0026repository_url=https://launchpad.net/ubuntu/lunar","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-23.04","url":"https://launchpad.net/ubuntu/lunar","ecosystem":"ubuntu","default":false,"packages_count":36116,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"lunar","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:49.117Z","updated_at":"2026-04-27T18:20:38.741Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.04/namespaces"}},{"id":13530087,"name":"ruby-citrus","ecosystem":"debian","description":null,"homepage":"http://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-10T23:28:12.215Z","latest_release_published_at":"2026-02-10T23:28:12.215Z","latest_release_number":"3.0.2-1.1","last_synced_at":"2026-03-14T04:23:54.998Z","created_at":"2026-02-10T23:28:12.021Z","updated_at":"2026-03-14T04:23:54.998Z","registry_url":"https://tracker.debian.org/pkg/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":"https://packages.debian.org/bullseye/ruby-citrus","metadata":{"component":"main","architecture":"all","priority":"extra","binary":"ruby-citrus","standards_version":"3.9.8","maintainer":"Debian Ruby Extras Maintainers \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper (\u003e= 9~), gem2deb, rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-11T14:26:32.515Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-citrus?arch=source\u0026distro=debian-11\u0026repository_url=https://packages.debian.org/bullseye","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"debian-11","url":"https://packages.debian.org/bullseye","ecosystem":"debian","default":false,"packages_count":31268,"maintainers_count":0,"namespaces_count":3,"keywords_count":0,"github":"debian","metadata":{"codename":"bullseye"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:49.702Z","updated_at":"2026-04-27T18:20:39.352Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-11/namespaces"}},{"id":13804096,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-13T18:16:33.214Z","latest_release_published_at":"2026-02-13T18:16:33.214Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-14T02:19:59.167Z","created_at":"2026-02-13T18:16:33.046Z","updated_at":"2026-03-14T02:19:59.167Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-13T18:19:28.363Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-23.10\u0026repository_url=https://launchpad.net/ubuntu/mantic","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-23.10","url":"https://launchpad.net/ubuntu/mantic","ecosystem":"ubuntu","default":false,"packages_count":36642,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"mantic","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:48.636Z","updated_at":"2026-04-27T18:20:38.051Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-23.10/namespaces"}},{"id":13466469,"name":"ruby-citrus","ecosystem":"ubuntu","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["universe/misc"],"namespace":"universe","versions_count":1,"first_release_published_at":"2026-02-09T16:18:15.210Z","latest_release_published_at":"2026-02-09T16:18:15.210Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-09T17:03:39.261Z","created_at":"2026-02-09T16:18:10.109Z","updated_at":"2026-03-09T17:32:34.493Z","registry_url":"https://launchpad.net/ubuntu/+source/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":null,"metadata":{"component":"universe","architecture":"all","priority":"optional","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":null,"dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/ubuntu/ruby-citrus?arch=source\u0026distro=ubuntu-24.10\u0026repository_url=https://launchpad.net/ubuntu/oracular","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/ubuntu/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/ubuntu/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/ubuntu/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"ubuntu-24.10","url":"https://launchpad.net/ubuntu/oracular","ecosystem":"ubuntu","default":false,"packages_count":38437,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"ubuntu","metadata":{"codename":"oracular","mirror":"http://old-releases.ubuntu.com/ubuntu"},"icon_url":"https://github.com/ubuntu.png","created_at":"2026-02-04T11:01:48.028Z","updated_at":"2026-04-27T18:20:37.303Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/ubuntu-24.10/namespaces"}},{"id":13950571,"name":"ruby-citrus","ecosystem":"guix","description":"Parsing Expressions for Ruby","homepage":"https://mjackson.github.io/citrus/","licenses":"expat","normalized_licenses":["Other"],"repository_url":"https://github.com/mjackson/citrus","keywords_array":[],"namespace":null,"versions_count":1,"first_release_published_at":"2026-03-02T18:58:35.914Z","latest_release_published_at":"2026-03-02T18:58:35.914Z","latest_release_number":"3.0.2","last_synced_at":"2026-04-27T16:20:26.479Z","created_at":"2026-03-02T18:58:35.706Z","updated_at":"2026-04-27T16:20:27.748Z","registry_url":"https://packages.guix.gnu.org/packages/ruby-citrus/3.0.2/","install_command":"guix install ruby-citrus","documentation_url":"https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/ruby-xyz.scm#n15710","metadata":{"location":"gnu/packages/ruby-xyz.scm:15710","variable_name":"ruby-citrus"},"repo_metadata":{"id":881694,"uuid":"626919","full_name":"mjackson/citrus","owner":"mjackson","description":"Parsing Expressions for Ruby","archived":false,"fork":false,"pushed_at":"2021-08-28T16:49:08.000Z","size":3647,"stargazers_count":408,"open_issues_count":12,"forks_count":22,"subscribers_count":10,"default_branch":"master","last_synced_at":"2026-03-23T19:04:15.994Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://mjackson.github.io/citrus","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mjackson.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2010-04-24T16:10:33.000Z","updated_at":"2026-03-10T22:15:34.000Z","dependencies_parsed_at":"2022-08-16T11:25:08.153Z","dependency_job_id":null,"html_url":"https://github.com/mjackson/citrus","commit_stats":null,"previous_names":["mjijackson/citrus"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/mjackson/citrus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mjackson","download_url":"https://codeload.github.com/mjackson/citrus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30917641,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-25T07:55:14.202Z","status":"ssl_error","status_checked_at":"2026-03-25T07:55:10.924Z","response_time":80,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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"}},"repo_metadata_updated_at":"2026-04-27T16:20:27.721Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:guix/ruby-citrus","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/guix/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/guix/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/guix/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"guix","url":"https://guix.gnu.org","ecosystem":"guix","default":true,"packages_count":31189,"maintainers_count":0,"namespaces_count":0,"keywords_count":0,"github":"guix-mirror","metadata":{"funded_packages_count":286},"icon_url":"https://github.com/guix-mirror.png","created_at":"2026-03-02T16:23:46.981Z","updated_at":"2026-04-03T06:23:21.396Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/guix/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/guix/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/guix/namespaces"}},{"id":13712130,"name":"ruby-citrus","ecosystem":"debian","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-12T23:26:35.532Z","latest_release_published_at":"2026-02-12T23:26:35.532Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-13T03:28:37.871Z","created_at":"2026-02-12T23:26:35.276Z","updated_at":"2026-03-13T03:28:37.872Z","registry_url":"https://tracker.debian.org/pkg/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":"https://packages.debian.org/bookworm/ruby-citrus","metadata":{"component":"main","architecture":"all","priority":"extra","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-12T23:26:36.779Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-citrus?arch=source\u0026distro=debian-12","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"debian-12","url":"https://packages.debian.org/bookworm","ecosystem":"debian","default":true,"packages_count":34734,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"debian","metadata":{"codename":"bookworm"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:49.459Z","updated_at":"2026-04-27T18:20:38.992Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-12/namespaces"}},{"id":13668708,"name":"ruby-citrus","ecosystem":"debian","description":null,"homepage":"https://mjackson.github.io/citrus","licenses":null,"normalized_licenses":[],"repository_url":"https://github.com/mjackson/citrus","keywords_array":["misc"],"namespace":"main","versions_count":1,"first_release_published_at":"2026-02-12T12:18:35.171Z","latest_release_published_at":"2026-02-12T12:18:35.171Z","latest_release_number":"3.0.2-2","last_synced_at":"2026-03-14T18:10:35.574Z","created_at":"2026-02-12T12:18:34.949Z","updated_at":"2026-03-14T18:10:35.574Z","registry_url":"https://tracker.debian.org/pkg/ruby-citrus","install_command":"apt-get install ruby-citrus","documentation_url":"https://packages.debian.org/trixie/ruby-citrus","metadata":{"component":"main","architecture":"all","priority":"extra","binary":"ruby-citrus","standards_version":"4.6.0","maintainer":"Debian Ruby Team \u003cpkg-ruby-extras-maintainers@lists.alioth.debian.org\u003e","build_depends":"debhelper-compat (= 13), gem2deb (\u003e= 1), rake","build_depends_indep":null,"build_depends_arch":null},"repo_metadata":{},"repo_metadata_updated_at":"2026-02-12T12:18:35.711Z","dependent_packages_count":0,"downloads":null,"downloads_period":null,"dependent_repos_count":0,"rankings":{"downloads":null,"dependent_repos_count":0.0,"dependent_packages_count":0.0,"stargazers_count":null,"forks_count":null,"docker_downloads_count":null,"average":100},"purl":"pkg:deb/debian/ruby-citrus?arch=source\u0026distro=debian-13\u0026repository_url=https://packages.debian.org/trixie","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/debian/ruby-citrus","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/debian/ruby-citrus","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/debian/ruby-citrus/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-citrus/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-citrus/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-citrus/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-citrus/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages/ruby-citrus/codemeta","maintainers":[],"registry":{"name":"debian-13","url":"https://packages.debian.org/trixie","ecosystem":"debian","default":false,"packages_count":38024,"maintainers_count":0,"namespaces_count":4,"keywords_count":0,"github":"debian","metadata":{"codename":"trixie"},"icon_url":"https://github.com/debian.png","created_at":"2026-02-04T11:01:50.448Z","updated_at":"2026-04-27T18:20:39.853Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/debian-13/namespaces"}}],"commits":{"id":19034,"full_name":"mjackson/citrus","default_branch":"master","total_commits":384,"total_committers":10,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":38.4,"dds":0.140625,"past_year_total_commits":0,"past_year_total_committers":0,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":0.0,"past_year_dds":0.0,"last_synced_at":"2026-04-30T10:22:03.994Z","last_synced_commit":"e68d8921ddb0bfdfc6654661beef35332788784d","created_at":"2023-03-07T11:39:39.586Z","updated_at":"2026-04-30T10:22:02.584Z","committers":[{"name":"Michael Jackson","email":"mjijackson@gmail.com","login":"mjackson","count":330},{"name":"Bernard Lambeau","email":"blambeau@gmail.com","login":"blambeau","count":26},{"name":"Evan Phoenix","email":"ephoenix@engineyard.com","login":null,"count":16},{"name":"Joachim Mårtensson","email":"joachimmartensson@gmail.com","login":"joachimm","count":5},{"name":"kylc","email":"kcesare@gmail.com","login":"kylc","count":2},{"name":"Tobias Bühlmann","email":"tobias.buehlmann@gmx.de","login":"tbuehlmann","count":1},{"name":"Mark Wilden","email":"mark@mwilden.com","login":"mwilden","count":1},{"name":"Emiliano Mancuso","email":"emiliano.mancuso@gmail.com","login":"emancu","count":1},{"name":"Clifford Heath","email":"clifford.heath@gmail.com","login":"cjheath","count":1},{"name":"Andrew Nesbitt","email":"andrewnez@gmail.com","login":"andrew","count":1}],"past_year_committers":[],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-01T00:00:07.988Z","repositories_count":6224015,"commits_count":900110213,"contributors_count":34903473,"owners_count":1147647,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"mjackson/citrus","html_url":"https://github.com/mjackson/citrus","last_synced_at":"2026-04-22T22:01:12.447Z","status":"error","issues_count":48,"pull_requests_count":16,"avg_time_to_close_issue":16948378.051282052,"avg_time_to_close_pull_request":24523866.384615384,"issues_closed_count":39,"pull_requests_closed_count":13,"pull_request_authors_count":12,"issue_authors_count":39,"avg_comments_per_issue":2.2916666666666665,"avg_comments_per_pull_request":2.0,"merged_pull_requests_count":9,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-12T09:02:21.815Z","updated_at":"2026-04-22T22:01:12.448Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/mjackson%2Fcitrus/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":43,"COLLABORATOR":3,"CONTRIBUTOR":2},"pull_request_author_associations_count":{"CONTRIBUTOR":7,"NONE":5,"COLLABORATOR":4},"issue_authors":{"ehahn9":5,"blambeau":3,"blowback":2,"rejeep":2,"zipizap":2,"glenjamin":1,"rposborne":1,"rubydesign":1,"djwonk":1,"clamoris":1,"ryanstout":1,"xrl":1,"rogerbraun":1,"singpolyma":1,"bararchy":1,"artob":1,"dbarowy":1,"vnluc":1,"febeling":1,"emancu":1,"geeksam":1,"preston":1,"jeffbski":1,"seeflanigan":1,"josephwecker":1,"lightscalar":1,"beedub":1,"aardvarkk":1,"FrankDMartinez":1,"xxx":1,"sriram-srinivasan":1,"kevincui1993":1,"yfeldblum":1,"ghost":1,"mwilden":1,"dbose":1,"csabahenk":1,"ognevsky":1,"fcbr":1},"pull_request_authors":{"blambeau":4,"joachimm":2,"kylc":1,"emancu":1,"gilesbowkett":1,"flavorjones":1,"andrew":1,"tas50":1,"tbuehlmann":1,"mwilden":1,"yassun4dev":1,"rubydesign":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-30T00:00:06.639Z","repositories_count":14451054,"issues_count":34181458,"pull_requests_count":112144379,"authors_count":11249517,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{},"past_year_pull_request_authors":{},"maintainers":[{"login":"blambeau","count":7,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/blambeau"}],"active_maintainers":[]},"events":{"total":{"WatchEvent":6},"last_year":{"WatchEvent":4}},"keywords":[],"dependencies":[{"ecosystem":"rubygems","filepath":"citrus.gemspec","sha":null,"kind":"manifest","created_at":"2022-08-16T11:25:07.983Z","updated_at":"2022-08-16T11:25:07.983Z","repository_link":"https://github.com/mjackson/citrus/blob/master/citrus.gemspec","dependencies":[{"id":1851577292,"package_name":"rake","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false},{"id":1851577293,"package_name":"test-unit","ecosystem":"rubygems","requirements":"\u003e= 0","direct":true,"kind":"development","optional":false}]}],"score":null,"created_at":"2024-12-15T21:38:08.514Z","updated_at":"2026-05-01T02:00:45.668Z","avatar_url":"https://github.com/mjackson.png","language":"Ruby","monthly_downloads":0,"readme":"Citrus :: Parsing Expressions for Ruby\n\nCitrus is a compact and powerful parsing library for\n[Ruby](http://ruby-lang.org/) that combines the elegance and expressiveness of\nthe language with the simplicity and power of\n[parsing expressions](http://en.wikipedia.org/wiki/Parsing_expression_grammar).\n\n\n# Installation\n\n\nVia [RubyGems](http://rubygems.org/):\n\n    $ gem install citrus\n\nFrom a local copy:\n\n    $ git clone git://github.com/mjackson/citrus.git\n    $ cd citrus\n    $ rake package install\n\n\n# Background\n\n\nIn order to be able to use Citrus effectively, you must first understand the\ndifference between syntax and semantics. Syntax is a set of rules that govern\nthe way letters and punctuation may be used in a language. For example, English\nsyntax dictates that proper nouns should start with a capital letter and that\nsentences should end with a period.\n\nSemantics are the rules by which meaning may be derived in a language. For\nexample, as you read a book you are able to make some sense of the particular\nway in which words on a page are combined to form thoughts and express ideas\nbecause you understand what the words themselves mean and you understand what\nthey mean collectively.\n\nComputers use a similar process when interpreting code. First, the code must be\nparsed into recognizable symbols or tokens. These tokens may then be passed to\nan interpreter which is responsible for forming actual instructions from them.\n\nCitrus is a pure Ruby library that allows you to perform both lexical analysis\nand semantic interpretation quickly and easily. Using Citrus you can write\npowerful parsers that are simple to understand and easy to create and maintain.\n\nIn Citrus, there are three main types of objects: rules, grammars, and matches.\n\n## Rules\n\nA [Rule](http://mjackson.github.io/citrus/api/classes/Citrus/Rule.html) is an object\nthat specifies some matching behavior on a string. There are two types of rules:\nterminals and non-terminals. Terminals can be either Ruby strings or regular\nexpressions that specify some input to match. For example, a terminal created\nfrom the string \"end\" would match any sequence of the characters \"e\", \"n\", and\n\"d\", in that order. Terminals created from regular expressions may match any\nsequence of characters that can be generated from that expression.\n\nNon-terminals are rules that may contain other rules but do not themselves match\ndirectly on the input. For example, a Repeat is a non-terminal that may contain\none other rule that will try and match a certain number of times. Several other\ntypes of non-terminals are available that will be discussed later.\n\nRule objects may also have semantic information associated with them in the form\nof Ruby modules. Rules use these modules to extend the matches they create.\n\n## Grammars\n\nA [Grammar](http://mjackson.github.io/citrus/api/classes/Citrus/Grammar.html) is a\ncontainer for rules. Usually the rules in a grammar collectively form a complete\nspecification for some language, or a well-defined subset thereof.\n\nA Citrus grammar is really just a souped-up Ruby\n[module](http://ruby-doc.org/core/classes/Module.html). These modules may be\nincluded in other grammar modules in the same way that Ruby modules are normally\nused. This property allows you to divide a complex grammar into more manageable,\nreusable pieces that may be combined at runtime. Any rule with the same name as\na rule in an included grammar may access that rule with a mechanism similar to\nRuby's `super` keyword.\n\n## Matches\n\nA [Match](http://mjackson.github.io/citrus/api/classes/Citrus/Match.html) object\nrepresents a successful recognition of some piece of the input. Matches are\ncreated by rule objects during a parse.\n\nMatches are arranged in a tree structure where any match may contain any number\nof other matches. Each match contains information about its own subtree. The\nstructure of the tree is determined by the way in which the rule that generated\neach match is used in the grammar. For example, a match that is created from a\nnonterminal rule that contains several other terminals will likewise contain\nseveral matches, one for each terminal. However, this is an implementation\ndetail and should be relatively transparent to the user.\n\nMatch objects may be extended with semantic information in the form of methods.\nThese methods should provide various interpretations for the semantic value of a\nmatch.\n\n\n# Syntax\n\n\nThe most straightforward way to compose a Citrus grammar is to use Citrus' own\ncustom grammar syntax. This syntax borrows heavily from Ruby, so it should\nalready be familiar to Ruby programmers.\n\n## Terminals\n\nTerminals may be represented by a string or a regular expression. Both follow\nthe same rules as Ruby string and regular expression literals.\n\n    'abc'         # match \"abc\"\n    \"abc\\n\"       # match \"abc\\n\"\n    /abc/i        # match \"abc\" in any case\n    /\\xFF/        # match \"\\xFF\"\n\nCharacter classes and the dot (match anything) symbol are supported as well for\ncompatibility with other parsing expression implementations.\n\n    [a-z0-9]      # match any lowercase letter or digit\n    [\\x00-\\xFF]   # match any octet\n    .             # match any single character, including new lines\n\nAlso, strings may use backticks instead of quotes to indicate that they should\nmatch in a case-insensitive manner.\n\n    `abc`         # match \"abc\" in any case\n\nBesides case sensitivity, case-insensitive strings have the same behavior as\ndouble quoted strings.\n\nSee [Terminal](http://mjackson.github.io/citrus/api/classes/Citrus/Terminal.html) and\n[StringTerminal](http://mjackson.github.io/citrus/api/classes/Citrus/StringTerminal.html)\nfor more information.\n\n## Repetition\n\nQuantifiers may be used after any expression to specify a number of times it\nmust match. The universal form of a quantifier is `N*M` where `N` is the minimum\nand `M` is the maximum number of times the expression may match.\n\n    'abc'1*2      # match \"abc\" a minimum of one, maximum of two times\n    'abc'1*       # match \"abc\" at least once\n    'abc'*2       # match \"abc\" a maximum of twice\n\nAdditionally, the minimum and maximum may be omitted entirely to specify that an\nexpression may match zero or more times.\n\n    'abc'*        # match \"abc\" zero or more times\n\nThe `+` and `?` operators are supported as well for the common cases of `1*` and\n`*1` respectively.\n\n    'abc'+        # match \"abc\" one or more times\n    'abc'?        # match \"abc\" zero or one time\n\nSee [Repeat](http://mjackson.github.io/citrus/api/classes/Citrus/Repeat.html) for\nmore information.\n\n## Lookahead\n\nBoth positive and negative lookahead are supported in Citrus. Use the `\u0026` and\n`!` operators to indicate that an expression either should or should not match.\nIn neither case is any input consumed.\n\n    'a' \u0026'b'      # match an \"a\" that is followed by a \"b\"\n    'a' !'b'      # match an \"a\" that is not followed by a \"b\"\n    !'a' .        # match any character except for \"a\"\n\nA special form of lookahead is also supported which will match any character\nthat does not match a given expression.\n\n    ~'a'          # match all characters until an \"a\"\n    ~/xyz/        # match all characters until /xyz/ matches\n\nWhen using this operator (the tilde), at least one character must be consumed\nfor the rule to succeed.\n\nSee [AndPredicate](http://mjackson.github.io/citrus/api/classes/Citrus/AndPredicate.html),\n[NotPredicate](http://mjackson.github.io/citrus/api/classes/Citrus/NotPredicate.html),\nand [ButPredicate](http://mjackson.github.io/citrus/api/classes/Citrus/ButPredicate.html)\nfor more information.\n\n## Sequences\n\nSequences of expressions may be separated by a space to indicate that the rules\nshould match in that order.\n\n    'a' 'b' 'c'   # match \"a\", then \"b\", then \"c\"\n    'a' [0-9]     # match \"a\", then a numeric digit\n\nSee [Sequence](http://mjackson.github.io/citrus/api/classes/Citrus/Sequence.html)\nfor more information.\n\n## Choices\n\nOrdered choice is indicated by a vertical bar that separates two expressions.\nWhen using choice, each expression is tried in order. When one matches, the\nrule returns the match immediately without trying the remaining rules.\n\n    'a' | 'b'       # match \"a\" or \"b\"\n    'a' 'b' | 'c'   # match \"a\" then \"b\" (in sequence), or \"c\"\n\nIt is important to note when using ordered choice that any operator binds more\ntightly than the vertical bar. A full chart of operators and their respective\nlevels of precedence is below.\n\nSee [Choice](http://mjackson.github.io/citrus/api/classes/Citrus/Choice.html) for\nmore information.\n\n## Labels\n\nMatch objects may be referred to by a different name than the rule that\noriginally generated them. Labels are added by placing the label and a colon\nimmediately preceding any expression.\n\n    chars:/[a-z]+/  # the characters matched by the regular expression\n                    # may be referred to as \"chars\" in an extension\n                    # method\n\n## Extensions\n\nExtensions may be specified using either \"module\" or \"block\" syntax. When using\nmodule syntax, specify the name of a module that is used to extend match objects\nin between less than and greater than symbols.\n\n    [a-z0-9]5*9 \u003cCouponCode\u003e  # match a string that consists of any lower\n                              # cased letter or digit between 5 and 9\n                              # times and extend the match with the\n                              # CouponCode module\n\nAdditionally, extensions may be specified inline using curly braces. When using\nthis method, the code inside the curly braces may be invoked by calling the\n`value` method on the match object.\n\n    [0-9] { to_str.to_i }     # match any digit and return its integer value when\n                              # calling the #value method on the match object\n\nNote that when using the inline block method you may also specify arguments in\nbetween vertical bars immediately following the opening curly brace, just like\nin Ruby blocks.\n\n## Super\n\nWhen including a grammar inside another, all rules in the child that have the\nsame name as a rule in the parent also have access to the `super` keyword to\ninvoke the parent rule.\n\n    grammar Number\n      rule number\n        [0-9]+\n      end\n    end\n\n    grammar FloatingPoint\n      include Number\n\n      rule number\n        super ('.' super)?\n      end\n    end\n\nIn the example above, the `FloatingPoint` grammar includes `Number`. Both have a\nrule named `number`, so `FloatingPoint#number` has access to `Number#number` by\nmeans of using `super`.\n\nSee [Super](http://mjackson.github.io/citrus/api/classes/Citrus/Super.html) for more\ninformation.\n\n## Precedence\n\nThe following table contains a list of all Citrus symbols and operators and\ntheir precedence. A higher precedence indicates tighter binding.\n\nOperator                  | Name                      | Precedence\n------------------------- | ------------------------- | ----------\n`''`                      | String (single quoted)    | 7\n`\"\"`                      | String (double quoted)    | 7\n\u003ccode\u003e``\u003c/code\u003e           | String (case insensitive) | 7\n`[]`                      | Character class           | 7\n`.`                       | Dot (any character)       | 7\n`//`                      | Regular expression        | 7\n`()`                      | Grouping                  | 7\n`*`                       | Repetition (arbitrary)    | 6\n`+`                       | Repetition (one or more)  | 6\n`?`                       | Repetition (zero or one)  | 6\n`\u0026`                       | And predicate             | 5\n`!`                       | Not predicate             | 5\n`~`                       | But predicate             | 5\n`\u003c\u003e`                      | Extension (module name)   | 4\n`{}`                      | Extension (literal)       | 4\n`:`                       | Label                     | 3\n`e1 e2`                   | Sequence                  | 2\n\u003ccode\u003ee1 \u0026#124; e2\u003c/code\u003e | Ordered choice            | 1\n\n## Grouping\n\nAs is common in many programming languages, parentheses may be used to override\nthe normal binding order of operators. In the following example parentheses are\nused to make the vertical bar between `'b'` and `'c'` bind tighter than the\nspace between `'a'` and `'b'`.\n\n    'a' ('b' | 'c')   # match \"a\", then \"b\" or \"c\"\n\n\n# Example\n\n\nBelow is an example of a simple grammar that is able to parse strings of\nintegers separated by any amount of white space and a `+` symbol.\n\n    grammar Addition\n      rule additive\n        number plus (additive | number)\n      end\n\n      rule number\n        [0-9]+ space\n      end\n\n      rule plus\n        '+' space\n      end\n\n      rule space\n        [ \\t]*\n      end\n    end\n\nSeveral things to note about the above example:\n\n* Grammar and rule declarations end with the `end` keyword\n* A sequence of rules is created by separating expressions with a space\n* Likewise, ordered choice is represented with a vertical bar\n* Parentheses may be used to override the natural binding order\n* Rules may refer to other rules in their own definitions simply by using the\n  other rule's name\n* Any expression may be followed by a quantifier\n\n## Interpretation\n\nThe grammar above is able to parse simple mathematical expressions such as \"1+2\"\nand \"1 + 2+3\", but it does not have enough semantic information to be able to\nactually interpret these expressions.\n\nAt this point, when the grammar parses a string it generates a tree of\n[Match](http://mjackson.github.io/citrus/api/classes/Citrus/Match.html) objects.\nEach match is created by a rule and may itself be comprised of any number of\nsubmatches.\n\nSubmatches are created whenever a rule contains another rule. For example, in\nthe grammar above `number` matches a string of digits followed by white space.\nThus, a match generated by this rule will contain two submatches.\n\nWe can define a method inside a set of curly braces that will be used to extend\na particular rule's matches. This works in similar fashion to using Ruby's\nblocks. Let's extend the `Addition` grammar using this technique.\n\n    grammar Addition\n      rule additive\n        (number plus term:(additive | number)) {\n          capture(:number).value + capture(:term).value\n        }\n      end\n\n      rule number\n        ([0-9]+ space) {\n          to_str.to_i\n        }\n      end\n\n      rule plus\n        '+' space\n      end\n\n      rule space\n        [ \\t]*\n      end\n    end\n\nIn this version of the grammar we have added two semantic blocks, one each for\nthe `additive` and `number` rules. These blocks contain code that we can\nexecute by calling `value` on match objects that result from those rules. It's\neasiest to explain what is going on here by starting with the lowest level\nblock, which is defined within `number`.\n\nInside this block we see a call to another method, namely `to_str`. When called\nin the context of a match object, this method returns the match's internal\nstring object. Thus, the call to `to_str.to_i` should return the integer value\nof the match.\n\nSimilarly, matches created by `additive` will also have a `value` method. Notice\nthe use of the `term` label within the rule definition. This label allows the\nmatch that is created by the choice between `additive` and `number` to be\nretrieved using `capture(:term)`. The value of an additive match is determined\nto be the values of its `number` and `term` matches added together using Ruby's\naddition operator. Note that the plural form `captures(:term)` can be used to\nget an array of matches for a given label (e.g. when the label belongs to a\nrepetition).\n\nSince `additive` is the first rule defined in the grammar, any match that\nresults from parsing a string with this grammar will have a `value` method that\ncan be used to recursively calculate the collective value of the entire match\ntree.\n\nTo give it a try, save the code for the `Addition` grammar in a file called\naddition.citrus. Next, assuming you have the Citrus\n[gem](https://rubygems.org/gems/citrus) installed, try the following sequence of\ncommands in a terminal.\n\n    $ irb\n    \u003e require 'citrus'\n     =\u003e true\n    \u003e Citrus.load 'addition'\n     =\u003e [Addition]\n    \u003e m = Addition.parse '1 + 2 + 3'\n     =\u003e #\u003cCitrus::Match ...\n    \u003e m.value\n     =\u003e 6\n\nCongratulations! You just ran your first piece of Citrus code.\n\nOne interesting thing to notice about the above sequence of commands is the\nreturn value of [Citrus#load](http://mjackson.github.io/citrus/api/classes/Citrus.html#M000003).\nWhen you use `Citrus.load` to load a grammar file (and likewise\n[Citrus#eval](http://mjackson.github.io/citrus/api/classes/Citrus.html#M000004) to\nevaluate a raw string of grammar code), the return value is an array of all the\ngrammars present in that file.\n\nTake a look at\n[calc.citrus](http://github.com/mjackson/citrus/blob/master/lib/citrus/grammars/calc.citrus)\nfor an example of a calculator that is able to parse and evaluate more complex\nmathematical expressions.\n\n## Additional Methods\n\nIf you need more than just a `value` method on your match object, you can attach\nadditional methods as well. There are two ways to do this. The first lets you\ndefine additional methods inline in your semantic block. This block will be used\nto create a new Module using [Module#new](http://ruby-doc.org/core/classes/Module.html#M001682).\nUsing the `Addition` example above, we might refactor the `additive` rule to\nlook like this:\n\n    rule additive\n      (number plus term:(additive | number)) {\n        def lhs\n          capture(:number).value\n        end\n\n        def rhs\n          capture(:term).value\n        end\n\n        def value\n          lhs + rhs\n        end\n      }\n    end\n\nNow, in addition to having a `value` method, matches that result from the\n`additive` rule will have a `lhs` and a `rhs` method as well. Although not\nparticularly useful in this example, this technique can be useful when unit\ntesting more complex rules. For example, using this method you might make the\nfollowing assertions in a unit test:\n\n    match = Addition.parse('1 + 4')\n    assert_equal(1, match.lhs)\n    assert_equal(4, match.rhs)\n    assert_equal(5, match.value)\n\nIf you would like to abstract away the code in a semantic block, simply create\na separate Ruby module (in another file) that contains the extension methods you\nwant and use the angle bracket notation to indicate that a rule should use that\nmodule when extending matches.\n\nTo demonstrate this method with the above example, in a Ruby file you would\ndefine the following module.\n\n    module Additive\n      def lhs\n        capture(:number).value\n      end\n\n      def rhs\n        capture(:term).value\n      end\n\n      def value\n        lhs + rhs\n      end\n    end\n\nThen, in your Citrus grammar file the rule definition would look like this:\n\n      rule additive\n        (number plus term:(additive | number)) \u003cAdditive\u003e\n      end\n\nThis method of defining extensions can help keep your grammar files cleaner.\nHowever, you do need to make sure that your extension modules are already loaded\nbefore using `Citrus.load` to load your grammar file.\n\n\n# Testing\n\n\nCitrus was designed to facilitate simple and powerful testing of grammars. To\ndemonstrate how this is to be done, we'll use the `Addition` grammar from our\nprevious [example](example.html). The following code demonstrates a simple test\ncase that could be used to test that our grammar works properly.\n\n    class AdditionTest \u003c Test::Unit::TestCase\n      def test_additive\n        match = Addition.parse('23 + 12', :root =\u003e :additive)\n        assert(match)\n        assert_equal('23 + 12', match)\n        assert_equal(35, match.value)\n      end\n\n      def test_number\n        match = Addition.parse('23', :root =\u003e :number)\n        assert(match)\n        assert_equal('23', match)\n        assert_equal(23, match.value)\n      end\n    end\n\nThe key here is using the `:root` option when performing the parse to specify\nthe name of the rule at which the parse should start. In `test_number`, since\n`:number` was given the parse will start at that rule as if it were the root\nrule of the entire grammar. The ability to change the root rule on the fly like\nthis enables easy unit testing of the entire grammar.\n\nAlso note that because match objects are themselves strings, assertions may be\nmade to test equality of match objects with string values.\n\n## Debugging\n\nWhen a parse fails, a [ParseError](http://mjackson.github.io/citrus/api/classes/Citrus/ParseError.html)\nobject is generated which provides a wealth of information about exactly where\nthe parse failed including the offset, line number, line text, and line offset.\nUsing this object, you could possibly provide some useful feedback to the user\nabout why the input was bad. The following code demonstrates one way to do this.\n\n    def parse_some_stuff(stuff)\n      match = StuffGrammar.parse(stuff)\n    rescue Citrus::ParseError =\u003e e\n      raise ArgumentError, \"Invalid stuff on line %d, offset %d!\" %\n        [e.line_number, e.line_offset]\n    end\n\nIn addition to useful error objects, Citrus also includes a means of visualizing\nmatch trees in the console via `Match#dump`. This can help when determining\nwhich rules are generating which matches and how they are organized in the\nmatch tree.\n\n\n# Extras\n\n\nSeveral files are included in the Citrus repository that make it easier to work\nwith grammar files in various editors.\n\n## TextMate\n\nTo install the Citrus [TextMate](http://macromates.com/) bundle, simply\ndouble-click on the `Citrus.tmbundle` file in the `extras` directory.\n\n## Vim\n\nTo install the [Vim](http://www.vim.org/) scripts, copy the files in\n`extras/vim` to a directory in Vim's\n[runtimepath](http://vimdoc.sourceforge.net/htmldoc/options.html#\\'runtimepath\\').\n\n\n# Examples\n\n\nThe project source directory contains several example scripts that demonstrate\nhow grammars are to be constructed and used. Each Citrus file in the examples\ndirectory has an accompanying Ruby file that contains a suite of tests for that\nparticular file.\n\nThe best way to run any of these examples is to pass the name of the Ruby file\ndirectly to the Ruby interpreter on the command line, e.g.:\n\n    $ ruby -Ilib examples/calc_test.rb\n\nThis particular invocation uses the `-I` flag to ensure that you are using the\nversion of Citrus that was bundled with that particular example file (i.e. the\nversion that is contained in the `lib` directory).\n\n\n# Links\n\n\nDiscussion around Citrus happens on the [citrus-users Google group](http://groups.google.com/group/citrus-users).\n\nThe primary resource for all things to do with parsing expressions can be found\non the original [Packrat and Parsing Expression Grammars page](http://pdos.csail.mit.edu/~baford/packrat)\nat MIT.\n\nAlso, a useful summary of parsing expression grammars can be found on\n[Wikipedia](http://en.wikipedia.org/wiki/Parsing_expression_grammar).\n\nCitrus draws inspiration from another Ruby library for writing parsing\nexpression grammars, Treetop. While Citrus' syntax is similar to that of\n[Treetop](http://treetop.rubyforge.org), it's not identical. The link is\nincluded here for those who may wish to explore an alternative implementation.\n\n\n# License\n\n\nCopyright 2010-2011 Michael Jackson\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nThe software is provided \"as is\", without warranty of any kind, express or\nimplied, including but not limited to the warranties of merchantability,\nfitness for a particular purpose and non-infringement. In no event shall the\nauthors or copyright holders be liable for any claim, damages or other\nliability, whether in an action of contract, tort or otherwise, arising from,\nout of or in connection with the software or the use or other dealings in\nthe software.\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["rubygems","sinatra","rack","activejob","activerecord","mvc","feature-flag"],"project_url":"https://ruby.ecosyste.ms/api/v1/projects/615","html_url":"https://ruby.ecosyste.ms/projects/615"}