genspec 0.2.4 → 0.2.5
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/Gemfile.lock +9 -9
- data/README.rdoc +17 -0
- data/lib/genspec/generator_example_group.rb +62 -20
- data/lib/genspec/matchers.rb +16 -0
- data/lib/genspec/matchers/base.rb +3 -3
- data/lib/genspec/version.rb +1 -1
- data/spec/generators/test_rails3_spec.rb +19 -1
- metadata +1 -1
data/Gemfile.lock
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
genspec (0.2.
|
4
|
+
genspec (0.2.4)
|
5
5
|
i18n (>= 0.5.0)
|
6
|
-
rspec (~> 2
|
6
|
+
rspec (~> 2)
|
7
7
|
sc-core-ext (~> 1.2.1)
|
8
8
|
thor (~> 0.14.6)
|
9
9
|
|
@@ -79,14 +79,14 @@ GEM
|
|
79
79
|
rake (0.9.2.2)
|
80
80
|
rdoc (3.11)
|
81
81
|
json (~> 1.4)
|
82
|
-
rspec (2.
|
83
|
-
rspec-core (~> 2.
|
84
|
-
rspec-expectations (~> 2.
|
85
|
-
rspec-mocks (~> 2.
|
86
|
-
rspec-core (2.
|
87
|
-
rspec-expectations (2.
|
82
|
+
rspec (2.8.0)
|
83
|
+
rspec-core (~> 2.8.0)
|
84
|
+
rspec-expectations (~> 2.8.0)
|
85
|
+
rspec-mocks (~> 2.8.0)
|
86
|
+
rspec-core (2.8.0)
|
87
|
+
rspec-expectations (2.8.0)
|
88
88
|
diff-lcs (~> 1.1.2)
|
89
|
-
rspec-mocks (2.
|
89
|
+
rspec-mocks (2.8.0)
|
90
90
|
sc-core-ext (1.2.1)
|
91
91
|
activesupport (>= 2.3.5)
|
92
92
|
sprockets (2.0.3)
|
data/README.rdoc
CHANGED
@@ -199,6 +199,23 @@ Finally, you can also choose to use +with_args+ without a block, in which case i
|
|
199
199
|
# . . .
|
200
200
|
end
|
201
201
|
end
|
202
|
+
|
203
|
+
|
204
|
+
=== Passing Options
|
205
|
+
|
206
|
+
Sometimes you need to change the behavior of the generator itself, by passing options directly into the generator instance that you couldn't normally pass from the command line. A perfect example is when you want to test what would happen when the generator's behavior is set to :revoke, which is equivalent to the +rails destroy+ command.
|
207
|
+
|
208
|
+
Here's an example that verifies that a file is created by the generator, but that the same file is deleted when the generator's behavior is set to +:revoke+:
|
209
|
+
|
210
|
+
describe :controller do
|
211
|
+
with_args "welcome" do
|
212
|
+
it { should generate("app/controllers/welcome_controller.rb") }
|
213
|
+
|
214
|
+
with_options :behavior => :revoke do
|
215
|
+
it { should delete("app/controllers/welcome_controller.rb") }
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
202
219
|
|
203
220
|
=== Fixtures
|
204
221
|
|
@@ -5,7 +5,36 @@ module GenSpec
|
|
5
5
|
|
6
6
|
def self.included(base)
|
7
7
|
base.send(:extend, GenSpec::GeneratorExampleGroup::ClassMethods)
|
8
|
-
base.send(:subject) {
|
8
|
+
base.send(:subject) { generator_descriptor }
|
9
|
+
end
|
10
|
+
|
11
|
+
def within_source_root(&block)
|
12
|
+
generator_init_blocks << block
|
13
|
+
end
|
14
|
+
|
15
|
+
def generator_init_blocks
|
16
|
+
@generator_init_blocks ||= self.class.generator_init_blocks.dup
|
17
|
+
end
|
18
|
+
|
19
|
+
# A hash containing the following:
|
20
|
+
#
|
21
|
+
# :described - the generator to be tested, or the string/symbol representing it
|
22
|
+
# :args - any arguments to be used when invoking the generator
|
23
|
+
# :input - a string to be used as an input stream, or nil
|
24
|
+
# :init_blocks - an array of blocks to be invoked prior to running the generator
|
25
|
+
# :generator_options - a hash of options to be passed into the generator
|
26
|
+
#
|
27
|
+
# This hash represents the +subject+ of the spec and this is the object that will
|
28
|
+
# ultimately be passed into the GenSpec matchers.
|
29
|
+
#
|
30
|
+
def generator_descriptor
|
31
|
+
{
|
32
|
+
:described => self.class.target_generator,
|
33
|
+
:args => self.class.generator_args,
|
34
|
+
:input => self.class.generator_input,
|
35
|
+
:init_blocks => generator_init_blocks,
|
36
|
+
:generator_options => self.class.generator_options
|
37
|
+
}
|
9
38
|
end
|
10
39
|
|
11
40
|
module ClassMethods
|
@@ -41,6 +70,27 @@ module GenSpec
|
|
41
70
|
end
|
42
71
|
end
|
43
72
|
|
73
|
+
# Allows you to pass options directly into the generator, such as
|
74
|
+
# :shell, :behavior, etc.
|
75
|
+
#
|
76
|
+
# Ex:
|
77
|
+
#
|
78
|
+
# # simulate a destroy generator, per `rails destroy controller ...`
|
79
|
+
# with_generator_options :behavior => :revoke do
|
80
|
+
# # . . .
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
def with_generator_options(options, &block)
|
84
|
+
if block_given?
|
85
|
+
context "with generator options #{options.inspect}" do
|
86
|
+
with_generator_options options
|
87
|
+
instance_eval &block
|
88
|
+
end
|
89
|
+
else
|
90
|
+
generator_options.merge! options
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
44
94
|
# Sets the input stream for this generator.
|
45
95
|
#
|
46
96
|
# Ex:
|
@@ -113,6 +163,17 @@ module GenSpec
|
|
113
163
|
end
|
114
164
|
end
|
115
165
|
|
166
|
+
# Returns the hash of options to be passed into the generator in this context.
|
167
|
+
def generator_options
|
168
|
+
return metadata[:generator_options] if metadata[:generator_options]
|
169
|
+
|
170
|
+
metadata[:generator_options] = if genspec_subclass?
|
171
|
+
superclass.generator_options.dup
|
172
|
+
else
|
173
|
+
{ }
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
116
177
|
# Returns the input stream to be used for this context. If this context doesn't
|
117
178
|
# have an input stream, its superclass is checked, and so on until either the
|
118
179
|
# parent isn't a GenSpec or an input stream is found. Only the closest input
|
@@ -132,25 +193,6 @@ module GenSpec
|
|
132
193
|
alias with_arguments with_args
|
133
194
|
alias generator_arguments generator_args
|
134
195
|
|
135
|
-
# A hash containing the following:
|
136
|
-
#
|
137
|
-
# :described - the generator to be tested, or the string/symbol representing it
|
138
|
-
# :args - any arguments to be used when invoking the generator
|
139
|
-
# :input - a string to be used as an input stream, or nil
|
140
|
-
# :init_blocks - an array of blocks to be invoked prior to running the generator
|
141
|
-
#
|
142
|
-
# This hash represents the +subject+ of the spec and this is the object that will
|
143
|
-
# ultimately be passed into the GenSpec matchers.
|
144
|
-
#
|
145
|
-
def generator_descriptor
|
146
|
-
{
|
147
|
-
:described => target_generator,
|
148
|
-
:args => generator_args,
|
149
|
-
:input => generator_input,
|
150
|
-
:init_blocks => generator_init_blocks
|
151
|
-
}
|
152
|
-
end
|
153
|
-
|
154
196
|
# Traverses up the context tree to find the topmost description, which represents
|
155
197
|
# the controller to be tested or the string/symbol representing it.
|
156
198
|
def target_generator
|
data/lib/genspec/matchers.rb
CHANGED
@@ -22,6 +22,22 @@ module GenSpec
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
# Makes sure that the generator deletes the named file. This is done by first ensuring that the
|
26
|
+
# file exists in the first place, and then ensuring that it does not exist after the generator
|
27
|
+
# completes its run.
|
28
|
+
#
|
29
|
+
# Example:
|
30
|
+
# subject.should delete("path/to/file")
|
31
|
+
#
|
32
|
+
def delete(filename)
|
33
|
+
within_source_root do
|
34
|
+
FileUtils.mkdir_p File.dirname(filename)
|
35
|
+
FileUtils.touch filename
|
36
|
+
end
|
37
|
+
|
38
|
+
generate { File.should_not exist(filename) }
|
39
|
+
end
|
40
|
+
|
25
41
|
# ex:
|
26
42
|
# subject.should call_action(:create_file, ...)
|
27
43
|
#
|
@@ -21,6 +21,7 @@ module GenSpec
|
|
21
21
|
def matches?(generator)
|
22
22
|
@described = generator[:described]
|
23
23
|
@args = generator[:args]
|
24
|
+
@generator_options = generator[:generator_options]
|
24
25
|
@shell = GenSpec::Shell.new("", generator[:input] || "")
|
25
26
|
@init_blocks = generator[:init_blocks]
|
26
27
|
|
@@ -103,11 +104,10 @@ module GenSpec
|
|
103
104
|
end
|
104
105
|
|
105
106
|
@destination_root = tempdir
|
106
|
-
@generator.start(@args || [],
|
107
|
+
@generator.start(@args || [], @generator_options.reverse_merge(
|
107
108
|
:shell => @shell,
|
108
109
|
:destination_root => destination_root
|
109
|
-
|
110
|
-
|
110
|
+
))
|
111
111
|
check_for_errors
|
112
112
|
generated
|
113
113
|
end
|
data/lib/genspec/version.rb
CHANGED
@@ -80,12 +80,30 @@ describe :test_rails3 do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
# FIXME: Uh, how best to write a spec around this? I'm actually trying to test #with_args with a block...
|
84
83
|
with_args :test_arg do
|
85
84
|
it "should generate file 'test_arg'" do
|
86
85
|
subject.should generate('test_arg')
|
87
86
|
end
|
88
87
|
|
88
|
+
it "should not generate template_name" do
|
89
|
+
# because that option hasn't been given in this context.
|
90
|
+
subject.should_not generate('template_name')
|
91
|
+
end
|
92
|
+
|
93
|
+
with_generator_options :behavior => :revoke do
|
94
|
+
it "should delete file 'test_arg'" do
|
95
|
+
subject.should generate {
|
96
|
+
File.should_not exist("test_arg")
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
# demonstrate use of the `delete` matcher, which is equivalent to
|
101
|
+
# above:
|
102
|
+
it "should destroy file 'test_arg'" do
|
103
|
+
subject.should delete("test_arg")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
89
107
|
# ...and a test of nested args
|
90
108
|
with_args "template_name" do
|
91
109
|
it "should generate file 'test_arg'" do
|