hwacha 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.gitignore +3 -0
- data/Gemfile.lock +1 -1
- data/lib/hwacha.rb +7 -3
- data/lib/hwacha/config.rb +11 -0
- data/lib/hwacha/version.rb +1 -1
- data/spec/fixtures/cassettes/{url_with_404_response.yml → 404_url.yml} +20 -9
- data/spec/fixtures/cassettes/{url_with_success_response.yml → success_url.yml} +429 -89
- data/spec/integration/hwacha_spec.rb +36 -0
- data/spec/lib/hwacha/config_spec.rb +26 -0
- data/spec/lib/hwacha_spec.rb +69 -52
- metadata +21 -21
- data/spec/fixtures/cassettes/not_a_url.yml +0 -24
- data/spec/fixtures/cassettes/various_urls.yml +0 -372
@@ -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
|
data/spec/lib/hwacha_spec.rb
CHANGED
@@ -1,118 +1,135 @@
|
|
1
1
|
require_relative '../../lib/hwacha'
|
2
|
-
require 'vcr'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
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, "
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
55
|
-
|
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
|
-
|
63
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
97
|
-
|
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
|
-
|
105
|
-
|
106
|
-
successful_url = nil
|
123
|
+
successful_count = 0
|
124
|
+
successful_url = nil
|
107
125
|
|
108
|
-
|
109
|
-
|
110
|
-
|
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.
|
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-
|
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/
|
102
|
-
- spec/fixtures/cassettes/
|
103
|
-
- spec/
|
104
|
-
- spec/
|
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.
|
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/
|
132
|
-
- spec/fixtures/cassettes/
|
133
|
-
- spec/
|
134
|
-
- spec/
|
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&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
|