Class: Feature::Diff

Inherits:
Object
  • Object
show all
Includes:
Feature
Defined in:
lib/straight_line/common/feature/diff.rb

Overview

Multi purpose feature. It creates a pull request or pushes latest commits to the existing pull request

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Feature

#changes_committed?, #current_feature

Constructor Details

#initializeDiff

Returns a new instance of Diff.

Raises:



20
21
22
23
24
25
26
27
# File 'lib/straight_line/common/feature/diff.rb', line 20

def initialize
  @feature_name = current_feature
  if @feature_name == 'master'
    raise UserError, 'Failed to create diff: you\'re on the master branch'
  end
  return if changes_committed?
  raise UserError, 'Commit your changes before creating a diff'
end

Instance Attribute Details

#feature_nameObject (readonly)

Returns the value of attribute feature_name.



18
19
20
# File 'lib/straight_line/common/feature/diff.rb', line 18

def feature_name
  @feature_name
end

Instance Method Details

#create_pull_request(title, body) ⇒ Object



97
98
99
100
101
# File 'lib/straight_line/common/feature/diff.rb', line 97

def create_pull_request(title, body)
  Github.create_pull_request feature_name,
                             title,
                             body
end

#diff(params) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'lib/straight_line/common/feature/diff.rb', line 29

def diff(params)
  pull_cmd = GitCommands::Pull.new('master')
  pull_cmd.run
  if pull_request_exists?
    diff_pull_request_exists params
  else
    diff_no_pull_request params
  end
end

#diff_no_pull_request(params) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/straight_line/common/feature/diff.rb', line 50

def diff_no_pull_request(params)
  GitCommands::Rebase.new('master', feature_name).run
  GitCommands::Push.new(feature_name, false).run
  title, body = extract_params params, [:title, :body]
  pr = create_pull_request title, body
  Util.logger.info %(Pull request created: #{pr.html_url}.)
end

#diff_pull_request_exists(params) ⇒ Object



39
40
41
42
43
44
45
46
47
48
# File 'lib/straight_line/common/feature/diff.rb', line 39

def diff_pull_request_exists(params)
  GitCommands::Merge.new(feature_name, 'master').run
  title, body = extract_params params, [:title, :body]
  begin
    GitCommands::Commit.new(title, body).run
  rescue StandardError => e
    raise e unless e.message =~ /nothing to commit/
  end
  GitCommands::Push.new(feature_name).run
end

#extract_params(params, keys) ⇒ Object



66
67
68
69
70
71
72
73
74
75
# File 'lib/straight_line/common/feature/diff.rb', line 66

def extract_params(params, keys)
  keys.map do |key|
    case key
    when :title
      params[:title] || last_commit_message
    else
      params[key]
    end
  end
end

#last_commit_messageObject



77
78
79
# File 'lib/straight_line/common/feature/diff.rb', line 77

def last_commit_message
  GitCommands::Log.new('-1 --pretty=%B').run.split("\n").first
end

#pull_request_exists?Boolean

Returns:

  • (Boolean)


89
90
91
92
93
94
95
# File 'lib/straight_line/common/feature/diff.rb', line 89

def pull_request_exists?
  if Github.pull_request_for_feature(feature_name)
    true
  else
    false
  end
end

#require_params(params, required) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/straight_line/common/feature/diff.rb', line 58

def require_params(params, required)
  required_errors = required.map do |o|
    validate_param params, o
  end.compact

  raise required_errors.join "\n" unless required_errors.empty?
end

#validate_param(params, param_spec) ⇒ Object

Returns String error message if there is an error, else nil.

Returns:

  • String error message if there is an error, else nil



82
83
84
85
86
87
# File 'lib/straight_line/common/feature/diff.rb', line 82

def validate_param(params, param_spec)
  case param_spec.class
  when Symbol
    "#{param_spec} is not provided." unless params[param_spec]
  end
end