ghee 0.9.12 → 0.10.13

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1cf90688184fcb5ffcfd34e84793c6c3669e28a8
4
- data.tar.gz: 8a4e661f6475492f3e94ee824c6635032c5ef9be
3
+ metadata.gz: 9ec649170d62b1aa4eca48afcccccc946bd35c2b
4
+ data.tar.gz: e44cbef003a21da310360ad264e1fa77899e544c
5
5
  SHA512:
6
- metadata.gz: d8002852068ce7ae36695f21cfa9b95a3f41d17498e58ecf9a498cff2439f379182efcf1e0894fa92ddb35b06b714878b78e45e9a999c1470e0144a5a31eec08
7
- data.tar.gz: 1af7d8adc36e6af9ab92ca059f375a0db11d23970c61419d7bfe01f97fb8b5e5b09f83ad2baeb08bd5e7a724bdf8eaf17663f6325d364cd5b144a70f6997348a
6
+ metadata.gz: 7bb442c4b736e1ff21145ead4be9bfcb5244fc132a93257f997f577dc8da28481f7be14ea984a85959992f891897af47de43fb2b8645277ee288216c18423082
7
+ data.tar.gz: 046d3b69594ecf6ac30bc8e3fc9c157539a91bb956c00fcb488052d06f700c0d2de96965f575fa39fde496d8a0ea9a5875d0212f31f06cedc17ac208f967df62
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/Gemfile CHANGED
@@ -1,2 +1,6 @@
1
1
  source 'https://rubygems.org'
2
+ gem 'excon'
3
+ gem 'em-http-request'
4
+ gem 'em-synchrony'
5
+
2
6
  gemspec
data/ghee.gemspec CHANGED
@@ -18,11 +18,13 @@ Gem::Specification.new do |s|
18
18
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
19
  s.require_paths = ["lib"]
20
20
 
21
- s.add_dependency 'faraday', '< 0.9', '>= 0.8'
21
+ s.add_dependency 'faraday', '~> 0.9'
22
22
  s.add_dependency 'faraday_middleware', '~> 0.9'
23
23
  s.add_dependency 'hashie', '~> 3.3.2'
24
24
  s.add_dependency 'multi_json', '~> 1.3'
25
25
  s.add_dependency 'highline', '~> 1.6.15'
26
+ s.add_dependency 'typhoeus', '~> 0.7.0'
27
+
26
28
  s.add_development_dependency 'rake'
27
29
  s.add_development_dependency 'json_pure'
28
30
  s.add_development_dependency 'rspec', '~>2.9.0'
data/lib/ghee.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # encoding: UTF-8
2
2
  require 'ghee/version'
3
3
  require 'ghee/connection'
4
+ require 'ghee/errors'
4
5
  require 'ghee/uri_escape'
5
6
  require 'ghee/state_methods'
6
7
  require 'ghee/resource_proxy'
@@ -13,7 +14,6 @@ require 'ghee/api/issues'
13
14
  require 'ghee/api/milestones'
14
15
  require 'ghee/api/orgs'
15
16
  require 'ghee/api/git_data'
16
- require 'ghee/api/downloads'
17
17
  require 'ghee/api/labels'
18
18
  require 'ghee/api/hooks'
19
19
  require 'ghee/api/collaborators'
@@ -25,6 +25,7 @@ require 'ghee/api/emails'
25
25
  require 'ghee/api/followers'
26
26
  require 'ghee/api/pulls'
27
27
  require 'ghee/api/search'
28
+ require 'ghee/api/contents'
28
29
 
29
30
  class Ghee
30
31
  attr_reader :connection
@@ -42,9 +43,19 @@ class Ghee
42
43
  # Access_token - String of the access_token
43
44
  #
44
45
  def initialize(options = {}, &block)
46
+ @options = options
47
+ @block = block if block
45
48
  return @connection = Ghee::Connection.new(options, &block)
46
49
  end
47
50
 
51
+ def in_parallel(adapter = :typhoeus, &block)
52
+ ghee = self.class.new @options, &@block
53
+ ghee.connection.adapter adapter
54
+ ghee.connection.in_parallel do
55
+ block.call ghee
56
+ end
57
+ end
58
+
48
59
  def self.basic_auth(user_name, password, api_url = nil)
49
60
  options = { :basic_auth => {:user_name => user_name, :password => password} }
50
61
  options[:api_url] = api_url if api_url
@@ -22,16 +22,15 @@ class Ghee
22
22
  end
23
23
  end
24
24
 
25
- # Gists::Proxy inherits from Ghee::Proxy and
25
+ # Repos::Proxy inherits from Ghee::Proxy and
26
26
  # enables defining methods on the proxy object
27
27
  #
28
28
  class Proxy < ::Ghee::ResourceProxy
29
- def collaborators(user=nil)
30
- prefix = user ? "#{path_prefix}/collaborators/#{user}" : "#{path_prefix}/collaborators"
31
- return user ? connection.get(prefix).status == 204 : Ghee::API::Repos::Collaborators::Proxy.new(connection, prefix)
29
+ def collaborators(user=nil, &block)
30
+ prefix = build_prefix user, "collaborators"
31
+ return (!user.is_a?(Hash) and number) ? connection.get(prefix).status == 204 : Collaborators::Proxy.new(connection, prefix, user, &block)
32
32
  end
