aquasync_deltas_aggregator 0.1.0 → 0.1.1
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f34d448bd0a4b0bc443b50e52f5ed4a7e22b7ab1
|
4
|
+
data.tar.gz: 681f923df0c5d4f25174f8b5623b45c255c5637a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb225e95dc1c9082d43418adcaed4fe93610ccc08c99c7847e631d3b2458aaa0521bf8cfa5311d48677187c9c4cfac2d9d75abb105790af3122ad194820238d0
|
7
|
+
data.tar.gz: 1aa12134a5bbe5fa15095e685c87555c5dba66297e702ffee0d0be2018f074aef270b74540f3627334c5f8013a739343578bff9ba1e7112ee1ca4dd1f5d5c1fa
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative '../delta_pack/delta_pack_builder'
|
2
|
+
|
3
|
+
# Has responsibility to
|
4
|
+
# 1. Commit a DeltaPack to registered models.
|
5
|
+
# 2. Pack a DeltaPack from registered models.
|
6
|
+
# @author kaiinui
|
7
|
+
# @example Initialization
|
8
|
+
# aggregator = DeltasAggregator.new
|
9
|
+
# aggregator.regist_model_manager(Book, Author)
|
10
|
+
# @example Obtain a DeltaPack from registered models.
|
11
|
+
# aggregator.pack_deltas
|
12
|
+
# @example Commit a DeltaPack to registered models.
|
13
|
+
# aggregator.unpack_and_commit_delta_pack(delta_pack)
|
14
|
+
# @note Please implement #aq_deltas and #aq_commit_deltas to models. (DeltasAggregator requirement.)
|
15
|
+
class DeltasAggregator
|
16
|
+
attr_accessor :model_managers
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
self.model_managers = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Adds target models to aggregate.
|
23
|
+
# @param klass [Aquasync::Base]
|
24
|
+
# @return [NilClass]
|
25
|
+
def regist_model_manager(*klasses)
|
26
|
+
klasses.each do |klass|
|
27
|
+
name = klass.name
|
28
|
+
model_managers[name] = klass
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns registered model manager from name.
|
33
|
+
# @param [String] name
|
34
|
+
# @return [Aquasync::Base]
|
35
|
+
def model_manager_class(name)
|
36
|
+
model_managers[name]
|
37
|
+
end
|
38
|
+
|
39
|
+
# Unpacks a DeltaPack and delegates #aq_commit_deltas to registered model managers.
|
40
|
+
# @param [Hash] A DeltaPack (https://github.com/AQAquamarine/aquasync-protocol/blob/master/deltapack.md)
|
41
|
+
# @return [NilClass]
|
42
|
+
def commit_delta_pack(delta_pack)
|
43
|
+
unpacked_deltas = DeltaPackUnpacker.new.unpack(delta_pack).deltas
|
44
|
+
unpacked_deltas.each do |model_name, deltas|
|
45
|
+
manager = model_manager_class(model_name)
|
46
|
+
manager.aq_commit_deltas deltas
|
47
|
+
end # [TODO] raise error if any commit failed.
|
48
|
+
end
|
49
|
+
|
50
|
+
# Packs deltas collected from registered model managers via #aq_deltas to DeltaPack.
|
51
|
+
# @param [Integer] from_ust latestUST
|
52
|
+
# @return [Hash] A DeltaPack (https://github.com/AQAquamarine/aquasync-protocol/blob/master/deltapack.md)
|
53
|
+
def pack_deltas(from_ust)
|
54
|
+
builder = DeltaPackBuilder.new
|
55
|
+
model_managers.each do |model_name, model_manager|
|
56
|
+
builder.push_documents model_manager.aq_deltas(from_ust)
|
57
|
+
end
|
58
|
+
builder.delta_pack
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'simple_uuid'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
# Has a responsibility to build a DeltaPack hash.
|
5
|
+
# @author kaiinui
|
6
|
+
# @example
|
7
|
+
# builder = DeltaPackBuilder.new
|
8
|
+
# builder.push_documents(Book.all)
|
9
|
+
# builder.push_documents(Author.all)
|
10
|
+
# builder.delta_pack
|
11
|
+
# @note Please implement #_name and #to_h to Models. (DeltaPackBuilder requirements.)
|
12
|
+
class DeltaPackBuilder
|
13
|
+
# delta_pack [Hash]
|
14
|
+
attr_accessor :delta_pack
|
15
|
+
|
16
|
+
def initialize
|
17
|
+
self.delta_pack = {}
|
18
|
+
self.delta_pack["_id"] = uuid
|
19
|
+
self.delta_pack["latestUST"] = 0
|
20
|
+
end
|
21
|
+
|
22
|
+
# pushes a document into a DeltaPack.
|
23
|
+
# @param document [Aquasync::Base] a resource which inherits Aquasync::Base
|
24
|
+
def push(document)
|
25
|
+
name = document._name
|
26
|
+
initialize_array(name)
|
27
|
+
self.delta_pack[name].push document.to_h
|
28
|
+
update_ust(document)
|
29
|
+
end
|
30
|
+
|
31
|
+
# pushes documents into a DeltaPack.
|
32
|
+
# @param documents [Array] resources which inherits Aquasync::Base
|
33
|
+
def push_documents(documents)
|
34
|
+
documents.each {|d| push(d)}
|
35
|
+
end
|
36
|
+
|
37
|
+
# updates latestUST
|
38
|
+
# @param document [Aquasync::Base]
|
39
|
+
def update_ust(document)
|
40
|
+
if document.ust > latest_ust
|
41
|
+
self.delta_pack["latestUST"] = document.ust
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns latestUST of current DeltaPack
|
46
|
+
# @return [Integer]
|
47
|
+
def latest_ust
|
48
|
+
self.delta_pack["latestUST"]
|
49
|
+
end
|
50
|
+
|
51
|
+
# returns built DeltaPack represented in JSON
|
52
|
+
# @return [String] JSON string
|
53
|
+
def json
|
54
|
+
delta_pack.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
# returns built DeltaPack represented in pretty printed JSON
|
58
|
+
# @return [String] pretty printed JSON
|
59
|
+
def pretty_json
|
60
|
+
JSON.pretty_generate(delta_pack)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# @param [String] name model name
|
66
|
+
def initialize_array(name)
|
67
|
+
self.delta_pack[name] = [] unless self.delta_pack[name]
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [String] UUIDv1
|
71
|
+
def uuid
|
72
|
+
SimpleUUID::UUID.new.to_guid
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Has a responsibility to unpack a DeltaPack hash.
|
2
|
+
# @author kaiinui
|
3
|
+
class DeltaPackUnpacker
|
4
|
+
# id [String] UUID
|
5
|
+
attr_accessor :id
|
6
|
+
# deltas [Array] An array of deltas.
|
7
|
+
attr_accessor :deltas
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.deltas = {}
|
11
|
+
end
|
12
|
+
|
13
|
+
# unpacks a DeltaPack. You can extract data from #id, #deltas
|
14
|
+
# @param delta_pack [Hash] A DeltaPack
|
15
|
+
# @return [DeltaPackUnpacker]
|
16
|
+
def unpack(delta_pack)
|
17
|
+
self.id = delta_pack["_id"].downcase
|
18
|
+
delta_pack.each do |key, value|
|
19
|
+
next if key == "_id"
|
20
|
+
deltas[key] = value
|
21
|
+
end
|
22
|
+
self
|
23
|
+
end
|
24
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aquasync_deltas_aggregator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kaiinui
|
@@ -99,7 +99,11 @@ email: me@kaiinui.com
|
|
99
99
|
executables: []
|
100
100
|
extensions: []
|
101
101
|
extra_rdoc_files: []
|
102
|
-
files:
|
102
|
+
files:
|
103
|
+
- lib/aggregators/deltas_aggregator.rb
|
104
|
+
- lib/aquasync_deltas_aggregator.rb
|
105
|
+
- lib/delta_pack/delta_pack_builder.rb
|
106
|
+
- lib/delta_pack/delta_pack_unpacker.rb
|
103
107
|
homepage: https://github.com/AQAquamarine/aquasync_deltas_aggregator
|
104
108
|
licenses:
|
105
109
|
- MIT
|