table_sync 1.13.0 → 2.3.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 +4 -4
- data/.gitignore +0 -1
- data/.rubocop.yml +5 -1
- data/.travis.yml +6 -6
- data/CHANGELOG.md +37 -0
- data/Gemfile.lock +257 -0
- data/LICENSE.md +1 -1
- data/README.md +2 -1
- data/docs/development.md +43 -0
- data/docs/synopsis.md +24 -6
- data/lib/table_sync.rb +27 -22
- data/lib/table_sync/batch_publisher.rb +9 -10
- data/lib/table_sync/config.rb +1 -1
- data/lib/table_sync/errors.rb +22 -0
- data/lib/table_sync/instrument.rb +2 -2
- data/lib/table_sync/model/active_record.rb +1 -1
- data/lib/table_sync/orm_adapter/active_record.rb +1 -1
- data/lib/table_sync/orm_adapter/sequel.rb +9 -12
- data/lib/table_sync/plugins.rb +72 -0
- data/lib/table_sync/plugins/abstract.rb +55 -0
- data/lib/table_sync/plugins/access_mixin.rb +49 -0
- data/lib/table_sync/plugins/registry.rb +153 -0
- data/lib/table_sync/version.rb +1 -1
- data/table_sync.gemspec +4 -4
- metadata +16 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0b124973e82ee0bf943d61fb64b4ef0eb2798d1bca0b9c6396a597b2bf00ca5
|
4
|
+
data.tar.gz: d119902d368a1af85d954f586036b4f2e12b727f82bf4901b1f852b86e047627
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 653ffcb319c370378c8e861b0dd0c3468970dc10c8736a570c9f6fabbb1af05ade6a0506a744617bb9b9c2b07f218405ab17ecf969c9e7fd584ef96468d8e990
|
7
|
+
data.tar.gz: 0d080baf2462565addf4cfada754a5ba1ef67772a5e155d3958a354b938e190a99eb2d961dc56c70f26fa903cdc1ee76d0f4761999a13caf05c7e93c351ac22c
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -2,7 +2,7 @@ inherit_gem:
|
|
2
2
|
rubocop-config-umbrellio: lib/rubocop.yml
|
3
3
|
|
4
4
|
AllCops:
|
5
|
-
TargetRubyVersion: 2.
|
5
|
+
TargetRubyVersion: 2.5
|
6
6
|
Include:
|
7
7
|
- bin/*
|
8
8
|
- lib/**/*.rb
|
@@ -10,3 +10,7 @@ AllCops:
|
|
10
10
|
- Gemfile
|
11
11
|
- Rakefile
|
12
12
|
- table_sync.gemspec
|
13
|
+
|
14
|
+
Style/Alias:
|
15
|
+
Enabled: true
|
16
|
+
EnforcedStyle: prefer_alias_method
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,43 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [2.3.0] - 2020-07-22
|
5
|
+
### Added
|
6
|
+
- ruby 2.7 in Travis
|
7
|
+
- Gemfile.lock
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
- some fixes to get rid of warnings for ruby 2.7 (implicit conversion of hashes into kwargs will be dropped)
|
11
|
+
- TableSync.sync now explicitly expects klass and kwargs (it converts them into hash)
|
12
|
+
- TableSync::Instrument.notify now explicitly expects kwargs and delegates them further as kwargs
|
13
|
+
|
14
|
+
### Removed
|
15
|
+
- ruby 2.3, 2.4 from Travis
|
16
|
+
|
17
|
+
## [2.2.0] - 2020-04-12
|
18
|
+
### Added
|
19
|
+
- Introduce Plugin ecosystem (**TableSync::Plugins**);
|
20
|
+
|
21
|
+
## [2.1.1] - 2020-04-10
|
22
|
+
### Fixed
|
23
|
+
- Updated docs for batch_publishing to fully reflect changes in 2.1.0
|
24
|
+
|
25
|
+
## [2.1.0] - 2020-04-09
|
26
|
+
### Added
|
27
|
+
- **TableSync::BatchPublisher**: custom headers;
|
28
|
+
- **TableSync::BatchPublisher**: custom events;
|
29
|
+
|
30
|
+
### Changed
|
31
|
+
- Slight changes to specs
|
32
|
+
|
33
|
+
## [2.0.0] - 2020-04-06
|
34
|
+
### Changed
|
35
|
+
- Sequel publishing hooks: checking for `:destroy` events inside `:if`/`:unless` predicates
|
36
|
+
|
37
|
+
## [1.13.1] - 2020-03-24
|
38
|
+
### Fixed
|
39
|
+
- **TableSync::BatchPublisher**: incorrect `attrs_for_metadata` definition (typo in method name);
|
40
|
+
|
4
41
|
## [1.13.0] - 2019-11-02
|
5
42
|
### Added
|
6
43
|
- Wrapping interface around receiving logic (`wrap_receiving`);
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,257 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
table_sync (2.2.0)
|
5
|
+
memery
|
6
|
+
rabbit_messaging (~> 0.3)
|
7
|
+
rails
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: https://rubygems.org/
|
11
|
+
specs:
|
12
|
+
actioncable (6.0.3.2)
|
13
|
+
actionpack (= 6.0.3.2)
|
14
|
+
nio4r (~> 2.0)
|
15
|
+
websocket-driver (>= 0.6.1)
|
16
|
+
actionmailbox (6.0.3.2)
|
17
|
+
actionpack (= 6.0.3.2)
|
18
|
+
activejob (= 6.0.3.2)
|
19
|
+
activerecord (= 6.0.3.2)
|
20
|
+
activestorage (= 6.0.3.2)
|
21
|
+
activesupport (= 6.0.3.2)
|
22
|
+
mail (>= 2.7.1)
|
23
|
+
actionmailer (6.0.3.2)
|
24
|
+
actionpack (= 6.0.3.2)
|
25
|
+
actionview (= 6.0.3.2)
|
26
|
+
activejob (= 6.0.3.2)
|
27
|
+
mail (~> 2.5, >= 2.5.4)
|
28
|
+
rails-dom-testing (~> 2.0)
|
29
|
+
actionpack (6.0.3.2)
|
30
|
+
actionview (= 6.0.3.2)
|
31
|
+
activesupport (= 6.0.3.2)
|
32
|
+
rack (~> 2.0, >= 2.0.8)
|
33
|
+
rack-test (>= 0.6.3)
|
34
|
+
rails-dom-testing (~> 2.0)
|
35
|
+
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
36
|
+
actiontext (6.0.3.2)
|
37
|
+
actionpack (= 6.0.3.2)
|
38
|
+
activerecord (= 6.0.3.2)
|
39
|
+
activestorage (= 6.0.3.2)
|
40
|
+
activesupport (= 6.0.3.2)
|
41
|
+
nokogiri (>= 1.8.5)
|
42
|
+
actionview (6.0.3.2)
|
43
|
+
activesupport (= 6.0.3.2)
|
44
|
+
builder (~> 3.1)
|
45
|
+
erubi (~> 1.4)
|
46
|
+
rails-dom-testing (~> 2.0)
|
47
|
+
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
48
|
+
activejob (6.0.3.2)
|
49
|
+
activesupport (= 6.0.3.2)
|
50
|
+
globalid (>= 0.3.6)
|
51
|
+
activemodel (6.0.3.2)
|
52
|
+
activesupport (= 6.0.3.2)
|
53
|
+
activerecord (6.0.3.2)
|
54
|
+
activemodel (= 6.0.3.2)
|
55
|
+
activesupport (= 6.0.3.2)
|
56
|
+
activestorage (6.0.3.2)
|
57
|
+
actionpack (= 6.0.3.2)
|
58
|
+
activejob (= 6.0.3.2)
|
59
|
+
activerecord (= 6.0.3.2)
|
60
|
+
marcel (~> 0.3.1)
|
61
|
+
activesupport (6.0.3.2)
|
62
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
63
|
+
i18n (>= 0.7, < 2)
|
64
|
+
minitest (~> 5.1)
|
65
|
+
tzinfo (~> 1.1)
|
66
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
67
|
+
amq-protocol (2.3.2)
|
68
|
+
ast (2.4.1)
|
69
|
+
builder (3.2.4)
|
70
|
+
bundler-audit (0.7.0.1)
|
71
|
+
bundler (>= 1.2.0, < 3)
|
72
|
+
thor (>= 0.18, < 2)
|
73
|
+
bunny (2.15.0)
|
74
|
+
amq-protocol (~> 2.3, >= 2.3.1)
|
75
|
+
coderay (1.1.3)
|
76
|
+
concurrent-ruby (1.1.6)
|
77
|
+
coveralls (0.8.23)
|
78
|
+
json (>= 1.8, < 3)
|
79
|
+
simplecov (~> 0.16.1)
|
80
|
+
term-ansicolor (~> 1.3)
|
81
|
+
thor (>= 0.19.4, < 2.0)
|
82
|
+
tins (~> 1.6)
|
83
|
+
crass (1.0.6)
|
84
|
+
diff-lcs (1.4.4)
|
85
|
+
docile (1.3.2)
|
86
|
+
erubi (1.9.0)
|
87
|
+
exception_notification (4.4.3)
|
88
|
+
actionmailer (>= 4.0, < 7)
|
89
|
+
activesupport (>= 4.0, < 7)
|
90
|
+
globalid (0.4.2)
|
91
|
+
activesupport (>= 4.2.0)
|
92
|
+
i18n (1.8.4)
|
93
|
+
concurrent-ruby (~> 1.0)
|
94
|
+
jaro_winkler (1.5.4)
|
95
|
+
json (2.3.1)
|
96
|
+
lamian (1.2.0)
|
97
|
+
rails (>= 4.2)
|
98
|
+
loofah (2.6.0)
|
99
|
+
crass (~> 1.0.2)
|
100
|
+
nokogiri (>= 1.5.9)
|
101
|
+
mail (2.7.1)
|
102
|
+
mini_mime (>= 0.1.1)
|
103
|
+
marcel (0.3.3)
|
104
|
+
mimemagic (~> 0.3.2)
|
105
|
+
memery (1.3.0)
|
106
|
+
ruby2_keywords (~> 0.0.2)
|
107
|
+
method_source (1.0.0)
|
108
|
+
mimemagic (0.3.5)
|
109
|
+
mini_mime (1.0.2)
|
110
|
+
mini_portile2 (2.4.0)
|
111
|
+
minitest (5.14.1)
|
112
|
+
nio4r (2.5.2)
|
113
|
+
nokogiri (1.10.10)
|
114
|
+
mini_portile2 (~> 2.4.0)
|
115
|
+
parallel (1.19.2)
|
116
|
+
parser (2.7.1.4)
|
117
|
+
ast (~> 2.4.1)
|
118
|
+
pg (0.21.0)
|
119
|
+
pry (0.13.1)
|
120
|
+
coderay (~> 1.1)
|
121
|
+
method_source (~> 1.0)
|
122
|
+
rabbit_messaging (0.7.1)
|
123
|
+
bunny (~> 2.0)
|
124
|
+
exception_notification
|
125
|
+
lamian
|
126
|
+
rails
|
127
|
+
sneakers (~> 2.0)
|
128
|
+
tainbox
|
129
|
+
rack (2.2.3)
|
130
|
+
rack-test (1.1.0)
|
131
|
+
rack (>= 1.0, < 3)
|
132
|
+
rails (6.0.3.2)
|
133
|
+
actioncable (= 6.0.3.2)
|
134
|
+
actionmailbox (= 6.0.3.2)
|
135
|
+
actionmailer (= 6.0.3.2)
|
136
|
+
actionpack (= 6.0.3.2)
|
137
|
+
actiontext (= 6.0.3.2)
|
138
|
+
actionview (= 6.0.3.2)
|
139
|
+
activejob (= 6.0.3.2)
|
140
|
+
activemodel (= 6.0.3.2)
|
141
|
+
activerecord (= 6.0.3.2)
|
142
|
+
activestorage (= 6.0.3.2)
|
143
|
+
activesupport (= 6.0.3.2)
|
144
|
+
bundler (>= 1.3.0)
|
145
|
+
railties (= 6.0.3.2)
|
146
|
+
sprockets-rails (>= 2.0.0)
|
147
|
+
rails-dom-testing (2.0.3)
|
148
|
+
activesupport (>= 4.2.0)
|
149
|
+
nokogiri (>= 1.6)
|
150
|
+
rails-html-sanitizer (1.3.0)
|
151
|
+
loofah (~> 2.3)
|
152
|
+
railties (6.0.3.2)
|
153
|
+
actionpack (= 6.0.3.2)
|
154
|
+
activesupport (= 6.0.3.2)
|
155
|
+
method_source
|
156
|
+
rake (>= 0.8.7)
|
157
|
+
thor (>= 0.20.3, < 2.0)
|
158
|
+
rainbow (3.0.0)
|
159
|
+
rake (13.0.1)
|
160
|
+
rexml (3.2.4)
|
161
|
+
rspec (3.9.0)
|
162
|
+
rspec-core (~> 3.9.0)
|
163
|
+
rspec-expectations (~> 3.9.0)
|
164
|
+
rspec-mocks (~> 3.9.0)
|
165
|
+
rspec-core (3.9.2)
|
166
|
+
rspec-support (~> 3.9.3)
|
167
|
+
rspec-expectations (3.9.2)
|
168
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
169
|
+
rspec-support (~> 3.9.0)
|
170
|
+
rspec-mocks (3.9.1)
|
171
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
172
|
+
rspec-support (~> 3.9.0)
|
173
|
+
rspec-support (3.9.3)
|
174
|
+
rubocop (0.81.0)
|
175
|
+
jaro_winkler (~> 1.5.1)
|
176
|
+
parallel (~> 1.10)
|
177
|
+
parser (>= 2.7.0.1)
|
178
|
+
rainbow (>= 2.2.2, < 4.0)
|
179
|
+
rexml
|
180
|
+
ruby-progressbar (~> 1.7)
|
181
|
+
unicode-display_width (>= 1.4.0, < 2.0)
|
182
|
+
rubocop-config-umbrellio (0.81.0.78)
|
183
|
+
rubocop (= 0.81.0)
|
184
|
+
rubocop-performance (= 1.5.2)
|
185
|
+
rubocop-rails (= 2.5.0)
|
186
|
+
rubocop-rspec (= 1.38.1)
|
187
|
+
rubocop-performance (1.5.2)
|
188
|
+
rubocop (>= 0.71.0)
|
189
|
+
rubocop-rails (2.5.0)
|
190
|
+
activesupport
|
191
|
+
rack (>= 1.1)
|
192
|
+
rubocop (>= 0.72.0)
|
193
|
+
rubocop-rspec (1.38.1)
|
194
|
+
rubocop (>= 0.68.1)
|
195
|
+
ruby-progressbar (1.10.1)
|
196
|
+
ruby2_keywords (0.0.2)
|
197
|
+
sequel (5.34.0)
|
198
|
+
serverengine (2.0.7)
|
199
|
+
sigdump (~> 0.2.2)
|
200
|
+
sigdump (0.2.4)
|
201
|
+
simplecov (0.16.1)
|
202
|
+
docile (~> 1.1)
|
203
|
+
json (>= 1.8, < 3)
|
204
|
+
simplecov-html (~> 0.10.0)
|
205
|
+
simplecov-html (0.10.2)
|
206
|
+
sneakers (2.11.0)
|
207
|
+
bunny (~> 2.12)
|
208
|
+
concurrent-ruby (~> 1.0)
|
209
|
+
rake
|
210
|
+
serverengine (~> 2.0.5)
|
211
|
+
thor
|
212
|
+
sprockets (4.0.2)
|
213
|
+
concurrent-ruby (~> 1.0)
|
214
|
+
rack (> 1, < 3)
|
215
|
+
sprockets-rails (3.2.1)
|
216
|
+
actionpack (>= 4.0)
|
217
|
+
activesupport (>= 4.0)
|
218
|
+
sprockets (>= 3.0.0)
|
219
|
+
sync (0.5.0)
|
220
|
+
tainbox (2.1.2)
|
221
|
+
activesupport
|
222
|
+
term-ansicolor (1.7.1)
|
223
|
+
tins (~> 1.0)
|
224
|
+
thor (1.0.1)
|
225
|
+
thread_safe (0.3.6)
|
226
|
+
timecop (0.9.1)
|
227
|
+
tins (1.25.0)
|
228
|
+
sync
|
229
|
+
tzinfo (1.2.7)
|
230
|
+
thread_safe (~> 0.1)
|
231
|
+
unicode-display_width (1.7.0)
|
232
|
+
websocket-driver (0.7.3)
|
233
|
+
websocket-extensions (>= 0.1.0)
|
234
|
+
websocket-extensions (0.1.5)
|
235
|
+
zeitwerk (2.4.0)
|
236
|
+
|
237
|
+
PLATFORMS
|
238
|
+
ruby
|
239
|
+
|
240
|
+
DEPENDENCIES
|
241
|
+
activejob (>= 6.0)
|
242
|
+
activerecord (>= 6.0)
|
243
|
+
bundler
|
244
|
+
bundler-audit
|
245
|
+
coveralls (~> 0.8)
|
246
|
+
pg (~> 0.18)
|
247
|
+
pry
|
248
|
+
rake
|
249
|
+
rspec (~> 3.8)
|
250
|
+
rubocop-config-umbrellio (~> 0.81)
|
251
|
+
sequel
|
252
|
+
simplecov (~> 0.16)
|
253
|
+
table_sync!
|
254
|
+
timecop
|
255
|
+
|
256
|
+
BUNDLED WITH
|
257
|
+
2.1.4
|
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
DB Table synchronization between microservices based on Model's event system and RabbitMQ messaging
|
4
4
|
|
5
|
-
##
|
5
|
+
## Installation
|
6
6
|
|
7
7
|
```ruby
|
8
8
|
gem 'table_sync'
|
@@ -21,6 +21,7 @@ require 'table_sync'
|
|
21
21
|
## Usage
|
22
22
|
|
23
23
|
- [Documentation](docs/synopsis.md)
|
24
|
+
- [Development](docs/development.md)
|
24
25
|
|
25
26
|
## Contributing
|
26
27
|
|
data/docs/development.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# TableSync (development)
|
2
|
+
|
3
|
+
## Table of Contents
|
4
|
+
|
5
|
+
- [Creation and registration of the new plugin](#creation-and-registration-of-the-new-plugin)
|
6
|
+
|
7
|
+
### Creation and registration of the new plugin
|
8
|
+
|
9
|
+
* Create a class inherited from `TableSync::Plugins::Abstract` (recommendation: place it in the plugins directory (`lib/plugins/`));
|
10
|
+
* Implement `.install!` method (`TableSync::Plugins::Abstract.install!`)
|
11
|
+
* Register the newly created class in plugins ecosystem (`TableSync.register_plugin('plugin_name', PluginClass))`);
|
12
|
+
* Usage: `TableSync.enable(:plugin_name)` / `TableSync.plugin(:plugin_name)` / `TableSync.load(:plugin_name)` (string name is supported too);
|
13
|
+
|
14
|
+
Example:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
# 1) creation (lib/plugins/global_method.rb)
|
18
|
+
class TableSync::Plugins::GlobalMethod < TableSync::Plugins::Abstract
|
19
|
+
class << self
|
20
|
+
# 2) plugin loader method implementation
|
21
|
+
def install!
|
22
|
+
::TableSync.extend(Module.new do
|
23
|
+
def global_method
|
24
|
+
:works!
|
25
|
+
end
|
26
|
+
end)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# 3) plugin registration
|
32
|
+
TableSync.register('global_method', TableSync::Plugins::GlobalMethod)
|
33
|
+
|
34
|
+
# 4) enable registerd plugin
|
35
|
+
TableSync.plugin(:global_method) # string is supported too
|
36
|
+
# --- or ---
|
37
|
+
TableSync.enable(:global_method) # string is supported too
|
38
|
+
# --- or ---
|
39
|
+
TableSync.load(:global_method) # string is supported too
|
40
|
+
|
41
|
+
# Your new functionality
|
42
|
+
TableSync.global_method # => :works!
|
43
|
+
```
|
data/docs/synopsis.md
CHANGED
@@ -90,11 +90,10 @@ where state is one of `:created / :updated / :destroyed` and `confirm` is Rabbit
|
|
90
90
|
# Manual publishing with batches
|
91
91
|
|
92
92
|
You can use `TableSync::BatchPublisher` to publish changes in batches (array of hashes in `attributes`).
|
93
|
-
For now, only the following changes in the table can be published: `create` and` update`.
|
94
93
|
|
95
94
|
When using `TableSync::BatchPublisher`,` TableSync.routing_key_callable` is called as follows:
|
96
95
|
`TableSync.routing_key_callable.call(klass, {})`, i.e. empty hash is passed instead of attributes.
|
97
|
-
And `TableSync.routing_metadata_callable` is not called at all:
|
96
|
+
And `TableSync.routing_metadata_callable` is not called at all: metadata is set to empty hash.
|
98
97
|
|
99
98
|
`TableSync::BatchPublisher.new(object_class, original_attributes_array, **options)`, where `original_attributes_array` is an array with hash of attributes of published objects and `options` is a hash of options.
|
100
99
|
|
@@ -103,21 +102,30 @@ And `TableSync.routing_metadata_callable` is not called at all: header value is
|
|
103
102
|
- `routing_key`, which is a custom key used (if given) to override one from `TableSync.routing_key_callable`, `nil` by default
|
104
103
|
- `push_original_attributes` (default value is `false`), if this option is set to `true`,
|
105
104
|
original_attributes_array will be pushed to Rabbit instead of fetching records from database and sending their mapped attributes.
|
105
|
+
- `headers`, which is an option for custom headers (can be used for headers exchanges routes), `nil` by default
|
106
|
+
- `event`, which is an option for event specification (`:destroy` or `:update`), `:update` by default
|
106
107
|
|
107
108
|
Example:
|
108
109
|
|
109
110
|
```ruby
|
110
|
-
TableSync::BatchPublisher.new(
|
111
|
+
TableSync::BatchPublisher.new(
|
112
|
+
"SomeClass",
|
113
|
+
[{ id: 1 }, { id: 2 }],
|
114
|
+
confirm: false,
|
115
|
+
routing_key: "custom_routing_key",
|
116
|
+
push_original_attributes: true,
|
117
|
+
headers: { key: :value },
|
118
|
+
event: :destroy,
|
119
|
+
)
|
111
120
|
```
|
112
121
|
|
113
122
|
# Manual publishing with batches (Russian)
|
114
123
|
|
115
124
|
С помощью класса `TableSync::BatchPublisher` вы можете опубликовать изменения батчами (массивом в `attributes`).
|
116
|
-
Пока можно публиковать только следующие изменения в таблице: `создание записи` и `обновление записи`.
|
117
125
|
|
118
126
|
При использовании `TableSync::BatchPublisher`, `TableSync.routing_key_callable` вызывается следующим образом:
|
119
127
|
`TableSync.routing_key_callable.call(klass, {})`, то есть вместо аттрибутов передается пустой хэш.
|
120
|
-
А `TableSync.routing_metadata_callable` не вызывается вовсе: в
|
128
|
+
А `TableSync.routing_metadata_callable` не вызывается вовсе: в метадате устанавливается пустой хэш.
|
121
129
|
|
122
130
|
`TableSync::BatchPublisher.new(object_class, original_attributes_array, **options)`, где `original_attributes_array` - массив с аттрибутами публикуемых объектов и `options`- это хэш с дополнительными опциями.
|
123
131
|
|
@@ -125,11 +133,21 @@ TableSync::BatchPublisher.new("SomeClass", [{ id: 1 }, { id: 2 }], confirm: fals
|
|
125
133
|
- `confirm`, флаг для RabbitMQ, по умолчанию - `true`
|
126
134
|
- `routing_key`, ключ, который (если указан) замещает ключ, получаемый из `TableSync.routing_key_callable`, по умолчанию - `nil`
|
127
135
|
- `push_original_attributes` (значение по умолчанию `false`), если для этой опции задано значение true, в Rabbit будут отправлены original_attributes_array, вместо получения значений записей из базы непосредственно перед отправкой.
|
136
|
+
- `headers`, опция для задания headers (можно использовать для задания маршрутов в headers exchange'ах), `nil` по умолчанию
|
137
|
+
- `event`, опция для указания типа события (`:destroy` или `:update`), `:update` по умолчанию
|
128
138
|
|
129
139
|
Example:
|
130
140
|
|
131
141
|
```ruby
|
132
|
-
TableSync::BatchPublisher.new(
|
142
|
+
TableSync::BatchPublisher.new(
|
143
|
+
"SomeClass",
|
144
|
+
[{ id: 1 }, { id: 2 }],
|
145
|
+
confirm: false,
|
146
|
+
routing_key: "custom_routing_key",
|
147
|
+
push_original_attributes: true,
|
148
|
+
headers: { key: :value },
|
149
|
+
event: :destroy,
|
150
|
+
)
|
133
151
|
```
|
134
152
|
|
135
153
|
# Receiving changes
|
data/lib/table_sync.rb
CHANGED
@@ -7,26 +7,31 @@ require "active_support/core_ext/object/blank"
|
|
7
7
|
require "active_support/core_ext/numeric/time"
|
8
8
|
|
9
9
|
module TableSync
|
10
|
-
require_relative "
|
11
|
-
require_relative "
|
12
|
-
require_relative "
|
13
|
-
require_relative "
|
14
|
-
require_relative "
|
15
|
-
require_relative "
|
16
|
-
require_relative "
|
17
|
-
require_relative "
|
18
|
-
require_relative "
|
19
|
-
require_relative "
|
20
|
-
require_relative "
|
21
|
-
require_relative "
|
22
|
-
require_relative "
|
23
|
-
require_relative "
|
24
|
-
require_relative "
|
25
|
-
require_relative "
|
26
|
-
require_relative "
|
27
|
-
require_relative "
|
28
|
-
require_relative "
|
29
|
-
require_relative "
|
10
|
+
require_relative "table_sync/version"
|
11
|
+
require_relative "table_sync/errors"
|
12
|
+
require_relative "table_sync/plugins"
|
13
|
+
require_relative "table_sync/event_actions"
|
14
|
+
require_relative "table_sync/event_actions/data_wrapper"
|
15
|
+
require_relative "table_sync/config"
|
16
|
+
require_relative "table_sync/config/callback_registry"
|
17
|
+
require_relative "table_sync/config_decorator"
|
18
|
+
require_relative "table_sync/dsl"
|
19
|
+
require_relative "table_sync/receiving_handler"
|
20
|
+
require_relative "table_sync/base_publisher"
|
21
|
+
require_relative "table_sync/publisher"
|
22
|
+
require_relative "table_sync/batch_publisher"
|
23
|
+
require_relative "table_sync/orm_adapter/active_record"
|
24
|
+
require_relative "table_sync/orm_adapter/sequel"
|
25
|
+
require_relative "table_sync/model/active_record"
|
26
|
+
require_relative "table_sync/model/sequel"
|
27
|
+
require_relative "table_sync/instrument"
|
28
|
+
require_relative "table_sync/instrument_adapter/active_support"
|
29
|
+
require_relative "table_sync/naming_resolver/active_record"
|
30
|
+
require_relative "table_sync/naming_resolver/sequel"
|
31
|
+
|
32
|
+
# @api public
|
33
|
+
# @since 2.2.0
|
34
|
+
extend Plugins::AccessMixin
|
30
35
|
|
31
36
|
class << self
|
32
37
|
include Memery
|
@@ -38,8 +43,8 @@ module TableSync
|
|
38
43
|
attr_accessor :routing_metadata_callable
|
39
44
|
attr_accessor :notifier
|
40
45
|
|
41
|
-
def sync(
|
42
|
-
orm.setup_sync(
|
46
|
+
def sync(klass, **opts)
|
47
|
+
orm.setup_sync(klass, opts)
|
43
48
|
end
|
44
49
|
|
45
50
|
def orm=(val)
|
@@ -2,13 +2,16 @@
|
|
2
2
|
|
3
3
|
class TableSync::BatchPublisher < TableSync::BasePublisher
|
4
4
|
def initialize(object_class, original_attributes_array, **options)
|
5
|
-
@object_class = object_class.constantize
|
6
5
|
@original_attributes_array = original_attributes_array.map do |hash|
|
7
6
|
filter_safe_for_serialization(hash.deep_symbolize_keys)
|
8
7
|
end
|
9
|
-
|
10
|
-
@
|
8
|
+
|
9
|
+
@object_class = object_class.constantize
|
10
|
+
@confirm = options[:confirm] || true
|
11
|
+
@routing_key = options[:routing_key] || resolve_routing_key
|
11
12
|
@push_original_attributes = options[:push_original_attributes] || false
|
13
|
+
@headers = options[:headers]
|
14
|
+
@event = options[:event] || :update
|
12
15
|
end
|
13
16
|
|
14
17
|
def publish
|
@@ -27,7 +30,7 @@ class TableSync::BatchPublisher < TableSync::BasePublisher
|
|
27
30
|
|
28
31
|
private
|
29
32
|
|
30
|
-
attr_reader :original_attributes_array, :routing_key
|
33
|
+
attr_reader :original_attributes_array, :routing_key, :headers, :event
|
31
34
|
|
32
35
|
def push_original_attributes?
|
33
36
|
@push_original_attributes
|
@@ -57,14 +60,14 @@ class TableSync::BatchPublisher < TableSync::BasePublisher
|
|
57
60
|
{}
|
58
61
|
end
|
59
62
|
|
60
|
-
def
|
63
|
+
def attrs_for_metadata
|
61
64
|
{}
|
62
65
|
end
|
63
66
|
|
64
67
|
def params
|
65
68
|
{
|
66
69
|
**super,
|
67
|
-
headers:
|
70
|
+
headers: headers,
|
68
71
|
}
|
69
72
|
end
|
70
73
|
|
@@ -80,10 +83,6 @@ class TableSync::BatchPublisher < TableSync::BasePublisher
|
|
80
83
|
}
|
81
84
|
end
|
82
85
|
|
83
|
-
def event
|
84
|
-
:update
|
85
|
-
end
|
86
|
-
|
87
86
|
def attributes_for_sync
|
88
87
|
return original_attributes_array if push_original_attributes?
|
89
88
|
|
data/lib/table_sync/config.rb
CHANGED
@@ -44,7 +44,7 @@ module TableSync
|
|
44
44
|
|
45
45
|
# wrapper for proc-value, this wrapper receives all params (model, version, project_id...)
|
46
46
|
# and filters them for proc-value
|
47
|
-
unified_block = proc { |hash = {}| block.call(hash.slice(*params)) }
|
47
|
+
unified_block = proc { |hash = {}| block.call(**hash.slice(*params)) }
|
48
48
|
|
49
49
|
# set wrapped proc-value as ivar value
|
50
50
|
instance_variable_set(ivar, unified_block)
|
data/lib/table_sync/errors.rb
CHANGED
@@ -38,4 +38,26 @@ module TableSync
|
|
38
38
|
MSG
|
39
39
|
end
|
40
40
|
end
|
41
|
+
|
42
|
+
# @api public
|
43
|
+
# @since 2.2.0
|
44
|
+
PluginError = Class.new(Error)
|
45
|
+
|
46
|
+
# @api public
|
47
|
+
# @since 2.2.0
|
48
|
+
class UnregisteredPluginError < PluginError
|
49
|
+
# @param plugin_name [Any]
|
50
|
+
def initialize(plugin_name)
|
51
|
+
super("#{plugin_name} plugin is not registered")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# @api public
|
56
|
+
# @since 2.2.0
|
57
|
+
class AlreadyRegisteredPluginError < PluginError
|
58
|
+
# @param plugin_name [Any]
|
59
|
+
def initialize(plugin_name)
|
60
|
+
super("#{plugin_name} plugin already exists")
|
61
|
+
end
|
62
|
+
end
|
41
63
|
end
|
@@ -20,7 +20,7 @@ module TableSync::ORMAdapter
|
|
20
20
|
object.values
|
21
21
|
end
|
22
22
|
|
23
|
-
def setup_sync(klass,
|
23
|
+
def setup_sync(klass, opts)
|
24
24
|
if_predicate = to_predicate(opts.delete(:if), true)
|
25
25
|
unless_predicate = to_predicate(opts.delete(:unless), false)
|
26
26
|
debounce_time = opts.delete(:debounce_time)
|
@@ -40,24 +40,21 @@ module TableSync::ORMAdapter
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def register_callbacks(klass, if_predicate, unless_predicate, debounce_time)
|
43
|
-
{ create: :created, update: :updated }.each do |event, state|
|
43
|
+
{ create: :created, update: :updated, destroy: :destroyed }.each do |event, state|
|
44
44
|
klass.send(:define_method, :"after_#{event}") do
|
45
45
|
if instance_eval(&if_predicate) && !instance_eval(&unless_predicate)
|
46
46
|
db.after_commit do
|
47
|
-
TableSync::Publisher.new(
|
48
|
-
|
47
|
+
TableSync::Publisher.new(
|
48
|
+
self.class.name,
|
49
|
+
values,
|
50
|
+
state: state,
|
51
|
+
debounce_time: debounce_time,
|
52
|
+
).publish
|
49
53
|
end
|
50
54
|
end
|
51
|
-
super()
|
52
|
-
end
|
53
|
-
end
|
54
55
|
|
55
|
-
|
56
|
-
# publish anyway
|
57
|
-
db.after_commit do
|
58
|
-
TableSync::Publisher.new(self.class.name, values, state: :destroyed).publish
|
56
|
+
super()
|
59
57
|
end
|
60
|
-
super()
|
61
58
|
end
|
62
59
|
end
|
63
60
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
# @since 2.2.0
|
5
|
+
module TableSync::Plugins
|
6
|
+
require_relative "plugins/registry"
|
7
|
+
require_relative "plugins/access_mixin"
|
8
|
+
require_relative "plugins/abstract"
|
9
|
+
|
10
|
+
# @since 2.2.0
|
11
|
+
@plugin_registry = Registry.new
|
12
|
+
# @since 2.2.0
|
13
|
+
@access_lock = Mutex.new
|
14
|
+
|
15
|
+
class << self
|
16
|
+
# @param plugin_name [Symbol, String]
|
17
|
+
# @return [void]
|
18
|
+
#
|
19
|
+
# @api public
|
20
|
+
# @since 2.2.0
|
21
|
+
def load(plugin_name)
|
22
|
+
thread_safe { plugin_registry[plugin_name].load! }
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Array<String>]
|
26
|
+
#
|
27
|
+
# @api public
|
28
|
+
# @since 2.2.0
|
29
|
+
def loaded_plugins
|
30
|
+
thread_safe { plugin_registry.loaded.keys }
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [Array<String>]
|
34
|
+
#
|
35
|
+
# @api public
|
36
|
+
# @since 2.2.0
|
37
|
+
def names
|
38
|
+
thread_safe { plugin_registry.names }
|
39
|
+
end
|
40
|
+
|
41
|
+
# @param plugin_name [Symbol, String]
|
42
|
+
# @return [void]
|
43
|
+
#
|
44
|
+
# @api private
|
45
|
+
# @since 2.2.0
|
46
|
+
def register_plugin(plugin_name, plugin_module)
|
47
|
+
thread_safe { plugin_registry[plugin_name] = plugin_module }
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# @return [TableSync::Plugins::Registry]
|
53
|
+
#
|
54
|
+
# @api private
|
55
|
+
# @since 2.2.0
|
56
|
+
attr_reader :plugin_registry
|
57
|
+
|
58
|
+
# @return [Mutex]
|
59
|
+
#
|
60
|
+
# @api private
|
61
|
+
# @since 2.2.0
|
62
|
+
attr_reader :access_lock
|
63
|
+
|
64
|
+
# @return [void]
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
# @since 2.2.0
|
68
|
+
def thread_safe
|
69
|
+
access_lock.synchronize { yield if block_given? }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 2.2.0
|
5
|
+
class TableSync::Plugins::Abstract
|
6
|
+
class << self
|
7
|
+
# @param child_klass [Class]
|
8
|
+
# @return [void]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
# @since 2.2.0
|
12
|
+
def inherited(child_klass)
|
13
|
+
child_klass.instance_variable_set(:@__loaded__, false)
|
14
|
+
child_klass.instance_variable_set(:@__lock__, Mutex.new)
|
15
|
+
super
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [void]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
# @since 2.2.0
|
22
|
+
def load!
|
23
|
+
__thread_safe__ do
|
24
|
+
unless @__loaded__
|
25
|
+
@__loaded__ = true
|
26
|
+
install!
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# @return [Boolean]
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
# @since 2.2.0
|
35
|
+
def loaded?
|
36
|
+
__thread_safe__ { @__loaded__ }
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @return [void]
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
# @since 2.2.0
|
45
|
+
def install!; end
|
46
|
+
|
47
|
+
# @return [Any]
|
48
|
+
#
|
49
|
+
# @api private
|
50
|
+
# @since 2.2.0
|
51
|
+
def __thread_safe__
|
52
|
+
@__lock__.synchronize { yield }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 2.2.0
|
5
|
+
module TableSync::Plugins::AccessMixin
|
6
|
+
# @param plugin_name [Symbol, String]
|
7
|
+
# @return [void]
|
8
|
+
#
|
9
|
+
# @see TableSync::Plugins
|
10
|
+
#
|
11
|
+
# @api public
|
12
|
+
# @since 2.2.0
|
13
|
+
def plugin(plugin_name)
|
14
|
+
TableSync::Plugins.load(plugin_name)
|
15
|
+
end
|
16
|
+
alias_method :enable, :plugin
|
17
|
+
alias_method :load, :plugin
|
18
|
+
|
19
|
+
# @return [Array<String>]
|
20
|
+
#
|
21
|
+
# @see TableSync::Plugins
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
# @since 2.2.0
|
25
|
+
def plugins
|
26
|
+
TableSync::Plugins.names
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Hash<String,Class<TableSync::Plugins::Abstract>>]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
# @since 2.2.0
|
33
|
+
def loaded_plugins
|
34
|
+
TableSync::Plugins.loaded_plugins
|
35
|
+
end
|
36
|
+
alias_method :enabled_plugins, :loaded_plugins
|
37
|
+
|
38
|
+
# @param plugin_name [String, Symbol]
|
39
|
+
# @param plugin_klass [Class<TableSync::Plugins::Abstract>]
|
40
|
+
# @return [void]
|
41
|
+
#
|
42
|
+
# @see TableSync::Plugins
|
43
|
+
#
|
44
|
+
# @api public
|
45
|
+
# @since 2.2.0
|
46
|
+
def register_plugin(plugin_name, plugin_klass)
|
47
|
+
TableSync::Plugins.register_plugin(plugin_name, plugin_klass)
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# @api private
|
4
|
+
# @since 2.2.0
|
5
|
+
class TableSync::Plugins::Registry
|
6
|
+
include Enumerable
|
7
|
+
|
8
|
+
# @return [void]
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
# @since 2.2.0
|
12
|
+
def initialize
|
13
|
+
@plugin_set = {}
|
14
|
+
@access_lock = Mutex.new
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param plugin_name [Symbol, String]
|
18
|
+
# @return [TableSync::Plugins::Abstract]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
# @since 2.2.0
|
22
|
+
def [](plugin_name)
|
23
|
+
thread_safe { fetch(plugin_name) }
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param plugin_name [Symbol, String]
|
27
|
+
# @param plugin_module [TableSync::Plugins::Abstract]
|
28
|
+
# @return [void]
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
# @since 2.2.0
|
32
|
+
def register(plugin_name, plugin_module)
|
33
|
+
thread_safe { apply(plugin_name, plugin_module) }
|
34
|
+
end
|
35
|
+
alias_method :[]=, :register
|
36
|
+
|
37
|
+
# @return [Array<String>]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
# @since 2.2.0
|
41
|
+
def names
|
42
|
+
thread_safe { plugin_names }
|
43
|
+
end
|
44
|
+
|
45
|
+
# @return [Hash<String,Class<TableSync::Plugins::Abstract>>]
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
# @since 2.2.0
|
49
|
+
def loaded
|
50
|
+
thread_safe { loaded_plugins }
|
51
|
+
end
|
52
|
+
|
53
|
+
# @param block [Block]
|
54
|
+
# @return [Enumerable]
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
# @since 2.2.0
|
58
|
+
def each(&block)
|
59
|
+
thread_safe { iterate(&block) }
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# @return [Hash]
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
# @since 2.2.0
|
68
|
+
attr_reader :plugin_set
|
69
|
+
|
70
|
+
# @return [Mutex]
|
71
|
+
#
|
72
|
+
# @api private
|
73
|
+
# @since 2.2.0
|
74
|
+
attr_reader :access_lock
|
75
|
+
|
76
|
+
# @return [void]
|
77
|
+
#
|
78
|
+
# @api private
|
79
|
+
# @since 2.2.0
|
80
|
+
def thread_safe
|
81
|
+
access_lock.synchronize { yield if block_given? }
|
82
|
+
end
|
83
|
+
|
84
|
+
# @return [Array<String>]
|
85
|
+
#
|
86
|
+
# @api private
|
87
|
+
# @since 2.2.0
|
88
|
+
def plugin_names
|
89
|
+
plugin_set.keys
|
90
|
+
end
|
91
|
+
|
92
|
+
# @param block [Block]
|
93
|
+
# @return [Enumerable]
|
94
|
+
#
|
95
|
+
# @api private
|
96
|
+
# @since 2.2.0
|
97
|
+
def iterate(&block)
|
98
|
+
block_given? ? plugin_set.each_pair(&block) : plugin_set.each_pair
|
99
|
+
end
|
100
|
+
|
101
|
+
# @param plugin_name [String]
|
102
|
+
# @return [Boolean]
|
103
|
+
#
|
104
|
+
# @api private
|
105
|
+
# @since 2.2.0
|
106
|
+
def registered?(plugin_name)
|
107
|
+
plugin_set.key?(plugin_name)
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [Array<TableSync::Plugins::Abstract>]
|
111
|
+
#
|
112
|
+
# @api private
|
113
|
+
# @since 2.2.0
|
114
|
+
def loaded_plugins
|
115
|
+
plugin_set.select { |_plugin_name, plugin_module| plugin_module.loaded? }
|
116
|
+
end
|
117
|
+
|
118
|
+
# @param plugin_name [Symbol, String]
|
119
|
+
# @param plugin_module [TableSync::Plugins::Abstract]
|
120
|
+
# @return [void]
|
121
|
+
#
|
122
|
+
# @raise [TableSync::AlreadyRegisteredPluginError]
|
123
|
+
#
|
124
|
+
# @api private
|
125
|
+
# @since 2.2.0
|
126
|
+
def apply(plugin_name, plugin_module)
|
127
|
+
plugin_name = indifferently_accessible_plugin_name(plugin_name)
|
128
|
+
raise(TableSync::AlreadyRegisteredPluginError.new(plugin_name)) if registered?(plugin_name)
|
129
|
+
plugin_set[plugin_name] = plugin_module
|
130
|
+
end
|
131
|
+
|
132
|
+
# @param plugin_name [Symbol, String]
|
133
|
+
# @return [TableSync::Plugins::Abstract]
|
134
|
+
#
|
135
|
+
# @raise [TableSync::UnregisteredPluginError]
|
136
|
+
#
|
137
|
+
# @api private
|
138
|
+
# @since 2.2.0
|
139
|
+
def fetch(plugin_name)
|
140
|
+
plugin_name = indifferently_accessible_plugin_name(plugin_name)
|
141
|
+
raise(TableSync::UnregisteredPluginError.new(plugin_name)) unless registered?(plugin_name)
|
142
|
+
plugin_set[plugin_name]
|
143
|
+
end
|
144
|
+
|
145
|
+
# @param key [Symbol, String]
|
146
|
+
# @return [String]
|
147
|
+
#
|
148
|
+
# @api private
|
149
|
+
# @since 2.2.0
|
150
|
+
def indifferently_accessible_plugin_name(plugin_name)
|
151
|
+
plugin_name.to_s
|
152
|
+
end
|
153
|
+
end
|
data/lib/table_sync/version.rb
CHANGED
data/table_sync.gemspec
CHANGED
@@ -5,7 +5,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require "table_sync/version"
|
6
6
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
|
-
spec.required_ruby_version = ">= 2.
|
8
|
+
spec.required_ruby_version = ">= 2.5.6"
|
9
9
|
|
10
10
|
spec.name = "table_sync"
|
11
11
|
spec.version = TableSync::VERSION
|
@@ -32,11 +32,11 @@ Gem::Specification.new do |spec|
|
|
32
32
|
|
33
33
|
spec.add_development_dependency "coveralls", "~> 0.8"
|
34
34
|
spec.add_development_dependency "rspec", "~> 3.8"
|
35
|
-
spec.add_development_dependency "rubocop-config-umbrellio", "~> 0.
|
35
|
+
spec.add_development_dependency "rubocop-config-umbrellio", "~> 0.81"
|
36
36
|
spec.add_development_dependency "simplecov", "~> 0.16"
|
37
37
|
|
38
|
-
spec.add_development_dependency "activejob", ">=
|
39
|
-
spec.add_development_dependency "activerecord"
|
38
|
+
spec.add_development_dependency "activejob", ">= 6.0"
|
39
|
+
spec.add_development_dependency "activerecord", ">= 6.0"
|
40
40
|
spec.add_development_dependency "pg", "~> 0.18"
|
41
41
|
spec.add_development_dependency "sequel"
|
42
42
|
spec.add_development_dependency "timecop"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table_sync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Umbrellio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: memery
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0.
|
89
|
+
version: '0.81'
|
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: '0.
|
96
|
+
version: '0.81'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: simplecov
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,28 +114,28 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version:
|
117
|
+
version: '6.0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ">="
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version:
|
124
|
+
version: '6.0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: activerecord
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - ">="
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
131
|
+
version: '6.0'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
138
|
+
version: '6.0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: pg
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -248,11 +248,13 @@ files:
|
|
248
248
|
- ".travis.yml"
|
249
249
|
- CHANGELOG.md
|
250
250
|
- Gemfile
|
251
|
+
- Gemfile.lock
|
251
252
|
- LICENSE.md
|
252
253
|
- README.md
|
253
254
|
- Rakefile
|
254
255
|
- bin/console
|
255
256
|
- bin/setup
|
257
|
+
- docs/development.md
|
256
258
|
- docs/synopsis.md
|
257
259
|
- lib/table_sync.rb
|
258
260
|
- lib/table_sync/base_publisher.rb
|
@@ -275,6 +277,10 @@ files:
|
|
275
277
|
- lib/table_sync/naming_resolver/sequel.rb
|
276
278
|
- lib/table_sync/orm_adapter/active_record.rb
|
277
279
|
- lib/table_sync/orm_adapter/sequel.rb
|
280
|
+
- lib/table_sync/plugins.rb
|
281
|
+
- lib/table_sync/plugins/abstract.rb
|
282
|
+
- lib/table_sync/plugins/access_mixin.rb
|
283
|
+
- lib/table_sync/plugins/registry.rb
|
278
284
|
- lib/table_sync/publisher.rb
|
279
285
|
- lib/table_sync/receiving_handler.rb
|
280
286
|
- lib/table_sync/version.rb
|
@@ -292,14 +298,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
292
298
|
requirements:
|
293
299
|
- - ">="
|
294
300
|
- !ruby/object:Gem::Version
|
295
|
-
version: 2.
|
301
|
+
version: 2.5.6
|
296
302
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
297
303
|
requirements:
|
298
304
|
- - ">="
|
299
305
|
- !ruby/object:Gem::Version
|
300
306
|
version: '0'
|
301
307
|
requirements: []
|
302
|
-
rubygems_version: 3.
|
308
|
+
rubygems_version: 3.1.2
|
303
309
|
signing_key:
|
304
310
|
specification_version: 4
|
305
311
|
summary: DB Table synchronization between microservices based on Model's event system
|