33
33
  end
34
-
35
34
  end
36
35
  end
37
36
  end
@@ -14,7 +14,7 @@ class Ghee
14
14
  class Proxy < ::Ghee::ResourceProxy
15
15
 
16
16
  def comments
17
- Ghee::API::Repos::Commits::Comments::Proxy.new connection, path_prefix
17
+ Comments::Proxy.new connection, path_prefix
18
18
  end
19
19
  end
20
20
 
@@ -42,21 +42,20 @@ class Ghee
42
42
  end
43
43
  end
44
44
 
45
- # Gists::Proxy inherits from Ghee::Proxy and
45
+ # Repos::Proxy inherits from Ghee::Proxy and
46
46
  # enables defining methods on the proxy object
47
47
  #
48
48
  class Proxy < ::Ghee::ResourceProxy
49
49
  def compare(base, head)
50
50
  connection.get("#{path_prefix}/compare/#{base}...#{head}").body
51
51
  end
52
- def commits(sha=nil, params={})
53
- params = sha if sha.is_a?Hash
54
- prefix = (!sha.is_a?(Hash) and sha) ? "#{path_prefix}/commits/#{sha}" : "#{path_prefix}/commits"
55
- Ghee::API::Repos::Commits::Proxy.new(connection, prefix, params)
52
+ def commits(sha=nil, &block)
53
+ prefix = build_prefix sha, "commits"
54
+ Commits::Proxy.new(connection, prefix, sha, &block)
56
55
  end
57
- def comments(id=nil)
58
- prefix = id ? "#{path_prefix}/comments/#{id}" : "#{path_prefix}/comments"
59
- Ghee::API::Repos::Comments::Proxy.new connection, prefix
56
+ def comments(id=nil, &block)
57
+ prefix = build_prefix id, "comments"
58
+ Comments::Proxy.new connection, prefix, id, &block
60
59
  end
61
60
  end
62
61
  end
@@ -0,0 +1,47 @@
1
+ class Ghee
2
+
3
+ # API module encapsulates all of API endpoints
4
+ # implemented thus far
5
+ #
6
+ module API
7
+
8
+ # The Repos module handles all of the Github Repo
9
+ # API endpoints
10
+ #
11
+ module Repos
12
+ # The Contents module handles all of the Github repos file contents
13
+ # API endpoints
14
+ #
15
+ module Contents
16
+ class Proxy < ::Ghee::ResourceProxy
17
+ attr_accessor :path
18
+ def create(message, content=nil)
19
+ if content.nil?
20
+ message.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
21
+ attributes = { path: path }.merge message
22
+ attributes[:content] = Base64.encode64 attributes[:content]
23
+ else
24
+ attributes = {
25
+ path: path,
26
+ message: message,
27
+ content: Base64.encode64(content)
28
+ }
29
+ end
30
+ connection.put(path_prefix, attributes).body
31
+ end
32
+ end
33
+ end
34
+
35
+ class Proxy < ::Ghee::ResourceProxy
36
+ def contents(path, &block)
37
+ proxy = Contents::Proxy.new connection, "#{path_prefix}/contents/#{path}", nil, &block
38
+ proxy.path = path
39
+ proxy
40
+ end
41
+ def readme(&block)
42
+ Contents::Proxy.new connection, "#{path_prefix}/readme", {}, &block
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -1,56 +1,54 @@
1
1
  class Ghee
2
2
  module API
3
- module Repos
4
- module Downloads
5
- class Proxy < ::Ghee::ResourceProxy
3
+ module Downloads
4
+ class Proxy < ::Ghee::ResourceProxy
6
5
 
7
- # Creates
8
- #
9
- # return json
10
- #
11
- def create(file_path, description="")
12
- params = {
13
- :name => File.basename(file_path),
14
- :size => File.size(file_path),
15
- :description => description
16
- }
17
- download = connection.post(path_prefix, params).body
18
- s3 = Faraday.new(:url => download["s3_url"]) do |builder|
19
- builder.request :multipart
20
- builder.request :url_encoded
6
+ # Creates
7
+ #
8
+ # return json
9
+ #
10
+ def create(file_path, description="")
11
+ params = {
12
+ :name => File.basename(file_path),
13
+ :size => File.size(file_path),
14
+ :description => description
15
+ }
16
+ download = connection.post(path_prefix, params).body
17
+ s3 = Faraday.new(:url => download["s3_url"]) do |builder|
18
+ builder.request :multipart
19
+ builder.request :url_encoded
21
20
 
22
- builder.adapter :net_http
23
- end
24
- upload = {
25
- :key => download["path"],
26
- :acl => download["acl"],
27
- :success_action_status => 201,
28
- :Filename => download["name"],
29
- :AWSAccessKeyId => download["accesskeyid"],
30
- :Policy => download["policy"],
31
- :Signature => download["signature"],
32
- :"Content-Type" => download["mime_type"],
33
- :file => Faraday::UploadIO.new(file_path, download["mime_type"])
34
- }
35
- s3.post("/",upload).status == 201
36
- return download
21
+ builder.adapter :net_http
37
22
  end
