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'
And then execute:
bundle install
Or install it yourself as:
gem install purr
Dependencies
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_pr.rb file in the root of your git project. This file will describe your PRs.
Configuration
Now you can use purr_pr.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
end
Templates
First 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'
end
The 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] '
end
It 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'
end
The 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
end
The 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
end
Helpers
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 commits.last # => Latest commit
append current_branch # => Current git branch
end
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 :(' }
end
The 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)
end
It 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'))
end
The 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 }
end
If 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
end
Or simply do:
title 'My static PR title'
The first argument will be the initial title before editing, so:
title 'Story#' do
append 1337
end
Will create a title 'Story#1337'
Assignee
To assign someone to a PR use assignee or self_assign options:
assignee '@JohnDoe'
assignee '@me' # self-assign
self_assign # the same as above
Base 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 true
Labels
To add PR labels use labels or label options:
labels ['bug', 'duplicate'] # to add as an array
label 'documentation' # to add a single label
The 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 label
The above code will add @JohnDoe, @BoJackHorseman and @FooBar as the reviewers to the PR
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 above
Finally, 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.
To override any config values you can append them to purr as a gh pr create arguments, e.g. purr --body foo will create a PR with body 'foo' instead of the value from purr.rb.
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
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
replace 'Story Title', with: commits.last
replace 'Details go here', with: commits.last
else
story_title = ask 'Title: ', default: commits.last
details = ask 'Details: ', default: commits.last
replace 'Story Title', with: story_title
replace 'Details go here', with: details
end
# 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
self_assign
reviewer '@MyTeamLeadReviever'
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.
License
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.