active_record-framing 0.1.0.pre.3 → 0.1.0.pre.4
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f02f550ffc7f48015697d04cdc5ad1a54a3693c4c0fcb141500224fc78cfeec7
|
4
|
+
data.tar.gz: 96ef5227beb750c1e6845ecaafd7d11b5dc888f31a96acf29c2a26dde37d544e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e73a79efe0958a13aaf6845cd0ee546bd8dcc7520cbc062f91aa1d7dab36ecd707f1c0f4f454f1b3027369ea1ac74f61112a2167b9507204861478981474785e
|
7
|
+
data.tar.gz: b90c1d6ea6bba1888cc6a19693682409ea553415073ae14c23db7431855d596b86b0cbb1c8edc81e9f9bfa1032d0b6c0545fbd2b056d09408aa36d2c27840fe6
|
@@ -147,21 +147,24 @@ module ActiveRecord
|
|
147
147
|
the_frame = body.respond_to?(:to_proc) ? body : body.method(:call)
|
148
148
|
cte_relation = relation.merge!(relation.instance_exec(&the_frame) || relation)
|
149
149
|
|
150
|
-
# self.const_set constant, Class.new(DelegateClass(self)) do |klass|
|
151
150
|
delegator = self.name.to_sym
|
152
|
-
self.const_set
|
153
|
-
|
154
|
-
|
155
|
-
|
151
|
+
new_class = self.const_set constant, (Class.new(self) do |klass|
|
152
|
+
klass.abstract_class = true
|
153
|
+
klass.table_name = superclass.table_name
|
154
|
+
|
155
|
+
def klass.discriminate_class_for_record(record)
|
156
|
+
superclass.send(:discriminate_class_for_record, record)
|
157
|
+
end
|
156
158
|
|
157
159
|
klass.default_frames = []
|
158
160
|
|
159
|
-
@arel_table =
|
161
|
+
@arel_table = superclass.arel_table.dup.tap do |at|
|
160
162
|
at.name = arel_tn
|
161
163
|
end
|
162
164
|
|
163
|
-
|
164
|
-
|
165
|
+
end)
|
166
|
+
|
167
|
+
new_class.current_frame = new_class.build_frame(cte_relation, &block)
|
165
168
|
|
166
169
|
if dangerous_class_const?(constant)
|
167
170
|
raise ArgumentError, "You tried to define a frame named \"#{constant}\" " \
|
@@ -3,29 +3,44 @@ module ActiveRecord
|
|
3
3
|
module QueryMethods
|
4
4
|
|
5
5
|
if ::ActiveRecord.version >= Gem::Version.new("5.1") # 5.1+
|
6
|
-
|
7
|
-
|
6
|
+
{
|
7
|
+
frames: ::ActiveRecord::Relation::FROZEN_EMPTY_HASH,
|
8
|
+
reframe: ::ActiveRecord::Relation::FROZEN_EMPTY_HASH
|
9
|
+
}.each do |value_name, default_value|
|
10
|
+
define_method("#{value_name}_values") do
|
11
|
+
get_value(value_name)
|
12
|
+
end
|
13
|
+
define_method("#{value_name}_values=") do |value|
|
14
|
+
set_value(value_name, value)
|
15
|
+
end
|
16
|
+
::ActiveRecord::Relation::DEFAULT_VALUES[value_name] = default_value
|
8
17
|
end
|
9
|
-
def frames_values=(value)
|
10
|
-
set_value(:frames, value)
|
11
|
-
end
|
12
|
-
::ActiveRecord::Relation::DEFAULT_VALUES[:frames] = ::ActiveRecord::Relation::FROZEN_EMPTY_HASH
|
13
18
|
elsif ::ActiveRecord.version >= Gem::Version.new("5.0") # 5.0+
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
19
|
+
{
|
20
|
+
frames: ::ActiveRecord::Relation::FROZEN_EMPTY_HASH,
|
21
|
+
reframe: ::ActiveRecord::Relation::FROZEN_EMPTY_HASH
|
22
|
+
}.each do |value_name, default_value|
|
23
|
+
define_method("#{value_name}_values") do
|
24
|
+
@values[value_name] || default_value
|
25
|
+
end
|
26
|
+
define_method("#{value_name}_values=") do |values|
|
27
|
+
assert_mutability!
|
28
|
+
@values[value_name] = values
|
29
|
+
end
|
20
30
|
end
|
21
31
|
elsif ::ActiveRecord.version >= Gem::Version.new("4.2") # 4.2+
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
32
|
+
{
|
33
|
+
frames: {},
|
34
|
+
reframe: {}
|
35
|
+
}.each do |value_name, default_value|
|
36
|
+
define_method("#{value_name}_values") do
|
37
|
+
@values[value_name] || default_value
|
38
|
+
end
|
39
|
+
define_method("#{value_name}_values=") do |values|
|
40
|
+
raise ImmutableRelation if @loaded
|
41
|
+
check_cached_relation
|
42
|
+
@values[value_name] = values
|
43
|
+
end
|
29
44
|
end
|
30
45
|
else
|
31
46
|
raise NotImplementedError, "ActiveRecord::Framing does not support Rails #{::ActiveRecord.version}"
|
@@ -48,72 +63,13 @@ module ActiveRecord
|
|
48
63
|
self
|
49
64
|
end
|
50
65
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
# which should be unframed. The valid arguments are given in VALID_UNSCOPING_VALUES.
|
59
|
-
# The method can also be called with multiple arguments. For example:
|
60
|
-
#
|
61
|
-
# User.order('email DESC').select('id').where(name: "John")
|
62
|
-
# .unframe(:order, :select, :where) == User.all
|
63
|
-
#
|
64
|
-
# One can additionally pass a hash as an argument to unframe specific +:where+ values.
|
65
|
-
# This is done by passing a hash with a single key-value pair. The key should be
|
66
|
-
# +:where+ and the value should be the where value to unframe. For example:
|
67
|
-
#
|
68
|
-
# User.where(name: "John", active: true).unframe(where: :name)
|
69
|
-
# == User.where(active: true)
|
70
|
-
#
|
71
|
-
# This method is similar to #except, but unlike
|
72
|
-
# #except, it persists across merges:
|
73
|
-
#
|
74
|
-
# User.order('email').merge(User.except(:order))
|
75
|
-
# == User.order('email')
|
76
|
-
#
|
77
|
-
# User.order('email').merge(User.unframe(:order))
|
78
|
-
# == User.all
|
79
|
-
#
|
80
|
-
# This means it can be used in association definitions:
|
81
|
-
#
|
82
|
-
# has_many :comments, -> { unframe(where: :trashed) }
|
83
|
-
#
|
84
|
-
# def unframe(*args)
|
85
|
-
# check_if_method_has_arguments!(:unframe, args)
|
86
|
-
# spawn.unframe!(*args)
|
87
|
-
# end
|
88
|
-
|
89
|
-
# def unframe!(*args) # :nodoc:
|
90
|
-
# args.flatten!
|
91
|
-
# self.unframe_values += args
|
92
|
-
|
93
|
-
# args.each do |frame|
|
94
|
-
# case frame
|
95
|
-
# when Symbol
|
96
|
-
# frame = :left_outer_joins if frame == :left_joins
|
97
|
-
# if !VALID_UNSCOPING_VALUES.include?(frame)
|
98
|
-
# raise ArgumentError, "Called unframe() with invalid unframing argument ':#{frame}'. Valid arguments are :#{VALID_UNSCOPING_VALUES.to_a.join(", :")}."
|
99
|
-
# end
|
100
|
-
# set_value(frame, DEFAULT_VALUES[frame])
|
101
|
-
# when Hash
|
102
|
-
# frame.each do |key, target_value|
|
103
|
-
# if key != :where
|
104
|
-
# raise ArgumentError, "Hash arguments in .unframe(*args) must have :where as the key."
|
105
|
-
# end
|
106
|
-
|
107
|
-
# target_values = Array(target_value).map(&:to_s)
|
108
|
-
# self.where_clause = where_clause.except(*target_values)
|
109
|
-
# end
|
110
|
-
# else
|
111
|
-
# raise ArgumentError, "Unrecognized framing: #{args.inspect}. Use .unframe(where: :attribute_name) or .unframe(:order), for example."
|
112
|
-
# end
|
113
|
-
# end
|
114
|
-
|
115
|
-
# self
|
116
|
-
# end
|
66
|
+
def reframe(*args)
|
67
|
+
args.flatten!
|
68
|
+
# TODO: Convert array (if present) to nil hash {value => nil}
|
69
|
+
# and merge with hash (if present) as second arg
|
70
|
+
self.reframe_values = self.reframe_values.merge(args.first)
|
71
|
+
self
|
72
|
+
end
|
117
73
|
end
|
118
74
|
end
|
119
75
|
end
|
@@ -6,11 +6,6 @@ module ActiveRecord
|
|
6
6
|
def build_arel(*)
|
7
7
|
super.tap do |ar|
|
8
8
|
unless ignore_default_frame?
|
9
|
-
# alias_tracker.aliased_table_for(
|
10
|
-
# reflection.table_name,
|
11
|
-
# table_alias_for(reflection, parent, reflection != node.reflection),
|
12
|
-
# reflection.klass.type_caster
|
13
|
-
# )
|
14
9
|
build_frames(ar)
|
15
10
|
ar.with(*frames_values.values) if frames_values.any?
|
16
11
|
end
|
@@ -34,14 +29,32 @@ module ActiveRecord
|
|
34
29
|
# @table_alias=nil>,
|
35
30
|
# NOTE: In Rails 5.2 (at least) we could use the InnerJoin.left.type_caster
|
36
31
|
def build_frames(manager)
|
37
|
-
|
38
|
-
|
32
|
+
# NOTE: We cannot early exclude associations because some associations are different from their table names
|
33
|
+
# TODO: cache known associations?
|
34
|
+
assocs = klass.reflect_on_all_associations.inject(Hash.new) do |assocs, assoc|
|
35
|
+
begin
|
36
|
+
assocs[assoc.table_name] = assoc
|
37
|
+
rescue NameError => e
|
38
|
+
# warn <<~WARN.chomp
|
39
|
+
# ActiveRecord::Framing was trying to inspect the association #{assoc.name}
|
40
|
+
# on the #{assoc.active_record.name} model but seems there is an issue
|
41
|
+
# locating the model backing it.
|
42
|
+
# WARN
|
43
|
+
end
|
44
|
+
assocs
|
39
45
|
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
if
|
44
|
-
|
47
|
+
manager.join_sources.each do |join_source|
|
48
|
+
next unless join_source&.left&.respond_to?(:name)
|
49
|
+
if assoc = assocs[join_source.left.name]
|
50
|
+
source = reframe_values.fetch(assoc.name) { assoc.klass }
|
51
|
+
|
52
|
+
join_source.left.name = source.arel_table.name
|
53
|
+
if source < ::ActiveRecord::Base
|
54
|
+
merge!(source.all)
|
55
|
+
elsif source < ::ActiveRecord::Relation
|
56
|
+
merge!(source)
|
57
|
+
end
|
45
58
|
end
|
46
59
|
end
|
47
60
|
end
|
@@ -59,42 +72,6 @@ module ActiveRecord
|
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
62
|
-
# def reframe(*args) # :nodoc:
|
63
|
-
# args.compact!
|
64
|
-
# args.flatten!
|
65
|
-
# # binding.pry
|
66
|
-
# self
|
67
|
-
# end
|
68
|
-
|
69
|
-
# def reframe!(*args) # :nodoc:
|
70
|
-
# args.flatten!
|
71
|
-
# self.unframe_values += args
|
72
|
-
|
73
|
-
# args.each do |frame|
|
74
|
-
# case frame
|
75
|
-
# when Symbol
|
76
|
-
# frame = :left_outer_joins if frame == :left_joins
|
77
|
-
# if !VALID_UNSCOPING_VALUES.include?(frame)
|
78
|
-
# raise ArgumentError, "Called unframe() with invalid unframing argument ':#{frame}'. Valid arguments are :#{VALID_UNSCOPING_VALUES.to_a.join(", :")}."
|
79
|
-
# end
|
80
|
-
# set_value(frame, DEFAULT_VALUES[frame])
|
81
|
-
# when Hash
|
82
|
-
# frame.each do |key, target_value|
|
83
|
-
# if key != :where
|
84
|
-
# raise ArgumentError, "Hash arguments in .unframe(*args) must have :where as the key."
|
85
|
-
# end
|
86
|
-
|
87
|
-
# target_values = Array(target_value).map(&:to_s)
|
88
|
-
# self.where_clause = where_clause.except(*target_values)
|
89
|
-
# end
|
90
|
-
# else
|
91
|
-
# raise ArgumentError, "Unrecognized framing: #{args.inspect}. Use .unframe(where: :attribute_name) or .unframe(:order), for example."
|
92
|
-
# end
|
93
|
-
# end
|
94
|
-
|
95
|
-
# self
|
96
|
-
# end
|
97
|
-
|
98
75
|
# Frame all queries to the current frame.
|
99
76
|
#
|
100
77
|
# Comment.where(post_id: 1).framing do
|
@@ -116,22 +93,6 @@ module ActiveRecord
|
|
116
93
|
def scoping
|
117
94
|
framing { super }
|
118
95
|
end
|
119
|
-
|
120
|
-
# def _exec_frame(*args, &block) # :nodoc:
|
121
|
-
# @delegate_to_klass = true
|
122
|
-
# instance_exec(*args, &block) || self
|
123
|
-
# ensure
|
124
|
-
# @delegate_to_klass = false
|
125
|
-
# end
|
126
|
-
|
127
|
-
# def frame_for_create
|
128
|
-
# where_values_hash.merge!(create_with_value.stringify_keys)
|
129
|
-
# end
|
130
|
-
|
131
|
-
# def empty_frame? # :nodoc:
|
132
|
-
# @values == klass.unframed.values
|
133
|
-
# end
|
134
|
-
|
135
96
|
end
|
136
97
|
end
|
137
98
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record-framing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.0.pre.
|
4
|
+
version: 0.1.0.pre.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dale Stevens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|