23
+ upload = {
24
+ :key => download["path"],
25
+ :acl => download["acl"],
26
+ :success_action_status => 201,
27
+ :Filename => download["name"],
28
+ :AWSAccessKeyId => download["accesskeyid"],
29
+ :Policy => download["policy"],
30
+ :Signature => download["signature"],
31
+ :"Content-Type" => download["mime_type"],
32
+ :file => Faraday::UploadIO.new(file_path, download["mime_type"])
33
+ }
34
+ s3.post("/",upload).status == 201
35
+ return download
36
+ end
38
37
 
39
- # Destroys
40
- #
41
- # return boolean
42
- #
43
- def destroy
44
- connection.delete(path_prefix).status == 204
45
- end
38
+ # Destroys
39
+ #
40
+ # return boolean
41
+ #
42
+ def destroy
43
+ connection.delete(path_prefix).status == 204
46
44
  end
47
45
  end
46
+ end
48
47
 
49
- class Proxy < ::Ghee::ResourceProxy
50
- def downloads(id=nil)
51
- prefix = id ? "#{path_prefix}/downloads/#{id}" :"#{path_prefix}/downloads"
52
- Ghee::API::Repos::Downloads::Proxy.new(connection, prefix)
53
- end
48
+ class Proxy < ::Ghee::ResourceProxy
49
+ def downloads(id=nil)
50
+ prefix = id ? "#{path_prefix}/downloads/#{id}" :"#{path_prefix}/downloads"
51
+ Ghee::API::Downloads::Proxy.new(connection, prefix)
54
52
  end
55
53
  end
56
54
  end
@@ -131,6 +131,7 @@ class Ghee
131
131
 
132
132
  class Proxy < ::Ghee::ResourceProxy
133
133
 
134
+
134
135
  # Get issues
135
136
  #
136
137
  # Returns json
@@ -23,7 +23,7 @@ class Ghee
23
23
  #
24
24
  # Returns json
25
25
  #
26
- def repos(login,name = nil)
26
+ def repos(login, name = nil)
27
27
  repo = name.nil? ? login : "#{login}/#{name}"
28
28
  path_prefix = "./repos/#{repo}"
29
29
  proxy = Proxy.new(connection, path_prefix)
@@ -21,7 +21,7 @@ class Ghee
21
21
  # Returns json
22
22
  #
23
23
  def gists(params={})
24
- Ghee::API::Gists::Proxy.new(connection,"#{path_prefix}/gists",params)
24
+ Ghee::API::Gists::Proxy.new(connection,"#{path_prefix}/gists", params)
25
25
  end
26
26
 
27
27
  # Repos for a user
@@ -6,6 +6,12 @@ class Ghee
6
6
  class Connection < Faraday::Connection
7
7
  attr_reader :hash
8
8
 
9
+ def parallel_connection(adapter=:typhoeus)
10
+ conn = self.class.new @hash
11
+ conn.adapter adapter
12
+ conn
13
+ end
14
+
9
15
  # Instantiates connection, accepts an options hash
10
16
  # for authenticated access
11
17
  #
@@ -21,13 +27,10 @@ class Ghee
21
27
 
22
28
  super(hash[:api_url] || 'https://api.github.com') do |builder|
23
29
  yield builder if block_given?
30
+ builder.use Faraday::Response::RaiseGheeError
24
31
  builder.use FaradayMiddleware::EncodeJson
25
- builder.use FaradayMiddleware::Mashify
26
- builder.use FaradayMiddleware::ParseJson
27
- # builder.use Ghee::Middleware::UriEscape
32
+ builder.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
28
33
  builder.adapter Faraday.default_adapter
29
-
30
-
31
34
  end
32
35
 
33
36
  self.headers["Authorization"] = "token #{access_token}" if access_token
