summaryrefslogtreecommitdiff
path: root/lib/gitlab/ci/badge/release
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/ci/badge/release')
-rw-r--r--lib/gitlab/ci/badge/release/latest_release.rb42
-rw-r--r--lib/gitlab/ci/badge/release/metadata.rb25
-rw-r--r--lib/gitlab/ci/badge/release/template.rb44
3 files changed, 111 insertions, 0 deletions
diff --git a/lib/gitlab/ci/badge/release/latest_release.rb b/lib/gitlab/ci/badge/release/latest_release.rb
new file mode 100644
index 00000000000..e73bb2a912a
--- /dev/null
+++ b/lib/gitlab/ci/badge/release/latest_release.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+module Gitlab::Ci
+ module Badge
+ module Release
+ class LatestRelease < Badge::Base
+ attr_reader :project, :release, :customization
+
+ def initialize(project, current_user, opts: {})
+ @project = project
+ @customization = {
+ key_width: opts[:key_width] ? opts[:key_width].to_i : nil,
+ key_text: opts[:key_text]
+ }
+
+ # In the future, we should support `order_by=semver` for showing the
+ # latest release based on Semantic Versioning.
+ @release = ::ReleasesFinder.new(
+ project,
+ current_user,
+ order_by: opts[:order_by]).execute.first
+ end
+
+ def entity
+ 'Latest Release'
+ end
+
+ def tag
+ @release&.tag
+ end
+
+ def metadata
+ @metadata ||= Release::Metadata.new(self)
+ end
+
+ def template
+ @template ||= Release::Template.new(self)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/badge/release/metadata.rb b/lib/gitlab/ci/badge/release/metadata.rb
new file mode 100644
index 00000000000..e02959b5741
--- /dev/null
+++ b/lib/gitlab/ci/badge/release/metadata.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+module Gitlab::Ci
+ module Badge
+ module Release
+ class Metadata < Badge::Metadata
+ def initialize(badge)
+ @project = badge.project
+ end
+
+ def title
+ 'Latest Release'
+ end
+
+ def image_url
+ release_project_badges_url(@project, format: :svg)
+ end
+
+ def link_url
+ project_releases_url(@project)
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/badge/release/template.rb b/lib/gitlab/ci/badge/release/template.rb
new file mode 100644
index 00000000000..65bff4371cf
--- /dev/null
+++ b/lib/gitlab/ci/badge/release/template.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+module Gitlab::Ci
+ module Badge
+ module Release
+ # Template object will be passed to badge.svg.erb template.
+ class Template < Badge::Template
+ STATUS_COLOR = {
+ latest: '#3076af',
+ none: '#e05d44'
+ }.freeze
+ KEY_WIDTH_DEFAULT = 90
+ VALUE_WIDTH_DEFAULT = 54
+
+ def initialize(badge)
+ @entity = badge.entity
+ @tag = badge.tag || "none"
+ @key_width = badge.customization.dig(:key_width)
+ @key_text = badge.customization.dig(:key_text)
+ end
+
+ def key_text
+ @key_text || @entity.to_s
+ end
+
+ def key_width
+ @key_width || KEY_WIDTH_DEFAULT
+ end
+
+ def value_text
+ @tag.to_s
+ end
+
+ def value_width
+ VALUE_WIDTH_DEFAULT
+ end
+
+ def value_color
+ STATUS_COLOR[@tag.to_sym] || STATUS_COLOR[:latest]
+ end
+ end
+ end
+ end
+end