relation 0.1.5 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -2
- data/.watchr +1 -1
- data/MIT-LICENSE +1 -1
- data/app/models/dangling.rb +31 -0
- data/app/models/relation.rb +5 -62
- data/app/models/relation_ext.rb +48 -0
- data/lib/relation/version.rb +1 -1
- data/test/relation_ext_test.rb +63 -0
- data/test/relation_test.rb +27 -35
- data/test/support/database.rb +2 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5527b21869e536172e48b7d49e14c6bddeb1f7c522c8c1e9a23005d9a008f635
|
4
|
+
data.tar.gz: ad2d9f23632c38ed4f65ce9e367de6ad051b28f3dfc8de447fe62b07f129d3ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33fcd78c742fbd5c768595b4c4f7badabcdfbb54084acfacf971d603c923f6c746c80ca5cfdd69e4a652680f6c2620dd9bbf059cd0a7738dce05ae7d61bad68c
|
7
|
+
data.tar.gz: 7ec3c167144696171214d1a525a78fed82ad202efc5fe8e2655441f918a748e9f4aaeb321664cfed9576919fad90566d403e61c0851678f5a135c45d82d72d12
|
data/.gitignore
CHANGED
data/.watchr
CHANGED
@@ -16,7 +16,7 @@ end
|
|
16
16
|
|
17
17
|
def run_it(type, file)
|
18
18
|
case type
|
19
|
-
when 'test'; run %Q{ruby -I
|
19
|
+
when 'test'; run %Q{ruby -I test #{file}}
|
20
20
|
# when 'spec'; run %Q{spring rspec -X #{file}}
|
21
21
|
else; puts "#{H} unknown type: #{type}, file: #{file}"
|
22
22
|
end
|
data/MIT-LICENSE
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
# extended Relation: extracts relation from rows
|
2
|
+
class Relation < ActiveRecord::Base
|
3
|
+
|
4
|
+
def self.dangling
|
5
|
+
names = Relation.pluck(:name).uniq
|
6
|
+
models = []
|
7
|
+
names.each { |name|
|
8
|
+
models |= name.split(' ')
|
9
|
+
}
|
10
|
+
hsh = {}
|
11
|
+
models.each { |class_name|
|
12
|
+
klass = class_name.constantize
|
13
|
+
ids = klass.pluck(:id)
|
14
|
+
idx = Relation.where('name like ?', "#{class_name} %").pluck(:x_id)
|
15
|
+
idy = Relation.where('name like ?', "% #{class_name}").pluck(:y_id)
|
16
|
+
arr = (idx | idy) - ids
|
17
|
+
hsh[class_name] = arr if arr.length > 0
|
18
|
+
}
|
19
|
+
hsh
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.remove_dangling(hsh)
|
23
|
+
hsh.each { |name, arr|
|
24
|
+
arr.each { |idx|
|
25
|
+
Relation.where(x_id: idx).where('name like ?', "#{name} %").delete_all
|
26
|
+
Relation.where(y_id: idx).where('name like ?', "% #{name}").delete_all
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/app/models/relation.rb
CHANGED
@@ -1,78 +1,21 @@
|
|
1
1
|
class Relation < ActiveRecord::Base
|
2
2
|
|
3
|
-
def self.
|
4
|
-
name_from, id_from = name_id(row_from)
|
5
|
-
name_to, id_to = name_id(row_to)
|
6
|
-
name = "#{name_from} #{name_to}"
|
3
|
+
def self.add_raw(name, id_from, id_to)
|
7
4
|
hsh = { name: name, x_id: id_from, y_id: id_to }
|
8
|
-
|
9
5
|
Relation.create!(hsh) if Relation.where(hsh).first == nil
|
10
6
|
end
|
11
7
|
|
12
|
-
def self.
|
13
|
-
name_from, id_from = name_id(row_from)
|
14
|
-
name_to, id_to = name_id(row_to)
|
15
|
-
name = "#{name_from} #{name_to}"
|
8
|
+
def self.delete_raw(name, id_from, id_to)
|
16
9
|
hsh = { name: name, x_id: id_from, y_id: id_to }
|
17
10
|
Relation.where(hsh).delete_all
|
18
11
|
end
|
19
12
|
|
20
|
-
def self.
|
21
|
-
klass = kind
|
22
|
-
klass = kind.constantize unless klass.kind_of?(Class)
|
23
|
-
ids = self.references_ids(row, klass)
|
24
|
-
klass.where(id: ids)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.followers(kind, row)
|
28
|
-
klass = kind
|
29
|
-
klass = kind.constantize unless klass.kind_of?(Class)
|
30
|
-
ids = self.followers_ids(klass, row)
|
31
|
-
klass.where(id: ids)
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.dangling
|
35
|
-
names = Relation.pluck(:name).uniq
|
36
|
-
models = []
|
37
|
-
names.each { |name|
|
38
|
-
models |= name.split(' ')
|
39
|
-
}
|
40
|
-
hsh = {}
|
41
|
-
models.each { |class_name|
|
42
|
-
klass = class_name.constantize
|
43
|
-
ids = klass.pluck(:id)
|
44
|
-
idx = Relation.where('name like ?', "#{class_name} %").pluck(:x_id)
|
45
|
-
idy = Relation.where('name like ?', "% #{class_name}").pluck(:y_id)
|
46
|
-
arr = (idx | idy) - ids
|
47
|
-
hsh[class_name] = arr if arr.length > 0
|
48
|
-
}
|
49
|
-
hsh
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.remove_dangling(hsh)
|
53
|
-
hsh.each { |name, arr|
|
54
|
-
arr.each { |idx|
|
55
|
-
Relation.where(x_id: idx).where('name like ?', "#{name} %").delete_all
|
56
|
-
Relation.where(y_id: idx).where('name like ?', "% #{name}").delete_all
|
57
|
-
}
|
58
|
-
}
|
59
|
-
end
|
60
|
-
|
61
|
-
private
|
62
|
-
def self.name_id(resource)
|
63
|
-
raise 'missing resource' unless resource
|
64
|
-
[resource.class.name, resource.id]
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.references_ids(row, klass)
|
68
|
-
name_from, id_from = name_id(row)
|
69
|
-
name = "#{name_from} #{klass.name}"
|
13
|
+
def self.references_raw(name, id_from)
|
70
14
|
Relation.where(name: name, x_id: id_from).pluck(:y_id)
|
71
15
|
end
|
72
16
|
|
73
|
-
def self.
|
74
|
-
name_to, id_to = name_id(row)
|
75
|
-
name = "#{klass.name} #{name_to}"
|
17
|
+
def self.followers_raw(name, id_to)
|
76
18
|
Relation.where(name: name, y_id: id_to).pluck(:x_id)
|
77
19
|
end
|
20
|
+
|
78
21
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# extended Relation: extracts relation from rows
|
2
|
+
class Relation < ActiveRecord::Base
|
3
|
+
|
4
|
+
def self.add(row_from, row_to)
|
5
|
+
hsh = normalize(row_from, row_to)
|
6
|
+
Relation.create!(hsh) if Relation.where(hsh).first == nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.delete(row_from, row_to)
|
10
|
+
hsh = normalize(row_from, row_to)
|
11
|
+
Relation.where(hsh).delete_all
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.references(row, kind)
|
15
|
+
klass, name, id_from = normalize2(kind, row)
|
16
|
+
name = "#{name} #{klass.name}"
|
17
|
+
ids = references_raw(name, id_from)
|
18
|
+
klass.where(id: ids)
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.followers(kind, row)
|
22
|
+
klass, name, id_to = normalize2(kind, row)
|
23
|
+
name = "#{klass.name} #{name}"
|
24
|
+
ids = followers_raw(name, id_to)
|
25
|
+
klass.where(id: ids)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def self.name_id(resource)
|
30
|
+
raise 'missing resource' unless resource
|
31
|
+
[resource.class.name, resource.id]
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.normalize(row_from, row_to)
|
35
|
+
name_from, id_from = name_id(row_from)
|
36
|
+
name_to, id_to = name_id(row_to)
|
37
|
+
name = "#{name_from} #{name_to}"
|
38
|
+
{ name: name, x_id: id_from, y_id: id_to }
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.normalize2(kind, row)
|
42
|
+
klass = kind
|
43
|
+
klass = kind.constantize unless klass.kind_of?(Class)
|
44
|
+
name, id = name_id(row)
|
45
|
+
[klass, name, id]
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/lib/relation/version.rb
CHANGED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe Relation do
|
4
|
+
let(:user) { User.create! name: 'user' }
|
5
|
+
let(:user2) { User.create! name: 'user2' }
|
6
|
+
let(:order) { Order.create! name: 'order' }
|
7
|
+
let(:order2) { Order.create! name: 'order2' }
|
8
|
+
|
9
|
+
def setup
|
10
|
+
DB.setup
|
11
|
+
|
12
|
+
Relation.add user, order
|
13
|
+
Relation.add user2, order
|
14
|
+
Relation.add user2, order2
|
15
|
+
end
|
16
|
+
|
17
|
+
def teardown
|
18
|
+
DB.teardown
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should add a connection" do
|
22
|
+
assert_difference('Relation.count') do
|
23
|
+
Relation.add user2, user
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should delete a connection" do
|
28
|
+
Relation.add user2, user
|
29
|
+
assert_difference('Relation.count', -1) do
|
30
|
+
Relation.delete user2, user
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should return references (using class name)" do
|
35
|
+
arr = Relation.references(user, 'Order')
|
36
|
+
assert_equal [order].sort, arr.sort
|
37
|
+
|
38
|
+
arr = Relation.references(user2, 'Order')
|
39
|
+
assert_equal [order, order2].sort, arr.sort
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return followers (using class name)" do
|
43
|
+
arr = Relation.followers('User', order)
|
44
|
+
assert_equal [user, user2].sort, arr.sort
|
45
|
+
|
46
|
+
arr = Relation.followers('User', order2)
|
47
|
+
assert_equal [user2].sort, arr.sort
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should not add twice the same connection" do
|
51
|
+
assert_difference('Relation.count') do
|
52
|
+
Relation.add user2, user
|
53
|
+
Relation.add user2, user
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should handle unexistent connection" do
|
58
|
+
assert_difference('Relation.count', 0) do
|
59
|
+
Relation.delete user2, user
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/test/relation_test.rb
CHANGED
@@ -1,72 +1,64 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
# testing raw/basic relations
|
3
4
|
describe Relation do
|
4
|
-
let(:
|
5
|
-
let(:
|
6
|
-
let(:
|
7
|
-
let(:
|
5
|
+
let(:u_id) { User.create!(name: 'user').id }
|
6
|
+
let(:u2_id) { User.create!(name: 'user2').id }
|
7
|
+
let(:o_id) { Order.create!(name: 'order').id }
|
8
|
+
let(:o2_id) { Order.create!(name: 'order2').id }
|
9
|
+
let(:unknown_id) { 123456 }
|
8
10
|
|
9
11
|
def setup
|
10
12
|
DB.setup
|
11
13
|
|
12
|
-
Relation.
|
13
|
-
Relation.
|
14
|
-
Relation.
|
14
|
+
Relation.add_raw :rel, u_id, o_id
|
15
|
+
Relation.add_raw :rel, u2_id, o_id
|
16
|
+
Relation.add_raw :rel, u2_id, o2_id
|
15
17
|
end
|
16
18
|
|
17
19
|
def teardown
|
18
20
|
DB.teardown
|
19
21
|
end
|
20
22
|
|
21
|
-
it "should add a
|
23
|
+
it "should add a relation" do
|
22
24
|
assert_difference('Relation.count') do
|
23
|
-
Relation.
|
25
|
+
Relation.add_raw :raw, u2_id, u_id
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
it "should delete a
|
28
|
-
Relation.
|
29
|
+
it "should delete a relation" do
|
30
|
+
Relation.add_raw :raw, u2_id, u_id
|
29
31
|
assert_difference('Relation.count', -1) do
|
30
|
-
Relation.
|
32
|
+
Relation.delete_raw :raw, u2_id, u_id
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
it "should return
|
35
|
-
arr = Relation.
|
36
|
-
assert_equal [
|
36
|
+
it "should return referenced ids" do
|
37
|
+
arr = Relation.references_raw(:rel, u_id)
|
38
|
+
assert_equal [o_id].sort, arr.sort
|
37
39
|
|
38
|
-
arr = Relation.
|
39
|
-
assert_equal [
|
40
|
+
arr = Relation.references_raw(:rel, u2_id)
|
41
|
+
assert_equal [o_id, o2_id].sort, arr.sort
|
40
42
|
end
|
41
43
|
|
42
|
-
it "should return
|
43
|
-
arr = Relation.
|
44
|
-
assert_equal [
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should return followers (using class name)" do
|
48
|
-
arr = Relation.followers('User', order)
|
49
|
-
assert_equal [user, user2].sort, arr.sort
|
50
|
-
|
51
|
-
arr = Relation.followers('User', order2)
|
52
|
-
assert_equal [user2].sort, arr.sort
|
53
|
-
end
|
44
|
+
it "should return followers ids" do
|
45
|
+
arr = Relation.followers_raw(:rel, o_id)
|
46
|
+
assert_equal [u_id, u2_id].sort, arr.sort
|
54
47
|
|
55
|
-
|
56
|
-
|
57
|
-
assert_equal [user, user2].sort, arr.sort
|
48
|
+
arr = Relation.followers_raw(:rel, o2_id)
|
49
|
+
assert_equal [u2_id].sort, arr.sort
|
58
50
|
end
|
59
51
|
|
60
52
|
it "should not add twice the same connection" do
|
61
53
|
assert_difference('Relation.count') do
|
62
|
-
Relation.
|
63
|
-
Relation.
|
54
|
+
Relation.add_raw :rel, u2_id, unknown_id
|
55
|
+
Relation.add_raw :rel, u2_id, unknown_id
|
64
56
|
end
|
65
57
|
end
|
66
58
|
|
67
59
|
it "should handle unexistent connection" do
|
68
60
|
assert_difference('Relation.count', 0) do
|
69
|
-
Relation.
|
61
|
+
Relation.delete_raw :rel, u2_id, unknown_id
|
70
62
|
end
|
71
63
|
end
|
72
64
|
|
data/test/support/database.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: relation
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dittmar Krall
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -127,7 +127,9 @@ files:
|
|
127
127
|
- MIT-LICENSE
|
128
128
|
- README.md
|
129
129
|
- Rakefile
|
130
|
+
- app/models/dangling.rb
|
130
131
|
- app/models/relation.rb
|
132
|
+
- app/models/relation_ext.rb
|
131
133
|
- db/migrate/20150810152808_relation.rb
|
132
134
|
- gemfiles/rails_4.gemfile
|
133
135
|
- gemfiles/rails_5.0.gemfile
|
@@ -136,6 +138,7 @@ files:
|
|
136
138
|
- lib/relation/version.rb
|
137
139
|
- relation.gemspec
|
138
140
|
- test/dangling_test.rb
|
141
|
+
- test/relation_ext_test.rb
|
139
142
|
- test/relation_test.rb
|
140
143
|
- test/support/database.rb
|
141
144
|
- test/test_helper.rb
|