synchronisable 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/synchronisable/context.rb +3 -8
- data/lib/synchronisable/error_handler.rb +18 -11
- data/lib/synchronisable/model/methods.rb +1 -1
- data/lib/synchronisable/source.rb +0 -3
- data/lib/synchronisable/version.rb +1 -1
- data/lib/synchronisable/worker/associations.rb +3 -2
- data/lib/synchronisable.rb +1 -1
- data/spec/dummy/app/synchronizers/stage_synchronizer.rb +4 -0
- data/spec/models/stage_spec.rb +20 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46c5332c053921eb44021c59a846a1451eede185
|
4
|
+
data.tar.gz: d33c7cdb48f1266ebb3737a20c7a6c4b3688b12c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a42307f344f720d63a7519969481e94fffcc9a9010510cf39791ea43b93ad5e64304c80074aa1b5f5133d720fc16cbaf829650dfeb3da50d814efe3608eb72a4
|
7
|
+
data.tar.gz: 7b35e861d0ea8c002d4215b2965713c2c2ebb30f509f24e652f687f95e0237bb69be0dee671aa66fc944f4a714e417a9a4c85f59c1862f6d8f727879b0cff6f9
|
@@ -5,12 +5,12 @@ module Synchronisable
|
|
5
5
|
:before, :after, :deleted
|
6
6
|
|
7
7
|
def initialize(model, parent)
|
8
|
-
@model, @parent
|
8
|
+
@model, @parent = model, parent
|
9
9
|
@errors = []
|
10
10
|
@before, @after, @deleted = 0, 0, 0
|
11
11
|
end
|
12
12
|
|
13
|
-
# @return [String] summary synchronization info
|
13
|
+
# @return [String] summary synchronization info
|
14
14
|
def summary_message
|
15
15
|
msg = I18n.t('messages.result',
|
16
16
|
:model => model,
|
@@ -21,12 +21,7 @@ module Synchronisable
|
|
21
21
|
:errors => errors.count
|
22
22
|
)
|
23
23
|
|
24
|
-
msg << I18n.t(
|
25
|
-
'messages.errors',
|
26
|
-
:errors => errors.join('. ')
|
27
|
-
) if errors.present?
|
28
|
-
|
29
|
-
msg
|
24
|
+
msg << I18n.t('messages.errors', errors: errors.join('. '))
|
30
25
|
end
|
31
26
|
end
|
32
27
|
end
|
@@ -11,31 +11,38 @@ module Synchronisable
|
|
11
11
|
@logger, @context = logger, context
|
12
12
|
end
|
13
13
|
|
14
|
-
# Wraps the given block in transaction
|
15
|
-
#
|
14
|
+
# Wraps the given block in transaction if it's source for a model
|
15
|
+
# on which #sync method was called and not a parent/child association.
|
16
|
+
# Rescued exceptions are written to log and saved to the errors array.
|
16
17
|
#
|
17
18
|
# @param source [Synchronisable::Source] synchronization source
|
18
19
|
#
|
19
20
|
# @return [Boolean] `true` if syncronization was completed
|
20
21
|
# without errors, `false` otherwise
|
21
22
|
def handle(source)
|
22
|
-
|
23
|
+
invoke(source) do
|
23
24
|
yield
|
24
25
|
return true
|
25
|
-
|
26
|
-
|
27
|
-
source.parent ? block.() : ActiveRecord::Base.transaction(&block)
|
26
|
+
end
|
28
27
|
rescue Exception => e
|
29
|
-
|
30
|
-
|
28
|
+
err_msg = error_message(e, source)
|
29
|
+
|
30
|
+
@context.errors << err_msg
|
31
|
+
@logger.error err_msg
|
32
|
+
|
31
33
|
return false
|
32
34
|
end
|
33
35
|
|
34
36
|
private
|
35
37
|
|
36
|
-
|
37
|
-
|
38
|
-
|
38
|
+
# Invokes a given block.
|
39
|
+
# Won't start a new transation if its not a "sync root".
|
40
|
+
def invoke(source, &block)
|
41
|
+
if source.parent
|
42
|
+
block.()
|
43
|
+
else
|
44
|
+
ActiveRecord::Base.transaction(&block)
|
45
|
+
end
|
39
46
|
end
|
40
47
|
|
41
48
|
def error_message(e, source)
|
@@ -42,7 +42,7 @@ module Synchronisable
|
|
42
42
|
# :match_players => :player
|
43
43
|
# })
|
44
44
|
#
|
45
|
-
# @example Here is all possible ways to call #sync
|
45
|
+
# @example Here is all possible ways to call #sync
|
46
46
|
# Model.sync
|
47
47
|
# Model.sync({ :a1 => 1, :a2 => 2 })
|
48
48
|
# Model.sync({ :includes => {...}, :parent => xxx })
|
@@ -22,9 +22,6 @@ module Synchronisable
|
|
22
22
|
# Prepares synchronization source:
|
23
23
|
# `remote_id`, `local_attributes`, `import_record` and `associations`.
|
24
24
|
#
|
25
|
-
# Sets foreign key if current model is specified as `has_one` or `has_many`
|
26
|
-
# association of parent model.
|
27
|
-
#
|
28
25
|
# @api private
|
29
26
|
def prepare(data, remote_attrs)
|
30
27
|
@data = @parent
|
@@ -34,12 +34,13 @@ module Synchronisable
|
|
34
34
|
|
35
35
|
if import_record.nil? || association.force_sync
|
36
36
|
data = @source.data.try(:merge, { id: id }) || id
|
37
|
-
Controller.call(association.model, data, {})
|
37
|
+
Controller.call(association.model, data, { :parent => @source })
|
38
38
|
|
39
39
|
import_record = find_import(id, association)
|
40
40
|
end
|
41
41
|
|
42
|
-
@source.local_attrs[association.key] = import_record
|
42
|
+
@source.local_attrs[association.key] = import_record
|
43
|
+
.try(:synchronisable).try(:id) # yep, it can happen
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
data/lib/synchronisable.rb
CHANGED
@@ -45,7 +45,7 @@ module Synchronisable
|
|
45
45
|
}
|
46
46
|
end
|
47
47
|
|
48
|
-
# Syncs models that
|
48
|
+
# Syncs models that are defined in {Synchronisable#models}
|
49
49
|
#
|
50
50
|
# @param models [Array] array of models that should be synchronized.
|
51
51
|
# This take a precedence over models defined in {Synchronisable#models}.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Stage do
|
4
|
+
describe 'synchronization' do
|
5
|
+
let!(:remote_attrs) do
|
6
|
+
[
|
7
|
+
build(:remote_stage, tour_id: '1', eman: 'ignored'),
|
8
|
+
build(:remote_stage, tour_id: '2'),
|
9
|
+
build(:remote_stage, tour_id: '3')
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'skipping with before_sync hook' do
|
14
|
+
subject { -> { Stage.sync(remote_attrs, :includes => {}) } }
|
15
|
+
|
16
|
+
it { is_expected.to change { Stage.count }.by(2) }
|
17
|
+
it { is_expected.to change { Synchronisable::Import.count }.by(2) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synchronisable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasiliy Yorkin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -417,6 +417,7 @@ files:
|
|
417
417
|
- spec/factories/stadium.rb
|
418
418
|
- spec/factories/team.rb
|
419
419
|
- spec/models/match_spec.rb
|
420
|
+
- spec/models/stage_spec.rb
|
420
421
|
- spec/models/team_group_statistic_spec.rb
|
421
422
|
- spec/models/team_spec.rb
|
422
423
|
- spec/models/tournament_spec.rb
|
@@ -543,6 +544,7 @@ test_files:
|
|
543
544
|
- spec/factories/stadium.rb
|
544
545
|
- spec/factories/team.rb
|
545
546
|
- spec/models/match_spec.rb
|
547
|
+
- spec/models/stage_spec.rb
|
546
548
|
- spec/models/team_group_statistic_spec.rb
|
547
549
|
- spec/models/team_spec.rb
|
548
550
|
- spec/models/tournament_spec.rb
|