lib/generators/leolay/leolay_generator.rb
require File.join(File.dirname(__FILE__), '../active_leonardo')
class LeolayGenerator < Rails::Generators::Base
include ::ActiveLeonardo::Base
source_root File.expand_path('../templates', __FILE__)
argument :style, :type => :string, :default => "active"
#class_option :pagination, :type => :boolean, :default => true, :desc => "Include pagination files"
class_option :main_color, :type => :string, :default => nil, :desc => "Force a main color for the stylesheet"
class_option :second_color, :type => :string, :default => nil, :desc => "Force a secondary color for the stylesheet"
class_option :authentication, :type => :boolean, :default => true, :desc => "Add code to manage authentication with devise"
class_option :authorization, :type => :boolean, :default => true, :desc => "Add code to manage authorization with cancan"
class_option :activeadmin, :type => :boolean, :default => true, :desc => "Add code to manage activeadmin gem"
class_option :auth_class, :type => :string, :default => 'User', :desc => "Set the authentication class name"
#class_option :formtastic, :type => :boolean, :default => true, :desc => "Copy formtastic files into leosca custom folder (inside project)"
#class_option :jquery_ui, :type => :boolean, :default => true, :desc => "To use jQuery ui improvement"
class_option :rspec, :type => :boolean, :default => true, :desc => "Include custom rspec generator and custom templates"
class_option :verbose, :type => :boolean, :default => true, :desc => "Run interactive mode"
def generate_layout
template "styles/#{style_name}/stylesheets/app/stylesheet.scss.erb", "app/assets/stylesheets/#{style_name}.scss.erb"
template "styles/#{style_name}/stylesheets/app/custom_active_admin.scss.erb", "app/assets/stylesheets/custom_active_admin.scss.erb"
template "styles/#{style_name}/stylesheets/app/_production.scss", "app/assets/stylesheets/_production.scss"
copy_file "app/helpers/layout_helper.rb", "app/helpers/layout_helper.rb", :force => !options.verbose?
directory "styles/#{style_name}/images", "app/assets/images/styles/#{style_name}", :force => !options.verbose?
copy_file "styles/#{style_name}/favicon.ico", "app/assets/images/favicon.ico", :force => !options.verbose?
copy_file "styles/#{style_name}/views/layout/application.html.erb", "app/views/layouts/application.html.erb", :force => true
copy_file "styles/#{style_name}/views/layout/_message.html.erb", "app/views/application/_message.html.erb", :force => !options.verbose?
copy_file "styles/#{style_name}/views/layout/_session.html.erb", "app/views/application/_session.html.erb", :force => !options.verbose? if options.authentication?
copy_file "config/initializers/config.rb", "config/initializers/config.rb", :force => !options.verbose?
template "config/config.yml", "config/config.yml"
locale_path = "config/locales"
source_paths.each do |source_path|
files = Dir["#{source_path}/#{locale_path}/*.yml"]
files.each do |f|
if f.include?("devise")
copy_file f, "#{locale_path}/#{File.basename(f)}", :force => !options.verbose? if options.authentication?
else
copy_file f, "#{locale_path}/#{File.basename(f)}", :force => !options.verbose?
end
end
break if files.any?
end
end
def setup_application
application do
<<-FILE.gsub(/^ /, '')
config.generators do |g|
g.stylesheets false
g.javascripts true
g.leosca_controller :leosca_controller
end
config.autoload_paths += %W(\#{config.root}/lib/extras)
I18n.enforce_available_locales = false
FILE
end
file = "app/controllers/application_controller.rb"
if File.exists?(file)
inject_into_class file, ApplicationController do
<<-FILE.gsub(/^ /, '')
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, :alert => exception.message
end
def current_ability
@current_ability ||= Ability.new(current_#{options[:auth_class].downcase})
end
FILE
end if options.authorization?
inject_into_class file, ApplicationController do
<<-FILE.gsub(/^ /, '')
before_filter :localizate
def localizate
if params[:lang]
session[:lang] = params[:lang]
else
session[:lang] ||= I18n.default_locale
end
I18n.locale = session[:lang]
end
FILE
end
end
end
def setup_authentication
file = "app/models/#{options[:auth_class].downcase}.rb"
#puts "File #{file} #{File.exists?(file) ? "" : "does not"} exists!"
return unless options.authentication? and File.exists?(file)
inject_into_class file, auth_class do
<<-FILE.gsub(/^ /, '')
ROLES = %w[admin manager user guest]
scope :with_role, ->(role) { where("roles_mask & \#{2**ROLES.index(role.to_s)} > 0 ") }
def roles=(roles)
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
end
def roles
ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
end
def role_symbols
roles.map(&:to_sym)
end
def role?(role)
roles.include? role.to_s
end
def roles?(*roles)
roles.each do |role|
return true if role? role
end
nil
end
def admin?
self.role? 'admin'
end
def name option=:fullname
return unless self.email
# Get left email text
match_data = self.email.match(/^([a-z]+)(\.|\-|\_|)([a-z]+|)/i)
case option
when :full, :fullname
name = match_data[1].capitalize
name << " \#{match_data[3].capitalize}" unless match_data[3].blank?
when :first, :firstname
name = match_data[1].capitalize
when :last, :lastname, :surname
name = match_data[3].capitalize
end
name
end
FILE
end
end
def setup_authorization
file = "app/models/ability.rb"
return unless File.exists?(file)
gsub_file file, /initialize(\s|\()user(.|)/, "initialize(#{options[:auth_class].downcase})"
inject_into_file file, :before => " end\nend" do
<<-FILE.gsub(/^ /, '')
#{options[:auth_class].downcase} ||= #{auth_class}.new
can :manage, :all if #{options[:auth_class].downcase}.role? :admin
alias_action :batch_action, :to => :update
can :read, ActiveAdmin::Page, :name => "Dashboard"
FILE
end
end
def create_users_for_development
return unless options.authentication?
file = "db/seeds.rb"
# Remove devise default user
gsub_file file, /User\.create!\(.+\)/, "" if File.exists?(file)
# Add default users
append_file file do
<<-FILE.gsub(/^ /, '')
user=#{auth_class}.new :email => 'admin@#{app_name}.com', :password => 'abcd1234', :password_confirmation => 'abcd1234'
#{"user.roles=['admin']" if options.authorization?}
user.save
user=#{auth_class}.new :email => 'manager@#{app_name}.com', :password => 'abcd1234', :password_confirmation => 'abcd1234'
#{"user.roles=['manager']" if options.authorization?}
user.save
user=#{auth_class}.new :email => 'user@#{app_name}.com', :password => 'abcd1234', :password_confirmation => 'abcd1234'
#{"user.roles=['user']" if options.authorization?}
user.save
FILE
end if File.exists?(file)
end
#def setup_formtastic
# return unless options.formtastic?
#
#end
def setup_javascript
app_path = "app/assets/javascripts"
file = "#{app_path}/custom.js.coffee"
copy_file file, file, :force => !options.verbose?
file = "#{app_path}/active_admin.js.coffee"
gsub_file file, "#= require active_admin/base" do
<<-FILE.gsub(/^ /, '')
#= require jquery
#= require turbolinks
#= require jquery.turbolinks
#= require active_admin/base
#= require custom
FILE
end
append_file file do
<<-FILE.gsub(/^ /, '')
#= require turbolinks
#= require jquery.turbolinks
#= require custom
FILE
end
end
#def setup_stylesheets
#end
def setup_rspec
file = "spec/spec_helper.rb"
return unless File.exists?(file) && options.rspec?
inject_into_file file, :after => "require 'rspec/rails'" do
<<-FILE.gsub(/^ /, '')
require 'capybara/rspec'
require 'helpers/application_helpers'
Capybara.default_wait_time = 10 #default=2
FILE
end
gsub_file file, 'config.fixture_path = "#{::Rails.root}/spec/fixtures"', '#config.fixture_path = "#{::Rails.root}/spec/fixtures"'
#inject_into_file file, "#", :before => 'config.fixture_path = "#{::Rails.root}/spec/fixtures"'
gsub_file file, "config.use_transactional_fixtures = true" do
<<-FILE.gsub(/^ /, '')
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.include ApplicationHelpers
FILE
end
file = "spec/factories.rb"
copy_file file, file, :force => !options.verbose?
file = "spec/support/devise.rb"
copy_file file, file, :force => !options.verbose?
file = "spec/helpers/application_helpers.rb"
copy_file file, file, :force => !options.verbose?
end
def setup_extras
copy_file "lib/upd_array.rb", "lib/extras/upd_array.rb", :force => !options.verbose?
end
def setup_activeadmin
return unless options.activeadmin? and activeadmin?
template "config/initializers/activeadmin_leonardo.rb", "config/initializers/activeadmin_leonardo.rb"
#copy_file "config/initializers/activeadmin_cancan.rb", "config/initializers/activeadmin_cancan.rb" if options.authorization?
#template "app/admin/users.rb", "app/admin/#{options[:auth_class].downcase.pluralize}.rb"
file = "app/admin/#{options[:auth_class].downcase}.rb"
inject_into_file file, :after => "ActiveAdmin.register #{options[:auth_class]} do" do
<<-FILE.gsub(/^ /, '')
controller do
def update
unless params[:user]['password'] && params[:user]['password'].size > 0
params[:user].delete 'password'
params[:user].delete 'password_confirmation'
end
super do
#do something
end
end
end
FILE
end
file = "app/assets/stylesheets/active_admin.scss"
append_file file do
<<-FILE.gsub(/^ /, '')
@import "custom_active_admin";
FILE
end if File.exists?(file)
file = "config/initializers/active_admin.rb"
gsub_file file, 'config.fixture_path = "#{::Rails.root}/spec/fixtures"', '#config.fixture_path = "#{::Rails.root}/spec/fixtures"'
#inject_into_file file, "#", :before => 'config.fixture_path = "#{::Rails.root}/spec/fixtures"'
gsub_file file, "# config.authorization_adapter = ActiveAdmin::CanCanAdapter" do
<<-FILE.gsub(/^ /, '')
config.authorization_adapter = ActiveAdmin::CanCanAdapter
FILE
end if File.exists?(file)
end
private
def style_name
style.underscore
end
def app_name
File.basename(Dir.pwd)
end
end