Commit 318350e34fcd0b0754526fdfb94c484b8bb88837
Exists in
master
and in
4 other branches
Merge branch 'api' of https://github.com/NARKOZ/gitlabhq
Conflicts: Gemfile.lock
Showing
9 changed files
with
206 additions
and
0 deletions
Show diff stats
Gemfile
... | ... | @@ -18,6 +18,7 @@ gem 'yaml_db', :git => "https://github.com/gitlabhq/yaml_db.git" |
18 | 18 | gem 'grack', :git => "https://github.com/gitlabhq/grack.git" |
19 | 19 | gem "linguist", "~> 1.0.0", :git => "https://github.com/gitlabhq/linguist.git" |
20 | 20 | |
21 | +gem "grape" | |
21 | 22 | gem "stamp" |
22 | 23 | gem "kaminari" |
23 | 24 | gem "haml-rails" | ... | ... |
Gemfile.lock
... | ... | @@ -169,6 +169,12 @@ GEM |
169 | 169 | gherkin (2.11.0) |
170 | 170 | json (>= 1.4.6) |
171 | 171 | git (1.2.5) |
172 | + grape (0.2.0) | |
173 | + hashie (~> 1.2) | |
174 | + multi_json | |
175 | + multi_xml | |
176 | + rack | |
177 | + rack-mount | |
172 | 178 | haml (3.1.6) |
173 | 179 | haml-rails (0.3.4) |
174 | 180 | actionpack (~> 3.0) |
... | ... | @@ -230,6 +236,8 @@ GEM |
230 | 236 | rack (1.4.1) |
231 | 237 | rack-cache (1.2) |
232 | 238 | rack (>= 0.4) |
239 | + rack-mount (0.8.3) | |
240 | + rack (>= 1.0.0) | |
233 | 241 | rack-protection (1.2.0) |
234 | 242 | rack |
235 | 243 | rack-ssl (1.3.2) |
... | ... | @@ -381,6 +389,7 @@ DEPENDENCIES |
381 | 389 | git |
382 | 390 | gitolite! |
383 | 391 | grack! |
392 | + grape | |
384 | 393 | grit! |
385 | 394 | haml-rails |
386 | 395 | httparty | ... | ... |
config/routes.rb
... | ... | @@ -0,0 +1,61 @@ |
1 | +require 'api/entities' | |
2 | +require 'api/helpers' | |
3 | + | |
4 | +module Gitlab | |
5 | + class API < Grape::API | |
6 | + format :json | |
7 | + helpers APIHelpers | |
8 | + | |
9 | + # Users API | |
10 | + resource :users do | |
11 | + before { authenticate! } | |
12 | + | |
13 | + # GET /users | |
14 | + get do | |
15 | + @users = User.all | |
16 | + present @users, :with => Entities::User | |
17 | + end | |
18 | + | |
19 | + # GET /users/:id | |
20 | + get ":id" do | |
21 | + @user = User.find(params[:id]) | |
22 | + present @user, :with => Entities::User | |
23 | + end | |
24 | + end | |
25 | + | |
26 | + # GET /user | |
27 | + get "/user" do | |
28 | + authenticate! | |
29 | + present @current_user, :with => Entities::User | |
30 | + end | |
31 | + | |
32 | + # Projects API | |
33 | + resource :projects do | |
34 | + before { authenticate! } | |
35 | + | |
36 | + # GET /projects | |
37 | + get do | |
38 | + @projects = current_user.projects | |
39 | + present @projects, :with => Entities::Project | |
40 | + end | |
41 | + | |
42 | + # GET /projects/:id | |
43 | + get ":id" do | |
44 | + @project = current_user.projects.find_by_code(params[:id]) | |
45 | + present @project, :with => Entities::Project | |
46 | + end | |
47 | + | |
48 | + # GET /projects/:id/repository/branches | |
49 | + get ":id/repository/branches" do | |
50 | + @project = current_user.projects.find_by_code(params[:id]) | |
51 | + present @project.repo.heads.sort_by(&:name), :with => Entities::ProjectRepositoryBranches | |
52 | + end | |
53 | + | |
54 | + # GET /projects/:id/repository/tags | |
55 | + get ":id/repository/tags" do | |
56 | + @project = current_user.projects.find_by_code(params[:id]) | |
57 | + present @project.repo.tags.sort_by(&:name).reverse, :with => Entities::ProjectRepositoryTags | |
58 | + end | |
59 | + end | |
60 | + end | |
61 | +end | ... | ... |
... | ... | @@ -0,0 +1,23 @@ |
1 | +module Gitlab | |
2 | + module Entities | |
3 | + class User < Grape::Entity | |
4 | + expose :id, :email, :name, :bio, :skype, :linkedin, :twitter, | |
5 | + :dark_scheme, :theme_id, :blocked, :created_at | |
6 | + end | |
7 | + | |
8 | + class Project < Grape::Entity | |
9 | + expose :id, :code, :name, :description, :path, :default_branch | |
10 | + expose :owner, :using => Entities::User | |
11 | + expose :private_flag, :as => :private | |
12 | + expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :created_at | |
13 | + end | |
14 | + | |
15 | + class ProjectRepositoryBranches < Grape::Entity | |
16 | + expose :name, :commit | |
17 | + end | |
18 | + | |
19 | + class ProjectRepositoryTags < Grape::Entity | |
20 | + expose :name, :commit | |
21 | + end | |
22 | + end | |
23 | +end | ... | ... |
... | ... | @@ -0,0 +1,55 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe Gitlab::API do | |
4 | + let(:user) { Factory :user } | |
5 | + let!(:project) { Factory :project, :owner => user } | |
6 | + before { project.add_access(user, :read) } | |
7 | + | |
8 | + describe "GET /projects" do | |
9 | + it "should return authentication error" do | |
10 | + get "/api/projects" | |
11 | + response.status.should == 401 | |
12 | + end | |
13 | + | |
14 | + describe "authenticated GET /projects" do | |
15 | + it "should return an array of projects" do | |
16 | + get "/api/projects?private_token=#{user.private_token}" | |
17 | + response.status.should == 200 | |
18 | + json = JSON.parse(response.body) | |
19 | + json.should be_an Array | |
20 | + json.first['name'].should == project.name | |
21 | + json.first['owner']['email'].should == user.email | |
22 | + end | |
23 | + end | |
24 | + end | |
25 | + | |
26 | + describe "GET /projects/:id" do | |
27 | + it "should return a project by id" do | |
28 | + get "/api/projects/#{project.code}?private_token=#{user.private_token}" | |
29 | + response.status.should == 200 | |
30 | + json = JSON.parse(response.body) | |
31 | + json['name'].should == project.name | |
32 | + json['owner']['email'].should == user.email | |
33 | + end | |
34 | + end | |
35 | + | |
36 | + describe "GET /projects/:id/repository/branches" do | |
37 | + it "should return an array of project branches" do | |
38 | + get "/api/projects/#{project.code}/repository/branches?private_token=#{user.private_token}" | |
39 | + response.status.should == 200 | |
40 | + json = JSON.parse(response.body) | |
41 | + json.should be_an Array | |
42 | + json.first['name'].should == project.repo.heads.sort_by(&:name).first.name | |
43 | + end | |
44 | + end | |
45 | + | |
46 | + describe "GET /projects/:id/repository/tags" do | |
47 | + it "should return an array of project tags" do | |
48 | + get "/api/projects/#{project.code}/repository/tags?private_token=#{user.private_token}" | |
49 | + response.status.should == 200 | |
50 | + json = JSON.parse(response.body) | |
51 | + json.should be_an Array | |
52 | + json.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name | |
53 | + end | |
54 | + end | |
55 | +end | ... | ... |
... | ... | @@ -0,0 +1,38 @@ |
1 | +require 'spec_helper' | |
2 | + | |
3 | +describe Gitlab::API do | |
4 | + let(:user) { Factory :user } | |
5 | + | |
6 | + describe "GET /users" do | |
7 | + it "should return authentication error" do | |
8 | + get "/api/users" | |
9 | + response.status.should == 401 | |
10 | + end | |
11 | + | |
12 | + describe "authenticated GET /users" do | |
13 | + it "should return an array of users" do | |
14 | + get "/api/users?private_token=#{user.private_token}" | |
15 | + response.status.should == 200 | |
16 | + json = JSON.parse(response.body) | |
17 | + json.should be_an Array | |
18 | + json.first['email'].should == user.email | |
19 | + end | |
20 | + end | |
21 | + end | |
22 | + | |
23 | + describe "GET /users/:id" do | |
24 | + it "should return a user by id" do | |
25 | + get "/api/users/#{user.id}?private_token=#{user.private_token}" | |
26 | + response.status.should == 200 | |
27 | + JSON.parse(response.body)['email'].should == user.email | |
28 | + end | |
29 | + end | |
30 | + | |
31 | + describe "GET /user" do | |
32 | + it "should return current user" do | |
33 | + get "/api/user?private_token=#{user.private_token}" | |
34 | + response.status.should == 200 | |
35 | + JSON.parse(response.body)['email'].should == user.email | |
36 | + end | |
37 | + end | |
38 | +end | ... | ... |
spec/spec_helper.rb