require 'rails/generators' require 'rails/generators/generated_attribute' module Bootstrap module Generators class ThemedGenerator < ::Rails::Generators::Base user_source_root = Rails.root.join("lib", "generators", "bootstrap", "themed", "templates") if File.exists?(user_source_root) source_root user_source_root else source_root File.expand_path('../templates', __FILE__) end argument :controller_path, :type => :string argument :model_name, :type => :string, :required => false argument :layout, :type => :string, :default => "application", :banner => "Specify application layout" def initialize(args, *options) super(args, *options) initialize_views_variables end def copy_views generate_views end protected def initialize_views_variables @base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(controller_path) @controller_routing_path = @controller_file_path.gsub(/\//, '_') @model_name = @base_name.singularize unless @model_name @model_name = @model_name.camelize end def controller_routing_path @controller_routing_path end def singular_controller_routing_path @controller_routing_path.singularize end def model_name @model_name end def plural_model_name @model_name.pluralize end def resource_name @model_name.underscore end def plural_resource_name resource_name.pluralize end def columns begin excluded_column_names = %w[id created_at updated_at] Kernel.const_get(@model_name).columns.reject{|c| excluded_column_names.include?(c.name) }.collect{|c| ::Rails::Generators::GeneratedAttribute.new(c.name, c.type)} rescue NoMethodError Kernel.const_get(@model_name).fields.collect{|c| c[1]}.reject{|c| excluded_column_names.include?(c.name) }.collect{|c| ::Rails::Generators::GeneratedAttribute.new(c.name, c.type.to_s)} end end def extract_modules(name) modules = name.include?('/') ? name.split('/') : name.split('::') name = modules.pop path = modules.map { |m| m.underscore } file_path = (path + [name.underscore]).join('/') nesting = modules.map { |m| m.camelize }.join('::') [name, path, file_path, nesting, modules.size] end def generate_views views = { "index.html.haml" => File.join('app/views', @controller_file_path, "index.html.haml"), "new.html.haml" => File.join('app/views', @controller_file_path, "new.html.haml"), "edit.html.haml" => File.join('app/views', @controller_file_path, "edit.html.haml"), "_form.html.haml" => File.join('app/views', @controller_file_path, "_form.html.haml"), "show.html.haml" => File.join('app/views', @controller_file_path, "show.html.haml")} selected_views = views options.engine == generate_erb(selected_views) end def generate_erb(views) views.each do |template_name, output_path| template template_name, output_path end end end end end