aquasync_model 0.1.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
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: e928cee82bd6380e8aa1873b29508880f12ae3da
|
|
4
|
+
data.tar.gz: 1ba61cbaa2c95c8e2b2d2256ea748f3c45edcd7a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 531a97065839dfe68b9bcba55227b2c82c162f2512db6fc53b2076dc5b3bf2a601a35504957e4cc55a9b750c3feab8c867a3b0ccfa8ec67810357e1520eb7205
|
|
7
|
+
data.tar.gz: 1efbd90fadb51cff0a3195aab16dd6ca369205ec4ea99c2c86a7cc448d1ae34c465111819304ab7654dcc720575d18590c2c1f76323f6b02f156b6c94e3210e1
|
data/lib/models/base.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'mongoid'
|
|
2
|
+
require 'active_support/concern'
|
|
3
|
+
require_relative 'concerns/aquasync_callbacks'
|
|
4
|
+
require_relative 'concerns/aquasync_aggregated_methods'
|
|
5
|
+
require_relative 'concerns/aquasync_delta_pack_methods'
|
|
6
|
+
require_relative '../validators/aquasync_validator'
|
|
7
|
+
|
|
8
|
+
module Aquasync
|
|
9
|
+
# Is a concern to mixin AquasyncModel requirements.
|
|
10
|
+
# @see https://github.com/AQAquamarine/aquasync-protocol/blob/master/aquasync-model.md
|
|
11
|
+
# @author kaiinui
|
|
12
|
+
module Base
|
|
13
|
+
extend ActiveSupport::Concern
|
|
14
|
+
|
|
15
|
+
included do
|
|
16
|
+
include Mongoid::Document
|
|
17
|
+
|
|
18
|
+
# should be UNIX timestamp
|
|
19
|
+
# @example 1406697904
|
|
20
|
+
field :ust, type: Integer
|
|
21
|
+
# should be UNIX timestamp
|
|
22
|
+
# @example 1406697904
|
|
23
|
+
field :localTimestamp, type: Integer
|
|
24
|
+
# should be UUIDv1
|
|
25
|
+
# @example 550e8400-e29b-41d4-a716-446655440000
|
|
26
|
+
field :gid, type: String
|
|
27
|
+
# should be UUIDv1
|
|
28
|
+
# @example 550e8400-e29b-41d4-a716-446655440000
|
|
29
|
+
field :deviceToken, type: String
|
|
30
|
+
# for paranoid deletion
|
|
31
|
+
# @example false
|
|
32
|
+
field :isDeleted, type: Boolean
|
|
33
|
+
|
|
34
|
+
validates_with Aquasync::Validator
|
|
35
|
+
|
|
36
|
+
include Aquasync::Callbacks
|
|
37
|
+
include Aquasync::AggregatedMethods
|
|
38
|
+
include Aquasync::DeltaPackMethods
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
|
|
3
|
+
module Aquasync
|
|
4
|
+
# Has a responsibility to implement Aquasync::DeltasAggregator requirement.
|
|
5
|
+
# @author kaiinui
|
|
6
|
+
# @see DeltasAggregator
|
|
7
|
+
module AggregatedMethods
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
# @param [Hash]
|
|
12
|
+
def resolve_conflict(delta)
|
|
13
|
+
self.update_attributes(delta) if delta["localTimestamp"] > self.localTimestamp
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
module ClassMethods
|
|
18
|
+
# DeltasAggregator requirement
|
|
19
|
+
# @return [Array<Aquasync::Base>]
|
|
20
|
+
def aq_deltas(ust)
|
|
21
|
+
where(:ust.gt => ust)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# DeltasAggregator requirement
|
|
25
|
+
# @return [NilClass]
|
|
26
|
+
def aq_commit_deltas(deltas)
|
|
27
|
+
deltas.each {|delta| commit_delta(delta) }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# commits a delta.
|
|
31
|
+
# @param [Hash]
|
|
32
|
+
def commit_delta(delta)
|
|
33
|
+
record = find_by(gid: delta["gid"])
|
|
34
|
+
if record
|
|
35
|
+
record.resolve_conflict(delta)
|
|
36
|
+
else
|
|
37
|
+
create_record_from_delta(delta)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# @param [Hash]
|
|
42
|
+
def create_record_from_delta(delta)
|
|
43
|
+
create(delta)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
require 'active_support/core_ext'
|
|
3
|
+
|
|
4
|
+
module Aquasync
|
|
5
|
+
# Has a responsibility to implement format methods to obey AquasyncModel.
|
|
6
|
+
# @see https://github.com/AQAquamarine/aquasync-protocol/blob/master/aquasync-model.md
|
|
7
|
+
# @author kaiinui
|
|
8
|
+
module Callbacks
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
included do
|
|
12
|
+
before_validation do
|
|
13
|
+
downcase_gid
|
|
14
|
+
downcase_device_token
|
|
15
|
+
set_ust
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# gid should be lowercase (https://github.com/AQAquamarine/aquasync-protocol/blob/master/aquasync-model.md#aquasync-model)
|
|
19
|
+
def downcase_gid
|
|
20
|
+
self.gid.try(:downcase!)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# deviceToken should be lowercase (https://github.com/AQAquamarine/aquasync-protocol/blob/master/aquasync-model.md#aquasync-model)
|
|
24
|
+
def downcase_device_token
|
|
25
|
+
self.deviceToken.try(:downcase!)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# sets UST current UNIX timestamp
|
|
29
|
+
def set_ust
|
|
30
|
+
self.ust = Time.now.to_i
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'active_support/concern'
|
|
2
|
+
|
|
3
|
+
module Aquasync
|
|
4
|
+
# Has a responsibility to implement DeltaPackBuilder requirement.
|
|
5
|
+
# @author kaiinui
|
|
6
|
+
# @see DeltaPackBuilder
|
|
7
|
+
module DeltaPackMethods
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
# returns its class name. Hoge for "Hoge".
|
|
12
|
+
# *DeltaPackBuilder Requirement
|
|
13
|
+
# @return [Symbol]
|
|
14
|
+
def _name
|
|
15
|
+
self.class.name
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# returns serialized hash whose _id is excluded.
|
|
19
|
+
# *DeltaPackBuilder Requirement
|
|
20
|
+
# @return [Hash]
|
|
21
|
+
def to_h
|
|
22
|
+
serializable_hash.delete_if {|key| key == "_id" or key == "ust"}
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'active_model/validator'
|
|
2
|
+
|
|
3
|
+
module Aquasync
|
|
4
|
+
# Has a responsibility to implement AquasyncModel validations.
|
|
5
|
+
# @see https://github.com/AQAquamarine/aquasync-protocol/blob/master/aquasync-model.md
|
|
6
|
+
# @author kaiinui
|
|
7
|
+
# @example usage
|
|
8
|
+
# validates_with Aquasync::Validator
|
|
9
|
+
class Validator < ActiveModel::Validator
|
|
10
|
+
def validate(record)
|
|
11
|
+
record.validates_presence_of :gid
|
|
12
|
+
record.validates_format_of :gid, with: /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
|
|
13
|
+
record.validates_presence_of :ust
|
|
14
|
+
record.validates_presence_of :deviceToken
|
|
15
|
+
record.validates_format_of :deviceToken, with: /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
|
|
16
|
+
record.validates_presence_of :localTimestamp
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: aquasync_model
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- kaiinui
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-08-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: mongoid
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '4.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '4.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: activesupport
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '4.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '4.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: simple_uuid
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.4'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.4'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: activerecord
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '4.0'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '4.0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '3.0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '3.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: guard-rspec
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '4.3'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '4.3'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: factory_girl
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '4.4'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '4.4'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: database_cleaner
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '1.3'
|
|
118
|
+
type: :development
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '1.3'
|
|
125
|
+
description: A mixin to help development of Aquasync.
|
|
126
|
+
email: me@kaiinui.com
|
|
127
|
+
executables: []
|
|
128
|
+
extensions: []
|
|
129
|
+
extra_rdoc_files: []
|
|
130
|
+
files:
|
|
131
|
+
- lib/models/base.rb
|
|
132
|
+
- lib/models/concerns/aquasync_aggregated_methods.rb
|
|
133
|
+
- lib/models/concerns/aquasync_callbacks.rb
|
|
134
|
+
- lib/models/concerns/aquasync_delta_pack_methods.rb
|
|
135
|
+
- lib/validators/aquasync_validator.rb
|
|
136
|
+
homepage: https://github.com/AQAquamarine/aquasync_model
|
|
137
|
+
licenses:
|
|
138
|
+
- MIT
|
|
139
|
+
metadata: {}
|
|
140
|
+
post_install_message:
|
|
141
|
+
rdoc_options: []
|
|
142
|
+
require_paths:
|
|
143
|
+
- lib
|
|
144
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
|
+
requirements:
|
|
146
|
+
- - ">="
|
|
147
|
+
- !ruby/object:Gem::Version
|
|
148
|
+
version: '0'
|
|
149
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
|
+
requirements:
|
|
151
|
+
- - ">="
|
|
152
|
+
- !ruby/object:Gem::Version
|
|
153
|
+
version: '0'
|
|
154
|
+
requirements: []
|
|
155
|
+
rubyforge_project:
|
|
156
|
+
rubygems_version: 2.2.2
|
|
157
|
+
signing_key:
|
|
158
|
+
specification_version: 4
|
|
159
|
+
summary: A mixin model which implements Aquasync Model specification.
|
|
160
|
+
test_files: []
|
|
161
|
+
has_rdoc:
|