class Cyborg::Scaffold
Attributes
engine[R]
gem[R]
gemspec_path[R]
namespace[R]
path[R]
plugin_module[R]
spec[R]
Public Class Methods
new(options)
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 7 def initialize(options) @cwd = Dir.pwd @gem = underscorize(options[:name]) @engine = underscorize(options[:engine] || options[:name]) @namespace = @engine @plugin_module = modulize @engine puts "Creating new plugin #{@namespace}".bold engine_site_scaffold @gemspec_path = new_gem @path = File.expand_path(File.dirname(@gemspec_path)) @spec = Gem::Specification.load(@gemspec_path) bootstrap_gem engine_app_scaffold engine_copy prepare_engine_site install_npm_modules update_git end
Public Instance Methods
action_log(action, path)
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 280 def action_log(action, path) puts action.rjust(12).colorize(:green).bold + " #{path}" end
bootstrap_gem()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 43 def bootstrap_gem # Remove unnecessary bin dir FileUtils.rm_rf(File.join(path, 'bin')) # Simplify gempsec and set up to add assets properly write_file(gemspec_path, gemspec) write_file("#{gem}/lib/#{gem}.rb", %Q{require 'cyborg' require '#{gem}/version' module #{modulize(gem)} class Plugin < Cyborg::Plugin end end Cyborg.register(#{modulize(gem)}::Plugin, { #{cyborg_plugin_config} })}) end
cyborg_plugin_config()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 64 def cyborg_plugin_config plugin_config = "gem: '#{gem}'" plugin_config += ",\n engine: '#{engine}'" if engine plugin_config end
engine_app_scaffold()
click to toggle source
Add engine's app assets and utilities
# File lib/cyborg/command/scaffold.rb, line 71 def engine_app_scaffold # Add asset dirs files = %w(images javascripts stylesheets svgs).map { |path| "#{gem}/app/assets/#{path}/#{namespace}/.keep" } write_file(files, '') # Add helper and layout dirs files = %w(helpers views/layouts).each { |path| "#{gem}/app/#{path}/#{namespace}" } write_file(files, '') # Add an application helper write_file("#{gem}/app/helpers/#{namespace}/application_helper.rb", %Q{module #{plugin_module} module ApplicationHelper end end}) # Add an a base layout write_file("#{gem}/app/views/layouts/#{namespace}/default.html.erb", %Q{<!DOCTYPE html> <html> <head> <title>#{plugin_module}</title> <%= csrf_meta_tags %> <%= asset_tags %> <%= yield :stylesheets %> <%= yield :javascripts %> <%= yield :head %> </head> <body> <div class='site'> <div class='page'><%=yield %></div> </div> </body> </html>}) # Update .gitignore write_file("#{gem}/.gitignore", %Q{.DS_Store log/*.log pkg/ node_modules site/log/*.log site/tmp/ /public/ _svg.js .esvg-cache .sass-cache}, 'a') end
engine_copy()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 137 def engine_copy site_path = File.join(path, 'site') FileUtils.mkdir_p(site_path) Dir.chdir ".#{gem}-tmp/#{gem}" do %w(app config bin config.ru Rakefile public log).each do |item| target = File.join(site_path, item) FileUtils.cp_r(File.join('site', item), target) action_log "create", target.sub(@cwd+'/','') end end FileUtils.rm_rf(".#{gem}-tmp") %w(app/mailers app/models config/database.yml).each do |item| FileUtils.rm_rf(File.join(site_path, item)) end end
engine_site_scaffold()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 126 def engine_site_scaffold FileUtils.mkdir_p(".#{gem}-tmp") Dir.chdir ".#{gem}-tmp" do response = Open3.capture3("rails plugin new #{gem} --mountable --dummy-path=site --skip-test-unit") if !response[1].empty? puts response[1] abort "FAILED: Please be sure you have the rails gem installed with `gem install rails`" end end end
gemspec()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 234 def gemspec %Q{# coding: utf-8 $:.push File.expand_path("../lib", __FILE__) require "#{spec.name}/version" # Describe your gem and declare its dependencies: Gem::Specification.new do |spec| spec.name = "#{spec.name}" spec.version = #{modulize(gem)}::VERSION spec.authors = #{spec.authors} spec.email = #{spec.email} spec.summary = "Summary of your gem." spec.description = "Description of your gem (usually longer)." spec.license = "#{spec.license}" spec.files = Dir["{app,lib,public,config}/**/*", "LICENSE.txt", "README.md"] spec.require_paths = ["lib"] spec.add_dependency "rails", ">= 4" spec.add_runtime_dependency "cyborg" spec.add_development_dependency "bundler", "~> 1.12" spec.add_development_dependency "rake", "~> 10.0" end } end
install_npm_modules()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 37 def install_npm_modules Dir.chdir path do NPM.setup end end
modulize(input)
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 284 def modulize(input) input.split('_').collect { |name| (name =~ /[A-Z]/) ? name : name.capitalize }.join end
new_gem()
click to toggle source
Create a new gem with Bundle's gem command
# File lib/cyborg/command/scaffold.rb, line 32 def new_gem system "bundler gem #{gem}" Dir.glob(File.join(gem, "/*.gemspec")).first end
prepare_engine_site()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 157 def prepare_engine_site site_path = File.join(path, 'site') write_file(File.join(site_path, 'config/environments/development.rb'), %Q{Rails.application.configure do config.cache_classes = false # Do not eager load code on boot. config.eager_load = false # Show full error reports and disable caching. config.consider_all_requests_local = true config.action_controller.perform_caching = false # Print deprecation notices to the Rails logger. config.active_support.deprecation = :log end }) write_file(File.join(site_path, 'config/application.rb'), %Q{require File.expand_path('../boot', __FILE__) require "rails" # Pick the frameworks you want: require "action_controller/railtie" require "action_view/railtie" require "sprockets/railtie" # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) require '#{gem}' module Site class Application < Cyborg::Application end end}) write_file(File.join(site_path, 'config/routes.rb'), %Q{Rails.application.routes.draw do resources :docs, param: :page, path: '' end}) write_file(File.join(site_path, 'app/controllers/docs_controller.rb'), %Q{class DocsController < ApplicationController def show page = params[:page] %w(docs).each do | root_page | if page.match(\/\#{root_page}\\/?$/) page = File.join(root_page, 'index') end end if template_exists? page render template: page elsif template_exists? "docs/\#{page}" render template: "docs/\#{page}" else render file: "404.html", status: :not_found end end end}) layout = %Q{<%= render_layout '#{namespace}/default' do %> <% stylesheets { stylesheet_link_tag('application') } %> <% javascripts { javascript_include_tag('application') } %> <% end %>} write_file(File.join(site_path, 'app/views/layouts/default.html.erb'), layout) write_file(File.join(site_path, 'app/views/docs/index.html.erb'), "<h1>#{plugin_module} Documentation</h1>") end
underscorize(input)
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 290 def underscorize(input) input.gsub(/[A-Z]/) do |char| '_'+char end.sub(/^_/,'').downcase end
update_git()
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 227 def update_git Dir.chdir gem do system "git reset" system "git add -A" end end
write_file(paths, content, mode='w')
click to toggle source
# File lib/cyborg/command/scaffold.rb, line 262 def write_file(paths, content, mode='w') paths = [paths].flatten paths.each do |path| if File.exist?(path) type = 'update' else FileUtils.mkdir_p(File.dirname(path)) type = 'create' end File.open path, mode do |io| io.write(content) end action_log(type, path) end end