Skip to content

Instantly share code, notes, and snippets.

@ramontayag
Created September 6, 2016 05:54
Show Gist options
  • Save ramontayag/7aac303b6b31183d5fa74cae0944f4f4 to your computer and use it in GitHub Desktop.
Save ramontayag/7aac303b6b31183d5fa74cae0944f4f4 to your computer and use it in GitHub Desktop.
class TrackingNumberGenerator
include Virtus.model
attribute :size, Integer
attribute :letters, String, lazy: true, default: :default_letters
attribute :numbers, String, lazy: true, default: :default_numbers
attribute :code, String, lazy: true, default: :default_code
DIGITS = %w(2 3 4 7 9)
CONSONANTS = %w(C F G H J K L M N R T V W X Z)
VOWELS = %w(A E U)
def self.call(size)
self.new(size: size).code
end
private
def default_letters
set = rand > 0.5
letters_size = (0.75 * size).floor
letters = ""
while letters.size < letters_size
set = !set
char = set ? CONSONANTS.sample : VOWELS.sample
letters << char
end
letters
end
def default_numbers
numbers_size = size - letters.size
numbers_size.times.map { DIGITS.sample }.join
end
def default_code
[default_letters, default_numbers].join
end
end
require 'rails_helper'
RSpec.describe TrackingNumberGenerator do
it "generates a tracking number that is easy for humans to read" do
expect(described_class.(5)).to be_present
expect(described_class.(5).size).to eq 5
expect(described_class.(10).size).to eq 10
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment