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 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: []