octopolo 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZmZjNjJhODc5NWM1Y2VhM2YxMDhjY2I2NDNmMzRmN2QyYThjN2ZlNg==
4
+ YWJiMDZmMWJkMWE1YjhkOWY2YzY3MDY4YWI3M2E0MDRmZDUxNDg3Mg==
5
5
  data.tar.gz: !binary |-
6
- NTg0ZTc3OTYxNTM2MjM3YjE2YmYzNGFkY2E4OTc2MGRlMWRiOTQyYw==
6
+ YjFhNGU3NzdkODFiYmM4YjBlYjIzNjc2ZWI5Y2E2YzVmOWM0OGViMQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MzBhNzI3MDVjZGY0Y2MxZWM4ZjI0YTU5OGM1ZmY4YWI1OTYwODk3MWMzMjIx
10
- MjczMmMyNGM4ZjBkODIzNTk4NmJjNzZjYjliOWVhMDNjMjA1NWE0MTljMDE3
11
- MDA4YjhlZmFlY2NmNDI5MDQ3ZDNmYTY3OGJhMGY2NTY3OTY4ZWY=
9
+ Njk1YjE0Mjk0ZjRhZThhZGE4OGU2YTE0ZmI3MjM3ZjEzYTEzOGI0NmZiN2E5
10
+ NjcxZWMxYzQ5ZTg3Y2VlMDMzMzA2NDFjZTQ5NDUzMTdkNGNmNjcyZmEwZTBj
11
+ YTY3YzNiNTE2OTEyOGFlZTQ4OTIwYjgzNDdkMmZiN2VlNDQxODY=
12
12
  data.tar.gz: !binary |-
13
- ZjkwOGJiZDU1MzQ0NzJhODU1YmM0NjQ2ZDA2ZTdkMDQ5OWEzZTZhOGFhZDhm
14
- Y2U5NjRiNjRmNzEwMjhiNTA4MjRjMWQ1Zjg3MzQ0ODMwZDc5MTAxM2U2ZGZi
15
- YWY1NTQxZjU4N2Q1N2NmMzg0MTVlNDA1MDg4ZTkzOTA2NTFjODQ=
13
+ NDA2OTA3ODIyNTk5NWQxOTU1ZTdkZDBhNWE0ODkxNGUzNjgwMDJhYWQwNDkw
14
+ MGJmYzgxZjFhZDgxZDYxMDQwMzQ3NmNlOTliNTM1ZGQzODg2OGJmNDI4NzFl
15
+ OTk5ODQyZjliMTNjYjE3YmIzYjQ4ZWYyNjZlZDM3YjBkZTA1NmY=
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,4 @@
1
+ #### v0.3.0
1
2
  #### v0.2.1
2
3
  #### v0.1.4
3
4
  #### v0.2.0
data/lib/octopolo.rb CHANGED
@@ -12,4 +12,8 @@ module Octopolo
12
12
  @config ||= Octopolo::Config.parse
13
13
  end
14
14
 
15
+ def self.user_config
16
+ @user_config ||= Octopolo::UserConfig.parse
17
+ end
18
+
15
19
  end
@@ -1,13 +1,17 @@
1
1
  desc "Create a pull request from the current branch to the application's designated deploy branch."
2
2
  command 'pull-request' do |c|
3
3
  config = Octopolo::Config.parse
4
+ user_config = Octopolo::UserConfig.parse
4
5
 
5
6
  c.desc "Branch to create the pull request against"
6
7
  c.flag [:d, :dest, :destination], :arg_name => "destination_branch", :default_value => config.deploy_branch
7
8
 
9
+ c.desc "Use $EDITOR to update PR description before creating"
10
+ c.switch [:e, :editor], :default_value => user_config.editor
11
+
8
12
  c.action do |global_options, options, args|
9
13
  require_relative '../scripts/pull_request'
10
14
  options = global_options.merge(options)
11
- Octopolo::Scripts::PullRequest.execute options[:destination]
15
+ Octopolo::Scripts::PullRequest.execute options[:destination], options
12
16
  end
13
17
  end
@@ -1,4 +1,5 @@
1
1
  require_relative "../renderer"
2
+ require 'tempfile'
2
3
 
3
4
  module Octopolo
4
5
  module GitHub
@@ -107,7 +108,28 @@ module Octopolo
107
108
  #
108
109
  # Returns a String
109
110
  def body
110
- Renderer.render Renderer::PULL_REQUEST_BODY, body_locals
111
+ output = Renderer.render Renderer::PULL_REQUEST_BODY, body_locals
112
+ output = edit_body(output) if options[:editor]
113
+ output
114
+ end
115
+
116
+ def edit_body(body)
117
+ return body unless ENV['EDITOR']
118
+
119
+ # Open the file, write the contents, and close it
120
+ tempfile = Tempfile.new(['octopolo_pull_request', '.md'])
121
+ tempfile.write(body)
122
+ tempfile.close
123
+
124
+ # Allow the user to edit the file
125
+ system "#{ENV['EDITOR']} #{tempfile.path}"
126
+
127
+ # Reopen the file, read the contents, and delete it
128
+ tempfile.open
129
+ output = tempfile.read
130
+ tempfile.unlink
131
+
132
+ output
111
133
  end
112
134
 
113
135
  # Public: The local variables to pass into the template
@@ -16,13 +16,15 @@ module Octopolo
16
16
  attr_accessor :jira_ids
17
17
  attr_accessor :destination_branch
18
18
  attr_accessor :label
19
+ attr_accessor :options
19
20
 
