eager_eye 1.1.10 → 1.1.12
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 +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +1 -1
- data/lib/eager_eye/detectors/custom_method_query.rb +19 -19
- data/lib/eager_eye/version.rb +1 -1
- data/lib/eager_eye.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8b9c34f34d7b2a4433772c5478a94eb28ada60b751b560900c257a9d013b9b9f
|
|
4
|
+
data.tar.gz: 41ba835f40199d7a0946b5e2f42db2a73c1beb43ef3684d32f147bf1250dc5f3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6cc33125266267c58f0dff32d1e791cd7209660be223b54f57a001af08aae178528ee081f95613638109942ce169638b37e0239077df9794e8162cb2cf69f367
|
|
7
|
+
data.tar.gz: 40a0fd9a91164e0a261c8dd3119db5ce7f3795b1f50b07b99276d226c3a72cd2f3acbb98fc0ec6a9063ed846eb93f5a1968e227e5c6cdfde8c0d0691fe016b90
|
data/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.1.12] - 2026-01-15
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **CustomMethodQuery Stack Overflow** - Fix infinite recursion in `collection_is_array?`
|
|
15
|
+
- Added `visited` Set to track already-visited nodes and prevent cyclic traversal
|
|
16
|
+
- Fixes `stack level too deep` error on complex method chains
|
|
17
|
+
|
|
18
|
+
## [1.1.11] - 2026-01-13
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **CustomMethodQuery False Positive** - Skip `count`, `sum`, `find` on safe collections
|
|
23
|
+
- `id.to_s.count` no longer flagged (scalar count)
|
|
24
|
+
- `array.count` no longer flagged inside iteration
|
|
25
|
+
- Expanded safe transform methods (`to_s`, `to_i`, `to_a`, `chars`, `bytes`)
|
|
26
|
+
|
|
10
27
|
## [1.1.10] - 2026-01-12
|
|
11
28
|
|
|
12
29
|
### Fixed
|
data/README.md
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
12
|
<a href="https://github.com/hamzagedikkaya/eager_eye/actions/workflows/main.yml"><img src="https://github.com/hamzagedikkaya/eager_eye/actions/workflows/main.yml/badge.svg" alt="CI"></a>
|
|
13
|
-
<a href="https://rubygems.org/gems/eager_eye"><img src="https://img.shields.io/badge/gem-v1.1.
|
|
13
|
+
<a href="https://rubygems.org/gems/eager_eye"><img src="https://img.shields.io/badge/gem-v1.1.12-red.svg" alt="Gem Version"></a>
|
|
14
14
|
<a href="https://github.com/hamzagedikkaya/eager_eye"><img src="https://img.shields.io/badge/coverage-95%25-brightgreen.svg" alt="Coverage"></a>
|
|
15
15
|
<a href="https://www.ruby-lang.org/"><img src="https://img.shields.io/badge/ruby-%3E%3D%203.1-ruby.svg" alt="Ruby"></a>
|
|
16
16
|
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
@@ -5,10 +5,8 @@ module EagerEye
|
|
|
5
5
|
class CustomMethodQuery < Base
|
|
6
6
|
QUERY_METHODS = %i[where find_by find_by! exists? find first last take pluck ids count sum average minimum
|
|
7
7
|
maximum].freeze
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
STRING_ARRAY_METHODS = %i[split].freeze
|
|
11
|
-
BRACKET_ARRAY_METHODS = %i[[]].freeze
|
|
8
|
+
SAFE_QUERY_METHODS = %i[first last take count sum find size length].freeze
|
|
9
|
+
SAFE_TRANSFORM_METHODS = %i[keys values split [] params sort pluck ids to_s to_a to_i chars bytes].freeze
|
|
12
10
|
ITERATION_METHODS = %i[each map select find_all reject collect detect find_index flat_map].freeze
|
|
13
11
|
|
|
14
12
|
def self.detector_name
|
|
@@ -67,9 +65,9 @@ module EagerEye
|
|
|
67
65
|
end
|
|
68
66
|
|
|
69
67
|
def skip_array_method?(node, block_var, is_array_collection)
|
|
70
|
-
return true if
|
|
68
|
+
return true if receiver_ends_with_safe_transform_method?(node.children[0])
|
|
71
69
|
|
|
72
|
-
|
|
70
|
+
SAFE_QUERY_METHODS.include?(node.children[1]) &&
|
|
73
71
|
is_array_collection && receiver_is_only_block_var?(node.children[0], block_var)
|
|
74
72
|
end
|
|
75
73
|
|
|
@@ -95,36 +93,38 @@ module EagerEye
|
|
|
95
93
|
first_arg&.type == :arg ? first_arg.children[0] : nil
|
|
96
94
|
end
|
|
97
95
|
|
|
98
|
-
def collection_is_array?(node, definitions = {})
|
|
96
|
+
def collection_is_array?(node, definitions = {}, visited = Set.new)
|
|
99
97
|
return false unless node.is_a?(Parser::AST::Node)
|
|
98
|
+
return false if visited.include?(node.object_id)
|
|
99
|
+
|
|
100
|
+
visited.add(node.object_id)
|
|
101
|
+
|
|
100
102
|
return true if %i[array hash].include?(node.type)
|
|
101
|
-
return check_lvar_collection?(node, definitions) if node.type == :lvar
|
|
102
|
-
return check_send_collection?(node, definitions) if node.type == :send
|
|
103
|
+
return check_lvar_collection?(node, definitions, visited) if node.type == :lvar
|
|
104
|
+
return check_send_collection?(node, definitions, visited) if node.type == :send
|
|
103
105
|
|
|
104
106
|
false
|
|
105
107
|
end
|
|
106
108
|
|
|
107
|
-
def check_lvar_collection?(node, definitions)
|
|
109
|
+
def check_lvar_collection?(node, definitions, visited)
|
|
108
110
|
return false unless definitions
|
|
109
111
|
|
|
110
112
|
definition = definitions[node.children[0]]
|
|
111
|
-
definition ? collection_is_array?(definition, definitions) : false
|
|
113
|
+
definition ? collection_is_array?(definition, definitions, visited) : false
|
|
112
114
|
end
|
|
113
115
|
|
|
114
|
-
def check_send_collection?(node, definitions)
|
|
116
|
+
def check_send_collection?(node, definitions, visited)
|
|
115
117
|
method_name = node.children[1]
|
|
116
|
-
return true if %i[map select collect flat_map
|
|
117
|
-
|
|
118
|
+
return true if %i[map select collect flat_map uniq compact].include?(method_name)
|
|
119
|
+
return true if SAFE_TRANSFORM_METHODS.include?(method_name)
|
|
118
120
|
|
|
119
|
-
collection_is_array?(node.children[0], definitions)
|
|
121
|
+
collection_is_array?(node.children[0], definitions, visited)
|
|
120
122
|
end
|
|
121
123
|
|
|
122
|
-
def
|
|
124
|
+
def receiver_ends_with_safe_transform_method?(node)
|
|
123
125
|
return false unless node.is_a?(Parser::AST::Node) && node.type == :send
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
STRING_ARRAY_METHODS.include?(node.children[1]) ||
|
|
127
|
-
BRACKET_ARRAY_METHODS.include?(node.children[1])
|
|
127
|
+
SAFE_TRANSFORM_METHODS.include?(node.children[1])
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def add_issue(node)
|
data/lib/eager_eye/version.rb
CHANGED
data/lib/eager_eye.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: eager_eye
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.12
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- hamzagedikkaya
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-01-
|
|
11
|
+
date: 2026-01-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: ast
|