Skip to content

Commit 10d3a30

Browse files
author
Dmitriy Zaporozhets
committed
APi for commits. Better api docs
1 parent 4cc169d commit 10d3a30

File tree

10 files changed

+199
-79
lines changed

10 files changed

+199
-79
lines changed

Guardfile

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
guard 'rspec', :version => 2, :all_on_start => false, :all_after_pass => false do
55
watch(%r{^spec/.+_spec\.rb$})
66
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
7+
watch(%r{^lib/api/(.+)\.rb$}) { |m| "spec/requests/api/#{m[1]}_spec.rb" }
78
watch('spec/spec_helper.rb') { "spec" }
89

910
# Rails example

app/views/help/api.html.haml

+77-70
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,96 @@
1-
%h3 API
1+
%h3.page_title API
22
.back_link
33
= link_to help_path do
44
← to index
5-
%hr
5+
%br
66

7-
%ol
7+
%ul.nav.nav-tabs.log-tabs
8+
%li.active
9+
= link_to "README", "#README", 'data-toggle' => 'tab'
810
%li
9-
%a{href: "#README"} README
11+
= link_to "Projects", "#projects", 'data-toggle' => 'tab'
1012
%li
11-
%a{href: "#projects"} Projects
13+
= link_to "Snippets", "#snippets", 'data-toggle' => 'tab'
1214
%li
13-
%a{href: "#snippets"} Snippets
15+
= link_to "Users", "#users", 'data-toggle' => 'tab'
1416
%li
15-
%a{href: "#users"} Users
17+
= link_to "Session", "#session", 'data-toggle' => 'tab'
1618
%li
17-
%a{href: "#session"} Session
19+
= link_to "Issues", "#issues", 'data-toggle' => 'tab'
1820
%li
19-
%a{href: "#issues"} Issues
21+
= link_to "Milestones", "#milestones", 'data-toggle' => 'tab'
2022
%li
21-
%a{href: "#milestones"} Milestones
22-
23-
.file_holder#README
24-
.file_title
25-
%i.icon-file
26-
README
27-
.file_content.wiki
28-
= preserve do
29-
= markdown File.read(Rails.root.join("doc", "api", "README.md"))
30-
31-
%br
32-
33-
.file_holder#projects
34-
.file_title
35-
%i.icon-file
36-
Projects
37-
.file_content.wiki
38-
= preserve do
39-
= markdown File.read(Rails.root.join("doc", "api", "projects.md"))
40-
41-
%br
42-
43-
.file_holder#snippets
44-
.file_title
45-
%i.icon-file
46-
Projects Snippets
47-
.file_content.wiki
48-
= preserve do
49-
= markdown File.read(Rails.root.join("doc", "api", "snippets.md"))
23+
= link_to "Commits", "#commits", 'data-toggle' => 'tab'
5024

51-
%br
25+
.tab-content
26+
.tab-pane.active#README
27+
.file_holder
28+
.file_title
29+
%i.icon-file
30+
README
31+
.file_content.wiki
32+
= preserve do
33+
= markdown File.read(Rails.root.join("doc", "api", "README.md"))
5234

53-
.file_holder#users
54-
.file_title
55-
%i.icon-file
56-
Users
57-
.file_content.wiki
58-
= preserve do
59-
= markdown File.read(Rails.root.join("doc", "api", "users.md"))
35+
.tab-pane#projects
36+
.file_holder
37+
.file_title
38+
%i.icon-file
39+
Projects
40+
.file_content.wiki
41+
= preserve do
42+
= markdown File.read(Rails.root.join("doc", "api", "projects.md"))
6043

61-
%br
44+
.tab-pane#snippets
45+
.file_holder
46+
.file_title
47+
%i.icon-file
48+
Projects Snippets
49+
.file_content.wiki
50+
= preserve do
51+
= markdown File.read(Rails.root.join("doc", "api", "snippets.md"))
6252

