class RoutingNumber

Constants

DefaultOptions
FORMAT
Stores

Public Class Methods

[](num)
Alias for: get
fetch_fresh_data!( fetch=true ) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 88
def fetch_fresh_data!( fetch=true )
        options[ :fetch_fed_data ] = fetch
        load_routing_numbers( get_raw_data )
end
find(num)
Alias for: get
get(num) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 61
def get(num)
        init!(options)
        if cnt = store.get(num.to_s)
                cnt
        else
                nil
        end
end
Also aliased as: [], find
init!(opts = {}) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 43
def init!(opts = {})
        return if @initted
        @options = options.merge(opts)
        if options[:store_in]
                store_in options[:store_in], options[:store_opts]
        end
        unless store.loaded?
                log.info "Loading routing numbers..."
                load_routing_numbers
                log.info "Done loading routing numbers."
        end
        @initted = true
end
options=(opts) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 57
def options=(opts)
        @options = options.merge(opts)
end
reconnect!() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 83
def reconnect!
        log.info "Reconnecting!"
        store.reconnect!
end
store_in(name, opts={}) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 72
def store_in(name, opts={})
        raise InvalidStore unless s_cls = Stores[name.to_sym]
        return if @store.is_a?(s_cls)
        @store.shutdown! if @store
        @store = s_cls.new(opts.merge(logger: log))
        @initted = false
        options[:store_in] = name.to_sym
        options[:store_opts] = opts
        init!
end

Private Class Methods

converted(name,val) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 170
def converted(name,val)
        if pretty_maps[name.to_s] and (v = pretty_maps[name.to_s][val])
                v
        else
                val
        end
end
default_store() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 99
def default_store
        Stores[:default].new(logger: log)
end
done_loading!() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 151
def done_loading!
        tm = Time.now - @st_time
        print "\r  #{@cur} loaded (#{tm.round(2)} seconds ~ #{tm > 0 ? (@cur / tm).round(0) : "?"}/sec) \n"
        @cur = @st_time = @pretty_maps = @metadata = nil
end
get_raw_data() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 107
def get_raw_data
        unless options[:fetch_fed_data]
                log.info "Using routing data from local file at: #{options[:routing_data_file]}"
                File.new(options[:routing_data_file])
        else
                log.info "Getting new bank routing data from: #{options[:routing_data_url]}"
                require 'typhoeus'
                Typhoeus::Request.get(options[:routing_data_url], :ssl_verifypeer => false).body
        end
end
load_routing_numbers(data=get_raw_data) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 118
def load_routing_numbers(data=get_raw_data)
        if store.loading!
                loading!
                data.each_line do |line|
                        process_line line
                end
                store.done_loading!
                done_loading!
        end
end
loading!() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 144
def loading!
        @cur = 0
        @st_time = Time.now
        @pretty_maps = Yajl::Parser.parse(IO.read(options[:mapping_file]))
        @metadata = Yajl::Parser.parse(IO.read(options[:metadata_file]))
end
log() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 184
def log
        @logger ||= Logger.new(STDOUT)
end
options() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 103
def options
        @options ||= DefaultOptions.dup
end
pretty_maps() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 140
def pretty_maps
        @pretty_maps
end
process_line(line) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 129
def process_line(line)
        obj = unpack_line(line)
        rt = obj.delete(:route)
        store.save rt, obj.merge(:routingnumber_id => rt.to_s).merge(@metadata[rt.to_s] || {})
        @cur += 1
        if @cur % 10 == 0
                tm = Time.now - @st_time
                print "\r  #{@cur} loaded (#{tm.round(2)} seconds ~ #{tm > 0 ? (@cur / tm).round(0) : "?"}/sec) "
        end
end
store() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 95
def store
        @store ||= default_store
end
unpack_line(line) click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 157
def unpack_line(line)
        vals = line.unpack(unpack_template)
        obj = {}
        FORMAT.each_with_index do |(name,length),i|
                val = vals[i]
                obj[name] = converted(name,val)
        end
        obj[:zip] = "#{obj.delete(:zip)}#{(ext = obj.delete(:zip_ext)) and ext.size > 0 ? "-#{ext}" : ""}"
        obj[:phone] = "#{obj.delete(:phone_area)}-#{obj.delete(:phone_prefix)}-#{obj.delete(:phone_suffix)}"
        obj.delete(:garbage)
        obj
end
unpack_template() click to toggle source
# File lib/bank_routing/routing_numbers.rb, line 178
def unpack_template
        @unpack_format ||= FORMAT.map do |(name,length)|
                "A#{length}"
        end.join
end