tempest_time 0.6.0 → 0.6.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d691cff0165bbed3a5fec7fd6e03290e22073d11c8d00bcc2d695d7a0e29161a
4
- data.tar.gz: 480718ec2d0f8a99bb9128113c0c2927cdcb8f634d3c0cf3616d6c2469830205
3
+ metadata.gz: ecfd390e581133802a83716b8c068cdc40e5c6890638833a253b3bfb5295726e
4
+ data.tar.gz: 464e98b2dba3d40deb03f8d66b2dd3796db5b9006cdcee46a6e98ee8a42b296f
5
5
  SHA512:
6
- metadata.gz: d83520231149dce7e91072a738c8e75556ac6070e19db50ef43f275d7f91645e8a6973183529789ff3a8495c9d79f5deca061aeb494bd76e6f6c72c0ec4b63bf
7
- data.tar.gz: 3e6dca53bdedfdaaea7a9e373bf367693c2f819315b581372813067b6e452e9f7cebd6146a3ef59738bdeb9c88638a98c0eb45a77a3c2c4e6e640d25a83058ec
6
+ metadata.gz: 567a89a440c7a644945289d8c47feb749f74b10b6a3d36333ed40c7f3cf6f7498c648fac4256497f6e27544a1fc92ce70589063aedee57cd95cfa29ce63c6a38
7
+ data.tar.gz: 6762dd7c7175db615f5e783f622d9a676044e10ace1b91cbc7a56ce6fb74ddefa22fca008e2f982cf26515e4fda1b65e221ad48748013d7ce055eaebae80dc4f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tempest_time (0.5.6)
4
+ tempest_time (0.6.0)
5
5
  git (~> 1.5)
6
6
  httparty (~> 0.16)
7
7
  pastel (~> 0.7.2)
@@ -10,7 +10,7 @@ module TempestTime
10
10
  private
11
11
 
12
12
  def settings
13
- TempestTime::Settings::Authorization
13
+ TempestTime::Settings::Authorization.new
14
14
  end
15
15
  end
16
16
  end
@@ -9,19 +9,19 @@ module JiraAPI
9
9
  end
10
10
 
11
11
  def subdomain
12
- settings.read('subdomain')
12
+ settings.fetch('subdomain')
13
13
  end
14
14
 
15
15
  def user
16
- settings.read('username')
16
+ settings.fetch('username')
17
17
  end
18
18
 
19
19
  def email
20
- settings.read('email')
20
+ settings.fetch('email')
21
21
  end
22
22
 
23
23
  def token
24
- settings.read('jira_token')
24
+ settings.fetch('jira_token')
25
25
  end
26
26
  end
27
27
  end
@@ -9,15 +9,15 @@ module TempoAPI
9
9
  end
10
10
 
11
11
  def user
12
- settings.read('username')
12
+ settings.fetch('username')
13
13
  end
14
14
 
15
15
  def email
16
- settings.read('email')
16
+ settings.fetch('email')
17
17
  end
18
18
 
19
19
  def token
20
- settings.read('tempo_token')
20
+ settings.fetch('tempo_token')
21
21
  end
22
22
  end
23
23
  end
@@ -8,7 +8,7 @@ module TempoAPI
8
8
  super
9
9
  @seconds = seconds
10
10
  @remaining = options['remaining']
11
- @ticket = options['ticket']
11
+ @issue = options['issue']
12
12
  @message = options['message']
13
13
  @date = options['date'] ? Date.parse(options['date']) : Date.today
14
14
  @billable = options['billable']
@@ -16,7 +16,7 @@ module TempoAPI
16
16
 
17
17
  private
18
18
 
19
- attr_reader :ticket, :remaining, :seconds, :message, :date, :billable
19
+ attr_reader :issue, :remaining, :seconds, :message, :date, :billable
20
20
 
21
21
  def request_method
22
22
  'post'
@@ -32,7 +32,7 @@ module TempoAPI
32
32
 
33
33
  def request_body
