gitloggl 0.1.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7e9c6bdbff74251f102c6c6592e6985ffe983047eb03c0cda314d018bf0668a0
4
- data.tar.gz: dcab1435da777423a93cce937333168015b7f61d4274eddbeb2dbe60637dfa59
3
+ metadata.gz: 80535fcd6dd3199ecf83bce88b0583076823114532ca19671bf65c405eb83856
4
+ data.tar.gz: 22628ad4f9a099d2fb138eff26d31ce7104e3125a0cc1f18e5029bca5b43ca44
5
5
  SHA512:
6
- metadata.gz: b2ae255ca8aa340349fc9f911d337cdad08545bd433ea5a0385fd8823e9d301361ba67594ec59731de995d2f4733a969cb4045698ad33050e2630a5ff21691cc
7
- data.tar.gz: 75f86c4bf37e12a9ab38264136da7e577626404a421627e2e08de7cafa02117b0090c211e907420ffa978b9318a7de91c6f7a2927ea3e9b324c56229f64be98b
6
+ metadata.gz: 35d4115c1a5b2bd5e6ac1c1d62f1b8c8debc1d5be6304af027e2597c26c5edf434d7787483a5f78c75cb941de3d68cbd31b481b7f2cd5de7180f314cdc66f091
7
+ data.tar.gz: 8676f3ab7f73bb51dc318b5e51995b2777735313b17ede0ff724a9994350bdc2360099aea6c4e3f9136c0769f34834625d9d7657abd8774fe647081da267ff17
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitloggl (0.1.0)
4
+ gitloggl (0.2)
5
5
  activesupport
6
6
  chronic_duration
7
7
  faraday
@@ -15,6 +15,7 @@ PATH
15
15
  tty-config
16
16
  tty-progressbar
17
17
  tty-prompt
18
+ tty-spinner
18
19
  tty-table
19
20
  typhoeus
20
21
 
@@ -98,6 +99,8 @@ GEM
98
99
  tty-screen (~> 0.6.4)
99
100
  wisper (~> 2.0.0)
100
101
  tty-screen (0.6.5)
102
+ tty-spinner (0.9.0)
103
+ tty-cursor (~> 0.6.0)
101
104
  tty-table (0.10.0)
102
105
  equatable (~> 0.5.0)
103
106
  necromancer (~> 0.4.0)
data/bin/console CHANGED
@@ -3,3 +3,9 @@
3
3
  require 'bundler/setup'
4
4
  require 'gitloggl'
5
5
  require 'pry'
6
+
7
+ if ARGV.any?
8
+ Gitloggl::CLI.start(ARGV)
9
+ else
10
+ Gitloggl::CLI.new.menu
11
+ end
data/gitloggl.gemspec CHANGED
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency 'tty-progressbar'
30
30
  spec.add_dependency 'tty-prompt'
31
31
  spec.add_dependency 'tty-table'
32
+ spec.add_dependency 'tty-spinner'
32
33
  spec.add_dependency 'pastel'
33
34
  spec.add_dependency 'thor'
34
35
  spec.add_dependency 'activesupport'
data/lib/gitloggl.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  require 'tty-table'
2
2
  require 'tty-progressbar'
3
+ require 'tty-spinner'
4
+ require 'tty-command'
3
5
  require 'ostruct'
4
6
  require 'faraday'
5
7
  require 'faraday_middleware'
@@ -15,6 +17,7 @@ require 'active_support/core_ext/module/delegation'
15
17
  require 'active_support/duration'
16
18
  require 'active_support/core_ext/date'
17
19
  require 'active_support/core_ext/numeric/time'
20
+ require 'active_support/core_ext/array/grouping'
18
21
  require 'gitloggl/const'
19
22
  require 'gitloggl/version'
20
23
  require 'gitloggl/cli'
@@ -27,9 +30,9 @@ module Gitloggl
27
30
  extend ActiveSupport::Autoload
28
31
 
29
32
  autoload :Main
30
- autoload :TogglCfg
31
- autoload :GitlabCfg
33
+ autoload :ManageIntegration
32
34
  autoload :Sync
35
+ autoload :Update
33
36
  end
34
37
 
35
38
  module Toggle
@@ -49,7 +52,6 @@ module Gitloggl
49
52
 
50
53
  autoload :Abstract
51
54
  autoload :Filter
52
- autoload :GroupAgg
53
55
  autoload :DetectProject
54
56
  autoload :LoadNotes
55
57
  autoload :UpdateSpent
