table_sync 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +8 -0
- data/README.md +1 -0
- data/docs/development.md +43 -0
- data/docs/synopsis.md +2 -4
- data/lib/table_sync.rb +25 -20
- data/lib/table_sync/errors.rb +22 -0
- 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 +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd4c73054274dd89d2a58f98fb0974a4202a78aad3512a9d85e50219ab4dc7b0
|
4
|
+
data.tar.gz: 50f863a5e00336c03c58d19733354d7287db2a66e5c415ff784c23501642331d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8bd844b57952aa85a32324832660b73270a28bce1c3b3a16e8a12bf02d6858531da2d1475f19865e13378b9c355639a17cf37c6f35a0b8067118d423cd9d9825
|
7
|
+
data.tar.gz: 9e5911d3ed2050128d3b7ec63c9e8d3fe1ec8c464026f531cc16a6ad183e739fdd730f1a4890176a2c3194c894f07ffd7a39b12d0e69a54c643aeac6ac021ec8
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [2.2.0] - 2020-04-12
|
5
|
+
### Added
|
6
|
+
- Introduce Plugin ecosystem (**TableSync::Plugins**);
|
7
|
+
|
8
|
+
## [2.1.1] - 2020-04-10
|
9
|
+
### Fixed
|
10
|
+
- Updated docs for batch_publishing to fully reflect changes in 2.1.0
|
11
|
+
|
4
12
|
## [2.1.0] - 2020-04-09
|
5
13
|
### Added
|
6
14
|
- **TableSync::BatchPublisher**: custom headers;
|
data/README.md
CHANGED
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
|
|
@@ -123,11 +122,10 @@ TableSync::BatchPublisher.new(
|
|
123
122
|
# Manual publishing with batches (Russian)
|
124
123
|
|
125
124
|
С помощью класса `TableSync::BatchPublisher` вы можете опубликовать изменения батчами (массивом в `attributes`).
|
126
|
-
Пока можно публиковать только следующие изменения в таблице: `создание записи` и `обновление записи`.
|
127
125
|
|
128
126
|
При использовании `TableSync::BatchPublisher`, `TableSync.routing_key_callable` вызывается следующим образом:
|
129
127
|
`TableSync.routing_key_callable.call(klass, {})`, то есть вместо аттрибутов передается пустой хэш.
|
130
|
-
А `TableSync.routing_metadata_callable` не вызывается вовсе: в
|
128
|
+
А `TableSync.routing_metadata_callable` не вызывается вовсе: в метадате устанавливается пустой хэш.
|
131
129
|
|
132
130
|
`TableSync::BatchPublisher.new(object_class, original_attributes_array, **options)`, где `original_attributes_array` - массив с аттрибутами публикуемых объектов и `options`- это хэш с дополнительными опциями.
|
133
131
|
|
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
|
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
|
@@ -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
@@ -32,7 +32,7 @@ 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
38
|
spec.add_development_dependency "activejob", ">= 4.2.11"
|
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: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Umbrellio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-04-
|
11
|
+
date: 2020-04-12 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
|
@@ -253,6 +253,7 @@ files:
|
|
253
253
|
- Rakefile
|
254
254
|
- bin/console
|
255
255
|
- bin/setup
|
256
|
+
- docs/development.md
|
256
257
|
- docs/synopsis.md
|
257
258
|
- lib/table_sync.rb
|
258
259
|
- lib/table_sync/base_publisher.rb
|
@@ -275,6 +276,10 @@ files:
|
|
275
276
|
- lib/table_sync/naming_resolver/sequel.rb
|
276
277
|
- lib/table_sync/orm_adapter/active_record.rb
|
277
278
|
- lib/table_sync/orm_adapter/sequel.rb
|
279
|
+
- lib/table_sync/plugins.rb
|
280
|
+
- lib/table_sync/plugins/abstract.rb
|
281
|
+
- lib/table_sync/plugins/access_mixin.rb
|
282
|
+
- lib/table_sync/plugins/registry.rb
|
278
283
|
- lib/table_sync/publisher.rb
|
279
284
|
- lib/table_sync/receiving_handler.rb
|
280
285
|
- lib/table_sync/version.rb
|