34
34
  {
35
- "issueKey": ticket,
35
+ "issueKey": issue,
36
36
  "timeSpentSeconds": seconds,
37
37
  "billableSeconds": billable_time,
38
38
  "remainingEstimateSeconds": remaining,
@@ -23,6 +23,11 @@ module TempestTime
23
23
  'teams', 'teams [SUBCOMMAND]',
24
24
  'Add or modify teams.'
25
25
 
26
+ require_relative 'commands/issue'
27
+ register TempestTime::Commands::Issue,
28
+ 'issue', 'issue [SUBCOMMAND]',
29
+ 'View and modify Jira issues.'
30
+
26
31
  desc 'list', 'List worklogs for a specific date.'
27
32
  option :user, aliases: '-u', type: :string
28
33
  def list
@@ -30,7 +35,6 @@ module TempestTime
30
35
  TempestTime::Commands::List.new(options).execute
31
36
  end
32
37
 
33
-
34
38
  desc 'submit', 'Submit your timesheet to a supervisor.'
35
39
  def submit(*)
36
40
  require_relative 'commands/submit'
@@ -57,23 +61,11 @@ module TempestTime
57
61
  TempestTime::Commands::Delete.new(worklogs, options).execute
58
62
  end
59
63
 
60
- desc 'issue', 'Open a Jira issue in your browser.'
61
- def issue(issue)
62
- require_relative 'commands/issue'
63
- TempestTime::Commands::Issue.new(issue).execute
64
- end
65
-
66
- desc 'issues', "View a list of a user's assigned tickets. (Defaults to you.)"
67
- def issues(user = nil)
68
- require_relative 'commands/issues'
69
- TempestTime::Commands::Issues.new(user, options).execute
70
- end
71
-
72
- desc "track [TIME] [TICKET(S)]", 'Track time to Tempo.'
64
+ desc "track [TIME] [ISSUE(S)]", 'Track time to Tempo.'
73
65
  long_desc <<-LONGDESC
74
- `tempest track` or `tempest log` will track the specified number of hours or minutes to the ticket(s) specified.\n
75
- If not specified, it will check the name of the current git branch and automatically track the logged time to that ticket, if found.\n
76
- You can also split a bank of time evenly across multiple tickets with the --split flag.\n
66
+ `tempest track` or `tempest log` will track the specified number of hours or minutes to the issue(s) specified.\n
67
+ If not specified, it will check the name of the current git branch and automatically track the logged time to that issue, if found.\n
68
+ You can also split a bank of time evenly across multiple issues with the --split flag.\n
77
69
  e.g. tempest track 1.5h BCIT-1 --message='Tracking 1.5 hours.'\n
78
70
  e.g. tempest log 90m BCIT-1 BCIT-2 --message='Tracking 90 minutes.'\n
79
71
  e.g. tempest track 3h BCIT-1 BCIT-2 BCIT-3 --message='Tracking 1 hour.'\n
@@ -84,9 +76,11 @@ module TempestTime
84
76
  option :billable, aliases: '-b', type: :boolean, default: true
85
77
  option :split, aliases: '-s', type: :boolean, default: false
86
78
  option :autoconfirm, type: :boolean, default: false
87
- def track(time, *tickets)
79
+ def track(time, *issues)
88
80
  require_relative 'commands/track'
89
- TempestTime::Commands::Track.new(time, tickets, options).execute
81
+ TempestTime::Commands::Track.new(time, issues, options).execute
90
82
  end
83
+
84
+ map log: :track
91
85
  end
92
86
  end
@@ -3,12 +3,14 @@
3
3
  require 'forwardable'
4
4
  require_relative 'helpers/time_helper'
5
5
  require_relative 'helpers/formatting_helper'
6
+ require_relative 'helpers/git_helper'
6
7
 
7
8
  module TempestTime
8
9
  class Command
9
10
  extend Forwardable
10
11
  include TempestTime::Helpers::TimeHelper
11
12
  include TempestTime::Helpers::FormattingHelper
13
+ include TempestTime::Helpers::GitHelper
12
14
 
13
15
  def_delegators :command, :run
14
16
 
@@ -15,15 +15,9 @@ module TempestTime
15
15
  end
16
16
 
17
17
  desc 'edit', 'Modify your user credentials.'
18
- method_option :help, aliases: '-h', type: :boolean,
19
- desc: 'Display usage information'
20
18
  def edit(*)
21
- if options[:help]
22
- invoke :help, ['auth']
23
- else
24
- require_relative 'config/edit'
25
- TempestTime::Commands::Config::Edit.new(options).execute
26
- end
19
+ require_relative 'config/edit'
20
+ TempestTime::Commands::Config::Edit.new(options).execute
27
21
  end
28
22
  end
29
23
  end
@@ -12,7 +12,7 @@ module TempestTime
12
12
  end
13
13
 
14
14
  def execute(input: $stdin, output: $stdout)
15
- settings = TempestTime::Settings::Authorization
15
+ settings = TempestTime::Settings::Authorization.new
16
16
  setting = prompt.select(
17
17
  "Which #{pastel.green('setting')} would you like to edit?",
18
18
  settings.keys
@@ -20,11 +20,11 @@ module TempestTime
20
20
 
21
21
  new_value = prompt.ask(
22
22
  "Enter the #{pastel.green('new value')}.",
23
- default: settings.read(setting)
23
+ default: settings.fetch(setting)
24
24
  )
25
25
 
26
- if new_value != settings.read(setting)
27
- settings.update(setting, new_value)
26
+ if new_value != settings.fetch(setting)
27
+ settings.set(setting, new_value)
28
28
  prompt.say(pastel.green('Setting updated!'))
29
29
  else
30
30
  prompt.say('Nothing changed.')
@@ -39,13 +39,13 @@ module TempestTime
39
39
  )
40
40
  end
41
41
 
42
- authorization = TempestTime::Settings::Authorization
42
+ authorization = TempestTime::Settings::Authorization.new
43
43
 
44
- authorization.update('email', email)
45
- authorization.update('username', username)
46
- authorization.update('subdomain', subdomain)
47
- authorization.update('jira_token', jira_token)
48
- authorization.update('tempo_token', tempo_token)
44
+ authorization.set('email', email)
45
+ authorization.set('username', username)
46
+ authorization.set('subdomain', subdomain)
47
+ authorization.set('jira_token', jira_token)
48
+ authorization.set('tempo_token', tempo_token)
49
49
 
50
50
  puts pastel.green('Setup complete!')
51
51
  end
@@ -1,24 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../command'
4
- require_relative '../settings/authorization'
3
+ require 'thor'
5
4
 
6
5
  module TempestTime
7
6
  module Commands
8
- class Issue < TempestTime::Command
9
- def initialize(issue)
10
- @issue = issue.upcase
11
- end
7
+ class Issue < Thor
12
8
 
13
- def execute(input: $stdin, output: $stdout)
14
- command.run("open #{url(@issue)}")
15
- end
9
+ namespace :issue
16
10
 
17
- private
11
+ desc 'list', 'Set up Tempest with your credentials.'
12
+ def list(*)
13
+ require_relative 'issue/list'
14
+ TempestTime::Commands::Issue::List.new(options).execute
15
+ end
18
16
 
19
- def url(issue)
20
- domain = TempestTime::Settings::Authorization.read('subdomain')
21
- "https://#{domain}.atlassian.net/browse/#{issue}"
17
+ desc 'open', 'Open an issue in your browser. (Default: current branch)'
18
+ def open(issue = '')
19
+ require_relative 'issue/open'
20
+ TempestTime::Commands::Issue::Open.new(issue).execute
22
21
  end
23
22
  end
24
23
  end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../command'
4
+ require_relative '../../api/jira_api/requests/get_user_issues'
5
+
6
+ module TempestTime
7
+ module Commands
8
+ class Issue
9
+ class List < TempestTime::Command
10
+ def initialize(options)
11
+ @user = options[:user] || current_user
12
+ @options = options
13
+ end
14
+
15
+ def execute(input: $stdin, output: $stdout)
16
+ request = JiraAPI::Requests::GetUserIssues.new(@user)
17
+ message = "Getting issues for #{request.requested_user}"
18
+ response = with_spinner(message) do |spinner|
19
+ request.send_request.tap { spinner.stop }
20
+ end
21
+ puts format_output(response.issues)
22
+ browser_prompt(response.issues)
23
+ end
24
+
25
+ private
26
+
27
+ def browser_prompt(issues)
28
+ abort if prompt.no?('Open an issue in your browser?')
29
+ issue = prompt.select(
30
+ 'Select an issue to open in browser, or press ^C to quit.',
31
+ issues.map(&:key),
32
+ per_page: 5
33
+ )
34
+ require_relative 'open'
35
+ Open.new(issue).execute
36
+ end
37
+
38
+ def format_output(issues)
39
+ table.new(
40
+ %w[Status Issue Summary],
41
+ issues.map { |issue| row(issue) }
42
+ ).render(:ascii, padding: [0, 1], column_widths: [15, 10, 30])
43
+ end
44
+
45
+ def row(issue)
46
+ [issue.status, issue.key, issue.summary]
47
+ end
48
+
49
+ def current_user
50
+ require_relative '../../settings/authorization'
51
+ TempestTime::Settings::Authorization.new.fetch('username')
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../command'
4
+ require_relative '../../settings/authorization'
5
+
6
+ module TempestTime
7
+ module Commands
8
+ class Issue
9
+ class Open < TempestTime::Command
10
+ def initialize(issue)
11
+ @issue = issue.upcase
12
+ @issue = automatic_issue if issue.empty?
13
+ end
14
+
15
+ def execute(input: $stdin, output: $stdout)
16
+ command.run("open #{url(@issue)}")
17
+ end
18
+
19
+ private
20
+
21
+ def url(issue)
22
+ domain = TempestTime::Settings::Authorization.new.fetch('subdomain')
23
+ "https://#{domain}.atlassian.net/browse/#{issue}"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -14,11 +14,12 @@ module TempestTime
14
14
  def initialize(users, options)
15
15
  @users = users || []
16
16
  @team = options[:team]
17
+ @teams = TempestTime::Settings::Teams.new
17
18
  end
18
19
 
19
20
  def execute(input: $stdin, output: $stdout)
20
21
  @users = user_prompt if @users.empty? && @team.nil?
21
- @users.push(TempestTime::Settings::Teams.members(@team)) if @team
22
+ @users.push(teams.members(@team)) if @team
22
23
  abort('No users specified.') unless @users.any?
23
24
 
24
25
  @week = week_prompt('Please select the week to report.')
@@ -49,16 +50,15 @@ module TempestTime
49
50
  ]
