fcoury-octopi 0.0.7 → 0.0.8

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/README.rdoc CHANGED
@@ -1,6 +1,10 @@
1
1
  = octopi
2
2
 
3
- Octopi is a Ruby interface to GitHub API v2 (http://develop.github.com). It's under early but active development and already works.
3
+ Octopi is a Ruby interface to GitHub API v2 (http://develop.github.com).
4
+
5
+ To install it as a Gem, just run:
6
+
7
+ $ sudo gem install fcoury-octopi --source http://gems.github.com
4
8
 
5
9
  == Authenticated Usage
6
10
 
@@ -45,7 +49,7 @@ Use the following format:
45
49
  # curl - same as true, but in addition will output the curl equivalent of each command (for debugging)
46
50
  trace: curl
47
51
 
48
- This changes the way you connect to:
52
+ And change the way you connect to:
49
53
 
50
54
  authenticated_with :config => "github.yml" do |g|
51
55
  (...)
@@ -53,7 +57,7 @@ This changes the way you connect to:
53
57
 
54
58
  == Anonymous Usage
55
59
 
56
- This reflects the usage of the API to retrieve information, on a read-only mode where the user doesn't have to be authenticated.
60
+ This reflects the usage of the API to retrieve information on a read-only fashion, where the user doesn't have to be authenticated.
57
61
 
58
62
  === Users API
59
63
 
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
2
  :major: 0
3
3
  :minor: 0
4
- :patch: 7
4
+ :patch: 8
data/lib/octopi.rb CHANGED
@@ -65,6 +65,9 @@ module Octopi
65
65
  'json' => 'application/json',
66
66
  'xml' => 'application/sml'
67
67
  }
68
+ RETRYABLE_STATUS = [403]
69
+ MAX_RETRIES = 10
70
+
68
71
  base_uri "http://github.com/api/v2"
69
72
 
70
73
  attr_accessor :format, :login, :token, :trace_level, :read_only
@@ -77,12 +80,17 @@ module Octopi
77
80
  @login = login
78
81
  @token = token
79
82
  @read_only = false
83
+ self.class.default_params :login => login, :token => token
80
84
  end
81
85
  end
82
-
83
- %w[keys emails].each do |action|
86
+
87
+ def read_only?
88
+ read_only
89
+ end
90
+
91
+ {:keys => 'public_keys', :emails => 'emails'}.each_pair do |action, key|
84
92
  define_method("#{action}") do
85
- get("/user/#{action}")
93
+ get("/user/#{action}")[key]
86
94
  end
87
95
  end
88
96
 
@@ -121,6 +129,25 @@ module Octopi
121
129
  get(path, params, 'plain')
122
130
  end
123
131
 
132
+ def get(path, params = {}, format = "yaml")
133
+ @@retries = 0
134
+ begin
135
+ trace "GET [#{format}]", "/#{format}#{path}", params
136
+ submit(path, params, format) do |path, params, format|
137
+ self.class.get "/#{format}#{path}"
138
+ end
139
+ rescue RetryableAPIError => e
140
+ if @@retries < MAX_RETRIES
141
+ $stderr.puts e.message
142
+ @@retries += 1
143
+ retry
144
+ else
145
+ raise APIError, "GitHub returned status #{e.code}, despite" +
146
+ " repeating the request #{MAX_RETRIES} times. Giving up."
147
+ end
148
+ end
149
+ end
150
+
124
151
  def post(path, params = {}, format = "yaml")
125
152
  trace "POST", "/#{format}#{path}", params
126
153
  submit(path, params, format) do |path, params, format|
@@ -140,6 +167,12 @@ module Octopi
140
167
  query = login ? { :login => login, :token => token } : {}
141
168
  query.merge!(params)
142
169
 
170
+ begin
171
+ resp = yield(path, query.merge(params), format)
172
+ rescue Net::HTTPBadResponse
173
+ raise RetryableAPIError
174
+ end
175
+
143
176
  if @trace_level
144
177
  case @trace_level
145
178
  when "curl"
@@ -150,8 +183,7 @@ module Octopi
150
183
  puts "===================="
151
184
  end
152
185
  end
153
-
154
- resp = yield(path, query, format)
186
+ raise RetryableAPIError, resp.code.to_i if RETRYABLE_STATUS.include? resp.code.to_i
155
187
  raise APIError,
156
188
  "GitHub returned status #{resp.code}" unless resp.code.to_i == 200
157
189
  # FIXME: This fails for showing raw Git data because that call returns
@@ -165,13 +197,6 @@ module Octopi
165
197
  resp
166
198
  end
167
199
 
168
- def get(path, params = {}, format = "yaml")
169
- trace "GET [#{format}]", "/#{format}#{path}", params
170
- submit(path, params, format) do |path, params, format|
171
- self.class.get "/#{format}#{path}"
172
- end
173
- end
174
-
175
200
  def trace(oper, url, params)
176
201
  return unless trace_level
177
202
  par_str = " params: " + params.map { |p| "#{p[0]}=#{p[1]}" }.join(", ") if params and !params.empty?
@@ -179,7 +204,7 @@ module Octopi
179
204
  end
180
205
  end
181
206
 
182
- %w{error base resource user tag repository issue file_object blob commit}.
207
+ %w{error base resource user tag repository issue file_object blob key commit branch}.
183
208
  each{|f| require "#{File.dirname(__FILE__)}/octopi/#{f}"}
184
209
 
185
210
  end
@@ -0,0 +1,17 @@
1
+ module Octopi
2
+ class Branch < Base
3
+ include Resource
4
+ set_resource_name "branch", "branches"
5
+
6
+ resource_path "/repos/show/:id"
7
+
8
+ def self.find(user, repo)
9
+ user = user.login if user.is_a? User
10
+ repo = repo.name if repo.is_a? Repository
11
+ self.validate_args(user => :user, repo => :repo)
12
+ find_plural([user,repo,'branches'], :resource){
13
+ |i| {:name => i.first, :hash => i.last }
14
+ }
15
+ end
16
+ end
17
+ end
data/lib/octopi/error.rb CHANGED
@@ -12,4 +12,12 @@ module Octopi
12
12
  end
13
13
  end
14
14
 
15
+ class RetryableAPIError < RuntimeError
16
+ attr_reader :code
17
+ def initialize(code=nil)
18
+ @code = code.nil? ? '???' : code
19
+ @message = "GitHub returned status #{@code}. Retrying request."
20
+ super @message
21
+ end
22
+ end
15
23
  end
data/lib/octopi/key.rb ADDED
@@ -0,0 +1,18 @@
1
+ module Octopi
2
+ class Key < Base
3
+ include Resource
4
+
5
+ attr_reader :user
6
+
7
+ def initialize(api, data, user = nil)
8
+ super api, data
9
+ @user = user
10
+ end
11
+
12
+ def remove!
13
+ result = @api.post "/user/key/remove", :id => id
14
+ keys = result["public_keys"].select { |k| puts "#{title} #{k["title"]} #{k["title"] == title}"; k["title"] == title }
15
+ keys.empty?
16
+ end
17
+ end
18
+ end
@@ -5,6 +5,10 @@ module Octopi
5
5
 
6
6
  find_path "/repos/search/:query"
7
7
  resource_path "/repos/show/:id"
8
+
9
+ def branches
10
+ Branch.find(self.owner, self.name)
11
+ end
8
12
 
9
13
  def tags
10
14
  Tag.find(self.owner, self.name)
@@ -66,5 +70,10 @@ module Octopi
66
70
  def issue(number)
67
71
  Issue.find(self, number)
68
72
  end
73
+
74
+ def collaborators
75
+ property('collaborators', [self.owner,self.name].join('/')).values
76
+ end
77
+
69
78
  end
70
79
  end
data/lib/octopi/user.rb CHANGED
@@ -24,6 +24,26 @@ module Octopi
24
24
  Repository.find(login, name)
25
25
  end
26
26
 
27
+ def add_key(title, key)
28
+ raise APIError,
29
+ "To add a key, you must be authenticated" if @api.read_only?
30
+
31
+ result = @api.post("/user/key/add", :title => title, :key => key)
32
+ return if !result["public_keys"]
33
+ key_params = result["public_keys"].select { |k| puts "#{title} #{k["title"]} #{k["title"] == title}"; k["title"] == title }
34
+ return if !key_params or key_params.empty?
35
+ Key.new(@api, key_params.first, self)
36
+ end
37
+
38
+ def keys
39
+ raise APIError,
40
+ "To add a key, you must be authenticated" if @api.read_only?
41
+
42
+ result = @api.get("/user/keys")
43
+ return unless result and result["public_keys"]
44
+ result["public_keys"].inject([]) { |result, element| result << Key.new(@api, element) }
45
+ end
46
+
27
47
  # takes one param, deep that indicates if returns
28
48
  # only the user login or an user object
29
49
  %w[followers following].each do |method|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fcoury-octopi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felipe Coury
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-22 00:00:00 -07:00
12
+ date: 2009-04-26 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -28,10 +28,12 @@ files:
28
28
  - lib/octopi
29
29
  - lib/octopi/base.rb
30
30
  - lib/octopi/blob.rb
31
+ - lib/octopi/branch.rb
31
32
  - lib/octopi/commit.rb
32
33
  - lib/octopi/error.rb
33
34
  - lib/octopi/file_object.rb
34
35
  - lib/octopi/issue.rb
36
+ - lib/octopi/key.rb
35
37
  - lib/octopi/repository.rb
36
38
  - lib/octopi/resource.rb
37
39
  - lib/octopi/tag.rb