deltaconveyor 0.1.0 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4cec384a6d6beb17140bbf639626d1c9af0e0c4
4
- data.tar.gz: d10128dba99d415c9ba0c7ba39ac0f5015aee446
3
+ metadata.gz: 6b6a21e28386560cc9f41bf2b56e67e850b8a028
4
+ data.tar.gz: 90ff8165dc997c5226cf3572db6b448983725d4c
5
5
  SHA512:
6
- metadata.gz: 1f8591eea8de3441d27d27da237961692ec07436e8a54ff6352722f50fdb09f94a3037b4df3a11bca2dad674355ebe6c4e8c17f9dbe02650750fc0852a417fce
7
- data.tar.gz: 94073eedc038e499dc6813284dd066911ec70761917aa653c6b5113490864f08e8faa63f50cb57f74048d21481973d0edee3d0fee35b9bc1cbcc31ad7aea2e1e
6
+ metadata.gz: 43ae49ae35561b099105b638332c6732ae9537ae2450025242929112a919ccd18401ebbe6f36038840d09da010bd9974bee6bafd7f25d382168b504754d442e7
7
+ data.tar.gz: 802b72c51ddb79545dcfc1dabfd6890b4aedb2613717c1421450391029186f9065ad17bb889373da22915d7d1424fa459910f0cf4de91bccfe2942396a5c765d
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --format documentation
2
2
  --color
3
+ -r rspec-power_assert
@@ -24,4 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "bundler", "~> 1.15"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
26
26
  spec.add_development_dependency "rspec", "~> 3.0"
27
+ spec.add_development_dependency "rspec-power_assert"
28
+ spec.add_development_dependency "pry"
29
+ spec.add_development_dependency "pry-byebug"
27
30
  end
@@ -1,25 +1,31 @@
1
1
  require "deltaconveyor/version"
2
2
  require "deltaconveyor/row"
3
- require "deltaconveyor/config"
3
+ require "deltaconveyor/option"
4
4
  require "deltaconveyor/container"
5
5
 
6
6
  module Deltaconveyor
7
- def self.import(data, container, force_remove: false)
7
+ class InvalidRowError < StandardError; end
8
+ class RemovingOriginalError < StandardError; end
9
+ def self.import(data, option, container, force_remove: false)
8
10
  originals = container.originals
9
- config = container.config
10
11
 
11
- rows = data.map { |d| config.row_class.from_json(d, container) }
12
+ passes_container = option.row_class.method(:from_json).parameters.size == 2
13
+ rows = data.map do |d|
14
+ passes_container ? option.row_class.from_json(d, container) : option.row_class.from_json(d)
15
+ end
16
+
12
17
  invalids = rows.reject(&:valid?)
13
18
  if invalids.size > 0
14
- config.error_logger 'Error: Some data has errors.'
19
+ option.logger.error 'Error: Some data has errors.'
15
20
  invalids.each do |invalid|
16
- config.error_logger invalid.errors.messages.to_s
21
+ option.logger.error invalid.errors.messages.to_s
17
22
  end
18
- raise 'Not Imported.'
23
+ raise InvalidRowError, 'Not Imported.'
19
24
  end
20
25
 
21
- original_hash = originals.index_by { |d| config.original_key(d) }
22
- new_hash = rows.index_by(&:key)
26
+ option_keys = Array(option.key)
27
+ original_hash = index_by_keys(originals, option_keys)
28
+ new_hash = index_by_keys(rows, option_keys)
23
29
 
24
30
  original_keys = original_hash.keys
25
31
  new_keys = new_hash.keys
@@ -29,38 +35,92 @@ module Deltaconveyor
29
35
  adding_keys = new_keys - intersection_keys
30
36
 
31
37
  if remove_keys.size > 0 && !force_remove
32
- config.error_logger 'Error: Some data is facing to remove but `force_remove` flag is false'
33
- config.error_logger 'so import is stopped.'
34
- config.error_logger 'Removing keys:'
35
- config.error_logger remove_keys
36
- raise 'Not Imported.'
38
+ option.logger.error 'Error: Some data is facing to remove but `force_remove` flag is false'
39
+ option.logger.error 'so import is stopped.'
40
+ option.logger.error 'Removing keys:'
41
+ option.logger.error remove_keys
42
+ raise RemovingOriginalError, 'Not Imported.'
43
+ end
44
+
45
+ remove_keys.each do |key|
46
+ original_data = original_hash[key]
47
+ raise 'Bug.' unless original_data
48
+ option.logger.info "Remove #{key}"
49
+ # TODO: rethink
50
+ original_data.destroy!
51
+ end
52
+ option.logger.info 'Removing Phase is finished.'
53
+
54
+ intersection_keys.each do |key|
55
+ original_data = original_hash[key]
56
+ new_data = new_hash[key]
57
+ raise 'Bug.' unless original_data && new_data
58
+
59
+ new_data.update!(original_data)
37
60
  end
61
+ option.logger.info 'Updating Phase is finished.'
62
+
63
+ adding_keys.each do |key|
64
+ new_data = new_hash[key]
65
+ raise 'Bug.' unless new_data
66
+
67
+ option.logger.info "Insert #{key}"
68
+ new_data.save!
69
+ end
70
+ option.logger.info 'Adding Phase is finished.'
71
+ nil
72
+ end
73
+
74
+ def self.index_by_keys(arr, keys)
75
+ hash = {}
76
+ arr.each do |elem|
77
+ pk = keys.map { |key| elem.send(key) }
78
+ unless hash[pk].nil?
79
+ option.logger.error "not unique key #{pk}"
80
+ raise 'Not Imported.'
81
+ end
82
+ hash[pk] = elem
83
+ end
84
+ hash
38
85
 
