activescaffold/active_scaffold

View on GitHub
lib/generators/active_scaffold/install_generator.rb

Summary

Maintainability
A
1 hr
Test Coverage
F
0%
require 'rails/generators/base'
# require 'generators/active_scaffold_controller/active_scaffold_controller_generator'

module ActiveScaffold
  module Generators
    class InstallGenerator < Rails::Generators::Base
      desc 'Add concerns to routes and require lines to assets manifest files'

      def add_concern_routes
        route 'concern :active_scaffold, ActiveScaffold::Routing::Basic.new(association: true)'
        route 'concern :active_scaffold_association, ActiveScaffold::Routing::Association.new'
      end

      def add_to_javascript_manifest
        file = 'app/assets/javascripts/application.js'
        unless File.exist?(file)
          if Rails.version >= '6.0'
            create_javascript_manifest file
            return
          end
          say_status :missing, file, :red
          return if options[:pretend]
          raise Thor::Error, "JS file #{file} is required for ActiveScaffold"
        end
        original_js = File.binread(file)
        if original_js.include?('require active_scaffold')
          say_status('skipped', "insert into #{file}", :yellow)
        else
          insert_into_file file, after: %r{//= require +.*ujs['"]?\n} do
            "//= require active_scaffold\n"
          end
        end
        setup_jquery file, original_js
      end

      def add_to_stylesheet_manifest
        file = 'app/assets/stylesheets/application.css'
        return unless File.exist?(file)
        original_css = File.binread(file)
        if original_css.match?(/require active_scaffold$/)
          say_status('skipped', 'insert into app/assets/stylesheets/application.css', :yellow)
        else
          insert_into_file 'app/assets/stylesheets/application.css', before: %r{[ ]*\*/} do
            " *= require active_scaffold\n"
          end
        end
      end

      protected

      def create_javascript_manifest(file)
        FileUtils.mkdir_p File.dirname(file)
        File.open(file, 'w') do |f|
          f << "// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, or any plugin's
// vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require active_scaffold
"
          say_status('create', file)
        end
        insert_into_file 'app/views/layouts/application.html.erb', after: /javascript_pack_tag 'application'.*\n/ do
          "    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload', 'data-turbo-track': 'reload' %>\n"
        end
        append_to_file 'config/initializers/assets.rb' do
          "Rails.application.config.assets.precompile += %w( application.js )\n"
        end
        setup_jquery file, where: 'active_scaffold'
      end

      def setup_jquery(file, original_js = nil, where: 'ujs')
        original_js ||= File.binread(file)
        if ActiveScaffold.js_framework == :jquery
          unless original_js.include?('require jquery')
            insert_into_file file, before: %r{//= require +.*#{where}['"]?\n} do
              "//= require jquery\n"
            end
          end
        else
          say_status('missing', 'no jquery-rails gem, load jquery in your layout, or add jquery-rails to Gemfile and add //= require jquery to application.js', :red)
        end
      end
    end
  end
end