The best way to explain what is Badging is by example.
Very often, OSS developers keep track of different metrics via so called "badges" - status images at the top of a repo Readme. There are many services that provide repository status as a badge: Travis CI, Code Climate, and many more.
However, sometimes the metric you want to display on a badge is something that external services do not provide.
For example, let's imagine a situation when you are in the process of a migration from MiniTest to RSpec or vice versa. If your code base is large, it will take considerable amount of time and it's desirable to track progress of this migration.
One way to do it is to leverage the excellent shields.io.
You just add something like ![RSpecing](https://img.shields.io/badge/RSpecing_Progress-83%-yellow.svg)
.
It will be displayed as .
There is a problem with this approach.
The progress changes over time, so each time you convert a Minitest file to RSpec, you need to remember to update the URL in the Readme. This is not too convenient.
Badging is a small service which solves this problem by keeping badge metadata (subject, status, color) in its own database and using this metadata to obtain and cache badge SVG.
# CREATE BADGE
$ export WRITE_TOKEN=wz94aoKA32QMdg6JeC
$ export BADGING_URL=https://<your badging host>
$ curl -H 'Content-Type: application/json' \
-X POST \
$BADGING_URL/badges \
--data '{"token": "'$WRITE_TOKEN'", "badge": {"subject": "RSpecing Progress", "status": "83%", "identifier": "rspecing", "color": "yellow"}}'
# GET BADGE
$ export READ_TOKEN=wz94aoKA32QMdg6
$ curl $BADGING_URL/badges/rspecing.svg?token=$READ_TOKEN
<svg xmlns="http://www.w3.org/2000/svg" width="148" height="20"><linear...
# UPDATE BADGE
$ curl -H 'Content-Type: application/json' \
--user user:$WRITE_TOKEN \
-X PATCH \
$BADGING_URL/badges/rspecing \
--data '{"token": "'$WRITE_TOKEN'", "badge": {"subject": "RSpecing Progress", "status": "95%", "identifier": "rspecing", "color": "green"}}'
Going back to our example, here is how you could add the badge showing RSpec migration progress which updates automatically as code evolves:
- Deploy Badging to Heroku or any other suitable hosting.
- Configure randomly generated
READ_TOKEN
andWRITE_TOKEN
. - Create a badge via curl request or directly via DB insert.
- Add
![](<BADGING_URL>/badge/<identifier of created badge>.svg?token=<READ_TOKEN>)
to your repo Readme. - Create a script which would send a PATCH request to your Badging server
each time a pull request is merged to your integration branch. You can call
it from your CI server after each green build, for example. In our case,
this script could just count the number of
_rspec.rb
and_test.rb
files and figure out the progress based on that.
- Elixir
- PostgreSQL
mix deps.get
mix test
mix deps.get
mix ecto.create && mix ecto.migrate
mix phx.server
Local read/write passwords are in config/dev.exs
.
# Assuming you already created a new Heroku app and cd'ed to the project directory
heroku create --buildpack "https://github.com/HashNuke/heroku-buildpack-elixir.git"
heroku config:set POOL_SIZE=18 \
READ_TOKEN=<randomly generated string> \
WRITE_TOKEN=<any other random string> \
HOST=<your badging host> \
SECRET_KEY_BASE=`mix phoenix.gen.secret`
git push heroku master
By default, requests from all origins are allowed. If you want to whitelist the
allowed domains, set CORS_ALLOWED_ORIGIN
instance variable. For example:
heroku config:set CORS_ALLOWED_ORIGIN=https://github.com