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 =
Returns the change type for directories.
:'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
Returns a new instance of 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)
Returns the path to the modified file.
11 12 13 |
# File 'lib/refinement/changeset/file_modification.rb', line 11 def path @path end |
#prior_path ⇒ Pathname, Nil (readonly)
Returns the prior path to the modified file, or ‘nil` if it was not renamed or copied.
14 15 16 |
# File 'lib/refinement/changeset/file_modification.rb', line 14 def prior_path @prior_path end |
#type ⇒ #to_s (readonly)
Returns the type of change that happened to this file.
17 18 19 |
# File 'lib/refinement/changeset/file_modification.rb', line 17 def type @type end |
Instance Method Details
#contents ⇒ String
Returns the current contents of the file.
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
Returns the prior contents of the file.
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
Returns 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.
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 |