staticizer 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60dbe34b0e69038956585a2c25804422be99bf3e
4
- data.tar.gz: 539fb871a2cbbb99d81b5365f942f8a04c2232bf
3
+ metadata.gz: 7e22029f2f0736aeb3c0afa3ea89350ff230197d
4
+ data.tar.gz: e9989b561397f19d8ccb0dd01f70ab358fd7c8ec
5
5
  SHA512:
6
- metadata.gz: cbb0db4aa4864d060534f971a1c16d8d66d26967ae9bc04c7fe6d155339ba80b9c4fe00c30d11fef4c7a696e8f9a8441428b0fee9ae3d865671690257480141d
7
- data.tar.gz: 613cb6ac0a9109443f199fa294da8c0a0106b543555402738cabe3a996b12c033d27a8414c52f79f5daa92ecd3a0a9bb0c816bf3558638e712d64909147b1474
6
+ metadata.gz: 2025749d7cdfa4963fde14b5fdbe82a25779486db1c9aa597eecd73d1309336dbd8ed0a2b8a42c3388804546900fa6c6ee96ef8305813fd665730727eb5fcbd4
7
+ data.tar.gz: e64a229031fbf15b0b85f0547ea803f67549b237b4d668244c9cad6feee5e52b200b33c032d5784bfb65ab302bffb212ebc997f2c68343fbc570591187216fa3
data/README.md CHANGED
@@ -18,6 +18,20 @@ We wanted the site uploaded to S3 to respond to the *exact* same URLs (where pos
18
18
  the existing site. This way when the site goes down incoming links from Google search
19
19
  results etc. will still work.
20
20
 
21
+ ## TODO
22
+
23
+ * Abillity to specify AWS credentials via file or environment options
24
+ * Tests!
25
+ * Decide what to do with URLs with query strings. Currently they are crawled and uploaded to S3, but those keys cannot be accessed. ex http://squaremill.com/file?test=1 will be uploaded with the key file?test=1, but can only be accessed by encoding the ? like this %3Ftest=1
26
+ * Create a 404 file on S3
27
+ * Provide the option to rewrite absolute URLs to relative urls so that hosting can work on a different domain.
28
+ * Multithread the crawler
29
+ * Check for too many redirects
30
+ * Provide regex options for what urls are scraped
31
+ * Better handling of incorrect server mime types (ex. server returns text/plain for css instead of text/css)
32
+ * Provide more options for uploading (upload via scp, ftp, custom etc.). Split out save/uploading into an interface.
33
+ * Handle large files in a more memory efficient way by streaming uploads/downloads
34
+
21
35
  ## Installation
22
36
 
23
37
  Add this line to your application's Gemfile:
@@ -30,7 +44,7 @@ And then execute:
30
44
 
31
45
  Or install it yourself as:
32
46
 
33
- $ gem install s3static
47
+ $ gem install staticizer
34
48
 
35
49
  ## Command line usage
36
50
 
@@ -92,7 +106,7 @@ This will only crawl urls in the domain squaremill.com
92
106
  )
93
107
  s.crawl
94
108
 
95
- ## Cralwer Options
109
+ ## Crawler Options
96
110
 
97
111
  * :aws - Hash of connection options passed to aws/sdk gem
98
112
  * :filter_url - proc called to see if a discovered URL should be crawled, return nil to not crawl a url, return the url (can be modified) to crawl
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "tests"
6
+ t.test_files = FileList['tests/*_test.rb']
7
+ end
@@ -6,6 +6,9 @@ require 'logger'
6
6
 
7
7
  module Staticizer
8
8
  class Crawler
9
+ attr_reader :url_queue
10
+ attr_accessor :output_dir
11
+
9
12
  def initialize(initial_page, opts = {})
10
13
  if initial_page.nil?
11
14
  raise ArgumentError, "Initial page required"
@@ -14,7 +17,7 @@ module Staticizer
14
17
  @opts = opts.dup
