{"id":13801019,"url":"https://github.com/scallop/scallop","last_synced_at":"2026-04-08T13:32:03.881Z","repository":{"id":2800676,"uuid":"3801274","full_name":"scallop/scallop","owner":"scallop","description":"a simple Scala CLI parsing library","archived":false,"fork":false,"pushed_at":"2025-11-30T06:59:37.000Z","size":3834,"stargazers_count":682,"open_issues_count":8,"forks_count":58,"subscribers_count":14,"default_branch":"develop","last_synced_at":"2025-12-21T02:41:07.455Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scallop.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"patreon":"Rogach"}},"created_at":"2012-03-22T19:17:41.000Z","updated_at":"2025-12-13T07:30:12.000Z","dependencies_parsed_at":"2022-08-06T12:31:28.912Z","dependency_job_id":"d5ad05bd-2675-4d6b-a318-82305c4e799a","html_url":"https://github.com/scallop/scallop","commit_stats":{"total_commits":523,"total_committers":25,"mean_commits":20.92,"dds":"0.18738049713193117","last_synced_commit":"72a7fee55a448e9e1ab27e379238650a3fd089f6"},"previous_names":["rogach/scallop"],"tags_count":69,"template":false,"template_full_name":null,"purl":"pkg:github/scallop/scallop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scallop%2Fscallop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scallop%2Fscallop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scallop%2Fscallop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scallop%2Fscallop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scallop","download_url":"https://codeload.github.com/scallop/scallop/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scallop%2Fscallop/sbom","scorecard":{"id":124922,"data":{"date":"2025-08-04","repo":{"name":"github.com/scallop/scallop","commit":"0f290269a69e22068629294c864ad2bd9a2c3ff1"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":3.6,"checks":[{"name":"Code-Review","score":2,"reason":"Found 5/24 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/scallop/scallop/ci.yml/develop?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/scallop/scallop/ci.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/scallop/scallop/ci.yml/develop?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/scallop/scallop/ci.yml/develop?enable=pin","Info:   0 out of   3 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license.txt:0","Info: FSF or OSI recognized license: MIT License: license.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'develop'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 11 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T03:33:45.695Z","repository_id":2800676,"created_at":"2025-08-16T03:33:45.695Z","updated_at":"2025-08-16T03:33:45.695Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31558380,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T10:21:54.569Z","status":"ssl_error","status_checked_at":"2026-04-08T10:21:38.171Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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"}},"keywords":[],"created_at":"2024-08-04T00:01:18.637Z","updated_at":"2026-04-08T13:32:03.857Z","avatar_url":"https://github.com/scallop.png","language":"Scala","funding_links":["https://patreon.com/Rogach"],"categories":["Table of Contents","Console"],"sub_categories":["Command Line Interfaces"],"readme":"Scallop\n========\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/scallop/scallop/ci.yml)](https://github.com/scallop/scallop/actions?query=workflow%3A%22Continuous+Integration%22)\n\nA simple command-line arguments parsing library for Scala.\nCross-built for Scala 3.7+, 2.13, 2.12, 2.11, 2.10, supports Scala Native and Scala JS.\n\nScallop supports:\n\n* flag, single-value and multiple value options\n* POSIX-style short option names (-a) with grouping (-abc)\n* GNU-style long option names (--opt, --opt=value)\n* unnamed integer options, like GNU tail (-42)\n* Property arguments (-Dkey=value, -D key1=value key2=value)\n* Non-string types of options and properties values (with extendable converters)\n* Powerful matching on trailing args\n* Subcommands\n\nFor more info and information on usage, you can look into the [project wiki](https://github.com/scallop/scallop/wiki) or consult the [API docs](https://scallop.github.io/scallop/api/org/rogach/scallop.html).\n\nAlso, I wrote a [blog post](http://blog.rogach.org/2012/04/better-cli-option-parsing-in-scala.html) and [another one](http://blog.rogach.org/2012/04/configuration-objects-in-scallop.html) about Scallop.\n\nInstallation\n============\n\nAdd following to your build.sbt:\n\n```scala\nlibraryDependencies += \"org.rogach\" %% \"scallop\" % \"6.0.0\"\n```\n\nFor use with Scala Native and Scala.js, use `%%%`:\n\n```scala\nlibraryDependencies += \"org.rogach\" %%% \"scallop\" % \"6.0.0\"\n```\n\nIf you were using `5.x` version or older, please see [migration notes](https://github.com/scallop/scallop/wiki/Migration-notes).\n\nQuick example\n=============\n\n```scala\nimport org.rogach.scallop._\n\nclass Conf(arguments: Seq[String]) extends ScallopConf(arguments) {\n  val apples = opt[Int](required = true)\n  val bananas = opt[Int]()\n  val name = trailArg[String]()\n  verify()\n}\n\nobject Main {\n  def main(args: Array[String]) {\n    val conf = new Conf(args)\n    println(\"apples are: \" + conf.apples())\n  }\n}\n```\n\nThis snippet above defined simple configuration that will parse argument lines like these:\n\n```\n--apples 4 --bananas 10 strangeTree\n-a 4 appleTree\n```\n\nFor more examples, you can look at Scallop's [wiki](https://github.com/scallop/scallop/wiki) and [test suite](./jvm/src/test/scala).\n\nFancy things\n============\n\nScallop supports quite powerful matching on trailing arguments. For example:\n\n```scala\nobject Conf extends ScallopConf(\n       List(\"-Ekey1=value1\", \"key2=value2\", \"key3=value3\",\n            \"first\", \"1\",\"2\",\"3\",\"second\",\"4\",\"5\",\"6\")) {\n  val properties = props[String]('E')\n  val firstListName = trailArg[String]()\n  val firstList = trailArg[List[Int]]()\n  val secondListName = trailArg[String]()\n  val secondList = trailArg[List[Double]]()\n  verify()\n}\nConf.properties(\"key1\") shouldBe \"value1\"\nConf.firstListName() shouldBe \"first\"\nConf.secondListName() shouldBe \"second\"\nConf.firstList() shouldBe List(1,2,3)\nConf.secondList() shouldBe List[Double](4,5,6)\n```\n\nIn this case, Scallop's backtracking parser is clever enough to distinguish the boundaries of the arguments lists.\n\nAlso, Scallop supports parsing of subcommands. Not only subcommands, but nested subcommands!\n\n```scala\nobject Conf extends ScallopConf(Seq(\"sub1\", \"sub2\", \"sub3\", \"sub4\", \"win!\")) {\n  object sub1 extends Subcommand(\"sub1\") {\n    object sub2 extends Subcommand(\"sub2\") {\n      object sub3 extends Subcommand(\"sub3\") {\n        object sub4 extends Subcommand(\"sub4\") {\n          val opts = trailArg[List[String]]()\n        }\n        addSubcommand(sub4)\n      }\n      addSubcommand(sub3)\n    }\n    addSubcommand(sub2)\n  }\n  addSubcommand(sub1)\n  verify()\n}\nConf.subcommands shouldBe List(Conf.sub1, Conf.sub1.sub2, Conf.sub1.sub2.sub3, Conf.sub1.sub2.sub3.sub4)\nConf.sub1.sub2.sub3.sub4.opts() shouldBe List(\"win!\")\n```\n\nThanks\n======\n* [Alexy Khrabrov](https://github.com/alexy)\n\n... and the whole Scala community for help and explanations.\n\nNotes\n=====\n\nScallop is distributed under [MIT license](./license.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscallop%2Fscallop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscallop%2Fscallop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscallop%2Fscallop/lists"}