dude-cli 2.1.0.alpha2 → 2.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/verify.yml +2 -2
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +1 -1
  5. data/CHANGELOG.md +7 -0
  6. data/Gemfile.lock +29 -9
  7. data/README.md +44 -44
  8. data/dude.gemspec +3 -2
  9. data/lib/dude.rb +11 -1
  10. data/lib/dude/code_management/github/client.rb +7 -3
  11. data/lib/dude/code_management/github/create_pull_request.rb +16 -8
  12. data/lib/dude/commands.rb +4 -0
  13. data/lib/dude/commands/commit.rb +23 -0
  14. data/lib/dude/commands/health_check.rb +15 -0
  15. data/lib/dude/commands/install.rb +63 -53
  16. data/lib/dude/commands/pr/remove.rb +1 -1
  17. data/lib/dude/commands/start.rb +6 -8
  18. data/lib/dude/commands/stop.rb +0 -2
  19. data/lib/dude/commands/tasks.rb +0 -2
  20. data/lib/dude/commands/track.rb +2 -4
  21. data/lib/dude/config.rb +18 -0
  22. data/lib/dude/git.rb +1 -0
  23. data/lib/dude/git/commit.rb +20 -0
  24. data/lib/dude/health_check.rb +39 -0
  25. data/lib/dude/project_management/client.rb +1 -3
  26. data/lib/dude/project_management/jira/client.rb +16 -8
  27. data/lib/dude/project_management/jira/fetch_current_task.rb +3 -3
  28. data/lib/dude/project_management/jira/fetch_current_tasks.rb +2 -4
  29. data/lib/dude/project_management/jira/get_task_name_by_id.rb +0 -2
  30. data/lib/dude/project_management/jira/move_task_to_list.rb +0 -2
  31. data/lib/dude/project_management/trello/client.rb +9 -5
  32. data/lib/dude/project_management/trello/fetch_current_task.rb +2 -4
  33. data/lib/dude/project_management/trello/fetch_current_tasks.rb +0 -2
  34. data/lib/dude/project_management/trello/fetch_lists.rb +1 -3
  35. data/lib/dude/project_management/trello/get_task_name_by_id.rb +1 -3
  36. data/lib/dude/project_management/trello/move_task_to_list.rb +1 -3
  37. data/lib/dude/setup/github.rb +35 -0
  38. data/lib/dude/setup/jira.rb +64 -0
  39. data/lib/dude/setup/toggl.rb +47 -0
  40. data/lib/dude/setup/trello.rb +58 -0
  41. data/lib/dude/templates/duderc_template +32 -0
  42. data/lib/dude/time_trackers/toggl/base.rb +2 -4
  43. data/lib/dude/version.rb +1 -1
  44. metadata +29 -6
  45. data/lib/dude/templates/pull_request_template +0 -7
@@ -4,8 +4,6 @@ module Dude
4
4
  module ProjectManagement
5
5
  module Jira
6
6
  class GetTaskNameById
7
- include Settings
8
-
9
7
  def initialize(client, id:)
10
8
  @client = client
11
9
  @id = id
@@ -4,8 +4,6 @@ module Dude
4
4
  module ProjectManagement
5
5
  module Jira
6
6
  class MoveTaskToList
7
- include Settings
8
-
9
7
  def initialize(client, id:, list_name:)
10
8
  @client = client
11
9
  @id = id
@@ -12,13 +12,11 @@ module Dude
12
12
  module ProjectManagement
13
13
  module Trello
14
14
  class Client
15
- include Settings
16
-
17
15
  def client
18
16
  @client ||= Faraday.new('https://api.trello.com/', {
19
17
  params: {
20
- key: settings['TRELLO_KEY'],
21
- token: settings['TRELLO_TOKEN']
18
+ key: Dude::SETTINGS.dig(:trello, :key),
19
+ token: Dude::SETTINGS.dig(:trello, :token)
22
20
  }
23
21
  })
