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
@@ -8,21 +8,21 @@ module Stockboy
|
|
8
8
|
|
9
9
|
describe ".register" do
|
10
10
|
it "registers a key and class" do
|
11
|
-
Providers.register(:snailmail, provider).
|
11
|
+
expect(Providers.register(:snailmail, provider)).to be provider
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
describe ".find" do
|
16
16
|
it "returns a provider class" do
|
17
17
|
Providers.register(:snailmail, provider)
|
18
|
-
Providers.find(:snailmail).
|
18
|
+
expect(Providers.find(:snailmail)).to be provider
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
describe ".[]" do
|
23
23
|
it "returns a provider class" do
|
24
24
|
Providers.register(:snailmail, provider)
|
25
|
-
Providers[:snailmail].
|
25
|
+
expect(Providers[:snailmail]).to be provider
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -30,7 +30,7 @@ module Stockboy
|
|
30
30
|
it "returns all registered providers" do
|
31
31
|
Providers.register(:snailmail, provider)
|
32
32
|
Providers.register(:slugmail, provider)
|
33
|
-
Providers.all.
|
33
|
+
expect(Providers.all).to include(snailmail: provider, slugmail: provider)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'stockboy/readers/csv'
|
3
5
|
|
@@ -18,7 +20,7 @@ module Stockboy
|
|
18
20
|
describe "initialize" do
|
19
21
|
it "configures options with argument hash" do
|
20
22
|
reader = Readers::CSV.new(col_sep: '|')
|
21
|
-
reader.col_sep.
|
23
|
+
expect(reader.col_sep).to eq '|'
|
22
24
|
end
|
23
25
|
|
24
26
|
it "configures options with a block" do
|
@@ -29,9 +31,9 @@ module Stockboy
|
|
29
31
|
skip_footer_rows 1
|
30
32
|
end
|
31
33
|
|
32
|
-
reader.col_sep.
|
33
|
-
reader.skip_header_rows.
|
34
|
-
reader.skip_footer_rows.
|
34
|
+
expect(reader.col_sep).to eq '|'
|
35
|
+
expect(reader.skip_header_rows).to eq 2
|
36
|
+
expect(reader.skip_footer_rows).to eq 1
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
@@ -39,7 +41,7 @@ module Stockboy
|
|
39
41
|
it "returns an array of records" do
|
40
42
|
records = reader.parse "id,name\n42,Arthur Dent"
|
41
43
|
|
42
|
-
records[0].
|
44
|
+
expect(records[0]).to eq({"id" => "42", "name" => "Arthur Dent"})
|
43
45
|
end
|
44
46
|
|
45
47
|
it "strips null bytes from empty fields (MSSQL BCP exports)" do
|
@@ -47,8 +49,9 @@ module Stockboy
|
|
47
49
|
reader.headers = %w[city state country]
|
48
50
|
records = reader.parse "Vancouver|\x00|Canada"
|
49
51
|
|
50
|
-
records.
|
52
|
+
expect(records).to eq(
|
51
53
|
[{"city" => "Vancouver", "state" => nil, "country" => "Canada"}]
|
54
|
+
)
|
52
55
|
end
|
53
56
|
|
54
57
|
it "scrubs invalid encoding characters in Unicode" do
|
@@ -56,8 +59,9 @@ module Stockboy
|
|
56
59
|
reader.encoding = 'UTF-8'
|
57
60
|
garbage = 191.chr.force_encoding('UTF-8')
|
58
61
|
data = "Z#{garbage}rich,Genève"
|
59
|
-
reader.parse(data).
|
62
|
+
expect(reader.parse(data)).to eq(
|
60
63
|
[{"depart" => "Z\u{FFFD}rich", "arrive" => "Genève"}]
|
64
|
+
)
|
61
65
|
end
|
62
66
|
|
63
67
|
it "strips preamble header rows" do
|
@@ -65,12 +69,12 @@ module Stockboy
|
|
65
69
|
data = "IGNORE\r\nCOMMENTS\r\nid,name\r\n42,Arthur Dent"
|
66
70
|
records = reader.parse data
|
67
71
|
|
68
|
-
records[0].
|
72
|
+
expect(records[0]).to eq({"id" => "42", "name" => "Arthur Dent"})
|
69
73
|
end
|
70
74
|
|
71
75
|
it "shares hash key instances between records" do
|
72
76
|
records = reader.parse "id,name\n42,Arthur Dent\n999,Zaphod"
|
73
|
-
records[0].keys[0].
|
77
|
+
expect(records[0].keys[0]).to be records[1].keys[0]
|
74
78
|
end
|
75
79
|
end
|
76
80
|
end
|
@@ -13,7 +13,7 @@ module Stockboy
|
|
13
13
|
|
14
14
|
it "parses based on column widths" do
|
15
15
|
reader = described_class.new(headers: [10, 10, 4, 2, 10])
|
16
|
-
reader.parse(data).
|
16
|
+
expect(reader.parse(data)).to eq [
|
17
17
|
{0 => "Arthur", 1 => "Dent", 2 => "42", 3 => "M", 4 => "Human"},
|
18
18
|
{0 => "Ford", 1 => "Prefect", 2 => "44", 3 => "M", 4 => "Betelgeuse"}
|
19
19
|
]
|
@@ -21,7 +21,7 @@ module Stockboy
|
|
21
21
|
|
22
22
|
it "parses based on a hash" do
|
23
23
|
reader = described_class.new(headers: headers_hash)
|
24
|
-
reader.parse(data).
|
24
|
+
expect(reader.parse(data)).to eq [
|
25
25
|
{first: "Arthur", last: "Dent", age: "42", sex: "M", planet: "Human"},
|
26
26
|
{first: "Ford", last: "Prefect", age: "44", sex: "M", planet: "Betelgeuse"}
|
27
27
|
]
|
@@ -30,22 +30,22 @@ module Stockboy
|
|
30
30
|
it "skips blank rows" do
|
31
31
|
reader = described_class.new(headers: headers_hash)
|
32
32
|
records = reader.parse(blank_row + data + blank_row)
|
33
|
-
records.first[:age].
|
34
|
-
records.last[:age].
|
33
|
+
expect(records.first[:age]).to eq '42'
|
34
|
+
expect(records.last[:age]).to eq '44'
|
35
35
|
end
|
36
36
|
|
37
37
|
it "skips number of specified header rows" do
|
38
38
|
reader = described_class.new(headers: headers_hash)
|
39
39
|
reader.skip_header_rows = 1
|
40
40
|
records = reader.parse("REPORT\r\n" + data)
|
41
|
-
records.first[:age].
|
41
|
+
expect(records.first[:age]).to eq '42'
|
42
42
|
end
|
43
43
|
|
44
44
|
it "skips number of specified footer rows" do
|
45
45
|
reader = described_class.new(headers: headers_hash)
|
46
46
|
reader.skip_footer_rows = 2
|
47
47
|
records = reader.parse(data + "SUBTOTAL\r\nTOTAL\r\n")
|
48
|
-
records.last[:age].
|
48
|
+
expect(records.last[:age]).to eq '44'
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
@@ -10,7 +10,7 @@ module Stockboy
|
|
10
10
|
it "returns an array of records" do
|
11
11
|
records = reader.parse '{"id": "42", "name": "Arthur Dent"}'
|
12
12
|
|
13
|
-
records.
|
13
|
+
expect(records).to eq({"id" => "42", "name" => "Arthur Dent"})
|
14
14
|
end
|
15
15
|
|
16
16
|
end
|
@@ -21,10 +21,10 @@ module Stockboy
|
|
21
21
|
headers: %w(X Y Z)
|
22
22
|
)
|
23
23
|
|
24
|
-
reader.format.
|
25
|
-
reader.sheet.
|
26
|
-
reader.header_row.
|
27
|
-
reader.headers.
|
24
|
+
expect(reader.format).to eq :xlsx
|
25
|
+
expect(reader.sheet).to eq 'Sheet 42'
|
26
|
+
expect(reader.header_row).to eq 5
|
27
|
+
expect(reader.headers).to eq %w(X Y Z)
|
28
28
|
end
|
29
29
|
|
30
30
|
it "configures with a block" do
|
@@ -35,10 +35,10 @@ module Stockboy
|
|
35
35
|
headers %w(X Y Z)
|
36
36
|
end
|
37
37
|
|
38
|
-
reader.format.
|
39
|
-
reader.sheet.
|
40
|
-
reader.header_row.
|
41
|
-
reader.headers.
|
38
|
+
expect(reader.format).to eq :xlsx
|
39
|
+
expect(reader.sheet).to eq 'Sheet 42'
|
40
|
+
expect(reader.header_row).to eq 5
|
41
|
+
expect(reader.headers).to eq %w(X Y Z)
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -52,8 +52,8 @@ module Stockboy
|
|
52
52
|
reader = described_class.new(format: :xls)
|
53
53
|
data = reader.parse(content)
|
54
54
|
|
55
|
-
data.
|
56
|
-
data.each { |i| i.
|
55
|
+
expect(data).not_to be_empty
|
56
|
+
data.each { |i| expect(i).to be_a Hash }
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -64,30 +64,30 @@ module Stockboy
|
|
64
64
|
reader = described_class.new(format: :xls, first_row: 6)
|
65
65
|
data = reader.parse(content)
|
66
66
|
|
67
|
-
data.first.values.
|
67
|
+
expect(data.first.values).to eq ["Arthur Dent", 42]
|
68
68
|
end
|
69
69
|
|
70
70
|
it "ends on the given last row counting backwards" do
|
71
71
|
reader = described_class.new(format: :xls, last_row: -3)
|
72
72
|
data = reader.parse(content)
|
73
73
|
|
74
|
-
data.last.values.
|
74
|
+
expect(data.last.values).to eq ["Marvin", 9999999]
|
75
75
|
end
|
76
76
|
|
77
77
|
it "ends on the given last row counting upwards" do
|
78
78
|
reader = described_class.new(format: :xls, last_row: 9)
|
79
79
|
data = reader.parse(content)
|
80
80
|
|
81
|
-
data.last.values.
|
81
|
+
expect(data.last.values).to eq ["Ford", 40]
|
82
82
|
end
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
-
describe "#sheet",
|
86
|
+
describe "#sheet", skip: "Hard to test this due to roo. Needs a test case with fixtures" do
|
87
87
|
let(:sheets) { ['Towels', 'Lemons'] }
|
88
88
|
let(:be_selected) { receive(:default_sheet=) }
|
89
89
|
let(:spreadsheet) { double(:spreadsheet, sheets: sheets) }
|
90
|
-
before { subject.
|
90
|
+
before { allow(subject).to receive(:with_spreadsheet).and_yield(spreadsheet) }
|
91
91
|
|
92
92
|
context "with :first" do
|
93
93
|
before { expect(spreadsheet).to be_selected.with('Towels') }
|
@@ -15,11 +15,11 @@ module Stockboy
|
|
15
15
|
elements: ['SomeNested', 'Record']
|
16
16
|
)
|
17
17
|
|
18
|
-
reader.options[:strip_namespaces].
|
19
|
-
reader.options[:advanced_typecasting].
|
20
|
-
reader.options[:convert_tags_to].
|
21
|
-
reader.options[:parser].
|
22
|
-
reader.elements.
|
18
|
+
expect(reader.options[:strip_namespaces]).to be true
|
19
|
+
expect(reader.options[:advanced_typecasting]).to be true
|
20
|
+
expect(reader.options[:convert_tags_to]).to be_a Proc
|
21
|
+
expect(reader.options[:parser]).to eq :nokogiri
|
22
|
+
expect(reader.elements).to eq ['some_nested', 'record']
|
23
23
|
end
|
24
24
|
|
25
25
|
it "configures with a block" do
|
@@ -32,11 +32,11 @@ module Stockboy
|
|
32
32
|
elements ['SomeNested', 'Record']
|
33
33
|
end
|
34
34
|
|
35
|
-
reader.options[:strip_namespaces].
|
36
|
-
reader.options[:advanced_typecasting].
|
37
|
-
reader.options[:convert_tags_to].
|
38
|
-
reader.options[:parser].
|
39
|
-
reader.elements.
|
35
|
+
expect(reader.options[:strip_namespaces]).to be true
|
36
|
+
expect(reader.options[:advanced_typecasting]).to be true
|
37
|
+
expect(reader.options[:convert_tags_to]).to be_a Proc
|
38
|
+
expect(reader.options[:parser]).to eq :nokogiri
|
39
|
+
expect(reader.elements).to eq ['some_nested', 'record']
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -52,7 +52,7 @@ module Stockboy
|
|
52
52
|
it "returns element hashes" do
|
53
53
|
items = reader.parse data
|
54
54
|
output_keys.each do |k|
|
55
|
-
items[0].keys.
|
55
|
+
expect(items[0].keys).to include k
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -60,7 +60,7 @@ module Stockboy
|
|
60
60
|
items = reader.parse data
|
61
61
|
output_keys.each do |key|
|
62
62
|
i = items[0].keys.index(key)
|
63
|
-
items[0].keys[i].
|
63
|
+
expect(items[0].keys[i]).to be items[1].keys[i]
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
@@ -8,21 +8,21 @@ module Stockboy
|
|
8
8
|
|
9
9
|
describe ".register" do
|
10
10
|
it "registers a key for a reader class" do
|
11
|
-
Readers.register(:markup, reader_class).
|
11
|
+
expect(Readers.register(:markup, reader_class)).to be reader_class
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
describe ".find" do
|
16
16
|
it "returns a reader class" do
|
17
17
|
Readers.register(:markup, reader_class)
|
18
|
-
Readers.find(:markup).
|
18
|
+
expect(Readers.find(:markup)).to be reader_class
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
describe ".[]" do
|
23
23
|
it "returns a reader class" do
|
24
24
|
Readers.register(:markup, reader_class)
|
25
|
-
Readers[:markup].
|
25
|
+
expect(Readers[:markup]).to be reader_class
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -9,11 +9,11 @@ module Stockboy
|
|
9
9
|
end
|
10
10
|
|
11
11
|
it "accesses initialized fields from hash" do
|
12
|
-
record.full_name.
|
12
|
+
expect(record.full_name).to eq 'Arthur Dent'
|
13
13
|
end
|
14
14
|
|
15
15
|
it "accesses source field names" do
|
16
|
-
record[3].
|
16
|
+
expect(record[3]).to eq 'Arthur Dent'
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -12,17 +12,17 @@ module Stockboy
|
|
12
12
|
|
13
13
|
describe ".read" do
|
14
14
|
it "returns the template string" do
|
15
|
-
TemplateFile.read("test_job").
|
15
|
+
expect(TemplateFile.read("test_job")).to match "# file exists!"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
describe ".template_path" do
|
20
20
|
it "returns nil when missing" do
|
21
|
-
TemplateFile.find("not_here").
|
21
|
+
expect(TemplateFile.find("not_here")).to be nil
|
22
22
|
end
|
23
23
|
|
24
24
|
it "returns a file path when found" do
|
25
|
-
TemplateFile.find("test_job").
|
25
|
+
expect(TemplateFile.find("test_job")).to eq "#{template_path}/test_job.rb"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -10,27 +10,27 @@ module Stockboy
|
|
10
10
|
describe "#call" do
|
11
11
|
it "returns nil for an empty string" do
|
12
12
|
result = subject.call start: ""
|
13
|
-
result.
|
13
|
+
expect(result).to be nil
|
14
14
|
end
|
15
15
|
|
16
16
|
it "returns a date unmodified" do
|
17
17
|
result = subject.call start: ::Date.new(2012,12,21)
|
18
|
-
result.
|
18
|
+
expect(result).to eq ::Date.new(2012,12,21)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "returns a date from a string" do
|
22
22
|
result = subject.call start: '2013-12-11'
|
23
|
-
result.
|
23
|
+
expect(result).to eq ::Date.new(2013,12,11)
|
24
24
|
end
|
25
25
|
|
26
26
|
it "returns a date from a time" do
|
27
27
|
result = subject.call start: ::Time.new(2012,12,21,12,21,12)
|
28
|
-
result.
|
28
|
+
expect(result).to eq ::Date.new(2012,12,21)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "returns a date from a DateTime" do
|
32
32
|
result = subject.call start: ::DateTime.new(2012,12,21,12,21,12)
|
33
|
-
result.
|
33
|
+
expect(result).to eq ::Date.new(2012,12,21)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -9,13 +9,13 @@ module Stockboy
|
|
9
9
|
describe "#call" do
|
10
10
|
it "returns nil for an empty string" do
|
11
11
|
result = subject.call total: ""
|
12
|
-
result.
|
12
|
+
expect(result).to be nil
|
13
13
|
end
|
14
14
|
|
15
15
|
it "returns a decimal" do
|
16
16
|
result = subject.call total: "42.42"
|
17
|
-
result.
|
18
|
-
result.
|
17
|
+
expect(result).to eq 42.42
|
18
|
+
expect(result).to be_a BigDecimal
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -9,22 +9,22 @@ module Stockboy
|
|
9
9
|
describe "#call" do
|
10
10
|
it "returns empty string for nil" do
|
11
11
|
result = subject.call comment: nil
|
12
|
-
result.
|
12
|
+
expect(result).to eq ""
|
13
13
|
end
|
14
14
|
|
15
15
|
it "returns empty string for an empty string" do
|
16
16
|
result = subject.call comment: ""
|
17
|
-
result.
|
17
|
+
expect(result).to eq ""
|
18
18
|
end
|
19
19
|
|
20
20
|
it "returns original value if present" do
|
21
21
|
result = subject.call comment: "asdf"
|
22
|
-
result.
|
22
|
+
expect(result).to eq "asdf"
|
23
23
|
end
|
24
24
|
|
25
25
|
it "returns original value when zero" do
|
26
26
|
result = subject.call comment: 0
|
27
|
-
result.
|
27
|
+
expect(result).to eq 0
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -9,22 +9,22 @@ module Stockboy
|
|
9
9
|
describe "#call" do
|
10
10
|
it "returns nil for empty string" do
|
11
11
|
result = subject.call email: ""
|
12
|
-
result.
|
12
|
+
expect(result).to eq nil
|
13
13
|
end
|
14
14
|
|
15
15
|
it "returns nil for nil" do
|
16
16
|
result = subject.call email: nil
|
17
|
-
result.
|
17
|
+
expect(result).to eq nil
|
18
18
|
end
|
19
19
|
|
20
20
|
it "returns original value if present" do
|
21
21
|
result = subject.call email: "a@example.com"
|
22
|
-
result.
|
22
|
+
expect(result).to eq "a@example.com"
|
23
23
|
end
|
24
24
|
|
25
25
|
it "returns original value when zero" do
|
26
26
|
result = subject.call email: 0
|
27
|
-
result.
|
27
|
+
expect(result).to eq 0
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|