Essential session storage is required to sign in. Optional analytics remain off unless you allow them.
Build a small internal DSL or dynamic library the Ruby way (a config builder, a tiny ORM-style mapper, a validation DSL) and structure it as a real gem. Requirements: (1) use METAPROGRAMMING deliberately — 'define_method' to generate methods, and/or 'method_missing' ALWAYS paired with 'respond_to_missing?' (both, so introspection stays honest); (2) a clean .gemspec plus a Bundler Gemfile; (3) share behavior by mixing in a MODULE (include vs extend chosen correctly); (4) raise CUSTOM exceptions that subclass StandardError (never Exception); (5) a thorough RSpec suite that exercises the DYNAMIC behavior; (6) RuboCop-clean. Document why metaprogramming was the right tool here and the readability trade-off you accepted.
define_method and/or method_missing PAIRED with respond_to_missing?; used purposefully, not gratuitously; behavior stays introspectable.
.gemspec + Bundler; a module mixed in with include/extend chosen correctly; custom exceptions subclass StandardError.
RSpec covers the dynamic/generated behavior; RuboCop-clean; the metaprogramming trade-off is documented.
Use this README structure to make the work reviewable.
DevPath fetches a read-only, size-capped snapshot. Submitted code is never executed.
# A metaprogramming-powered DSL, packaged as a gem ## Goal Build a small internal DSL or dynamic library the Ruby way (a config builder, a tiny ORM-style mapper, a validation DSL) and structure it as a real gem. Requirements: (1) use METAPROGRAMMING deliberately — 'define_method' to generate methods, and/or 'method_missing' ALWAYS paired with 'respond_to_missing?' (both, so introspection stays honest); (2) a clean .gemspec plus a Bundler Gemfile; (3) share behavior by mixing in a MODULE (include vs extend chosen correctly); (4) raise CUSTOM exceptions that subclass StandardError (never Exception); (5) a thorough RSpec suite that exercises the DYNAMIC behavior; (6) RuboCop-clean. Document why metaprogramming was the right tool here and the readability trade-off you accepted. ## Acceptance criteria - [ ] Metaprogramming done right: define_method and/or method_missing PAIRED with respond_to_missing?; used purposefully, not gratuitously; behavior stays introspectable. - [ ] Gem structure: .gemspec + Bundler; a module mixed in with include/extend chosen correctly; custom exceptions subclass StandardError. - [ ] Tests & polish: RSpec covers the dynamic/generated behavior; RuboCop-clean; the metaprogramming trade-off is documented. ## Verification - [ ] Document installation and run commands. - [ ] Record automated checks and their exact commands. - [ ] Add representative output, screenshots, or a short demo where useful. - [ ] Confirm failure paths and known constraints. ## Decision log ### Decision title - Context: - Choice: - Alternatives considered: - Tradeoffs: ## Evidence - Link each rubric criterion to the file, test, or artifact that demonstrates it. ## Known limitations - List what is intentionally out of scope and what should be improved next.