ghi 0.9.3 → 1.0.2

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,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 542fd93fc503609bf5d4cc5a258356d35ee0313c
4
- data.tar.gz: 03e5dc1531dd7a57fe02e36e265f54d94c799546
3
+ metadata.gz: 696fce57a7e89cb7685529b9e6bbabcefde0ee2d
4
+ data.tar.gz: 19a171ad807242aabe60dc72142a6fdf877f2685
5
5
  SHA512:
6
- metadata.gz: f2984c9e741d600f119935ff9afb7b7a228839987d56caf40311aaaa43358ca000b5fdab2eba6cdea1f551ac0ce5b1d71e8c1cda7d2f43dea3e26b23b126cd30
7
- data.tar.gz: 7e0e12147f1c5fc7f6a2cf6563076fa01e4e9648e0e0b9f0a0403627d95fcf405c399b3ce75400d14f489e747126617cf24ad820f56e31f373ae4348ab9999e7
6
+ metadata.gz: 8f9a475b4713a41828414f000d4e6da666dc75c0e43df5430041e776f73ff81d2b6f0383aeec8e38cabff04a03e0aeffe2bf2f4b11f58b1b4684af0e7854f828
7
+ data.tar.gz: dc0a1c4930f0a4445bcefac59501d58a2930462e06fe2c88b594699b85003d6e67545db7cc187c1c9477cf7bccdb7d32fa6820466eda3be96aec6917743d261e
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+ require 'socket'
2
3
 
3
4
  module GHI
4
5
  module Authorization
@@ -39,7 +40,7 @@ module GHI
39
40
  system "git config#{' --global' unless local} github.user #{user}"
40
41
  end
41
42
 
42
- store_token! username, token, local
43
+ store_token! user, token, local
43
44
  rescue Client::Error => e
44
45
  if e.response['X-GitHub-OTP'] =~ /required/
45
46
  puts "Bad code." if code
@@ -51,12 +52,13 @@ module GHI
51
52
  end
52
53
 
53
54
  if e.errors.any? { |err| err['code'] == 'already_exists' }
55
+ host = GHI.config('github.host') || 'github.com'
54
56
  message = <<EOF.chomp
55
57
  A ghi token already exists!
56
58
 
57
59
  Please revoke all previously-generated ghi personal access tokens here:
58
60
 
59
- https://github.com/settings/applications
61
+ https://#{host}/settings/applications
60
62
  EOF
61
63
  else
62
64
  message = e.message
data/lib/ghi/client.rb CHANGED
@@ -138,7 +138,9 @@ module GHI
138
138
  if password.nil?
139
139
  raise Authorization::Required, 'Authorization required'
140
140
  end
141
- end
141
+ when Net::HTTPMovedPermanently
142
+ return Response.new(http.get(res['location']))
143
+ end
142
144
 
143
145
  raise Error, res
144
146
  end
data/lib/ghi/commands.rb CHANGED
@@ -8,12 +8,15 @@ module GHI
8
8
  autoload :Close, 'ghi/commands/close'
9
9
  autoload :Comment, 'ghi/commands/comment'
10
10
  autoload :Config, 'ghi/commands/config'
11
+ autoload :Disable, 'ghi/commands/disable'
11
12
  autoload :Edit, 'ghi/commands/edit'
13
+ autoload :Enable, 'ghi/commands/enable'
12
14
  autoload :Help, 'ghi/commands/help'
13
15
  autoload :Label, 'ghi/commands/label'
14
16
  autoload :Milestone, 'ghi/commands/milestone'
15
17
  autoload :Reopen, 'ghi/commands/reopen'
16
18
  autoload :Show, 'ghi/commands/show'
19
+ autoload :Status, 'ghi/commands/status'
17
20
  autoload :Unassign, 'ghi/commands/unassign'
18
21
  autoload :Version, 'ghi/commands/version'
19
22
  end
@@ -62,6 +62,17 @@ module GHI
62
62
  abort options.to_s
63
63
  end
64
64
 