63-
.file_holder#session
64-
.file_title
65-
%i.icon-file
66-
Session
67-
.file_content.wiki
68-
= preserve do
69-
= markdown File.read(Rails.root.join("doc", "api", "session.md"))
53+
.tab-pane#users
54+
.file_holder
55+
.file_title
56+
%i.icon-file
57+
Users
58+
.file_content.wiki
59+
= preserve do
60+
= markdown File.read(Rails.root.join("doc", "api", "users.md"))
7061

71-
%br
62+
.tab-pane#session
63+
.file_holder
64+
.file_title
65+
%i.icon-file
66+
Session
67+
.file_content.wiki
68+
= preserve do
69+
= markdown File.read(Rails.root.join("doc", "api", "session.md"))
7270

73-
.file_holder#issues
74-
.file_title
75-
%i.icon-file
76-
Issues
77-
.file_content.wiki
78-
= preserve do
79-
= markdown File.read(Rails.root.join("doc", "api", "issues.md"))
71+
.tab-pane#issues
72+
.file_holder
73+
.file_title
74+
%i.icon-file
75+
Issues
76+
.file_content.wiki
77+
= preserve do
78+
= markdown File.read(Rails.root.join("doc", "api", "issues.md"))
8079

81-
%br
80+
.tab-pane#milestones
81+
.file_holder
82+
.file_title
83+
%i.icon-file
84+
Milestones
85+
.file_content.wiki
86+
= preserve do
87+
= markdown File.read(Rails.root.join("doc", "api", "milestones.md"))
8288

83-
.file_holder#milestones
84-
.file_title
85-
%i.icon-file
86-
Milestones
87-
.file_content.wiki
88-
= preserve do
89-
= markdown File.read(Rails.root.join("doc", "api", "milestones.md"))
89+
.tab-pane#commits
90+
.file_holder
91+
.file_title
92+
%i.icon-file
93+
Commits
94+
.file_content.wiki
95+
= preserve do
96+
= markdown File.read(Rails.root.join("doc", "api", "commits.md"))

doc/api/commits.md

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
## List Commits
2+
3+
Get a list of project commits.
4+
5+
```
6+
GET /projects/:id/commits
7+
```
8+
9+
Parameters:
10+
11+
+ `id` (required) - The ID or code name of a project
12+
+ `ref_name` (optional) - branch/tag name
13+
+ `page` (optional)
14+
+ `per_page` (optional)
15+
16+
17+
```json
18+
19+
[
20+
{
21+
"id": "ed899a2f4b50b4370feeea94676502b42383c746",
22+
"short_id": "ed899a2f4b5",
23+
"title": "Replace sanitize with escape once",
24+
"author_name": "Dmitriy Zaporozhets",
25+
"author_email": "[email protected]",
26+
"created_at": "2012-09-20T11:50:22+03:00"
27+
},
28+
{
29+
"id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
30+
"short_id": "6104942438c",
31+
"title": "Sanitize for network graph",
32+
"author_name": "randx",
33+
"author_email": "[email protected]",
34+
"created_at": "2012-09-20T09:06:12+03:00"
35+
}
36+
]
37+
38+
```

lib/api.rb

+1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@ class API < Grape::API
1919
mount Milestones
2020
mount Keys
2121
mount Session
22+
mount Commits
2223
end
2324
end

lib/api/commits.rb

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module Gitlab
2+
# Commits API
3+
class Commits < Grape::API
4+
before { authenticate! }
5+
6+
resource :projects do
7+
# Get a list of project commits
8+
#
9+
# Parameters:
10+
# id (required) - The ID or code name of a project
11+
# ref_name (optional) - Name of branch or tag
12+
# page (optional) - default is 0
13+
# per_page (optional) - default is 20
14+
# Example Request:
15+
# GET /projects/:id/commits
16+
get ":id/commits" do
17+
authorize! :download_code, user_project
18+
19+
page = params[:page] || 0
20+
per_page = params[:per_page] || 20
21+
ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
22+
23+
commits = user_project.commits(ref, nil, per_page, page * per_page)
24+
25+
present CommitDecorator.decorate(commits), with: Entities::Commit
26+
end
27+
end
28+
end
29+
end

