rails_icons 0.4.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/README.md +75 -60
  4. data/app/assets/svg/rails_icons/icons/animated/bouncing-dots.svg +1 -0
  5. data/app/assets/svg/rails_icons/icons/animated/faded-spinner.svg +1 -0
  6. data/app/assets/svg/rails_icons/icons/animated/fading-dots.svg +1 -0
  7. data/app/assets/svg/rails_icons/icons/animated/trailing-spinner.svg +1 -0
  8. data/lib/generators/rails_icons/initializer_generator.rb +89 -2
  9. data/lib/generators/rails_icons/install_generator.rb +27 -0
  10. data/lib/generators/rails_icons/sync_generator.rb +16 -37
  11. data/lib/generators/rails_icons/templates/initializer.rb.tt +0 -16
  12. data/lib/rails_icons/configuration/animated.rb +24 -0
  13. data/lib/rails_icons/configuration/boxicons.rb +74 -0
  14. data/lib/rails_icons/configuration/feather.rb +45 -0
  15. data/lib/rails_icons/configuration/heroicons.rb +101 -0
  16. data/lib/rails_icons/configuration/lucide.rb +50 -0
  17. data/lib/rails_icons/configuration/phosphor.rb +141 -0
  18. data/lib/rails_icons/configuration/radix.rb +44 -0
  19. data/lib/rails_icons/configuration/tabler.rb +67 -0
  20. data/lib/rails_icons/configuration.rb +13 -12
  21. data/lib/rails_icons/helpers/icon_helper.rb +3 -4
  22. data/lib/rails_icons/icon/attributes.rb +9 -3
  23. data/lib/rails_icons/icon/file_path.rb +57 -0
  24. data/lib/rails_icons/icon.rb +37 -45
  25. data/lib/rails_icons/libraries.rb +24 -0
  26. data/lib/rails_icons/railtie.rb +6 -0
  27. data/lib/rails_icons/sync/engine.rb +75 -0
  28. data/lib/rails_icons/sync/process_variants.rb +64 -0
  29. data/lib/rails_icons/sync/transformations.rb +27 -0
  30. data/lib/rails_icons/version.rb +1 -1
  31. data/lib/rails_icons.rb +2 -12
  32. data/rails_icons.gemspec +3 -3
  33. metadata +26 -10
  34. data/lib/rails_icons/icon_configs/heroicons_config.rb +0 -66
  35. data/lib/rails_icons/icon_configs/lucide_config.rb +0 -28
  36. data/lib/rails_icons/icon_configs/tabler_config.rb +0 -41
@@ -0,0 +1,24 @@
1
+ require_relative "configuration/animated"
2
+ require_relative "configuration/boxicons"
3
+ require_relative "configuration/feather"
4
+ require_relative "configuration/heroicons"
5
+ require_relative "configuration/lucide"
6
+ require_relative "configuration/phosphor"
7
+ require_relative "configuration/radix"
8
+ require_relative "configuration/tabler"
9
+
10
+ module RailsIcons
11
+ extend self
12
+
13
+ def libraries
14
+ {
15
+ boxicons: RailsIcons::Configuration::Boxicons,
16
+ feather: RailsIcons::Configuration::Feather,
17
+ heroicons: RailsIcons::Configuration::Heroicons,
18
+ lucide: RailsIcons::Configuration::Lucide,
19
+ phosphor: RailsIcons::Configuration::Phosphor,
20
+ radix: RailsIcons::Configuration::Radix,
21
+ tabler: RailsIcons::Configuration::Tabler
22
+ }
23
+ end
24
+ end
@@ -9,5 +9,11 @@ module RailsIcons
9
9
  include RailsIcons::Helpers::IconHelper
10
10
  end
11
11
  end
12
+
13
+ initializer "rails_icons.assets" do |app|
14
+ gem_root = Pathname.new(Gem.loaded_specs["rails_icons"].gem_dir)
15
+
16
+ app.config.assets.paths << gem_root.join("app", "assets", "svg")
17
+ end
12
18
  end
