wayback 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/CHANGELOG.md +4 -0
- data/README.md +13 -1
- data/lib/wayback.rb +1 -0
- data/lib/wayback/api/archive.rb +34 -0
- data/lib/wayback/availability.rb +13 -0
- data/lib/wayback/client.rb +17 -0
- data/lib/wayback/configurable.rb +3 -1
- data/lib/wayback/default.rb +13 -0
- data/lib/wayback/response/parse_availability.rb +30 -0
- data/lib/wayback/version.rb +1 -1
- data/spec/fixtures/available.json +1 -0
- data/spec/helper.rb +8 -0
- data/spec/wayback/api/archive_spec.rb +98 -9
- data/spec/wayback/client_spec.rb +20 -1
- data/wayback.gemspec +2 -1
- metadata +26 -15
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YTE4MGY4YmU2ODhjODEyYTI1YTdjNThjOGNmYjg4MDZhODhkMTBjYQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZTY2ZWM1ZDllZWFjNDBkOGVlM2Q3YTY5ODYyZGFmZGFmNTY5MjY0Yw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTVkYjk3OTVlZDE0ZDNjY2VmNzJjYjk2MGQ2N2NlZmQ3MmRhZWIzNzY3ZTRm
|
10
|
+
OWViNDFmNzVhMWY4YjUxYjJiMzRhN2U0YzIzNmM5YmY4ZDk4YjFiZTg3Mjk4
|
11
|
+
OGZlNWQ1YTViN2YyYzBjNTBlMWE3ZGEwMDkyNTg5ZjM2ZjViM2Q=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YTUzNTNkNTc0MTFkZDQ5NjY5NDlkNThiNmE5NDE0NDBjZDUxZWQ1MTc5NjJl
|
14
|
+
NzgyOTU1YmM1NWVjNWFjOWQ0YTMzMzdlMGUzOThhZmUzNWVlMDQ4ZDJjMmVj
|
15
|
+
OGVjNjZmMTBiYWRmNzZmMjcwYzUwYTgzNGJhYzZhODMxNWJlODk=
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -39,6 +39,8 @@ The current defaults configurations for this gem are:
|
|
39
39
|
Wayback.configure do |c|
|
40
40
|
c.endpoint = 'http://web.archive.org'
|
41
41
|
c.endpoint_path = '/web'
|
42
|
+
c.json_endpoint = 'http://archive.org'
|
43
|
+
c.json_endpoint_path = '/wayback'
|
42
44
|
c.connection_options = {
|
43
45
|
:headers => {:user_agent => "Wayback Ruby Gem #{Wayback::Version}"},
|
44
46
|
:request => {:open_timeout => 5, :timeout => 10},
|
@@ -54,6 +56,8 @@ Wayback.configure do |c|
|
|
54
56
|
builder.use Wayback::Response::RaiseError, Wayback::Error::ClientError
|
55
57
|
# Handle 5xx server responses
|
56
58
|
builder.use Wayback::Response::RaiseError, Wayback::Error::ServerError
|
59
|
+
# Parse closest available JSON result
|
60
|
+
builder.use Wayback::Response::ParseAvailablity
|
57
61
|
# Parse memento page
|
58
62
|
builder.use Wayback::Response::ParseMementoPage
|
59
63
|
# Parse link-format with custom memento parser
|
@@ -72,10 +76,18 @@ Wayback.configure do |c|
|
|
72
76
|
Wayback.list('http://www.xolator.com')
|
73
77
|
```
|
74
78
|
|
79
|
+
**Fetch closest known page to a specified date**
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
Wayback.available('http://www.xolator.com', 20130613055153)
|
83
|
+
Wayback.available('http://www.xolator.com', :first)
|
84
|
+
Wayback.available('http://www.xolator.com', :last)
|
85
|
+
```
|
86
|
+
|
75
87
|
**Fetch a specific archived page**
|
76
88
|
|
77
89
|
```ruby
|
78
|
-
Wayback.page('http://www.xolator.com',
|
90
|
+
Wayback.page('http://www.xolator.com', 20130613055153)
|
79
91
|
Wayback.page('http://www.xolator.com', :first)
|
80
92
|
Wayback.page('http://www.xolator.com', :last)
|
81
93
|
```
|
data/lib/wayback.rb
CHANGED
data/lib/wayback/api/archive.rb
CHANGED
@@ -18,6 +18,40 @@ module Wayback
|
|
18
18
|
object_from_response(Wayback::Archive, :get, "/timemap/link/#{url}", options)
|
19
19
|
end
|
20
20
|
|
21
|
+
# Return a page's information from the closest known timestamp
|
22
|
+
#
|
23
|
+
# @return [Wayback::Archive]
|
24
|
+
# @param url [String] The page URI that of which was archived.
|
25
|
+
# @param date [String, Symbol, Date, DateTime, Time, Fixnum, Integer, Float] A date or symbol to describe which dated archive page. Symbols include :first and :last. Strings are converted to integer timestamps.
|
26
|
+
# @param options [Hash] A customizable set of options.
|
27
|
+
# @example Return the the closest timestamp information about a page.
|
28
|
+
# Wayback.available('http://gleu.ch')
|
29
|
+
def available(url, date=0, options={})
|
30
|
+
archive_date = case date.class.to_s
|
31
|
+
when 'Time'
|
32
|
+
date
|
33
|
+
when 'Date', 'DateTime'
|
34
|
+
date.to_time
|
35
|
+
when 'Symbol'
|
36
|
+
(date == :first ? 19690101000000 : Time.now)
|
37
|
+
when 'String'
|
38
|
+
Time.parse(date).strftime('%Y%m%d%H%M%S')
|
39
|
+
when 'Fixnum', 'Integer', 'Float'
|
40
|
+
# Epoch vs date string as number
|
41
|
+
(date.to_i <= Time.now.to_i ? Time.at(date.to_i) : Time.parse(date.to_i.to_s))
|
42
|
+
else
|
43
|
+
raise Wayback::Error::ClientError
|
44
|
+
end
|
45
|
+
|
46
|
+
# Format accordingly
|
47
|
+
archive_date = archive_date.strftime('%Y%m%d%H%M%S') if archive_date.class == Time
|
48
|
+
|
49
|
+
options[:url] = url
|
50
|
+
options[:timestamp] = archive_date
|
51
|
+
|
52
|
+
object_from_response(Wayback::Availability, :json_get, "/available", options)
|
53
|
+
end
|
54
|
+
|
21
55
|
# Returns the HTML contents of an archive page, fetched by date
|
22
56
|
#
|
23
57
|
# @raise [Wayback::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
data/lib/wayback/client.rb
CHANGED
@@ -42,6 +42,10 @@ module Wayback
|
|
42
42
|
request(:put, path, params)
|
43
43
|
end
|
44
44
|
|
45
|
+
# Perform an HTTP GET request from JSON API
|
46
|
+
def json_get(path, params={})
|
47
|
+
json_request(:get, path, params)
|
48
|
+
end
|
45
49
|
|
46
50
|
private
|
47
51
|
|
@@ -58,5 +62,18 @@ module Wayback
|
|
58
62
|
@connection ||= Faraday.new(@endpoint, @connection_options.merge(:builder => @middleware))
|
59
63
|
end
|
60
64
|
|
65
|
+
def json_request(method, path, params={}, signature_params=params)
|
66
|
+
json_connection.send(method.to_sym, path.insert(0, @json_endpoint_path), params).env
|
67
|
+
rescue Faraday::Error::ClientError
|
68
|
+
raise Wayback::Error::ClientError
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns a Faraday::Connection object
|
72
|
+
#
|
73
|
+
# @return [Faraday::Connection]
|
74
|
+
def json_connection
|
75
|
+
@json_connection ||= Faraday.new(@json_endpoint, @connection_options.merge(:builder => @middleware))
|
76
|
+
end
|
77
|
+
|
61
78
|
end
|
62
79
|
end
|
data/lib/wayback/configurable.rb
CHANGED
@@ -4,7 +4,7 @@ require 'wayback/error/configuration_error'
|
|
4
4
|
module Wayback
|
5
5
|
module Configurable
|
6
6
|
extend Forwardable
|
7
|
-
attr_accessor :endpoint, :endpoint_path, :connection_options, :identity_map, :middleware
|
7
|
+
attr_accessor :endpoint, :endpoint_path, :json_endpoint, :json_endpoint_path, :connection_options, :identity_map, :middleware
|
8
8
|
def_delegator :options, :hash
|
9
9
|
|
10
10
|
class << self
|
@@ -13,6 +13,8 @@ module Wayback
|
|
13
13
|
@keys ||= [
|
14
14
|
:endpoint,
|
15
15
|
:endpoint_path,
|
16
|
+
:json_endpoint,
|
17
|
+
:json_endpoint_path,
|
16
18
|
:connection_options,
|
17
19
|
:identity_map,
|
18
20
|
:middleware
|
data/lib/wayback/default.rb
CHANGED
@@ -4,6 +4,7 @@ require 'wayback/configurable'
|
|
4
4
|
require 'wayback/error/client_error'
|
5
5
|
require 'wayback/error/server_error'
|
6
6
|
require 'wayback/response/raise_error'
|
7
|
+
require 'wayback/response/parse_availability'
|
7
8
|
require 'wayback/response/parse_memento'
|
8
9
|
require 'wayback/response/parse_memento_page'
|
9
10
|
require 'wayback/version'
|
@@ -12,6 +13,8 @@ module Wayback
|
|
12
13
|
module Default
|
13
14
|
ENDPOINT = 'http://web.archive.org' unless defined? Wayback::Default::ENDPOINT
|
14
15
|
ENDPOINT_PATH = '/web' unless defined? Wayback::Default::ENDPOINT_PATH
|
16
|
+
JSON_ENDPOINT = 'http://archive.org' unless defined? Wayback::Default::JSON_ENDPOINT
|
17
|
+
JSON_ENDPOINT_PATH = '/wayback' unless defined? Wayback::Default::JSON_ENDPOINT_PATH
|
15
18
|
CONNECTION_OPTIONS = {
|
16
19
|
:headers => {:user_agent => "Wayback Ruby Gem #{Wayback::Version}"},
|
17
20
|
:request => {:open_timeout => 5, :timeout => 10},
|
@@ -27,6 +30,8 @@ module Wayback
|
|
27
30
|
builder.use Wayback::Response::RaiseError, Wayback::Error::ClientError
|
28
31
|
# Handle 5xx server responses
|
29
32
|
builder.use Wayback::Response::RaiseError, Wayback::Error::ServerError
|
33
|
+
# Parse closest available JSON result
|
34
|
+
builder.use Wayback::Response::ParseAvailablity
|
30
35
|
# Parse memento page
|
31
36
|
builder.use Wayback::Response::ParseMementoPage
|
32
37
|
# Parse link-format with custom memento parser
|
@@ -52,6 +57,14 @@ module Wayback
|
|
52
57
|
ENDPOINT_PATH
|
53
58
|
end
|
54
59
|
|
60
|
+
def json_endpoint
|
61
|
+
JSON_ENDPOINT
|
62
|
+
end
|
63
|
+
|
64
|
+
def json_endpoint_path
|
65
|
+
JSON_ENDPOINT_PATH
|
66
|
+
end
|
67
|
+
|
55
68
|
def connection_options
|
56
69
|
CONNECTION_OPTIONS
|
57
70
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Wayback
|
5
|
+
module Response
|
6
|
+
class ParseAvailablity < Faraday::Response::Middleware
|
7
|
+
|
8
|
+
def parse(body)
|
9
|
+
case body
|
10
|
+
when /^\{/
|
11
|
+
obj = JSON.parse(body, :symbolize_names => true)[:archived_snapshots][:closest] rescue nil
|
12
|
+
obj[:id] = obj[:timestamp] if obj && obj[:timestamp]
|
13
|
+
obj
|
14
|
+
else
|
15
|
+
nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_complete(env)
|
20
|
+
if respond_to?(:parse) && ((env[:response_headers] && env[:response_headers]['content-type']) || '').match(/^application\/javascript/i)
|
21
|
+
env[:body] = parse(env[:body]) unless unparsable_status_codes.include?(env[:status])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def unparsable_status_codes
|
26
|
+
[204, 301, 302, 304]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/wayback/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Wayback
|
2
2
|
class Version
|
3
3
|
MAJOR = 0 unless defined? Wayback::Version::MAJOR
|
4
|
-
MINOR =
|
4
|
+
MINOR = 3 unless defined? Wayback::Version::MINOR
|
5
5
|
PATCH = 1 unless defined? Wayback::Version::PATCH
|
6
6
|
PRE = nil unless defined? Wayback::Version::PRE
|
7
7
|
|
@@ -0,0 +1 @@
|
|
1
|
+
{"archived_snapshots":{"closest":{"available":true,"url":"http://web.archive.org/web/20050422173123/http://www.gleuch.com:80/","timestamp":"20050422173123","status":"200"}}}
|
data/spec/helper.rb
CHANGED
@@ -40,6 +40,10 @@ def a_put(path)
|
|
40
40
|
a_request(:put, Wayback::Default::ENDPOINT + Wayback::Default::ENDPOINT_PATH + path)
|
41
41
|
end
|
42
42
|
|
43
|
+
def a_json_get(path)
|
44
|
+
a_request(:get, Wayback::Default::JSON_ENDPOINT + Wayback::Default::JSON_ENDPOINT_PATH + path)
|
45
|
+
end
|
46
|
+
|
43
47
|
def stub_delete(path)
|
44
48
|
stub_request(:delete, Wayback::Default::ENDPOINT + Wayback::Default::ENDPOINT_PATH + path)
|
45
49
|
end
|
@@ -56,6 +60,10 @@ def stub_put(path)
|
|
56
60
|
stub_request(:put, Wayback::Default::ENDPOINT + Wayback::Default::ENDPOINT_PATH + path)
|
57
61
|
end
|
58
62
|
|
63
|
+
def stub_json_get(path)
|
64
|
+
stub_request(:get, Wayback::Default::JSON_ENDPOINT + Wayback::Default::JSON_ENDPOINT_PATH + path)
|
65
|
+
end
|
66
|
+
|
59
67
|
def fixture_path
|
60
68
|
File.expand_path("../fixtures", __FILE__)
|
61
69
|
end
|
@@ -12,10 +12,12 @@ describe Wayback::API::Archive do
|
|
12
12
|
before do
|
13
13
|
stub_get("/timemap/link/gleu.ch").to_return(:body => fixture("list.timemap"), :headers => {:content_type => "application/link-format"})
|
14
14
|
end
|
15
|
+
|
15
16
|
it "requests the correct resource" do
|
16
17
|
@client.list('gleu.ch')
|
17
18
|
expect(a_get("/timemap/link/gleu.ch")).to have_been_made
|
18
19
|
end
|
20
|
+
|
19
21
|
it "returns the link data" do
|
20
22
|
timemap = @client.list('gleu.ch')
|
21
23
|
expect(timemap).to be_a Wayback::Archive
|
@@ -25,9 +27,96 @@ describe Wayback::API::Archive do
|
|
25
27
|
end
|
26
28
|
end
|
27
29
|
|
30
|
+
describe "#available" do
|
31
|
+
before do
|
32
|
+
stub_json_get("/available?timestamp=19691231190000&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
33
|
+
@timenow = Time.now
|
34
|
+
end
|
35
|
+
|
36
|
+
it "requests the correct resource" do
|
37
|
+
@client.available('gleu.ch', 0)
|
38
|
+
expect(a_json_get("/available?timestamp=19691231190000&url=gleu.ch")).to have_been_made
|
39
|
+
end
|
40
|
+
it "returns the link data" do
|
41
|
+
closest = @client.available('gleu.ch')
|
42
|
+
expect(closest).to be_a Wayback::Availability
|
43
|
+
expect(closest.id).to eq ('20050422173123')
|
44
|
+
expect(closest.timestamp).to eq('20050422173123')
|
45
|
+
expect(closest.url).to eq('http://web.archive.org/web/20050422173123/http://www.gleuch.com:80/')
|
46
|
+
expect(closest.status).to eq('200')
|
47
|
+
expect(closest.available).to be_true
|
48
|
+
end
|
49
|
+
|
50
|
+
# it "returns the desired page on date" do
|
51
|
+
# stub_json_get("/available?timestamp=#{@timenow.to_i}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
52
|
+
# stub_json_get("/available?timestamp=#{@timenow.to_i}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
53
|
+
# closest = @client.available('gleu.ch', @timenow.to_i)
|
54
|
+
# expect(closest).to be_a Wayback::Availability
|
55
|
+
# expect(closest.id).to eq ('20050422173123')
|
56
|
+
# end
|
57
|
+
|
58
|
+
it "returns the first desired page" do
|
59
|
+
stub_json_get("/available?timestamp=0&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
60
|
+
closest = @client.available('gleu.ch', :first)
|
61
|
+
expect(closest).to be_a Wayback::Availability
|
62
|
+
expect(closest.id).to eq ('20050422173123')
|
63
|
+
end
|
64
|
+
|
65
|
+
it "returns the desired page for Time" do
|
66
|
+
stub_json_get("/available?timestamp=#{@timenow.strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
67
|
+
closest = @client.available('gleu.ch', @timenow)
|
68
|
+
expect(closest).to be_a Wayback::Availability
|
69
|
+
expect(closest.id).to eq ('20050422173123')
|
70
|
+
end
|
71
|
+
|
72
|
+
it "returns the desired page for Date" do
|
73
|
+
stub_json_get("/available?timestamp=#{Time.parse(Date.today.to_s).strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
74
|
+
closest = @client.available('gleu.ch', Date.today)
|
75
|
+
expect(closest).to be_a Wayback::Availability
|
76
|
+
expect(closest.id).to eq ('20050422173123')
|
77
|
+
end
|
78
|
+
|
79
|
+
it "returns the desired page for DateTime" do
|
80
|
+
stub_json_get("/available?timestamp=#{Time.parse(DateTime.new(2013,1,1).to_s).strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
81
|
+
closest = @client.available('gleu.ch', DateTime.new(2013,1,1))
|
82
|
+
expect(closest).to be_a Wayback::Availability
|
83
|
+
expect(closest.id).to eq ('20050422173123')
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns the desired page for String" do
|
87
|
+
stub_json_get("/available?timestamp=#{@timenow.strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
88
|
+
closest = @client.available('gleu.ch', @timenow.to_s)
|
89
|
+
expect(closest).to be_a Wayback::Availability
|
90
|
+
expect(closest.id).to eq ('20050422173123')
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns the desired page for Fixnum" do
|
94
|
+
stub_json_get("/available?timestamp=#{@timenow.strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
95
|
+
closest = @client.available('gleu.ch', @timenow.to_i)
|
96
|
+
expect(closest).to be_a Wayback::Availability
|
97
|
+
expect(closest.id).to eq ('20050422173123')
|
98
|
+
end
|
99
|
+
|
100
|
+
it "returns the desired page for Float" do
|
101
|
+
stub_json_get("/available?timestamp=#{@timenow.strftime('%Y%m%d%H%M%S')}&url=gleu.ch").to_return(:body => fixture("available.json"), :headers => {:content_type => "application/javascript"})
|
102
|
+
closest = @client.available('gleu.ch', @timenow.to_f)
|
103
|
+
expect(closest).to be_a Wayback::Availability
|
104
|
+
expect(closest.id).to eq ('20050422173123')
|
105
|
+
end
|
106
|
+
|
107
|
+
[[0], {:a => 'b'}, File].each do |t|
|
108
|
+
it "returns error for #{t.class}" do
|
109
|
+
expect{page = @client.available('gleu.ch', t)}.to raise_error(Wayback::Error::ClientError)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end
|
115
|
+
|
28
116
|
describe "#page" do
|
29
117
|
before do
|
30
118
|
stub_get("/20130129170322/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
119
|
+
@timenow = Time.now
|
31
120
|
end
|
32
121
|
|
33
122
|
it "requests the correct resource" do
|
@@ -52,7 +141,7 @@ describe Wayback::API::Archive do
|
|
52
141
|
end
|
53
142
|
|
54
143
|
it "returns the last desired page" do
|
55
|
-
stub_get("/#{
|
144
|
+
stub_get("/#{@timenow.strftime('%Y%m%d%H%M%S')}/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
56
145
|
|
57
146
|
page = @client.page('gleu.ch', :last)
|
58
147
|
expect(page).to be_a Wayback::Page
|
@@ -60,9 +149,9 @@ describe Wayback::API::Archive do
|
|
60
149
|
end
|
61
150
|
|
62
151
|
it "returns the desired page for Time" do
|
63
|
-
stub_get("/#{
|
152
|
+
stub_get("/#{@timenow.strftime('%Y%m%d%H%M%S')}/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
64
153
|
|
65
|
-
page = @client.page('gleu.ch',
|
154
|
+
page = @client.page('gleu.ch', @timenow)
|
66
155
|
expect(page).to be_a Wayback::Page
|
67
156
|
expect(page.html).to match(/^\<\!DOCTYPE html\>.*http\:\/\/gleu\.ch.*\<\/html\>/im)
|
68
157
|
end
|
@@ -84,23 +173,23 @@ describe Wayback::API::Archive do
|
|
84
173
|
end
|
85
174
|
|
86
175
|
it "returns the desired page for String" do
|
87
|
-
stub_get("/#{
|
176
|
+
stub_get("/#{@timenow.strftime('%Y%m%d%H%M%S')}/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
88
177
|
|
89
|
-
page = @client.page('gleu.ch',
|
178
|
+
page = @client.page('gleu.ch', @timenow.to_s)
|
90
179
|
expect(page).to be_a Wayback::Page
|
91
180
|
expect(page.html).to match(/^\<\!DOCTYPE html\>.*http\:\/\/gleu\.ch.*\<\/html\>/im)
|
92
181
|
end
|
93
182
|
|
94
183
|
it "returns the desired page for Fixnum" do
|
95
|
-
stub_get("/#{
|
96
|
-
page = @client.page('gleu.ch',
|
184
|
+
stub_get("/#{@timenow.strftime('%Y%m%d%H%M%S')}/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
185
|
+
page = @client.page('gleu.ch', @timenow.to_i)
|
97
186
|
expect(page).to be_a Wayback::Page
|
98
187
|
expect(page.html).to match(/^\<\!DOCTYPE html\>.*http\:\/\/gleu\.ch.*\<\/html\>/im)
|
99
188
|
end
|
100
189
|
|
101
190
|
it "returns the desired page for Float" do
|
102
|
-
stub_get("/#{
|
103
|
-
page = @client.page('gleu.ch',
|
191
|
+
stub_get("/#{@timenow.strftime('%Y%m%d%H%M%S')}/gleu.ch").to_return(:body => fixture("page.html"), :headers => {:content_type => "text/html"})
|
192
|
+
page = @client.page('gleu.ch', @timenow.to_f)
|
104
193
|
expect(page).to be_a Wayback::Page
|
105
194
|
expect(page.html).to match(/^\<\!DOCTYPE html\>.*http\:\/\/gleu\.ch.*\<\/html\>/im)
|
106
195
|
end
|
data/spec/wayback/client_spec.rb
CHANGED
@@ -34,6 +34,8 @@ describe Wayback::Client do
|
|
34
34
|
:connection_options => {:timeout => 10},
|
35
35
|
:endpoint => 'http://xolator.com/',
|
36
36
|
:endpoint_path => '',
|
37
|
+
:json_endpoint => 'http://api.xolator.com/',
|
38
|
+
:json_endpoint_path => '',
|
37
39
|
:middleware => Proc.new{},
|
38
40
|
:identity_map => ::Hash
|
39
41
|
}
|
@@ -107,9 +109,26 @@ describe Wayback::Client do
|
|
107
109
|
|
108
110
|
describe "#request" do
|
109
111
|
it "catches Faraday errors" do
|
110
|
-
subject.stub
|
112
|
+
subject.stub(:connection).and_raise(Faraday::Error::ClientError.new("Oops"))
|
111
113
|
expect{subject.send(:request, :get, "/path")}.to raise_error Wayback::Error::ClientError
|
112
114
|
end
|
113
115
|
end
|
114
116
|
|
117
|
+
describe "#json connection" do
|
118
|
+
it "looks like Faraday connection" do
|
119
|
+
expect(subject.send(:json_connection)).to respond_to(:run_request)
|
120
|
+
end
|
121
|
+
it "memoizes the connection" do
|
122
|
+
c1, c2 = subject.send(:json_connection), subject.send(:json_connection)
|
123
|
+
expect(c1.object_id).to eq c2.object_id
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#json_request" do
|
128
|
+
it "catches Faraday errors" do
|
129
|
+
subject.stub(:json_connection).and_raise(Faraday::Error::ClientError.new("Oops"))
|
130
|
+
expect{subject.send(:json_request, :get, "/path")}.to raise_error Wayback::Error::ClientError
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
115
134
|
end
|
data/wayback.gemspec
CHANGED
@@ -6,10 +6,11 @@ require 'wayback/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.add_dependency 'faraday', ['~> 0.8', '< 0.10']
|
8
8
|
spec.add_dependency 'faraday_middleware', ['~> 0.9', '< 0.10']
|
9
|
+
spec.add_dependency 'json', '~> 1.8'
|
9
10
|
spec.add_development_dependency 'bundler', '~> 1.0'
|
10
11
|
spec.authors = ["Greg Leuch"]
|
11
12
|
# spec.cert_chain = ['certs/gleuch.pem']
|
12
|
-
spec.description = %q{A Ruby interface to the Archive.org's Wayback Machine Memento
|
13
|
+
spec.description = %q{A Ruby interface to the Archive.org's Wayback Machine JSON and Memento APIs.}
|
13
14
|
spec.email = ['greg@xolator.com']
|
14
15
|
spec.files = %w(.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile wayback.gemspec)
|
15
16
|
spec.files += Dir.glob("lib/**/*.rb")
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wayback
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Greg Leuch
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-14 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: faraday
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -25,7 +23,6 @@ dependencies:
|
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
27
|
- - ~>
|
31
28
|
- !ruby/object:Gem::Version
|
@@ -36,7 +33,6 @@ dependencies:
|
|
36
33
|
- !ruby/object:Gem::Dependency
|
37
34
|
name: faraday_middleware
|
38
35
|
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
36
|
requirements:
|
41
37
|
- - ~>
|
42
38
|
- !ruby/object:Gem::Version
|
@@ -47,7 +43,6 @@ dependencies:
|
|
47
43
|
type: :runtime
|
48
44
|
prerelease: false
|
49
45
|
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
46
|
requirements:
|
52
47
|
- - ~>
|
53
48
|
- !ruby/object:Gem::Version
|
@@ -55,10 +50,23 @@ dependencies:
|
|
55
50
|
- - <
|
56
51
|
- !ruby/object:Gem::Version
|
57
52
|
version: '0.10'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: json
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ~>
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.8'
|
60
|
+
type: :runtime
|
61
|
+
prerelease: false
|
62
|
+
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ~>
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '1.8'
|
58
67
|
- !ruby/object:Gem::Dependency
|
59
68
|
name: bundler
|
60
69
|
requirement: !ruby/object:Gem::Requirement
|
61
|
-
none: false
|
62
70
|
requirements:
|
63
71
|
- - ~>
|
64
72
|
- !ruby/object:Gem::Version
|
@@ -66,12 +74,12 @@ dependencies:
|
|
66
74
|
type: :development
|
67
75
|
prerelease: false
|
68
76
|
version_requirements: !ruby/object:Gem::Requirement
|
69
|
-
none: false
|
70
77
|
requirements:
|
71
78
|
- - ~>
|
72
79
|
- !ruby/object:Gem::Version
|
73
80
|
version: '1.0'
|
74
|
-
description: A Ruby interface to the Archive.org's Wayback Machine Memento
|
81
|
+
description: A Ruby interface to the Archive.org's Wayback Machine JSON and Memento
|
82
|
+
APIs.
|
75
83
|
email:
|
76
84
|
- greg@xolator.com
|
77
85
|
executables: []
|
@@ -88,6 +96,7 @@ files:
|
|
88
96
|
- lib/wayback/api/archive.rb
|
89
97
|
- lib/wayback/api/utils.rb
|
90
98
|
- lib/wayback/archive.rb
|
99
|
+
- lib/wayback/availability.rb
|
91
100
|
- lib/wayback/base.rb
|
92
101
|
- lib/wayback/client.rb
|
93
102
|
- lib/wayback/configurable.rb
|
@@ -115,11 +124,13 @@ files:
|
|
115
124
|
- lib/wayback/identity.rb
|
116
125
|
- lib/wayback/identity_map.rb
|
117
126
|
- lib/wayback/page.rb
|
127
|
+
- lib/wayback/response/parse_availability.rb
|
118
128
|
- lib/wayback/response/parse_memento.rb
|
119
129
|
- lib/wayback/response/parse_memento_page.rb
|
120
130
|
- lib/wayback/response/raise_error.rb
|
121
131
|
- lib/wayback/version.rb
|
122
132
|
- lib/wayback.rb
|
133
|
+
- spec/fixtures/available.json
|
123
134
|
- spec/fixtures/list.timemap
|
124
135
|
- spec/fixtures/page.html
|
125
136
|
- spec/helper.rb
|
@@ -136,29 +147,29 @@ files:
|
|
136
147
|
homepage: http://github.com/XOlator/wayback_gem/
|
137
148
|
licenses:
|
138
149
|
- MIT
|
150
|
+
metadata: {}
|
139
151
|
post_install_message:
|
140
152
|
rdoc_options: []
|
141
153
|
require_paths:
|
142
154
|
- lib
|
143
155
|
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
-
none: false
|
145
156
|
requirements:
|
146
157
|
- - ! '>='
|
147
158
|
- !ruby/object:Gem::Version
|
148
159
|
version: '0'
|
149
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
161
|
requirements:
|
152
162
|
- - ! '>='
|
153
163
|
- !ruby/object:Gem::Version
|
154
164
|
version: 1.3.6
|
155
165
|
requirements: []
|
156
166
|
rubyforge_project:
|
157
|
-
rubygems_version: 1.
|
167
|
+
rubygems_version: 2.1.10
|
158
168
|
signing_key:
|
159
|
-
specification_version:
|
160
|
-
summary: A Ruby interface to the Archive.org's Wayback Machine Memento
|
169
|
+
specification_version: 4
|
170
|
+
summary: A Ruby interface to the Archive.org's Wayback Machine JSON and Memento APIs.
|
161
171
|
test_files:
|
172
|
+
- spec/fixtures/available.json
|
162
173
|
- spec/fixtures/list.timemap
|
163
174
|
- spec/fixtures/page.html
|
164
175
|
- spec/helper.rb
|