Class: Spree::SubscriberGenerator

Inherits:
Rails::Generators::NamedBase
  • Object
show all
Defined in:
lib/generators/spree/subscriber/subscriber_generator.rb

Overview

spree:subscriber — scaffold an event subscriber and register it.

bin/rails g spree:subscriber OmsOrderSync order.completed order.canceled
bin/rails g spree:subscriber MyApp::BrandSync brand.created brand.updated
bin/rails g spree:subscriber CriticalSync order.completed --sync

Subscribers are not auto-discovered — they must be appended to the Spree.subscribers array. Forgetting that step produces a silent no-op, so this generator also maintains the registration in config/initializers/spree.rb with an idempotent line per subscriber.

Constant Summary collapse

INITIALIZER_PATH =

Every Spree app ships config/initializers/spree.rb (created by spree:install) — registrations go there rather than into a second initializer file.

'config/initializers/spree.rb'
REGISTRATION_ANCHOR =
"Rails.application.config.after_initialize do\n"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.source_pathsObject



35
36
37
# File 'lib/generators/spree/subscriber/subscriber_generator.rb', line 35

def self.source_paths
  [File.expand_path('templates', __dir__), *superclass.source_paths]
end

Instance Method Details

#create_spec_fileObject



58
59
60
61
62
# File 'lib/generators/spree/subscriber/subscriber_generator.rb', line 58

def create_spec_file
  return if options[:skip_spec]

  template 'subscriber_spec.rb.tt', File.join('spec/subscribers', class_path, "#{subscriber_file_name}_spec.rb")
end

#create_subscriber_fileObject



39
40
41
# File 'lib/generators/spree/subscriber/subscriber_generator.rb', line 39

def create_subscriber_file
  template 'subscriber.rb.tt', File.join('app/subscribers', class_path, "#{subscriber_file_name}.rb")
end

#register_subscriberObject



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/generators/spree/subscriber/subscriber_generator.rb', line 43

def register_subscriber
  if File.exist?(destination_path(INITIALIZER_PATH))
    content = File.read(destination_path(INITIALIZER_PATH))
    if content.include?(registration_line.strip)
      say_status :identical, "#{INITIALIZER_PATH} (#{subscriber_class_name} already registered)", :blue
    elsif content.include?(REGISTRATION_ANCHOR)
      inject_into_file INITIALIZER_PATH, registration_line, after: REGISTRATION_ANCHOR
    else
      append_to_file INITIALIZER_PATH, registration_block
    end
  else
    create_file INITIALIZER_PATH, registration_block.lstrip
  end
end

#warn_about_missing_eventsObject



64
65
66
67
68
# File 'lib/generators/spree/subscriber/subscriber_generator.rb', line 64

def warn_about_missing_events
  return if events.any?

  say_status :note, "no events given — edit `subscribes_to` in the generated subscriber (e.g. 'order.completed')", :yellow
end