class Domainator

Constants

VERSION

Attributes

extensions[R]

Public Class Methods

new(extensions = self.class.default_extensions) click to toggle source
# File lib/domainator.rb, line 10
def initialize(extensions = self.class.default_extensions)
  self.extensions = extensions
end

Private Class Methods

default_extensions() click to toggle source
# File lib/domainator.rb, line 57
def self.default_extensions
  @default_domains ||= begin
    file = File.join(File.dirname(__FILE__), 'extensions.txt')
    File.readlines(file).map(&:strip).delete_if(&:empty?).to_set
  end
end
parse(uri, extensions = default_extensions) click to toggle source
# File lib/domainator.rb, line 53
def self.parse(uri, extensions = default_extensions)
  new(extensions).parse(uri)
end

Public Instance Methods

parse(uri) click to toggle source
# File lib/domainator.rb, line 14
def parse(uri)
  uri = URI.parse(uri) if uri.is_a?(String)
  raise ArgumentError, '`uri` must be a String or URI' unless uri.is_a?(URI)
  raise ArgumentError, '`uri` must include a host' if uri.host.nil?

  domain = extract_domain(uri.host)
  raise NotFoundError, "no matching domain for \"#{uri}\"" if domain.nil?
  domain
end

Private Instance Methods

extensions=(extensions) click to toggle source
# File lib/domainator.rb, line 26
def extensions=(extensions)
  raise ArgumentError, '`extensions` must be Enumerable' unless extensions.is_a?(Enumerable)
  raise ArgumentError, '`extensions` must all start with "."' unless extensions.all? { |s| s.start_with?('.') }
  @extensions = extensions
end
extract_domain(host) click to toggle source
# File lib/domainator.rb, line 32
def extract_domain(host)
  parts = host.split('.')
  last_found_domain = nil

  parts.size.times.each do |n|
    offset = parts.size - n - 1
    lookup = '.' + parts[offset..-1].join('.')

    if extensions.include?(lookup)
      last_found_domain = lookup
    elsif last_found_domain
      last_found_domain = parts[offset] + last_found_domain
      break
    else
      break
    end
  end

  last_found_domain
end