@@ -0,0 +1,95 @@
1
+ require 'json/ext'
2
+ require 'multi_json'
3
+
4
+ class Ghee
5
+ # Custom error class for rescuing from all GitHub errors
6
+ class Error < StandardError
7
+ def initialize(response=nil)
8
+ @response = response
9
+ super(build_error_message)
10
+ end
11
+
12
+ def response_body
13
+ @response_body ||= if (body = @response[:body]) && !body.empty?
14
+ if false and body.is_a?(String)
15
+ MultiJson.load(body, :symbolize_keys => true)
16
+ else
17
+ body
18
+ end
19
+ else
20
+ nil
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def build_error_message
27
+ return nil if @response.nil?
28
+
29
+ message = if response_body
30
+ "#{response_body["error"] || response_body["message"] || ''}"
31
+ else
32
+ ''
33
+ end
34
+
35
+ errors = unless message.empty?
36
+ response_body["errors"] ? " #{response_body["errors"].to_a.map{|e|e.message || e.code}.join(', ')} " : ''
37
+ end
38
+
39
+ "#{message}#{errors}"
40
+ end
41
+ end
42
+
43
+ # Raised when GitHub returns a 400 HTTP status code
44
+ class BadRequest < Error; end
45
+
46
+ # Raised when GitHub returns a 401 HTTP status code
47
+ class Unauthorized < Error; end
48
+
49
+ # Raised when GitHub returns a 403 HTTP status code
50
+ class Forbidden < Error; end
51
+
52
+ # Raised when GitHub returns a 404 HTTP status code
53
+ class NotFound < Error; end
54
+
55
+ # Raised when GitHub returns a 406 HTTP status code
56
+ class NotAcceptable < Error; end
57
+
58
+ # Raised when GitHub returns a 422 HTTP status code
59
+ class UnprocessableEntity < Error; end
60
+
61
+ # Raised when GitHub returns a 500 HTTP status code
62
+ class InternalServerError < Error; end
63
+
64
+ # Raised when GitHub returns a 501 HTTP status code
65
+ class NotImplemented < Error; end
66
+
67
+ # Raised when GitHub returns a 502 HTTP status code
68
+ class BadGateway < Error; end
69
+
70
+ # Raised when GitHub returns a 503 HTTP status code
71
+ class ServiceUnavailable < Error; end
72
+ end
73
+
74
+ # @api private
75
+ module Faraday
76
+ class Response::RaiseGheeError < Response::Middleware
77
+ ERROR_MAP = {
78
+ 400 => Ghee::BadRequest,
79
+ 401 => Ghee::Unauthorized,
80
+ 403 => Ghee::Forbidden,
81
+ 406 => Ghee::NotAcceptable,
82
+ 422 => Ghee::UnprocessableEntity,
83
+ 500 => Ghee::InternalServerError,
84
+ 501 => Ghee::NotImplemented,
85
+ 502 => Ghee::BadGateway,
86
+ 503 => Ghee::ServiceUnavailable
87
+ }
88
+
89
+ def on_complete(response)
90
+ key = response[:status].to_i
91
+ raise ERROR_MAP[key].new(response) if ERROR_MAP.has_key? key
92
+ end
93
+ end
94
+ end
95
+
@@ -24,9 +24,11 @@ class Ghee
24
24
  # connection - Ghee::Connection object
25
25
  # path_prefix - String
26
26
  #
27
- def initialize(connection, path_prefix, params = {})
27
+ def initialize(connection, path_prefix, params = {}, &block)
28
28
  params = {} if !params.is_a?Hash
29
29
  @connection, @path_prefix, @params = connection, URI.escape(path_prefix), params
30
+ @block = block if block
31
+ subject if block
30
32
  end
31
33
 
32
34
  # Method_missing takes any message passed
@@ -54,7 +56,10 @@ class Ghee
54
56
  # Returns json
55
57
  #
56
58
  def subject
57
- @subject ||= connection.get(path_prefix){|req| req.params.merge!params }.body
59
+ @subject ||= connection.get(path_prefix) do |req|
60
+ req.params.merge!params
61
+ @block.call(req)if @block
62
+ end.body
58
63
  end
59
64
 
60
65
  # Paginate is a helper method to handle
@@ -93,6 +98,25 @@ class Ghee
93
98
  self.all
94
99
  end
95
100
 
101
+ def all_parallel
102
+ connection = @connection.parallel_connection
103
+ headers = connection.head(path_prefix) do |req|
104
+ req.params.merge! params.merge(:per_page => 100)
105
+ end
106
+ pages = pagination_data headers.headers.delete("link")
107
+ requests = []
108
+ connection.in_parallel do
109
+ pages[:pages].to_i.times do |i|
110
+ requests << connection.get(path_prefix) do |req|
111
+ req.params.merge! params.merge(:per_page => 100, :page => i + 1)
112
+ end
113
+ end
114
+ end
115
+ requests.inject([]) do |results, page|
116
+ results.concat(page.body)
117
+ end
118
+ end
119
+
96
120
  # Generate first_page, last_page, next_page, prev_page convienence methods
97
121
  %w{ next prev first last }.each do |term|
98
122
  define_method "#{term}_page" do
@@ -102,6 +126,16 @@ class Ghee
102
126
 
103
127
  private
104
128
 
129
+ def pagination_data(header)
130
+ parse_link_header header
131
+ { pages: @pagination[:last][:page] }
132
+ end
133
+
134
+ def build_prefix(first_argument, endpoint)
135
+ (!first_argument.is_a?(Hash) and first_argument) ?
136
+ "#{path_prefix}/#{endpoint}/#{first_argument}" : "#{path_prefix}/#{endpoint}"
137
+ end
138
+
105
139
  def parse_link_header(header)
106
140
  return @total = subject.size, @pagination = {} if header.nil?
107
141
  require 'cgi'
data/lib/ghee/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  class Ghee
3
- VERSION = "0.9.12"
3
+ VERSION = "0.10.13"
4
4
  end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ghee::API::Repos::Contents do
