Sha256: 95326395e13a58902f751b0879c4b8910d2e69b8e913b178fce1fe7397fd2c92

Contents?: true

Size: 1.85 KB

Versions: 2

Compression:

Stored size: 1.85 KB

Contents

require 'ipaddr'
require 'addressable/uri'
require 'date'

module Jschematic
  module Attributes
    module Format
      def self.new(format)
        format_class = format.split(/[^\w\d]/).inject("") do |name, part|
          name << part.capitalize
        end

        const_get(format_class).new
      rescue NameError
        NullFormat.new(format)
      end

      class Uri
        include Jschematic::Element

        def accepts?(uri)
          Addressable::URI.parse(uri)
        rescue Addressable::URI::InvalidURIError
          false
        end
      end

      class IpAddress
        include Jschematic::Element

        def accepts?(addr)
          IPAddr.new(addr).ipv4?
        rescue ArgumentError
          false
        end
      end

      class Ipv6
        include Jschematic::Element

        def accepts?(addr)
          IPAddr.new(addr).ipv6?
        rescue ArgumentError
          false
        end
      end

      class Cidr
        include Jschematic::Element

        def accepts?(addr_with_cidr)
          addr, cidr = addr_with_cidr.split("/")
          return false unless cidr && (1..32).include?(cidr.to_i)
          IpAddress.new.accepts?(addr)
        end
      end

      class DateTime
        include Jschematic::Element

        def accepts?(date_time)
          ::DateTime.strptime(date_time)
        rescue ArgumentError
          false
        end
      end

      class Date
        include Jschematic::Element

        def accepts?(date)
          raise ArgumentError unless date =~ /^\d{4}-\d{2}-\d{2}$/
          ::Date.strptime(date)
        rescue ArgumentError
          false
        end
      end

      class NullFormat
        include Jschematic::Element
        attr_reader :format

        def initialize(format)
          @format = format
        end

        def accepts?(instance)
          true
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jschematic-0.1.0 lib/jschematic/attributes/format.rb
jschematic-0.0.9 lib/jschematic/attributes/format.rb