stefanpenner-shoulda_generator 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Josh Nichols
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest ADDED
@@ -0,0 +1,32 @@
1
+ rails_generators/shoulda_model/shoulda_model_generator.rb
2
+ rails_generators/shoulda_model/templates/factory.rb
3
+ rails_generators/shoulda_model/templates/fixtures.yml
4
+ rails_generators/shoulda_model/templates/migration.rb
5
+ rails_generators/shoulda_model/templates/model.rb
6
+ rails_generators/shoulda_model/templates/unit_test.rb
7
+ rails_generators/shoulda_model/USAGE
8
+ rails_generators/shoulda_scaffold/shoulda_scaffold_generator.rb
9
+ rails_generators/shoulda_scaffold/templates/blueprint/ie.css
10
+ rails_generators/shoulda_scaffold/templates/blueprint/print.css
11
+ rails_generators/shoulda_scaffold/templates/blueprint/screen.css
12
+ rails_generators/shoulda_scaffold/templates/controller.rb
13
+ rails_generators/shoulda_scaffold/templates/erb/_form.html.erb
14
+ rails_generators/shoulda_scaffold/templates/erb/edit.html.erb
15
+ rails_generators/shoulda_scaffold/templates/erb/index.html.erb
16
+ rails_generators/shoulda_scaffold/templates/erb/layout.html.erb
17
+ rails_generators/shoulda_scaffold/templates/erb/new.html.erb
18
+ rails_generators/shoulda_scaffold/templates/erb/show.html.erb
19
+ rails_generators/shoulda_scaffold/templates/functional_test/basic.rb
20
+ rails_generators/shoulda_scaffold/templates/functional_test/should_be_restful.rb
21
+ rails_generators/shoulda_scaffold/templates/haml/_form.html.haml
22
+ rails_generators/shoulda_scaffold/templates/haml/edit.html.haml
23
+ rails_generators/shoulda_scaffold/templates/haml/index.html.haml
24
+ rails_generators/shoulda_scaffold/templates/haml/layout.html.haml
25
+ rails_generators/shoulda_scaffold/templates/haml/new.html.haml
26
+ rails_generators/shoulda_scaffold/templates/haml/show.html.haml
27
+ rails_generators/shoulda_scaffold/templates/helper.rb
28
+ rails_generators/shoulda_scaffold/USAGE
29
+ Rakefile
30
+ README.markdown
31
+ shoulda_generator.gemspec
32
+ Manifest
data/README.markdown ADDED
@@ -0,0 +1,79 @@
1
+ # Shoulda generators
2
+
3
+ One night at a Boston Ruby hackfest, I finally got sick of using the Rails default generators, and then having to twiddle them to meet my needs and tastes. This includes using things like:
4
+
5
+ * [shoulda](http://thoughtbot.com/projects/shoulda)
6
+ * [factory\_girl](http://github.com/thoughtbot/factory_girl)
7
+ * [haml](http://haml.hamptoncatlin.com/)
8
+ * [blueprint](http://code.google.com/p/blueprintcss/)
9
+
10
+ The next morning, I was struck awake at 5am with the inspiration to start implementing it. shoulda\_generator is the result of this effort.
11
+
12
+ ## What you get
13
+
14
+ ### shoulda\_model
15
+
16
+ * A new model
17
+ * A migration for the model
18
+ * Skip using --skip-migration
19
+ * A factory defined with [factory_girl](http://github.com/thoughtbot/factory_girl)
20
+ * Skip using --skip-factory
21
+ * A [shoulda](http://thoughtbot.com/projects/shoulda) unit test with a few simple 'should's
22
+
23
+ #### Prereqs:
24
+
25
+ * [shoulda](http://thoughtbot.com/projects/shoulda) installed as a plugin
26
+ * [factory\_girl](http://github.com/thoughtbot/factory_girl) gem installed
27
+ * [factory\_girl\_on\_rails](http://github.com/technicalpickles/factory_girl_on_rails) installed as a plugin
28
+
29
+ ### shoulda\_scaffold
30
+
31
+ * Everything included in shoulda_model
32
+ * A controller (sans unnecessary comments)
33
+ * Choice of [haml](http://haml.hamptoncatlin.com/) (default) or ERB
34
+ * Specify which with the --templating option
35
+ * Simple layout styled with blueprint
36
+ * Skip using --skip-layout
37
+ * A helper
38
+ * A shoulda functional test using factory_girl factory, using should\_be\_restful or not
39
+ * Specify with --functional-test-style, accepts basic and should\_be\_restful
40
+
41
+ #### Prereqs:
42
+
43
+ * [shoulda](http://thoughtbot.com/projects/shoulda) installed as a plugin
44
+ * [factory\_girl](http://github.com/thoughtbot/factory_girl) gem installed
45
+ * [factory\_girl\_on\_rails](http://github.com/technicalpickles/factory_girl_on_rails) installed as a plugin
46
+ * [haml](http://haml.hamptoncatlin.com/) gem installed on the system, and the project has been hamlified using `haml --rails`
47
+
48
+ ## Getting it
49
+
50
+ shoulda\_generator is available as a gem via [GitHub](http://github.com). If you haven't done so already, you need to setup GitHub as a gem source:
51
+
52
+ $ gem sources -a http://gems.github.com
53
+
54
+ Now you can install it:
55
+
56
+ $ sudo gem install technicalpickles-shoulda_generator
57
+
58
+ ## Example usage
59
+
60
+ Usage is the same as the default Rails generators.
61
+
62
+ $ script/generate shoulda_model post title:string body:text published:boolean
63
+ $ script/generate shoulda_scaffold post title:string body:text published:boolean
64
+
65
+
66
+ ## Configuring it
67
+
68
+ You can override the default values for templating and functional\_test\_style by placing a .shoulda\_generator file in your home directory.
69
+
70
+ Here's an example `.shoulda_generator`:
71
+
72
+ :templating: erb # supported options: haml|erb
73
+ :functional_test_syle: basic # supported options: should_be_restful|basic
74
+
75
+ ## Developing it
76
+
77
+ Source is hosted on GitHub: [http://github.com/technicalpickles/shoulda_generator/tree/master](http://github.com/technicalpickles/shoulda_generator/tree/master)
78
+
79
+ You can do the usual fork/commit cycle until you have something ready to share. Send pull requests my way.
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |s|
7
+ s.name = "shoulda_generator"
8
+ s.summary = "Generators which create tests using shoulda"
9
+ s.email = "stefan.penner@gmail.com"
10
+ s.homepage = "http://github.com/stefanpenneri/shoulda_generator"
11
+ s.description = "Generators which create tests using shoulda"
12
+ s.authors = ["Josh Nichols","Stefan Penner"]
13
+ s.files = FileList["[A-Z]*", "{generators,lib,test}/**/*"]
14
+ end
15
+ rescue LoadError
16
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
17
+ end
18
+
19
+ Rake::TestTask.new do |t|
20
+ t.libs << 'lib'
21
+ t.pattern = 'test/**/*_test.rb'
22
+ t.verbose = false
23
+ end
24
+
25
+ desc 'Test by default'
26
+ task :default => :test
data/TODO ADDED
@@ -0,0 +1,8 @@
1
+ * When installing, there's an warning:
2
+
3
+ Successfully installed shoulda_generator-0.2.0
4
+ 1 gem installed
5
+ Installing ri documentation for shoulda_generator-0.2.0...
6
+ File not found: lib
7
+
8
+ * Support using resource_controller?
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ patch: 0
3
+ major: 0
4
+ minor: 2
@@ -0,0 +1 @@
1
+ # an empty YAML file - any content in here seems to get parsed as a string
@@ -0,0 +1 @@
1
+ # intentionally empty
@@ -0,0 +1 @@
1
+ # intentionally empty
@@ -0,0 +1,3 @@
1
+ class Zoo
2
+ include ReptileHouse
3
+ end
@@ -0,0 +1,2 @@
1
+ module Zoo::ReptileHouse
2
+ end
@@ -0,0 +1 @@
1
+ $initialize_test_set_from_env = 'success'
@@ -0,0 +1,2 @@
1
+ class WorkingGenerator < Rails::Generator::NamedBase
2
+ end
@@ -0,0 +1,4 @@
1
+ class AGenerator < Rails::Generator::Base
2
+ def manifest
3
+ end
4
+ end
@@ -0,0 +1 @@
1
+ raise 'This init.rb should not be evaluated because rails/init.rb exists'
@@ -0,0 +1,2 @@
1
+ module Gemlike
2
+ end
@@ -0,0 +1,7 @@
1
+ # I have access to my directory and the Rails config.
2
+ raise 'directory expected but undefined in init.rb' unless defined? directory
3
+ raise 'config expected but undefined in init.rb' unless defined? config
4
+
5
+ # My lib/ dir must be in the load path.
6
+ require 'gemlike'
7
+ raise 'missing mixin from my lib/ dir' unless defined? Gemlike
@@ -0,0 +1,2 @@
1
+ author: Plugin Author
2
+ version: 1.0.0
@@ -0,0 +1,4 @@
1
+ class StubbyGenerator < Rails::Generator::Base
2
+ def manifest
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ # I have access to my directory and the Rails config.
2
+ raise 'directory expected but undefined in init.rb' unless defined? directory
3
+ raise 'config expected but undefined in init.rb' unless defined? config
4
+
5
+ # My lib/ dir must be in the load path.
6
+ require 'stubby_mixin'
7
+ raise 'missing mixin from my lib/ dir' unless defined? StubbyMixin
@@ -0,0 +1,2 @@
1
+ module StubbyMixin
2
+ end
@@ -0,0 +1,39 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
+
3
+
4
+ class ShouldaModelGeneratorTest < GeneratorTestCase
5
+ context "running the default generator" do
6
+ setup do
7
+ run_generator('shoulda_model', %w(Product name:string supplier_id:integer created_at:timestamp))
8
+ end
9
+
10
+ should_generate_model :product
11
+ should_generate_factory :product
12
+ should_generate_unit_test :product
13
+ should_generate_migration :create_products
14
+
15
+ should "generate migration" do
16
+ assert_generated_migration :create_products do |t|
17
+ assert_generated_column t, :name, :string
18
+ assert_generated_column t, :supplier_id, :integer
19
+ assert_generated_column t, :created_at, :timestamp
20
+ end
21
+ end
22
+ end
23
+
24
+ context "running the generator, when skipping factory and migration" do
25
+ setup do
26
+ run_generator('shoulda_model', %w(Product name:string supplier_id:integer created_at:timestamp --skip-factory))
27
+ end
28
+
29
+ should_generate_model :product
30
+ should_not_generate_factory :product
31
+ should_generate_unit_test :product
32
+ should_generate_migration :create_products
33
+
34
+ should "not generate migration" do
35
+ assert_skipped_migration :create_products
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,36 @@
1
+ class Test::Unit::TestCase
2
+ class << self
3
+ def should_generate_model(model)
4
+ should "generate #{model} model" do
5
+ assert_generated_model_for(model) do |body|
6
+ yield body if block_given?
7
+ end
8
+ end
9
+ end
10
+
11
+ def should_generate_factory(model)
12
+ should "generate #{model} factory" do
13
+ assert_generated_factory_for(model)
14
+ end
15
+ end
16
+
17
+ def should_generate_unit_test(model)
18
+ should "generate #{model} unit test" do
19
+ assert_generated_unit_test_for(model)
20
+ end
21
+ end
22
+
23
+ def should_generate_migration(migration)
24
+ should "generate a #{migration} migration" do
25
+ assert_generated_migration migration
26
+ end
27
+ end
28
+
29
+ def should_not_generate_factory(model)
30
+ should "not generate #{model} factory" do
31
+ deny_generated_factory_for(:product)
32
+ end
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,288 @@
1
+ require 'test/unit'
2
+ require 'fileutils'
3
+
4
+ # Mock out what we need from AR::Base
5
+ module ActiveRecord
6
+ class Base
7
+ class << self
8
+ attr_accessor :pluralize_table_names, :timestamped_migrations
9
+ end
10
+ self.pluralize_table_names = true
11
+ self.timestamped_migrations = true
12
+ end
13
+
14
+ module ConnectionAdapters
15
+ class Column
16
+ attr_reader :name, :default, :type, :limit, :null, :sql_type, :precision, :scale
17
+
18
+ def initialize(name, default, sql_type = nil)
19
+ @name = name
20
+ @default = default
21
+ @type = @sql_type = sql_type
22
+ end
23
+
24
+ def human_name
25
+ @name.humanize
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ # Mock up necessities from ActionView
32
+ module ActionView
33
+ module Helpers
34
+ module ActionRecordHelper; end
35
+ class InstanceTag; end
36
+ end
37
+ end
38
+
39
+ # Set RAILS_ROOT appropriately fixture generation
40
+ tmp_dir = "#{File.dirname(__FILE__)}/fixtures/tmp"
41
+
42
+ if defined? RAILS_ROOT
43
+ RAILS_ROOT.replace tmp_dir
44
+ else
45
+ RAILS_ROOT = tmp_dir
46
+ end
47
+ FileUtils.mkdir_p RAILS_ROOT
48
+
49
+ # $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib"
50
+ require 'initializer'
51
+
52
+ # Mocks out the configuration
53
+ module Rails
54
+ def self.configuration
55
+ Rails::Configuration.new
56
+ end
57
+ end
58
+
59
+ require 'rails_generator'
60
+
61
+ class GeneratorTestCase < Test::Unit::TestCase
62
+ include FileUtils
63
+
64
+ def setup
65
+ ActiveRecord::Base.pluralize_table_names = true
66
+
67
+ mkdir_p "#{RAILS_ROOT}/app/views/layouts"
68
+ mkdir_p "#{RAILS_ROOT}/config"
69
+ mkdir_p "#{RAILS_ROOT}/db"
70
+ mkdir_p "#{RAILS_ROOT}/test/fixtures"
71
+ mkdir_p "#{RAILS_ROOT}/public/stylesheets"
72
+
73
+ File.open("#{RAILS_ROOT}/config/routes.rb", 'w') do |f|
74
+ f << "ActionController::Routing::Routes.draw do |map|\n\nend"
75
+ end
76
+ end
77
+
78
+ def teardown
79
+ rm_rf "#{RAILS_ROOT}/app"
80
+ rm_rf "#{RAILS_ROOT}/test"
81
+ rm_rf "#{RAILS_ROOT}/config"
82
+ rm_rf "#{RAILS_ROOT}/db"
83
+ rm_rf "#{RAILS_ROOT}/public"
84
+ end
85
+
86
+ def test_truth
87
+ # don't complain, test/unit
88
+ end
89
+
90
+ # Instantiates the Generator.
91
+ def build_generator(name, params)
92
+ Rails::Generator::Base.instance(name, params)
93
+ end
94
+
95
+ # Runs the +create+ command (like the command line does).
96
+ def run_generator(name, params)
97
+ silence_generator do
98
+ build_generator(name, params).command(:create).invoke!
99
+ end
100
+ end
101
+
102
+ # Silences the logger temporarily and returns the output as a String.
103
+ def silence_generator
104
+ logger_original = Rails::Generator::Base.logger
105
+ myout = StringIO.new
106
+ Rails::Generator::Base.logger = Rails::Generator::SimpleLogger.new(myout)
107
+ yield if block_given?
108
+ Rails::Generator::Base.logger = logger_original
109
+ myout.string
110
+ end
111
+
112
+ # Asserts that the given controller was generated.
113
+ # It takes a name or symbol without the <tt>_controller</tt> part and an optional super class.
114
+ # The contents of the class source file is passed to a block.
115
+ def assert_generated_controller_for(name, parent = "ApplicationController")
116
+ assert_generated_class "app/controllers/#{name.to_s.underscore}_controller", parent do |body|
117
+ yield body if block_given?
118
+ end
119
+ end
120
+
121
+ # Asserts that the given model was generated.
122
+ # It takes a name or symbol and an optional super class.
123
+ # The contents of the class source file is passed to a block.
124
+ def assert_generated_model_for(name, parent = "ActiveRecord::Base")
125
+ assert_generated_class "app/models/#{name.to_s.underscore}", parent do |body|
126
+ yield body if block_given?
127
+ end
128
+ end
129
+
130
+ # Asserts that the given helper was generated.
131
+ # It takes a name or symbol without the <tt>_helper</tt> part.
132
+ # The contents of the module source file is passed to a block.
133
+ def assert_generated_helper_for(name)
134
+ assert_generated_module "app/helpers/#{name.to_s.underscore}_helper" do |body|
135
+ yield body if block_given?
136
+ end
137
+ end
138
+
139
+ # Asserts that the given functional test was generated.
140
+ # It takes a name or symbol without the <tt>_controller_test</tt> part and an optional super class.
141
+ # The contents of the class source file is passed to a block.
142
+ def assert_generated_functional_test_for(name, parent = "ActionController::TestCase")
143
+ assert_generated_class "test/functional/#{name.to_s.underscore}_controller_test",parent do |body|
144
+ yield body if block_given?
145
+ end
146
+ end
147
+
148
+ # Asserts that the given unit test was generated.
149
+ # It takes a name or symbol without the <tt>_test</tt> part and an optional super class.
150
+ # The contents of the class source file is passed to a block.
151
+ def assert_generated_unit_test_for(name, parent = "ActiveSupport::TestCase")
152
+ assert_generated_class "test/unit/#{name.to_s.underscore}_test", parent do |body|
153
+ yield body if block_given?
154
+ end
155
+ end
156
+
157
+ # Asserts that the given file was generated.
158
+ # The contents of the file is passed to a block.
159
+ def assert_generated_file(path)
160
+ assert_file_exists(path)
161
+ File.open("#{RAILS_ROOT}/#{path}") do |f|
162
+ yield f.read if block_given?
163
+ end
164
+ end
165
+
166
+ # asserts that the given file exists
167
+ def assert_file_exists(path)
168
+ assert File.exist?("#{RAILS_ROOT}/#{path}"),
169
+ "The file '#{RAILS_ROOT}/#{path}' should exist"
170
+ end
171
+
172
+ # Asserts that the given class source file was generated.
173
+ # It takes a path without the <tt>.rb</tt> part and an optional super class.
174
+ # The contents of the class source file is passed to a block.
175
+ def assert_generated_class(path, parent = nil)
176
+ # FIXME: Sucky way to detect namespaced classes
177
+ if path.split('/').size > 3
178
+ path =~ /\/?(\d+_)?(\w+)\/(\w+)$/
179
+ class_name = "#{$2.camelize}::#{$3.camelize}"
180
+ else
181
+ path =~ /\/?(\d+_)?(\w+)$/
182
+ class_name = $2.camelize
183
+ end
184
+
185
+ assert_generated_file("#{path}.rb") do |body|
186
+ assert_match /class #{class_name}#{parent.nil? ? '':" < #{parent}"}/, body, "the file '#{path}.rb' should be a class"
187
+ yield body if block_given?
188
+ end
189
+ end
190
+
191
+ # Asserts that the given module source file was generated.
192
+ # It takes a path without the <tt>.rb</tt> part.
193
+ # The contents of the class source file is passed to a block.
194
+ def assert_generated_module(path)
195
+ # FIXME: Sucky way to detect namespaced modules
196
+ if path.split('/').size > 3
197
+ path =~ /\/?(\w+)\/(\w+)$/
198
+ module_name = "#{$1.camelize}::#{$2.camelize}"
199
+ else
200
+ path =~ /\/?(\w+)$/
201
+ module_name = $1.camelize
202
+ end
203
+
204
+ assert_generated_file("#{path}.rb") do |body|
205
+ assert_match /module #{module_name}/, body, "the file '#{path}.rb' should be a module"
206
+ yield body if block_given?
207
+ end
208
+ end
209
+
210
+ # Asserts that the given CSS stylesheet file was generated.
211
+ # It takes a path without the <tt>.css</tt> part.
212
+ # The contents of the stylesheet source file is passed to a block.
213
+ def assert_generated_stylesheet(path)
214
+ assert_generated_file("public/stylesheets/#{path}.css") do |body|
215
+ yield body if block_given?
216
+ end
217
+ end
218
+
219
+ # Asserts that the given YAML file was generated.
220
+ # It takes a path without the <tt>.yml</tt> part.
221
+ # The parsed YAML tree is passed to a block.
222
+ def assert_generated_yaml(path)
223
+ assert_generated_file("#{path}.yml") do |body|
224
+ yaml = YAML.load(body)
225
+ assert yaml, 'YAML data missing'
226
+ yield yaml if block_given?
227
+ end
228
+ end
229
+
230
+ # Asserts that the given fixtures YAML file was generated.
231
+ # It takes a fixture name without the <tt>.yml</tt> part.
232
+ # The parsed YAML tree is passed to a block.
233
+ def assert_generated_fixtures_for(name)
234
+ assert_generated_yaml "test/fixtures/#{name.to_s.underscore}" do |yaml|
235
+ yield yaml if block_given?
236
+ end
237
+ end
238
+
239
+ # Asserts that the given views were generated.
240
+ # It takes a controller name and a list of views (including extensions).
241
+ # The body of each view is passed to a block.
242
+ def assert_generated_views_for(name, *actions)
243
+ actions.each do |action|
244
+ assert_generated_file("app/views/#{name.to_s.underscore}/#{action}") do |body|
245
+ yield body if block_given?
246
+ end
247
+ end
248
+ end
249
+
250
+ def assert_generated_migration(name, parent = "ActiveRecord::Migration")
251
+ file = Dir.glob("#{RAILS_ROOT}/db/migrate/*_#{name.to_s.underscore}.rb").first
252
+ file = file.match(/db\/migrate\/[0-9]+_\w+/).to_s
253
+ assert_generated_class file, parent do |body|
254
+ assert_match /timestamps/, body, "should have timestamps defined"
255
+ yield body if block_given?
256
+ end
257
+ end
258
+
259
+ # Asserts that the given migration file was not generated.
260
+ # It takes the name of the migration as a parameter.
261
+ def assert_skipped_migration(name)
262
+ migration_file = "#{RAILS_ROOT}/db/migrate/001_#{name.to_s.underscore}.rb"
263
+ assert !File.exist?(migration_file), "should not create migration #{migration_file}"
264
+ end
265
+
266
+ # Asserts that the given resource was added to the routes.
267
+ def assert_added_route_for(name)
268
+ assert_generated_file("config/routes.rb") do |body|
269
+ assert_match /map.resources :#{name.to_s.underscore}/, body,
270
+ "should add route for :#{name.to_s.underscore}"
271
+ end
272
+ end
273
+
274
+ # Asserts that the given methods are defined in the body.
275
+ # This does assume standard rails code conventions with regards to the source code.
276
+ # The body of each individual method is passed to a block.
277
+ def assert_has_method(body, *methods)
278
+ methods.each do |name|
279
+ assert body =~ /^ def #{name}(\(.+\))?\n((\n| .*\n)*) end/, "should have method #{name}"
280
+ yield(name, $2) if block_given?
281
+ end
282
+ end
283
+
284
+ # Asserts that the given column is defined in the migration.
285
+ def assert_generated_column(body, name, type)
286
+ assert_match /t\.#{type.to_s} :#{name.to_s}/, body, "should have column #{name.to_s} defined"
287
+ end
288
+ end
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'ruby-debug'
3
+ require 'active_support'
4
+ require 'active_record'
5
+ require 'action_controller'
6
+ require 'action_view'
7
+
8
+ require 'shoulda'
9
+
10
+ require 'mocha'
11
+
12
+ require File.join(File.dirname(__FILE__), 'shoulda_macros', 'generator_macros')
13
+
14
+
15
+
16
+ require File.join(File.dirname(__FILE__), 'stolen_from_railties')
17
+
18
+ unless defined?(RAILS_DEFAULT_LOGGER)
19
+ @test_log = File.join(RAILS_ROOT, 'test.log')
20
+ RAILS_DEFAULT_LOGGER = Logger.new(@test_log)
21
+ end
22
+
23
+ Rails::Generator::Base.prepend_sources Rails::Generator::PathSource.new(:shoulda_generator, File.join(File.dirname(__FILE__), "..", "rails_generators"))
24
+
25
+ class GeneratorTestCase
26
+ # Asserts that the given factory was created.
27
+ def assert_generated_factory_for(name)
28
+ assert_generated_file "test/factories/#{name.to_s.underscore}_factory.rb"
29
+ end
30
+
31
+ # Asserts that the given factory was NOT created.
32
+ def deny_generated_factory_for(name)
33
+ deny_file_exists "test/factories/#{name.to_s.underscore}_factory.rb"
34
+ end
35
+
36
+ # asserts that the given file DOES NOT exists
37
+ def deny_file_exists(path)
38
+ assert ! File.exist?("#{RAILS_ROOT}/#{path}"),
39
+ "The file '#{RAILS_ROOT}/#{path}' should not exist"
40
+ end
41
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stefanpenner-shoulda_generator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Josh Nichols
8
+ - Stefan Penner
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-01-06 00:00:00 -08:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: Generators which create tests using shoulda
18
+ email: stefan.penner@gmail.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files: []
24
+
25
+ files:
26
+ - LICENSE
27
+ - Manifest
28
+ - Rakefile
29
+ - README.markdown
30
+ - TODO
31
+ - VERSION.yml
32
+ - test/fixtures
33
+ - test/fixtures/about_yml_plugins
34
+ - test/fixtures/about_yml_plugins/bad_about_yml
35
+ - test/fixtures/about_yml_plugins/bad_about_yml/about.yml
36
+ - test/fixtures/about_yml_plugins/bad_about_yml/init.rb
37
+ - test/fixtures/about_yml_plugins/plugin_without_about_yml
38
+ - test/fixtures/about_yml_plugins/plugin_without_about_yml/init.rb
39
+ - test/fixtures/eager
40
+ - test/fixtures/eager/zoo
41
+ - test/fixtures/eager/zoo/reptile_house.rb
42
+ - test/fixtures/eager/zoo.rb
43
+ - test/fixtures/environment_with_constant.rb
44
+ - test/fixtures/lib
45
+ - test/fixtures/lib/generators
46
+ - test/fixtures/lib/generators/missing_class
47
+ - test/fixtures/lib/generators/missing_class/missing_class_generator.rb
48
+ - test/fixtures/lib/generators/missing_class/templates
49
+ - test/fixtures/lib/generators/missing_generator
50
+ - test/fixtures/lib/generators/missing_generator/templates
51
+ - test/fixtures/lib/generators/missing_templates
52
+ - test/fixtures/lib/generators/working
53
+ - test/fixtures/lib/generators/working/working_generator.rb
54
+ - test/fixtures/plugins
55
+ - test/fixtures/plugins/alternate
56
+ - test/fixtures/plugins/alternate/a
57
+ - test/fixtures/plugins/alternate/a/generators
58
+ - test/fixtures/plugins/alternate/a/generators/a_generator
59
+ - test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb
60
+ - test/fixtures/plugins/alternate/a/lib
61
+ - test/fixtures/plugins/default
62
+ - test/fixtures/plugins/default/acts
63
+ - test/fixtures/plugins/default/acts/acts_as_chunky_bacon
64
+ - test/fixtures/plugins/default/acts/acts_as_chunky_bacon/lib
65
+ - test/fixtures/plugins/default/empty
66
+ - test/fixtures/plugins/default/gemlike
67
+ - test/fixtures/plugins/default/gemlike/init.rb
68
+ - test/fixtures/plugins/default/gemlike/lib
69
+ - test/fixtures/plugins/default/gemlike/lib/gemlike.rb
70
+ - test/fixtures/plugins/default/gemlike/rails
71
+ - test/fixtures/plugins/default/gemlike/rails/init.rb
72
+ - test/fixtures/plugins/default/plugin_with_no_lib_dir
73
+ - test/fixtures/plugins/default/plugin_with_no_lib_dir/init.rb
74
+ - test/fixtures/plugins/default/stubby
75
+ - test/fixtures/plugins/default/stubby/about.yml
76
+ - test/fixtures/plugins/default/stubby/generators
77
+ - test/fixtures/plugins/default/stubby/generators/stubby_generator
78
+ - test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb
79
+ - test/fixtures/plugins/default/stubby/init.rb
80
+ - test/fixtures/plugins/default/stubby/lib
81
+ - test/fixtures/plugins/default/stubby/lib/stubby_mixin.rb
82
+ - test/fixtures/tmp
83
+ - test/fixtures/tmp/test.log
84
+ - test/rails_generators
85
+ - test/rails_generators/shoulda_model_generator_test.rb
86
+ - test/shoulda_macros
87
+ - test/shoulda_macros/generator_macros.rb
88
+ - test/stolen_from_railties.rb
89
+ - test/test_helper.rb
90
+ has_rdoc: false
91
+ homepage: http://github.com/stefanpenner/shoulda_generator
92
+ post_install_message:
93
+ rdoc_options: []
94
+
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: "0"
102
+ version:
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: "0"
108
+ version:
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.2.0
113
+ signing_key:
114
+ specification_version: 2
115
+ summary: Generators which create tests using shoulda
116
+ test_files: []
117
+