gitlab-org--gitlab-foss/lib/api/templates.rb

112 lines
3.6 KiB
Ruby
Raw Normal View History

2016-05-27 09:00:56 +00:00
module API
class Templates < Grape::API
include PaginationParams
GLOBAL_TEMPLATE_TYPES = {
gitignores: {
klass: Gitlab::Template::GitignoreTemplate,
gitlab_version: 8.8
},
gitlab_ci_ymls: {
klass: Gitlab::Template::GitlabCiYmlTemplate,
gitlab_version: 8.9
2016-11-02 15:41:32 +00:00
},
2016-11-08 12:42:58 +00:00
dockerfiles: {
klass: Gitlab::Template::DockerfileTemplate,
2016-12-16 09:17:15 +00:00
gitlab_version: 8.15
2016-11-08 12:42:58 +00:00
}
2016-05-27 09:00:56 +00:00
}.freeze
PROJECT_TEMPLATE_REGEX =
2018-01-27 05:35:53 +00:00
%r{[\<\{\[]
(project|description|
one\sline\s.+\swhat\sit\sdoes\.) # matching the start and end is enough here
2018-01-27 05:35:53 +00:00
[\>\}\]]}xi.freeze
YEAR_TEMPLATE_REGEX = /[<{\[](year|yyyy)[>}\]]/i.freeze
FULLNAME_TEMPLATE_REGEX =
2018-01-27 05:35:53 +00:00
%r{[\<\{\[]
(fullname|name\sof\s(author|copyright\sowner))
2018-01-27 05:35:53 +00:00
[\>\}\]]}xi.freeze
2016-05-27 09:00:56 +00:00
helpers do
def parsed_license_template
# We create a fresh Licensee::License object since we'll modify its
# content in place below.
template = Licensee::License.new(params[:name])
template.content.gsub!(YEAR_TEMPLATE_REGEX, Time.now.year.to_s)
template.content.gsub!(PROJECT_TEMPLATE_REGEX, params[:project]) if params[:project].present?
fullname = params[:fullname].presence || current_user.try(:name)
template.content.gsub!(FULLNAME_TEMPLATE_REGEX, fullname) if fullname
template
end
def render_response(template_type, template)
not_found!(template_type.to_s.singularize) unless template
present template, with: Entities::Template
end
end
desc 'Get the list of the available license template' do
detail 'This feature was introduced in GitLab 8.7.'
2017-10-05 08:48:05 +00:00
success ::API::Entities::License
end
params do
optional :popular, type: Boolean, desc: 'If passed, returns only popular licenses'
use :pagination
end
get "templates/licenses" do
options = {
featured: declared(params)[:popular].present? ? true : nil
}
licences = ::Kaminari.paginate_array(Licensee::License.all(options))
2017-10-05 08:48:05 +00:00
present paginate(licences), with: Entities::License
end
desc 'Get the text for a specific license' do
detail 'This feature was introduced in GitLab 8.7.'
2017-10-05 08:48:05 +00:00
success ::API::Entities::License
end
params do
requires :name, type: String, desc: 'The name of the template'
end
get "templates/licenses/:name", requirements: { name: /[\w\.-]+/ } do
not_found!('License') unless Licensee::License.find(declared(params)[:name])
template = parsed_license_template
2017-10-05 08:48:05 +00:00
present template, with: ::API::Entities::License
end
2016-11-02 15:41:32 +00:00
GLOBAL_TEMPLATE_TYPES.each do |template_type, properties|
klass = properties[:klass]
gitlab_version = properties[:gitlab_version]
desc 'Get the list of the available template' do
detail "This feature was introduced in GitLab #{gitlab_version}."
success Entities::TemplatesList
end
params do
use :pagination
end
get "templates/#{template_type}" do
templates = ::Kaminari.paginate_array(klass.all)
2017-02-06 18:38:17 +00:00
present paginate(templates), with: Entities::TemplatesList
end
desc 'Get the text for a specific template present in local filesystem' do
detail "This feature was introduced in GitLab #{gitlab_version}."
success Entities::Template
end
params do
requires :name, type: String, desc: 'The name of the template'
end
get "templates/#{template_type}/:name" do
new_template = klass.find(declared(params)[:name])
render_response(template_type, new_template)
2016-05-27 09:00:56 +00:00
end
end
end
end