sliders 0.1.0 → 0.1.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68fe0a1c6326b7c9f44c3d68ac87df690a371cedd006ad9ea63e8928381eb71d
4
- data.tar.gz: 8c6312ebe8667e00e36af23cff3bba3e016003d5d38d369e3fd4f4bb42d3db30
3
+ metadata.gz: 72c267c97b3ff9cc75bdb8d506a220ee2f71089a3047a6e30e2e4cca28e0dcc3
4
+ data.tar.gz: afa4127a42b369bac5116d9b3c850270dba2fcfbb8bd4f8988835bbdac926852
5
5
  SHA512:
6
- metadata.gz: a30d308fabbf05242057bc284e4b107e6f788e47160c45adbd56bddd90d1d4569e56301d48b4931ae1147bf3e43b7f0ffd70dc42b3aa4139d60edf4d03c5c646
7
- data.tar.gz: b7df7a627e6ba3916bc9e9a356ea2037171e6f37acd3d3ad148caefa14841aa1f50b548726cf2596ca97c9a10b358467fb75bd4a8e3c855708ffcec8fad6704b
6
+ metadata.gz: bfd5f6dede68f72d8c66f25988070fe76f8eaa65d14066cc1f760d5200eb409b6f234d4b804233e2269a6de9efa2038fc0d327212d2b957e88a3df00a85c397d
7
+ data.tar.gz: 2367002ca10751824adaeb3ca85fa699e3f6a08146e41bf83cc3667ee1707cd9f8278ca3bc68e39e4de017ba119f53680c58dd464b095465109791ac24e12459
data/README.md CHANGED
@@ -6,6 +6,8 @@ Sliders are mini "app-folders" for grouping related code in your Rails applicati
6
6
  Some times you have bundles of code in your app that is related to some specific feature.
7
7
  Extracting to a gem is not really an option as the feature is tightly integrated with the rest of the application. So how do you get a good structure of files in you application?
8
8
 
