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.
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: