stimulus_tag_helper 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6abf8489a80e3128ea3a0d0a81b935e5b1b2303e0e911af50069ddaad5d84d8
4
- data.tar.gz: 45e22a4a2b76553502ffdf0cca5b49b24f59c3e6f8139f57052b159a0e3a45b0
3
+ metadata.gz: a65ec6e3ca5fbdb0773a81dd380c4ca366e3de6dc30f5e00d45c8d7371c03a25
4
+ data.tar.gz: d0593dc01c202aa3de8364b7e48eb97d6cb27a8cd5b1435442756fa7e46683ce
5
5
  SHA512:
6
- metadata.gz: 72427f49698c21330c73061f040fdd1c4eb7a630dd41b15555dc703234771dd614a00d9ade29258d88d4ffc74b33fa4f23c88d24230d62dc2daaa7770440f58e
7
- data.tar.gz: 06c29df33bf224027b006d059ef0631693d7be19a92dddba137a004c774ebb8a91c2408d90a5f5061ba1130f2b700109b2997de8c2d9fe80077d2811332396c7
6
+ metadata.gz: 5e15a8b9cbc3f422577d967807f7b22fe1c4f9d9c6b947f26bc0ac678a422e0088b4c584e25bf2c2959ad97e7d549cf235b8c8e54c58a2baf5f445cfd0d7d88b
7
+ data.tar.gz: b2837afeee0dac24ad6abe6ff12cebae2c3ba1510bb126f447eaf30383317148d42ddeba86ab707dc6823e0fccf40417547d2cdf6cb054fb5a0083752d6721a4
data/README.md CHANGED
@@ -1,19 +1,29 @@
1
1
  # stimulus_tag_helper
2
2
 