50
51
  end
51
52
 
52
- teams = TempestTime::Settings::Teams
53
- if teams.keys.empty?
53
+ if @teams.names.empty?
54
54
  abort('You have no teams yet! Go make one! (tempest teams add)')
55
55
  end
56
56
 
57
57
  team = prompt.select(
58
58
  "Please select a #{pastel.green('team')}.",
59
- teams.keys
59
+ @teams.names
60
60
  )
61
- teams.members(team)
61
+ @teams.members(team)
62
62
  end
63
63
 
64
64
  def start_date
@@ -12,7 +12,7 @@ module TempestTime
12
12
  end
13
13
 
14
14
  def execute(input: $stdin, output: $stdout)
15
- teams = TempestTime::Settings::Teams
15
+ teams = TempestTime::Settings::Teams.new
16
16
  message =
17
17
  'Please enter ' + pastel.green('the members') + " of this team. "\
18
18
  '(Comma-separated, e.g. jkirk, jpicard, bsisko, kjaneway) '
@@ -20,7 +20,7 @@ module TempestTime
20
20
  q.convert ->(input) { input.split(/,\s*/) }
21
21
  end
22
22
  name = prompt.ask('Please enter ' + pastel.green('the name') + ' of your new team.')
23
- teams.update(name, members)
23
+ teams.set(name, members)
24
24
  prompt.say(pastel.green('Success!'))
