sync_machine 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 +5 -5
- data/.circleci/config.yml +0 -12
- data/.gitignore +2 -0
- data/lib/sync_machine/change_listener.rb +20 -17
- data/lib/sync_machine/ensure_publication/publication_history.rb +1 -1
- data/lib/sync_machine/ensure_publication.rb +1 -1
- data/lib/sync_machine/find_subjects_worker.rb +3 -1
- data/lib/sync_machine/orm_adapter/active_record.rb +20 -0
- data/lib/sync_machine/orm_adapter/mongoid.rb +20 -0
- data/lib/sync_machine/version.rb +1 -1
- data/lib/sync_machine.rb +29 -27
- data/sync_machine.gemspec +4 -2
- metadata +49 -20
- data/Gemfile.lock +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d74a6108d033784c23a0dbcbf0212523dbb8498b55b867d630272806f726ae19
|
4
|
+
data.tar.gz: 18b5753d9abff76d0dec3c5d98e5b0660deeb45ae525eb4db3aea25741a33f60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c7100fd78a1809760743413f3024779243b1bb6d2d2963b1ad074b92e46cf1f196f0ab9b446fd2a7179bfe36ee0bfefdfd42ff82feccb8e97ca6091b7063ca9
|
7
|
+
data.tar.gz: c09a284f84e695dcb6a8935d1ca8510589e5094f235da6c011d14c7293aca9629990c0c92897ccba08f7d538114490a6fbcb703e1c56dcb707789348faadaef8
|
data/.circleci/config.yml
CHANGED
@@ -21,13 +21,6 @@ jobs:
|
|
21
21
|
steps:
|
22
22
|
- checkout
|
23
23
|
|
24
|
-
# Download and cache dependencies
|
25
|
-
- restore_cache:
|
26
|
-
keys:
|
27
|
-
- v1-dependencies-{{ checksum "Gemfile.lock" }}
|
28
|
-
# fallback to using the latest cache if no exact match is found
|
29
|
-
- v1-dependencies-
|
30
|
-
|
31
24
|
- run:
|
32
25
|
name: Configure Bundler
|
33
26
|
command: |
|
@@ -40,11 +33,6 @@ jobs:
|
|
40
33
|
command: |
|
41
34
|
bundle install --jobs=4 --retry=3 --path vendor/bundle
|
42
35
|
|
43
|
-
- save_cache:
|
44
|
-
paths:
|
45
|
-
- ./vendor/bundle
|
46
|
-
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
|
47
|
-
|
48
36
|
# run tests!
|
49
37
|
- run:
|
50
38
|
name: run tests
|
data/.gitignore
CHANGED
@@ -7,6 +7,7 @@ module SyncMachine
|
|
7
7
|
class ChangeListener
|
8
8
|
def self.inherited(base)
|
9
9
|
base.cattr_accessor :model_syms
|
10
|
+
base.subscribe
|
10
11
|
end
|
11
12
|
|
12
13
|
def self.listen_to_models(*model_syms)
|
@@ -15,7 +16,7 @@ module SyncMachine
|
|
15
16
|
send(
|
16
17
|
:alias_method,
|
17
18
|
"update_#{model_sym}_successful".to_sym,
|
18
|
-
:
|
19
|
+
:after_record_saved
|
19
20
|
)
|
20
21
|
end
|
21
22
|
end
|
@@ -24,34 +25,36 @@ module SyncMachine
|
|
24
25
|
Wisper.subscribe(new)
|
25
26
|
end
|
26
27
|
|
27
|
-
def after_create(
|
28
|
-
model_sym =
|
28
|
+
def after_create(record)
|
29
|
+
model_sym = record.class.name.underscore.to_sym
|
29
30
|
return unless self.class.model_syms.include?(model_sym)
|
30
|
-
|
31
|
+
after_record_saved(record)
|
31
32
|
end
|
32
33
|
|
33
|
-
def
|
34
|
-
return unless changed_keys(
|
34
|
+
def after_record_saved(record)
|
35
|
+
return unless changed_keys(record).present?
|
35
36
|
sync_module = SyncMachine.sync_module(self.class)
|
36
37
|
finder_class = sync_module.const_get('FindSubjectsWorker')
|
37
38
|
finder_class.perform_async(
|
38
|
-
|
39
|
-
|
40
|
-
changed_keys(
|
39
|
+
record.class.name,
|
40
|
+
record_id_for_job(record.id),
|
41
|
+
changed_keys(record),
|
41
42
|
Time.now.iso8601
|
42
43
|
)
|
43
44
|
end
|
44
45
|
|
45
46
|
private
|
46
47
|
|
47
|
-
def changed_keys(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
48
|
+
def changed_keys(record)
|
49
|
+
orm_adapter.change_listener_changed_keys(record)
|
50
|
+
end
|
51
|
+
|
52
|
+
def record_id_for_job(record_id)
|
53
|
+
orm_adapter.record_id_for_job(record_id)
|
54
|
+
end
|
55
|
+
|
56
|
+
def orm_adapter
|
57
|
+
SyncMachine.orm_adapter
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SyncMachine
|
2
|
+
module OrmAdapter
|
3
|
+
# Adapt SyncMachine for use with ActiveRecord-based applications.
|
4
|
+
module ActiveRecord
|
5
|
+
def self.setup
|
6
|
+
require "active_record"
|
7
|
+
require "wisper/active_record"
|
8
|
+
Wisper::ActiveRecord.extend_all
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.change_listener_changed_keys(record)
|
12
|
+
record.previous_changes.keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.record_id_for_job(record_id)
|
16
|
+
record_id
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SyncMachine
|
2
|
+
module OrmAdapter
|
3
|
+
# Adapt SyncMachine for use with Mongoid-based applications.
|
4
|
+
module Mongoid
|
5
|
+
def self.setup
|
6
|
+
require "mongoid"
|
7
|
+
require "wisper/mongoid"
|
8
|
+
Wisper::Mongoid.extend_all
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.change_listener_changed_keys(record)
|
12
|
+
record.changes.keys
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.record_id_for_job(record_id)
|
16
|
+
record_id.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/sync_machine/version.rb
CHANGED
data/lib/sync_machine.rb
CHANGED
@@ -1,20 +1,47 @@
|
|
1
1
|
require "active_support/core_ext/class"
|
2
2
|
require "active_support/core_ext/string"
|
3
|
-
require "mongoid"
|
4
3
|
require "sync_machine/change_listener"
|
5
4
|
require "sync_machine/ensure_publication"
|
6
5
|
require "sync_machine/ensure_publication/deduper"
|
7
6
|
require "sync_machine/ensure_publication/publication_history"
|
8
7
|
require "sync_machine/ensure_publication_worker"
|
9
8
|
require "sync_machine/find_subjects_worker"
|
9
|
+
require "sync_machine/orm_adapter/active_record"
|
10
|
+
require "sync_machine/orm_adapter/mongoid"
|
10
11
|
require "sync_machine/version"
|
11
|
-
require "wisper/mongoid"
|
12
12
|
|
13
13
|
# A mini-framework for intelligently publishing complex model changes to an
|
14
14
|
# external API..
|
15
15
|
module SyncMachine
|
16
|
+
mattr_accessor :orm_adapter
|
17
|
+
|
18
|
+
def self.use_active_record
|
19
|
+
setup_orm_adapter(OrmAdapter::ActiveRecord)
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.use_mongoid
|
23
|
+
setup_orm_adapter(OrmAdapter::Mongoid)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.setup_orm_adapter(orm_adapter)
|
27
|
+
self.orm_adapter = orm_adapter
|
28
|
+
orm_adapter.setup
|
29
|
+
end
|
30
|
+
|
16
31
|
def self.extended(base)
|
17
32
|
base.mattr_accessor :subject_sym
|
33
|
+
|
34
|
+
# Force loading of all relevant classes. Should only be necessary when
|
35
|
+
# running your application in a way that it defers loading constants, i.e.,
|
36
|
+
# Rails' development or test mode.
|
37
|
+
def base.eager_load
|
38
|
+
const_names = %w(
|
39
|
+
Payload FindSubjectsWorker EnsurePublicationWorker ChangeListener
|
40
|
+
)
|
41
|
+
const_names.each do |const_name|
|
42
|
+
const_get(const_name)
|
43
|
+
end
|
44
|
+
end
|
18
45
|
end
|
19
46
|
|
20
47
|
def self.sync_module(child_const)
|
@@ -28,29 +55,4 @@ module SyncMachine
|
|
28
55
|
def subject_class
|
29
56
|
subject_sym.to_s.camelize.constantize
|
30
57
|
end
|
31
|
-
|
32
|
-
def setup
|
33
|
-
define_payload_class unless const_defined?('Payload')
|
34
|
-
const_get('ChangeListener').subscribe
|
35
|
-
end
|
36
|
-
|
37
|
-
# :reek:TooManyStatements is unavoidable with this sort of dynamic class
|
38
|
-
# definition
|
39
|
-
def define_payload_class
|
40
|
-
collection_name = name.underscore + '_payloads'
|
41
|
-
payload_class = Class.new do
|
42
|
-
include Mongoid::Document
|
43
|
-
store_in collection: collection_name
|
44
|
-
|
45
|
-
field :body, type: Hash
|
46
|
-
field :generated_at, type: Time
|
47
|
-
field :subject_id, type: String
|
48
|
-
|
49
|
-
validates :generated_at, presence: true
|
50
|
-
validates :subject_id, presence: true, uniqueness: true
|
51
|
-
end
|
52
|
-
const_set('Payload', payload_class)
|
53
|
-
end
|
54
58
|
end
|
55
|
-
|
56
|
-
Wisper::Mongoid.extend_all
|
data/sync_machine.gemspec
CHANGED
@@ -36,14 +36,16 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.require_paths = ["lib"]
|
37
37
|
|
38
38
|
spec.add_runtime_dependency "activesupport"
|
39
|
-
spec.add_runtime_dependency "fhwang-wisper-mongoid"
|
40
|
-
spec.add_runtime_dependency "mongoid"
|
41
39
|
spec.add_runtime_dependency "sidekiq"
|
42
40
|
spec.add_runtime_dependency "wisper"
|
43
41
|
|
44
42
|
spec.add_development_dependency "bundler", "~> 2.0"
|
45
43
|
spec.add_development_dependency "factory_bot"
|
44
|
+
spec.add_development_dependency "fhwang-wisper-mongoid"
|
45
|
+
spec.add_development_dependency "mongoid"
|
46
46
|
spec.add_development_dependency "rake", "~> 10.0"
|
47
47
|
spec.add_development_dependency "rspec", "~> 3.0"
|
48
48
|
spec.add_development_dependency "rspec_junit_formatter"
|
49
|
+
spec.add_development_dependency "sqlite3"
|
50
|
+
spec.add_development_dependency "wisper-activerecord"
|
49
51
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sync_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Francis Hwang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: sidekiq
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -39,7 +39,7 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: wisper
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
@@ -53,27 +53,27 @@ dependencies:
|
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :
|
61
|
+
version: '2.0'
|
62
|
+
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
68
|
+
version: '2.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: factory_bot
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
|
-
type: :
|
76
|
+
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
@@ -81,21 +81,21 @@ dependencies:
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: fhwang-wisper-mongoid
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - ">="
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: mongoid
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - ">="
|
@@ -150,6 +150,34 @@ dependencies:
|
|
150
150
|
- - ">="
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: sqlite3
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: wisper-activerecord
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
153
181
|
description: A mini-framework for intelligently publishing complex model changes to
|
154
182
|
an external API.
|
155
183
|
email:
|
@@ -167,7 +195,6 @@ files:
|
|
167
195
|
- ".travis.yml"
|
168
196
|
- CODE_OF_CONDUCT.md
|
169
197
|
- Gemfile
|
170
|
-
- Gemfile.lock
|
171
198
|
- LICENSE.txt
|
172
199
|
- README.md
|
173
200
|
- Rakefile
|
@@ -180,6 +207,8 @@ files:
|
|
180
207
|
- lib/sync_machine/ensure_publication/publication_history.rb
|
181
208
|
- lib/sync_machine/ensure_publication_worker.rb
|
182
209
|
- lib/sync_machine/find_subjects_worker.rb
|
210
|
+
- lib/sync_machine/orm_adapter/active_record.rb
|
211
|
+
- lib/sync_machine/orm_adapter/mongoid.rb
|
183
212
|
- lib/sync_machine/version.rb
|
184
213
|
- sync_machine.gemspec
|
185
214
|
homepage: https://github.com/fhwang/sync_machine
|
@@ -204,7 +233,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
204
233
|
version: '0'
|
205
234
|
requirements: []
|
206
235
|
rubyforge_project:
|
207
|
-
rubygems_version: 2.
|
236
|
+
rubygems_version: 2.7.8
|
208
237
|
signing_key:
|
209
238
|
specification_version: 4
|
210
239
|
summary: A mini-framework for intelligently publishing complex model changes to an
|
data/Gemfile.lock
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
sync_machine (0.1.0)
|
5
|
-
activesupport
|
6
|
-
fhwang-wisper-mongoid
|
7
|
-
mongoid
|
8
|
-
sidekiq
|
9
|
-
wisper
|
10
|
-
|
11
|
-
GEM
|
12
|
-
remote: https://rubygems.org/
|
13
|
-
specs:
|
14
|
-
activemodel (5.2.1)
|
15
|
-
activesupport (= 5.2.1)
|
16
|
-
activesupport (5.2.1)
|
17
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
-
i18n (>= 0.7, < 2)
|
19
|
-
minitest (~> 5.1)
|
20
|
-
tzinfo (~> 1.1)
|
21
|
-
bson (4.3.0)
|
22
|
-
concurrent-ruby (1.0.5)
|
23
|
-
connection_pool (2.2.2)
|
24
|
-
diff-lcs (1.3)
|
25
|
-
factory_bot (5.0.2)
|
26
|
-
activesupport (>= 4.2.0)
|
27
|
-
fhwang-wisper-mongoid (0.2.0)
|
28
|
-
mongoid (>= 6)
|
29
|
-
wisper
|
30
|
-
i18n (1.1.1)
|
31
|
-
concurrent-ruby (~> 1.0)
|
32
|
-
minitest (5.11.3)
|
33
|
-
mongo (2.6.2)
|
34
|
-
bson (>= 4.3.0, < 5.0.0)
|
35
|
-
mongoid (6.4.2)
|
36
|
-
activemodel (>= 5.1, < 6.0.0)
|
37
|
-
mongo (>= 2.5.1, < 3.0.0)
|
38
|
-
rack (2.0.6)
|
39
|
-
rack-protection (2.0.4)
|
40
|
-
rack
|
41
|
-
rake (10.4.2)
|
42
|
-
redis (4.0.2)
|
43
|
-
rspec (3.6.0)
|
44
|
-
rspec-core (~> 3.6.0)
|
45
|
-
rspec-expectations (~> 3.6.0)
|
46
|
-
rspec-mocks (~> 3.6.0)
|
47
|
-
rspec-core (3.6.0)
|
48
|
-
rspec-support (~> 3.6.0)
|
49
|
-
rspec-expectations (3.6.0)
|
50
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
51
|
-
rspec-support (~> 3.6.0)
|
52
|
-
rspec-mocks (3.6.0)
|
53
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
54
|
-
rspec-support (~> 3.6.0)
|
55
|
-
rspec-support (3.6.0)
|
56
|
-
rspec_junit_formatter (0.4.1)
|
57
|
-
rspec-core (>= 2, < 4, != 2.12.0)
|
58
|
-
sidekiq (5.0.5)
|
59
|
-
concurrent-ruby (~> 1.0)
|
60
|
-
connection_pool (~> 2.2, >= 2.2.0)
|
61
|
-
rack-protection (>= 1.5.0)
|
62
|
-
redis (>= 3.3.4, < 5)
|
63
|
-
thread_safe (0.3.6)
|
64
|
-
tzinfo (1.2.5)
|
65
|
-
thread_safe (~> 0.1)
|
66
|
-
wisper (2.0.0)
|
67
|
-
|
68
|
-
PLATFORMS
|
69
|
-
ruby
|
70
|
-
|
71
|
-
DEPENDENCIES
|
72
|
-
bundler (~> 2.0)
|
73
|
-
factory_bot
|
74
|
-
rake (~> 10.0)
|
75
|
-
rspec (~> 3.0)
|
76
|
-
rspec_junit_formatter
|
77
|
-
sync_machine!
|
78
|
-
|
79
|
-
BUNDLED WITH
|
80
|
-
2.0.1
|