# 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" ```