padrino-gen 0.2.0 → 0.2.1

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/README.rdoc CHANGED
@@ -46,15 +46,15 @@ setup performed for the default components.
46
46
 
47
47
  You can also define specific components to be used:
48
48
 
49
- $ padrino-gen demo_app . --test=rspec --renderer=haml --mock=rr --script=jquery --orm datamapper
49
+ $ padrino-gen demo_app . --test rspec --renderer haml --mock rr --script jquery --orm datamapper
50
50
 
51
51
  There is also support for aliases for each component within the command:
52
52
 
53
- $ padrino-gen demo_app . -t=rspec -r=haml -m=rr -s=jquery -d=datamapper
53
+ $ padrino-gen demo_app . -t rspec -r haml -m rr -s jquery -d datamapper
54
54
 
55
55
  You can also instruct the generator to skip a certain component to avoid using one at all (or to use your own):
56
56
 
57
- $ padrino-gen demo_app . --test=none --renderer=none
57
+ $ padrino-gen demo_app . --test none --renderer none
58
58
 
59
59
  The available components and their default options are listed below:
60
60
 
@@ -142,11 +142,15 @@ Using the controller generator is as simple as:
142
142
 
143
143
  You can also specify desired actions to be added to your controller:
144
144
 
145
- $ padrino-gen controller Admin :index [:admin, :index]
145
+ $ padrino-gen controller Admin get:index get:new post:create
146
146
 
147
147
  The controller generator will then construct the controller file within <tt>app/controllers/admin.rb</tt>
148
148
  and also a controller test file at <tt>test/controllers/admin_controller_test.rb</tt> according to the
149
- test framework chosen during app generation.
149
+ test framework chosen during app generation. A default route will also be generated mapping to name of the controller and the route name. For example:
150
+
151
+ $ padrino-gen controller User get:index
152
+
153
+ will create a url route for :index mapping to "/user/index"
150
154
 
151
155
  === Mailer Generator ===
152
156
 
@@ -166,4 +170,4 @@ The mailer generator will then construct the mailer file within <tt>app/mailers/
166
170
 
167
171
  == Copyright
168
172
 
169
- Copyright (c) 2009 Padrino. See LICENSE for details.
173
+ Copyright (c) 2009 Padrino. See LICENSE for details.
data/Rakefile CHANGED
@@ -20,6 +20,7 @@ begin
20
20
  gem.add_development_dependency "mocha", ">= 0.9.7"
21
21
  gem.add_development_dependency "rack-test", ">= 0.5.0"
22
22
  gem.add_development_dependency "webrat", ">= 0.5.1"
23
+ gem.add_development_dependency "fakeweb", ">= 1.2.3"
23
24
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
24
25
  end
25
26
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.1
data/bin/padrino-gen CHANGED
@@ -5,6 +5,7 @@ require File.dirname(__FILE__) + "/../lib/padrino-gen"
5
5
  generator_mappings = SupportLite::OrderedHash.new
6
6
  generator_mappings[:app] = Padrino::Generators::Skeleton
7
7
  generator_mappings[:model] = Padrino::Generators::Model
8
+ generator_mappings[:migration] = Padrino::Generators::Migration
8
9
  generator_mappings[:controller] = Padrino::Generators::Controller
9
10
  generator_mappings[:mailer] = Padrino::Generators::Mailer
10
11
 
@@ -27,15 +27,62 @@ module Padrino
27
27
  inject_into_file('Gemfile', options[:content], :after => options[:after])
28
28
  end
29
29
 
30
+ # For orm database components
31
+ # Generates the model migration file created when generating a new model
32
+ # options => { :base => "....text...", :up => "..text...",
33
+ # :down => "..text...", column_format => "t.column :#{field}, :#{kind}" }
34
+ def output_model_migration(filename, name, columns, options={})
35
+ model_name = name.to_s.pluralize
36
+ field_tuples = fields.collect { |value| value.split(":") }
37
+ field_tuples.collect! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] } # fix datetime
38
+ column_declarations = field_tuples.collect(&options[:column_format]).join("\n ")
39
+ contents = options[:base].dup.gsub(/\s{4}!UP!\n/m, options[:up]).gsub(/!DOWN!\n/m, options[:down])
40
+ contents = contents.gsub(/!NAME!/, model_name.camelize).gsub(/!TABLE!/, model_name.underscore)
41
+ contents = contents.gsub(/!FILENAME!/, filename.underscore).gsub(/!FILECLASS!/, filename.camelize)
42
+ current_migration_number = Dir[app_root_path('db/migrate/*.rb')].map { |f|
43
+ File.basename(f).match(/^(\d+)/)[0].to_i }.max.to_i || 0
44
+ contents = contents.gsub(/!FIELDS!/, column_declarations).gsub(/!VERSION!/, (current_migration_number + 1).to_s)
45
+ migration_filename = "#{format("%03d", current_migration_number+1)}_#{filename.underscore}.rb"
46
+ create_file(app_root_path('db/migrate/', migration_filename), contents)
47
+ end
48
+
49
+ # For orm database components
50
+ # Generates a standalone migration file based on the given options and columns
51
+ # options => { :base "...text...", :change_format => "...text...",
52
+ # :add => lambda { |field, kind| "add_column :#{table_name}, :#{field}, :#{kind}" },
53
+ # :remove => lambda { |field, kind| "remove_column :#{table_name}, :#{field}" }
54
+ def output_migration_file(filename, name, columns, options={})
55
+ change_format = options[:change_format]
56
+ migration_scan = filename.camelize.scan(/(Add|Remove)(?:.*?)(?:To|From)(.*?)$/).flatten
57
+ direction, table_name = migration_scan[0].downcase, migration_scan[1].downcase.pluralize if migration_scan.any?
58
+ tuples = direction ? columns.collect { |value| value.split(":") } : []
59
+ tuples.collect! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] } # fix datetime
60
+ add_columns = tuples.collect(&options[:add]).join("\n ")
61
+ remove_columns = tuples.collect(&options[:remove]).join("\n ")
62
+ forward_text = change_format.gsub(/!TABLE!/, table_name).gsub(/!COLUMNS!/, add_columns) if tuples.any?
63
+ back_text = change_format.gsub(/!TABLE!/, table_name).gsub(/!COLUMNS!/, remove_columns) if tuples.any?
64
+ contents = options[:base].dup.gsub(/\s{4}!UP!\n/m, (direction == 'add' ? forward_text.to_s : back_text.to_s))
65
+ contents.gsub!(/\s{4}!DOWN!\n/m, (direction == 'add' ? back_text.to_s : forward_text.to_s))
66
+ contents = contents.gsub(/!FILENAME!/, filename.underscore).gsub(/!FILECLASS!/, filename.camelize)
67
+ current_migration_number = Dir[app_root_path('db/migrate/*.rb')].map { |f|
68
+ File.basename(f).match(/^(\d+)/)[0].to_i }.max.to_i || 0
69
+ contents.gsub!(/!VERSION!/, (current_migration_number + 1).to_s)
70
+ migration_filename = "#{format("%03d", current_migration_number+1)}_#{filename.underscore}.rb"
71
+ # migration_filename = "#{Time.now.strftime("%Y%m%d%H%M%S")}_#{filename.underscore}.rb"
72
+ create_file(app_root_path('db/migrate/', migration_filename), contents)
73
+ end
74
+
75
+ # For testing components
30
76
  # Injects the test class text into the test_config file for setting up the test gen
31
77
  # insert_test_suite_setup('...CLASS_NAME...')
32
- # => inject_into_file("test/test_config.rb", TEST.gsub(/CLASS_NAME/, @class_name), :after => "set :environment, :test\n")
78
+ # => inject_into_file("test/test_config.rb", TEST.gsub(/CLASS_NAME/, @class_name), :after => "set :environment, :test")
33
79
  def insert_test_suite_setup(suite_text, options={})
34
80
  test_helper_text = [BASE_TEST_HELPER, suite_text.gsub(/CLASS_NAME/, @class_name)].join("\n")
35
81
  options.reverse_merge!(:path => "test/test_config.rb")
36
82
  create_file(options[:path], test_helper_text)
37
83
  end
38
84
 
85
+ # For mocking components
39
86
  # Injects the mock library include into the test class in test_config for setting up mock gen