3
- [![Rubocop](https://github.com/crawler/stimulus_tag_helper/workflows/Rubocop/badge.svg)](https://github.com/crawler/stimulus_tag_helper/actions)
4
-
3
+ [![Rubocop](https://github.com/crawler/stimulus_tag_helper/actions/workflows/rubocop.yml/badge.svg)](https://github.com/crawler/stimulus_tag_helper/actions/workflows/rubocop.yml)
4
+ [![Tests](https://github.com/crawler/stimulus_tag_helper/actions/workflows/test.yml/badge.svg)](https://github.com/crawler/stimulus_tag_helper/actions/workflows/test.yml)
5
+ [![Ruby Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/testdouble/standard)
5
6
  [![Gem](https://img.shields.io/gem/v/stimulus_tag_helper.svg)](https://rubygems.org/gems/stimulus_tag_helper)
6
7
 
7
- ## WARING!
8
+ ## ~~WARING!~~
9
+
10
+ ~~This gem is in the proof of concept stage. I made it for myself, and it is not yet covered with tests and documentation.~~
8
11
 
9
- This gem is in the proof of concept stage. I made it for myself, and it is not yet covered with tests and the documentation.
12
+ 🎉 After around a year from initial publication, the helper is pretty useful and simple enough to be stable and compatible with different Ruby/Rails versions. So I decided to cover it with tests and add fancy badges.
13
+
14
+ If Russia has not dropped a nuclear bomb on Kyiv then the repo is still maintained by me.
10
15
 
11
16
  ## Description
12
17
 
13
- The stimulusjs is a great js framework for the HTML that you already have, but once u start using it the HTML becomes pretty big as you need to extend it with the attributes that your required to tight it with controllers. So I made this modest (even more modest than the stimulus itself) helper. Currently, I use it with the Slim(http://slim-lang.com/). So for now examples will be in it.
18
+ The stimulusjs is a great js framework for the HTML that you already have, but once you start using it the HTML became wordier, as you need to extend it with more attributes that you already have. So I made this even more modest than the stimulus helper.
19
+
20
+ Sometimes it makes the template cleaner, sometimes it is not. It's up to you when to use it.
21
+
22
+ Helper matches Stimulus 2.0+ requirements. You can mix attributes of multiple controllers in a single element or the tag helper. In the end, the stimulus helpers return is a simple Hash.
14
23
 
15
24
  ---
16
25
 
26
+ - [Compatibility](#compatibility)
17
27
  - [Quick start](#quick-start)
18
28
  - [Examples](#examples)
19
29
  - [Support](#support)
@@ -21,13 +31,17 @@ The stimulusjs is a great js framework for the HTML that you already have, but o
21
31
  - [Code of conduct](#code-of-conduct)
22
32
  - [Contribution guide](#contribution-guide)
23
33
 
34
+ ## Compatibility
35
+
36
+ **Ruby:** 3.1, 3.0, 2.7; **Rails:** edge, 7.0, 6.1, 6.0
37
+
24
38
  ## Quick start
25
39
 
26
40
  ```ruby
27
- gem 'stimulus_tag_helper', github: 'crawler/stimulus_tag_helper'
41
+ gem `stimulus_tag_helper`
28
42
  ```
29
43
 
30
- ### In the rails Controller
44
+ ### In the Rails Controller
31
45
 
32
46
  ```ruby
33
47
  helper StimulusTagHelper
@@ -41,10 +55,9 @@ include StimulusTagHelper
41
55
 
42
56
  ## Examples
43
57
 
44
- Some examples is taken from the real app so may be not very)
45
-
46
- ### "Hello, Stimulus" controller from the stimulusjs homepage
58
+ ### The controller from the stimulusjs homepage
47
59
 
60
+ **Slim Lang:**
48
61
  ```slim
49
62
  = stimulus_controller("hello", tag: "div") do |sc|
50
63
  = text_field_tag('', '', **sc.target("name"))
@@ -52,9 +65,7 @@ Some examples is taken from the real app so may be not very)
52
65
  span[*sc.target("output")]
53
66
  ```
54
67
 
55
- Please note that to support nesting, and the stimulus 2.0 attributes notation, the actions and the targets will be prefixed with controller name
56
-
57
- So example above will became:
68
+ **Output:**
58
69
 
59
70
  ```html
60
71
  <div data-controller="hello">
@@ -64,29 +75,30 @@ So example above will became:
64
75
  </div>
65
76
  ```
66
77
 
78
+ *To support nesting, and the stimulus 2.0 attributes notation, the actions, and the targets are prefixed with the controller name*
79
+
67
80
 
68
- ## "Slideshow" define controller without tag rendering
81
+ ### Initialize the builder and use the controller attribute later
69
82
 
70
- (buttons messed up for the demonstation purposes)
83
+ **Slim Lang**
71
84
 
72
85
  ```slim
73
86
  = stimulus_controller("slideshow") do |sc|
74
87
  div[*sc.controller_attribute]
75
88
  = button_tag ' ← ', type: 'button', **sc.action("previous")
76
- button[*sc.action("next")]
77
- ' →
89
+ = button_tag ' → ', type: 'button', **sc.action("next")
78
90
  div[*sc.target("slide")] 🐵
79
91
  div[*sc.target("slide")] 🙈
80
92
  div[*sc.target("slide")] 🙉
81
93
  div[*sc.target("slide")] 🙊
82
94
  ```
83
95
 
84
- Became:
96
+ **Output:**
85
97
 
86
98
  ```html
87
99
  <div data-controller="slideshow">
88
100
  <button name="button" type="button" data-action="slideshow#previous"> ← </button>
89
- <button data-action="slideshow#next"> → </button>
101
+ <button name="button" type="button" data-action="slideshow#next"> → </button>
90
102
  <div data-slideshow-target="slide">🐵</div>
91
103
  <div data-slideshow-target="slide">🙈</div>
92
104
  <div data-slideshow-target="slide">🙉</div>
@@ -94,39 +106,45 @@ Became:
94
106
  </div>
95
107
  ```
96
108
 
97
- ### Nested controllers
109
+ ### Nested controllers example
98
110
 
99
- ```slim
100
- = stimulus_controller( \
101
- "flash", tag: "div", class: "flash flash_global", values: { "page-cached" => page_will_be_cached?, src: flash_path },
102
- actions: %w[flash-message:connect->registerMessage flash-message:disconnect->removeMessage] \
103
- ) do |fc|
104
- - unless page_will_be_cached?
105
- - flash.keys.each do |type|
106
- .flash__message
107
- = stimulus_controller( \
108
- "flash-message",
109
- tag: "div", class: "flash-message flash-message_type_#{type}",
110
- actions: %w[animationend->next click->hide] \
111
- ) do |fmc|
112
- .flash-message__text = flash[type]
113
- button.flash-message__dismiss-button[aria-label="Close flash message" *fmc.action("dismiss")]
114
- = svg_sprite "icons/common.svg#common-times", class: "icon"
111
+ **Plain Ruby:**
115
112
 
113
+ ```ruby
114
+ stimulus_controller(:effects) do |ec|
115
+ stimulus_controller(
116
+ :clipboard, tag: :div, **ec.controller_property.merge(ec.action_property("clipboard:copy->flash"))
117
+ ) do |cc|
118
+ safe_join([
119
+ "PIN: ",
120
+ tag.input(**cc.attributes(target: "source"), type: "text", value: "1234", readonly: true),
121
+ tag.button(**cc.action("copy")) { "Copy to Clipboard" }
122
+ ])
123
+ end
124
+ end
116
125
  ```
117
126
 
127
+ **Output:**
128
+
129
+ ```html
130
+ <div data-controller="clipboard effects" data-action="clipboard:copy->effects#flash">
131
+ PIN: <input data-clipboard-target="source" type="text" value="1234" readonly="readonly">
132
+ <button data-action="clipboard#copy">Copy to Clipboard</button>
133
+ </div>
134
+ ```
118
135
 
119
136
  ## Support
120
137
 
121
- If you want to report a bug, or have ideas, feedback or questions about the gem, [let me know via GitHub issues](https://github.com/crawler/stimulus_tag_helper/issues/new) and I will do my best to provide a helpful answer. Happy hacking!
138
+ If you want to report a bug or have ideas, feedback, or questions about the gem, [let me know via GitHub issues](https://github.com/crawler/stimulus_tag_helper/issues/new) and I will do my best to provide a helpful answer. Happy hacking!
122
139
 
123
140
  ## License
124
141
 
125
- The gem is available as open source under the terms of the [MIT License](LICENSE.txt).
142
+ The gem is available as open-source under the terms of the [MIT License](LICENSE.txt).
126
143
 
127
144
  ## Code of conduct
128
145
 
129
- Everyone interacting in this project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](CODE_OF_CONDUCT.md).
146
+ Everyone interacting in this project’s codebases, issue trackers, chat rooms, and mailing lists is expected to follow
147
+ the [code of conduct](CODE_OF_CONDUCT.md).
130
148
 
131
149
  ## Contribution guide
132
150
 
@@ -3,19 +3,30 @@
3
3
  module StimulusTagHelper
4
4
  class StimulusAction
5
5
  STANDARD_PARSER =
6
- /^(?<void>(?<event>.+?)(?<void>@(?<target>window|document))?->)?(?<identifier>.+?)(?<void>#(?<method>[^:]+?))(?<void>:(?<options>.+))?$/.freeze
6
+ /^(?<void>(?<event>.+?)(?<void>@(?<target>window|document))?->)?(?<identifier>.+?)(?<void>#(?<method>[^:]+?))(?<void>:(?<options>.+))?$/
7
7
  NO_CONTROLLER_PARSER =
8
- /^(?<void>(?<event>.+?)?(?<void>@(?<target>window|document))?->)?(?<method>[^#:]+?)(?<void>:(?<options>.+))?$/.freeze
9
- class_attribute :parts, default: %i[identifier method event target options]
10
- attr_reader(*parts)
8
+ /^(?<void>(?<event>.+?)?(?<void>@(?<target>window|document))?->)?(?<method>[^#:]+?)(?<void>:(?<options>.+))?$/
9
+ PARTS = %i[identifier method event target options]
11
10
 
12
- # event is nil to let stimulusjs decide default event for the element
11
+ # event is nil to let stimulus.js decide default event for the element
13
12
  def initialize(identifier:, method:, event: nil, target: nil, options: nil)
14
- parts.each do |part|
13
+ PARTS.each do |part|
15
14
  instance_variable_set(:"@#{part}", binding.local_variable_get(part))
16
15
  end
17
16
  end
18
17
 
18
+ def to_s
19
+ "#{event_part.presence&.+("->")}#{handler_part}"
20
+ end
21
+
22
+ def ==(other)
23
+ other.is_a?(StimulusAction) && other.to_s == to_s
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader(*PARTS) # define attr readers for each part
29
+
19
30
  def event_part
20
31
  "#{event}#{"@#{target}" if target}"
21
32
  end
@@ -24,16 +35,15 @@ module StimulusTagHelper
24
35
  "#{identifier}##{method}#{":#{options}" if options}"
25
36
  end
26
37
 
27
- def to_s
28
- "#{event_part.presence&.+'->'}#{handler_part}".html_safe
29
- end
38
+ class << self
39
+ def parse(string, **defaults)
40
+ to_parse = string.to_s
41
+ parsed =
42
+ to_parse.include?("#") ? STANDARD_PARSER.match(to_parse) : NO_CONTROLLER_PARSER.match(to_parse)
43
+ raise(ArgumentError, "Can't parse stimulus action #{string.inspect}") unless parsed
30
44
 
31
- def self.parse(str)
32
- parsed =
33
- str.include?("#") ? STANDARD_PARSER.match(str) : NO_CONTROLLER_PARSER.match(str)
34
- raise(ArgumentError, "can't parse action string #{str}") unless parsed
35
-
36
- parsed.named_captures.except("void").symbolize_keys
45
+ new(**defaults.merge(parsed.named_captures.except("void").transform_keys(&:to_sym)))
46
+ end
37
47
  end
38
48
  end
39
49
  end
@@ -18,14 +18,14 @@ module StimulusTagHelper
18
18
 
19
19
  alias #{name} #{name}_#{attribute} # alias value value_attribute
20
20
 
21
- def #{name}_#{property}(*args, **kws) # def value_property(*args, **kws)
22
- @template.stimulus_#{name}_#{property}(*args.unshift(@identifier), **kws) # stimulus_value_property(@identifier, *args, **kws)
23
- end # end
21
+ def #{name}_#{property}(*args, **kwargs) # def value_property(*args, **kwargs)
22
+ @template.stimulus_#{name}_#{property}(*args.unshift(@identifier), **kwargs) # stimulus_value_property(@identifier, *args, **kwargs)
23
+ end # end
24
24
  RUBY
25
25
  end
26
26
 
27
- def attributes(props)
28
- { data: @template.stimulus_properties(@identifier, props) }
27
+ def attributes(**attributes)
28
+ @template.stimulus_attributes(@identifier, **attributes)
29
29
  end
30
30
  end
31
31
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusTagHelper
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -1,20 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module StimulusTagHelper
4
- autoload :VERSION, "stimulus_tag_helper/version"
5
- autoload :StimulusAction, "stimulus_tag_helper/stimulus_action"
6
- autoload :StimulusControllerBuilder, "stimulus_tag_helper/stimulus_controller_builder"
3
+ require "active_support/all"
4
+ require "zeitwerk"
5
+ Zeitwerk::Loader.for_gem.setup
7
6
 
7
+ module StimulusTagHelper
8
8
  def self.base_properties
9
- %i[controller values classes targets target actions]
9
+ %i[controller values classes targets target actions].freeze
10
+ end
11
+
12
+ def self.aliases
13
+ {controller: :controllers, value: :values, class: :classes, target: :targets, action: :actions}.freeze
10
14
  end
11
15
 
12
- def self.aliases_map
13
- { values: :value, classes: :class, actions: :action }
16
+ def self.methods_map
17
+ {controllers: :stimulus_controllers_property, values: :stimulus_values_properties,
18
+ classes: :stimulus_classes_properties, targets: :stimulus_targets_properties, actions: :stimulus_actions_property}.freeze
14
19
  end
15
20
 
16
21
  def self.alias_properties
17
- @alias_properties ||= aliases_map.values
22
+ @alias_properties ||= aliases.keys
18
23
  end
19
24
 
20
25
  def self.property_names
@@ -22,11 +27,11 @@ module StimulusTagHelper
22
27
  end
23
28
 
24
29
  def self.prevent_duplicates(properties_set, name)
25
- alias_name = StimulusTagHelper.aliases_map[name]
30
+ alias_name = StimulusTagHelper.aliases[name]
26
31
  return unless alias_name && (properties_set[alias_name])
27
32
 
28
33
  raise(ArgumentError, <<~STRING)
29
- "#{name} and #{alias_name} can't be passed at same time"
34
+ "#{name} and #{alias_name} should not be passed at the same time"
30
35
  STRING
31
36
  end
32
37
 
@@ -42,33 +47,60 @@ module StimulusTagHelper
42
47
  end
43
48
  end
44
49
 
45
- def stimulus_controller_tag(identifier, tag:, data: {}, **args, &block)
46
- data.merge!(stimulus_controllers_property(identifier))
47
- # class option goes to the tag
48
- data.merge!(stimulus_properties(identifier, args.extract!(*StimulusTagHelper.property_names - %i[class])))
50
+ # controller arg is used to add additional stimulus controllers to the element
51
+ def stimulus_controller_tag(identifier, tag:, data: {}, controller: nil, **args, &block)
52
+ # class class interpreted as class attribute, not a stimulus class
53
+ # what about value and action action? maybe here should be warning
54
+
55
+ # maybe data should be merged in args?
56
+ data.merge!(stimulus_properties(
57
+ identifier,
58
+ controller: data[:controller] || controller, # nil is allowed, because the args will be prepended by the identifier
59
+ **args.extract!(*StimulusTagHelper.property_names - %i[class])
60
+ ))
49
61
  tag_builder.tag_string(tag, **args.merge(data: data), &block)
50
62
  end
51
63
 
52
- def stimulus_properties(identifier, props)
64
+ # Does not includes the controller attribute
65
+ def stimulus_attributes(...)
66
+ {data: stimulus_properties(...)}
67
+ end
68
+
69
+ alias_method :stimulus_attribute, :stimulus_attributes
70
+
71
+ # Does not includes the controller property
72
+ def stimulus_properties(identifier, **props)
53
73
  {}.tap do |data|
54
74
  StimulusTagHelper.property_names.each do |name|
55
- next unless props[name]
75
+ next unless props.key?(name)
56
76
 
57
- params = Array.wrap(props[name]).unshift(identifier)
58
- kwparams = params.last.is_a?(Hash) ? params.pop : {}
77
+ args = Array.wrap(props[name]).unshift(identifier)
78
+ kwargs = args.last.is_a?(Hash) ? args.pop : {}
59
79
  StimulusTagHelper.prevent_duplicates(props, name)
60
- name = name.to_s
61
- property = name.pluralize == name ? "properties" : "property"
62
- data.merge!(public_send("stimulus_#{name}_#{property}", *params, **kwparams))
80
+ data.merge!(
81
+ public_send(StimulusTagHelper.methods_map[StimulusTagHelper.aliases[name] || name], *args, **kwargs)
82
+ )
63
83
  end
64
84
  end
65
85
  end
66
86
 
87
+ def stimulus_controllers_attribute(...)
88
+ {data: stimulus_controllers_properties(...)}
89
+ end
90
+
91
+ alias_method :stimulus_controller_attribute, :stimulus_controllers_attribute
92
+
67
93
  def stimulus_controllers_property(*identifiers)
68
- { controller: Array.wrap(identifiers).join(" ") }
94
+ {controller: Array.wrap(identifiers).compact.join(" ")}
69
95
  end
70
96
 
71
- alias stimulus_controller_property stimulus_controllers_property
97
+ alias_method :stimulus_controller_property, :stimulus_controllers_property
98
+
99
+ def stimulus_values_attributes(...)
100
+ {data: stimulus_values_properties(...)}
101
+ end
102
+
103
+ alias_method :stimulus_value_attribute, :stimulus_values_attributes
72
104
 
73
105
  def stimulus_values_properties(identifier, **values)
74
106
  {}.tap do |properties|
@@ -78,7 +110,13 @@ module StimulusTagHelper
78
110
  end
79
111
  end
80
112
 
81
- alias stimulus_value_property stimulus_values_properties
113
+ alias_method :stimulus_value_property, :stimulus_values_properties
114
+
115
+ def stimulus_classes_attributes(...)
116
+ {data: stimulus_classes_properties(...)}
117
+ end
118
+
119
+ alias_method :stimulus_class_attribute, :stimulus_classes_attributes
82
120
 
83
121
  def stimulus_classes_properties(identifier, **classes)
84
122
  {}.tap do |properties|
@@ -88,47 +126,33 @@ module StimulusTagHelper
88
126
  end
89
127
  end
90
128
 
91
- alias stimulus_class_property stimulus_classes_properties
129
+ alias_method :stimulus_class_property, :stimulus_classes_properties
92
130
 
93
- def stimulus_targets_properties(identifier, *targets)
94
- {}.tap do |properties|
95
- targets.each do |target|
96
- properties.merge!(stimulus_target_property(identifier, target))
97
- end
98
- end
131
+ def stimulus_targets_attributes(...)
132
+ {data: stimulus_targets_properties(...)}
99
133
  end
100
134
 
101
- def stimulus_target_property(identifier, name)
102
- { "#{identifier}-target" => name }
135
+ alias_method :stimulus_target_attribute, :stimulus_targets_attributes
136
+
137
+ def stimulus_targets_properties(identifier, *targets)
138
+ {"#{identifier}-target" => targets.join(" ")}
103
139
  end
104
140
 
105
- def stimulus_actions_properties(identifier, *actions_params)
141
+ alias_method :stimulus_target_property, :stimulus_targets_properties
142
+
143
+ def stimulus_actions_property(identifier, *actions_params)
106
144
  {
107
- "action" => actions_params.map { |action_params| stimulus_action_value(identifier, action_params) }.join(" ")
145
+ action: actions_params.map { |action_params| stimulus_action_value(identifier, action_params) }.join(" ").html_safe
108
146
  }
109
147
  end
110
148
 
111
- alias stimulus_action_property stimulus_actions_properties
112
-
113
- def stimulus_action_value(identifier, action_params_or_action_str)
114
- if action_params_or_action_str.is_a?(String)
115
- action_params_or_action_str = StimulusAction.parse(action_params_or_action_str)
116
- end
149
+ alias_method :stimulus_action_property, :stimulus_actions_property
117
150
 
118
- StimulusAction.new(identifier: identifier, **action_params_or_action_str).to_s
119
- end
120
-
121
- property_names.each do |name|
122
- name = name.to_s
123
- attribute, property = name.pluralize == name ? %w[attributes properties] : %w[attribute property]
124
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
125
- def stimulus_#{name}_#{attribute}(...) # def stimulus_value_attribute(...)
126
- { data: stimulus_#{name}_#{property}(...) } # { data: stimulus_value_property(...) }
127
- end # end
128
- RUBY
129
- end
151
+ def stimulus_action_value(identifier, args_or_string) # :nodoc:
152
+ return StimulusAction.parse(args_or_string, identifier: identifier) if args_or_string.is_a?(String)
130
153
 
131
- def stimulus_attribute(...)
132
- { data: stimulus_properties(...) }
154
+ # WARNING: this is unsafe for public use by unexpired developers.
155
+ # TODO: find a elegant way to escape -> splitter escaping &gt; back and forth.
156
+ StimulusAction.new(identifier: identifier, **args_or_string).to_s.html_safe
133
157
  end
134
158
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimulus_tag_helper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Topchii
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-23 00:00:00.000000000 Z
11
+ date: 2022-07-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 6.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 6.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 6.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: zeitwerk
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 2.5.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 2.5.0
27
55
  description:
28
56
  email:
29
57
  - player1@infinitevoid.net
@@ -60,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
88
  - !ruby/object:Gem::Version
61
89
  version: '0'
62
90
  requirements: []
63
- rubygems_version: 3.2.15
91
+ rubygems_version: 3.3.7
64
92
  signing_key:
65
93
  specification_version: 4
66
94
  summary: A form_for like, compact and elegant way to define stimulus attributes in