dude-cli 2.0.7 → 2.1.0.alpha5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +0 -1
  3. data/.rubocop.yml +5 -1
  4. data/Gemfile.lock +36 -15
  5. data/README.md +43 -35
  6. data/dude.gemspec +3 -2
  7. data/lib/dude.rb +12 -2
  8. data/lib/dude/code_management.rb +10 -0
  9. data/lib/dude/code_management/github/client.rb +27 -0
  10. data/lib/dude/code_management/github/create_pull_request.rb +61 -0
  11. data/lib/dude/commands.rb +7 -0
  12. data/lib/dude/commands/health_check.rb +15 -0
  13. data/lib/dude/commands/install.rb +63 -41
  14. data/lib/dude/commands/pr.rb +11 -0
  15. data/lib/dude/commands/pr/create.rb +49 -0
  16. data/lib/dude/commands/pr/remove.rb +15 -0
  17. data/lib/dude/commands/start.rb +10 -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/remote_name.rb +21 -0
  24. data/lib/dude/health_check.rb +39 -0
  25. data/lib/dude/project_management/client.rb +8 -4
  26. data/lib/dude/project_management/entities/issue.rb +8 -7
  27. data/lib/dude/project_management/jira/client.rb +21 -8
  28. data/lib/dude/project_management/jira/fetch_current_task.rb +37 -0
  29. data/lib/dude/project_management/jira/fetch_current_tasks.rb +3 -4
  30. data/lib/dude/project_management/jira/get_task_name_by_id.rb +0 -2
  31. data/lib/dude/project_management/jira/move_task_to_list.rb +0 -2
  32. data/lib/dude/project_management/{entities/board.rb → trello.rb} +1 -3
  33. data/lib/dude/project_management/trello/client.rb +56 -0
  34. data/lib/dude/project_management/trello/fetch_current_task.rb +41 -0
  35. data/lib/dude/project_management/trello/fetch_current_tasks.rb +51 -0
  36. data/lib/dude/project_management/trello/fetch_lists.rb +22 -0
  37. data/lib/dude/project_management/trello/get_task_name_by_id.rb +23 -0
  38. data/lib/dude/project_management/trello/move_task_to_list.rb +53 -0
  39. data/lib/dude/setup/github.rb +35 -0
  40. data/lib/dude/setup/jira.rb +64 -0
  41. data/lib/dude/setup/toggl.rb +47 -0
  42. data/lib/dude/setup/trello.rb +58 -0
  43. data/lib/dude/templates/duderc_template +32 -0
  44. data/lib/dude/time_trackers/toggl/base.rb +2 -4
  45. data/lib/dude/version.rb +1 -1
  46. metadata +42 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f193ac190cdcd95628911cd674828269e6dfbbc7cc1e5fc0a60d5369ba6dd00e
4
- data.tar.gz: 9b0ee32f4a20cbc7016fe7b6db792b2af4d9447ebc0356e124a97d0c1b8fee16
3
+ metadata.gz: 5a9d94fda51194e817efc77f7d46cf2cf7f8e94351c7cb989f7dd0512637e16f
4
+ data.tar.gz: 842f71093238abc9e102594629dc20ea6dc4677968c526dc6d0695ffd99a61d4
5
5
  SHA512:
6
- metadata.gz: e7153c965ca0222b34f7cc5dc14ee1e21d77303932b0c27f224a935ea3940ef088f5c907e60871f256080e31771914ab69b883b0bb6549c6731dc10a1d50237d
7
- data.tar.gz: 1c42491aca9dd9d44d80ee46a08b0babf816bac4dd6c129de45975e0b9923939ae5b3f852a4aeccbb2263b7e1bd7d87817fe3502fda998ff17ccbd19456d6616
6
+ metadata.gz: 6ff9e01d64edc716ec55b366a03774eeb29819061e9ff52d4075f68780eb5f9f3fdb8249b5f31dc032e24d859dac341badda6cb19a074f58e55becefeafd32ca
7
+ data.tar.gz: 1739d16b3db6b32d57d0f186ea918c6358c2ff6e026cb1a5daf29e9c9e0b8e09d509bc034cfc94030bdf2c4169e312b527870f01271512bdf36451bc0ab4467b
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
- --format documentation
2
1
  --color
3
2
  --require spec_helper
data/.rubocop.yml CHANGED
@@ -2,8 +2,12 @@ Style/Documentation:
2
2
  Enabled: false
3
3
 
4
4
  AllCops:
5
+ NewCops: enable
5
6
  SuggestExtensions: false
6
- TargetRubyVersion: 2.5
7
+ TargetRubyVersion: 2.7
7
8
 
8
9
  Metrics/BlockLength:
9
10
  IgnoredMethods: ['describe', 'context']
11
+
12
+ Layout/FirstHashElementIndentation:
13
+ EnforcedStyle: consistent
data/Gemfile.lock CHANGED
@@ -1,16 +1,17 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dude-cli (2.0.6)
4
+ dude-cli (2.1.0.alpha5)
5
5
  colorize (~> 0.8.1)
6
6
  dry-cli (~> 0.6)
7
7
  faraday (~> 1.1)
8
8
  jira-ruby (~> 2.1)
9
+ tty-prompt (~> 0.23.1)
9
10
 
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
13
- activesupport (6.1.3)
14
+ activesupport (6.1.3.2)
14
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
16
  i18n (>= 1.6, < 2)
16
17
  minitest (>= 5.1)
@@ -24,14 +25,21 @@ GEM
24
25
  concurrent-ruby (1.1.8)
25
26
  diff-lcs (1.4.4)
26
27
  docile (1.3.5)
27
- dry-cli (0.6.0)
28
- concurrent-ruby (~> 1.0)
29
- faraday (1.3.0)
28
+ dry-cli (0.7.0)
29
+ faraday (1.4.2)
30
+ faraday-em_http (~> 1.0)
31
+ faraday-em_synchrony (~> 1.0)
32
+ faraday-excon (~> 1.1)
30
33
  faraday-net_http (~> 1.0)
34
+ faraday-net_http_persistent (~> 1.1)
31
35
  multipart-post (>= 1.2, < 3)
32
- ruby2_keywords
36
+ ruby2_keywords (>= 0.0.4)
37
+ faraday-em_http (1.0.0)
38
+ faraday-em_synchrony (1.0.0)
39
+ faraday-excon (1.1.0)
33
40
  faraday-net_http (1.0.1)
34
- i18n (1.8.9)
41
+ faraday-net_http_persistent (1.1.0)
42
+ i18n (1.8.10)
35
43
  concurrent-ruby (~> 1.0)
36
44
  jira-ruby (2.1.5)
37
45
  activesupport
@@ -42,17 +50,19 @@ GEM
42
50
  method_source (1.0.0)
43
51
  minitest (5.14.4)
44
52
  multipart-post (2.1.1)
45
- oauth (0.5.5)
53
+ oauth (0.5.6)
46
54
  parallel (1.20.1)
47
- parser (3.0.0.0)
55
+ parser (3.0.1.1)
48
56
  ast (~> 2.4.1)
49
- pry (0.14.0)
57
+ pastel (0.8.0)
58
+ tty-color (~> 0.5)
59
+ pry (0.14.1)
50
60
  coderay (~> 1.1)
51
61
  method_source (~> 1.0)
52
62
  rainbow (3.0.0)
53
63
  rake (13.0.3)
54
64
  regexp_parser (2.1.1)
55
- rexml (3.2.4)
65
+ rexml (3.2.5)
56
66
  rspec (3.10.0)
57
67
  rspec-core (~> 3.10.0)
58
68
  rspec-expectations (~> 3.10.0)
@@ -66,17 +76,17 @@ GEM
66
76
  diff-lcs (>= 1.2.0, < 2.0)
67
77
  rspec-support (~> 3.10.0)
68
78
  rspec-support (3.10.2)
69
- rubocop (1.12.0)
79
+ rubocop (1.15.0)
70
80
  parallel (~> 1.10)
71
81
  parser (>= 3.0.0.0)
72
82
  rainbow (>= 2.2.2, < 4.0)
73
83
  regexp_parser (>= 1.8, < 3.0)
74
84
  rexml
75
- rubocop-ast (>= 1.2.0, < 2.0)
85
+ rubocop-ast (>= 1.5.0, < 2.0)
76
86
  ruby-progressbar (~> 1.7)
77
87
  unicode-display_width (>= 1.4.0, < 3.0)
78
- rubocop-ast (1.4.1)
79
- parser (>= 2.7.1.5)
88
+ rubocop-ast (1.5.0)
89
+ parser (>= 3.0.1.1)
80
90
  ruby-progressbar (1.11.0)
81
91
  ruby2_keywords (0.0.4)
82
92
  simplecov (0.21.2)
