dude-cli 2.1.0.alpha2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6031769a356f360e4c2dcc232c0018aec9b00353908c4158e3fe3e7c030f8a6d
4
- data.tar.gz: 5e8697a8d8606d30029996965b347c00e025de94570366804fe9e2f29285a295
3
+ metadata.gz: 8791dfac3c2ed7f7c58a7a6fef335d4abdb924a504ff09eb3a8dabbd1a882682
4
+ data.tar.gz: 61d08e0ed19364bc034d093fae732858a6b0c912bbdfc22bb27f32206496119b
5
5
  SHA512:
6
- metadata.gz: 14ec971a8a01102bbca10813e4e3603d0a8bb132f7055f463016532cc9a28e170fdff23bb99749c0616cd800033d252a1a0eaac3800f093f7329b42dab3e60af
7
- data.tar.gz: 8ff94ed54537ea464c7f747d5a572ae98807081ad71ae8e7aa9ac2976c4d002c06af9004a6f8b48d787d87439df6517923a7a4ab113d340a23b45f0899dfb494
6
+ metadata.gz: eea06c3268ae65e384114ee39bddc9eae6b4141fe84a00f32c88967ce906361cbff4f5a6f8127871c35db0b65951e5ace54a44472a4ded0c9918ea4217a367d1
7
+ data.tar.gz: e63eab6fcde90c458b235072772991624813d31523737671cfcb99ca068e3a98b9a0159e5306141e3418e95e49c4aa1f21d84823ad265d04be3caa7c34c10135
@@ -10,7 +10,7 @@ jobs:
10
10
  - uses: actions/checkout@v2
11
11
  - uses: ruby/setup-ruby@v1
12
12
  with:
13
- ruby-version: 2.6 # Not needed with a .ruby-version file
13
+ ruby-version: 2.7 # Not needed with a .ruby-version file
14
14
  bundler-cache: true # runs 'bundle install' and caches installed gems automatically
15
15
  - name: Run Rubocop
16
16
  run: bundle exec rubocop
@@ -21,7 +21,7 @@ jobs:
21
21
  - uses: actions/checkout@v2
22
22
  - uses: ruby/setup-ruby@v1
23
23
  with:
24
- ruby-version: 2.6 # Not needed with a .ruby-version file
24
+ ruby-version: 2.7 # Not needed with a .ruby-version file
25
25
  bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
26
  - name: Run RSpec
27
27
  run: COVERAGE=true bundle exec rspec
data/.gitignore CHANGED
@@ -6,6 +6,8 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /.gem
10
+ .gemrc
9
11
 
10
12
  # rspec failure tracking
11
13
  .rspec_status
data/.rubocop.yml CHANGED
@@ -4,7 +4,7 @@ Style/Documentation:
4
4
  AllCops:
5
5
  NewCops: enable
6
6
  SuggestExtensions: false
7
- TargetRubyVersion: 2.5
7
+ TargetRubyVersion: 2.7
8
8
 
9
9
  Metrics/BlockLength:
10
10
  IgnoredMethods: ['describe', 'context']
data/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.1.0] - 2021-08 23
4
+
5
+ ### Added
6
+ - Added `dude commit` feature
7
+ - Fixed Github PR wrong URL's
8
+ - Add install wizard
9
+
3
10
  ## [2.0.7] - 2021-04-02
4
11
 
5
12
  ### Added
data/Gemfile.lock CHANGED
@@ -1,11 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dude-cli (2.1.0.alpha2)
4
+ dude-cli (2.1.0)
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/
@@ -25,19 +26,25 @@ GEM
25
26
  diff-lcs (1.4.4)
26
27
  docile (1.3.5)
27
28
  dry-cli (0.7.0)
28
- faraday (1.4.2)
29
+ faraday (1.7.0)
29
30
  faraday-em_http (~> 1.0)
30
31
  faraday-em_synchrony (~> 1.0)
31
32
  faraday-excon (~> 1.1)
33
+ faraday-httpclient (~> 1.0.1)
32
34
  faraday-net_http (~> 1.0)
33
35
  faraday-net_http_persistent (~> 1.1)
36
+ faraday-patron (~> 1.0)
37
+ faraday-rack (~> 1.0)
34
38
  multipart-post (>= 1.2, < 3)
35
39
  ruby2_keywords (>= 0.0.4)
36
40
  faraday-em_http (1.0.0)
37
41
  faraday-em_synchrony (1.0.0)
38
42
  faraday-excon (1.1.0)
43
+ faraday-httpclient (1.0.1)
39
44
  faraday-net_http (1.0.1)
40
- faraday-net_http_persistent (1.1.0)
45
+ faraday-net_http_persistent (1.2.0)
46
+ faraday-patron (1.0.0)
47
+ faraday-rack (1.0.0)
41
48
  i18n (1.8.10)
42
49
  concurrent-ruby (~> 1.0)
43
50
  jira-ruby (2.1.5)
@@ -51,13 +58,15 @@ GEM
51
58
  multipart-post (2.1.1)
52
59
  oauth (0.5.6)
53
60
  parallel (1.20.1)
54
- parser (3.0.1.1)
61
+ parser (3.0.2.0)
55
62
  ast (~> 2.4.1)
63
+ pastel (0.8.0)
64
+ tty-color (~> 0.5)
56
65
  pry (0.14.1)
57
66
  coderay (~> 1.1)
58
67
  method_source (~> 1.0)
59
68
  rainbow (3.0.0)
60
- rake (13.0.3)
69
+ rake (13.0.6)
61
70
  regexp_parser (2.1.1)
62
71
  rexml (3.2.5)
63
72
  rspec (3.10.0)
@@ -73,19 +82,19 @@ GEM
73
82
  diff-lcs (>= 1.2.0, < 2.0)
74
83
  rspec-support (~> 3.10.0)
75
84
  rspec-support (3.10.2)
76
- rubocop (1.15.0)
85
+ rubocop (1.19.1)
77
86
  parallel (~> 1.10)
78
87
  parser (>= 3.0.0.0)
79
88
  rainbow (>= 2.2.2, < 4.0)
80
89
  regexp_parser (>= 1.8, < 3.0)
81
90
  rexml
82
- rubocop-ast (>= 1.5.0, < 2.0)
91
+ rubocop-ast (>= 1.9.1, < 2.0)
83
92
  ruby-progressbar (~> 1.7)
84
93
  unicode-display_width (>= 1.4.0, < 3.0)
85
- rubocop-ast (1.5.0)
94
+ rubocop-ast (1.10.0)
86
95
  parser (>= 3.0.1.1)
87
96
  ruby-progressbar (1.11.0)
88
- ruby2_keywords (0.0.4)
97
+ ruby2_keywords (0.0.5)
89
98
  simplecov (0.21.2)
90
99
  docile (~> 1.1)
91
100
  simplecov-html (~> 0.11)
@@ -94,9 +103,20 @@ GEM
94
103
  simplecov (~> 0.8)
95
104
  simplecov-html (0.12.3)
96
105
  simplecov_json_formatter (0.1.2)
106
+ tty-color (0.6.0)
107
+ tty-cursor (0.7.1)
108
+ tty-prompt (0.23.1)
109
+ pastel (~> 0.8)
110
+ tty-reader (~> 0.8)
111
+ tty-reader (0.9.0)
112
+ tty-cursor (~> 0.7)
113
+ tty-screen (~> 0.8)
114
+ wisper (~> 2.0)
115
+ tty-screen (0.8.1)
97
116
  tzinfo (2.0.4)
98
117
  concurrent-ruby (~> 1.0)
99
118
  unicode-display_width (2.0.0)
119
+ wisper (2.0.1)
100
120
  zeitwerk (2.4.2)
101
121
 