65
+ def require_repo_name
66
+ require_repo
67
+ repo_array = repo.partition "/"
68
+ if repo_array.length >= 2
69
+ repo_name = repo_array[2]
70
+ else
71
+ repo_name = nil
72
+ end
73
+ return repo_name
74
+ end
75
+
65
76
  def detect_repo
66
77
  remote = remotes.find { |r| r[:remote] == 'upstream' }
67
78
  remote ||= remotes.find { |r| r[:remote] == 'origin' }
@@ -0,0 +1,35 @@
1
+ module GHI
2
+ module Commands
3
+ class Disable < Command
4
+
5
+ def options
6
+ OptionParser.new do |opts|
7
+ opts.banner = 'usage: ghi disable'
8
+ end
9
+ end
10
+
11
+ def execute
12
+ begin
13
+ options.parse! args
14
+ @repo ||= ARGV[0] if ARGV.one?
15
+ rescue OptionParser::InvalidOption => e
16
+ fallback.parse! e.args
17
+ retry
18
+ end
19
+ repo_name = require_repo_name
20
+ unless repo_name.nil?
21
+ patch_data = {}
22
+ patch_data[:name] = repo_name
23
+ patch_data[:has_issues] = false
24
+ res = throb { api.patch "/repos/#{repo}", patch_data }.body
25
+ if !res['has_issues']
26
+ puts "Issues are now disabled for this repo"
27
+ else
28
+ puts "Something went wrong disabling issues for this repo"
29
+ end
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ module GHI
2
+ module Commands
3
+ class Enable < Command
4
+
5
+ def options
6
+ OptionParser.new do |opts|
7
+ opts.banner = 'usage: ghi enable'
8
+ end
9
+ end
10
+
11
+ def execute
12
+ begin
13
+ options.parse! args
14
+ @repo ||= ARGV[0] if ARGV.one?
15
+ rescue OptionParser::InvalidOption => e
16
+ fallback.parse! e.args
17
+ retry
18
+ end
19
+ repo_name = require_repo_name
20
+ unless repo_name.nil?
21
+ patch_data = {}
22
+ patch_data[:name] = repo_name
23
+ patch_data[:has_issues] = true
24
+ res = throb { api.patch "/repos/#{repo}", patch_data }.body
25
+ if res['has_issues']
26
+ puts "Issues are now enabled for this repo"
27
+ else
28
+ puts "Something went wrong enabling issues for this repo"
29
+ end
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -35,6 +35,9 @@ The most commonly used ghi commands are:
35
35
  label Create, list, modify, or delete labels
36
36
  assign Assign an issue to yourself (or someone else)
37
37
  milestone Manage project milestones
38
+ status Determine whether or not issues are enabled for this repo
39
+ enable Enable issues for the current repo
40
+ disable Disable issues for the current repo
38
41
 
39
42
  See 'ghi help <command>' for more information on a specific command.
40
43
  EOF
@@ -13,7 +13,7 @@ module GHI
13
13
  OptionParser.new do |opts|
14
14
  opts.banner = 'usage: ghi list [options]'
15
15
  opts.separator ''
16
- opts.on '-a', '--global', '--all', 'all of your issues on GitHub' do
16
+ opts.on '-g', '--global', 'all of your issues on GitHub' do
17
17
  assigns[:filter] = 'all'
18
18
  @repo = nil
19
19
  end
@@ -100,6 +100,12 @@ module GHI
100
100
  ) do |mentioned|
101
101
  assigns[:mentioned] = mentioned || Authorization.username
102
102
  end
103
+ opts.on(
104
+ '-O', '--org <organization>', 'in repos within an organization you belong to'
105
+ ) do |org|
106
+ assigns[:org] = org
107
+ @repo = nil
108
+ end
103
109
  opts.separator ''
104
110
  end
105
111
  end
@@ -172,7 +178,14 @@ module GHI
172
178
  private
173
179
 
174
180
  def uri
175
- (repo ? "/repos/#{repo}" : '') << '/issues'
181
+ url = ''
182
+ if repo
183
+ url = "/repos/#{repo}"
184
+ end
185
+ if assigns[:org]
186
+ url = "/orgs/#{assigns[:org]}"
187
+ end
188
+ return url << '/issues'
176
189
  end
177
190
 
178
191
  def fallback
@@ -103,7 +103,7 @@ EOF
103
103
  case action
104
104
  when 'index'
105
105
  if web
106
- Web.new(repo).open 'issues/milestones', assigns
106
+ Web.new(repo).open 'milestones', assigns
107
107
  else
108
108
  assigns[:per_page] = 100
109
109
  state = assigns[:state] || 'open'
@@ -52,7 +52,7 @@ EOF
52
52
 
53
53
  options.parse! args
54
54
 
55
- if extract_issue
55
+ if GHI.config('ghi.infer-issue') != 'false' && extract_issue
56
56
  Edit.execute args.push('-so', issue, '--', repo)
57
57
  exit
58
58
  end
@@ -0,0 +1,32 @@
1
+ module GHI
2
+ module Commands
3
+ class Status < Command
4
+
5
+ def options
6
+ OptionParser.new do |opts|
7
+ opts.banner = 'usage: ghi status'
8
+ end
9
+ end
10
+
11
+ def execute
12
+ begin
13
+ options.parse! args
14
+ @repo ||= ARGV[0] if ARGV.one?
15
+ rescue OptionParser::InvalidOption => e
16
+ fallback.parse! e.args
17
+ retry
18
+ end
19
+
20
+ require_repo
21
+ res = throb { api.get "/repos/#{repo}" }.body
22
+
23
+ if res['has_issues']
24
+ puts "Issues are enabled for this repo"
25
+ else
26
+ puts "Issues are not enabled for this repo"
27
+ end
28
+
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,9 +1,9 @@
1
1
  module GHI
2
2
  module Commands
3
3
  module Version
4
- MAJOR = 0
5
- MINOR = 9
6
- PATCH = 3
4
+ MAJOR = 1
5
+ MINOR = 0
6
+ PATCH = 2
7
7
  PRE = nil
8
8
 
9
9
  VERSION = [MAJOR, MINOR, PATCH, PRE].compact.join '.'
@@ -84,7 +84,9 @@ module GHI
84
84
 
85
85
  def truncate string, reserved
86
86
  return string unless paginate?
87
- result = string.scan(/.{0,#{columns - reserved}}(?:\s|\Z)/).first.strip
87
+ space=columns - reserved
88
+ space=5 if space < 5
89
+ result = string.scan(/.{0,#{space}}(?:\s|\Z)/).first.strip
88
90
  result << "..." if result != string
89
91
  result
90
92
  end
@@ -105,7 +107,7 @@ module GHI
105
107
  end
106
108
 
107
109
  def dimensions
108
- `stty size`.chomp.split(' ').map { |n| n.to_i }
110
+ `stty size 2>/dev/null`.chomp.split(' ').map { |n| n.to_i }
109
111
  end
110
112
 
111
113
  #--
@@ -118,7 +120,8 @@ module GHI
118
120
 
119
121
  def format_issues_header
120
122
  state = assigns[:state] ||= 'open'
121
- header = "# #{repo || 'Global,'} #{state} issues"
123
+ org = assigns[:org] ||= nil
124
+ header = "# #{repo || org || 'Global,'} #{state} issues"
122
125
  if repo
123
126
  if milestone = assigns[:milestone]
124
127
  case milestone
@@ -164,7 +167,6 @@ module GHI
164
167
  format_state assigns[:state], header
165
168
  end
166
169
 
167
- # TODO: Show milestones.
168
170
  def format_issues issues, include_repo
169
171
  return 'None.' if issues.empty?
170
172
 
@@ -184,15 +186,18 @@ module GHI
184
186
  p = i['pull_request']['html_url'] and l += 2
185
187
  c = i['comments']
186
188
  l += c.to_s.length + 1 unless c == 0
189
+ m = i['milestone']
187
190
  [
188
191
  " ",
189
192
  (i['repo'].to_s.rjust(rmax) if i['repo']),
190
193
  format_number(n.to_s.rjust(nmax)),
191
194
  truncate(title, l),
192
195
  format_labels(labels),
196
+ (fg(:green) { m['title'] } if m),
193
197
  (fg('aaaaaa') { c } unless c == 0),
194
198
  (fg('aaaaaa') { '↑' } if p),
195
- (fg(:yellow) { '@' } if a)
199
+ (fg(:yellow) { '@' } if a),
200
+ (fg('aaaaaa') { '‡' } if m)
196
201
  ].compact.join ' '
197
202
  }
198
203
  end
@@ -361,6 +366,7 @@ EOF
361
366
  def format_editor issue = nil
362
367
  message = ERB.new(<<EOF).result binding
363
368
 
369
+
364
370
  Please explain the issue. The first line will become the title. Trailing
365
371
  lines starting with '#' (like these) will be ignored, and empty messages will
366
372
  not be submitted. Issues are formatted with GitHub Flavored Markdown (GFM):
@@ -372,7 +378,11 @@ On <%= repo %>
372
378
  <%= no_color { format_issue issue, columns - 2 if issue } %>
373
379
  EOF
374
380
  message.rstrip!
375
- message.gsub!(/(?!\A)^.*$/) { |line| "# #{line}".rstrip }
381
+ message.gsub!(/(?!\A)^.*$/) { |line|
382
+ # unless line.empty?
383
+ "# #{line}".rstrip
384
+ # end
385
+ }
376
386
  message.insert 0, [
377
387
  issue['title'] || issue[:title], issue['body'] || issue[:body]
378
388
  ].compact.join("\n\n") if issue
@@ -403,9 +413,9 @@ EOF
403
413
  def format_comment_editor issue, comment = nil
404
414
  message = ERB.new(<<EOF).result binding
405
415
 
406
- Leave a comment. The first line will become the title. Trailing lines starting
407
- with '#' (like these) will be ignored, and empty messages will not be
408
- submitted. Comments are formatted with GitHub Flavored Markdown (GFM):
416
+ Leave a comment. Trailing lines starting with '#' (like these) will be ignored,
417
+ and empty messages will not be submitted. Comments are formatted with GitHub
418
+ Flavored Markdown (GFM):
409
419
 
410
420
  http://github.github.com/github-flavored-markdown
411
421
 
@@ -331,7 +331,11 @@ module GHI
331
331
  lang = code_block['lang']
332
332
  code = code_block['code']
333
333
 
334
- output = pygmentize(lang, code)
334
+ if lang != ""
335
+ output = pygmentize(lang, code)
336
+ else
337
+ output = code
338
+ end
335
339
  with_indentation(output, indent)
336
340
  rescue
337
341
  code_block
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Celis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2015-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -56,13 +56,16 @@ files:
56
56
  - lib/ghi/commands/command.rb
57
57
  - lib/ghi/commands/comment.rb
58
58
  - lib/ghi/commands/config.rb
59
+ - lib/ghi/commands/disable.rb
59
60
  - lib/ghi/commands/edit.rb
61
+ - lib/ghi/commands/enable.rb
60
62
  - lib/ghi/commands/help.rb
61
63
  - lib/ghi/commands/label.rb
62
64
  - lib/ghi/commands/list.rb
63
65
  - lib/ghi/commands/milestone.rb
64
66
  - lib/ghi/commands/open.rb
65
67
  - lib/ghi/commands/show.rb
68
+ - lib/ghi/commands/status.rb
66
69
  - lib/ghi/commands/version.rb
67
70
  - lib/ghi/editor.rb
68
71
  - lib/ghi/formatting.rb
@@ -88,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
91
  version: '0'
89
92
  requirements: []
90
93
  rubyforge_project:
91
- rubygems_version: 2.2.2
94
+ rubygems_version: 2.4.6
92
95
  signing_key:
93
96
  specification_version: 4
94
97
  summary: GitHub Issues command line interface