rspec-advanced_subject 0.0.1 → 0.0.2.1
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/lib/rspec-advanced_subject/class_example_group.rb +43 -0
- data/lib/rspec-advanced_subject/class_method_example_group.rb +51 -0
- data/lib/rspec-advanced_subject/common_methods.rb +22 -0
- data/lib/rspec-advanced_subject/instance_method_example_group.rb +59 -0
- data/lib/rspec-advanced_subject/when_passed.rb +39 -0
- data/spec/advanced_subject/class_example_group_spec.rb +57 -0
- data/spec/advanced_subject/class_method_example_group_spec.rb +53 -0
- data/spec/advanced_subject/instance_method_spec.rb +53 -0
- metadata +29 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e98db86f51ac4f784eef4d14e18fd0452adeeee2
|
4
|
+
data.tar.gz: c658fb02bc1b28a986b7d25d20bcb64dcd286d28
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b859a3376f312d18f9fc5f2cc5477b64cbad00a7e9210f36233928080af8f2b40e8acfb7cf2b130cae20059d1c961b1cf720606ee878e391715496eb039eaef2
|
7
|
+
data.tar.gz: 90681ff5a62c75f81ee61d6f82c1dca575193b4a984d821e8690ab5addcd5e592401b9d0e0fe65a7217e1e4202a0a2d1e3ef7abef0a06469b3ee7a387702f6d0
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative 'common_methods'
|
2
|
+
|
3
|
+
module RSpec::AdvancedSubject
|
4
|
+
module ClassExampleGroup
|
5
|
+
extend CommonClassMethods
|
6
|
+
include CommonInstanceMethods
|
7
|
+
|
8
|
+
RSpec.configure do |c|
|
9
|
+
c.include self, {advanced_subject:
|
10
|
+
proc do |a, m|
|
11
|
+
descriptee(m).is_a?(Class)
|
12
|
+
end
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.included(base)
|
17
|
+
set_subject_class_proc(base.metadata)
|
18
|
+
set_initialization_args(base.metadata)
|
19
|
+
|
20
|
+
base.subject do
|
21
|
+
instance_eval &subject_class_proc
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.set_subject_class_proc(metadata)
|
26
|
+
metadata[:subject_class_proc] ||= proc do |x|
|
27
|
+
described_class.new(*initialization_args)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.set_initialization_args(metadata)
|
32
|
+
metadata[:initialization_args] = metadata.fetch(:with_args,[])
|
33
|
+
end
|
34
|
+
|
35
|
+
def subject_class_proc
|
36
|
+
metadata[:subject_class_proc]
|
37
|
+
end
|
38
|
+
|
39
|
+
def initialization_args
|
40
|
+
metadata.fetch(:initialization_args, Array.new)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RSpec::AdvancedSubject::ClassMethodExampleGroup
|
2
|
+
extend RSpec::AdvancedSubject::CommonClassMethods
|
3
|
+
include RSpec::AdvancedSubject::CommonInstanceMethods
|
4
|
+
RSpec.configure do |c|
|
5
|
+
c.include self, {advanced_subject:
|
6
|
+
lambda do |a, m|
|
7
|
+
descriptee(m).to_s.match(class_regex)
|
8
|
+
end
|
9
|
+
}
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
set_subject_proc(base.metadata)
|
14
|
+
set_subject_method_name(base.metadata)
|
15
|
+
|
16
|
+
base.subject do
|
17
|
+
raise NotImplementedError if metadata[:with_args].nil?
|
18
|
+
instance_eval &subject_proc
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.set_subject_proc(metadata)
|
23
|
+
metadata[:subject_proc] = proc do |x|
|
24
|
+
described_class.send(
|
25
|
+
subject_method_name,
|
26
|
+
*subject_args
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.set_subject_method_name(metadata)
|
32
|
+
case d = metadata[:example_group][:description_args].first
|
33
|
+
when is_a?(Class)
|
34
|
+
metadata[:subject_method_name] = d
|
35
|
+
when class_regex
|
36
|
+
metadata[:subject_method_name] = d.gsub class_regex, ""
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.class_regex
|
41
|
+
/^\./
|
42
|
+
end
|
43
|
+
|
44
|
+
def subject_proc
|
45
|
+
metadata[:subject_proc]
|
46
|
+
end
|
47
|
+
|
48
|
+
def subject_method_name
|
49
|
+
metadata[:subject_method_name]
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module RSpec::AdvancedSubject
|
2
|
+
module CommonClassMethods
|
3
|
+
def descriptee(m)
|
4
|
+
m[:example_group][:description_args].first
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
module RSpec::AdvancedSubject::CommonInstanceMethods
|
9
|
+
|
10
|
+
def subject_args
|
11
|
+
metadata.fetch(:with_args, Array.new)
|
12
|
+
end
|
13
|
+
|
14
|
+
def subject_class_proc
|
15
|
+
metadata[:subject_class_proc]
|
16
|
+
end
|
17
|
+
|
18
|
+
def metadata
|
19
|
+
self.class.metadata
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module RSpec::AdvancedSubject::InstanceMethodExampleGroup
|
2
|
+
extend RSpec::AdvancedSubject::CommonClassMethods
|
3
|
+
include RSpec::AdvancedSubject::CommonInstanceMethods
|
4
|
+
|
5
|
+
RSpec.configure do |c|
|
6
|
+
c.include self, {advanced_subject:
|
7
|
+
->(a,m) do
|
8
|
+
descriptee(m).to_s.match(instance_regex)
|
9
|
+
end
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.included(base)
|
14
|
+
set_subject_method_proc(base.metadata)
|
15
|
+
set_subject_method_name(base.metadata)
|
16
|
+
|
17
|
+
base.subject do
|
18
|
+
raise NotImplementedError if metadata[:with_args].nil?
|
19
|
+
callee
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.set_subject_method_proc(metadata)
|
24
|
+
metadata[:subject_method_proc] = Proc.new do |x|
|
25
|
+
x.send(
|
26
|
+
subject_method_name, *subject_args
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.set_subject_method_name(metadata)
|
32
|
+
case d = metadata[:example_group][:description_args].first
|
33
|
+
when is_a?(Class)
|
34
|
+
metadata[:subject_method_name] = d
|
35
|
+
when instance_regex
|
36
|
+
metadata[:subject_method_name] = d.gsub instance_regex, ""
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.instance_regex
|
41
|
+
/^#/
|
42
|
+
end
|
43
|
+
|
44
|
+
def callee
|
45
|
+
instance_exec parent_callee, &subject_method_proc
|
46
|
+
end
|
47
|
+
|
48
|
+
def parent_callee
|
49
|
+
instance_eval &subject_class_proc
|
50
|
+
end
|
51
|
+
|
52
|
+
def subject_method_proc
|
53
|
+
metadata[:subject_method_proc]
|
54
|
+
end
|
55
|
+
|
56
|
+
def subject_method_name
|
57
|
+
metadata[:subject_method_name]
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class RSpec::Core::ExampleGroup
|
2
|
+
def self.when_passed(*args, &example_group_block)
|
3
|
+
::RSpec::AdvancedSubject::Core.when_passed(*args, self, &example_group_block)
|
4
|
+
end
|
5
|
+
|
6
|
+
def self.when_initialized_with(*args, &example_group_block)
|
7
|
+
::RSpec::AdvancedSubject::Core.when_initialized_with(*args, self, &example_group_block)
|
8
|
+
end
|
9
|
+
|
10
|
+
define_example_group_method :describe, advanced_subject: true
|
11
|
+
end
|
12
|
+
|
13
|
+
module RSpec::AdvancedSubject::Core
|
14
|
+
def self.when_passed(*args, example_groups, &example_group_block)
|
15
|
+
example_groups.context(method_describe_string(*args), with_args: args, &example_group_block)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.when_initialized_with(*args, example_groups, &example_group_block)
|
19
|
+
example_groups.context(initialization_describe_string(*args), initialization_args: args, &example_group_block)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def self.method_describe_string(*args)
|
25
|
+
"when passed #{argument_joiner(args)}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.initialization_describe_string(*args)
|
29
|
+
"when passed #{argument_joiner(args)}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.argument_joiner(args)
|
33
|
+
if args.empty?
|
34
|
+
"nothing"
|
35
|
+
else
|
36
|
+
args.map(&:inspect).join(", ")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rspec-advanced_subject'
|
2
|
+
|
3
|
+
class Comparator
|
4
|
+
def ==(other)
|
5
|
+
other.instance_variables == self.instance_variables
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class NoArgs < Comparator; end
|
10
|
+
|
11
|
+
describe NoArgs do
|
12
|
+
when_initialized_with do
|
13
|
+
it { should eq(NoArgs.new) }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class InitializationMock < Comparator
|
18
|
+
def initialize(foo); @foo = foo; end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe InitializationMock do
|
22
|
+
when_initialized_with 5 do
|
23
|
+
it { should eq(InitializationMock.new(5)) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class MultiArgsInitializationMock < Comparator
|
28
|
+
def initialize(*args); @foo,@bar = *args; end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe MultiArgsInitializationMock do
|
32
|
+
when_initialized_with do
|
33
|
+
it { should eq(MultiArgsInitializationMock.new) }
|
34
|
+
end
|
35
|
+
|
36
|
+
when_initialized_with 5, 10 do
|
37
|
+
it { should eq(MultiArgsInitializationMock.new(5, 10)) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class InitializeAndMethodCall
|
42
|
+
def initialize(foo); @foo = foo; end
|
43
|
+
|
44
|
+
def instance_method(arg)
|
45
|
+
[@foo, arg]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe InitializeAndMethodCall do
|
50
|
+
when_initialized_with 5 do
|
51
|
+
describe "#instance_method" do
|
52
|
+
when_passed 10 do
|
53
|
+
it { should eq([5,10]) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rspec-advanced_subject'
|
2
|
+
|
3
|
+
class ClassMock
|
4
|
+
def self.single_argument(arg)
|
5
|
+
arg
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.multiple_arguments(*args)
|
9
|
+
args
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe ClassMock do
|
14
|
+
describe ".single_argument" do
|
15
|
+
when_passed 5 do
|
16
|
+
it { should eq(5) }
|
17
|
+
end
|
18
|
+
|
19
|
+
when_passed 1 do
|
20
|
+
it { should eq(1) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when explicitly setting subject" do
|
24
|
+
subject { described_class.single_argument(5) }
|
25
|
+
it { should eq(5) }
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when using default subject without passing arguments" do
|
29
|
+
it "raises NotImplementedError" do
|
30
|
+
expect{subject.single_argument(5)}.to raise_error(NotImplementedError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe ".multiple_arguments" do
|
36
|
+
when_passed do
|
37
|
+
it { should eq([]) }
|
38
|
+
end
|
39
|
+
|
40
|
+
when_passed 5, 5 do
|
41
|
+
it { should eq([5, 5]) }
|
42
|
+
end
|
43
|
+
|
44
|
+
when_passed *[1,2,3,4] do
|
45
|
+
it { should eq([1,2,3,4]) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when explicitly setting subject" do
|
49
|
+
subject { described_class.multiple_arguments(5) }
|
50
|
+
it { should eq([5]) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rspec-advanced_subject'
|
2
|
+
|
3
|
+
class InstanceMock
|
4
|
+
def single_argument(arg)
|
5
|
+
arg
|
6
|
+
end
|
7
|
+
|
8
|
+
def multiple_arguments(*args)
|
9
|
+
args
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe InstanceMock do
|
14
|
+
describe "#single_argument" do
|
15
|
+
when_passed 5 do
|
16
|
+
it { is_expected.to eq(5) }
|
17
|
+
end
|
18
|
+
|
19
|
+
when_passed 1 do
|
20
|
+
it { is_expected.to eq(1) }
|
21
|
+
end
|
22
|
+
|
23
|
+
context "when explicitly setting subject" do
|
24
|
+
subject { described_class.new.single_argument(5) }
|
25
|
+
it { is_expected.to eq(5) }
|
26
|
+
end
|
27
|
+
|
28
|
+
context "when using default subject without passing arguments" do
|
29
|
+
it "raises NotImplementedError" do
|
30
|
+
expect{subject.single_argument(5)}.to raise_error(NotImplementedError)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#multiple_arguments" do
|
36
|
+
when_passed do
|
37
|
+
it { is_expected.to eq([]) }
|
38
|
+
end
|
39
|
+
|
40
|
+
when_passed 5, 5 do
|
41
|
+
it { is_expected.to eq([5, 5]) }
|
42
|
+
end
|
43
|
+
|
44
|
+
when_passed *[1,2,3,4] do
|
45
|
+
it { is_expected.to eq([1,2,3,4]) }
|
46
|
+
end
|
47
|
+
|
48
|
+
context "when explicitly setting subject" do
|
49
|
+
subject { described_class.new.multiple_arguments(5) }
|
50
|
+
it { is_expected.to eq([5]) }
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-advanced_subject
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1
|
4
|
+
version: 0.0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kelly Stannard
|
8
8
|
- Kelly Stannard
|
9
|
+
- Kelly Stannard
|
10
|
+
- Kelly Stannard
|
11
|
+
- Kelly Stannard
|
9
12
|
autorequire:
|
10
13
|
bindir: bin
|
11
14
|
cert_chain: []
|
12
|
-
date: 2014-07-
|
15
|
+
date: 2014-07-28 00:00:00.000000000 Z
|
13
16
|
dependencies:
|
14
17
|
- !ruby/object:Gem::Dependency
|
15
18
|
name: rspec
|
@@ -33,12 +36,24 @@ description: |
|
|
33
36
|
describe Hash do
|
34
37
|
when_initialized_with [:a, :b] do
|
35
38
|
it { should eq({a: :b}) }
|
39
|
+
|
40
|
+
describe '#fetch' do
|
41
|
+
when_passed :a do
|
42
|
+
it { should eq(:b) }
|
43
|
+
end
|
44
|
+
end
|
36
45
|
end
|
37
46
|
end
|
38
47
|
```
|
39
48
|
|
40
49
|
When you run `rspec -f d advanced_subject_spec.rb` it will output:
|
41
50
|
```
|
51
|
+
Hash
|
52
|
+
when initialized with [:a, :b]
|
53
|
+
should eq {:a => :b}
|
54
|
+
#fetch
|
55
|
+
when passed :a
|
56
|
+
should eq :b
|
42
57
|
```
|
43
58
|
email: kwstannard@gmail.com
|
44
59
|
executables: []
|
@@ -46,6 +61,14 @@ extensions: []
|
|
46
61
|
extra_rdoc_files: []
|
47
62
|
files:
|
48
63
|
- lib/rspec-advanced_subject.rb
|
64
|
+
- lib/rspec-advanced_subject/class_example_group.rb
|
65
|
+
- lib/rspec-advanced_subject/class_method_example_group.rb
|
66
|
+
- lib/rspec-advanced_subject/common_methods.rb
|
67
|
+
- lib/rspec-advanced_subject/instance_method_example_group.rb
|
68
|
+
- lib/rspec-advanced_subject/when_passed.rb
|
69
|
+
- spec/advanced_subject/class_example_group_spec.rb
|
70
|
+
- spec/advanced_subject/class_method_example_group_spec.rb
|
71
|
+
- spec/advanced_subject/instance_method_spec.rb
|
49
72
|
homepage: https://github.com/kwstannard/rspec-advanced_subject
|
50
73
|
licenses:
|
51
74
|
- MIT
|
@@ -70,4 +93,7 @@ rubygems_version: 2.2.2
|
|
70
93
|
signing_key:
|
71
94
|
specification_version: 4
|
72
95
|
summary: adding arguments to the subject
|
73
|
-
test_files:
|
96
|
+
test_files:
|
97
|
+
- spec/advanced_subject/class_example_group_spec.rb
|
98
|
+
- spec/advanced_subject/class_method_example_group_spec.rb
|
99
|
+
- spec/advanced_subject/instance_method_spec.rb
|