Class: Refinement::Changeset::FileModification
- Inherits:
-
Object
- Object
- Refinement::Changeset::FileModification
- Defined in:
- lib/refinement/changeset/file_modification.rb
Overview
Represents a modification to a single file or directory on disk
Constant Summary collapse
- DIRECTORY_CHANGE_TYPE =
:'had contents change'
Instance Attribute Summary collapse
-
#path ⇒ Pathname
readonly
The path to the modified file.
-
#prior_path ⇒ Pathname, Nil
readonly
The prior path to the modified file, or ‘nil` if it was not renamed or copied.
-
#type ⇒ #to_s
readonly
The type of change that happened to this file.
Instance Method Summary collapse
-
#contents ⇒ String
The current contents of the file.
-
#initialize(path:, type:, prior_path: nil, contents_reader: -> { nil }, prior_contents_reader: -> { nil }) ⇒ FileModification
constructor
A new instance of FileModification.
-
#prior_contents ⇒ String
The prior contents of the file.
-
#yaml_diff(keypath) ⇒ String, Nil
A YAML string representing the diff of the file from the prior revision to the current revision at the given keypath in the YAML, or ‘nil` if there is no diff.
Constructor Details
#initialize(path:, type:, prior_path: nil, contents_reader: -> { nil }, prior_contents_reader: -> { nil }) ⇒ FileModification
19 20 21 22 23 24 25 26 27 28 |
# File 'lib/refinement/changeset/file_modification.rb', line 19 def initialize(path:, type:, prior_path: nil, contents_reader: -> { nil }, prior_contents_reader: -> { nil }) @path = path @type = type @prior_path = prior_path @contents_reader = contents_reader @prior_contents_reader = prior_contents_reader end |
Instance Attribute Details
#path ⇒ Pathname (readonly)
11 12 13 |
# File 'lib/refinement/changeset/file_modification.rb', line 11 def path @path end |
#prior_path ⇒ Pathname, Nil (readonly)
14 15 16 |
# File 'lib/refinement/changeset/file_modification.rb', line 14 def prior_path @prior_path end |
#type ⇒ #to_s (readonly)
17 18 19 |
# File 'lib/refinement/changeset/file_modification.rb', line 17 def type @type end |
Instance Method Details
#contents ⇒ String
118 119 120 121 122 123 124 125 |
# File 'lib/refinement/changeset/file_modification.rb', line 118 def contents @contents ||= begin @contents_reader[].tap { @contents_reader = nil } || DOES_NOT_EXIST rescue StandardError DOES_NOT_EXIST end end |
#prior_contents ⇒ String
128 129 130 131 132 133 134 135 |
# File 'lib/refinement/changeset/file_modification.rb', line 128 def prior_contents @prior_contents ||= begin @prior_contents_reader[].tap { @prior_contents_reader = nil } || DOES_NOT_EXIST rescue StandardError DOES_NOT_EXIST end end |
#yaml_diff(keypath) ⇒ String, Nil
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'lib/refinement/changeset/file_modification.rb', line 72 def yaml_diff(keypath) require 'yaml' @cached_yaml ||= {} dig_yaml = lambda do |yaml, path| return yaml if DOES_NOT_EXIST == yaml object = @cached_yaml[path] ||= YAML.safe_load(yaml, [Symbol]) if keypath.empty? object elsif object.respond_to?(:dig) object.dig(*keypath) else # backwards compatibility keypath.reduce(object) do |acc, elem| acc[elem] end end end prior = dig_yaml[prior_contents, :prior] current = dig_yaml[contents, :current] require 'xcodeproj/differ' return unless (diff = Xcodeproj::Differ.diff( prior, current, key_1: 'prior_revision', key_2: 'current_revision' )) diff.to_yaml.prepend("#{path} changed at keypath #{keypath.inspect}\n") end |