From ace5c54ab91cdb9142a27d4543ee839684d29d5d Mon Sep 17 00:00:00 2001
From: Angus MacArthur <amacarthur@blackberry.com>
Date: Fri, 12 Jul 2013 11:58:17 -0400
Subject: [PATCH] enhance project creation apis to allow setting of public
 attribute

Change-Id: Ib71ce8cf993627eada63d7d596fb302ec702f36e
---
 doc/api/projects.md                |  2 ++
 lib/api/entities.rb                |  2 +-
 lib/api/projects.rb                |  8 ++++++--
 spec/requests/api/projects_spec.rb | 30 ++++++++++++++++++++++++++++++
 4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/doc/api/projects.md b/doc/api/projects.md
index b3e4ec0214..2fc235066d 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -189,6 +189,7 @@ Parameters:
 + `merge_requests_enabled` (optional)
 + `wiki_enabled` (optional) 
 + `snippets_enabled` (optional)
++ `public` (optional)
 
 **Project access levels**
 
@@ -221,6 +222,7 @@ Parameters:
 + `merge_requests_enabled` (optional)
 + `wiki_enabled` (optional) 
 + `snippets_enabled` (optional)
++ `public` (optional)
 
 
 
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index f31050b008..c8531e80af 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -36,7 +36,7 @@ module API
       expose :owner, using: Entities::UserBasic
       expose :name, :name_with_namespace
       expose :path, :path_with_namespace
-      expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at
+      expose :issues_enabled, :merge_requests_enabled, :wall_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at, :public
       expose :namespace
       expose :forked_from_project, using: Entities::ForkedFromProject, :if => lambda{ | project, options | project.forked? }
     end
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index eb8a814be5..1fdfff931a 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -67,6 +67,7 @@ module API
       #   wiki_enabled (optional) 
       #   snippets_enabled (optional)
       #   namespace_id (optional) - defaults to user namespace
+      #   public (optional) - false by default
       # Example Request
       #   POST /projects
       post do
@@ -79,7 +80,8 @@ module API
                                     :merge_requests_enabled,
                                     :wiki_enabled,
                                     :snippets_enabled,
-                                    :namespace_id]
+                                    :namespace_id,
+                                    :public]
         @project = ::Projects::CreateContext.new(current_user, attrs).execute
         if @project.saved?
           present @project, with: Entities::Project
@@ -103,6 +105,7 @@ module API
       #   merge_requests_enabled (optional) 
       #   wiki_enabled (optional)
       #   snippets_enabled (optional)
+      #   public (optional)
       # Example Request
       #   POST /projects/user/:user_id
       post "user/:user_id" do
@@ -115,7 +118,8 @@ module API
                                     :wall_enabled,
                                     :merge_requests_enabled,
                                     :wiki_enabled,
-                                    :snippets_enabled]
+                                    :snippets_enabled,
+                                    :public]
         @project = ::Projects::CreateContext.new(user, attrs).execute
         if @project.saved?
           present @project, with: Entities::Project
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 300bff2887..863ecc61bb 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -104,6 +104,21 @@ describe API::API do
         json_response[k.to_s].should == v
       end
     end
+
+    it "should set a project as public" do
+      project = attributes_for(:project, { public: true })
+      post api("/projects", user), project
+      json_response['public'].should be_true
+
+    end
+
+    it "should set a project as private" do
+      project = attributes_for(:project, { public: false })
+      post api("/projects", user), project
+      json_response['public'].should be_false
+
+    end
+
   end
 
   describe "POST /projects/user/:id" do
@@ -144,6 +159,21 @@ describe API::API do
         json_response[k.to_s].should == v
       end
     end
+
+    it "should set a project as public" do
+      project = attributes_for(:project, { public: true })
+      post api("/projects/user/#{user.id}", admin), project
+      json_response['public'].should be_true
+
+    end
+
+    it "should set a project as private" do
+      project = attributes_for(:project, { public: false })
+      post api("/projects/user/#{user.id}", admin), project
+      json_response['public'].should be_false
+
+    end
+
   end
 
   describe "GET /projects/:id" do
-- 
2.30.9