synchronisable 1.0.7 → 1.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/synchronisable/templates/create_imports_migration.rb +5 -0
- data/lib/synchronisable/models/import.rb +0 -4
- data/lib/synchronisable/source.rb +24 -9
- data/lib/synchronisable/synchronizer.rb +3 -0
- data/lib/synchronisable/version.rb +1 -1
- data/spec/dummy/app/synchronizers/tournament_synchronizer.rb +1 -0
- data/spec/dummy/db/migrate/20140422135244_create_imports.rb +6 -0
- data/spec/dummy/db/schema.rb +3 -0
- data/spec/models/tournament_spec.rb +18 -0
- data/spec/synchronisable/synchronisable_spec.rb +16 -18
- 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: 97bddcbfca63402c0394e535b25bef1c7d1f8a9e
|
4
|
+
data.tar.gz: cebba95741ae03eec51bfc4ba1c333fd5a8574cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad86504ab1870a6f6f535ae0162093971dacac5c3d38d7208e5495ddd4d52acaacc6181e758246250b99b7c7535b2e9da7cd394c3a882101d84bf5db8b9e02ed
|
7
|
+
data.tar.gz: 7cfdc9b259f064693b096c79555aaa11124114c01bab4a2ffa1a37de9b24d0b97a3752772c0232e0bb138c36d797ea83d9a35f8461051c51225d741436bfeda9
|
@@ -5,17 +5,22 @@ class CreateImports < ActiveRecord::Migration
|
|
5
5
|
t.integer :synchronisable_id, null: false
|
6
6
|
t.text :attrs
|
7
7
|
t.string :remote_id, null: false
|
8
|
+
t.string :unique_id
|
8
9
|
|
9
10
|
t.timestamps
|
10
11
|
end
|
11
12
|
|
12
13
|
add_index :imports, :remote_id
|
13
14
|
add_index :imports, [:synchronisable_type, :synchronisable_id]
|
15
|
+
add_index :imports, [:synchronisable_type, :remote_id]
|
16
|
+
add_index :imports, [:synchronisable_type, :unique_id]
|
14
17
|
end
|
15
18
|
|
16
19
|
def self.down
|
17
20
|
remove_index :imports, :remote_id
|
18
21
|
remove_index :imports, [:synchronisable_type, :synchronisable_id]
|
22
|
+
remove_index :imports, [:synchronisable_type, :remote_id]
|
23
|
+
remove_index :imports, [:synchronisable_type, :unique_id]
|
19
24
|
drop_table :imports
|
20
25
|
end
|
21
26
|
end
|
@@ -10,10 +10,6 @@ module Synchronisable
|
|
10
10
|
scope :with_remote_id, ->(id) { where(remote_id: id.to_s) }
|
11
11
|
scope :with_remote_ids, ->(ids) { where(remote_id: ids.map(&:to_s)) }
|
12
12
|
|
13
|
-
def self.find_by_remote_id(id)
|
14
|
-
with_remote_id(id).first
|
15
|
-
end
|
16
|
-
|
17
13
|
def destroy_with_synchronisable
|
18
14
|
ActiveRecord::Base.transaction do
|
19
15
|
synchronisable.try :destroy
|
@@ -8,9 +8,8 @@ module Synchronisable
|
|
8
8
|
|
9
9
|
attr_accessor :import_record
|
10
10
|
attr_reader :parent_associations, :child_associations
|
11
|
-
attr_reader :model, :remote_attrs, :remote_id,
|
12
|
-
:local_attrs, :import_ids, :parent,
|
13
|
-
:includes, :data
|
11
|
+
attr_reader :model, :remote_attrs, :remote_id, :unique_id,
|
12
|
+
:local_attrs, :import_ids, :parent, :includes, :data
|
14
13
|
|
15
14
|
def initialize(model, parent, includes)
|
16
15
|
@model, @parent, @synchronizer = model, parent, model.synchronizer
|
@@ -39,17 +38,32 @@ module Synchronisable
|
|
39
38
|
@parent_associations = filter_associations(PARENT_ASSOCIATION_KEYS)
|
40
39
|
@child_associations = filter_associations(CHILD_ASSOCIATION_KEYS)
|
41
40
|
|
42
|
-
@
|
43
|
-
|
44
|
-
:synchronisable_type => @model
|
45
|
-
)
|
41
|
+
@unique_id = @local_attrs[@synchronizer.unique_id]
|
42
|
+
@import_record = find_import
|
46
43
|
|
47
44
|
remove_association_keys_from_local_attrs
|
48
|
-
|
49
|
-
# TODO: This should be in Synchronisable::RecordWorker
|
50
45
|
set_belongs_to_parent_foreign_key
|
51
46
|
end
|
52
47
|
|
48
|
+
def find_import
|
49
|
+
(@unique_id.present? && find_import_by_unique_id) ||
|
50
|
+
find_import_by_remote_id
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_import_by_unique_id
|
54
|
+
Import.find_by(
|
55
|
+
unique_id: @unique_id.to_s,
|
56
|
+
synchronisable_type: @model
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def find_import_by_remote_id
|
61
|
+
Import.find_by(
|
62
|
+
remote_id: @remote_id.to_s,
|
63
|
+
synchronisable_type: @model
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
53
67
|
def updatable?
|
54
68
|
import_record.present? &&
|
55
69
|
local_record.present?
|
@@ -62,6 +76,7 @@ module Synchronisable
|
|
62
76
|
def dump_message
|
63
77
|
%Q(
|
64
78
|
remote id: '#{remote_id}',
|
79
|
+
unique_id: '#{unique_id}',
|
65
80
|
remote attributes: #{remote_attrs},
|
66
81
|
local attributes: #{local_attrs}
|
67
82
|
)
|
@@ -18,6 +18,9 @@ module Synchronisable
|
|
18
18
|
# The name of remote `id` attribute.
|
19
19
|
attribute :remote_id, default: :id
|
20
20
|
|
21
|
+
# The unique id to prevent sync of duplicate records.
|
22
|
+
attribute :unique_id
|
23
|
+
|
21
24
|
# Mapping configuration between local model attributes and
|
22
25
|
# its remote counterpart (including id attribute).
|
23
26
|
attribute :mappings, converter: ->(source) {
|
@@ -5,17 +5,23 @@ class CreateImports < ActiveRecord::Migration
|
|
5
5
|
t.integer :synchronisable_id, null: false
|
6
6
|
t.text :attrs
|
7
7
|
t.string :remote_id, null: false
|
8
|
+
t.string :unique_id
|
8
9
|
|
9
10
|
t.timestamps
|
10
11
|
end
|
11
12
|
|
12
13
|
add_index :imports, :remote_id
|
13
14
|
add_index :imports, [:synchronisable_type, :synchronisable_id]
|
15
|
+
add_index :imports, [:synchronisable_type, :remote_id]
|
16
|
+
add_index :imports, [:synchronisable_type, :unique_id]
|
14
17
|
end
|
15
18
|
|
16
19
|
def self.down
|
17
20
|
remove_index :imports, :remote_id
|
18
21
|
remove_index :imports, [:synchronisable_type, :synchronisable_id]
|
22
|
+
remove_index :imports, [:synchronisable_type, :remote_id]
|
23
|
+
remove_index :imports, [:synchronisable_type, :unique_id]
|
19
24
|
drop_table :imports
|
20
25
|
end
|
21
26
|
end
|
27
|
+
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -18,12 +18,15 @@ ActiveRecord::Schema.define(version: 20140609133855) do
|
|
18
18
|
t.integer "synchronisable_id", null: false
|
19
19
|
t.text "attrs"
|
20
20
|
t.string "remote_id", null: false
|
21
|
+
t.string "unique_id"
|
21
22
|
t.datetime "created_at"
|
22
23
|
t.datetime "updated_at"
|
23
24
|
end
|
24
25
|
|
25
26
|
add_index "imports", ["remote_id"], name: "index_imports_on_remote_id"
|
27
|
+
add_index "imports", ["synchronisable_type", "remote_id"], name: "index_imports_on_synchronisable_type_and_remote_id"
|
26
28
|
add_index "imports", ["synchronisable_type", "synchronisable_id"], name: "index_imports_on_synchronisable_type_and_synchronisable_id"
|
29
|
+
add_index "imports", ["synchronisable_type", "unique_id"], name: "index_imports_on_synchronisable_type_and_unique_id"
|
27
30
|
|
28
31
|
create_table "match_players", force: true do |t|
|
29
32
|
t.integer "match_id"
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Tournament do
|
4
|
+
describe 'synchronization' do
|
5
|
+
let!(:remote_attrs) do
|
6
|
+
[
|
7
|
+
build(:remote_tournament, tour_id: '1', eman: 'tour-1'),
|
8
|
+
build(:remote_tournament, tour_id: '2', eman: 'tour-1'),
|
9
|
+
build(:remote_tournament, tour_id: '1', eman: 'tour-2')
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { -> { Tournament.sync(remote_attrs) } }
|
14
|
+
|
15
|
+
it { is_expected.to change { Tournament.count }.by(2) }
|
16
|
+
it { is_expected.to change { Synchronisable::Import.count }.by(2) }
|
17
|
+
end
|
18
|
+
end
|
@@ -12,12 +12,12 @@ describe Synchronisable do
|
|
12
12
|
Synchronisable.models = %w(Match Team)
|
13
13
|
end
|
14
14
|
|
15
|
-
it {
|
16
|
-
it {
|
17
|
-
it {
|
18
|
-
it {
|
15
|
+
it { is_expected.to change { Match.count }.by(1) }
|
16
|
+
it { is_expected.to change { Team.count }.by(2) }
|
17
|
+
it { is_expected.to change { Player.count }.by(4) }
|
18
|
+
it { is_expected.to change { MatchPlayer.count }.by(4) }
|
19
19
|
|
20
|
-
it {
|
20
|
+
it { is_expected.to change { Synchronisable::Import.count }.by(11) }
|
21
21
|
end
|
22
22
|
|
23
23
|
context 'all' do
|
@@ -28,18 +28,16 @@ describe Synchronisable do
|
|
28
28
|
)
|
29
29
|
end
|
30
30
|
|
31
|
-
it {
|
32
|
-
it {
|
33
|
-
it {
|
34
|
-
it {
|
35
|
-
it {
|
36
|
-
it {
|
31
|
+
it { is_expected.to change { Tournament.count }.by(1) }
|
32
|
+
it { is_expected.to change { Stage.count }.by(2) }
|
33
|
+
it { is_expected.to change { Match.count }.by(1) }
|
34
|
+
it { is_expected.to change { Team.count }.by(2) }
|
35
|
+
it { is_expected.to change { MatchPlayer.count }.by(4) }
|
36
|
+
it { is_expected.to change { Player.count }.by(4) }
|
37
37
|
|
38
|
-
it {
|
38
|
+
it { is_expected.to change { Synchronisable::Import.count }.by(14) }
|
39
39
|
end
|
40
40
|
|
41
|
-
# TODO: Left here until :include option is implemented
|
42
|
-
#
|
43
41
|
# context 'when models setting is overriden in method call' do
|
44
42
|
# before :all do
|
45
43
|
# Synchronisable.models = %w(Team Match)
|
@@ -49,11 +47,11 @@ describe Synchronisable do
|
|
49
47
|
# -> { Synchronisable.sync(Match, Player) }
|
50
48
|
# end
|
51
49
|
|
52
|
-
# it {
|
53
|
-
# it {
|
54
|
-
# it {
|
50
|
+
# it { is_expected.to change { Match.count }.by(1) }
|
51
|
+
# it { is_expected.to change { Player.count }.by(22) }
|
52
|
+
# it { is_expected.not_to change { Team.count }.by(2) }
|
55
53
|
|
56
|
-
# it {
|
54
|
+
# it { is_expected.to change { Synchronisable::Import.count }.by(5) }
|
57
55
|
# end
|
58
56
|
end
|
59
57
|
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.0.
|
4
|
+
version: 1.0.8
|
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-07-
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -419,6 +419,7 @@ files:
|
|
419
419
|
- spec/models/match_spec.rb
|
420
420
|
- spec/models/team_group_statistic_spec.rb
|
421
421
|
- spec/models/team_spec.rb
|
422
|
+
- spec/models/tournament_spec.rb
|
422
423
|
- spec/spec_helper.rb
|
423
424
|
- spec/synchronisable/dsl/macro_spec.rb
|
424
425
|
- spec/synchronisable/models/import_spec.rb
|
@@ -544,6 +545,7 @@ test_files:
|
|
544
545
|
- spec/models/match_spec.rb
|
545
546
|
- spec/models/team_group_statistic_spec.rb
|
546
547
|
- spec/models/team_spec.rb
|
548
|
+
- spec/models/tournament_spec.rb
|
547
549
|
- spec/spec_helper.rb
|
548
550
|
- spec/synchronisable/dsl/macro_spec.rb
|
549
551
|
- spec/synchronisable/models/import_spec.rb
|