Class: FriendlyDigest

Inherits:
String
  • Object
show all
Defined in:
lib/friendly_digest.rb

Defined Under Namespace

Classes: InvalidInputException

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input, parity = false) ⇒ FriendlyDigest

Returns a new instance of FriendlyDigest.



28
29
30
31
32
33
34
35
36
37
# File 'lib/friendly_digest.rb', line 28

def initialize(input, parity=false)
  output = input == 0 ? [self.class.codes.first] : []
  while input > 0
    rem = input % self.class.codes.length
    input = (input - rem) / self.class.numcodes #/
    output << self.class.codes[rem]
  end
  output.reverse.each {|c| self << c }
  self << self.class.checksum(output) if parity
end

Class Method Details

.[](*p) ⇒ Object



5
# File 'lib/friendly_digest.rb', line 5

def [](*p) ; new(*p) ; end

.checksum(array) ⇒ Object



23
24
25
# File 'lib/friendly_digest.rb', line 23

def checksum(array)
  codes[array.inject(0) {|sum,c| (sum + codes.index(c)) % numcodes }]
end

.codesObject



7
8
9
# File 'lib/friendly_digest.rb', line 7

def codes
  @codes ||= ['Z','2','B','T','C','9','H','Q','V','K','N','W','7','P','4','J','Y','G','E','A','D','3','F','8','M','X','6','U','R']
end

.decode(input, parity = false) ⇒ Object



15
16
17
18
19
20
21
# File 'lib/friendly_digest.rb', line 15

def decode(input, parity=false)
  cleaned = input.strip.upcase.split('')
  raise InvalidInputException.new "Invalid character" if cleaned.any?(&:nil?)
  raise InvalidInputException.new "Invalid input" if parity && cleaned.pop!= checksum(cleaned)
  
  cleaned.map {|c| codes.index(c) }.inject(0) {|tot,c| (tot * numcodes) + c }
end

.numcodesObject



11
12
13
# File 'lib/friendly_digest.rb', line 11

def numcodes
  @numcodes ||= codes.length
end