topographer 0.0.6 → 0.0.7
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.
data/lib/topographer/importer.rb
CHANGED
@@ -6,7 +6,7 @@ class Topographer::Importer
|
|
6
6
|
require_relative 'importer/input'
|
7
7
|
require_relative 'importer/helpers'
|
8
8
|
|
9
|
-
attr_reader :logger
|
9
|
+
attr_reader :logger, :fatal_errors
|
10
10
|
|
11
11
|
def self.build_mapper(model_class, &mapper_definition)
|
12
12
|
Mapper.build_mapper(model_class, &mapper_definition)
|
@@ -19,22 +19,23 @@ class Topographer::Importer
|
|
19
19
|
|
20
20
|
def initialize(input, import_class, strategy_class, logger, options = {})
|
21
21
|
@logger = logger
|
22
|
+
@fatal_errors = []
|
22
23
|
|
23
24
|
dry_run = options.fetch(:dry_run, false)
|
24
25
|
ignore_unmapped_columns = options.fetch(:ignore_unmapped_columns, false)
|
25
26
|
|
26
27
|
mapper = import_class.get_mapper(strategy_class)
|
27
|
-
valid_header = mapper.input_structure_valid?(input.get_header, ignore_unmapped_columns: ignore_unmapped_columns)
|
28
28
|
|
29
|
-
if
|
29
|
+
if importable?(input, mapper, ignore_unmapped_columns)
|
30
30
|
strategy = strategy_class.new(mapper)
|
31
31
|
strategy.dry_run = dry_run
|
32
32
|
import_data(strategy, input, mapper.model_class.name)
|
33
33
|
else
|
34
|
-
|
34
|
+
log_fatal_errors(input)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
+
|
38
39
|
def import_data(strategy, input, import_class)
|
39
40
|
input.each do |data|
|
40
41
|
status = strategy.import_record(data)
|
@@ -45,9 +46,10 @@ class Topographer::Importer
|
|
45
46
|
|
46
47
|
private
|
47
48
|
|
48
|
-
def
|
49
|
-
|
50
|
-
|
49
|
+
def log_fatal_errors(input)
|
50
|
+
fatal_errors.each do |fatal_error_message|
|
51
|
+
@logger.log_fatal input.input_identifier, fatal_error_message
|
52
|
+
end
|
51
53
|
end
|
52
54
|
|
53
55
|
def invalid_header_message(mapper)
|
@@ -57,4 +59,22 @@ class Topographer::Importer
|
|
57
59
|
mapper.bad_columns.join(', ')
|
58
60
|
end
|
59
61
|
|
62
|
+
def importable?(input, mapper, ignore_unmapped_columns)
|
63
|
+
valid_header?(input, mapper, ignore_unmapped_columns) && input_ready?(input)
|
64
|
+
end
|
65
|
+
|
66
|
+
def input_ready?(input)
|
67
|
+
fatal_errors << input.failure_message unless input.importable?
|
68
|
+
|
69
|
+
input.importable?
|
70
|
+
end
|
71
|
+
|
72
|
+
def valid_header?(input, mapper, ignore_unmapped_columns)
|
73
|
+
valid = mapper.input_structure_valid?(input.get_header, ignore_unmapped_columns: ignore_unmapped_columns)
|
74
|
+
|
75
|
+
fatal_errors << invalid_header_message(mapper) unless valid
|
76
|
+
|
77
|
+
valid
|
78
|
+
end
|
79
|
+
|
60
80
|
end
|
data/lib/topographer/version.rb
CHANGED
@@ -29,7 +29,6 @@ class MockImportable < OpenStruct
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
33
32
|
end
|
34
33
|
|
35
34
|
class HashImportStrategy < Topographer::Importer::Strategy::Base
|
@@ -70,6 +69,10 @@ class MockInput
|
|
70
69
|
'test'
|
71
70
|
end
|
72
71
|
|
72
|
+
def importable?
|
73
|
+
true
|
74
|
+
end
|
75
|
+
|
73
76
|
def each
|
74
77
|
yield Topographer::Importer::Input::SourceData.new('1', {'Field1' => 'datum1', 'Field2' => 'datum2'})
|
75
78
|
yield Topographer::Importer::Input::SourceData.new('2', {'Field1' => 'datum2', 'Field2' => 'datum2', 'Field3' => 'datum3'})
|
@@ -82,10 +85,11 @@ describe Topographer::Importer do
|
|
82
85
|
let(:input) { MockInput.new }
|
83
86
|
let(:model_class) { MockImportable }
|
84
87
|
let(:strategy_class) { HashImportStrategy }
|
85
|
-
let(:
|
88
|
+
let(:bad_header_input) do
|
86
89
|
double 'Input',
|
87
90
|
get_header: ['BadCol1', 'BadCol2', 'Field1', 'Field3'],
|
88
|
-
input_identifier: 'Test'
|
91
|
+
input_identifier: 'Test',
|
92
|
+
importable?: true
|
89
93
|
end
|
90
94
|
let(:simple_logger) { Topographer::Importer::Logger::Simple.new }
|
91
95
|
let(:import_log) { Topographer::Importer.import_data(input, model_class, strategy_class, simple_logger) }
|
@@ -109,7 +113,7 @@ describe Topographer::Importer do
|
|
109
113
|
end
|
110
114
|
|
111
115
|
it 'does not import data with an invalid header' do
|
112
|
-
import_log = Topographer::Importer.import_data(
|
116
|
+
import_log = Topographer::Importer.import_data(bad_header_input, model_class, strategy_class, simple_logger)
|
113
117
|
expect(import_log.errors?).to be_true
|
114
118
|
expect(import_log.fatal_error?).to be_true
|
115
119
|
expect(import_log.fatal_errors.first.message).
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: topographer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 7
|
10
|
+
version: 0.0.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Mike Simpson
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2014-07-
|
19
|
+
date: 2014-07-22 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: thor
|