40
87
  # insert_mock_library_include('Mocha::API')
41
88
  # => inject_into_file("test/test_config.rb", " include Mocha::API\n", :after => /class.*?\n/)
@@ -51,6 +98,26 @@ module Padrino
51
98
  def indent_spaces(count)
52
99
  ' ' * count
53
100
  end
101
+
102
+ # For Controller action generation
103
+ # Takes in fields for routes in the form of get:index post:test delete:yada and such
104
+ def controller_actions(fields)
105
+ field_tuples = fields.collect { |value| value.split(":") }
106
+ action_declarations = field_tuples.collect do |request, name|
107
+ "#{request} :#{name} do\n end\n"
108
+ end.join("\n ")
109
+ end
110
+
111
+ # For controller route generation
112
+ # Takes in the fields and maps out an appropriate default route.
113
+ # where controller is user and route is get:test, will add map(:test).to("/user/test")
114
+ def controller_routes(name,fields)
115
+ field_tuples = fields.collect { |value| value.split(":") }
116
+ routes = "\n" + field_tuples.collect do |request, route|
117
+ " map(:#{route}).to(\"/#{name}/#{route}\")"
118
+ end.join("\n") + "\n"
119
+ end
120
+
54
121
  end
55
122
  end
56
123
  end
@@ -8,24 +8,25 @@ module Padrino
8
8
  AR = (<<-AR).gsub(/^ {10}/, '')
9
9
  module DatabaseSetup
10
10
  def self.registered(app)
11
+ app.configure { ActiveRecord::Base.logger = logger }
11
12
  app.configure :development do
12
13
  ActiveRecord::Base.establish_connection(
13
14
  :adapter => 'sqlite3',
14
- :database => 'your_dev_db_here'
15
+ :database => "your_dev_db_here"
15
16
  )
16
17
  end
17
18
 
18
19
  app.configure :production do
19
20
  ActiveRecord::Base.establish_connection(
20
21
  :adapter => 'sqlite3',
21
- :database => 'your_production_db_here'
22
+ :database => "your_production_db_here"
22
23
  )
23
24
  end
24
25
 
25
26
  app.configure :test do
26
27
  ActiveRecord::Base.establish_connection(
27
28
  :adapter => 'sqlite3',
28
- :database => 'your_test_db_here'
29
+ :database => "your_test_db_here"
29
30
  )
30
31
  end
31
32
  end
@@ -39,10 +40,11 @@ module Padrino
39
40
  namespace :db do
40
41
  desc "Migrate the database"
41
42
  task(:migrate) do
42
- load 'config/boot.rb'
43
+ load File.dirname(__FILE__) + '/config/boot.rb'
44
+ APP_CLASS.new
43
45
  ActiveRecord::Base.logger = Logger.new(STDOUT)
44
46
  ActiveRecord::Migration.verbose = true
45
- ActiveRecord::Migrator.migrate("db/migrate")
47
+ ActiveRecord::Migrator.migrate( File.dirname(__FILE__) + "/db/migrate")
46
48
  end
47
49
  end
48
50
  RAKE
@@ -51,7 +53,7 @@ module Padrino
51
53
  def setup_orm
52
54
  require_dependencies 'activerecord'
53
55
  create_file("config/database.rb", AR)
54
- create_file("Rakefile", RAKE)
56
+ create_file("Rakefile", RAKE.gsub(/APP_CLASS/, @class_name))
55
57
  empty_directory('app/models')
56
58
  end
57
59
 
@@ -69,30 +71,47 @@ module Padrino
69
71
  end
70
72
 
71
73
  AR_MIGRATION = (<<-MIGRATION).gsub(/^ {10}/, '')
72
- class !FILENAME! < ActiveRecord::Migration
74
+ class !FILECLASS! < ActiveRecord::Migration
73
75
  def self.up
74
- create_table :!TABLE! do |t|
75
- # t.column <name>, <type>
76
- # t.column :age, :integer
77
- !FIELDS!
78
- end
76
+ !UP!
79
77
  end
80
78
 
81
79
  def self.down
82
- drop_table :users
80
+ !DOWN!
83
81
  end
84
82
  end
85
83
  MIGRATION
86
84
 
87
- def create_migration_file(filename, name, fields)
88
- model_name = name.to_s.pluralize
89
- field_tuples = fields.collect { |value| value.split(":") }
90
- column_declarations = field_tuples.collect { |field, kind| "t.column :#{field}, :#{kind}" }.join("\n ")
91
- migration_contents = AR_MIGRATION.gsub(/!NAME!/, model_name.camelize).gsub(/!TABLE!/, model_name.underscore)
92
- migration_contents.gsub!(/!FILENAME!/, filename.camelize)
93
- migration_contents.gsub!(/!FIELDS!/, column_declarations)
94
- migration_filename = "#{Time.now.to_i}_#{filename}.rb"
95
- create_file(app_root_path('db/migrate/', migration_filename), migration_contents)
85
+ AR_MODEL_UP_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
86
+ create_table :!TABLE! do |t|
87
+ # t.column <name>, <type>
88
+ # t.column :age, :integer
89
+ !FIELDS!
90
+ end
91
+ MIGRATION
92
+
93
+ AR_MODEL_DOWN_MG = (<<-MIGRATION).gsub(/^ {10}/, '')
94
+ drop_table :!TABLE!
95
+ MIGRATION
96
+
97
+ def create_model_migration(migration_name, name, columns)
98
+ output_model_migration(migration_name, name, columns,
99
+ :base => AR_MIGRATION,
100
+ :column_format => lambda { |field, kind| "t.column :#{field}, :#{kind.underscore.gsub(/_/, '')}" },
101
+ :up => AR_MODEL_UP_MG, :down => AR_MODEL_DOWN_MG)
102
+ end
103
+
104
+ AR_CHANGE_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
105
+ change_table :!TABLE! do |t|
106
+ !COLUMNS!
107
+ end
108
+ MIGRATION
109
+
110
+ def create_migration_file(migration_name, name, columns)
111
+ output_migration_file(migration_name, name, columns,
112
+ :base => AR_MIGRATION, :change_format => AR_CHANGE_MG,
113
+ :add => lambda { |field, kind| "t.column :#{field}, :#{kind.underscore.gsub(/_/, '')}" },
114
+ :remove => lambda { |field, kind| "t.remove :#{field}" })
96
115
  end
97
116
 
98
117
  end
@@ -8,14 +8,13 @@ module Padrino
8
8
  COUCHREST = (<<-COUCHREST).gsub(/^ {10}/, '')
9
9
  module DatabaseSetup
10
10
  def self.registered(app)
11
- app.configure(:development) { set :couchdb, CouchRest.database!('your_dev_db_here') }
12
- app.configure(:production) { set :couchdb, CouchRest.database!('your_production_db_here') }
13
- app.configure(:test) { set :couchdb, CouchRest.database!('your_test_db_here') }
11
+ app.configure(:development) { set :couchdb, CouchRest.database!("your_dev_db_here") }
12
+ app.configure(:production) { set :couchdb, CouchRest.database!("your_production_db_here") }
13
+ app.configure(:test) { set :couchdb, CouchRest.database!("your_test_db_here") }
14
14
  end
15
15
  end
16
16
  COUCHREST
17
17
 
18
-
19
18
  def setup_orm
20
19
  require_dependencies 'couchrest'
21
20
  create_file("config/database.rb", COUCHREST)
@@ -44,7 +43,11 @@ module Padrino
44
43
  create_file(model_path, model_contents)
45
44
  end
46
45
 
47
- def create_migration_file(filename, name, fields)
46
+ def create_model_migration(filename, name, fields)
47
+ # NO MIGRATION NEEDED
48
+ end
49
+
50
+ def create_migration_file(migration_name, name, columns)
48
51
  # NO MIGRATION NEEDED
49
52
  end
50
53
  end
@@ -7,11 +7,12 @@ module Padrino
7
7
  DM = (<<-DM).gsub(/^ {10}/, '')
8
8
  module DatabaseSetup
9
9
  def self.registered(app)