4
+ subject { Ghee.new(GH_AUTH).repos(GH_USER, GH_REPO) }
5
+
6
+ describe "#readme" do
7
+ it "should return the repos readme" do
8
+ VCR.use_cassette "repos#readme" do
9
+ readme = subject.readme
10
+ readme["name"].downcase.should == "readme.md"
11
+ end
12
+ end
13
+
14
+ it "should return the repos readme" do
15
+ VCR.use_cassette "repos#readme#raw" do
16
+ readme = subject.readme do |req|
17
+ req.headers["Accept"] = "application/vnd.github.v3.raw"
18
+ end
19
+ readme.should be_instance_of String
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "#contents" do
25
+ it "should return the content from a repo path" do
26
+ VCR.use_cassette "repos#contents(path)" do
27
+ readme = subject.contents("readme.md")
28
+ readme["path"].downcase.should == "readme.md"
29
+ end
30
+ end
31
+ it "should create a new file in the repo" do
32
+ temp_file_name = "#{(0...8).map{ ('a'..'z').to_a[rand(26)] }.join}"
33
+ file = subject.contents("#{temp_file_name}.md").create(
34
+ message: "Adds #{temp_file_name}.md through the api",
35
+ content: "# Whoop whoop"
36
+ )
37
+ file['content']['type'].should == "file"
38
+ end
39
+ end
40
+
41
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Ghee::API::Repos::Downloads do
3
+ describe Ghee::API::Downloads do
4
4
  subject { Ghee.new(GH_AUTH).repos(GH_USER,GH_REPO) }
5
5
 
6
6
 
@@ -10,8 +10,8 @@ describe Ghee::API::Events do
10
10
 
11
11
  def should_be_an_event(event)
12
12
  EventTypes.should include(event['type'])
13
- event['repo'].should be_instance_of(Hashie::Mash)
14
- event['actor'].should be_instance_of(Hashie::Mash)
13
+ event['repo'].should be_instance_of(Hash)
14
+ event['actor'].should be_instance_of(Hash)
15
15
  event['created_at'].should_not be_nil
16
16
  end
17
17
 
@@ -5,9 +5,9 @@ describe Ghee::API::Gists do
5
5
 
6
6
  def should_be_a_gist(gist)
7
7
  gist['url'].should include('https://api.github.com/gists/')
8
- gist['user']['url'].should include('https://api.github.com/users/')
8
+ gist['owner']['url'].should include('https://api.github.com/users/')
9
9
  gist['created_at'].should_not be_nil
10
- gist['files'].should be_instance_of(Hashie::Mash)
10
+ gist['files'].should be_instance_of(Hash)
11
11
  gist['files'].size.should > 0
12
12
  end
13
13
 
@@ -15,7 +15,7 @@ describe Ghee::API::Gists do
15
15
  describe "#gists" do
16
16
  it "should return users gists" do
17
17
  VCR.use_cassette('users(login).gists') do
18
- gists = subject.users('jonmagic').gists
18
+ gists = subject.users(GH_USER).gists
19
19
  gists.size.should > 0
20
20
  should_be_a_gist(gists.first)
21
21
  end
@@ -28,8 +28,8 @@ describe Ghee::API::Repos::Issues do
28
28
  it "should return open issues by default" do
29
29
  VCR.use_cassette("repos(#{GH_USER},#{GH_REPO}).issues.search#default") do
30
30
  issues = subject.repos(GH_USER, GH_REPO).issues.search("Seeded")
31
- issues.issues.size.should > 0
32
- should_be_an_issue(issues.issues.first)
31
+ issues['issues'].size.should > 0
32
+ should_be_an_issue(issues['issues'].first)
33
33
  end
34
34
 
35
35
  end
@@ -97,7 +97,7 @@ describe Ghee::API::Repos do
97
97
  VCR.use_cassette("user.repos(#{GH_REPO})") do
98
98
  repo = subject.user.repos(GH_REPO)
99
99
  repo.connection.should_not be_nil
100
- repo.path_prefix.should == "/repos/#{GH_USER}/#{GH_REPO}"
100
+ repo.path_prefix.should == "./repos/#{GH_USER}/#{GH_REPO}"
101
101
  should_be_a_repo(repo)
102
102
  end
103
103
  end
@@ -12,8 +12,8 @@ describe Ghee::API::Search do
12
12
  it "should search open issues by repo by default" do
13
13
  VCR.use_cassette "gh#search#issues#default" do
14
14
  issues = subject.search.issues("#{GH_USER}/#{GH_REPO}", "Seeded")
15
- issues.issues.size.should > 0
16
- should_be_an_issue(issues.issues.first)
15
+ issues['issues'].size.should > 0
16
+ should_be_an_issue(issues['issues'].first)
17
17
  end
18
18
  end
19
19
  end
@@ -47,7 +47,7 @@ describe Ghee::API::Users do
47
47
  VCR.use_cassette "user.repos.public" do
48
48
  repos = subject.user.repos :type => "public"
49
49
  repos.size.should > 0
50
- repos.path_prefix.should == "/user/repos"
50
+ repos.path_prefix.should == "./user/repos"
51
51
  repos.should be_instance_of(Array)
