associationist 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b0bc8ea37a255d5c211067c307e3d3631837eadc
4
+ data.tar.gz: 592aed6acd9b5384034cfe8dcd7576b363517696
5
+ SHA512:
6
+ metadata.gz: 48e98734a36878f10ddc314047e60755e12e0d73a619032cccabc29297dbfa8aeae63981460a63b194c19a8f8f2b9e7fe614646d5cdf78b83cfaffb6099fa228
7
+ data.tar.gz: 0d7b9212cff0d47d04d2f4828efccdf35bc80dc1fc28d7009e5c645358bdae3673adf255087067638e992756464507d961782e1705542cf2143120fa1b28c8b8
@@ -0,0 +1,11 @@
1
+ require 'active_record'
2
+
3
+ Dir.glob("#{File.dirname(__FILE__)}/**/*.rb").each do |file|
4
+ require file
5
+ end
6
+
7
+ module Associationist
8
+ def self.preload records, associations
9
+ ActiveRecord::Associations::Preloader.new.preload records, associations
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ module Associationist
2
+ module Associations
3
+ module Preloader
4
+ class SingularAssociation < ActiveRecord::Associations::Preloader::SingularAssociation
5
+ def associated_records_by_owner preloader
6
+ reflection.config.preloader_proc.call(owners).map{|k, v| [k, [v]]}
7
+ end
8
+
9
+ end
10
+
11
+ end
12
+ end
13
+
14
+ module ActiveRecordPreloaderPatch
15
+ def preloader_for(reflection, owners, rhs_klass)
16
+ config = reflection.options[:associationist]
17
+ if config
18
+ Associationist::Associations::Preloader::SingularAssociation
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+
25
+ ActiveRecord::Associations::Preloader.prepend ActiveRecordPreloaderPatch
26
+ end
@@ -0,0 +1,27 @@
1
+ module Associationist
2
+ module Associations
3
+ class SingularAssociation < ::ActiveRecord::Associations::SingularAssociation
4
+ def scope
5
+ raise NotImplementedError
6
+ end
7
+
8
+ def find_target
9
+ reflection.config.loader_proc.call(owner)
10
+ end
11
+
12
+ def find_target?
13
+ !loaded? && !owner.new_record?
14
+ end
15
+
16
+ def klass
17
+ Object
18
+ end
19
+
20
+ def force_reload_reader
21
+ reload
22
+ target
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,33 @@
1
+ module Associationist
2
+ module Builder
3
+ class SingularAssociation < ::ActiveRecord::Associations::Builder::SingularAssociation
4
+ def self.valid_options(options)
5
+ super + [:associationist]
6
+ end
7
+
8
+ def self.define_accessors(model, reflection)
9
+ super
10
+ mixin = model.generated_association_methods
11
+ name = reflection.name
12
+
13
+ define_constructors(mixin, name) if reflection.constructable?
14
+
15
+ mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
16
+ def reload_#{name}
17
+ association(:#{name}).force_reload_reader
18
+ end
19
+ CODE
20
+ end
21
+
22
+ def self.create_reflection(model, name, scope, options, extension = nil)
23
+ raise ArgumentError, "association names must be a Symbol" unless name.kind_of?(Symbol)
24
+
25
+ validate_options(options)
26
+
27
+ scope = build_scope(scope, extension)
28
+ Reflection::SingularReflection.new(name, scope, options, model)
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,29 @@
1
+ module Associationist
2
+ class Config
3
+ def initialize config
4
+ @config = config
5
+ end
6
+
7
+ def name
8
+ @config[:name]
9
+ end
10
+
11
+ def loader_proc
12
+ if @config[:loader]
13
+ @config[:loader]
14
+ elsif preloader_proc
15
+ -> record {
16
+ (preloader_proc.call [record])[record]
17
+ }
18
+ end
19
+ end
20
+
21
+ def preloader_proc
22
+ @config[:preloader]
23
+ end
24
+
25
+ def type
26
+ @config[:type]
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ module Associationist
2
+ class Mixin < Module
3
+ def initialize raw_config
4
+ @raw_config = raw_config
5
+ end
6
+
7
+ def included base
8
+ config = Config.new @raw_config
9
+ reflection_options = {associationist: config}
10
+
11
+ reflection = Builder::SingularAssociation.build(base, config.name, nil, reflection_options)
12
+ ::ActiveRecord::Reflection.add_reflection base, config.name, reflection
13
+ end
14
+
15
+ def inspect
16
+ "#<Associationist::Mixin @name=#{@raw_config[:name].inspect}>"
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ module Associationist
2
+ module Reflection
3
+ class SingularReflection < ::ActiveRecord::Reflection::HasOneReflection
4
+ def association_class
5
+ Associations::SingularAssociation
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
@@ -0,0 +1,3 @@
1
+ module Associationist
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: associationist
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - CicholGricenchos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '5.0'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: pry
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: sqlite3
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: database_cleaner
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: rake
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: ''
90
+ email:
91
+ - cichol@live.cn
92
+ executables: []
93
+ extensions: []
94
+ extra_rdoc_files: []
95
+ files:
96
+ - lib/associationist.rb
97
+ - lib/associationist/associations/preloader/singular_association.rb
98
+ - lib/associationist/associations/singular_association.rb
99
+ - lib/associationist/builder/singular_association.rb
100
+ - lib/associationist/config.rb
101
+ - lib/associationist/mixin.rb
102
+ - lib/associationist/reflection/singular_reflection.rb
103
+ - lib/associationist/version.rb
104
+ homepage: https://github.com/CicholGricenchos/associationist
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.5.2.1
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: ''
128
+ test_files: []