class Fastlane::PluginGenerator

Generates a sample plugin by traversing a template directory structure and reproducing it in a destination location. At the same time, it runs variable replacements on directory names, file names, and runs ERB templating on file contents whose names end with '.erb'.

Directory and file name variable replacements are defined like: %gem_name% The text between the percent signs will be used to invoke an accessor method on the PluginInfo object to get the replacement value.

Public Class Methods

new(ui: PluginGeneratorUI.new, info_collector: PluginInfoCollector.new(ui), template_root: File.join(File.dirname(__FILE__), 'template'), dest_root: FileUtils.pwd) click to toggle source
# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 11
def initialize(ui:             PluginGeneratorUI.new,
               info_collector: PluginInfoCollector.new(ui),
               template_root:  File.join(File.dirname(__FILE__), 'template'),
               dest_root:      FileUtils.pwd)
  @ui = ui
  @info_collector = info_collector
  @template_root = template_root
  @dest_root = dest_root
end

Public Instance Methods

copy_file(template_path, dest_path, plugin_info) click to toggle source
# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 55
def copy_file(template_path, dest_path, plugin_info)
  contents = File.read(template_path)

  if dest_path.end_with?('.erb')
    contents = ERB.new(contents).result(plugin_info.get_binding)
    dest_path = dest_path[0...-4] # Remove the .erb suffix
  end

  File.write(dest_path, contents)
end
derive_dest_path(template_path, plugin_info) click to toggle source
# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 48
def derive_dest_path(template_path, plugin_info)
  relative_template_path = template_path.gsub(@template_root, '')
  replaced_path = replace_path_variables(relative_template_path, plugin_info)

  File.join(@dest_root, plugin_info.gem_name, replaced_path)
end
generate(plugin_name = nil) click to toggle source

entry point

# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 22
def generate(plugin_name = nil)
  plugin_info = @info_collector.collect_info(plugin_name)

  # Traverse all the files and directories in the template root,
  # handling each in turn
  Find.find(@template_root) do |template_path|
    handle_template_path(template_path, plugin_info)
  end

  @ui.success("\nYour plugin was successfully generated at #{plugin_info.gem_name}/ 🚀")
  @ui.success("\nTo get started with using this plugin, run")
  @ui.message("\n    fastlane add_plugin #{plugin_info.plugin_name}\n")
  @ui.success("\nfrom a fastlane-enabled app project directory and provide the following as the path:")
  @ui.message("\n    #{File.expand_path(plugin_info.gem_name)}\n\n")
end
handle_template_path(template_path, plugin_info) click to toggle source
# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 38
def handle_template_path(template_path, plugin_info)
  dest_path = derive_dest_path(template_path, plugin_info)

  if File.directory?(template_path)
    FileUtils.mkdir_p(dest_path)
  else
    copy_file(template_path, dest_path, plugin_info)
  end
end
replace_path_variables(template_path, plugin_info) click to toggle source

Path variables can be defined like: %gem_name%

The text between the percent signs will be used to invoke an accessor method on the PluginInfo object to be the replacement value.

# File fastlane/lib/fastlane/plugins/plugin_generator.rb, line 70
def replace_path_variables(template_path, plugin_info)
  path = template_path.dup

  loop do
    replacement_variable_regexp = /%([\w\-]*)%/
    match = replacement_variable_regexp.match(path)

    break unless match

    replacement_value = plugin_info.send(match[1].to_sym)
    path.gsub!(replacement_variable_regexp, replacement_value)
  end

  path
end