52
52
  repos.each do |r|
53
53
  r["private"].should be_false
@@ -99,16 +99,16 @@ describe Ghee::API::Users do
99
99
  end
100
100
  end
101
101
  describe "#emails" do
102
- it "should add and remove emails" do
102
+ xit "should add and remove emails" do
103
103
  VCR.use_cassette("user#emails") do
104
104
  user = subject.user
105
105
  emails = user.emails.add (["support@microsoft.com","octocat@microsoft.com"])
106
- emails.should include("support@microsoft.com")
107
- emails.should include("octocat@microsoft.com")
106
+ emails.map{ |e| e['email'] }.should include("support@microsoft.com")
107
+ emails.map{ |e| e['email'] }.should include("octocat@microsoft.com")
108
108
  user.emails.remove(["support@microsoft.com","octocat@microsoft.com"]).should be_true
109
109
  emails = user.emails
110
- emails.should_not include("support@microsoft.com")
111
- emails.should_not include("octocat@microsoft.com")
110
+ emails.map{ |e| e['email'] }.should_not include("support@microsoft.com")
111
+ emails.map{ |e| e['email'] }.should_not include("octocat@microsoft.com")
112
112
  end
113
113
  end
114
114
  end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'typhoeus'
3
+ require 'typhoeus/adapters/faraday'
4
+ require 'benchmark'
5
+
6
+ describe "testing concurrencies" do
7
+ subject { Ghee.new(GH_AUTH) }
8
+
9
+ xit "should make requests in parallel" do
10
+ Benchmark.bm do |b|
11
+ b.report do
12
+ subject.in_parallel :em_synchrony do |ghee|
13
+ puts ghee.connection.in_parallel?
14
+ 5.times do |i|
15
+ ghee.repos("rauhryan/huboard").raw
16
+ ghee.repos("rauhryan/huboard").issues.raw
17
+ ghee.repos("rauhryan/huboard").issues.labels.raw
18
+ end
19
+ end
20
+ end
21
+ b.report do
22
+ ghee = subject
23
+ ghee.connection.adapter :typhoeus
24
+ puts ghee.connection.in_parallel?
25
+ 5.times do |i|
26
+ ghee.repos("rauhryan/huboard").raw
27
+ ghee.repos("rauhryan/huboard").issues.raw
28
+ ghee.repos("rauhryan/huboard").issues.labels.raw
29
+ end
30
+ end
31
+ end
32
+ end
33
+ xit "play with paging" do
34
+ Benchmark.bm do |b|
35
+ b.report do
36
+ puts subject.repos("aspnet/mvc").issues.all_parallel.size
37
+ end
38
+ b.report do
39
+ puts subject.repos("aspnet/mvc").issues.all.size
40
+ end
41
+ end
42
+ end
43
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,6 +10,7 @@ VCR.config do |c|
10
10
  c.cassette_library_dir = File.expand_path('../responses', __FILE__)
11
11
  c.stub_with :webmock
12
12
  c.default_cassette_options = {:record => :once}
13
+ c.allow_http_connections_when_no_cassette = true
13
14
  end
14
15
  if File.exists? File.expand_path("../settings.yml", __FILE__)
15
16
  settings = YAML.load_file(File.expand_path('../settings.yml', __FILE__))
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ghee
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.10.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Rauh
@@ -9,194 +9,202 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-16 00:00:00.000000000 Z
12
+ date: 2015-01-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - <
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
20
  version: '0.9'
21
- - - '>='
22
- - !ruby/object:Gem::Version
23
- version: '0.8'
24
21
  type: :runtime
25
22
  prerelease: false
26
23
  version_requirements: !ruby/object:Gem::Requirement
27
24
  requirements:
28
- - - <
25
+ - - "~>"
29
26
  - !ruby/object:Gem::Version
30
27
  version: '0.9'
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0.8'
34
28
  - !ruby/object:Gem::Dependency
35
29
  name: faraday_middleware
36
30
  requirement: !ruby/object:Gem::Requirement
37
31
  requirements:
38
- - - ~>
32
+ - - "~>"
39
33
  - !ruby/object:Gem::Version
40
34
  version: '0.9'
41
35
  type: :runtime
42
36
  prerelease: false
43
37
  version_requirements: !ruby/object:Gem::Requirement
44
38
  requirements:
45
- - - ~>
39
+ - - "~>"
46
40
  - !ruby/object:Gem::Version
47
41
  version: '0.9'
48
42
  - !ruby/object:Gem::Dependency
49
43
  name: hashie
50
44
  requirement: !ruby/object:Gem::Requirement
51
45
  requirements:
52
- - - ~>
46
+ - - "~>"
53
47
  - !ruby/object:Gem::Version
54
48
  version: 3.3.2
55
49
  type: :runtime
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
52
  requirements:
59
- - - ~>
53
+ - - "~>"
60
54
  - !ruby/object:Gem::Version
61
55
  version: 3.3.2
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: multi_json
64
58
  requirement: !ruby/object:Gem::Requirement
65
59
  requirements:
