From 037f98290e10ab9c989e4eb26540eee9e3337be7 Mon Sep 17 00:00:00 2001 From: eelco Date: Fri, 30 Jan 2026 17:45:00 +0700 Subject: [PATCH 1/2] Extracted most non-Rails logic into the icons gem Rails Icons has been, as the name implies, Rails only. But there are many other great frameworks and Ruby apps that can benefit from the Rails Icons' core: pulling SVG icons from their GitHub repos, easily sync them and offer a class to render them, with various attributes as SVG. Find the [icons gem](https://github.com/rails-designer/icons) here. --- Gemfile | 1 - Gemfile.lock | 4 +- .../rails_icons/initializer_generator.rb | 4 +- lib/generators/rails_icons/sync_generator.rb | 5 +- lib/rails_icons.rb | 14 +- lib/rails_icons/base_generator.rb | 12 +- lib/rails_icons/configuration.rb | 59 ------- lib/rails_icons/configuration/animated.rb | 24 --- lib/rails_icons/configuration/boxicons.rb | 78 ---------- lib/rails_icons/configuration/feather.rb | 49 ------ lib/rails_icons/configuration/flags.rb | 69 --------- lib/rails_icons/configuration/heroicons.rb | 105 ------------- lib/rails_icons/configuration/linear.rb | 49 ------ lib/rails_icons/configuration/lucide.rb | 54 ------- lib/rails_icons/configuration/phosphor.rb | 145 ------------------ lib/rails_icons/configuration/radix.rb | 47 ------ .../configuration/sidekickicons.rb | 105 ------------- lib/rails_icons/configuration/tabler.rb | 72 --------- lib/rails_icons/configuration/weather.rb | 55 ------- lib/rails_icons/engine.rb | 6 + lib/rails_icons/errors.rb | 19 --- lib/rails_icons/helpers/icon_helper.rb | 6 +- lib/rails_icons/icon.rb | 62 -------- lib/rails_icons/icon/attributes.rb | 47 ------ lib/rails_icons/icon/file_path.rb | 57 ------- lib/rails_icons/libraries.rb | 32 ---- lib/rails_icons/sync/engine.rb | 77 ---------- lib/rails_icons/sync/process_variants.rb | 76 --------- lib/rails_icons/sync/transformations.rb | 29 ---- rails_icons.gemspec | 3 +- test/dummy/Gemfile | 5 - .../initializer_generator_test.rb | 4 +- .../{ => rails_icons}/sync_generator_test.rb | 4 +- test/rails_icons/animated_icon_test.rb | 2 +- test/rails_icons/icon_test.rb | 126 +-------------- test/support/icon_helper.rb | 8 +- test/test_helper.rb | 5 +- 37 files changed, 56 insertions(+), 1463 deletions(-) delete mode 100644 lib/rails_icons/configuration.rb delete mode 100644 lib/rails_icons/configuration/animated.rb delete mode 100644 lib/rails_icons/configuration/boxicons.rb delete mode 100644 lib/rails_icons/configuration/feather.rb delete mode 100644 lib/rails_icons/configuration/flags.rb delete mode 100644 lib/rails_icons/configuration/heroicons.rb delete mode 100644 lib/rails_icons/configuration/linear.rb delete mode 100644 lib/rails_icons/configuration/lucide.rb delete mode 100644 lib/rails_icons/configuration/phosphor.rb delete mode 100644 lib/rails_icons/configuration/radix.rb delete mode 100644 lib/rails_icons/configuration/sidekickicons.rb delete mode 100644 lib/rails_icons/configuration/tabler.rb delete mode 100644 lib/rails_icons/configuration/weather.rb delete mode 100644 lib/rails_icons/errors.rb delete mode 100644 lib/rails_icons/icon.rb delete mode 100644 lib/rails_icons/icon/attributes.rb delete mode 100644 lib/rails_icons/icon/file_path.rb delete mode 100644 lib/rails_icons/libraries.rb delete mode 100644 lib/rails_icons/sync/engine.rb delete mode 100644 lib/rails_icons/sync/process_variants.rb delete mode 100644 lib/rails_icons/sync/transformations.rb rename test/generators/{ => rails_icons}/initializer_generator_test.rb (95%) rename test/generators/{ => rails_icons}/sync_generator_test.rb (78%) diff --git a/Gemfile b/Gemfile index cda71f0..cc37cba 100644 --- a/Gemfile +++ b/Gemfile @@ -5,7 +5,6 @@ source "https://rubygems.org" # Specify your gem's dependencies in rails_icons.gemspec gemspec -# gem "rails", "~> 7.0.6" gem "appraisal" gem "propshaft" diff --git a/Gemfile.lock b/Gemfile.lock index a663653..ea1d832 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,7 +2,7 @@ PATH remote: . specs: rails_icons (1.6.1) - nokogiri (~> 1.16, >= 1.16.4) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -102,6 +102,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) diff --git a/lib/generators/rails_icons/initializer_generator.rb b/lib/generators/rails_icons/initializer_generator.rb index 06534f4..246cbc1 100644 --- a/lib/generators/rails_icons/initializer_generator.rb +++ b/lib/generators/rails_icons/initializer_generator.rb @@ -75,7 +75,7 @@ def insert_custom_configuration def create_custom_directory = FileUtils.mkdir_p(File.join(options[:destination], options[:custom])) def library_configuration - libraries.map { RailsIcons.libraries[_1.to_sym].initializer_config }.join("\n") + libraries.map { |library| RailsIcons.libraries[library.to_sym].initializer_config }.join("\n") end def custom_configuration @@ -92,7 +92,7 @@ def custom_configuration def default_configuration_exists? line = /^\s*config\.default_library\s*=/ - File.readlines(INITIALIZER).any? { _1.match?(line) } + File.readlines(INITIALIZER).any? { |file_line| file_line.match?(line) } end def libraries diff --git a/lib/generators/rails_icons/sync_generator.rb b/lib/generators/rails_icons/sync_generator.rb index 0c2e2cd..9081f34 100644 --- a/lib/generators/rails_icons/sync_generator.rb +++ b/lib/generators/rails_icons/sync_generator.rb @@ -1,7 +1,6 @@ # frozen_string_literal: true require "rails_icons/base_generator" -require "rails_icons/sync/engine" module RailsIcons class SyncGenerator < RailsIcons::BaseGenerator @@ -12,7 +11,9 @@ class SyncGenerator < RailsIcons::BaseGenerator class_option :library, type: :string, desc: "Choose a library (#{RailsIcons.libraries.keys.join("/")})" class_option :libraries, type: :array, default: [], desc: "Choose libraries (#{RailsIcons.libraries.keys.join("/")})" - def sync_icons = libraries.each { Sync::Engine.new(_1).sync } + def sync_icons + libraries.each { |library| Icons::Sync.new(library).now } + end private diff --git a/lib/rails_icons.rb b/lib/rails_icons.rb index fa48062..e34cf4b 100644 --- a/lib/rails_icons.rb +++ b/lib/rails_icons.rb @@ -1,11 +1,17 @@ # frozen_string_literal: true +require "icons" + require_relative "rails_icons/version" -require_relative "rails_icons/libraries" -require_relative "rails_icons/configuration" require_relative "rails_icons/engine" -require_relative "rails_icons/errors" -require_relative "rails_icons/icon" module RailsIcons + class << self + def configure(&block) = Icons.configure(&block) + + def configuration = Icons.configuration + alias_method :config, :configuration + + def libraries = Icons.libraries + end end diff --git a/lib/rails_icons/base_generator.rb b/lib/rails_icons/base_generator.rb index 9a24f70..01ced81 100644 --- a/lib/rails_icons/base_generator.rb +++ b/lib/rails_icons/base_generator.rb @@ -15,8 +15,8 @@ def initialize(*arguments) def validate! return if custom_library? - raise RailsIcons::LibraryNotFound.new("") if libraries.empty? - raise RailsIcons::LibraryNotFound.new(invalid_libraries.join(", ")) if invalid_libraries.any? + raise Icons::LibraryNotFound.new("") if libraries.empty? + raise Icons::LibraryNotFound.new(invalid_libraries.join(", ")) if invalid_libraries.any? end def validatable? = false @@ -25,9 +25,13 @@ def libraries [*options.libraries, options.library].compact_blank end - def invalid_libraries = libraries.map(&:to_sym).map(&:downcase).reject { RailsIcons.libraries.key?(_1) } + def invalid_libraries + libraries.map(&:to_sym).map(&:downcase).reject { |library| RailsIcons.libraries.key?(library) } + end - def custom_library? = options.custom.present? + def custom_library? + options.custom.present? + end # Uses `gsub_file` as a read-only operation to check file content. This # approach is preferred over `File.read` because `gsub_file` is properly stubbed diff --git a/lib/rails_icons/configuration.rb b/lib/rails_icons/configuration.rb deleted file mode 100644 index 2f0d7e5..0000000 --- a/lib/rails_icons/configuration.rb +++ /dev/null @@ -1,59 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - def self.configuration - @configuration ||= Configuration.new - end - - def self.configure - yield(configuration) - end - - class Configuration - def initialize - @config = ActiveSupport::OrderedOptions.new - - set_default_config - set_libraries_config - end - - def destination_path - ActiveSupport::Deprecation.new.warn("`destination_path` is deprecated. Use `icons_path` instead.") - - @config.icons_path - end - - def destination_path=(value) - ActiveSupport::Deprecation.new.warn("`destination_path=` is deprecated. Use `icons_path=` instead.") - - @config.icons_path = value - end - - def method_missing(method_name, ...) - if @config.respond_to?(method_name) - @config.send(method_name, ...) - else - super - end - end - - def respond_to_missing?(method_name) - @config.respond_to?(method_name) || super - end - - private - - def set_default_config - @config.default_library = nil - @config.icons_path = "app/assets/svg/icons" - end - - def set_libraries_config - @config.libraries = ActiveSupport::OrderedOptions.new - - RailsIcons.libraries.each { |name, library| @config.libraries[name] = library.config } - - @config.libraries.animated = Configuration::Animated.config - end - end -end diff --git a/lib/rails_icons/configuration/animated.rb b/lib/rails_icons/configuration/animated.rb deleted file mode 100644 index bc941a5..0000000 --- a/lib/rails_icons/configuration/animated.rb +++ /dev/null @@ -1,24 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Animated - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default = default_options - end - end - - private - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/boxicons.rb b/lib/rails_icons/configuration/boxicons.rb deleted file mode 100644 index c1b961d..0000000 --- a/lib/rails_icons/configuration/boxicons.rb +++ /dev/null @@ -1,78 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Boxicons - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :regular - options.exclude_variants = [] - - setup_regular_config(options) - setup_solid_config(options) - setup_logos_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Boxicons defaults - # config.libraries.boxicons.default_variant = "" # Set a default variant for Boxicons - # config.libraries.boxicons.exclude_variants = [] # Exclude specific variants - - # config.libraries.boxicons.solid.css = "size-6" - # config.libraries.boxicons.solid.data = {} - - # config.libraries.boxicons.regular.css = "size-6" - # config.libraries.boxicons.regular.data = {} - - # config.libraries.boxicons.logos.css = "size-6" - # config.libraries.boxicons.logos.data = {} - RB - end - - def source - { - url: "https://github.com/atisawd/boxicons.git", - variants: { - logos: "svg/logos", - regular: "svg/regular", - solid: "svg/solid" - } - } - end - - def transformations - { - filenames: { - delete_prefix: ["bxl-", "bx-", "bxs-"] - } - } - end - - def setup_regular_config(options) - options.regular = ActiveSupport::OrderedOptions.new - options.regular.default = default_options - end - - def setup_solid_config(options) - options.solid = ActiveSupport::OrderedOptions.new - options.solid.default = default_options - end - - def setup_logos_config(options) - options.logos = ActiveSupport::OrderedOptions.new - options.logos.default = default_options - end - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/feather.rb b/lib/rails_icons/configuration/feather.rb deleted file mode 100644 index d808e23..0000000 --- a/lib/rails_icons/configuration/feather.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Feather - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = nil - options.exclude_variants = [] - - options.default = default_options - end - end - - def initializer_config - <<~RB.indent(2) - # Override Feather defaults - # config.libraries.feather.default_variant = "" # Feather has no variants, this is provided for backwards compatibility - # config.libraries.feather.exclude_variants = [] # Feather has no variants, this is provided for backwards compatibility - - # config.libraries.feather.default.css = "size-6" - # config.libraries.feather.default.stroke_width = "2" - # config.libraries.feather.default.data = {} - RB - end - - def source - { - url: "https://github.com/feathericons/feather.git", - variants: { - ".": "icons" # Feather has no variants, store in the top directory - } - } - end - - private - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = "2" - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/flags.rb b/lib/rails_icons/configuration/flags.rb deleted file mode 100644 index 0782c3e..0000000 --- a/lib/rails_icons/configuration/flags.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Flags - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = "landscape" - options.exclude_variants = [] - - setup_square_config(options) - setup_landscape_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Flags defaults - # config.libraries.flags.default_variant = "" # Set a default variant for Flags - # config.libraries.flags.exclude_variants = [:square, :landscape] - - # config.libraries.flags.square.default.css = "size-6" - # config.libraries.flags.square.default.data = {} - - # config.libraries.flags.landscape.default.css = "size-6" - # config.libraries.flags.landscape.default.data = {} - RB - end - - def source - { - url: "https://github.com/lipis/flag-icons.git", - variants: { - square: "flags/1x1", - landscape: "flags/4x3" - } - } - end - - private - - def setup_square_config(options) - options.square = ActiveSupport::OrderedOptions.new - options.square.default = default_square_options - end - - def setup_landscape_config(options) - options.landscape = ActiveSupport::OrderedOptions.new - options.landscape.default = default_landscape_options - end - - def default_square_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_landscape_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/heroicons.rb b/lib/rails_icons/configuration/heroicons.rb deleted file mode 100644 index 4698e5e..0000000 --- a/lib/rails_icons/configuration/heroicons.rb +++ /dev/null @@ -1,105 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Heroicons - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :outline - options.exclude_variants = [] - - setup_outline_config(options) - setup_solid_config(options) - setup_mini_config(options) - setup_micro_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Heroicon defaults - # config.libraries.heroicons.default_variant = "" # Set a default variant for Heroicons - # config.libraries.heroicons.exclude_variants = [:mini, :micro] # Exclude specific variants - - # config.libraries.heroicons.outline.default.css = "size-6" - # config.libraries.heroicons.outline.default.stroke_width = "1.5" - # config.libraries.heroicons.outline.default.data = {} - - # config.libraries.heroicons.solid.default.css = "size-6" - # config.libraries.heroicons.solid.default.data = {} - - # config.libraries.heroicons.mini.default.css = "size-5" - # config.libraries.heroicons.mini.default.data = {} - - # config.libraries.heroicons.micro.default.css = "size-4" - # config.libraries.heroicons.micro.default.data = {} - RB - end - - def source - { - url: "https://github.com/tailwindlabs/heroicons.git", - variants: { - outline: "optimized/24/outline", - solid: "optimized/24/solid", - mini: "optimized/20/solid", - micro: "optimized/16/solid" - } - } - end - - private - - def setup_outline_config(options) - options.outline = ActiveSupport::OrderedOptions.new - options.outline.default = default_outline_options - end - - def setup_solid_config(options) - options.solid = ActiveSupport::OrderedOptions.new - options.solid.default = default_solid_options - end - - def setup_mini_config(options) - options.mini = ActiveSupport::OrderedOptions.new - options.mini.default = default_mini_options - end - - def setup_micro_config(options) - options.micro = ActiveSupport::OrderedOptions.new - options.micro.default = default_micro_options - end - - def default_outline_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = 1.5 - options.css = "size-6" - options.data = {} - end - end - - def default_solid_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_mini_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-5" - options.data = {} - end - end - - def default_micro_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-4" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/linear.rb b/lib/rails_icons/configuration/linear.rb deleted file mode 100644 index 758d119..0000000 --- a/lib/rails_icons/configuration/linear.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Linear - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = nil - options.exclude_variants = [] - - options.default = default_options - end - end - - def initializer_config - <<~RB.indent(2) - # Override Linear defaults - # config.libraries.linear.default_variant = "" # Set a default variant for Linear - # config.libraries.linear.exclude_variants = [] - - # config.libraries.linear.default.css = "size-6" - # config.libraries.linear.default.stroke_width = "2" - # config.libraries.linear.default.data = {} - RB - end - - def source - { - url: "https://github.com/cjpatoilo/linearicons.git", - variants: { - ".": "dist/svg" # Linear has no variants, store in the top directory - } - } - end - - private - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = "2" - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/lucide.rb b/lib/rails_icons/configuration/lucide.rb deleted file mode 100644 index dab1bb7..0000000 --- a/lib/rails_icons/configuration/lucide.rb +++ /dev/null @@ -1,54 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Lucide - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :outline - options.exclude_variants = [] - - setup_outline_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Lucide defaults - # config.libraries.lucide.default_variant = "" # Set a default variant for Lucide - # config.libraries.lucide.exclude_variants = [] # Exclude specific variants - - # config.libraries.lucide.outline.default.css = "size-6" - # config.libraries.lucide.outline.default.stroke_width = "1.5" - # config.libraries.lucide.outline.default.data = {} - RB - end - - def source - { - url: "https://github.com/lucide-icons/lucide.git", - variants: { - outline: "icons" - } - } - end - - private - - def setup_outline_config(options) - options.outline = ActiveSupport::OrderedOptions.new - options.outline.default = default_outline_options - end - - def default_outline_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = "1.5" - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/phosphor.rb b/lib/rails_icons/configuration/phosphor.rb deleted file mode 100644 index 1c33a2d..0000000 --- a/lib/rails_icons/configuration/phosphor.rb +++ /dev/null @@ -1,145 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Phosphor - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :regular - options.exclude_variants = [] - - setup_bold_config(options) - setup_duotone_config(options) - setup_fill_config(options) - setup_light_config(options) - setup_regular_config(options) - setup_thin_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Phosphor defaults - # config.libraries.phosphor.default_variant = "" # Set a default variant for Phosphor - # config.libraries.phosphor.exclude_variants = [:duotone, :thin] # Exclude specific variants - - # config.libraries.phosphor.bold.default.css = "size-6" - # config.libraries.phosphor.bold.default.data = {} - - # config.libraries.phosphor.duotone.default.css = "size-6" - # config.libraries.phosphor.duotone.default.data = {} - - # config.libraries.phosphor.fill.default.css = "size-6" - # config.libraries.phosphor.fill.default.data = {} - - # config.libraries.phosphor.light.default.css = "size-6" - # config.libraries.phosphor.light.default.data = {} - - # config.libraries.phosphor.regular.default.css = "size-6" - # config.libraries.phosphor.regular.default.data = {} - - # config.libraries.phosphor.thin.default.css = "size-6" - # config.libraries.phosphor.thin.default.data = {} - RB - end - - def source - { - url: "https://github.com/phosphor-icons/core.git", - variants: { - bold: "raw/bold", - duotone: "raw/duotone", - fill: "raw/fill", - light: "raw/light", - regular: "raw/regular", - thin: "raw/thin" - } - } - end - - def transformations - { - filenames: { - delete_suffix: ["-bold", "-duotone", "-fill", "-light", "-thin"] - } - } - end - - private - - def setup_bold_config(options) - options.bold = ActiveSupport::OrderedOptions.new - options.bold.default = default_bold_options - end - - def setup_duotone_config(options) - options.duotone = ActiveSupport::OrderedOptions.new - options.duotone.default = default_duotone_options - end - - def setup_fill_config(options) - options.fill = ActiveSupport::OrderedOptions.new - options.fill.default = default_fill_options - end - - def setup_light_config(options) - options.light = ActiveSupport::OrderedOptions.new - options.light.default = default_light_options - end - - def setup_regular_config(options) - options.regular = ActiveSupport::OrderedOptions.new - options.regular.default = default_regular_options - end - - def setup_thin_config(options) - options.thin = ActiveSupport::OrderedOptions.new - options.thin.default = default_thin_options - end - - def default_bold_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_duotone_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_fill_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_light_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_regular_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_thin_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/radix.rb b/lib/rails_icons/configuration/radix.rb deleted file mode 100644 index 72a7fe8..0000000 --- a/lib/rails_icons/configuration/radix.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Radix - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = nil - options.exclude_variants = [] - - options.default = default_options - end - end - - def initializer_config - <<~RB.indent(2) - # Override Radix defaults - # config.libraries.radix.default_variant = "" # Radix has no variants, this is provided for backwards compatibility - # config.libraries.radix.exclude_variants = [] # Radix has no variants, this is provided for backwards compatibility - # config.libraries.radix.default.css = "size-6" - # config.libraries.radix.default.stroke_width = "2" - # config.libraries.radix.default.data = {} - RB - end - - def source - { - url: "https://github.com/radix-ui/icons.git", - variants: { - ".": "packages/radix-icons/icons" # Radix has no variants, store in the top directory - } - } - end - - private - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-4" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/sidekickicons.rb b/lib/rails_icons/configuration/sidekickicons.rb deleted file mode 100644 index 0ae51e0..0000000 --- a/lib/rails_icons/configuration/sidekickicons.rb +++ /dev/null @@ -1,105 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Sidekickicons - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :outline - options.exclude_variants = [] - - setup_outline_config(options) - setup_solid_config(options) - setup_mini_config(options) - setup_micro_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Sidekickicons defaults - # config.libraries.sidekickicons.default_variant = "" # Set a default variant for Sidekickicons - # config.libraries.sidekickicons.exclude_variants = [:mini, :micro] # Exclude specific variants - - # config.libraries.sidekickicons.outline.default.css = "size-6" - # config.libraries.sidekickicons.outline.default.stroke_width = "1.5" - # config.libraries.sidekickicons.outline.default.data = {} - - # config.libraries.sidekickicons.solid.default.css = "size-6" - # config.libraries.sidekickicons.solid.default.data = {} - - # config.libraries.sidekickicons.mini.default.css = "size-5" - # config.libraries.sidekickicons.mini.default.data = {} - - # config.libraries.sidekickicons.micro.default.css = "size-4" - # config.libraries.sidekickicons.micro.default.data = {} - RB - end - - def source - { - url: "https://github.com/ndri/sidekickicons", - variants: { - outline: "optimized/24/outline", - solid: "optimized/24/solid", - mini: "optimized/20/solid", - micro: "optimized/16/solid" - } - } - end - - private - - def setup_outline_config(options) - options.outline = ActiveSupport::OrderedOptions.new - options.outline.default = default_outline_options - end - - def setup_solid_config(options) - options.solid = ActiveSupport::OrderedOptions.new - options.solid.default = default_solid_options - end - - def setup_mini_config(options) - options.mini = ActiveSupport::OrderedOptions.new - options.mini.default = default_mini_options - end - - def setup_micro_config(options) - options.micro = ActiveSupport::OrderedOptions.new - options.micro.default = default_micro_options - end - - def default_solid_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - - def default_outline_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = 1.5 - options.css = "size-6" - options.data = {} - end - end - - def default_mini_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-5" - options.data = {} - end - end - - def default_micro_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-4" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/tabler.rb b/lib/rails_icons/configuration/tabler.rb deleted file mode 100644 index d195ce1..0000000 --- a/lib/rails_icons/configuration/tabler.rb +++ /dev/null @@ -1,72 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Tabler - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = :outline - options.exclude_variants = [] - - setup_outline_config(options) - setup_filled_config(options) - end - end - - def initializer_config - <<~RB.indent(2) - # Override Tabler defaults - # config.libraries.tabler.default_variant = "" # Set a default variant for Tabler - # config.libraries.tabler.exclude_variants = [] # Exclude specific variants - - # config.libraries.tabler.regular.default.css = "size-6" - # config.libraries.tabler.solid.default.css = "size-6" - # config.libraries.tabler.solid.default.data = {} - - # config.libraries.tabler.outline.default.css = "size-6" - # config.libraries.tabler.outline.default.stroke_width = "2" - # config.libraries.tabler.outline.default.data = {} - RB - end - - def source - { - url: "https://github.com/tabler/tabler-icons.git", - variants: { - filled: "icons/filled", - outline: "icons/outline" - } - } - end - - private - - def setup_outline_config(options) - options.outline = ActiveSupport::OrderedOptions.new - options.outline.default = default_outline_options - end - - def setup_filled_config(options) - options.filled = ActiveSupport::OrderedOptions.new - options.filled.default = default_filled_options - end - - def default_outline_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.stroke_width = 2 - options.css = "size-6" - options.data = {} - end - end - - def default_filled_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/configuration/weather.rb b/lib/rails_icons/configuration/weather.rb deleted file mode 100644 index e2583c8..0000000 --- a/lib/rails_icons/configuration/weather.rb +++ /dev/null @@ -1,55 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Configuration - module Weather - extend self - - def config - ActiveSupport::OrderedOptions.new.tap do |options| - options.default_variant = nil - options.exclude_variants = [] - - options.default = default_options - end - end - - def initializer_config - <<~RB.indent(2) - # Override Weather defaults - # config.libraries.weather.default_variant = "" # Set a default variant for Wweather - # config.libraries.weather.exclude_variants = [] - - # config.libraries.weather.default.css = "size-6" - # config.libraries.weather.default.data = {} - RB - end - - def source - { - url: "https://github.com/erikflowers/weather-icons.git", - variants: { - ".": "svg" # Weather has no variants, store in the top directory - } - } - end - - def transformations - { - filenames: { - delete_prefix: ["wi-"] - } - } - end - - private - - def default_options - ActiveSupport::OrderedOptions.new.tap do |options| - options.css = "size-6" - options.data = {} - end - end - end - end -end diff --git a/lib/rails_icons/engine.rb b/lib/rails_icons/engine.rb index 37978d2..d2168ee 100644 --- a/lib/rails_icons/engine.rb +++ b/lib/rails_icons/engine.rb @@ -6,6 +6,12 @@ module RailsIcons class Engine < ::Rails::Engine isolate_namespace RailsIcons + initializer "rails_icons.configure_icons_gem", before: :load_config_initializers do + Icons.configure do |config| + config.base_path = Rails.root + end + end + initializer "rails_icons.helpers" do ActiveSupport.on_load(:action_view) do include RailsIcons::Helpers::IconHelper diff --git a/lib/rails_icons/errors.rb b/lib/rails_icons/errors.rb deleted file mode 100644 index 020088b..0000000 --- a/lib/rails_icons/errors.rb +++ /dev/null @@ -1,19 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class IconNotFound < StandardError - def initialize(icon_name) - super("The icon `#{icon_name}` is not available. Please check the icon name and try again.") - end - end - - class LibraryNotFound < StandardError - def initialize(library_name) - if library_name.empty? - super("No libraries were specified. Please choose from: #{RailsIcons.libraries.keys.to_sentence(last_word_connector: " or ")}") - else - super("The library `#{library_name}` is not available. Please check the library name and try again.") - end - end - end -end diff --git a/lib/rails_icons/helpers/icon_helper.rb b/lib/rails_icons/helpers/icon_helper.rb index 0cea0f4..7c20086 100644 --- a/lib/rails_icons/helpers/icon_helper.rb +++ b/lib/rails_icons/helpers/icon_helper.rb @@ -4,16 +4,16 @@ module RailsIcons module Helpers module IconHelper def icon(name, library: RailsIcons.configuration.default_library, from: library, variant: nil, **arguments) - RailsIcons::Icon.new( + Icons::Icon.new( name: name, library: from || library, variant: variant, arguments: arguments - ).svg + ).svg.html_safe end def encoded_icon(name, library: RailsIcons.configuration.default_library, from: library, variant: nil, **arguments) - svg_content = RailsIcons::Icon.new( + svg_content = Icons::Icon.new( name: name, library: from || library, variant: variant, diff --git a/lib/rails_icons/icon.rb b/lib/rails_icons/icon.rb deleted file mode 100644 index 4638877..0000000 --- a/lib/rails_icons/icon.rb +++ /dev/null @@ -1,62 +0,0 @@ -require "rails_icons/icon/file_path" -require "rails_icons/icon/attributes" - -class RailsIcons::Icon - def initialize(name:, library:, arguments:, variant: nil) - @config = RailsIcons.configuration - - @name = name - @library = library.to_s.inquiry - @variant = (variant || set_variant).to_s - @arguments = arguments - end - - def svg - raise RailsIcons::IconNotFound, error_message unless File.exist?(file_path) - - Nokogiri::HTML::DocumentFragment.parse(File.read(file_path)) - .at_css("svg") - .tap { |svg| attach_attributes(to: svg) } - .to_html - .html_safe - end - - private - - def set_variant - @config.libraries.dig(@library.to_sym, :default_variant).presence || - @config.default_variant.presence - end - - def error_message - attributes = [ - @library, - @variant, - @name - ].compact_blank - - "Icon not found: `#{attributes.join(" / ")}`" - end - - def file_path = RailsIcons::Icon::FilePath.new(name: @name, library: @library, variant: @variant).call - - def attach_attributes(to:) - RailsIcons::Icon::Attributes - .new(default_attributes: default_attributes, arguments: @arguments) - .attach(to: to) - end - - def default_attributes - { - "stroke-width": default(:stroke_width), - data: default(:data), - class: default(:css) - } - end - - def default(key) = library_attributes.dig(:default, key) - - def library_attributes - @config.libraries.dig(*[@library, @variant].select(&:present?)) || {} - end -end diff --git a/lib/rails_icons/icon/attributes.rb b/lib/rails_icons/icon/attributes.rb deleted file mode 100644 index 8b660fd..0000000 --- a/lib/rails_icons/icon/attributes.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module RailsIcons - class Icon - class Attributes - def initialize(default_attributes: {}, arguments: {}) - @merged_attributes = default_attributes.merge(arguments) - end - - def attach(to:) - @merged_attributes.each do |key, value| - if key == :class - class_attribute(key, value, to) - elsif value.is_a?(Hash) - hash_attributes(key, value, to) - else - string_attributes(key, value, to) - end - end - end - - private - - def class_attribute(_, value, to) - to[:class] = ActionController::Base.helpers.token_list(value) - end - - def hash_attributes(key, value, to) - value.each do |nested_key, nested_value| - nested_attribute_name = format_attribute_name("#{key}-#{nested_key}") - - to[nested_attribute_name] = nested_value - end - end - - def string_attributes(key, value, to) - normalized_key = format_attribute_name(key.to_s) - - to[normalized_key] = value - end - - def format_attribute_name(name) - name.tr("_", "-") - end - end - end -end diff --git a/lib/rails_icons/icon/file_path.rb b/lib/rails_icons/icon/file_path.rb deleted file mode 100644 index 3da3c8c..0000000 --- a/lib/rails_icons/icon/file_path.rb +++ /dev/null @@ -1,57 +0,0 @@ -module RailsIcons - class Icon - class FilePath - def initialize(name:, library:, variant:) - @name = name - @library = library - @variant = variant - end - - def call - return animated_icons_path if @library.animated? - return custom_library_path if @library.custom? - - icon_path = icons_path_in_app || icons_path_in_engines - - raise RailsIcons::IconNotFound if icon_path.nil? - - icon_path - end - - private - - def animated_icons_path = RailsIcons::Engine.root.join("app", "assets", "svg", "rails_icons", "icons", "animated", "#{@name}.svg") - - def custom_library_path = Rails.root.join(@library.custom_path, "#{@name}.svg") - - def icons_path_in_app - path = app_path - - path if File.exist?(path) - end - - def icons_path_in_engines - path = nil - - Rails::Engine.subclasses.find do |engine| - path = engine.root.join(*parts) - - path if File.exist?(path) - end - - path - end - - def app_path = Rails.root.join(*parts) - - def parts - [ - RailsIcons.configuration.icons_path, - @library, - @variant, - "#{@name}.svg" - ].compact_blank! - end - end - end -end diff --git a/lib/rails_icons/libraries.rb b/lib/rails_icons/libraries.rb deleted file mode 100644 index 92ecd8b..0000000 --- a/lib/rails_icons/libraries.rb +++ /dev/null @@ -1,32 +0,0 @@ -require_relative "configuration/animated" -require_relative "configuration/boxicons" -require_relative "configuration/feather" -require_relative "configuration/flags" -require_relative "configuration/heroicons" -require_relative "configuration/linear" -require_relative "configuration/lucide" -require_relative "configuration/phosphor" -require_relative "configuration/radix" -require_relative "configuration/sidekickicons" -require_relative "configuration/tabler" -require_relative "configuration/weather" - -module RailsIcons - extend self - - def libraries - { - boxicons: RailsIcons::Configuration::Boxicons, - feather: RailsIcons::Configuration::Feather, - flags: RailsIcons::Configuration::Flags, - heroicons: RailsIcons::Configuration::Heroicons, - linear: RailsIcons::Configuration::Linear, - lucide: RailsIcons::Configuration::Lucide, - phosphor: RailsIcons::Configuration::Phosphor, - radix: RailsIcons::Configuration::Radix, - sidekickicons: RailsIcons::Configuration::Sidekickicons, - tabler: RailsIcons::Configuration::Tabler, - weather: RailsIcons::Configuration::Weather - } - end -end diff --git a/lib/rails_icons/sync/engine.rb b/lib/rails_icons/sync/engine.rb deleted file mode 100644 index aa3a6f6..0000000 --- a/lib/rails_icons/sync/engine.rb +++ /dev/null @@ -1,77 +0,0 @@ -# frozen_string_literal: true - -require "fileutils" -require "rails_icons/sync/process_variants" - -module RailsIcons - module Sync - class Engine < Rails::Generators::Base - hide! - - def initialize(name) - super - - raise "[Rails Icons] Not a valid library" if RailsIcons.libraries.keys.exclude?(name.to_sym) - - @temp_directory, @name, @library = File.join(TEMP_DIRECTORY, name), name, RailsIcons.libraries.fetch(name.to_sym).source - end - - def sync - clone_repository - process_variants - remove_non_svg_files - - move_library - - purge_temp_directory - rescue => error - say "[Rails Icons] Failed to sync icons: #{error.message}", :red - - post_error_clean_up - - raise - end - - private - - TEMP_DIRECTORY = Rails.root.join("tmp/rails_icons").freeze - - def clone_repository - raise "[Rails Icons] Failed to clone repository" unless system("git clone '#{@library[:url]}' '#{@temp_directory}'") - - say "[Rails Icons] '#{@name}' repository cloned" - end - - def process_variants = Sync::ProcessVariants.new(@temp_directory, @name, @library).process - - def remove_non_svg_files - Pathname.glob("#{@temp_directory}/**/*") - .select { _1.file? && _1.extname != ".svg" } - .each(&:delete) - - say "[Rails Icons] Non-SVG files removed" - end - - def move_library - destination = File.join(RailsIcons.configuration.icons_path, @name) - - FileUtils.mkdir_p(destination) - FileUtils.mv(Dir.glob("#{@temp_directory}/*"), destination, force: true) - - say "[Rails Icons] Synced '#{@name}' library #{%w[😃 🎉 ✨].sample}", :green - end - - def purge_temp_directory = FileUtils.rm_rf(TEMP_DIRECTORY) - - def post_error_clean_up - if yes?("Do you want to remove the temp files? ('#{@temp_directory}') [y/n]") - say "[Rails Icons] Cleaning up…" - - FileUtils.rm_rf(@temp_directory) - else - say "[Rails Icons] Keeping files at: '#{@temp_directory}'" - end - end - end - end -end diff --git a/lib/rails_icons/sync/process_variants.rb b/lib/rails_icons/sync/process_variants.rb deleted file mode 100644 index 14a5dc7..0000000 --- a/lib/rails_icons/sync/process_variants.rb +++ /dev/null @@ -1,76 +0,0 @@ -# frozen_string_literal: true - -require "fileutils" -require "rails_icons/sync/transformations" - -module RailsIcons - module Sync - class ProcessVariants < Rails::Generators::Base - hide! - - def initialize(temp_directory, name, library) - @temp_directory, @name, @library = temp_directory, name, library - end - - def process - original_variants = Dir.children(@temp_directory) - excluded_variants = RailsIcons.configuration.libraries.dig(@name.to_sym)&.exclude_variants || [] - - @library[:variants].each do |variant_name, variant_source_path| - next if excluded_variants.include?(variant_name) - - source = File.join(@temp_directory, variant_source_path) - destination = File.join(@temp_directory, variant_name.to_s) - - original_variants.delete(variant_name.to_s) - - raise "[Rails Icons] Failed to find the icons directory: '#{source}'" unless Dir.exist?(source) - - move_icons(source, destination) - - apply_transformations_to(destination) - end - - remove_files_and_folders_for(original_variants) - remove_previously_downloaded(excluded_variants) - - say "[Rails Icons] Icon variants processed successfully" - end - - private - - def move_icons(source, destination) - FileUtils.mkdir_p(destination) - - Dir.each_child(source).each do |item| - FileUtils.mv(File.join(source, item), destination) - end - end - - def apply_transformations_to(destination) - Dir.each_child(destination) do |filename| - File.rename( - File.join(destination, filename), - File.join(destination, Sync::Transformations.transform(filename, transformations.fetch(:filenames, {}))) - ) - end - end - - def remove_files_and_folders_for(paths) - paths.each do |path| - FileUtils.rm_rf(File.join(@temp_directory, path)) - end - end - - def remove_previously_downloaded(variants) - variants.each do |variant| - FileUtils.rm_rf(File.join(RailsIcons.configuration.icons_path, @name, variant.to_s)) - end - end - - def transformations - RailsIcons.libraries.dig(@name.to_sym)&.try(:transformations) || {} - end - end - end -end diff --git a/lib/rails_icons/sync/transformations.rb b/lib/rails_icons/sync/transformations.rb deleted file mode 100644 index a69a8c4..0000000 --- a/lib/rails_icons/sync/transformations.rb +++ /dev/null @@ -1,29 +0,0 @@ -module RailsIcons - module Sync - class Transformations < Rails::Generators::Base - hide! - - def self.transform(filename, rules = {}) - basename = File.basename(filename, File.extname(filename)) - - transformed = rules.reduce(basename) do |fn, (type, value)| - TRANSFORMERS.fetch(type).call(fn, value) - end - - [transformed, File.extname(filename)].join - end - - private - - TRANSFORMERS = { - delete_prefix: ->(filename, prefixes) { - Array(prefixes).reduce(filename) { _1.delete_prefix(_2) } - }, - - delete_suffix: ->(filename, suffixes) { - Array(suffixes).reduce(filename) { _1.delete_suffix(_2) } - } - } - end - end -end diff --git a/rails_icons.gemspec b/rails_icons.gemspec index 7c1fdcf..cfc4e47 100644 --- a/rails_icons.gemspec +++ b/rails_icons.gemspec @@ -18,7 +18,6 @@ Gem::Specification.new do |spec| spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "Rakefile", "README.md", "rails_icons.gemspec", "Gemfile", "Gemfile.lock"] - # spec.required_ruby_version = ">= 3.1.0" spec.add_dependency "rails", ">= 7.0" - spec.add_runtime_dependency "nokogiri", "~> 1.16", ">= 1.16.4" + spec.add_dependency "icons", "~> 0.6.0" end diff --git a/test/dummy/Gemfile b/test/dummy/Gemfile index 165d5e1..9299984 100644 --- a/test/dummy/Gemfile +++ b/test/dummy/Gemfile @@ -1,12 +1,7 @@ source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } -# Specify your gem's dependencies in dummy.gemspec. gemspec gem "puma" - gem "pg" - -# Start debugger with binding.b [https://github.com/ruby/debug] -# gem "debug", ">= 1.0.0" diff --git a/test/generators/initializer_generator_test.rb b/test/generators/rails_icons/initializer_generator_test.rb similarity index 95% rename from test/generators/initializer_generator_test.rb rename to test/generators/rails_icons/initializer_generator_test.rb index 72297fd..0ae102d 100644 --- a/test/generators/initializer_generator_test.rb +++ b/test/generators/rails_icons/initializer_generator_test.rb @@ -83,8 +83,8 @@ class InitializerGeneratorTest < Rails::Generators::TestCase end end - test "generator raise RailsIcons::LibraryNotFound when no library is specified" do - assert_raises(RailsIcons::LibraryNotFound) do + test "generator raise Icons::LibraryNotFound when no library is specified" do + assert_raises(Icons::LibraryNotFound) do run_generator end diff --git a/test/generators/sync_generator_test.rb b/test/generators/rails_icons/sync_generator_test.rb similarity index 78% rename from test/generators/sync_generator_test.rb rename to test/generators/rails_icons/sync_generator_test.rb index 9262338..21a9426 100644 --- a/test/generators/sync_generator_test.rb +++ b/test/generators/rails_icons/sync_generator_test.rb @@ -6,9 +6,9 @@ class SyncGeneratorTest < Minitest::Test def test_calls_sync_on_engine sync_engine = Minitest::Mock.new - sync_engine.expect(:sync, nil) + sync_engine.expect(:now, nil) - RailsIcons::Sync::Engine.stub(:new, sync_engine) do + Icons::Sync.stub(:new, sync_engine) do RailsIcons::SyncGenerator.new([], libraries: ["heroicons"]).sync_icons end diff --git a/test/rails_icons/animated_icon_test.rb b/test/rails_icons/animated_icon_test.rb index 5530892..2952577 100644 --- a/test/rails_icons/animated_icon_test.rb +++ b/test/rails_icons/animated_icon_test.rb @@ -1,5 +1,5 @@ require "test_helper" -require "rails_icons/icon" +require "icons" class AnimatedIconTest < ActiveSupport::TestCase include IconHelper diff --git a/test/rails_icons/icon_test.rb b/test/rails_icons/icon_test.rb index 3fe06f9..1368cd4 100644 --- a/test/rails_icons/icon_test.rb +++ b/test/rails_icons/icon_test.rb @@ -1,142 +1,26 @@ require "test_helper" -require "rails_icons/icon" include IconHelper class IconTest < ActiveSupport::TestCase - test "it returns an icon SVG" do + test "it returns an icon SVG through helper" do assert_match(/\A\z/m, icon("academic-cap")) end - test "it should not include height" do - refute_match(/height=/i, icon("academic-cap"), "SVG should not contain a 'height' attribute") - end - - test "it returns a SVG with custom class" do - assert_match(/class="size-4"/, icon("academic-cap", class: "size-4"), "SVG should contain 'class=\"size-4\"'") - end - - test "it returns a SVG with custom data attributes" do - assert_match(/data-controller="swap"/, icon("academic-cap", data: {controller: "swap"}), "SVG should contain 'data-attributes'") - end - - test "it returns a SVG with custom strokeWidth" do - assert_match(/stroke-width="3"/, icon("academic-cap", stroke_width: 3), "SVG should contain 'stroke-width=\"3\"'") - end - - test "it parses class attributes" do - assert_match(/class="present"/, icon("academic-cap", class: ["present": true, "not-present": false]), "SVG should contain 'class=\"present\"'") - end - test "`from` alias for `library`" do assert_nothing_raised do icon("academic-cap", from: "heroicons") end end - test "setting variant, it returns a SVG" do + test "helper with variant" do assert_nothing_raised do icon("academic-cap", variant: "mini") end end - test "it uses the library specific default variant over the global" do - config = RailsIcons::Configuration.new - config.default_variant = "global variant" - config.libraries.heroicons.default_variant = "outline" - - icon = RailsIcons::Icon.new(name: "academic-cap", library: "heroicons", arguments: {}) - - assert_nothing_raised do - icon.svg - end - end - - test "setting variant as symbol, it returns a SVG" do - assert_nothing_raised do - icon("academic-cap", variant: :mini) - end - end - - test "default library (heroicons)" do - assert_nothing_raised do - icon("academic-cap") - end - end - - test "sidekickicons" do - assert_nothing_raised do - icon("arc-third", library: "sidekickicons") - end - end - - test "feather" do - assert_nothing_raised do - icon("activity", library: "feather") - end - end - - test "radix" do - assert_nothing_raised do - icon("accessibility", library: "radix") - end - end - - test "boxicons" do - assert_nothing_raised do - icon("abacus", library: "boxicons") - end - end - - test "lucide" do - assert_nothing_raised do - icon("graduation-cap", library: "lucide") - end - end - - test "phosphor" do - assert_nothing_raised do - icon("acorn", library: "phosphor") - end - - assert_nothing_raised do - icon("acorn", library: "phosphor", variant: :duotone) - end - end - - test "tabler" do - assert_nothing_raised do - icon("thumbs-up", library: "tabler") - end - end - - test "linear" do - assert_nothing_raised do - icon("alarm", library: "linear") - end - end - - test "weather" do - assert_nothing_raised do - icon("alien", library: "weather") - end - end - - test "flags" do - assert_nothing_raised do - icon("nl", library: "flags") - end - end - - test "custom library" do - assert_nothing_raised do - icon("apple", library: "simple") - end - end - - test "it raises RailsIcons::IconNotFound error" do - assert_raises(RailsIcons::IconNotFound) do - icon("non-existing-icon") - end + test "encoded_icon helper" do + result = encoded_icon("academic-cap") + assert result.start_with?("data:image/svg+xml;base64,") end end diff --git a/test/support/icon_helper.rb b/test/support/icon_helper.rb index 8c97a84..14a4343 100644 --- a/test/support/icon_helper.rb +++ b/test/support/icon_helper.rb @@ -1,5 +1,11 @@ module IconHelper def icon(name, library: "heroicons", variant: nil, **arguments) - RailsIcons::Icon.new(name: name, library:, variant:, arguments:).svg + Icons::Icon.new(name: name, library:, variant:, arguments:).svg + end + + def encoded_icon(name, library: "heroicons", from: library, variant: nil, **arguments) + svg_content = Icons::Icon.new(name: name, library: from || library, variant: variant, arguments: arguments).svg + + "data:image/svg+xml;base64,#{Base64.strict_encode64(svg_content)}" end end diff --git a/test/test_helper.rb b/test/test_helper.rb index 350ac6d..12cdda3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,7 +1,8 @@ # Configure Rails Environment -ENV['RAILS_ENV'] = 'test' +ENV["RAILS_ENV"] = "test" require File.expand_path('dummy/config/environment.rb', __dir__) -require 'rails/test_help' +require "rails/test_help" +require "rails_icons" # Replace with your gem's name Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f } From 4d9654fcbc28b5ab864ce3679dcd1238d0ea4227 Mon Sep 17 00:00:00 2001 From: eelco Date: Mon, 9 Feb 2026 12:06:34 +0700 Subject: [PATCH 2/2] Updated Appraisal gemfiles --- gemfiles/rails_7_0.gemfile.lock | 6 ++++-- gemfiles/rails_7_1.gemfile.lock | 6 ++++-- gemfiles/rails_7_2.gemfile.lock | 6 ++++-- gemfiles/rails_8_0.gemfile.lock | 6 ++++-- gemfiles/rails_main.gemfile.lock | 6 ++++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gemfiles/rails_7_0.gemfile.lock b/gemfiles/rails_7_0.gemfile.lock index 16caa20..ad663c8 100644 --- a/gemfiles/rails_7_0.gemfile.lock +++ b/gemfiles/rails_7_0.gemfile.lock @@ -1,8 +1,8 @@ PATH remote: .. specs: - rails_icons (1.6.0) - nokogiri (~> 1.16, >= 1.16.4) + rails_icons (1.6.1) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -96,6 +96,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) diff --git a/gemfiles/rails_7_1.gemfile.lock b/gemfiles/rails_7_1.gemfile.lock index 079890d..c9c8e76 100644 --- a/gemfiles/rails_7_1.gemfile.lock +++ b/gemfiles/rails_7_1.gemfile.lock @@ -1,8 +1,8 @@ PATH remote: .. specs: - rails_icons (1.6.0) - nokogiri (~> 1.16, >= 1.16.4) + rails_icons (1.6.1) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -110,6 +110,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) diff --git a/gemfiles/rails_7_2.gemfile.lock b/gemfiles/rails_7_2.gemfile.lock index fbcdc4a..78f4b5e 100644 --- a/gemfiles/rails_7_2.gemfile.lock +++ b/gemfiles/rails_7_2.gemfile.lock @@ -1,8 +1,8 @@ PATH remote: .. specs: - rails_icons (1.6.0) - nokogiri (~> 1.16, >= 1.16.4) + rails_icons (1.6.1) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -104,6 +104,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) diff --git a/gemfiles/rails_8_0.gemfile.lock b/gemfiles/rails_8_0.gemfile.lock index 05dfca2..55856d2 100644 --- a/gemfiles/rails_8_0.gemfile.lock +++ b/gemfiles/rails_8_0.gemfile.lock @@ -1,8 +1,8 @@ PATH remote: .. specs: - rails_icons (1.6.0) - nokogiri (~> 1.16, >= 1.16.4) + rails_icons (1.6.1) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -102,6 +102,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0) diff --git a/gemfiles/rails_main.gemfile.lock b/gemfiles/rails_main.gemfile.lock index 41fe260..056032c 100644 --- a/gemfiles/rails_main.gemfile.lock +++ b/gemfiles/rails_main.gemfile.lock @@ -102,8 +102,8 @@ GIT PATH remote: .. specs: - rails_icons (1.6.0) - nokogiri (~> 1.16, >= 1.16.4) + rails_icons (1.6.1) + icons (~> 0.6.0) rails (>= 7.0) GEM @@ -134,6 +134,8 @@ GEM activesupport (>= 6.1) i18n (1.14.7) concurrent-ruby (~> 1.0) + icons (0.6.0) + nokogiri (~> 1.16, >= 1.16.4) io-console (0.8.1) irb (1.15.2) pp (>= 0.6.0)