hwacha 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
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
+ c.allow_http_connections_when_no_cassette = true
8
+ c.configure_rspec_metadata!
9
+ end
10
+
11
+ success_url_vcr_options = { :cassette_name => 'success_url' }
12
+ not_found_url_vcr_options = { :cassette_name => '404_url' }
13
+
14
+ describe Hwacha do
15
+ describe "checking a site that returns HTTP 200", :vcr => success_url_vcr_options do
16
+ let(:url) { 'http://rakeroutes.com/' }
17
+
18
+ it "visits the site and gets a valid response" do
19
+ subject.check(url) do |url, response|
20
+ expect(url.downcase).to eq url
21
+ expect(response.code).to eq 200
22
+ expect(response.body).to include 'Rake Routes'
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "checking a site that returns HTTP 404", :vcr => not_found_url_vcr_options do
28
+ let(:url) { 'http://rakeroutes.com/this-page-does-not-exist' }
29
+ it "visits the site and records the 404 status" do
30
+ subject.check(url) do |url, response|
31
+ expect(url.downcase).to eq url
32
+ expect(response.code).to eq 404
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,26 @@
1
+ require_relative '../../../lib/hwacha'
2
+
3
+ describe Hwacha::Config do
4
+ describe "#options" do
5
+ context "when no options are set" do
6
+ it "is an empty hash" do
7
+ expect(subject.options).to be == {}
8
+ end
9
+ end
10
+
11
+ context "when max_concurrent_requests is set" do
12
+ let(:max_concurrent_requests) { 50 }
13
+ let(:concurrency_option) do
14
+ { :max_concurrency => max_concurrent_requests }
15
+ end
16
+
17
+ before do
18
+ subject.max_concurrent_requests = max_concurrent_requests
19
+ end
20
+
21
+ it "exports as max_concurrency in a hash" do
22
+ expect(subject.options).to include concurrency_option
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,118 +1,135 @@
1
1
  require_relative '../../lib/hwacha'
2
- require 'vcr'
3
2
 
4
- VCR.configure do |c|
5
- c.cassette_library_dir = 'spec/fixtures/cassettes'
6
- c.hook_into :typhoeus
3
+ RSpec.configure do |config|
4
+ config.before :each do
5
+ Typhoeus::Expectation.clear
6
+ end
7
7
  end
8
8
 
9
9
  describe Hwacha, "initialization" do
10
10
  it "defaults to 20 max concurrent requests" do
11
- expect(Hwacha.new.max_concurrent_requests).to eq 20
11
+ expect(Hwacha.new.config.max_concurrent_requests).to eq 20
12
12
  end
13
13
 
14
14
  it "takes an integer argument to set the number of max concurrent requests" do
15
- expect(Hwacha.new(10).max_concurrent_requests).to eq 10
15
+ expect(Hwacha.new(10).config.max_concurrent_requests).to eq 10
16
16
  end
17
17
 
18
18
  it "can set max_concurrent_requests via a configuration object" do
19
19
  hwacha = Hwacha.new do |config|
20
20
  config.max_concurrent_requests = 10
21
21
  end
22
- expect(hwacha.max_concurrent_requests).to eq 10
22
+ expect(hwacha.config.max_concurrent_requests).to eq 10
23
+ end
24
+ end
25
+
26
+ describe Hwacha, "Typhoeus configuration" do
27
+ describe "#build_hydra" do
28
+ context "when max_concurrent_requests is set" do
29
+ subject do
30
+ Hwacha.new do |config|
31
+ config.max_concurrent_requests = max_concurrent_requests
32
+ end
33
+ end
34
+
35
+ let(:max_concurrent_requests) { 10 }
36
+
37
+ it "sets max_concurrency from max_concurrent_requests" do
38
+ expect(subject.build_hydra.max_concurrency).to eq max_concurrent_requests
39
+ end
40
+ end
23
41
  end
24
42
  end
25
43
 
26
- describe Hwacha, "instance methods" do
44
+ describe Hwacha, "url checking" do
27
45
  let(:url_with_success_response) { 'rakeroutes.com' }