@@ -87,9 +97,20 @@ GEM
87
97
  simplecov (~> 0.8)
88
98
  simplecov-html (0.12.3)
89
99
  simplecov_json_formatter (0.1.2)
100
+ tty-color (0.6.0)
101
+ tty-cursor (0.7.1)
102
+ tty-prompt (0.23.1)
103
+ pastel (~> 0.8)
104
+ tty-reader (~> 0.8)
105
+ tty-reader (0.9.0)
106
+ tty-cursor (~> 0.7)
107
+ tty-screen (~> 0.8)
108
+ wisper (~> 2.0)
109
+ tty-screen (0.8.1)
90
110
  tzinfo (2.0.4)
91
111
  concurrent-ruby (~> 1.0)
92
112
  unicode-display_width (2.0.0)
113
+ wisper (2.0.1)
93
114
  zeitwerk (2.4.2)
94
115
 
95
116
  PLATFORMS
data/README.md CHANGED
@@ -8,7 +8,9 @@
8
8
 
9
9
  A daily assistant in the hard work of a programmer
10
10
 
11
- This program helps to combine such services as [Jira](https://atlassian.net), [Toggl](https://toggl.com) and replace most routine activities with one simple CLI utility.
11
+ This program helps to combine such services as [Jira](https://atlassian.net), [Trello](https://trello.com), [Toggl](https://toggl.com), etc. and replace most routine activities with one simple CLI utility.
12
+
13
+ ![Dude](/demo/dude.gif)
12
14
 
13
15
  ## Installation
14
16
 
@@ -26,45 +28,49 @@ Or install it yourself as:
26
28
 
27
29
  $ gem install dude-cli
28
30
 
29
- After that create .duderc file in your HOME directory by command:
31
+ After that create .duderc.yml file in your work project directory by command:
30
32
 
31
33
  $ dude install
32
34
 
33
- And configure all variables in this file
34
-
35
- `PROJECT_MANAGEMENT_TOOL=jira` - Project management (Now only Jira supported)
36
- `ATLASSIAN_EMAIL` - Your Jira email
37
-
38
- `ATLASSIAN_TOKEN` - How to create Atlassian token: https://support.siteimprove.com/hc/en-gb/articles/360004317332-How-to-create-an-API-token-from-your-Atlassian-account
39
-
40
- `ATLASSIAN_URL` - URL of your project. Example: https://example.atlassian.net
35
+ It will offer you a step by step instruction how to setup dude:
41
36
 
42
- `ATLASSIAN_PROJECT_KEY` - KEY of your project. If your issues have id BT-123 - BT is the key
37
+ ![Setup Wizard](/demo/wizard.gif)
43
38
 
44
- `ATLASSIAN_BOARD_ID`:
45
- Just open your atlassian main board and copy id from the url after rapidView=*ID* part.
39
+ You always could edit this file manually and setup some stuff like Toggl time entry name or Github PR template
46
40
 
47
- Example: https://dealmakerns.atlassian.net/secure/RapidBoard.jspa?rapidView=23&projectKey=DT - 23 is the id
41
+ Default template could be found here: [lib/dude/templates/duderc_template](/lib/dude/templates/duderc_template)
48
42
 
43
+ ### Additional configuration variables:
49
44
 
50
45
  #### Replace it with your project list names. Skip for empty lists
51
46
 
47
+ ```yaml
48
+ :todo_list_name: To Do
49
+ :in_progress_list_name: In Progress
50
+ :code_review_list_name: Code Review
51
+ :testing_list_name: TESTABLE
52
+ :done_list_name: Done
52
53
  ```
53
- TODO_LIST_NAME=To Do
54
- IN_PROGRESS_LIST_NAME=In Progress
55
- CODE_REVIEW_LIST_NAME=Code Review
56
- TESTING_LIST_NAME=TESTABLE
57
- DONE_LIST_NAME=Done
58
- ```
59
-
60
- `TOGGL_PROJECT_NAME` - Your Toggl project name
61
54
 
62
- `TOGGL_TOKEN` - Your Toggl API token can be found at the bottom of the page: https://track.toggl.com/profile
55
+ #### Use the *{issue_id}* and *{issue_title}* and specify format for the task titles in Toggl or keep it as it is
63
56
 
64
- `TOGGL_WORKSPACE_ID` - Can be copied from url here: https://toggl.com/app/projects/. Example: 123456
57
+ ```yaml
58
+ :toggl:
59
+ :task_format: [{issue_id}] {issue_title}
60
+ ```
65
61
 
66
- #### Use the *id* and *title* and specify format for the task titles in Trello or keep it as it is
67
- `TOGGL_TASK_FORMAT=[id] title`
62
+ #### Github PR template looks like this (Available variables: *{issue_id}*, *{issue_title}*, *{issue_url}*)
63
+
64
+ ```yaml
65
+ :github:
66
+ :pr_template:
67
+ :title: "[{issue_id}] {issue_title}\n"
68
+ :body: |
69
+ ## Story
70
+ [**\[{issue_id}\] {issue_title}**]({issue_url})
71
+ ## Description
72
+ Example description of the issue
73
+ ```
68
74
 
69
75
  ## Usage
70
76
 
@@ -79,14 +85,16 @@ alias dude="rvm 2.7.2 do dude"
79
85
 
80
86
  | Command | Required parameters | Optional parameters | Description |
81
87
  |:-------------:|:-------------------|:-------------------|:--------------------------------------------------------------------------------------|
82
- | dude install | - | - | Create .duderc file in your home directory |
83
- | dude checkout | ISSUE_ID | - | Checkout to branch with name "ID-issue-title" |
84
- | dude track | ISSUE_ID | - | Start time entry in Toggl with issue project, title and id |
85
- | dude tasks | - | - | Show all issues in current project (For current sprint) |
86
- | dude stop | - | - | Stop current time entry in Toggl |
87
- | dude start | ISSUE_ID | - | Do `checkout`, `track` and `move` actions |
88
- | dude move | ISSUE_ID | --list=NAME | Move issue to another column (Will provide options if called without --list parameter) |
89
- | dude version | - | - | Display gem version |
88
+ | dude install | - | - | Create .duderc file in your home directory |
89
+ | dude checkout | ISSUE_ID | - | Checkout to branch with name "ID-issue-title" |
90
+ | dude track | ISSUE_ID | - | Start time entry in Toggl with issue project, title and id |
91
+ | dude tasks | - | - | Show all issues in current project (For current sprint) |
92
+ | dude stop | - | - | Stop current time entry in Toggl |
93
+ | dude start | ISSUE_ID | - | Do `checkout`, `track` and `move` actions |
94
+ | dude move | ISSUE_ID | --list=NAME | Move issue to another column (Will provide options if called without --list parameter) |
95
+ | dude pr create | | | Creates PR in Github using template |
96
+ | dude version | - | - | Display gem version |
97
+ | dude healthcheck | - | - | Check configuration of all dependencies |
90
98
 
91
99
  You also can use `dude help` for short description of every command.
92
100
 
@@ -100,4 +108,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
100
108
 
101
109
  ## Changelog
102
110
 
103
- https://github.com/npupko/dude/blob/master/CHANGELOG.md
111
+ [CHANGELOG.md](/CHANGELOG.md)
data/dude.gemspec CHANGED
@@ -16,13 +16,13 @@ Gem::Specification.new do |spec|
16
16
  DESC
17
17
  spec.homepage = 'https://github.com/npupko/dude'
18
18
  spec.license = 'MIT'
19
- spec.required_ruby_version = Gem::Requirement.new('>= 2.5.0')
19
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.7.0')
20
20
 
21
21
  spec.metadata['homepage_uri'] = spec.homepage
22
22
  spec.metadata['source_code_uri'] = 'https://github.com/npupko/dude'
23
23
  spec.metadata['changelog_uri'] = 'https://github.com/npupko/dude/blob/master/CHANGELOG.md'
24
24
 
25
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|demo)/}) }
26
26
 
27
27
  spec.bindir = 'bin'
28
28
  spec.executables = ['dude']
@@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_runtime_dependency 'dry-cli', '~> 0.6'
33
33
  spec.add_runtime_dependency 'faraday', '~> 1.1'
34
34
  spec.add_runtime_dependency 'jira-ruby', '~> 2.1'
35
+ spec.add_runtime_dependency 'tty-prompt', '~> 0.23.1'
35
36
 
36
37
  spec.add_development_dependency 'pry', '~> 0.14.0'
37
38
  spec.add_development_dependency 'rake', '~> 13.0'
data/lib/dude.rb CHANGED
@@ -2,13 +2,23 @@
2
2
 
3
3
  require 'colorize'
4
4
 
5
+ begin
6
+ require 'pry'
7
+ rescue LoadError
8
+ nil
9
+ end
10
+
5
11
  require_relative './dude/settings'
6
12
  require_relative './dude/version'
7
13
  require_relative './dude/commands'
8
14
  require_relative './dude/git'
15
+ require_relative './dude/code_management'
16
+ require_relative './dude/config'
9
17
 
10
18
  module Dude
11
- class ToBeImplementedError < StandardError; end
19
+ SETTINGS = Dude::Config.configure_with('.duderc.yml')
20
+ LIST_OF_AVAILABLE_PROJECT_MANAGEMENT_TOOLS = %w[jira trello].freeze
12
21
 
13
- LIST_OF_AVAILABLE_PROJECT_MANAGEMENT_TOOLS = %w[jira].freeze
22
+ class ToBeImplementedError < StandardError; end
23
+ class TaskNotFoundError < StandardError; end
14
24
  end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './code_management/github/client'
4
+
5
+ module Dude
6
+ module CodeManagement
7
+ module Github
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './create_pull_request'
4
+
5
+ module Dude
6
+ module CodeManagement
7
+ module Github
8
+ class Client
9
+ def client
10
+ @client ||= Faraday.new('https://api.github.com/', {
11
+ headers: { Authorization: "token #{Dude::SETTINGS.dig(:github, :token)}" }
12
+ })
13
+ end
14
+
15
+ def create_pull_request(issue:, owner:, repo:, params:)
16
+ CreatePullRequest.new.call(client, issue: issue, owner: owner, repo: repo, params: params)
17
+ end
18
+
19
+ def health_check
20
+ client.get('https://api.github.com/user').status == 200
21
+ rescue StandardError
22
+ false
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Dude
6
+ module CodeManagement
7
+ module Github
8
+ class CreatePullRequest
9
+ def call(client, issue:, owner:, repo:, params:)
10
+ @issue = issue
11
+ @owner = owner
12
+ @repo = repo
13
+ @params = params
14
+
15
+ return unless issue
16
+
17
+ response = client.post("https://api.github.com/repos/#{owner}/#{repo}/pulls", body.to_json)
18
+ res = JSON.parse(response.body)
19
+
20
+ return github_error unless res['errors'] && res['errors'].empty?
21
+
22
+ url = res['html_url']
23
+ puts "Pull request has been created: #{url}"
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :issue, :owner, :repo, :params
29
+
30
+ def github_error
31
+ puts <<~HEREDOC
32
+ #{'Error:'.red.bold} GitHub cannot create new Pull Request from #{params[:head].bold} branch. Try to push your branch and try again
33
+ HEREDOC
34
+ end
35
+
36
+ def body
37
+ {
38
+ title: params[:title] || template[:title],
39
+ body: params[:body] || template[:body],
40
+ head: params[:head],
41
+ base: params[:base]
42
+ }
43
+ end
44
+
45
+ def template
46
+ Dude::SETTINGS.dig(:github, :pr_template).tap do |template|
47
+ template[:title] = fill_variables(template[:title])
48
+ template[:body] = fill_variables(template[:body])
49
+ end
50
+ end
51
+
52
+ def fill_variables(text)
53
+ text
54
+ .then { _1.gsub('{issue_id}', issue.id) }.chomp
55
+ .then { _1.gsub('{issue_url}', issue.url) }
56
+ .then { _1.gsub('{issue_title}', issue.title) }
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
data/lib/dude/commands.rb CHANGED
@@ -9,6 +9,8 @@ require_relative './commands/start'
9
9
  require_relative './commands/track'
10
10
  require_relative './commands/stop'
11
11
  require_relative './commands/install'
12
+ require_relative './commands/pr'
13
+ require_relative './commands/health_check'
12
14
 
13
15
  module Dude
14
16
  module Commands
@@ -22,5 +24,10 @@ module Dude
22
24
  register 'track', Dude::Commands::Track, aliases: ['tr']
23
25
  register 'stop', Dude::Commands::Stop
24
26
  register 'start', Dude::Commands::Start, aliases: ['st']
27
+ register 'healthcheck', Dude::Commands::HealthCheck
28
+
29
+ register 'pr' do |prefix|
30
+ prefix.register 'create', Dude::Commands::PR::Create
31
+ end
25
32
  end
26
33
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../health_check'
4
+
5
+ module Dude
6
+ module Commands
7
+ class HealthCheck < Dry::CLI::Command
8
+ desc 'Run healthcheck for enabled integrations'
9
+
10
+ def call
11
+ Dude::HealthCheck.new.call
12
+ end
13
+ end
14
+ end
15
+ end