Expose readme url in Project API
This commit is contained in:
parent
4d674bd38c
commit
10237d458d
9 changed files with 57 additions and 6 deletions
|
@ -894,6 +894,13 @@ class Project < ActiveRecord::Base
|
||||||
Gitlab::Routing.url_helpers.project_url(self)
|
Gitlab::Routing.url_helpers.project_url(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def readme_url
|
||||||
|
readme = repository.readme
|
||||||
|
if readme
|
||||||
|
Gitlab::Routing.url_helpers.project_blob_url(self, File.join(default_branch, readme.path))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def new_issuable_address(author, address_type)
|
def new_issuable_address(author, address_type)
|
||||||
return unless Gitlab::IncomingEmail.supports_issue_creation? && author
|
return unless Gitlab::IncomingEmail.supports_issue_creation? && author
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Expose readme url in Project API
|
||||||
|
merge_request: 18960
|
||||||
|
author: Imre Farkas
|
||||||
|
type: changed
|
|
@ -66,6 +66,7 @@ GET /projects
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-client",
|
"web_url": "http://example.com/diaspora/diaspora-client",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora client"
|
"disapora client"
|
||||||
|
@ -135,6 +136,7 @@ GET /projects
|
||||||
"ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
|
"ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
|
||||||
"http_url_to_repo": "http://example.com/brightbox/puppet.git",
|
"http_url_to_repo": "http://example.com/brightbox/puppet.git",
|
||||||
"web_url": "http://example.com/brightbox/puppet",
|
"web_url": "http://example.com/brightbox/puppet",
|
||||||
|
"readme_url": "http://example.com/brightbox/puppet/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"puppet"
|
"puppet"
|
||||||
|
@ -252,6 +254,7 @@ GET /users/:user_id/projects
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-client.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-client",
|
"web_url": "http://example.com/diaspora/diaspora-client",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-client/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora client"
|
"disapora client"
|
||||||
|
@ -321,6 +324,7 @@ GET /users/:user_id/projects
|
||||||
"ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
|
"ssh_url_to_repo": "git@example.com:brightbox/puppet.git",
|
||||||
"http_url_to_repo": "http://example.com/brightbox/puppet.git",
|
"http_url_to_repo": "http://example.com/brightbox/puppet.git",
|
||||||
"web_url": "http://example.com/brightbox/puppet",
|
"web_url": "http://example.com/brightbox/puppet",
|
||||||
|
"readme_url": "http://example.com/brightbox/puppet/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"puppet"
|
"puppet"
|
||||||
|
@ -420,6 +424,7 @@ GET /projects/:id
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -710,6 +715,7 @@ Example responses:
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -788,6 +794,7 @@ Example response:
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -865,6 +872,7 @@ Example response:
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -966,6 +974,7 @@ Example response:
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -1061,6 +1070,7 @@ Example response:
|
||||||
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
"ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git",
|
||||||
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
"http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git",
|
||||||
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
"web_url": "http://example.com/diaspora/diaspora-project-site",
|
||||||
|
"readme_url": "http://example.com/diaspora/diaspora-project-site/blob/master/README.md",
|
||||||
"tag_list": [
|
"tag_list": [
|
||||||
"example",
|
"example",
|
||||||
"disapora project"
|
"disapora project"
|
||||||
|
@ -1421,4 +1431,3 @@ GET /projects/:id/snapshot
|
||||||
| --------- | ---- | -------- | ----------- |
|
| --------- | ---- | -------- | ----------- |
|
||||||
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
|
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) |
|
||||||
| `wiki` | boolean | no | Whether to download the wiki, rather than project, repository |
|
| `wiki` | boolean | no | Whether to download the wiki, rather than project, repository |
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ module API
|
||||||
# (fixed in https://github.com/rails/rails/pull/25976).
|
# (fixed in https://github.com/rails/rails/pull/25976).
|
||||||
project.tags.map(&:name).sort
|
project.tags.map(&:name).sort
|
||||||
end
|
end
|
||||||
expose :ssh_url_to_repo, :http_url_to_repo, :web_url
|
expose :ssh_url_to_repo, :http_url_to_repo, :web_url, :readme_url
|
||||||
expose :avatar_url do |project, options|
|
expose :avatar_url do |project, options|
|
||||||
project.avatar_url(only_path: false)
|
project.avatar_url(only_path: false)
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
"ssh_url_to_repo": { "type": "string" },
|
"ssh_url_to_repo": { "type": "string" },
|
||||||
"http_url_to_repo": { "type": "string" },
|
"http_url_to_repo": { "type": "string" },
|
||||||
"web_url": { "type": "string" },
|
"web_url": { "type": "string" },
|
||||||
|
"readme_url": { "type": ["string", "null"] },
|
||||||
"avatar_url": { "type": ["string", "null"] },
|
"avatar_url": { "type": ["string", "null"] },
|
||||||
"star_count": { "type": "integer" },
|
"star_count": { "type": "integer" },
|
||||||
"forks_count": { "type": "integer" },
|
"forks_count": { "type": "integer" },
|
||||||
|
|
|
@ -469,6 +469,34 @@ describe Project do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#readme_url" do
|
||||||
|
let(:project) { create(:project, :repository, path: "somewhere") }
|
||||||
|
|
||||||
|
context 'with a non-existing repository' do
|
||||||
|
it 'returns nil' do
|
||||||
|
allow(project.repository).to receive(:tree).with(:head).and_return(nil)
|
||||||
|
|
||||||
|
expect(project.readme_url).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with an existing repository' do
|
||||||
|
context 'when no README exists' do
|
||||||
|
it 'returns nil' do
|
||||||
|
allow_any_instance_of(Tree).to receive(:readme).and_return(nil)
|
||||||
|
|
||||||
|
expect(project.readme_url).to be_nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a README exists' do
|
||||||
|
it 'returns the README' do
|
||||||
|
expect(project.readme_url).to eql("#{Gitlab.config.gitlab.url}/#{project.namespace.full_path}/somewhere/blob/master/README.md")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "#new_issuable_address" do
|
describe "#new_issuable_address" do
|
||||||
let(:project) { create(:project, path: "somewhere") }
|
let(:project) { create(:project, path: "somewhere") }
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
|
|
@ -15,7 +15,7 @@ describe API::Environments do
|
||||||
it 'returns project environments' do
|
it 'returns project environments' do
|
||||||
project_data_keys = %w(
|
project_data_keys = %w(
|
||||||
id description default_branch tag_list
|
id description default_branch tag_list
|
||||||
ssh_url_to_repo http_url_to_repo web_url
|
ssh_url_to_repo http_url_to_repo web_url readme_url
|
||||||
name name_with_namespace
|
name name_with_namespace
|
||||||
path path_with_namespace
|
path path_with_namespace
|
||||||
star_count forks_count
|
star_count forks_count
|
||||||
|
|
|
@ -18,7 +18,7 @@ describe API::Projects do
|
||||||
let(:user2) { create(:user) }
|
let(:user2) { create(:user) }
|
||||||
let(:user3) { create(:user) }
|
let(:user3) { create(:user) }
|
||||||
let(:admin) { create(:admin) }
|
let(:admin) { create(:admin) }
|
||||||
let(:project) { create(:project, namespace: user.namespace) }
|
let(:project) { create(:project, :repository, namespace: user.namespace) }
|
||||||
let(:project2) { create(:project, namespace: user.namespace) }
|
let(:project2) { create(:project, namespace: user.namespace) }
|
||||||
let(:snippet) { create(:project_snippet, :public, author: user, project: project, title: 'example') }
|
let(:snippet) { create(:project_snippet, :public, author: user, project: project, title: 'example') }
|
||||||
let(:project_member) { create(:project_member, :developer, user: user3, project: project) }
|
let(:project_member) { create(:project_member, :developer, user: user3, project: project) }
|
||||||
|
@ -220,7 +220,7 @@ describe API::Projects do
|
||||||
it 'returns a simplified version of all the projects' do
|
it 'returns a simplified version of all the projects' do
|
||||||
expected_keys = %w(
|
expected_keys = %w(
|
||||||
id description default_branch tag_list
|
id description default_branch tag_list
|
||||||
ssh_url_to_repo http_url_to_repo web_url
|
ssh_url_to_repo http_url_to_repo web_url readme_url
|
||||||
name name_with_namespace
|
name name_with_namespace
|
||||||
path path_with_namespace
|
path path_with_namespace
|
||||||
star_count forks_count
|
star_count forks_count
|
||||||
|
@ -854,6 +854,7 @@ describe API::Projects do
|
||||||
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to eq(project.only_allow_merge_if_pipeline_succeeds)
|
expect(json_response['only_allow_merge_if_pipeline_succeeds']).to eq(project.only_allow_merge_if_pipeline_succeeds)
|
||||||
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
|
expect(json_response['only_allow_merge_if_all_discussions_are_resolved']).to eq(project.only_allow_merge_if_all_discussions_are_resolved)
|
||||||
expect(json_response['merge_method']).to eq(project.merge_method.to_s)
|
expect(json_response['merge_method']).to eq(project.merge_method.to_s)
|
||||||
|
expect(json_response['readme_url']).to eq(project.readme_url)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns a project by path name' do
|
it 'returns a project by path name' do
|
||||||
|
|
|
@ -82,7 +82,7 @@ describe API::V3::Projects do
|
||||||
it 'returns a simplified version of all the projects' do
|
it 'returns a simplified version of all the projects' do
|
||||||
expected_keys = %w(
|
expected_keys = %w(
|
||||||
id description default_branch tag_list
|
id description default_branch tag_list
|
||||||
ssh_url_to_repo http_url_to_repo web_url
|
ssh_url_to_repo http_url_to_repo web_url readme_url
|
||||||
name name_with_namespace
|
name name_with_namespace
|
||||||
path path_with_namespace
|
path path_with_namespace
|
||||||
star_count forks_count
|
star_count forks_count
|
||||||
|
|
Loading…
Reference in a new issue