url_resolver 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 496aee1fd8a5be5325a8b5187ab7e0b2f05e1af2
4
+ data.tar.gz: b486d650731d7e02c03795c93e50b66a5c7ffb49
5
+ SHA512:
6
+ metadata.gz: 7b69fc06bb00ea31e93a010378d703717d58df98a98a587de3f2bcfaf59e85ec2dc6339bc17070a3b26f831255999dc43842c832c772684d9d6340afa98bcd6c
7
+ data.tar.gz: 685481e4f9a5917e5e8dc1841d04daca67f67c2e6bf4c1e4813e4732b46c1e70f2e912407ce82de2179b610cb00b3766da59b4cfee8c3a2abebe2aa24f3f4635
@@ -0,0 +1,15 @@
1
+ module UrlResolver
2
+ class Cache
3
+ def initialize(cache = nil)
4
+ @cache = cache
5
+
6
+ if cache.class.name == 'Redis'
7
+ extend CacheImplementations::RedisCache
8
+ elsif cache.class.name == 'NilClass'
9
+ extend CacheImplementations::NilClassCache
10
+ else
11
+ raise ArgumentError.new("Invalid cache class: #{cache.class}")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module UrlResolver
2
+ module CacheImplementations
3
+ module NilClassCache
4
+ def set_url(url, destination, ttl = 0)
5
+ nil
6
+ end
7
+
8
+ def get_url(url)
9
+ nil
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module UrlResolver
2
+ module CacheImplementations
3
+ module RedisCache
4
+ def set_url(url, destination, ttl = 86400)
5
+ @cache.setex(url, ttl, destination)
6
+ end
7
+
8
+ def get_url(url)
9
+ @cache.get(url)
10
+ end
11
+
12
+ def cache_key(url)
13
+ "url_resolver.urls.#{url}"
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ require_relative 'cache_implementations/nil_class.rb'
2
+ require_relative 'cache_implementations/redis.rb'
@@ -0,0 +1,25 @@
1
+ module UrlResolver
2
+ class Configuration
3
+ attr_accessor :cache_failures
4
+ attr_reader :cache, :url_cache
5
+
6
+ def initialize
7
+ @cache_failures = true
8
+ @cache = nil
9
+ @url_cache = Cache.new(@cache)
10
+ end
11
+
12
+ def cache=(cache)
13
+ @cache = cache
14
+ @url_cache = Cache.new(@cache)
15
+ end
16
+ end
17
+
18
+ def self.configuration
19
+ @configuration ||= Configuration.new
20
+ end
21
+
22
+ def self.configure
23
+ yield(configuration)
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ module UrlResolver
2
+ class UrlResolverError < StandardError; end
3
+ end
@@ -0,0 +1,35 @@
1
+ require 'rest-client'
2
+
3
+ module UrlResolver
4
+ class Resolver
5
+ def cache
6
+ UrlResolver.configuration.url_cache
7
+ end
8
+
9
+ def resolve(url)
10
+ url_to_check = URI.escape(url)
11
+ cached_url = cache.get_url(url_to_check)
12
+ return cached_url if cached_url
13
+
14
+ response = RestClient.head(url_to_check)
15
+ response.args[:url].tap do |final_url|
16
+ cache.set_url(url_to_check, final_url)
17
+ end
18
+ rescue SocketError,
19
+ Errno::ETIMEDOUT,
20
+ RestClient::InternalServerError,
21
+ RestClient::ServiceUnavailable,
22
+ RestClient::BadRequest,
23
+ RestClient::GatewayTimeout,
24
+ RestClient::RequestTimeout,
25
+ RestClient::ResourceNotFound,
26
+ RestClient::BadGateway,
27
+ RestClient::Forbidden
28
+
29
+ cache.set_url(url_to_check, url) if UrlResolver.configuration.cache_failures
30
+ url
31
+ rescue Exception => e
32
+ raise UrlResolverError.new("#{e.class.to_s}: #{url}")
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'url_resolver/cache.rb'
2
+ require_relative 'url_resolver/cache_implementations.rb'
3
+ require_relative 'url_resolver/configuration.rb'
4
+ require_relative 'url_resolver/errors.rb'
5
+ require_relative 'url_resolver/resolver.rb'
6
+
7
+ module UrlResolver
8
+ def self.resolve(url)
9
+ @@resolver ||= UrlResolver::Resolver.new
10
+ @@resolver.resolve(url)
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: url_resolver
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Amir Manji
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.6.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: 1.6.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 2.14.7
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 2.14.7
41
+ description: Simple gem to follow redirects to resolve the destination of a URL. Caches
42
+ results sometimes.
43
+ email: amanji75@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - lib/url_resolver/cache.rb
49
+ - lib/url_resolver/cache_implementations/nil_class.rb
50
+ - lib/url_resolver/cache_implementations/redis.rb
51
+ - lib/url_resolver/cache_implementations.rb
52
+ - lib/url_resolver/configuration.rb
53
+ - lib/url_resolver/errors.rb
54
+ - lib/url_resolver/resolver.rb
55
+ - lib/url_resolver.rb
56
+ homepage: http://www.github.com/amirmanji/url_resolver
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.0.3
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: Url Resolver!
80
+ test_files: []
81
+ has_rdoc: