table_sync 1.11.0 → 1.12.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/CHANGELOG.md +4 -0
- data/docs/synopsis.md +2 -1
- data/lib/table_sync/batch_publisher.rb +3 -1
- data/lib/table_sync/config.rb +15 -4
- data/lib/table_sync/instrument_adapter/active_support.rb +2 -1
- data/lib/table_sync/model/active_record.rb +10 -17
- data/lib/table_sync/model/sequel.rb +8 -3
- data/lib/table_sync/naming_resolver/active_record.rb +25 -0
- data/lib/table_sync/naming_resolver/sequel.rb +23 -0
- data/lib/table_sync/orm_adapter/active_record.rb +4 -4
- data/lib/table_sync/orm_adapter/sequel.rb +4 -4
- data/lib/table_sync/publisher.rb +2 -1
- data/lib/table_sync/version.rb +1 -1
- data/lib/table_sync.rb +2 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 703130e1a092c3fdff5a5ada5c83d10371a33ee7f4f45c770e9c4dd48fe20c1d
|
4
|
+
data.tar.gz: 1bc7d081106b6aeb2544f504485ec62a6e5eb7a6c6eb6e2d06aa48413d43cdfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efb76a18e1c8d417a73114953a08901add1c282876747dd550d4ee3c7705881fa77f9394cb152e3efe9de404090ebf716ddd69f9f73a013615498b0e7bcdef0c
|
7
|
+
data.tar.gz: 98f5481ee75be205f2e27938c46ebf82b54ede70248fd052a4ef5bce3a14bf574171364485d1e1d465b42801b0a820e55b3d1f3ae5f920497f92d4488351c911
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# Changelog
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [1.12.0] - 2019-09-20
|
5
|
+
### Changed
|
6
|
+
- Payload for existing ActiveSupport adapter contains both `table` and `schema` fields now.
|
7
|
+
|
4
8
|
## [1.11.0] - 2019-09-11
|
5
9
|
### Added
|
6
10
|
- Receiving: inconsistent events raises `TableSync::UnprovidedEventTargetKeysError`
|
data/docs/synopsis.md
CHANGED
@@ -276,13 +276,14 @@ Types of events available:
|
|
276
276
|
`"tablesync.receive.update"`, `"tablesync.receive.destroy"`, `"tablesync.publish.update"`
|
277
277
|
and `"tablesync.publish.destroy"`.
|
278
278
|
|
279
|
-
You have access to the payload, which contains `event`, `direction`, `table` and `count`.
|
279
|
+
You have access to the payload, which contains `event`, `direction`, `table`, `schema` and `count`.
|
280
280
|
|
281
281
|
```
|
282
282
|
{
|
283
283
|
:event => :update, # one of update / destroy
|
284
284
|
:direction => :publish, # one of publish / receive
|
285
285
|
:table => "users",
|
286
|
+
:schema => "public",
|
286
287
|
:count => 1
|
287
288
|
}
|
288
289
|
```
|
@@ -19,7 +19,9 @@ class TableSync::BatchPublisher < TableSync::BasePublisher
|
|
19
19
|
return unless need_publish?
|
20
20
|
Rabbit.publish(params)
|
21
21
|
|
22
|
-
|
22
|
+
model_naming = TableSync.orm.model_naming(object_class)
|
23
|
+
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
24
|
+
event: event,
|
23
25
|
count: publishing_data[:attributes].size, direction: :publish
|
24
26
|
end
|
25
27
|
|
data/lib/table_sync/config.rb
CHANGED
@@ -10,6 +10,7 @@ module TableSync
|
|
10
10
|
|
11
11
|
@callback_registry = CallbackRegistry.new
|
12
12
|
|
13
|
+
# initialize default options
|
13
14
|
only(model.columns)
|
14
15
|
mapping_overrides({})
|
15
16
|
additional_data({})
|
@@ -21,23 +22,33 @@ module TableSync
|
|
21
22
|
target_keys(model.primary_keys)
|
22
23
|
end
|
23
24
|
|
24
|
-
# add_option implements
|
25
|
+
# add_option implements the following logic
|
25
26
|
# config.option - get value
|
26
27
|
# config.option(args) - set static value
|
27
28
|
# config.option { ... } - set proc as value
|
28
29
|
def self.add_option(name, &option_block)
|
29
30
|
ivar = "@#{name}".to_sym
|
30
31
|
|
32
|
+
# default option handler (empty handler)
|
33
|
+
# handles values when setting options
|
31
34
|
option_block ||= proc { |value| value }
|
32
35
|
|
33
36
|
define_method(name) do |*args, &block|
|
34
|
-
|
37
|
+
# logic for each option
|
38
|
+
if args.empty? && block.nil? # case for config.option, just return ivar
|
35
39
|
instance_variable_get(ivar)
|
36
|
-
elsif block
|
40
|
+
elsif block # case for config.option { ... }
|
41
|
+
# get named parameters (parameters with :keyreq) from proc-value
|
37
42
|
params = block.parameters.map { |param| param[0] == :keyreq ? param[1] : nil }.compact
|
43
|
+
|
44
|
+
# wrapper for proc-value, this wrapper receives all params (model, version, project_id...)
|
45
|
+
# and filters them for proc-value
|
38
46
|
unified_block = proc { |hash = {}| block.call(hash.slice(*params)) }
|
47
|
+
|
48
|
+
# set wrapped proc-value as ivar value
|
39
49
|
instance_variable_set(ivar, unified_block)
|
40
|
-
else
|
50
|
+
else # case for config.option(args)
|
51
|
+
# call option_block with args as params and set ivar to result
|
41
52
|
instance_variable_set(ivar, instance_exec(*args, &option_block))
|
42
53
|
end
|
43
54
|
end
|
@@ -4,10 +4,11 @@ module TableSync::InstrumentAdapter
|
|
4
4
|
module ActiveSupport
|
5
5
|
module_function
|
6
6
|
|
7
|
-
def notify(table:, event:, direction:, count: 1)
|
7
|
+
def notify(table:, schema:, event:, direction:, count: 1)
|
8
8
|
::ActiveSupport::Notifications.instrument "tablesync.#{direction}.#{event}",
|
9
9
|
count: count,
|
10
10
|
table: table.to_s,
|
11
|
+
schema: schema.to_s,
|
11
12
|
event: event,
|
12
13
|
direction: direction
|
13
14
|
end
|
@@ -45,8 +45,8 @@ module TableSync::Model
|
|
45
45
|
AND kcu.constraint_name = tc.constraint_name
|
46
46
|
WHERE
|
47
47
|
t.table_schema NOT IN ('pg_catalog', 'information_schema')
|
48
|
-
AND t.table_schema = '#{
|
49
|
-
AND t.table_name = '#{
|
48
|
+
AND t.table_schema = '#{model_naming.schema}'
|
49
|
+
AND t.table_name = '#{model_naming.table}'
|
50
50
|
ORDER BY
|
51
51
|
kcu.ordinal_position
|
52
52
|
SQL
|
@@ -74,9 +74,8 @@ module TableSync::Model
|
|
74
74
|
end.compact
|
75
75
|
end
|
76
76
|
|
77
|
-
TableSync::Instrument.notify(
|
78
|
-
|
79
|
-
)
|
77
|
+
TableSync::Instrument.notify(table: model_naming.table, schema: model_naming.schema,
|
78
|
+
event: :update, count: result.count, direction: :receive)
|
80
79
|
|
81
80
|
result
|
82
81
|
end
|
@@ -88,7 +87,8 @@ module TableSync::Model
|
|
88
87
|
end
|
89
88
|
|
90
89
|
TableSync::Instrument.notify(
|
91
|
-
table:
|
90
|
+
table: model_naming.table, schema: model_naming.schema,
|
91
|
+
event: :destroy, count: result.count, direction: :receive
|
92
92
|
)
|
93
93
|
|
94
94
|
result
|
@@ -106,21 +106,14 @@ module TableSync::Model
|
|
106
106
|
|
107
107
|
attr_reader :raw_model
|
108
108
|
|
109
|
-
def table_info
|
110
|
-
keys = raw_model.table_name.split(".")
|
111
|
-
name = keys[-1]
|
112
|
-
schema = keys[-2] || "public"
|
113
|
-
{ schema: schema, name: name }
|
114
|
-
end
|
115
|
-
|
116
|
-
def table_name
|
117
|
-
table_info[:name]
|
118
|
-
end
|
119
|
-
|
120
109
|
def db
|
121
110
|
@raw_model.connection
|
122
111
|
end
|
123
112
|
|
113
|
+
def model_naming
|
114
|
+
::TableSync::NamingResolver::ActiveRecord.new(table_name: raw_model.table_name)
|
115
|
+
end
|
116
|
+
|
124
117
|
def row_to_hash(row)
|
125
118
|
row.attributes.each_with_object({}) { |(k, v), o| o[k.to_sym] = v }
|
126
119
|
end
|
@@ -36,14 +36,15 @@ module TableSync::Model
|
|
36
36
|
)
|
37
37
|
.multi_insert(insert_data)
|
38
38
|
|
39
|
-
TableSync::Instrument.notify table:
|
40
|
-
event: :update, direction: :receive
|
39
|
+
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
40
|
+
count: result.count, event: :update, direction: :receive
|
41
41
|
result
|
42
42
|
end
|
43
43
|
|
44
44
|
def destroy(data)
|
45
45
|
result = dataset.returning.where(data).delete
|
46
|
-
TableSync::Instrument.notify table:
|
46
|
+
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
47
|
+
count: result.count,
|
47
48
|
event: :destroy, direction: :receive
|
48
49
|
result
|
49
50
|
end
|
@@ -64,6 +65,10 @@ module TableSync::Model
|
|
64
65
|
raw_model.table_name
|
65
66
|
end
|
66
67
|
|
68
|
+
def model_naming
|
69
|
+
::TableSync::NamingResolver::Sequel.new(table_name: table_name, db: db)
|
70
|
+
end
|
71
|
+
|
67
72
|
def dataset
|
68
73
|
raw_model.dataset
|
69
74
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TableSync::NamingResolver
|
4
|
+
class ActiveRecord
|
5
|
+
def initialize(table_name:)
|
6
|
+
@table_name = table_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def table
|
10
|
+
meta_data.last
|
11
|
+
end
|
12
|
+
|
13
|
+
def schema
|
14
|
+
meta_data.size > 1 ? meta_data[-2] : "public"
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
attr_reader :table_name
|
20
|
+
|
21
|
+
def meta_data
|
22
|
+
table_name.to_s.split "."
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TableSync::NamingResolver
|
4
|
+
class Sequel
|
5
|
+
def initialize(table_name:, db:)
|
6
|
+
@table_name = table_name
|
7
|
+
@db = db
|
8
|
+
end
|
9
|
+
|
10
|
+
def table
|
11
|
+
table_name.is_a?(::Sequel::SQL::QualifiedIdentifier) ? table_name.column : table_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def schema
|
15
|
+
return table_name.table if table_name.is_a?(::Sequel::SQL::QualifiedIdentifier)
|
16
|
+
db.get(Sequel.function("current_schema")) rescue "public"
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :table_name, :db
|
22
|
+
end
|
23
|
+
end
|
@@ -8,6 +8,10 @@ module TableSync::ORMAdapter
|
|
8
8
|
::TableSync::Model::ActiveRecord
|
9
9
|
end
|
10
10
|
|
11
|
+
def model_naming(object)
|
12
|
+
::TableSync::NamingResolver::ActiveRecord.new(table_name: object.table_name)
|
13
|
+
end
|
14
|
+
|
11
15
|
def find(dataset, conditions)
|
12
16
|
dataset.find_by(conditions)
|
13
17
|
end
|
@@ -16,10 +20,6 @@ module TableSync::ORMAdapter
|
|
16
20
|
object.attributes
|
17
21
|
end
|
18
22
|
|
19
|
-
def table_name(object)
|
20
|
-
object.table_name
|
21
|
-
end
|
22
|
-
|
23
23
|
def setup_sync(klass, **opts)
|
24
24
|
debounce_time = opts.delete(:debounce_time)
|
25
25
|
|
@@ -8,6 +8,10 @@ module TableSync::ORMAdapter
|
|
8
8
|
::TableSync::Model::Sequel
|
9
9
|
end
|
10
10
|
|
11
|
+
def model_naming(object)
|
12
|
+
::TableSync::NamingResolver::Sequel.new(table_name: object.table_name, db: object.db)
|
13
|
+
end
|
14
|
+
|
11
15
|
def find(dataset, conditions)
|
12
16
|
dataset.find(conditions)
|
13
17
|
end
|
@@ -16,10 +20,6 @@ module TableSync::ORMAdapter
|
|
16
20
|
object.values
|
17
21
|
end
|
18
22
|
|
19
|
-
def table_name(object)
|
20
|
-
object.table_name
|
21
|
-
end
|
22
|
-
|
23
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)
|
data/lib/table_sync/publisher.rb
CHANGED
@@ -34,7 +34,8 @@ class TableSync::Publisher < TableSync::BasePublisher
|
|
34
34
|
return if !object && !destroyed?
|
35
35
|
|
36
36
|
Rabbit.publish(params)
|
37
|
-
|
37
|
+
model_naming = TableSync.orm.model_naming(object_class)
|
38
|
+
TableSync::Instrument.notify table: model_naming.table, schema: model_naming.schema,
|
38
39
|
event: event, direction: :publish
|
39
40
|
end
|
40
41
|
|
data/lib/table_sync/version.rb
CHANGED
data/lib/table_sync.rb
CHANGED
@@ -24,6 +24,8 @@ module TableSync
|
|
24
24
|
require_relative "./table_sync/model/sequel"
|
25
25
|
require_relative "./table_sync/instrument"
|
26
26
|
require_relative "./table_sync/instrument_adapter/active_support"
|
27
|
+
require_relative "./table_sync/naming_resolver/active_record"
|
28
|
+
require_relative "./table_sync/naming_resolver/sequel"
|
27
29
|
|
28
30
|
class << self
|
29
31
|
include Memery
|
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: 1.
|
4
|
+
version: 1.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Umbrellio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: memery
|
@@ -267,6 +267,8 @@ files:
|
|
267
267
|
- lib/table_sync/instrument_adapter/active_support.rb
|
268
268
|
- lib/table_sync/model/active_record.rb
|
269
269
|
- lib/table_sync/model/sequel.rb
|
270
|
+
- lib/table_sync/naming_resolver/active_record.rb
|
271
|
+
- lib/table_sync/naming_resolver/sequel.rb
|
270
272
|
- lib/table_sync/orm_adapter/active_record.rb
|
271
273
|
- lib/table_sync/orm_adapter/sequel.rb
|
272
274
|
- lib/table_sync/publisher.rb
|