canvas-lms/gems/README.md

45 lines
1.6 KiB
Markdown

# Gems
This folder is a place to extract modular functionality from
canvas. Canvas's Gemfile arrangement is enabled to read gems
from this path locally without installing from a remote source. This is valuable for a few reasons:
- it prevents circular dependencies (bundler won't allow it)
- modularized code cannot bind to specific domain concepts on canvas models
- gems can have their specs run independently, without needing to load all
of canvas, saving iteration time
- it allows for eventual build optimization via only running specs for the
transitive closure of parents depending on a gem where a change is.
- it gives ENGINES extracted from canvas (see the "engines" directory) a place
to reference code shared with canvas without it being packaged into the canvas
monolith directly.
There are some tradeoffs:
- spreads canvas over more subdirectories, giving some mental overhad to traversing
the entire codebase.
- modular tests necessarily don't test integration with canvas concepts, so solid integration tests in the app are still a requirement.
- total SERIALIZED build time goes up because each gem loads it's specs in a new process rather than all running within an already booted canvas process.
[TODO] eventually write more on whether we feel like those tradeoffs are good ones,
and what the best practices are to leverage this pattern for max-gain/min-pain.
## Testing
To test all the gems:
```
cd gems
./test_all_gems.sh
```
### To test an individual gem
Run `./test.sh` inside the gem's folder. This is _basically_ the same as:
```bash
cd gems/google_drive
bundle
rspec
```