15
18
  @url_queue = []
16
19
  @processed_urls = []
17
- @opts[:output_dir] ||= File.expand_path("crawl/")
20
+ @output_dir = @opts[:output_dir] || File.expand_path("crawl/")
18
21
  @log = @opts[:logger] || Logger.new(STDOUT)
19
22
  @log.level = @opts[:log_level] || Logger::INFO
20
23
 
@@ -32,6 +35,14 @@ module Staticizer
32
35
  add_url(initial_page)
33
36
  end
34
37
 
38
+ def log_level
39
+ @log.level
40
+ end
41
+
42
+ def log_level=(level)
43
+ @log.level = level
44
+ end
45
+
35
46
  def crawl
36
47
  @log.info("Starting crawl")
37
48
  while(@url_queue.length > 0)
@@ -59,7 +70,7 @@ module Staticizer
59
70
  end
60
71
 
61
72
  def extract_css_urls(css, base_uri)
62
- css.scan(/url\(([^)]+)\)/).map {|src| make_absolute(base_uri, src[0]) }
73
+ css.scan(/url\(['"]?(.+?)['"]?\)/).map {|src| make_absolute(base_uri, src[0]) }
63
74
  end
64
75
 
65
76
  def add_urls(urls, info = {})
@@ -69,7 +80,7 @@ module Staticizer
69
80
  def make_absolute(base_uri, href)
70
81
  URI::join(base_uri, href).to_s
71
82
  rescue StandardError => e
72
- @log.error "Could not make absolute #{base_uri} - #{href}"
83
+ @log.error "Could not make absolute '#{base_uri}' - '#{href}' - #{e}"
73
84
  end
74
85
 
75
86
  def add_url(url, info = {})
@@ -101,7 +112,7 @@ module Staticizer
101
112
  path_segments = path.scan(%r{[^/]*/})
102
113
  filename = path.include?("/") ? path[path.rindex("/")+1..-1] : path
103
114
 
104
- current = @opts[:output_dir]
115
+ current = @output_dir
105
116
  FileUtils.mkdir_p(current) unless File.exist?(current)
106
117
 
107
118
  # Create all the directories necessary for this file
@@ -175,7 +186,7 @@ module Staticizer
175
186
  # TODO: for AWS S3 hosting we could instead create a redirect?
176
187
  def process_redirect(url, destination_url)
177
188
  body = "<html><head><META http-equiv='refresh' content='0;URL=\"#{destination_url}\"'></head><body>You are being redirected to <a href='#{destination_url}'>#{destination_url}</a>.</body></html>"
178
- save_page_to_aws(body, url)
189
+ save_page(body, url)
179
190
  end
180
191
 
181
192
  # Fetch a URI and save it to disk
@@ -1,3 +1,3 @@
1
1
  module Staticizer
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/staticizer.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "webmock"
23
24
 
24
25
  spec.add_runtime_dependency 'nokogiri'
25
26
  spec.add_runtime_dependency 'aws-sdk'
@@ -1,15 +1,80 @@
1
1
  require 'minitest/autorun'
2
+ require 'ostruct'
2
3
 
3
- # TODO!
4
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
5
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
6
+
7
+ require 'staticizer'
4
8
 
5
9
  class TestFilePaths < MiniTest::Unit::TestCase
6
- tests = {
7
- "" => "index.html"
8
- "/" => "index.html"
9
- "/asdfdf/dfdf" => "/asdfdf/dfdf"
10
- "/asdfdf/dfdf/" => "/asdfdf/dfdf" and "/asdfdf/dfdf/index.html"
11
- "/asdfad/asdffd.test" => "/asdfad/asdffd.test"
12
- "/?asdfsd=12312" => "/?asdfsd=12312"
13
- "/asdfad/asdffd.test?123=sdff" => "/asdfad/asdffd.test?123=sdff"
14
- }
10
+ def setup
11
+ @crawler = Staticizer::Crawler.new("http://test.com")
12
+ @crawler.log_level = Logger::FATAL
13
+ @fake_page = File.read(File.expand_path(File.dirname(__FILE__) + "/fake_page.html"))
14
+ end
15
+
16
+ def test_save_page_to_disk
17
+ fake_response = OpenStruct.new(:read_body => "test", :body => "test")
18
+ file_paths = {
19
+ "http://test.com" => "index.html",
20
+ "http://test.com/" => "index.html",
21
+ "http://test.com/asdfdf/dfdf" => "/asdfdf/dfdf",
22
+ "http://test.com/asdfdf/dfdf/" => ["/asdfdf/dfdf","/asdfdf/dfdf/index.html"],
23
+ "http://test.com/asdfad/asdffd.test" => "/asdfad/asdffd.test",
24
+ "http://test.com/?asdfsd=12312" => "/?asdfsd=12312",
25
+ "http://test.com/asdfad/asdffd.test?123=sdff" => "/asdfad/asdffd.test?123=sdff",
26
+ }
27
+
28
+ # TODO: Stub out file system using https://github.com/defunkt/fakefs?
29
+ outputdir = "/tmp/staticizer_crawl_test"
30
+ FileUtils.rm_rf(outputdir)
31
+ @crawler.output_dir = outputdir
32
+
33
+ file_paths.each do |k,v|
34
+ @crawler.save_page_to_disk(fake_response, URI.parse(k))
35
+ [v].flatten.each do |file|
36
+ expected = File.expand_path(outputdir + "/#{file}")
37
+ assert File.exists?(expected), "File #{expected} not created for url #{k}"
38
+ end
39
+ end
40
+ end
41
+
42
+ def test_save_page_to_aws
43
+ end
44
+
45
+ def test_add_url_with_valid_domains
46
+ test_url = "http://test.com/test"
47
+ @crawler.add_url(test_url)
48
+ assert(@crawler.url_queue[-1] == [test_url, {}], "URL #{test_url} not added to queue")
49
+ end
50
+
51
+ def test_add_url_with_filter
52
+ end
53
+
54
+ def test_initialize_options
55
+ end
56
+
57
+ def test_process_url
58
+ end
59
+
60
+ def test_make_absolute
61
+ end
62
+
63
+ def test_link_extraction
64
+ end
65
+
66
+ def test_href_extraction
67
+ end
68
+
69
+ def test_css_extraction
70
+ end
71
+
72
+ def test_css_url_extraction
73
+ end
74
+
75
+ def test_image_extraction
76
+ end
77
+
78
+ def test_script_extraction
79
+ end
15
80
  end
@@ -0,0 +1,288 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Web Application Design and Development &mdash; Square Mill Labs</title>
5
+ <meta content="authenticity_token" name="csrf-param" />
6
+ <meta content="LshjtNLXmjVY9NINXYQds+2Ur+jxUtqKVjjbDbVl+9w=" name="csrf-token" />
7
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
10
+ <meta property="og:type" content="website">
11
+ <meta property="og:url" content="http://squaremill.com/">
12
+ <meta property="og:image" content="">
13
+ <meta name="viewport" content="width=device-width, maximum-scale=1.0, initial-scale=1.0">
14
+ <meta name="description" content="Web Application Design and Development &mdash; Square Mill Labs">
15
+ <link rel="shortcut icon" type="image/png" href="http://squaremill.com/assets/icons/favicon-0fecbe6b20ff5bdf623357a3fac76b4b.png">
16
+ <link data-turbolinks-track="true" href="/assets/mn_application-5ddad96f16e03ad2137bf02270506e61.css" media="all" rel="stylesheet" />
17
+ <!--[if lt IE 9]>
18
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
19
+ <![endif]-->
20
+
21
+ <script type="text/javascript" src="//use.typekit.net/cjr4fwy.js"></script>
22
+ <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
23
+ </head>
24
+
25
+ <body id="public">
26
+ <script type="text/javascript">
27
+
28
+ var _gaq = _gaq || [];
29
+ _gaq.push(['_setAccount', 'UA-30460332-1']);
30
+ _gaq.push(['_setDomainName', 'squaremill.com']);
31
+ _gaq.push(['_trackPageview']);
32
+
33
+ (function() {
34
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
35
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
36
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
37
+ })();
38
+
39
+ </script>
40
+
41
+
42
+ <header id="header">
43
+ <nav class="nav container">
44
+ <a class="branding" href="http://squaremill.com/" rel="home" title="Square Mill - Digital Products for Web and Mobile">
45
+ <img alt="Square Mill Logo" class="logo" height="16" src="/assets/m2-wordmark-black-97525464acd136ce26b77e39c7ed2ba3.png" width="128" />
46
+ <p class="description">
47
+ Digital Products for Web and Mobile
48
+ </p>
49
+ </a> <a class="menu-trigger" href="#">Menu</a>
50
+ <div class="main-nav">
51
+ <ul class="container">
52
+ <li><a href="/projects">Projects</a></li>
53
+ <li><a href="/about">About Us</a></li>
54
+ <li><a href="/blog">Blog</a></li>
55
+
56
+ <!-- <li class="link-biography"><a href="http://squaremill.com/#biography">People</a></li> -->
57
+ </ul>
58
+ </div>
59
+
60
+ </nav>
61
+
62
+ </header>
63
+
64
+
65
+
66
+ <div id="site-content">
67
+
68
+
69
+
70
+
71
+ <div class="container" id="home-projects">
72
+ <section class="big-promo">
73
+ <div class="project" id="project-7">
74
+ <a href="/projects/bon-voyaging">
75
+ <div class="devices">
76
+ <div class="laptop device">
77
+ <img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
78
+ <div class="screenshot">
79
+ <img alt="" src="/uploads/project/desktop_image/7/bonvoyaging-desktop.jpg" />
80
+ </div>
81
+ </div>
82
+
83
+ <div class="handheld device">
84
+ <img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
85
+ <div class="screenshot">
86
+ <img alt="" src="/uploads/project/iphone_image/7/bonvoyagin-handheld.jpg" />
87
+ </div>
88
+ </div>
89
+ </div>
90
+
91
+ <div class="project-description">
92
+ <div class="summary">
93
+ <h2>Bon Voyaging <i class="icon-play-sign"></i></h2>
94
+ <p>Bon Voyaging enables discerning travelers to expertly envision their next voyage from inspiration to exploration. Powerful search tools and a interactive javascript interface make planning trips fun.</p>
95
+ </div>
96
+ </div>
97
+ </a>
98
+ </div>
99
+ </section>
100
+ <section class="big-promo">
101
+ <div class="project" id="project-1">
102
+ <a href="/projects/kpcb-fellows">
103
+ <div class="devices">
104
+ <div class="laptop device">
105
+ <img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
106
+ <div class="screenshot">
107
+ <img alt="" src="/uploads/project/desktop_image/1/kpcb-fellows-screenshot.jpg" />
108
+ </div>
109
+ </div>
110
+
111
+ <div class="handheld device">
112
+ <img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
113
+ <div class="screenshot">
114
+ <img alt="" src="/uploads/project/iphone_image/1/kpcb-fellows-iphone-screenshot.jpg" />
115
+ </div>
116
+ </div>
117
+ </div>
118
+
119
+ <div class="project-description">
120
+ <div class="summary">
121
+ <h2>KPCB Fellows Website and Brand <i class="icon-play-sign"></i></h2>
122
+ <p>The Fellows Program is a three-month work-based program that pairs top U.S. Engineering, Design and Product Design students with leading technology companies</p>
123
+ </div>
124
+ </div>
125
+ </a>
126
+ </div>
127
+ </section>
128
+ <section class="big-promo">
129
+ <div class="project" id="project-2">
130
+ <a href="/projects/thomson-reuters-messenger">
131
+ <div class="devices">
132
+ <div class="laptop device no-handheld">
133
+ <img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
134
+ <div class="screenshot">
135
+ <img alt="" src="/uploads/project/desktop_image/2/thomson-reuters-messenger-desktop.png" />
136
+ </div>
137
+ </div>
138
+
139
+ </div>
140
+
141
+ <div class="project-description">
142
+ <div class="summary">
143
+ <h2>Thomson Reuters Messenger <i class="icon-play-sign"></i></h2>
144
+ <p>Messenger is an html5 / javascript instant messenger application for financial professionals</p>
145
+ </div>
146
+ </div>
147
+ </a>
148
+ </div>
149
+ </section>
150
+ <section class="big-promo">
151
+ <div class="project" id="project-3">
152
+ <a href="/projects/kleiner-perkins-caufield-byers-digital-presence">
153
+ <div class="devices">
154
+ <div class="laptop device">
155
+ <img alt="" class="chrome" src="/assets/projects/macbook-pro-1be04a78f99b40e2c676d78fc24fcc3d.png" />
156
+ <div class="screenshot">
157
+ <img alt="" src="/uploads/project/desktop_image/3/kpcb-screenshot.jpg" />
158
+ </div>
159
+ </div>
160
+
161
+ <div class="handheld device">
162
+ <img alt="" class="chrome" src="/assets/projects/iphone5-c1ea3a16be931f1e80bacab5cfec932d.png" />
163
+ <div class="screenshot">
164
+ <img alt="" src="/uploads/project/iphone_image/3/kpcb-iphone-screenshot.jpg" />
165
+ </div>
166
+ </div>
167
+ </div>
168
+
169
+ <div class="project-description">
170
+ <div class="summary">
171
+ <h2>Kleiner Perkins Caufield &amp; Byers Digital Presence <i class="icon-play-sign"></i></h2>
172
+ <p>KPCB is a venture capital stalwart located in Silicon Valley with over 40 years of tech and science investment.</p>
173
+ </div>
174
+ </div>
175
+ </a>
176
+ </div>
177
+ </section>
178
+ </div>
179
+
180
+ <section class="clients full-width">
181
+ <div class="container">
182
+ <h2>Clients</h2>
183
+ <ul class="hlist">
184
+ <li><a href="http://kpcb.com" rel="friend" target="_blank" title="KPCB&#39;s Website"><img alt="KPCB" src="/uploads/client/image/1/home_logo_kpcb-logo.png" /></a></li>
185
+ <li><a href="http://thomsonreuters.com" rel="friend" target="_blank" title="Thomson Reuters&#39;s Website"><img alt="Thomson Reuters" src="/uploads/client/image/2/home_logo_thomsonreuters.png" /></a></li>
186
+ <li><a href="http://sumzero.com" rel="friend" target="_blank" title="SumZero&#39;s Website"><img alt="SumZero" src="/uploads/client/image/3/home_logo_sumzero.png" /></a></li>
187
+ <li><a href="http://marlboroughgallery.com" rel="friend" target="_blank" title="Marlborough Gallery&#39;s Website"><img alt="Marlborough Gallery" src="/uploads/client/image/4/home_logo_marlborough.png" /></a></li>
188
+ <li><a href="http://flurry.com" rel="friend" target="_blank" title="Flurry Analytics&#39;s Website"><img alt="Flurry Analytics" src="/uploads/client/image/8/home_logo_flurry.png" /></a></li>
189
+ </ul>
190
+ </div>
191
+ </section>
192
+
193
+ <section class="quote">
194
+ <blockquote>
195
+ <p>"Square Mill really took the time to understand our business and think strategically about how we want to engage and communicate with our entrepreneurs online. Together, their small team is responsive, nimble and efficient and has the deep design and technical chops to back it up."</p>
196
+ <small><a href="http://kpcb.com/partner/christina-lee" rel="friend" title="Christina Lee, Operating Partner at KPCB">Christina Lee</a>, <em>Operating Partner at KPCB</em></small>
197
+ </blockquote>
198
+ </section>
199
+
200
+
201
+
202
+
203
+ </div>
204
+
205
+ <footer id="footer">
206
+ <section class="container">
207
+ <a class="logo" href="http://squaremill.com/" rel="home">
208
+ <img alt="Square Mill Logo" height="64" src="/assets/md-logo-black-942423ecfd86c43ec6f13f163ea03f97.png" width="64" />
209
+ </a> <div class="main-nav">
210
+ <ul class="container">
211
+ <li><a href="/projects">Projects</a></li>
212
+ <li><a href="/about">About Us</a></li>
213
+ <li><a href="/blog">Blog</a></li>
214
+
215
+ <!-- <li class="link-biography"><a href="http://squaremill.com/#biography">People</a></li> -->
216
+ </ul>
217
+ </div>
218
+
219
+ </section>
220
+
221
+ <p class="copyright">
222
+ &copy; 2014 Square Mill Labs, LLC. All rights reserved.
223
+ </p>
224
+ </footer>
225
+
226
+ <script type="text/javascript" src="http://code.jquery.com/jquery-2.0.0.js"></script>
227
+ <script type="text/javascript" src="http://code.jquery.com/jquery-migrate-1.1.1.js"></script>
228
+ <script src="/assets/mn_application-82f6787dca307be34ec0c9fa6b7ba7d4.js"></script>
229
+ <script>
230
+ $(document).ready(function() {
231
+
232
+ var controller = $.superscrollorama({
233
+ triggerAtCenter: true,
234
+ playoutAnimations: true
235
+ });
236
+
237
+ if ( $(window).width() >= 767 ) {
238
+ controller.addTween('#project-7',
239
+ TweenMax.from($('#project-7'), .7, {
240
+ css:{"opacity":"0"},
241
+ onComplete: function(){
242
+ $('#project-7').toggleClass('active-in')
243
+ }
244
+ }),
245
+ 300, // duration of scroll in pixel units
246
+ -100, // scroll offset (from center of viewport)
247
+ true
248
+ );
249
+ controller.addTween('#project-1',
250
+ TweenMax.from($('#project-1'), .7, {
251
+ css:{"opacity":"0"},
252
+ onComplete: function(){
253
+ $('#project-1').toggleClass('active-in')
254
+ }
255
+ }),
256
+ 300, // duration of scroll in pixel units
257
+ -100, // scroll offset (from center of viewport)
258
+ true
259
+ );
260
+ controller.addTween('#project-2',
261
+ TweenMax.from($('#project-2'), .7, {
262
+ css:{"opacity":"0"},
263
+ onComplete: function(){
264
+ $('#project-2').toggleClass('active-in')
265
+ }
266
+ }),
267
+ 300, // duration of scroll in pixel units
268
+ -100, // scroll offset (from center of viewport)
269
+ true
270
+ );
271
+ controller.addTween('#project-3',
272
+ TweenMax.from($('#project-3'), .7, {
273
+ css:{"opacity":"0"},
274
+ onComplete: function(){
275
+ $('#project-3').toggleClass('active-in')
276
+ }
277
+ }),
278
+ 300, // duration of scroll in pixel units
279
+ -100, // scroll offset (from center of viewport)
280
+ true
281
+ );
282
+ }
283
+
284
+ });
285
+ </script>
286
+
287
+ </body>
288
+ </html>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: staticizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Conor Hunt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-14 00:00:00.000000000 Z
11
+ date: 2014-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: webmock
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: nokogiri
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -87,6 +101,7 @@ files:
87
101
  - lib/staticizer/version.rb
88
102
  - staticizer.gemspec
89
103
  - tests/crawler_test.rb
104
+ - tests/fake_page.html
90
105
  homepage: https://github.com/SquareMill/staticizer
91
106
  licenses:
92
107
  - MIT