padrino-gen 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|