Class: VCSToolkit::Diff

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/vcs_toolkit/diff.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(changes) ⇒ Diff

Returns a new instance of Diff.



7
8
9
# File 'lib/vcs_toolkit/diff.rb', line 7

def initialize(changes)
  @changes = changes
end

Class Method Details

.from_sequences(sequence_one, sequence_two) ⇒ Object



57
58
59
# File 'lib/vcs_toolkit/diff.rb', line 57

def self.from_sequences(sequence_one, sequence_two)
  new ::Diff::LCS.sdiff(sequence_one, sequence_two)
end

Instance Method Details

#each(&block) ⇒ Object



19
20
21
# File 'lib/vcs_toolkit/diff.rb', line 19

def each(&block)
  @changes.each &block
end

#has_changes?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/vcs_toolkit/diff.rb', line 11

def has_changes?
  not @changes.all?(&:unchanged?)
end

#has_conflicts?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/vcs_toolkit/diff.rb', line 15

def has_conflicts?
  @changes.any?(&:conflict?)
end

#new_content(conflict_start = '<<<', conflict_switch = '>>>', conflict_end = '===') ⇒ Object

Reconstruct the new sequence from the diff



42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/vcs_toolkit/diff.rb', line 42

def new_content(conflict_start='<<<', conflict_switch='>>>', conflict_end='===')
  flat_map do |change|
    if change.conflict?
      version_one = change.diff_one.new_content(conflict_start, conflict_switch, conflict_end)
      version_two = change.diff_two.new_content(conflict_start, conflict_switch, conflict_end)

      [conflict_start] + version_one + [conflict_switch] + version_two + [conflict_end]
    elsif change.deleting?
      []
    else
      [change.new_element]
    end
  end
end

#to_sObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/vcs_toolkit/diff.rb', line 23

def to_s
  flat_map do |change|
    if change.unchanged?
      [change.new_element]
    elsif change.deleting?
      ["-#{change.old_element}"]
    elsif change.adding?
      ["+#{change.new_element}"]
    elsif change.changed?
      ["-#{change.old_element}", "+#{change.new_element}"]
    else
      raise "Unknown change in the diff #{change.action}"
    end
  end.join ''
end