octokit 0.4.1 → 0.5.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.
Files changed (74) hide show
  1. data/.rspec +3 -0
  2. data/Rakefile +3 -10
  3. data/changelog.markdown +3 -0
  4. data/lib/octokit/client.rb +1 -2
  5. data/lib/octokit/client/authentication.rb +4 -0
  6. data/lib/octokit/client/commits.rb +1 -1
  7. data/lib/octokit/client/connection.rb +4 -2
  8. data/lib/octokit/client/issues.rb +8 -8
  9. data/lib/octokit/client/network.rb +3 -3
  10. data/lib/octokit/client/objects.rb +1 -1
  11. data/lib/octokit/client/organizations.rb +3 -2
  12. data/lib/octokit/client/pulls.rb +9 -3
  13. data/lib/octokit/client/repositories.rb +23 -10
  14. data/lib/octokit/client/request.rb +10 -10
  15. data/lib/octokit/client/timelines.rb +11 -9
  16. data/lib/octokit/configuration.rb +21 -19
  17. data/lib/octokit/version.rb +1 -1
  18. data/octokit.gemspec +4 -6
  19. data/spec/faraday/response_spec.rb +33 -0
  20. data/spec/fixtures/blob.json +1 -0
  21. data/spec/fixtures/blob_metadata.json +1 -0
  22. data/spec/fixtures/blobs.json +1 -0
  23. data/spec/fixtures/branches.json +1 -0
  24. data/spec/fixtures/collaborators.json +1 -0
  25. data/spec/fixtures/comment.json +1 -0
  26. data/spec/fixtures/comments.json +1 -0
  27. data/spec/fixtures/commit.json +1 -0
  28. data/spec/fixtures/commits.json +1 -0
  29. data/spec/fixtures/contributors.json +1 -0
  30. data/spec/fixtures/delete_token.json +1 -0
  31. data/spec/fixtures/emails.json +1 -0
  32. data/spec/fixtures/followers.json +1 -0
  33. data/spec/fixtures/following.json +1 -0
  34. data/spec/fixtures/issue.json +1 -0
  35. data/spec/fixtures/issues.json +1 -0
  36. data/spec/fixtures/labels.json +1 -0
  37. data/spec/fixtures/languages.json +1 -0
  38. data/spec/fixtures/network.json +1 -0
  39. data/spec/fixtures/network_data.json +1 -0
  40. data/spec/fixtures/network_meta.json +1 -0
  41. data/spec/fixtures/organization.json +1 -0
  42. data/spec/fixtures/organizations.json +1 -0
  43. data/spec/fixtures/public_keys.json +1 -0
  44. data/spec/fixtures/pull.json +1 -0
  45. data/spec/fixtures/pulls.json +1 -0
  46. data/spec/fixtures/raw.txt +7 -0
  47. data/spec/fixtures/repositories.json +1 -0
  48. data/spec/fixtures/repository.json +1 -0
  49. data/spec/fixtures/tags.json +1 -0
  50. data/spec/fixtures/team.json +1 -0
  51. data/spec/fixtures/teams.json +1 -0
  52. data/spec/fixtures/timeline.json +1237 -0
  53. data/spec/fixtures/tree.json +1 -0
  54. data/spec/fixtures/tree_metadata.json +1 -0
  55. data/spec/fixtures/user.json +1 -0
  56. data/spec/fixtures/users.json +1 -0
  57. data/spec/fixtures/watchers.json +1 -0
  58. data/spec/helper.rb +66 -0
  59. data/spec/octokit/client/commits_spec.rb +31 -0
  60. data/spec/octokit/client/issues_spec.rb +155 -0
  61. data/spec/octokit/client/network_spec.rb +31 -0
  62. data/spec/octokit/client/objects_spec.rb +75 -0
  63. data/spec/octokit/client/organizations_spec.rb +233 -0
  64. data/spec/octokit/client/pulls_spec.rb +43 -0
  65. data/spec/octokit/client/repositories_spec.rb +330 -0
  66. data/spec/octokit/client/timelines_spec.rb +41 -0
  67. data/spec/octokit/client/users_spec.rb +273 -0
  68. data/spec/octokit/client_spec.rb +12 -0
  69. data/spec/octokit_spec.rb +14 -0
  70. data/spec/repository_spec.rb +53 -0
  71. data/test/helper.rb +2 -0
  72. data/test/octokit_test.rb +14 -2
  73. metadata +147 -89
  74. data/lib/octokit/event.rb +0 -76
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=nested
3
+ --backtrace
data/Rakefile CHANGED
@@ -1,14 +1,7 @@
1
- $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
2
1
  require 'bundler'