@@ -24,10 +24,10 @@ module Gitloggl
24
24
  end
25
25
 
26
26
  def capture_back
27
- -> { self.class.new.execute }
27
+ -> { self.class.new(options).execute }
28
28
  end
29
29
 
30
- def menu_back(menu)
30
+ def menu_back(menu, back: back)
31
31
  return unless back?
32
32
 
33
33
  menu.choice 'Back', back
@@ -148,6 +148,10 @@ module Gitloggl
148
148
  TTY::Which.exist?(*args)
149
149
  end
150
150
 
151
+ def render_table(table)
152
+ table.render :unicode, padding: 1
153
+ end
154
+
151
155
  def pastel(opts = {})
152
156
  Pastel.new(opts)
153
157
  end
@@ -5,9 +5,10 @@ module Gitloggl
5
5
  class Main < Gitloggl::Command
6
6
  def execute(*)
7
7
  action = prompt.select('') do |menu|
8
+ menu.enum ')'
8
9
  menu.choice 'SYNC', Sync
9
- menu.choice 'gitlab.com config', GitlabCfg
10
- menu.choice 'toggl.com config', TogglCfg
10
+ menu.choice 'Manage Integrations', ManageIntegration
11
+ menu.choice 'Check For Updates', Update
11
12
  end
12
13
 
13
14
  action.new(options) do |a|
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitloggl
4
+ module Commands
5
+ class ManageIntegration < Gitloggl::Command
6
+ def execute
7
+ puts render_table(table)
8
+
9
+ prompt.select('Manage toggle -> gitlab integrations') do |menu|
10
+ menu.enum ')'
11
+ menu_back(menu)
12
+ menu.choice 'Add', -> { add }
13
+ menu.choice 'Remove', -> { remove }
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def remove
20
+ index = prompt.select('Select integration to remove') do |menu|
21
+ menu.enum ')'
22
+
23
+ integrations.each_with_index do |row, index|
24
+ menu.choice row[Const::NAME], index
25
+ end
26
+
27
+ menu_back(menu, back: -1)
28
+ end
29
+
30
+ return execute if index.negative?
31
+
32
+ integrations.delete_at(index)
33
+ config.set(Const::INTEGRATIONS, value: integrations)
34
+ config.write(force: true)
35
+ end
36
+
37
+ def add
38
+ result = prompt.collect do
39
+ key(Const::NAME).ask('Name?', default: 'Default')
40
+ key(Const::GITLAB_URL).ask('Gitlab URL?', default: 'https://gitlab.com')
41
+ key(Const::GITLAB_TOKEN).ask('Gitlab Token?', required: true)
42
+ key(Const::TOGGL_WORKSPACE_ID).ask('Toggl WorkspaceID?', required: true)
43
+ key(Const::TOGGL_PROJECT_ID).ask('Toggl ProjectID? (not required)')
44
+ key(Const::TOGGL_TOKEN).ask('Toggl Token?', requred: true)
45
+ end
46
+
47
+ config.append(result, to: Const::INTEGRATIONS)
48
+ config.write(force: true)
49
+ end
50
+
51
+ def table
52
+ table = TTY::Table.new header: ['№', 'Name', 'Gitlab URL', 'Gitlab Token', 'Toggl WorkspaceID', 'Toggle ProjectID', 'Toggl Token']
53
+
54
+ integrations(default: [{}]).each_with_index do |row, index|
55
+ table << [
56
+ index.next,
57
+ *row.values_at(
58
+ Const::NAME,
59
+ Const::GITLAB_URL,
60
+ Const::GITLAB_TOKEN,
61
+ Const::TOGGL_WORKSPACE_ID,
62
+ Const::TOGGL_PROJECT_ID,
63
+ Const::TOGGL_TOKEN
64
+ )
65
+ ]
66
+ end
67
+
68
+ table
69
+ end
70
+
71
+ def integrations(default: [])
72
+ config.fetch(Const::INTEGRATIONS, default: default)
73
+ end
74
+ end
75
+ end
76
+ end
@@ -3,10 +3,16 @@
3
3
  module Gitloggl
4
4
  module Commands
5
5
  class Sync < Gitloggl::Command
6
- attr_accessor :date_from, :date_to
6
+ attr_accessor :integration, :date_from, :date_to
7
7
  attr_accessor :toggl_bar, :gitlab_bar
8
8
 
9
9
  def execute
10
+ if integrations.empty?
11
+ puts pastel.yellow('Please add integration first')
12
+ return back.call
13
+ end
14
+
15
+ self.integration = select_integration
10
16
  self.date_from, self.date_to = select_dates
