Module: GemOverrideMarker

Defined in:
lib/gem_override_marker.rb,
lib/gem_override_marker/marker.rb,
lib/gem_override_marker/railtie.rb,
lib/gem_override_marker/version.rb,
lib/gem_override_marker/registry.rb,
lib/gem_override_marker/gem_source.rb,
lib/gem_override_marker/diff_generator.rb,
lib/gem_override_marker/source_extractor.rb

Overview

gem のメソッド prepend 再実装 / view 丸ごと上書きが、本家のどの版の何を 基準にしているかを @gem-override マーカーで管理し、本家との diff を 必要なときに生成する。gem アップグレード時の上書きの追随を支援するツール。

Defined Under Namespace

Classes: DiffGenerator, GemSource, Marker, Mismatch, Railtie, Registry, SourceExtractor

Constant Summary collapse

VERSION =
"0.1.0".freeze

Class Method Summary collapse

Class Method Details

.check(selector: nil, root: ".", lockfile_path: nil) ⇒ Object

マーカーの版と Gemfile.lock の版がズレているものを抽出する (check 用)。 ズレが無ければ空配列。lockfile_path を省略すると Bundler が解決した プロジェクトの Gemfile.lock を使う。



71
72
73
74
75
76
77
78
# File 'lib/gem_override_marker.rb', line 71

def check(selector: nil, root: ".", lockfile_path: nil)
  list(selector: selector, root: root).filter_map do |marker|
    locked = GemSource.locked_version(marker.gem_name, lockfile_path)
    next if locked.nil? || locked == marker.version

    Mismatch.new(marker: marker, locked_version: locked)
  end
end

.diff_for(marker) ⇒ Object

1マーカーについて本家ソース vs override の unified diff を生成する。 比較対象の本家はマーカーに書かれた版を使う。



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/gem_override_marker.rb', line 27

def diff_for(marker)
  source_file = GemSource.resolve_file(marker)
  source_code = SourceExtractor.extract(source_file, marker.method_name)
  override_code = SourceExtractor.extract(marker.file_path, marker.method_name)

  method_suffix = marker.method_name ? "##{marker.method_name}" : ""
  DiffGenerator.unified(
    source_code, override_code,
    old_label: "source #{marker.gem_name}-#{marker.version}/#{marker.path}#{method_suffix}",
    new_label: "override #{marker.file_path}#{method_suffix}"
  )
end

.list(selector: nil, root: ".") ⇒ Object

狙い撃ち指定にマッチするマーカー一覧を返す (list 用)。



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

def list(selector: nil, root: ".")
  Registry.new(root: root).resolve(selector)
end

.upstream_diff(marker, from_version: nil, to_version: nil) ⇒ Object

同一マーカー対象 (gem 内の同じパス・同じメソッド) について、本家の 2版間 (from_version → to_version) の unified diff を生成する。

gem アップグレード時に「その上書き箇所が本家側で変わったか」を選別する ための道具。差分が空 = 本家に変更なし → 上書きコードは触らず版表記だけ 更新すればよい。差分あり = 本家が変わった → 自分の diff を新本家に貼り直す。

to_version を省略すると Gemfile.lock 上の実バージョン (アップグレード後の版) を使う。本家同士の差分マージはしない設計思想に沿い、あくまで選別用途。



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/gem_override_marker.rb', line 49

def upstream_diff(marker, from_version: nil, to_version: nil)
  from = from_version || marker.version
  to = to_version || GemSource.locked_version(marker.gem_name)
  raise GemSource::SourceNotFoundError, "could not resolve to_version for #{marker.gem_name}" if to.nil?

  from_file = GemSource.resolve_path(marker.gem_name, from, marker.path)
  to_file = GemSource.resolve_path(marker.gem_name, to, marker.path)

  from_code = SourceExtractor.extract(from_file, marker.method_name)
  to_code = SourceExtractor.extract(to_file, marker.method_name)

  method_suffix = marker.method_name ? "##{marker.method_name}" : ""
  DiffGenerator.unified(
    from_code, to_code,
    old_label: "upstream #{marker.gem_name}-#{from}/#{marker.path}#{method_suffix}",
    new_label: "upstream #{marker.gem_name}-#{to}/#{marker.path}#{method_suffix}"
  )
end