28
46
  let(:url_with_404_response) { 'rakeroutes.com/this-url-does-not-exist' }
29
47
  let(:not_a_url) { '' }
30
48
  let(:various_urls) do
31
49
  [url_with_success_response, url_with_404_response, not_a_url]
32
50
  end
51
+ let(:http_200_response) do
52
+ Typhoeus::Response.new({
53
+ :code => 200,
54
+ :body => "Hwacha!",
55
+ :effective_url => "HTTP://#{url_with_success_response}/",
56
+ })
57
+ end
58
+ let(:http_404_response) do
59
+ Typhoeus::Response.new({
60
+ :code => 404,
61
+ :body => "404",
62
+ :effective_url => "HTTP://#{url_with_404_response}/",
63
+ })
64
+ end
65
+
66
+ before do
67
+ Typhoeus.stub(url_with_success_response).and_return(http_200_response)
68
+ Typhoeus.stub(url_with_404_response).and_return(http_404_response)
69
+ end
33
70
 
34
71
  describe "#check" do
35
72
  it "yields when there is a successful web response" do
36
- VCR.use_cassette('url_with_success_response') do
37
- expect { |probe| subject.check(url_with_success_response, &probe) }.to yield_control
38
- end
73
+ expect { |probe| subject.check(url_with_success_response, &probe) }.to yield_control
39
74
  end
40
75
 
41
76
  it "yields when there is not a successful web response" do
42
- VCR.use_cassette('url_with_404_response') do
43
- expect { |probe| subject.check(url_with_404_response, &probe) }.to yield_control
44
- end
77
+ expect { |probe| subject.check(url_with_404_response, &probe) }.to yield_control
45
78
  end
46
79
 
47
80
  it "yields when there is no web response" do
48
- VCR.use_cassette('not_a_url') do
49
- expect { |probe| subject.check(not_a_url, &probe) }.to yield_control
50
- end
81
+ expect { |probe| subject.check(not_a_url, &probe) }.to yield_control
51
82
  end
52
83
 
53
84
  it "yields the checked URL" do
54
- VCR.use_cassette('url_with_success_response') do
55
- subject.check(url_with_success_response) do |url, _|
56
- expect(url).to eq "HTTP://%s/" % url_with_success_response
57
- end
85
+ subject.check(url_with_success_response) do |url, _|
86
+ expect(url).to eq "HTTP://%s/" % url_with_success_response
58
87
  end
59
88
  end
60
89
 
61
90
  it "yields the web response" do
62
- VCR.use_cassette('url_with_success_response') do
63
- subject.check(url_with_success_response) do |_, response|
64
- expect(response.success?).to be_true
65
- end
91
+ subject.check(url_with_success_response) do |_, response|
92
+ expect(response.success?).to be_true
66
93
  end
67
94
  end
68
95
 
69
96
  it "checks an array of urls and executes the block for each" do
70
- VCR.use_cassette('various_urls') do
71
- urls_checked = 0
72
-
73
- subject.check(various_urls) do |url, response|
74
- urls_checked += 1
75
- end
97
+ urls_checked = 0
76
98
 
77
- expect(urls_checked).to eq various_urls.size
99
+ subject.check(various_urls) do |url, response|
100
+ urls_checked += 1
78
101
  end
102
+
103
+ expect(urls_checked).to eq various_urls.size
79
104
  end
80
105
  end
81
106
 
82
107
  describe "#find_existing" do
83
108
  it "yields when there is a successful web response" do
84
- VCR.use_cassette('url_with_success_response') do
85
- expect { |probe| subject.find_existing(url_with_success_response, &probe) }.to yield_control
86
- end
109
+ expect { |probe| subject.find_existing(url_with_success_response, &probe) }.to yield_control
87
110
  end
88
111
 
89
112
  it "does not yield when there is not a successful web response" do
