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: 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