66
- - - ~>
60
+ - - "~>"
67
61
  - !ruby/object:Gem::Version
68
62
  version: '1.3'
69
63
  type: :runtime
70
64
  prerelease: false
71
65
  version_requirements: !ruby/object:Gem::Requirement
72
66
  requirements:
73
- - - ~>
67
+ - - "~>"
74
68
  - !ruby/object:Gem::Version
75
69
  version: '1.3'
76
70
  - !ruby/object:Gem::Dependency
77
71
  name: highline
78
72
  requirement: !ruby/object:Gem::Requirement
79
73
  requirements:
80
- - - ~>
74
+ - - "~>"
81
75
  - !ruby/object:Gem::Version
82
76
  version: 1.6.15
83
77
  type: :runtime
84
78
  prerelease: false
85
79
  version_requirements: !ruby/object:Gem::Requirement
86
80
  requirements:
87
- - - ~>
81
+ - - "~>"
88
82
  - !ruby/object:Gem::Version
89
83
  version: 1.6.15
84
+ - !ruby/object:Gem::Dependency
85
+ name: typhoeus
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - "~>"
89
+ - !ruby/object:Gem::Version
90
+ version: 0.7.0
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - "~>"
96
+ - !ruby/object:Gem::Version
97
+ version: 0.7.0
90
98
  - !ruby/object:Gem::Dependency
91
99
  name: rake
92
100
  requirement: !ruby/object:Gem::Requirement
93
101
  requirements:
94
- - - '>='
102
+ - - ">="
95
103
  - !ruby/object:Gem::Version
96
104
  version: '0'
97
105
  type: :development
98
106
  prerelease: false
99
107
  version_requirements: !ruby/object:Gem::Requirement
100
108
  requirements:
101
- - - '>='
109
+ - - ">="
102
110
  - !ruby/object:Gem::Version
103
111
  version: '0'
104
112
  - !ruby/object:Gem::Dependency
105
113
  name: json_pure
106
114
  requirement: !ruby/object:Gem::Requirement
107
115
  requirements:
108
- - - '>='
116
+ - - ">="
109
117
  - !ruby/object:Gem::Version
110
118
  version: '0'
111
119
  type: :development
112
120
  prerelease: false
113
121
  version_requirements: !ruby/object:Gem::Requirement
114
122
  requirements:
115
- - - '>='
123
+ - - ">="
116
124
  - !ruby/object:Gem::Version
117
125
  version: '0'
118
126
  - !ruby/object:Gem::Dependency
119
127
  name: rspec
120
128
  requirement: !ruby/object:Gem::Requirement
121
129
  requirements:
122
- - - ~>
130
+ - - "~>"
123
131
  - !ruby/object:Gem::Version
124
132
  version: 2.9.0
125
133
  type: :development
126
134
  prerelease: false
127
135
  version_requirements: !ruby/object:Gem::Requirement
128
136
  requirements:
129
- - - ~>
137
+ - - "~>"
130
138
  - !ruby/object:Gem::Version
131
139
  version: 2.9.0
132
140
  - !ruby/object:Gem::Dependency
133
141
  name: webmock
134
142
  requirement: !ruby/object:Gem::Requirement
135
143
  requirements:
136
- - - '>='
144
+ - - ">="
137
145
  - !ruby/object:Gem::Version
138
146
  version: '0'
139
147
  type: :development
140
148
  prerelease: false
141
149
  version_requirements: !ruby/object:Gem::Requirement
142
150
  requirements:
143
- - - '>='
151
+ - - ">="
144
152
  - !ruby/object:Gem::Version
145
153
  version: '0'
146
154
  - !ruby/object:Gem::Dependency
147
155
  name: vcr
148
156
  requirement: !ruby/object:Gem::Requirement
149
157
  requirements:
150
- - - '>='
158
+ - - ">="
151
159
  - !ruby/object:Gem::Version
152
160
  version: '0'
153
161
  type: :development
154
162
  prerelease: false
155
163
  version_requirements: !ruby/object:Gem::Requirement
156
164
  requirements:
157
- - - '>='
165
+ - - ">="
158
166
  - !ruby/object:Gem::Version
159
167
  version: '0'
160
168
  - !ruby/object:Gem::Dependency
161
169
  name: ZenTest
162
170
  requirement: !ruby/object:Gem::Requirement
163
171
  requirements:
164
- - - '>='
172
+ - - ">="
165
173
  - !ruby/object:Gem::Version
166
174
  version: '0'
167
175
  type: :development
168
176
  prerelease: false
169
177
  version_requirements: !ruby/object:Gem::Requirement
170
178
  requirements:
171
- - - '>='
179
+ - - ">="
172
180
  - !ruby/object:Gem::Version
173
181
  version: '0'
174
182
  - !ruby/object:Gem::Dependency
175
183
  name: autotest-growl
176
184
  requirement: !ruby/object:Gem::Requirement
177
185
  requirements:
178
- - - '>='
186
+ - - ">="
179
187
  - !ruby/object:Gem::Version
180
188
  version: '0'
181
189
  type: :development
182
190
  prerelease: false
