lib/generators/atc_generator.rb
class AtcGenerator < Rails::Generators::Base def generate_app source_paths.push File.expand_path("./templates", __dir__) ### config/routes.rb @routes = IO.read("config/routes.rb") unless @routes.include? "fly_atc_scope" _, prolog, routes = routes.split(/(.*Rails.application.routes.draw do\n)/m,2) routes, epilog, _ = @routes.split(/^(end.*)/m,2) routes = routes.split(/\n\s*\n/) scoped = routes.select {|route| route =~ /^\s*\w/ && !route.include?('as:')} @routes = <<~EOF #{prolog.rstrip} fly_atc_scope = ENV.fetch("FLY_ATC_SCOPE", "") unless fly_atc_scope == "" mount ActionCable.server => "/\#{fly_atc_scope}/cable" end scope fly_atc_scope do #{scoped.join("\n\n").gsub(/^ /, " ")} end #{(routes-scoped).join("\n\n").rstrip} #{epilog.rstrip} EOF end template "routes.erb", "config/routes.rb" ### app/views/layouts/application.html.erb @layout = IO.read("app/views/layouts/application.html.erb") unless @layout.include? "action_cable_meta_tag_dynamic" @layout[/<meta.*?\n()\r?\n/m, 1] = " <%= action_cable_meta_tag_dynamic %>\n" end template "application.html.erb", "app/views/layouts/application.html.erb" end end