diff options
Diffstat (limited to 'lib/gitlab/metrics_dashboard/stages')
-rw-r--r-- | lib/gitlab/metrics_dashboard/stages/base_stage.rb | 20 | ||||
-rw-r--r-- | lib/gitlab/metrics_dashboard/stages/project_metrics_inserter.rb | 6 | ||||
-rw-r--r-- | lib/gitlab/metrics_dashboard/stages/sorter.rb | 4 |
3 files changed, 30 insertions, 0 deletions
diff --git a/lib/gitlab/metrics_dashboard/stages/base_stage.rb b/lib/gitlab/metrics_dashboard/stages/base_stage.rb index bdbf0c196cc..df49126a07b 100644 --- a/lib/gitlab/metrics_dashboard/stages/base_stage.rb +++ b/lib/gitlab/metrics_dashboard/stages/base_stage.rb @@ -4,6 +4,8 @@ module Gitlab module MetricsDashboard module Stages class BaseStage + DashboardLayoutError = Class.new(StandardError) + DEFAULT_PANEL_TYPE = 'area-chart' attr_reader :project, :environment @@ -23,9 +25,27 @@ module Gitlab protected + def missing_panel_groups! + raise DashboardLayoutError.new('Top-level key :panel_groups must be an array') + end + + def missing_panels! + raise DashboardLayoutError.new('Each "panel_group" must define an array :panels') + end + + def missing_metrics! + raise DashboardLayoutError.new('Each "panel" must define an array :metrics') + end + def for_metrics(dashboard) + missing_panel_groups! unless dashboard[:panel_groups].is_a?(Array) + dashboard[:panel_groups].each do |panel_group| + missing_panels! unless panel_group[:panels].is_a?(Array) + panel_group[:panels].each do |panel| + missing_metrics! unless panel[:metrics].is_a?(Array) + panel[:metrics].each do |metric| yield metric end diff --git a/lib/gitlab/metrics_dashboard/stages/project_metrics_inserter.rb b/lib/gitlab/metrics_dashboard/stages/project_metrics_inserter.rb index 8edb21c89c1..ab33ee75cce 100644 --- a/lib/gitlab/metrics_dashboard/stages/project_metrics_inserter.rb +++ b/lib/gitlab/metrics_dashboard/stages/project_metrics_inserter.rb @@ -60,15 +60,21 @@ module Gitlab end def find_panel_group(panel_groups, metric) + return unless panel_groups + panel_groups.find { |group| group[:group] == metric.group_title } end def find_panel(panels, metric) + return unless panels + panel_identifiers = [DEFAULT_PANEL_TYPE, metric.title, metric.y_label] panels.find { |panel| panel.values_at(:type, :title, :y_label) == panel_identifiers } end def find_metric(metrics, metric) + return unless metrics + metrics.find { |m| m[:id] == metric.identifier } end diff --git a/lib/gitlab/metrics_dashboard/stages/sorter.rb b/lib/gitlab/metrics_dashboard/stages/sorter.rb index a2429e65efa..ca310c9637a 100644 --- a/lib/gitlab/metrics_dashboard/stages/sorter.rb +++ b/lib/gitlab/metrics_dashboard/stages/sorter.rb @@ -5,6 +5,8 @@ module Gitlab module Stages class Sorter < BaseStage def transform!(dashboard) + missing_panel_groups! unless dashboard[:panel_groups].is_a? Array + sort_groups!(dashboard) sort_panels!(dashboard) end @@ -19,6 +21,8 @@ module Gitlab # Sorts the panels in the dashboard by the :weight key def sort_panels!(dashboard) dashboard[:panel_groups].each do |group| + missing_panels! unless group[:panels].is_a? Array + group[:panels] = group[:panels].sort_by { |panel| -panel[:weight].to_i } end end |