eager_eye 1.1.9 → 1.1.10

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: e5affda3dbf4ab9e59ce8c0a5fcbadd3b6b11bf60eba882031226050589a2a04
4
- data.tar.gz: bfa17f748016257d75c7135908656c9bf920b3dc0ea6d8fbbd41352b8a3c96f4
3
+ metadata.gz: 28c53330ec88bd4b8125e357ad3d11bc3155e6425d7feef88ccf4fd8bec93123
4
+ data.tar.gz: c671ff6c33dd1fef2a0be359452a195ecc5a72b27d534ca09d92c17f1928c89f
5
5
  SHA512:
6
- metadata.gz: e2d0edc257c6384c294a6f3a40037e2841c9c4a7d0f07cce69cf144ee01cf46353ec58d8db13da9549604206460d43efa4da91fb0966961a827e59cb3fe2518b
7
- data.tar.gz: 665ba27b30fda25e287ecc7ac34d573d8f523ed1eaab9f52fb9f628ce74b0a562e57a3a92bd6ef70226b9ccadb825577ae7d21e7f674fe080dac01f1df463dbe
6
+ metadata.gz: 75dd57d12d3b869f4ae9246130de9ae497ec6240f0f81adeaae1d7c2aaf48eed0f5d2626a62ba2f72a0b0adf8d207129322977c60639986881c1cd9fec91ecec
7
+ data.tar.gz: 265a28c9086ae7a215f31f7295b9d48be4882b926718a70029678b7c46d80ef171c308060507670477385cb52fd8aba66d7fac0bc05c1da13cd246e3eab56ed9
data/CHANGELOG.md CHANGED
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.1.10] - 2026-01-12
11
+
12
+ ### Fixed
13
+
14
+ - **CustomMethodQuery False Positive** - Skip `pluck` and `ids` results
15
+ - `Model.pluck(:id).each { |id| ... }` no longer flagged
16
+ - Supports tracking local variable assignments for pluck results
17
+
10
18
  ## [1.1.9] - 2026-01-11
11
19
 
12
20
  ### 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.9-red.svg" alt="Gem Version"></a>
13
+ <a href="https://rubygems.org/gems/eager_eye"><img src="https://img.shields.io/badge/gem-v1.1.10-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>
@@ -21,8 +21,8 @@ module EagerEye
21
21
  @issues = []
22
22
  @file_path = file_path
23
23
 
24
- find_iteration_blocks(ast) do |block_body, block_var, collection|
25
- is_array_collection = collection_is_array?(collection)
24
+ find_iteration_blocks(ast) do |block_body, block_var, collection, definitions|
25
+ is_array_collection = collection_is_array?(collection, definitions)
26
26
  check_block_for_query_methods(block_body, block_var, is_array_collection)
27
27
  end
28
28
 
@@ -31,15 +31,17 @@ module EagerEye
31
31
 
32
32
  private
33
33
 
34
- def find_iteration_blocks(node, &block)
34
+ def find_iteration_blocks(node, definitions = {}, &block)
35
35
  return unless node.is_a?(Parser::AST::Node)
36
36
 
37
+ definitions[node.children[0]] = node.children[1] if node.type == :lvasgn
38
+
37
39
  if iteration_block?(node)
38
40
  block_var = extract_block_variable(node)
39
41
  block_body = node.children[2]
40
- yield(block_body, block_var, node.children[0]) if block_var && block_body
42
+ yield(block_body, block_var, node.children[0], definitions) if block_var && block_body
41
43
  end
42
- node.children.each { |child| find_iteration_blocks(child, &block) }
44
+ node.children.each { |child| find_iteration_blocks(child, definitions, &block) }
43
45
  end
44
46
 
45
47
  def iteration_block?(node)
@@ -93,20 +95,28 @@ module EagerEye
93
95
  first_arg&.type == :arg ? first_arg.children[0] : nil
94
96
  end
95
97
 
96
- def collection_is_array?(node)
98
+ def collection_is_array?(node, definitions = {})
97
99
  return false unless node.is_a?(Parser::AST::Node)
98
-
99
100
  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
100
103
 
101
- if node.type == :send
102
- method_name = node.children[1]
103
- return true if %i[map select collect flat_map to_a uniq compact keys values split []
104
- params sort].include?(method_name)
104
+ false
105
+ end
105
106
 
106
- return collection_is_array?(node.children[0])
107
- end
107
+ def check_lvar_collection?(node, definitions)
108
+ return false unless definitions
108
109
 
109
- false
110
+ definition = definitions[node.children[0]]
111
+ definition ? collection_is_array?(definition, definitions) : false
112
+ end
113
+
114
+ def check_send_collection?(node, definitions)
115
+ method_name = node.children[1]
116
+ return true if %i[map select collect flat_map to_a uniq compact keys values split []
117
+ params sort pluck ids].include?(method_name)
118
+
119
+ collection_is_array?(node.children[0], definitions)
110
120
  end
111
121
 
112
122
  def receiver_ends_with_hash_array_method?(node)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EagerEye
4
- VERSION = "1.1.9"
4
+ VERSION = "1.1.10"
5
5
  end
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.9
4
+ version: 1.1.10
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 00:00:00.000000000 Z
11
+ date: 2026-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast