123456789_123456789_123456789_123456789_123456789_

Class: Rails::Generators::ChannelGenerator

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, NamedBase, Base, Thor::Group
Instance Chain:
self, NamedBase, Base, Actions, Thor::Actions, Thor::Group
Inherits: Rails::Generators::NamedBase
Defined in: actioncable/lib/rails/generators/channel/channel_generator.rb

Class Attribute Summary

Base - Inherited

Class Method Summary

NamedBase - Inherited

.check_class_collision

Add a class collisions name to be checked on class initialization.

.new

Base - Inherited

.base_root

Returns the base root for a common set of generators.

.default_source_root

Returns the default source root for a given generator.

.desc

Tries to get the description from a USAGE file one folder above the source root otherwise uses a default description.

.hide!

Convenience method to hide this generator from the available ones when running rails generator command.

.hook_for

Invoke a generator based on the value supplied by the user to the given option named “name”.

.namespace

Convenience method to get the namespace from the class name.

.remove_hook_for

Remove a previously added hook.

.source_root

Returns the source root for this generator using default_source_root as default.

.add_shebang_option!

Small macro to add ruby as an option to the generator with proper default value plus an instance helper method called shebang.

.banner

Use Rails default banner.

.base_name

Sets the base_name taking into account the current class namespace.

.default_aliases_for_option

Returns default aliases for the option name given doing a lookup in aliases.

.default_for_option

Returns default for the option name given doing a lookup in config.

.default_generator_root,
.default_value_for_option

Returns the default value for the option name given doing a lookup in options.

.generator_name

Removes the namespaces and get the generator name.

.usage_path,
.class_option

Make class option aware of options and aliases.

.inherited

Cache source root and add lib/generators/base/generator/templates to source paths.

.hooks

Keep hooks configuration that are used on prepare_for_invocation.

.prepare_for_invocation

Prepare class invocation to search on ::Rails namespace if a previous added hook is being used.

Instance Attribute Summary

Instance Method Summary

NamedBase - Inherited

Base - Inherited

#class_collisions

Check whether the given class names are already taken by user application or Ruby on ::Rails.

#extract_last_module

Takes in an array of nested modules and extracts the last module.

#indent,
#module_namespacing

Wrap block with namespace of current application if namespace exists and is not skipped.

#namespace, #namespace_dirs, #namespaced_path, #wrap_with_namespace

Actions - Included

#add_source

Add the given source to Gemfile

#application
#environment

Adds configuration code to a Rails runtime environment.

#gem

Adds a gem declaration to the Gemfile for the specified gem.

#gem_group

Wraps gem entries inside a group.

#generate

Runs another generator.

#git

Runs one or more git commands.

#github,
#initializer

Creates an initializer file in config/initializers/.

#lib

Creates a file in lib/.

#rails_command

Runs the specified Rails command.

#rake

Runs the specified Rake task.

#rakefile

Creates a Rake tasks file in lib/tasks/.

#readme

Reads the given file at the source root and prints it in the console.

#route

Make an entry in Rails routing file config/routes.rb.

#vendor

Creates a file in vendor/.

#append_file_with_newline

Append string to a file with a newline if necessary.

#execute_command

Runs the supplied command using either “rake …” or “rails …” based on the executor parameter provided.

#indentation

Indent the Gemfile to the depth of @indentation.

#log

Define log for backwards compatibility.

#match_file,
#optimize_indentation

Returns optimized string with indentation.

#quote

Always returns value in double quotes.

#rebase_indentation
#route_namespace_pattern,
#with_indentation

Manage Gemfile indentation for a DSL action block.

#initialize

Constructor Details

This class inherits a constructor from Rails::Generators::NamedBase

Instance Attribute Details

#first_setup_required?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 95

def first_setup_required?
  !root.join("app/javascript/channels/index.js").exist?
end

#using_bun?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 107

def using_bun?
  # Cannot assume bun.lockb has been generated yet so we look for a file known to
  # be generated by the jsbundling-rails gem
  @using_bun ||= using_js_runtime? && root.join("bun.config.js").exist?
end

#using_importmap?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 118

def using_importmap?
  @using_importmap ||= root.join("config/importmap.rb").exist?
end

#using_javascript?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 99

def using_javascript?
  @using_javascript ||= options[:assets] && root.join("app/javascript").exist?
end

#using_js_runtime?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 103

def using_js_runtime?
  @using_js_runtime ||= root.join("package.json").exist?
end

#using_node?Boolean (readonly, private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 113

def using_node?
  # Bun is the only runtime that _isn't_ node.
  @using_node ||= using_js_runtime? && !root.join("bun.config.js").exist?
end

Instance Method Details

#create_channel_file (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 49

def create_channel_file
  template "channel.rb",
    File.join("app/channels", class_path, "#{file_name}_channel.rb")
end

#create_channel_files

[ GitHub ]

#create_channel_javascript_file (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 59

def create_channel_javascript_file
  channel_js_path = File.join("app/javascript/channels", class_path, "#{file_name}_channel")
  js_template "javascript/channel", channel_js_path
  gsub_file "#{channel_js_path}.js", /\.\/consumer/, "channels/consumer" unless using_js_runtime?
end

#create_shared_channel_files (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 40

def create_shared_channel_files
  return if behavior != :invoke

  copy_file "#{__dir__}/templates/application_cable/channel.rb",
    "app/channels/application_cable/channel.rb"
  copy_file "#{__dir__}/templates/application_cable/connection.rb",
    "app/channels/application_cable/connection.rb"
end

#create_shared_channel_javascript_files (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 54

def create_shared_channel_javascript_files
  template "javascript/index.js", "app/javascript/channels/index.js"
  template "javascript/consumer.js", "app/javascript/channels/consumer.js"
end

#file_name (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 91

def file_name
  @_file_name ||= super.sub(/_channel\z/i, "")
end

#import_channel_in_javascript_entrypoint (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 70

def import_channel_in_javascript_entrypoint
  append_to_file "app/javascript/channels/index.js",
    using_js_runtime? ? %(import "./#{file_name}_channel"\n) : %(import "channels/#{file_name}_channel"\n)
end

#import_channels_in_javascript_entrypoint (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 65

def import_channels_in_javascript_entrypoint
  append_to_file "app/javascript/application.js",
    using_js_runtime? ? %(import "./channels"\n) : %(import "channels"\n)
end

#install_javascript_dependencies (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 75

def install_javascript_dependencies
  say "Installing JavaScript dependencies", :green
  if using_bun?
    run "bun add @rails/actioncable"
  elsif using_node?
    run "yarn add @rails/actioncable"
  end
end

#pin_javascript_dependencies (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 84

def pin_javascript_dependencies
  append_to_file "config/importmap.rb", <<-RUBY
pin "@rails/actioncable", to: "actioncable.esm.js"
pin_all_from "app/javascript/channels", under: "channels"
  RUBY
end

#root (private)

[ GitHub ]

  
# File 'actioncable/lib/rails/generators/channel/channel_generator.rb', line 122

def root
  @root ||= Pathname(destination_root)
end