aquasync_deltas_aggregator 0.1.0 → 0.1.1

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: fa2a209bddc8f0790bd9660b5b7da9ffa4d651ef
4
- data.tar.gz: 98e34b59632148f8c43fb7369f222f6dc684bfef
3
+ metadata.gz: f34d448bd0a4b0bc443b50e52f5ed4a7e22b7ab1
4
+ data.tar.gz: 681f923df0c5d4f25174f8b5623b45c255c5637a
5
5
  SHA512:
6
- metadata.gz: 29205325c68b2ba1f2b6136e802f6a0edf976e9022ba343fc429e6ce668deb1a0365b8c71f39e00a3a158c66fc3b754eece2850fa50163fbabfa3a10e52f21fc
7
- data.tar.gz: 367de1340d8b774824e1fa1ffb0d03e861765840d32f6a3f6cdda45c830c614f4d2dfbc498d830aa5c92f121a09d7fd147d26605ae650cd771d1e175ac1b6e3d
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,3 @@
1
+ require_relative 'aggregators/deltas_aggregator'
2
+ require_relative 'delta_pack/delta_pack_builder'
3
+ require_relative 'delta_pack/delta_pack_unpacker'
@@ -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.0
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