diff --git a/lib/alchemy/tasks/usage.rb b/lib/alchemy/tasks/usage.rb new file mode 100644 index 0000000000..cb07058d64 --- /dev/null +++ b/lib/alchemy/tasks/usage.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Alchemy + module Tasks + module Usage + extend self + + def elements_count_by_name + Alchemy::Element.all + .select("name, COUNT(*) AS count") + .group(:name) + .order("count DESC, name ASC") + .map { |e| {"name" => e.name, "count" => e.count} } + end + + def pages_count_by_type + 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} } + 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..7951923f4c --- /dev/null +++ b/spec/libraries/alchemy/tasks/usage_spec.rb @@ -0,0 +1,39 @@ +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} + ] + 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} + ] + end + end +end