10
- app.configure(:development) { DataMapper.setup(:default, 'your_dev_db_here') }
11
- app.configure(:production) { DataMapper.setup(:default, 'your_production_db_here') }
12
- app.configure(:test) { DataMapper.setup(:default, 'your_test_db_here') }
10
+ app.configure { DataMapper.logger = logger }
11
+ app.configure(:development) { DataMapper.setup(:default, "sqlite3://your_dev_db_here") }
12
+ app.configure(:production) { DataMapper.setup(:default, "sqlite3://your_production_db_here") }
13
+ app.configure(:test) { DataMapper.setup(:default, "sqlite3://your_test_db_here") }
13
14
  rescue ArgumentError => e
14
- puts "Database options need to be configured within 'config/database.rb'!" if app.logging?
15
+ logger.error "Database options need to be configured within 'config/database.rb'!" if app.logging?
15
16
  end
16
17
  end
17
18
  DM
@@ -27,7 +28,7 @@ module Padrino
27
28
  include DataMapper::Resource
28
29
 
29
30
  # property <name>, <type>
30
- # property :id, Serial
31
+ property :id, Serial
31
32
  !FIELDS!
32
33
  end
33
34
  MODEL
@@ -37,35 +38,53 @@ module Padrino
37
38
  return false if File.exist?(model_path)
38
39
  model_contents = DM_MODEL.gsub(/!NAME!/, name.to_s.downcase.camelize)
39
40
  field_tuples = fields.collect { |value| value.split(":") }
41
+ field_tuples.collect! { |field, kind| kind =~ /datetime/i ? [field, 'DateTime'] : [field, kind] } # fix datetime
40
42
  column_declarations = field_tuples.collect { |field, kind|"property :#{field}, #{kind.camelize}" }.join("\n ")
41
43
  model_contents.gsub!(/!FIELDS!/, column_declarations)
42
44
  create_file(model_path, model_contents)
43
45
  end
44
46
 
45
47
  DM_MIGRATION = (<<-MIGRATION).gsub(/^ {10}/, '')
46
- migration NUM, :!FILENAME! do
48
+ migration !VERSION!, :!FILENAME! do
47
49
  up do
48
- create_table(:!TABLE!) do
49
- column(:id, Integer, :serial => true)
50
- !FIELDS!
51
- end
50
+ !UP!
52
51
  end
53
52
 
54
53
  down do
55
- drop_table(:!TABLE!)
54
+ !DOWN!
56
55
  end
57
56
  end
58
57
  MIGRATION
59
58
 
60
- def create_migration_file(filename, name, fields)
61
- model_name = name.to_s.pluralize
62
- field_tuples = fields.collect { |value| value.split(":") }
63
- column_declarations = field_tuples.collect { |field, kind|"column(:#{field}, #{kind.camelize})" }.join("\n ")
64
- migration_contents = DM_MIGRATION.gsub(/!NAME!/, model_name.camelize).gsub(/!TABLE!/, model_name.underscore)
65
- migration_contents.gsub!(/!FILENAME!/, filename)
66
- migration_contents.gsub!(/!FIELDS!/, column_declarations)
67
- migration_filename = "#{Time.now.to_i}_#{filename}.rb"
68
- create_file(app_root_path('db/migrate/', migration_filename), migration_contents)
59
+ DM_MODEL_UP_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
60
+ create_table :!TABLE! do
61
+ column :id, Integer, :serial => true
62
+ !FIELDS!
63
+ end
64
+ MIGRATION
65
+
66
+ DM_MODEL_DOWN_MG = (<<-MIGRATION).gsub(/^ {10}/, '')
67
+ drop_table :!TABLE!
68
+ MIGRATION
69
+
70
+ def create_model_migration(migration_name, name, columns)
71
+ output_model_migration(migration_name, name, columns,
72
+ :column_format => lambda { |field, kind| "column :#{field}, #{kind.camelize}" },
73
+ :base => DM_MIGRATION, :up => DM_MODEL_UP_MG, :down => DM_MODEL_DOWN_MG)
74
+ end
75
+
76
+ DM_CHANGE_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
77
+ modify_table :!TABLE! do
78
+ !COLUMNS!
79
+ end
80
+ MIGRATION
81
+
82
+ def create_migration_file(migration_name, name, columns)
83
+ output_migration_file(migration_name, name, columns,
84
+ :base => DM_MIGRATION, :change_format => DM_CHANGE_MG,
85
+ :add => lambda { |field, kind| "add_column :#{field}, #{kind.camelize}" },
86
+ :remove => lambda { |field, kind| "drop_column :#{field}" }
87
+ )
69
88
  end
70
89
  end
71
90
 
@@ -11,17 +11,17 @@ module Padrino
11
11
  module DatabaseSetup
12
12
  def self.registered(app)
13
13
  app.configure :development do
14
- MongoMapper.connection = Mongo::Connection.new('localhost')
14
+ MongoMapper.connection = Mongo::Connection.new('localhost', nil, :logger => logger)
15
15
  MongoMapper.database = 'your_dev_db_here'
16
16
  end
17
17
 
18
18
  app.configure :production do
19
- MongoMapper.connection = Mongo::Connection.new('localhost')
19
+ MongoMapper.connection = Mongo::Connection.new('localhost', nil, :logger => logger)
20
20
  MongoMapper.database = 'your_production_db_here'
21
21
  end
22
22
 
23
23
  app.configure :test do
24
- MongoMapper.connection = Mongo::Connection.new('localhost')
24
+ MongoMapper.connection = Mongo::Connection.new('localhost', nil, :logger => logger)
25
25
  MongoMapper.database = 'your_test_db_here'
26
26
  end
27
27
  end
@@ -53,7 +53,11 @@ module Padrino
53
53
  create_file(model_path, model_contents)
54
54
  end
55
55
 
56
- def create_migration_file(filename, name, fields)
56
+ def create_model_migration(filename, name, fields)
57
+ # NO MIGRATION NEEDED
58
+ end
59
+
60
+ def create_migration_file(migration_name, name, columns)
57
61
  # NO MIGRATION NEEDED
58
62
  end
59
63
  end
@@ -9,9 +9,9 @@ module Padrino
9
9
  module DatabaseSetup
10
10
  def self.registered(app)
11
11
  Sequel::Model.plugin(:schema)
12
- app.configure(:development) { Sequel.connect('your_dev_db_here') }
13
- app.configure(:production) { Sequel.connect('your_production_db_here') }
14
- app.configure(:test) { Sequel.connect('your_test_db_here') }
12
+ app.configure(:development) { Sequel.connect("sqlite://your_dev_db_here", :loggers => [logger]) }
13
+ app.configure(:production) { Sequel.connect("sqlite://your_production_db_here", :loggers => [logger]) }
14
+ app.configure(:test) { Sequel.connect("sqlite://your_test_db_here", :loggers => [logger]) }
15
15
  end
16
16
  end
17
17
  SEQUEL
@@ -36,30 +36,48 @@ module Padrino
36
36
  end
37
37
 
38
38
  SQ_MIGRATION = (<<-MIGRATION).gsub(/^ {10}/, '')
39
- class !FILENAME! < Sequel::Migration
39
+ class !FILECLASS! < Sequel::Migration
40
40
  def up
41
- create_table :!TABLE! do
42
- primary_key :id
43
- # <type> <name>
44
- !FIELDS!
45
- end
41
+ !UP!
46
42
  end
47
43
 
48
44
  def down
49
- drop_table :!TABLE!
45
+ !DOWN!
50
46
  end
51
47
  end
52
48
  MIGRATION
53
49
 
