terjira 0.3.6 → 0.3.7

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: 97c9557a99f1b46a945bd05365da442a2a287778
4
- data.tar.gz: 906a3aa5aee440f7cc4bb10c062958de17a7598f
3
+ metadata.gz: 81619376a1f94486a87bad473155828c7df19ffb
4
+ data.tar.gz: cb695455adb913a7a34f62f4aac32e09786132b4
5
5
  SHA512:
6
- metadata.gz: 5755cb8806706a2431cec1e2104f3e6b3627710bdcb1f9557d33c976db9675a4c4501a5228fb19d5d6848f84c0f2042b5164cd8be474b7de256694c413267534
7
- data.tar.gz: 867fc972c7115b3a4d52bd2c1a1961cbdf6b97732a33acf2877ade2f38dc8c4c4fc206d4f2f72e8e9532bdf9b2a9f46de260918fc292855640e4355c0e4b60b6
6
+ metadata.gz: 92ccea746712cc915a5b77785a1a960deb9e7ad5a8f839ded15ceaa3819ebb818987b69d5897f05806fb2d09845706e3e2dcf7efd41ec2436745a44243d1df10
7
+ data.tar.gz: e72c0f6b9efbfe35161bbaf139ef598d2a824a8e101d75c3493ec5dc30635b8da62d8768e836adfc828094175acdcbf6cb596d8c0ba7eaffdd3f450e1fc1281e
data/.travis.yml CHANGED
@@ -7,7 +7,7 @@ addons:
7
7
  rvm:
8
8
  - 1.9.3
9
9
  - 2.0.0
10
- - 2.1.0
10
+ - 2.1.10
11
11
  - 2.2.0
12
12
  - 2.3.0
13
13
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- terjira (0.3.5)
4
+ terjira (0.3.7)
5
5
  activesupport (= 4.0.13)
6
6
  jira-ruby (~> 1.1.3)
7
7
  thor (~> 0.19.0)
data/README.md CHANGED
@@ -70,9 +70,12 @@ Issue:
70
70
  jira issue [ISSUE_KEY] # Show detail of the issue
71
71
  jira issue assign [ISSUE_KEY] ([ASSIGNEE]) # Assign the issue to user
72
72
  jira issue comment [ISSUE_KEY] # Write comment on the issue
73
+ # pass `-E` or `--editor` to open system default editor for composing comment
73
74
  jira issue delete [ISSUE_KEY] # Delete the issue
74
75
  jira issue edit [ISSUE_KEY] # Edit the issue
76
+ # pass `-E` or `--editor` to open system default editor for composing issue description
75
77
  jira issue new # Create an issue
78
+ # pass `-E` or `--editor` to open system default editor for composing issue description
76
79
  jira issue open [ISSUE_KEY] # Open browser
77
80
  jira issue take [ISSUE_KEY] # Assign the issue to self
78
81
  jira issue trans [ISSUE_KEY] ([STATUS]) # Do transition
data/bin/terjira CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Do I need bundler setup?
4
4
  require 'bundler/setup'
5
- require 'terjira'
5
+ require_relative '../lib/terjira'
6
6
  require 'json'
7
7
  require 'pastel'
8
8
 
@@ -19,5 +19,6 @@ rescue JIRA::HTTPError => e
19
19
  puts pastel.red(message['errors'].map { |k, v| "#{k}: #{v}" }.join(", "))
20
20
  end
21
21
  rescue => e
22
+ puts e.backtrace
22
23
  puts Pastel.new.dim(e.message)
23
24
  end
@@ -53,7 +53,7 @@ module Terjira
53
53
 
54
54
  desc 'new', 'Create an issue'
55
55
  jira_options :summary, :description, :project, :issuetype,
56
- :priority, :assignee, :parent, :epiclink
56
+ :priority, :assignee, :parent, :epiclink, :editor
57
57
  def new
58
58
  opts = suggest_options(required: [:project, :summary, :issuetype])
59
59
 
@@ -65,7 +65,7 @@ module Terjira
65
65
 
66
66
  desc 'edit [ISSUE_KEY]', 'Edit the issue'
67
67
  jira_options :summary, :description, :project, :issuetype,
68
- :priority, :assignee, :epiclink
68
+ :priority, :assignee, :epiclink, :editor
69
69
  def edit(issue)
70
70
  return puts "Pass options you need to update" if options.blank?
71
71
  issue = client_class.find(issue)
@@ -83,7 +83,7 @@ module Terjira
83
83
  end
84
84
 
85
85
  desc 'comment [ISSUE_KEY]', 'Write comment on the issue'
86
- jira_options :comment
86
+ jira_options :comment, :editor
87
87
  def comment(issue)
88
88
  opts = suggest_options(required: [:comment])
89
89
  issue = client_class.write_comment(issue, opts[:comment])
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ module Terjira
4
+ class Editor
5
+ def self.editor_text
6
+ editor = ENV['EDITOR']
7
+ if editor.nil? || editor.empty?
8
+ raise 'EDITOR environment variable not found. Please set a default editor.'
9
+ end
10
+
11
+ tmp_file = Tempfile.new('content')
12
+ success = system "#{editor} #{tmp_file.path}"
13
+ content = File.read(tmp_file.path) if success
14
+
15
+ tmp_file.unlink
16
+
17
+ raise 'Editor returned a non-zero exit code. Something must have gone wrong' unless success
18
+
19
+ content
20
+ end
21
+ end
22
+ end
@@ -2,15 +2,24 @@
2
2
 
3
3
  require 'tty-prompt'
4
4
  require_relative 'resource_store'
5
+ require_relative 'editor'
5
6
 
6
7
  module Terjira
7
8
  module OptionSelector
8
9
  delegate :get, :set, :fetch, to: :resource_store
9
10
 
11
+ def with_editor=(with_editor = false)
12
+ @with_editor = with_editor
13
+ end
14
+
15
+ def with_editor?
16
+ @with_editor || false
17
+ end
18
+
10
19
  def select_project
11
20
  fetch :project do
12
21
  projects = fetch(:projects) { Client::Project.all }
13
- option_prompt.select('Choose project?', per_page: per_page(projects)) do |menu|
22
+ option_select_prompt.select('Choose project?', per_page: per_page(projects)) do |menu|
14
23
  projects.each { |project| menu.choice project_choice_title(project), project }
15
24
  end
16
25
  end
@@ -19,7 +28,7 @@ module Terjira
19
28
  def select_board(type = nil)
20
29
  fetch(:board) do
21
30
  boards = fetch(:boards) { Client::Board.all(type: type) }
22
- option_prompt.select('Choose board?', per_page: per_page(boards)) do |menu|
31
+ option_select_prompt.select('Choose board?', per_page: per_page(boards)) do |menu|
23
32
  boards.sort_by(&:id).each do |board|
24
33
  menu.choice "#{board.key_value} - #{board.name}", board
25
34
  end
@@ -31,7 +40,7 @@ module Terjira
31
40
  fetch(:sprint) do
32
41
  board = select_board('scrum')
33
42
  sprints = fetch(:sprints) { Client::Sprint.all(board) }
34
- option_prompt.select('Choose sprint?') do |menu|
43
+ option_select_prompt.select('Choose sprint?') do |menu|
35
44
  sort_sprint_by_state(sprints).each do |sprint|
36
45
  menu.choice sprint_choice_title(sprint), sprint
37
46
  end
@@ -53,7 +62,7 @@ module Terjira
53
62
  end
54
63
  end
55
64
 
56
- option_prompt.select('Choose assignee?', per_page: per_page(users)) do |menu|
65
+ option_select_prompt.select('Choose assignee?', per_page: per_page(users)) do |menu|
57
66
  users.each { |user| menu.choice user_choice_title(user), user }
58
67
  end
59
68
  end
@@ -68,7 +77,7 @@ module Terjira
68
77
  set(:project, project)
69
78
  end
70
79
 
71
- option_prompt.select('Choose issue type?') do |menu|
80
+ option_select_prompt.select('Choose issue type?') do |menu|
72
81
  project.issuetypes.each do |issuetype|
73
82
  menu.choice issuetype.name, issuetype
74
83
  end
@@ -91,7 +100,7 @@ module Terjira
91
100
  Client::Status.all(project)
92
101
  end
93
102
 
94
- option_prompt.select('Choose status?') do |menu|
103
+ option_select_prompt.select('Choose status?') do |menu|
95
104
  statuses.each do |status|
96
105
  menu.choice status.name, status
97
106
  end
@@ -102,7 +111,7 @@ module Terjira
102
111
  def select_priority
103
112
  fetch(:priority) do
104
113
  priorities = fetch(:priorities) { Terjira::Client::Priority.all }
105
- option_prompt.select('Choose priority?') do |menu|
114
+ option_select_prompt.select('Choose priority?') do |menu|
106
115
  priorities.each do |priority|
107
116
  menu.choice priority.name, priority
108
117
  end
@@ -113,7 +122,7 @@ module Terjira
113
122
  def select_resolution
114
123
  fetch(:resolution) do
115
124
  resolutions = fetch(:resolutions) { Terjira::Client::Resolution.all }
116
- option_prompt.select('Choose resolution?') do |menu|
125
+ option_select_prompt.select('Choose resolution?') do |menu|
117
126
  resolutions.each do |resolution|
