Class: GemOverrideMarker::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/gem_override_marker/registry.rb

Overview

リポジトリ内に埋め込まれた @gem-override マーカーを収集し、 狙い撃ち指定 (ファイル / ファイル+メソッド / 本家論理名) で絞り込む。

Constant Summary collapse

SCANNABLE_EXTENSIONS =

マーカーを探索する対象ファイルの拡張子。Ruby と各種テンプレート。

%w[.rb .erb .slim .haml].freeze
EXCLUDED_PATH_SEGMENTS =

探索から除外するパス片 (相対パスの任意位置に含まれていれば除外)。 tmp や依存ライブラリのほか、テスト用のダミーマーカーを誤検出しないよう spec/fixtures も除外する。

%w[
  tmp/
  node_modules/
  vendor/bundle/
  .git/
  spec/fixtures/
  test/fixtures/
].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root: ".") ⇒ Registry

Returns a new instance of Registry.



22
23
24
# File 'lib/gem_override_marker/registry.rb', line 22

def initialize(root: ".")
  @root = root
end

Instance Attribute Details

#rootObject (readonly)

Returns the value of attribute root.



20
21
22
# File 'lib/gem_override_marker/registry.rb', line 20

def root
  @root
end

Instance Method Details

#all_markersObject

リポジトリ全体を走査して全マーカーを返す。



27
28
29
# File 'lib/gem_override_marker/registry.rb', line 27

def all_markers
  target_files.flat_map { |file| markers_in_file(file) }
end

#markers_in_file(file) ⇒ Object

1ファイル内の全マーカーを返す。



32
33
34
35
36
37
38
39
# File 'lib/gem_override_marker/registry.rb', line 32

def markers_in_file(file)
  File.foreach(file).with_index(1).filter_map do |line, lineno|
    Marker.parse(line, file_path: file, line_number: lineno)
  end
rescue ArgumentError
  # バイナリ等で読み取れない行があるファイルはスキップする。
  []
end

#resolve(selector) ⇒ Object

狙い撃ち指定文字列からマーカー群を解決する。 selector の解釈:

- 既存ファイルパス             → ファイル内の全マーカー
- "ファイルパス,メソッド名"    → そのメソッドのマーカーのみ
- 本家論理名 (gem-版/パス#method) → 全マーカーから論理名一致を抽出
- nil / 空                     → リポジトリ全体の全マーカー


47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/gem_override_marker/registry.rb', line 47

def resolve(selector)
  return all_markers if selector.nil? || selector.strip.empty?

  file_part, method_part = selector.split(",", 2).map { |s| s&.strip }

  if File.file?(file_part)
    markers = markers_in_file(file_part)
    markers = markers.select { |m| m.method_name == method_part } if method_part
    return markers
  end

  # ファイルとして存在しなければ本家論理名指定とみなす。
  all_markers.select { |m| m.logical_name == selector.strip }
end