terjira 0.1.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 +7 -0
- data/.codeclimate.yml +13 -0
- data/.gitignore +52 -0
- data/.rspec +2 -0
- data/.rubocop.yml +26 -0
- data/.travis.yml +20 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +104 -0
- data/LICENSE.txt +21 -0
- data/README.md +47 -0
- data/Rakefile +10 -0
- data/Vagrantfile +26 -0
- data/bin/console +14 -0
- data/bin/jira +13 -0
- data/bin/setup +8 -0
- data/lib/terjira.rb +38 -0
- data/lib/terjira/base_cli.rb +36 -0
- data/lib/terjira/board_cli.rb +12 -0
- data/lib/terjira/client/agile.rb +41 -0
- data/lib/terjira/client/auth_option_builder.rb +42 -0
- data/lib/terjira/client/base.rb +72 -0
- data/lib/terjira/client/board.rb +20 -0
- data/lib/terjira/client/field.rb +17 -0
- data/lib/terjira/client/issue.rb +110 -0
- data/lib/terjira/client/jql_query_builer.rb +25 -0
- data/lib/terjira/client/priority.rb +14 -0
- data/lib/terjira/client/project.rb +25 -0
- data/lib/terjira/client/rapid_view.rb +8 -0
- data/lib/terjira/client/resolution.rb +14 -0
- data/lib/terjira/client/sprint.rb +28 -0
- data/lib/terjira/client/status.rb +15 -0
- data/lib/terjira/client/user.rb +44 -0
- data/lib/terjira/ext/jira_ruby.rb +70 -0
- data/lib/terjira/ext/tty_prompt.rb +34 -0
- data/lib/terjira/issue_cli.rb +110 -0
- data/lib/terjira/option_support/option_selector.rb +167 -0
- data/lib/terjira/option_support/resource_store.rb +45 -0
- data/lib/terjira/option_support/shared_options.rb +70 -0
- data/lib/terjira/option_supportable.rb +80 -0
- data/lib/terjira/presenters/board_presenter.rb +20 -0
- data/lib/terjira/presenters/common_presenter.rb +53 -0
- data/lib/terjira/presenters/issue_presenter.rb +175 -0
- data/lib/terjira/presenters/project_presenter.rb +69 -0
- data/lib/terjira/presenters/sprint_presenter.rb +68 -0
- data/lib/terjira/project_cli.rb +25 -0
- data/lib/terjira/rapidview_cli.rb +6 -0
- data/lib/terjira/sprint_cli.rb +58 -0
- data/lib/terjira/utils/file_cache.rb +110 -0
- data/lib/terjira/version.rb +3 -0
- data/terjira.gemspec +38 -0
- metadata +282 -0
@@ -0,0 +1,69 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'tty-prompt'
|
4
|
+
require 'tty-table'
|
5
|
+
|
6
|
+
module Terjira
|
7
|
+
module ProjectPresenter
|
8
|
+
def render_projects_summary(projects)
|
9
|
+
return render('Nothing.') if projects.blank?
|
10
|
+
head = %w(KEY NAME TYPE).map do |v|
|
11
|
+
{ value: v, alignment: :center }
|
12
|
+
end
|
13
|
+
|
14
|
+
rows = projects.map do |project|
|
15
|
+
[project.key, project.name, project.projectTypeKey]
|
16
|
+
end
|
17
|
+
|
18
|
+
table = TTY::Table.new head, rows
|
19
|
+
pastel = Pastel.new
|
20
|
+
|
21
|
+
result = table.render(:unicode, padding: [0, 1, 0, 1]) do |renderer|
|
22
|
+
renderer.filter = proc do |val, ri, ci|
|
23
|
+
if ri.zero? || ci.zero?
|
24
|
+
pastel.bold(val)
|
25
|
+
else
|
26
|
+
val
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
render(result)
|
32
|
+
end
|
33
|
+
|
34
|
+
def redner_project_detail(project)
|
35
|
+
head = nil
|
36
|
+
rows = []
|
37
|
+
rows << (pastel.blue.bold(project.key) + ' ' + project.name)
|
38
|
+
if project.respond_to?(:description)
|
39
|
+
rows << ''
|
40
|
+
rows << pastel.bold('Description')
|
41
|
+
rows << (project.description.strip.empty? ? 'None' : project.description)
|
42
|
+
end
|
43
|
+
rows << ''
|
44
|
+
|
45
|
+
rows << pastel.bold('Lead')
|
46
|
+
rows << username_with_email(project.lead)
|
47
|
+
rows << ''
|
48
|
+
rows << render_components_and_versions(project)
|
49
|
+
|
50
|
+
table = TTY::Table.new head, rows.map { |row| [row] }
|
51
|
+
result = table.render(:unicode, padding: [0, 1, 0, 1], multiline: true)
|
52
|
+
render(result)
|
53
|
+
end
|
54
|
+
|
55
|
+
def render_components_and_versions(project)
|
56
|
+
componets = project.components.map(&:name)
|
57
|
+
componets = componets.size.zero? ? 'Empty' : componets.join("\n")
|
58
|
+
versions = project.versions.reject(&:released).map(&:name)
|
59
|
+
versions = versions.size.zero? ? 'Empty' : versions.join("\n")
|
60
|
+
|
61
|
+
header = [pastel.bold('Components'),
|
62
|
+
pastel.bold('Unreleased versions')]
|
63
|
+
row = [[componets, versions]]
|
64
|
+
|
65
|
+
table = TTY::Table.new(header, row)
|
66
|
+
table.render(padding: [0, 1, 0, 0], multiline: true)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Terjira
|
4
|
+
module SprintPresenter
|
5
|
+
def render_sprint_detail(sprint)
|
6
|
+
return render("Empty") if sprint.nil?
|
7
|
+
attrs = sprint.attrs
|
8
|
+
summary = [
|
9
|
+
pastel.bold("#{sprint.id}. #{sprint.name} #{colorize_sprint_state(sprint.state)}"),
|
10
|
+
"#{attrs["goal"]}",
|
11
|
+
"#{formatted_date(attrs["startDate"])} ~ #{formatted_date(attrs["endDate"])}"
|
12
|
+
]
|
13
|
+
|
14
|
+
render(summary.reject(&:empty?).join("\n"))
|
15
|
+
end
|
16
|
+
|
17
|
+
def render_sprints_summary(sprints)
|
18
|
+
headers = ["ID", "Summary"].map { |h| pastel.bold(h) }
|
19
|
+
rows = []
|
20
|
+
sort_sprint_by_state(sprints).each do |sprint|
|
21
|
+
rows << [pastel.bold(sprint.id), summarise_sprint(sprint)]
|
22
|
+
end
|
23
|
+
|
24
|
+
table = TTY::Table.new(headers, rows)
|
25
|
+
result = table.render(:unicode, multiline: true) do |renderer|
|
26
|
+
renderer.border.separator = :each_row
|
27
|
+
end
|
28
|
+
render(result)
|
29
|
+
end
|
30
|
+
|
31
|
+
def summarise_sprint(sprint)
|
32
|
+
summary = colorize_sprint_state(sprint.state)
|
33
|
+
summary += " " + pastel.bold(sprint.name)
|
34
|
+
if sprint.respond_to? :startDate
|
35
|
+
summary += "\n"
|
36
|
+
summary += formatted_date(sprint.startDate) + " ~ "
|
37
|
+
summary += formatted_date(sprint.endDate) if sprint.respond_to? :endDate
|
38
|
+
end
|
39
|
+
summary += "\n#{sprint.goal}" if sprint.respond_to? :goal
|
40
|
+
summary
|
41
|
+
end
|
42
|
+
|
43
|
+
def colorize_sprint_state(state)
|
44
|
+
state = state.capitalize
|
45
|
+
if(state =~ /active/i)
|
46
|
+
pastel.on_blue.bold(state)
|
47
|
+
elsif(state =~ /close/i)
|
48
|
+
pastel.dim(state)
|
49
|
+
else
|
50
|
+
pastel.on_magenta.bold(state)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def sort_sprint_by_state(sprints)
|
55
|
+
sprints.sort_by do |sprint|
|
56
|
+
if sprint.state == 'active'
|
57
|
+
[0, sprint.id]
|
58
|
+
elsif sprint.state == 'future'
|
59
|
+
[1, sprint.id]
|
60
|
+
elsif sprint.state == 'closed'
|
61
|
+
[2, sprint.id * -1]
|
62
|
+
else
|
63
|
+
[3, 0]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base_cli'
|
2
|
+
|
3
|
+
module Terjira
|
4
|
+
class ProjectCLI < BaseCLI
|
5
|
+
default_task :show
|
6
|
+
|
7
|
+
desc '[PROJECT_KEY]', 'Show detail of project'
|
8
|
+
def show(project_key = nil)
|
9
|
+
if project_key.nil?
|
10
|
+
project = select_project
|
11
|
+
project_key = project.key_value
|
12
|
+
end
|
13
|
+
|
14
|
+
project = Client::Project.find(project_key)
|
15
|
+
redner_project_detail(project)
|
16
|
+
end
|
17
|
+
|
18
|
+
desc '( ls | list )', 'list of projects'
|
19
|
+
map ls: :list
|
20
|
+
def list
|
21
|
+
projects = Client::Project.all
|
22
|
+
render_projects_summary(projects)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative 'base_cli'
|
2
|
+
|
3
|
+
module Terjira
|
4
|
+
# CLI for Sprints
|
5
|
+
class SprintCLI < BaseCLI
|
6
|
+
no_commands do
|
7
|
+
def client_class
|
8
|
+
Client::Sprint
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
default_task :show
|
13
|
+
|
14
|
+
desc '[SPRINT_ID]', 'Default, show sprint'
|
15
|
+
jira_option(:assignee)
|
16
|
+
def show(sprint = nil)
|
17
|
+
opts = suggest_options(required: [:sprint], resources: { sprint: sprint })
|
18
|
+
sprint = client_class.find(opts[:sprint])
|
19
|
+
opts[:assignee] ||= current_username
|
20
|
+
|
21
|
+
issues = Client::Issue.all(opts.merge(sprint: sprint))
|
22
|
+
render_sprint_with_issues(sprint, issues)
|
23
|
+
end
|
24
|
+
|
25
|
+
desc 'active', 'Show active sprints and issues from the board'
|
26
|
+
jira_options :board, :assignee
|
27
|
+
def active
|
28
|
+
opts = suggest_options(required: [:board])
|
29
|
+
board = opts[:board]
|
30
|
+
sprints = client_class.find_active(board)
|
31
|
+
|
32
|
+
opts[:assignee] ||= current_username
|
33
|
+
|
34
|
+
sprints.each do |sprint|
|
35
|
+
issues = Client::Issue.all(opts.merge(sprint: sprint))
|
36
|
+
render_sprint_with_issues(sprint, issues)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc '( ls | list )', 'list all sprint from the board'
|
41
|
+
jira_options :board, :state
|
42
|
+
map ls: :list
|
43
|
+
def list
|
44
|
+
opts = suggest_options(required: [:board])
|
45
|
+
|
46
|
+
state = opts['state'].join(',') if opts['state']
|
47
|
+
sprints = client_class.all(opts[:board], state: state)
|
48
|
+
render_sprints_summary sprints
|
49
|
+
end
|
50
|
+
|
51
|
+
no_commands do
|
52
|
+
def render_sprint_with_issues(sprint, issues)
|
53
|
+
render_sprint_detail sprint
|
54
|
+
render_divided_issues_by_status issues
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Terjira
|
5
|
+
class FileCache
|
6
|
+
|
7
|
+
MAX_DEPTH = 32
|
8
|
+
ROOT_DIR = ENV["HOME"] ? "#{ENV["HOME"]}/.terjira/" : "~/.terjira/"
|
9
|
+
|
10
|
+
def initialize(domain, expiry = 0, depth = 2)
|
11
|
+
@domain = domain
|
12
|
+
@expiry = expiry
|
13
|
+
@depth = depth > MAX_DEPTH ? MAX_DEPTH : depth
|
14
|
+
FileUtils.mkdir_p(get_root)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Set a cache value for the given key. If the cache contains an existing value for
|
18
|
+
# the key it will be overwritten.
|
19
|
+
def set(key, value)
|
20
|
+
f = File.open(get_path(key), "w")
|
21
|
+
Marshal.dump(value, f)
|
22
|
+
f.close
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return the value for the specified key from the cache. Returns nil if
|
26
|
+
# the value isn't found.
|
27
|
+
def get(key)
|
28
|
+
path = get_path(key)
|
29
|
+
|
30
|
+
if @expiry > 0 && File.exist?(path) && Time.new - File.new(path).mtime >= @expiry
|
31
|
+
FileUtils.rm(path)
|
32
|
+
end
|
33
|
+
|
34
|
+
if File.exist?(path)
|
35
|
+
f = File.open(path, "r")
|
36
|
+
result = Marshal.load(f)
|
37
|
+
f.close
|
38
|
+
return result
|
39
|
+
else
|
40
|
+
return nil
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Return the value for the specified key from the cache if the key exists in the
|
45
|
+
# cache, otherwise set the value returned by the block. Returns the value if found
|
46
|
+
# or the value from calling the block that was set.
|
47
|
+
def fetch(key)
|
48
|
+
value = get(key)
|
49
|
+
return value if value
|
50
|
+
value = yield
|
51
|
+
set(key, value)
|
52
|
+
value
|
53
|
+
end
|
54
|
+
|
55
|
+
# Delete the value for the given key from the cache
|
56
|
+
def delete(key)
|
57
|
+
FileUtils.rm(get_path(key))
|
58
|
+
end
|
59
|
+
|
60
|
+
# Delete ALL data from the cache, regardless of expiry time
|
61
|
+
def clear
|
62
|
+
if File.exist?(get_root)
|
63
|
+
FileUtils.rm_r(get_root)
|
64
|
+
FileUtils.mkdir_p(get_root)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Delete all expired data from the cache
|
69
|
+
def purge
|
70
|
+
@t_purge = Time.new
|
71
|
+
purge_dir(get_root) if @expiry > 0
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def get_path(key)
|
77
|
+
md5 = Digest::MD5.hexdigest(key.to_s).to_s
|
78
|
+
|
79
|
+
dir = File.join(get_root, md5.split(//)[0..@depth - 1])
|
80
|
+
FileUtils.mkdir_p(dir)
|
81
|
+
return File.join(dir, md5)
|
82
|
+
end
|
83
|
+
|
84
|
+
def get_root
|
85
|
+
if @root == nil
|
86
|
+
@root = File.join(ROOT_DIR, @domain)
|
87
|
+
end
|
88
|
+
return @root
|
89
|
+
end
|
90
|
+
|
91
|
+
def purge_dir(dir)
|
92
|
+
Dir.foreach(dir) do |f|
|
93
|
+
next if f =~ /^\.\.?$/
|
94
|
+
path = File.join(dir, f)
|
95
|
+
if File.directory?(path)
|
96
|
+
purge_dir(path)
|
97
|
+
elsif @t_purge - File.new(path).mtime >= @expiry
|
98
|
+
# Ignore files starting with . - we didn't create those
|
99
|
+
next if f =~ /^\./
|
100
|
+
FileUtils.rm(path)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Delete empty directories
|
105
|
+
if Dir.entries(dir).delete_if{|e| e =~ /^\.\.?$/}.empty?
|
106
|
+
Dir.delete(dir)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
data/terjira.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
require 'terjira/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = "terjira"
|
9
|
+
spec.version = Terjira::VERSION
|
10
|
+
spec.authors = ["Jaehyun Shin"]
|
11
|
+
spec.email = ["keepcosmos@gmail.com"]
|
12
|
+
|
13
|
+
spec.summary = "Terjira is interactive command line app 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 reosurce key or id. Terjira suggests with interactive prompt."
|
15
|
+
spec.homepage = "https://github.com/keepcosmos/terjira"
|
16
|
+
spec.license = "MIT"
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|dev)/}) }
|
19
|
+
spec.bindir = "bin"
|
20
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
21
|
+
spec.require_paths = ["lib"]
|
22
|
+
|
23
|
+
spec.add_dependency "thor", "~> 0.19"
|
24
|
+
spec.add_dependency "jira-ruby", "~> 1.1"
|
25
|
+
spec.add_dependency "activesupport", "~> 4.0"
|
26
|
+
|
27
|
+
spec.add_dependency "tty-table", "~> 0.6.0"
|
28
|
+
spec.add_dependency "tty-prompt", "~> 0.8.0"
|
29
|
+
spec.add_dependency "tty-spinner", "~> 0.4.1"
|
30
|
+
spec.add_dependency "pastel", "~> 0.6.1"
|
31
|
+
|
32
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
33
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
34
|
+
spec.add_development_dependency "rspec", "~> 3.5"
|
35
|
+
spec.add_development_dependency "simplecov", "~> 0"
|
36
|
+
spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0"
|
37
|
+
spec.add_development_dependency "pry", "~> 0.10.0"
|
38
|
+
end
|
metadata
ADDED
@@ -0,0 +1,282 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: terjira
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jaehyun Shin
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: thor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.19'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.19'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jira-ruby
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '4.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '4.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: tty-table
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.6.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.6.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: tty-prompt
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.8.0
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.8.0
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: tty-spinner
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.4.1
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.4.1
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pastel
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.6.1
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 0.6.1
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: bundler
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.11'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.11'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '10.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '10.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '3.5'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '3.5'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: codeclimate-test-reporter
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '1.0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: pry
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - "~>"
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: 0.10.0
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - "~>"
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: 0.10.0
|
195
|
+
description: |-
|
196
|
+
Terjira is interactive and easy to use command line interface (or Application) for Jira.
|
197
|
+
You do not need to remember reosurce key or id. Terjira suggests with interactive prompt.
|
198
|
+
email:
|
199
|
+
- keepcosmos@gmail.com
|
200
|
+
executables:
|
201
|
+
- console
|
202
|
+
- jira
|
203
|
+
- setup
|
204
|
+
extensions: []
|
205
|
+
extra_rdoc_files: []
|
206
|
+
files:
|
207
|
+
- ".codeclimate.yml"
|
208
|
+
- ".gitignore"
|
209
|
+
- ".rspec"
|
210
|
+
- ".rubocop.yml"
|
211
|
+
- ".travis.yml"
|
212
|
+
- CODE_OF_CONDUCT.md
|
213
|
+
- Gemfile
|
214
|
+
- Gemfile.lock
|
215
|
+
- LICENSE.txt
|
216
|
+
- README.md
|
217
|
+
- Rakefile
|
218
|
+
- Vagrantfile
|
219
|
+
- bin/console
|
220
|
+
- bin/jira
|
221
|
+
- bin/setup
|
222
|
+
- lib/terjira.rb
|
223
|
+
- lib/terjira/base_cli.rb
|
224
|
+
- lib/terjira/board_cli.rb
|
225
|
+
- lib/terjira/client/agile.rb
|
226
|
+
- lib/terjira/client/auth_option_builder.rb
|
227
|
+
- lib/terjira/client/base.rb
|
228
|
+
- lib/terjira/client/board.rb
|
229
|
+
- lib/terjira/client/field.rb
|
230
|
+
- lib/terjira/client/issue.rb
|
231
|
+
- lib/terjira/client/jql_query_builer.rb
|
232
|
+
- lib/terjira/client/priority.rb
|
233
|
+
- lib/terjira/client/project.rb
|
234
|
+
- lib/terjira/client/rapid_view.rb
|
235
|
+
- lib/terjira/client/resolution.rb
|
236
|
+
- lib/terjira/client/sprint.rb
|
237
|
+
- lib/terjira/client/status.rb
|
238
|
+
- lib/terjira/client/user.rb
|
239
|
+
- lib/terjira/ext/jira_ruby.rb
|
240
|
+
- lib/terjira/ext/tty_prompt.rb
|
241
|
+
- lib/terjira/issue_cli.rb
|
242
|
+
- lib/terjira/option_support/option_selector.rb
|
243
|
+
- lib/terjira/option_support/resource_store.rb
|
244
|
+
- lib/terjira/option_support/shared_options.rb
|
245
|
+
- lib/terjira/option_supportable.rb
|
246
|
+
- lib/terjira/presenters/board_presenter.rb
|
247
|
+
- lib/terjira/presenters/common_presenter.rb
|
248
|
+
- lib/terjira/presenters/issue_presenter.rb
|
249
|
+
- lib/terjira/presenters/project_presenter.rb
|
250
|
+
- lib/terjira/presenters/sprint_presenter.rb
|
251
|
+
- lib/terjira/project_cli.rb
|
252
|
+
- lib/terjira/rapidview_cli.rb
|
253
|
+
- lib/terjira/sprint_cli.rb
|
254
|
+
- lib/terjira/utils/file_cache.rb
|
255
|
+
- lib/terjira/version.rb
|
256
|
+
- terjira.gemspec
|
257
|
+
homepage: https://github.com/keepcosmos/terjira
|
258
|
+
licenses:
|
259
|
+
- MIT
|
260
|
+
metadata: {}
|
261
|
+
post_install_message:
|
262
|
+
rdoc_options: []
|
263
|
+
require_paths:
|
264
|
+
- lib
|
265
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
266
|
+
requirements:
|
267
|
+
- - ">="
|
268
|
+
- !ruby/object:Gem::Version
|
269
|
+
version: '0'
|
270
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
271
|
+
requirements:
|
272
|
+
- - ">="
|
273
|
+
- !ruby/object:Gem::Version
|
274
|
+
version: '0'
|
275
|
+
requirements: []
|
276
|
+
rubyforge_project:
|
277
|
+
rubygems_version: 2.6.4
|
278
|
+
signing_key:
|
279
|
+
specification_version: 4
|
280
|
+
summary: Terjira is interactive command line app for Jira
|
281
|
+
test_files: []
|
282
|
+
has_rdoc:
|