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 +4 -4
- data/.rspec +1 -0
- data/deltaconveyor.gemspec +3 -0
- data/lib/deltaconveyor.rb +81 -21
- data/lib/deltaconveyor/container.rb +3 -3
- data/lib/deltaconveyor/option.rb +15 -0
- data/lib/deltaconveyor/row.rb +6 -4
- data/lib/deltaconveyor/version.rb +1 -1
- metadata +45 -3
- data/lib/deltaconveyor/config.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b6a21e28386560cc9f41bf2b56e67e850b8a028
|
4
|
+
data.tar.gz: 90ff8165dc997c5226cf3572db6b448983725d4c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43ae49ae35561b099105b638332c6732ae9537ae2450025242929112a919ccd18401ebbe6f36038840d09da010bd9974bee6bafd7f25d382168b504754d442e7
|
7
|
+
data.tar.gz: 802b72c51ddb79545dcfc1dabfd6890b4aedb2613717c1421450391029186f9065ad17bb889373da22915d7d1424fa459910f0cf4de91bccfe2942396a5c765d
|
data/.rspec
CHANGED
data/deltaconveyor.gemspec
CHANGED
@@ -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
|
data/lib/deltaconveyor.rb
CHANGED
@@ -1,25 +1,31 @@
|
|
1
1
|
require "deltaconveyor/version"
|
2
2
|
require "deltaconveyor/row"
|
3
|
-
require "deltaconveyor/
|
3
|
+
require "deltaconveyor/option"
|
4
4
|
require "deltaconveyor/container"
|
5
5
|
|
6
6
|
module Deltaconveyor
|
7
|
-
|
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
|
-
|
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
|
-
|
19
|
+
option.logger.error 'Error: Some data has errors.'
|
15
20
|
invalids.each do |invalid|
|
16
|
-
|
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
|
-
|
22
|
-
|
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
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
89
|
+
option.logger.info "Remove #{key}"
|
43
90
|
original_data.destroy!
|
44
91
|
end
|
45
|
-
|
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
|
-
|
99
|
+
new_data.update!(original_data)
|
53
100
|
end
|
54
|
-
|
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
|
-
|
61
|
-
new_data.save!
|
107
|
+
option.logger.info "Insert #{key}"
|
108
|
+
new_data.save!
|
62
109
|
end
|
63
|
-
|
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
|
@@ -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
|
data/lib/deltaconveyor/row.rb
CHANGED
@@ -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
|
8
|
-
raise 'You must implement
|
9
|
+
def update!(original)
|
10
|
+
raise 'You must implement #update! method in class extends Row.'
|
9
11
|
end
|
10
12
|
|
11
|
-
def save!
|
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
|
-
|
18
|
+
:id
|
17
19
|
end
|
18
20
|
|
19
21
|
def valid?
|
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.
|
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-
|
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
|
data/lib/deltaconveyor/config.rb
DELETED
@@ -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
|