lib/api/entities.rb

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ class Hook < Grape::Entity
1717
expose :id, :url
1818
end
1919

20+
class Commit < Grape::Entity
21+
expose :id, :short_id, :title,
22+
:author_name, :author_email, :created_at
23+
end
24+
2025
class Project < Grape::Entity
2126
expose :id, :code, :name, :description, :path, :default_branch
2227
expose :owner, using: Entities::UserBasic

lib/api/helpers.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def render_api_error!(message, status)
6161
error!({'message' => message}, status)
6262
end
6363

64-
private
64+
private
6565

6666
def abilities
6767
@abilities ||= begin

lib/api/milestones.rb

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class Milestones < Grape::API
1111
# Example Request:
1212
# GET /projects/:id/milestones
1313
get ":id/milestones" do
14+
authorize! :read_milestone, user_project
15+
1416
present paginate(user_project.milestones), with: Entities::Milestone
1517
end
1618

@@ -22,6 +24,8 @@ class Milestones < Grape::API
2224
# Example Request:
2325
# GET /projects/:id/milestones/:milestone_id
2426
get ":id/milestones/:milestone_id" do
27+
authorize! :read_milestone, user_project
28+
2529
@milestone = user_project.milestones.find(params[:milestone_id])
2630
present @milestone, with: Entities::Milestone
2731
end
@@ -36,6 +40,8 @@ class Milestones < Grape::API
3640
# Example Request:
3741
# POST /projects/:id/milestones
3842
post ":id/milestones" do
43+
authorize! :admin_milestone, user_project
44+
3945
attrs = attributes_for_keys [:title, :description, :due_date]
4046
@milestone = user_project.milestones.new attrs
4147
if @milestone.save

lib/api/projects.rb

+12-8
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ class Projects < Grape::API
4040
post do
4141
params[:code] ||= params[:name]
4242
params[:path] ||= params[:name]
43-
attrs = attributes_for_keys [:code,
44-
:path,
45-
:name,
46-
:description,
47-
:default_branch,
48-
:issues_enabled,
49-
:wall_enabled,
50-
:merge_requests_enabled,
43+
attrs = attributes_for_keys [:code,
44+
:path,
45+
:name,
46+
:description,
47+
:default_branch,
48+
:issues_enabled,
49+
:wall_enabled,
50+
:merge_requests_enabled,
5151
:wiki_enabled]
5252
@project = Project.create_by_user(attrs, current_user)
5353
if @project.saved?
@@ -207,6 +207,8 @@ class Projects < Grape::API
207207
# Example Request:
208208
# POST /projects/:id/snippets
209209
post ":id/snippets" do
210+
authorize! :write_snippet, user_project
211+
210212
attrs = attributes_for_keys [:title, :file_name]
211213
attrs[:expires_at] = params[:lifetime] if params[:lifetime].present?
212214
attrs[:content] = params[:code] if params[:code].present?
@@ -282,6 +284,8 @@ class Projects < Grape::API
282284
# Example Request:
283285
# GET /projects/:id/repository/commits/:sha/blob
284286
get ":id/repository/commits/:sha/blob" do
287+
authorize! :download_code, user_project
288+
285289
ref = params[:sha]
286290

287291
commit = user_project.commit ref

spec/requests/api/commits_spec.rb

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
require 'spec_helper'
2+
3+
describe Gitlab::API do
4+
include ApiHelpers
5+
6+
let(:user) { Factory :user }
7+
let!(:project) { Factory :project, owner: user }
8+
9+
describe "GET /projects/:id/commits" do
10+
context "authorized user" do
11+
before { project.add_access(user, :read) }
12+
13+
it "should return project commits" do
14+
get api("/projects/#{project.code}/commits", user)
15+
response.status.should == 200
16+
17+
json_response.should be_an Array
18+
json_response.first['id'].should == project.commit.id
19+
end
20+
end
21+
22+
context "unauthorized user" do
23+
it "should return project commits" do
24+
get api("/projects/#{project.code}/commits")
25+
response.status.should == 401
26+
end
27+
end
28+
end
29+
end

0 commit comments

Comments
 (0)