13
19
  end
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "rails_icons/sync/process_variants"
5
+
6
+ module RailsIcons
7
+ module Sync
8
+ class Engine < Rails::Generators::Base
9
+ def initialize(name)
10
+ super
11
+
12
+ raise "[Rails Icons] Not a valid library" if RailsIcons.libraries.keys.exclude?(name.to_sym)
13
+
14
+ @temp_directory, @name, @library = File.join(TEMP_DIRECTORY, name), name, RailsIcons.libraries.fetch(name.to_sym).source
15
+ end
16
+
17
+ def sync
18
+ clone_repository
19
+ process_variants
20
+ remove_non_svg_files
21
+
22
+ move_library
23
+
24
+ purge_temp_directory
25
+ rescue => error
26
+ say "[Rails Icons] Failed to sync icons: #{error.message}", :red
27
+
28
+ post_error_clean_up
29
+
30
+ raise
31
+ end
32
+
33
+ private
34
+
35
+ TEMP_DIRECTORY = Rails.root.join("tmp/icons").freeze
36
+
37
+ def clone_repository
38
+ raise "[Rails Icons] Failed to clone repository" unless system("git clone '#{@library[:url]}' '#{@temp_directory}'")
39
+
40
+ say "'#{@name}' repository cloned successfully."
41
+ end
42
+
43
+ def process_variants = Sync::ProcessVariants.new(@temp_directory, @name, @library).process
44
+
45
+ def remove_non_svg_files
46
+ Pathname.glob("#{@temp_directory}/**/*")
47
+ .select { _1.file? && _1.extname != ".svg" }
48
+ .each(&:delete)
49
+
50
+ say "[Rails Icons] Non-SVG files removed successfully"
51
+ end
52
+
53
+ def move_library
54
+ destination = File.join(RailsIcons.configuration.destination_path, @name)
55
+
56
+ FileUtils.mkdir_p(destination)
57
+ FileUtils.mv(Dir.glob("#{@temp_directory}/*"), destination, force: true)
58
+
59
+ say "[Rails Icons] Synced '#{@name}' library successfully #{%w[😃 🎉 ✨].sample}", :green
60
+ end
61
+
62
+ def purge_temp_directory = FileUtils.rm_rf(TEMP_DIRECTORY)
63
+
64
+ def post_error_clean_up
65
+ if yes?("Do you want to remove the temp files? ('#{@temp_directory}') [y/n]")
66
+ say "[Rails Icons] Cleaning up…"
67
+
68
+ FileUtils.rm_rf(@temp_directory)
69
+ else
70
+ say "[Rails Icons] Keeping files at: '#{@temp_directory}'"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "rails_icons/sync/transformations"
5
+
6
+ module RailsIcons
7
+ module Sync
8
+ class ProcessVariants < Rails::Generators::Base
9
+ def initialize(temp_directory, name, library)
10
+ @temp_directory, @name, @library = temp_directory, name, library
11
+ end
12
+
13
+ def process
14
+ original_variants = Dir.children(@temp_directory)
15
+
16
+ @library[:variants].each do |variant_name, variant_source_path|
17
+ source = File.join(@temp_directory, variant_source_path)
18
+ destination = File.join(@temp_directory, variant_name.to_s)
19
+
20
+ original_variants.delete(variant_name.to_s)
21
+
22
+ raise "[Rails Icons] Failed to find the icons directory: '#{source}'" unless Dir.exist?(source)
23
+
24
+ move_icons(source, destination)
25
+
26
+ apply_transformations_to(destination)
27
+ end
28
+
29
+ remove_files_and_folders(original_variants)
30
+
31
+ say "[Rails Icons] Icon variants processed successfully"
32
+ end
33
+
34
+ private
35
+
36
+ def move_icons(source, destination)
37
+ FileUtils.mkdir_p(destination)
38
+
39
+ Dir.each_child(source).each do |item|
40
+ FileUtils.mv(File.join(source, item), destination)
41
+ end
42
+ end
43
+
44
+ def apply_transformations_to(destination)
45
+ Dir.each_child(destination) do |filename|
46
+ File.rename(
47
+ File.join(destination, filename),
48
+ File.join(destination, Sync::Transformations.transform(filename, transformations.fetch(:filenames, {})))
49
+ )
50
+ end
51
+ end
52
+
53
+ def remove_files_and_folders(paths)
54
+ paths.each do |path|
55
+ FileUtils.rm_rf(File.join(@temp_directory, path))
56
+ end
57
+ end
58
+
59
+ def transformations
60
+ RailsIcons.libraries.dig(@name.to_sym)&.try(:transformations) || {}
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,27 @@
1
+ module RailsIcons
2
+ module Sync
3
+ class Transformations < Rails::Generators::Base
4
+ def self.transform(filename, rules = {})
5
+ basename = File.basename(filename, File.extname(filename))
6
+
7
+ transformed = rules.reduce(basename) do |fn, (type, value)|
8
+ TRANSFORMERS.fetch(type).call(fn, value)
9
+ end
10
+
11
+ [transformed, File.extname(filename)].join
12
+ end
13
+
14
+ private
15
+
16
+ TRANSFORMERS = {
17
+ delete_prefix: ->(filename, prefixes) {
18
+ Array(prefixes).reduce(filename) { _1.delete_prefix(_2) }
19
+ },
20
+
21
+ delete_suffix: ->(filename, suffixes) {
22
+ Array(suffixes).reduce(filename) { _1.delete_suffix(_2) }
23
+ }
24
+ }
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsIcons
2
- VERSION = "0.4.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/rails_icons.rb CHANGED
@@ -1,22 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "rails_icons/version"
4
- require_relative "rails_icons/engine"
4
+ require_relative "rails_icons/libraries"
5
5
  require_relative "rails_icons/configuration"
