Purr PR
Tired of formatting/writing the same PR text over and over again? Use Purr PR to create a simple formatting script!
Installation
Add this line to your application's Gemfile:
gem 'purr-pr'And then execute:
bundle installOr install it yourself as:
gem install purr-prDependencies
This gem using GitHub CLI tool to conveniently create PRs, so you will need to install it in order to use Purr PR.
Usage
After installing gem, create a purr.rb file in the root of your git project. This file will describe your PRs.
Configuration
Now you can use purr.rb file to create your formatting script
Body
As body is the biggest PR part there are a lot of helpers to edit it. The base format is a:
body do
# your edits
endFirst of all the use_template method will simply copy the contents of .github/pull_request_template.md to a body buffer.
To use any other file as a template you can provide the path to it as an argument:
body do
use_template
# or use_template '.github/some_other_template.md'
endThe above code will create a PR with body that has the contents of a PR template file, but this is what GitHub do by default, so then you'll probably want to apply some edits.
For the future edits lets say that the contents of .github/pull_request_template.md is 'foo-template'
To append or prepend some content to the buffer you can use corresponding methods:
body do
use_template
append '-postfix'
prepend '[STORY_NUMBER] '
endIt will create the next body: '[STORY_NUMBER] foo-template-postfix'.
To change some text in a buffer use the replace method:
body do
use_template
append '-postfix'
prepend '[STORY_NUMBER] '
replace '[STORY_NUMBER]', with: 1337
end=> '[1337] foo-template-postfix'.
To remove some text use the delete method:
body do
use_template
append '-postfix'
prepend '[STORY_NUMBER] '
replace '[STORY_NUMBER]', with: 1337
delete '-postfix'
end=> '[1337] foo-template'.
You can conditionally clear the buffer with the clear method:
body do
use_template
clear if argv.first == '--empty'
endThe above code will create the PR with empty body if the first argument is '--empty'.
Manual edits
You can also open the $EDITOR and manually edit the buffer text with editor method:
body do
use_template
editor
endThe above config will allow you to edit your template before creating a PR.
Optionally you can provide file format to use syntax highlighting (the default is :md): editor format: :html.
Confirmation
If you whant to ensure that your edits are correct use confirm method, it will display you current buffer and ask Y/N confirmation to continue:
body do
use_template
confirm
endHelpers
There are some syntax sugar and helpers to be used as the arguments of above methods:
body do
append newline(3) # => '\n\n\n'
append space # => ' '
append current_branch # => Current git branch name
append commits.last # => Latest commit (for the current branch) message
clear if argv.first == '--foo' # command line arguments are available too
endThe only argument for newline and space is their count.
Actions
To ask a Y/N question you can use ask_yn method:
body do
ask_yn 'wanna dance? (Y/N)', confirm: -> { append 'yeeesss' }, decline: -> { append 'nope :(' }
endThe first argument is a message, and :confirm and :decline arguments are for callbacks.
To ask for a custom input use the ask method:
body do
append(ask 'Story number: ', default: 1337)
endIt will prompt you to enter the story number and then append it to the buffer. If no input is provided the :default value will be used.
To prompt for multiline input use multiline: true, it will prompt for the next line untill you input two empty lines in a row.
Use newline: true to append an empty line after the input.
To read a file there is a read_file method:
body do
append(read_file('Gemfile'))
endThe above config will append your Gemfile content to the buffer
To conditionally finish the editing and create a PR use finish:
body do
ask_yn 'are you a duck? (Y/N)', confirm: -> { append 'quack' }, decline: -> { finish }
endIf you want to finish editing and cancel the PR creating you should use interrupt instead
Title
For PR title you can use the same block formatting as for the body:
title do
story_number = "[#{current_branch}]"
append story_number
append ' my aweasome PR: '
append commits.last
endOr simply do:
title 'My static PR title'The first argument will be the initial title before editing, so:
title 'Story#' do
append 1337
endWill create a title 'Story#1337'
Assignee
To assign someone to a PR use assignee or self_assign options:
assignee '@JohnDoe'
# or to assign yourself:
self_assignBase branch
If you want to change the default base branch use base option:
base 'develop'Draft PRs
To create draft PR use draft option:
draft
# or
draft trueLabels
To add PR labels use labels or label options:
labels ['bug', 'duplicate'] # to add as an array
label 'documentation' # to add a single labelThe above code will add bug, duplicate and documentation labels to the PR
Reviewers
To add reviewers use reviewers or reviewer options:
reviewers ['@JohnDoe', '@BoJackHorseman'] # to add as an array
reviewer '@FooBar' # to add a single reviewerThe above code will add @JohnDoe, @BoJackHorseman and @FooBar as the reviewers to the PR
Works with teams as well:
reviewer 'my_organisation/code_revievers'Disabling maintainer edit
To disable/reenable edits from maintainer use maintainer_edit or no_maintainer_edit options:
maintainer_edit false
no_maintainer_edit # the same as aboveFinally, create a PR!
Simply call purr and it will create a PR for you via GitHub CLI according to your configuration file. Note that you may need to log in first with gh auth login.
Scripting is the key
The inline edits is pretty simple, but pretty useless as well, so don't forget that you can use any ruby code here to format your buffer. A nice example:
title 'Story: ' do
story_number = current_branch.gsub('/').first # e.g. '1337/do-something'
append story_number
append space
if commits.count == 1
append commits.last
else
append(ask 'Title: ', default: commits.last)
end
end
body do
story_number = current_branch.gsub('/').first
use_template
# Story number
replace '<STORY NUMBER>', with: story_number
# PR Title and details
if commits.count == 1
story_title = details = commits.last
else
story_title = ask 'Title: ', default: commits.last
details = ask 'Details: ', default: commits.last
end
replace 'Story Title', with: story_title
replace 'Details go here', with: details
# check the PR type checkboxes
case argv.first
when '--feature'
replace '- [ ] New feature', with: '- [x] New feature'
when '--bugfix'
replace '- [ ] Bug fix', with: '- [x] Bug fix'
when '--docs'
replace '- [ ] Documentation', with: '- [x] Documentation'
end
editor # to ensure and fix something
end
draft if argv.include?('--draft')
self_assign
reviewer '@MyFellowReviewer'
label 'bug' if argv.first == '--bugfix'Development
After checking out the repo, run bin/setup to install dependencies. Then, run rspec to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run rake install. To release a new version, update the version number in version.rb, and then run rake release, which will create a git tag for the version, push git commits and the created tag, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ARtoriouSs/purr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.
The gem is available as open source under the terms of the MIT License.
Code of Conduct
Everyone interacting in the Purr project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.