shoulda-matchers 3.0.0.rc1 → 3.0.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 +4 -4
- data/Gemfile +2 -3
- data/Gemfile.lock +12 -41
- data/NEWS.md +118 -26
- data/README.md +34 -11
- data/doc_config/yard/templates/default/fulldoc/html/css/bootstrap.css +0 -0
- data/doc_config/yard/templates/default/fulldoc/html/css/style.css +4 -0
- data/gemfiles/4.0.0.gemfile +2 -3
- data/gemfiles/4.0.0.gemfile.lock +47 -77
- data/gemfiles/4.0.1.gemfile +2 -3
- data/gemfiles/4.0.1.gemfile.lock +51 -79
- data/gemfiles/4.1.gemfile +2 -3
- data/gemfiles/4.1.gemfile.lock +73 -103
- data/gemfiles/4.2.gemfile +2 -3
- data/gemfiles/4.2.gemfile.lock +90 -124
- data/lib/shoulda/matchers.rb +1 -0
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +6 -8
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +1 -3
- data/lib/shoulda/matchers/action_controller/flash_store.rb +1 -8
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +140 -88
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +2 -5
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +5 -10
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +2 -4
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +1 -3
- data/lib/shoulda/matchers/action_controller/respond_with_matcher.rb +3 -5
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +5 -7
- data/lib/shoulda/matchers/action_controller/set_flash_matcher.rb +35 -9
- data/lib/shoulda/matchers/action_controller/set_session_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model.rb +57 -1
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +2 -5
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +162 -54
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +1 -3
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +24 -11
- data/lib/shoulda/matchers/active_model/numericality_matchers/even_number_matcher.rb +4 -3
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +0 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers/odd_number_matcher.rb +4 -3
- data/lib/shoulda/matchers/active_model/numericality_matchers/only_integer_matcher.rb +2 -1
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +15 -13
- data/lib/shoulda/matchers/active_model/validate_acceptance_of_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +12 -14
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +10 -4
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +0 -3
- data/lib/shoulda/matchers/active_model/validator.rb +0 -8
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +4 -6
- data/lib/shoulda/matchers/active_record/association_matcher.rb +58 -43
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +3 -5
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +3 -5
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +1 -4
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +3 -5
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +7 -7
- data/lib/shoulda/matchers/doublespeak/double.rb +10 -1
- data/lib/shoulda/matchers/doublespeak/double_collection.rb +13 -5
- data/lib/shoulda/matchers/doublespeak/method_call.rb +10 -1
- data/lib/shoulda/matchers/doublespeak/object_double.rb +2 -1
- data/lib/shoulda/matchers/doublespeak/world.rb +10 -0
- data/lib/shoulda/matchers/error.rb +4 -0
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +11 -10
- data/lib/shoulda/matchers/integrations/libraries.rb +1 -0
- data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/active_model.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/active_record.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -1
- data/lib/shoulda/matchers/integrations/libraries/routing.rb +27 -0
- data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/rspec.rb +2 -2
- data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
- data/lib/shoulda/matchers/routing.rb +10 -0
- data/lib/shoulda/matchers/version.rb +1 -1
- data/script/SUPPORTED_VERSIONS +1 -1
- data/spec/acceptance/independent_matchers_spec.rb +103 -42
- data/spec/doublespeak_spec_helper.rb +5 -1
- data/spec/support/acceptance/adds_shoulda_matchers_to_project.rb +34 -11
- data/spec/support/acceptance/helpers/rspec_helpers.rb +9 -13
- data/spec/support/acceptance/helpers/step_helpers.rb +13 -0
- data/spec/support/acceptance/matchers/have_output.rb +1 -1
- data/spec/support/acceptance/matchers/indicate_number_of_tests_was_run_matcher.rb +1 -1
- data/spec/support/tests/command_runner.rb +5 -1
- data/spec/support/unit/helpers/active_record_versions.rb +0 -4
- data/spec/support/unit/shared_examples/set_session_or_flash.rb +8 -3
- data/spec/unit/shoulda/matchers/action_controller/permit_matcher_spec.rb +198 -39
- data/spec/unit/shoulda/matchers/action_controller/route_matcher_spec.rb +269 -102
- data/spec/unit/shoulda/matchers/action_controller/set_flash_matcher_spec.rb +24 -0
- data/spec/unit/shoulda/matchers/active_model/allow_value_matcher_spec.rb +118 -101
- data/spec/unit/shoulda/matchers/active_model/disallow_value_matcher_spec.rb +0 -82
- data/spec/unit/shoulda/matchers/active_model/numericality_matchers/comparison_matcher_spec.rb +148 -121
- data/spec/unit/shoulda/matchers/active_model/validate_acceptance_of_matcher_spec.rb +20 -8
- data/spec/unit/shoulda/matchers/active_model/validate_numericality_of_matcher_spec.rb +64 -183
- data/spec/unit/shoulda/matchers/active_model/validate_presence_of_matcher_spec.rb +14 -0
- data/spec/unit/shoulda/matchers/doublespeak/double_collection_spec.rb +60 -0
- data/spec/unit/shoulda/matchers/doublespeak/double_spec.rb +23 -7
- data/spec/unit/shoulda/matchers/routing/route_matcher_spec.rb +242 -0
- data/spec/unit_spec_helper.rb +4 -0
- data/tasks/documentation.rb +35 -0
- metadata +9 -8
- data/Guardfile +0 -5
- data/cucumber.yml +0 -1
- data/lib/shoulda/matchers/active_model/validator_with_captured_range_error.rb +0 -12
@@ -26,6 +26,36 @@ module Shoulda::Matchers::Doublespeak
|
|
26
26
|
to have_received(:new).
|
27
27
|
with(world, :klass, :a_method, :implementation)
|
28
28
|
end
|
29
|
+
|
30
|
+
context 'if a double has already been registered for the method' do
|
31
|
+
it 'does not call Double.new again' do
|
32
|
+
world = build_world
|
33
|
+
allow(DoubleImplementationRegistry).
|
34
|
+
to receive(:find).
|
35
|
+
and_return(:implementation)
|
36
|
+
allow(Double).to receive(:new)
|
37
|
+
double_collection = described_class.new(world, :klass)
|
38
|
+
|
39
|
+
double_collection.register_stub(:a_method)
|
40
|
+
double_collection.register_stub(:a_method)
|
41
|
+
|
42
|
+
expect(Double).to have_received(:new).once
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns the same Double' do
|
46
|
+
world = build_world
|
47
|
+
allow(DoubleImplementationRegistry).
|
48
|
+
to receive(:find).
|
49
|
+
and_return(:implementation)
|
50
|
+
allow(Double).to receive(:new)
|
51
|
+
double_collection = described_class.new(world, :klass)
|
52
|
+
|
53
|
+
double1 = double_collection.register_stub(:a_method)
|
54
|
+
double2 = double_collection.register_stub(:a_method)
|
55
|
+
|
56
|
+
expect(double1).to equal(double2)
|
57
|
+
end
|
58
|
+
end
|
29
59
|
end
|
30
60
|
|
31
61
|
describe '#register_proxy' do
|
@@ -54,6 +84,36 @@ module Shoulda::Matchers::Doublespeak
|
|
54
84
|
to have_received(:new).
|
55
85
|
with(world, :klass, :a_method, :implementation)
|
56
86
|
end
|
87
|
+
|
88
|
+
context 'if a double has already been registered for the method' do
|
89
|
+
it 'does not call Double.new again' do
|
90
|
+
world = build_world
|
91
|
+
allow(DoubleImplementationRegistry).
|
92
|
+
to receive(:find).
|
93
|
+
and_return(:implementation)
|
94
|
+
allow(Double).to receive(:new)
|
95
|
+
double_collection = described_class.new(world, :klass)
|
96
|
+
|
97
|
+
double_collection.register_proxy(:a_method)
|
98
|
+
double_collection.register_proxy(:a_method)
|
99
|
+
|
100
|
+
expect(Double).to have_received(:new).once
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns the same Double' do
|
104
|
+
world = build_world
|
105
|
+
allow(DoubleImplementationRegistry).
|
106
|
+
to receive(:find).
|
107
|
+
and_return(:implementation)
|
108
|
+
allow(Double).to receive(:new)
|
109
|
+
double_collection = described_class.new(world, :klass)
|
110
|
+
|
111
|
+
double1 = double_collection.register_proxy(:a_method)
|
112
|
+
double2 = double_collection.register_proxy(:a_method)
|
113
|
+
|
114
|
+
expect(double1).to equal(double2)
|
115
|
+
end
|
116
|
+
end
|
57
117
|
end
|
58
118
|
|
59
119
|
describe '#activate' do
|
@@ -2,6 +2,20 @@ require 'doublespeak_spec_helper'
|
|
2
2
|
|
3
3
|
module Shoulda::Matchers::Doublespeak
|
4
4
|
describe Double do
|
5
|
+
describe 'initializer' do
|
6
|
+
context 'if doubles are currently activated on the world level' do
|
7
|
+
it 'immediately activates the new Double' do
|
8
|
+
world = build_world(doubles_activated?: true)
|
9
|
+
klass = create_class(a_method_name: nil)
|
10
|
+
implementation = build_implementation
|
11
|
+
|
12
|
+
double = described_class.new(world, klass, :a_method_name, implementation)
|
13
|
+
|
14
|
+
expect(double).to be_activated
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
5
19
|
describe '#to_return' do
|
6
20
|
it 'tells its implementation to call the given block' do
|
7
21
|
sent_block = -> { }
|
@@ -12,7 +26,7 @@ module Shoulda::Matchers::Doublespeak
|
|
12
26
|
actual_block = block
|
13
27
|
end
|
14
28
|
double = described_class.new(
|
15
|
-
|
29
|
+
build_world,
|
16
30
|
:klass,
|
17
31
|
:a_method,
|
18
32
|
implementation
|
@@ -24,7 +38,7 @@ module Shoulda::Matchers::Doublespeak
|
|
24
38
|
it 'tells its implementation to return the given value' do
|
25
39
|
implementation = build_implementation
|
26
40
|
double = described_class.new(
|
27
|
-
|
41
|
+
build_world,
|
28
42
|
:klass,
|
29
43
|
:a_method,
|
30
44
|
implementation
|
@@ -43,7 +57,7 @@ module Shoulda::Matchers::Doublespeak
|
|
43
57
|
actual_block = block
|
44
58
|
end
|
45
59
|
double = described_class.new(
|
46
|
-
|
60
|
+
build_world,
|
47
61
|
:klass,
|
48
62
|
:a_method,
|
49
63
|
implementation
|
@@ -72,7 +86,8 @@ module Shoulda::Matchers::Doublespeak
|
|
72
86
|
object: instance,
|
73
87
|
method_name: method_name,
|
74
88
|
args: args,
|
75
|
-
block: block
|
89
|
+
block: block,
|
90
|
+
caller: :some_caller
|
76
91
|
)
|
77
92
|
|
78
93
|
double.activate
|
@@ -127,7 +142,7 @@ module Shoulda::Matchers::Doublespeak
|
|
127
142
|
klass = create_class(a_method: 42)
|
128
143
|
instance = klass.new
|
129
144
|
double = described_class.new(
|
130
|
-
|
145
|
+
build_world,
|
131
146
|
klass,
|
132
147
|
:a_method,
|
133
148
|
build_implementation
|
@@ -141,7 +156,7 @@ module Shoulda::Matchers::Doublespeak
|
|
141
156
|
describe '#record_call' do
|
142
157
|
it 'adds the given call to the list of calls' do
|
143
158
|
double = described_class.new(
|
144
|
-
|
159
|
+
build_world,
|
145
160
|
:a_klass,
|
146
161
|
:a_method,
|
147
162
|
:an_implementation
|
@@ -247,7 +262,8 @@ module Shoulda::Matchers::Doublespeak
|
|
247
262
|
def build_world(methods = {})
|
248
263
|
defaults = {
|
249
264
|
original_method_for: nil,
|
250
|
-
store_original_method_for: nil
|
265
|
+
store_original_method_for: nil,
|
266
|
+
doubles_activated?: nil
|
251
267
|
}
|
252
268
|
double('world', defaults.merge(methods))
|
253
269
|
end
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require 'unit_spec_helper'
|
2
|
+
|
3
|
+
describe 'Shoulda::Matchers::Routing::RouteMatcher', type: :routing do
|
4
|
+
before do
|
5
|
+
define_controller('ThingsController')
|
6
|
+
end
|
7
|
+
|
8
|
+
shared_examples_for 'core tests' do
|
9
|
+
context 'when the given method, path, controller, and action match an existing route' do
|
10
|
+
it 'accepts' do
|
11
|
+
define_routes { get '/', to: 'things#index' }
|
12
|
+
|
13
|
+
assert_accepts add_target_to(
|
14
|
+
route(:get, '/'),
|
15
|
+
controller: 'things',
|
16
|
+
action: 'index'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'and the expected controller is specified as a symbol' do
|
21
|
+
it 'accepts' do
|
22
|
+
define_routes { get '/', to: 'things#index' }
|
23
|
+
|
24
|
+
assert_accepts add_target_to(
|
25
|
+
route(:get, '/'),
|
26
|
+
controller: :things,
|
27
|
+
action: 'index'
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'and the expected action is specified as a symbol' do
|
33
|
+
it 'accepts' do
|
34
|
+
define_routes { get '/', to: 'things#index' }
|
35
|
+
|
36
|
+
assert_accepts add_target_to(
|
37
|
+
route(:get, '/'),
|
38
|
+
controller: 'things',
|
39
|
+
action: :index
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context 'when the given method, path, controller, and action do not match an existing route' do
|
46
|
+
it 'rejects' do
|
47
|
+
assert_rejects add_target_to(
|
48
|
+
route(:get, '/non_existent_route'),
|
49
|
+
controller: 'no_controller',
|
50
|
+
action: 'no_action'
|
51
|
+
)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when the given path, controller, and action match an existing route but the method does not' do
|
56
|
+
it 'rejects' do
|
57
|
+
define_routes { post '/', to: 'things#index' }
|
58
|
+
|
59
|
+
assert_rejects add_target_to(
|
60
|
+
route(:get, '/'),
|
61
|
+
controller: 'things',
|
62
|
+
action: 'index'
|
63
|
+
)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when the given method, controller, and action match an existing route but the path does not' do
|
68
|
+
it 'rejects' do
|
69
|
+
define_routes { get '/', to: 'things#index' }
|
70
|
+
|
71
|
+
assert_rejects add_target_to(
|
72
|
+
route(:get, '/different_path'),
|
73
|
+
controller: 'things',
|
74
|
+
action: 'index'
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'when the given method and path match an existing route but the controller does not' do
|
80
|
+
it 'rejects' do
|
81
|
+
define_routes { get '/', to: 'another_controller#index' }
|
82
|
+
|
83
|
+
assert_rejects add_target_to(
|
84
|
+
route(:get, '/'),
|
85
|
+
controller: 'things',
|
86
|
+
action: 'index'
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when the given method, path, and controller match an existing route but the action does not' do
|
92
|
+
it 'rejects' do
|
93
|
+
define_routes { get '/', to: 'things#index' }
|
94
|
+
|
95
|
+
assert_rejects add_target_to(
|
96
|
+
route(:get, '/'),
|
97
|
+
controller: 'things',
|
98
|
+
action: 'another_action'
|
99
|
+
)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when the actual route has a param' do
|
104
|
+
context 'and the expected params include that param' do
|
105
|
+
it 'accepts' do
|
106
|
+
define_routes { get '/things/:id', to: 'things#show' }
|
107
|
+
|
108
|
+
assert_accepts add_target_to(
|
109
|
+
route(:get, '/things/1'),
|
110
|
+
controller: 'things',
|
111
|
+
action: 'show',
|
112
|
+
id: '1'
|
113
|
+
)
|
114
|
+
end
|
115
|
+
|
116
|
+
context 'but its value was not specified as a string' do
|
117
|
+
it 'accepts, treating it as a string' do
|
118
|
+
define_routes { get '/things/:id', to: 'things#show' }
|
119
|
+
|
120
|
+
assert_accepts add_target_to(
|
121
|
+
route(:get, '/things/1'),
|
122
|
+
controller: 'things',
|
123
|
+
action: 'show',
|
124
|
+
id: 1
|
125
|
+
)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context 'and the expected params do not match the actual params' do
|
131
|
+
it 'rejects' do
|
132
|
+
define_routes { get '/things/:id', to: 'things#show' }
|
133
|
+
|
134
|
+
params = {
|
135
|
+
controller: 'things',
|
136
|
+
action: 'show',
|
137
|
+
some: 'other',
|
138
|
+
params: 'here'
|
139
|
+
}
|
140
|
+
assert_rejects add_target_to(
|
141
|
+
route(:get, '/things/:id'),
|
142
|
+
params
|
143
|
+
)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when the actual route has a default param whose value is a symbol' do
|
149
|
+
context 'and the expected params include a value for it' do
|
150
|
+
context 'as a symbol' do
|
151
|
+
it 'accepts' do
|
152
|
+
define_routes do
|
153
|
+
post '/things(.:format)',
|
154
|
+
to: 'things#create',
|
155
|
+
defaults: { format: :json }
|
156
|
+
end
|
157
|
+
|
158
|
+
assert_accepts add_target_to(
|
159
|
+
route(:post, '/things'),
|
160
|
+
controller: 'things',
|
161
|
+
action: 'create',
|
162
|
+
format: :json
|
163
|
+
)
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context 'as a string' do
|
168
|
+
it 'accepts' do
|
169
|
+
define_routes do
|
170
|
+
post '/things(.:format)',
|
171
|
+
to: 'things#create',
|
172
|
+
defaults: { format: :json }
|
173
|
+
end
|
174
|
+
|
175
|
+
assert_accepts add_target_to(
|
176
|
+
route(:post, '/things'),
|
177
|
+
controller: 'things',
|
178
|
+
action: 'create',
|
179
|
+
format: 'json'
|
180
|
+
)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
context 'when the existing route has a glob segment' do
|
187
|
+
context 'and a param is given which represents the segment' do
|
188
|
+
it 'accepts' do
|
189
|
+
define_routes { get '/things/*id', to: 'things#whatever' }
|
190
|
+
|
191
|
+
assert_accepts add_target_to(
|
192
|
+
route(:get, '/things/foo/bar'),
|
193
|
+
controller: 'things',
|
194
|
+
action: 'whatever',
|
195
|
+
id: 'foo/bar'
|
196
|
+
)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
context 'and no param is given which represents the segment' do
|
201
|
+
it 'rejects' do
|
202
|
+
define_routes { get '/things/*id', to: 'things#whatever' }
|
203
|
+
|
204
|
+
assert_rejects add_target_to(
|
205
|
+
route(:get, '/things'),
|
206
|
+
controller: 'things',
|
207
|
+
action: 'whatever'
|
208
|
+
)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
context 'given a controller and action specified as individual options' do
|
215
|
+
include_examples 'core tests'
|
216
|
+
|
217
|
+
def add_target_to(route_matcher, params)
|
218
|
+
route_matcher.to(params)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'given a controller and action joined together in a string' do
|
223
|
+
include_examples 'core tests'
|
224
|
+
|
225
|
+
def add_target_to(route_matcher, args)
|
226
|
+
controller = args.fetch(:controller)
|
227
|
+
action = args.fetch(:action)
|
228
|
+
route_matcher.to(
|
229
|
+
"#{controller}##{action}",
|
230
|
+
args.except(:controller, :action)
|
231
|
+
)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
def assert_accepts(matcher)
|
236
|
+
should(matcher)
|
237
|
+
end
|
238
|
+
|
239
|
+
def assert_rejects(matcher)
|
240
|
+
should_not(matcher)
|
241
|
+
end
|
242
|
+
end
|
data/spec/unit_spec_helper.rb
CHANGED
data/tasks/documentation.rb
CHANGED
@@ -33,6 +33,41 @@ module Shoulda
|
|
33
33
|
publisher.generate_docs_for(args.version, latest_version: args.latest_version)
|
34
34
|
end
|
35
35
|
|
36
|
+
desc 'Watch source files for this project for changes and autogenerate docs accordingly'
|
37
|
+
task :autogenerate do
|
38
|
+
require 'fssm'
|
39
|
+
|
40
|
+
project_directory = File.expand_path(File.dirname(__FILE__) + "/..")
|
41
|
+
|
42
|
+
regenerate_docs = -> (base, relative) {
|
43
|
+
print 'Regenerating docs... '
|
44
|
+
system('bundle exec yard doc &>/dev/null')
|
45
|
+
puts 'done!'
|
46
|
+
}
|
47
|
+
|
48
|
+
puts 'Waiting for documentation files to change...'
|
49
|
+
|
50
|
+
FSSM.monitor do
|
51
|
+
path project_directory do
|
52
|
+
glob 'README.md'
|
53
|
+
create(®enerate_docs)
|
54
|
+
update(®enerate_docs)
|
55
|
+
end
|
56
|
+
|
57
|
+
path File.join(project_directory, 'doc_config/yard') do
|
58
|
+
glob '**/*.rb'
|
59
|
+
create(®enerate_docs)
|
60
|
+
update(®enerate_docs)
|
61
|
+
end
|
62
|
+
|
63
|
+
path File.join(project_directory, 'lib') do
|
64
|
+
glob '**/*.rb'
|
65
|
+
create(®enerate_docs)
|
66
|
+
update(®enerate_docs)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
36
71
|
desc 'Generate docs for a particular version and push them to GitHub'
|
37
72
|
task :publish, [:version, :latest_version] => :setup do |t, args|
|
38
73
|
unless args.version
|