pr-with-params 0.1.3 → 1.0.2
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 +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +35 -2
- data/exe/pr-with-params +24 -9
- data/lib/pr/with/params/config_parser.rb +53 -0
- data/lib/pr/with/params/version.rb +1 -1
- data/lib/pr/with/params.rb +20 -2
- data/pr-with-params.gemspec +1 -1
- metadata +7 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd62108def63836659f73059843a5260211596b80e344a2543939688b3dadaba
|
4
|
+
data.tar.gz: b538c821030781006c3df77169c082ada6ccf68c7a74d330f23363d93792ccaa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7d30fbe9b54a10925d688bd9ece749c034ada2b300e0f4bbb3022a0ae0380f335257506aa7b41c8bf7593ceab8639cefc55a84fad88585d288ccf365b33587d
|
7
|
+
data.tar.gz: 3fe80d1fdbae5795051485882a56d5ff5ac26e1bdabf01b62121655fe52a34d7f95d0fa3a302b0d064ca64ca6b5a52d6969f6dd541bab0e60ff6526297f11a25
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
# PR::With::Params
|
2
|
-
A lightweight gem that pushes current local branch to remote with upstream
|
1
|
+
# PR::With::Params [](https://badge.fury.io/rb/pr-with-params)
|
2
|
+
A lightweight gem that pushes current local branch to remote with upstream at origin/[local-branch-name]. It also opens a new pull request browser window at a URL with customized query params, based on specified options, which pre-populates certain fields in the pull request. This is especially useful when supporting multiple PR templates within a code base.
|
3
|
+
|
4
|
+
Inspired by GitHub's documentation on [using query params to create pull requets](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/using-query-parameters-to-create-a-pull-request)
|
3
5
|
|
4
6
|
## Installation
|
5
7
|
|
@@ -27,6 +29,37 @@ $ pr-with-params -t new_feature_template.md -l 'work in progress'
|
|
27
29
|
|
28
30
|
For a full list of options, run `$ pr-with-params -h`
|
29
31
|
|
32
|
+
#### Using Config File
|
33
|
+
|
34
|
+
Gem supports defining options in a yaml file (`.yaml`, `.yml`) like so:
|
35
|
+
```yaml
|
36
|
+
default:
|
37
|
+
base_branch: main
|
38
|
+
template: new_feature_template.md
|
39
|
+
assignees: 2k-joker
|
40
|
+
labels: enhancement
|
41
|
+
|
42
|
+
bug_fix:
|
43
|
+
template: bug_fix_template.md
|
44
|
+
labels: bug,urgent
|
45
|
+
```
|
46
|
+
|
47
|
+
* To run with config file, use `$ pr-with-params --conf='path/to/file.yml' --scope=bug_fix`. If `--scope` option is not specified, only `:default` scope will apply.
|
48
|
+
* If you specify a config file (`--conf`) and also pass options by flag (e.g `--base-branch=develop`), the flag value will override the config value.
|
49
|
+
* All your defaults go in the `:default` scope.
|
50
|
+
* Only fields defined in another scope will override the defaults. In the example above, the final list of configs will be:
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
{ base_branch: 'main', template: 'bug_fix_template.md', assignees: '2k-joker', labels: 'bug,urgent' }
|
54
|
+
```
|
55
|
+
|
56
|
+
**Supported configs**
|
57
|
+
* base_branch
|
58
|
+
* template
|
59
|
+
* title
|
60
|
+
* labels
|
61
|
+
* assignees
|
62
|
+
|
30
63
|
## Development
|
31
64
|
|
32
65
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/exe/pr-with-params
CHANGED
@@ -4,8 +4,11 @@ require 'bundler/setup' # support local testing/development
|
|
4
4
|
require_relative '../lib/pr/with/params'
|
5
5
|
require 'json'
|
6
6
|
require 'optparse'
|
7
|
+
require 'open3'
|
7
8
|
|
8
9
|
options = { expand: 1 }
|
10
|
+
config_file_path = ''
|
11
|
+
config_scope = nil
|
9
12
|
|
10
13
|
parser = OptionParser.new do |opt|
|
11
14
|
opt.banner = "Usage pr-with-params [options]"
|
@@ -19,6 +22,15 @@ parser = OptionParser.new do |opt|
|
|
19
22
|
|
20
23
|
opt.separator ''
|
21
24
|
|
25
|
+
opt.on('--conf FILE_PATH', 'Path to yaml file where options are defined. NOTE that relative paths are not supported.') do |conf_file|
|
26
|
+
stdout, _stderr, _status = Open3.capture3("echo #{conf_file}")
|
27
|
+
config_file_path = stdout.chomp
|
28
|
+
end
|
29
|
+
|
30
|
+
opt.on('--scope CONFIG_SCOPE', 'Specify the scope name under which options are defined.') do |scope|
|
31
|
+
config_scope = scope
|
32
|
+
end
|
33
|
+
|
22
34
|
opt.on('--base-branch BRANCH', "Specify the base branch for your PR (e.g: 'develop'). Will use default branch otherwise.") do |pr_base_branch|
|
23
35
|
options[:base_branch] = pr_base_branch
|
24
36
|
end
|
@@ -43,21 +55,24 @@ end
|
|
43
55
|
begin
|
44
56
|
parser.parse!
|
45
57
|
|
46
|
-
|
47
|
-
|
58
|
+
config_options = PR::With::Params.parse_config(config_file_path, config_scope)
|
59
|
+
options = config_options.merge(options)
|
60
|
+
|
61
|
+
branch_name = `git rev-parse --abbrev-ref HEAD`.chomp
|
62
|
+
base_branch = options.delete(:base_branch) || `git remote show origin | grep "HEAD branch" | sed 's/.*: //'`.chomp
|
48
63
|
remote_git_uri = `git config --get remote.origin.url`.sub('git@github.com:', '').sub('.git', '').chomp
|
49
64
|
|
50
65
|
uri_host = 'www.github.com'
|
51
|
-
uri_path = "/#{remote_git_uri}/compare/#{base_branch
|
66
|
+
uri_path = "/#{remote_git_uri}/compare/#{base_branch}...#{branch_name}"
|
52
67
|
|
53
|
-
puts "current branch: \e[36m#{branch_name
|
54
|
-
puts "base branch: \e[36m#{base_branch
|
68
|
+
puts "current branch: \e[36m#{branch_name}\e[0m"
|
69
|
+
puts "base branch: \e[36m#{base_branch}\e[0m"
|
55
70
|
puts "repo path: \e[36m#{remote_git_uri}\e[0m"
|
56
71
|
|
57
|
-
push_message = "\nPushing your local branch to origin/#{branch_name
|
72
|
+
push_message = "\nPushing your local branch to origin/#{branch_name}..."
|
58
73
|
puts "\e[32m#{push_message}\e[0m"
|
59
74
|
`sleep 1`
|
60
|
-
system("git push -u origin #{branch_name}")
|
75
|
+
system("git push -u origin #{branch_name}", exception: true)
|
61
76
|
|
62
77
|
open_url_message = "\nOpening pull request browser window..."
|
63
78
|
puts "\e[32m#{open_url_message}\e[0m"
|
@@ -67,9 +82,9 @@ rescue StandardError => e
|
|
67
82
|
error_message = {
|
68
83
|
message: 'An error occurred while building or opening your custom pull request URL',
|
69
84
|
reason: e.message,
|
70
|
-
backtrace: e.backtrace
|
85
|
+
backtrace: e.backtrace&.last(10)
|
71
86
|
}.to_json
|
72
87
|
|
73
|
-
STDERR.puts error_message
|
88
|
+
STDERR.puts "\n" + "\e[31mERROR:\e[0m " + error_message + "\n"
|
74
89
|
exit 1
|
75
90
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module PR
|
4
|
+
module With
|
5
|
+
module Params
|
6
|
+
class ConfigParser
|
7
|
+
# Attributes
|
8
|
+
attr_reader :config_file_path, :scope, :parsed_config, :filtered_config
|
9
|
+
|
10
|
+
# Constants
|
11
|
+
VALID_CONFIG_KEYS = %i[base_branch template title labels assignees].freeze
|
12
|
+
|
13
|
+
def initialize(config_file_path:, scope: nil)
|
14
|
+
@config_file_path = config_file_path
|
15
|
+
@scope = scope&.to_sym || :default
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse!
|
19
|
+
validate_file_type!
|
20
|
+
parse_yaml_config
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def parse_yaml_config
|
26
|
+
@parsed_config = YAML::load(IO.read(config_file_path)).transform_keys(&:to_sym)
|
27
|
+
@filtered_config = scoped_config.transform_keys(&:to_sym).slice(*VALID_CONFIG_KEYS)
|
28
|
+
end
|
29
|
+
|
30
|
+
def scoped_config
|
31
|
+
if scope == :default || parsed_config.fetch(scope, {}).empty?
|
32
|
+
parsed_config.fetch(:default, {})
|
33
|
+
else
|
34
|
+
parsed_config.fetch(:default, {}).merge(parsed_config[scope])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_file_type!
|
39
|
+
raise ArgumentError.new('Config file path is invalid or file does not exist.') unless file_exists?
|
40
|
+
raise TypeError.new('Config file type must be YAML (.yaml or .yml)') unless yaml_file?
|
41
|
+
end
|
42
|
+
|
43
|
+
def yaml_file?
|
44
|
+
config_file_path.end_with?('.yaml') || config_file_path.end_with?('yml')
|
45
|
+
end
|
46
|
+
|
47
|
+
def file_exists?
|
48
|
+
File.file?(config_file_path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/lib/pr/with/params.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative
|
3
|
+
require_relative 'params/version'
|
4
|
+
require_relative 'params/config_parser'
|
4
5
|
require 'uri'
|
6
|
+
require 'json'
|
5
7
|
require 'launchy'
|
6
8
|
|
7
9
|
module PR
|
@@ -9,11 +11,27 @@ module PR
|
|
9
11
|
module Params
|
10
12
|
class Error < StandardError; end
|
11
13
|
|
12
|
-
|
14
|
+
extend self
|
15
|
+
|
16
|
+
def open(host:, path:, query:)
|
13
17
|
uri_query = URI.encode_www_form(query)
|
14
18
|
url_string = URI::HTTPS.build(host: host, path: path, query: uri_query).to_s
|
15
19
|
Launchy.open(url_string)
|
16
20
|
end
|
21
|
+
|
22
|
+
def parse_config(file_path, scope)
|
23
|
+
config_options = ConfigParser.new(config_file_path: file_path, scope: scope).parse!
|
24
|
+
rescue StandardError => e
|
25
|
+
error_message = {
|
26
|
+
message: "Error parsing config file. Using defaults",
|
27
|
+
reason: e.message,
|
28
|
+
backtrace: e.backtrace&.last(10)
|
29
|
+
}.to_json
|
30
|
+
|
31
|
+
STDERR.puts "\e[35mWARNING\e[0m: " + error_message + "\n"
|
32
|
+
|
33
|
+
{}
|
34
|
+
end
|
17
35
|
end
|
18
36
|
end
|
19
37
|
end
|
data/pr-with-params.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.authors = ["2k-joker"]
|
9
9
|
spec.email = ["kum.vanjunior@gmail.com"]
|
10
10
|
|
11
|
-
spec.summary = "Pushes current local branch to remote with upstream
|
11
|
+
spec.summary = "Pushes current local branch to remote with upstream at origin/[local-branch-name]. It also opens a new pull request browser window at a URL with customized query params, based on specified options, which pre-populates certain fields in the pull request. This is especially useful when supporting multiple PR templates within a code base."
|
12
12
|
spec.homepage = "https://github.com/2k-joker/pr-with-params"
|
13
13
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
14
14
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pr-with-params
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- 2k-joker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- bin/setup
|
32
32
|
- exe/pr-with-params
|
33
33
|
- lib/pr/with/params.rb
|
34
|
+
- lib/pr/with/params/config_parser.rb
|
34
35
|
- lib/pr/with/params/version.rb
|
35
36
|
- pr-with-params.gemspec
|
36
37
|
homepage: https://github.com/2k-joker/pr-with-params
|
@@ -55,7 +56,8 @@ requirements: []
|
|
55
56
|
rubygems_version: 3.2.3
|
56
57
|
signing_key:
|
57
58
|
specification_version: 4
|
58
|
-
summary: Pushes current local branch to remote with upstream
|
59
|
-
It also opens a new browser window at a URL with customized params,
|
60
|
-
options, which
|
59
|
+
summary: Pushes current local branch to remote with upstream at origin/[local-branch-name].
|
60
|
+
It also opens a new pull request browser window at a URL with customized query params,
|
61
|
+
based on specified options, which pre-populates certain fields in the pull request.
|
62
|
+
This is especially useful when supporting multiple PR templates within a code base.
|
61
63
|
test_files: []
|