rspec-its 1.0.1 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4627e0d122f6f6d60961135154b6068ff823fa63
4
- data.tar.gz: 245f30f1298a86c8da41930d50bef0f01bee090c
3
+ metadata.gz: ab33dd1641758cc1d81b57418e598d6d41fc739a
4
+ data.tar.gz: 9235487eef7281417d50bc7342e71baa66779914
5
5
  SHA512:
6
- metadata.gz: 47f4f6c32e9df24cfc6710fe5c96e81d82b5dcb3e4ee487065e20809e27ca64b7bf64a7516ef80bf82b74c6d113f3950a80aec890f410277f29df7530911b88a
7
- data.tar.gz: d8716722becc4400ae94f15ef310336e52cedcd2cb4041de1f9c3fe22904121e23e3cbceb9ff3b6323eab48e7992f03c95a1c45a55a4de395dcee262b63011b8
6
+ metadata.gz: f6ed4e65790cb3c9a2a21bc7a9493dba9e41c890f19ebea44489de827da75ec5a22a0626bffcbcba8f4929d33879892cb5f05faab4a0dd60f5fe3c57dc9c5c76
7
+ data.tar.gz: bcf65bcdad2fb1b8398817728e20f88b0494906e8f0a9b374042092caccf7a3e7314ef9f1238a24cf5c9bf212c707d99c6bebb29b222e36729e77f3850329b59
@@ -7,14 +7,17 @@ rvm:
7
7
  - 1.9.3
8
8
  - 2.0.0
9
9
  - 2.1.0
10
+ - 2.1.1
11
+ - 2.1.2
12
+ - ruby-head
10
13
  - ree
11
14
  - jruby-18mode
12
15
  - jruby
16
+ - jruby-head
13
17
  - rbx
14
- env:
15
- - BRANCH=master
16
- - BRANCH=2-99-maintenance
17
18
  matrix:
18
19
  allow_failures:
19
- - rvm: jruby-18mode
20
+ - rvm: jruby-head
21
+ - rvm: ruby-head
22
+ - rvm: rbx
20
23
 
@@ -1,3 +1,16 @@
1
+ ### 1.1.0 / 2014-04-13
2
+ [full changelog](http://github.com/rspec/rspec-its/compare/v1.0.1...v1.1.0)
3
+
4
+ Breaking Changes:
5
+
6
+ Enhancements:
7
+ * For hashes, multiple array elements are treated as successive access keys
8
+ * Metadata arguments are now supported
9
+
10
+ Bug fixes:
11
+ * Enable `its` example selection by line number in command line
12
+
13
+
1
14
  ### 1.0.1 / 2014-04-13
2
15
  [full changelog](http://github.com/rspec/rspec-its/compare/v1.0.0...v1.0.1)
3
16
 
data/Gemfile CHANGED
@@ -4,8 +4,7 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  %w[rspec rspec-core rspec-expectations rspec-mocks rspec-support].each do |lib|
7
- branch = ENV.fetch('BRANCH','master')
8
- next if branch == '2-99-maintenance' && lib == 'rspec-support'
7
+ branch = ENV.fetch('BRANCH','3-1-maintenance')
9
8
  library_path = File.expand_path("../../#{lib}", __FILE__)
10
9
  if File.exist?(library_path)
11
10
  gem lib, :path => library_path
@@ -24,4 +23,4 @@ eval File.read('Gemfile-custom') if File.exist?('Gemfile-custom')
24
23
 
25
24
  platform :rbx do
26
25
  gem 'rubysl'
27
- end
26
+ end
data/README.md CHANGED
@@ -16,6 +16,10 @@ Or install it yourself as:
16
16
 
17
17
  $ gem install rspec-its
18
18
 
19
+ And require it as:
20
+
21
+ require 'rspec/its'
22
+
19
23
  ## Usage
20
24
 
21
25
  Use the `its` method to generate a nested example group with
@@ -32,11 +36,25 @@ attribute of the attribute of the subject).
32
36
 
33
37
  its("phone_numbers.size") { should_not eq(0) }
34
38
 
35
- When the subject is a hash, you can pass in an array with a single key to
36
- access the value at that key in the hash.
39
+ When the subject implements the `[]` operator, you can pass in an array with a single key to
40
+ refer to the value returned by that operator when passed that key as an argument.
37
41
 
38
42
  its([:key]) { is_expected.to eq(value) }
39
43
 
44
+ For hashes, multiple keys within the array will result in successive accesses into the hash. For example:
45
+
46
+ subject { {key1: {key2: 3} } }
47
+ its([:key1, :key2]) { is_expected.to eq(3)
48
+
49
+ For other objects, multiple keys within the array will be passed as separate arguments in a single method call to [], as in:
50
+
51
+ subject { Matrix[ [:a, :b], [:c, :d] ] }
52
+ its([1,1]) { should eq(:d) }
53
+
54
+ Metadata arguments are supported.
55
+
56
+ its(:size, focus: true) { should eq(1) }
57
+
40
58
  ## Contributing
41
59
 
42
60
  1. Fork it
@@ -96,3 +96,27 @@ Feature: attribute of subject
96
96
  When I run rspec
97
97
  Then the output should contain "Failure/Error: its(:size) { should_not eq(0) }"
98
98
  And the output should not match /#[^\n]*rspec[\x2f]its/
99
+
100
+ Scenario: examples can be specified by exact line number
101
+ Given a file named "example_spec.rb" with:
102
+ """ruby
103
+ describe Array do
104
+ context "when first created" do
105
+ its(:size) { should eq(0) }
106
+ end
107
+ end
108
+ """
109
+ When I run rspec specifying line number 3
110
+ Then the examples should all pass
111
+
112
+ Scenario: examples can be specified by line number within containing block
113
+ Given a file named "example_spec.rb" with:
114
+ """ruby
115
+ describe Array do
116
+ context "when first created" do
117
+ its(:size) { should eq(0) }
118
+ end
119
+ end
120
+ """
121
+ When I run rspec specifying line number 2
122
+ Then the examples should all pass
@@ -6,6 +6,14 @@ When /^I run rspec( with the documentation option)?$/ do |documentation|
6
6
  step "I run `#{rspec_command}`"
7
7
  end
8
8
 
9
+ When /^I run rspec specifying line number (\d+)$/ do |line_number|
10
+ rspec_its_gem_location = File.expand_path('../../../lib/rspec/its', __FILE__)
11
+ require_option = "--require #{rspec_its_gem_location}"
12
+ file_specification = "example_spec.rb:#{line_number}"
13
+ rspec_command = ['rspec', require_option, file_specification].join(' ')
14
+ step "I run `#{rspec_command}`"
15
+ end
16
+
9
17
  Then /^the example(?:s)? should(?: all)? pass$/ do
10
18
  step %q{the output should contain "0 failures"}
11
19
  step %q{the output should not contain "0 examples"}
@@ -47,11 +47,13 @@ module RSpec
47
47
  # describe "a configuration Hash" do
48
48
  # subject do
49
49
  # { :max_users => 3,
50
- # 'admin' => :all_permissions }
50
+ # 'admin' => :all_permissions.
51
+ # 'john_doe' => {:permissions => [:read, :write]}}
51
52
  # end
52
53
  #
53
54
  # its([:max_users]) { should eq(3) }
54
55
  # its(['admin']) { should eq(:all_permissions) }
56
+ # its(['john_doe', :permissions]) { should eq([:read, :write]) }
55
57
  #
56
58
  # # You can still access to its regular methods this way:
57
59
  # its(:keys) { should include(:max_users) }
@@ -67,6 +69,25 @@ module RSpec
67
69
  # its(:size) { is_expected.to eq(0) }
68
70
  # end
69
71
  #
72
+ # You can pass more than one arguments on the `its` block to add
73
+ # some options to the generated example
74
+ #
75
+ # @example
76
+ #
77
+ # # This ...
78
+ # describe Array do
79
+ # its(:size, :focus) { should eq(0) }
80
+ # end
81
+ #
82
+ # # ... generates the same runtime structure as this:
83
+ # describe Array do
84
+ # describe "size" do
85
+ # it "should eq(0)", :focus do
86
+ # subject.size.should eq(0)
87
+ # end
88
+ # end
89
+ # end
90
+ #
70
91
  # Note that this method does not modify `subject` in any way, so if you
71
92
  # refer to `subject` in `let` or `before` blocks, you're still
72
93
  # referring to the outer subject.
@@ -78,12 +99,17 @@ module RSpec
78
99
  # before { subject.age = 25 }
79
100
  # its(:age) { should eq(25) }
80
101
  # end
81
- def its(attribute, &block)
82
- describe(attribute.to_s) do
83
- if Array === attribute
84
- let(:__its_subject) { subject[*attribute] }
85
- else
86
- let(:__its_subject) do
102
+ def its(attribute, *options, &block)
103
+ its_caller = caller.select {|file_line| file_line !~ %r(/lib/rspec/its) }
104
+ describe(attribute.to_s, :caller => its_caller) do
105
+ let(:__its_subject) do
106
+ if Array === attribute
107
+ if Hash === subject
108
+ attribute.inject(subject) {|inner, attr| inner[attr] }
109
+ else
110
+ subject[*attribute]
111
+ end
112
+ else
87
113
  attribute_chain = attribute.to_s.split('.')
88
114
  attribute_chain.inject(subject) do |inner_subject, attr|
89
115
  inner_subject.send(attr)
@@ -103,8 +129,8 @@ module RSpec
103
129
  RSpec::Expectations::NegativeExpectationHandler.handle_matcher(__its_subject, matcher, message)
104
130
  end
105
131
 
106
- its_caller = caller.select {|file_line| file_line !~ %r(/lib/rspec/its) }
107
- example(nil, :caller => its_caller, &block)
132
+ options << { :caller => its_caller }
133
+ example(nil, *options, &block)
108
134
 
109
135
  end
110
136
  end
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Its
3
- VERSION = "1.0.1"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["palfvin@gmail.com"]
11
11
  spec.description = %q{RSpec extension gem for attribute matching}
12
12
  spec.summary = %q{Provides "its" method formally part of rspec-core}
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/rspec/rspec-its"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_runtime_dependency 'rspec-core', '>= 2.99.0.beta1'
22
- spec.add_runtime_dependency 'rspec-expectations', '>= 2.99.0.beta1'
21
+ spec.add_runtime_dependency 'rspec-core', '>= 3.0.0'
22
+ spec.add_runtime_dependency 'rspec-expectations', '>= 3.0.0'
23
23
  spec.add_development_dependency 'bundler', '~> 1.3'
24
24
  spec.add_development_dependency 'rake', '~> 10.1.0'
25
25
  spec.add_development_dependency 'cucumber', '~> 1.3.8'
@@ -22,6 +22,14 @@ module RSpec
22
22
  end.new
23
23
  end
24
24
 
25
+ before(:each, :meta) do
26
+ subject.call_count
27
+ end
28
+
29
+ context "with some metadata" do
30
+ its(:call_count, :meta) { should eq(2) }
31
+ end
32
+
25
33
  context "with a call counter" do
26
34
  its(:call_count) { should eq(1) }
27
35
  end
@@ -86,6 +94,20 @@ module RSpec
86
94
  end
87
95
  end
88
96
  end
97
+
98
+ context "when it's a hash" do
99
+ subject { {:a => {:deep => {:key => "value"}}} }
100
+
101
+ its([:a]) { should eq({:deep => {:key => "value"}}) }
102
+ its([:a, :deep]) { should eq({:key => "value"}) }
103
+ its([:a, :deep, :key]) { should eq("value") }
104
+
105
+ context "when referring to a key that doesn't exist" do
106
+ its([:not_here]) { should be_nil }
107
+ its([:a, :ghost]) { should be_nil }
108
+ its([:deep, :ghost]) { expect { should eq("missing") }.to raise_error(NoMethodError) }
109
+ end
110
+ end
89
111
  end
90
112
 
91
113
  context "when it does not respond to #[]" do
@@ -182,8 +204,11 @@ module RSpec
182
204
  end
183
205
 
184
206
  group.run(NullFormatter.new)
185
- # Using to_h[:status].to_sym in following instead of .status due to need to run in RSpec 2.99
186
- expect(group.children.first.examples.first.execution_result.to_h[:status].to_sym).to eq(:passed)
207
+
208
+ result = group.children.first.examples.first.execution_result
209
+ # Following conditional needed to work across mix of RSpec and ruby versions without warning
210
+ status = result.respond_to?(:status) ? result.status : result[:status].to_sym
211
+ expect(status).to eq(:passed)
187
212
  end
188
213
  end
189
214
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-its
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Alfvin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-13 00:00:00.000000000 Z
11
+ date: 2014-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec-core
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.99.0.beta1
19
+ version: 3.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: 2.99.0.beta1
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec-expectations
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 2.99.0.beta1
33
+ version: 3.0.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 2.99.0.beta1
40
+ version: 3.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -119,7 +119,7 @@ files:
119
119
  - script/test_all
120
120
  - spec/rspec/its_spec.rb
121
121
  - spec/spec_helper.rb
122
- homepage: ''
122
+ homepage: https://github.com/rspec/rspec-its
123
123
  licenses:
124
124
  - MIT
125
125
  metadata: {}