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
-
.check(selector: nil, root: ".", lockfile_path: nil) ⇒ Object
マーカーの版と Gemfile.lock の版がズレているものを抽出する (check 用)。 ズレが無ければ空配列。lockfile_path を省略すると Bundler が解決した プロジェクトの Gemfile.lock を使う。.
-
.diff_for(marker) ⇒ Object
1マーカーについて本家ソース vs override の unified diff を生成する。 比較対象の本家はマーカーに書かれた版を使う。.
-
.list(selector: nil, root: ".") ⇒ Object
狙い撃ち指定にマッチするマーカー一覧を返す (list 用)。.
-
.upstream_diff(marker, from_version: nil, to_version: nil) ⇒ Object
同一マーカー対象 (gem 内の同じパス・同じメソッド) について、本家の 2版間 (from_version → to_version) の unified diff を生成する。.
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 |