102
122
  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,54 +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|trello` - Project management (Now only Jira and Trello supported)
36
-
37
- ##### Jira setup
38
-
39
- `ATLASSIAN_EMAIL` - Your Jira email
40
-
41
- `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
42
-
43
- `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:
44
36
 
45
- `ATLASSIAN_PROJECT_KEY` - KEY of your project. If your issues have id BT-123 - BT is the key
37
+ ![Setup Wizard](/demo/wizard.gif)
46
38
 
47
- `ATLASSIAN_BOARD_ID`:
48
- 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
49
40
 
50
- 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)
51
42
 
52
- ##### Trello setup
53
- You could generate your key and token here: https://trello.com/app-key
54
-
55
- `TRELLO_KEY`
56
-
57
- `TRELLO_TOKEN`
43
+ ### Additional configuration variables:
58
44
 
59
45
  #### Replace it with your project list names. Skip for empty lists
60
46
 
61
- ```
62
- TODO_LIST_NAME=To Do
63
- IN_PROGRESS_LIST_NAME=In Progress
64
- CODE_REVIEW_LIST_NAME=Code Review
65
- TESTING_LIST_NAME=TESTABLE
66
- DONE_LIST_NAME=Done
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
67
53
  ```
68
54
 
69
- `TOGGL_PROJECT_NAME` - Your Toggl project name
55
+ #### Use the *{issue_id}* and *{issue_title}* and specify format for the task titles in Toggl or keep it as it is
70
56
 
71
- `TOGGL_TOKEN` - Your Toggl API token can be found at the bottom of the page: https://track.toggl.com/profile
72
-
73
- `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
+ ```
74
61
 
75
- #### Use the *id* and *title* and specify format for the task titles in Toggl or keep it as it is
76
- `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
+ ```
77
74
 
78
75
  ## Usage
79
76
 
@@ -88,14 +85,17 @@ alias dude="rvm 2.7.2 do dude"
88
85
 
89
86
  | Command | Required parameters | Optional parameters | Description |
90
87
  |:-------------:|:-------------------|:-------------------|:--------------------------------------------------------------------------------------|
91
- | dude install | - | - | Create .duderc file in your home directory |
92
- | dude checkout | ISSUE_ID | - | Checkout to branch with name "ID-issue-title" |
93
- | dude track | ISSUE_ID | - | Start time entry in Toggl with issue project, title and id |
94
- | dude tasks | - | - | Show all issues in current project (For current sprint) |
95
- | dude stop | - | - | Stop current time entry in Toggl |
96
- | dude start | ISSUE_ID | - | Do `checkout`, `track` and `move` actions |
97
- | dude move | ISSUE_ID | --list=NAME | Move issue to another column (Will provide options if called without --list parameter) |
98
- | 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 commit | ISSUE_ID | - | Create commit with the ID and title of current story |
93
+ | dude stop | - | - | Stop current time entry in Toggl |
94
+ | dude start | ISSUE_ID | - | Do `checkout`, `track` and `move` actions |
95
+ | dude move | ISSUE_ID | --list=NAME | Move issue to another column (Will provide options if called without --list parameter) |
96
+ | dude pr create | | | Creates PR in Github using template |
97
+ | dude version | - | - | Display gem version |
98
+ | dude healthcheck | - | - | Check configuration of all dependencies |
99
99
 
100
100
  You also can use `dude help` for short description of every command.
101
101
 
@@ -109,4 +109,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
109
109
 
110
110
  ## Changelog
111
111
 
112
- https://github.com/npupko/dude/blob/master/CHANGELOG.md
112
+ [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,14 +2,24 @@
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'
9
15
  require_relative './dude/code_management'
16
+ require_relative './dude/config'
10
17
 
11
18
  module Dude
19
+ SETTINGS = Dude::Config.configure_with('.duderc.yml')
20
+ LIST_OF_AVAILABLE_PROJECT_MANAGEMENT_TOOLS = %w[jira trello].freeze
21
+
12
22
  class ToBeImplementedError < StandardError; end
13
23
 
14
- LIST_OF_AVAILABLE_PROJECT_MANAGEMENT_TOOLS = %w[jira trello].freeze
24
+ class TaskNotFoundError < StandardError; end
15
25
  end
@@ -6,17 +6,21 @@ module Dude
6
6
  module CodeManagement
7
7
  module Github
8
8
  class Client
9
- include Settings
10
-
11
9
  def client
12
10
  @client ||= Faraday.new('https://api.github.com/', {
13
- headers: { Authorization: "token #{settings['GITHUB_TOKEN']}" }
11
+ headers: { Authorization: "token #{Dude::SETTINGS.dig(:github, :token)}" }
14
12
  })
15
13
  end
16
14
 
17
15
  def create_pull_request(issue:, owner:, repo:, params:)
18
16
  CreatePullRequest.new.call(client, issue: issue, owner: owner, repo: repo, params: params)
19
17
  end
18
+
19
+ def health_check
20
+ client.get('https://api.github.com/user').status == 200
21
+ rescue StandardError
22
+ false
23
+ end
20
24
  end
21
25
  end
22
26
  end
@@ -6,16 +6,19 @@ module Dude
6
6
  module CodeManagement
7
7
  module Github
8
8
  class CreatePullRequest
9
- include Settings
10
-
11
9
  def call(client, issue:, owner:, repo:, params:)
12
10
  @issue = issue
13
11
  @owner = owner
14
12
  @repo = repo
15
13
  @params = params
16
14
 
15
+ return unless issue
16
+
17
17
  response = client.post("https://api.github.com/repos/#{owner}/#{repo}/pulls", body.to_json)
18
18
  res = JSON.parse(response.body)
19
+
20
+ return github_error if res['errors'] && !res['errors'].empty?
21
+
19
22
  url = res['html_url']
20
23
  puts "Pull request has been created: #{url}"
21
24
  end
@@ -24,20 +27,25 @@ module Dude
24
27
 
25
28
  attr_reader :issue, :owner, :repo, :params
26
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
+
27
36
  def body
28
37
  {
29
- title: params[:title] || template['title'],
30
- body: params[:body] || template['body'],
38
+ title: params[:title] || template[:title],
39
+ body: params[:body] || template[:body],
31
40
  head: params[:head],
32
41
  base: params[:base]
33
42
  }
34
43
  end
35
44
 
36
45
  def template
37
- file = YAML.load_file(File.join(File.dirname(__FILE__), '../../templates/pull_request_template'))
38
- file.tap do |template|
39
- template['title'] = fill_variables(template['title'])
40
- template['body'] = fill_variables(template['body'])
46
+ Dude::SETTINGS.dig(:github, :pr_template).tap do |template|
47
+ template[:title] = fill_variables(template[:title])
48
+ template[:body] = fill_variables(template[:body])
41
49
  end
42
50
  end
43
51
 
data/lib/dude/commands.rb CHANGED
@@ -5,11 +5,13 @@ require_relative './commands/version'
5
5
  require_relative './commands/tasks'
6
6
  require_relative './commands/move'
7
7
  require_relative './commands/checkout'
8
+ require_relative './commands/commit'
8
9
  require_relative './commands/start'
9
10
  require_relative './commands/track'
10
11
  require_relative './commands/stop'
11
12
  require_relative './commands/install'
12
13
  require_relative './commands/pr'
14
+ require_relative './commands/health_check'
13
15
 
14
16
  module Dude
15
17
  module Commands
@@ -20,9 +22,11 @@ module Dude
20
22
  register 'tasks', Dude::Commands::Tasks, aliases: ['t', '-t', '--tasks']
21
23
  register 'move', Dude::Commands::Move, aliases: ['m', '-m', '--move']
22
24
  register 'checkout', Dude::Commands::Checkout, aliases: ['co']
25
+ register 'commit', Dude::Commands::Commit
23
26
  register 'track', Dude::Commands::Track, aliases: ['tr']
24
27
  register 'stop', Dude::Commands::Stop
25
28
  register 'start', Dude::Commands::Start, aliases: ['st']
29
+ register 'healthcheck', Dude::Commands::HealthCheck
26
30
 
27
31
  register 'pr' do |prefix|
28
32
  prefix.register 'create', Dude::Commands::PR::Create