3
2
  Bundler::GemHelper.install_tasks
4
3
 
5
- require 'shoulda/tasks'
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec)
6
6
 
7
- require 'rake/testtask'
8
- Rake::TestTask.new(:test) do |test|
9
- test.ruby_opts = ["-rubygems"] if defined? Gem
10
- test.libs << "lib" << "test"
11
- test.pattern = "test/**/*_test.rb"
12
- end
13
-
14
- task :default => :test
7
+ task :default => :spec
data/changelog.markdown CHANGED
@@ -1,4 +1,7 @@
1
1
  # Changelog
2
+ ## 0.5.0
3
+ * Rewrote all tests in rspec
4
+ * A handful of backwards-incompatible API changes
2
5
  ## 0.4.1
3
6
  * Patch from [karlfreeman](http://github.com/karlfreeman) to fix user search
4
7
  ## 0.4.0
@@ -1,4 +1,3 @@
1
- require File.expand_path('../event', __FILE__)
2
1
  require File.expand_path('../repository', __FILE__)
3
2
  Dir[File.expand_path('../client/*.rb', __FILE__)].each{|file| require file}
4
3
 
@@ -27,4 +26,4 @@ module Octokit
27
26
  include Octokit::Client::Timelines
28
27
  include Octokit::Client::Users
29
28
  end
30
- end
29
+ end
@@ -14,6 +14,10 @@ module Octokit
14
14
  def authenticated?
15
15
  !authentication.empty?
16
16
  end
17
+
18
+ def oauthed?
19
+ !oauth_token.nil?
20
+ end
17
21
  end
18
22
  end
19
23
  end
@@ -8,7 +8,7 @@ module Octokit
8
8
  alias :list_commits :commits
9
9
 
10
10
  def commit(repo, sha, options={})
11
- get("commits/show/#{Repository.new(repo)}/#{sha}", options)['commit']
11
+ get("commits/show/#{Repository.new(repo)}/#{sha}", options)['commits']
12
12
  end
13
13
 
14
14
  end
@@ -7,16 +7,18 @@ module Octokit
7
7
  module Connection
8
8
  private
9
9
 
10
- def connection(raw=false)
10
+ def connection(raw=false, authenticate=true)
11
11
  options = {
12
12
  :proxy => proxy,
13
13
  :ssl => {:verify => false},
14
14
  :url => endpoint,
15
15
  }
16
16
 
17
+ options.merge!(:params => { :access_token => oauth_token }) if oauthed? && !authenticated?
18
+
17
19
  Faraday::Connection.new(options) do |connection|
18
20
  connection.adapter(adapter)
19
- connection.basic_auth authentication[:login], authentication[:password] if authenticated?
21
+ connection.basic_auth authentication[:login], authentication[:password] if authenticate and authenticated?
20
22
  connection.use Faraday::Response::RaiseError
21
23
  unless raw
22
24
  case format.to_s.downcase
@@ -20,7 +20,7 @@ module Octokit
20
20
  end
21
21
 
22
22
  def issue_comments(repo, number, options={})
23
- post("issues/comments/#{Repository.new(repo)}/#{number}", options)['comments']
23
+ get("issues/comments/#{Repository.new(repo)}/#{number}", options)['comments']
24
24
  end
25
25
 
26
26
  def create_issue(repo, title, body, options={})
@@ -43,15 +43,15 @@ module Octokit
43
43
  def labels(repo, options={})
44
44
  get("issues/labels/#{Repository.new(repo)}", options)['labels']
45
45
  end
46
-
47
- def add_label(repo, number, label, options={})
48
- post("issues/label/add/#{Repository.new(repo)}/#{label}/#{number}", options)['labels']
46
+
47
+ def add_label(repo, label, number=nil, options={})
48
+ post(["issues/label/add/#{Repository.new(repo)}/#{label}", number].compact.join('/'), options)['labels']
49
49
  end
50
-
51
- def remove_label(repo, number, label, options={})
52
- post("issues/label/remove/#{Repository.new(repo)}/#{label}/#{number}")['labels']
50
+
51
+ def remove_label(repo, label, number=nil, options={})
52
+ post(["issues/label/remove/#{Repository.new(repo)}/#{label}", number].compact.join('/'), options)['labels']
53
53
  end
54
-
54
+
55
55
  def add_comment(repo, number, comment, options={})
56
56
  post("issues/comment/#{Repository.new(repo)}/#{number}", options.merge({:comment => comment}))['comment']
57
57
  end
@@ -5,9 +5,9 @@ module Octokit
5
5
  def network_meta(repo, options={})
6
6
  get("#{Repository.new(repo)}/network_meta", options, false, false)
7
7
  end
8
-
9
- def network_data(repo, nethash, options={})
10
- get("#{Repository.new(repo)}/network_data_chunk", options.merge({:nethash => nethash}), false, false)['commits']
8
+
9
+ def network_data(repo, options={})
10
+ get("#{Repository.new(repo)}/network_data_chunk", options, false, false)['commits']
11
11
  end
12
12
 
13
13
  end
@@ -20,7 +20,7 @@ module Octokit
20
20
  alias :blob_meta :blob_metadata
21
21
 
22
22
  def tree_metadata(repo, tree_sha, options={})
23
- get("tree/full/#{Repository.new(repo)}/#{tree_sha}", options)['blobs']
23
+ get("tree/full/#{Repository.new(repo)}/#{tree_sha}", options)['tree']
24
24
  end
25
25
  alias :tree_meta :tree_metadata
26
26
 
@@ -23,7 +23,7 @@ module Octokit
23
23
  alias :list_orgs :organizations
24
24
  alias :orgs :organizations
25
25
 
26
- def organization_repositories(org, options={})
26
+ def organization_repositories(org=nil, options={})
27
27
  if org
28
28
  get("organizations/#{org}/public_repositories", options)
29
29
  else
@@ -38,9 +38,10 @@ module Octokit
38
38
  end
39
39
  alias :org_members :organization_members
40
40
 
41
- def teams(org, options={})
41
+ def organization_teams(org, options={})
42
42
  get("organizations/#{org}/teams", options)['teams']
43
43
  end
44
+ alias :org_teams :organization_teams
44
45
 
45
46
  def create_team(org, values, options={})
46
47
  post("organizations/#{org}/teams", options.merge({:team => values}))['team']
@@ -1,8 +1,14 @@
1
1
  module Octokit
2
2
  class Client
3
3
  module Pulls
4
- def create_pull_request(repo, options={})
5
- post("pulls/#{Repository.new(repo)}", options)['pulls']
4
+ def create_pull_request(repo, base, head, title, body, options={})
5
+ pull = {
6
+ :base => base,
7
+ :head => head,
8
+ :title => title,
9
+ :body => body,
10
+ }
11
+ post("pulls/#{Repository.new(repo)}", options.merge({:pull => pull}))['pulls']
6
12
  end
7
13
 
8
14
  def pull_requests(repo, state='open', options={})
@@ -11,7 +17,7 @@ module Octokit
11
17
  alias :pulls :pull_requests
12
18
 
13
19
  def pull_request(repo, number, options={})
14
- get("pulls/#{Repository.new(repo)}/#{number}", options)['pulls']
20
+ get("pulls/#{Repository.new(repo)}/#{number}", options)['pull']
15
21
  end
16
22
  alias :pull :pull_request
17
23
  end
@@ -17,7 +17,7 @@ module Octokit
17
17
  end
18
18
  alias :update_repo :update_repository
19
19
 
20
- def repositories(username=nil, options={})
20
+ def repositories(username=login, options={})
21
21
  get(["repos/show", username].compact.join('/'), options)['repositories']
22
22
  end
23
23
  alias :list_repositories :repositories
@@ -39,17 +39,28 @@ module Octokit
39
39
  end
40
40
  alias :fork :fork!
41
41
 
42
- def create_repository(options={})
43
- post("repos/create", options)['repository']
42
+ def create_repository(name, options={})
43
+ post("repos/create", options.merge(:name => name))['repository']
44
44
  end
45
45
  alias :create_repo :create_repository
46
46
  alias :create :create_repository
47
47
 
48
48
  def delete_repository(repo, options={})
49
- post("repos/delete/#{Repository.new(repo)}", options)['repository']
49
+ response = post("repos/delete/#{Repository.new(repo)}", options)
50
+ if response.respond_to?(:delete_token)
51
+ response['delete_token']
52
+ else
53
+ response['repository']
54
+ end
50
55
  end
51
56
  alias :delete_repo :delete_repository
52
57
 
58
+ def delete_repository!(repo, options={})
59
+ response = post("repos/delete/#{Repository.new(repo)}", options)
60
+ post("repos/delete/#{Repository.new(repo)}", options.merge(:delete_token => response['delete_token']))['repository']
61
+ end
62
+ alias :delete_repo! :delete_repository!
63
+
53
64
  def set_private!(repo, options={})
54
65
  post("repos/set/private/#{Repository.new(repo)}", options)['repository']
55
66
  end
@@ -65,7 +76,7 @@ module Octokit
65
76
  end
66
77
  alias :list_deploy_keys :deploy_keys
67
78
 
68
- def add_deploy_key(repo, options={})
79
+ def add_deploy_key(repo, title, key, options={})
69
80
  post("repos/key/#{Repository.new(repo)}/add", options)['public_keys']
70
81
  end
71
82
 
@@ -92,15 +103,17 @@ module Octokit
92
103
  get("repos/pushable", options)['repositories']
93
104
  end
94
105
 
95
- def teams(repo, options={})
96
- get("repos/show/#{Repository.new(repo)}/teams", options)['repositories']
106
+ def repository_teams(repo, options={})
107
+ get("repos/show/#{Repository.new(repo)}/teams", options)['teams']
97
108
  end
109
+ alias :repo_teams :repository_teams
110
+ alias :teams :repository_teams
98
111
 
99
- def contributors(repo, anon=true, options={})
112
+ def contributors(repo, anon=false, options={})
100
113
  if anon
101
- get("repos/show/#{Repository.new(repo)}/contributors", options)
102
- else
103
114
  get("repos/show/#{Repository.new(repo)}/contributors/anon", options)
115
+ else
116
+ get("repos/show/#{Repository.new(repo)}/contributors", options)
104
117
  end['contributors']
105
118
  end
106
119
  alias :contribs :contributors
@@ -1,26 +1,26 @@
1
1
  module Octokit
2
2
  class Client
3
3
  module Request
4
- def get(path, options={}, raw=false, format_path=true)
5
- request(:get, path, options, raw, format_path)
4
+ def get(path, options={}, raw=false, format_path=true, authenticate=true)
5
+ request(:get, path, options, raw, format_path, authenticate)
6
6
  end
7
7
 
8
- def post(path, options={}, raw=false, format_path=true)
9
- request(:post, path, options, raw, format_path)
8
+ def post(path, options={}, raw=false, format_path=true, authenticate=true)
9
+ request(:post, path, options, raw, format_path, authenticate)
10
10
  end
11
11
 
12
- def put(path, options={}, raw=false, format_path=true)
13
- request(:put, path, options, raw, format_path)
12
+ def put(path, options={}, raw=false, format_path=true, authenticate=true)
13
+ request(:put, path, options, raw, format_path, authenticate)
14
14
  end
15
15
 
16
- def delete(path, options={}, raw=false, format_path=true)
17
- request(:delete, path, options, raw, format_path)
16
+ def delete(path, options={}, raw=false, format_path=true, authenticate=true)
17
+ request(:delete, path, options, raw, format_path, authenticate)
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- def request(method, path, options, raw, format_path)
23
- response = connection(raw).send(method) do |request|
22
+ def request(method, path, options, raw, format_path, authenticate)
23
+ response = connection(raw, authenticate).send(method) do |request|
24
24
  path = formatted_path(path) if format_path
25
25
  case method
26
26
  when :get, :delete
@@ -2,17 +2,19 @@ module Octokit
2
2
  class Client
3
3
  module Timelines
4
4
 
5
- def public_timeline(username=login, options={})
6
- if username.nil?
7
- path = "timeline.json"
8
- else
9
- path = "#{username}.json"
10
- end
11
- get(path, options, false, false)
5
+ def timeline(options={})
6
+ path = "https://github.com/timeline.json"
7
+ get(path, options, false, false, false)
12
8
  end
13
9
 
14
- def timeline(options={})
15
- get("#{login}.private.json", options, false, false)
10
+ def user_timeline(username=login, options={})
11
+ if token
12
+ path = "https://github.com/#{username}.private.json"
13
+ options[:token] = token
14
+ else
15
+ path = "https://github.com/#{username}.json"
16
+ end
17
+ get(path, options, false, false, false)
16
18
  end
17
19
 
18
20
  end
@@ -3,18 +3,19 @@ require File.expand_path('../version', __FILE__)
3
3
 
4
4
  module Octokit
5
5
  module Configuration
6
- VALID_OPTIONS_KEYS = [:adapter, :endpoint, :format, :login, :password, :proxy, :token, :user_agent, :version].freeze
6
+ VALID_OPTIONS_KEYS = [:adapter, :endpoint, :format, :login, :password, :proxy, :token, :oauth_token, :user_agent, :version].freeze
7
7
  VALID_FORMATS = [:json, :xml, :yaml].freeze
8
8
 
9
- DEFAULT_ADAPTER = Faraday.default_adapter.freeze
10
- DEFAULT_ENDPOINT = 'https://github.com/'.freeze
11
- DEFAULT_FORMAT = :json.freeze
12
- DEFAULT_LOGIN = nil.freeze
13
- DEFAULT_PASSWORD = nil.freeze
14
- DEFAULT_PROXY = nil.freeze
15
- DEFAULT_TOKEN = nil.freeze
16
- DEFAULT_USER_AGENT = "Octokit Ruby Gem #{Octokit::VERSION}".freeze
17
- DEFAULT_VERSION = 2
9
+ DEFAULT_ADAPTER = Faraday.default_adapter.freeze
10
+ DEFAULT_ENDPOINT = 'https://github.com/'.freeze
11
+ DEFAULT_FORMAT = :json.freeze
12
+ DEFAULT_LOGIN = nil.freeze
13
+ DEFAULT_PASSWORD = nil.freeze
14
+ DEFAULT_PROXY = nil.freeze
15
+ DEFAULT_TOKEN = nil.freeze
16
+ DEFAULT_OAUTH_TOKEN = nil.freeze
17
+ DEFAULT_USER_AGENT = "Octokit Ruby Gem #{Octokit::VERSION}".freeze
18
+ DEFAULT_VERSION = 2
18
19
 
19
20
  attr_accessor *VALID_OPTIONS_KEYS
20
21
 
@@ -31,15 +32,16 @@ module Octokit
31
32
  end
32
33
 
33
34
  def reset
34
- self.adapter = DEFAULT_ADAPTER
35
- self.endpoint = DEFAULT_ENDPOINT
36
- self.format = DEFAULT_FORMAT
37
- self.login = DEFAULT_LOGIN
38
- self.password = DEFAULT_PASSWORD
39
- self.proxy = DEFAULT_PROXY
40
- self.token = DEFAULT_TOKEN
41
- self.user_agent = DEFAULT_USER_AGENT
42
- self.version = DEFAULT_VERSION
35
+ self.adapter = DEFAULT_ADAPTER
36
+ self.endpoint = DEFAULT_ENDPOINT
37
+ self.format = DEFAULT_FORMAT
38
+ self.login = DEFAULT_LOGIN
39
+ self.password = DEFAULT_PASSWORD
40
+ self.proxy = DEFAULT_PROXY
41
+ self.token = DEFAULT_TOKEN
42
+ self.oauth_token = DEFAULT_OAUTH_TOKEN
43
+ self.user_agent = DEFAULT_USER_AGENT
44
+ self.version = DEFAULT_VERSION
43
45
  end
44
46
  end
45
47
  end
@@ -1,3 +1,3 @@
1
1
  module Octokit
2
- VERSION = "0.4.1".freeze unless defined?(Octokit::VERSION)
2
+ VERSION = "0.5.0".freeze unless defined?(Octokit::VERSION)
3
3
  end
data/octokit.gemspec CHANGED
@@ -2,18 +2,16 @@
2
2
  require File.expand_path('../lib/octokit/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
- s.add_development_dependency('fakeweb', '~> 1.3')
6
- s.add_development_dependency('jnunemaker-matchy', '~> 0.4')
7
5
  s.add_development_dependency('json', '~> 1.4')
8
- s.add_development_dependency('mocha', '~> 0.9')
9
6
  s.add_development_dependency('nokogiri', '~> 1.4')
10
7
  s.add_development_dependency('rake', '~> 0.8')
11
- s.add_development_dependency('shoulda', '~> 2.11')
8
+ s.add_development_dependency('rspec', '~> 2.4')
9
+ s.add_development_dependency('simplecov', '~> 0.3')
12
10
  s.add_development_dependency('webmock', '~> 1.6')
13
11
  s.add_development_dependency('ZenTest', '~> 4.4')
14
- s.add_runtime_dependency('addressable', '~> 2.2.2')
12
+ s.add_runtime_dependency('addressable', '~> 2.2.3')
15
13
  s.add_runtime_dependency('hashie', '~> 0.4.0')
16
- s.add_runtime_dependency('faraday', '~> 0.5.3')
14
+ s.add_runtime_dependency('faraday', '~> 0.5.4')
17
15
  s.add_runtime_dependency('faraday_middleware', '~> 0.3.1')
18
16
  s.add_runtime_dependency('multi_json', '~> 0.0.5')
19
17
  s.add_runtime_dependency('multi_xml', '~> 0.2.0')
@@ -0,0 +1,33 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ describe Faraday::Response do
4
+ before do
5
+ @client = Octokit::Client.new
6
+ end
7
+
8
+ {
9
+ 400 => Octokit::BadRequest,
10
+ 401 => Octokit::Unauthorized,
11
+ 403 => Octokit::Forbidden,
12
+ 404 => Octokit::NotFound,
13
+ 406 => Octokit::NotAcceptable,
14
+ 500 => Octokit::InternalServerError,
15
+ 501 => Octokit::NotImplemented,
16
+ 502 => Octokit::BadGateway,
17
+ 503 => Octokit::ServiceUnavailable,
18
+ }.each do |status, exception|
19
+ context "when HTTP status is #{status}" do
20
+
21
+ before do
22
+ stub_get('user/show/sferik').
23
+ to_return(:status => status)
24
+ end
25
+
26
+ it "should raise #{exception.name} error" do
27
+ lambda do
28
+ @client.user('sferik')
29
+ end.should raise_error(exception)
30
+ end
31
+ end
32
+ end
33
+ end