diff --git a/lib/alchemy/tasks/usage.rb b/lib/alchemy/tasks/usage.rb new file mode 100644 index 0000000000..4bdebec1e9 --- /dev/null +++ b/lib/alchemy/tasks/usage.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Alchemy + module Tasks + module Usage + extend self + + def elements_count_by_name + ActiveRecord::Base.connection.execute <<~SQL + SELECT name, COUNT(*) AS count + FROM alchemy_elements + GROUP BY name + ORDER BY count DESC, name ASC + SQL + end + + def pages_count_by_type + ActiveRecord::Base.connection.execute <<~SQL + SELECT page_layout, COUNT(*) AS count + FROM alchemy_pages + GROUP BY page_layout + ORDER BY count DESC, page_layout ASC + SQL + 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..74a4f47045 --- /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.to_a } + + 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.to_a } + + 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