stockboy 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/stockboy/providers/soap.rb +2 -0
- data/lib/stockboy/version.rb +1 -1
- data/spec/stockboy/attribute_map_spec.rb +10 -10
- data/spec/stockboy/attribute_spec.rb +7 -7
- data/spec/stockboy/candidate_record_spec.rb +18 -18
- data/spec/stockboy/configuration_spec.rb +4 -4
- data/spec/stockboy/configurator_spec.rb +24 -24
- data/spec/stockboy/filter_chain_spec.rb +4 -4
- data/spec/stockboy/filter_spec.rb +4 -4
- data/spec/stockboy/filters/missing_email_spec.rb +4 -4
- data/spec/stockboy/filters_spec.rb +4 -4
- data/spec/stockboy/job_spec.rb +24 -24
- data/spec/stockboy/mapped_record_spec.rb +5 -4
- data/spec/stockboy/provider_repeater_spec.rb +2 -2
- data/spec/stockboy/provider_spec.rb +3 -3
- data/spec/stockboy/providers/file_spec.rb +20 -20
- data/spec/stockboy/providers/ftp_spec.rb +20 -20
- data/spec/stockboy/providers/http_spec.rb +28 -28
- data/spec/stockboy/providers/imap/search_options_spec.rb +11 -11
- data/spec/stockboy/providers/imap_spec.rb +23 -23
- data/spec/stockboy/providers/soap_spec.rb +17 -17
- data/spec/stockboy/providers_spec.rb +4 -4
- data/spec/stockboy/readers/csv_spec.rb +13 -9
- data/spec/stockboy/readers/fixed_width_spec.rb +6 -6
- data/spec/stockboy/readers/json_spec.rb +1 -1
- data/spec/stockboy/readers/spreadsheet_spec.rb +15 -15
- data/spec/stockboy/readers/xml_spec.rb +12 -12
- data/spec/stockboy/readers_spec.rb +3 -3
- data/spec/stockboy/source_record_spec.rb +2 -2
- data/spec/stockboy/template_file_spec.rb +3 -3
- data/spec/stockboy/translations/boolean_spec.rb +1 -1
- data/spec/stockboy/translations/date_spec.rb +5 -5
- data/spec/stockboy/translations/decimal_spec.rb +3 -3
- data/spec/stockboy/translations/default_empty_string_spec.rb +4 -4
- data/spec/stockboy/translations/default_false_spec.rb +1 -1
- data/spec/stockboy/translations/default_nil_spec.rb +4 -4
- data/spec/stockboy/translations/default_true_spec.rb +1 -1
- data/spec/stockboy/translations/default_zero_spec.rb +4 -4
- data/spec/stockboy/translations/integer_spec.rb +2 -2
- data/spec/stockboy/translations/string_spec.rb +2 -2
- data/spec/stockboy/translations/time_spec.rb +3 -3
- data/spec/stockboy/translations/uk_date_spec.rb +5 -5
- data/spec/stockboy/translations/us_date_spec.rb +5 -5
- data/spec/stockboy/translations_spec.rb +9 -9
- data/spec/stockboy/translator_spec.rb +2 -2
- data/stockboy.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b618c2bafb9061a14b04ae6d571e42a119aa2a90
|
4
|
+
data.tar.gz: 8772582062024383ea452a5f20d2e4975b7b810e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d55abefd7dbeb962d641ec9639823406f180da9d55196b85f6383be5e67f39fb9827f1df485d24f9aa68d80ade1364b697b497745f7c99a03b29cb66a3c9317
|
7
|
+
data.tar.gz: 23f36e47763251d1f98351b339d3121d7ea6d322fc5b64e2d6943116c38f2e48d2edab20841ac569d192ff594ef07942be02d9a784a963ec0b78427d718c8559
|
data/CHANGELOG.md
CHANGED
@@ -165,6 +165,8 @@ module Stockboy::Providers
|
|
165
165
|
#
|
166
166
|
def client
|
167
167
|
@client ||= Savon.client(client_options)
|
168
|
+
@client.globals.open_timeout(open_timeout) if open_timeout
|
169
|
+
@client.globals.read_timeout(read_timeout) if read_timeout
|
168
170
|
yield @client if block_given?
|
169
171
|
@client
|
170
172
|
end
|
data/lib/stockboy/version.rb
CHANGED
@@ -17,31 +17,31 @@ module Stockboy
|
|
17
17
|
|
18
18
|
it "initializes from hash attribute" do
|
19
19
|
map = AttributeMap.new(:email => row)
|
20
|
-
map[:email].
|
20
|
+
expect(map[:email]).to eq row
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
it "sets same destination as default" do
|
25
|
-
subject[:email].
|
25
|
+
expect(subject[:email]).to eq Attribute.new(:email, "email", [])
|
26
26
|
end
|
27
27
|
|
28
28
|
it "sets source from string to string" do
|
29
29
|
map = AttributeMap.new { updated_at from: "statusDate" }
|
30
|
-
map[:updated_at].from.
|
30
|
+
expect(map[:updated_at].from).to eq "statusDate"
|
31
31
|
end
|
32
32
|
|
33
33
|
it "sets source from symbol to string" do
|
34
34
|
map = AttributeMap.new { updated_at from: :statusDate }
|
35
|
-
map[:updated_at].from.
|
35
|
+
expect(map[:updated_at].from).to eq "statusDate"
|
36
36
|
end
|
37
37
|
|
38
38
|
it "sets source from number to number" do
|
39
39
|
map = AttributeMap.new { email from: 12 }
|
40
|
-
map[:email].from.
|
40
|
+
expect(map[:email].from).to eq 12
|
41
41
|
end
|
42
42
|
|
43
43
|
it "sets callable translators" do
|
44
|
-
subject[:updated_at].translators.first.call("2012-01-01").
|
44
|
+
expect(subject[:updated_at].translators.first.call("2012-01-01")).to eq Date.new(2012,1,1)
|
45
45
|
end
|
46
46
|
|
47
47
|
it "sets ignore conditions" do
|
@@ -49,7 +49,7 @@ module Stockboy
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "has attr accessors" do
|
52
|
-
subject.email.
|
52
|
+
expect(subject.email).to be_a Attribute
|
53
53
|
end
|
54
54
|
|
55
55
|
it "raises error for undefined attrs" do
|
@@ -57,8 +57,8 @@ module Stockboy
|
|
57
57
|
end
|
58
58
|
|
59
59
|
it "is enumerable" do
|
60
|
-
subject.map(&:from).
|
61
|
-
subject.map(&:to).
|
60
|
+
expect(subject.map(&:from)).to eq ["email", "score", "statusDate"]
|
61
|
+
expect(subject.map(&:to)).to eq [:email, :score, :updated_at]
|
62
62
|
end
|
63
63
|
|
64
64
|
describe "#insert" do
|
@@ -67,7 +67,7 @@ module Stockboy
|
|
67
67
|
it "sets options from hash" do
|
68
68
|
upcase = ->(r) { r.upcase }
|
69
69
|
map.insert :test, from: "Test", as: upcase
|
70
|
-
map[:test].
|
70
|
+
expect(map[:test]).to eq Attribute.new(:test, "Test", [upcase])
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -5,30 +5,30 @@ module Stockboy
|
|
5
5
|
describe Attribute do
|
6
6
|
it "describes its attrs" do
|
7
7
|
attr = Attribute.new :outfield, "infield", [:one, :two], :nil?
|
8
|
-
attr.inspect.
|
8
|
+
expect(attr.inspect).to eq %{#<Stockboy::Attribute to=:outfield, from="infield", translators=[:one, :two], ignore=:nil?>}
|
9
9
|
end
|
10
10
|
|
11
11
|
describe :ignore? do
|
12
12
|
it "is false by default" do
|
13
13
|
attr = Attribute.new :email, "email", []
|
14
|
-
attr.ignore?(double email: "").
|
14
|
+
expect(attr.ignore?(double email: "")).to be false
|
15
15
|
end
|
16
16
|
|
17
17
|
it "extracts symbols from a record" do
|
18
18
|
attr = Attribute.new :email, "email", [], :blank?
|
19
|
-
attr.ignore?(double email: "").
|
20
|
-
attr.ignore?(double email: "@").
|
19
|
+
expect(attr.ignore?(double email: "")).to be true
|
20
|
+
expect(attr.ignore?(double email: "@")).to be false
|
21
21
|
end
|
22
22
|
|
23
23
|
it "is true with a truthy value" do
|
24
24
|
attr = Attribute.new :email, "email", [], 1
|
25
|
-
attr.ignore?(double email: "").
|
25
|
+
expect(attr.ignore?(double email: "")).to be true
|
26
26
|
end
|
27
27
|
|
28
28
|
it "yields records to a proc" do
|
29
29
|
attr = Attribute.new :email, "email", [], ->(r) { not r.email.include? "@" }
|
30
|
-
attr.ignore?(double email: "").
|
31
|
-
attr.ignore?(double email: "@").
|
30
|
+
expect(attr.ignore?(double email: "")).to be true
|
31
|
+
expect(attr.ignore?(double email: "@")).to be false
|
32
32
|
end
|
33
33
|
|
34
34
|
end
|
@@ -23,7 +23,7 @@ module Stockboy
|
|
23
23
|
it "remaps attributes" do
|
24
24
|
map = AttributeMap.new { name from: 'full_name' }
|
25
25
|
subject = CandidateRecord.new(hash_attrs, map).to_hash
|
26
|
-
subject.
|
26
|
+
expect(subject).to eq({ :name => 'Arthur Dent' })
|
27
27
|
end
|
28
28
|
|
29
29
|
it "converts String subclasses to clean strings" do
|
@@ -31,14 +31,14 @@ module Stockboy
|
|
31
31
|
map = AttributeMap.new { full_name }
|
32
32
|
hash_attrs['full_name'] = Nori::StringWithAttributes.new('Arthur')
|
33
33
|
subject = CandidateRecord.new(hash_attrs, map).to_hash
|
34
|
-
subject[:full_name].class.
|
34
|
+
expect(subject[:full_name].class).to eq String
|
35
35
|
end
|
36
36
|
|
37
37
|
it "omits ignored attributes" do
|
38
38
|
invalid_email = ->(r) { r.email.include?('example.com') }
|
39
39
|
map = AttributeMap.new { id ; email ignore: invalid_email }
|
40
40
|
subject = CandidateRecord.new(hash_attrs, map).to_hash
|
41
|
-
subject.
|
41
|
+
expect(subject).to eq({ :id => '1' })
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -46,13 +46,13 @@ module Stockboy
|
|
46
46
|
it "remaps attributes" do
|
47
47
|
map = AttributeMap.new { name from: 'full_name' }
|
48
48
|
subject = CandidateRecord.new(hash_attrs, map).raw_hash
|
49
|
-
subject.
|
49
|
+
expect(subject).to eq({ :name => 'Arthur Dent' })
|
50
50
|
end
|
51
51
|
|
52
52
|
it "does not translate attributes" do
|
53
53
|
map = AttributeMap.new { birthday as: ->(r) { Date.parse(r.birthday) } }
|
54
54
|
subject = CandidateRecord.new(hash_attrs, map).raw_hash
|
55
|
-
subject.
|
55
|
+
expect(subject).to eq({ :birthday => "1980-01-01" })
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -61,28 +61,28 @@ module Stockboy
|
|
61
61
|
|
62
62
|
context "from lambda" do
|
63
63
|
let(:map) { AttributeMap.new{ birthday as: ->(r){ Date.parse(r.birthday) } } }
|
64
|
-
it { should
|
64
|
+
it { should eq({birthday: Date.new(1980,1,1)}) }
|
65
65
|
end
|
66
66
|
|
67
67
|
context "from symbol lookup" do
|
68
68
|
before { Stockboy::Translations.register :date, ->(r){ Date.parse(r.birthday) } }
|
69
69
|
let(:map) { AttributeMap.new{ birthday :as => :date } }
|
70
|
-
it { should
|
70
|
+
it { should eq({birthday: Date.new(1980,1,1)}) }
|
71
71
|
end
|
72
72
|
|
73
73
|
context "chaining" do
|
74
74
|
let(:map) { AttributeMap.new{ id as: [->(r){r.id.next}, ->(r){r.id.next}] } }
|
75
|
-
it { should
|
75
|
+
it { should eq({id: '3'}) }
|
76
76
|
end
|
77
77
|
|
78
78
|
context "with exception" do
|
79
79
|
let(:map) { AttributeMap.new{ id as: [->(r){r.id.to_i}, ->(r){r.id / 0}] } }
|
80
|
-
it { should
|
80
|
+
it { should eq({id: nil}) }
|
81
81
|
end
|
82
82
|
|
83
83
|
context "dynamic without an input field" do
|
84
84
|
let(:map) { AttributeMap.new{ generated as: [->(r){ "from lambda" }] } }
|
85
|
-
it { should
|
85
|
+
it { should eq({generated: "from lambda"}) }
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -102,14 +102,14 @@ module Stockboy
|
|
102
102
|
it "fetches raw values for raw input keys" do
|
103
103
|
map = AttributeMap.new { name from: 'full_name' }
|
104
104
|
subject = CandidateRecord.new(hash_attrs, map)
|
105
|
-
subject.input['full_name'].
|
105
|
+
expect(subject.input['full_name']).to eq 'Arthur Dent'
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
109
|
it "accesses fields by mapped name before translation" do
|
110
110
|
map = AttributeMap.new { name from: 'full_name', as: ->(r){ r.name.upcase } }
|
111
111
|
subject = CandidateRecord.new(hash_attrs, map)
|
112
|
-
subject.input.name.
|
112
|
+
expect(subject.input.name).to eq 'Arthur Dent'
|
113
113
|
end
|
114
114
|
end
|
115
115
|
|
@@ -118,13 +118,13 @@ module Stockboy
|
|
118
118
|
it "fetches translated values for raw input keys" do
|
119
119
|
map = AttributeMap.new { name from: 'full_name' }
|
120
120
|
subject = CandidateRecord.new(hash_attrs, map)
|
121
|
-
subject.output.name.
|
121
|
+
expect(subject.output.name).to eq 'Arthur Dent'
|
122
122
|
end
|
123
123
|
|
124
124
|
it "returns translated values for ignored keys" do
|
125
125
|
map = AttributeMap.new { email ignore: ->(r){ r.email.include?("example.com") } }
|
126
126
|
subject = CandidateRecord.new(hash_attrs, map)
|
127
|
-
subject.output.email.
|
127
|
+
expect(subject.output.email).to eq "adent@example.com"
|
128
128
|
end
|
129
129
|
end
|
130
130
|
end
|
@@ -137,7 +137,7 @@ module Stockboy
|
|
137
137
|
it "returns first matched filter key" do
|
138
138
|
key = subject.partition(zeta: proc{ |raw| raw.name =~ /Z/ },
|
139
139
|
alpha: proc{ |raw| raw.name =~ /A/ })
|
140
|
-
key.
|
140
|
+
expect(key).to eq :alpha
|
141
141
|
end
|
142
142
|
|
143
143
|
it "returns a match for translated block argument" do
|
@@ -145,17 +145,17 @@ module Stockboy
|
|
145
145
|
subject = CandidateRecord.new({'name' =>'Arthur'}, map)
|
146
146
|
|
147
147
|
key = subject.partition(down: proc{ |raw,out| out.name[0] == "a" })
|
148
|
-
key.
|
148
|
+
expect(key).to eq :down
|
149
149
|
end
|
150
150
|
|
151
151
|
it "returns nil when raw field is unmatched" do
|
152
152
|
key = subject.partition({beta: proc{ |raw| raw.name =~ /B/ }})
|
153
|
-
key.
|
153
|
+
expect(key).to be nil
|
154
154
|
end
|
155
155
|
|
156
156
|
it "returns nil when translated field is unmatched" do
|
157
157
|
key = subject.partition({beta: proc{ |raw,out| out.name =~ /B/ }})
|
158
|
-
key.
|
158
|
+
expect(key).to be nil
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
@@ -8,20 +8,20 @@ module Stockboy
|
|
8
8
|
|
9
9
|
it "yields a config block" do
|
10
10
|
Stockboy::Configuration.new do |c|
|
11
|
-
c.
|
11
|
+
expect(c).to be_a Stockboy::Configuration
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
it "is accessible from top namespace" do
|
16
|
-
Stockboy.configuration.
|
16
|
+
expect(Stockboy.configuration).to be_a Stockboy::Configuration
|
17
17
|
end
|
18
18
|
|
19
19
|
specify "#template_load_paths" do
|
20
20
|
config.template_load_paths.clear
|
21
21
|
config.template_load_paths << "/some_path"
|
22
|
-
config.template_load_paths.
|
22
|
+
expect(config.template_load_paths).to eq ["/some_path"]
|
23
23
|
config.template_load_paths = ["/other_path"]
|
24
|
-
config.template_load_paths.
|
24
|
+
expect(config.template_load_paths).to eq ["/other_path"]
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
@@ -28,12 +28,12 @@ module Stockboy
|
|
28
28
|
|
29
29
|
it "registers with a symbol" do
|
30
30
|
subject.provider :ftp
|
31
|
-
subject.config[:provider].
|
31
|
+
expect(subject.config[:provider]).to be_a(provider_class)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "registers with a class" do
|
35
35
|
subject.provider provider_class
|
36
|
-
subject.config[:provider].
|
36
|
+
expect(subject.config[:provider]).to be_a(provider_class)
|
37
37
|
end
|
38
38
|
|
39
39
|
it "initializes arguments" do
|
@@ -58,19 +58,19 @@ module Stockboy
|
|
58
58
|
|
59
59
|
it "registers with a symbol" do
|
60
60
|
subject.reader :csv
|
61
|
-
subject.config[:reader].
|
61
|
+
expect(subject.config[:reader]).to be_a(reader_class)
|
62
62
|
end
|
63
63
|
|
64
64
|
it "registers with a class" do
|
65
65
|
subject.reader reader_class
|
66
|
-
subject.config[:reader].
|
66
|
+
expect(subject.config[:reader]).to be_a(reader_class)
|
67
67
|
end
|
68
68
|
|
69
69
|
it "initializes arguments" do
|
70
70
|
reader_stub = double(:reader)
|
71
71
|
expect(reader_class).to receive(:new).with(col_sep: '|').and_return(reader_stub)
|
72
72
|
subject.reader reader_class, col_sep: '|'
|
73
|
-
subject.config[:reader].
|
73
|
+
expect(subject.config[:reader]).to eq reader_stub
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -79,28 +79,28 @@ module Stockboy
|
|
79
79
|
attribute_map = double
|
80
80
|
expect(AttributeMap).to receive(:new).and_return(attribute_map)
|
81
81
|
subject.attributes &proc{}
|
82
|
-
subject.config[:attributes].
|
82
|
+
expect(subject.config[:attributes]).to be attribute_map
|
83
83
|
end
|
84
84
|
|
85
85
|
it "replaces existing attributes" do
|
86
86
|
subject.attribute :first_name
|
87
87
|
subject.attributes do last_name end
|
88
|
-
subject.config[:attributes][:first_name].
|
89
|
-
subject.config[:attributes][:last_name].
|
88
|
+
expect(subject.config[:attributes][:first_name]).to be nil
|
89
|
+
expect(subject.config[:attributes][:last_name]).to be_an Attribute
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
93
|
describe "#attribute" do
|
94
94
|
it "inserts a single attribute" do
|
95
95
|
subject.attribute :test, from: "Test"
|
96
|
-
subject.config[:attributes][:test].
|
96
|
+
expect(subject.config[:attributes][:test]).to eq Attribute.new(:test, "Test", [])
|
97
97
|
end
|
98
98
|
|
99
99
|
it "respects existing attributes added first" do
|
100
100
|
subject.attributes do first_name end
|
101
101
|
subject.attribute :last_name
|
102
|
-
subject.config[:attributes][:first_name].
|
103
|
-
subject.config[:attributes][:last_name].
|
102
|
+
expect(subject.config[:attributes][:first_name]).to be_an Attribute
|
103
|
+
expect(subject.config[:attributes][:last_name]).to be_an Attribute
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -114,7 +114,7 @@ module Stockboy
|
|
114
114
|
job.process
|
115
115
|
end
|
116
116
|
|
117
|
-
subject.config[:triggers][:reprocess][0].
|
117
|
+
expect(subject.config[:triggers][:reprocess][0]).to be_a Proc
|
118
118
|
end
|
119
119
|
|
120
120
|
end
|
@@ -123,14 +123,14 @@ module Stockboy
|
|
123
123
|
it "initializes a callable" do
|
124
124
|
filter_stub = double(call: true)
|
125
125
|
subject.filter :pass, filter_stub
|
126
|
-
subject.config[:filters][:pass].
|
126
|
+
expect(subject.config[:filters][:pass]).to eq filter_stub
|
127
127
|
end
|
128
128
|
|
129
129
|
it "initializes a block" do
|
130
130
|
subject.filter :pass do |r|
|
131
131
|
true if r == 42
|
132
132
|
end
|
133
|
-
subject.config[:filters][:pass].call(42).
|
133
|
+
expect(subject.config[:filters][:pass].call(42)).to eq true
|
134
134
|
end
|
135
135
|
|
136
136
|
context "with a class" do
|
@@ -144,22 +144,22 @@ module Stockboy
|
|
144
144
|
|
145
145
|
it "passes arguments to a registered class symbol" do
|
146
146
|
subject.filter :pass, :test, 42
|
147
|
-
subject.config[:filters][:pass].args.
|
147
|
+
expect(subject.config[:filters][:pass].args).to eq [42]
|
148
148
|
end
|
149
149
|
|
150
150
|
it "passes a block to a registered class symbol" do
|
151
151
|
subject.filter :pass, :test do 42 end
|
152
|
-
subject.config[:filters][:pass].block[].
|
152
|
+
expect(subject.config[:filters][:pass].block[]).to eq 42
|
153
153
|
end
|
154
154
|
|
155
155
|
it "passes arguments to a given class" do
|
156
156
|
subject.filter :pass, TestFilter, 42
|
157
|
-
subject.config[:filters][:pass].args.
|
157
|
+
expect(subject.config[:filters][:pass].args).to eq [42]
|
158
158
|
end
|
159
159
|
|
160
160
|
it "uses an instance directly" do
|
161
161
|
subject.filter :pass, TestFilter.new(42)
|
162
|
-
subject.config[:filters][:pass].args.
|
162
|
+
expect(subject.config[:filters][:pass].args).to eq [42]
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -176,10 +176,10 @@ module Stockboy
|
|
176
176
|
|
177
177
|
it "returns a Job instance" do
|
178
178
|
job = subject.to_job
|
179
|
-
job.
|
180
|
-
job.provider.
|
181
|
-
job.reader.
|
182
|
-
job.attributes.
|
179
|
+
expect(job).to be_a(Job)
|
180
|
+
expect(job.provider).to be_a(provider_class)
|
181
|
+
expect(job.reader).to be_a(reader_class)
|
182
|
+
expect(job.attributes).to be_a(AttributeMap)
|
183
183
|
end
|
184
184
|
|
185
185
|
context "with a repeat block" do
|
@@ -189,8 +189,8 @@ module Stockboy
|
|
189
189
|
|
190
190
|
it "adds a repeater to the provider" do
|
191
191
|
job = subject.to_job
|
192
|
-
job.provider.
|
193
|
-
job.provider.base_provider.
|
192
|
+
expect(job.provider).to be_a ProviderRepeater
|
193
|
+
expect(job.provider.base_provider).to be_a provider_class
|
194
194
|
end
|
195
195
|
end
|
196
196
|
end
|