attribute_matcher 0.0.4 → 0.3
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/.guard.rb +1 -0
- data/.rubocop.yml +6 -0
- data/Gemfile.lock +57 -1
- data/Guardfile +5 -0
- data/README.md +47 -0
- data/attribute_matcher.gemspec +11 -7
- data/lib/attribute_matcher.rb +1 -1
- data/lib/attribute_matcher/attribute_matcher.rb +15 -32
- data/lib/attribute_matcher/ext/rspec/chain_value.rb +44 -0
- data/lib/attribute_matcher/version.rb +1 -1
- data/spec/lib/attribute_matcher/attribute_matcher_spec.rb +35 -2
- data/spec/lib/attribute_matcher/usage_spec.rb +4 -0
- data/spec/lib/attribute_matcher/virtus_spec.rb +35 -0
- metadata +63 -3
- data/lib/attribute_matcher/ext/rspec/chain_group.rb +0 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 0d30c684acab47d8d9d0f1f203aa324586c2e104
|
|
4
|
+
data.tar.gz: 5e9a7533456b4911c3b00c19c4a750fec309a8e9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 54b935465a6409f7afd3853f2bdfddef7f8e32a345dfb32153739fdd2227b7de491c130d0a36c53eb7e7e391bcd30cfbd80eaf0919ba01ffeb90e5815b8cce42
|
|
7
|
+
data.tar.gz: 8fca475ef188732f034879f467c9a38a1bd86ebe5135e302557a3939f84a2ad4d60350d93b8561847db4d8981723909ea452f65c4139434ba633a9251504c356
|
data/.guard.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
notification :terminal_notifier
|
data/.rubocop.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
attribute_matcher (0.
|
|
4
|
+
attribute_matcher (0.3)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
@@ -9,26 +9,69 @@ GEM
|
|
|
9
9
|
ast (2.1.0)
|
|
10
10
|
astrolabe (1.3.1)
|
|
11
11
|
parser (~> 2.2)
|
|
12
|
+
axiom-types (0.1.1)
|
|
13
|
+
descendants_tracker (~> 0.0.4)
|
|
14
|
+
ice_nine (~> 0.11.0)
|
|
15
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
16
|
+
coderay (1.1.0)
|
|
17
|
+
coercible (1.0.0)
|
|
18
|
+
descendants_tracker (~> 0.0.1)
|
|
12
19
|
coveralls (0.8.2)
|
|
13
20
|
json (~> 1.8)
|
|
14
21
|
rest-client (>= 1.6.8, < 2)
|
|
15
22
|
simplecov (~> 0.10.0)
|
|
16
23
|
term-ansicolor (~> 1.3)
|
|
17
24
|
thor (~> 0.19.1)
|
|
25
|
+
descendants_tracker (0.0.4)
|
|
26
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
18
27
|
diff-lcs (1.2.5)
|
|
19
28
|
docile (1.1.5)
|
|
20
29
|
domain_name (0.5.24)
|
|
21
30
|
unf (>= 0.0.5, < 1.0.0)
|
|
31
|
+
equalizer (0.0.11)
|
|
32
|
+
ffi (1.9.10)
|
|
33
|
+
formatador (0.2.5)
|
|
34
|
+
guard (2.13.0)
|
|
35
|
+
formatador (>= 0.2.4)
|
|
36
|
+
listen (>= 2.7, <= 4.0)
|
|
37
|
+
lumberjack (~> 1.0)
|
|
38
|
+
nenv (~> 0.1)
|
|
39
|
+
notiffany (~> 0.0)
|
|
40
|
+
pry (>= 0.9.12)
|
|
41
|
+
shellany (~> 0.0)
|
|
42
|
+
thor (>= 0.18.1)
|
|
43
|
+
guard-compat (1.2.1)
|
|
44
|
+
guard-rspec (4.6.4)
|
|
45
|
+
guard (~> 2.1)
|
|
46
|
+
guard-compat (~> 1.1)
|
|
47
|
+
rspec (>= 2.99.0, < 4.0)
|
|
22
48
|
http-cookie (1.0.2)
|
|
23
49
|
domain_name (~> 0.5)
|
|
50
|
+
ice_nine (0.11.1)
|
|
24
51
|
json (1.8.3)
|
|
52
|
+
listen (3.0.3)
|
|
53
|
+
rb-fsevent (>= 0.9.3)
|
|
54
|
+
rb-inotify (>= 0.9)
|
|
55
|
+
lumberjack (1.0.9)
|
|
56
|
+
method_source (0.8.2)
|
|
25
57
|
mime-types (2.6.2)
|
|
58
|
+
nenv (0.2.0)
|
|
26
59
|
netrc (0.10.3)
|
|
60
|
+
notiffany (0.0.8)
|
|
61
|
+
nenv (~> 0.1)
|
|
62
|
+
shellany (~> 0.0)
|
|
27
63
|
parser (2.2.2.6)
|
|
28
64
|
ast (>= 1.1, < 3.0)
|
|
29
65
|
powerpack (0.1.1)
|
|
66
|
+
pry (0.10.2)
|
|
67
|
+
coderay (~> 1.1.0)
|
|
68
|
+
method_source (~> 0.8.1)
|
|
69
|
+
slop (~> 3.4)
|
|
30
70
|
rainbow (2.0.0)
|
|
31
71
|
rake (10.4.2)
|
|
72
|
+
rb-fsevent (0.9.6)
|
|
73
|
+
rb-inotify (0.9.5)
|
|
74
|
+
ffi (>= 0.5.0)
|
|
32
75
|
rest-client (1.8.0)
|
|
33
76
|
http-cookie (>= 1.0.2, < 2.0)
|
|
34
77
|
mime-types (>= 1.16, < 3.0)
|
|
@@ -56,18 +99,27 @@ GEM
|
|
|
56
99
|
rainbow (>= 1.99.1, < 3.0)
|
|
57
100
|
ruby-progressbar (~> 1.4)
|
|
58
101
|
ruby-progressbar (1.7.5)
|
|
102
|
+
shellany (0.0.1)
|
|
59
103
|
simplecov (0.10.0)
|
|
60
104
|
docile (~> 1.1.0)
|
|
61
105
|
json (~> 1.8)
|
|
62
106
|
simplecov-html (~> 0.10.0)
|
|
63
107
|
simplecov-html (0.10.0)
|
|
108
|
+
slop (3.6.0)
|
|
64
109
|
term-ansicolor (1.3.2)
|
|
65
110
|
tins (~> 1.0)
|
|
111
|
+
terminal-notifier-guard (1.6.4)
|
|
66
112
|
thor (0.19.1)
|
|
113
|
+
thread_safe (0.3.5)
|
|
67
114
|
tins (1.6.0)
|
|
68
115
|
unf (0.1.4)
|
|
69
116
|
unf_ext
|
|
70
117
|
unf_ext (0.0.7.1)
|
|
118
|
+
virtus (1.0.5)
|
|
119
|
+
axiom-types (~> 0.1)
|
|
120
|
+
coercible (~> 1.0)
|
|
121
|
+
descendants_tracker (~> 0.0, >= 0.0.3)
|
|
122
|
+
equalizer (~> 0.0, >= 0.0.9)
|
|
71
123
|
|
|
72
124
|
PLATFORMS
|
|
73
125
|
ruby
|
|
@@ -76,11 +128,15 @@ DEPENDENCIES
|
|
|
76
128
|
attribute_matcher!
|
|
77
129
|
bundler (~> 1.7)
|
|
78
130
|
coveralls (~> 0.8)
|
|
131
|
+
guard (~> 2.13)
|
|
132
|
+
guard-rspec (~> 4.6)
|
|
79
133
|
rake (~> 10.0)
|
|
80
134
|
rspec (~> 3.0)
|
|
81
135
|
rspec-its (~> 1.2)
|
|
82
136
|
rubocop (~> 0.30)
|
|
83
137
|
simplecov (~> 0.9)
|
|
138
|
+
terminal-notifier-guard (~> 1.6)
|
|
139
|
+
virtus (~> 1.0)
|
|
84
140
|
|
|
85
141
|
BUNDLED WITH
|
|
86
142
|
1.10.6
|
data/Guardfile
ADDED
data/README.md
CHANGED
|
@@ -25,7 +25,11 @@ Or install it yourself as:
|
|
|
25
25
|
|
|
26
26
|
## Usage
|
|
27
27
|
|
|
28
|
+
### With Ruby attr methods
|
|
29
|
+
|
|
28
30
|
```ruby
|
|
31
|
+
require 'spec_helper'
|
|
32
|
+
|
|
29
33
|
class Person
|
|
30
34
|
attr_accessor :name
|
|
31
35
|
attr_reader :age
|
|
@@ -66,6 +70,49 @@ describe Person do
|
|
|
66
70
|
it { is_expected.to have_attribute(:name).with_value('Joe') }
|
|
67
71
|
it { is_expected.to have_attribute(:age).with_value(nil) }
|
|
68
72
|
end
|
|
73
|
+
|
|
74
|
+
describe 'type' do
|
|
75
|
+
it { is_expected.to have_attribute(:name).of_type(String) }
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### With Virtus
|
|
81
|
+
```ruby
|
|
82
|
+
require 'spec_helper'
|
|
83
|
+
require 'virtus'
|
|
84
|
+
|
|
85
|
+
class VirtusPerson
|
|
86
|
+
include Virtus.model
|
|
87
|
+
|
|
88
|
+
attribute :name, String, default: 'Joe'
|
|
89
|
+
attribute :age
|
|
90
|
+
attribute :status
|
|
91
|
+
|
|
92
|
+
attribute :ssn, String, reader: :private, writer: :private
|
|
93
|
+
attribute :address, String, reader: :protected, writer: :protected
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
describe VirtusPerson do
|
|
97
|
+
it { is_expected.to have_attribute(:name) }
|
|
98
|
+
it { is_expected.to have_attribute(:age) }
|
|
99
|
+
it { is_expected.to have_attribute(:status) }
|
|
100
|
+
|
|
101
|
+
describe 'visibility' do
|
|
102
|
+
it { is_expected.to have_attribute(:address).with_reader(:protected) }
|
|
103
|
+
it { is_expected.to have_attribute(:address).with_writer(:protected) }
|
|
104
|
+
it { is_expected.to have_attribute(:ssn).with_reader(:private) }
|
|
105
|
+
it { is_expected.to have_attribute(:ssn).with_writer(:private) }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
describe 'values' do
|
|
109
|
+
it { is_expected.to have_attribute(:name).with_value('Joe') }
|
|
110
|
+
it { is_expected.to have_attribute(:age).with_value(nil) }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
describe 'type' do
|
|
114
|
+
it { is_expected.to have_attribute(:name).of_type(String) }
|
|
115
|
+
end
|
|
69
116
|
end
|
|
70
117
|
```
|
|
71
118
|
|
data/attribute_matcher.gemspec
CHANGED
|
@@ -19,11 +19,15 @@ Gem::Specification.new do |gem|
|
|
|
19
19
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
|
20
20
|
gem.require_paths = ['lib']
|
|
21
21
|
|
|
22
|
-
gem.add_development_dependency 'bundler',
|
|
23
|
-
gem.add_development_dependency 'coveralls',
|
|
24
|
-
gem.add_development_dependency '
|
|
25
|
-
gem.add_development_dependency 'rspec',
|
|
26
|
-
gem.add_development_dependency '
|
|
27
|
-
gem.add_development_dependency '
|
|
28
|
-
gem.add_development_dependency '
|
|
22
|
+
gem.add_development_dependency 'bundler', '~> 1.7'
|
|
23
|
+
gem.add_development_dependency 'coveralls', '~> 0.8'
|
|
24
|
+
gem.add_development_dependency 'guard', '~> 2.13'
|
|
25
|
+
gem.add_development_dependency 'guard-rspec', '~> 4.6'
|
|
26
|
+
gem.add_development_dependency 'rake', '~> 10.0'
|
|
27
|
+
gem.add_development_dependency 'rspec', '~> 3.0'
|
|
28
|
+
gem.add_development_dependency 'rspec-its', '~> 1.2'
|
|
29
|
+
gem.add_development_dependency 'rubocop', '~> 0.30'
|
|
30
|
+
gem.add_development_dependency 'simplecov', '~> 0.9'
|
|
31
|
+
gem.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
|
|
32
|
+
gem.add_development_dependency 'virtus', '~> 1.0'
|
|
29
33
|
end
|
data/lib/attribute_matcher.rb
CHANGED
|
@@ -1,36 +1,31 @@
|
|
|
1
1
|
RSpec::Matchers.define(:have_attribute) do
|
|
2
2
|
match do
|
|
3
|
-
exists? &&
|
|
3
|
+
exists? && all_values_match?
|
|
4
4
|
end
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
chain_value('with_reader') { |expected_value| ensure_valid_visibility(expected_value); visibility(reader) }
|
|
7
|
+
chain_value('with_writer') { |expected_value| ensure_valid_visibility(expected_value); visibility(writer) }
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
chain_value('read_write') { reader_ok? && writer_ok? }
|
|
10
|
+
chain_value('read_only') { reader_ok? && !writer_ok? }
|
|
11
|
+
chain_value('write_only') { !reader_ok? && writer_ok? }
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
self.value_set = true
|
|
14
|
-
end
|
|
13
|
+
chain_value('with_value') { attribute_value }
|
|
14
|
+
chain_value('of_type') { attribute_type }
|
|
15
15
|
|
|
16
16
|
private
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def exists?
|
|
21
|
-
reader || writer
|
|
18
|
+
def attribute_value
|
|
19
|
+
actual.send(expected)
|
|
22
20
|
end
|
|
23
21
|
|
|
24
|
-
def
|
|
25
|
-
|
|
22
|
+
def attribute_type
|
|
23
|
+
return attribute_value.class if attribute_value
|
|
24
|
+
actual.send(:attribute_set)[expected].primitive if actual.respond_to?(:attribute_set, true)
|
|
26
25
|
end
|
|
27
26
|
|
|
28
|
-
def
|
|
29
|
-
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def read_write_match?
|
|
33
|
-
reader_ok? && writer_ok?
|
|
27
|
+
def exists?
|
|
28
|
+
reader || writer
|
|
34
29
|
end
|
|
35
30
|
|
|
36
31
|
def reader_ok?
|
|
@@ -66,13 +61,6 @@ RSpec::Matchers.define(:have_attribute) do
|
|
|
66
61
|
format('%s() takes %d argument%s instead of %d', method.name, method.arity, method.arity == 1 ? '' : 's', expected_arity) if method && method.arity != expected_arity
|
|
67
62
|
end
|
|
68
63
|
|
|
69
|
-
def visibility_match?(accessor)
|
|
70
|
-
method = accessor == :reader ? reader : writer
|
|
71
|
-
expected_visibility = send("#{accessor}_visibility")
|
|
72
|
-
|
|
73
|
-
method.nil? || expected_visibility.nil? || expected_visibility == visibility(method)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
64
|
def visibility(method)
|
|
77
65
|
klass = method.receiver.class
|
|
78
66
|
|
|
@@ -90,10 +78,5 @@ RSpec::Matchers.define(:have_attribute) do
|
|
|
90
78
|
|
|
91
79
|
def ensure_valid_visibility(visibility)
|
|
92
80
|
fail format('%s is an invalid visibility; should be one of %s', visibility, VALID_VISIBILITIES.join(', ')) unless VALID_VISIBILITIES.include?(visibility)
|
|
93
|
-
visibility
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def value_match?
|
|
97
|
-
value_set.nil? || actual.send(expected).eql?(value)
|
|
98
81
|
end
|
|
99
82
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# An RSpec extension for chained methods that check single values
|
|
2
|
+
module RSpec
|
|
3
|
+
module Matchers
|
|
4
|
+
module DSL
|
|
5
|
+
class Matcher
|
|
6
|
+
class << self
|
|
7
|
+
def chain_value(value, &actual_definition)
|
|
8
|
+
attr_accessor :chained_values, :"expected_#{value}", :"expected_#{value}_set"
|
|
9
|
+
|
|
10
|
+
create_chain_method(value)
|
|
11
|
+
create_all_values_match_method
|
|
12
|
+
create_value_match_method(value, actual_definition)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def create_chain_method(value)
|
|
18
|
+
chain(value) do |expected_value = true|
|
|
19
|
+
self.chained_values ||= []
|
|
20
|
+
chained_values << :"#{value}_match?"
|
|
21
|
+
|
|
22
|
+
send(:"expected_#{value}=", expected_value)
|
|
23
|
+
send(:"expected_#{value}_set=", true)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def create_all_values_match_method
|
|
28
|
+
return if instance_methods(false).include?(:values_match?)
|
|
29
|
+
|
|
30
|
+
define_method(:all_values_match?) do
|
|
31
|
+
chained_values.nil? || chained_values.map { |m| send(m) }.all?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create_value_match_method(value, actual_definition)
|
|
36
|
+
define_method :"#{value}_match?" do
|
|
37
|
+
send(:"expected_#{value}_set").nil? || send(:"expected_#{value}").eql?(instance_exec(send(:"expected_#{value}"), &actual_definition))
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -154,13 +154,13 @@ describe 'have_attribute matcher' do
|
|
|
154
154
|
end
|
|
155
155
|
|
|
156
156
|
it 'should fail if the reader visibility is invalid' do
|
|
157
|
-
expect { have_attribute(:private_reader).with_reader(:foo) }.to raise_error do |error|
|
|
157
|
+
expect { should have_attribute(:private_reader).with_reader(:foo) }.to raise_error do |error|
|
|
158
158
|
expect(error.message).to match /foo is an invalid visibility; should be one of private, protected, public/
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
161
|
|
|
162
162
|
it 'should fail if the write visibility is invalid' do
|
|
163
|
-
expect { have_attribute(:private_writer).with_writer(:foo) }.to raise_error do |error|
|
|
163
|
+
expect { should have_attribute(:private_writer).with_writer(:foo) }.to raise_error do |error|
|
|
164
164
|
expect(error.message).to match /foo is an invalid visibility; should be one of private, protected, public/
|
|
165
165
|
end
|
|
166
166
|
end
|
|
@@ -178,7 +178,40 @@ describe 'have_attribute matcher' do
|
|
|
178
178
|
end
|
|
179
179
|
end
|
|
180
180
|
|
|
181
|
+
it { is_expected.to have_attribute(:name) }
|
|
181
182
|
it { is_expected.to have_attribute(:name).with_value('John') }
|
|
182
183
|
it { is_expected.not_to have_attribute(:name).with_value(nil) }
|
|
184
|
+
|
|
185
|
+
it { is_expected.to have_attribute(:address) }
|
|
186
|
+
it { is_expected.to have_attribute(:address).with_value(nil) }
|
|
187
|
+
it { is_expected.not_to have_attribute(:address).with_value('123 Main St') }
|
|
188
|
+
|
|
189
|
+
it_behaves_like 'matcher messages' do
|
|
190
|
+
{
|
|
191
|
+
:'have_attribute(:name).with_value("John")' => 'have attribute :name with value "John"',
|
|
192
|
+
:'have_attribute(:name).with_value(nil)' => 'have attribute :name with value nil',
|
|
193
|
+
}.each do |expectation, expected_description|
|
|
194
|
+
describe(expectation) do
|
|
195
|
+
its(:description) { is_expected.to eql expected_description }
|
|
196
|
+
its(:failure_message) { is_expected.to match /expected .+ to #{expected_description}/ }
|
|
197
|
+
its(:failure_message_when_negated) { is_expected.to match /expected .+ not to #{expected_description}/ }
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
describe 'of_type' do
|
|
204
|
+
let(:klass) do
|
|
205
|
+
Class.new do
|
|
206
|
+
def initialize
|
|
207
|
+
@name = 'John'
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
attr_reader :name
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
it { is_expected.to have_attribute(:name).of_type(String) }
|
|
215
|
+
it { is_expected.not_to have_attribute(:name).of_type(Integer) }
|
|
183
216
|
end
|
|
184
217
|
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'virtus'
|
|
3
|
+
|
|
4
|
+
class VirtusPerson
|
|
5
|
+
include Virtus.model
|
|
6
|
+
|
|
7
|
+
attribute :name, String, default: 'Joe'
|
|
8
|
+
attribute :age
|
|
9
|
+
attribute :status
|
|
10
|
+
|
|
11
|
+
attribute :ssn, String, reader: :private, writer: :private
|
|
12
|
+
attribute :address, String, reader: :protected, writer: :protected
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe VirtusPerson do
|
|
16
|
+
it { is_expected.to have_attribute(:name) }
|
|
17
|
+
it { is_expected.to have_attribute(:age) }
|
|
18
|
+
it { is_expected.to have_attribute(:status) }
|
|
19
|
+
|
|
20
|
+
describe 'visibility' do
|
|
21
|
+
it { is_expected.to have_attribute(:address).with_reader(:protected) }
|
|
22
|
+
it { is_expected.to have_attribute(:address).with_writer(:protected) }
|
|
23
|
+
it { is_expected.to have_attribute(:ssn).with_reader(:private) }
|
|
24
|
+
it { is_expected.to have_attribute(:ssn).with_writer(:private) }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe 'values' do
|
|
28
|
+
it { is_expected.to have_attribute(:name).with_value('Joe') }
|
|
29
|
+
it { is_expected.to have_attribute(:age).with_value(nil) }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe 'type' do
|
|
33
|
+
it { is_expected.to have_attribute(:name).of_type(String) }
|
|
34
|
+
end
|
|
35
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: attribute_matcher
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: '0.3'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Declan Whelan
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2015-09
|
|
11
|
+
date: 2015-10-09 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -38,6 +38,34 @@ dependencies:
|
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0.8'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: guard
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '2.13'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '2.13'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: guard-rspec
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '4.6'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '4.6'
|
|
41
69
|
- !ruby/object:Gem::Dependency
|
|
42
70
|
name: rake
|
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -108,6 +136,34 @@ dependencies:
|
|
|
108
136
|
- - "~>"
|
|
109
137
|
- !ruby/object:Gem::Version
|
|
110
138
|
version: '0.9'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: terminal-notifier-guard
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '1.6'
|
|
146
|
+
type: :development
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '1.6'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: virtus
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - "~>"
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '1.0'
|
|
160
|
+
type: :development
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - "~>"
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '1.0'
|
|
111
167
|
description: A matcher for testing object attributes.
|
|
112
168
|
email:
|
|
113
169
|
- declan@pleanintuit.com
|
|
@@ -116,22 +172,25 @@ extensions: []
|
|
|
116
172
|
extra_rdoc_files: []
|
|
117
173
|
files:
|
|
118
174
|
- ".gitignore"
|
|
175
|
+
- ".guard.rb"
|
|
119
176
|
- ".rubocop.yml"
|
|
120
177
|
- ".travis.yml"
|
|
121
178
|
- Gemfile
|
|
122
179
|
- Gemfile.lock
|
|
180
|
+
- Guardfile
|
|
123
181
|
- LICENSE.txt
|
|
124
182
|
- README.md
|
|
125
183
|
- Rakefile
|
|
126
184
|
- attribute_matcher.gemspec
|
|
127
185
|
- lib/attribute_matcher.rb
|
|
128
186
|
- lib/attribute_matcher/attribute_matcher.rb
|
|
129
|
-
- lib/attribute_matcher/ext/rspec/
|
|
187
|
+
- lib/attribute_matcher/ext/rspec/chain_value.rb
|
|
130
188
|
- lib/attribute_matcher/ext/rspec/failure_messages.rb
|
|
131
189
|
- lib/attribute_matcher/version.rb
|
|
132
190
|
- spec/lib/attribute_matcher/attribute_matcher_spec.rb
|
|
133
191
|
- spec/lib/attribute_matcher/usage_spec.rb
|
|
134
192
|
- spec/lib/attribute_matcher/version_spec.rb
|
|
193
|
+
- spec/lib/attribute_matcher/virtus_spec.rb
|
|
135
194
|
- spec/spec_helper.rb
|
|
136
195
|
homepage: https://github.com/dwhelan/attribute_matcher
|
|
137
196
|
licenses:
|
|
@@ -161,4 +220,5 @@ test_files:
|
|
|
161
220
|
- spec/lib/attribute_matcher/attribute_matcher_spec.rb
|
|
162
221
|
- spec/lib/attribute_matcher/usage_spec.rb
|
|
163
222
|
- spec/lib/attribute_matcher/version_spec.rb
|
|
223
|
+
- spec/lib/attribute_matcher/virtus_spec.rb
|
|
164
224
|
- spec/spec_helper.rb
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
# An RSpec extension for mutually exclusive chained methods
|
|
2
|
-
module RSpec
|
|
3
|
-
module Matchers
|
|
4
|
-
module DSL
|
|
5
|
-
class Matcher
|
|
6
|
-
class << self
|
|
7
|
-
def chain_group(group_name, *method_names)
|
|
8
|
-
create_match_method(group_name, *method_names)
|
|
9
|
-
chain_methods(method_names)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
private
|
|
13
|
-
|
|
14
|
-
def create_match_method(group_name, *method_names)
|
|
15
|
-
define_method :"#{group_name}_match?" do
|
|
16
|
-
active_method_name = method_names.find { |method_name| instance_variable_get("@#{method_name}") }
|
|
17
|
-
active_method_name ? send("#{active_method_name}_match?") : true
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def chain_methods(method_names)
|
|
22
|
-
method_names.each do |method_name|
|
|
23
|
-
chain(method_name) { instance_variable_set("@#{method_name}", true) }
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|