90
- VCR.use_cassette('url_with_404_response') do
91
- expect { |probe| subject.find_existing(url_with_404_response, &probe) }.to_not yield_control
92
- end
113
+ expect { |probe| subject.find_existing(url_with_404_response, &probe) }.to_not yield_control
93
114
  end
94
115
 
95
116
  it "yields the checked URL" do
96
- VCR.use_cassette('url_with_success_response') do
97
- subject.find_existing(url_with_success_response) do |url|
98
- expect(url).to eq 'HTTP://%s/' % url_with_success_response
99
- end
117
+ subject.find_existing(url_with_success_response) do |url|
118
+ expect(url).to eq 'HTTP://%s/' % url_with_success_response
100
119
  end
101
120
  end
102
121
 
103
122
  it "checks an array of URLs and executes the block for success responses" do
104
- VCR.use_cassette('various_urls') do
105
- successful_count = 0
106
- successful_url = nil
123
+ successful_count = 0
124
+ successful_url = nil
107
125
 
108
- subject.find_existing(various_urls) do |url|
109
- successful_count += 1
110
- successful_url = url
111
- end
112
-
113
- expect(successful_count).to eq 1
114
- expect(successful_url).to match url_with_success_response
126
+ subject.find_existing(various_urls) do |url|
127
+ successful_count += 1
128
+ successful_url = url
115
129
  end
130
+
131
+ expect(successful_count).to eq 1
132
+ expect(successful_url).to match url_with_success_response
116
133
  end
117
134
  end
118
135
  end
metadata CHANGED
@@ -1,27 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hwacha
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Ball
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-05 00:00:00.000000000 Z
11
+ date: 2014-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
@@ -42,42 +42,42 @@ dependencies:
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: vcr
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description: Harness the power of Typhoeus to quickly check webpage responses.
@@ -98,10 +98,10 @@ files:
98
98
  - lib/hwacha.rb
99
99
  - lib/hwacha/config.rb
100
100
  - lib/hwacha/version.rb
101
- - spec/fixtures/cassettes/not_a_url.yml
102
- - spec/fixtures/cassettes/url_with_404_response.yml
103
- - spec/fixtures/cassettes/url_with_success_response.yml
104
- - spec/fixtures/cassettes/various_urls.yml
101
+ - spec/fixtures/cassettes/404_url.yml
102
+ - spec/fixtures/cassettes/success_url.yml
103
+ - spec/integration/hwacha_spec.rb
104
+ - spec/lib/hwacha/config_spec.rb
105
105
  - spec/lib/hwacha_spec.rb
106
106
  homepage: http://github.com/sdball/hwacha
107
107
  licenses:
@@ -113,23 +113,23 @@ require_paths:
113
113
  - lib
114
114
  required_ruby_version: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ! '>='
116
+ - - '>='
117
117
  - !ruby/object:Gem::Version
118
118
  version: '0'
119
119
  required_rubygems_version: !ruby/object:Gem::Requirement
120
120
  requirements:
121
- - - ! '>='
121
+ - - '>='
122
122
  - !ruby/object:Gem::Version
123
123
  version: '0'
124
124
  requirements: []
125
125
  rubyforge_project:
126
- rubygems_version: 2.1.11
126
+ rubygems_version: 2.0.14
127
127
  signing_key:
128
128
  specification_version: 4
129
129
  summary: Sometimes you just want to check a bunch of webpages. Hwacha makes it easy.
130
130
  test_files:
131
- - spec/fixtures/cassettes/not_a_url.yml
132
- - spec/fixtures/cassettes/url_with_404_response.yml
133
- - spec/fixtures/cassettes/url_with_success_response.yml
134
- - spec/fixtures/cassettes/various_urls.yml
131
+ - spec/fixtures/cassettes/404_url.yml
132
+ - spec/fixtures/cassettes/success_url.yml
133
+ - spec/integration/hwacha_spec.rb
134
+ - spec/lib/hwacha/config_spec.rb
135
135
  - spec/lib/hwacha_spec.rb
@@ -1,24 +0,0 @@
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
@@ -1,372 +0,0 @@
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