gh 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -0
- data/gh.gemspec +2 -0
- data/lib/gh.rb +4 -1
- data/lib/gh/cache.rb +3 -10
- data/lib/gh/lazy_loader.rb +1 -1
- data/lib/gh/nested_resources.rb +49 -0
- data/lib/gh/normalizer.rb +1 -4
- data/lib/gh/pagination.rb +10 -1
- data/lib/gh/parallel.rb +55 -0
- data/lib/gh/remote.rb +18 -17
- data/lib/gh/version.rb +1 -1
- data/lib/gh/wrapper.rb +19 -2
- data/spec/normalizer_spec.rb +0 -2
- data/spec/pagination_spec.rb +4 -0
- data/spec/parallel_spec.rb +45 -0
- data/spec/payloads/users/rkh/repos?page=2&per_page=100.yml +49 -0
- data/spec/payloads/users/rkh/repos?per_page=100.yml +121 -0
- data/spec/payloads/users/rkh?per_page=100.yml +21 -0
- data/spec/remote_spec.rb +6 -0
- data/spec/spec_helper.rb +1 -1
- metadata +46 -14
data/README.md
CHANGED
@@ -17,6 +17,7 @@ This will by default use all the middleware that ships with GH, in the following
|
|
17
17
|
* `GH::LazyLoader` - will load missing fields when accessed (handy for dealing with incomplete data without sending to many requests)
|
18
18
|
* `GH::MergeCommit` - adds infos about merge commits to pull request payloads
|
19
19
|
* `GH::LinkFollower` - will add content of hypermedia links as fields (lazyly), allows you to traverse relations
|
20
|
+
* `GH::Pagination` - adds support for transparent pagination
|
20
21
|
* `GH::Instrumentation` - let's you instrument `gh`
|
21
22
|
|
22
23
|
## Main Entry Points
|
data/gh.gemspec
CHANGED
@@ -23,4 +23,6 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency 'backports', '~> 2.3'
|
24
24
|
s.add_runtime_dependency 'multi_json', '~> 1.0'
|
25
25
|
s.add_runtime_dependency 'addressable'
|
26
|
+
s.add_runtime_dependency 'net-http-persistent'
|
27
|
+
s.add_runtime_dependency 'net-http-pipeline'
|
26
28
|
end
|
data/lib/gh.rb
CHANGED
@@ -6,12 +6,14 @@ module GH
|
|
6
6
|
autoload :Cache, 'gh/cache'
|
7
7
|
autoload :Case, 'gh/case'
|
8
8
|
autoload :Error, 'gh/error'
|
9
|
+
autoload :FaradayAdapter, 'gh/faraday_adapter'
|
9
10
|
autoload :Instrumentation, 'gh/instrumentation'
|
10
11
|
autoload :LazyLoader, 'gh/lazy_loader'
|
11
12
|
autoload :LinkFollower, 'gh/link_follower'
|
12
13
|
autoload :MergeCommit, 'gh/merge_commit'
|
13
14
|
autoload :Normalizer, 'gh/normalizer'
|
14
15
|
autoload :Pagination, 'gh/pagination'
|
16
|
+
autoload :Parallel, 'gh/parallel'
|
15
17
|
autoload :Remote, 'gh/remote'
|
16
18
|
autoload :Response, 'gh/response'
|
17
19
|
autoload :ResponseWrapper, 'gh/response_wrapper'
|
@@ -35,10 +37,11 @@ module GH
|
|
35
37
|
end
|
36
38
|
|
37
39
|
extend SingleForwardable
|
38
|
-
def_delegators :current, :api_host, :[], :reset, :load, :post, :delete, :patch, :put
|
40
|
+
def_delegators :current, :api_host, :[], :reset, :load, :post, :delete, :patch, :put, :in_parallel, :in_parallel?
|
39
41
|
|
40
42
|
DefaultStack = Stack.new do
|
41
43
|
use Instrumentation
|
44
|
+
use Parallel
|
42
45
|
use Pagination
|
43
46
|
use LinkFollower
|
44
47
|
use MergeCommit
|
data/lib/gh/cache.rb
CHANGED
@@ -43,19 +43,12 @@ module GH
|
|
43
43
|
clear_partial or clear_all
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
#
|
50
|
-
# Github::Cache.new['users/rkh'] # => { ... }
|
51
|
-
#
|
52
|
-
# Returns the Response.
|
53
|
-
def [](key)
|
46
|
+
private
|
47
|
+
|
48
|
+
def fetch_resource(key)
|
54
49
|
cache.fetch(prefixed(key)) { super }
|
55
50
|
end
|
56
51
|
|
57
|
-
private
|
58
|
-
|
59
52
|
def clear_partial
|
60
53
|
return false unless cache.respond_to? :delete_matched
|
61
54
|
pattern = "^" << Regexp.escape(prefixed(""))
|
data/lib/gh/lazy_loader.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'gh'
|
2
|
+
|
3
|
+
module GH
|
4
|
+
# Public: ...
|
5
|
+
class NestedResources < Wrapper
|
6
|
+
wraps GH::Normalizer
|
7
|
+
double_dispatch
|
8
|
+
|
9
|
+
def modify_hash(hash, loaded = false)
|
10
|
+
hash = super(hash)
|
11
|
+
link = hash['_links'].try(:[], 'self') unless loaded
|
12
|
+
set_links hash, Addressable::URI.parse(link['href']) if link
|
13
|
+
hash
|
14
|
+
end
|
15
|
+
|
16
|
+
def add(hash, link, name, path = name)
|
17
|
+
hash["_links"][name] ||= { "href" => nested(link, path) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def nested(link, path)
|
21
|
+
new_link = link.dup
|
22
|
+
if path.start_with? '/'
|
23
|
+
new_link.path = path
|
24
|
+
else
|
25
|
+
new_link.path += path
|
26
|
+
end
|
27
|
+
new_link
|
28
|
+
end
|
29
|
+
|
30
|
+
def set_links(hash, link)
|
31
|
+
case link.path
|
32
|
+
when '/gists'
|
33
|
+
add hash, link, 'public'
|
34
|
+
add hash, link, 'starred'
|
35
|
+
when %r{^/repos/[^/]+/[^/]+$}
|
36
|
+
add hash, link, 'commits', 'git/commits'
|
37
|
+
add hash, link, 'refs', 'git/refs'
|
38
|
+
add hash, link, 'tags', 'git/tags'
|
39
|
+
add hash, link, 'issues'
|
40
|
+
when %r{^/repos/[^/]+/[^/]+/issues/\d+$}
|
41
|
+
add hash, link, 'comments'
|
42
|
+
add hash, link, 'events'
|
43
|
+
when '/user'
|
44
|
+
add hash, link, 'gists', '/gists'
|
45
|
+
add hash, link, 'issues', '/issues'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/gh/normalizer.rb
CHANGED
@@ -4,10 +4,7 @@ require 'time'
|
|
4
4
|
module GH
|
5
5
|
# Public: A Wrapper class that deals with normalizing Github responses.
|
6
6
|
class Normalizer < Wrapper
|
7
|
-
|
8
|
-
#
|
9
|
-
# Returns normalized Response.
|
10
|
-
def [](key)
|
7
|
+
def generate_response(key, response)
|
11
8
|
result = super
|
12
9
|
links(result)['self'] ||= { 'href' => full_url(key).to_s } if result.respond_to? :to_hash
|
13
10
|
result
|
data/lib/gh/pagination.rb
CHANGED
@@ -18,6 +18,7 @@ module GH
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def [](value)
|
21
|
+
raise TypeError, "index has to be an Integer, got #{value.class}" unless value.is_a? Integer
|
21
22
|
return @page[value] if value < @page.size
|
22
23
|
next_page[value - @page.size]
|
23
24
|
end
|
@@ -32,8 +33,16 @@ module GH
|
|
32
33
|
wraps GH::Normalizer
|
33
34
|
double_dispatch
|
34
35
|
|
36
|
+
def fetch_resource(key)
|
37
|
+
url = full_url(key)
|
38
|
+
params = url.query_values || {}
|
39
|
+
params['per_page'] ||= 100
|
40
|
+
url.query_values = params
|
41
|
+
super url.request_uri
|
42
|
+
end
|
43
|
+
|
35
44
|
def modify_response(response)
|
36
|
-
return response unless response.headers['link'] =~ /<([^>]+)>;\s*rel=\"next\"/
|
45
|
+
return response unless response.respond_to? :to_ary and response.headers['link'] =~ /<([^>]+)>;\s*rel=\"next\"/
|
37
46
|
Paginated.new(response, $1, self)
|
38
47
|
end
|
39
48
|
end
|
data/lib/gh/parallel.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'gh'
|
2
|
+
require 'thread'
|
3
|
+
require 'backports/basic_object' unless defined? BasicObject
|
4
|
+
|
5
|
+
module GH
|
6
|
+
# Public: ...
|
7
|
+
class Parallel < Wrapper
|
8
|
+
class Dummy < BasicObject
|
9
|
+
attr_accessor :__delegate__
|
10
|
+
def method_missing(*args)
|
11
|
+
::Kernel.raise ::RuntimeError, "response not yet loaded" if __delegate__.nil?
|
12
|
+
__delegate__.__send__(*args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup(*)
|
17
|
+
@in_parallel = false
|
18
|
+
@mutex = Mutex.new
|
19
|
+
@queue = []
|
20
|
+
super
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate_response(key, response)
|
24
|
+
return super unless in_parallel?
|
25
|
+
dummy = Dummy.new
|
26
|
+
@mutex.synchronize { @queue << [dummy, key, response] }
|
27
|
+
dummy
|
28
|
+
end
|
29
|
+
|
30
|
+
def in_parallel(&block)
|
31
|
+
return yield if in_parallel?
|
32
|
+
was, @in_parallel = @in_parallel, true
|
33
|
+
result = connection.in_parallel(&block)
|
34
|
+
@mutex.synchronize do
|
35
|
+
@queue.each { |dummy, key, response| dummy.__delegate__ = backend.generate_response(key, response) }
|
36
|
+
@queue.clear
|
37
|
+
end
|
38
|
+
result
|
39
|
+
ensure
|
40
|
+
@in_parallel = was unless was.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
def in_parallel?
|
44
|
+
@in_parallel
|
45
|
+
end
|
46
|
+
|
47
|
+
def connection
|
48
|
+
@connection ||= begin
|
49
|
+
layer = backend
|
50
|
+
layer = layer.backend until layer.respond_to? :connection
|
51
|
+
layer.connection
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/gh/remote.rb
CHANGED
@@ -47,7 +47,7 @@ module GH
|
|
47
47
|
builder.request(:basic_auth, username, password) if username and password
|
48
48
|
builder.request(:retry)
|
49
49
|
builder.response(:raise_error)
|
50
|
-
builder.
|
50
|
+
builder.use(options[:adapter] || GH::FaradayAdapter)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -56,17 +56,13 @@ module GH
|
|
56
56
|
"#<#{self.class}: #{api_host}>"
|
57
57
|
end
|
58
58
|
|
59
|
-
#
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
#
|
65
|
-
|
66
|
-
# Raises Faraday::Error::ClientError if the resource returns a status between 400 and 599.
|
67
|
-
# Returns the Response.
|
68
|
-
def [](key)
|
69
|
-
response = frontend.http(:get, path_for(key), headers)
|
59
|
+
# Internal: ...
|
60
|
+
def fetch_resource(key)
|
61
|
+
frontend.http(:get, path_for(key), headers)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Internal: ...
|
65
|
+
def generate_response(key, response)
|
70
66
|
modify(response.body, response.headers)
|
71
67
|
end
|
72
68
|
|
@@ -80,27 +76,27 @@ module GH
|
|
80
76
|
response = frontend.http(verb, path_for(key), headers) do |req|
|
81
77
|
req.body = Response.new({}, body).to_s if body
|
82
78
|
end
|
83
|
-
|
79
|
+
frontend.generate_response(key, response)
|
84
80
|
end
|
85
81
|
|
86
82
|
# Public: ...
|
87
83
|
def post(key, body)
|
88
|
-
request(:post, key, body)
|
84
|
+
frontend.request(:post, key, body)
|
89
85
|
end
|
90
86
|
|
91
87
|
# Public: ...
|
92
88
|
def delete(key)
|
93
|
-
request(:delete, key)
|
89
|
+
frontend.request(:delete, key)
|
94
90
|
end
|
95
91
|
|
96
92
|
# Public: ...
|
97
93
|
def patch(key, body)
|
98
|
-
request(:patch, key, body)
|
94
|
+
frontend.request(:patch, key, body)
|
99
95
|
end
|
100
96
|
|
101
97
|
# Public: ...
|
102
98
|
def put(key, body)
|
103
|
-
request(:put, key, body)
|
99
|
+
frontend.request(:put, key, body)
|
104
100
|
end
|
105
101
|
|
106
102
|
# Public: ...
|
@@ -112,6 +108,11 @@ module GH
|
|
112
108
|
modify(data)
|
113
109
|
end
|
114
110
|
|
111
|
+
# Public: ...
|
112
|
+
def in_parallel
|
113
|
+
raise RuntimeError, "use GH::Parallel middleware for #in_parallel support"
|
114
|
+
end
|
115
|
+
|
115
116
|
private
|
116
117
|
|
117
118
|
def identifier(key)
|
data/lib/gh/version.rb
CHANGED
data/lib/gh/wrapper.rb
CHANGED
@@ -33,6 +33,9 @@ module GH
|
|
33
33
|
# Internal: ...
|
34
34
|
def_delegator :backend, :http
|
35
35
|
|
36
|
+
# Internal: ...
|
37
|
+
def_delegator :backend, :request
|
38
|
+
|
36
39
|
# Public: ...
|
37
40
|
def_delegator :backend, :post
|
38
41
|
|
@@ -43,7 +46,16 @@ module GH
|
|
43
46
|
def_delegator :backend, :patch
|
44
47
|
|
45
48
|
# Public: ...
|
46
|
-
def_delegator :
|
49
|
+
def_delegator :backend, :put
|
50
|
+
|
51
|
+
# Public: ...
|
52
|
+
def_delegator :backend, :fetch_resource
|
53
|
+
|
54
|
+
# Public: ...
|
55
|
+
def_delegator :backend, :in_parallel
|
56
|
+
|
57
|
+
# Public: ...
|
58
|
+
def_delegator :backend, :in_parallel?
|
47
59
|
|
48
60
|
# Public: Retrieves resources from Github.
|
49
61
|
def self.[](key)
|
@@ -55,7 +67,12 @@ module GH
|
|
55
67
|
# By default, this method is delegated to the next layer on the stack
|
56
68
|
# and modify is called.
|
57
69
|
def [](key)
|
58
|
-
|
70
|
+
generate_response key, fetch_resource(key)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Internal: ...
|
74
|
+
def generate_response(key, resource)
|
75
|
+
modify backend.generate_response(key, resource)
|
59
76
|
end
|
60
77
|
|
61
78
|
# Internal: Get/set default layer to wrap when creating a new instance.
|
data/spec/normalizer_spec.rb
CHANGED
@@ -185,7 +185,6 @@ describe GH::Normalizer do
|
|
185
185
|
normalized.should include('author')
|
186
186
|
normalized.should include('committer')
|
187
187
|
normalized['author'].should be == 'me'
|
188
|
-
normalized['author'].should be_equal(normalized['committer'])
|
189
188
|
end
|
190
189
|
|
191
190
|
it 'copies committer to author' do
|
@@ -193,7 +192,6 @@ describe GH::Normalizer do
|
|
193
192
|
normalized.should include('author')
|
194
193
|
normalized.should include('committer')
|
195
194
|
normalized['author'].should be == 'me'
|
196
|
-
normalized['author'].should be_equal(normalized['committer'])
|
197
195
|
end
|
198
196
|
|
199
197
|
it 'does not override committer or author if both exist' do
|
data/spec/pagination_spec.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GH::Parallel do
|
4
|
+
before do
|
5
|
+
stub_request(:get, "https://api.github.com/users/rkh").to_return(:status => 200, :body => '{"name": "Konstantin Haase"}')
|
6
|
+
stub_request(:get, "https://api.github.com/users/svenfuchs").to_return(:status => 200, :body => '{"name": "Sven Fuchs"}')
|
7
|
+
stub_request(:get, "https://api.github.com/users/rkh?per_page=100").to_return(:status => 200, :body => '{"name": "Konstantin Haase"}')
|
8
|
+
stub_request(:get, "https://api.github.com/users/svenfuchs?per_page=100").to_return(:status => 200, :body => '{"name": "Sven Fuchs"}')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'allows normal requests' do
|
12
|
+
GH['users/rkh']['name'].should be == 'Konstantin Haase'
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'sets in_parallel?' do
|
16
|
+
GH.should_not be_in_parallel
|
17
|
+
GH.in_parallel { GH.should be_in_parallel }
|
18
|
+
GH.should_not be_in_parallel
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'runs requests in parallel' do
|
22
|
+
GH::DefaultStack.replace GH::MockBackend, GH::Remote
|
23
|
+
GH.current = nil
|
24
|
+
GH.should_not be_in_parallel
|
25
|
+
|
26
|
+
a = b = nil
|
27
|
+
GH.in_parallel do
|
28
|
+
GH.should be_in_parallel
|
29
|
+
|
30
|
+
a = GH['users/rkh']
|
31
|
+
b = GH['users/svenfuchs']
|
32
|
+
|
33
|
+
expect { a['name'] }.to raise_error(RuntimeError)
|
34
|
+
expect { b['name'] }.to raise_error(RuntimeError)
|
35
|
+
end
|
36
|
+
|
37
|
+
a['name'].should be == "Konstantin Haase"
|
38
|
+
b['name'].should be == "Sven Fuchs"
|
39
|
+
|
40
|
+
a.should respond_to('to_hash')
|
41
|
+
b.should respond_to('to_hash')
|
42
|
+
|
43
|
+
GH.should_not be_in_parallel
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
- !binary "c2VydmVy": !binary |-
|
3
|
+
bmdpbngvMS4wLjEz
|
4
|
+
!binary "ZGF0ZQ==": !binary |-
|
5
|
+
V2VkLCAyMyBNYXkgMjAxMiAxMzo1OTozNiBHTVQ=
|
6
|
+
!binary "Y29udGVudC10eXBl": !binary |-
|
7
|
+
YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
|
8
|
+
!binary "dHJhbnNmZXItZW5jb2Rpbmc=": !binary |-
|
9
|
+
Y2h1bmtlZA==
|
10
|
+
!binary "Y29ubmVjdGlvbg==": !binary |-
|
11
|
+
a2VlcC1hbGl2ZQ==
|
12
|
+
!binary "c3RhdHVz": !binary |-
|
13
|
+
MjAwIE9L
|
14
|
+
!binary "eC1yYXRlbGltaXQtbGltaXQ=": !binary |-
|
15
|
+
NTAwMA==
|
16
|
+
!binary "ZXRhZw==": !binary |-
|
17
|
+
IjNhMWFkMzc4N2NiZDkwNGQ2NDk4YzllODA5NWZlODY0Ig==
|
18
|
+
!binary "bGluaw==": !binary |-
|
19
|
+
PGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vdXNlcnMvcmtoL3JlcG9zP3BhZ2U9
|
20
|
+
MSZwZXJfcGFnZT0xMDA+OyByZWw9ImZpcnN0IiwgPGh0dHBzOi8vYXBpLmdp
|
21
|
+
dGh1Yi5jb20vdXNlcnMvcmtoL3JlcG9zP3BhZ2U9MSZwZXJfcGFnZT0xMDA+
|
22
|
+
OyByZWw9InByZXYi
|
23
|
+
!binary "eC1yYXRlbGltaXQtcmVtYWluaW5n": !binary |-
|
24
|
+
NDk5Nw==
|
25
|
+
- ! '[{"html_url":"https://github.com/rkh/hpi","pushed_at":"2011-10-28T21:56:35Z","updated_at":"2012-04-10T11:37:21Z","homepage":null,"url":"https://api.github.com/repos/rkh/hpi","has_downloads":true,"watchers":10,"fork":false,"svn_url":"https://github.com/rkh/hpi","has_wiki":true,"has_issues":true,"size":168,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"hpi","language":"Ruby","description":null,"clone_url":"https://github.com/rkh/hpi.git","ssh_url":"git@github.com:rkh/hpi.git","git_url":"git://github.com/rkh/hpi.git","created_at":"2011-10-07T23:55:05Z","id":2536005,"open_issues":0},{"html_url":"https://github.com/rkh/tool","pushed_at":"2011-10-27T02:01:35Z","updated_at":"2011-10-27T02:01:35Z","homepage":null,"url":"https://api.github.com/repos/rkh/tool","has_downloads":true,"watchers":1,"fork":false,"svn_url":"https://github.com/rkh/tool","has_wiki":true,"has_issues":true,"size":140,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"tool","language":"Ruby","description":null,"clone_url":"https://github.com/rkh/tool.git","ssh_url":"git@github.com:rkh/tool.git","git_url":"git://github.com/rkh/tool.git","created_at":"2011-10-27T01:50:56Z","id":2655239,"open_issues":0},{"html_url":"https://github.com/rkh/twp","pushed_at":"2011-12-15T09:10:41Z","updated_at":"2012-02-11T19:56:48Z","homepage":"http://www.dcl.hpi.uni-potsdam.de/teaching/mds/","url":"https://api.github.com/repos/rkh/twp","has_downloads":true,"watchers":5,"fork":false,"svn_url":"https://github.com/rkh/twp","has_wiki":true,"has_issues":true,"size":256,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"twp","language":"Ruby","description":"TWP3
|
26
|
+
in Ruby","clone_url":"https://github.com/rkh/twp.git","ssh_url":"git@github.com:rkh/twp.git","git_url":"git://github.com/rkh/twp.git","created_at":"2011-12-11T23:01:21Z","id":2960627,"open_issues":0},{"html_url":"https://github.com/rkh/fibur","pushed_at":"2011-12-19T19:07:32Z","updated_at":"2011-12-19T19:07:33Z","homepage":"","url":"https://api.github.com/repos/rkh/fibur","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/fibur","has_wiki":true,"has_issues":false,"size":112,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"fibur","language":"Ruby","description":"Concurrent
|
27
|
+
execution during Ruby I/O","clone_url":"https://github.com/rkh/fibur.git","ssh_url":"git@github.com:rkh/fibur.git","git_url":"git://github.com/rkh/fibur.git","created_at":"2011-12-19T19:06:39Z","id":3014283,"open_issues":0},{"html_url":"https://github.com/rkh/rkelly","pushed_at":"2012-01-09T20:27:16Z","updated_at":"2012-01-09T20:27:16Z","homepage":"","url":"https://api.github.com/repos/rkh/rkelly","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/rkelly","has_wiki":true,"has_issues":false,"size":336,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"rkelly","language":"Ruby","description":"Pure
|
28
|
+
ruby javascript parser and interpreter.","clone_url":"https://github.com/rkh/rkelly.git","ssh_url":"git@github.com:rkh/rkelly.git","git_url":"git://github.com/rkh/rkelly.git","created_at":"2012-01-09T20:25:53Z","id":3139761,"open_issues":0},{"html_url":"https://github.com/rkh/curriculum","pushed_at":"2012-01-10T16:30:53Z","updated_at":"2012-01-14T12:17:49Z","homepage":"","url":"https://api.github.com/repos/rkh/curriculum","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/curriculum","has_wiki":true,"has_issues":false,"size":132,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"curriculum","language":"JavaScript","description":"","clone_url":"https://github.com/rkh/curriculum.git","ssh_url":"git@github.com:rkh/curriculum.git","git_url":"git://github.com/rkh/curriculum.git","created_at":"2012-01-10T16:28:11Z","id":3146605,"open_issues":0},{"html_url":"https://github.com/rkh/fog","pushed_at":"2012-01-12T15:40:22Z","updated_at":"2012-02-26T06:24:48Z","homepage":"http://fog.io","url":"https://api.github.com/repos/rkh/fog","has_downloads":true,"watchers":3,"fork":true,"svn_url":"https://github.com/rkh/fog","has_wiki":true,"has_issues":false,"size":180,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"fog","language":"Ruby","description":"The
|
29
|
+
Ruby cloud services library.","clone_url":"https://github.com/rkh/fog.git","ssh_url":"git@github.com:rkh/fog.git","git_url":"git://github.com/rkh/fog.git","created_at":"2012-01-12T15:32:01Z","id":3163178,"open_issues":0},{"html_url":"https://github.com/rkh/test-project-1","pushed_at":"2012-05-16T12:08:44Z","updated_at":"2012-05-16T12:08:44Z","homepage":"http://travis-ci.org","url":"https://api.github.com/repos/rkh/test-project-1","has_downloads":true,"watchers":0,"fork":true,"svn_url":"https://github.com/rkh/test-project-1","has_wiki":true,"has_issues":false,"size":152,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"test-project-1","language":"Ruby","description":"Test
|
30
|
+
dummy repository for testing Travis CI","clone_url":"https://github.com/rkh/test-project-1.git","ssh_url":"git@github.com:rkh/test-project-1.git","git_url":"git://github.com/rkh/test-project-1.git","created_at":"2012-02-13T15:17:57Z","id":3431064,"open_issues":1},{"html_url":"https://github.com/rkh/oh-my-zsh","pushed_at":"2012-02-22T13:48:52Z","updated_at":"2012-03-07T21:11:13Z","homepage":"http://twitter.com/ohmyzsh","url":"https://api.github.com/repos/rkh/oh-my-zsh","has_downloads":true,"watchers":2,"fork":true,"svn_url":"https://github.com/rkh/oh-my-zsh","has_wiki":true,"has_issues":false,"size":7224,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"oh-my-zsh","language":"Shell","description":"A
|
31
|
+
community-driven framework for managing your zsh configuration. Includes 40+ optional
|
32
|
+
plugins (rails, git, OSX, hub, capistrano, brew, ant, macports, etc), over 80 terminal
|
33
|
+
themes to spice up your morning, and an auto-update tool so that makes it easy
|
34
|
+
to keep up with the latest updates from the community.","clone_url":"https://github.com/rkh/oh-my-zsh.git","ssh_url":"git@github.com:rkh/oh-my-zsh.git","git_url":"git://github.com/rkh/oh-my-zsh.git","created_at":"2012-02-22T13:47:54Z","id":3514933,"open_issues":0},{"html_url":"https://github.com/rkh/rbenv-use","pushed_at":"2012-02-22T16:53:26Z","updated_at":"2012-03-27T15:54:20Z","homepage":"","url":"https://api.github.com/repos/rkh/rbenv-use","has_downloads":true,"watchers":10,"fork":false,"svn_url":"https://github.com/rkh/rbenv-use","has_wiki":true,"has_issues":true,"size":108,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"rbenv-use","language":"Shell","description":"rbenv
|
35
|
+
use rbx","clone_url":"https://github.com/rkh/rbenv-use.git","ssh_url":"git@github.com:rkh/rbenv-use.git","git_url":"git://github.com/rkh/rbenv-use.git","created_at":"2012-02-22T13:51:59Z","id":3514966,"open_issues":0},{"html_url":"https://github.com/rkh/rbenv-whatis","pushed_at":"2012-02-22T13:52:54Z","updated_at":"2012-04-24T20:50:23Z","homepage":null,"url":"https://api.github.com/repos/rkh/rbenv-whatis","has_downloads":true,"watchers":5,"fork":false,"svn_url":"https://github.com/rkh/rbenv-whatis","has_wiki":true,"has_issues":true,"size":84,"private":false,"mirror_url":null,"forks":2,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"rbenv-whatis","language":"Shell","description":null,"clone_url":"https://github.com/rkh/rbenv-whatis.git","ssh_url":"git@github.com:rkh/rbenv-whatis.git","git_url":"git://github.com/rkh/rbenv-whatis.git","created_at":"2012-02-22T13:52:44Z","id":3514978,"open_issues":0},{"html_url":"https://github.com/rkh/sinatra-template","pushed_at":"2012-03-14T15:07:40Z","updated_at":"2012-03-14T15:07:41Z","homepage":"","url":"https://api.github.com/repos/rkh/sinatra-template","has_downloads":true,"watchers":6,"fork":false,"svn_url":"https://github.com/rkh/sinatra-template","has_wiki":true,"has_issues":true,"size":124,"private":false,"mirror_url":null,"forks":5,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"sinatra-template","language":"Ruby","description":"base
|
36
|
+
template for classic sinatra apps","clone_url":"https://github.com/rkh/sinatra-template.git","ssh_url":"git@github.com:rkh/sinatra-template.git","git_url":"git://github.com/rkh/sinatra-template.git","created_at":"2012-02-25T13:39:12Z","id":3544708,"open_issues":0},{"html_url":"https://github.com/rkh/rbenv-update","pushed_at":"2012-02-25T14:17:43Z","updated_at":"2012-05-17T00:03:11Z","homepage":"","url":"https://api.github.com/repos/rkh/rbenv-update","has_downloads":true,"watchers":3,"fork":false,"svn_url":"https://github.com/rkh/rbenv-update","has_wiki":true,"has_issues":true,"size":84,"private":false,"mirror_url":null,"forks":2,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"rbenv-update","language":"Shell","description":"update
|
37
|
+
rbenv and plugins","clone_url":"https://github.com/rkh/rbenv-update.git","ssh_url":"git@github.com:rkh/rbenv-update.git","git_url":"git://github.com/rkh/rbenv-update.git","created_at":"2012-02-25T14:17:01Z","id":3544886,"open_issues":1},{"html_url":"https://github.com/rkh/call-for-proposals","pushed_at":"2012-03-06T09:42:48Z","updated_at":"2012-03-06T09:42:48Z","homepage":"","url":"https://api.github.com/repos/rkh/call-for-proposals","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/call-for-proposals","has_wiki":true,"has_issues":false,"size":160,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"call-for-proposals","language":null,"description":"Want
|
38
|
+
to make a talk proposal for EuRuKo 2012? This is the place to be!","clone_url":"https://github.com/rkh/call-for-proposals.git","ssh_url":"git@github.com:rkh/call-for-proposals.git","git_url":"git://github.com/rkh/call-for-proposals.git","created_at":"2012-02-29T14:04:31Z","id":3582162,"open_issues":0},{"html_url":"https://github.com/rkh/socialshareprivacy","pushed_at":"2012-03-01T11:20:47Z","updated_at":"2012-03-01T11:21:49Z","homepage":"","url":"https://api.github.com/repos/rkh/socialshareprivacy","has_downloads":true,"watchers":1,"fork":false,"svn_url":"https://github.com/rkh/socialshareprivacy","has_wiki":false,"has_issues":false,"size":216,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"socialshareprivacy","language":"JavaScript","description":"this
|
39
|
+
is just a mirror","clone_url":"https://github.com/rkh/socialshareprivacy.git","ssh_url":"git@github.com:rkh/socialshareprivacy.git","git_url":"git://github.com/rkh/socialshareprivacy.git","created_at":"2012-03-01T11:20:28Z","id":3591314,"open_issues":0},{"html_url":"https://github.com/rkh/Smallest-Federated-Wiki","pushed_at":"2012-03-01T21:36:10Z","updated_at":"2012-03-01T21:36:11Z","homepage":"http://wardcunningham.github.com/","url":"https://api.github.com/repos/rkh/Smallest-Federated-Wiki","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/Smallest-Federated-Wiki","has_wiki":true,"has_issues":false,"size":112,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"Smallest-Federated-Wiki","language":"JavaScript","description":"Our
|
40
|
+
new wiki innovates three ways. It shares through federation, composes by refactoring
|
41
|
+
and wraps data with visualization.","clone_url":"https://github.com/rkh/Smallest-Federated-Wiki.git","ssh_url":"git@github.com:rkh/Smallest-Federated-Wiki.git","git_url":"git://github.com/rkh/Smallest-Federated-Wiki.git","created_at":"2012-03-01T21:34:49Z","id":3596336,"open_issues":0},{"html_url":"https://github.com/rkh/gh","pushed_at":"2012-05-23T13:30:33Z","updated_at":"2012-05-23T13:30:35Z","homepage":"http://gh.rkh.im/","url":"https://api.github.com/repos/rkh/gh","has_downloads":true,"watchers":11,"fork":false,"svn_url":"https://github.com/rkh/gh","has_wiki":true,"has_issues":true,"size":244,"private":false,"mirror_url":null,"forks":3,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"gh","language":"Ruby","description":"Layered
|
42
|
+
GitHub API client","clone_url":"https://github.com/rkh/gh.git","ssh_url":"git@github.com:rkh/gh.git","git_url":"git://github.com/rkh/gh.git","created_at":"2012-03-05T13:07:41Z","id":3627076,"open_issues":0},{"html_url":"https://github.com/rkh/trinidad","pushed_at":"2012-03-10T15:56:37Z","updated_at":"2012-03-10T15:56:37Z","homepage":"","url":"https://api.github.com/repos/rkh/trinidad","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/trinidad","has_wiki":true,"has_issues":false,"size":152,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"trinidad","language":"Ruby","description":"Simple
|
43
|
+
library to run rails and rackup applications into an embedded Apache Tomcat","clone_url":"https://github.com/rkh/trinidad.git","ssh_url":"git@github.com:rkh/trinidad.git","git_url":"git://github.com/rkh/trinidad.git","created_at":"2012-03-10T15:55:36Z","id":3680426,"open_issues":0},{"html_url":"https://github.com/rkh/prefix","pushed_at":"2012-03-20T15:01:24Z","updated_at":"2012-03-20T15:21:14Z","homepage":null,"url":"https://api.github.com/repos/rkh/prefix","has_downloads":true,"watchers":2,"fork":false,"svn_url":"https://github.com/rkh/prefix","has_wiki":true,"has_issues":true,"size":92,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"prefix","language":"Ruby","description":null,"clone_url":"https://github.com/rkh/prefix.git","ssh_url":"git@github.com:rkh/prefix.git","git_url":"git://github.com/rkh/prefix.git","created_at":"2012-03-20T14:47:08Z","id":3776230,"open_issues":0},{"html_url":"https://github.com/rkh/hearts","pushed_at":"2012-03-25T16:45:47Z","updated_at":"2012-03-25T16:45:48Z","homepage":"","url":"https://api.github.com/repos/rkh/hearts","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/hearts","has_wiki":true,"has_issues":false,"size":108,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"hearts","language":"Ruby","description":"I
|
44
|
+
love hearts!","clone_url":"https://github.com/rkh/hearts.git","ssh_url":"git@github.com:rkh/hearts.git","git_url":"git://github.com/rkh/hearts.git","created_at":"2012-03-25T16:45:16Z","id":3825575,"open_issues":0},{"html_url":"https://github.com/rkh/test-project-matrix-1","pushed_at":"2012-04-15T16:21:18Z","updated_at":"2012-04-15T16:21:18Z","homepage":"","url":"https://api.github.com/repos/rkh/test-project-matrix-1","has_downloads":true,"watchers":1,"master_branch":"master","fork":true,"svn_url":"https://github.com/rkh/test-project-matrix-1","has_wiki":true,"has_issues":false,"size":112,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"test-project-matrix-1","language":"Ruby","description":"Test
|
45
|
+
dummy repository for testing Travis CI","clone_url":"https://github.com/rkh/test-project-matrix-1.git","ssh_url":"git@github.com:rkh/test-project-matrix-1.git","git_url":"git://github.com/rkh/test-project-matrix-1.git","created_at":"2012-04-15T16:20:55Z","id":4033173,"open_issues":0},{"html_url":"https://github.com/rkh/euruko-golf","pushed_at":"2012-05-04T11:54:45Z","updated_at":"2012-05-10T10:03:45Z","homepage":"","url":"https://api.github.com/repos/rkh/euruko-golf","has_downloads":true,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/euruko-golf","has_wiki":true,"has_issues":false,"size":108,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"euruko-golf","language":"Ruby","description":"Tweetable
|
46
|
+
ruby programs that output EuRuKo ASCII art.","clone_url":"https://github.com/rkh/euruko-golf.git","ssh_url":"git@github.com:rkh/euruko-golf.git","git_url":"git://github.com/rkh/euruko-golf.git","created_at":"2012-05-04T11:51:10Z","id":4224272,"open_issues":0},{"html_url":"https://github.com/rkh/github-services","pushed_at":"2012-05-15T12:00:57Z","updated_at":"2012-05-15T12:00:57Z","homepage":"http://github.com/blog/53-github-services-ipo","url":"https://api.github.com/repos/rkh/github-services","has_downloads":false,"watchers":1,"fork":true,"svn_url":"https://github.com/rkh/github-services","has_wiki":false,"has_issues":false,"size":120,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"github-services","language":"Ruby","description":"Official
|
47
|
+
GitHub Services Integration - You can set these up in your repo admin screen under
|
48
|
+
Service Hooks","clone_url":"https://github.com/rkh/github-services.git","ssh_url":"git@github.com:rkh/github-services.git","git_url":"git://github.com/rkh/github-services.git","created_at":"2012-05-15T11:35:46Z","id":4335034,"open_issues":0},{"html_url":"https://github.com/rkh/bundler","pushed_at":"2012-05-22T13:26:25Z","updated_at":"2012-05-22T13:26:25Z","homepage":"http://gembundler.com","url":"https://api.github.com/repos/rkh/bundler","has_downloads":false,"watchers":1,"master_branch":"master","fork":true,"svn_url":"https://github.com/rkh/bundler","has_wiki":true,"has_issues":false,"size":140,"private":false,"mirror_url":null,"forks":0,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"bundler","language":"Ruby","description":"Manage
|
49
|
+
your application''s gem dependencies with less pain","clone_url":"https://github.com/rkh/bundler.git","ssh_url":"git@github.com:rkh/bundler.git","git_url":"git://github.com/rkh/bundler.git","created_at":"2012-05-21T14:05:57Z","id":4394235,"open_issues":0},{"html_url":"https://github.com/rkh/gh-store","pushed_at":"2012-05-22T12:50:46Z","updated_at":"2012-05-22T13:11:14Z","homepage":null,"url":"https://api.github.com/repos/rkh/gh-store","has_downloads":true,"watchers":2,"fork":false,"svn_url":"https://github.com/rkh/gh-store","has_wiki":true,"has_issues":true,"size":92,"private":false,"mirror_url":null,"forks":1,"owner":{"url":"https://api.github.com/users/rkh","login":"rkh","avatar_url":"https://secure.gravatar.com/avatar/5c2b452f6eea4a6d84c105ebd971d2a4?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png","gravatar_id":"5c2b452f6eea4a6d84c105ebd971d2a4","id":30442},"name":"gh-store","language":"Ruby","description":null,"clone_url":"https://github.com/rkh/gh-store.git","ssh_url":"git@github.com:rkh/gh-store.git","git_url":"git://github.com/rkh/gh-store.git","created_at":"2012-05-22T12:50:34Z","id":4406633,"open_issues":0}]'
|