hwacha 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1f62d12690e2705f9a389645b8dce348d48910e0
4
+ data.tar.gz: 1e9990d81ca4176385a2f2bd43272e7b915f3edf
5
+ SHA512:
6
+ metadata.gz: ecc0e7b3d69d53f46e1a4f9e6016dcc778265b6a124f5c38dda504e90ce51605c456f23d4956a937636a597b3ae8f52dc44859321e92cabf845fdd06380442dd
7
+ data.tar.gz: 05a854a534eaff9713fac5b70b87fa8973e56526a02139b1297bb23c7cd313c41607c12821bd130b18dca36c5220a6aaaf2f5a431642689ad287e98863e35c7a
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in hwacha.gemspec
4
+ gemspec
@@ -0,0 +1,37 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ hwacha (0.1.0)
5
+ typhoeus
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.2.5)
11
+ ethon (0.6.1)
12
+ ffi (>= 1.3.0)
13
+ mime-types (~> 1.18)
14
+ ffi (1.9.3)
15
+ mime-types (1.25.1)
16
+ rake (10.1.0)
17
+ rspec (2.14.1)
18
+ rspec-core (~> 2.14.0)
19
+ rspec-expectations (~> 2.14.0)
20
+ rspec-mocks (~> 2.14.0)
21
+ rspec-core (2.14.7)
22
+ rspec-expectations (2.14.4)
23
+ diff-lcs (>= 1.1.3, < 2.0)
24
+ rspec-mocks (2.14.4)
25
+ typhoeus (0.6.6)
26
+ ethon (~> 0.6.1)
27
+ vcr (2.8.0)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ bundler (~> 1.3)
34
+ hwacha!
35
+ rake
36
+ rspec
37
+ vcr
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Stephen Ball
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,99 @@
1
+ # hwacha
2
+
3
+ Hwacha! Harness the power of Typhoeus to quickly check webpage responses.
4
+
5
+ ## Example
6
+
7
+ Check a single page.
8
+
9
+ ```ruby
10
+ hwacha = Hwacha.new
11
+ hwacha.check('rakeroutes.com') do |url, response|
12
+ if response.success?
13
+ puts "Woo, #{url} looks good!"
14
+ else
15
+ puts "Aww, something that isn't success happened."
16
+ end
17
+ end
18
+ ```
19
+
20
+ Check a bunch of pages! Hwacha!
21
+
22
+ ```ruby
23
+ # 20 is also the default
24
+ maximum_number_of_requests_to_work_on_in_parallel = 20
25
+
26
+ hwacha = Hwacha.new(maximum_number_of_requests_to_work_on_in_parallel)
27
+
28
+ hwacha.check(array_of_webpage_urls) do |url, response|
29
+ # each url is enqueued in parallel using the powerful Typhoeus library!
30
+ # this block is yielded the url and response object for every response!
31
+ end
32
+ ```
33
+
34
+ The yielded response object is [straight from Typhoeus](https://github.com/typhoeus/typhoeus/blob/master/README.md#handling-http-errors).
35
+
36
+ ```ruby
37
+ hwacha.check(array_of_webpage_urls) do |url, response|
38
+ if response.success?
39
+ # hwacha!
40
+ elsif response.timed_out?
41
+ # time makes fools of us all
42
+ elsif response.code == 0
43
+ # misfire!
44
+ else
45
+ # miss! :-(
46
+ # something like 404 in response.code
47
+ end
48
+ end
49
+ ```
50
+
51
+ Sometimes you don't want to deal with the response object. Sometimes you just
52
+ want to fire a bunch of requests and find pages that successfully respond. Ok!
53
+
54
+ ```ruby
55
+ hwacha = Hwacha.new
56
+
57
+ Hwacha.find_existing(array_of_webpage_urls) do |url|
58
+ # this block will be called for all urls that successfully respond!
59
+ # hwacha!
60
+ end
61
+ ```
62
+
63
+ ## Alternative API
64
+
65
+ More fun, more hwacha.
66
+
67
+ ```ruby
68
+ # fire is an alias for #check
69
+ hwacha.fire('rakeroutes.com') do |url, response|
70
+ puts "Checking %s" % url
71
+ if response.success?
72
+ puts "success!"
73
+ else
74
+ puts "failed."
75
+ end
76
+ end
77
+
78
+ # strike_true is an alias for #find_existing
79
+ successful = 0
80
+ hwacha.strike_true(unknown_pages) do |url|
81
+ successful += 1
82
+ end
83
+ puts "Hwacha! #{successful} hits!"
84
+ ```
85
+
86
+ ## Installation
87
+
88
+ Add this line to your application's Gemfile:
89
+
90
+ gem 'hwacha'
91
+
92
+ And then execute:
93
+
94
+ $ bundle
95
+
96
+ Or install it yourself as:
97
+
98
+ $ gem install hwacha
99
+
@@ -0,0 +1,7 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new
5
+
6
+ task :default => :spec
7
+ task :test => :spec
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hwacha/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hwacha"
8
+ spec.version = Hwacha::VERSION
9
+ spec.authors = ["Stephen Ball"]
10
+ spec.email = ["sdball@gmail.com"]
11
+ spec.description = %q{Harness the power of Typhoeus to quickly check webpage responses.}
12
+ spec.summary = %q{Sometimes you just want to check a bunch of webpages. Hwacha makes it easy.}
13
+ spec.homepage = "http://github.com/sdball/hwacha"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "typhoeus"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "vcr"
27
+ end
@@ -0,0 +1,32 @@
1
+ require "hwacha/version"
2
+ require "typhoeus"
3
+
4
+ class Hwacha
5
+ def initialize(max_concurrent_requests=20)
6
+ @max_concurrent_requests = max_concurrent_requests
7
+ end
8
+
9
+ def check(urls)
10
+ hydra = Typhoeus::Hydra.new(:max_concurrency => @max_concurrent_requests)
11
+
12
+ Array(urls).each do |url|
13
+ request = Typhoeus::Request.new(url)
14
+ request.on_complete do |response|
15
+ yield response.effective_url, response
16
+ end
17
+ hydra.queue request
18
+ end
19
+
20
+ hydra.run
21
+ end
22
+
23
+ def find_existing(urls)
24
+ check(urls) do |url, response|
25
+ yield url if response.success?
26
+ end
27
+ end
28
+
29
+ # Hwacha!!!
30
+ alias :fire :check
31
+ alias :strike_true :find_existing
32
+ end
@@ -0,0 +1,3 @@
1
+ class Hwacha
2
+ VERSION = "0.1.0" # woo, beta!
3
+ end
@@ -0,0 +1,24 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: ''
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Typhoeus - https://github.com/typhoeus/typhoeus
12
+ response:
13
+ status:
14
+ code: 0
15
+ message:
16
+ headers: {}
17
+ body:
18
+ encoding: UTF-8
19
+ string: ''
20
+ http_version:
21
+ adapter_metadata:
22
+ effective_url: ''
23
+ recorded_at: Tue, 03 Dec 2013 06:07:19 GMT
24
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,43 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: rakeroutes.com/this-url-does-not-exist
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Typhoeus - https://github.com/typhoeus/typhoeus
12
+ response:
13
+ status:
14
+ code: 404
15
+ message: Not Found
16
+ headers:
17
+ Date:
18
+ - Tue, 03 Dec 2013 06:07:19 GMT
19
+ Server:
20
+ - Apache
21
+ Vary:
22
+ - Accept-Encoding
23
+ Content-Length:
24
+ - '340'
25
+ Content-Type:
26
+ - text/html; charset=iso-8859-1
27
+ body:
28
+ encoding: UTF-8
29
+ string: |
30
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
31
+ <html><head>
32
+ <title>404 Not Found</title>
33
+ </head><body>
34
+ <h1>Not Found</h1>
35
+ <p>The requested URL /this-url-does-not-exist was not found on this server.</p>
36
+ <p>Additionally, a 404 Not Found
37
+ error was encountered while trying to use an ErrorDocument to handle the request.</p>
38
+ </body></html>
39
+ http_version: '1.1'
40
+ adapter_metadata:
41
+ effective_url: HTTP://rakeroutes.com/this-url-does-not-exist
42
+ recorded_at: Tue, 03 Dec 2013 06:07:19 GMT
43
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,311 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: rakeroutes.com
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Typhoeus - https://github.com/typhoeus/typhoeus
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Date:
18
+ - Tue, 03 Dec 2013 06:07:19 GMT
19
+ Server:
20
+ - Apache
21
+ Accept-Ranges:
22
+ - bytes
23
+ X-Mod-Pagespeed:
24
+ - 1.4.26.5-3533
25
+ Cache-Control:
26
+ - max-age=0, no-cache, must-revalidate
27
+ Vary:
28
+ - Accept-Encoding,User-Agent
29
+ Content-Length:
30
+ - '15195'
31
+ Content-Type:
32
+ - text/html
33
+ body:
34
+ encoding: UTF-8
35
+ string: |2
36
+
37
+ <!DOCTYPE html>
38
+ <!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
39
+ <!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
40
+ <!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
41
+ <head>
42
+ <meta charset="utf-8">
43
+ <title>Rake Routes</title>
44
+ <meta name="author" content="Stephen Ball">
45
+ <meta name="description" content="A blog focused on the new Ruby/Rails developer. From the basics to the advanced; we try to write every article to be completely accessible.">
46
+ <!-- http://t.co/dKP3o1e -->
47
+ <meta name="HandheldFriendly" content="True">
48
+ <meta name="MobileOptimized" content="320">
49
+ <meta name="viewport" content="width=device-width, initial-scale=1">
50
+ <link rel="canonical" href="http://rakeroutes.com">
51
+ <link href="http://rakeroutes.com/xfavicon.png.pagespeed.ic.9sqLog9_Yb.png" rel="icon">
52
+ <link href="http://rakeroutes.com/stylesheets/A.screen.css.pagespeed.cf.B_lQ_FV7Zb.css" media="screen, projection" rel="stylesheet" type="text/css">
53
+ <script src="http://rakeroutes.com/javascripts/modernizr-2.0.js.pagespeed.jm.tWJiHFCbtH.js"></script>
54
+ <script src="http://rakeroutes.com/javascripts/ender.js.pagespeed.jm.RrToSBMcQ6.js"></script>
55
+ <script src="http://rakeroutes.com/javascripts/octopress.js.pagespeed.jm.1C8AxdO_gr.js" type="text/javascript"></script>
56
+ <link href="http://feeds.feedburner.com/RakeRoutes" rel="alternate" title="Rake Routes" type="application/atom+xml">
57
+ <!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
58
+ <link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
59
+ <link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
60
+ <meta name="readability-verification" content="AK9Dcwz9jtUc56rWDsh5HXSfVARa3Z7GDjCdBtk9"/>
61
+ <meta name="readability-verification" content="EAL7Vhv7W4KCBkyHjGZBxndkzqZfmbTVGRRVRFre"/>
62
+ </head>
63
+ <body>
64
+ <header role="banner"><hgroup>
65
+ <h1><a href="/">Rake Routes</a></h1>
66
+ <h2>Rails, Ruby, and other programming.</h2>
67
+ </hgroup>
68
+ </header>
69
+ <nav role="navigation"><ul class="subscription" data-subscription="rss email">
70
+ <li><a onclick="clicky.goal( '6111' ); clicky.pause( 500 );" href="http://feeds.feedburner.com/RakeRoutes" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
71
+ <li><a onclick="clicky.goal('6117'); clicky.pause( 500 );" href="http://feedburner.google.com/fb/a/mailverify?uri=RakeRoutes&amp;loc=en_US" rel="subscribe-email" title="subscribe via email">Email</a></li>
72
+ </ul>
73
+ <form action="http://google.com/search" method="get">
74
+ <fieldset role="search">
75
+ <input type="hidden" name="q" value="site:rakeroutes.com"/>
76
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
77
+ </fieldset>
78
+ </form>
79
+ <ul class="main-navigation">
80
+ <li><a href="/">Blog</a></li>
81
+ <li><a href="/blog/archives">Archives</a></li>
82
+ </ul>
83
+ </nav>
84
+ <div id="main">
85
+ <div id="content">
86
+ <div class="blog-index">
87
+ <article>
88
+ <header>
89
+ <h1 class="entry-title"><a href="/blog/deliberate-git/">Deliberate Git</a></h1>
90
+ <p class="meta">
91
+ <time datetime="2013-08-19T19:35:00-04:00" pubdate data-updated="true">Aug 19<span>th</span>, 2013</time>
92
+ </p>
93
+ </header>
94
+ <div class="entry-content"><p>Hello Internet! Here&#8217;s my talk &#8220;Deliberate Git&#8221; in blog post form.</p>
95
+ <p>There&#8217;s also video of my presentation of <a href="http://steelcityruby.confbots.com/video/72762735">Deliberate Git at Steel City Ruby 2013</a>.</p>
96
+ <p>If you&#8217;d like to just read the slides they&#8217;re up on Speaker Deck: <a href="https://speakerdeck.com/sdball/deliberate-git">Deliberate
97
+ Git - Slides</a>. Although I highly
98
+ recommend just pointing people to this blog post if they want to read the talk
99
+ instead of watching it online.</p>
100
+ <p>Special thanks to PhishMe for sending me to Steel City Ruby to give this talk!</p>
101
+ </div>
102
+ <footer>
103
+ <a rel="full-article" href="/blog/deliberate-git/">Read on &rarr;</a>
104
+ </footer>
105
+ </article>
106
+ <article>
107
+ <header>
108
+ <h1 class="entry-title"><a href="/blog/customize-your-irb/">Customize Your IRB</a></h1>
109
+ <p class="meta">
110
+ <time datetime="2013-03-19T09:00:00-04:00" pubdate data-updated="true">Mar 19<span>th</span>, 2013</time>
111
+ </p>
112
+ </header>
113
+ <div class="entry-content"><p>You probably spend a lot of time in IRB (or the Rails console) but have you
114
+ taken the time to customize it? Today we&#8217;ll take a look at the things I&#8217;ve
115
+ added to mine, and I&#8217;ll show you how to hack in a .irbrc_rails that&#8217;s only loaded
116
+ in the Rails console.</p>
117
+ </div>
118
+ <footer>
119
+ <a rel="full-article" href="/blog/customize-your-irb/">Read on &rarr;</a>
120
+ </footer>
121
+ </article>
122
+ <article>
123
+ <header>
124
+ <h1 class="entry-title"><a href="/blog/program-like-a-videogamer/">Program Like a Videogamer</a></h1>
125
+ <p class="meta">
126
+ <time datetime="2013-02-06T09:01:00-05:00" pubdate data-updated="true">Feb 6<span>th</span>, 2013</time>
127
+ </p>
128
+ </header>
129
+ <div class="entry-content"><p>I see a lot of you out there worried about the next step in your programming
130
+ career. Or even worried about the next step when learning a new framework or
131
+ language. Today let me try to assuage some of that fear by describing my approach.</p>
132
+ </div>
133
+ <footer>
134
+ <a rel="full-article" href="/blog/program-like-a-videogamer/">Read on &rarr;</a>
135
+ </footer>
136
+ </article>
137
+ <article>
138
+ <header>
139
+ <h1 class="entry-title"><a href="/blog/gem-spotlight-interactive-editor/">Gem Spotlight: Interactive_editor</a></h1>
140
+ <p class="meta">
141
+ <time datetime="2013-01-04T12:13:00-05:00" pubdate data-updated="true">Jan 4<span>th</span>, 2013</time>
142
+ </p>
143
+ </header>
144
+ <div class="entry-content"><p>Today we&#8217;ll take a quick look at one of my favorite gems: interactive_editor.
145
+ Have you ever been in a REPL session (rails console, irb, pry, etc.) and wished
146
+ that you could pop open a full editor to write out some code? (Ok, maybe not
147
+ you pry users.) Well interactive_editor is a gem that gives you just that, as
148
+ well as some really nice object inspection and manipulation.</p>
149
+ </div>
150
+ <footer>
151
+ <a rel="full-article" href="/blog/gem-spotlight-interactive-editor/">Read on &rarr;</a>
152
+ </footer>
153
+ </article>
154
+ <article>
155
+ <header>
156
+ <h1 class="entry-title"><a href="/blog/subscribing-to-rubytapas-using-downcast/">Subscribing to RubyTapas Using Downcast</a></h1>
157
+ <p class="meta">
158
+ <time datetime="2012-10-19T23:17:00-04:00" pubdate data-updated="true">Oct 19<span>th</span>, 2012</time>
159
+ </p>
160
+ </header>
161
+ <div class="entry-content"><p>Avdi&#8217;s <a href="http://devblog.avdi.org/rubytapas/">Ruby Tapas</a> are a fantastic
162
+ resource for learning pieces of Ruby. Now that he and DPD have enabled
163
+ iTunes-compatible RSS feeds of the videos it&#8217;s easier than ever to stay current
164
+ with the videos.</p>
165
+ <p>Today I&#8217;m just going to share the steps required to add Ruby Tapas to Downcast
166
+ on your iPhone or iPad. It&#8217;s very easy, but it&#8217;s handy to have all the steps
167
+ in one place.</p>
168
+ </div>
169
+ <footer>
170
+ <a rel="full-article" href="/blog/subscribing-to-rubytapas-using-downcast/">Read on &rarr;</a>
171
+ </footer>
172
+ </article>
173
+ <article>
174
+ <header>
175
+ <h1 class="entry-title"><a href="/blog/things-most-interviewees-fail-to-discover/">Things Most Interviewees Fail to Discover</a></h1>
176
+ <p class="meta">
177
+ <time datetime="2012-08-17T08:53:00-04:00" pubdate data-updated="true">Aug 17<span>th</span>, 2012</time>
178
+ </p>
179
+ </header>
180
+ <div class="entry-content"><p>It&#8217;s a great time to be a Rails developer. Companies left and right are turning to Rails or using it already for efficient web development. If you know Rails and the web stack well then you have the luxury of choice: let&#8217;s make sure you make a good pick!</p>
181
+ </div>
182
+ <footer>
183
+ <a rel="full-article" href="/blog/things-most-interviewees-fail-to-discover/">Read on &rarr;</a>
184
+ </footer>
185
+ </article>
186
+ <article>
187
+ <header>
188
+ <h1 class="entry-title"><a href="/blog/10-things-i-love-about-git/">10 Things I Love About Git</a></h1>
189
+ <p class="meta">
190
+ <time datetime="2012-08-07T09:29:00-04:00" pubdate data-updated="true">Aug 7<span>th</span>, 2012</time>
191
+ </p>
192
+ </header>
193
+ <div class="entry-content"><p>Not everyone loves git. It&#8217;s true! But I do, and here are some reasons why.</p>
194
+ </div>
195
+ <footer>
196
+ <a rel="full-article" href="/blog/10-things-i-love-about-git/">Read on &rarr;</a>
197
+ </footer>
198
+ </article>
199
+ <article>
200
+ <header>
201
+ <h1 class="entry-title"><a href="/blog/effective-window-management-by-dividing-your-monitor-into-zones/">Effective Window Management by Dividing Your Monitor Into Zones</a></h1>
202
+ <p class="meta">
203
+ <time datetime="2012-06-22T09:21:00-04:00" pubdate data-updated="true">Jun 22<span>nd</span>, 2012</time>
204
+ </p>
205
+ </header>
206
+ <div class="entry-content"><p>I love my 27 inch Apple Thunderbolt display, but after some amount of neck strain I had to conclude that it&#8217;s just too big to use it like a laptop monitor and fullscreen everything.</p>
207
+ <p>Instead, I&#8217;ve come up with a great window management solution that capitalizes on the monitor&#8217;s strengths and gives me an awesome work environment.</p>
208
+ </div>
209
+ <footer>
210
+ <a rel="full-article" href="/blog/effective-window-management-by-dividing-your-monitor-into-zones/">Read on &rarr;</a>
211
+ </footer>
212
+ </article>
213
+ <article>
214
+ <header>
215
+ <h1 class="entry-title"><a href="/blog/getting-up-to-speed-on-a-new-git-repo/">Getting Up to Speed on a New Git Repo</a></h1>
216
+ <p class="meta">
217
+ <time datetime="2012-05-11T12:44:00-04:00" pubdate data-updated="true">May 11<span>th</span>, 2012</time>
218
+ </p>
219
+ </header>
220
+ <div class="entry-content"><p>Alright! You want to get up to speed with a new git repository? You got it. Here are some quick reference notes and tools to use to see what&#8217;s been going on.</p>
221
+ </div>
222
+ <footer>
223
+ <a rel="full-article" href="/blog/getting-up-to-speed-on-a-new-git-repo/">Read on &rarr;</a>
224
+ </footer>
225
+ </article>
226
+ <article>
227
+ <header>
228
+ <h1 class="entry-title"><a href="/blog/new-post-coming-soon/">New Post Coming Soon</a></h1>
229
+ <p class="meta">
230
+ <time datetime="2012-05-08T13:39:00-04:00" pubdate data-updated="true">May 8<span>th</span>, 2012</time>
231
+ </p>
232
+ </header>
233
+ <div class="entry-content"><p>Sorry that Rake Routes has been silent these past weeks. All at once I&#8217;ve been busy with a couple of other projects:</p>
234
+ <ul>
235
+ <li>a new job with the fine folks at <a href="http://phishme.com">PhishMe</a></li>
236
+ <li>the birth of our new baby girl. <a href="/images/marie.jpg">Aww</a></li>
237
+ </ul>
238
+ <p>I&#8217;m starting to get things settled into a new routine, so I&#8217;m finally carving out time to blog again!</p>
239
+ <p>I&#8217;ve got a new post coming soon on getting up to speed on a new git repository. This is useful for when you want start contributing to a new project or you&#8217;re starting a new job and want to get the lay of the land. Look for it this week!</p>
240
+ </div>
241
+ </article>
242
+ <div class="pagination">
243
+ <a class="prev" href="/blog/page/2/">&larr; Older</a>
244
+ <a href="/blog/archives">Blog Archives</a>
245
+ </div>
246
+ </div>
247
+ <aside class="sidebar">
248
+ <section>
249
+ <h1>Recent Posts</h1>
250
+ <ul id="recent_posts">
251
+ <li class="post">
252
+ <a href="/blog/deliberate-git/">Deliberate Git</a>
253
+ </li>
254
+ <li class="post">
255
+ <a href="/blog/customize-your-irb/">Customize your IRB</a>
256
+ </li>
257
+ <li class="post">
258
+ <a href="/blog/program-like-a-videogamer/">Program like a Videogamer</a>
259
+ </li>
260
+ <li class="post">
261
+ <a href="/blog/gem-spotlight-interactive-editor/">Gem spotlight: interactive_editor</a>
262
+ </li>
263
+ <li class="post">
264
+ <a href="/blog/subscribing-to-rubytapas-using-downcast/">Subscribing to RubyTapas using Downcast</a>
265
+ </li>
266
+ </ul>
267
+ </section>
268
+ <section>
269
+ <h1>About Me</h1>
270
+ <img class="right" src="http://gravatar.com/avatar/aaa2b1f12b65d33422e8cdc48d70c0f9">
271
+ <p>My name is Stephen Ball. I started programming computers back in the 80s
272
+ by copying BASIC programs from 3-2-1 Contact into our Atari 800. Now I
273
+ program web applications using Ruby on Rails and CoffeeScript. I love every
274
+ minute of it.</p>
275
+ <p><a href="https://twitter.com/StephenBallNC" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @StephenBallNC</a>
276
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
277
+ </section>
278
+ <section>
279
+ <h1>Tweets for Rake Routes</h1>
280
+ <a class="twitter-timeline" href="https://twitter.com/search?q=rakeroutes" data-widget-id="395243196042579970">Tweets about &#8220;rakeroutes&#8221;</a>
281
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
282
+ </section>
283
+ <section>
284
+ <h1>My Pinboard</h1>
285
+ <ul id="pinboard_linkroll">Fetching linkroll&#8230;</ul>
286
+ <p><a href="http://pinboard.in/u:xyzzyb">My Pinboard Bookmarks &raquo;</a></p>
287
+ </section>
288
+ <script type="text/javascript">var linkroll='pinboard_linkroll';var pinboard_user="xyzzyb";var pinboard_count=3;(function(){var pinboardInit=document.createElement('script');pinboardInit.type='text/javascript';pinboardInit.async=true;pinboardInit.src='/javascripts/pinboard.js';document.getElementsByTagName('head')[0].appendChild(pinboardInit);})();</script>
289
+ </aside>
290
+ </div>
291
+ </div>
292
+ <footer role="contentinfo"><p>
293
+ Copyright &copy; 2013 - Stephen Ball -
294
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
295
+ </p>
296
+ </footer>
297
+ <script type="text/javascript">var disqus_shortname='xyzzyb';var disqus_script='count.js';(function(){var dsq=document.createElement('script');dsq.type='text/javascript';dsq.async=true;dsq.src='http://'+disqus_shortname+'.disqus.com/'+disqus_script;(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(dsq);}());</script>
298
+ <div id="fb-root"></div>
299
+ <script>(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id)){return;}
300
+ js=d.createElement(s);js.id=id;js.src="//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";fjs.parentNode.insertBefore(js,fjs);}(document,'script','facebook-jssdk'));</script>
301
+ <script type="text/javascript">(function(){var script=document.createElement('script');script.type='text/javascript';script.async=true;script.src='https://apis.google.com/js/plusone.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(script,s);})();</script>
302
+ <script type="text/javascript">(function(){var twitterWidgets=document.createElement('script');twitterWidgets.type='text/javascript';twitterWidgets.async=true;twitterWidgets.src='http://platform.twitter.com/widgets.js';document.getElementsByTagName('head')[0].appendChild(twitterWidgets);})();</script>
303
+ <a title="Real Time Analytics" href="http://getclicky.com/66509312"><img alt="Real Time Analytics" src="//static.getclicky.com/media/links/badge.gif" border="0"/></a>
304
+ <script type="text/javascript">var clicky_site_ids=clicky_site_ids||[];clicky_site_ids.push(66536397);(function(){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src='//static.getclicky.com/js';(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(s);})();</script>
305
+ </body>
306
+ </html>
307
+ http_version: '1.1'
308
+ adapter_metadata:
309
+ effective_url: HTTP://rakeroutes.com/
310
+ recorded_at: Tue, 03 Dec 2013 06:07:19 GMT
311
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,372 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: ''
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Typhoeus - https://github.com/typhoeus/typhoeus
12
+ response:
13
+ status:
14
+ code: 0
15
+ message:
16
+ headers: {}
17
+ body:
18
+ encoding: UTF-8
19
+ string: ''
20
+ http_version:
21
+ adapter_metadata:
22
+ effective_url: ''
23
+ recorded_at: Tue, 03 Dec 2013 06:07:19 GMT
24
+ - request:
25
+ method: get
26
+ uri: rakeroutes.com/this-url-does-not-exist
27
+ body:
28
+ encoding: US-ASCII
29
+ string: ''
30
+ headers:
31
+ User-Agent:
32
+ - Typhoeus - https://github.com/typhoeus/typhoeus
33
+ response:
34
+ status:
35
+ code: 404
36
+ message: Not Found
37
+ headers:
38
+ Date:
39
+ - Tue, 03 Dec 2013 06:07:19 GMT
40
+ Server:
41
+ - Apache
42
+ Vary:
43
+ - Accept-Encoding
44
+ Content-Length:
45
+ - '340'
46
+ Content-Type:
47
+ - text/html; charset=iso-8859-1
48
+ body:
49
+ encoding: UTF-8
50
+ string: |
51
+ <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
52
+ <html><head>
53
+ <title>404 Not Found</title>
54
+ </head><body>
55
+ <h1>Not Found</h1>
56
+ <p>The requested URL /this-url-does-not-exist was not found on this server.</p>
57
+ <p>Additionally, a 404 Not Found
58
+ error was encountered while trying to use an ErrorDocument to handle the request.</p>
59
+ </body></html>
60
+ http_version: '1.1'
61
+ adapter_metadata:
62
+ effective_url: HTTP://rakeroutes.com/this-url-does-not-exist
63
+ recorded_at: Tue, 03 Dec 2013 06:07:19 GMT
64
+ - request:
65
+ method: get
66
+ uri: rakeroutes.com
67
+ body:
68
+ encoding: US-ASCII
69
+ string: ''
70
+ headers:
71
+ User-Agent:
72
+ - Typhoeus - https://github.com/typhoeus/typhoeus
73
+ response:
74
+ status:
75
+ code: 200
76
+ message: OK
77
+ headers:
78
+ Date:
79
+ - Tue, 03 Dec 2013 06:07:19 GMT
80
+ Server:
81
+ - Apache
82
+ Accept-Ranges:
83
+ - bytes
84
+ X-Mod-Pagespeed:
85
+ - 1.4.26.5-3533
86
+ Cache-Control:
87
+ - max-age=0, no-cache, must-revalidate
88
+ Vary:
89
+ - Accept-Encoding,User-Agent
90
+ Content-Length:
91
+ - '15195'
92
+ Content-Type:
93
+ - text/html
94
+ body:
95
+ encoding: UTF-8
96
+ string: |2
97
+
98
+ <!DOCTYPE html>
99
+ <!--[if IEMobile 7 ]><html class="no-js iem7"><![endif]-->
100
+ <!--[if lt IE 9]><html class="no-js lte-ie8"><![endif]-->
101
+ <!--[if (gt IE 8)|(gt IEMobile 7)|!(IEMobile)|!(IE)]><!--><html class="no-js" lang="en"><!--<![endif]-->
102
+ <head>
103
+ <meta charset="utf-8">
104
+ <title>Rake Routes</title>
105
+ <meta name="author" content="Stephen Ball">
106
+ <meta name="description" content="A blog focused on the new Ruby/Rails developer. From the basics to the advanced; we try to write every article to be completely accessible.">
107
+ <!-- http://t.co/dKP3o1e -->
108
+ <meta name="HandheldFriendly" content="True">
109
+ <meta name="MobileOptimized" content="320">
110
+ <meta name="viewport" content="width=device-width, initial-scale=1">
111
+ <link rel="canonical" href="http://rakeroutes.com">
112
+ <link href="http://rakeroutes.com/xfavicon.png.pagespeed.ic.9sqLog9_Yb.png" rel="icon">
113
+ <link href="http://rakeroutes.com/stylesheets/A.screen.css.pagespeed.cf.B_lQ_FV7Zb.css" media="screen, projection" rel="stylesheet" type="text/css">
114
+ <script src="http://rakeroutes.com/javascripts/modernizr-2.0.js.pagespeed.jm.tWJiHFCbtH.js"></script>
115
+ <script src="http://rakeroutes.com/javascripts/ender.js.pagespeed.jm.RrToSBMcQ6.js"></script>
116
+ <script src="http://rakeroutes.com/javascripts/octopress.js.pagespeed.jm.1C8AxdO_gr.js" type="text/javascript"></script>
117
+ <link href="http://feeds.feedburner.com/RakeRoutes" rel="alternate" title="Rake Routes" type="application/atom+xml">
118
+ <!--Fonts from Google"s Web font directory at http://google.com/webfonts -->
119
+ <link href="http://fonts.googleapis.com/css?family=PT+Serif:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
120
+ <link href="http://fonts.googleapis.com/css?family=PT+Sans:regular,italic,bold,bolditalic" rel="stylesheet" type="text/css">
121
+ <meta name="readability-verification" content="AK9Dcwz9jtUc56rWDsh5HXSfVARa3Z7GDjCdBtk9"/>
122
+ <meta name="readability-verification" content="EAL7Vhv7W4KCBkyHjGZBxndkzqZfmbTVGRRVRFre"/>
123
+ </head>
124
+ <body>
125
+ <header role="banner"><hgroup>
126
+ <h1><a href="/">Rake Routes</a></h1>
127
+ <h2>Rails, Ruby, and other programming.</h2>
128
+ </hgroup>
129
+ </header>
130
+ <nav role="navigation"><ul class="subscription" data-subscription="rss email">
131
+ <li><a onclick="clicky.goal( '6111' ); clicky.pause( 500 );" href="http://feeds.feedburner.com/RakeRoutes" rel="subscribe-rss" title="subscribe via RSS">RSS</a></li>
132
+ <li><a onclick="clicky.goal('6117'); clicky.pause( 500 );" href="http://feedburner.google.com/fb/a/mailverify?uri=RakeRoutes&amp;loc=en_US" rel="subscribe-email" title="subscribe via email">Email</a></li>
133
+ </ul>
134
+ <form action="http://google.com/search" method="get">
135
+ <fieldset role="search">
136
+ <input type="hidden" name="q" value="site:rakeroutes.com"/>
137
+ <input class="search" type="text" name="q" results="0" placeholder="Search"/>
138
+ </fieldset>
139
+ </form>
140
+ <ul class="main-navigation">
141
+ <li><a href="/">Blog</a></li>
142
+ <li><a href="/blog/archives">Archives</a></li>
143
+ </ul>
144
+ </nav>
145
+ <div id="main">
146
+ <div id="content">
147
+ <div class="blog-index">
148
+ <article>
149
+ <header>
150
+ <h1 class="entry-title"><a href="/blog/deliberate-git/">Deliberate Git</a></h1>
151
+ <p class="meta">
152
+ <time datetime="2013-08-19T19:35:00-04:00" pubdate data-updated="true">Aug 19<span>th</span>, 2013</time>
153
+ </p>
154
+ </header>
155
+ <div class="entry-content"><p>Hello Internet! Here&#8217;s my talk &#8220;Deliberate Git&#8221; in blog post form.</p>
156
+ <p>There&#8217;s also video of my presentation of <a href="http://steelcityruby.confbots.com/video/72762735">Deliberate Git at Steel City Ruby 2013</a>.</p>
157
+ <p>If you&#8217;d like to just read the slides they&#8217;re up on Speaker Deck: <a href="https://speakerdeck.com/sdball/deliberate-git">Deliberate
158
+ Git - Slides</a>. Although I highly
159
+ recommend just pointing people to this blog post if they want to read the talk
160
+ instead of watching it online.</p>
161
+ <p>Special thanks to PhishMe for sending me to Steel City Ruby to give this talk!</p>
162
+ </div>
163
+ <footer>
164
+ <a rel="full-article" href="/blog/deliberate-git/">Read on &rarr;</a>
165
+ </footer>
166
+ </article>
167
+ <article>
168
+ <header>
169
+ <h1 class="entry-title"><a href="/blog/customize-your-irb/">Customize Your IRB</a></h1>
170
+ <p class="meta">
171
+ <time datetime="2013-03-19T09:00:00-04:00" pubdate data-updated="true">Mar 19<span>th</span>, 2013</time>
172
+ </p>
173
+ </header>
174
+ <div class="entry-content"><p>You probably spend a lot of time in IRB (or the Rails console) but have you
175
+ taken the time to customize it? Today we&#8217;ll take a look at the things I&#8217;ve
176
+ added to mine, and I&#8217;ll show you how to hack in a .irbrc_rails that&#8217;s only loaded
177
+ in the Rails console.</p>
178
+ </div>
179
+ <footer>
180
+ <a rel="full-article" href="/blog/customize-your-irb/">Read on &rarr;</a>
181
+ </footer>
182
+ </article>
183
+ <article>
184
+ <header>
185
+ <h1 class="entry-title"><a href="/blog/program-like-a-videogamer/">Program Like a Videogamer</a></h1>
186
+ <p class="meta">
187
+ <time datetime="2013-02-06T09:01:00-05:00" pubdate data-updated="true">Feb 6<span>th</span>, 2013</time>
188
+ </p>
189
+ </header>
190
+ <div class="entry-content"><p>I see a lot of you out there worried about the next step in your programming
191
+ career. Or even worried about the next step when learning a new framework or
192
+ language. Today let me try to assuage some of that fear by describing my approach.</p>
193
+ </div>
194
+ <footer>
195
+ <a rel="full-article" href="/blog/program-like-a-videogamer/">Read on &rarr;</a>
196
+ </footer>
197
+ </article>
198
+ <article>
199
+ <header>
200
+ <h1 class="entry-title"><a href="/blog/gem-spotlight-interactive-editor/">Gem Spotlight: Interactive_editor</a></h1>
201
+ <p class="meta">
202
+ <time datetime="2013-01-04T12:13:00-05:00" pubdate data-updated="true">Jan 4<span>th</span>, 2013</time>
203
+ </p>
204
+ </header>
205
+ <div class="entry-content"><p>Today we&#8217;ll take a quick look at one of my favorite gems: interactive_editor.
206
+ Have you ever been in a REPL session (rails console, irb, pry, etc.) and wished
207
+ that you could pop open a full editor to write out some code? (Ok, maybe not
208
+ you pry users.) Well interactive_editor is a gem that gives you just that, as
209
+ well as some really nice object inspection and manipulation.</p>
210
+ </div>
211
+ <footer>
212
+ <a rel="full-article" href="/blog/gem-spotlight-interactive-editor/">Read on &rarr;</a>
213
+ </footer>
214
+ </article>
215
+ <article>
216
+ <header>
217
+ <h1 class="entry-title"><a href="/blog/subscribing-to-rubytapas-using-downcast/">Subscribing to RubyTapas Using Downcast</a></h1>
218
+ <p class="meta">
219
+ <time datetime="2012-10-19T23:17:00-04:00" pubdate data-updated="true">Oct 19<span>th</span>, 2012</time>
220
+ </p>
221
+ </header>
222
+ <div class="entry-content"><p>Avdi&#8217;s <a href="http://devblog.avdi.org/rubytapas/">Ruby Tapas</a> are a fantastic
223
+ resource for learning pieces of Ruby. Now that he and DPD have enabled
224
+ iTunes-compatible RSS feeds of the videos it&#8217;s easier than ever to stay current
225
+ with the videos.</p>
226
+ <p>Today I&#8217;m just going to share the steps required to add Ruby Tapas to Downcast
227
+ on your iPhone or iPad. It&#8217;s very easy, but it&#8217;s handy to have all the steps
228
+ in one place.</p>
229
+ </div>
230
+ <footer>
231
+ <a rel="full-article" href="/blog/subscribing-to-rubytapas-using-downcast/">Read on &rarr;</a>
232
+ </footer>
233
+ </article>
234
+ <article>
235
+ <header>
236
+ <h1 class="entry-title"><a href="/blog/things-most-interviewees-fail-to-discover/">Things Most Interviewees Fail to Discover</a></h1>
237
+ <p class="meta">
238
+ <time datetime="2012-08-17T08:53:00-04:00" pubdate data-updated="true">Aug 17<span>th</span>, 2012</time>
239
+ </p>
240
+ </header>
241
+ <div class="entry-content"><p>It&#8217;s a great time to be a Rails developer. Companies left and right are turning to Rails or using it already for efficient web development. If you know Rails and the web stack well then you have the luxury of choice: let&#8217;s make sure you make a good pick!</p>
242
+ </div>
243
+ <footer>
244
+ <a rel="full-article" href="/blog/things-most-interviewees-fail-to-discover/">Read on &rarr;</a>
245
+ </footer>
246
+ </article>
247
+ <article>
248
+ <header>
249
+ <h1 class="entry-title"><a href="/blog/10-things-i-love-about-git/">10 Things I Love About Git</a></h1>
250
+ <p class="meta">
251
+ <time datetime="2012-08-07T09:29:00-04:00" pubdate data-updated="true">Aug 7<span>th</span>, 2012</time>
252
+ </p>
253
+ </header>
254
+ <div class="entry-content"><p>Not everyone loves git. It&#8217;s true! But I do, and here are some reasons why.</p>
255
+ </div>
256
+ <footer>
257
+ <a rel="full-article" href="/blog/10-things-i-love-about-git/">Read on &rarr;</a>
258
+ </footer>
259
+ </article>
260
+ <article>
261
+ <header>
262
+ <h1 class="entry-title"><a href="/blog/effective-window-management-by-dividing-your-monitor-into-zones/">Effective Window Management by Dividing Your Monitor Into Zones</a></h1>
263
+ <p class="meta">
264
+ <time datetime="2012-06-22T09:21:00-04:00" pubdate data-updated="true">Jun 22<span>nd</span>, 2012</time>
265
+ </p>
266
+ </header>
267
+ <div class="entry-content"><p>I love my 27 inch Apple Thunderbolt display, but after some amount of neck strain I had to conclude that it&#8217;s just too big to use it like a laptop monitor and fullscreen everything.</p>
268
+ <p>Instead, I&#8217;ve come up with a great window management solution that capitalizes on the monitor&#8217;s strengths and gives me an awesome work environment.</p>
269
+ </div>
270
+ <footer>
271
+ <a rel="full-article" href="/blog/effective-window-management-by-dividing-your-monitor-into-zones/">Read on &rarr;</a>
272
+ </footer>
273
+ </article>
274
+ <article>
275
+ <header>
276
+ <h1 class="entry-title"><a href="/blog/getting-up-to-speed-on-a-new-git-repo/">Getting Up to Speed on a New Git Repo</a></h1>
277
+ <p class="meta">
278
+ <time datetime="2012-05-11T12:44:00-04:00" pubdate data-updated="true">May 11<span>th</span>, 2012</time>
279
+ </p>
280
+ </header>
281
+ <div class="entry-content"><p>Alright! You want to get up to speed with a new git repository? You got it. Here are some quick reference notes and tools to use to see what&#8217;s been going on.</p>
282
+ </div>
283
+ <footer>
284
+ <a rel="full-article" href="/blog/getting-up-to-speed-on-a-new-git-repo/">Read on &rarr;</a>
285
+ </footer>
286
+ </article>
287
+ <article>
288
+ <header>
289
+ <h1 class="entry-title"><a href="/blog/new-post-coming-soon/">New Post Coming Soon</a></h1>
290
+ <p class="meta">
291
+ <time datetime="2012-05-08T13:39:00-04:00" pubdate data-updated="true">May 8<span>th</span>, 2012</time>
292
+ </p>
293
+ </header>
294
+ <div class="entry-content"><p>Sorry that Rake Routes has been silent these past weeks. All at once I&#8217;ve been busy with a couple of other projects:</p>
295
+ <ul>
296
+ <li>a new job with the fine folks at <a href="http://phishme.com">PhishMe</a></li>
297
+ <li>the birth of our new baby girl. <a href="/images/marie.jpg">Aww</a></li>
298
+ </ul>
299
+ <p>I&#8217;m starting to get things settled into a new routine, so I&#8217;m finally carving out time to blog again!</p>
300
+ <p>I&#8217;ve got a new post coming soon on getting up to speed on a new git repository. This is useful for when you want start contributing to a new project or you&#8217;re starting a new job and want to get the lay of the land. Look for it this week!</p>
301
+ </div>
302
+ </article>
303
+ <div class="pagination">
304
+ <a class="prev" href="/blog/page/2/">&larr; Older</a>
305
+ <a href="/blog/archives">Blog Archives</a>
306
+ </div>
307
+ </div>
308
+ <aside class="sidebar">
309
+ <section>
310
+ <h1>Recent Posts</h1>
311
+ <ul id="recent_posts">
312
+ <li class="post">
313
+ <a href="/blog/deliberate-git/">Deliberate Git</a>
314
+ </li>
315
+ <li class="post">
316
+ <a href="/blog/customize-your-irb/">Customize your IRB</a>
317
+ </li>
318
+ <li class="post">
319
+ <a href="/blog/program-like-a-videogamer/">Program like a Videogamer</a>
320
+ </li>
321
+ <li class="post">
322
+ <a href="/blog/gem-spotlight-interactive-editor/">Gem spotlight: interactive_editor</a>
323
+ </li>
324
+ <li class="post">
325
+ <a href="/blog/subscribing-to-rubytapas-using-downcast/">Subscribing to RubyTapas using Downcast</a>
326
+ </li>
327
+ </ul>
328
+ </section>
329
+ <section>
330
+ <h1>About Me</h1>
331
+ <img class="right" src="http://gravatar.com/avatar/aaa2b1f12b65d33422e8cdc48d70c0f9">
332
+ <p>My name is Stephen Ball. I started programming computers back in the 80s
333
+ by copying BASIC programs from 3-2-1 Contact into our Atari 800. Now I
334
+ program web applications using Ruby on Rails and CoffeeScript. I love every
335
+ minute of it.</p>
336
+ <p><a href="https://twitter.com/StephenBallNC" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @StephenBallNC</a>
337
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
338
+ </section>
339
+ <section>
340
+ <h1>Tweets for Rake Routes</h1>
341
+ <a class="twitter-timeline" href="https://twitter.com/search?q=rakeroutes" data-widget-id="395243196042579970">Tweets about &#8220;rakeroutes&#8221;</a>
342
+ <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
343
+ </section>
344
+ <section>
345
+ <h1>My Pinboard</h1>
346
+ <ul id="pinboard_linkroll">Fetching linkroll&#8230;</ul>
347
+ <p><a href="http://pinboard.in/u:xyzzyb">My Pinboard Bookmarks &raquo;</a></p>
348
+ </section>
349
+ <script type="text/javascript">var linkroll='pinboard_linkroll';var pinboard_user="xyzzyb";var pinboard_count=3;(function(){var pinboardInit=document.createElement('script');pinboardInit.type='text/javascript';pinboardInit.async=true;pinboardInit.src='/javascripts/pinboard.js';document.getElementsByTagName('head')[0].appendChild(pinboardInit);})();</script>
350
+ </aside>
351
+ </div>
352
+ </div>
353
+ <footer role="contentinfo"><p>
354
+ Copyright &copy; 2013 - Stephen Ball -
355
+ <span class="credit">Powered by <a href="http://octopress.org">Octopress</a></span>
356
+ </p>
357
+ </footer>
358
+ <script type="text/javascript">var disqus_shortname='xyzzyb';var disqus_script='count.js';(function(){var dsq=document.createElement('script');dsq.type='text/javascript';dsq.async=true;dsq.src='http://'+disqus_shortname+'.disqus.com/'+disqus_script;(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(dsq);}());</script>
359
+ <div id="fb-root"></div>
360
+ <script>(function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id)){return;}
361
+ js=d.createElement(s);js.id=id;js.src="//connect.facebook.net/en_US/all.js#appId=212934732101925&xfbml=1";fjs.parentNode.insertBefore(js,fjs);}(document,'script','facebook-jssdk'));</script>
362
+ <script type="text/javascript">(function(){var script=document.createElement('script');script.type='text/javascript';script.async=true;script.src='https://apis.google.com/js/plusone.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(script,s);})();</script>
363
+ <script type="text/javascript">(function(){var twitterWidgets=document.createElement('script');twitterWidgets.type='text/javascript';twitterWidgets.async=true;twitterWidgets.src='http://platform.twitter.com/widgets.js';document.getElementsByTagName('head')[0].appendChild(twitterWidgets);})();</script>
364
+ <a title="Real Time Analytics" href="http://getclicky.com/66509312"><img alt="Real Time Analytics" src="//static.getclicky.com/media/links/badge.gif" border="0"/></a>
365
+ <script type="text/javascript">var clicky_site_ids=clicky_site_ids||[];clicky_site_ids.push(66536397);(function(){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src='//static.getclicky.com/js';(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(s);})();</script>
366
+ </body>
367
+ </html>
368
+ http_version: '1.1'
369
+ adapter_metadata:
370
+ effective_url: HTTP://rakeroutes.com/
371
+ recorded_at: Tue, 03 Dec 2013 06:07:20 GMT
372
+ recorded_with: VCR 2.8.0
@@ -0,0 +1,101 @@
1
+ require_relative '../../lib/hwacha'
2
+ require 'vcr'
3
+
4
+ VCR.configure do |c|
5
+ c.cassette_library_dir = 'spec/fixtures/cassettes'
6
+ c.hook_into :typhoeus
7
+ end
8
+
9
+ describe Hwacha do
10
+ let(:url_with_success_response) { 'rakeroutes.com' }
11
+ let(:url_with_404_response) { 'rakeroutes.com/this-url-does-not-exist' }
12
+ let(:not_a_url) { '' }
13
+ let(:various_urls) do
14
+ [url_with_success_response, url_with_404_response, not_a_url]
15
+ end
16
+
17
+ describe "#check" do
18
+ it "yields when there is a successful web response" do
19
+ VCR.use_cassette('url_with_success_response') do
20
+ expect { |probe| subject.check(url_with_success_response, &probe) }.to yield_control
21
+ end
22
+ end
23
+
24
+ it "yields when there is not a successful web response" do
25
+ VCR.use_cassette('url_with_404_response') do
26
+ expect { |probe| subject.check(url_with_404_response, &probe) }.to yield_control
27
+ end
28
+ end
29
+
30
+ it "yields when there is no web response" do
31
+ VCR.use_cassette('not_a_url') do
32
+ expect { |probe| subject.check(not_a_url, &probe) }.to yield_control
33
+ end
34
+ end
35
+
36
+ it "yields the checked URL" do
37
+ VCR.use_cassette('url_with_success_response') do
38
+ subject.check(url_with_success_response) do |url, _|
39
+ expect(url).to eq "HTTP://%s/" % url_with_success_response
40
+ end
41
+ end
42
+ end
43
+
44
+ it "yields the web response" do
45
+ VCR.use_cassette('url_with_success_response') do
46
+ subject.check(url_with_success_response) do |_, response|
47
+ expect(response.success?).to be_true
48
+ end
49
+ end
50
+ end
51
+
52
+ it "checks an array of urls and executes the block for each" do
53
+ VCR.use_cassette('various_urls') do
54
+ urls_checked = 0
55
+
56
+ subject.check(various_urls) do |url, response|
57
+ urls_checked += 1
58
+ end
59
+
60
+ expect(urls_checked).to eq various_urls.size
61
+ end
62
+ end
63
+ end
64
+
65
+ describe "#find_existing" do
66
+ it "yields when there is a successful web response" do
67
+ VCR.use_cassette('url_with_success_response') do
68
+ expect { |probe| subject.find_existing(url_with_success_response, &probe) }.to yield_control
69
+ end
70
+ end
71
+
72
+ it "does not yield when there is not a successful web response" do
73
+ VCR.use_cassette('url_with_404_response') do
74
+ expect { |probe| subject.find_existing(url_with_404_response, &probe) }.to_not yield_control
75
+ end
76
+ end
77
+
78
+ it "yields the checked URL" do
79
+ VCR.use_cassette('url_with_success_response') do
80
+ subject.find_existing(url_with_success_response) do |url|
81
+ expect(url).to eq 'HTTP://%s/' % url_with_success_response
82
+ end
83
+ end
84
+ end
85
+
86
+ it "checks an array of URLs and executes the block for success responses" do
87
+ VCR.use_cassette('various_urls') do
88
+ successful_count = 0
89
+ successful_url = nil
90
+
91
+ subject.find_existing(various_urls) do |url|
92
+ successful_count += 1
93
+ successful_url = url
94
+ end
95
+
96
+ expect(successful_count).to eq 1
97
+ expect(successful_url).to match url_with_success_response
98
+ end
99
+ end
100
+ end
101
+ end
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hwacha
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Stephen Ball
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: typhoeus
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Harness the power of Typhoeus to quickly check webpage responses.
84
+ email:
85
+ - sdball@gmail.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - Gemfile.lock
93
+ - LICENSE
94
+ - README.md
95
+ - Rakefile
96
+ - hwacha.gemspec
97
+ - lib/hwacha.rb
98
+ - lib/hwacha/version.rb
99
+ - spec/fixtures/cassettes/not_a_url.yml
100
+ - spec/fixtures/cassettes/url_with_404_response.yml
101
+ - spec/fixtures/cassettes/url_with_success_response.yml
102
+ - spec/fixtures/cassettes/various_urls.yml
103
+ - spec/lib/hwacha_spec.rb
104
+ homepage: http://github.com/sdball/hwacha
105
+ licenses:
106
+ - MIT
107
+ metadata: {}
108
+ post_install_message:
109
+ rdoc_options: []
110
+ require_paths:
111
+ - lib
112
+ required_ruby_version: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ required_rubygems_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ requirements: []
123
+ rubyforge_project:
124
+ rubygems_version: 2.1.11
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Sometimes you just want to check a bunch of webpages. Hwacha makes it easy.
128
+ test_files:
129
+ - spec/fixtures/cassettes/not_a_url.yml
130
+ - spec/fixtures/cassettes/url_with_404_response.yml
131
+ - spec/fixtures/cassettes/url_with_success_response.yml
132
+ - spec/fixtures/cassettes/various_urls.yml
133
+ - spec/lib/hwacha_spec.rb