Class: LongURL::Expander

Inherits:
Object
  • Object
show all
Defined in:
lib/longurl/expander.rb

Overview

URL Expander class.

Will use Service and Direct classes to expand an url. Each call to external services is cached to save time and cache object is customizable. You can for example use MemCache for the cache. it will allow different instances of Expander and Service to share the same cache.

Examples

# Simple usage
e = LongURL::Expander.new
e.expand("http://tinyurl.com/1c2")                              # => "http://www.google.com"
e.expand("http://tinyurl.com/blnhsg")                           # => "http://www.google.com/search?q=number+of+horns+on+a+unicorn&ie=UTF-8"
e.expand("http://is.gd/iUKg")                                   # => "http://fabien.jakimowicz.com"

# not expandable urls
e.expand("http://www.linuxfr.org")                              # => "http://www.linuxfr.org"

# not expandable urls, calling longurl.org only
e.expand_with_service_only("http://www.linuxfr.org")            # => "http://www.linuxfr.org/pub"

# not expandable urls, direct resolution only
e.direct_resolution("http://www.linuxfr.org")                   # => "http://www.linuxfr.org/pub"

# MemCache as cache
e = LongURL::Expander.new(:cache => MemCache.new("localhost:11211", :namespace => "LongURL"))
e.expand("http://is.gd/iUKg")                                   # => "http://fabien.jakimowicz.com"

Exceptions

  • LongURL::InvalidURL : will occurs if given url is nil, empty or invalid

  • LongURL::NetworkError : a network (timeout, host could be reached, …) error occurs

  • LongURL::UnknownError : an unknown error occurs

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Expander

Initialize a new Expander.

Options

  • :cache: define a cache which Expander can use. It must implements [] and []= methods. It can be disabled using false.



39
40
41
42
43
44
45
46
47
48
49
# File 'lib/longurl/expander.rb', line 39

def initialize(options = {})
  # OPTIMIZE : This code is a complete duplicate of cache handling in service.
  if options[:cache].nil?
    @@cache = Hash.new
  elsif options[:cache] == false
    @@cache = nil
  else
    @@cache = options[:cache]
  end
  @@service = Service.new(:cache => @@cache)
end

Instance Method Details

#direct_resolution(url) ⇒ Object

Try to directly resolve url using LongURL::Direct to get final redirection. This call is cached.



60
61
62
63
64
65
66
67
# File 'lib/longurl/expander.rb', line 60

def direct_resolution(url)
  # OPTIMIZE : this code is almost identical as the one in service for handling service retrieval.
  if @@cache
    @@cache[url] ||= Direct.follow_redirections(url)
  else
    Direct.follow_redirections(url)
  end
end

#expand(url) ⇒ Object

Expand given url using LongURL::Service class first and then try a direct_resolution.



52
53
54
55
56
# File 'lib/longurl/expander.rb', line 52

def expand(url)
  @@service.query_supported_service_only url
rescue UnsupportedService
  direct_resolution url
end

#expand_each_in(text) ⇒ Object

Expand all url in the given string, if an error occurs while expanding url, then the original url is used



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/longurl/expander.rb', line 70

def expand_each_in(text)
  text.gsub(ShortURLMatchRegexp) do |shorturl| 
    begin
      expand shorturl
    rescue  LongURL::InvalidURL,
            LongURL::NetworkError,
            LongURL::TooManyRedirections,
            LongURL::UnknownError,
            JSON::ParserError
      shorturl
    end
  end
end

#expand_with_service_only(url) ⇒ Object

Expand given url using LongURL::Service only. If given url is not a expandable url, it will still be given to Service.



85
86
87
# File 'lib/longurl/expander.rb', line 85

def expand_with_service_only(url)
  @@service.query url
end