terjira 0.4.3 → 0.4.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -1
- data/.travis.yml +12 -6
- data/Gemfile.lock +78 -82
- data/LICENSE.txt +1 -1
- data/README.md +6 -4
- data/lib/terjira/base_cli.rb +1 -1
- data/lib/terjira/client/auth_option_builder.rb +1 -1
- data/lib/terjira/client/board.rb +1 -1
- data/lib/terjira/client/issue.rb +3 -6
- data/lib/terjira/client/jql_builder.rb +2 -2
- data/lib/terjira/issue_cli.rb +5 -7
- data/lib/terjira/option_support/editor.rb +0 -2
- data/lib/terjira/option_support/option_selector.rb +6 -12
- data/lib/terjira/option_support/shared_options.rb +33 -33
- data/lib/terjira/option_supportable.rb +11 -11
- data/lib/terjira/presenters/board_presenter.rb +0 -2
- data/lib/terjira/presenters/common_presenter.rb +5 -3
- data/lib/terjira/presenters/issue_presenter.rb +1 -3
- data/lib/terjira/presenters/project_presenter.rb +0 -2
- data/lib/terjira/presenters/sprint_presenter.rb +1 -3
- data/lib/terjira/utils/file_cache.rb +1 -1
- data/lib/terjira/version.rb +1 -2
- data/terjira.gemspec +11 -12
- metadata +28 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a991b9bffdc241eecbee477c0472644b9c4bd995f0ff1ae1d5501fb6db744b22
|
4
|
+
data.tar.gz: be798aeb119fb896a56cdc486701a65dbfc83d145e8d02dec4276ad835233a1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a46d31fe879bebef6382d6175f9792632fa8e7cf7b31379ae805ca0807c6a6aa486bae041c58992910ee2630474b028efbbc4b9f1d721c1efefcccc111c5554b
|
7
|
+
data.tar.gz: 2ad8959446f5b6a1e27be7e791d4d0dd73752a9f1e67d17c92344bb8528c89db1526a078766c8de2729d91427fab40b4856e058032d67c225d0a986963ab4591
|
data/.gitignore
CHANGED
@@ -47,7 +47,7 @@ build-iPhoneSimulator/
|
|
47
47
|
# for a library or gem, you might want to ignore these files since the code is
|
48
48
|
# intended to run in multiple environments; otherwise, check them in:
|
49
49
|
# Gemfile.lock
|
50
|
-
|
50
|
+
.ruby-version
|
51
51
|
# .ruby-gemset
|
52
52
|
|
53
53
|
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
|
data/.travis.yml
CHANGED
@@ -5,15 +5,21 @@ addons:
|
|
5
5
|
repo_token: 98123461fbec752591c40e3e7af46bcdc6576723bfac2d89c084bfae989e4db3
|
6
6
|
|
7
7
|
rvm:
|
8
|
-
- 2.
|
9
|
-
- 2.
|
10
|
-
- 2.
|
11
|
-
- 2.3
|
8
|
+
- 2.5
|
9
|
+
- 2.6
|
10
|
+
- 2.7
|
12
11
|
|
13
12
|
before_install:
|
14
|
-
- gem install i18n --no-
|
13
|
+
- gem install i18n --no-document
|
14
|
+
|
15
|
+
before_script:
|
16
|
+
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
17
|
+
- chmod +x ./cc-test-reporter
|
18
|
+
- ./cc-test-reporter before-build
|
15
19
|
|
16
20
|
script: bundle exec rspec spec/
|
17
21
|
|
18
22
|
after_success:
|
19
|
-
|
23
|
+
after_script:
|
24
|
+
- ./cc-test-reporter format-coverage -t simplecov
|
25
|
+
- if [[ "$TRAVIS_TEST_RESULT" == 0 ]]; then ./cc-test-reporter upload-coverage; fi
|
data/Gemfile.lock
CHANGED
@@ -1,114 +1,110 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
terjira (0.4.
|
5
|
-
activesupport (
|
6
|
-
jira-ruby (
|
7
|
-
thor (~> 0.
|
8
|
-
tty-prompt (~> 0.
|
9
|
-
tty-spinner (~> 0.
|
10
|
-
tty-table (~> 0.
|
4
|
+
terjira (0.4.8)
|
5
|
+
activesupport (>= 4)
|
6
|
+
jira-ruby (~> 2.1)
|
7
|
+
thor (~> 1.0.1)
|
8
|
+
tty-prompt (~> 0.20.0)
|
9
|
+
tty-spinner (~> 0.9.3)
|
10
|
+
tty-table (~> 0.11.0)
|
11
11
|
|
12
12
|
GEM
|
13
13
|
remote: https://rubygems.org/
|
14
14
|
specs:
|
15
|
-
activesupport (
|
16
|
-
|
17
|
-
|
15
|
+
activesupport (6.0.3.4)
|
16
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
17
|
+
i18n (>= 0.7, < 2)
|
18
18
|
minitest (~> 5.1)
|
19
|
-
thread_safe (~> 0.1)
|
20
19
|
tzinfo (~> 1.1)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
i18n (
|
20
|
+
zeitwerk (~> 2.2, >= 2.2.2)
|
21
|
+
atlassian-jwt (0.2.0)
|
22
|
+
jwt (~> 2.1.0)
|
23
|
+
coderay (1.1.3)
|
24
|
+
concurrent-ruby (1.1.7)
|
25
|
+
diff-lcs (1.4.4)
|
26
|
+
docile (1.3.2)
|
27
|
+
equatable (0.6.1)
|
28
|
+
i18n (1.8.5)
|
30
29
|
concurrent-ruby (~> 1.0)
|
31
|
-
jira-ruby (1.
|
30
|
+
jira-ruby (2.1.3)
|
32
31
|
activesupport
|
32
|
+
atlassian-jwt
|
33
33
|
multipart-post
|
34
34
|
oauth (~> 0.5, >= 0.5.0)
|
35
|
-
|
36
|
-
method_source (0.
|
37
|
-
minitest (5.
|
38
|
-
multipart-post (2.
|
39
|
-
necromancer (0.
|
35
|
+
jwt (2.1.0)
|
36
|
+
method_source (0.9.2)
|
37
|
+
minitest (5.14.2)
|
38
|
+
multipart-post (2.1.1)
|
39
|
+
necromancer (0.5.1)
|
40
40
|
oauth (0.5.4)
|
41
|
-
pastel (0.7.
|
42
|
-
equatable (~> 0.
|
43
|
-
tty-color (~> 0.
|
44
|
-
pry (0.
|
41
|
+
pastel (0.7.4)
|
42
|
+
equatable (~> 0.6)
|
43
|
+
tty-color (~> 0.5)
|
44
|
+
pry (0.12.2)
|
45
45
|
coderay (~> 1.1.0)
|
46
|
-
method_source (~> 0.
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
rspec-
|
51
|
-
rspec-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
rspec-expectations (3.7.0)
|
46
|
+
method_source (~> 0.9.0)
|
47
|
+
rake (13.0.1)
|
48
|
+
rspec (3.10.0)
|
49
|
+
rspec-core (~> 3.10.0)
|
50
|
+
rspec-expectations (~> 3.10.0)
|
51
|
+
rspec-mocks (~> 3.10.0)
|
52
|
+
rspec-core (3.10.0)
|
53
|
+
rspec-support (~> 3.10.0)
|
54
|
+
rspec-expectations (3.10.0)
|
56
55
|
diff-lcs (>= 1.2.0, < 2.0)
|
57
|
-
rspec-support (~> 3.
|
58
|
-
rspec-mocks (3.
|
56
|
+
rspec-support (~> 3.10.0)
|
57
|
+
rspec-mocks (3.10.0)
|
59
58
|
diff-lcs (>= 1.2.0, < 2.0)
|
60
|
-
rspec-support (~> 3.
|
61
|
-
rspec-support (3.
|
62
|
-
simplecov (0.
|
63
|
-
docile (~> 1.1
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
thor (0.
|
59
|
+
rspec-support (~> 3.10.0)
|
60
|
+
rspec-support (3.10.0)
|
61
|
+
simplecov (0.19.1)
|
62
|
+
docile (~> 1.1)
|
63
|
+
simplecov-html (~> 0.11)
|
64
|
+
simplecov-html (0.12.3)
|
65
|
+
strings (0.1.8)
|
66
|
+
strings-ansi (~> 0.1)
|
67
|
+
unicode-display_width (~> 1.5)
|
68
|
+
unicode_utils (~> 1.4)
|
69
|
+
strings-ansi (0.2.0)
|
70
|
+
thor (1.0.1)
|
72
71
|
thread_safe (0.3.6)
|
73
|
-
|
74
|
-
|
75
|
-
tty-
|
76
|
-
|
77
|
-
tty-prompt (0.16.1)
|
78
|
-
necromancer (~> 0.4.0)
|
72
|
+
tty-color (0.6.0)
|
73
|
+
tty-cursor (0.7.1)
|
74
|
+
tty-prompt (0.20.0)
|
75
|
+
necromancer (~> 0.5.0)
|
79
76
|
pastel (~> 0.7.0)
|
80
|
-
|
81
|
-
|
82
|
-
tty-
|
83
|
-
|
84
|
-
tty-cursor (~> 0.5.0)
|
85
|
-
tty-screen (~> 0.6.4)
|
77
|
+
tty-reader (~> 0.7.0)
|
78
|
+
tty-reader (0.7.0)
|
79
|
+
tty-cursor (~> 0.7)
|
80
|
+
tty-screen (~> 0.7)
|
86
81
|
wisper (~> 2.0.0)
|
87
|
-
tty-screen (0.
|
88
|
-
tty-spinner (0.
|
89
|
-
|
90
|
-
|
91
|
-
|
82
|
+
tty-screen (0.8.1)
|
83
|
+
tty-spinner (0.9.3)
|
84
|
+
tty-cursor (~> 0.7)
|
85
|
+
tty-table (0.11.0)
|
86
|
+
equatable (~> 0.6)
|
87
|
+
necromancer (~> 0.5)
|
92
88
|
pastel (~> 0.7.2)
|
93
|
-
strings (~> 0.1.
|
94
|
-
tty-screen (~> 0.
|
95
|
-
tzinfo (1.2.
|
89
|
+
strings (~> 0.1.5)
|
90
|
+
tty-screen (~> 0.7)
|
91
|
+
tzinfo (1.2.8)
|
96
92
|
thread_safe (~> 0.1)
|
97
|
-
unicode-display_width (1.
|
93
|
+
unicode-display_width (1.7.0)
|
98
94
|
unicode_utils (1.4.0)
|
99
|
-
wisper (2.0.
|
95
|
+
wisper (2.0.1)
|
96
|
+
zeitwerk (2.4.1)
|
100
97
|
|
101
98
|
PLATFORMS
|
102
99
|
ruby
|
103
100
|
|
104
101
|
DEPENDENCIES
|
105
|
-
bundler (~> 1
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
rspec (~> 3.5)
|
102
|
+
bundler (~> 2.1)
|
103
|
+
pry (~> 0.12.0)
|
104
|
+
rake (~> 13.0)
|
105
|
+
rspec (~> 3.9)
|
110
106
|
simplecov (~> 0)
|
111
107
|
terjira!
|
112
108
|
|
113
109
|
BUNDLED WITH
|
114
|
-
1.
|
110
|
+
2.1.4
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
Terjira is an interactive and easy to use command line interface (or Application) for Jira. You do not need to remember the resource key or id. Terjira suggests it with an interactive prompt.
|
9
9
|
|
10
|
-
Your Jira must support Rest API 2.0 and Agile Rest API 1.0
|
10
|
+
Your Jira must support Rest API 2.0 and Agile Rest API 1.0.
|
11
11
|
|
12
12
|
## Demo
|
13
13
|
[Watch full demo](https://www.youtube.com/watch?v=T0hbhaXtH-Y)
|
@@ -33,7 +33,9 @@ If you have permission problem,
|
|
33
33
|
## Usage
|
34
34
|
```
|
35
35
|
Authentication:
|
36
|
-
jira login # Login your Jira
|
36
|
+
jira login # Login your Jira using your Jira email & password
|
37
|
+
# for Server or API token for Cloud.
|
38
|
+
# Refer: https://confluence.atlassian.com/cloud/api-tokens-938839638.html
|
37
39
|
# [--ssl-config] with ssl configuration
|
38
40
|
# [--proxy-config] with proxy configuration
|
39
41
|
jira logout # Logout your Jira
|
@@ -60,7 +62,7 @@ Sprint:
|
|
60
62
|
Issue:
|
61
63
|
jira issue help [COMMAND] # Describe one specific subcommand
|
62
64
|
jira issue ( ls | list ) # List of issues
|
63
|
-
#
|
65
|
+
# Default assignee option is current logged-in user
|
64
66
|
# To show issues of all users(include no assignee)
|
65
67
|
# pass `--assignee ALL` or `-a ALL`.
|
66
68
|
jira issue jql "[QUERY]" # Search issues with JQL
|
@@ -80,7 +82,7 @@ Issue:
|
|
80
82
|
jira issue new # Create an issue
|
81
83
|
# pass `-E` or `--editor` to open system default editor for composing issue description
|
82
84
|
jira issue open [ISSUE_KEY] # Open browser
|
83
|
-
jira issue url [ISSUE_KEY] #
|
85
|
+
jira issue url [ISSUE_KEY] # Return url of the issue
|
84
86
|
jira issue take [ISSUE_KEY] # Assign the issue to self
|
85
87
|
jira issue trans [ISSUE_KEY] ([STATUS]) # Do transition
|
86
88
|
|
data/lib/terjira/base_cli.rb
CHANGED
@@ -30,7 +30,7 @@ module Terjira
|
|
30
30
|
key(:site).ask('Site (ex: https://myjira.atlassian.net):', required: true)
|
31
31
|
key(:context_path).ask('Jira path in your site (just press enter if you don\'t have):', default: '')
|
32
32
|
key(:username).ask('Username:', required: true)
|
33
|
-
key(:password).mask('Password:', required: true)
|
33
|
+
key(:password).mask('Password (Server) / API Token (Cloud):', required: true)
|
34
34
|
|
35
35
|
if options['ssl-config']
|
36
36
|
key(:use_ssl).yes?('Use SSL?')
|
data/lib/terjira/client/board.rb
CHANGED
@@ -20,7 +20,7 @@ module Terjira
|
|
20
20
|
def backlog(board_id, options = {})
|
21
21
|
jql = build_jql(options)
|
22
22
|
resp = if jql.present?
|
23
|
-
|
23
|
+
agile_api_get("board/#{board_id}/backlog", jql: jql)
|
24
24
|
else
|
25
25
|
agile_api_get("board/#{board_id}/backlog")
|
26
26
|
end
|
data/lib/terjira/client/issue.rb
CHANGED
@@ -7,7 +7,6 @@ module Terjira
|
|
7
7
|
delegate :jql, :find, to: :resource
|
8
8
|
|
9
9
|
def all(options = {})
|
10
|
-
options.delete(:assignee) if options[:assignee] =~ /^all/i
|
11
10
|
return resource.all if options.blank?
|
12
11
|
max_results = options.delete(:max_results) || 500
|
13
12
|
jql(build_jql(options), max_results: max_results)
|
@@ -61,7 +60,7 @@ module Terjira
|
|
61
60
|
def update(issue, options = {})
|
62
61
|
params = extract_to_update_params(options)
|
63
62
|
params.merge!(extract_to_fields_params(options))
|
64
|
-
|
63
|
+
api_put "issue/#{issue.key_value}", params.to_json
|
65
64
|
find(issue)
|
66
65
|
end
|
67
66
|
|
@@ -96,14 +95,12 @@ module Terjira
|
|
96
95
|
|
97
96
|
custom_fields = options.keys.select { |k| k.to_s =~ /^customfield/ }
|
98
97
|
|
99
|
-
(custom_fields + [:summary, :description]).
|
98
|
+
(custom_fields + [:summary, :description]).each_entry do |k, _v|
|
100
99
|
params[k] = opts.delete(k) if opts.key?(k)
|
101
100
|
end
|
102
101
|
|
103
102
|
[:project, :parent].each do |resource|
|
104
|
-
if opts.key?(resource)
|
105
|
-
params[resource] = { key: opts.delete(resource).key_value }
|
106
|
-
end
|
103
|
+
params[resource] = { key: opts.delete(resource).key_value } if opts.key?(resource)
|
107
104
|
end
|
108
105
|
|
109
106
|
opts.each { |k, v| params[k] = convert_param_key_value_hash(v) }
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module Terjira
|
2
2
|
module Client
|
3
3
|
module JQLBuilder
|
4
|
-
STRICT_KEYS = %w
|
5
|
-
SEARCH_KEYS = %w
|
4
|
+
STRICT_KEYS = %w[sprint assignee issuetype priority project status statusCategory].freeze
|
5
|
+
SEARCH_KEYS = %w[summary description].freeze
|
6
6
|
|
7
7
|
def build_jql(options = {})
|
8
8
|
search = options.select { |k, _v| SEARCH_KEYS.include?(k.to_s) }
|
data/lib/terjira/issue_cli.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require_relative 'base_cli'
|
4
2
|
|
5
3
|
module Terjira
|
@@ -56,8 +54,8 @@ module Terjira
|
|
56
54
|
end
|
57
55
|
|
58
56
|
desc 'new', 'Create an issue'
|
59
|
-
jira_options :
|
60
|
-
:
|
57
|
+
jira_options :assignee, :description, :epiclink, :editor,
|
58
|
+
:project, :priority, :summary, :issuetype, :parent
|
61
59
|
def new
|
62
60
|
opts = suggest_options(required: [:project, :summary, :issuetype])
|
63
61
|
|
@@ -68,10 +66,10 @@ module Terjira
|
|
68
66
|
end
|
69
67
|
|
70
68
|
desc 'edit [ISSUE_KEY]', 'Edit the issue'
|
71
|
-
jira_options :
|
72
|
-
:
|
69
|
+
jira_options :assignee, :epiclink, :editor, :description,
|
70
|
+
:project, :priority, :summary, :issuetype
|
73
71
|
def edit(issue)
|
74
|
-
return puts "Pass options
|
72
|
+
return puts "Pass options to be updated. Use 'jira issue help edit' for the options." if options.blank?
|
75
73
|
issue = client_class.find(issue)
|
76
74
|
opts = suggest_options(resources: { issue: issue })
|
77
75
|
suggest_related_value_options(opts)
|
@@ -1,8 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'tty-prompt'
|
4
|
-
require_relative 'resource_store'
|
5
2
|
require_relative 'editor'
|
3
|
+
require_relative 'resource_store'
|
6
4
|
|
7
5
|
module Terjira
|
8
6
|
module OptionSelector
|
@@ -135,12 +133,12 @@ module Terjira
|
|
135
133
|
|
136
134
|
def write_epiclink_key
|
137
135
|
fetch(:epiclink) do
|
138
|
-
option_prompt.ask('Epic
|
136
|
+
option_prompt.ask('Epic Key?')
|
139
137
|
end
|
140
138
|
end
|
141
139
|
|
142
140
|
def write_epic_name
|
143
|
-
option_prompt.ask('Epic
|
141
|
+
option_prompt.ask('Epic Name?')
|
144
142
|
end
|
145
143
|
|
146
144
|
def write_comment
|
@@ -180,7 +178,7 @@ module Terjira
|
|
180
178
|
end
|
181
179
|
|
182
180
|
def write_parent_issue_key
|
183
|
-
fetch(:parent) { option_prompt.ask('Parent
|
181
|
+
fetch(:parent) { option_prompt.ask('Parent Issue Key?') }
|
184
182
|
end
|
185
183
|
|
186
184
|
private
|
@@ -241,15 +239,11 @@ module Terjira
|
|
241
239
|
@_option_select_prompt.on(:keypress) do |event|
|
242
240
|
# emacs key binding
|
243
241
|
{ "\u000E" => :keydown, "\u0010" => :keyup }.each do |key, action|
|
244
|
-
if event.value == key
|
245
|
-
@_option_select_prompt.trigger(action)
|
246
|
-
end
|
242
|
+
@_option_select_prompt.trigger(action) if event.value == key
|
247
243
|
end
|
248
244
|
# vim key binding
|
249
245
|
{ 'j' => :keydown, 'k' => :keyup, 'h' => :keyleft, 'l' => :keyright }.each do |key, action|
|
250
|
-
if event.value == key
|
251
|
-
@_option_select_prompt.trigger(action)
|
252
|
-
end
|
246
|
+
@_option_select_prompt.trigger(action) if event.value == key
|
253
247
|
end
|
254
248
|
end
|
255
249
|
@_option_select_prompt
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Terjira
|
2
2
|
module SharedOptions
|
3
3
|
OPTIONS = {
|
4
|
-
'
|
4
|
+
'assignee' => {
|
5
5
|
type: :string,
|
6
|
-
aliases: '-
|
6
|
+
aliases: '-a'
|
7
7
|
},
|
8
8
|
'board' => {
|
9
9
|
type: :numeric,
|
@@ -11,57 +11,57 @@ module Terjira
|
|
11
11
|
banner: 'BOARD_ID',
|
12
12
|
lazy_default: 'board'
|
13
13
|
},
|
14
|
-
'
|
15
|
-
type: :numeric,
|
16
|
-
banner: 'SPRINT_ID',
|
17
|
-
lazy_default: 'sprint'
|
18
|
-
},
|
19
|
-
'assignee' => {
|
14
|
+
'description' => {
|
20
15
|
type: :string,
|
21
|
-
aliases: '-
|
22
|
-
},
|
23
|
-
'state' => {
|
24
|
-
type: :array,
|
25
|
-
aliases: '-s',
|
26
|
-
default: %w(Active Future),
|
27
|
-
lazy_default: %w(Active Future),
|
28
|
-
enum: %w(Active Future Closed)
|
16
|
+
aliases: '-d'
|
29
17
|
},
|
30
|
-
'
|
18
|
+
'epiclink' => {
|
31
19
|
type: :string,
|
32
|
-
aliases: '-
|
20
|
+
aliases: '-e'
|
33
21
|
},
|
34
|
-
'
|
22
|
+
'editor' => {
|
23
|
+
type: :boolean,
|
24
|
+
aliases: '-E'
|
25
|
+
},
|
26
|
+
'comment' => {
|
35
27
|
type: :string,
|
36
|
-
aliases: '-
|
28
|
+
aliases: '-m'
|
37
29
|
},
|
38
|
-
'
|
30
|
+
'project' => {
|
39
31
|
type: :string,
|
40
|
-
aliases: '-
|
32
|
+
aliases: '-p'
|
41
33
|
},
|
42
34
|
'priority' => {
|
43
35
|
type: :string,
|
44
36
|
aliases: '-P'
|
45
37
|
},
|
46
|
-
'
|
38
|
+
'resolution' => {
|
47
39
|
type: :string,
|
48
|
-
aliases: '-
|
40
|
+
aliases: '-r'
|
49
41
|
},
|
50
|
-
'
|
42
|
+
'state' => {
|
43
|
+
type: :array,
|
44
|
+
aliases: '-s',
|
45
|
+
default: %w[Active Future],
|
46
|
+
lazy_default: %w[Active Future],
|
47
|
+
enum: %w[Active Future Closed]
|
48
|
+
},
|
49
|
+
'status' => {
|
51
50
|
type: :string,
|
52
|
-
aliases: '-
|
51
|
+
aliases: '-s',
|
53
52
|
},
|
54
|
-
'
|
53
|
+
'summary' => {
|
55
54
|
type: :string,
|
56
|
-
aliases: '-
|
55
|
+
aliases: '-S'
|
57
56
|
},
|
58
|
-
'
|
57
|
+
'issuetype' => {
|
59
58
|
type: :string,
|
60
|
-
aliases: '-
|
59
|
+
aliases: '-t'
|
61
60
|
},
|
62
|
-
'
|
63
|
-
type: :
|
64
|
-
|
61
|
+
'sprint' => {
|
62
|
+
type: :numeric,
|
63
|
+
banner: 'SPRINT_ID',
|
64
|
+
lazy_default: 'sprint'
|
65
65
|
}
|
66
66
|
}.freeze
|
67
67
|
|
@@ -13,22 +13,22 @@ module Terjira
|
|
13
13
|
end
|
14
14
|
|
15
15
|
OPTION_TO_SELECTOR = {
|
16
|
-
|
16
|
+
assignee: :select_assignee,
|
17
17
|
board: :select_board,
|
18
|
-
|
18
|
+
comment: :write_comment,
|
19
19
|
description: :write_description,
|
20
|
-
|
20
|
+
editable_comment: :update_comment,
|
21
|
+
epiclink: :write_epiclink_key,
|
21
22
|
issuetype: :select_issuetype,
|
22
|
-
assignee: :select_assignee,
|
23
|
-
status: :select_issue_status,
|
24
23
|
priority: :select_priority,
|
24
|
+
project: :select_project,
|
25
25
|
resolution: :select_resolution,
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
sprint: :select_sprint,
|
27
|
+
status: :select_issue_status,
|
28
|
+
summary: :write_summary
|
29
29
|
}.freeze
|
30
30
|
|
31
|
-
# Transforming and
|
31
|
+
# Transforming and cleaning options
|
32
32
|
# and suggest list of option values
|
33
33
|
def suggest_options(opts = {})
|
34
34
|
origin = options.dup
|
@@ -63,13 +63,13 @@ module Terjira
|
|
63
63
|
default_value_options = Hash[default_value_options]
|
64
64
|
|
65
65
|
# Suggest option values and save to resource store
|
66
|
-
default_value_options.
|
66
|
+
default_value_options.each_key do |k, _v|
|
67
67
|
selector_method = OPTION_TO_SELECTOR[k.to_sym]
|
68
68
|
send(selector_method) if selector_method
|
69
69
|
end
|
70
70
|
|
71
71
|
# Fetch selected values from resource store
|
72
|
-
default_value_options.
|
72
|
+
default_value_options.each_key do |k, _v|
|
73
73
|
default_value_options[k] = resource_store.get(k)
|
74
74
|
end
|
75
75
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'tty-table'
|
4
2
|
require 'pastel'
|
5
3
|
|
@@ -34,7 +32,11 @@ module Terjira
|
|
34
32
|
if user.nil?
|
35
33
|
dim_none
|
36
34
|
else
|
37
|
-
|
35
|
+
begin
|
36
|
+
"#{user.displayName} (#{user.name})"
|
37
|
+
rescue NoMethodError
|
38
|
+
user.displayName.to_s
|
39
|
+
end
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
require 'tty-prompt'
|
4
2
|
require 'tty-table'
|
5
3
|
require 'pastel'
|
@@ -203,7 +201,7 @@ module Terjira
|
|
203
201
|
|
204
202
|
def extract_status_names(issues)
|
205
203
|
issue_names = issues.sort_by do |issue|
|
206
|
-
status_key = %w
|
204
|
+
status_key = %w[new indeterminate done]
|
207
205
|
idx = if issue.status.respond_to? :statusCategory
|
208
206
|
status_key.index(issue.status.statusCategory['key'])
|
209
207
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module Terjira
|
4
2
|
module SprintPresenter
|
5
3
|
def render_sprint_detail(sprint)
|
@@ -15,7 +13,7 @@ module Terjira
|
|
15
13
|
end
|
16
14
|
|
17
15
|
def render_sprints_summary(sprints)
|
18
|
-
headers = %w
|
16
|
+
headers = %w[ID Summary].map { |h| pastel.bold(h) }
|
19
17
|
rows = []
|
20
18
|
sort_sprint_by_state(sprints).each do |sprint|
|
21
19
|
rows << [pastel.bold(sprint.id), summarise_sprint(sprint)]
|
@@ -60,7 +60,7 @@ module Terjira
|
|
60
60
|
|
61
61
|
# Delete the value for the given key from the cache
|
62
62
|
def delete(key)
|
63
|
-
FileUtils.rm(get_path(key)) if File.
|
63
|
+
FileUtils.rm(get_path(key)) if File.exist? get_path(key)
|
64
64
|
end
|
65
65
|
|
66
66
|
# Delete ALL data from the cache, regardless of expiry time
|
data/lib/terjira/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'terjira/utils/file_cache'
|
2
2
|
|
3
3
|
module Terjira
|
4
|
-
VERSION = '0.4.
|
4
|
+
VERSION = '0.4.8'.freeze
|
5
5
|
|
6
6
|
class VersionChecker
|
7
7
|
VERSION_CHECK_DURATION = (60 * 60 * 24 * 5).freeze
|
@@ -43,6 +43,5 @@ module Terjira
|
|
43
43
|
@version_alert_cache ||= Terjira::FileCache.new("version", VERSION_CHECK_DURATION)
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
46
|
end
|
48
47
|
end
|
data/terjira.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.email = ["keepcosmos@gmail.com"]
|
12
12
|
|
13
13
|
spec.summary = "Terjira is interactive command line application for Jira"
|
14
|
-
spec.description = "Terjira is interactive and easy to use command line interface (or Application) for Jira.\nYou do not need to remember
|
14
|
+
spec.description = "Terjira is interactive and easy to use command line interface (or Application) for Jira.\nYou do not need to remember resource key or id. Terjira suggests with interactive prompt."
|
15
15
|
spec.homepage = "https://github.com/keepcosmos/terjira"
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
@@ -20,18 +20,17 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.executables = ["bin/jira"].map { |f| File.basename(f) }
|
21
21
|
spec.require_paths = ["lib"]
|
22
22
|
|
23
|
-
spec.add_dependency "thor", "~> 0.
|
24
|
-
spec.add_dependency "jira-ruby", "1
|
25
|
-
spec.add_dependency "activesupport", "4
|
23
|
+
spec.add_dependency "thor", "~> 1.0.1"
|
24
|
+
spec.add_dependency "jira-ruby", "~> 2.1"
|
25
|
+
spec.add_dependency "activesupport", ">= 4"
|
26
26
|
|
27
|
-
spec.add_dependency "tty-table", "~> 0.
|
28
|
-
spec.add_dependency "tty-prompt", "~> 0.
|
29
|
-
spec.add_dependency "tty-spinner", "~> 0.
|
27
|
+
spec.add_dependency "tty-table", "~> 0.11.0"
|
28
|
+
spec.add_dependency "tty-prompt", "~> 0.20.0"
|
29
|
+
spec.add_dependency "tty-spinner", "~> 0.9.3"
|
30
30
|
|
31
|
-
spec.add_development_dependency "bundler", "~> 1
|
32
|
-
spec.add_development_dependency "rake", "~>
|
33
|
-
spec.add_development_dependency "rspec", "~> 3.
|
31
|
+
spec.add_development_dependency "bundler", "~> 2.1"
|
32
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
33
|
+
spec.add_development_dependency "rspec", "~> 3.9"
|
34
34
|
spec.add_development_dependency "simplecov", "~> 0"
|
35
|
-
spec.add_development_dependency "
|
36
|
-
spec.add_development_dependency "pry", "~> 0.10.0"
|
35
|
+
spec.add_development_dependency "pry", "~> 0.12.0"
|
37
36
|
end
|
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.4.
|
4
|
+
version: 0.4.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jaehyun Shin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -16,126 +16,126 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 1.0.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 1.0.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jira-ruby
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1
|
33
|
+
version: '2.1'
|
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
|
-
version: 1
|
40
|
+
version: '2.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 4
|
47
|
+
version: '4'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 4
|
54
|
+
version: '4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: tty-table
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.11.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.11.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: tty-prompt
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
75
|
+
version: 0.20.0
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.
|
82
|
+
version: 0.20.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: tty-spinner
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.
|
89
|
+
version: 0.9.3
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.
|
96
|
+
version: 0.9.3
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: bundler
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1
|
103
|
+
version: '2.1'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1
|
110
|
+
version: '2.1'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rake
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '13.0'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
124
|
+
version: '13.0'
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: rspec
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '3.
|
131
|
+
version: '3.9'
|
132
132
|
type: :development
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '3.
|
138
|
+
version: '3.9'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: simplecov
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,37 +150,23 @@ dependencies:
|
|
150
150
|
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: codeclimate-test-reporter
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - "~>"
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '1.0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - "~>"
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '1.0'
|
167
153
|
- !ruby/object:Gem::Dependency
|
168
154
|
name: pry
|
169
155
|
requirement: !ruby/object:Gem::Requirement
|
170
156
|
requirements:
|
171
157
|
- - "~>"
|
172
158
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0.
|
159
|
+
version: 0.12.0
|
174
160
|
type: :development
|
175
161
|
prerelease: false
|
176
162
|
version_requirements: !ruby/object:Gem::Requirement
|
177
163
|
requirements:
|
178
164
|
- - "~>"
|
179
165
|
- !ruby/object:Gem::Version
|
180
|
-
version: 0.
|
166
|
+
version: 0.12.0
|
181
167
|
description: |-
|
182
168
|
Terjira is interactive and easy to use command line interface (or Application) for Jira.
|
183
|
-
You do not need to remember
|
169
|
+
You do not need to remember resource key or id. Terjira suggests with interactive prompt.
|
184
170
|
email:
|
185
171
|
- keepcosmos@gmail.com
|
186
172
|
executables:
|
@@ -260,8 +246,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
260
246
|
- !ruby/object:Gem::Version
|
261
247
|
version: '0'
|
262
248
|
requirements: []
|
263
|
-
|
264
|
-
rubygems_version: 2.6.11
|
249
|
+
rubygems_version: 3.0.6
|
265
250
|
signing_key:
|
266
251
|
specification_version: 4
|
267
252
|
summary: Terjira is interactive command line application for Jira
|