From 825c66bdfab4e7e67359af17d80c3bcd05d0272f Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Thu, 22 Jun 2023 10:03:43 +0200 Subject: [PATCH] Add task(s) to visualize element and page usage --- lib/alchemy/tasks/usage.rb | 33 +++++++++++ lib/tasks/alchemy/usage.rake | 40 +++++++++++++ spec/libraries/alchemy/tasks/usage_spec.rb | 65 ++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 lib/alchemy/tasks/usage.rb create mode 100644 lib/tasks/alchemy/usage.rake create mode 100644 spec/libraries/alchemy/tasks/usage_spec.rb diff --git a/lib/alchemy/tasks/usage.rb b/lib/alchemy/tasks/usage.rb new file mode 100644 index 0000000000..e678e85a94 --- /dev/null +++ b/lib/alchemy/tasks/usage.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Alchemy + module Tasks + module Usage + extend self + + def elements_count_by_name + res = Alchemy::Element.all + .select("name, COUNT(*) AS count") + .group(:name) + .order("count DESC, name ASC") + .map { |e| {"name" => e.name, "count" => e.count} } + Alchemy::Element.definitions.reject { |definition| res.map { |e| e["name"] }.include? definition["name"] }.each do |definition| + res << {"name" => definition["name"], "count" => 0} + end + res + end + + def pages_count_by_type + res = Alchemy::Page.all + .select("page_layout, COUNT(*) AS count") + .group(:page_layout) + .order("count DESC, page_layout ASC") + .map { |p| {"page_layout" => p.page_layout, "count" => p.count} } + Alchemy::PageLayout.all.reject { |page_layout| res.map { |p| p["page_layout"] }.include? page_layout["name"] }.each do |page_layout| + res << {"page_layout" => page_layout["name"], "count" => 0} + end + res + end + end + end +end diff --git a/lib/tasks/alchemy/usage.rake b/lib/tasks/alchemy/usage.rake new file mode 100644 index 0000000000..aba5cd267c --- /dev/null +++ b/lib/tasks/alchemy/usage.rake @@ -0,0 +1,40 @@ +require "alchemy/tasks/usage" + +namespace :alchemy do + desc "List Alchemy elements and pages usage" + task usage: [:page_usage, :element_usage] + + desc "List Alchemy elements usage" + task page_usage: :environment do + include ActionView::Helpers::NumberHelper + puts "\n Alchemy pages usage" + results = Alchemy::Tasks::Usage.pages_count_by_type + if results.any? + puts " ----------------------" + puts "\n" + results.each do |row| + puts " #{number_with_delimiter(row["count"])} 𝗑 #{row["page_layout"]}" + end + puts "\n = #{number_with_delimiter(Alchemy::Page.count)} pages in total." + else + puts " > No pages found!" + end + end + + desc "List Alchemy elements usage" + task element_usage: :environment do + include ActionView::Helpers::NumberHelper + puts "\n Alchemy elements usage" + results = Alchemy::Tasks::Usage.elements_count_by_name + if results.any? + puts " ----------------------" + puts "\n" + results.each do |row| + puts " #{number_with_delimiter(row["count"])} 𝗑 #{row["name"]}" + end + puts "\n = #{number_with_delimiter(Alchemy::Element.count)} elements in total." + else + puts " > No elements found!" + end + end +end diff --git a/spec/libraries/alchemy/tasks/usage_spec.rb b/spec/libraries/alchemy/tasks/usage_spec.rb new file mode 100644 index 0000000000..de82d17270 --- /dev/null +++ b/spec/libraries/alchemy/tasks/usage_spec.rb @@ -0,0 +1,65 @@ +require "rails_helper" +require "alchemy/tasks/usage" + +RSpec.describe Alchemy::Tasks::Usage do + describe ".elements_count_by_name" do + subject { described_class.elements_count_by_name } + + before do + create_list(:alchemy_element, 3, name: "headline") + create_list(:alchemy_element, 2, name: "image") + create(:alchemy_element, name: "text") + end + + it "returns the elements count by name" do + expect(subject).to eq [ + {"name" => "headline", "count" => 3}, + {"name" => "image", "count" => 2}, + {"name" => "text", "count" => 1}, + {"name" => "header", "count" => 0}, + {"name" => "article", "count" => 0}, + {"name" => "search", "count" => 0}, + {"name" => "news", "count" => 0}, + {"name" => "download", "count" => 0}, + {"name" => "bild", "count" => 0}, + {"name" => "contactform", "count" => 0}, + {"name" => "all_you_can_eat", "count" => 0}, + {"name" => "erb_element", "count" => 0}, + {"name" => "slide", "count" => 0}, + {"name" => "slider", "count" => 0}, + {"name" => "gallery", "count" => 0}, + {"name" => "gallery_picture", "count" => 0}, + {"name" => "right_column", "count" => 0}, + {"name" => "left_column", "count" => 0}, + {"name" => "erb_cell", "count" => 0}, + {"name" => "menu", "count" => 0}, + {"name" => "old", "count" => 0}, + {"name" => "element_with_ingredient_groups", "count" => 0}, + {"name" => "element_with_warning", "count" => 0} + ] + end + end + + describe ".pages_count_by_type" do + subject { described_class.pages_count_by_type } + + before do + create_list(:alchemy_page, 2, page_layout: "standard") + create(:alchemy_page, page_layout: "home") + end + + it "returns the pages count by type" do + expect(subject).to eq [ + {"page_layout" => "standard", "count" => 2}, + {"page_layout" => "home", "count" => 1}, + {"page_layout" => "index", "count" => 1}, + {"page_layout" => "readonly", "count" => 0}, + {"page_layout" => "everything", "count" => 0}, + {"page_layout" => "news", "count" => 0}, + {"page_layout" => "contact", "count" => 0}, + {"page_layout" => "footer", "count" => 0}, + {"page_layout" => "erb_layout", "count" => 0} + ] + end + end +end