technicalpickles-gemstalker 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+