padrino-gen 0.10.2 → 0.10.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +3 -3
- data/.yardopts +1 -0
- data/{LICENSE → LICENSE.txt} +0 -0
- data/README.rdoc +1 -1
- data/lib/padrino-gen/command.rb +7 -0
- data/lib/padrino-gen/generators/actions.rb +264 -24
- data/lib/padrino-gen/generators/app/app.rb.tt +11 -11
- data/lib/padrino-gen/generators/app.rb +10 -9
- data/lib/padrino-gen/generators/cli.rb +3 -0
- data/lib/padrino-gen/generators/components/actions.rb +86 -11
- data/lib/padrino-gen/generators/components/mocks/rr.rb +3 -1
- data/lib/padrino-gen/generators/components/orms/mongoid.rb +1 -1
- data/lib/padrino-gen/generators/components/orms/mongomapper.rb +1 -1
- data/lib/padrino-gen/generators/components/orms/mongomatic.rb +1 -1
- data/lib/padrino-gen/generators/components/stylesheets/less.rb +1 -1
- data/lib/padrino-gen/generators/components/tests/minitest.rb +78 -0
- data/lib/padrino-gen/generators/controller.rb +3 -0
- data/lib/padrino-gen/generators/mailer.rb +3 -0
- data/lib/padrino-gen/generators/model.rb +3 -0
- data/lib/padrino-gen/generators/plugin.rb +2 -0
- data/lib/padrino-gen/generators/project.rb +11 -3
- data/lib/padrino-gen/generators/runner.rb +85 -34
- data/lib/padrino-gen/generators/templates/Gemfile.tt +12 -21
- data/lib/padrino-gen/padrino-tasks/activerecord.rb +0 -194
- data/lib/padrino-gen.rb +21 -0
- data/test/helper.rb +2 -20
- data/test/test_app_generator.rb +17 -17
- data/test/test_cli.rb +6 -5
- data/test/test_controller_generator.rb +52 -44
- data/test/test_generator.rb +1 -1
- data/test/test_mailer_generator.rb +18 -18
- data/test/test_migration_generator.rb +44 -44
- data/test/test_model_generator.rb +140 -123
- data/test/test_plugin_generator.rb +21 -33
- data/test/test_project_generator.rb +125 -103
- metadata +10 -8
@@ -23,17 +23,17 @@ class <%= @app_name %> < Padrino::Application
|
|
23
23
|
##
|
24
24
|
# Application configuration options
|
25
25
|
#
|
26
|
-
# set :raise_errors, true
|
27
|
-
# set :dump_errors, true
|
28
|
-
# set :show_exceptions, true
|
29
|
-
# set :logging, true
|
30
|
-
# set :
|
31
|
-
# set :reload, false
|
32
|
-
# set :default_builder, "foo"
|
33
|
-
# set :locale_path, "bar"
|
34
|
-
# disable :sessions
|
35
|
-
# disable :flash
|
36
|
-
# layout :my_layout
|
26
|
+
# set :raise_errors, true # Raise exceptions (will stop application) (default for test)
|
27
|
+
# set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development)
|
28
|
+
# set :show_exceptions, true # Shows a stack trace in browser (default for development)
|
29
|
+
# set :logging, true # Logging in STDOUT for development and file for production (default only for development)
|
30
|
+
# set :public_folder, "foo/bar" # Location for static assets (default root/public)
|
31
|
+
# set :reload, false # Reload application files (default in development)
|
32
|
+
# set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder')
|
33
|
+
# set :locale_path, "bar" # Set path for I18n translations (default your_app/locales)
|
34
|
+
# disable :sessions # Disabled sessions by default (enable if needed)
|
35
|
+
# disable :flash # Disables sinatra-flash (enabled by default if Sinatra::Flash is defined)
|
36
|
+
# layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
|
37
37
|
#
|
38
38
|
|
39
39
|
##
|
@@ -26,6 +26,8 @@ module Padrino
|
|
26
26
|
require_arguments!
|
27
27
|
|
28
28
|
# Copies over the Padrino base admin application
|
29
|
+
#
|
30
|
+
# @api private
|
29
31
|
def create_app
|
30
32
|
self.destination_root = options[:root]
|
31
33
|
@app_name = name.gsub(/\W/, "_").underscore.camelize
|
@@ -36,15 +38,14 @@ module Padrino
|
|
36
38
|
append_file destination_root("config/apps.rb"), "\nPadrino.mount(\"#{@app_name}\").to(\"/#{@app_name.downcase}\")"
|
37
39
|
|
38
40
|
return if self.behavior == :revoke
|
39
|
-
say
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
This application has been mounted to /#{@app_name.downcase}
|
44
|
-
You can configure a different path by editing 'config/apps.rb
|
45
|
-
|
46
|
-
|
47
|
-
TEXT
|
41
|
+
say
|
42
|
+
say "="*65, :green
|
43
|
+
say "Your #{@app_name} application has been installed."
|
44
|
+
say "="*65, :green
|
45
|
+
say "This application has been mounted to /#{@app_name.downcase}"
|
46
|
+
say "You can configure a different path by editing 'config/apps.rb"
|
47
|
+
say "="*65, :green
|
48
|
+
say
|
48
49
|
else
|
49
50
|
say "You are not at the root of a Padrino application! (config/boot.rb not found)"
|
50
51
|
end
|
@@ -15,6 +15,8 @@ module Padrino
|
|
15
15
|
|
16
16
|
# We need to TRY to load boot because some of our app dependencies maybe have
|
17
17
|
# custom generators, so is necessary know who are.
|
18
|
+
#
|
19
|
+
# @api private
|
18
20
|
def load_boot
|
19
21
|
begin
|
20
22
|
ENV['PADRINO_LOG_LEVEL'] ||= "test"
|
@@ -35,6 +37,7 @@ module Padrino
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
40
|
+
# @api private
|
38
41
|
def setup
|
39
42
|
Padrino::Generators.load_components!
|
40
43
|
|
@@ -4,15 +4,30 @@ module Padrino
|
|
4
4
|
module Actions
|
5
5
|
# For orm database components
|
6
6
|
# Generates the model migration file created when generating a new model
|
7
|
-
#
|
8
|
-
#
|
7
|
+
#
|
8
|
+
# @param [String] filename
|
9
|
+
# File name of model migration
|
10
|
+
# @param [String] name
|
11
|
+
# Name of model
|
12
|
+
# @param [Array<String>] columns
|
13
|
+
# Array of column names and property type
|
14
|
+
# @param [Hash] options
|
15
|
+
# Additional migration options, e.g { :base => "....text...", :up => "..text...",
|
16
|
+
# :down => "..text...", column_format => "t.column :#{field}, :#{kind}" }
|
17
|
+
# @example
|
18
|
+
# output_model_migration("AddPerson", "person", ["name:string", "age:integer"],
|
19
|
+
# :base => AR_MIGRATION,
|
20
|
+
# :column_format => Proc.new { |field, kind| "t.#{kind.underscore.gsub(/_/, '')} :#{field}" },
|
21
|
+
# :up => AR_MODEL_UP_MG, :down => AR_MODEL_DOWN_MG)
|
22
|
+
#
|
23
|
+
# @api private
|
9
24
|
def output_model_migration(filename, name, columns, options={})
|
10
25
|
if behavior == :revoke
|
11
26
|
remove_migration(filename)
|
12
27
|
else
|
13
28
|
return if migration_exist?(filename)
|
14
29
|
model_name = name.to_s.pluralize
|
15
|
-
field_tuples =
|
30
|
+
field_tuples = columns.map { |value| value.split(":") }
|
16
31
|
field_tuples.map! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] } # fix datetime
|
17
32
|
column_declarations = field_tuples.map(&options[:column_format]).join("\n ")
|
18
33
|
contents = options[:base].dup.gsub(/\s{4}!UP!\n/m, options[:up]).gsub(/!DOWN!\n/m, options[:down])
|
@@ -27,9 +42,25 @@ module Padrino
|
|
27
42
|
|
28
43
|
# For orm database components
|
29
44
|
# Generates a standalone migration file based on the given options and columns
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
45
|
+
#
|
46
|
+
# @param [String] filename
|
47
|
+
# File name of model migration
|
48
|
+
# @param [String] name
|
49
|
+
# Name of model
|
50
|
+
# @param [Array<String>] columns
|
51
|
+
# Array of column names and property type
|
52
|
+
# @param [Hash] options
|
53
|
+
# Additional migration options, e.g { :base "...text...", :change_format => "...text...",
|
54
|
+
# :add => proc { |field, kind| "add_column :#{table_name}, :#{field}, :#{kind}" },
|
55
|
+
# :remove => proc { |field, kind| "remove_column :#{table_name}, :#{field}" }
|
56
|
+
# @example
|
57
|
+
# output_migration_file(migration_name, name, columns,
|
58
|
+
# :base => AR_MIGRATION, :change_format => AR_CHANGE_MG,
|
59
|
+
# :add => Proc.new { |field, kind| "t.#{kind.underscore.gsub(/_/, '')} :#{field}" },
|
60
|
+
# :remove => Proc.new { |field, kind| "t.remove :#{field}" }
|
61
|
+
# )
|
62
|
+
#
|
63
|
+
# @api private
|
33
64
|
def output_migration_file(filename, name, columns, options={})
|
34
65
|
if behavior == :revoke
|
35
66
|
remove_migration(name)
|
@@ -56,6 +87,8 @@ module Padrino
|
|
56
87
|
|
57
88
|
# For migration files
|
58
89
|
# returns the number of the latest(most current) migration file
|
90
|
+
#
|
91
|
+
# @api private
|
59
92
|
def return_last_migration_number
|
60
93
|
Dir[destination_root('db/migrate/*.rb')].map { |f|
|
61
94
|
File.basename(f).match(/^(\d+)/)[0].to_i
|
@@ -63,12 +96,24 @@ module Padrino
|
|
63
96
|
end
|
64
97
|
|
65
98
|
# Return true if the migration already exist
|
99
|
+
#
|
100
|
+
# @param [String] filename
|
101
|
+
# File name of the migration file
|
102
|
+
#
|
103
|
+
# @param [Boolean] Boolean if file exists
|
104
|
+
#
|
105
|
+
# @api private
|
66
106
|
def migration_exist?(filename)
|
67
107
|
Dir[destination_root("db/migrate/*_#{filename.underscore}.rb")].size > 0
|
68
108
|
end
|
69
109
|
|
70
110
|
# For the removal of migration files
|
71
111
|
# removes the migration file based on the migration name
|
112
|
+
#
|
113
|
+
# @param [String] name
|
114
|
+
# File name of the migration
|
115
|
+
#
|
116
|
+
# @api private
|
72
117
|
def remove_migration(name)
|
73
118
|
migration_path = Dir[destination_root('db/migrate/*.rb')].find do |f|
|
74
119
|
File.basename(f) =~ /#{name.to_s.underscore}/
|
@@ -81,8 +126,17 @@ module Padrino
|
|
81
126
|
|
82
127
|
# For testing components
|
83
128
|
# Injects the test class text into the test_config file for setting up the test gen
|
84
|
-
#
|
85
|
-
#
|
129
|
+
#
|
130
|
+
# @param [String] suite_text
|
131
|
+
# Class name for test suite
|
132
|
+
# @param [Hash] options
|
133
|
+
# Additional options to pass into injection
|
134
|
+
#
|
135
|
+
# @example
|
136
|
+
# insert_test_suite_setup('...CLASS_NAME...')
|
137
|
+
# => inject_into_file("test/test_config.rb", TEST.gsub(/CLASS_NAME/, @app_name), :after => "set :environment, :test")
|
138
|
+
#
|
139
|
+
# @api private
|
86
140
|
def insert_test_suite_setup(suite_text, options={})
|
87
141
|
options.reverse_merge!(:path => "test/test_config.rb")
|
88
142
|
create_file(options[:path], suite_text.gsub(/CLASS_NAME/, @app_name))
|
@@ -90,8 +144,17 @@ module Padrino
|
|
90
144
|
|
91
145
|
# For mocking components
|
92
146
|
# Injects the mock library include into the test class in test_config for setting up mock gen
|
93
|
-
#
|
94
|
-
#
|
147
|
+
#
|
148
|
+
# @param [String] library_name
|
149
|
+
# name of mocking library
|
150
|
+
# @param [Hash] options
|
151
|
+
# Additional options to pass into injection
|
152
|
+
#
|
153
|
+
# @example
|
154
|
+
# insert_mock_library_include('Mocha::API')
|
155
|
+
# => inject_into_file("test/test_config.rb", " include Mocha::API\n", :after => /class.*?\n/)
|
156
|
+
#
|
157
|
+
# @api private
|
95
158
|
def insert_mocking_include(library_name, options={})
|
96
159
|
options.reverse_merge!(:indent => 2, :after => /class.*?\n/, :path => "test/test_config.rb")
|
97
160
|
return unless File.exist?(destination_root(options[:path]))
|
@@ -100,13 +163,25 @@ module Padrino
|
|
100
163
|
end
|
101
164
|
|
102
165
|
# Returns space characters of given count
|
103
|
-
#
|
166
|
+
#
|
167
|
+
# @example
|
168
|
+
# indent_spaces(2)
|
169
|
+
#
|
170
|
+
# @api private
|
104
171
|
def indent_spaces(count)
|
105
172
|
' ' * count
|
106
173
|
end
|
107
174
|
|
108
175
|
# For Controller action generation
|
109
176
|
# Takes in fields for routes in the form of get:index post:test delete:yada and such
|
177
|
+
#
|
178
|
+
# @param [Array<String>] fields
|
179
|
+
# Array of controller actions and route name
|
180
|
+
#
|
181
|
+
# @example
|
182
|
+
# controller_actions "get:index", "post:test"o
|
183
|
+
#
|
184
|
+
# @api private
|
110
185
|
def controller_actions(fields)
|
111
186
|
field_tuples = fields.map { |value| value.split(":") }
|
112
187
|
action_declarations = field_tuples.map do |request, name|
|
@@ -5,7 +5,9 @@ def setup_mock
|
|
5
5
|
inject_into_file 'spec/spec_helper.rb', " conf.mock_with :rr\n", :after => "RSpec.configure do |conf|\n"
|
6
6
|
when 'riot'
|
7
7
|
inject_into_file "test/test_config.rb","require 'riot/rr'\n", :after => "\"/../config/boot\")\n"
|
8
|
-
|
8
|
+
when 'minitest'
|
9
|
+
insert_mocking_include "RR::Adapters::MiniTest", :path => "test/test_config.rb"
|
10
|
+
else # default include
|
9
11
|
insert_mocking_include "RR::Adapters::RRMethods", :path => "test/test_config.rb"
|
10
12
|
end
|
11
13
|
end
|
@@ -29,7 +29,7 @@ MONGO
|
|
29
29
|
def setup_orm
|
30
30
|
require_dependencies 'bson_ext', :require => 'mongo'
|
31
31
|
require_dependencies 'mongoid'
|
32
|
-
require_dependencies('SystemTimer', :require => 'system_timer') if RUBY_VERSION =~ /1\.8/
|
32
|
+
require_dependencies('SystemTimer', :require => 'system_timer') if RUBY_VERSION =~ /1\.8/ && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby')
|
33
33
|
create_file("config/database.rb", MONGOID.gsub(/!NAME!/, @app_name.underscore))
|
34
34
|
end
|
35
35
|
|
@@ -11,7 +11,7 @@ MONGO
|
|
11
11
|
def setup_orm
|
12
12
|
require_dependencies 'bson_ext', :require => 'mongo'
|
13
13
|
require_dependencies 'mongo_mapper'
|
14
|
-
require_dependencies('SystemTimer', :require => 'system_timer') if RUBY_VERSION =~ /1\.8/
|
14
|
+
require_dependencies('SystemTimer', :require => 'system_timer') if RUBY_VERSION =~ /1\.8/ && (!defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby')
|
15
15
|
create_file("config/database.rb", MONGO.gsub(/!NAME!/, @app_name.underscore))
|
16
16
|
end
|
17
17
|
|
@@ -0,0 +1,78 @@
|
|
1
|
+
MINITEST_SETUP = (<<-TEST).gsub(/^ {10}/, '') unless defined?(MINITEST_SETUP)
|
2
|
+
PADRINO_ENV = 'test' unless defined?(PADRINO_ENV)
|
3
|
+
require File.expand_path('../../config/boot, __FILE__)
|
4
|
+
|
5
|
+
class MiniTest::Unit::TestCase
|
6
|
+
include Rack::Test::Methods
|
7
|
+
|
8
|
+
def app
|
9
|
+
##
|
10
|
+
# You can handle all padrino applications using instead:
|
11
|
+
# Padrino.application
|
12
|
+
CLASS_NAME.tap { |app| }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
TEST
|
16
|
+
|
17
|
+
MINITEST_RAKE = (<<-TEST).gsub(/^ {10}/, '') unless defined?(MINITEST_RAKE)
|
18
|
+
require 'rake/testtask'
|
19
|
+
|
20
|
+
test_tasks = Dir['test/*/'].map { |d| File.basename(d) }
|
21
|
+
|
22
|
+
test_tasks.each do |folder|
|
23
|
+
Rake::TestTask.new("test:\#{folder}") do |test|
|
24
|
+
test.pattern = "test/\#{folder}/**/*_test.rb"
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
desc "Run application test suite"
|
30
|
+
task 'test' => test_tasks.map { |f| "test:\#{f}" }
|
31
|
+
TEST
|
32
|
+
|
33
|
+
MINITEST_CONTROLLER_TEST = (<<-TEST).gsub(/^ {10}/, '') unless defined?(MINITEST_CONTROLLER_TEST)
|
34
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
35
|
+
|
36
|
+
describe "!NAME!Controller" do
|
37
|
+
before do
|
38
|
+
get '/'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should return hello world text" do
|
42
|
+
assert_equal "Hello World", last_response.body
|
43
|
+
end
|
44
|
+
end
|
45
|
+
TEST
|
46
|
+
|
47
|
+
MINITEST_MODEL_TEST = (<<-TEST).gsub(/^ {10}/, '') unless defined?(MINITEST_MODEL_TEST)
|
48
|
+
require File.expand_path(File.dirname(__FILE__) + '!PATH!/test_config.rb')
|
49
|
+
|
50
|
+
describe "!NAME! Model" do
|
51
|
+
it 'can construct a new instance' do
|
52
|
+
@!DNAME! = !NAME!.new
|
53
|
+
refute_nil @!DNAME!
|
54
|
+
end
|
55
|
+
end
|
56
|
+
TEST
|
57
|
+
|
58
|
+
def setup_test
|
59
|
+
require_dependencies 'rack-test', :require => 'rack/test', :group => 'test'
|
60
|
+
require_dependencies 'minitest', :version => "~>2.6.0", :require => 'minitest/autorun', :group => 'test'
|
61
|
+
insert_test_suite_setup MINITEST_SETUP
|
62
|
+
create_file destination_root("test/test.rake"), MINITEST_RAKE
|
63
|
+
end
|
64
|
+
|
65
|
+
# Generates a controller test given the controllers name
|
66
|
+
def generate_controller_test(name)
|
67
|
+
minitest_contents = MINITEST_CONTROLLER_TEST.gsub(/!NAME!/, name.to_s.camelize)
|
68
|
+
controller_test_path = File.join('test',options[:app],'controllers',"#{name.to_s.underscore}_controller_test.rb")
|
69
|
+
create_file destination_root(controller_test_path), minitest_contents, :skip => true
|
70
|
+
end
|
71
|
+
|
72
|
+
def generate_model_test(name)
|
73
|
+
minitest_contents = MINITEST_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.to_s.underscore)
|
74
|
+
path = options[:app] == '.' ? '/..' : '/../..'
|
75
|
+
minitest_contents.gsub!(/!PATH!/,path)
|
76
|
+
model_test_path = File.join('test',options[:app],'models',"#{name.to_s.underscore}_test.rb")
|
77
|
+
create_file destination_root(model_test_path), minitest_contents, :skip => true
|
78
|
+
end
|
@@ -32,7 +32,7 @@ module Padrino
|
|
32
32
|
|
33
33
|
# Definitions for the available customizable components
|
34
34
|
component_option :orm, "database engine", :aliases => '-d', :choices => [:activerecord, :datamapper, :mongomapper, :mongoid, :sequel, :couchrest, :ohm, :mongomatic, :ripple], :default => :none
|
35
|
-
component_option :test, "testing framework", :aliases => '-t', :choices => [:rspec, :shoulda, :cucumber, :bacon, :testspec, :riot], :default => :none
|
35
|
+
component_option :test, "testing framework", :aliases => '-t', :choices => [:rspec, :shoulda, :cucumber, :bacon, :testspec, :riot, :minitest], :default => :none
|
36
36
|
component_option :mock, "mocking library", :aliases => '-m', :choices => [:mocha, :rr], :default => :none
|
37
37
|
component_option :script, "javascript library", :aliases => '-s', :choices => [:jquery, :prototype, :rightjs, :mootools, :extcore, :dojo], :default => :none
|
38
38
|
component_option :renderer, "template engine", :aliases => '-e', :choices => [:haml, :erb, :liquid, :slim], :default => :haml
|
@@ -42,6 +42,8 @@ module Padrino
|
|
42
42
|
require_arguments!
|
43
43
|
|
44
44
|
# Copies over the Padrino base application App
|
45
|
+
#
|
46
|
+
# @api private
|
45
47
|
def setup_project
|
46
48
|
valid_constant?(options[:app] || name)
|
47
49
|
@app_name = (options[:app] || name).gsub(/\W/, "_").underscore.camelize
|
@@ -61,6 +63,8 @@ module Padrino
|
|
61
63
|
end
|
62
64
|
|
63
65
|
# For each component, retrieve a valid choice and then execute the associated generator
|
66
|
+
#
|
67
|
+
# @api private
|
64
68
|
def setup_components
|
65
69
|
return if options[:template]
|
66
70
|
@_components = options.dup.slice(*self.class.component_types)
|
@@ -72,6 +76,8 @@ module Padrino
|
|
72
76
|
end
|
73
77
|
|
74
78
|
# Bundle all required components using bundler and Gemfile
|
79
|
+
#
|
80
|
+
# @api private
|
75
81
|
def bundle_dependencies
|
76
82
|
if options[:bundle]
|
77
83
|
run_bundler
|
@@ -79,13 +85,15 @@ module Padrino
|
|
79
85
|
end
|
80
86
|
|
81
87
|
# Finish message
|
88
|
+
#
|
89
|
+
# @api private
|
82
90
|
def finish_message
|
83
91
|
say
|
84
92
|
say "="*65, :green
|
85
93
|
say "#{name} is ready for development!", :green
|
86
94
|
say "="*65, :green
|
87
|
-
say "$ cd #{options[:root]}/#{name}"
|
88
|
-
say "$ bundle install"
|
95
|
+
say "$ cd #{options[:root]}/#{name}"
|
96
|
+
say "$ bundle install" unless options[:bundle]
|
89
97
|
say "="*65, :green
|
90
98
|
say
|
91
99
|
end
|