118
127
  menu.choice resolution.name, resolution
119
128
  end
@@ -133,15 +142,21 @@ module Terjira
133
142
 
134
143
  def write_comment
135
144
  fetch(:comment) do
136
- comment = option_prompt.multiline("Comment? (Return empty line for finish)\n")
137
- comment.join("") if comment
145
+ if with_editor?
146
+ Editor.editor_text
147
+ else
148
+ prompt_multiline('Comment')
149
+ end
138
150
  end
139
151
  end
140
152
 
141
153
  def write_description
142
154
  fetch(:description) do
143
- desc = option_prompt.multiline("Description? (Return empty line for finish)\n")
144
- desc.join("") if desc
155
+ if with_editor?
156
+ Editor.editor_text
157
+ else
158
+ prompt_multiline('Description')
159
+ end
145
160
  end
146
161
  end
147
162
 
@@ -155,6 +170,11 @@ module Terjira
155
170
 
156
171
  private
157
172
 
173
+ def prompt_multiline(prompt_for)
174
+ result = option_prompt.multiline("#{prompt_for}?")
175
+ result.join("") if result
176
+ end
177
+
158
178
  def sprint_choice_title(sprint)
159
179
  "#{sprint.key_value} - #{sprint.name} (#{sprint.state.capitalize})"
160
180
  end
@@ -172,7 +192,27 @@ module Terjira
172
192
  end
173
193
 
174
194
  def option_prompt
175
- @option_prompt ||= TTY::Prompt.new
195
+ @option_prompt ||= TTY::Prompt.new(help_color: :cyan)
196
+ end
197
+
198
+ def option_select_prompt
199
+ return @_option_select_prompt if @_option_select_prompt
200
+ @_option_select_prompt = TTY::Prompt.new(help_color: :cyan)
201
+ @_option_select_prompt.on(:keypress) do |event|
202
+ # emacs key binding
203
+ { "\u000E" => :keydown, "\u0010" => :keyup }.each do |key, action|
204
+ if event.value == key
205
+ @_option_select_prompt.trigger(action)
206
+ end
207
+ end
208
+ # vim key binding
209
+ { 'j' => :keydown, 'k' => :keyup, 'h' => :keyleft, 'l' => :keyright }.each do |key, action|
210
+ if event.value == key
211
+ @_option_select_prompt.trigger(action)
212
+ end
213
+ end
214
+ end
215
+ @_option_select_prompt
176
216
  end
177
217
 
178
218
  def per_page(objects)
@@ -58,6 +58,10 @@ module Terjira
58
58
  'epiclink' => {
59
59
  type: :string,
60
60
  aliases: '-e'
61
+ },
62
+ 'editor' => {
63
+ type: :boolean,
64
+ aliases: '-E'
61
65
  }
62
66
  }.freeze
63
67
 
@@ -31,6 +31,7 @@ module Terjira
31
31
  # and suggest list of option values
32
32
  def suggest_options(opts = {})
33
33
  origin = options.dup
34
+ self.with_editor = origin.delete(:editor)
34
35
 
35
36
  if opts[:required].is_a? Array
36
37
  opts[:required].inject(origin) do |memo, opt|
@@ -1,7 +1,7 @@
1
1
  require 'terjira/utils/file_cache'
2
2
 
3
3
  module Terjira
4
- VERSION = '0.3.6'.freeze
4
+ VERSION = '0.3.7'.freeze
5
5
 
6
6
  class VersionChecker
7
7
  VERSION_CHECK_DURATION = (60 * 60 * 24 * 5).freeze
data/terjira.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.require_paths = ["lib"]
22
22
 
23
23
  spec.add_dependency "thor", "~> 0.19.0"
24
- spec.add_dependency "jira-ruby", "~> 1.1.3"
24
+ spec.add_dependency "jira-ruby", "1.1.3"
25
25
  spec.add_dependency "activesupport", "4.0.13"
26
26
 
27
27
  spec.add_dependency "tty-table", "~> 0.8.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terjira
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaehyun Shin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-27 00:00:00.000000000 Z
11
+ date: 2017-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -28,14 +28,14 @@ dependencies:
28
28
  name: jira-ruby
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.1.3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.1.3
41
41
  - !ruby/object:Gem::Dependency
@@ -225,6 +225,7 @@ files:
225
225
  - lib/terjira/client/user.rb
226
226
  - lib/terjira/ext/jira_ruby.rb
227
227
  - lib/terjira/issue_cli.rb
228
+ - lib/terjira/option_support/editor.rb
228
229
  - lib/terjira/option_support/option_selector.rb
229
230
  - lib/terjira/option_support/resource_store.rb
230
231
  - lib/terjira/option_support/shared_options.rb