associationist 0.0.2 → 0.0.3
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/lib/associationist/associations/collection_association.rb +20 -0
- data/lib/associationist/associations/preloader/singular_association.rb +27 -9
- data/lib/associationist/associations/singular_association.rb +28 -4
- data/lib/associationist/builder/collection_association.rb +26 -0
- data/lib/associationist/config.rb +15 -1
- data/lib/associationist/mixin.rb +10 -1
- data/lib/associationist/reflection/collection_reflection.rb +17 -0
- data/lib/associationist/version.rb +1 -1
- metadata +8 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c13e33e027bf5c4f2179768a057f58ec9b9dbebb
|
4
|
+
data.tar.gz: 8bbf078f6efa66a7f50ba4472745b8dbfdf8cfa8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69c81e0b47375b0a1cebd5eac7c294b1f582f04d65f099d99a6c7969d77131b80d2970da2c235cdc96922f57087f7a7d25e6b14530d88e59c0fe481ab85e7a95
|
7
|
+
data.tar.gz: 6701a7aba3615e53fe18045a5db0aa66e9605369a4b91818e9b890b4f8b5a3107663ecdb8ca80d14d872e0c2389700181c8911676c481247cedaa6cce05e1ced
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Associationist
|
2
|
+
module Associations
|
3
|
+
class CollectionAssociation < ::ActiveRecord::Associations::CollectionAssociation
|
4
|
+
def association_scope
|
5
|
+
reflection.config.scope_proc.call(owner)
|
6
|
+
end
|
7
|
+
|
8
|
+
case
|
9
|
+
when ActiveRecord.version < Gem::Version.new('5.2.0')
|
10
|
+
def skip_statement_cache?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
when ActiveRecord.version >= Gem::Version.new('5.2.0')
|
14
|
+
def skip_statement_cache? scope
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,23 +1,41 @@
|
|
1
1
|
module Associationist
|
2
2
|
module Associations
|
3
3
|
module Preloader
|
4
|
-
class SingularAssociation
|
5
|
-
def
|
6
|
-
|
4
|
+
class SingularAssociation
|
5
|
+
def initialize klass, owners, reflection, preload_scope
|
6
|
+
@owners = owners
|
7
|
+
@reflection = reflection
|
7
8
|
end
|
8
9
|
|
10
|
+
def run preloader
|
11
|
+
@reflection.config.preloader_proc.call(@owners).map do |record, value|
|
12
|
+
record.association(@reflection.name).target = value
|
13
|
+
end
|
14
|
+
end
|
9
15
|
end
|
10
16
|
|
11
17
|
end
|
12
18
|
end
|
13
19
|
|
14
20
|
module ActiveRecordPreloaderPatch
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
case
|
22
|
+
when ActiveRecord.version < Gem::Version.new('5.2.0')
|
23
|
+
def preloader_for(reflection, owners, rhs_klass)
|
24
|
+
config = reflection.options[:associationist]
|
25
|
+
if config
|
26
|
+
Associationist::Associations::Preloader::SingularAssociation
|
27
|
+
else
|
28
|
+
super
|
29
|
+
end
|
30
|
+
end
|
31
|
+
when ActiveRecord.version >= Gem::Version.new('5.2.0')
|
32
|
+
def preloader_for(reflection, owners)
|
33
|
+
config = reflection.options[:associationist]
|
34
|
+
if config
|
35
|
+
Associationist::Associations::Preloader::SingularAssociation
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
21
39
|
end
|
22
40
|
end
|
23
41
|
end
|
@@ -1,12 +1,20 @@
|
|
1
1
|
module Associationist
|
2
2
|
module Associations
|
3
3
|
class SingularAssociation < ::ActiveRecord::Associations::SingularAssociation
|
4
|
-
def
|
5
|
-
|
4
|
+
def association_scope
|
5
|
+
if reflection.config.scope_proc
|
6
|
+
reflection.config.scope_proc.call(owner)
|
7
|
+
else
|
8
|
+
raise NotImplementedError
|
9
|
+
end
|
6
10
|
end
|
7
11
|
|
8
12
|
def find_target
|
9
|
-
reflection.config.
|
13
|
+
if reflection.config.scope_proc
|
14
|
+
super
|
15
|
+
else
|
16
|
+
reflection.config.loader_proc.call(owner)
|
17
|
+
end
|
10
18
|
end
|
11
19
|
|
12
20
|
def find_target?
|
@@ -14,7 +22,11 @@ module Associationist
|
|
14
22
|
end
|
15
23
|
|
16
24
|
def klass
|
17
|
-
|
25
|
+
if reflection.config.scope_proc
|
26
|
+
super
|
27
|
+
else
|
28
|
+
Object
|
29
|
+
end
|
18
30
|
end
|
19
31
|
|
20
32
|
def force_reload_reader
|
@@ -22,6 +34,18 @@ module Associationist
|
|
22
34
|
target
|
23
35
|
end
|
24
36
|
|
37
|
+
case
|
38
|
+
when ActiveRecord.version < Gem::Version.new('5.2.0')
|
39
|
+
def skip_statement_cache?
|
40
|
+
true
|
41
|
+
end
|
42
|
+
when ActiveRecord.version >= Gem::Version.new('5.2.0')
|
43
|
+
def skip_statement_cache? scope
|
44
|
+
true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
|
25
49
|
end
|
26
50
|
end
|
27
51
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Associationist
|
2
|
+
module Builder
|
3
|
+
class CollectionAssociation < ::ActiveRecord::Associations::Builder::CollectionAssociation
|
4
|
+
def self.macro
|
5
|
+
:has_many
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.valid_options(options)
|
9
|
+
super + [:associationist]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.valid_dependent_options
|
13
|
+
[:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.create_reflection(model, name, scope, options, extension = nil)
|
17
|
+
raise ArgumentError, "association names must be a Symbol" unless name.kind_of?(Symbol)
|
18
|
+
|
19
|
+
validate_options(options)
|
20
|
+
|
21
|
+
scope = build_scope(scope, extension)
|
22
|
+
Reflection::CollectionReflection.new(name, scope, options, model)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -23,7 +23,21 @@ module Associationist
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def type
|
26
|
-
@config[:type]
|
26
|
+
@config[:type] || :singular
|
27
|
+
end
|
28
|
+
|
29
|
+
def scope_proc
|
30
|
+
@config[:scope]
|
31
|
+
end
|
32
|
+
|
33
|
+
def check
|
34
|
+
if @config[:loader] && @config[:scope]
|
35
|
+
raise "cannot define both loader and scope"
|
36
|
+
end
|
37
|
+
|
38
|
+
if @config[:type] && !@config[:scope]
|
39
|
+
raise "type option only effects when scope defined"
|
40
|
+
end
|
27
41
|
end
|
28
42
|
end
|
29
43
|
end
|
data/lib/associationist/mixin.rb
CHANGED
@@ -6,9 +6,18 @@ module Associationist
|
|
6
6
|
|
7
7
|
def included base
|
8
8
|
config = Config.new @raw_config
|
9
|
+
config.check
|
10
|
+
|
9
11
|
reflection_options = {associationist: config}
|
10
12
|
|
11
|
-
|
13
|
+
case config.type
|
14
|
+
when :singular
|
15
|
+
reflection = Builder::SingularAssociation.build(base, config.name, nil, reflection_options)
|
16
|
+
when :collection
|
17
|
+
reflection = Builder::CollectionAssociation.build(base, config.name, nil, reflection_options)
|
18
|
+
else
|
19
|
+
raise "unknown type #{config.type.inspect}"
|
20
|
+
end
|
12
21
|
::ActiveRecord::Reflection.add_reflection base, config.name, reflection
|
13
22
|
end
|
14
23
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Associationist
|
2
|
+
module Reflection
|
3
|
+
class CollectionReflection < ::ActiveRecord::Reflection::HasManyReflection
|
4
|
+
def association_class
|
5
|
+
Associations::CollectionAssociation
|
6
|
+
end
|
7
|
+
|
8
|
+
def check_eager_loadable!
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
def config
|
13
|
+
options[:associationist]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: associationist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- CicholGricenchos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '5.0'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '6
|
22
|
+
version: '6'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '5.0'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '6
|
32
|
+
version: '6'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: pry
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,11 +94,14 @@ extensions: []
|
|
94
94
|
extra_rdoc_files: []
|
95
95
|
files:
|
96
96
|
- lib/associationist.rb
|
97
|
+
- lib/associationist/associations/collection_association.rb
|
97
98
|
- lib/associationist/associations/preloader/singular_association.rb
|
98
99
|
- lib/associationist/associations/singular_association.rb
|
100
|
+
- lib/associationist/builder/collection_association.rb
|
99
101
|
- lib/associationist/builder/singular_association.rb
|
100
102
|
- lib/associationist/config.rb
|
101
103
|
- lib/associationist/mixin.rb
|
104
|
+
- lib/associationist/reflection/collection_reflection.rb
|
102
105
|
- lib/associationist/reflection/singular_reflection.rb
|
103
106
|
- lib/associationist/version.rb
|
104
107
|
homepage: https://github.com/CicholGricenchos/associationist
|
@@ -121,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
124
|
version: '0'
|
122
125
|
requirements: []
|
123
126
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.5.2.
|
127
|
+
rubygems_version: 2.5.2.3
|
125
128
|
signing_key:
|
126
129
|
specification_version: 4
|
127
130
|
summary: ''
|