24
22
  end
@@ -28,7 +26,7 @@ module Dude
28
26
  end
29
27
 
30
28
  def respond_to_missing?(method_name, include_private = false)
31
- client.respond_to_missing?(method_name, include_private)
29
+ client.respond_to?(method_name, include_private)
32
30
  end
33
31
 
34
32
  def fetch_current_tasks
@@ -46,6 +44,12 @@ module Dude
46
44
  def get_task_name_by_id(id)
47
45
  GetTaskNameById.new(client, id: id).call
48
46
  end
47
+
48
+ def health_check
49
+ client.get("/1/tokens/#{Dude::SETTINGS.dig(:trello, :token)}").status == 200
50
+ rescue StandardError
51
+ false
52
+ end
49
53
  end
50
54
  end
51
55
  end
@@ -4,15 +4,13 @@ module Dude
4
4
  module ProjectManagement
5
5
  module Trello
6
6
  class FetchCurrentTask
7
- include Settings
8
-
9
7
  def initialize(client, id:)
10
8
  @client = client
11
9
  @id = id
12
10
  end
13
11
 
14
12
  def call
15
- response = client.get("/1/boards/#{settings['ATLASSIAN_BOARD_ID']}/cards/#{id}")
13
+ response = client.get("/1/boards/#{Dude::SETTINGS.dig(:jira, :board_id)}/cards/#{id}")
16
14
  create_issue JSON.parse(response.body)
17
15
  end
18
16
 
@@ -25,7 +23,7 @@ module Dude
25
23
  id: issue['idShort'],
26
24
  title: issue['name'],
27
25
  description: issue['desc'],
28
- status: settings['IN_PROGRESS_LIST_NAME'], # OMG, let's fix this later
26
+ status: Dude::SETTINGS[:in_progress_list_name], # OMG, let's fix this later
29
27
  assignee: members(issue),
30
28
  url: issue['shortUrl']
31
29
  )
@@ -6,8 +6,6 @@ module Dude
6
6
  module ProjectManagement
7
7
  module Trello
8
8
  class FetchCurrentTasks
9
- include Settings
10
-
11
9
  attr_reader :fetch_lists
12
10
 
13
11
  def initialize(client, fetch_lists: nil)
@@ -4,14 +4,12 @@ module Dude
4
4
  module ProjectManagement
5
5
  module Trello
6
6
  class FetchLists
7
- include Settings
8
-
9
7
  def initialize(client)
10
8
  @client = client
11
9
  end
12
10
 
13
11
  def call
14
- response = client.get("/1/board/#{settings['ATLASSIAN_BOARD_ID']}/lists", { fields: 'name' })
12
+ response = client.get("/1/board/#{Dude::SETTINGS.dig(:jira, :board_id)}/lists", { fields: 'name' })
15
13
  JSON.parse(response.body)
16
14
  end
17
15
 
@@ -4,15 +4,13 @@ module Dude
4
4
  module ProjectManagement
5
5
  module Trello
6
6
  class GetTaskNameById
7
- include Settings
8
-
9
7
  def initialize(client, id:)
10
8
  @client = client
11
9
  @id = id
12
10
  end
13
11
 
14
12
  def call
15
- response = client.get("/1/boards/#{settings['ATLASSIAN_BOARD_ID']}/cards/#{id}")
13
+ response = client.get("/1/boards/#{Dude::SETTINGS.dig(:jira, :board_id)}/cards/#{id}")
16
14
  JSON.parse(response.body)['name']
17
15
  end
18
16
 
@@ -6,8 +6,6 @@ module Dude
6
6
  module ProjectManagement
7
7
  module Trello
8
8
  class MoveTaskToList
9
- include Settings
10
-
11
9
  def initialize(client, id:, list_name:)
12
10
  @client = client
13
11
  @id = id
@@ -15,7 +13,7 @@ module Dude
15
13
  end
16
14
 
17
15
  def call
18
- response = client.get("/1/boards/#{settings['ATLASSIAN_BOARD_ID']}/cards/#{id}", { fields: 'id' })
16
+ response = client.get("/1/boards/#{Dude::SETTINGS.dig(:jira, :board_id)}/cards/#{id}", { fields: 'id' })
19
17
  card_id = JSON.parse(response.body)['id']
20
18
  client.put("/1/cards/#{card_id}", { idList: list_id })
21
19
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dude
4
+ module Setup
5
+ class Github
6
+ def initialize(prompt)
7
+ @prompt = prompt
8
+ end
9
+
10
+ def call(settings:)
11
+ settings[:github][:token] = setup_token
12
+ settings
13
+ end
14
+
15
+ private
16
+
17
+ attr_reader :prompt
18
+
19
+ def setup_token
20
+ puts <<~HEREDOC
21
+ You need to create personal token
22
+
23
+ #{'1.'.bold} Log in to https://github.com/settings/tokens
24
+ #{'2.'.bold} Copy the token and paste it below
25
+ HEREDOC
26
+
27
+ if prompt.yes?(Dude::Config.style_prompt('Open Github token creation page in your browser?'))
28
+ `open https://github.com/settings/tokens`
29
+ end
30
+
31
+ prompt.ask(Dude::Config.style_prompt('Github token:'), required: true)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dude
4
+ module Setup
5
+ class Jira
6
+ def initialize(prompt)
7
+ @prompt = prompt
8
+ end
9
+
10
+ # rubocop:disable Metrics/AbcSize
11
+ def call(settings:)
12
+ settings[:jira][:email] = setup_email
13
+ settings[:jira][:token] = setup_token
14
+ settings[:jira][:project][:url] = setup_project_url
15
+ settings[:jira][:project][:key] = setup_project_key
16
+ settings[:jira][:board_id] = setup_board_id
17
+ settings
18
+ end
19
+ # rubocop:enable Metrics/AbcSize
20
+
21
+ private
22
+
23
+ attr_reader :prompt
24
+
25
+ def setup_email
26
+ prompt.ask(Dude::Config.style_prompt('Jira user email:'), required: true)
27
+ end
28
+
29
+ def setup_token
30
+ puts <<~HEREDOC
31
+ You need to create personal token
32
+
33
+ #{'1.'.bold} Log in to https://id.atlassian.com/manage/api-tokens
34
+ #{'2.'.bold} Click 'Create API token.'
35
+ #{'3.'.bold} From the dialog that appears, enter a memorable and concise 'Label' for your token and click 'Create.'
36
+ #{'4.'.bold} Use 'Copy to clipboard' and paste the token below
37
+ HEREDOC
38
+
39
+ if prompt.yes?(Dude::Config.style_prompt('Open Atlassian token creation page in your browser?'))
40
+ `open https://id.atlassian.com/manage-profile/security/api-tokens`
41
+ end
42
+
43
+ prompt.ask(Dude::Config.style_prompt('Jira token:'), required: true)
44
+ end
45
+
46
+ def setup_project_url
47
+ prompt.ask(Dude::Config.style_prompt('URL of your project (Example: https://example.atlassian.net):'), {
48
+ required: true
49
+ })
50
+ end
51
+
52
+ def setup_project_key
53
+ prompt.ask(Dude::Config.style_prompt('KEY of your project (If your issues have id BT-123 - BT is the key):'), {
54
+ required: true
55
+ })
56
+ end
57
+
58
+ def setup_board_id
59
+ puts 'Just open your atlassian main board and copy id from the url after rapidView=ID part.'
60
+ prompt.ask(Dude::Config.style_prompt('Board ID:'), required: true)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dude
4
+ module Setup
5
+ class Toggl
6
+ def initialize(prompt)
7
+ @prompt = prompt
8
+ end
9
+
10
+ def call(settings:)
11
+ settings[:toggl][:token] = setup_token
12
+ settings[:toggl][:project_name] = setup_project_name
13
+ settings[:toggl][:workspace_id] = setup_workspace_id
14
+ settings
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :prompt
20
+
21
+ def setup_token
22
+ puts <<~HEREDOC
23
+ You need to create personal token
24
+
25
+ #{'1.'.bold} Log in to https://trello.com/app-key
26
+ #{'2.'.bold} Your Toggl API token can be found at the bottom of the page
27
+ #{'3.'.bold} Press --Click to Reveal-- and paste token below
28
+ HEREDOC
29
+
30
+ if prompt.yes?(Dude::Config.style_prompt('Open Toggl profile page in your browser?'))
31
+ `open https://track.toggl.com/profile`
32
+ end
33
+
34
+ prompt.ask(Dude::Config.style_prompt('Toggl token:'), required: true)
35
+ end
36
+
37
+ def setup_project_name
38
+ prompt.ask(Dude::Config.style_prompt('Your Toggl project name:'), required: true)
39
+ end
40
+
41
+ def setup_workspace_id
42
+ puts 'Can be copied from url here: https://toggl.com/app/projects/ (Example: 123456)'
43
+ prompt.ask(Dude::Config.style_prompt('Workspace ID:'), required: true)
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dude
4
+ module Setup
5
+ class Trello
6
+ def initialize(prompt)
7
+ @prompt = prompt
8
+ end
9
+
10
+ def call(settings:)
11
+ settings[:trello][:key] = setup_key
12
+ settings[:trello][:token] = setup_token
13
+ settings[:trello][:board_id] = setup_board_id
14
+ settings
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :prompt
20
+
21
+ def setup_email
22
+ prompt.ask(Dude::Config.style_prompt('Jira user email:'), required: true)
23
+ end
24
+
25
+ def setup_key
26
+ puts <<~HEREDOC
27
+ You need to create personal token
28
+
29
+ #{'1.'.bold} Log in to https://trello.com/app-key
30
+ #{'2.'.bold} Copy KEY and paste it below
31
+ HEREDOC
32
+
33
+ if prompt.yes?(Dude::Config.style_prompt('Open Trello token creation page in your browser?'))
34
+ `open https://trello.com/app-key`
35
+ end
36
+
37
+ prompt.ask(Dude::Config.style_prompt('Trello key:'), required: true)
38
+ end
39
+
40
+ def setup_token
41
+ puts <<~HEREDOC
42
+ You need to create personal token
43
+
44
+ #{'1.'.bold} Log in to https://trello.com/app-key
45
+ #{'2.'.bold} From the dialog that appears click 'Allow'
46
+ #{'3.'.bold} Copy created token to clipboard and paste the it below
47
+ HEREDOC
48
+
49
+ prompt.ask(Dude::Config.style_prompt('Trello token:'), required: true)
50
+ end
51
+
52
+ def setup_board_id
53
+ puts 'Just open your Trello main board and copy id from the url (Example: 123aBcdE)'
54
+ prompt.ask(Dude::Config.style_prompt('Board ID:'), required: true)
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,32 @@
1
+ ---
2
+ :project_management_tool: jira
3
+ :jira:
4
+ :email:
5
+ :token:
6
+ :project:
7
+ :url:
8
+ :key:
9
+ :board_id:
10
+ :trello:
11
+ :board_id:
12
+ :key:
13
+ :token:
14
+ :todo_list_name: To Do
15
+ :in_progress_list_name: In Progress
16
+ :code_review_list_name: Code Review
17
+ :testing_list_name: TESTABLE
18
+ :done_list_name: Done
19
+ :toggl:
20
+ :project_name:
21
+ :token:
22
+ :workspace_id:
23
+ :task_format: "[{issue_id}] {issue_title}"
24
+ :github:
25
+ :token:
26
+ :pr_template:
27
+ :title: "[{issue_id}] {issue_title}\n"
28
+ :body: |
29
+ ## Story
30
+ [**\[{issue_id}\] {issue_title}**]({issue_url})
31
+ ## Description
32
+ Example description of the issue
@@ -5,17 +5,15 @@ require 'faraday'
5
5
  module Dude
6
6
  module Toggl
7
7
  class Base
8
- include Settings
9
-
10
8
  def toggl_api
11
9
  Faraday.new('https://api.track.toggl.com') do |conn|
12
- conn.basic_auth settings['TOGGL_TOKEN'], 'api_token'
10
+ conn.basic_auth Dude::SETTINGS.dig(:toggl, :token), 'api_token'
13
11
  conn.headers['Content-Type'] = 'application/json'
14
12
  end
15
13
  end
16
14
 
17
15
  def projects_response
18
- toggl_api.get("/api/v8/workspaces/#{settings['TOGGL_WORKSPACE_ID']}/projects")
16
+ toggl_api.get("/api/v8/workspaces/#{Dude::SETTINGS.dig(:toggl, :workspace_id)}/projects")
19
17
  end
20
18
  end
21
19
  end
data/lib/dude/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dude
4
- VERSION = '2.1.0.alpha2'
4
+ VERSION = '2.1.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dude-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0.alpha2
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Pupko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-01 00:00:00.000000000 Z
11
+ date: 2021-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2.1'
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.23.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.23.1
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pry
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -183,6 +197,8 @@ files:
183
197
  - lib/dude/code_management/github/create_pull_request.rb
184
198
  - lib/dude/commands.rb
185
199
  - lib/dude/commands/checkout.rb
