terjira 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +13 -0
  3. data/.gitignore +52 -0
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +26 -0
  6. data/.travis.yml +20 -0
  7. data/CODE_OF_CONDUCT.md +49 -0
  8. data/Gemfile +4 -0
  9. data/Gemfile.lock +104 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +47 -0
  12. data/Rakefile +10 -0
  13. data/Vagrantfile +26 -0
  14. data/bin/console +14 -0
  15. data/bin/jira +13 -0
  16. data/bin/setup +8 -0
  17. data/lib/terjira.rb +38 -0
  18. data/lib/terjira/base_cli.rb +36 -0
  19. data/lib/terjira/board_cli.rb +12 -0
  20. data/lib/terjira/client/agile.rb +41 -0
  21. data/lib/terjira/client/auth_option_builder.rb +42 -0
  22. data/lib/terjira/client/base.rb +72 -0
  23. data/lib/terjira/client/board.rb +20 -0
  24. data/lib/terjira/client/field.rb +17 -0
  25. data/lib/terjira/client/issue.rb +110 -0
  26. data/lib/terjira/client/jql_query_builer.rb +25 -0
  27. data/lib/terjira/client/priority.rb +14 -0
  28. data/lib/terjira/client/project.rb +25 -0
  29. data/lib/terjira/client/rapid_view.rb +8 -0
  30. data/lib/terjira/client/resolution.rb +14 -0
  31. data/lib/terjira/client/sprint.rb +28 -0
  32. data/lib/terjira/client/status.rb +15 -0
  33. data/lib/terjira/client/user.rb +44 -0
  34. data/lib/terjira/ext/jira_ruby.rb +70 -0
  35. data/lib/terjira/ext/tty_prompt.rb +34 -0
  36. data/lib/terjira/issue_cli.rb +110 -0
  37. data/lib/terjira/option_support/option_selector.rb +167 -0
  38. data/lib/terjira/option_support/resource_store.rb +45 -0
  39. data/lib/terjira/option_support/shared_options.rb +70 -0
  40. data/lib/terjira/option_supportable.rb +80 -0
  41. data/lib/terjira/presenters/board_presenter.rb +20 -0
  42. data/lib/terjira/presenters/common_presenter.rb +53 -0
  43. data/lib/terjira/presenters/issue_presenter.rb +175 -0
  44. data/lib/terjira/presenters/project_presenter.rb +69 -0
  45. data/lib/terjira/presenters/sprint_presenter.rb +68 -0
  46. data/lib/terjira/project_cli.rb +25 -0
  47. data/lib/terjira/rapidview_cli.rb +6 -0
  48. data/lib/terjira/sprint_cli.rb +58 -0
  49. data/lib/terjira/utils/file_cache.rb +110 -0
  50. data/lib/terjira/version.rb +3 -0
  51. data/terjira.gemspec +38 -0
  52. 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,6 @@
1
+ require_relative 'base_cli'
2
+
3
+ module Terjira
4
+ class RapidviewCLI < BaseCLI
5
+ end
6
+ 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
@@ -0,0 +1,3 @@
1
+ module Terjira
2
+ VERSION = '0.1.0'
3
+ 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: