topographer 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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