gittycent 0.0.4 → 0.1.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/CHANGELOG +2 -0
- data/gittycent.gemspec +2 -2
- data/lib/gittycent.rb +116 -59
- metadata +3 -6
data/CHANGELOG
CHANGED
data/gittycent.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{gittycent}
|
5
|
-
s.version = "0.0
|
5
|
+
s.version = "0.1.0"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Elijah Miller"]
|
9
|
-
s.date = %q{2010-
|
9
|
+
s.date = %q{2010-07-22}
|
10
10
|
s.description = %q{A GitHub wrapper in Ruby.}
|
11
11
|
s.email = %q{elijah.miller@gmail.com}
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "LICENSE", "README.rdoc", "lib/gittycent.rb"]
|
data/lib/gittycent.rb
CHANGED
@@ -3,17 +3,17 @@ require 'active_support/all'
|
|
3
3
|
require 'httparty'
|
4
4
|
require 'pp'
|
5
5
|
|
6
|
-
class
|
6
|
+
class Gittycent
|
7
7
|
API_VERSION = 'v2'
|
8
8
|
FORMAT = 'yaml'
|
9
9
|
NONE, WARNING, INFO, DEBUG = *1..10
|
10
|
-
|
10
|
+
|
11
11
|
attr_accessor :options
|
12
|
-
|
12
|
+
|
13
13
|
# Connects to GitHub using login/token. Yields or returns the new
|
14
14
|
# connection.
|
15
15
|
#
|
16
|
-
#
|
16
|
+
# Gittycent.connect(:login => 'jqr', :token => 'somesecretstuff123')
|
17
17
|
def self.connect(options)
|
18
18
|
connection = new(options)
|
19
19
|
if block_given?
|
@@ -22,34 +22,34 @@ class GitHub
|
|
22
22
|
connection
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
# Simplified method for connecting with git config specified credentials.
|
27
27
|
# Also allows for using an alternate section for easy handling of multiple
|
28
28
|
# credentials. Just like connect this yields or returns the new connection.
|
29
29
|
#
|
30
|
-
#
|
30
|
+
# gittycent = Gittycent.connect_with_git_config
|
31
31
|
def self.connect_with_git_config(section = :github, options = {}, &block)
|
32
32
|
config = Hash[*`git config -l`.scan(/^(.*?)=(.*)$/).flatten]
|
33
33
|
connect(options.merge(:login => config["#{section}.user"], :token => config["#{section}.token"]), &block)
|
34
34
|
end
|
35
|
-
|
36
|
-
# Returns a new
|
35
|
+
|
36
|
+
# Returns a new Gittycent connection object, requires :login and :token
|
37
37
|
# options.
|
38
38
|
#
|
39
|
-
#
|
39
|
+
# gittycent = Gittycent.new(:login => 'jqr', :token => 'somesecretstuff123')
|
40
40
|
def initialize(options)
|
41
41
|
self.options = options
|
42
42
|
debug "Login using login #{options[:login]} with token #{options[:token]}"
|
43
43
|
end
|
44
|
-
|
44
|
+
|
45
45
|
# Returns the verbosity level.
|
46
46
|
def verbosity
|
47
47
|
options[:verbosity] || NONE
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
# Finds a GitHub user by login.
|
51
51
|
#
|
52
|
-
# user =
|
52
|
+
# user = gittycent.user('jqr')
|
53
53
|
def user(login)
|
54
54
|
if login == options[:login]
|
55
55
|
AuthenticatedUser.new(self, :login => options[:login])
|
@@ -57,7 +57,7 @@ class GitHub
|
|
57
57
|
User.new(self, :login => login)
|
58
58
|
end
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
# Finds GitHub users by a query string.
|
62
62
|
def user_search(query)
|
63
63
|
get("/user/search/#{query}")['users'].map { |u| User.new(self, u) }
|
@@ -67,11 +67,11 @@ class GitHub
|
|
67
67
|
def authenticated_user
|
68
68
|
@authenticated_user ||= user(options[:login])
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def inspect # :nodoc:
|
72
72
|
"#<#{self.class}#{' ' + options[:login] if options[:login].present?}>"
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
def default_http_options
|
76
76
|
{
|
77
77
|
:query => {
|
@@ -80,7 +80,7 @@ class GitHub
|
|
80
80
|
}
|
81
81
|
}
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
# Performs a GET request on path, automatically prepending api version and
|
85
85
|
# format paramters. Will automatically retry if the request rate limiting is
|
86
86
|
# hit.
|
@@ -95,7 +95,7 @@ class GitHub
|
|
95
95
|
response
|
96
96
|
end
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
# Performs a POST request on path, automatically prepending api version and
|
100
100
|
# format paramters. Will automatically retry if the request rate limiting is
|
101
101
|
# hit.
|
@@ -111,19 +111,19 @@ class GitHub
|
|
111
111
|
response
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
def debug(message = "")
|
116
116
|
puts message if verbosity >= DEBUG
|
117
117
|
end
|
118
|
-
|
118
|
+
|
119
119
|
def warn(message = "")
|
120
120
|
puts message if verbosity >= WARNING
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
def debug_inspect(object)
|
124
124
|
debug object.pretty_inspect
|
125
125
|
end
|
126
|
-
|
126
|
+
|
127
127
|
# Automatically retries a block of code if the returned value is rate
|
128
128
|
# limited (HTTP Code 403) by GitHub.
|
129
129
|
def with_retry
|
@@ -140,37 +140,37 @@ class GitHub
|
|
140
140
|
end
|
141
141
|
end
|
142
142
|
end
|
143
|
-
|
143
|
+
|
144
144
|
class Connectable
|
145
145
|
class_inheritable_accessor :identified_by
|
146
|
-
attr_accessor :connection, :
|
147
|
-
|
146
|
+
attr_accessor :connection, :attributes
|
147
|
+
|
148
148
|
def initialize(connection, options)
|
149
149
|
self.connection = connection
|
150
|
-
@attributes = options.
|
150
|
+
@attributes = options.symbolize_keys
|
151
151
|
if self.class.identified_by && @attributes.include?(self.class.identified_by)
|
152
152
|
send("#{identified_by}=", @attributes.delete(self.class.identified_by))
|
153
153
|
end
|
154
154
|
self.connection = connection
|
155
155
|
end
|
156
|
-
|
156
|
+
|
157
157
|
def get(*args)
|
158
158
|
connection.get(*args)
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
161
|
def post(*args)
|
162
162
|
connection.post(*args)
|
163
163
|
end
|
164
|
-
|
164
|
+
|
165
165
|
def debug(*args)
|
166
166
|
connection.debug(*args)
|
167
167
|
end
|
168
|
-
|
168
|
+
|
169
169
|
def reload
|
170
170
|
@attributes = {}
|
171
171
|
load
|
172
172
|
end
|
173
|
-
|
173
|
+
|
174
174
|
def self.loadable_attributes(*attributes)
|
175
175
|
(attributes - [identified_by]).each do |attribute|
|
176
176
|
define_method(attribute) do
|
@@ -181,35 +181,41 @@ class GitHub
|
|
181
181
|
end
|
182
182
|
end
|
183
183
|
end
|
184
|
-
|
185
|
-
end
|
186
184
|
|
185
|
+
end
|
186
|
+
|
187
187
|
class User < Connectable
|
188
188
|
attr_accessor :login
|
189
189
|
self.identified_by = :login
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
190
|
+
|
191
|
+
|
192
|
+
loadable_attributes :followers_count, :created_at, :company, :gravatar_id,
|
193
|
+
:public_repo_count, :location, :email, :public_gist_count, :blog,
|
194
|
+
:name, :following_count
|
195
|
+
|
194
196
|
def to_s
|
195
197
|
login.to_s
|
196
198
|
end
|
197
|
-
|
199
|
+
|
198
200
|
# Returns this user's repositories.
|
199
201
|
def repos
|
200
202
|
@repos ||= get("/repos/show/#{login}")['repositories'].map { |r| Repo.new(connection, r) }
|
201
203
|
end
|
202
|
-
|
204
|
+
|
205
|
+
def repo(name)
|
206
|
+
repos.detect { |r| r.name == name }
|
207
|
+
end
|
208
|
+
|
203
209
|
# Returns a list of all public repos thi user is watching.
|
204
210
|
def watched_repos
|
205
211
|
@repos ||= get("/repos/watched/#{login}")['repositories'].map { |r| Repo.new(connection, r) }
|
206
212
|
end
|
207
|
-
|
213
|
+
|
208
214
|
# Loads lazily-fetched attributes.
|
209
215
|
def load
|
210
216
|
@attributes = get("/user/show/#{login}")['user'].symbolize_keys
|
211
217
|
end
|
212
|
-
|
218
|
+
|
213
219
|
# Returns all the users that follow this user.
|
214
220
|
def followers
|
215
221
|
@followers ||= get("/user/show/#{login}/followers")['users'].map { |u| User.new(connection, :login => u) }
|
@@ -220,19 +226,16 @@ class GitHub
|
|
220
226
|
@following||= get("/user/show/#{login}/following")['users'].map { |u| User.new(connection, :login => u) }
|
221
227
|
end
|
222
228
|
end
|
223
|
-
|
229
|
+
|
224
230
|
class AuthenticatedUser < User
|
225
|
-
loadable_attributes :
|
226
|
-
:
|
227
|
-
|
228
|
-
:collaborators, :public_gist_count, :blog, :name, :following_count,
|
229
|
-
:disk_usage
|
230
|
-
|
231
|
+
loadable_attributes :owned_private_repo_count, :created_at,
|
232
|
+
:private_gist_count, :plan, :collaborators, :disk_usage
|
233
|
+
|
231
234
|
# Returns a list of all repos this user is watching.
|
232
235
|
def watched_repos
|
233
236
|
super
|
234
237
|
end
|
235
|
-
|
238
|
+
|
236
239
|
# Adds a new repository for this user. Supported options include: :name,
|
237
240
|
# :description, :homepage, :public.
|
238
241
|
#
|
@@ -242,7 +245,7 @@ class GitHub
|
|
242
245
|
Repo.new(connection, post("/repos/create", options)['repository'])
|
243
246
|
end
|
244
247
|
end
|
245
|
-
|
248
|
+
|
246
249
|
class Repo < Connectable
|
247
250
|
attr_accessor :name
|
248
251
|
self.identified_by = :name
|
@@ -253,17 +256,17 @@ class GitHub
|
|
253
256
|
def to_s
|
254
257
|
name.to_s
|
255
258
|
end
|
256
|
-
|
259
|
+
|
257
260
|
# Returns the owner of this repository.
|
258
261
|
def owner
|
259
262
|
@owner ||= User.new(connection, :login => @attributes[:owner])
|
260
263
|
end
|
261
|
-
|
264
|
+
|
262
265
|
# Returns a list of all collaborators.
|
263
266
|
def collaborators
|
264
267
|
@collaborators ||= get("/repos/show/#{owner.login}/#{name}/collaborators")['collaborators'] || []
|
265
268
|
end
|
266
|
-
|
269
|
+
|
267
270
|
# Sets the list of collaborators.
|
268
271
|
def collaborators=(value)
|
269
272
|
value = value.dup.uniq
|
@@ -279,7 +282,7 @@ class GitHub
|
|
279
282
|
end
|
280
283
|
@collaborators = nil
|
281
284
|
end
|
282
|
-
|
285
|
+
|
283
286
|
# Returns the shell commands used to do an initial push of this project to
|
284
287
|
# GitHub.
|
285
288
|
def initial_push_command
|
@@ -288,30 +291,84 @@ class GitHub
|
|
288
291
|
"git config --add branch.master.remote origin &&\n" +
|
289
292
|
"git config --add branch.master.merge refs/heads/master"
|
290
293
|
end
|
291
|
-
|
294
|
+
|
292
295
|
# Returns repositories in this repository's network.
|
293
296
|
def network
|
294
297
|
@network ||= get("/repos/show/#{owner.login}/#{name}/network")['network'].map { |r| Repo.new(connection, r) }
|
295
298
|
end
|
296
|
-
|
299
|
+
|
297
300
|
# Returns the languages detected.
|
298
301
|
def languages
|
299
302
|
get("/repos/show/#{owner.login}/#{name}/languages")['languages']
|
300
303
|
end
|
301
|
-
|
304
|
+
|
302
305
|
# Loads lazily-fetched attributes.
|
303
306
|
def load
|
304
307
|
@attributes = get("/repos/show/#{owner.login}/#{name}")['repository'].symbolize_keys
|
305
308
|
end
|
306
|
-
|
309
|
+
|
307
310
|
# Returns all tags of this repository.
|
308
311
|
def tags
|
309
312
|
get("/repos/show/#{owner.login}/#{name}/tags")['tags']
|
310
313
|
end
|
311
|
-
|
314
|
+
|
312
315
|
# Returns all branches of this repository.
|
313
316
|
def branches
|
314
317
|
get("/repos/show/#{owner.login}/#{name}/branches")['branches']
|
315
318
|
end
|
319
|
+
|
320
|
+
# Returns all commits of the master branch.
|
321
|
+
def commits
|
322
|
+
get("/commits/list/#{owner.login}/#{name}/master")['commits'].map { |c| Commit.new(connection, c.merge(:repo => self)) }
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
|
327
|
+
class Commit < Connectable
|
328
|
+
attr_accessor :id
|
329
|
+
self.identified_by = :id
|
330
|
+
|
331
|
+
loadable_attributes :author, :parents, :url, :committed_date, :authored_date, :message, :committer, :tree
|
332
|
+
|
333
|
+
def to_s
|
334
|
+
id.to_s
|
335
|
+
end
|
336
|
+
|
337
|
+
# Returns the associated repository.
|
338
|
+
def repo
|
339
|
+
@attributes[:repo]
|
340
|
+
end
|
341
|
+
|
342
|
+
# Returns the parent commits of this commit.
|
343
|
+
def parents
|
344
|
+
load unless @attributes.include?(:parents)
|
345
|
+
@parents ||= @attributes[:parents].map { |p| Commit.new(connection, p.merge(:repo => repo)) }
|
346
|
+
end
|
347
|
+
|
348
|
+
# Returns the Person who authored this commit.
|
349
|
+
def author
|
350
|
+
@author ||= Person.new(connection, @attributes[:author])
|
351
|
+
end
|
352
|
+
|
353
|
+
# Returns the Person who committed this commit.
|
354
|
+
def committer
|
355
|
+
@committer ||= Person.new(connection, @attributes[:committer])
|
356
|
+
end
|
357
|
+
|
358
|
+
# Loads lazily-fetched attributes.
|
359
|
+
def load
|
360
|
+
@attributes = get("/commits/show/#{repo.owner.login}/#{repo.name}/#{id}")['commit'].symbolize_keys.merge(:repo => repo)
|
361
|
+
end
|
362
|
+
|
363
|
+
end
|
364
|
+
|
365
|
+
class Person < Connectable
|
366
|
+
loadable_attributes :name, :email, :login
|
367
|
+
|
368
|
+
def user
|
369
|
+
if login
|
370
|
+
connection.user(login)
|
371
|
+
end
|
372
|
+
end
|
316
373
|
end
|
317
|
-
end
|
374
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gittycent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 23
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
7
|
+
- 1
|
8
8
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.4
|
9
|
+
version: 0.1.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Elijah Miller
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2010-
|
17
|
+
date: 2010-07-22 00:00:00 -04:00
|
19
18
|
default_executable:
|
20
19
|
dependencies: []
|
21
20
|
|
@@ -57,7 +56,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
57
56
|
requirements:
|
58
57
|
- - ">="
|
59
58
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 3
|
61
59
|
segments:
|
62
60
|
- 0
|
63
61
|
version: "0"
|
@@ -66,7 +64,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
64
|
requirements:
|
67
65
|
- - ">="
|
68
66
|
- !ruby/object:Gem::Version
|
69
|
-
hash: 11
|
70
67
|
segments:
|
71
68
|
- 1
|
72
69
|
- 2
|