ar_merge 0.2.0 → 0.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.
- data/.travis.yml +13 -0
- data/Appraisals +12 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +19 -13
- data/Rakefile +6 -16
- data/Readme.md +22 -16
- data/gemfiles/activerecord_2.3.gemfile +12 -0
- data/gemfiles/activerecord_2.3.gemfile.lock +39 -0
- data/gemfiles/activerecord_3.2.gemfile +12 -0
- data/gemfiles/activerecord_3.2.gemfile.lock +52 -0
- data/gemfiles/activerecord_4.0.gemfile +12 -0
- data/gemfiles/activerecord_4.0.gemfile.lock +60 -0
- data/lib/ar_merge.rb +3 -7
- data/lib/ar_merge/version.rb +1 -1
- data/spec/ar_merge_spec.rb +10 -2
- data/spec/setup_test_model.rb +4 -5
- metadata +13 -6
- data/init.rb +0 -1
data/.travis.yml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
rvm:
|
2
|
+
- 1.8.7
|
3
|
+
- 1.9.3
|
4
|
+
- 2.0
|
5
|
+
gemfile:
|
6
|
+
- gemfiles/activerecord_2.3.gemfile
|
7
|
+
- gemfiles/activerecord_3.2.gemfile
|
8
|
+
- gemfiles/activerecord_4.0.gemfile
|
9
|
+
matrix:
|
10
|
+
exclude:
|
11
|
+
- rvm: 2.0
|
12
|
+
gemfile: gemfiles/activerecord-2.3.gemfile
|
13
|
+
script: "rake spec"
|
data/Appraisals
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
appraise "activerecord_2.3" do
|
2
|
+
gem 'activerecord', '~> 2.3.18', :require => "active_record"
|
3
|
+
end
|
4
|
+
|
5
|
+
appraise "activerecord_3.2" do
|
6
|
+
gem 'activerecord', '~> 3.2.1', :require => "active_record"
|
7
|
+
end
|
8
|
+
|
9
|
+
appraise "activerecord_4.0" do
|
10
|
+
gem 'activerecord', '4.0.0.rc1', :require => "active_record"
|
11
|
+
end
|
12
|
+
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,28 +1,32 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ar_merge (0.
|
4
|
+
ar_merge (0.3.0)
|
5
5
|
activerecord
|
6
6
|
|
7
7
|
GEM
|
8
|
-
remote:
|
8
|
+
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (3.2.
|
11
|
-
activesupport (= 3.2.
|
10
|
+
activemodel (3.2.13)
|
11
|
+
activesupport (= 3.2.13)
|
12
12
|
builder (~> 3.0.0)
|
13
|
-
activerecord (3.2.
|
14
|
-
activemodel (= 3.2.
|
15
|
-
activesupport (= 3.2.
|
13
|
+
activerecord (3.2.13)
|
14
|
+
activemodel (= 3.2.13)
|
15
|
+
activesupport (= 3.2.13)
|
16
16
|
arel (~> 3.0.2)
|
17
17
|
tzinfo (~> 0.3.29)
|
18
|
-
activesupport (3.2.
|
19
|
-
i18n (
|
18
|
+
activesupport (3.2.13)
|
19
|
+
i18n (= 0.6.1)
|
20
20
|
multi_json (~> 1.0)
|
21
|
+
appraisal (0.5.2)
|
22
|
+
bundler
|
23
|
+
rake
|
21
24
|
arel (3.0.2)
|
22
|
-
builder (3.0.
|
25
|
+
builder (3.0.4)
|
26
|
+
bump (0.4.1)
|
23
27
|
diff-lcs (1.1.3)
|
24
|
-
i18n (0.6.
|
25
|
-
multi_json (1.3
|
28
|
+
i18n (0.6.1)
|
29
|
+
multi_json (1.7.3)
|
26
30
|
rake (0.9.2.2)
|
27
31
|
rspec (2.9.0)
|
28
32
|
rspec-core (~> 2.9.0)
|
@@ -33,13 +37,15 @@ GEM
|
|
33
37
|
diff-lcs (~> 1.1.3)
|
34
38
|
rspec-mocks (2.9.0)
|
35
39
|
sqlite3 (1.3.6)
|
36
|
-
tzinfo (0.3.
|
40
|
+
tzinfo (0.3.37)
|
37
41
|
|
38
42
|
PLATFORMS
|
39
43
|
ruby
|
40
44
|
|
41
45
|
DEPENDENCIES
|
46
|
+
appraisal
|
42
47
|
ar_merge!
|
48
|
+
bump
|
43
49
|
rake
|
44
50
|
rspec (~> 2)
|
45
51
|
sqlite3
|
data/Rakefile
CHANGED
@@ -1,22 +1,12 @@
|
|
1
|
+
require 'bundler/setup'
|
1
2
|
require 'bundler/gem_tasks'
|
3
|
+
require 'appraisal'
|
4
|
+
require 'bump/tasks'
|
2
5
|
|
3
|
-
task :
|
6
|
+
task :spec do
|
4
7
|
sh "rspec spec/"
|
5
8
|
end
|
6
9
|
|
7
|
-
|
8
|
-
|
9
|
-
sh "git status | grep 'nothing to commit'" # ensure we are not dirty
|
10
|
-
index = ['major', 'minor','patch'].index(t.name.split(':').last)
|
11
|
-
file = 'lib/ar_merge/version.rb'
|
12
|
-
|
13
|
-
version_file = File.read(file)
|
14
|
-
old_version, *version_parts = version_file.match(/(\d+)\.(\d+)\.(\d+)/).to_a
|
15
|
-
version_parts[index] = version_parts[index].to_i + 1
|
16
|
-
version_parts[2] = 0 if index < 2 # remove patch for minor
|
17
|
-
version_parts[1] = 0 if index < 1 # remove minor for major
|
18
|
-
new_version = version_parts * '.'
|
19
|
-
File.open(file,'w'){|f| f.write(version_file.sub(old_version, new_version)) }
|
20
|
-
|
21
|
-
sh "bundle && git add #{file} Gemfile.lock && git commit -m 'bump version to #{new_version}'"
|
10
|
+
task :default do
|
11
|
+
sh "bundle exec rake appraisal:install && bundle exec rake appraisal spec"
|
22
12
|
end
|
data/Readme.md
CHANGED
@@ -4,40 +4,46 @@
|
|
4
4
|
- Keeps counters valid
|
5
5
|
- Removes merged record
|
6
6
|
|
7
|
-
|
8
7
|
INSTALL
|
9
8
|
=======
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
OR Gem
|
16
|
-
|
17
|
-
gem install ar_merge
|
10
|
+
```Bash
|
11
|
+
gem install ar_merge
|
12
|
+
```
|
18
13
|
|
19
14
|
|
20
15
|
USAGE
|
21
16
|
=====
|
22
17
|
Merge from outside the model:
|
23
18
|
|
24
|
-
|
19
|
+
```Ruby
|
20
|
+
user.merge!(other,:attributes=>user.attributes.keys,:associations=>%w[movies friends])`
|
21
|
+
```
|
25
22
|
|
26
23
|
Merge from inside the model
|
27
24
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
25
|
+
```Ruby
|
26
|
+
User < ActiveRecord::Base
|
27
|
+
def merge!(other)
|
28
|
+
super(other,:attributes=>%w[email website])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
```
|
33
32
|
|
34
33
|
Merge duplicates
|
35
34
|
|
36
|
-
|
37
|
-
|
35
|
+
```Ruby
|
36
|
+
#merge all new users, that have the same email
|
37
|
+
User.merge_duplicates!(User.find_all_by_status('new')) , :compare=>:email)
|
38
|
+
```
|
39
|
+
|
40
|
+
TODO
|
41
|
+
====
|
42
|
+
- 1 counter test fails on rails 4 (search for pending)
|
38
43
|
|
39
44
|
AUTHOR
|
40
45
|
======
|
41
46
|
[Michael Grosser](grosser.it)</br>
|
42
47
|
michael@grosser.it</br>
|
48
|
+
[](https://travis-ci.org/grosser/ar_merge)<br/>
|
43
49
|
License: MIT
|
@@ -0,0 +1,39 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/ar_merge
|
3
|
+
specs:
|
4
|
+
ar_merge (0.2.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activerecord (2.3.18)
|
11
|
+
activesupport (= 2.3.18)
|
12
|
+
activesupport (2.3.18)
|
13
|
+
appraisal (0.5.2)
|
14
|
+
bundler
|
15
|
+
rake
|
16
|
+
bump (0.4.1)
|
17
|
+
diff-lcs (1.2.4)
|
18
|
+
rake (10.0.4)
|
19
|
+
rspec (2.13.0)
|
20
|
+
rspec-core (~> 2.13.0)
|
21
|
+
rspec-expectations (~> 2.13.0)
|
22
|
+
rspec-mocks (~> 2.13.0)
|
23
|
+
rspec-core (2.13.1)
|
24
|
+
rspec-expectations (2.13.0)
|
25
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
26
|
+
rspec-mocks (2.13.1)
|
27
|
+
sqlite3 (1.3.7)
|
28
|
+
|
29
|
+
PLATFORMS
|
30
|
+
ruby
|
31
|
+
|
32
|
+
DEPENDENCIES
|
33
|
+
activerecord (~> 2.3.18)
|
34
|
+
appraisal
|
35
|
+
ar_merge!
|
36
|
+
bump
|
37
|
+
rake
|
38
|
+
rspec (~> 2)
|
39
|
+
sqlite3
|
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/ar_merge
|
3
|
+
specs:
|
4
|
+
ar_merge (0.2.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (3.2.13)
|
11
|
+
activesupport (= 3.2.13)
|
12
|
+
builder (~> 3.0.0)
|
13
|
+
activerecord (3.2.13)
|
14
|
+
activemodel (= 3.2.13)
|
15
|
+
activesupport (= 3.2.13)
|
16
|
+
arel (~> 3.0.2)
|
17
|
+
tzinfo (~> 0.3.29)
|
18
|
+
activesupport (3.2.13)
|
19
|
+
i18n (= 0.6.1)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
appraisal (0.5.2)
|
22
|
+
bundler
|
23
|
+
rake
|
24
|
+
arel (3.0.2)
|
25
|
+
builder (3.0.4)
|
26
|
+
bump (0.4.1)
|
27
|
+
diff-lcs (1.2.4)
|
28
|
+
i18n (0.6.1)
|
29
|
+
multi_json (1.7.3)
|
30
|
+
rake (10.0.4)
|
31
|
+
rspec (2.13.0)
|
32
|
+
rspec-core (~> 2.13.0)
|
33
|
+
rspec-expectations (~> 2.13.0)
|
34
|
+
rspec-mocks (~> 2.13.0)
|
35
|
+
rspec-core (2.13.1)
|
36
|
+
rspec-expectations (2.13.0)
|
37
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
38
|
+
rspec-mocks (2.13.1)
|
39
|
+
sqlite3 (1.3.7)
|
40
|
+
tzinfo (0.3.37)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
activerecord (~> 3.2.1)
|
47
|
+
appraisal
|
48
|
+
ar_merge!
|
49
|
+
bump
|
50
|
+
rake
|
51
|
+
rspec (~> 2)
|
52
|
+
sqlite3
|
@@ -0,0 +1,60 @@
|
|
1
|
+
PATH
|
2
|
+
remote: /Users/mgrosser/code/tools/ar_merge
|
3
|
+
specs:
|
4
|
+
ar_merge (0.2.0)
|
5
|
+
activerecord
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
activemodel (4.0.0.rc1)
|
11
|
+
activesupport (= 4.0.0.rc1)
|
12
|
+
builder (~> 3.1.0)
|
13
|
+
activerecord (4.0.0.rc1)
|
14
|
+
activemodel (= 4.0.0.rc1)
|
15
|
+
activerecord-deprecated_finders (~> 1.0.2)
|
16
|
+
activesupport (= 4.0.0.rc1)
|
17
|
+
arel (~> 4.0.0)
|
18
|
+
activerecord-deprecated_finders (1.0.2)
|
19
|
+
activesupport (4.0.0.rc1)
|
20
|
+
i18n (~> 0.6, >= 0.6.4)
|
21
|
+
minitest (~> 4.2)
|
22
|
+
multi_json (~> 1.3)
|
23
|
+
thread_safe (~> 0.1)
|
24
|
+
tzinfo (~> 0.3.37)
|
25
|
+
appraisal (0.5.2)
|
26
|
+
bundler
|
27
|
+
rake
|
28
|
+
arel (4.0.0)
|
29
|
+
atomic (1.1.9)
|
30
|
+
builder (3.1.4)
|
31
|
+
bump (0.4.1)
|
32
|
+
diff-lcs (1.2.4)
|
33
|
+
i18n (0.6.4)
|
34
|
+
minitest (4.7.4)
|
35
|
+
multi_json (1.7.3)
|
36
|
+
rake (10.0.4)
|
37
|
+
rspec (2.13.0)
|
38
|
+
rspec-core (~> 2.13.0)
|
39
|
+
rspec-expectations (~> 2.13.0)
|
40
|
+
rspec-mocks (~> 2.13.0)
|
41
|
+
rspec-core (2.13.1)
|
42
|
+
rspec-expectations (2.13.0)
|
43
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
44
|
+
rspec-mocks (2.13.1)
|
45
|
+
sqlite3 (1.3.7)
|
46
|
+
thread_safe (0.1.0)
|
47
|
+
atomic
|
48
|
+
tzinfo (0.3.37)
|
49
|
+
|
50
|
+
PLATFORMS
|
51
|
+
ruby
|
52
|
+
|
53
|
+
DEPENDENCIES
|
54
|
+
activerecord (= 4.0.0.rc1)
|
55
|
+
appraisal
|
56
|
+
ar_merge!
|
57
|
+
bump
|
58
|
+
rake
|
59
|
+
rspec (~> 2)
|
60
|
+
sqlite3
|
data/lib/ar_merge.rb
CHANGED
@@ -2,11 +2,6 @@ require 'ar_merge/version'
|
|
2
2
|
require 'active_record'
|
3
3
|
|
4
4
|
module ARMerge
|
5
|
-
def self.included(base)
|
6
|
-
base.extend ClassMethods
|
7
|
-
base.send(:include, InstanceMethods)
|
8
|
-
end
|
9
|
-
|
10
5
|
module InstanceMethods
|
11
6
|
def merge!(other, options={})
|
12
7
|
raise "cannot merge wit a new record" if other.new_record?
|
@@ -17,7 +12,7 @@ module ARMerge
|
|
17
12
|
other.send(association_name).each do |associated|
|
18
13
|
send(association_name) << associated
|
19
14
|
end
|
20
|
-
|
15
|
+
|
21
16
|
#update counters, this is very basic/hacky/not secure for customized counters...
|
22
17
|
counter = "#{association_name}_count"
|
23
18
|
next unless other.respond_to?(counter) and respond_to?("#{counter}=")
|
@@ -54,4 +49,5 @@ module ARMerge
|
|
54
49
|
end
|
55
50
|
end
|
56
51
|
|
57
|
-
ActiveRecord::Base.send(:include, ARMerge)
|
52
|
+
ActiveRecord::Base.send(:include, ARMerge::InstanceMethods)
|
53
|
+
ActiveRecord::Base.send(:extend, ARMerge::ClassMethods)
|
data/lib/ar_merge/version.rb
CHANGED
data/spec/ar_merge_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
|
3
3
|
describe ARMerge do
|
4
|
-
describe
|
4
|
+
describe "#merge!" do
|
5
5
|
before do
|
6
6
|
@user = User.create!(:name=>'x')
|
7
7
|
@u2 = User.create!(:name=>'y')
|
@@ -50,6 +50,7 @@ describe ARMerge do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "keeps counters in sync" do
|
53
|
+
pending if ActiveRecord::VERSION::MAJOR == 4
|
53
54
|
user, merged_user = CountingUser.create!, CountingUser.create!
|
54
55
|
user.movies_count.should == 0
|
55
56
|
merged_user.movies << Movie.new
|
@@ -70,7 +71,7 @@ describe ARMerge do
|
|
70
71
|
end
|
71
72
|
end
|
72
73
|
|
73
|
-
describe
|
74
|
+
describe "#merge_duplicates!" do
|
74
75
|
before do
|
75
76
|
@u1 = User.create!(:name=>'a')
|
76
77
|
@u2 = User.create!(:name=>'b')
|
@@ -99,4 +100,11 @@ describe ARMerge do
|
|
99
100
|
it "has a VERSION" do
|
100
101
|
ARMerge::VERSION.should =~ /^\d+\.\d+\.\d+$/
|
101
102
|
end
|
103
|
+
|
104
|
+
it "does not mess up activerecord version" do
|
105
|
+
ARMerge::VERSION.should_not == ActiveRecord::VERSION
|
106
|
+
defined?(ActiveRecord::Version).should == nil
|
107
|
+
defined?(ActiveRecord::Base::Version).should == nil
|
108
|
+
defined?(ActiveRecord::Base::VERSION).should == nil
|
109
|
+
end
|
102
110
|
end
|
data/spec/setup_test_model.rb
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
# connect
|
2
|
-
ActiveRecord::
|
2
|
+
ActiveRecord::Schema.verbose = false
|
3
|
+
ActiveRecord::Base.establish_connection(
|
3
4
|
:adapter => "sqlite3",
|
4
|
-
:database => ":memory:"
|
5
|
-
|
6
|
-
|
7
|
-
ActiveRecord::Base.establish_connection(:test)
|
5
|
+
:database => ":memory:"
|
6
|
+
)
|
8
7
|
|
9
8
|
# create tables
|
10
9
|
ActiveRecord::Schema.define(:version => 1) do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ar_merge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-05-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -33,12 +33,19 @@ executables: []
|
|
33
33
|
extensions: []
|
34
34
|
extra_rdoc_files: []
|
35
35
|
files:
|
36
|
+
- .travis.yml
|
37
|
+
- Appraisals
|
36
38
|
- Gemfile
|
37
39
|
- Gemfile.lock
|
38
40
|
- Rakefile
|
39
41
|
- Readme.md
|
40
42
|
- ar_merge.gemspec
|
41
|
-
-
|
43
|
+
- gemfiles/activerecord_2.3.gemfile
|
44
|
+
- gemfiles/activerecord_2.3.gemfile.lock
|
45
|
+
- gemfiles/activerecord_3.2.gemfile
|
46
|
+
- gemfiles/activerecord_3.2.gemfile.lock
|
47
|
+
- gemfiles/activerecord_4.0.gemfile
|
48
|
+
- gemfiles/activerecord_4.0.gemfile.lock
|
42
49
|
- lib/ar_merge.rb
|
43
50
|
- lib/ar_merge/version.rb
|
44
51
|
- spec/ar_merge_spec.rb
|
@@ -59,7 +66,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
59
66
|
version: '0'
|
60
67
|
segments:
|
61
68
|
- 0
|
62
|
-
hash:
|
69
|
+
hash: -2239147174191176291
|
63
70
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
71
|
none: false
|
65
72
|
requirements:
|
@@ -68,10 +75,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
75
|
version: '0'
|
69
76
|
segments:
|
70
77
|
- 0
|
71
|
-
hash:
|
78
|
+
hash: -2239147174191176291
|
72
79
|
requirements: []
|
73
80
|
rubyforge_project:
|
74
|
-
rubygems_version: 1.8.
|
81
|
+
rubygems_version: 1.8.25
|
75
82
|
signing_key:
|
76
83
|
specification_version: 3
|
77
84
|
summary: Merge 2 ActiveRecords, preserving associations and attributes
|
data/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'ar_merge'
|