hwacha 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +37 -0
- data/LICENSE +20 -0
- data/README.md +99 -0
- data/Rakefile +7 -0
- data/hwacha.gemspec +27 -0
- data/lib/hwacha.rb +32 -0
- data/lib/hwacha/version.rb +3 -0
- data/spec/fixtures/cassettes/not_a_url.yml +24 -0
- data/spec/fixtures/cassettes/url_with_404_response.yml +43 -0
- data/spec/fixtures/cassettes/url_with_success_response.yml +311 -0
- data/spec/fixtures/cassettes/various_urls.yml +372 -0
- data/spec/lib/hwacha_spec.rb +101 -0
- metadata +133 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -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.
|
data/README.md
ADDED
@@ -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
|
+
|
data/Rakefile
ADDED
data/hwacha.gemspec
ADDED
@@ -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
|
data/lib/hwacha.rb
ADDED
@@ -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,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&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’s my talk “Deliberate Git” in blog post form.</p>
|
95
|
+
<p>There’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’d like to just read the slides they’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 →</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’ll take a look at the things I’ve
|
115
|
+
added to mine, and I’ll show you how to hack in a .irbrc_rails that’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 →</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 →</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’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 →</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’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’s easier than ever to stay current
|
164
|
+
with the videos.</p>
|
165
|
+
<p>Today I’m just going to share the steps required to add Ruby Tapas to Downcast
|
166
|
+
on your iPhone or iPad. It’s very easy, but it’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 →</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’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’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 →</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’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 →</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’s just too big to use it like a laptop monitor and fullscreen everything.</p>
|
207
|
+
<p>Instead, I’ve come up with a great window management solution that capitalizes on the monitor’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 →</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’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 →</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’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’m starting to get things settled into a new routine, so I’m finally carving out time to blog again!</p>
|
239
|
+
<p>I’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’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/">← 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 “rakeroutes”</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…</ul>
|
286
|
+
<p><a href="http://pinboard.in/u:xyzzyb">My Pinboard Bookmarks »</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 © 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&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’s my talk “Deliberate Git” in blog post form.</p>
|
156
|
+
<p>There’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’d like to just read the slides they’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 →</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’ll take a look at the things I’ve
|
176
|
+
added to mine, and I’ll show you how to hack in a .irbrc_rails that’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 →</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 →</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’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 →</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’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’s easier than ever to stay current
|
225
|
+
with the videos.</p>
|
226
|
+
<p>Today I’m just going to share the steps required to add Ruby Tapas to Downcast
|
227
|
+
on your iPhone or iPad. It’s very easy, but it’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 →</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’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’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 →</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’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 →</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’s just too big to use it like a laptop monitor and fullscreen everything.</p>
|
268
|
+
<p>Instead, I’ve come up with a great window management solution that capitalizes on the monitor’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 →</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’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 →</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’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’m starting to get things settled into a new routine, so I’m finally carving out time to blog again!</p>
|
300
|
+
<p>I’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’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/">← 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 “rakeroutes”</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…</ul>
|
347
|
+
<p><a href="http://pinboard.in/u:xyzzyb">My Pinboard Bookmarks »</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 © 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
|