genspec 0.2.8 → 0.3.0
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.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/.travis.yml +29 -11
- data/Gemfile +3 -1
- data/README.rdoc +29 -21
- data/Rakefile +4 -2
- data/genspec.gemspec +11 -5
- data/lib/genspec.rb +11 -5
- data/lib/genspec/generator_example_group.rb +2 -2
- data/lib/genspec/matchers.rb +15 -12
- data/lib/genspec/matchers/base.rb +18 -6
- data/lib/genspec/matchers/generation_method_matcher.rb +12 -9
- data/lib/genspec/matchers/output_matcher.rb +1 -1
- data/lib/genspec/matchers/result_matcher.rb +1 -1
- data/lib/genspec/shell.rb +0 -15
- data/lib/genspec/version.rb +2 -2
- data/spec/generators/migration_spec.rb +2 -1
- data/spec/generators/question_spec.rb +9 -7
- data/spec/generators/test_rails3_spec.rb +34 -34
- data/spec/lib/genspec_spec.rb +2 -2
- data/spec/spec_helper.rb +8 -1
- metadata +46 -40
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3740bec750e728d9bb6506135c75d721b407214a
|
4
|
+
data.tar.gz: 0e822cbddfcf0ca68e68a44bfb6dd868fa661c0b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b2f5e61ad14a6af712f092a67721ca0a7312e01c472c1c78a8abb2730d3babeab14dd4ea381d1272299b46445e0dd475e607f546d9867086dc54a02ecec08715
|
7
|
+
data.tar.gz: 51076fb0b0f07ad9ce83544a88e7e21d8be623a1d2ac14c4a39950e3b203193104b82e94dcb30cd3ed77ca5f868f03d58a6716a4e0e238476a65e942bf8c5b9a
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,16 +1,34 @@
|
|
1
1
|
rvm:
|
2
|
-
-
|
3
|
-
- 1.
|
4
|
-
-
|
2
|
+
- 2.0.0
|
3
|
+
- 2.1.8
|
4
|
+
- 2.2.4
|
5
|
+
- 2.3.0
|
5
6
|
- ruby-head
|
6
|
-
- ree
|
7
|
-
- jruby-18mode
|
8
|
-
- jruby-19mode
|
9
|
-
- jruby-head
|
10
|
-
- rbx-18mode
|
11
7
|
- rbx-19mode
|
12
8
|
|
13
9
|
env:
|
14
|
-
- RAILS_VERSION="~> 3.1"
|
15
|
-
- RAILS_VERSION="~> 3.2"
|
16
|
-
-
|
10
|
+
- RAILS_VERSION="~> 3.1.0"
|
11
|
+
- RAILS_VERSION="~> 3.2.0"
|
12
|
+
- RAILS_VERSION="~> 4.0.0"
|
13
|
+
- RAILS_VERSION="~> 4.1.0"
|
14
|
+
- RAILS_VERSION="~> 4.2.0"
|
15
|
+
- RAILS_VERSION="~> 5.0.0"
|
16
|
+
# Do we need to test each rspec version with each rails?
|
17
|
+
# Since rspec has no direct relation to rails (except through rspec-rails,
|
18
|
+
# which isn't considered here), I'm assuming no.
|
19
|
+
- RAILS_VERSION="none" RSPEC_VERSION="~> 2.0"
|
20
|
+
- RAILS_VERSION="none" RSPEC_VERSION="~> 3.0"
|
21
|
+
|
22
|
+
matrix:
|
23
|
+
allow_failures:
|
24
|
+
- rvm: ruby-head
|
25
|
+
- rvm: rbx-19mode
|
26
|
+
exclude:
|
27
|
+
- rvm: 2.3.0
|
28
|
+
env: RAILS_VERSION="~> 3.1.0"
|
29
|
+
- rvm: 2.3.0
|
30
|
+
env: RAILS_VERSION="~> 3.2.0"
|
31
|
+
- rvm: 2.0.0
|
32
|
+
env: RAILS_VERSION="~> 5.0.0"
|
33
|
+
- rvm: 2.1.8
|
34
|
+
env: RAILS_VERSION="~> 5.0.0"
|
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= GenSpec
|
1
|
+
= GenSpec {<img src="https://travis-ci.org/sinisterchipmunk/genspec.png?branch=master" alt="Build Status" />}[https://travis-ci.org/sinisterchipmunk/genspec] {<img src="https://codeclimate.com/github/sinisterchipmunk/genspec.png" />}[https://codeclimate.com/github/sinisterchipmunk/genspec] {<img src="https://coveralls.io/repos/sinisterchipmunk/genspec/badge.png" alt="Coverage Status" />}[https://coveralls.io/r/sinisterchipmunk/genspec]
|
2
2
|
|
3
3
|
Simple, expressive generator testing for RSpec. This version of GenSpec supports testing either Thor generators (in standalone applications/gems) or Rails 3 generators for Rails apps.
|
4
4
|
|
@@ -28,47 +28,55 @@ A basic generator spec might look something like this:
|
|
28
28
|
describe :custom_controller do
|
29
29
|
context "with no arguments or options" do
|
30
30
|
it "should generate a help message" do
|
31
|
-
subject.
|
31
|
+
expect(subject).to output("A Help Message")
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
with_args :users do
|
36
36
|
it "should generate a UsersController" do
|
37
|
-
subject.
|
38
|
-
content.
|
37
|
+
expect(subject).to generate("app/controllers/users_controller.rb") { |content|
|
38
|
+
expect(content).to =~ /class UserController/
|
39
39
|
}
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
+
|
44
|
+
=== Checking an engine
|
45
|
+
|
46
|
+
You may need to specify a base class, particularly if you are testing a Rails engine:
|
47
|
+
|
48
|
+
describe "base_class:custom_controller" do
|
49
|
+
...
|
50
|
+
end
|
43
51
|
|
44
52
|
=== Checking Generated Files
|
45
53
|
|
46
54
|
This is the preferred way to test files that were generated, because this matcher checks your generator's *behavior*. The test won't care _how_ a file is generated, as long as it _is_ generated. It's as simple as passing the name of the file you expected to be generated:
|
47
55
|
|
48
56
|
it "should generate a readme file" do
|
49
|
-
subject.
|
57
|
+
expect(subject).to generate("README")
|
50
58
|
end
|
51
59
|
|
52
60
|
You can also check the generated file's content by simply passing a block. The _content_ argument in the block is
|
53
61
|
a simple String containing the content of the file:
|
54
62
|
|
55
63
|
it "should generate a model called 'user'" do
|
56
|
-
subject.
|
57
|
-
content.
|
64
|
+
expect(subject).to generate("app/models/user.rb") { |content|
|
65
|
+
expect(content).to =~ /class User < ActiveRecord\:\:Base/
|
58
66
|
}
|
59
67
|
end
|
60
68
|
|
61
69
|
You can also very simply ensure that the generator runs without error, without any further validation, by omitting all arguments:
|
62
70
|
|
63
71
|
it "should generate successfully" do
|
64
|
-
subject.
|
72
|
+
expect(subject).to generate
|
65
73
|
end
|
66
74
|
|
67
75
|
Finally, you could pass a block but no other arguments to +generate+ in order to check the generator's results the old-fashioned way:
|
68
76
|
|
69
77
|
it "should generate a model called 'user'" do
|
70
|
-
subject.
|
71
|
-
File.read("app/models/user.rb").
|
78
|
+
expect(subject).to generate {
|
79
|
+
expect(File.read("app/models/user.rb")).to =~ /class User < ActiveRecord\:\:Base/
|
72
80
|
}
|
73
81
|
end
|
74
82
|
|
@@ -81,17 +89,17 @@ However, sometimes you need to verify that some action occurs which can't be val
|
|
81
89
|
All 3 of the following examples perform exactly the same test. Use whichever seems the most expressive to you. (I prefer the first one.)
|
82
90
|
|
83
91
|
it "should add a gem source" do
|
84
|
-
subject.
|
92
|
+
expect(subject).to add_source("http://gems.github.com")
|
85
93
|
end
|
86
94
|
|
87
95
|
# -or-
|
88
96
|
it "should add a gem source" do
|
89
|
-
subject.
|
97
|
+
expect(subject).to call_action(:add_source, "http://gems.github.com")
|
90
98
|
end
|
91
99
|
|
92
100
|
# -or-
|
93
101
|
it "should add a gem source" do
|
94
|
-
subject.
|
102
|
+
expect(subject).to generate(:add_source, "http://gems.github.com")
|
95
103
|
end
|
96
104
|
|
97
105
|
You can stop passing arguments at any time. This has the effect of widening the range of acceptable parameters. For
|
@@ -99,13 +107,13 @@ instance, the following example does the same thing but will accept _any_ source
|
|
99
107
|
action is called:
|
100
108
|
|
101
109
|
it "should add a gem source" do
|
102
|
-
subject.
|
110
|
+
expect(subject).to generate(:add_source)
|
103
111
|
end
|
104
112
|
|
105
113
|
Similarly, you can get away with specifying only the some of a sequence of arguments; the omitted arguments will accept any value, while the specified ones will be tested. Another example:
|
106
114
|
|
107
115
|
it "should inject into file" do
|
108
|
-
subject.
|
116
|
+
expect(subject).to inject_into_file("config/environment.rb", "config.gem :thor")
|
109
117
|
end
|
110
118
|
|
111
119
|
# if the generator includes the following action, the test will
|
@@ -125,12 +133,12 @@ If you need to test the generator's feedback rather than the generator's results
|
|
125
133
|
|
126
134
|
# Example 1: String
|
127
135
|
it "should generate a help message" do
|
128
|
-
subject.
|
136
|
+
expect(subject).to output("A Help Message")
|
129
137
|
end
|
130
138
|
|
131
139
|
# Example 2: Regular Expression
|
132
140
|
it "should generate a help message" do
|
133
|
-
subject.
|
141
|
+
expect(subject).to output(/A [hH]elp Message/)
|
134
142
|
end
|
135
143
|
|
136
144
|
|
@@ -209,10 +217,10 @@ Here's an example that verifies that a file is created by the generator, but tha
|
|
209
217
|
|
210
218
|
describe :controller do
|
211
219
|
with_args "welcome" do
|
212
|
-
it {
|
220
|
+
it { is_expected.to generate("app/controllers/welcome_controller.rb") }
|
213
221
|
|
214
222
|
with_options :behavior => :revoke do
|
215
|
-
it {
|
223
|
+
it { is_expected.to delete("app/controllers/welcome_controller.rb") }
|
216
224
|
end
|
217
225
|
end
|
218
226
|
end
|
@@ -239,8 +247,8 @@ You can even nest such structures within various contexts:
|
|
239
247
|
within_source_root { touch "config/routes.rb" }
|
240
248
|
|
241
249
|
it "should insert the new route" do
|
242
|
-
subject.
|
243
|
-
File.read("config/routes.rb").
|
250
|
+
expect(subject).to generate {
|
251
|
+
expect(File.read("config/routes.rb")).not_to be_blank
|
244
252
|
}
|
245
253
|
end
|
246
254
|
end
|
data/Rakefile
CHANGED
@@ -5,10 +5,12 @@ def run(*args)
|
|
5
5
|
raise "tests failed" unless system *args
|
6
6
|
end
|
7
7
|
|
8
|
+
require 'coveralls/rake/task'
|
9
|
+
Coveralls::RakeTask.new
|
10
|
+
|
8
11
|
task :default do
|
9
12
|
run "rspec", "spec"
|
10
|
-
|
11
|
-
run "rspec", "spec"
|
13
|
+
Rake::Task['coveralls:push'].invoke
|
12
14
|
end
|
13
15
|
|
14
16
|
begin
|
data/genspec.gemspec
CHANGED
@@ -8,22 +8,28 @@ Gem::Specification.new do |s|
|
|
8
8
|
|
9
9
|
s.authors = ["Colin MacKenzie IV"]
|
10
10
|
s.date = '2010-07-08'
|
11
|
-
s.description = %q{Simple, expressive Thor and/or Rails 3 generator testing for RSpec. For the Rails 2.3 version, use genspec 0.1.x.}
|
11
|
+
s.description = %q{Simple, expressive Thor and/or Rails 3+ generator testing for RSpec. For the Rails 2.3 version, use genspec 0.1.x.}
|
12
12
|
s.email = 'sinisterchipmunk@gmail.com'
|
13
13
|
s.extra_rdoc_files = [
|
14
14
|
"LICENSE",
|
15
15
|
"README.rdoc"
|
16
16
|
]
|
17
17
|
s.files = `git ls-files`.split(/\n/)
|
18
|
-
s.homepage = %q{http://
|
18
|
+
s.homepage = %q{http://github.com/sinisterchipmunk/genspec}
|
19
19
|
s.rdoc_options = ["--charset=UTF-8"]
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
s.rubygems_version = %q{1.3.7}
|
22
|
-
s.summary = %q{Simple, expressive Thor and/or Rails 3 generator testing for RSpec. For the Rails 2.3 version, use genspec 0.1.x.}
|
22
|
+
s.summary = %q{Simple, expressive Thor and/or Rails 3+ generator testing for RSpec. For the Rails 2.3 version, use genspec 0.1.x.}
|
23
23
|
s.test_files = Dir["spec/**/*"]
|
24
24
|
|
25
25
|
s.add_dependency 'thor'
|
26
|
-
|
27
|
-
|
26
|
+
if ENV['RSPEC_VERSION']
|
27
|
+
s.add_dependency 'rspec', ENV['RSPEC_VERSION']
|
28
|
+
else
|
29
|
+
s.add_dependency 'rspec', '>= 2', '< 4'
|
30
|
+
end
|
31
|
+
|
32
|
+
s.add_development_dependency 'coveralls'
|
33
|
+
s.add_development_dependency 'rake'
|
28
34
|
end
|
29
35
|
|
data/lib/genspec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'thor'
|
|
2
2
|
if defined?(Rails)
|
3
3
|
if Rails::VERSION::MAJOR == 2
|
4
4
|
raise "Use genspec 0.1.x for Rails 2; this version is for Rails 3."
|
5
|
-
elsif [3, 4].include? Rails::VERSION::MAJOR
|
5
|
+
elsif [3, 4, 5].include? Rails::VERSION::MAJOR
|
6
6
|
require 'rails/generators'
|
7
7
|
else
|
8
8
|
raise "Unsupported Rails version: #{Rails::VERSION::STRING}"
|
@@ -11,8 +11,9 @@ end
|
|
11
11
|
|
12
12
|
begin
|
13
13
|
require 'rspec/core'
|
14
|
+
require 'rspec/version'
|
14
15
|
rescue LoadError
|
15
|
-
raise "GenSpec requires RSpec v2.0."
|
16
|
+
raise "GenSpec requires RSpec v2.0 or newer."
|
16
17
|
end
|
17
18
|
|
18
19
|
require 'fileutils'
|
@@ -20,8 +21,7 @@ require 'fileutils'
|
|
20
21
|
module GenSpec
|
21
22
|
def self.root; @root; end
|
22
23
|
def self.root=(root); @root = root; end
|
23
|
-
|
24
|
-
require 'sc-core-ext'
|
24
|
+
|
25
25
|
require 'genspec/version' unless defined?(GenSpec::VERSION)
|
26
26
|
require 'genspec/shell'
|
27
27
|
require 'genspec/matchers'
|
@@ -29,7 +29,13 @@ module GenSpec
|
|
29
29
|
end
|
30
30
|
|
31
31
|
RSpec.configure do |config|
|
32
|
-
|
32
|
+
if RSpec::Version::STRING[0] == '2'
|
33
|
+
config.include GenSpec::GeneratorExampleGroup, example_group: { file_path: /spec[\/]generators/ }
|
34
|
+
elsif RSpec::Version::STRING[0] == '3'
|
35
|
+
config.include GenSpec::GeneratorExampleGroup, file_path: /spec[\/]generators/
|
36
|
+
else
|
37
|
+
raise "unexpected rspec version: #{RSpec::Version::STRING}"
|
38
|
+
end
|
33
39
|
|
34
40
|
# Kick off the action wrappers.
|
35
41
|
#
|
@@ -58,7 +58,7 @@ module GenSpec
|
|
58
58
|
# end
|
59
59
|
#
|
60
60
|
def with_args(*args, &block)
|
61
|
-
options = args.
|
61
|
+
options = args.last.kind_of?(Hash) ? args.pop : {}
|
62
62
|
args = args.flatten.collect { |c| c.to_s } unless options[:object]
|
63
63
|
|
64
64
|
if block_given?
|
@@ -217,7 +217,7 @@ module GenSpec
|
|
217
217
|
if genspec_subclass?
|
218
218
|
superclass.generator
|
219
219
|
else
|
220
|
-
|
220
|
+
described_class || description
|
221
221
|
end
|
222
222
|
end
|
223
223
|
|
data/lib/genspec/matchers.rb
CHANGED
@@ -9,15 +9,15 @@ module GenSpec
|
|
9
9
|
# :migration_template, :route_resources
|
10
10
|
#
|
11
11
|
# Examples:
|
12
|
-
# subject.
|
13
|
-
# subject.
|
12
|
+
# expect(subject).to generate(:file, ...)
|
13
|
+
# expect(subject).to generate("vendor/plugins/will_paginate/init.rb")
|
14
14
|
#
|
15
15
|
def generate(kind = nil, *args, &block)
|
16
16
|
if kind.kind_of?(Symbol)
|
17
|
-
# subject.
|
17
|
+
# expect(subject).to generate(:file, ...)
|
18
18
|
call_action(kind, *args, &block)
|
19
19
|
else
|
20
|
-
# subject.
|
20
|
+
# expect(subject).to generate("vendor/plugins/will_paginate/init.rb")
|
21
21
|
GenSpec::Matchers::ResultMatcher.new(kind, &block)
|
22
22
|
end
|
23
23
|
end
|
@@ -27,7 +27,7 @@ module GenSpec
|
|
27
27
|
# completes its run.
|
28
28
|
#
|
29
29
|
# Example:
|
30
|
-
# subject.
|
30
|
+
# expect(subject).to delete("path/to/file")
|
31
31
|
#
|
32
32
|
def delete(filename)
|
33
33
|
within_source_root do
|
@@ -35,11 +35,11 @@ module GenSpec
|
|
35
35
|
FileUtils.touch filename
|
36
36
|
end
|
37
37
|
|
38
|
-
generate { File.
|
38
|
+
generate { expect(File).not_to exist(filename) }
|
39
39
|
end
|
40
40
|
|
41
41
|
# ex:
|
42
|
-
# subject.
|
42
|
+
# expect(subject).to call_action(:create_file, ...)
|
43
43
|
#
|
44
44
|
def call_action(kind, *args, &block)
|
45
45
|
GenSpec::Matchers::GenerationMethodMatcher.for_method(kind, *args, &block)
|
@@ -56,18 +56,21 @@ module GenSpec
|
|
56
56
|
instance_methods = base.instance_methods.collect { |m| m.to_s }
|
57
57
|
|
58
58
|
# ex:
|
59
|
-
# subject.
|
59
|
+
# expect(subject).to create_file(...)
|
60
60
|
# equivalent to:
|
61
|
-
# subject.
|
61
|
+
# expect(subject).to call_action(:create_file, ...)
|
62
62
|
|
63
63
|
GenSpec::Matchers::GenerationMethodMatcher.generation_methods.each do |method_name|
|
64
64
|
# don't overwrite existing methods. since the user expects this to fire FIRST,
|
65
65
|
# it's as if this method's been "overridden". See #included and #extended.
|
66
66
|
next if instance_methods.include?(method_name.to_s)
|
67
67
|
base.class_eval <<-end_code
|
68
|
-
|
69
|
-
|
70
|
-
|
68
|
+
# def create_file(*args, &block)
|
69
|
+
# call_action('create_file', *args, &block)
|
70
|
+
# end
|
71
|
+
def #{method_name}(*args, &block)
|
72
|
+
call_action(#{method_name.inspect}, *args, &block)
|
73
|
+
end
|
71
74
|
end_code
|
72
75
|
end
|
73
76
|
end
|
@@ -19,7 +19,9 @@ module GenSpec
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def matches?(generator)
|
22
|
-
@described = generator[:described]
|
22
|
+
@described = generator[:described].to_s
|
23
|
+
base = nil
|
24
|
+
base, @described = @described.split(/:/) if @described =~ /:/
|
23
25
|
@args = generator[:args]
|
24
26
|
@generator_options = generator[:generator_options]
|
25
27
|
@shell = GenSpec::Shell.new(generator[:output] || "", generator[:input] || "")
|
@@ -29,7 +31,7 @@ module GenSpec
|
|
29
31
|
@generator = @described
|
30
32
|
else
|
31
33
|
if defined?(Rails)
|
32
|
-
@generator = Rails::Generators.find_by_namespace(@described)
|
34
|
+
@generator = Rails::Generators.find_by_namespace(@described, base)
|
33
35
|
else
|
34
36
|
@generator = Thor::Util.find_by_namespace(@described)
|
35
37
|
end
|
@@ -113,15 +115,25 @@ module GenSpec
|
|
113
115
|
end
|
114
116
|
|
115
117
|
@destination_root = tempdir
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
118
|
+
defaults = { :shell => @shell, :destination_root => destination_root }
|
119
|
+
with_captured_io do
|
120
|
+
@generator.start @args || [], defaults.merge(@generator_options)
|
121
|
+
end
|
120
122
|
check_for_errors
|
121
123
|
generated
|
122
124
|
end
|
123
125
|
end
|
124
126
|
end
|
127
|
+
|
128
|
+
def with_captured_io
|
129
|
+
stdout, stderr, stdin = $stdout, $stderr, $stdin
|
130
|
+
begin
|
131
|
+
$stdout, $stderr, $stdin = @shell.output, @shell.output, @shell.input
|
132
|
+
yield
|
133
|
+
ensure
|
134
|
+
$stdout, $stderr, $stdin = stdout, stderr, stdin
|
135
|
+
end
|
136
|
+
end
|
125
137
|
|
126
138
|
def inject_error_handlers!
|
127
139
|
interceptor = self
|
@@ -32,8 +32,8 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
32
32
|
def report_actual_args(args)
|
33
33
|
# save a reference to the set of args that most *closely* matched the expectation.
|
34
34
|
return(@actual_args = args) if @actual_args.nil?
|
35
|
-
matches = (method_args
|
36
|
-
if matches > (method_args
|
35
|
+
matches = (method_args & args).length
|
36
|
+
if matches > (method_args & @actual_args).length
|
37
37
|
@actual_args = args
|
38
38
|
end
|
39
39
|
end
|
@@ -42,7 +42,7 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
42
42
|
"expected to generate a call to #{method_name.inspect}#{with_args} but #{what}"
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def failure_message_when_negated
|
46
46
|
"expected not to generate a call to #{method_name.inspect}#{with_args} but it happened anyway"
|
47
47
|
end
|
48
48
|
|
@@ -85,8 +85,9 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
85
85
|
|
86
86
|
send(:"#{method_name}_without_intercept", *argus, &block)
|
87
87
|
end
|
88
|
-
|
89
|
-
|
88
|
+
|
89
|
+
alias_method :"#{method_name}_without_intercept", :"#{method_name}"
|
90
|
+
alias_method :"#{method_name}", :"#{method_name}_with_intercept"
|
90
91
|
end
|
91
92
|
end
|
92
93
|
end
|
@@ -109,7 +110,7 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
109
110
|
# GENERATION_CLASSES. This is the list of methods that will be converted
|
110
111
|
# into matchers, which can be used like so:
|
111
112
|
#
|
112
|
-
# subject.
|
113
|
+
# expect(subject).to create_file(. . .)
|
113
114
|
#
|
114
115
|
# See also GENERATION_CLASSES
|
115
116
|
#
|
@@ -117,7 +118,9 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
117
118
|
GENERATION_CLASSES.inject([]) do |arr, mod|
|
118
119
|
if mod.kind_of?(String)
|
119
120
|
next arr if !defined?(Rails) && mod =~ /^Rails/
|
120
|
-
mod = mod.
|
121
|
+
mod = mod.split('::').inject(Kernel) do |container, name|
|
122
|
+
container.const_get(name)
|
123
|
+
end
|
121
124
|
end
|
122
125
|
arr.concat mod.public_instance_methods.collect { |i| i.to_s }.reject { |i| i =~ /=/ }
|
123
126
|
arr
|
@@ -127,10 +130,10 @@ class GenSpec::Matchers::GenerationMethodMatcher < GenSpec::Matchers::Base
|
|
127
130
|
# called from GenSpec::Matchers#call_action
|
128
131
|
#
|
129
132
|
# example:
|
130
|
-
# subject.
|
133
|
+
# expect(subject).to call_action(:create_file, ...)
|
131
134
|
#
|
132
135
|
# equivalent to:
|
133
|
-
# subject.
|
136
|
+
# expect(subject).to GenSpec::Matchers::GenerationMethodMatcher.for_method(:create_file, ...)
|
134
137
|
#
|
135
138
|
def for_method(which, *args, &block)
|
136
139
|
if generation_methods.include?(which.to_s)
|
data/lib/genspec/shell.rb
CHANGED
@@ -10,14 +10,6 @@ module GenSpec
|
|
10
10
|
alias_method :output, :stdout
|
11
11
|
alias_method :output=, :stdout=
|
12
12
|
|
13
|
-
Thor::Shell::SHELL_DELEGATED_METHODS.each do |method|
|
14
|
-
eval <<-end_code
|
15
|
-
def #{method}(*args, &block) # def yes?(*args, &block)
|
16
|
-
push_std { super(*args, &block) } # push_std { super(*args, &block) }
|
17
|
-
end # end
|
18
|
-
end_code
|
19
|
-
end
|
20
|
-
|
21
13
|
def ask(statement, color = nil)
|
22
14
|
say "#{statement} ", color
|
23
15
|
response = stdin.gets
|
@@ -42,13 +34,6 @@ module GenSpec
|
|
42
34
|
end
|
43
35
|
|
44
36
|
private
|
45
|
-
def push_std
|
46
|
-
_stderr, _stdout, _stdin = $stderr, $stdout, $stdin
|
47
|
-
$stderr, $stdout, $stdin = stderr, stdout, stdin
|
48
|
-
yield
|
49
|
-
ensure
|
50
|
-
$stderr, $stdout, $stdin = _stderr, _stdout, _stdin
|
51
|
-
end
|
52
37
|
|
53
38
|
def init_stream(which, value)
|
54
39
|
if value.kind_of?(String)
|
data/lib/genspec/version.rb
CHANGED
@@ -4,7 +4,8 @@ if defined?(Rails)
|
|
4
4
|
describe :my_migration do
|
5
5
|
it "should run migration template" do
|
6
6
|
# bug, raising NameError: undefined local variable or method `interceptor'
|
7
|
-
proc { subject.
|
7
|
+
expect(proc { expect(subject).to generate(:migration_template, "1", "2")
|
8
|
+
}).not_to raise_error
|
8
9
|
end
|
9
10
|
end
|
10
11
|
end
|
@@ -3,29 +3,31 @@ require 'spec_helper'
|
|
3
3
|
describe :question do
|
4
4
|
context "without input" do
|
5
5
|
it "should raise an error" do
|
6
|
-
proc { subject.
|
6
|
+
expect(proc { expect(subject).to output("Are you a GOD?")
|
7
|
+
}).to raise_error
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
11
|
with_input "yes" do
|
11
12
|
it "should act upon something" do
|
12
|
-
subject.
|
13
|
-
subject.
|
13
|
+
expect(subject).to act_upon("something")
|
14
|
+
expect(subject).to output(/Acted upon something/)
|
14
15
|
end
|
15
16
|
|
16
17
|
it "should not raise an error" do
|
17
|
-
proc { subject.
|
18
|
+
expect(proc { expect(subject).to output("Good.") }).not_to raise_error
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
with_input "no" do
|
22
23
|
it "should act upon something" do
|
23
|
-
subject.
|
24
|
-
subject.
|
24
|
+
expect(subject).to act_upon("something")
|
25
|
+
expect(subject).to output(/Acted upon something/)
|
25
26
|
end
|
26
27
|
|
27
28
|
it "should not raise an error" do
|
28
|
-
proc { subject.
|
29
|
+
expect(proc { expect(subject).to output("You're new around here, aren't you?")
|
30
|
+
}).not_to raise_error
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
@@ -7,49 +7,49 @@ describe :test_rails3 do
|
|
7
7
|
|
8
8
|
it "should modify Gemfile" do
|
9
9
|
out = ""
|
10
|
-
subject.
|
11
|
-
File.read("Gemfile").strip.
|
10
|
+
expect(subject).to generate {
|
11
|
+
expect(File.read("Gemfile").strip).not_to be_empty
|
12
12
|
out.concat File.read("Gemfile")
|
13
13
|
}
|
14
|
-
out.strip.
|
14
|
+
expect(out.strip).to match %r(\Asource ['"]http://gems.github.com/['"]\z)
|
15
15
|
end
|
16
16
|
|
17
17
|
context "with no options or arguments" do
|
18
18
|
it "should generate a file called default_file" do
|
19
|
-
subject.
|
20
|
-
subject.
|
19
|
+
expect(subject).to generate("default_file")
|
20
|
+
expect(subject).not_to generate("some_other_file")
|
21
21
|
|
22
|
-
subject.
|
23
|
-
subject.
|
24
|
-
subject.
|
22
|
+
expect(subject).to call_action(:create_file)
|
23
|
+
expect(subject).to call_action(:create_file, "default_file")
|
24
|
+
expect(subject).not_to call_action(:create_file, "some_other_file")
|
25
25
|
|
26
|
-
subject.
|
27
|
-
subject.
|
28
|
-
subject.
|
26
|
+
expect(subject).to create_file
|
27
|
+
expect(subject).to create_file('default_file')
|
28
|
+
expect(subject).not_to create_file("some_other_file")
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should generate a file with specific content" do
|
32
|
-
subject.
|
33
|
-
subject.
|
34
|
-
subject.
|
32
|
+
expect(subject).to generate("default_file") { |content| expect(content).to eq "content!" }
|
33
|
+
expect(subject).to generate("default_file") { |content| expect(content).not_to eq "!content" }
|
34
|
+
expect(subject).not_to generate("some_other_file")
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should generate a template called 'default_template'" do
|
38
|
-
subject.
|
39
|
-
subject.
|
38
|
+
expect(subject).to generate(:template)
|
39
|
+
expect(subject).to generate(:template, 'file', 'file_template')
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should output 'create file'" do
|
43
|
-
subject.
|
43
|
+
expect(subject).to output(/create\s+default_file/)
|
44
44
|
end
|
45
45
|
|
46
46
|
it "shoud generate a directory called 'a_directory'" do
|
47
|
-
subject.
|
48
|
-
subject.
|
49
|
-
subject.
|
50
|
-
subject.
|
51
|
-
subject.
|
52
|
-
subject.
|
47
|
+
expect(subject).to generate(:empty_directory)
|
48
|
+
expect(subject).to generate(:empty_directory, "a_directory")
|
49
|
+
expect(subject).to generate("a_directory")
|
50
|
+
expect(subject).not_to generate(:empty_directory, 'another_directory')
|
51
|
+
expect(subject).to empty_directory("a_directory")
|
52
|
+
expect(subject).not_to empty_directory("another_directory")
|
53
53
|
end
|
54
54
|
|
55
55
|
# if the other tests pass then it seems to be working properly, but let's make sure
|
@@ -57,18 +57,18 @@ describe :test_rails3 do
|
|
57
57
|
# will work fine too.
|
58
58
|
it 'should add_source "http://gems.github.com/"' do
|
59
59
|
if defined?(Rails)
|
60
|
-
subject.
|
60
|
+
expect(subject).to add_source("http://gems.github.com/")
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
with_args '--help' do
|
66
66
|
it "should output usage banner with string" do
|
67
|
-
subject.
|
67
|
+
expect(subject).to output(" test_rails3 [ARGUMENT1]")
|
68
68
|
end
|
69
69
|
|
70
70
|
it "should output usage banner with regexp" do
|
71
|
-
subject.
|
71
|
+
expect(subject).to output(/ test_rails3 /)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -76,42 +76,42 @@ describe :test_rails3 do
|
|
76
76
|
with_args :test_arg
|
77
77
|
|
78
78
|
it "should generate file 'test_arg'" do
|
79
|
-
subject.
|
79
|
+
expect(subject).to generate('test_arg')
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
with_args :test_arg do
|
84
84
|
it "should generate file 'test_arg'" do
|
85
|
-
subject.
|
85
|
+
expect(subject).to generate('test_arg')
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should not generate template_name" do
|
89
89
|
# because that option hasn't been given in this context.
|
90
|
-
subject.
|
90
|
+
expect(subject).not_to generate('template_name')
|
91
91
|
end
|
92
92
|
|
93
93
|
with_generator_options :behavior => :revoke do
|
94
94
|
it "should delete file 'test_arg'" do
|
95
|
-
subject.
|
96
|
-
File.
|
95
|
+
expect(subject).to generate {
|
96
|
+
expect(File).not_to exist("test_arg")
|
97
97
|
}
|
98
98
|
end
|
99
99
|
|
100
100
|
# demonstrate use of the `delete` matcher, which is equivalent to
|
101
101
|
# above:
|
102
102
|
it "should destroy file 'test_arg'" do
|
103
|
-
subject.
|
103
|
+
expect(subject).to delete("test_arg")
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
107
107
|
# ...and a test of nested args
|
108
108
|
with_args "template_name" do
|
109
109
|
it "should generate file 'test_arg'" do
|
110
|
-
subject.
|
110
|
+
expect(subject).to generate('test_arg')
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should generate file 'template_name'" do
|
114
|
-
subject.
|
114
|
+
expect(subject).to generate("template_name")
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
data/spec/lib/genspec_spec.rb
CHANGED
@@ -10,8 +10,8 @@ describe GenSpec do
|
|
10
10
|
after { GenSpec.root = nil }
|
11
11
|
|
12
12
|
it "should generate files in generation root" do
|
13
|
-
within_source_root { Dir[File.join(GenSpec.root, '**/*')].
|
14
|
-
subject.
|
13
|
+
within_source_root { expect(Dir[File.join(GenSpec.root, '**/*')]).not_to be_empty }
|
14
|
+
expect(subject).to generate("a_directory")
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'coveralls'
|
2
|
+
Coveralls.wear_merged!
|
3
|
+
|
1
4
|
# Having ./support in the load path means Rails will load the generators at
|
2
5
|
# ./support/generators/**/*_generator.rb and
|
3
6
|
# ./support/rails/generators/**/*_generator.rb
|
@@ -6,7 +9,7 @@ $LOAD_PATH.push File.join(File.dirname(__FILE__), "support")
|
|
6
9
|
require 'bundler'
|
7
10
|
Bundler.setup
|
8
11
|
|
9
|
-
if ENV['
|
12
|
+
if ENV['RAILS_VERSION'] != 'none'
|
10
13
|
require 'rails'
|
11
14
|
require 'rails/generators'
|
12
15
|
end
|
@@ -23,6 +26,10 @@ if !defined?(Rails)
|
|
23
26
|
require File.expand_path('support/generators/question/question_generator', File.dirname(__FILE__))
|
24
27
|
end
|
25
28
|
|
29
|
+
if RSpec::Expectations.respond_to?(:configuration)
|
30
|
+
RSpec::Expectations.configuration.on_potential_false_positives = :nothing
|
31
|
+
end
|
32
|
+
|
26
33
|
RSpec.configure do |c|
|
27
34
|
c.before { GenSpec.root = File.expand_path('../tmp', File.dirname(__FILE__)) } if RUBY_PLATFORM =~ /java/i
|
28
35
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: genspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Colin MacKenzie IV
|
@@ -14,53 +13,67 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: thor
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '2'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '4'
|
38
37
|
type: :runtime
|
39
38
|
prerelease: false
|
40
39
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
40
|
requirements:
|
43
|
-
- -
|
41
|
+
- - ">="
|
44
42
|
- !ruby/object:Gem::Version
|
45
43
|
version: '2'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '4'
|
46
47
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
48
|
+
name: coveralls
|
48
49
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
50
|
requirements:
|
51
|
-
- -
|
51
|
+
- - ">="
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version:
|
54
|
-
type: :
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
57
|
requirements:
|
59
|
-
- -
|
58
|
+
- - ">="
|
60
59
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
62
|
-
|
63
|
-
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0'
|
75
|
+
description: Simple, expressive Thor and/or Rails 3+ generator testing for RSpec.
|
76
|
+
For the Rails 2.3 version, use genspec 0.1.x.
|
64
77
|
email: sinisterchipmunk@gmail.com
|
65
78
|
executables: []
|
66
79
|
extensions: []
|
@@ -68,10 +81,10 @@ extra_rdoc_files:
|
|
68
81
|
- LICENSE
|
69
82
|
- README.rdoc
|
70
83
|
files:
|
71
|
-
- .document
|
72
|
-
- .gitignore
|
73
|
-
- .rspec
|
74
|
-
- .travis.yml
|
84
|
+
- ".document"
|
85
|
+
- ".gitignore"
|
86
|
+
- ".rspec"
|
87
|
+
- ".travis.yml"
|
75
88
|
- Gemfile
|
76
89
|
- LICENSE
|
77
90
|
- README.rdoc
|
@@ -99,38 +112,31 @@ files:
|
|
99
112
|
- spec/support/generators/test_rails3/USAGE
|
100
113
|
- spec/support/generators/test_rails3/templates/file
|
101
114
|
- spec/support/generators/test_rails3/test_rails3_generator.rb
|
102
|
-
homepage: http://
|
115
|
+
homepage: http://github.com/sinisterchipmunk/genspec
|
103
116
|
licenses: []
|
117
|
+
metadata: {}
|
104
118
|
post_install_message:
|
105
119
|
rdoc_options:
|
106
|
-
- --charset=UTF-8
|
120
|
+
- "--charset=UTF-8"
|
107
121
|
require_paths:
|
108
122
|
- lib
|
109
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
124
|
requirements:
|
112
|
-
- -
|
125
|
+
- - ">="
|
113
126
|
- !ruby/object:Gem::Version
|
114
127
|
version: '0'
|
115
|
-
segments:
|
116
|
-
- 0
|
117
|
-
hash: -4044716062259480151
|
118
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
129
|
requirements:
|
121
|
-
- -
|
130
|
+
- - ">="
|
122
131
|
- !ruby/object:Gem::Version
|
123
132
|
version: '0'
|
124
|
-
segments:
|
125
|
-
- 0
|
126
|
-
hash: -4044716062259480151
|
127
133
|
requirements: []
|
128
134
|
rubyforge_project:
|
129
|
-
rubygems_version:
|
135
|
+
rubygems_version: 2.5.1
|
130
136
|
signing_key:
|
131
|
-
specification_version:
|
132
|
-
summary: Simple, expressive Thor and/or Rails 3 generator testing for RSpec. For
|
133
|
-
Rails 2.3 version, use genspec 0.1.x.
|
137
|
+
specification_version: 4
|
138
|
+
summary: Simple, expressive Thor and/or Rails 3+ generator testing for RSpec. For
|
139
|
+
the Rails 2.3 version, use genspec 0.1.x.
|
134
140
|
test_files:
|
135
141
|
- spec/generators/migration_spec.rb
|
136
142
|
- spec/generators/question_spec.rb
|