Sha256: 7ea59bd62902c3bea68104d70e56f6d7169e59582c914c9252d3c0d24f1408b1

Contents?: true

Size: 1.47 KB

Versions: 5

Compression:

Stored size: 1.47 KB

Contents

# frozen_string_literal: true

require "addressable/uri"
require "ipaddr"
require "public_suffix"

module Ukemi
  module Services
    class Service
      def name
        @name ||= self.class.to_s.split("::").last
      end

      def lookup(data)
        @data = data

        case type
        when "ip"
          lookup_by_ip data
        when "domain"
          lookup_by_domain data
        else
          raise ArgumentError, "#{data} is not a valid input."
        end
      end

      def configurated?
        config_keys.all? do |key|
          ENV.key? key
        end
      end

      class << self
        def inherited(child)
          Ukemi.services << child
        end
      end

      private

      def config_keys
        raise NotImplementedError, "You must implement #{self.class}##{__method__}"
      end

      def lookup_by_ip
        raise NotImplementedError, "You must implement #{self.class}##{__method__}"
      end

      def lookup_by_domain
        raise NotImplementedError, "You must implement #{self.class}##{__method__}"
      end

      def ip?
        IPAddr.new @data
        true
      rescue IPAddr::InvalidAddressError => _e
        false
      end

      def domain?
        uri = Addressable::URI.parse("http://#{@data}")
        uri.host == @data && PublicSuffix.valid?(uri.host)
      rescue Addressable::URI::InvalidURIError => _e
        false
      end

      def type
        return "ip" if ip?
        return "domain" if domain?
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
ukemi-0.4.1 lib/ukemi/services/service.rb
ukemi-0.4.0 lib/ukemi/services/service.rb
ukemi-0.3.0 lib/ukemi/services/service.rb
ukemi-0.2.0 lib/ukemi/services/service.rb
ukemi-0.1.0 lib/ukemi/services/service.rb