Class: GemOverrideMarker::Registry
- Inherits:
-
Object
- Object
- GemOverrideMarker::Registry
- 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
-
#root ⇒ Object
readonly
Returns the value of attribute root.
Instance Method Summary collapse
-
#all_markers ⇒ Object
リポジトリ全体を走査して全マーカーを返す。.
-
#initialize(root: ".") ⇒ Registry
constructor
A new instance of Registry.
-
#markers_in_file(file) ⇒ Object
1ファイル内の全マーカーを返す。.
-
#resolve(selector) ⇒ Object
狙い撃ち指定文字列からマーカー群を解決する。 selector の解釈: - 既存ファイルパス → ファイル内の全マーカー - "ファイルパス,メソッド名" → そのメソッドのマーカーのみ - 本家論理名 (gem-版/パス#method) → 全マーカーから論理名一致を抽出 - nil / 空 → リポジトリ全体の全マーカー.
Constructor Details
Instance Attribute Details
#root ⇒ Object (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_markers ⇒ Object
リポジトリ全体を走査して全マーカーを返す。
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 |