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/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) 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 }