OSDN Git Service

split repositories and projects api
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Thu, 23 May 2013 09:23:47 +0000 (12:23 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Thu, 23 May 2013 09:23:47 +0000 (12:23 +0300)
lib/api/api.rb
lib/api/projects.rb
lib/api/repositories.rb [new file with mode: 0644]
spec/requests/api/projects_spec.rb
spec/requests/api/repositories_spec.rb [new file with mode: 0644]

index 28e6add..c275240 100644 (file)
@@ -27,6 +27,7 @@ module API
     mount Groups
     mount Users
     mount Projects
+    mount Repositories
     mount Issues
     mount Milestones
     mount Session
index d9743b4..ddc403c 100644 (file)
@@ -286,95 +286,6 @@ module API
         end
       end
 
-      # Get a project repository branches
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      # Example Request:
-      #   GET /projects/:id/repository/branches
-      get ":id/repository/branches" do
-        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project
-      end
-
-      # Get a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   GET /projects/:id/repository/branches/:branch
-      get ":id/repository/branches/:branch" do
-        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
-        not_found!("Branch does not exist") if @branch.nil?
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
-      # Protect a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   PUT /projects/:id/repository/branches/:branch/protect
-      put ":id/repository/branches/:branch/protect" do
-        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
-        not_found! unless @branch
-        protected = user_project.protected_branches.find_by_name(@branch.name)
-
-        unless protected
-          user_project.protected_branches.create(name: @branch.name)
-        end
-
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
-      # Unprotect a single branch
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   branch (required) - The name of the branch
-      # Example Request:
-      #   PUT /projects/:id/repository/branches/:branch/unprotect
-      put ":id/repository/branches/:branch/unprotect" do
-        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
-        not_found! unless @branch
-        protected = user_project.protected_branches.find_by_name(@branch.name)
-
-        if protected
-          protected.destroy
-        end
-
-        present @branch, with: Entities::RepoObject, project: user_project
-      end
-
-      # Get a project repository tags
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      # Example Request:
-      #   GET /projects/:id/repository/tags
-      get ":id/repository/tags" do
-        present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
-      end
-
-      # Get a project repository commits
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
-      # Example Request:
-      #   GET /projects/:id/repository/commits
-      get ":id/repository/commits" do
-        authorize! :download_code, user_project
-
-        page = params[:page] || 0
-        per_page = (params[:per_page] || 20).to_i
-        ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
-
-        commits = user_project.repository.commits(ref, nil, per_page, page * per_page)
-        present commits, with: Entities::RepoCommit
-      end
-
       # Get a project snippets
       #
       # Parameters:
@@ -479,32 +390,6 @@ module API
         present @snippet.content
       end
 
-      # Get a raw file contents
-      #
-      # Parameters:
-      #   id (required) - The ID of a project
-      #   sha (required) - The commit or branch name
-      #   filepath (required) - The path to the file to display
-      # Example Request:
-      #   GET /projects/:id/repository/commits/:sha/blob
-      get ":id/repository/commits/:sha/blob" do
-        authorize! :download_code, user_project
-        required_attributes! [:filepath]
-
-        ref = params[:sha]
-
-        repo = user_project.repository
-
-        commit = repo.commit(ref)
-        not_found! "Commit" unless commit
-
-        blob = Gitlab::Git::Blob.new(repo, commit.id, ref, params[:filepath])
-        not_found! "File" unless blob.exists?
-
-        content_type blob.mime_type
-        present blob.data
-      end
-
       # Get a specific project's keys
       #
       # Example Request:
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
new file mode 100644 (file)
index 0000000..964b9eb
--- /dev/null
@@ -0,0 +1,133 @@
+module API
+  # Projects API
+  class Repositories < Grape::API
+    before { authenticate! }
+
+    resource :projects do
+      helpers do
+        def handle_project_member_errors(errors)
+          if errors[:project_access].any?
+            error!(errors[:project_access], 422)
+          end
+          not_found!
+        end
+      end
+
+      # Get a project repository branches
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      # Example Request:
+      #   GET /projects/:id/repository/branches
+      get ":id/repository/branches" do
+        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project
+      end
+
+      # Get a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   GET /projects/:id/repository/branches/:branch
+      get ":id/repository/branches/:branch" do
+        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
+        not_found!("Branch does not exist") if @branch.nil?
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+
+      # Protect a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   PUT /projects/:id/repository/branches/:branch/protect
+      put ":id/repository/branches/:branch/protect" do
+        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
+        not_found! unless @branch
+        protected = user_project.protected_branches.find_by_name(@branch.name)
+
+        unless protected
+          user_project.protected_branches.create(name: @branch.name)
+        end
+
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+
+      # Unprotect a single branch
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   branch (required) - The name of the branch
+      # Example Request:
+      #   PUT /projects/:id/repository/branches/:branch/unprotect
+      put ":id/repository/branches/:branch/unprotect" do
+        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
+        not_found! unless @branch
+        protected = user_project.protected_branches.find_by_name(@branch.name)
+
+        if protected
+          protected.destroy
+        end
+
+        present @branch, with: Entities::RepoObject, project: user_project
+      end
+
+      # Get a project repository tags
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      # Example Request:
+      #   GET /projects/:id/repository/tags
+      get ":id/repository/tags" do
+        present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
+      end
+
+      # Get a project repository commits
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   ref_name (optional) - The name of a repository branch or tag, if not given the default branch is used
+      # Example Request:
+      #   GET /projects/:id/repository/commits
+      get ":id/repository/commits" do
+        authorize! :download_code, user_project
+
+        page = params[:page] || 0
+        per_page = (params[:per_page] || 20).to_i
+        ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
+
+        commits = user_project.repository.commits(ref, nil, per_page, page * per_page)
+        present commits, with: Entities::RepoCommit
+      end
+
+      # Get a raw file contents
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   sha (required) - The commit or branch name
+      #   filepath (required) - The path to the file to display
+      # Example Request:
+      #   GET /projects/:id/repository/commits/:sha/blob
+      get ":id/repository/commits/:sha/blob" do
+        authorize! :download_code, user_project
+        required_attributes! [:filepath]
+
+        ref = params[:sha]
+
+        repo = user_project.repository
+
+        commit = repo.commit(ref)
+        not_found! "Commit" unless commit
+
+        blob = Gitlab::Git::Blob.new(repo, commit.id, ref, params[:filepath])
+        not_found! "File" unless blob.exists?
+
+        content_type blob.mime_type
+        present blob.data
+      end
+    end
+  end
+end
+
index 4346bfe..de0631d 100644 (file)
@@ -173,75 +173,6 @@ describe API::API do
     end
   end
 
-  describe "GET /projects/:id/repository/branches" do
-    it "should return an array of project branches" do
-      get api("/projects/#{project.id}/repository/branches", user)
-      response.status.should == 200
-      json_response.should be_an Array
-      json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name
-    end
-  end
-
-  describe "GET /projects/:id/repository/branches/:branch" do
-    it "should return the branch information for a single branch" do
-      get api("/projects/#{project.id}/repository/branches/new_design", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == false
-    end
-
-    it "should return a 404 error if branch is not available" do
-      get api("/projects/#{project.id}/repository/branches/unknown", user)
-      response.status.should == 404
-    end
-  end
-
-  describe "PUT /projects/:id/repository/branches/:branch/protect" do
-    it "should protect a single branch" do
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == true
-    end
-
-    it "should return a 404 error if branch not found" do
-      put api("/projects/#{project.id}/repository/branches/unknown/protect", user)
-      response.status.should == 404
-    end
-
-    it "should return success when protect branch again" do
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
-      response.status.should == 200
-    end
-  end
-
-  describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
-    it "should unprotect a single branch" do
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      response.status.should == 200
-
-      json_response['name'].should == 'new_design'
-      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
-      json_response['protected'].should == false
-    end
-
-    it "should return success when unprotect branch" do
-      put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
-      response.status.should == 404
-    end
-
-    it "should return success when unprotect branch again" do
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
-      response.status.should == 200
-    end
-  end
-
   describe "GET /projects/:id/members" do
     it "should return project team members" do
       get api("/projects/#{project.id}/members", user)
@@ -491,35 +422,6 @@ describe API::API do
     end
   end
 
-  describe "GET /projects/:id/repository/tags" do
-    it "should return an array of project tags" do
-      get api("/projects/#{project.id}/repository/tags", user)
-      response.status.should == 200
-      json_response.should be_an Array
-      json_response.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name
-    end
-  end
-
-  describe "GET /projects/:id/repository/commits" do
-    context "authorized user" do
-      before { project.team << [user2, :reporter] }
-
-      it "should return project commits" do
-        get api("/projects/#{project.id}/repository/commits", user)
-        response.status.should == 200
-
-        json_response.should be_an Array
-        json_response.first['id'].should == project.repository.commit.id
-      end
-    end
-
-    context "unauthorized user" do
-      it "should not return project commits" do
-        get api("/projects/#{project.id}/repository/commits")
-        response.status.should == 401
-      end
-    end
-  end
 
   describe "GET /projects/:id/snippets" do
     it "should return an array of project snippets" do
@@ -613,28 +515,6 @@ describe API::API do
     end
   end
 
-  describe "GET /projects/:id/repository/commits/:sha/blob" do
-    it "should get the raw file contents" do
-      get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user)
-      response.status.should == 200
-    end
-
-    it "should return 404 for invalid branch_name" do
-      get api("/projects/#{project.id}/repository/commits/invalid_branch_name/blob?filepath=README.md", user)
-      response.status.should == 404
-    end
-
-    it "should return 404 for invalid file" do
-      get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.invalid", user)
-      response.status.should == 404
-    end
-
-    it "should return a 400 error if filepath is missing" do
-      get api("/projects/#{project.id}/repository/commits/master/blob", user)
-      response.status.should == 400
-    end
-  end
-
   describe :deploy_keys do
     let(:deploy_keys_project) { create(:deploy_keys_project, project: project) }
     let(:deploy_key) { deploy_keys_project.deploy_key }
diff --git a/spec/requests/api/repositories_spec.rb b/spec/requests/api/repositories_spec.rb
new file mode 100644 (file)
index 0000000..9fe0025
--- /dev/null
@@ -0,0 +1,134 @@
+require 'spec_helper'
+
+describe API::API do
+  include ApiHelpers
+  before(:each) { enable_observers }
+
+  let(:user) { create(:user) }
+  let!(:project) { create(:project_with_code, creator_id: user.id) }
+  let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
+
+  before { project.team << [user, :reporter] }
+
+
+  describe "GET /projects/:id/repository/branches" do
+    it "should return an array of project branches" do
+      get api("/projects/#{project.id}/repository/branches", user)
+      response.status.should == 200
+      json_response.should be_an Array
+      json_response.first['name'].should == project.repo.heads.sort_by(&:name).first.name
+    end
+  end
+
+  describe "GET /projects/:id/repository/branches/:branch" do
+    it "should return the branch information for a single branch" do
+      get api("/projects/#{project.id}/repository/branches/new_design", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == false
+    end
+
+    it "should return a 404 error if branch is not available" do
+      get api("/projects/#{project.id}/repository/branches/unknown", user)
+      response.status.should == 404
+    end
+  end
+
+  describe "PUT /projects/:id/repository/branches/:branch/protect" do
+    it "should protect a single branch" do
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == true
+    end
+
+    it "should return a 404 error if branch not found" do
+      put api("/projects/#{project.id}/repository/branches/unknown/protect", user)
+      response.status.should == 404
+    end
+
+    it "should return success when protect branch again" do
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
+      response.status.should == 200
+    end
+  end
+
+  describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
+    it "should unprotect a single branch" do
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      response.status.should == 200
+
+      json_response['name'].should == 'new_design'
+      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
+      json_response['protected'].should == false
+    end
+
+    it "should return success when unprotect branch" do
+      put api("/projects/#{project.id}/repository/branches/unknown/unprotect", user)
+      response.status.should == 404
+    end
+
+    it "should return success when unprotect branch again" do
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
+      response.status.should == 200
+    end
+  end
+
+  describe "GET /projects/:id/repository/tags" do
+    it "should return an array of project tags" do
+      get api("/projects/#{project.id}/repository/tags", user)
+      response.status.should == 200
+      json_response.should be_an Array
+      json_response.first['name'].should == project.repo.tags.sort_by(&:name).reverse.first.name
+    end
+  end
+
+  describe "GET /projects/:id/repository/commits" do
+    context "authorized user" do
+      before { project.team << [user2, :reporter] }
+
+      it "should return project commits" do
+        get api("/projects/#{project.id}/repository/commits", user)
+        response.status.should == 200
+
+        json_response.should be_an Array
+        json_response.first['id'].should == project.repository.commit.id
+      end
+    end
+
+    context "unauthorized user" do
+      it "should not return project commits" do
+        get api("/projects/#{project.id}/repository/commits")
+        response.status.should == 401
+      end
+    end
+  end
+
+  describe "GET /projects/:id/repository/commits/:sha/blob" do
+    it "should get the raw file contents" do
+      get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.md", user)
+      response.status.should == 200
+    end
+
+    it "should return 404 for invalid branch_name" do
+      get api("/projects/#{project.id}/repository/commits/invalid_branch_name/blob?filepath=README.md", user)
+      response.status.should == 404
+    end
+
+    it "should return 404 for invalid file" do
+      get api("/projects/#{project.id}/repository/commits/master/blob?filepath=README.invalid", user)
+      response.status.should == 404
+    end
+
+    it "should return a 400 error if filepath is missing" do
+      get api("/projects/#{project.id}/repository/commits/master/blob", user)
+      response.status.should == 400
+    end
+  end
+end