PigeonBand
This Ruby gem helps to format and validate racing pigeon bands (a.k.a. rings) from various countries.
Different countries use different schemes for band numbers. In Germany (my home country) the format is e.g. DV-06914-12-479. It starts with the country code DV (short for "Deutscher Verein"). Then comes the club number with a leading zero, minimum 01 and maximum 09999. Next is the year (last two digits) when the band was issued. Finally there is a running number of at most four digits, starting from 1.
In Belgium or the Netherlands, pigeons are given a 7-digit running number besides year and country designation. Thus, a valid band would be B-08-2148152.
Installation
Add this line to your application's Gemfile:
gem 'pigeon_band'
And then execute:
$ bundle
Or install it yourself as:
$ gem install pigeon_band
Usage
After loading the pigeon_band gem, there is a new object PigeonBand with one method #format. Given a band as a string, it returns a hash consisting of five fields.
Please note that the input is normalized before being scanned. Any '/' (slash), '.' (dot), '-' (dash) or ' ' (space) is converted to a '-' (dash). If the input does nor start with a letter a default of DV is added. Alternatively, a second argument can be added to calling #format.
- band
- The normalized band as it should be displayed
- coll
- The band formatted for easy collation (filled e.g. with leading spaces)
- year
- The (four-digit) year as extracted from the band
- code
- The (ISO3166-1) country code as extracted from the band
- error
- The error message if the band is invalid, otherwise nil
Given the above bands a input, a call to PigeonBand#format would return the following hashes:
PigeonBand.format("DV-06914-12-479")
{ band: "DV-06914-12-479", coll: "DV-06914-12-0479", year: 2012, code: "DE", error: nil }
PigeonBand.format("DV-099-09-850")
{ band: "DV-099-09-850", coll: "DV-00099-09-0850", year: 2009, code: "DE", error: nil }
PigeonBand.format("B-08-2148152")
{ band: "B-08-2148152", coll: "B-08-2148152", year: 2008, code: "BE", error: nil }
PigeonBand.format("8.2148152", "B")
{ band: "B-08-2148152", coll: "B-08-2148152", year: 2008, code: "BE", error: nil }
PigeonBand.format("1 1 1")
{ band: "DV-01-01-1", coll: "DV-00001-01-0001", year: 201, code: "DE", error: nil }
PigeonBand.format("")
{ band: nil, coll: nil, year: nil, code: nil, error: "input_missing" }
PigeonBand.format("XX-1")
{ band: nil, coll: nil, year: nil, code: nil, error: "country_unknown" }
Error messages
The following error messages are sent when the corresponding error is detected:
-
input_missing
- The input is blank or consists entirely of white space.
-
country_unknown
- The given country was not recognized.
- You can help improving this gem by contributing it :-)
- See below for details.
-
year_missing
- The year is missing for this country.
-
year_invalid
- The year is invalid (i.e. not a number).
-
year_range
- The given year is outside the valid range of 0 to 99.
-
club_below
- The given club (for countries with club numbers) is too low.
-
club_above
- The given club (for countries with club numbers) is too high.
-
sequ_below
- The given running number is too low.
-
sequ_above
- The given running number is too high.
Complete Rails example
TODO: show model, controller, view, route and locale data
Development
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.
To install this gem onto your local machine, run bundle exec rake install
. To release a new version, update the version number in version.rb
, and then run bundle exec rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/volkerwiegand/pigeon_band.
License
The gem is available as open source under the terms of the MIT License.