Sha256: 36023e881dec6b6f990c0cbac8619ed3ed1c02010965c55ced9c46655a838a0e

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 KB

Contents

module ProductSpy
  class Host
    class Parser
      def initialize(regexp, pk_keys)
        @regexp = regexp
        @pk_keys = pk_keys
      end

      def get_pk(url)
        if m = @regexp.match(url)
          return @pk_keys.map do |i|
            m[i]
          end
        else
          return nil
        end
      end
    end

    class Builder
      def initialize(pattern, &block)
        @pattern = pattern
        @block   = block
      end

      def get_url(pk)
        if @block.respond_to?(:call)
          @block.call(pk)
        else
          @pattern.gsub /:(\d+)/ do |i|
            pk[i[1..-1].to_i-1]
          end
        end
      end
    end

    attr_reader :host_name

    def initialize(host_name)
      @host_name = host_name
      @parser = []
      @builder = {}
    end

    def parse(regex, pk_keys)
      @parser << Parser.new(regex, pk_keys)
    end

    def build(type, pattern = nil, &block)
      raise "No pattern and no block given" if pattern.nil? and not block_given?
      @builder[type.to_sym] = Builder.new(pattern, &block)
    end

    def make_url(pk, options)
      builder = @builder[options[:type].to_sym]
      builder.get_url(pk)
    end

    def make_pk(url)
      @parser.each do |parser|
        result = parser.get_pk(url)
        return result unless result.nil?
      end
      return nil
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
product_spy-0.0.6 lib/product_spy/host.rb
product_spy-0.0.5 lib/product_spy/host.rb