54
- def create_migration_file(filename, name, fields)
55
- model_name = name.to_s.pluralize
56
- field_tuples = fields.collect { |value| value.split(":") }
57
- column_declarations = field_tuples.collect { |field, kind| "#{kind} :#{field}" }.join("\n ")
58
- migration_contents = SQ_MIGRATION.gsub(/!NAME!/, model_name.camelize).gsub(/!TABLE!/, model_name.underscore)
59
- migration_contents.gsub!(/!FILENAME!/, filename.camelize)
60
- migration_contents.gsub!(/!FIELDS!/, column_declarations)
61
- migration_filename = "#{Time.now.to_i}_#{filename}.rb"
62
- create_file(app_root_path('db/migrate/', migration_filename), migration_contents)
50
+
51
+ SQ_MODEL_UP_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
52
+ create_table :!TABLE! do
53
+ primary_key :id
54
+ # <type> <name>
55
+ !FIELDS!
56
+ end
57
+ MIGRATION
58
+
59
+ SQ_MODEL_DOWN_MG = (<<-MIGRATION).gsub(/^ {10}/, '')
60
+ drop_table :!TABLE!
61
+ MIGRATION
62
+
63
+ def create_model_migration(migration_name, name, columns)
64
+ output_model_migration(migration_name, name, columns,
65
+ :column_format => lambda { |field, kind| "#{kind.camelize} :#{field}" },
66
+ :base => SQ_MIGRATION, :up => SQ_MODEL_UP_MG, :down => SQ_MODEL_DOWN_MG)
67
+ end
68
+
69
+ SQ_CHANGE_MG = (<<-MIGRATION).gsub(/^ {6}/, '')
70
+ alter_table :!TABLE! do
71
+ !COLUMNS!
72
+ end
73
+ MIGRATION
74
+
75
+ def create_migration_file(migration_name, name, columns)
76
+ output_migration_file(migration_name, name, columns,
77
+ :base => SQ_MIGRATION, :change_format => SQ_CHANGE_MG,
78
+ :add => lambda { |field, kind| "add_column :#{field}, #{kind.camelize}" },
79
+ :remove => lambda { |field, kind| "drop_column :#{field}" }
80
+ )
63
81
  end
64
82
  end
65
83
 
@@ -50,7 +50,7 @@ module Padrino
50
50
 
51
51
  def generate_model_test(name)
52
52
  bacon_contents = BACON_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.downcase.underscore)
53
- create_file app_root_path("test/models/#{name.to_s.downcase}.rb"), bacon_contents
53
+ create_file app_root_path("test/models/#{name.to_s.downcase}_test.rb"), bacon_contents
54
54
  end
55
55
 
56
56
  end
@@ -49,7 +49,7 @@ module Padrino
49
49
 
50
50
  def generate_model_test(name)
51
51
  riot_contents = RIOT_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.downcase.underscore)
52
- create_file app_root_path("test/models/#{name.to_s.downcase}.rb"), riot_contents
52
+ create_file app_root_path("test/models/#{name.to_s.downcase}_test.rb"), riot_contents
53
53
  end
54
54
 
55
55
  end
@@ -51,7 +51,7 @@ module Padrino
51
51
 
52
52
  def generate_model_test(name)
53
53
  rspec_contents = RSPEC_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.downcase.underscore)
54
- create_file app_root_path("test/models/#{name.to_s.downcase}.rb"), rspec_contents
54
+ create_file app_root_path("test/models/#{name.to_s.downcase}_spec.rb"), rspec_contents
55
55
  end
56
56
 
57
57
  end
@@ -56,7 +56,7 @@ module Padrino
56
56
 
57
57
  def generate_model_test(name)
58
58
  shoulda_contents = SHOULDA_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.downcase.underscore)
59
- create_file app_root_path("test/models/#{name.to_s.downcase}.rb"), shoulda_contents
59
+ create_file app_root_path("test/models/#{name.to_s.downcase}_test.rb"), shoulda_contents
60
60
  end
61
61
 
62
62
  end
@@ -49,7 +49,7 @@ module Padrino
49
49
 
50
50
  def generate_model_test(name)
51
51
  tests_contents = TESTSPEC_MODEL_TEST.gsub(/!NAME!/, name.to_s.camelize).gsub(/!DNAME!/, name.downcase.underscore)
52
- create_file app_root_path("test/models/#{name.to_s.downcase}.rb"), tests_contents
52
+ create_file app_root_path("test/models/#{name.to_s.downcase}_test.rb"), tests_contents
53
53
  end
54
54
 
55
55
  end
@@ -16,12 +16,15 @@ module Padrino
16
16
  desc "Description:\n\n\tpadrino-gen controller generates a new Padrino controller"
17
17
 
18
18
  argument :name, :desc => "The name of your padrino controller"
19
+ argument :fields, :desc => "The fields for the controller", :type => :array, :default => []
19
20
  class_option :root, :aliases => '-r', :default => nil, :type => :string
20
21
 
21
22
  # Copies over the base sinatra starting project
22
23
  def create_controller
23
24
  if in_app_root?(options[:root])
24
25
  @app_name = fetch_app_name(options[:root])
26
+ @actions = controller_actions(fields)
27
+ inject_into_file app_root_path("config/urls.rb"), controller_routes(name,fields), :after => "urls do\n"
25
28
  template "templates/controller.rb.tt", app_root_path("app/controllers", "#{name}.rb")
26
29
  template "templates/helper.rb.tt", app_root_path("app/helpers", "#{name}_helper.rb")
27
30
  empty_directory app_root_path("app/views/#{name}")
@@ -0,0 +1,34 @@
1
+ require 'thor'
2
+
3
+ module Padrino
4
+ module Generators
5
+
6
+ class Migration < Thor::Group
7
+ # Define the source template root
8
+ def self.source_root; File.expand_path(File.dirname(__FILE__)); end
9
+ def self.banner; "padrino-gen migration [name] [fields]"; end
10
+
11
+ # Include related modules
12
+ include Thor::Actions
13
+ include Padrino::Generators::Actions
14
+ include Padrino::Generators::Components::Actions
15
+
16
+ desc "Description:\n\n\tpadrino-gen migration generates a new migration file"
17
+
18
+ argument :name, :desc => "The name of your padrino migration"
19
+ argument :columns, :desc => "The columns for the migration", :type => :array, :default => []
20
+ class_option :root, :aliases => '-r', :default => nil, :type => :string
21
+
22
+ # Copies over the base sinatra starting project
23
+ def create_model
24
+ if in_app_root?(options[:root])
25
+ include_component_module_for(:orm, options[:root])
26
+ create_migration_file(name, name, columns)
27
+ else
28
+ say "You are not at the root of a Padrino application! (config/boot.rb not found)" and return unless in_app_root?
29
+ end
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -27,7 +27,7 @@ module Padrino
27
27
  migration_name = "create_#{name.pluralize.underscore}"
28
28
  model_success = create_model_file(name, fields)
29
29
  generate_model_test(name) if model_success
30
- model_success ? create_migration_file(migration_name, name, fields) :
30
+ model_success ? create_model_migration(migration_name, name, fields) :
31
31
  say("'#{name}' model has already been generated!")
32
32
  else
33
33
  say "You are not at the root of a Padrino application! (config/boot.rb not found)" and return unless in_app_root?
@@ -14,4 +14,6 @@
14
14
  # get "/example" do
15
15
  # "Hello world!"
16
16
  # end
17
+
18
+ <%= @actions %>
17
19
  end
data/lib/padrino-gen.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  require 'padrino-core/support_lite'
2
2
  Dir[File.dirname(__FILE__) + "/generators/{components}/**/*.rb"].each { |lib| require lib }
3
3
  require File.dirname(__FILE__) + "/generators/actions.rb"
4
- Dir[File.dirname(__FILE__) + "/generators/{skeleton,mailer,controller,model}.rb"].each { |lib| require lib }
4
+ Dir[File.dirname(__FILE__) + "/generators/{skeleton,mailer,controller,model,migration}.rb"].each { |lib| require lib }
data/padrino-gen.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{padrino-gen}
8
- s.version = "0.2.0"
8
+ s.version = "0.2.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Padrino Team", "Nathan Esquenazi", "Davide D'Agostino", "Arthur Chiu"]
12
- s.date = %q{2009-11-23}
12
+ s.date = %q{2009-11-30}
13
13
  s.default_executable = %q{padrino-gen}
14
14
  s.description = %q{Generators for easily creating and building padrino applications from the console}
15
15
  s.email = %q{nesquena@gmail.com}
@@ -46,6 +46,7 @@ Gem::Specification.new do |s|
46
46
  "lib/generators/components/tests/testspec_test_gen.rb",
47
47
  "lib/generators/controller.rb",
48
48
  "lib/generators/mailer.rb",
49
+ "lib/generators/migration.rb",
49
50
  "lib/generators/model.rb",
50
51
  "lib/generators/skeleton.rb",
51
52
  "lib/generators/skeleton/.gitignore",
@@ -65,7 +66,7 @@ Gem::Specification.new do |s|
65
66
  "lib/generators/skeleton/public/images/.empty_directory",
66
67
  "lib/generators/skeleton/public/javascripts/.empty_directory",
67
68
  "lib/generators/skeleton/public/stylesheets/.empty_directory",
68
- "lib/generators/skeleton/tmp/.emptydirectory",
69
+ "lib/generators/skeleton/tmp/.empty_directory",
69
70
  "lib/generators/templates/controller.rb.tt",
70
71
  "lib/generators/templates/helper.rb.tt",
71
72
  "lib/generators/templates/mailer.rb.tt",
@@ -99,6 +100,7 @@ Gem::Specification.new do |s|
99
100
  s.add_development_dependency(%q<mocha>, [">= 0.9.7"])
100
101
  s.add_development_dependency(%q<rack-test>, [">= 0.5.0"])
101
102
  s.add_development_dependency(%q<webrat>, [">= 0.5.1"])
103
+ s.add_development_dependency(%q<fakeweb>, [">= 1.2.3"])
102
104
  else
103
105
  s.add_dependency(%q<sinatra>, [">= 0.9.2"])
104
106
  s.add_dependency(%q<padrino-core>, [">= 0.1.1"])
@@ -109,6 +111,7 @@ Gem::Specification.new do |s|
109
111
  s.add_dependency(%q<mocha>, [">= 0.9.7"])
110
112
  s.add_dependency(%q<rack-test>, [">= 0.5.0"])
111
113
  s.add_dependency(%q<webrat>, [">= 0.5.1"])
114
+ s.add_dependency(%q<fakeweb>, [">= 1.2.3"])
112
115
  end
113
116
  else
114
117
  s.add_dependency(%q<sinatra>, [">= 0.9.2"])
@@ -120,6 +123,7 @@ Gem::Specification.new do |s|
120
123
  s.add_dependency(%q<mocha>, [">= 0.9.7"])
121
124
  s.add_dependency(%q<rack-test>, [">= 0.5.0"])
122
125
  s.add_dependency(%q<webrat>, [">= 0.5.1"])
126
+ s.add_dependency(%q<fakeweb>, [">= 1.2.3"])
123
127
  end
124
128
  end
125
129
 
@@ -5,6 +5,9 @@ class TestControllerGenerator < Test::Unit::TestCase
5
5
  def setup
6
6
  @skeleton = Padrino::Generators::Skeleton.dup
7
7
  @contgen = Padrino::Generators::Controller.dup
8
+ @controller_path = '/tmp/sample_app/app/controllers/demo_items.rb'
9
+ @controller_test_path = '/tmp/sample_app/test/controllers/demo_items_controller_test.rb'
10
+ @route_path = '/tmp/sample_app/config/urls.rb'
8
11
  `rm -rf /tmp/sample_app`
9
12
  end
10
13
 
@@ -18,7 +21,7 @@ class TestControllerGenerator < Test::Unit::TestCase
18
21
  should "generate controller within existing application" do
19
22
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon']) }
20
23
  silence_logger { @contgen.start(['demo_items', '-r=/tmp/sample_app']) }
21
- assert_match_in_file(/SampleApp.controllers do/m, '/tmp/sample_app/app/controllers/demo_items.rb')
24
+ assert_match_in_file(/SampleApp.controllers do/m, @controller_path)
22
25
  assert_match_in_file(/SampleApp.helpers do/m, '/tmp/sample_app/app/helpers/demo_items_helper.rb')
23
26
  assert_file_exists('/tmp/sample_app/app/views/demo_items')
24
27
  end
@@ -26,19 +29,19 @@ class TestControllerGenerator < Test::Unit::TestCase
26
29
  should "generate controller test for bacon" do
27
30
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon']) }
28
31
  silence_logger { @contgen.start(['demo_items', '-r=/tmp/sample_app']) }
29
- assert_match_in_file(/describe "DemoItemsController" do/m, '/tmp/sample_app/test/controllers/demo_items_controller_test.rb')
32
+ assert_match_in_file(/describe "DemoItemsController" do/m, @controller_test_path)
30
33
  end
31
34
 
32
35
  should "generate controller test for riot" do
33
36
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=riot']) }
34
37
  silence_logger { @contgen.start(['demo_items', '-r=/tmp/sample_app']) }
35
- assert_match_in_file(/context "DemoItemsController" do/m, '/tmp/sample_app/test/controllers/demo_items_controller_test.rb')
38
+ assert_match_in_file(/context "DemoItemsController" do/m, @controller_test_path)
36
39
  end
37
40
 
38
41
  should "generate controller test for testspec" do
39
42
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=testspec']) }
40
43
  silence_logger { @contgen.start(['demo_items', '-r=/tmp/sample_app']) }
41
- assert_match_in_file(/context "DemoItemsController" do/m, '/tmp/sample_app/test/controllers/demo_items_controller_test.rb')
44
+ assert_match_in_file(/context "DemoItemsController" do/m, @controller_test_path)
42
45
  end
43
46
 
44
47
  should "generate controller test for rspec" do
@@ -51,7 +54,24 @@ class TestControllerGenerator < Test::Unit::TestCase
51
54
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=shoulda']) }
52
55
  silence_logger { @contgen.start(['demo_items', '-r=/tmp/sample_app']) }
53
56
  expected_pattern = /class DemoItemsControllerTest < Test::Unit::TestCase/m
54
- assert_match_in_file(expected_pattern, '/tmp/sample_app/test/controllers/demo_items_controller_test.rb')
57
+ assert_match_in_file(expected_pattern, @controller_test_path)
55
58
  end
