constant_sandbox 0.1.0

Tool for ruby codebases used to enforce boundaries and modularize Rails applications
# constant_sandbox

Constant Sandbox is a cli tool for ruby codebases used to enforce boundaries and modularize Rails applications. Inspired by [packwerk](https://github.com/Shopify/packwerk) but without the rails 6 requirement.

Constant Sandbox can be used to:

* Combine groups of files into packages
* Define package-level constant visibility (i.e. have publicly accessible constants)
* Enforce privacy (inbound) and dependency (outbound) boundaries between packages
* Help existing codebases to become more modular without obstructing development

## Prerequisites

No dependencies are required for your ruby codebase. The [parser library used](https://github.com/lib-ruby-parser/lib-ruby-parser) support ruby 3.0.

## Installation

At this time the only path to install this is using rust's cargo install. I plan on publishing precompiled versions and adding homebrew recipes soon.

## Usage

The primary sub-command to use this tool is `verify`. This looks for `box.yml` files in your codebase that it treats as entry points for packages. These `box.yml` allow you to define what constants this folder exports and imports to the rest of your codebase.

To create your first constant sandbox the `init` command can take a folder and generate values for imports and exports based on your current usage.

```
constant_sandbox init lib/rubrowser/parser
```

You can now verify the box that was created by typing:

```
constant_sandbox verify
```

The last command available is `inspect`. This command evaluates your ruby codebase and outputs to stdout all of the connections that exist to the provided folder. Outputing a box configuration that would cover your current usage. This is useful for learning more about the cohesion of your codebase.

Example output:
```
For more information try --help
../constant_sandbox/target/release/constant_sandbox inspect lib/rubrowser/parser
non exported reference Rubrowser::Parser::Factory found in lib/rubrowser/data.rb on line 26
non imported reference Parser::Builders::Default found in lib/rubrowser/parser/file/builder.rb on line 8
non imported reference Parser::SyntaxError found in lib/rubrowser/parser/file.rb on line 26
non imported reference Parser::Source::Buffer found in lib/rubrowser/parser/file.rb on line 33
non imported reference Encoding::UTF_8 found in lib/rubrowser/parser/file.rb on line 34
non imported reference Parser::CurrentRuby found in lib/rubrowser/parser/file.rb on line 41
non imported reference Parser::AST::Node found in lib/rubrowser/parser/file.rb on line 145
---
imports:
  - "Encoding::UTF_8"
  - "Parser::AST::Node"
  - "Parser::Builders::Default"
  - "Parser::CurrentRuby"
  - "Parser::Source::Buffer"
  - "Parser::SyntaxError"
exports:
  - "Rubrowser::Parser::Factory"

```