jira_command 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'jira_command'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require 'irb'
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'jira_command'
4
+
5
+ JiraCommand::CLI.start
@@ -0,0 +1,31 @@
1
+ require_relative 'lib/jira_command/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'jira_command'
5
+ spec.version = JiraCommand::VERSION
6
+ spec.authors = ['shengbo.xu']
7
+ spec.email = ['shengbo.xu@xincere.jp']
8
+
9
+ spec.summary = 'jira cli'
10
+ spec.description = 'jira cli tool'
11
+ spec.homepage = 'https://github.com/xincere-inc/jira_command'
12
+ spec.license = 'MIT'
13
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.3.0')
14
+
15
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
16
+
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/xincere-inc/jira_command'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/xincere-inc/jira_command'
20
+
21
+ # Specify which files should be added to the gem when it is released.
22
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ end
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+
30
+ spec.add_dependency 'thor'
31
+ end
@@ -0,0 +1,7 @@
1
+ require 'jira_command/version'
2
+ require 'jira_command/cli'
3
+
4
+ module JiraCommand
5
+ class Error < StandardError; end
6
+ # Your code goes here...
7
+ end
@@ -0,0 +1,21 @@
1
+ require 'jira_command'
2
+ require 'thor'
3
+ require_relative 'command/list'
4
+ require_relative 'command/config'
5
+ require_relative 'command/user'
6
+ require_relative 'command/assign'
7
+ require_relative 'command/status'
8
+ require_relative 'command/transition'
9
+ require_relative 'command/issue'
10
+
11
+ module JiraCommand
12
+ class CLI < Thor
13
+ register(JiraCommand::Command::List, 'list', 'list', 'list up issues')
14
+ register(JiraCommand::Command::Config, 'config', 'config', 'create or clear configuration')
15
+ register(JiraCommand::Command::User, 'user', 'user', 'list all users')
16
+ register(JiraCommand::Command::Assign, 'assign', 'assign', 'set or unset assign in issue')
17
+ register(JiraCommand::Command::Status, 'status', 'status', 'show all status in project')
18
+ register(JiraCommand::Command::Transition, 'transition', 'transition', 'transition issues')
19
+ register(JiraCommand::Command::Issue, 'issue', 'issue', 'create a issue')
20
+ end
21
+ end
@@ -0,0 +1,48 @@
1
+ require 'thor'
2
+ require 'optparse'
3
+ require 'tty-prompt'
4
+ require_relative '../config'
5
+ require_relative '../jira/assign'
6
+
7
+ module JiraCommand
8
+ module Command
9
+ class Assign < Thor
10
+ desc 'exec', 'assign to user'
11
+ option 'issue', aliases: 'i', required: true
12
+ option 'refresh-user', aliases: 'ru', required: false
13
+ def exec
14
+ config = JiraCommand::Config.new.read
15
+
16
+ user_api = JiraCommand::Jira::User.new(config)
17
+ user_list = user_api.all_list(project: options['issue'].split('-').first)
18
+
19
+ user_list = if options['refresh-user'].nil?
20
+ config['users']
21
+ else
22
+ user_api = JiraCommand::Jira::User.new(config)
23
+ user_api.all_list(project: project[:key])
24
+ end
25
+
26
+ prompt = TTY::Prompt.new
27
+
28
+ assignee = prompt.select('Who do you want to assign?') do |menu|
29
+ user_list.each do |user|
30
+ menu.choice name: user[:name], value: user[:account_id]
31
+ end
32
+ end
33
+
34
+ assign = JiraCommand::Jira::Assign.new(config)
35
+ user_list = assign.execute(issue_key: options['issue'], assignee: assignee)
36
+ end
37
+
38
+ desc 'clear', 'set to unassigned'
39
+ option 'issue', aliases: 'i', required: false
40
+ def clear
41
+ config = JiraCommand::Config.new.read
42
+
43
+ assign = JiraCommand::Jira::Assign.new(config)
44
+ assign.unassigne(issue_key: options['issue'])
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,72 @@
1
+ require 'jira_command'
2
+ require 'thor'
3
+ require 'optparse'
4
+ require 'tty-prompt'
5
+ require_relative '../config'
6
+ require_relative '../jira/issuetype'
7
+ require_relative '../jira/project'
8
+ require_relative '../jira/user'
9
+ require 'base64'
10
+
11
+ module JiraCommand
12
+ module Command
13
+ class Config < Thor
14
+ desc 'create', 'create config file'
15
+ def create
16
+ if JiraCommand::Config.check_exist
17
+ puts 'config file has been already existed. if you want to renew it, please execute `jira_command config clear` first'
18
+ exit 1
19
+ end
20
+
21
+ prompt = TTY::Prompt.new
22
+
23
+ jira_url = prompt.ask('Please input your site url:')
24
+ email = prompt.ask('Please input your registered email address:')
25
+ token = prompt.mask('Please input your token:')
26
+
27
+ jira_url += '/' unless jira_url.end_with?('/')
28
+ config = { jira_url: jira_url, header_token: Base64.strict_encode64("#{email}:#{token}") }
29
+
30
+ JiraCommand::Config.new.write(config)
31
+ end
32
+
33
+ desc 'update_projects', 'update default projects in config file'
34
+ def update_projects
35
+ config = JiraCommand::Config.new.read
36
+
37
+ jira_project = JiraCommand::Jira::Project.new(config)
38
+ config.merge!({
39
+ projects: jira_project.list
40
+ })
41
+ JiraCommand::Config.new.write(config)
42
+ end
43
+
44
+ desc 'update_users', 'update default users in config file'
45
+ option 'project', aliases: 'p', required: true
46
+ def update_users
47
+ config = JiraCommand::Config.new.read
48
+ user_api = JiraCommand::Jira::User.new(config)
49
+ config.merge!({
50
+ users: user_api.all_list(project: options[:project])
51
+ })
52
+ JiraCommand::Config.new.write(config)
53
+ end
54
+
55
+ desc 'update_it', 'update default issue_type in config file'
56
+ def update_it
57
+ config = JiraCommand::Config.new.read
58
+ jira_issue_type = JiraCommand::Jira::IssueType.new(config)
59
+ config.merge!({
60
+ issue_types: jira_issue_type.list
61
+ })
62
+ JiraCommand::Config.new.write(config)
63
+ end
64
+
65
+ desc 'clear', 'clear config file'
66
+ def clear
67
+ prompt = TTY::Prompt.new
68
+ JiraCommand::Config.new.clear if prompt.yes?('Are you sure to clear?')
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,80 @@
1
+ require 'jira_command'
2
+ require_relative '../config'
3
+ require_relative '../jira/issuetype'
4
+ require_relative '../jira/project'
5
+ require_relative '../jira/issue'
6
+
7
+ module JiraCommand
8
+ module Command
9
+ class Issue < Thor
10
+ desc 'create', 'create new issue'
11
+ option 'refresh-project', aliases: 'rp', required: false
12
+ option 'refresh-issue-type', aliases: 'rit', required: false
13
+ option 'refresh-user', aliases: 'ru', required: false
14
+ def create
15
+ config = JiraCommand::Config.new.read
16
+
17
+ issue_types = if options['refresh-issue-type'].nil?
18
+ config['issue_types']
19
+ else
20
+ jira_issue_type = JiraCommand::Jira::IssueType.new(config)
21
+ jira_issue_type.list
22
+ end
23
+
24
+ prompt = TTY::Prompt.new
25
+
26
+ issue_type = prompt.select('Which issue type do you want to create?') do |menu|
27
+ issue_types.each do |item|
28
+ menu.choice name: item['name'], value: item['id']
29
+ end
30
+ end
31
+
32
+ projects = if options['refresh-project'].nil?
33
+ config['projects']
34
+ else
35
+ jira_project = JiraCommand::Jira::Project.new(config)
36
+ jira_project.list
37
+ end
38
+
39
+ project = prompt.select('Which project does the issue belong to?') do |menu|
40
+ projects.each do |item|
41
+ menu.choice name: item['name'], value: { id: item['id'], key: item['key'] }
42
+ end
43
+ end
44
+
45
+ user_list = if options['refresh-user'].nil?
46
+ config['users']
47
+ else
48
+ user_api = JiraCommand::Jira::User.new(config)
49
+ user_api.all_list(project: project[:key])
50
+ end
51
+
52
+ assignee = prompt.select('Who do you want to assign?') do |menu|
53
+ user_list.each do |user|
54
+ menu.choice name: user['name'], value: user['account_id']
55
+ end
56
+ end
57
+
58
+ reporter = prompt.select('Who are you?') do |menu|
59
+ user_list.each do |user|
60
+ menu.choice name: user['name'], value: user['account_id']
61
+ end
62
+ end
63
+
64
+ summary = prompt.ask('Please input issue summary: ')
65
+ description = prompt.ask('Please input issue description: ')
66
+
67
+ jira_issue = JiraCommand::Jira::Issue.new(config)
68
+
69
+ puts 'the created issue url: ' + jira_issue.create(
70
+ summary: summary,
71
+ description: description,
72
+ assignee: assignee,
73
+ reporter: reporter,
74
+ project_id: project[:id],
75
+ issuetype_id: issue_type
76
+ )
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,70 @@
1
+ require 'jira_command'
2
+ require 'thor'
3
+ require 'optparse'
4
+ require 'pry'
5
+ require_relative '../config'
6
+ require_relative '../jira/list'
7
+ require 'tty-prompt'
8
+ require 'base64'
9
+ require 'terminal-table'
10
+
11
+ module JiraCommand
12
+ module Command
13
+ class List < Thor
14
+ default_command :unresolved
15
+
16
+ desc 'all', 'list issues'
17
+ def all
18
+ config = JiraCommand::Config.new.read
19
+ list = JiraCommand::Jira::List.new(config)
20
+ issues_list = list.list({ fields: 'id,key,status,issuetype,assignee,summary' })
21
+ show_in_console(config['jira_url'], issues_list['issues'])
22
+ end
23
+
24
+ desc 'unresolved', 'list issues'
25
+ def unresolved
26
+ config = JiraCommand::Config.new.read
27
+ list = JiraCommand::Jira::List.new(config)
28
+ issues_list = list.list({ fields: 'id,key,status,issuetype,assignee,summary',
29
+ jql: 'status not in (resolved)' })
30
+
31
+ show_in_console(config['jira_url'], issues_list['issues'])
32
+ end
33
+
34
+ desc 'my', 'list your issues'
35
+ option 'current', aliases: 'c', required: false
36
+ option 'unresolved', aliases: 'u', required: false
37
+ def my
38
+ jql = ['assignee=currentUser()']
39
+ jql << 'sprint in openSprints()' unless options['current'].nil?
40
+ jql << 'status not in (resolved)' unless options['unresolved'].nil?
41
+
42
+ config = JiraCommand::Config.new.read
43
+ list = JiraCommand::Jira::List.new(config)
44
+ issues_list = list.list({ fields: 'id,key,status,issuetype,assignee,summary',
45
+ jql: jql.join('&') })
46
+
47
+ show_in_console(config['jira_url'], issues_list['issues'])
48
+ end
49
+
50
+ private
51
+
52
+ def show_in_console(jira_url, issues)
53
+ issue_list = issues.map do |issue|
54
+ { key: issue['key'],
55
+ summary: issue['fields']['summary'],
56
+ assignee: issue['fields']['assignee'].nil? ? 'not assinged' : issue['fields']['assignee']['displayName'],
57
+ type: issue['fields']['issuetype']['name'],
58
+ status: issue['fields']['status']['name'],
59
+ link: jira_url + 'browse/' + issue['key'] }
60
+ end
61
+
62
+ table = Terminal::Table.new
63
+ table.headings = issue_list.first.keys
64
+ table.rows = issue_list.sort_by { |data| "#{data['status']}-#{data['key']}-#{data['type']}" }.map(&:values)
65
+
66
+ puts table
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,21 @@
1
+ require 'thor'
2
+ require 'optparse'
3
+ require_relative '../config'
4
+ require_relative '../jira/status'
5
+
6
+ module JiraCommand
7
+ module Command
8
+ class Status < Thor
9
+ desc 'project', 'list status in specified project'
10
+ option 'project', aliases: 'p', required: true
11
+ def project
12
+ config = JiraCommand::Config.new.read
13
+
14
+ jira = JiraCommand::Jira::Status.new(config)
15
+ res = jira.list(project: options['project'])
16
+
17
+ puts res.map(:name)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,68 @@
1
+ require 'thor'
2
+ require 'optparse'
3
+ require 'tty-prompt'
4
+ require_relative '../config'
5
+ require_relative '../jira/transition'
6
+
7
+ module JiraCommand
8
+ module Command
9
+ class Transition < Thor
10
+ default_command :exec
11
+
12
+ desc 'exec', 'transit issue status'
13
+ option 'issue', aliases: 'i', required: true
14
+ def exec
15
+ config = JiraCommand::Config.new.read
16
+
17
+ jira = JiraCommand::Jira::Transition.new(config)
18
+ res = jira.list(issue_key: options['issue'])
19
+
20
+ prompt = TTY::Prompt.new
21
+
22
+ target_transition_id = prompt.select('Which status do you want to transite?') do |menu|
23
+ res.each do |transition|
24
+ menu.choice name: transition[:name], value: transition[:id]
25
+ end
26
+ end
27
+
28
+ jira.transite(issue_key: options['issue'], target_transition_id: target_transition_id)
29
+ end
30
+
31
+ desc 'issue', 'transite issue status'
32
+ option 'current', aliases: 'c', required: false
33
+ option 'mine', aliases: 'm', required: false
34
+ def issue
35
+ jql = []
36
+ jql << 'sprint in openSprints()' unless options['current'].nil?
37
+ jql << 'assignee=currentUser()' unless options['mine'].nil?
38
+
39
+ config = JiraCommand::Config.new.read
40
+
41
+ list = JiraCommand::Jira::List.new(config)
42
+ issues_list = list.list({ fields: 'key,status,assignee,summary',
43
+ jql: jql.join('&') })
44
+
45
+ prompt = TTY::Prompt.new
46
+
47
+ issue_key = prompt.select('Which issue do you want to transite?') do |menu|
48
+ issues_list['issues'].map do |i|
49
+ assignee = i['fields']['assignee']
50
+ menu.choice(name: "#{assignee.nil? ? 'not assigned' : assignee['displayName']}: #{i['fields']['summary']}(#{i['fields']['status']['name']})",
51
+ value: i['key'])
52
+ end
53
+ end
54
+
55
+ jira = JiraCommand::Jira::Transition.new(config)
56
+ res = jira.list(issue_key: issue_key)
57
+
58
+ target_transition_id = prompt.select('Which status do you want to transite?') do |menu|
59
+ res.each do |transition|
60
+ menu.choice name: transition[:name], value: transition[:id]
61
+ end
62
+ end
63
+
64
+ jira.transite(issue_key: issue_key, target_transition_id: target_transition_id)
65
+ end
66
+ end
67
+ end
68
+ end