183
191
  version_requirements: !ruby/object:Gem::Requirement
184
192
  requirements:
185
- - - '>='
193
+ - - ">="
186
194
  - !ruby/object:Gem::Version
187
195
  version: '0'
188
196
  - !ruby/object:Gem::Dependency
189
197
  name: uuidtools
190
198
  requirement: !ruby/object:Gem::Requirement
191
199
  requirements:
192
- - - '>='
200
+ - - ">="
193
201
  - !ruby/object:Gem::Version
194
202
  version: '0'
195
203
  type: :development
196
204
  prerelease: false
197
205
  version_requirements: !ruby/object:Gem::Requirement
198
206
  requirements:
199
- - - '>='
207
+ - - ">="
200
208
  - !ruby/object:Gem::Version
201
209
  version: '0'
202
210
  description: A complete, simple, and intuitive ruby API for all things Github.
@@ -207,9 +215,10 @@ executables:
207
215
  extensions: []
208
216
  extra_rdoc_files: []
209
217
  files:
210
- - .autotest
211
- - .gitignore
212
- - .travis.yml
218
+ - ".autotest"
219
+ - ".gitignore"
220
+ - ".ruby-version"
221
+ - ".travis.yml"
213
222
  - Gemfile
214
223
  - LICENSE
215
224
  - README.md
@@ -220,6 +229,7 @@ files:
220
229
  - lib/ghee/api/authorizations.rb
221
230
  - lib/ghee/api/collaborators.rb
222
231
  - lib/ghee/api/commits.rb
232
+ - lib/ghee/api/contents.rb
223
233
  - lib/ghee/api/downloads.rb
224
234
  - lib/ghee/api/emails.rb
225
235
  - lib/ghee/api/events.rb
@@ -239,14 +249,15 @@ files:
239
249
  - lib/ghee/api/users.rb
240
250
  - lib/ghee/api/watchers.rb
241
251
  - lib/ghee/connection.rb
252
+ - lib/ghee/errors.rb
242
253
  - lib/ghee/resource_proxy.rb
243
254
  - lib/ghee/state_methods.rb
244
255
  - lib/ghee/uri_escape.rb
245
256
  - lib/ghee/version.rb
246
- - spec/fyeah.jpg
247
257
  - spec/ghee/api/authorizations_spec.rb
248
258
  - spec/ghee/api/collaborators_spec.rb
249
- - spec/ghee/api/downloads_spec.rb
259
+ - spec/ghee/api/contents_spec.rb
260
+ - spec/ghee/api/downloads_spec.rb.ignore
250
261
  - spec/ghee/api/events_spec.rb
251
262
  - spec/ghee/api/gists_spec.rb
252
263
  - spec/ghee/api/gitdata_spec.rb
@@ -258,6 +269,7 @@ files:
258
269
  - spec/ghee/api/search_spec.rb
259
270
  - spec/ghee/api/teams_spec.rb
260
271
  - spec/ghee/api/users_spec.rb
272
+ - spec/ghee/concurrency_spec.rb
261
273
  - spec/ghee/connection_spec.rb
262
274
  - spec/ghee/memory_cache_spec.rb
263
275
  - spec/ghee/resource_proxy_spec.rb
@@ -274,25 +286,25 @@ require_paths:
274
286
  - lib
275
287
  required_ruby_version: !ruby/object:Gem::Requirement
276
288
  requirements:
277
- - - '>='
289
+ - - ">="
278
290
  - !ruby/object:Gem::Version
279
291
  version: '0'
280
292
  required_rubygems_version: !ruby/object:Gem::Requirement
281
293
  requirements:
282
- - - '>='
294
+ - - ">="
283
295
  - !ruby/object:Gem::Version
284
296
  version: '0'
285
297
  requirements: []
286
298
  rubyforge_project: ghee
287
- rubygems_version: 2.4.5
299
+ rubygems_version: 2.2.2
288
300
  signing_key:
289
301
  specification_version: 4
290
302
  summary: Access Github in ruby.
291
303
  test_files:
292
- - spec/fyeah.jpg
293
304
  - spec/ghee/api/authorizations_spec.rb
294
305
  - spec/ghee/api/collaborators_spec.rb
295
- - spec/ghee/api/downloads_spec.rb
306
+ - spec/ghee/api/contents_spec.rb
307
+ - spec/ghee/api/downloads_spec.rb.ignore
296
308
  - spec/ghee/api/events_spec.rb
297
309
  - spec/ghee/api/gists_spec.rb
298
310
  - spec/ghee/api/gitdata_spec.rb
@@ -304,6 +316,7 @@ test_files:
304
316
  - spec/ghee/api/search_spec.rb
305
317
  - spec/ghee/api/teams_spec.rb
306
318
  - spec/ghee/api/users_spec.rb
319
+ - spec/ghee/concurrency_spec.rb
307
320
  - spec/ghee/connection_spec.rb
308
321
  - spec/ghee/memory_cache_spec.rb
309
322
  - spec/ghee/resource_proxy_spec.rb
data/spec/fyeah.jpg DELETED
Binary file