Class: Seams::Generators::FollowUpGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/seams/generators/follow_up_generator.rb

Overview

Base class for follow-up generators — net-new generators that extend an already-installed engine without re-templating the whole engine. Subclasses look like:

module Seams
module Generators
  class AddPasskeysGenerator < FollowUpGenerator
    engine_name "auth"

    def add_event
      splice(
        file: "lib/auth/engine.rb",
        marker: "auth.engine.events",
        content: "          Seams::EventRegistry.register(\"identity.passkey_added.auth\", emitted_by: \"Auth\")\n        RUBY\n      )\n    end\n  end\nend\nend\n"

The base class supplies four primitives that every follow-up generator needs:

  • engine_path(relative) — resolve a path inside the host's engines/<this_engine>/ directory.
  • splice(file:, marker:, content:, ...) — wrap Splicer.splice_after_marker with a concise log line.
  • assert_marker_exists!(file:, marker:) — fail fast with a clear "this engine wasn't generated" message when a follow-up generator runs against a host that hasn't installed the target engine.
  • report_summary — template method subclasses override to print a "what just changed" message at the end.

Direct Known Subclasses

Auth::AddOauthProviderGenerator

Class Method Summary collapse

Class Method Details

.engine_name(name = nil) ⇒ Object

Sets the engine this follow-up generator targets. Used by engine_path to resolve relative paths and by assert_marker_exists! to build the recovery hint.



48
49
50
51
52
53
54
# File 'lib/seams/generators/follow_up_generator.rb', line 48

def engine_name(name = nil)
  @engine_name = name if name
  @engine_name || raise(ArgumentError,
                        "#{self.name} must declare `engine_name \"<engine>\"` " \
                        "(e.g. \"auth\") — the base class needs it to resolve " \
                        "engines/<engine>/ paths.")
end