diff --git a/CHANGES.rdoc b/CHANGES.rdoc index 97e5c0c18..767dbd983 100644 --- a/CHANGES.rdoc +++ b/CHANGES.rdoc @@ -2,6 +2,7 @@ == 0.9.8 (unreleased) +* Improved Padrino Admin Generator, now admin_page accepts multiple models * Fixed Padrino Admin Account where the accounts password field is in plain text (text_field) * Added layouts folder back into application skeleton * Added support for forcing render of specified template (i.e render 'foo.haml' in js request) diff --git a/padrino-admin/lib/padrino-admin/generators/admin_app.rb b/padrino-admin/lib/padrino-admin/generators/admin_app.rb index 4fd0f042c..04bd4c730 100644 --- a/padrino-admin/lib/padrino-admin/generators/admin_app.rb +++ b/padrino-admin/lib/padrino-admin/generators/admin_app.rb @@ -63,7 +63,7 @@ def create_admin ] admin_app = Padrino::Generators::AdminPage.new(["account"], :root => options[:root]) - admin_app.orm = Padrino::Admin::Generators::Orm.new(:account, orm, columns, column_fields) + admin_app.default_orm = Padrino::Admin::Generators::Orm.new(:account, orm, columns, column_fields) admin_app.invoke template "templates/account/#{orm}.rb.tt", destination_root("app", "models", "account.rb"), :force => true diff --git a/padrino-admin/lib/padrino-admin/generators/admin_page.rb b/padrino-admin/lib/padrino-admin/generators/admin_page.rb index b3fc0ee1a..d11562b34 100644 --- a/padrino-admin/lib/padrino-admin/generators/admin_page.rb +++ b/padrino-admin/lib/padrino-admin/generators/admin_page.rb @@ -2,7 +2,7 @@ module Padrino module Generators class AdminPage < Thor::Group - attr_accessor :orm + attr_accessor :default_orm # Add this generator to our padrino-gen Padrino::Generators.add_generator(:admin_page, self) @@ -16,8 +16,8 @@ def self.banner; "padrino-gen admin_page [Model]"; end include Padrino::Generators::Actions include Padrino::Generators::Admin::Actions - desc "Description:\n\n\tpadrino-gen admin_page YourModel" - argument :model, :desc => "The name of your model" + desc "Description:\n\n\tpadrino-gen admin_page Model(s)" + argument :models, :desc => "The name(s) of your model(s)", :type => :array class_option :skip_migration, :aliases => "-s", :default => false, :type => :boolean class_option :root, :desc => "The root destination", :aliases => '-r', :type => :string class_option :destroy, :aliases => '-d', :default => false, :type => :boolean @@ -29,17 +29,19 @@ def self.banner; "padrino-gen admin_page [Model]"; end def create_controller self.destination_root = options[:root] if in_app_root? - @orm ||= Padrino::Admin::Generators::Orm.new(model, adapter) - self.behavior = :revoke if options[:destroy] - ext = fetch_component_choice(:renderer) - - template "templates/page/controller.rb.tt", destination_root("/admin/controllers/#{@orm.name_plural}.rb") - template "templates/#{ext}/page/_form.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/_form.#{ext}") - template "templates/#{ext}/page/edit.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/edit.#{ext}") - template "templates/#{ext}/page/index.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/index.#{ext}") - template "templates/#{ext}/page/new.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/new.#{ext}") - - add_project_module(@orm.name_plural) + models.each do |model| + @orm = default_orm || Padrino::Admin::Generators::Orm.new(model, adapter) + self.behavior = :revoke if options[:destroy] + ext = fetch_component_choice(:renderer) + + template "templates/page/controller.rb.tt", destination_root("/admin/controllers/#{@orm.name_plural}.rb") + template "templates/#{ext}/page/_form.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/_form.#{ext}") + template "templates/#{ext}/page/edit.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/edit.#{ext}") + template "templates/#{ext}/page/index.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/index.#{ext}") + template "templates/#{ext}/page/new.#{ext}.tt", destination_root("/admin/views/#{@orm.name_plural}/new.#{ext}") + + add_project_module(@orm.name_plural) + end else say "You are not at the root of a Padrino application! (config/boot.rb not found)" and return unless in_app_root? end diff --git a/padrino-admin/test/generators/test_admin_page_generator.rb b/padrino-admin/test/generators/test_admin_page_generator.rb index e907f6009..3af2c6739 100644 --- a/padrino-admin/test/generators/test_admin_page_generator.rb +++ b/padrino-admin/test/generators/test_admin_page_generator.rb @@ -10,6 +10,12 @@ def self.properties end end +class Page + def self.properties + [:id, :name, :body].map { |c| OpenStruct.new(:name => c) } + end +end + class TestAdminPageGenerator < Test::Unit::TestCase def setup @@ -34,8 +40,7 @@ def setup assert_raise(Padrino::Admin::Generators::OrmError) { @page.start(['foo', '-r=/tmp/sample_project']) } end - should 'correctyl generate a new padrino admin application default renderer' do - 'Person'.classify.constantize + should 'correctly generate a new padrino admin application default renderer' do silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=datamapper']) } silence_logger { @admin.start(['--root=/tmp/sample_project']) } silence_logger { @model.start(['person', "name:string", "age:integer", "email:string", '-root=/tmp/sample_project']) } @@ -52,8 +57,7 @@ def setup assert_match_in_file 'role.project_module :people, "/people"', '/tmp/sample_project/admin/app.rb' end - should 'correctyl generate a new padrino admin application with erb renderer' do - 'Person'.classify.constantize + should 'correctly generate a new padrino admin application with erb renderer' do silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=datamapper', '-e=erb']) } silence_logger { @admin.start(['--root=/tmp/sample_project']) } silence_logger { @model.start(['person', "name:string", "age:integer", "email:string", '-root=/tmp/sample_project']) } @@ -69,5 +73,35 @@ def setup end assert_match_in_file 'role.project_module :people, "/people"', '/tmp/sample_project/admin/app.rb' end + + should 'correctly generate a new padrino admin application with multiple models' do + silence_logger { @project.start(['sample_project', '--root=/tmp', '-d=datamapper']) } + silence_logger { @admin.start(['--root=/tmp/sample_project']) } + silence_logger { @model.start(['person', "name:string", "age:integer", "email:string", '-root=/tmp/sample_project']) } + silence_logger { @model.start(['page', "name:string", "body:string", '-root=/tmp/sample_project']) } + silence_logger { @page.start(['person', 'page', '--root=/tmp/sample_project']) } + # For Person + assert_file_exists '/tmp/sample_project/admin/controllers/people.rb' + assert_file_exists '/tmp/sample_project/admin/views/people/_form.haml' + assert_file_exists '/tmp/sample_project/admin/views/people/edit.haml' + assert_file_exists '/tmp/sample_project/admin/views/people/index.haml' + assert_file_exists '/tmp/sample_project/admin/views/people/new.haml' + %w(name age email).each do |field| + assert_match_in_file "label :#{field}", '/tmp/sample_project/admin/views/people/_form.haml' + assert_match_in_file "text_field :#{field}", '/tmp/sample_project/admin/views/people/_form.haml' + end + assert_match_in_file 'role.project_module :people, "/people"', '/tmp/sample_project/admin/app.rb' + # For Page + assert_file_exists '/tmp/sample_project/admin/controllers/pages.rb' + assert_file_exists '/tmp/sample_project/admin/views/pages/_form.haml' + assert_file_exists '/tmp/sample_project/admin/views/pages/edit.haml' + assert_file_exists '/tmp/sample_project/admin/views/pages/index.haml' + assert_file_exists '/tmp/sample_project/admin/views/pages/new.haml' + %w(name body).each do |field| + assert_match_in_file "label :#{field}", '/tmp/sample_project/admin/views/pages/_form.haml' + assert_match_in_file "text_field :#{field}", '/tmp/sample_project/admin/views/pages/_form.haml' + end + assert_match_in_file 'role.project_module :pages, "/pages"', '/tmp/sample_project/admin/app.rb' + end end end