11
17
 
12
18
  setup_toggl_hooks
@@ -22,34 +28,33 @@ module Gitloggl
22
28
  def print_tables
23
29
  if updated.any?
24
30
  puts pastel.green('Updated tracks')
25
- puts(updated_table)
31
+ puts render_table(updated_table)
26
32
  end
27
33
 
28
34
  if rejected.any?
29
35
  puts pastel.yellow('Rejected tracks')
30
- puts(rejected_table)
36
+ puts render_table(rejected_table)
31
37
  end
32
38
  end
33
39
 
34
40
  def setup_toggl_hooks
35
- toggl.on_first_page do |response|
36
- self.toggl_bar = bars.register("toggl [:bar] :percent", total: response.total_pages)
37
- self.gitlab_bar = bars.register("gitlab [:bar] :percent", total: response.total_count)
41
+ toggl.on_done do |data|
42
+ self.toggl_bar = bars.register("toggl [:bar] :percent", total: data.length)
43
+ self.gitlab_bar = bars.register("gitlab [:bar] :percent", total: data.length)
44
+ toggl_bar.advance(data.length)
38
45
  end
39
46
 
40
- toggl.on_each_page do
41
- toggl_bar.advance
42
- end
47
+ toggl.on_done do |data|
48
+ data.in_groups_of(10, false) do |group|
49
+ group.map! do |result|
50
+ Gitlab::Issue.new(
51
+ spent_ms: Integer(result.spent_ms),
52
+ title: result.title
53
+ )
54
+ end
43
55
 
44
- toggl.on_each_page do |response|
45
- issues = response.body.fetch('data').map do |row|
46
- Gitlab::Issue.new(
47
- spent_ms: Integer(row.fetch('dur')),
48
- description: row.fetch('description')
49
- )
56
+ gitlab.batch(group)
50
57
  end
51
-
52
- gitlab.batch(issues)
53
58
  end
54
59
  end
55
60
 
@@ -58,10 +63,6 @@ module Gitloggl
58
63
  gitlab_bar.advance
59
64
  end
60
65
 
61
- gitlab.on_skipped do
62
- gitlab_bar.advance
63
- end
64
-
65
66
  gitlab.on_rejected do |issue, reason|
66
67
  rejected.push([issue, reason])
67
68
  end
@@ -82,21 +83,25 @@ module Gitloggl
82
83
  def rejected_table
83
84
  table = TTY::Table.new header: %w[Track Reason]
84
85
 
85
- rejected.uniq { |(i)| i.description }.each do |(issue, reason)|
86
- table << [issue.description, reason]
86
+ rejected.uniq { |(i, _)| i.title }.each do |(issue, reason)|
87
+ table << [issue.title, reason]
87
88
  end
88
89
 
89
- table.render :unicode, padding: 1
90
+ table
90
91
  end
91
92
 
92
93
  def updated_table
93
94
  table = TTY::Table.new header: %w[Track Diff]
94
95
 
96
+ updated.sort_by! do |(_, diff)|
97
+ -diff
98
+ end
99
+
95
100
  updated.each do |(issue, diff)|
