wayback 0.1.0
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.
- data/.yardopts +10 -0
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +52 -0
- data/LICENSE.md +20 -0
- data/README.md +81 -0
- data/Rakefile +11 -0
- data/lib/wayback.rb +32 -0
- data/lib/wayback/api/archive.rb +42 -0
- data/lib/wayback/api/utils.rb +27 -0
- data/lib/wayback/archive.rb +15 -0
- data/lib/wayback/base.rb +127 -0
- data/lib/wayback/client.rb +62 -0
- data/lib/wayback/configurable.rb +48 -0
- data/lib/wayback/default.rb +68 -0
- data/lib/wayback/error.rb +31 -0
- data/lib/wayback/error/already_favorited.rb +10 -0
- data/lib/wayback/error/already_retweeted.rb +10 -0
- data/lib/wayback/error/bad_gateway.rb +11 -0
- data/lib/wayback/error/bad_request.rb +10 -0
- data/lib/wayback/error/client_error.rb +28 -0
- data/lib/wayback/error/configuration_error.rb +8 -0
- data/lib/wayback/error/decode_error.rb +9 -0
- data/lib/wayback/error/forbidden.rb +10 -0
- data/lib/wayback/error/gateway_timeout.rb +11 -0
- data/lib/wayback/error/identity_map_key_error.rb +9 -0
- data/lib/wayback/error/internal_server_error.rb +11 -0
- data/lib/wayback/error/not_acceptable.rb +10 -0
- data/lib/wayback/error/not_found.rb +10 -0
- data/lib/wayback/error/server_error.rb +28 -0
- data/lib/wayback/error/service_unavailable.rb +11 -0
- data/lib/wayback/error/too_many_requests.rb +12 -0
- data/lib/wayback/error/unauthorized.rb +10 -0
- data/lib/wayback/error/unprocessable_entity.rb +10 -0
- data/lib/wayback/factory.rb +21 -0
- data/lib/wayback/identity.rb +50 -0
- data/lib/wayback/identity_map.rb +22 -0
- data/lib/wayback/page.rb +18 -0
- data/lib/wayback/response/parse_memento.rb +61 -0
- data/lib/wayback/response/parse_memento_page.rb +23 -0
- data/lib/wayback/response/raise_error.rb +31 -0
- data/lib/wayback/version.rb +18 -0
- data/spec/fixtures/list.timemap +9 -0
- data/spec/fixtures/page.html +225 -0
- data/spec/helper.rb +65 -0
- data/spec/wayback/api/archive_spec.rb +73 -0
- data/spec/wayback/archive_spec.rb +23 -0
- data/spec/wayback/base_spec.rb +117 -0
- data/spec/wayback/client_spec.rb +114 -0
- data/spec/wayback/error/client_error_spec.rb +23 -0
- data/spec/wayback/error/server_error_spec.rb +20 -0
- data/spec/wayback/error_spec.rb +20 -0
- data/spec/wayback/identifiable_spec.rb +50 -0
- data/spec/wayback/page_spec.rb +36 -0
- data/spec/wayback_spec.rb +47 -0
- data/wayback.gemspec +26 -0
- metadata +175 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module Wayback
|
2
|
+
|
3
|
+
# Tracks objects to help ensure that each object gets loaded only once.
|
4
|
+
# See: http://www.martinfowler.com/eaaCatalog/identityMap.html
|
5
|
+
class IdentityMap < Hash
|
6
|
+
|
7
|
+
# @param id
|
8
|
+
# @return [Object]
|
9
|
+
def fetch(id)
|
10
|
+
self[id]
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param id
|
14
|
+
# @param object
|
15
|
+
# @return [Object]
|
16
|
+
def store(id, object)
|
17
|
+
self[id] = object
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/wayback/page.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'time'
|
3
|
+
|
4
|
+
module Wayback
|
5
|
+
module Response
|
6
|
+
class ParseMemento < Faraday::Response::Middleware
|
7
|
+
|
8
|
+
def parse(body, *opts)
|
9
|
+
case body
|
10
|
+
# Assume it starts with "<http"
|
11
|
+
when /^\<http/
|
12
|
+
body, info = body.gsub(/,(\s+)?\</, ",\n<").gsub(/\s(\s+)/, ' ').split("\n"), {:id => nil, :dates => {}, :first_date => nil, :last_date => nil}
|
13
|
+
|
14
|
+
body.each do |s|
|
15
|
+
attrs, uri = s.split('; '), s.gsub(/^(\<)([A-Z0-9\-\/\:\.\?\=\&]+)(\>)(.*)$/i, '\2')
|
16
|
+
rels, datetime, date, from, til = [], nil, nil, nil, nil
|
17
|
+
|
18
|
+
attrs.each do |a|
|
19
|
+
k, v = a.gsub(/^([A-Z0-9\-]+)(=.*)$/i, '\1'), a.gsub(/^([A-Z0-9\-]+)(=(\'|\"))(.*)(\'|\")(,)?$/i, '\4')
|
20
|
+
case k
|
21
|
+
when 'datetime'
|
22
|
+
datetime, date = v, Time.parse(v).to_i
|
23
|
+
when 'rel'
|
24
|
+
rels = v.split(' ')
|
25
|
+
when 'from'
|
26
|
+
# Not handled by archive.org
|
27
|
+
when 'until'
|
28
|
+
# Not handled by archive.org
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if rels.include?('original')
|
33
|
+
info[:id] = uri
|
34
|
+
elsif rels.include?('memento')
|
35
|
+
info[:last_date] = date if rels.include?('last')
|
36
|
+
info[:first_date] = date if rels.include?('first')
|
37
|
+
info[:dates][date] = {:datetime => datetime, :uri => uri} unless date.nil?
|
38
|
+
elsif rels.include?('timebundle')
|
39
|
+
#
|
40
|
+
elsif rels.include?('timegate')
|
41
|
+
#
|
42
|
+
elsif rels.include?('timemap')
|
43
|
+
#
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
info
|
48
|
+
else
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def on_complete(env)
|
54
|
+
if respond_to?(:parse) && ((env[:response_headers] && env[:response_headers]['content-type']) || '').match(/^application\/link-format/i)
|
55
|
+
env[:body] = parse(env[:body]) unless [204, 301, 302, 304].include?(env[:status])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module Wayback
|
4
|
+
module Response
|
5
|
+
class ParseMementoPage < Faraday::Response::Middleware
|
6
|
+
|
7
|
+
def parse(body, *opts)
|
8
|
+
body
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_complete(env)
|
12
|
+
if respond_to?(:parse) && ((env[:response_headers] && env[:response_headers]['content-type']) || '').match(/^(text\/html|application\/octet-stream)/i)
|
13
|
+
unless [204, 301, 302, 304].include?(env[:status])
|
14
|
+
env[:body] = {:id => env[:url].to_s, :html => parse(env[:body])}
|
15
|
+
else
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'wayback/error/bad_gateway'
|
3
|
+
require 'wayback/error/bad_request'
|
4
|
+
require 'wayback/error/forbidden'
|
5
|
+
require 'wayback/error/gateway_timeout'
|
6
|
+
require 'wayback/error/internal_server_error'
|
7
|
+
require 'wayback/error/not_acceptable'
|
8
|
+
require 'wayback/error/not_found'
|
9
|
+
require 'wayback/error/service_unavailable'
|
10
|
+
require 'wayback/error/too_many_requests'
|
11
|
+
require 'wayback/error/unauthorized'
|
12
|
+
require 'wayback/error/unprocessable_entity'
|
13
|
+
|
14
|
+
module Wayback
|
15
|
+
module Response
|
16
|
+
class RaiseError < Faraday::Response::Middleware
|
17
|
+
|
18
|
+
def on_complete(env)
|
19
|
+
status_code = env[:status].to_i
|
20
|
+
error_class = @klass.errors[status_code]
|
21
|
+
raise error_class.from_response(env) if error_class
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(app, klass)
|
25
|
+
@klass = klass
|
26
|
+
super(app)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Wayback
|
2
|
+
class Version
|
3
|
+
MAJOR = 0 unless defined? Wayback::Version::MAJOR
|
4
|
+
MINOR = 1 unless defined? Wayback::Version::MINOR
|
5
|
+
PATCH = 0 unless defined? Wayback::Version::PATCH
|
6
|
+
PRE = nil unless defined? Wayback::Version::PRE
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
# @return [String]
|
11
|
+
def to_s
|
12
|
+
[MAJOR, MINOR, PATCH, PRE].compact.join('.')
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<http://api.wayback.archive.org/list/timebundle/http://gleu.ch>; rel="timebundle",
|
2
|
+
<http://gleu.ch>; rel="original",
|
3
|
+
<http://api.wayback.archive.org/list/timemap/link/http://gleu.ch>; rel="timemap"; type="application/link-format",
|
4
|
+
<http://api.wayback.archive.org/list/timegate/http://gleu.ch>; rel="timegate",
|
5
|
+
<http://api.wayback.archive.org/memento/20110417182251/http://gleu.ch/>; rel="first memento"; datetime="Sun, 17 Apr 2011 18:22:51 GMT",
|
6
|
+
<http://api.wayback.archive.org/memento/20120117073306/http://gleu.ch/>; rel="memento"; datetime="Tue, 17 Jan 2012 07:33:06 GMT",
|
7
|
+
<http://api.wayback.archive.org/memento/20130113125339/http://gleu.ch/>; rel="memento"; datetime="Sun, 13 Jan 2013 12:53:39 GMT",
|
8
|
+
<http://api.wayback.archive.org/memento/20130120084303/http://gleu.ch/>; rel="memento"; datetime="Sun, 20 Jan 2013 08:43:03 GMT",
|
9
|
+
<http://api.wayback.archive.org/memento/20130129170322/http://gleu.ch/>; rel="last memento"; datetime="Tue, 29 Jan 2013 17:03:22 GMT"
|
@@ -0,0 +1,225 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head><base href="http://gleu.ch/" />
|
4
|
+
<!--
|
5
|
+
All work is copyrighted 2012 by Greg Leuch and/or its respective owners.
|
6
|
+
All other non-copyrighted or non-licensed work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License <http://creativecommons.org/licenses/by-sa/3.0/us>.
|
7
|
+
Permissions beyond the scope of this license may be available at: http://gleu.ch/contact.
|
8
|
+
-->
|
9
|
+
|
10
|
+
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
|
11
|
+
|
12
|
+
<title>Greg Leuch: Creative + User Interaction</title>
|
13
|
+
|
14
|
+
<link rel="canonical" href="" />
|
15
|
+
<meta name="description" content="Greg Leuch is a user interface designer, interaction designer, visual designer, front-end web developer, and open-source artist."/>
|
16
|
+
<meta name="keywords" content="greg leuch, gleuch, halvfet, interface, interaction, visual, design, designer, user experience, art, programming, web, css, html, php, rails, javascript, code, general"/>
|
17
|
+
<meta name="author" content="Greg Leuch at http://gleu.ch/"/>
|
18
|
+
<meta name="robots" content="index, follow" />
|
19
|
+
<meta name="googlebot" content="index, follow"/>
|
20
|
+
<meta name="revisit-after" content="3 days" />
|
21
|
+
<meta name="distribution" content="global" />
|
22
|
+
|
23
|
+
|
24
|
+
<script type="text/javascript" src="/assets/js/jquery-1.8.3.min.js"></script>
|
25
|
+
<script type="text/javascript" src="/assets/js/site.js"></script>
|
26
|
+
|
27
|
+
<meta name="viewport" content="width=device-width; initial-scale=1.0" />
|
28
|
+
<link rel="stylesheet" href="/assets/css/site.css" media="all" />
|
29
|
+
|
30
|
+
|
31
|
+
<script type="text/javascript">var _gaq = _gaq || [];_gaq.push(['_setAccount', 'UA-2855868-25']);_gaq.push(['_trackPageview']);(function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();</script>
|
32
|
+
|
33
|
+
</head><body class="home">
|
34
|
+
<div id="template_wrapper" class="c">
|
35
|
+
<div id="content_area" class="rel c">
|
36
|
+
|
37
|
+
<article id="content">
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
<section class="intro">
|
42
|
+
<h1>Portfolio of Greg Leuch</h1>
|
43
|
+
<p class="large serif"> Design, web, technology, and art.</p>
|
44
|
+
</section>
|
45
|
+
|
46
|
+
<section class="featured_list">
|
47
|
+
<h3>Featured Work & Projects</h3>
|
48
|
+
|
49
|
+
<div class="first c">
|
50
|
+
<ul>
|
51
|
+
<li>
|
52
|
+
<dl>
|
53
|
+
<dd class="image">
|
54
|
+
<figure><a href="/projects/pop-block"><img src="/assets/projects/pop-block/feature.png" title="Pop Block" alt="" /></a></figure>
|
55
|
+
</dd>
|
56
|
+
<dt><a href="/projects/pop-block">Pop Block <ins class="new">New!</ins></a></dt>
|
57
|
+
<dd class="about">Manage your content bubble by controlling aspects of your online experience.</dd>
|
58
|
+
<dd>web application, browser extensions</dd>
|
59
|
+
</dl>
|
60
|
+
</li>
|
61
|
+
|
62
|
+
<li>
|
63
|
+
<dl>
|
64
|
+
<dd class="image">
|
65
|
+
<figure><a href="/projects/shaved-bieber"><img src="/assets/projects/shaved-bieber/feature.png" title="Shaved Bieber" alt="" /></a></figure>
|
66
|
+
</dd>
|
67
|
+
<dt><a href="/projects/shaved-bieber">Shaved Bieber</a></dt>
|
68
|
+
<dd class="about">An innovative tool to clean up the lower regions of web pages from unwanted Justin Bieber mentions.</dd>
|
69
|
+
<dd>project: browser extensions</dd>
|
70
|
+
</dl>
|
71
|
+
</li>
|
72
|
+
|
73
|
+
<!-- <li>
|
74
|
+
<dl>
|
75
|
+
<dd class="image">
|
76
|
+
<figure><a href="/work/heineken-fever-keeper"><img src="/assets/work/heineken-feverkeeper/feature.png" title="Heineken Fever Keeper" alt="" /></a></figure>
|
77
|
+
</dd>
|
78
|
+
<dt><a href="/work/heineken-fever-keeper">Heineken Fever Keeper</a></dt>
|
79
|
+
<dd class="about">Block the spoilers from tape-delayed UEFA soccer matches.</dd>
|
80
|
+
<dd>work: browser extensions</dd>
|
81
|
+
</dl>
|
82
|
+
</li> -->
|
83
|
+
|
84
|
+
<li>
|
85
|
+
<dl>
|
86
|
+
<dd class="image">
|
87
|
+
<figure><a href="/projects/greed"><img src="/assets/projects/greed/feature.png" title="G.R.E.E.D." alt="" /></a></figure>
|
88
|
+
</dd>
|
89
|
+
<dt><a href="/projects/greed">G.R.E.E.D.</a></dt>
|
90
|
+
<dd class="about">Greed powers our economy through restrictive licensing deals and claims of copyright.</dd>
|
91
|
+
<dd>project: browser extensions</dd>
|
92
|
+
</dl>
|
93
|
+
</li>
|
94
|
+
|
95
|
+
<li>
|
96
|
+
<dl>
|
97
|
+
<dd class="image">
|
98
|
+
<figure><a href="/work/know-your-meme"><img src="/assets/work/know-your-meme/feature.png" title="Know Your Meme" alt="" /></a></figure>
|
99
|
+
</dd>
|
100
|
+
<dt><a href="/work/know-your-meme">Know Your Meme</a></dt>
|
101
|
+
<dd class="about">Documenting Internet phenomena: viral videos, image macros, catchphrases, web celebs and more.</dd>
|
102
|
+
<dd>web application, design, branding</dd>
|
103
|
+
</dl>
|
104
|
+
</li>
|
105
|
+
|
106
|
+
<li>
|
107
|
+
<dl>
|
108
|
+
<dd class="image">
|
109
|
+
<figure><a href="/projects/ctrl-f-d"><img src="/assets/projects/ctrl-f-d/feature.png" title="Ctrl+F'd" alt="" /></a></figure>
|
110
|
+
</dd>
|
111
|
+
<dt><a href="/projects/ctrl-f-d">Ctrl+F'd</a></dt>
|
112
|
+
<dd class="about">Many people believe you cannot keyword search online documents. In other words, they are Ctrl+F'd. A playful experiment in "censoring" a web page by hiding text and images behind blocks.</dd>
|
113
|
+
<dd>bookmarklet</dd>
|
114
|
+
</dl>
|
115
|
+
</li>
|
116
|
+
|
117
|
+
</ul>
|
118
|
+
</div>
|
119
|
+
</section>
|
120
|
+
|
121
|
+
<hr />
|
122
|
+
|
123
|
+
<footer class="tc">
|
124
|
+
<p class="large link a b">View a list of all <a href="/work/all">client work</a> or <a href="/projects/all">projects</a>.</p>
|
125
|
+
</footer>
|
126
|
+
</article>
|
127
|
+
|
128
|
+
<aside id="sidebar">
|
129
|
+
|
130
|
+
|
131
|
+
<section class="box">
|
132
|
+
<h4>Who</h4>
|
133
|
+
<p>Maker of <a href="https://pop-block.com">Pop Block</a>, <a href="http://metafetch.com" target="_blank">Metafetch</a> and other products. <a href="http://fffff.at" target="_blank">F.A.T. Lab</a> virtual fellow. Previously at BuzzFeed, Know Your Meme, Rocketboom, and JESS3.</p>
|
134
|
+
</section>
|
135
|
+
|
136
|
+
<section class="box">
|
137
|
+
<h4>What</h4>
|
138
|
+
<p>Creative freelancer with a background in user experience design, interface design, interaction design, visual design, e-commerce, and web development.</p>
|
139
|
+
</section>
|
140
|
+
|
141
|
+
<section class="box">
|
142
|
+
<h4>Work Availablity</h4>
|
143
|
+
<p>Available for full-time or project-based design, development, and idea/strategy freelance work. <em>(Hurry, limited time offer!)</em></p>
|
144
|
+
</section>
|
145
|
+
|
146
|
+
<section id="newsletter_signup" class="box ">
|
147
|
+
<h4>Newsletter</h4>
|
148
|
+
|
149
|
+
<p>Sign up for updates and other announcements.</p>
|
150
|
+
|
151
|
+
<form action="/newsletter/signup.php" method="post">
|
152
|
+
<input type="hidden" name="auth" value="278693195410" />
|
153
|
+
<input type="hidden" name="referrer" value="/" />
|
154
|
+
<input type="text" name="email" value="" placeholder="Your email address..." />
|
155
|
+
<button><i class="icon newsletter button">Sign Up!</i></button>
|
156
|
+
</form>
|
157
|
+
</section>
|
158
|
+
|
159
|
+
<section class="box">
|
160
|
+
<h4>Online Activity</h4>
|
161
|
+
<ul>
|
162
|
+
<li><a class="grey dc" href="https://twitter.com/gleuch" title="Twitter" target="_blank">Twitter</a></li>
|
163
|
+
<li><a class="grey dc" href="https://github.com/gleuch" title="GitHub" target="_blank">GitHub</a></li>
|
164
|
+
<li><a class="grey dc" href="http://instagram.com/gleuch" title="Instagram" target="_blank">Instagram</a></li>
|
165
|
+
<li><a class="grey dc" href="http://www.linkedin.com/in/gleuch" title="LinkedIn" target="_blank">LinkedIn</a></li>
|
166
|
+
<li><a class="grey dc" href="https://www.facebook.com/gleuch" title="Facebook" target="_blank">Facebook</a></li>
|
167
|
+
</ul>
|
168
|
+
</section>
|
169
|
+
</aside>
|
170
|
+
|
171
|
+
</div>
|
172
|
+
|
173
|
+
<header id="header" class="c">
|
174
|
+
<h1 title="Greg Leuch"><a href="/"><i class="icon logo">Greg Leuch</i></a></h1>
|
175
|
+
<nav>
|
176
|
+
<ul class="c">
|
177
|
+
<li class=""><a href="/projects" title="Projects" class="">Projects</a></li>
|
178
|
+
<li class=""><a href="/work" title="Client Work" class=""><span class="mfull inline">Client</span> Work</a></li>
|
179
|
+
<li class=""><a href="/about" title="About" class="">About</a></li>
|
180
|
+
<li class=""><a href="/contact" title="Contact" class="">Contact</a></li>
|
181
|
+
<!-- <li class=""><a href="http://blog.gleu.ch" title="Blog" class="">Blog</a></li> -->
|
182
|
+
<li class="twitter"><a href="https://twitter.com/gleuch" target="_blank"><i class="icon twitter">Twitter: @gleuch</i></a></li>
|
183
|
+
<li class="facebook"><a href="https://facebook.com/gleuch" target="_blank"><i class="icon facebook">Facebook: Greg Leuch</i></a></li>
|
184
|
+
</ul>
|
185
|
+
</nav>
|
186
|
+
</header>
|
187
|
+
|
188
|
+
<footer id="footer" class="c">
|
189
|
+
<p>© 2003–2013 Greg Leuch, unless noted differently.</p>
|
190
|
+
</footer>
|
191
|
+
|
192
|
+
</div>
|
193
|
+
|
194
|
+
<div id="template_static_bar"></div>
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
<!--
|
204
|
+
FILE ARCHIVED ON 17:03:22 Jan 29, 2013 AND RETRIEVED FROM THE
|
205
|
+
INTERNET ARCHIVE ON 16:31:56 Mar 16, 2013.
|
206
|
+
JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE.
|
207
|
+
|
208
|
+
ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C.
|
209
|
+
SECTION 108(a)(3)).
|
210
|
+
-->
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
<script type="text/javascript">
|
220
|
+
var wmNotice = "Wayback - External links, forms, and search boxes may not function within this collection. Url: http://gleu.ch/ time: 17:03:22 Jan 29, 2013";
|
221
|
+
var wmHideNotice = "hide";
|
222
|
+
</script>
|
223
|
+
<script type="text/javascript" src="/static/js/disclaim.js"></script>
|
224
|
+
</body>
|
225
|
+
</html>
|
data/spec/helper.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
Coveralls.wear!
|
4
|
+
|
5
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
6
|
+
SimpleCov::Formatter::HTMLFormatter,
|
7
|
+
Coveralls::SimpleCov::Formatter
|
8
|
+
]
|
9
|
+
SimpleCov.start
|
10
|
+
|
11
|
+
require 'wayback'
|
12
|
+
require 'wayback/identity_map'
|
13
|
+
require 'rspec'
|
14
|
+
require 'stringio'
|
15
|
+
require 'tempfile'
|
16
|
+
require 'timecop'
|
17
|
+
require 'webmock/rspec'
|
18
|
+
|
19
|
+
WebMock.disable_net_connect!(:allow => 'coveralls.io')
|
20
|
+
|
21
|
+
RSpec.configure do |config|
|
22
|
+
config.expect_with :rspec do |c|
|
23
|
+
c.syntax = :expect
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def a_delete(path)
|
28
|
+
a_request(:delete, Wayback::Default::ENDPOINT + path)
|
29
|
+
end
|
30
|
+
|
31
|
+
def a_get(path)
|
32
|
+
a_request(:get, Wayback::Default::ENDPOINT + path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def a_post(path)
|
36
|
+
a_request(:post, Wayback::Default::ENDPOINT + path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def a_put(path)
|
40
|
+
a_request(:put, Wayback::Default::ENDPOINT + path)
|
41
|
+
end
|
42
|
+
|
43
|
+
def stub_delete(path)
|
44
|
+
stub_request(:delete, Wayback::Default::ENDPOINT + path)
|
45
|
+
end
|
46
|
+
|
47
|
+
def stub_get(path)
|
48
|
+
stub_request(:get, Wayback::Default::ENDPOINT + path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def stub_post(path)
|
52
|
+
stub_request(:post, Wayback::Default::ENDPOINT + path)
|
53
|
+
end
|
54
|
+
|
55
|
+
def stub_put(path)
|
56
|
+
stub_request(:put, Wayback::Default::ENDPOINT + path)
|
57
|
+
end
|
58
|
+
|
59
|
+
def fixture_path
|
60
|
+
File.expand_path("../fixtures", __FILE__)
|
61
|
+
end
|
62
|
+
|
63
|
+
def fixture(file)
|
64
|
+
File.new(fixture_path + '/' + file)
|
65
|
+
end
|