25
25
  end
26
26
  end
@@ -8,18 +8,18 @@ module TempestTime
8
8
  class Teams
9
9
  class Delete < TempestTime::Command
10
10
  def initialize(options)
11
+ @teams = TempestTime::Settings::Teams.new
11
12
  @options = options
12
13
  end
13
14
 
14
15
  def execute(input: $stdin, output: $stdout)
15
- teams = TempestTime::Settings::Teams
16
- abort("There are no teams to delete!") unless teams.keys.any?
16
+ abort("There are no teams to delete!") unless @teams.keys.any?
17
17
  team = prompt.select(
18
18
  "Which #{pastel.green('team')} would you like to delete?",
19
- teams.keys
19
+ @teams.names
20
20
  )
21
21
  if prompt.yes?(pastel.red("Are you sure you want to delete #{team}?"))
22
- teams.delete(team)
22
+ @teams.delete(team)
23
23
  prompt.say("Successfully #{pastel.red("deleted #{team}!")}")
24
24
  else
25
25
  abort('Nothing was deleted.')
@@ -12,11 +12,11 @@ module TempestTime
12
12
  end
13
13
 
14
14
  def execute(input: $stdin, output: $stdout)
15
- teams = TempestTime::Settings::Teams
16
- abort("There are no teams to edit!") unless teams.keys.any?
15
+ teams = TempestTime::Settings::Teams.new
16
+ abort("There are no teams to edit!") unless teams.names.any?
17
17
  team = prompt.select(
18
18
  "Which #{pastel.green('team')} would you like to edit?",
19
- teams.keys
19
+ teams.names
20
20
  )
21
21
 
22
22
  members = teams.members(team)
@@ -25,23 +25,21 @@ module TempestTime
25
25
  members + ['Add New Member']
26
26
  )