96
- table << [issue.description, diff]
101
+ table << [issue.title, %{added +#{ChronicDuration.output(diff, keep_zero: true)}}]
97
102
  end
98
103
 
99
- table.render :unicode, padding: 1
104
+ table
100
105
  end
101
106
 
102
107
  def bars
@@ -106,8 +111,9 @@ module Gitloggl
106
111
  def toggl
107
112
  @toggl ||= Toggle::Cli.new do |c|
108
113
  c.verbose = verbose?
109
- c.workspace_id = config.fetch(Const::TOGGL_WORKSPACE_ID)
110
- c.token = config.fetch(Const::TOGGL_TOKEN)
114
+ c.project_id = integration.fetch(Const::TOGGL_PROJECT_ID)
115
+ c.workspace_id = integration.fetch(Const::TOGGL_WORKSPACE_ID)
116
+ c.token = integration.fetch(Const::TOGGL_TOKEN)
111
117
  c.date_from = date_from
112
118
  c.date_to = date_to
113
119
  end
@@ -116,18 +122,33 @@ module Gitloggl
116
122
  def gitlab
117
123
  @gitlab ||= Gitlab::Cli.new do |c|
118
124
  c.verbose = verbose?
119
- c.url = config.fetch(Const::GITLAB_URL)
120
- c.token = config.fetch(Const::GITLAB_TOKEN)
125
+ c.url = integration.fetch(Const::GITLAB_URL)
126
+ c.token = integration.fetch(Const::GITLAB_TOKEN)
127
+ end
128
+ end
129
+
130
+ def select_integration
131
+ prompt.select('Select integration') do |menu|
132
+ menu.enum ')'
133
+
134
+ integrations.each do |row|
135
+ menu.choice row[Const::NAME], row
136
+ end
121
137
  end
122
138
  end
123
139
 
124
140
  def select_dates
125
141
  prompt.select('Select period for sync. Tracks will be added to gitlab if diff will be detected') do |menu|
142
+ menu.enum ')'
126
143
  menu.choice 'Past 3 weeks', [3.weeks.ago.to_date, Date.current]
127
144
  menu.choice 'Past 2 weeks', [2.weeks.ago.to_date, Date.current]
128
145
  menu.choice 'Past 7 days', [7.days.ago.to_date, Date.current]
129
146
  end
130
147
  end
148
+
149
+ def integrations
150
+ config.fetch(Const::INTEGRATIONS, default: [])
151
+ end
131
152
  end
132
153
  end
133
154
  end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gitloggl
4
+ module Commands
5
+ class Update < Gitloggl::Command
6
+ RUBYGEMS_URL = 'https://rubygems.org/api/v1/gems/gitloggl.json'
7
+
8
+ def execute
9
+ spinner = TTY::Spinner.new("[:spinner] Loading ...", format: :pulse_2)
10
+ outdated = outdated?(parse_version(VERSION), parse_version(remote_version))
11
+ spinner.stop
12
+
13
+ unless outdated
14
+ puts pastel.yellow('No Updates Available')
15
+ return back.call
16
+ end
17
+
18
+ select_update
19
+ end
20
+
21
+ private
22
+
23
+ def select_update
24
+ yes = prompt.yes?("#{remote_version} version available, update?")
25
+
26
+ return back.call unless yes
27
+
28
+ cmd = TTY::Command.new
29
+ cmd.run('gem update gitloggl')
30
+ end
31
+
32
+ def outdated?(current, remote)
33
+ remote.each_with_index do |num, ix|
34
+ return true if num > current[ix].to_i
35
+ end
36
+
37
+ false
38
+ end
39
+
40
+ def remote_version
41
+ @remote_version ||= Connection.new(RUBYGEMS_URL).get.body.fetch('version')
42
+ end
43
+
44
+ def parse_version(string)
45
+ string.split('.').map(&:to_i)
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,8 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gitloggl
2
4
  module Const
3
- TOGGL_WORKSPACE_ID = :toggl_workspace_id
4
- TOGGL_TOKEN = :toggl_token
5
- GITLAB_URL = :gitlab_url
6
- GITLAB_TOKEN = :gitlab_token
5
+ INTEGRATIONS = :integrations
6
+
7
+ NAME = 'name'
8
+ GITLAB_URL = 'gitlab_url'
9
+ GITLAB_TOKEN = 'gitlab_token'
10
+ TOGGL_WORKSPACE_ID = 'toggl_workspace_id'
11
+ TOGGL_PROJECT_ID = 'toggl_project_id'
12
+ TOGGL_TOKEN = 'toggl_token'
7
13
  end
8
14
  end
@@ -7,7 +7,6 @@ module Gitloggl
7
7
  define_hook :on_rejected, scope: ->(*) { nil }
8
8
  define_hook :on_updated, scope: ->(*) { nil }
9
9
  define_hook :on_completed, scope: ->(*) { nil }
10
- define_hook :on_skipped, scope: ->(*) { nil }
11
10
 
12
11
  attr_accessor :token, :url, :verbose
13
12
 
@@ -26,10 +25,6 @@ module Gitloggl
26
25
  false
27
26
  end
28
27
 
29
- b.use Stack::GroupAgg, callback: ->(issues) do
30
- issues.each { skipped }
31
- end
32
-
33
28
  b.use Stack::DetectProject
34
29
 
35
30
  b.use Stack::Filter, where: -> (issue) do
@@ -43,7 +38,7 @@ module Gitloggl
43
38
  b.use Stack::LoadNotes
44
39
 
45
40
  b.use Stack::UpdateSpent, callback: ->(issue, diff_sec) do
46
- updated(issue, %{added +#{ChronicDuration.output(diff_sec, keep_zero: true)} })
41
+ updated(issue, diff_sec)
47
42
  end
48
43
  end
49
44
 
@@ -62,10 +57,6 @@ module Gitloggl
62
57
  run_hook(:on_updated, issue, diff)
63
58
  end
64
59
 
65
- def skipped
66
- run_hook(:on_skipped)
67
- end
68
-
69
60
  def connection
70
61
  @connection ||= Connection.new(url, headers: { 'PRIVATE-TOKEN' => token }, verbose: verbose).tap do |c|
71
62
  c.transport.basic_auth(token, 'api_token')
@@ -1,6 +1,6 @@
1
1
  module Gitloggl
2
2
  module Gitlab
3
- class Issue < Struct.new(:description, :project_id, :spent_ms, keyword_init: true)
3
+ class Issue < Struct.new(:title, :project_id, :spent_ms, keyword_init: true)
4
4
  ISSUE_PATH_RE = /([[[:alnum:]]_-]*)#(\d+)/ # "poslogic-partner#471"
5
5
 
6
6
  attr_accessor :notes
@@ -10,7 +10,7 @@ module Gitloggl
10
10
  end
11
11
 
12
12
  def path
13
- return nil unless description =~ ISSUE_PATH_RE
13
+ return nil unless title =~ ISSUE_PATH_RE
14
14
  return nil unless $1.present? && $2.present?
15
15
 
16
16
  @path ||= OpenStruct.new(project_path: $1, issue_id: $2)
@@ -4,54 +4,47 @@ module Gitloggl
4
4
  include Hooks
5
5
  include Hooks::InstanceHooks
6
6
 
7
- define_hook :on_first_page, scope: ->(*) { nil }
8
- define_hook :on_each_page, scope: ->(*) { nil }
7
+ define_hook :on_done, scope: ->(*) { nil }
9
8
 
10
- attr_accessor :token, :workspace_id, :date_from, :date_to, :verbose
9
+ attr_accessor :token, :workspace_id, :project_id, :date_from, :date_to, :verbose
11
10
 
12
11
  def initialize(params = {})
13
12
  params.each { |k, v| public_send("#{k}=", v) }
14
13
  yield(self) if block_given?
15
14
  end
16
15
 
17
- def run(page: 1)
18
- body = request(page)
16
+ def run
17
+ data = request.fetch('data').flat_map { |row| row.fetch('items') }
19
18
 
20
- total_count = body.fetch('total_count')
21
- per_page = body.fetch('per_page')
22
- total_pages = total_count.fdiv(per_page).ceil
23
-
24
- result = OpenStruct.new(
25
- total_count: total_count,
26
- per_page: per_page,
27
- total_pages: total_pages,
28
- page: page,
29
- body: body
30
- )
31
-
32
- run_hook(:on_first_page, result) if page == 1
33
- run_hook(:on_each_page, result)
19
+ data.map! do |row|
20
+ OpenStruct.new(
21
+ title: row.fetch('title').fetch('time_entry'),
22
+ spent_ms: row.fetch('time')
23
+ )
24
+ end
34
25
 
35
- run(page: page.next) if body['data'].length >= per_page
26
+ run_hook(:on_done, data)
36
27
  end
37
28
 
38
29
  private
39
30
 
40
31
  # @return [JSON]
41
- def request(page)
42
- response = connection.get('/reports/api/v2/details', {
32
+ def request
33
+ response = connection.get('/reports/api/v2/summary', {
43
34
  workspace_id: workspace_id,
35
+ project_ids: project_id,
44
36
  since: date_from,
45
37
  until: date_to,
38
+ grouping: 'projects',
39
+ subgrouping: 'time_entries',
46
40
  user_agent: Connection::USER_AGENT,
47
- page: page
48
41
  })
49
42
 
50
43
  response.body
51
44
  end
52
45
 
53
46
  def connection
54
- @connection ||= Connection.new('https://toggl.com/reports/api/v2/details', verbose: verbose).tap do |c|
47
+ @connection ||= Connection.new('https://toggl.com', verbose: verbose).tap do |c|
55
48
  c.transport.basic_auth(token, 'api_token')
56
49
  end
57
50
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gitloggl
2
- VERSION = '0.1.1'
4
+ VERSION = '0.2'
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitloggl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: '0.2'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shylau Aloaksandr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-27 00:00:00.000000000 Z
11
+ date: 2019-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: tty-color
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-spinner
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: pastel
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -298,10 +312,10 @@ files:
298
312
  - lib/gitloggl.rb
299
313
  - lib/gitloggl/cli.rb
300
314
  - lib/gitloggl/command.rb
301
- - lib/gitloggl/commands/gitlab_cfg.rb
302
315
  - lib/gitloggl/commands/main.rb
316
+ - lib/gitloggl/commands/manage_integration.rb
303
317
  - lib/gitloggl/commands/sync.rb
304
- - lib/gitloggl/commands/toggl_cfg.rb
318
+ - lib/gitloggl/commands/update.rb
305
319
  - lib/gitloggl/connection.rb
306
320
  - lib/gitloggl/const.rb
307
321
  - lib/gitloggl/gitlab/cli.rb
@@ -309,7 +323,6 @@ files:
309
323
  - lib/gitloggl/gitlab/stack/abstract.rb
310
324
  - lib/gitloggl/gitlab/stack/detect_project.rb
311
325
  - lib/gitloggl/gitlab/stack/filter.rb
312
- - lib/gitloggl/gitlab/stack/group_agg.rb
313
326
  - lib/gitloggl/gitlab/stack/load_notes.rb
314
327
  - lib/gitloggl/gitlab/stack/update_spent.rb
315
328
  - lib/gitloggl/templates/.gitkeep
@@ -1,50 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gitloggl
4
- module Commands
5
- class GitlabCfg < Gitloggl::Command
6
- def execute(*)
7
- render_config_table
8
-
9
- prompt.select('') do |menu|
10
- menu.choice 'Back', back if back?
11
- menu.choice 'Add site', -> { add_site }
12
- end
13
- end
14
-
15
- private
16
-
17
- def add_site
18
- domain = ask_domain
19
- token = ask_token
20
-
21
- return unless prompt.yes?("Change settings? Domain: #{pastel.green(domain)}, token: #{pastel.green(token)}")
22
-
23
- config.set(Const::GITLAB_URL, value: domain)
24
- config.set(Const::GITLAB_TOKEN, value: token)
25
-
26
- config.write(force: true)
27
- end
28
-
29
- def ask_domain
30
- prompt.ask('Enter gitlab domain:', default: 'https://gitlab.com') do |q|
31
- q.required true
32
- q.validate /\A.+\Z/
33
- end
34
- end
35
-
36
- def ask_token
37
- prompt.ask('Enter access token') do |q|
38
- q.required true
39
- q.validate /\A.+\Z/
40
- end
41
- end
42
-
43
- def render_config_table
44
- table = TTY::Table.new header: %w[Domain Token]
45
- table << [config.fetch(Const::GITLAB_URL), config.fetch(Const::GITLAB_TOKEN)]
46
- puts table.render :unicode, padding: 1
47
- end
48
- end
49
- end
50
- end
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gitloggl
4
- module Commands
5
- class TogglCfg < Gitloggl::Command
6
- def execute(*)
7
- render_config_config
8
-
9
- prompt.select('') do |menu|
10
- menu.enum ')'
11
- menu_back(menu)
12
- menu.choice 'Change', -> { change }
13
- end
14
- end
15
-
16
- private
17
-
18
- def change
19
- workspace_id = ask_workspace_id
20
- token = ask_token
21
-
22
- return unless prompt.yes? <<~ECHO
23
- Change settings? WorkspaceID: #{pastel.green(workspace_id)}, token: #{pastel.green(token)}
24
- ECHO
25
-
26
- config.set(Const::TOGGL_WORKSPACE_ID, value: workspace_id)
27
- config.set(Const::TOGGL_TOKEN, value: token)
28
-
29
- config.write(force: true)
30
- end
31
-
32
- def ask_workspace_id
33
- prompt.ask('Enter workspaceID:') do |q|
34
- q.required true
35
- q.validate /\A.+\Z/
36
- end
37
- end
38
-
39
- def ask_token
40
- prompt.ask('Enter token:') do |q|
41
- q.required true
42
- q.validate /\A.+\Z/
43
- end
44
- end
45
-
46
- def render_config_config
47
- table = TTY::Table.new header: %w[WorkspaceID Token]
48
- table << [config.fetch(Const::TOGGL_WORKSPACE_ID), config.fetch(Const::TOGGL_TOKEN)]
49
- puts table.render :unicode, padding: 1
50
- end
51
- end
52
- end
53
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Gitloggl
4
- module Gitlab
5
- module Stack
6
- class GroupAgg < Abstract
7
- opt :callback
8
-
9
- def before_call
10
- env.issues = env.issues.group_by(&:path).each_with_object([]) do |(_, group), object|
11
- object.push(group.inject { |a, b| a + b })
12
-
13
- next unless group.many?
14
-
15
- callback!.call(group[1..-1])
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end