20
- def self.execute(destination_branch=nil)
21
- new(destination_branch).execute
21
+ def self.execute(destination_branch=nil, options={})
22
+ new(destination_branch, options).execute
22
23
  end
23
24
 
24
- def initialize(destination_branch=nil)
25
+ def initialize(destination_branch=nil, options={})
25
26
  @destination_branch = destination_branch || default_destination_branch
27
+ @options = options
26
28
  end
27
29
 
28
30
  def default_destination_branch
@@ -108,6 +110,7 @@ module Octopolo
108
110
  source_branch: git.current_branch,
109
111
  pivotal_ids: pivotal_ids,
110
112
  jira_ids: jira_ids,
113
+ editor: options[:editor]
111
114
  }
112
115
  end
113
116
  private :pull_request_attributes
@@ -4,6 +4,7 @@ module Octopolo
4
4
  attr_accessor :github_user
5
5
  attr_accessor :github_token
6
6
  attr_accessor :full_name
7
+ attr_accessor :editor
7
8
  attr_accessor :pivotal_token
8
9
  attr_accessor :attributes # keep the whole hash
9
10
 
@@ -79,6 +80,13 @@ module Octopolo
79
80
  @full_name || ENV["USER"]
80
81
  end
81
82
 
83
+ # Public: Always use the $EDITOR when available
84
+ #
85
+ # Returns a value or false
86
+ def editor
87
+ @editor || false
88
+ end
89
+
82
90
  # Public: The GitHub username
83
91
  #
84
92
  # If none is stored, generate it for the user.
@@ -1,3 +1,3 @@
1
1
  module Octopolo
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -154,6 +154,60 @@ module Octopolo
154
154
  end
155
155
  end
156
156
 
157
+ context "#edit_body" do
158
+ let(:path) { stub(:path) }
159
+ let(:body) { stub(:string) }
160
+ let(:tempfile) { stub(:tempfile) }
161
+ let(:edited_body) { stub(:edited_body) }
162
+
163
+ before do
164
+ Tempfile.stub(:new) { tempfile }
165
+ tempfile.stub(path: path, write: nil, read: edited_body, unlink: nil, close: nil, open: nil)
166
+ creator.stub(:system)
167
+ end
168
+
169
+ context "without the $EDITOR env var set" do
170
+ before do
171
+ stub_const('ENV', {'EDITOR' => nil})
172
+ end
173
+
174
+ it "returns the un-edited output" do
175
+ creator.edit_body(body).should == body
176
+ end
177
+ end
178
+
179
+ context "with the $EDITOR env set" do
180
+
181
+ before do
182
+ stub_const('ENV', {'EDITOR' => 'vim'})
183
+ end
184
+
185
+ it "creates a tempfile, write default contents, and close it" do
186
+ Tempfile.should_receive(:new).with(['octopolo_pull_request', '.md']) { tempfile }
187
+ tempfile.should_receive(:write).with(body)
188
+ tempfile.should_receive(:close)
189
+ creator.edit_body body
190
+ end
191
+
192
+ it "edits the tempfile with the $EDITOR" do
193
+ tempfile.should_receive(:path) { path }
194
+ creator.should_receive(:system).with("vim #{path}")
195
+ creator.edit_body body
196
+ end
197
+
198
+ it "reopens the file, gets the contents, and deletes the temp file" do
199
+ tempfile.should_receive(:open)
200
+ tempfile.should_receive(:read) { edited_body }
201
+ tempfile.should_receive(:unlink)
202
+ creator.edit_body body
203
+ end
204
+
205
+ it "returns the user edited output" do
206
+ creator.edit_body(body).should == edited_body
207
+ end
208
+ end
209
+ end
210
+
157
211
  context "#body" do
158
212
  let(:locals) { stub(:hash) }
159
213
  let(:output) { stub(:string) }
@@ -168,6 +222,23 @@ module Octopolo
168
222
  Renderer.should_receive(:render).with(Renderer::PULL_REQUEST_BODY, locals) { output }
169
223
  creator.body.should == output
170
224
  end
225
+
226
+ context "when the editor option is set" do
227
+ let(:edited_output) { stub(:output) }
228
+
229
+ before do
230
+ creator.stub({
231
+ body_locals: locals,
232
+ options: { editor: true }
233
+ })
234
+ end
235
+
236
+ it "calls the edit_body method" do
237
+ Renderer.should_receive(:render).with(Renderer::PULL_REQUEST_BODY, locals) { output }
238
+ creator.should_receive(:edit_body).with(output) { edited_output }
239
+ creator.body.should == edited_output
240
+ end
241
+ end
171
242
  end
172
243
  end
173
244
  end
@@ -188,6 +188,7 @@ module Octopolo
188
188
  source_branch: git.current_branch,
189
189
  pivotal_ids: subject.pivotal_ids,
190
190
  jira_ids: subject.jira_ids,
191
+ editor: nil
191
192
  }
192
193
  end
193
194
  end
@@ -119,6 +119,19 @@ module Octopolo
119
119
  end
120
120
  end
121
121
 
122
+ context "#editor" do
123
+ let(:config) { UserConfig.new }
124
+
125
+ it "returns the configured value" do
126
+ config.editor = true
127
+ config.editor.should == true
128
+ end
129
+
130
+ it "returns false otherwise" do
131
+ config.editor.should == false
132
+ end
133
+ end
134
+
122
135
  context "#github_user" do
123
136
  let(:config) { UserConfig.new }
124
137
  let(:username) { "joeperson" }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: octopolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Byrne
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-28 00:00:00.000000000 Z
12
+ date: 2015-02-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake