deltaconveyor 0.1.0 → 0.2.0

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