{"id":15010315,"url":"https://github.com/wall-brew-co/bouncer","last_synced_at":"2026-02-21T15:01:23.301Z","repository":{"id":255688845,"uuid":"853401338","full_name":"Wall-Brew-Co/bouncer","owner":"Wall-Brew-Co","description":"A Leiningen plugin to manage Leiningen","archived":false,"fork":false,"pushed_at":"2026-02-17T12:31:02.000Z","size":764,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-17T17:57:04.497Z","etag":null,"topics":["clojure","lein-plugin","leiningen"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/Wall-Brew-Co.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","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}},"created_at":"2024-09-06T15:26:18.000Z","updated_at":"2026-02-17T12:31:04.000Z","dependencies_parsed_at":"2024-09-06T18:45:12.867Z","dependency_job_id":"96eace78-0411-4604-b5bf-efa9daf30861","html_url":"https://github.com/Wall-Brew-Co/bouncer","commit_stats":null,"previous_names":["wall-brew-co/bouncer"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Wall-Brew-Co/bouncer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Fbouncer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Fbouncer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Fbouncer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Fbouncer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Wall-Brew-Co","download_url":"https://codeload.github.com/Wall-Brew-Co/bouncer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Wall-Brew-Co%2Fbouncer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29684061,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T14:31:22.911Z","status":"ssl_error","status_checked_at":"2026-02-21T14:31:22.570Z","response_time":107,"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"}},"keywords":["clojure","lein-plugin","leiningen"],"created_at":"2024-09-24T19:33:30.566Z","updated_at":"2026-02-21T15:01:23.287Z","avatar_url":"https://github.com/Wall-Brew-Co.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bouncer\n\n[![Clojars Project](https://img.shields.io/clojars/v/com.wallbrew/bouncer.svg)](https://clojars.org/com.wallbrew/bouncer)\n[![GitHub](https://img.shields.io/github/license/Wall-Brew-Co/bouncer)](https://github.com/Wall-Brew-Co/bouncer/blob/master/LICENSE)\n[![Twitter Follow](https://img.shields.io/twitter/follow/WallBrew?style=social)](https://twitter.com/WallBrew)\n\nA Wall Brew [Leiningen](https://leiningen.org/) plugin for managing Wall Brew Leiningen projects.\n\n## Rationale\n\nThe [Wall Brew Open Source Standard](https://github.com/Wall-Brew-Co/open-source?tab=readme-ov-file#automating-opinions) encourages development standards to be automated wherever possible.\nFor Wall Brew projects, that often relies on a collection of Leiningen plugins and consistency across project.clj files.\nTo automate the consistency checks, Bouncer is able to:\n\n* Inspect the [licensing information](https://github.com/Wall-Brew-Co/open-source?tab=readme-ov-file#licensing)\n* Inspect the Leiningen plugins used for our standard [CI/CD jobs](https://github.com/Wall-Brew-Co/rebroadcast/tree/master/sources/github-actions)\n\n### Naming\n\nBouncers are security guards at bars that make sure all patrons are following the rules.\n\n## Installation\n\nBouncer is available as a leiningen plugin and can be downloaded from [clojars](https://clojars.org/com.wallbrew/bouncer).\nTo install Bouncer, add the following in your `:plugins` list in your `project.clj` file:\n\n```clj\n[com.wallbrew/bouncer \"1.0.0\"]\n```\n\nThe first time you invoke this plugin, Leiningen will automatically fetch the dependency for you.\nWall Brew projects should come with this dependency pre-installed.\nNon-Wall Brew projects are free to use this plugin if they want to follow our development practices as well.\n\n## Usage\n\nFrom the root of your project directory, you may invoke the following commands:\n\n* `init` - To initialize Nouncer with a config file (if not present)\n* `check` - To validate Bouncer's rules against the current Leiningen project\n* `fix` - To automatically fix any issues that Bouncer can resolve\n* `help` - To view the help text of Bouncer or any command\n\nCommands may accept several options,  which can be configured by the command line arguments passed in or in [project configuration](#configuration).\nIn all cases, the options will follow this order of precedence:\n\n1. Arguments passed by command line\n2. Values stored in configuration\n3. Default values in bouncer's implementation\n\n### Initialize Bouncer\n\nBouncer stores its configuration at `.bouncer/config.edn`.\nSince new projects will not have this directory by default, Bouncer may create it for you.\n\n```sh\n$ lein bouncer init\nNo configuration file found. Assuming default configuration.\nWriting to .bouncer/config.edn\n$ ls .bouncer -l\ntotal 4\n-rw-r--r-- 1 nnichols nnichols 1002 Sep 20 10:08 config.edn\n```\n\nIf the `.bouncer` directory already exists, bouncer will perform no actions.\n\n```sh\n$ lein bouncer init\nReading from .bouncer/config.edn\nExisting Bouncer configuration found.\n```\n\n\n### Check A Project With Bouncer\n\nBouncer's configuration contains a collection of rules to run against a project.\nWhile rules may support additional data for configuration, each rule must support the following keys:\n\n* `:comment` - A human readable string describing the rule's purpose or intent.\n* `:disabled` - A boolean indicating if the rule is disabled. If the key is not present, the rule is assumed to be enabled.\n* `:reason` - A human readable string describing why a particular rule has been disabled. If `:disabled` is true, this value must be present.\n\nIf bouncer successfully validates all rules, it will print information about the checks it has performed and exit with a 0 status code.\n\n```sh\n$ lein bouncer check\nReading from .bouncer/config.edn\nChecking project.clj against Wall Brew standards...\nPASS: License information is valid.\nWARN: Some plugins rules are disabled. Skipping...\nPASS: Plugins information is valid.\nPASS: Project conforms to all rules.\n```\n\nIf bouncer cannot validate a rule, it will print one or more failure messages and exit with a 1 status code.\n\n```sh\n$ lein bouncer check\nReading from .bouncer/config.edn\nChecking project.clj against Wall Brew standards...\nPASS: License information is valid.\nFAIL: One or plugins not installed: (\"lein-cljsbuild\")\nFAIL: Project does not conform to one or more rules.\n```\n\nBouncer currently validates the following rules:\n\n#### Licensing Information\n\n- Rule Path `[:project-rules :license]`\n\nVerifies that the root `project.clj` contains the following `:license` block (or one equivalent to it):\n\n```clj\n{:name         \"MIT\"\n :url          \"https://opensource.org/licenses/MIT\"\n :distribution :repo\n :comments     \"Same-as all Wall-Brew projects\"}\n```\n\nThis renders the license information in the project's `pom.xml`, which is automatically scanned by license checking tools such as [Snyk](https://docs.snyk.io/).\n\n#### Leiningen Plugins\n\n- Rule Path `[:project-rules :plugins]`\n\nVerifies that the root `project.clj` contains the following `plugins`.\nThis list is not exclusive, and a project may define additional tools; however, these tools are rquired by our GitHub Actions.\n\n- `com.wallbrew/lein-sealog` - The default [changelog management tool](https://github.com/Wall-Brew-Co/lein-sealog)\n- `com.github.clj-kondo/lein-clj-kondo` - The default [linter plugin](https://github.com/clj-kondo/lein-clj-kondo)\n- `mvxcvi/cljstyle` - The default [code formatter](https://github.com/greglook/cljstyle)\n- `lein-cljsbuild` - The default [Clojurescript build tool](https://clojars.org/lein-cljsbuild)\n\nIndividual plugin checks may set a `:disabled` key to opt-out on unrequired plugins.\nFor example, [clj-xml](https://github.com/Wall-Brew-Co/clj-xml) would opt-out of the `lein-cljsbuild` plugin since it is only available for JVM-based Clojure.\nLike all higher-level rules, disabled plugins must also provide a `:reason`.\n\n### Fix A Project With Bouncer\n\nBouncer can automatically fix some issues that it detects.\nThis is useful for projects that are not yet compliant with Wall Brew standards.\nBouncer's configuration contains a collection of rules to run against a project.\nWhile rules may support additional data for configuration, each rule must support the following keys:\n\n* `:comment` - A human readable string describing the rule's purpose or intent.\n* `:disabled` - A boolean indicating if the rule is disabled. If the key is not present, the rule is assumed to be enabled.\n* `:reason` - A human readable string describing why a particular rule has been disabled. If `:disabled` is true, this value must be present.\n\nIf bouncer successfully fixes the issues described by the rules, it will exit with a 0 status code.\n\nBouncer currently validates the following rules:\n\n#### Namespace Sorting\n\n- Rule Path `[:fixes :namespace-sorting]`\n\nEnsures that the `:require` blocks in each namespace declaration are sorted alphabetically.\n\n## Configuration\n\nMany of Bouncer's commands may be modified at execution time with additional arguments.\nAs of version `1.1.0`, Bouncer will inspect the following locations for configuration.\nThe first location found will be used, and the others will be ignored:\n\n- The `:bouncer` key in the project's `project.clj` file\n- The `.bouncer/config.edn` file, relative to the project's root\n- The `.wallbrew/bouncer/config.edn` file, relative to the project's root\n- The default configuration that would be written by `lein bouncer init`\n\nBouncer will create this file while executing `lein bouncer init` if no prior Bouncer configuration file is detected.\nThe file will be created with the defaults outlined in this README.\n\nWhen reading configuration, Bouncer will merge the above configurations with the default configuration- preferring values set in the configuration file over the defaults.\nThis allows for a project to override the default configuration with a project-specific configuration, without needing to duplicate the entire configuration.\nAdditionally, this prevents the need to update the configuration as new rules are added to Bouncer.\n\n## License\n\nCopyright © [Wall Brew Co](https://wallbrew.com/)\n\nThis software is provided for free, public use as outlined in the [MIT License](https://github.com/Wall-Brew-Co/bouncer/blob/master/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwall-brew-co%2Fbouncer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwall-brew-co%2Fbouncer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwall-brew-co%2Fbouncer/lists"}