activerecord-arel_depth_first 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ece1725783c7780a7fa2607153d6efc6598034165d88bb67932efa1f6a3da1fa
4
+ data.tar.gz: ce282ec1610453ea89c359fe70dcc372f319d5b2153d6376235f3e8b25dc89c0
5
+ SHA512:
6
+ metadata.gz: 35201b02f64ae2726702dfe5483c369c767538348bc90c01f2eb97a264954c31a182f09fa0a68063e55a39eb180df1a31ee190b5f292b590780aa3d276ee070e
7
+ data.tar.gz: d3e279b9413e7ec185ae0a631f29b7c57a6a98a8307d6f323b4feca03e4e0d15459a4495b5cf04c039bc9b48f921b868f89751140164349ceb1e8628187c6dd8
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2004-2022 David Heinemeier Hansson
2
+
3
+ Arel originally copyright (c) 2007-2016 Nick Kallen, Bryan Helmkamp, Emilio Tagua, Aaron Patterson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ Active Record Arel DepthFirst Visitor
2
+ =====================================
3
+
4
+ This gem re-introduces Arel code that was removed from Rails 6.1: https://github.com/rails/rails/pull/36492 . The code existed in the arel gem from 4.0.0 to 9.0.0, and the rails gem from 4.0.0 to 6.0.0.
5
+
6
+ It provides a DepthFirst visitor for Arel that allows you to traverse the Arel AST,
7
+ e.g. for visualizations.
8
+
9
+ Installation
10
+ ------------
11
+
12
+ Include this gem into your Gemfile:
13
+
14
+ ```ruby
15
+ gem 'activerecord-arel_depth_first'
16
+ ```
17
+
18
+ Example
19
+ -------
20
+
21
+ This visitor makes the Arel AST enumerable, so you can do a depth-first
22
+ iteration over it:
23
+
24
+ ``` ruby
25
+ User.some_arbitrary_scope.arel.ast.each do |node|
26
+ case node
27
+ when Arel::Table
28
+ # do something for table nodes
29
+ when Arel::Nodes::Equality
30
+ # do something for equality nodes
31
+ else
32
+ # and so on ...
33
+ end
34
+ end
35
+ ```
36
+
37
+ ## License
38
+
39
+ activerecord-arel_depth_first is released under the [MIT License](MIT-LICENSE).
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Nodes
5
+ class Node
6
+ include Enumerable
7
+
8
+ # Iterate through AST, nodes will be yielded depth-first
9
+ def each(&block)
10
+ return enum_for(:each) unless block_given?
11
+
12
+ ::Arel::Visitors::DepthFirst.new(block).accept self
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,210 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Arel # :nodoc: all
4
+ module Visitors
5
+ class DepthFirst < Arel::Visitors::Visitor
6
+ def initialize(block = nil)
7
+ @block = block || Proc.new
8
+ super()
9
+ end
10
+
11
+ private
12
+ def visit(o, _ = nil)
13
+ super
14
+ @block.call o
15
+ end
16
+
17
+ def unary(o)
18
+ visit o.expr
19
+ end
20
+ alias :visit_Arel_Nodes_Else :unary
21
+ alias :visit_Arel_Nodes_Group :unary
22
+ alias :visit_Arel_Nodes_Cube :unary
23
+ alias :visit_Arel_Nodes_RollUp :unary
24
+ alias :visit_Arel_Nodes_GroupingSet :unary
25
+ alias :visit_Arel_Nodes_GroupingElement :unary
26
+ alias :visit_Arel_Nodes_Grouping :unary
27
+ alias :visit_Arel_Nodes_Having :unary
28
+ alias :visit_Arel_Nodes_Lateral :unary
29
+ alias :visit_Arel_Nodes_Limit :unary
30
+ alias :visit_Arel_Nodes_Not :unary
31
+ alias :visit_Arel_Nodes_Offset :unary
32
+ alias :visit_Arel_Nodes_On :unary
33
+ alias :visit_Arel_Nodes_Ordering :unary
34
+ alias :visit_Arel_Nodes_Ascending :unary
35
+ alias :visit_Arel_Nodes_Descending :unary
36
+ alias :visit_Arel_Nodes_UnqualifiedColumn :unary
37
+ alias :visit_Arel_Nodes_OptimizerHints :unary
38
+ alias :visit_Arel_Nodes_ValuesList :unary
39
+
40
+ def function(o)
41
+ visit o.expressions
42
+ visit o.alias
43
+ visit o.distinct
44
+ end
45
+ alias :visit_Arel_Nodes_Avg :function
46
+ alias :visit_Arel_Nodes_Exists :function
47
+ alias :visit_Arel_Nodes_Max :function
48
+ alias :visit_Arel_Nodes_Min :function
49
+ alias :visit_Arel_Nodes_Sum :function
50
+
51
+ def visit_Arel_Nodes_NamedFunction(o)
52
+ visit o.name
53
+ visit o.expressions
54
+ visit o.distinct
55
+ visit o.alias
56
+ end
57
+
58
+ def visit_Arel_Nodes_Count(o)
59
+ visit o.expressions
60
+ visit o.alias
61
+ visit o.distinct
62
+ end
63
+
64
+ def visit_Arel_Nodes_Case(o)
65
+ visit o.case
66
+ visit o.conditions
67
+ visit o.default
68
+ end
69
+
70
+ def nary(o)
71
+ o.children.each { |child| visit child }
72
+ end
73
+ alias :visit_Arel_Nodes_And :nary
74
+
75
+ def binary(o)
76
+ # left/right were renamed to relation/wheres from DeleteStatement in rails 7.0.0:
77
+ # https://github.com/rails/rails/commit/0f917da01a49f45c696bc0e32d14e4da811d8e6d
78
+ if o.is_a?(Arel::Nodes::DeleteStatement)
79
+ visit o.relation
80
+ visit o.wheres
81
+ else
82
+ visit o.left
83
+ visit o.right
84
+ end
85
+ end
86
+ alias :visit_Arel_Nodes_As :binary
87
+ alias :visit_Arel_Nodes_Assignment :binary
88
+ alias :visit_Arel_Nodes_Between :binary
89
+ alias :visit_Arel_Nodes_Concat :binary
90
+ alias :visit_Arel_Nodes_DeleteStatement :binary
91
+ alias :visit_Arel_Nodes_DoesNotMatch :binary
92
+ alias :visit_Arel_Nodes_Equality :binary
93
+ alias :visit_Arel_Nodes_FullOuterJoin :binary
94
+ alias :visit_Arel_Nodes_GreaterThan :binary
95
+ alias :visit_Arel_Nodes_GreaterThanOrEqual :binary
96
+ alias :visit_Arel_Nodes_In :binary
97
+ alias :visit_Arel_Nodes_InfixOperation :binary
98
+ alias :visit_Arel_Nodes_JoinSource :binary
99
+ alias :visit_Arel_Nodes_InnerJoin :binary
100
+ alias :visit_Arel_Nodes_LessThan :binary
101
+ alias :visit_Arel_Nodes_LessThanOrEqual :binary
102
+ alias :visit_Arel_Nodes_Matches :binary
103
+ alias :visit_Arel_Nodes_NotEqual :binary
104
+ alias :visit_Arel_Nodes_NotIn :binary
105
+ alias :visit_Arel_Nodes_NotRegexp :binary
106
+ alias :visit_Arel_Nodes_IsNotDistinctFrom :binary
107
+ alias :visit_Arel_Nodes_IsDistinctFrom :binary
108
+ alias :visit_Arel_Nodes_Or :binary
109
+ alias :visit_Arel_Nodes_OuterJoin :binary
110
+ alias :visit_Arel_Nodes_Regexp :binary
111
+ alias :visit_Arel_Nodes_RightOuterJoin :binary
112
+ alias :visit_Arel_Nodes_TableAlias :binary
113
+ alias :visit_Arel_Nodes_When :binary
114
+
115
+ def visit_Arel_Nodes_StringJoin(o)
116
+ visit o.left
117
+ end
118
+
119
+ def visit_Arel_Attribute(o)
120
+ visit o.relation
121
+ visit o.name
122
+ end
123
+ alias :visit_Arel_Attributes_Integer :visit_Arel_Attribute
124
+ alias :visit_Arel_Attributes_Float :visit_Arel_Attribute
125
+ alias :visit_Arel_Attributes_String :visit_Arel_Attribute
126
+ alias :visit_Arel_Attributes_Time :visit_Arel_Attribute
127
+ alias :visit_Arel_Attributes_Boolean :visit_Arel_Attribute
128
+ alias :visit_Arel_Attributes_Attribute :visit_Arel_Attribute
129
+ alias :visit_Arel_Attributes_Decimal :visit_Arel_Attribute
130
+
131
+ def visit_Arel_Table(o)
132
+ visit o.name
133
+ end
134
+
135
+ def terminal(o)
136
+ end
137
+ alias :visit_ActiveSupport_Multibyte_Chars :terminal
138
+ alias :visit_ActiveSupport_StringInquirer :terminal
139
+ alias :visit_Arel_Nodes_Lock :terminal
140
+ alias :visit_Arel_Nodes_Node :terminal
141
+ alias :visit_Arel_Nodes_SqlLiteral :terminal
142
+ alias :visit_Arel_Nodes_BindParam :terminal
143
+ alias :visit_Arel_Nodes_Window :terminal
144
+ alias :visit_Arel_Nodes_True :terminal
145
+ alias :visit_Arel_Nodes_False :terminal
146
+ alias :visit_BigDecimal :terminal
147
+ alias :visit_Class :terminal
148
+ alias :visit_Date :terminal
149
+ alias :visit_DateTime :terminal
150
+ alias :visit_FalseClass :terminal
151
+ alias :visit_Float :terminal
152
+ alias :visit_Integer :terminal
153
+ alias :visit_NilClass :terminal
154
+ alias :visit_String :terminal
155
+ alias :visit_Symbol :terminal
156
+ alias :visit_Time :terminal
157
+ alias :visit_TrueClass :terminal
158
+
159
+ def visit_Arel_Nodes_InsertStatement(o)
160
+ visit o.relation
161
+ visit o.columns
162
+ visit o.values
163
+ end
164
+
165
+ def visit_Arel_Nodes_SelectCore(o)
166
+ visit o.projections
167
+ visit o.source
168
+ visit o.wheres
169
+ visit o.groups
170
+ visit o.windows
171
+ visit o.havings
172
+ end
173
+
174
+ def visit_Arel_Nodes_SelectStatement(o)
175
+ visit o.cores
176
+ visit o.orders
177
+ visit o.limit
178
+ visit o.lock
179
+ visit o.offset
180
+ end
181
+
182
+ def visit_Arel_Nodes_UpdateStatement(o)
183
+ visit o.relation
184
+ visit o.values
185
+ visit o.wheres
186
+ visit o.orders
187
+ visit o.limit
188
+ end
189
+
190
+ def visit_Arel_Nodes_Comment(o)
191
+ visit o.values
192
+ end
193
+
194
+ def visit_Array(o)
195
+ o.each { |i| visit i }
196
+ end
197
+ alias :visit_Set :visit_Array
198
+
199
+ def visit_Hash(o)
200
+ o.each { |k, v| visit(k); visit(v) }
201
+ end
202
+
203
+ DISPATCH = dispatch_cache
204
+
205
+ def get_dispatch_cache
206
+ DISPATCH
207
+ end
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,4 @@
1
+ require "arel"
2
+ require "activerecord-arel_depth_first/nodes/node"
3
+ require "activerecord-arel_depth_first/visitors/depth_first"
4
+
metadata ADDED
@@ -0,0 +1,85 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activerecord-arel_depth_first
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tieg Zaharia
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-15 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: 6.1.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 7.1.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 6.1.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 7.1.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ description:
48
+ email: tieg.zaharia@gmail.com
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files:
52
+ - README.md
53
+ files:
54
+ - LICENSE
55
+ - README.md
56
+ - lib/activerecord-arel_depth_first.rb
57
+ - lib/activerecord-arel_depth_first/nodes/node.rb
58
+ - lib/activerecord-arel_depth_first/visitors/depth_first.rb
59
+ homepage: https://github.com/tidelift/activerecord-arel_depth_first
60
+ licenses:
61
+ - MIT
62
+ metadata:
63
+ rubygems_mfa_required: 'true'
64
+ post_install_message:
65
+ rdoc_options:
66
+ - "--main"
67
+ - README.md
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.2.2
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.1.4
82
+ signing_key:
83
+ specification_version: 4
84
+ summary: A DepthFirst visitor for Arel (removed from Rails in 6.1).
85
+ test_files: []