shakacode/react_on_rails

View on GitHub
rakelib/examples.rake

Summary

Maintainability
Test Coverage
# frozen_string_literal: true

# Defines tasks related to generating example apps using the gem's generator.
# Allows us to create and test apps generated using a wide range of options.
#
# Also see example_type.rb

require "yaml"
require "rails/version"

require_relative "example_type"
require_relative "task_helpers"

namespace :examples do # rubocop:disable Metrics/BlockLength
  include ReactOnRails::TaskHelpers
  # Loads data from examples_config.yml and instantiates corresponding ExampleType objects
  examples_config_file = File.expand_path("examples_config.yml", __dir__)
  examples_config = symbolize_keys(YAML.safe_load_file(examples_config_file))
  examples_config[:example_type_data].each { |example_type_data| ExampleType.new(**symbolize_keys(example_type_data)) }

  # Define tasks for each example type
  ExampleType.all.each do |example_type|
    # CLOBBER
    desc "Clobbers (deletes) #{example_type.name_pretty}"
    task example_type.clobber_task_name_short do
      rm_rf(example_type.dir)
    end

    # GENERATE
    desc "Generates #{example_type.name_pretty}"
    task example_type.gen_task_name_short => example_type.clobber_task_name do
      mkdir_p(example_type.dir)
      example_type.rails_options += "--skip-javascript"
      sh_in_dir(examples_dir, "rails new #{example_type.name} #{example_type.rails_options}")
      sh_in_dir(example_type.dir, "touch .gitignore")
      append_to_gemfile(example_type.gemfile, example_type.required_gems)
      bundle_install_in(example_type.dir)
      sh_in_dir(example_type.dir, "rake webpacker:install")
      sh_in_dir(example_type.dir, example_type.generator_shell_commands)
      sh_in_dir(example_type.dir, "yarn")
    end
  end

  desc "Clobbers (deletes) all example apps"
  task :clobber do
    rm_rf(examples_dir)
  end

  desc "Generates all example apps"
  task gen_all: ExampleType.all.map(&:gen_task_name)
end

desc "Generates all example apps. Run `rake -D examples` to see all available options"
task examples: ["examples:gen_all"]

private

# Appends each string in an array as a new line of text in the given Gemfile.
# Automatically adds line returns.
def append_to_gemfile(gemfile, lines)
  old_text = File.read(gemfile)
  new_text = lines.reduce(old_text) { |a, e| a << "#{e}\n" }
  File.open(gemfile, "w") { |f| f.puts(new_text) }
end