9
+ (Yes, I've been inspired by, or envious at, [Hanami](https://github.com/hanami/hanami) and their [slices](https://guides.hanamirb.org/v2.1/app/slices/) for structuring a Hanami application.)
10
+
9
11
  With `sliders` you get a namespace folder that groups all you files.
10
12
 
11
13
  Going from:
@@ -44,6 +46,7 @@ app/
44
46
  └─ important_feature_task.rb
45
47
  ```
46
48
 
49
+ Future plan is to group all your sliders tests in a `test/sliders/my_feature` folder as well.
47
50
 
48
51
  ## Installation
49
52
  Add this line to your application's Gemfile:
@@ -58,18 +61,25 @@ $ bundle
58
61
  ```
59
62
 
60
63
  ## Usage
64
+ Create your slider folder
65
+ ```bash
66
+ $ rails g slider my_feature
67
+ ```
68
+
69
+ This creates the `app/sliders/` folder and a module and folder for your feature.
61
70
 
71
+ Now you can just use regular generators to create thing in `MyFeature` namespace and *sliders* will create the files in your slider folder.
72
+
73
+ The folder *sliders* is not used for namespace, just like the folders in your slider is not used. So a file in `app/sliders/my_feature/models/admin.rb` will be for the constant `MyFeature::Admin`.
62
74
 
63
75
  ## Contributing
64
- Contribution directions go here.
65
-
66
- ### Generators missing
67
- - view
68
- - fixtures
69
- - model (orm)
70
- - jobs
71
- - components
72
- - ...
76
+ PR with fixes or improvements are most welcome.
77
+
78
+ We have tested *sliders* with most of Rails built-in generators, only a few of them have actual test cases.
79
+ PR with tests for more generators are very welcome - also generators for often used gems like eg. ViewComponent or Rspec.
80
+
81
+ **Known bugs**
82
+ - fixtures are generated in *sliders* folder, so they will not work
73
83
 
74
84
  ## License
75
85
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,91 @@
1
+ module SlidersCopyInvoke
2
+ extend ActiveSupport::Concern
3
+
4
+ included do
5
+ class << self
6
+ alias_method :original_invoke, :invoke
7
+ alias_method :original_run_after_generate_callback, :run_after_generate_callback
8
+ end
9
+ end
10
+ end
11
+ Rails::Generators.include SlidersCopyInvoke
12
+
13
+ module SlidersInvoke
14
+ extend ActiveSupport::Concern
15
+
16
+ class_methods do
17
+ def invoke(namespace, args = ARGV, config = {})
18
+ # warn "SLIDERS INVOKE: #{namespace} #{args} #{config}"
19
+ original_invoke(namespace, args, config)
20
+
21
+ names = namespace.to_s.split(":")
22
+ if find_by_namespace(names.pop, names.any? && names.join(":"))
23
+ sliders_cleanup if config[:behavior] == :revoke
24
+ sliders_move if config[:behavior] == :invoke
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def sliders_cleanup
31
+ loop_files(class_variable_get(:@@generated_files)) do |source_file, destination_file|
32
+ File.unlink destination_file
33
+ end
34
+ end
35
+
36
+ def sliders_move
37
+ loop_files(class_variable_get(:@@sliders_generated_files)) do |source_file, destination_file|
38
+ source_file = Rails.root.join(source_file)
39
+ FileUtils.mkdir_p(File.dirname(destination_file))
40
+ FileUtils.mv(source_file, destination_file)
41
+ end
42
+
43
+ class_variable_set(:@@sliders_generated_files, [])
44
+ end
45
+
46
+ def loop_files(source_files)
47
+ source_files.each do |source_file|
48
+ slider = Sliders.sliders.find { |slider| source_file.include? slider }
49
+ next unless slider
50
+
51
+ destination_file = file_in_slider_path(source_file, slider)
52
+ next unless destination_file
53
+
54
+ yield source_file, destination_file
55
+ end
56
+ end
57
+
58
+ def file_in_slider_path(source_file, slider)
59
+ path_parts = source_file.split("/")
60
+ return unless path_parts.include?(slider) || path_parts.include?("#{slider}.rb")
61
+ return unless path_parts.include?("app") || path_parts.include?("test")
62
+
63
+ # add sliders after app or test
64
+ path_parts.insert(path_parts.index("app") + 1, "sliders") if path_parts.include?("app")
65
+ path_parts.insert(path_parts.index("test") + 1, "sliders") if path_parts.include?("test")
66
+
67
+ # move slider namespace up or add if file is named like #{slider}.rb
68
+ if path_parts.include?(slider)
69
+ slider_namespace_index = path_parts.index(slider)
70
+ path_parts[slider_namespace_index], path_parts[slider_namespace_index - 1] = path_parts[slider_namespace_index - 1], path_parts[slider_namespace_index]
71
+ else
72
+ path_parts.insert(path_parts.index("sliders") + 1, slider)
73
+ end
74
+
75
+ Rails.root.join(path_parts.join("/"))
76
+ rescue StandardError => e
77
+ warn "===== Sliders Error ====="
78
+ warn "Error moving file: #{source_file} for slider: #{slider}"
79
+ warn "Error: #{e.message}"
80
+ warn "========================="
81
+ raise
82
+ end
83
+
84
+ def run_after_generate_callback
85
+ class_variable_set(:@@sliders_generated_files, [])
86
+ class_variable_set(:@@sliders_generated_files, class_variable_get(:@@generated_files)) if class_variable_defined?(:@@generated_files)
87
+ original_run_after_generate_callback
88
+ end
89
+ end
90
+ end
91
+ Rails::Generators.prepend SlidersInvoke
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Creates basic slider folder structure
3
+
4
+ Example:
5
+ bin/rails generate slider Thing
6
+
7
+ This will create:
8
+ app/sliders/thing
9
+ test/sliders/thing
@@ -0,0 +1,9 @@
1
+ class SliderGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path("templates", __dir__)
3
+
4
+ def create_slider_file
5
+ template "module.rb", File.join("app/sliders", "#{file_name}.rb")
6
+ create_file File.join("app/sliders", "#{file_name}", ".keep"), ""
7
+ create_file File.join("test/sliders", "#{file_name}", ".keep"), ""
8
+ end
9
+ end
@@ -0,0 +1,2 @@
1
+ module <%= class_name %>
2
+ end
@@ -1,3 +1,3 @@
1
1
  module Sliders
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.3"
3
3
  end
data/lib/sliders.rb CHANGED
@@ -1,9 +1,6 @@
1
1
  require "sliders/version"
2
2
  require "sliders/engine"
3
3
  require "rails/generators"
4
- require "rails_ext/controller_generator"
5
- require "rails_ext/scaffold_controller_generator"
6
- require "rails_ext/helper_generator"
7
4
 
8
5
  module Sliders
9
6
  # Your code goes here...
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sliders
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Træls Ravn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-26 00:00:00.000000000 Z
11
+ date: 2025-06-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -37,10 +37,11 @@ files:
37
37
  - app/assets/config/sliders_manifest.js
38
38
  - app/controllers/concerns/fix_sliders_view_path.rb
39
39
  - config/initializers/autoloader.rb
40
+ - config/initializers/generators.rb
40
41
  - config/routes.rb
41
- - lib/rails_ext/controller_generator.rb
42
- - lib/rails_ext/helper_generator.rb
43
- - lib/rails_ext/scaffold_controller_generator.rb
42
+ - lib/generators/slider/USAGE
43
+ - lib/generators/slider/slider_generator.rb
44
+ - lib/generators/slider/templates/module.rb
44
45
  - lib/sliders.rb
45
46
  - lib/sliders/engine.rb
46
47
  - lib/sliders/version.rb
@@ -1,11 +0,0 @@
1
- require "rails/generators/rails/controller/controller_generator"
2
- module SlidersControllerGenerator
3
- extend ActiveSupport::Concern
4
-
5
- def create_controller_files
6
- return super unless (class_path & Sliders.sliders).any?
7
-
8
- template "controller.rb", File.join("app/sliders/", class_path[0], "controllers", class_path[1..], "#{file_name}_controller.rb")
9
- end
10
- end
11
- Rails::Generators::ControllerGenerator.prepend SlidersControllerGenerator
@@ -1,11 +0,0 @@
1
- require "rails/generators/rails/helper/helper_generator"
2
- module SlidersHelperGenerator
3
- extend ActiveSupport::Concern
4
-
5
- def create_helper_files
6
- return super unless (class_path & Sliders.sliders).any?
7
-
8
- template "helper.rb", File.join("app/sliders/", class_path[0], "helpers", class_path[1..], "#{file_name}_helper.rb")
9
- end
10
- end
11
- Rails::Generators::HelperGenerator.prepend SlidersHelperGenerator
@@ -1,12 +0,0 @@
1
- require "rails/generators/rails/scaffold_controller/scaffold_controller_generator"
2
- module SlidersScaffoldControllerGenerator
3
- extend ActiveSupport::Concern
4
-
5
- def create_controller_files
6
- return super unless (controller_class_path & Sliders.sliders).any?
7
-
8
- template_file = options.api? ? "api_controller.rb" : "controller.rb"
9
- template template_file, File.join("app/sliders/", controller_class_path[0], "controllers", controller_class_path[1..], "#{controller_file_name}_controller.rb")
10
- end
11
- end
12
- Rails::Generators::ScaffoldControllerGenerator.prepend SlidersScaffoldControllerGenerator