activerecord-arel_depth_first 1.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 +7 -0
- data/LICENSE +22 -0
- data/README.md +39 -0
- data/lib/activerecord-arel_depth_first/nodes/node.rb +16 -0
- data/lib/activerecord-arel_depth_first/visitors/depth_first.rb +210 -0
- data/lib/activerecord-arel_depth_first.rb +4 -0
- metadata +85 -0
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
|
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: []
|