59
+
60
+ # Controller action generation
61
+
62
+ should "generate actions for get:test post:yada" do
63
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=shoulda'])}
64
+ silence_logger { @contgen.start(['demo_items', "get:test","post:yada",'-r=/tmp/sample_app']) }
65
+ assert_match_in_file(/get :test do\n end\n/m,@controller_path)
66
+ assert_match_in_file(/post :yada do\n end\n/m,@controller_path)
67
+ end
68
+
69
+ should "generate url routes for get:yoda post:yada" do
70
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=shoulda'])}
71
+ silence_logger { @contgen.start(['demo_items', "get:yoda","post:yada",'-r=/tmp/sample_app']) }
72
+ assert_match_in_file(/map\(\:yoda\).to\(\"\/demo_items\/yoda\"\)/m,@route_path)
73
+ assert_match_in_file(/map\(\:yada\).to\(\"\/demo_items\/yada\"\)/m,@route_path)
74
+ end
75
+
56
76
  end
57
77
  end
@@ -4,14 +4,155 @@ require 'thor'
4
4
  class TestMigrationGenerator < Test::Unit::TestCase
5
5
  def setup
6
6
  @skeleton = Padrino::Generators::Skeleton.dup
7
- # @mig_gen = Padrino::Generators::Migration.dup
7
+ @mig_gen = Padrino::Generators::Migration.dup
8
8
  `rm -rf /tmp/sample_app`
9
9
  end
10
10
 
11
11
  context 'the migration generator' do
12
- should "work" do
12
+ should "fail outside app root" do
13
+ output = silence_logger { @mig_gen.start(['add_email_to_users', '-r=/tmp']) }
14
+ assert_match(/not at the root/, output)
15
+ assert_no_file_exists('/tmp/db/migration')
16
+ end
17
+
18
+ should "generate migration inside app root" do
19
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
20
+ response_success = silence_logger { @mig_gen.start(['AddEmailToUsers', '-r=/tmp/sample_app']) }
21
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_users.rb"
22
+ assert_match_in_file(/class AddEmailToUser/m, migration_file_path)
23
+ end
13
24
 
25
+ should "generate migration inside app root with lowercase migration argument" do
26
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
27
+ response_success = silence_logger { @mig_gen.start(['add_email_to_users', '-r=/tmp/sample_app']) }
28
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_users.rb"
29
+ assert_match_in_file(/class AddEmailToUsers/m, migration_file_path)
30
+ end
31
+
32
+ should "generate migration inside app root with singular table" do
33
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
34
+ silence_logger { @mig_gen.start(['add_email_to_user', "email:string", '-r=/tmp/sample_app']) }
35
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_user.rb"
36
+ assert_match_in_file(/class AddEmailToUser/m, migration_file_path)
37
+ assert_match_in_file(/t.column :email, :string/, migration_file_path)
38
+ assert_match_in_file(/t.remove :email/, migration_file_path)
39
+ end
40
+ should "properly calculate version number" do
41
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=sequel']) }
42
+ silence_logger { @mig_gen.start(['add_email_to_person', "email:string", '-r=/tmp/sample_app']) }
43
+ silence_logger { @mig_gen.start(['add_name_to_person', "email:string", '-r=/tmp/sample_app']) }
44
+ silence_logger { @mig_gen.start(['add_age_to_user', "email:string", '-r=/tmp/sample_app']) }
45
+ assert_match_in_file(/class AddEmailToPerson/m, "/tmp/sample_app/db/migrate/001_add_email_to_person.rb")
46
+ assert_match_in_file(/class AddNameToPerson/m, "/tmp/sample_app/db/migrate/002_add_name_to_person.rb")
47
+ assert_match_in_file(/class AddAgeToUser/m, "/tmp/sample_app/db/migrate/003_add_age_to_user.rb")
48
+ end
49
+ end
50
+
51
+ context 'the migration generator for activerecord' do
52
+ should "generate migration for generic needs" do
53
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
54
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields', '-r=/tmp/sample_app']) }
55
+ migration_file_path = "/tmp/sample_app/db/migrate/001_modify_user_fields.rb"
56
+ assert_match_in_file(/class ModifyUserFields/m, migration_file_path)
57
+ assert_match_in_file(/def self\.up\s+end/m, migration_file_path)
58
+ assert_match_in_file(/def self\.down\s+end/m, migration_file_path)
59
+ end
60
+ should "generate migration for adding columns" do
61
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
62
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
63
+ response_success = silence_logger { @mig_gen.start(migration_params) }
64
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_users.rb"
65
+ assert_match_in_file(/class AddEmailToUsers/m, migration_file_path)
66
+ assert_match_in_file(/change_table :users.*?t\.column :email, :string/m, migration_file_path)
67
+ assert_match_in_file(/t\.column :age, :integer/m, migration_file_path)
68
+ assert_match_in_file(/change_table :users.*?t\.remove :email/m, migration_file_path)
69
+ assert_match_in_file(/t\.remove :age/m, migration_file_path)
70
+ end
71
+ should "generate migration for removing columns" do
72
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
73
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
74
+ response_success = silence_logger { @mig_gen.start(migration_params) }
75
+ migration_file_path = "/tmp/sample_app/db/migrate/001_remove_email_from_users.rb"
76
+ assert_match_in_file(/class RemoveEmailFromUsers/m, migration_file_path)
77
+ assert_match_in_file(/change_table :users.*?t\.remove :email/m, migration_file_path)
78
+ assert_match_in_file(/t\.remove :age/m, migration_file_path)
79
+ assert_match_in_file(/change_table :users.*?t\.column :email, :string/m, migration_file_path)
80
+ assert_match_in_file(/t\.column :age, :integer/m, migration_file_path)
14
81
  end
15
82
  end
16
83
 
84
+ context 'the migration generator for datamapper' do
85
+ should "generate migration for generic needs" do
86
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=datamapper']) }
87
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields', '-r=/tmp/sample_app']) }
88
+ migration_file_path = "/tmp/sample_app/db/migrate/001_modify_user_fields.rb"
89
+ assert_match_in_file(/migration\s1.*?:modify_user_fields/m, migration_file_path)
90
+ assert_match_in_file(/up\sdo\s+end/m, migration_file_path)
91
+ assert_match_in_file(/down\sdo\s+end/m, migration_file_path)
92
+ end
93
+ should "generate migration for adding columns" do
94
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=datamapper']) }
95
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
96
+ response_success = silence_logger { @mig_gen.start(migration_params) }
97
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_users.rb"
98
+ assert_match_in_file(/migration\s1.*?:add_email_to_users/m, migration_file_path)
99
+ assert_match_in_file(/modify_table :users.*?add_column :email, String/m, migration_file_path)
100
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
101
+ assert_match_in_file(/modify_table :users.*?drop_column :email/m, migration_file_path)
102
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
103
+ end
104
+ should "generate migration for removing columns" do
105
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=datamapper']) }
106
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
107
+ response_success = silence_logger { @mig_gen.start(migration_params) }
108
+ migration_file_path = "/tmp/sample_app/db/migrate/001_remove_email_from_users.rb"
109
+ assert_match_in_file(/migration\s1.*?:remove_email_from_users/m, migration_file_path)
110
+ assert_match_in_file(/modify_table :users.*?drop_column :email/m, migration_file_path)
111
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
112
+ assert_match_in_file(/modify_table :users.*?add_column :email, String/m, migration_file_path)
113
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
114
+ end
115
+ should "properly version migration files" do
116
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=datamapper']) }
117
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields', '-r=/tmp/sample_app']) }
118
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields2', '-r=/tmp/sample_app']) }
119
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields3', '-r=/tmp/sample_app']) }
120
+ assert_match_in_file(/migration\s1.*?:modify_user_fields/m, "/tmp/sample_app/db/migrate/001_modify_user_fields.rb")
121
+ assert_match_in_file(/migration\s2.*?:modify_user_fields2/m, "/tmp/sample_app/db/migrate/002_modify_user_fields2.rb")
122
+ assert_match_in_file(/migration\s3.*?:modify_user_fields3/m, "/tmp/sample_app/db/migrate/003_modify_user_fields3.rb")
123
+ end
124
+ end
125
+
126
+ context 'the migration generator for sequel' do
127
+ should "generate migration for generic needs" do
128
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=sequel']) }
129
+ response_success = silence_logger { @mig_gen.start(['ModifyUserFields', '-r=/tmp/sample_app']) }
130
+ migration_file_path = "/tmp/sample_app/db/migrate/001_modify_user_fields.rb"
131
+ assert_match_in_file(/class ModifyUserFields/m, migration_file_path)
132
+ assert_match_in_file(/def\sup\s+end/m, migration_file_path)
133
+ assert_match_in_file(/def\sdown\s+end/m, migration_file_path)
134
+ end
135
+ should "generate migration for adding columns" do
136
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=sequel']) }
137
+ migration_params = ['AddEmailToUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
138
+ response_success = silence_logger { @mig_gen.start(migration_params) }
139
+ migration_file_path = "/tmp/sample_app/db/migrate/001_add_email_to_users.rb"
140
+ assert_match_in_file(/class AddEmailToUsers/m, migration_file_path)
141
+ assert_match_in_file(/alter_table :users.*?add_column :email, String/m, migration_file_path)
142
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
143
+ assert_match_in_file(/alter_table :users.*?drop_column :email/m, migration_file_path)
144
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
145
+ end
146
+ should "generate migration for removing columns" do
147
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=sequel']) }
148
+ migration_params = ['RemoveEmailFromUsers', "email:string", "age:integer", '-r=/tmp/sample_app']
149
+ response_success = silence_logger { @mig_gen.start(migration_params) }
150
+ migration_file_path = "/tmp/sample_app/db/migrate/001_remove_email_from_users.rb"
151
+ assert_match_in_file(/class RemoveEmailFromUsers/m, migration_file_path)
152
+ assert_match_in_file(/alter_table :users.*?drop_column :email/m, migration_file_path)
153
+ assert_match_in_file(/drop_column :age/m, migration_file_path)
154
+ assert_match_in_file(/alter_table :users.*?add_column :email, String/m, migration_file_path)
155
+ assert_match_in_file(/add_column :age, Integer/m, migration_file_path)
156
+ end
157
+ end
17
158
  end
@@ -22,6 +22,16 @@ class TestModelGenerator < Test::Unit::TestCase
22
22
  assert_match_in_file(/class User < ActiveRecord::Base/m, '/tmp/sample_app/app/models/user.rb')
23
23
  assert_match /'user' model has already been generated!/, response_duplicate
24
24
  end
25
+
26
+ should "generate migration file versions properly" do
27
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
28
+ silence_logger { @model_gen.start(['user', '-r=/tmp/sample_app']) }
29
+ silence_logger { @model_gen.start(['account', '-r=/tmp/sample_app']) }
30
+ silence_logger { @model_gen.start(['bank', '-r=/tmp/sample_app']) }
31
+ assert_file_exists('/tmp/sample_app/db/migrate/001_create_users.rb')
32
+ assert_file_exists('/tmp/sample_app/db/migrate/002_create_accounts.rb')
33
+ assert_file_exists('/tmp/sample_app/db/migrate/003_create_banks.rb')
34
+ end
25
35
  end
26
36
 
27
37
  # ACTIVERECORD
@@ -33,26 +43,28 @@ class TestModelGenerator < Test::Unit::TestCase
33
43
  end
34
44
 
35
45
  should "generate migration file with no fields" do
36
- current_time = stop_time_for_test
46
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
37
47
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
38
48
  silence_logger { @model_gen.start(['user', '-r=/tmp/sample_app']) }
39
- migration_file_path = "/tmp/sample_app/db/migrate/#{current_time.to_i}_create_users.rb"
49
+ migration_file_path = "/tmp/sample_app/db/migrate/001_create_users.rb"
40
50
  assert_match_in_file(/class CreateUsers < ActiveRecord::Migration/m, migration_file_path)
41
51
  assert_match_in_file(/create_table :users/m, migration_file_path)
42
52
  assert_match_in_file(/# t.column :age, :integer[\n\s]+?end/m, migration_file_path)
53
+ assert_match_in_file(/drop_table :users/m, migration_file_path)
43
54
  end
44
55
 
45
56
  should "generate migration file with given fields" do
46
- current_time = stop_time_for_test
57
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
47
58
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
48
59
  silence_logger { @model_gen.start(['person', "name:string", "age:integer", "email:string", '-r=/tmp/sample_app']) }
49
- migration_file_path = "/tmp/sample_app/db/migrate/#{current_time.to_i}_create_people.rb"
60
+ migration_file_path = "/tmp/sample_app/db/migrate/001_create_people.rb"
50
61
  assert_match_in_file(/class CreatePeople < ActiveRecord::Migration/m, migration_file_path)
51
62
  assert_match_in_file(/create_table :people/m, migration_file_path)
52
63
  assert_match_in_file(/# t.column :age, :integer/m, migration_file_path)
53
64
  assert_match_in_file(/t.column :name, :string/m, migration_file_path)
54
65
  assert_match_in_file(/t.column :age, :integer/m, migration_file_path)
55
66
  assert_match_in_file(/t.column :email, :string/m, migration_file_path)
67
+ assert_match_in_file(/drop_table :people/m, migration_file_path)
56
68
  end
57
69
  end
58
70
 
@@ -81,31 +93,44 @@ class TestModelGenerator < Test::Unit::TestCase
81
93
  context "model generator using datamapper" do
82
94
  should "generate model file with fields" do
83
95
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=datamapper']) }
84
- silence_logger { @model_gen.start(['user', "name:string", "age:integer", "email:string", '-r=/tmp/sample_app']) }
96
+ silence_logger { @model_gen.start(['user', "name:string", "age:integer", "created_at:datetime", '-r=/tmp/sample_app']) }
85
97
  assert_match_in_file(/class User\n\s+include DataMapper::Resource/m, '/tmp/sample_app/app/models/user.rb')
86
98
  assert_match_in_file(/property :name, String/m, '/tmp/sample_app/app/models/user.rb')
87
99
  assert_match_in_file(/property :age, Integer/m, '/tmp/sample_app/app/models/user.rb')
88
- assert_match_in_file(/property :email, String/m, '/tmp/sample_app/app/models/user.rb')
100
+ assert_match_in_file(/property :created_at, DateTime/m, '/tmp/sample_app/app/models/user.rb')
101
+ end
102
+
103
+ should "properly generate version numbers" do
104
+ silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=datamapper']) }
105
+ silence_logger { @model_gen.start(['user', "name:string", "age:integer", "created_at:datetime", '-r=/tmp/sample_app']) }
106
+ silence_logger { @model_gen.start(['person', "name:string", "age:integer", "created_at:datetime", '-r=/tmp/sample_app']) }
107
+ silence_logger { @model_gen.start(['account', "name:string", "age:integer", "created_at:datetime", '-r=/tmp/sample_app']) }
108
+ assert_match_in_file(/class User\n\s+include DataMapper::Resource/m, '/tmp/sample_app/app/models/user.rb')
109
+ assert_match_in_file(/migration 1, :create_users do/m, "/tmp/sample_app/db/migrate/001_create_users.rb")
110
+ assert_match_in_file(/class Person\n\s+include DataMapper::Resource/m, '/tmp/sample_app/app/models/person.rb')
111
+ assert_match_in_file(/migration 2, :create_people do/m, "/tmp/sample_app/db/migrate/002_create_people.rb")
112
+ assert_match_in_file(/class Account\n\s+include DataMapper::Resource/m, '/tmp/sample_app/app/models/account.rb')
113
+ assert_match_in_file(/migration 3, :create_accounts do/m, "/tmp/sample_app/db/migrate/003_create_accounts.rb")
89
114
  end
90
115
 
91
116
  should "generate migration with given fields" do
92
- current_time = stop_time_for_test
117
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
93
118
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=datamapper']) }
94
- silence_logger { @model_gen.start(['person', "name:string", "age:integer", "email:string", '-r=/tmp/sample_app']) }
119
+ silence_logger { @model_gen.start(['person', "name:string", "created_at:datetime", "email:string", '-r=/tmp/sample_app']) }
95
120
  assert_match_in_file(/class Person\n\s+include DataMapper::Resource/m, '/tmp/sample_app/app/models/person.rb')
96
- migration_file_path = "/tmp/sample_app/db/migrate/#{current_time.to_i}_create_people.rb"
97
- assert_match_in_file(/migration NUM, :create_people do/m, migration_file_path)
98
- assert_match_in_file(/create_table\(:people\) do/m, migration_file_path)
99
- assert_match_in_file(/column\(:name, String\)/m, migration_file_path)
100
- assert_match_in_file(/column\(:age, Integer\)/m, migration_file_path)
101
- assert_match_in_file(/column\(:email, String\)/m, migration_file_path)
102
- assert_match_in_file(/drop_table\(:people\)/m, migration_file_path)
121
+ migration_file_path = "/tmp/sample_app/db/migrate/001_create_people.rb"
122
+ assert_match_in_file(/migration 1, :create_people do/m, migration_file_path)
123
+ assert_match_in_file(/create_table :people do/m, migration_file_path)
124
+ assert_match_in_file(/column :name, String/m, migration_file_path)
125
+ assert_match_in_file(/column :created_at, DateTime/m, migration_file_path)
126
+ assert_match_in_file(/column :email, String/m, migration_file_path)
127
+ assert_match_in_file(/drop_table :people/m, migration_file_path)
103
128
  end
104
129
  end
105
130
 
106
131
  # MONGOMAPPER
107
132
  context "model generator using mongomapper" do
108
- should "generate migration file with given fields" do
133
+ should "generate model file with no properties" do
109
134
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=mongomapper']) }
110
135
  silence_logger { @model_gen.start(['person', '-r=/tmp/sample_app']) }
111
136
  assert_match_in_file(/class Person\n\s+include MongoMapper::Document/m, '/tmp/sample_app/app/models/person.rb')
@@ -126,21 +151,22 @@ class TestModelGenerator < Test::Unit::TestCase
126
151
  context "model generator using sequel" do
127
152
  should "generate model file with given properties" do
128
153
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=sequel']) }
129
- silence_logger { @model_gen.start(['user', "name:string", "age:integer", "email:string", '-r=/tmp/sample_app']) }
154
+ silence_logger { @model_gen.start(['user', "name:string", "age:integer", "created:datetime", '-r=/tmp/sample_app']) }
130
155
  assert_match_in_file(/class User < Sequel::Model/m, '/tmp/sample_app/app/models/user.rb')
131
156
  end
132
157
 
133
158
  should "generate migration file with given properties" do
134
- current_time = stop_time_for_test
159
+ current_time = stop_time_for_test.strftime("%Y%m%d%H%M%S")
135
160
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-d=sequel']) }
136
- silence_logger { @model_gen.start(['person', "name:string", "age:integer", "email:string", '-r=/tmp/sample_app']) }
137
- migration_file_path = "/tmp/sample_app/db/migrate/#{current_time.to_i}_create_people.rb"
161
+ silence_logger { @model_gen.start(['person', "name:string", "age:integer", "created:datetime", '-r=/tmp/sample_app']) }
162
+ migration_file_path = "/tmp/sample_app/db/migrate/001_create_people.rb"
138
163
  assert_match_in_file(/class Person < Sequel::Model/m, '/tmp/sample_app/app/models/person.rb')
139
164
  assert_match_in_file(/class CreatePeople < Sequel::Migration/m, migration_file_path)
140
165
  assert_match_in_file(/create_table :people/m, migration_file_path)
141
- assert_match_in_file(/string :name/m, migration_file_path)
142
- assert_match_in_file(/integer :age/m, migration_file_path)
143
- assert_match_in_file(/string :email/m, migration_file_path)
166
+ assert_match_in_file(/String :name/m, migration_file_path)
167
+ assert_match_in_file(/Integer :age/m, migration_file_path)
168
+ assert_match_in_file(/DateTime :created/m, migration_file_path)
169
+ assert_match_in_file(/drop_table :people/m, migration_file_path)
144
170
  end
145
171
  end
146
172
 
@@ -149,46 +175,46 @@ class TestModelGenerator < Test::Unit::TestCase
149
175
  should "generate test file for bacon" do
150
176
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=bacon', '-d=activerecord']) }
151
177
  silence_logger { @model_gen.start(['User', '-r=/tmp/sample_app']) }
152
- assert_match_in_file(/describe "User Model"/m, '/tmp/sample_app/test/models/user.rb')
153
- assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user.rb')
154
- assert_match_in_file(/@user\.should\.not\.be\.nil/m, '/tmp/sample_app/test/models/user.rb')
178
+ assert_match_in_file(/describe "User Model"/m, '/tmp/sample_app/test/models/user_test.rb')
179
+ assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user_test.rb')
180
+ assert_match_in_file(/@user\.should\.not\.be\.nil/m, '/tmp/sample_app/test/models/user_test.rb')
155
181
  end
156
182
 
157
183
  # RIOT
158
184
  should "generate test file for riot" do
159
185
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=riot', '-d=activerecord']) }
160
186
  silence_logger { @model_gen.start(['User', '-r=/tmp/sample_app']) }
161
- assert_match_in_file(/context "User Model" do/m, '/tmp/sample_app/test/models/user.rb')
162
- assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user.rb')
163
- assert_match_in_file(/asserts\("that record is not nil"\) \{ \!@user.nil\? \}/m, '/tmp/sample_app/test/models/user.rb')
187
+ assert_match_in_file(/context "User Model" do/m, '/tmp/sample_app/test/models/user_test.rb')
188
+ assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user_test.rb')
189
+ assert_match_in_file(/asserts\("that record is not nil"\) \{ \!@user.nil\? \}/m, '/tmp/sample_app/test/models/user_test.rb')
164
190
  end
165
191
 
166
192
  # RSPEC
167
193
  should "generate test file for rspec" do
168
194
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=rspec', '-d=activerecord']) }
169
195
  silence_logger { @model_gen.start(['User', '-r=/tmp/sample_app']) }
170
- assert_match_in_file(/describe "User Model"/m, '/tmp/sample_app/test/models/user.rb')
171
- assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user.rb')
172
- assert_match_in_file(/@user\.should\.not\.be\snil/m, '/tmp/sample_app/test/models/user.rb')
196
+ assert_match_in_file(/describe "User Model"/m, '/tmp/sample_app/test/models/user_spec.rb')
197
+ assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user_spec.rb')
198
+ assert_match_in_file(/@user\.should\.not\.be\snil/m, '/tmp/sample_app/test/models/user_spec.rb')
173
199
  end
174
200
 
175
201
  # SHOULDA
176
202
  should "generate test file for shoulda" do
177
203
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=shoulda', '-d=activerecord']) }
178
- silence_logger { @model_gen.start(['User', '-r=/tmp/sample_app']) }
179
- assert_match_in_file(/class UserControllerTest < Test::Unit::TestCase/m, '/tmp/sample_app/test/models/user.rb')
180
- assert_match_in_file(/context "User Model"/m, '/tmp/sample_app/test/models/user.rb')
181
- assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user.rb')
182
- assert_match_in_file(/assert_not_nil @user/m, '/tmp/sample_app/test/models/user.rb')
204
+ silence_logger { @model_gen.start(['Person', '-r=/tmp/sample_app']) }
205
+ assert_match_in_file(/class PersonControllerTest < Test::Unit::TestCase/m, '/tmp/sample_app/test/models/person_test.rb')
206
+ assert_match_in_file(/context "Person Model"/m, '/tmp/sample_app/test/models/person_test.rb')
207
+ assert_match_in_file(/@person = Person.new/m, '/tmp/sample_app/test/models/person_test.rb')
208
+ assert_match_in_file(/assert_not_nil @person/m, '/tmp/sample_app/test/models/person_test.rb')
183
209
  end
184
210
 
185
211
  # TESTSPEC
186
212
  should "generate test file for testspec" do
187
213
  silence_logger { @skeleton.start(['sample_app', '/tmp', '--script=none', '-t=testspec', '-d=activerecord']) }
188
214
  silence_logger { @model_gen.start(['User', '-r=/tmp/sample_app']) }
189
- assert_match_in_file(/context "User Model"/m, '/tmp/sample_app/test/models/user.rb')
190
- assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user.rb')
191
- assert_match_in_file(/@user\.should\.not\.be\.nil/m, '/tmp/sample_app/test/models/user.rb')
215
+ assert_match_in_file(/context "User Model"/m, '/tmp/sample_app/test/models/user_test.rb')
216
+ assert_match_in_file(/@user = User.new/m, '/tmp/sample_app/test/models/user_test.rb')
217
+ assert_match_in_file(/@user\.should\.not\.be\.nil/m, '/tmp/sample_app/test/models/user_test.rb')
192
218
  end
193
219
  end
194
220
 
@@ -1,8 +1,14 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
2
  require 'thor'
3
+ require 'fakeweb'
3
4
 
4
5
  class TestSkeletonGenerator < Test::Unit::TestCase
5
6
  def setup
7
+ FakeWeb.allow_net_connect = false
8
+ FakeWeb.register_uri(:get, "http://prototypejs.org/assets/2009/8/31/prototype.js", :body => "prototype")
9
+ FakeWeb.register_uri(:get, "http://github.com/nesquena/lowpro/raw/master/dist/lowpro.js", :body => "lowpro")
10
+ FakeWeb.register_uri(:get, "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js", :body => "jquery")
11
+ FakeWeb.register_uri(:get, "http://rightjs.org/builds/current/right-min.js", :body => "rightjs")
6
12
  `rm -rf /tmp/sample_app`
7
13
  @skeleton = Padrino::Generators::Skeleton.dup
8
14
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: padrino-gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Padrino Team
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2009-11-23 00:00:00 -08:00
15
+ date: 2009-11-30 00:00:00 -08:00
16
16
  default_executable: padrino-gen
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
@@ -105,6 +105,16 @@ dependencies:
105
105
  - !ruby/object:Gem::Version
106
106
  version: 0.5.1
107
107
  version:
108
+ - !ruby/object:Gem::Dependency
109
+ name: fakeweb
110
+ type: :development
111
+ version_requirement:
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: 1.2.3
117
+ version:
108
118
  description: Generators for easily creating and building padrino applications from the console
109
119
  email: nesquena@gmail.com
110
120
  executables:
@@ -142,6 +152,7 @@ files:
142
152
  - lib/generators/components/tests/testspec_test_gen.rb
143
153
  - lib/generators/controller.rb
144
154
  - lib/generators/mailer.rb
155
+ - lib/generators/migration.rb
145
156
  - lib/generators/model.rb
146
157
  - lib/generators/skeleton.rb
147
158
  - lib/generators/skeleton/.gitignore
@@ -161,7 +172,7 @@ files:
161
172
  - lib/generators/skeleton/public/images/.empty_directory
162
173
  - lib/generators/skeleton/public/javascripts/.empty_directory
163
174
  - lib/generators/skeleton/public/stylesheets/.empty_directory
164
- - lib/generators/skeleton/tmp/.emptydirectory
175
+ - lib/generators/skeleton/tmp/.empty_directory
165
176
  - lib/generators/templates/controller.rb.tt
166
177
  - lib/generators/templates/helper.rb.tt
167
178
  - lib/generators/templates/mailer.rb.tt