200
+ - lib/dude/commands/commit.rb
201
+ - lib/dude/commands/health_check.rb
186
202
  - lib/dude/commands/install.rb
187
203
  - lib/dude/commands/move.rb
188
204
  - lib/dude/commands/pr.rb
@@ -193,10 +209,13 @@ files:
193
209
  - lib/dude/commands/tasks.rb
194
210
  - lib/dude/commands/track.rb
195
211
  - lib/dude/commands/version.rb
212
+ - lib/dude/config.rb
196
213
  - lib/dude/git.rb
197
214
  - lib/dude/git/checkout.rb
215
+ - lib/dude/git/commit.rb
198
216
  - lib/dude/git/current_branch_name.rb
199
217
  - lib/dude/git/remote_name.rb
218
+ - lib/dude/health_check.rb
200
219
  - lib/dude/project_management/client.rb
201
220
  - lib/dude/project_management/entities/issue.rb
202
221
  - lib/dude/project_management/jira.rb
@@ -213,7 +232,11 @@ files:
213
232
  - lib/dude/project_management/trello/get_task_name_by_id.rb
214
233
  - lib/dude/project_management/trello/move_task_to_list.rb
215
234
  - lib/dude/settings.rb
216
- - lib/dude/templates/pull_request_template
235
+ - lib/dude/setup/github.rb
236
+ - lib/dude/setup/jira.rb
237
+ - lib/dude/setup/toggl.rb
238
+ - lib/dude/setup/trello.rb
239
+ - lib/dude/templates/duderc_template
217
240
  - lib/dude/time_trackers/toggl.rb
218
241
  - lib/dude/time_trackers/toggl/base.rb
219
242
  - lib/dude/time_trackers/toggl/start_time_entry.rb
@@ -234,12 +257,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
257
  requirements:
235
258
  - - ">="
236
259
  - !ruby/object:Gem::Version
237
- version: 2.5.0
260
+ version: 2.7.0
238
261
  required_rubygems_version: !ruby/object:Gem::Requirement
239
262
  requirements:
240
- - - ">"
263
+ - - ">="
241
264
  - !ruby/object:Gem::Version
242
- version: 1.3.1
265
+ version: '0'
243
266
  requirements: []
244
267
  rubygems_version: 3.1.4
245
268
  signing_key: