class Enginery::Generator
Attributes
dst_root[R]
setups[R]
Public Class Methods
new(dst_root, setups = {})
click to toggle source
# File lib/enginery/generator.rb, line 7 def initialize dst_root, setups = {} @dst_root, @setups = dst_root, setups end
Public Instance Methods
generate_controller(name)
click to toggle source
# File lib/enginery/generator.rb, line 55 def generate_controller name name.nil? || name.empty? && fail("Please provide controller name") before, ctrl_name, after = namespace_to_source_code(name) source_code, i = [], INDENT * before.size before.each {|s| source_code << s} source_code << "#{i}class #{ctrl_name} < E" (@setups[:include] || []).each do |mdl| source_code << "#{i + INDENT}include #{mdl}" end source_code << "#{i + INDENT}include %sHelpers if defined?(%sHelpers)" % [ctrl_name, ctrl_name] source_code << "#{i + INDENT}# controller-wide setups" if route = setups[:route] source_code << "#{i + INDENT}map '#{route}'" end if engine = setups[:engine] source_code << "#{i + INDENT}engine :#{engine}" Configurator.new(dst_root, engine: engine).update_gemfile end if format = setups[:format] source_code << "#{i + INDENT}format '#{format}'" end source_code << INDENT source_code << "#{i}end" after.each {|s| source_code << s} path = dst_path(:controllers, class_to_route(name)) file = path + CONTROLLER_SUFFIX File.exists?(file) && fail('"%s" controller already exists' % name) o o '=== Generating "%s" controller ===' % name o '*** Creating "%s/" ***' % unrootify(path) FileUtils.mkdir_p(path) write_file file, source_code.join("\n") output_source_code source_code ctrl_name end
generate_helper(ctrl_name)
click to toggle source
# File lib/enginery/generator.rb, line 149 def generate_helper ctrl_name o o '=== Generating helper file for "%s" controller ===' % ctrl_name _, ctrl = valid_controller?(ctrl_name) file = dst_path(:helpers, class_to_route(ctrl_name) + HELPER_SUFFIX) path = File.dirname(file) if File.exists?(path) File.directory?(path) || fail('"%s" should be a directory' % unrootify(path)) else o '*** Creating "%s/" ***' % unrootify(path) FileUtils.mkdir_p(path) end if File.exists?(file) File.file?(file) || fail('"%s" should be a file' % unrootify(file)) o('*** WARN: overwriting "%s" file ***' % unrootify(file)) else o '*** Creating "%s" ***' % unrootify(file) end before, helper_name, after = namespace_to_source_code(ctrl_name) source_code, i = [], INDENT * before.size before.each {|s| source_code << s} source_code << "#{i}module #{helper_name}Helpers" source_code << "#{i + INDENT}include Helpers if defined?(Helpers)" source_code << "" source_code << "#{i + INDENT}# helper methods for %s controller" % ctrl_name source_code << INDENT source_code << "#{i}end" after.each {|s| source_code << s} write_file file, source_code.join("\n") output_source_code source_code file end
generate_model(name)
click to toggle source
# File lib/enginery/generator.rb, line 215 def generate_model name name.nil? || name.empty? && fail("Please provide model name") before, model_name, after = namespace_to_source_code(name) superclass, insertions = '', [] if orm = valid_orm?(setups[:orm] || Cfg[:orm]) orm == :ActiveRecord && superclass = ' < ActiveRecord::Base' orm == :Sequel && superclass = ' < Sequel::Model' orm == :DataMapper && insertions << 'include DataMapper::Resource' (@setups[:include] || []).each do |mdl| insertions << "include #{mdl}" end insertions << '' orm == :DataMapper && insertions << 'property :id, Serial' insertions << '' send(orm.to_s.downcase + '_associations', @setups).each do |a| insertions << a end end insertions << '' source_code, i = [], INDENT * before.size before.each {|s| source_code << s} source_code << "#{i}class #{model_name + superclass}" insertions.each do |line| source_code << (i + INDENT + line.to_s) end source_code << "#{i}end" after.each {|s| source_code << s} source_code = source_code.join("\n") file = dst_path(:models, class_to_route(name) + '.rb') File.exists?(file) && fail('"%s" file already exists' % unrootify(file)) o o '=== Generating "%s" model ===' % name dir = File.dirname(file) if File.exists?(dir) File.directory?(dir) || fail("#{unrootify dir} should be a directory") else o '*** Creating "%s/" ***' % unrootify(dir) FileUtils.mkdir_p(dir) end write_file file, source_code output_source_code source_code.split("\n") model_name end
generate_project(name = nil)
click to toggle source
# File lib/enginery/generator.rb, line 11 def generate_project name = nil name = name.to_s if name.empty? name = '.' else name =~ /\.\.|\// && fail('Project name can not contain "/" nor ".."') @dst_root, @dst_path_map = File.join(@dst_root, name, ''), nil end Dir[dst_path(:root, '*')].any? && fail('"%s" should be a empty folder' % dst_path.root) o o '=== Generating "%s" project ===' % name folders, files = Dir[src_path(:base, '**/{*,.[a-z]*}')].partition do |entry| File.directory?(entry) end FileUtils.mkdir_p dst_path.root o "#{name}/" folders.each do |folder| path = unrootify(folder, src_path.base) o " D #{path}/" FileUtils.mkdir_p dst_path(:root, path) end files.reject {|f| File.basename(f) == '.gitkeep'}.each do |file| path = unrootify(file, src_path.base) o " F #{path}" FileUtils.cp file, dst_path(:root, path) end Configurator.new dst_root, setups do update_gemfile update_rakefile update_boot_rb update_config_yml update_database_rb update_database_yml end name end
generate_rear_controller(model)
click to toggle source
# File lib/enginery/generator.rb, line 269 def generate_rear_controller model model.nil? || model.empty? && fail('Please provide the model name to build controller for') model_exists?(model) || fail('Seems "%s" model does not exists' % model) source_code = [] source_code << "defined?(Rear) && Rear.register('#{model}') do" source_code << " # Rear setups for #{model} model" source_code << " # Details at https://github.com/espresso/rear" source_code << " " source_code << " " source_code << "end" source_code << "" path = dst_path(:rear_controllers, class_to_route(model)) file = path + ADMIN_SUFFIX File.exists?(file) && fail('A Rear controller for "%s" model already exists' % model) o o '=== Generating Rear controller for "%s" model ===' % model FileUtils.mkdir_p(File.dirname(path)) write_file file, source_code.join("\n") output_source_code source_code model end
generate_route(ctrl_name, name) { || ... }
click to toggle source
# File lib/enginery/generator.rb, line 99 def generate_route ctrl_name, name action_file, action = valid_route?(ctrl_name, name) File.exists?(action_file) && fail('"%s" route already exists' % name) before, ctrl_name, after = namespace_to_source_code(ctrl_name) source_code, i = [], ' ' * before.size before.each {|s| source_code << s} source_code << "#{i}class #{ctrl_name}" source_code << "#{i + INDENT}# action-specific setups" source_code << '' if format = setups[:format] source_code << "#{i + INDENT}format_for :#{action}, '#{format}'" end if setups.reject {|k,v| k == :route}.any? source_code << "#{i + INDENT}before :#{action} do" if engine = setups[:engine] source_code << "#{i + INDENT*2}engine :#{engine}" Configurator.new(dst_root, engine: engine).update_gemfile end source_code << "#{i + INDENT}end" source_code << "" end source_code << (i + INDENT + "def #{action}") action_source_code = ["render"] if block_given? action_source_code = yield action_source_code.is_a?(Array) || action_source_code = [action_source_code] end action_source_code.each do |line| source_code << (i + INDENT*2 + line.to_s) end source_code << (i + INDENT + "end") source_code << '' source_code << "#{i}end" after.each {|s| source_code << s} o o '=== Generating "%s" route ===' % name write_file action_file, source_code.join("\n") output_source_code source_code action end
generate_spec(ctrl_name, name)
click to toggle source
# File lib/enginery/generator.rb, line 295 def generate_spec ctrl_name, name context = {} _, context[:controller] = valid_controller?(ctrl_name) _, context[:action] = valid_route?(ctrl_name, name) context[:spec] = [ctrl_name, context[:action]]*'#' o o '=== Generating "%s#%s" spec ===' % [ctrl_name, name] path = dst_path(:specs, class_to_route(ctrl_name), '/') if File.exists?(path) File.directory?(path) || fail("#{path} should be a directory") else o '*** Creating "%s" ***' % unrootify(path) FileUtils.mkdir_p(path) end file = path + context[:action] + SPEC_SUFFIX File.exists?(file) && o('*** WARN: overwriting "%s" file ***' % unrootify(file)) test_framework = setups[:test_framework] || DEFAULT_TEST_FRAMEWORK engine = Tenjin::Engine.new(path: [src_path.specfiles], cache: false) source_code = engine.render(test_framework.to_s + '.erb', context) write_file file, source_code output_source_code source_code.split("\n") file end
generate_view(ctrl_name, name)
click to toggle source
# File lib/enginery/generator.rb, line 190 def generate_view ctrl_name, name _, action = valid_route?(ctrl_name, name) _, ctrl = valid_controller?(ctrl_name) path, ext = view_setups_for(ctrl, action) o o '=== Generating "%s" view ===' % name if File.exists?(path) File.directory?(path) || fail('"%s" should be a directory' % unrootify(path)) else o '*** Creating "%s/" ***' % unrootify(path) FileUtils.mkdir_p(path) end file = File.join(path, action + ext) if File.exists?(file) File.file?(file) || fail('"%s" should be a file' % unrootify(file)) o('*** WARN: overwriting "%s" file ***' % unrootify(file)) else o '*** Creating "%s" ***' % unrootify(file) end File.open(file, 'w') {} file end