github_api 0.6.1 → 0.6.2
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.md +54 -74
- data/features/cassettes/git_data/tags/get.yml +51 -0
- data/features/cassettes/markdown/render.yml +46 -0
- data/features/cassettes/markdown/render_raw.yml +46 -0
- data/features/cassettes/repos/branch.yml +61 -0
- data/features/git_data/tags.feature +17 -0
- data/features/markdown.feature +25 -0
- data/features/repos.feature +10 -0
- data/features/step_definitions/common_steps.rb +6 -1
- data/lib/github_api.rb +1 -0
- data/lib/github_api/api.rb +5 -1
- data/lib/github_api/client.rb +21 -17
- data/lib/github_api/connection.rb +22 -17
- data/lib/github_api/constants.rb +6 -0
- data/lib/github_api/markdown.rb +64 -0
- data/lib/github_api/repos.rb +13 -0
- data/lib/github_api/repos/contents.rb +3 -0
- data/lib/github_api/request.rb +7 -4
- data/lib/github_api/version.rb +1 -1
- data/spec/fixtures/repos/branch.json +53 -0
- data/spec/github/gists/comments_spec.rb +2 -2
- data/spec/github/gists_spec.rb +6 -6
- data/spec/github/git_data/blobs_spec.rb +1 -1
- data/spec/github/git_data/commits_spec.rb +1 -1
- data/spec/github/git_data/references_spec.rb +2 -2
- data/spec/github/git_data/tags_spec.rb +1 -1
- data/spec/github/git_data/trees_spec.rb +4 -2
- data/spec/github/pull_requests/comments_spec.rb +2 -2
- data/spec/github/pull_requests_spec.rb +4 -4
- data/spec/github/repos/hooks_spec.rb +15 -14
- data/spec/github/repos_spec.rb +40 -0
- data/spec/github/users/keys_spec.rb +2 -2
- metadata +41 -44
data/lib/github_api.rb
CHANGED
data/lib/github_api/api.rb
CHANGED
@@ -24,6 +24,7 @@ module Github
|
|
24
24
|
include Normalizer
|
25
25
|
|
26
26
|
attr_reader *Configuration::VALID_OPTIONS_KEYS
|
27
|
+
|
27
28
|
attr_accessor *VALID_API_KEYS
|
28
29
|
|
29
30
|
# Callback to update global configuration options
|
@@ -37,8 +38,10 @@ module Github
|
|
37
38
|
end
|
38
39
|
|
39
40
|
# Creates new API
|
40
|
-
def initialize(options
|
41
|
+
def initialize(options={}, &block)
|
42
|
+
super()
|
41
43
|
options = Github.options.merge(options)
|
44
|
+
|
42
45
|
Configuration::VALID_OPTIONS_KEYS.each do |key|
|
43
46
|
send("#{key}=", options[key])
|
44
47
|
end
|
@@ -93,6 +96,7 @@ module Github
|
|
93
96
|
{ 'user' => self.user, 'repo' => self.repo }.merge!(params)
|
94
97
|
end
|
95
98
|
|
99
|
+
# TODO: See whether still needed, consider adding to core_exts
|
96
100
|
def _hash_traverse(hash, &block)
|
97
101
|
hash.each do |key, val|
|
98
102
|
block.call(key)
|
data/lib/github_api/client.rb
CHANGED
@@ -3,6 +3,12 @@
|
|
3
3
|
module Github
|
4
4
|
class Client < API
|
5
5
|
|
6
|
+
# This is a read-only API to the GitHub events.
|
7
|
+
# These events power the various activity streams on the site.
|
8
|
+
def events(options = {})
|
9
|
+
@events ||= ApiFactory.new 'Events', options
|
10
|
+
end
|
11
|
+
|
6
12
|
def gists(options = {})
|
7
13
|
@gists ||= ApiFactory.new 'Gists', options
|
8
14
|
end
|
@@ -19,6 +25,17 @@ module Github
|
|
19
25
|
@issues ||= ApiFactory.new 'Issues', options
|
20
26
|
end
|
21
27
|
|
28
|
+
def markdown(options = {})
|
29
|
+
@markdown ||= ApiFactory.new 'Markdown', options
|
30
|
+
end
|
31
|
+
|
32
|
+
# An API for users to manage their own tokens. You can only access your own
|
33
|
+
# tokens, and only through Basic Authentication.
|
34
|
+
def oauth(options = {})
|
35
|
+
@oauth ||= ApiFactory.new 'Authorizations', options
|
36
|
+
end
|
37
|
+
alias :authorizations :oauth
|
38
|
+
|
22
39
|
def orgs(options = {})
|
23
40
|
@orgs ||= ApiFactory.new 'Orgs', options
|
24
41
|
end
|
@@ -33,28 +50,15 @@ module Github
|
|
33
50
|
end
|
34
51
|
alias :repositories :repos
|
35
52
|
|
36
|
-
# Many of the resources on the users API provide a shortcut for getting
|
37
|
-
# information about the currently authenticated user.
|
38
|
-
def users(options = {})
|
39
|
-
@users ||= ApiFactory.new 'Users', options
|
40
|
-
end
|
41
|
-
|
42
|
-
# This is a read-only API to the GitHub events.
|
43
|
-
# These events power the various activity streams on the site.
|
44
|
-
def events(options = {})
|
45
|
-
@events ||= ApiFactory.new 'Events', options
|
46
|
-
end
|
47
|
-
|
48
53
|
def search(options = {})
|
49
54
|
@search ||= ApiFactory.new 'Search', options
|
50
55
|
end
|
51
56
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
def
|
55
|
-
@
|
57
|
+
# Many of the resources on the users API provide a shortcut for getting
|
58
|
+
# information about the currently authenticated user.
|
59
|
+
def users(options = {})
|
60
|
+
@users ||= ApiFactory.new 'Users', options
|
56
61
|
end
|
57
|
-
alias :authorizations :oauth
|
58
62
|
|
59
63
|
end # Client
|
60
64
|
end # Github
|
@@ -12,29 +12,34 @@ require 'github_api/request/jsonize'
|
|
12
12
|
|
13
13
|
module Github
|
14
14
|
module Connection
|
15
|
+
extend self
|
16
|
+
include Github::Constants
|
15
17
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
private
|
18
|
+
ALLOWED_OPTIONS = [
|
19
|
+
:headers,
|
20
|
+
:url,
|
21
|
+
:params,
|
22
|
+
:request,
|
23
|
+
:ssl
|
24
|
+
].freeze
|
25
25
|
|
26
26
|
def default_options(options={}) # :nodoc:
|
27
27
|
{
|
28
28
|
:headers => {
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
ACCEPT => "application/vnd.github.v3.raw+json," \
|
30
|
+
"application/vnd.github.beta.raw+json;q=0.5," \
|
31
|
+
"application/json;q=0.1",
|
32
|
+
ACCEPT_CHARSET => "utf-8",
|
33
|
+
USER_AGENT => user_agent,
|
34
|
+
CONTENT_TYPE => 'application/x-www-form-urlencoded'
|
32
35
|
},
|
33
36
|
:ssl => { :verify => false },
|
34
|
-
:url => endpoint
|
35
|
-
}
|
37
|
+
:url => options.fetch(:endpoint) { Github.endpoint }
|
38
|
+
}.merge(options)
|
36
39
|
end
|
37
40
|
|
41
|
+
@connection = nil
|
42
|
+
|
38
43
|
def clear_cache # :nodoc:
|
39
44
|
@connection = nil
|
40
45
|
end
|
@@ -45,12 +50,12 @@ module Github
|
|
45
50
|
|
46
51
|
def connection(options = {}) # :nodoc:
|
47
52
|
|
48
|
-
|
53
|
+
conn_options = default_options(options)
|
49
54
|
clear_cache unless options.empty?
|
50
55
|
|
51
56
|
@connection ||= begin
|
52
|
-
Faraday.new(
|
53
|
-
puts
|
57
|
+
Faraday.new(conn_options) do |builder|
|
58
|
+
puts "OPTIONS:#{conn_options.inspect}" if ENV['DEBUG']
|
54
59
|
|
55
60
|
builder.use Github::Request::Jsonize
|
56
61
|
builder.use Faraday::Request::Multipart
|
data/lib/github_api/constants.rb
CHANGED
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Github
|
4
|
+
class Markdown < API
|
5
|
+
|
6
|
+
# Creates new Markdown API
|
7
|
+
def initialize(options = {})
|
8
|
+
super(options)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Render an arbritrary Markdown document
|
12
|
+
#
|
13
|
+
# = Parameters
|
14
|
+
# <tt>:text</tt> - Required string - The Markdown text to render
|
15
|
+
# <tt>:mode<tt> - Optional string - The rendering mode
|
16
|
+
# * <tt>markdown</tt> to render a document as plain Markdown, just
|
17
|
+
# like README files are rendered.
|
18
|
+
# * <tt>gfm</tt> to render a document as user-content, e.g. like user
|
19
|
+
# comments or issues are rendered. In GFM mode, hard line breaks are
|
20
|
+
# always taken into account, and issue and user mentions are
|
21
|
+
# linked accordingly.
|
22
|
+
# <tt>:context<tt> - Optional string - The repository context, only taken
|
23
|
+
# into account when rendering as <tt>gfm</tt>
|
24
|
+
#
|
25
|
+
# = Examples
|
26
|
+
# github = Github.new
|
27
|
+
# github.markdown.render
|
28
|
+
# "text": "Hello world github/linguist#1 **cool**, and #1!",
|
29
|
+
# "mode": "gfm",
|
30
|
+
# "context": "github/gollum"
|
31
|
+
#
|
32
|
+
def render(*args)
|
33
|
+
params = args.extract_options!
|
34
|
+
normalize! params
|
35
|
+
|
36
|
+
assert_required_keys ['text'], params
|
37
|
+
post_request("markdown", params, :raw => true)
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Render a Markdown document in raw mode
|
42
|
+
#
|
43
|
+
# = Input
|
44
|
+
# The raw API it not JSON-based. It takes a Markdown document as plaintext
|
45
|
+
# <tt>text/plain</tt> or <tt>text/x-markdown</tt> and renders it as plain
|
46
|
+
# Markdown without a repository context (just like a README.md file is
|
47
|
+
# rendered – this is the simplest way to preview a readme online)
|
48
|
+
#
|
49
|
+
# = Examples
|
50
|
+
# github = Github.new
|
51
|
+
# github.markdown.render_raw "Hello github/linguist#1 **cool**, and #1!",
|
52
|
+
# "mime": "text/plain",
|
53
|
+
#
|
54
|
+
def render_raw(*args)
|
55
|
+
params = args.extract_options!
|
56
|
+
normalize! params
|
57
|
+
mime_type, params['data'] = params['mime'], args.shift
|
58
|
+
|
59
|
+
post_request("markdown/raw", params, :raw => true,
|
60
|
+
:headers => {'Content-Type' => mime_type || 'text/plain'})
|
61
|
+
end
|
62
|
+
|
63
|
+
end # Markdown
|
64
|
+
end # Github
|
data/lib/github_api/repos.rb
CHANGED
@@ -108,6 +108,19 @@ module Github
|
|
108
108
|
end
|
109
109
|
alias :list_branches :branches
|
110
110
|
|
111
|
+
# Get branch
|
112
|
+
#
|
113
|
+
# = Examples
|
114
|
+
#
|
115
|
+
# github = Github.new
|
116
|
+
# github.repos.branch 'user-name', 'repo-name', 'branch-name'
|
117
|
+
#
|
118
|
+
def branch(user_name, repo_name, branch, params={})
|
119
|
+
normalize! params
|
120
|
+
|
121
|
+
get_request("repos/#{user_name}/#{repo_name}/branches/#{branch}", params)
|
122
|
+
end
|
123
|
+
|
111
124
|
# Create a new repository for the autheticated user.
|
112
125
|
#
|
113
126
|
# = Parameters
|
@@ -22,6 +22,9 @@ module Github
|
|
22
22
|
#
|
23
23
|
# This method returns the contents of any file or directory in a repository.
|
24
24
|
#
|
25
|
+
# = Parameters
|
26
|
+
# * <tt>:ref</tt> - Optional string - valid Git reference, defaults to master
|
27
|
+
#
|
25
28
|
# = Examples
|
26
29
|
# github = Github.new
|
27
30
|
# github.repos.contents.get 'user-name', 'repo-name', 'path'
|
data/lib/github_api/request.rb
CHANGED
@@ -31,18 +31,21 @@ module Github
|
|
31
31
|
if !METHODS.include?(method)
|
32
32
|
raise ArgumentError, "unkown http method: #{method}"
|
33
33
|
end
|
34
|
-
_extract_mime_type(params, options)
|
34
|
+
# _extract_mime_type(params, options)
|
35
35
|
|
36
36
|
puts "EXECUTED: #{method} - #{path} with #{params} and #{options}" if ENV['DEBUG']
|
37
37
|
|
38
|
-
|
38
|
+
conn = connection(options)
|
39
|
+
path = (conn.path_prefix + path).gsub(/\/\//,'/') if conn.path_prefix != '/'
|
40
|
+
|
41
|
+
response = conn.send(method) do |request|
|
39
42
|
case method.to_sym
|
40
43
|
when *(METHODS - METHODS_WITH_BODIES)
|
41
44
|
request.body = params.delete('data') if params.has_key?('data')
|
42
45
|
request.url(path, params)
|
43
46
|
when *METHODS_WITH_BODIES
|
44
47
|
request.path = path
|
45
|
-
request.body =
|
48
|
+
request.body = extract_data_from_params(params) unless params.empty?
|
46
49
|
end
|
47
50
|
end
|
48
51
|
response.body
|
@@ -50,7 +53,7 @@ module Github
|
|
50
53
|
|
51
54
|
private
|
52
55
|
|
53
|
-
def
|
56
|
+
def extract_data_from_params(params) # :nodoc:
|
54
57
|
return params['data'] if params.has_key?('data') and !params['data'].nil?
|
55
58
|
return params
|
56
59
|
end
|
data/lib/github_api/version.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
{
|
2
|
+
"name": "master",
|
3
|
+
"commit": {
|
4
|
+
"sha": "7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
|
5
|
+
"commit": {
|
6
|
+
"author": {
|
7
|
+
"name": "The Octocat",
|
8
|
+
"date": "2012-03-06T15:06:50-08:00",
|
9
|
+
"email": "octocat@nowhere.com"
|
10
|
+
},
|
11
|
+
"url": "https://api.github.com/repos/octocat/Hello-World/git/commits/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
|
12
|
+
"message": "Merge pull request #6 from Spaceghost/patch-1\n\nNew line at end of file.",
|
13
|
+
"tree": {
|
14
|
+
"sha": "b4eecafa9be2f2006ce1b709d6857b07069b4608",
|
15
|
+
"url": "https://api.github.com/repos/octocat/Hello-World/git/trees/b4eecafa9be2f2006ce1b709d6857b07069b4608"
|
16
|
+
},
|
17
|
+
"committer": {
|
18
|
+
"name": "The Octocat",
|
19
|
+
"date": "2012-03-06T15:06:50-08:00",
|
20
|
+
"email": "octocat@nowhere.com"
|
21
|
+
}
|
22
|
+
},
|
23
|
+
"author": {
|
24
|
+
"gravatar_id": "7ad39074b0584bc555d0417ae3e7d974",
|
25
|
+
"avatar_url": "https://secure.gravatar.com/avatar/7ad39074b0584bc555d0417ae3e7d974?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png",
|
26
|
+
"url": "https://api.github.com/users/octocat",
|
27
|
+
"id": 583231,
|
28
|
+
"login": "octocat"
|
29
|
+
},
|
30
|
+
"parents": [
|
31
|
+
{
|
32
|
+
"sha": "553c2077f0edc3d5dc5d17262f6aa498e69d6f8e",
|
33
|
+
"url": "https://api.github.com/repos/octocat/Hello-World/commits/553c2077f0edc3d5dc5d17262f6aa498e69d6f8e"
|
34
|
+
},
|
35
|
+
{
|
36
|
+
"sha": "762941318ee16e59dabbacb1b4049eec22f0d303",
|
37
|
+
"url": "https://api.github.com/repos/octocat/Hello-World/commits/762941318ee16e59dabbacb1b4049eec22f0d303"
|
38
|
+
}
|
39
|
+
],
|
40
|
+
"url": "https://api.github.com/repos/octocat/Hello-World/commits/7fd1a60b01f91b314f59955a4e4d4e80d8edf11d",
|
41
|
+
"committer": {
|
42
|
+
"gravatar_id": "7ad39074b0584bc555d0417ae3e7d974",
|
43
|
+
"avatar_url": "https://secure.gravatar.com/avatar/7ad39074b0584bc555d0417ae3e7d974?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png",
|
44
|
+
"url": "https://api.github.com/users/octocat",
|
45
|
+
"id": 583231,
|
46
|
+
"login": "octocat"
|
47
|
+
}
|
48
|
+
},
|
49
|
+
"_links": {
|
50
|
+
"html": "https://github.com/octocat/Hello-World/tree/master",
|
51
|
+
"self": "https://api.github.com/repos/octocat/Hello-World/branches/master"
|
52
|
+
}
|
53
|
+
}
|
@@ -121,7 +121,7 @@ describe Github::Gists::Comments do
|
|
121
121
|
context "resouce created" do
|
122
122
|
before do
|
123
123
|
stub_post("/gists/#{gist_id}/comments").
|
124
|
-
with(
|
124
|
+
with(inputs.except('unrelated')).
|
125
125
|
to_return(:body => fixture('gists/comment.json'),
|
126
126
|
:status => 201,
|
127
127
|
:headers => {:content_type => "application/json; charset=utf-8"})
|
@@ -173,7 +173,7 @@ describe Github::Gists::Comments do
|
|
173
173
|
context "resouce edited" do
|
174
174
|
before do
|
175
175
|
stub_patch("/gists/comments/#{comment_id}").
|
176
|
-
with(
|
176
|
+
with(inputs.except('unrelated')).
|
177
177
|
to_return(:body => fixture('gists/comment.json'),
|
178
178
|
:status => 201,
|
179
179
|
:headers => {:content_type => "application/json; charset=utf-8"})
|
data/spec/github/gists_spec.rb
CHANGED
@@ -200,10 +200,10 @@ describe Github::Gists do
|
|
200
200
|
context "resouce created" do
|
201
201
|
before do
|
202
202
|
stub_post("/gists").
|
203
|
-
with(
|
203
|
+
with(inputs).
|
204
204
|
to_return(:body => fixture('gists/gist.json'),
|
205
|
-
|
206
|
-
|
205
|
+
:status => 201,
|
206
|
+
:headers => {:content_type => "application/json; charset=utf-8"})
|
207
207
|
end
|
208
208
|
|
209
209
|
it "should fail to create resource if 'files' input is missing" do
|
@@ -280,10 +280,10 @@ describe Github::Gists do
|
|
280
280
|
context "resouce edited" do
|
281
281
|
before do
|
282
282
|
stub_patch("/gists/#{gist_id}").
|
283
|
-
with(
|
283
|
+
with(inputs).
|
284
284
|
to_return(:body => fixture('gists/gist.json'),
|
285
|
-
|
286
|
-
|
285
|
+
:status => 200,
|
286
|
+
:headers => {:content_type => "application/json; charset=utf-8"})
|
287
287
|
end
|
288
288
|
|
289
289
|
it "should edit resource successfully" do
|
@@ -73,7 +73,7 @@ describe Github::GitData::Blobs do
|
|
73
73
|
context "resouce created" do
|
74
74
|
before do
|
75
75
|
stub_post("/repos/#{user}/#{repo}/git/blobs").
|
76
|
-
with(
|
76
|
+
with(inputs.except('unrelated')).
|
77
77
|
to_return(:body => fixture('git_data/blob_sha.json'),
|
78
78
|
:status => 201,
|
79
79
|
:headers => {:content_type => "application/json; charset=utf-8"})
|
@@ -79,7 +79,7 @@ describe Github::GitData::Commits, :type => :base do
|
|
79
79
|
context "resouce created" do
|
80
80
|
before do
|
81
81
|
stub_post("/repos/#{user}/#{repo}/git/commits").
|
82
|
-
with(
|
82
|
+
with(inputs.except('unrelated')).
|
83
83
|
to_return(:body => fixture('git_data/commit.json'), :status => 201, :headers => {:content_type => "application/json; charset=utf-8"})
|
84
84
|
end
|
85
85
|
|
@@ -154,7 +154,7 @@ describe Github::GitData::References do
|
|
154
154
|
context "resouce created" do
|
155
155
|
before do
|
156
156
|
stub_post("/repos/#{user}/#{repo}/git/refs").
|
157
|
-
with(
|
157
|
+
with(inputs.except('unrelated')).
|
158
158
|
to_return(:body => fixture('git_data/reference.json'), :status => 201,
|
159
159
|
:headers => {:content_type => "application/json; charset=utf-8"})
|
160
160
|
end
|
@@ -220,7 +220,7 @@ describe Github::GitData::References do
|
|
220
220
|
context "resouce updated" do
|
221
221
|
before do
|
222
222
|
stub_patch("/repos/#{user}/#{repo}/git/refs/#{ref}").
|
223
|
-
with(
|
223
|
+
with(inputs.except('unrelated')).
|
224
224
|
to_return(:body => fixture('git_data/reference.json'), :status => 201, :headers => {:content_type => "application/json; charset=utf-8"})
|
225
225
|
end
|
226
226
|
|