27
27
 
28
- replace = prompt.ask(
28
+ replacement = prompt.ask(
29
29
  "Enter the #{pastel.green('new name')}. "\
30
30
  "Leave blank to #{pastel.red('delete')}."
31
31
  )
32
32
 
33
- members.delete(member)
33
+ teams.remove(team, member)
34
34
 
35
- if replace.nil?
36
- teams.update(team, members)
35
+ if replacement.nil?
37
36
  prompt.say("Deleted #{pastel.red(member)}!")
38
37
  else
39
- members.push(replace)
40
- teams.update(team, members)
41
- prompt.say("Added #{pastel.green(replace)}")
38
+ teams.append(team, replacement)
39
+ prompt.say("Added #{pastel.green(replacement)}")
42
40
  end
43
41
 
44
- execute if prompt.yes?('Keep editing?')
42
+ execute unless prompt.no?('Keep editing?')
45
43
  end
46
44
  end
47
45
  end
@@ -9,37 +9,35 @@ require_relative '../api/jira_api/requests/get_issue'
9
9
  module TempestTime
10
10
  module Commands
11
11
  class Track < TempestTime::Command
12
- include TempestTime::Helpers::TimeHelper
13
-
14
- def initialize(time, tickets, options)
12
+ def initialize(time, issues, options)
15
13
  @time = time
16
- @tickets = tickets
14
+ @issues = issues
17
15
  @options = options
18
16
  end
19
17
 
20
18
  def execute(input: $stdin, output: $stdout)
21
- time = @options[:split] ? parsed_time(@time) / @tickets.count : parsed_time(@time)
22
- tickets = @tickets.any? ? @tickets.map(&:upcase) : [automatic_ticket]
19
+ time = @options[:split] ? parsed_time(@time) / @issues.count : parsed_time(@time)
20
+ issues = @issues.any? ? @issues.map(&:upcase) : [automatic_issue]
23
21
 
24
22
  unless @options[:autoconfirm]
25
23
  prompt_message = "Track #{formatted_time(time)}, "\
26
24
  "#{billability(@options)}, "\
27
- "to #{tickets.join(', ')}?"
25
+ "to #{issues.join(', ')}?"
28
26
  abort unless prompt.yes?(prompt_message, convert: :bool)
29
27
  end
30
28
 
31
- tickets.each do |ticket|
32
- track_time(time, @options.merge(ticket: ticket))
29
+ issues.each do |issue|
30
+ track_time(time, @options.merge(issue: issue))
33
31
  end
34
32
  end
35
33
 
36
34
  private
37
35
 
38
36
  def track_time(time, options)
39
- message = "Tracking #{formatted_time(time)} to #{options['ticket']}..."
37
+ message = "Tracking #{formatted_time(time)} to #{options['issue']}..."
40
38
  with_success_fail_spinner(message) do
41
39
  options['remaining'] = if options['remaining'].nil?
42
- remaining_estimate(options['ticket'], time)
40
+ remaining_estimate(options['issue'], time)
43
41
  else
44
42
  parsed_time(options['remaining'])
45
43
  end
@@ -47,23 +45,17 @@ module TempestTime
47
45
  end
48
46
  end
49
47
 
50
- def remaining_estimate(ticket, time)
51
- request = JiraAPI::Requests::GetIssue.new(ticket)
48
+ def remaining_estimate(issue, time)
49
+ request = JiraAPI::Requests::GetIssue.new(issue)
52
50
  request.send_request
53
51
  if request.response.failure?
54
- abort("There was an issue getting this Jira ticket.\n"\
55
- 'Please check the ticket number and your credentials.')
52
+ abort("There was an issue getting this Jira issue.\n"\
53
+ 'Please check the issue number and your credentials.')
56
54
  end
57
55
  remaining = request.response.issue.remaining_estimate || 0
58
56
  remaining > time ? remaining - time : 0
59
57
  end
60
58
 
61
- def automatic_ticket
62
- ticket = /[A-Z]+-\d+/.match(Git.open(Dir.pwd).current_branch)
63
- abort('Ticket not found for this branch. Please specify.') unless ticket
64
- ticket.to_s
65
- end
66
-
67
59
  def billability(options)
68
60
  options['billable'] ? 'billed' : 'non-billed'
69
61
  end
@@ -0,0 +1,13 @@
1
+ require 'git'
2
+
3
+ module TempestTime
4
+ module Helpers
5
+ module GitHelper
6
+ def automatic_issue
7
+ issue = /[A-Z]+-\d+/.match(Git.open(Dir.pwd).current_branch)
8
+ abort('Issue not found for this branch. Please specify.') unless issue
9
+ issue.to_s.upcase
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,47 +1,50 @@
1
- require 'yaml'
1
+ require 'tty-config'
2
2
 
3
3
  module TempestTime
4
4
  class Setting
5
- class << self
6
- def contents
7
- file.map do |key, value|
8
- { key => value }
9
- end
10
- end
11
-
12
- def read(key)
13
- file[key]
14
- end
15
-
16
- def keys
17
- file.keys&.sort || []
18
- end
19
-
20
- def update(key, value)
21
- temp = file
22
- temp[key] = value
23
- File.open(file_path, 'w') { |f| f.write temp.to_yaml }
24
- end
25
-
26
- def delete(key)
27
- temp = file.tap { |f| f.delete(key) }
28
- File.open(file_path, 'w') { |f| f.write temp.to_yaml }
29
- end
30
-
31
- private
32
-
33
- def file
34
- Dir.mkdir(directory_path) unless Dir.exist?(directory_path)
35
- File.exist?(file_path) ? YAML.load_file(file_path) : {}
36
- end
37
-
38
- def file_path
39
- [directory_path, file_name].join('/')
40
- end
41
-
42
- def directory_path
43
- "#{Dir.home}/.tempest"
44
- end
5
+ attr_reader :config
6
+
7
+ def initialize
8
+ @config = TTY::Config.new
9
+ config.extname = '.yml'
10
+ config.append_path(Dir.home + '/.tempest')
11
+ end
12
+
13
+ def keys
14
+ read_config { config.to_h.keys }
15
+ end
16
+
17
+ def fetch(key)
18
+ read_config { config.fetch(key) }
19
+ end
20
+
21
+ def delete(key)
22
+ write_config { config.delete(key) }
23
+ end
24
+
25
+ def set(key, value)
26
+ write_config { config.set(key, value: value) }
27
+ end
28
+
29
+ def remove(key, value)
30
+ write_config { config.remove(value, from: key) }
31
+ end
32
+
33
+ def append(key, value)
34
+ write_config { config.append(value, to: key) }
35
+ end
36
+
37
+ private
38
+
39
+ def read_config
40
+ config.read
41
+ yield
42
+ end
43
+
44
+ def write_config
45
+ config.read
46
+ yield
47
+ config.write(force: true)
45
48
  end
46
49
  end
47
- end
50
+ end
@@ -0,0 +1,12 @@
1
+ require_relative '../setting'
2
+
3
+ module TempestTime
4
+ module Settings
5
+ class App < TempestTime::Setting
6
+ def initialize
7
+ super
8
+ config.filename = 'config'
9
+ end
10
+ end
11
+ end
12
+ end
@@ -3,16 +3,9 @@ require_relative '../setting'
3
3
  module TempestTime
4
4
  module Settings
5
5
  class Authorization < TempestTime::Setting
6
- class << self
7
- private
8
-
9
- def file_name
10
- 'auth.yml'
11
- end
12
-
13
- def file_path
14
- [directory_path, file_name].join('/')
15
- end
6
+ def initialize
7
+ super
8
+ config.filename = 'auth'
16
9
  end
17
10
  end
18
11
  end
@@ -3,16 +3,15 @@ require_relative '../setting'
3
3
  module TempestTime
4
4
  module Settings
5
5
  class Teams < TempestTime::Setting
6
- class << self
7
- def members(team)
8
- read(team)&.sort
9
- end
6
+ def initialize
7
+ super
8
+ config.filename = 'teams'
9
+ end
10
10
 
11
- private
11
+ alias names keys
12
12
 
13
- def file_name
14
- 'teams.yml'
15
- end
13
+ def members(team)
14
+ config.fetch(team)&.sort
16
15
  end
17
16
  end
18
17
  end
@@ -1,3 +1,3 @@
1
1
  module TempestTime
2
- VERSION = '0.6.0'.freeze
3
- end
2
+ VERSION = '0.6.1'.freeze
3
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tempest_time
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Devan Hurst
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-04 00:00:00.000000000 Z
11
+ date: 2019-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -455,7 +455,8 @@ files:
455
455
  - lib/tempest_time/commands/config/setup.rb
456
456
  - lib/tempest_time/commands/delete.rb
457
457
  - lib/tempest_time/commands/issue.rb
458
- - lib/tempest_time/commands/issues.rb
458
+ - lib/tempest_time/commands/issue/list.rb
459
+ - lib/tempest_time/commands/issue/open.rb
459
460
  - lib/tempest_time/commands/list.rb
460
461
  - lib/tempest_time/commands/report.rb
461
462
  - lib/tempest_time/commands/submit.rb
@@ -465,9 +466,11 @@ files:
465
466
  - lib/tempest_time/commands/teams/edit.rb
466
467
  - lib/tempest_time/commands/track.rb
467
468
  - lib/tempest_time/helpers/formatting_helper.rb
469
+ - lib/tempest_time/helpers/git_helper.rb
468
470
  - lib/tempest_time/helpers/time_helper.rb
469
471
  - lib/tempest_time/models/report.rb
470
472
  - lib/tempest_time/setting.rb
473
+ - lib/tempest_time/settings/app.rb
471
474
  - lib/tempest_time/settings/authorization.rb
472
475
  - lib/tempest_time/settings/teams.rb
473
476
  - lib/tempest_time/templates/config/.gitkeep
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../command'
4
- require_relative '../api/jira_api/requests/get_user_issues'
5
- require_relative './issue'
6
-
7
- module TempestTime
8
- module Commands
9
- class Issues < TempestTime::Command
10
- def initialize(user, options)
11
- @user = user
12
- @options = options
13
- end
14
-
15
- def execute(input: $stdin, output: $stdout)
16
- request = JiraAPI::Requests::GetUserIssues.new(@user)
17
- message = "Getting issues for #{request.requested_user}"
18
- response = with_spinner(message) do |spinner|
19
- request.send_request.tap { spinner.stop }
20
- end
21
- puts format_output(response.issues)
22
- browser_prompt(response.issues)
23
- end
24
-
25
- private
26
-
27
- def browser_prompt(issues)
28
- abort if prompt.no?('Open an issue in your browser?')
29
- issue = prompt.select(
30
- 'Select an issue to open in browser, or press ^C to quit.',
31
- issues.map(&:key),
32
- per_page: 5
33
- )
34
- Issue.new(issue).execute
35
- end
36
-
37
- def format_output(issues)
38
- table.new(
39
- %w[Status Issue Summary],
40
- issues.map { |issue| row(issue) }
41
- ).render(:ascii, padding: [0, 1], column_widths: [15, 10, 30])
42
- end
43
-
44
- def row(issue)
45
- [issue.status, issue.key, issue.summary]
46
- end
47
- end
48
- end
49
- end