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.
@@ -10,4 +10,12 @@ class Topographer::Importer::Input::Base
10
10
  def each
11
11
  raise NotImplementedError
12
12
  end
13
+
14
+ def importable?
15
+ true
16
+ end
17
+
18
+ def failure_message
19
+ ''
20
+ end
13
21
  end
@@ -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 valid_header
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
- log_invalid_header(input, mapper)
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 log_invalid_header(input, mapper)
49
- @logger.log_fatal input.input_identifier,
50
- invalid_header_message(mapper)
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
@@ -1,3 +1,3 @@
1
1
  module Topographer
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -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(:bad_input) do
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(bad_input, model_class, strategy_class, simple_logger)
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: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 6
10
- version: 0.0.6
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-21 00:00:00 Z
19
+ date: 2014-07-22 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: thor