39
86
  remove_keys.each do |key|
40
87
  original_data = original_hash[key]
41
88
  raise 'Bug.' unless original_data
42
- config.info_logger "Remove #{key}"
89
+ option.logger.info "Remove #{key}"
43
90
  original_data.destroy!
44
91
  end
45
- config.info_logger 'Removing Phase is finished.'
92
+ option.logger.info 'Removing Phase is finished.'
46
93
 
47
94
  intersection_keys.each do |key|
48
95
  original_data = original_hash[key]
49
96
  new_data = new_hash[key]
50
97
  raise 'Bug.' unless original_data && new_data
51
98
 
52
- config.row_class.update!(original_data, new_data, container)
99
+ new_data.update!(original_data)
53
100
  end
54
- config.info_logger 'Updating Phase is finished.'
101
+ option.logger.info 'Updating Phase is finished.'
55
102
 
56
103
  adding_keys.each do |key|
57
104
  new_data = new_hash[key]
58
105
  raise 'Bug.' unless new_data
59
106
 
60
- config.info_logger "Insert #{key}"
61
- new_data.save!(container)
107
+ option.logger.info "Insert #{key}"
108
+ new_data.save!
62
109
  end
63
- config.info_logger 'Adding Phase is finished.'
110
+ option.logger.info 'Adding Phase is finished.'
64
111
  nil
65
112
  end
113
+
114
+ def self.index_by_keys(arr, keys)
115
+ hash = {}
116
+ arr.each do |elem|
117
+ pk = keys.map { |key| elem.send(key) }
118
+ unless hash[pk].nil?
119
+ option.logger.error "Error: not unique key #{pk}"
120
+ raise 'Not Imported.'
121
+ end
122
+ hash[pk] = elem
123
+ end
124
+ hash
125
+ end
66
126
  end
@@ -1,9 +1,9 @@
1
1
  module Deltaconveyor
2
2
  class Container
3
- attr_accessor :config, :originals
3
+ attr_accessor :originals
4
4
 
5
- def initialize
6
- self.config = Deltaconveyor::Config.new
5
+ def initialize(originals: nil)
6
+ self.originals = originals
7
7
  end
8
8
  end
9
9
  end
@@ -0,0 +1,15 @@
1
+ require 'logger'
2
+
3
+ module Deltaconveyor
4
+ class Option
5
+ DEFAULT_LOGGER = Logger.new(STDOUT)
6
+
7
+ attr_accessor :row_class, :key, :logger
8
+
9
+ def initialize(row_class: nil, key: nil, logger: nil)
10
+ self.row_class = row_class
11
+ self.logger = logger || DEFAULT_LOGGER
12
+ self.key = key || :id
13
+ end
14
+ end
15
+ end
@@ -1,19 +1,21 @@
1
1
  module Deltaconveyor
2
2
  class Row
3
+ attr_accessor :container
4
+
3
5
  def self.from_json(row_json, container)
4
6
  raise 'You must implement .from_json method in class extends Row.'
5
7
  end
6
8
 
7
- def self.update!(original, row, container)
8
- raise 'You must implement .update! method in class extends Row.'
9
+ def update!(original)
10
+ raise 'You must implement #update! method in class extends Row.'
9
11
  end
10
12
 
11
- def save!(container)
13
+ def save!
12
14
  raise 'You must implement #save! method in class extends Row.'
13
15
  end
14
16
 
15
17
  def key
16
- raise 'You must implement #key method in class extends Row.'
18
+ :id
17
19
  end
18
20
 
19
21
  def valid?
@@ -1,3 +1,3 @@
1
1
  module Deltaconveyor
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deltaconveyor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - qsona
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-10-16 00:00:00.000000000 Z
11
+ date: 2017-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,48 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-power_assert
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  description: TBD
56
98
  email:
57
99
  - u999sona@cpost.plala.or.jp
@@ -70,8 +112,8 @@ files:
70
112
  - bin/setup
71
113
  - deltaconveyor.gemspec
72
114
  - lib/deltaconveyor.rb
73
- - lib/deltaconveyor/config.rb
74
115
  - lib/deltaconveyor/container.rb
116
+ - lib/deltaconveyor/option.rb
75
117
  - lib/deltaconveyor/row.rb
76
118
  - lib/deltaconveyor/version.rb
77
119
  homepage: https://github.com/qsona/deltaconveyor
@@ -1,21 +0,0 @@
1
- module Deltaconveyor
2
- class Config
3
- DEFAULT_ORIGINAL_KEY_PROC = ->(original) { original.id }
4
- DEFAULT_INFO_LOGGER_PROC = ->(*args) { puts *args }
5
- DEFAULT_ERROR_LOGGER_PROC = ->(*args) { STDERR.puts *args }
6
-
7
- attr_accessor :row_class, :original_key_proc, :info_logger_proc, :error_logger_proc
8
-
9
- def original_key(original)
10
- (original_key_proc || DEFAULT_ORIGINAL_KEY_PROC).call(original)
11
- end
12
-
13
- def info_logger(*args)
14
- (info_logger_proc || DEFAULT_INFO_LOGGER_PROC).call(*args)
15
- end
16
-
17
- def error_logger(*args)
18
- (error_logger_proc || DEFAULT_ERROR_LOGGER_PROC).call(*args)
19
- end
20
- end
21
- end