6
+ require_relative "rails_icons/engine"
6
7
  require_relative "rails_icons/errors"
7
8
  require_relative "rails_icons/railtie"
8
9
  require_relative "rails_icons/icon"
9
10
 
10
11
  module RailsIcons
11
- def self.configuration
12
- @configuration ||= Configuration.new
13
- end
14
-
15
- def self.configure
16
- yield(configuration)
17
- end
18
-
19
- def self.icons_directory
20
- File.join("lib", "assets", "rails_icons")
21
- end
22
12
  end
data/rails_icons.gemspec CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ["Rails Designer Developers"]
9
9
  spec.email = ["devs@railsdesigner.com"]
10
10
 
11
- spec.summary = "Add icons from multiple icons in your Rails app"
12
- spec.description = "Add SVG icons from multiple libraries, or your own custom icon set with this one gem."
11
+ spec.summary = "Add any icon library to a Rails app"
12
+ spec.description = "Add any icon library to a Rails app, from Heroicons, to Lucide to Tabler (and others). Rails Icons is library-agnostic, so you can add any library while using the same interface."
13
13
  spec.homepage = "https://railsdesigner.com/rails-icons/"
14
14
  spec.license = "MIT"
15
15
 
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.files = Dir["{bin,app,config,db,lib,public}/**/*", "Rakefile", "README.md", "rails_icons.gemspec", "Gemfile", "Gemfile.lock"]
20
20
 
21
- spec.required_ruby_version = ">= 3.0.0"
21
+ spec.required_ruby_version = ">= 3.1.0"
22
22
  spec.add_dependency "rails", "> 6.1"
23
23
  spec.add_runtime_dependency "nokogiri", "~> 1.16", ">= 1.16.4"
24
24
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_icons
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rails Designer Developers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-14 00:00:00.000000000 Z
11
+ date: 2025-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -44,8 +44,9 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 1.16.4
47
- description: Add SVG icons from multiple libraries, or your own custom icon set with
48
- this one gem.
47
+ description: Add any icon library to a Rails app, from Heroicons, to Lucide to Tabler
48
+ (and others). Rails Icons is library-agnostic, so you can add any library while
49
+ using the same interface.
49
50
  email:
50
51
  - devs@railsdesigner.com
51
52
  executables: []
@@ -56,24 +57,39 @@ files:
56
57
  - Gemfile.lock
57
58
  - README.md
58
59
  - Rakefile
60
+ - app/assets/svg/rails_icons/icons/animated/bouncing-dots.svg
61
+ - app/assets/svg/rails_icons/icons/animated/faded-spinner.svg
62
+ - app/assets/svg/rails_icons/icons/animated/fading-dots.svg
63
+ - app/assets/svg/rails_icons/icons/animated/trailing-spinner.svg
59
64
  - bin/console
60
65
  - bin/rails
61
66
  - bin/release
62
67
  - bin/setup
63
68
  - lib/generators/rails_icons/initializer_generator.rb
69
+ - lib/generators/rails_icons/install_generator.rb
64
70
  - lib/generators/rails_icons/sync_generator.rb
65
71
  - lib/generators/rails_icons/templates/initializer.rb.tt
66
72
  - lib/rails_icons.rb
67
73
  - lib/rails_icons/configuration.rb
74
+ - lib/rails_icons/configuration/animated.rb
75
+ - lib/rails_icons/configuration/boxicons.rb
76
+ - lib/rails_icons/configuration/feather.rb
77
+ - lib/rails_icons/configuration/heroicons.rb
78
+ - lib/rails_icons/configuration/lucide.rb
79
+ - lib/rails_icons/configuration/phosphor.rb
80
+ - lib/rails_icons/configuration/radix.rb
81
+ - lib/rails_icons/configuration/tabler.rb
68
82
  - lib/rails_icons/engine.rb
69
83
  - lib/rails_icons/errors.rb
70
84
  - lib/rails_icons/helpers/icon_helper.rb
71
85
  - lib/rails_icons/icon.rb
72
86
  - lib/rails_icons/icon/attributes.rb
73
- - lib/rails_icons/icon_configs/heroicons_config.rb
74
- - lib/rails_icons/icon_configs/lucide_config.rb
75
- - lib/rails_icons/icon_configs/tabler_config.rb
87
+ - lib/rails_icons/icon/file_path.rb
88
+ - lib/rails_icons/libraries.rb
76
89
  - lib/rails_icons/railtie.rb
90
+ - lib/rails_icons/sync/engine.rb
91
+ - lib/rails_icons/sync/process_variants.rb
92
+ - lib/rails_icons/sync/transformations.rb
77
93
  - lib/rails_icons/version.rb
78
94
  - rails_icons.gemspec
79
95
  homepage: https://railsdesigner.com/rails-icons/
@@ -90,15 +106,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
106
  requirements:
91
107
  - - ">="
92
108
  - !ruby/object:Gem::Version
93
- version: 3.0.0
109
+ version: 3.1.0
94
110
  required_rubygems_version: !ruby/object:Gem::Requirement
95
111
  requirements:
96
112
  - - ">="
97
113
  - !ruby/object:Gem::Version
98
114
  version: '0'
99
115
  requirements: []
100
- rubygems_version: 3.5.21
116
+ rubygems_version: 3.3.7
101
117
  signing_key:
102
118
  specification_version: 4
103
- summary: Add icons from multiple icons in your Rails app
119
+ summary: Add any icon library to a Rails app
104
120
  test_files: []
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RailsIcons
4
- # Defines the configuration options for the heroicons icon pack
5
- class HeroiconsConfig
6
- def config
7
- options = ActiveSupport::OrderedOptions.new
8
- setup_heroicons_outline_config(options)
9
- setup_heroicons_solid_config(options)
10
- setup_heroicons_mini_config(options)
11
- setup_heroicons_micro_config(options)
12
- options
13
- end
14
-
15
- private
16
-
17
- def setup_heroicons_solid_config(options)
18
- options.solid = ActiveSupport::OrderedOptions.new
19
- options.solid.default = default_solid_options
20
- end
21
-
22
- def setup_heroicons_outline_config(options)
23
- options.outline = ActiveSupport::OrderedOptions.new
24
- options.outline.default = default_outline_options
25
- end
26
-
27
- def setup_heroicons_mini_config(options)
28
- options.mini = ActiveSupport::OrderedOptions.new
29
- options.mini.default = default_mini_options
30
- end
31
-
32
- def setup_heroicons_micro_config(options)
33
- options.micro = ActiveSupport::OrderedOptions.new
34
- options.micro.default = default_micro_options
35
- end
36
-
37
- def default_solid_options
38
- options = ActiveSupport::OrderedOptions.new
39
- options.css = "w-6 h-6"
40
- options.data = {}
41
- options
42
- end
43
-
44
- def default_outline_options
45
- options = ActiveSupport::OrderedOptions.new
46
- options.stroke_width = 1.5
47
- options.css = "w-6 h-6"
48
- options.data = {}
49
- options
50
- end
51
-
52
- def default_mini_options
53
- options = ActiveSupport::OrderedOptions.new
54
- options.css = "w-5 h-5"
55
- options.data = {}
56
- options
57
- end
58
-
59
- def default_micro_options
60
- options = ActiveSupport::OrderedOptions.new
61
- options.css = "w-4 h-4"
62
- options.data = {}
63
- options
64
- end
65
- end
66
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RailsIcons
4
- # Defines the configuration options for the Lucide icon pack
5
- class LucideConfig
6
- def config
7
- options = ActiveSupport::OrderedOptions.new
8
- setup_lucide_outlined_config(options)
9
-
10
- options
11
- end
12
-
13
- private
14
-
15
- def setup_lucide_outlined_config(options)
16
- options.outline = ActiveSupport::OrderedOptions.new
17
- options.outline.default = default_outlined_options
18
- end
19
-
20
- def default_outlined_options
21
- options = ActiveSupport::OrderedOptions.new
22
- options.stroke_width = "1.5"
23
- options.css = "w-6 h-6"
24
- options.data = {}
25
- options
26
- end
27
- end
28
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RailsIcons
4
- # Defines the configuration options for the Tabler icon pack
5
- class TablerConfig
6
- def config
7
- options = ActiveSupport::OrderedOptions.new
8
- setup_tabler_filled_config(options)
9
- setup_tabler_outline_config(options)
10
-
11
- options
12
- end
13
-
14
- private
15
-
16
- def setup_tabler_filled_config(options)
17
- options.filled = ActiveSupport::OrderedOptions.new
18
- options.filled.default = default_filled_options
19
- end
20
-
21
- def setup_tabler_outline_config(options)
22
- options.outline = ActiveSupport::OrderedOptions.new
23
- options.outline.default = default_outline_options
24
- end
25
-
26
- def default_filled_options
27
- options = ActiveSupport::OrderedOptions.new
28
- options.css = "w-6 h-6"
29
- options.data = {}
30
- options
31
- end
32
-
33
- def default_outline_options
34
- options = ActiveSupport::OrderedOptions.new
35
- options.stroke_width = 2
36
- options.css = "w-6 h-6"
37
- options.data = {}
38
- options
39
- end
40
- end
41
- end