technicalpickles-gemstalker 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Josh Nichols
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,24 @@
1
+ gemstalker
2
+ ==========
3
+
4
+ GemStalker is a small library to determine if GitHub has built a gem yet.
5
+
6
+ require 'gemstalker'
7
+
8
+ stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler', :version => '0.7.2'
9
+
10
+ if stalker.built?
11
+ puts "zomg, it's built, im so telling everyone"
12
+ if stalker.in_specfile?
13
+ puts "sweeeet, i can install it nao"
14
+ end
15
+ end
16
+
17
+ You can also omit the version, and it will take the version from the repository's gemspec on the master branch.
18
+
19
+ Origin code borrowed and inspired by hasmygembuiltyet.org.
20
+
21
+ COPYRIGHT
22
+ =========
23
+
24
+ Copyright (c) 2009 Josh Nichols. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,44 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "gemstalker"
9
+ gem.summary = "GemStalker is a small library to determine if GitHub has built a gem yet."
10
+ gem.email = "josh@technicalpickles.com"
11
+ gem.homepage = "http://github.com/technicalpickles/gemstalker"
12
+ gem.description = "A library for determining if GitHub has built a gem yet"
13
+ gem.authors = ["Josh Nichols"]
14
+ gem.files = FileList["[A-Z]*", "{bin,lib,test}/**/*"]
15
+ end
16
+ rescue LoadError
17
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
18
+ end
19
+
20
+ Rake::TestTask.new do |test|
21
+ test.libs << 'lib'
22
+ test.pattern = 'test/**/*_test.rb'
23
+ test.verbose = false
24
+ end
25
+
26
+ Rake::RDocTask.new do |rdoc|
27
+ rdoc.rdoc_dir = 'rdoc'
28
+ rdoc.title = 'gemstalker'
29
+ rdoc.options << '--line-numbers' << '--inline-source'
30
+ rdoc.rdoc_files.include('README*')
31
+ rdoc.rdoc_files.include('lib/**/*.rb')
32
+ end
33
+
34
+ begin
35
+ require 'rcov/rcovtask'
36
+ Rcov::RcovTask.new do |rcov|
37
+ rcov.libs << 'test'
38
+ rcov.test_files = FileList['test/**/*_test.rb']
39
+ rcov.verbose = true
40
+ end
41
+ rescue LoadError
42
+ end
43
+
44
+ task :default => :test
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :patch: 0
3
+ :major: 0
4
+ :minor: 3
data/bin/gemstalk ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__), '..', 'lib')
3
+ require 'gem_stalker'
4
+
5
+ def usage
6
+ puts ""
7
+ puts "Usage:"
8
+ puts ""
9
+ puts " #{File.basename $0} <username> <repository> [version]"
10
+ puts ""
11
+ puts "Begins stalking a gem at the specified location e.g. stalk techinicalpickles jeweler"
12
+ puts ""
13
+ end
14
+
15
+ if ARGV.length == 0 || ARGV.include?("-h") || ARGV.include?("--help")
16
+ usage
17
+ exit
18
+ end
19
+
20
+ trap "SIGINT" do
21
+ puts ""
22
+ puts "Stopping"
23
+ exit
24
+ end
25
+
26
+ options = {:username => ARGV[0], :repository => ARGV[1]}
27
+ options[:version] = ARGV[2] if ARGV.length >= 3
28
+ stalker = GemStalker.new(options)
29
+
30
+ $stdout.sync = true
31
+
32
+ unless stalker.gem?
33
+ puts "The repository is not configured as a rubygem yet."
34
+ puts "Go to the following url, and check 'RubyGem'"
35
+ puts "\t#{stalker.edit_repo_url}"
36
+ exit
37
+ end
38
+
39
+ if ARGV.length < 3
40
+ puts "Using version #{stalker.version}"
41
+ end
42
+
43
+ waiting = false
44
+
45
+ puts "Checking to see if the gem has been built:"
46
+ loop do
47
+ if stalker.built?
48
+ put "." if waiting
49
+ puts "=> Zomg, it's built, I'm so telling everyone!"
50
+ break
51
+ end
52
+ print "."
53
+ waiting = true
54
+ sleep(5)
55
+ end
56
+
57
+ waiting = false
58
+
59
+ puts "Checking to see if it is in the specfile"
60
+ loop do
61
+ if stalker.in_specfile?
62
+ put "." if waiting
63
+ puts "=> Sweeeet, everyone can install it now!"
64
+ break
65
+ end
66
+ print "."
67
+ waiting = true
68
+ sleep(5)
69
+ end
@@ -0,0 +1,77 @@
1
+ require 'net/http'
2
+ require 'rubygems/spec_fetcher'
3
+
4
+ class GemStalker
5
+ attr_accessor :username, :name, :repository, :version
6
+
7
+ def initialize(options = {})
8
+ @username = options[:username]
9
+ @repository = options[:repository]
10
+ @version = options[:version] || determine_version
11
+
12
+ end
13
+
14
+ def built?
15
+ Net::HTTP.start('gems.github.com') {|http|
16
+ response = http.head(gem_path)
17
+ response.code == "200"
18
+ }
19
+ end
20
+
21
+ def gem?
22
+ Net::HTTP.start('github.com') {|http|
23
+ res = http.get(master_path)
24
+ return res.body =~ /alt\=.Rubygem./ if res.code == "200"
25
+ }
26
+ false
27
+ end
28
+
29
+ def in_specfile?
30
+ fetcher = Gem::SpecFetcher.new
31
+ specs = fetcher.load_specs(URI.parse('http://gems.github.com/'), 'specs')
32
+ specs.any? do |(name, spec)|
33
+ name == gem_name && spec.version.to_s == @version
34
+ end
35
+ end
36
+
37
+ def edit_repo_url
38
+ "http://github.com/#{@username}/#{@repository}/edit"
39
+ end
40
+
41
+ protected
42
+
43
+ def gem_path
44
+ "/gems/#{gem_name}-#{@version}.gem"
45
+ end
46
+
47
+ def gem_name
48
+ "#{@username}-#{@repository}"
49
+ end
50
+
51
+ def gemspec_path
52
+ # TODO this seems very unfuture proof, and also specific to master branch...
53
+ "/#{@username}/#{@repository}/blob/master/#{@repository}.gemspec?raw=true"
54
+ end
55
+
56
+ def master_path
57
+ "/#{@username}/#{@repository}/tree/master"
58
+ end
59
+
60
+
61
+
62
+ def determine_version
63
+ res = nil
64
+ Net::HTTP.start('github.com') {|http|
65
+ res = http.get(gemspec_path)
66
+ }
67
+
68
+ if res.code == "200"
69
+ gemspec_file = res.body
70
+ gemspec = nil
71
+ # TODO this assumes Ruby format, but GitHub is cool with YAML
72
+ Thread.new { gemspec = eval("$SAFE = 3\n#{gemspec_file}") }.join
73
+ gemspec.version.to_s
74
+ end
75
+ end
76
+
77
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class GemstalkerTest < Test::Unit::TestCase
4
+
5
+ context "a stalker for a specific version of a gem that has not been built" do
6
+ setup do
7
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler', :version => '0.9.3')
8
+ end
9
+
10
+ should "not be built yet" do
11
+ assert ! @stalker.built?
12
+ end
13
+
14
+ should "not be in specfile yet" do
15
+ assert ! @stalker.in_specfile?
16
+ end
17
+ end
18
+
19
+ context "a stalker for a specific version of a gem that has been built and is available" do
20
+ setup do
21
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler', :version => '0.8.1')
22
+ end
23
+
24
+ should "be built" do
25
+ assert @stalker.built?
26
+ end
27
+
28
+ should "be in specfile" do
29
+ assert @stalker.in_specfile?
30
+ end
31
+ end
32
+
33
+ context "a stalker without a specific version of a gem that has been built" do
34
+ setup do
35
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'jeweler')
36
+ end
37
+
38
+ should "determine version" do
39
+ assert_equal '0.8.1', @stalker.version
40
+ end
41
+
42
+ should "be built" do
43
+ assert @stalker.built?
44
+ end
45
+
46
+ should "be in specfile" do
47
+ assert @stalker.in_specfile?
48
+ end
49
+
50
+ should "be a gem" do
51
+ assert @stalker.gem?
52
+ end
53
+ end
54
+
55
+ context "a stalker for something not marked as a gem" do
56
+ setup do
57
+ @stalker = GemStalker.new(:username => 'technicalpickles', :repository => 'bostonrb')
58
+ end
59
+
60
+ should "not be a gem" do
61
+ assert ! @stalker.gem?
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,565 @@
1
+ HTTP/1.1 200 OK
2
+ Server: nginx/0.6.31
3
+ Date: Fri, 13 Feb 2009 20:42:33 GMT
4
+ Content-Type: text/html; charset=utf-8
5
+ Connection: keep-alive
6
+ Set-Cookie: _github_ses=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D--884981fc5aa85daf318eeff084d98e2cff92578f; path=/; expires=Wed, 01 Jan 2020 08:00:00 GMT; HttpOnly
7
+ Status: 200 OK
8
+ X-Runtime: 246ms
9
+ ETag: "1c00ed4642a98376fce3133a7177c84d"
10
+ Cache-Control: private, max-age=0, must-revalidate
11
+ Content-Length: 23314
12
+
13
+
14
+
15
+
16
+
17
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
18
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
19
+
20
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
21
+ <head>
22
+ <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
23
+ <title>technicalpickles's bostonrb at master - GitHub</title>
24
+ <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
25
+ <link rel="fluid-icon" href="http://github.com/fluidicon.png" title="GitHub" />
26
+
27
+
28
+ <link href="http://assets3.github.com/stylesheets/bundle.css?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" media="screen" rel="stylesheet" type="text/css" />
29
+
30
+
31
+
32
+
33
+ <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
34
+ <script src="http://assets2.github.com/javascripts/bundle.js?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" type="text/javascript"></script>
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+ <link href="http://github.com/feeds/technicalpickles/commits/bostonrb/master" rel="alternate" title="Recent Commits to bostonrb:master" type="application/atom+xml" />
43
+
44
+ <meta name="description" content="Website for bostonrb.org" />
45
+
46
+
47
+
48
+ </head>
49
+
50
+
51
+
52
+ <body>
53
+
54
+
55
+ <div id="main">
56
+ <div id="header" class="">
57
+ <div class="site">
58
+ <div class="logo">
59
+ <a href="http://github.com"><img src="/images/modules/header/logov3.png" alt="github" /></a>
60
+ </div>
61
+
62
+ <div class="actions">
63
+ <a href="http://github.com/">Home</a>
64
+ <a href="/plans"><b><u>Pricing and Signup</u></b></a>
65
+ <a href="/popular/forked">Repositories</a>
66
+ <a href="/guides">Guides</a>
67
+ <a href="/blog">Blog</a>
68
+ <a href="/login">Login</a>
69
+ </div>
70
+
71
+ </div>
72
+ </div>
73
+
74
+
75
+
76
+
77
+
78
+ <div id="repo_menu">
79
+ <div class="site">
80
+ <ul>
81
+
82
+ <li class="active"><a href="http://github.com/technicalpickles/bostonrb/tree/master">Source</a></li>
83
+
84
+ <li class=""><a href="http://github.com/technicalpickles/bostonrb/commits/master">Commits</a></li>
85
+
86
+ <li class=""><a href="/technicalpickles/bostonrb/network">Network (7)</a></li>
87
+
88
+
89
+
90
+ <li class=""><a href="/technicalpickles/bostonrb/downloads">Downloads (0)</a></li>
91
+
92
+ <li class=""><a href="http://wiki.github.com/technicalpickles/bostonrb">Wiki (1)</a></li>
93
+
94
+ <li class=""><a href="/technicalpickles/bostonrb/graphs">Graphs</a></li>
95
+
96
+
97
+
98
+
99
+ </ul>
100
+ </div>
101
+ </div>
102
+
103
+
104
+ <div id="repo_sub_menu">
105
+ <div class="site">
106
+ <div class="joiner"></div>
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+ <ul>
115
+ <li>
116
+ <a class="active" href="/technicalpickles/bostonrb/tree/master">master</a>
117
+ </li>
118
+ <li>
119
+ <a href="#">all branches</a>
120
+ <ul>
121
+
122
+
123
+ <li><a href="/technicalpickles/bostonrb/tree/master">master</a></li>
124
+
125
+
126
+ </ul>
127
+ </li>
128
+ <li>
129
+ <a href="#">all tags</a>
130
+
131
+ </li>
132
+ </ul>
133
+
134
+
135
+ </div>
136
+ </div>
137
+
138
+ <div class="site">
139
+
140
+
141
+
142
+
143
+
144
+
145
+ <div id="repos">
146
+
147
+
148
+
149
+
150
+
151
+ <div class="repo public">
152
+ <div class="title">
153
+ <div class="path">
154
+ <a href="/technicalpickles">technicalpickles</a> / <b><a href="http://github.com/technicalpickles/bostonrb/tree">bostonrb</a></b>
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+ <a href="/signup" class="toggle_watch"><img alt="watch" class="button" src="http://assets2.github.com/images/modules/repos/watch_button.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></a><a href="/signup" class="toggle_watch" style="display:none;"><img alt="watch" class="button" src="http://assets1.github.com/images/modules/repos/unwatch_button.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></a>
169
+
170
+
171
+ <a href="#" id="download_button" rel="http://github.com/technicalpickles/bostonrb/archives/master"><img alt="download tarball" class="button" src="http://assets1.github.com/images/modules/repos/download_button.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></a>
172
+
173
+
174
+ </div>
175
+
176
+ <div class="security private_security" style="display:none">
177
+ <a href="#private_repo" rel="facebox"><img src="/images/icons/private.png" alt="private" /></a>
178
+ </div>
179
+
180
+ <div id="private_repo" class="hidden">
181
+ This repository is private.
182
+ All pages are served over SSL and all pushing and pulling is done over SSH.
183
+ No one may fork, clone, or view it unless they are added as a <a href="/technicalpickles/bostonrb/edit">member</a>.
184
+
185
+ <br/>
186
+ <br/>
187
+ Every repository with this icon (<img src="/images/icons/private.png" alt="private" />) is private.
188
+ </div>
189
+
190
+ <div class="security public_security" style="">
191
+ <a href="#public_repo" rel="facebox"><img src="/images/icons/public.png" alt="public" /></a>
192
+ </div>
193
+
194
+ <div id="public_repo" class="hidden">
195
+ This repository is public.
196
+ Anyone may fork, clone, or view it.
197
+
198
+ <br/>
199
+ <br/>
200
+ Every repository with this icon (<img src="/images/icons/public.png" alt="public" />) is public.
201
+ </div>
202
+
203
+
204
+
205
+ <div class="flexipill">
206
+ <a href="/technicalpickles/bostonrb/network">
207
+ <table cellpadding="0" cellspacing="0">
208
+ <tr><td><img alt="Forks" src="http://assets3.github.com/images/modules/repos/pills/forks.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></td><td class="middle"><span>7</span></td><td><img alt="Right" src="http://assets0.github.com/images/modules/repos/pills/right.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></td></tr>
209
+ </table>
210
+ </a>
211
+ </div>
212
+
213
+ <div class="flexipill">
214
+ <a href="/technicalpickles/bostonrb/watchers">
215
+ <table cellpadding="0" cellspacing="0">
216
+ <tr><td><img alt="Watchers" src="http://assets3.github.com/images/modules/repos/pills/watchers.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></td><td class="middle"><span>2</span></td><td><img alt="Right" src="http://assets0.github.com/images/modules/repos/pills/right.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /></td></tr>
217
+ </table>
218
+ </a>
219
+ </div>
220
+ </div>
221
+ <div class="meta">
222
+ <table>
223
+
224
+ <tr>
225
+ <td class="label" colspan="2">
226
+ <em>Fork of <a href="/bostonrb/bostonrb/tree">bostonrb/bostonrb</a></em>
227
+ </td>
228
+ </tr>
229
+
230
+
231
+ <tr>
232
+ <td class="label">Description:</td>
233
+ <td>
234
+ <span id="repository_description" rel="/technicalpickles/bostonrb/edit/update" class="">Website for bostonrb.org</span>
235
+
236
+ </td>
237
+ </tr>
238
+
239
+
240
+
241
+
242
+ <tr>
243
+ <td class="label">Homepage:</td>
244
+ <td>
245
+
246
+
247
+ <a href="http://bostonrb.org">http://bostonrb.org</a>
248
+
249
+ </td>
250
+ </tr>
251
+
252
+
253
+
254
+ <tr>
255
+ <td class="label">Clone&nbsp;URL:</td>
256
+
257
+ <td>
258
+ <a href="git://github.com/technicalpickles/bostonrb.git" class="git_url_facebox" rel="#git-clone">git://github.com/technicalpickles/bostonrb.git</a>
259
+ <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
260
+ width="110"
261
+ height="14"
262
+ id="clippy" >
263
+ <param name="movie" value="/flash/clippy.swf"/>
264
+ <param name="allowScriptAccess" value="always" />
265
+ <param name="quality" value="high" />
266
+ <param name="scale" value="noscale" />
267
+ <param NAME="FlashVars" value="text=git://github.com/technicalpickles/bostonrb.git">
268
+ <param name="bgcolor" value="#F0F0F0">
269
+ <embed src="/flash/clippy.swf"
270
+ width="110"
271
+ height="14"
272
+ name="clippy"
273
+ quality="high"
274
+ allowScriptAccess="always"
275
+ type="application/x-shockwave-flash"
276
+ pluginspage="http://www.macromedia.com/go/getflashplayer"
277
+ FlashVars="text=git://github.com/technicalpickles/bostonrb.git"
278
+ bgcolor="#F0F0F0"
279
+ />
280
+ </object>
281
+
282
+ <div id="git-clone" style="display:none;">
283
+ Give this clone URL to anyone.
284
+ <br/>
285
+ <code>git clone git://github.com/technicalpickles/bostonrb.git </code>
286
+ </div>
287
+ </td>
288
+ </tr>
289
+
290
+
291
+
292
+
293
+
294
+
295
+
296
+ </table>
297
+
298
+ </div>
299
+ </div>
300
+
301
+
302
+
303
+
304
+ </div>
305
+
306
+
307
+ <div id="commit">
308
+ <div class="group">
309
+
310
+ <div class="envelope commit">
311
+ <div class="human">
312
+
313
+ <div class="message"><pre><a href="/technicalpickles/bostonrb/commit/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1">Removed old quietbacktrace.</a> </pre></div>
314
+
315
+
316
+ <div class="actor">
317
+ <div class="gravatar">
318
+
319
+ <img alt="" height="30" src="http://www.gravatar.com/avatar/1c1aabc1abed5cce37b192dd00f0f28c?s=30&amp;d=http%3A%2F%2Fgithub.com%2Fimages%2Fgravatars%2Fgravatar-30.png" width="30" />
320
+ </div>
321
+ <div class="name"><a href="/technicalpickles">technicalpickles</a> <span>(author)</span></div>
322
+ <div class="date">
323
+ <abbr class="relatize" title="2008-10-11 22:38:37">Sat Oct 11 22:38:37 -0700 2008</abbr>
324
+ </div>
325
+ </div>
326
+
327
+
328
+
329
+ </div>
330
+ <div class="machine">
331
+ <span>c</span>ommit&nbsp;&nbsp;<a href="/technicalpickles/bostonrb/commit/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1" hotkey="c">8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1</a><br />
332
+ <span>t</span>ree&nbsp;&nbsp;&nbsp;&nbsp;<a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1" hotkey="t">01f4280d8bcd3c90c330c987c09147dda2f23e43</a><br />
333
+
334
+
335
+ <span>p</span>arent&nbsp;
336
+
337
+ <a href="/technicalpickles/bostonrb/tree/eb57cd053c25bd68e9b6f7fe0e8e02d2ba55167a" hotkey="p">eb57cd053c25bd68e9b6f7fe0e8e02d2ba55167a</a>
338
+
339
+
340
+ </div>
341
+ </div>
342
+
343
+ </div>
344
+ </div>
345
+
346
+
347
+
348
+
349
+ <div id="path">
350
+ <b><a href="/technicalpickles/bostonrb/tree">bostonrb</a></b> /
351
+ </div>
352
+
353
+
354
+
355
+
356
+ <script type="text/javascript">
357
+ GitHub.currentTreeSHA = "8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1"
358
+ GitHub.rootTreeSHA = "8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1"
359
+ GitHub.currentPath = ""
360
+ </script>
361
+
362
+
363
+ <div id="browser">
364
+ <table cellpadding="0" cellspacing="0">
365
+ <tr>
366
+ <th></th>
367
+ <th>name</th>
368
+ <th>age</th>
369
+ <th>
370
+ <div class="history">
371
+ <a href="/technicalpickles/bostonrb/commits/master/">history</a>
372
+ </div>
373
+ message
374
+ </th>
375
+ </tr>
376
+
377
+
378
+
379
+
380
+ <tr class="alt">
381
+ <td class="icon"> <img alt="file" src="http://assets2.github.com/images/icons/txt.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
382
+ <td class="content"> <a href="/technicalpickles/bostonrb/blob/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/.gitignore" id="3410b4c5ca09bd3b80cb7f5ad1a539d1d116b396">.gitignore</a></td>
383
+
384
+ <td class="age"> <span class="relatize">Wed May 28 21:15:59 -0700 2008</span> </td>
385
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/c169dfce5d91eaeca725cb00815877d334457f25" class="message">Added metrics stuff to gitignore.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
386
+ </tr>
387
+
388
+ <tr class="">
389
+ <td class="icon"> <img alt="file" src="http://assets2.github.com/images/icons/txt.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
390
+ <td class="content"> <a href="/technicalpickles/bostonrb/blob/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/.svnignore" id="1a306a628e7c1a902ad4e7529e0670145a9a9605">.svnignore</a></td>
391
+
392
+ <td class="age"> <span class="relatize">Tue May 27 17:41:55 -0700 2008</span> </td>
393
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/a69e68af4fc4ca637f7fbc579f2bb2a546543004" class="message">Initial import.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
394
+ </tr>
395
+
396
+ <tr class="alt">
397
+ <td class="icon"> <img alt="file" src="http://assets2.github.com/images/icons/txt.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
398
+ <td class="content"> <a href="/technicalpickles/bostonrb/blob/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/Capfile" id="edcdddca15972462ccec61e422ca2c73a51f872b">Capfile</a></td>
399
+
400
+ <td class="age"> <span class="relatize">Tue May 27 18:34:06 -0700 2008</span> </td>
401
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/50491df2638c12f8b6ab91b4bb354a7a425d1bbc" class="message">Use local deploy.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
402
+ </tr>
403
+
404
+ <tr class="">
405
+ <td class="icon"> <img alt="file" src="http://assets2.github.com/images/icons/txt.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
406
+ <td class="content"> <a href="/technicalpickles/bostonrb/blob/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/README" id="93c9bcb42f29768e9be9a4560e54ba9619294297">README</a></td>
407
+
408
+ <td class="age"> <span class="relatize">Tue May 27 17:41:55 -0700 2008</span> </td>
409
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/a69e68af4fc4ca637f7fbc579f2bb2a546543004" class="message">Initial import.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
410
+ </tr>
411
+
412
+ <tr class="alt">
413
+ <td class="icon"> <img alt="file" src="http://assets2.github.com/images/icons/txt.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
414
+ <td class="content"> <a href="/technicalpickles/bostonrb/blob/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/Rakefile" id="ecffcd6facdc4dc8eb38ffaffd4db8287b7dc8be">Rakefile</a></td>
415
+
416
+ <td class="age"> <span class="relatize">Tue May 27 17:41:55 -0700 2008</span> </td>
417
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/a69e68af4fc4ca637f7fbc579f2bb2a546543004" class="message">Initial import.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
418
+ </tr>
419
+
420
+ <tr class="">
421
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
422
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/app" id="eb637070b1ec9bfc22646b4e255c348a876567f3">app/</a></td>
423
+
424
+ <td class="age"> <span class="relatize">Tue Oct 07 17:20:02 -0700 2008</span> </td>
425
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/39d509fc4db5b44273225c6f18356f3ab095b1f9" class="message">Fixed geocoding.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
426
+ </tr>
427
+
428
+ <tr class="alt">
429
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
430
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/config" id="6ab6abb13a3075b35ed881976ccc6fb3c0584671">config/</a></td>
431
+
432
+ <td class="age"> <span class="relatize">Tue Oct 07 17:42:36 -0700 2008</span> </td>
433
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/ce7086b8ace01bf460cd21766dd84e63ef4fca8e" class="message">Fixing ruby-debug dependency.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
434
+ </tr>
435
+
436
+ <tr class="">
437
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
438
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/db" id="0a3a78fd30d03f9755b567a6f7e2b4140b1f34a3">db/</a></td>
439
+
440
+ <td class="age"> <span class="relatize">Tue Sep 23 21:54:58 -0700 2008</span> </td>
441
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/034423e89f546acffc80e1a14ee079736426b2b4" class="message">Use cached html, durnit.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
442
+ </tr>
443
+
444
+ <tr class="alt">
445
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
446
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/doc" id="154705c6aa1c8ead8c99c7915373e3c44012057f">doc/</a></td>
447
+
448
+ <td class="age"> <span class="relatize">Tue May 27 17:41:55 -0700 2008</span> </td>
449
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/a69e68af4fc4ca637f7fbc579f2bb2a546543004" class="message">Initial import.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
450
+ </tr>
451
+
452
+ <tr class="">
453
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
454
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/lib" id="7aa4e04cc62cae12fed864cc2f977cfeea68d86e">lib/</a></td>
455
+
456
+ <td class="age"> <span class="relatize">Sat May 31 10:11:27 -0700 2008</span> </td>
457
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/e4e2946ae0d8ee6a6663eee4e87f98f433dc4477" class="message">writing Array#halve method</a> [<a href="/dancroak">dancroak</a>] </td>
458
+ </tr>
459
+
460
+ <tr class="alt">
461
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
462
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/log" id="d564d0bc3dd917926892c55e3706cc116d5b165e">log/</a></td>
463
+
464
+ <td class="age"> <span class="relatize">Wed May 28 20:48:55 -0700 2008</span> </td>
465
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/110b465ff7a8dc4ce9a316b6fe296143953348cd" class="message">Trying to keep logs working...</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
466
+ </tr>
467
+
468
+ <tr class="">
469
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
470
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/public" id="c9b38ffe80ceb93d134ee3f4fd78286c73346a1e">public/</a></td>
471
+
472
+ <td class="age"> <span class="relatize">Wed Oct 08 22:20:31 -0700 2008</span> </td>
473
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/eb57cd053c25bd68e9b6f7fe0e8e02d2ba55167a" class="message">Adding a file, for Yahoo API signup.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
474
+ </tr>
475
+
476
+ <tr class="alt">
477
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
478
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/script" id="5b4ed4ab5b65e1fa8d4a1f9cd6602eb89dce74b7">script/</a></td>
479
+
480
+ <td class="age"> <span class="relatize">Tue Jul 01 17:17:05 -0700 2008</span> </td>
481
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/5540b73902dde34b65c45fe615b917fc68c63603" class="message">Upgraded to Rails 2.1\!</a> [thoughtbot] </td>
482
+ </tr>
483
+
484
+ <tr class="">
485
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
486
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/test" id="5cd86ff77b4ce302840fda1b880677564edc7d3a">test/</a></td>
487
+
488
+ <td class="age"> <span class="relatize">Tue Oct 07 17:20:02 -0700 2008</span> </td>
489
+ <td class="message"> <a href="/technicalpickles/bostonrb/commit/39d509fc4db5b44273225c6f18356f3ab095b1f9" class="message">Fixed geocoding.</a> [<a href="/technicalpickles">technicalpickles</a>] </td>
490
+ </tr>
491
+
492
+ <tr class="alt">
493
+ <td class="icon"> <img alt="directory" src="http://assets1.github.com/images/icons/dir.png?82188d2a7557f7d8fc32b3c99ad7d0356ed69b5f" /> </td>
494
+ <td class="content"> <a href="/technicalpickles/bostonrb/tree/8e0031c958d7f3358a2c92c1a9d9ecca3b7960b1/vendor" id="65cc07730489199efbcd42a5124d2a6f8b0cba9d">vendor/</a></td>
495
+
496
+ <td class="age"> </td>
497
+ <td class="message"> <span id="loading_commit_data">Loading commit data... <img src="/images/modules/ajax/indicator.gif"/></span> </td>
498
+ </tr>
499
+
500
+ </table>
501
+ </div>
502
+
503
+
504
+
505
+
506
+
507
+
508
+ <div id="readme" class="announce"><span class="name"></span><div class="plain"><pre>
509
+
510
+ This needs to be called by cron:
511
+ PATH_TO_APP/script/runner Project.download_entries</pre></div></div>
512
+
513
+ </div>
514
+
515
+
516
+
517
+ <div class="push"></div>
518
+ </div>
519
+
520
+ <div id="footer">
521
+ <div class="site">
522
+ <div class="info">
523
+ <div class="links">
524
+ <a href="http://github.com/blog/148-github-shirts-now-available">Shirts</a> |
525
+ <a href="http://github.com/blog">Blog</a> |
526
+ <a href="http://support.github.com/">Support</a> |
527
+ <a href="http://github.com/training">Training</a> |
528
+ <a href="http://github.com/contact">Contact</a> |
529
+ <a href="http://groups.google.com/group/github/">Google Group</a> |
530
+ <a href="http://github.com/guides/the-github-api">API</a> |
531
+ <a href="http://twitter.com/github">Status</a>
532
+ </div>
533
+ <div class="company">
534
+ <span id="_rrt" title="0.20003s from xc88-s00008">GitHub</span>
535
+ is <a href="http://logicalawesome.com/">Logical Awesome</a> &copy;2009 | <a href="/site/terms">Terms of Service</a> | <a href="/site/privacy">Privacy Policy</a>
536
+ </div>
537
+ </div>
538
+ <div class="sponsor">
539
+ <a href="http://engineyard.com"><img src="/images/modules/footer/engine_yard_logo.png" alt="Engine Yard" /></a>
540
+ <div>
541
+ Hosting provided by our<br /> partners at Engine Yard
542
+ </div>
543
+ </div>
544
+ </div>
545
+ </div>
546
+
547
+ <div id="coming_soon" style="display:none;">
548
+ This feature is coming soon. Sit tight!
549
+ </div>
550
+
551
+
552
+ <script type="text/javascript">
553
+ var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
554
+ document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
555
+ </script>
556
+ <script type="text/javascript">
557
+ var pageTracker = _gat._getTracker("UA-3769691-2");
558
+ pageTracker._initData();
559
+ pageTracker._trackPageview();
560
+ </script>
561
+
562
+
563
+ </body>
564
+ </html>
565
+