vident 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +48 -0
- data/Gemfile +1 -0
- data/lib/vident/attributes/typed.rb +23 -14
- data/lib/vident/root_component/base.rb +15 -17
- data/lib/vident/root_component/using_better_html.rb +39 -0
- data/lib/vident/root_component/using_phlex_html.rb +3 -0
- data/lib/vident/root_component/using_view_component.rb +19 -13
- data/lib/vident/version.rb +1 -1
- data/lib/vident.rb +1 -0
- metadata +9 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4d88cce5b38bd6e4c19016a7bad835cd25b8e4453284fc5795d039e7b48d145
|
4
|
+
data.tar.gz: f63eca71787e977e9204336b16f8cd32e3fa5c73ee88977ff3befdd8a5f8a33a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3845320ed4eef3e3b3919ef970e93e9ed2c09332ccf14db2224b1d98402b43471e6a543690249fb42a64b52a50f35314f05844f460c702af60c5cc8cf0bc083a
|
7
|
+
data.tar.gz: d167a0e66951777bbde64f657d97e68804ca15bc6890604e0d4015d27a4ee4b17a252574f5e0dcd5cc9f9864929f20bc24ad5689f98e1c853b7cb4da36c293a7
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
# Change Log
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
6
|
+
and this project adheres to [Semantic Versioning](http://semver.org/).
|
7
|
+
|
8
|
+
## [Unreleased]
|
9
|
+
|
10
|
+
### Added
|
11
|
+
|
12
|
+
### Changed
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
|
16
|
+
## [0.6.0] - 2023-02-20
|
17
|
+
|
18
|
+
### Added
|
19
|
+
|
20
|
+
- Experimental support for `better_html` in the root components (the stimulus attributes are generated with `html_attributes`)
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
## [0.5.1] - 2023-02-17
|
25
|
+
|
26
|
+
### Added
|
27
|
+
|
28
|
+
- N/A
|
29
|
+
|
30
|
+
### Changed
|
31
|
+
|
32
|
+
- N/A
|
33
|
+
|
34
|
+
### Fixed
|
35
|
+
|
36
|
+
- Typed attributes was not always using custom coercion methods if they were defined
|
37
|
+
|
38
|
+
### Removed
|
39
|
+
|
40
|
+
- N/A
|
41
|
+
|
42
|
+
### Deprecated
|
43
|
+
|
44
|
+
- N/A
|
45
|
+
|
46
|
+
### Security
|
47
|
+
|
48
|
+
- N/A
|
data/Gemfile
CHANGED
@@ -61,9 +61,11 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
61
61
|
attr_reader :schema, :attribute_ivar_names
|
62
62
|
|
63
63
|
def attribute(name, signature = :any, **options, &converter)
|
64
|
-
|
64
|
+
strict = !options[:convert]
|
65
|
+
signatures = extract_member_type_and_subclass(signature, options)
|
66
|
+
type_info = map_primitive_to_dry_type(signatures, strict, converter)
|
65
67
|
type_info = set_constraints(type_info, options)
|
66
|
-
type_info = set_metadata(type_info,
|
68
|
+
type_info = set_metadata(type_info, signatures, options)
|
67
69
|
define_on_schema(name, type_info, options)
|
68
70
|
end
|
69
71
|
|
@@ -87,8 +89,8 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
87
89
|
type_info
|
88
90
|
end
|
89
91
|
|
90
|
-
def set_metadata(type_info,
|
91
|
-
metadata = {typed_attribute_type:
|
92
|
+
def set_metadata(type_info, signatures, options)
|
93
|
+
metadata = {typed_attribute_type: signatures, typed_attribute_options: options}
|
92
94
|
type_info.meta(**metadata)
|
93
95
|
end
|
94
96
|
|
@@ -100,7 +102,7 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
100
102
|
@attribute_ivar_names ||= {}
|
101
103
|
@attribute_ivar_names[attribute_name] = :"@#{attribute_name}"
|
102
104
|
define_attribute_delegate(attribute_name) if delegates?(options)
|
103
|
-
@schema ||= const_set(
|
105
|
+
@schema ||= const_set(:TypedSchema, Class.new(Vident::Attributes::TypedNilingStruct))
|
104
106
|
@schema.attribute attribute_name, type_info
|
105
107
|
end
|
106
108
|
|
@@ -130,9 +132,7 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
130
132
|
allow_blank.nil? ? true : allow_blank
|
131
133
|
end
|
132
134
|
|
133
|
-
def map_primitive_to_dry_type(
|
134
|
-
strict = !options[:convert]
|
135
|
-
signatures = extract_member_type_and_subclass(signature, options)
|
135
|
+
def map_primitive_to_dry_type(signatures, strict, converter)
|
136
136
|
types = signatures.map do |type, subtype|
|
137
137
|
dry_type = dry_type_from_primary_type(type, strict, converter)
|
138
138
|
if subtype && dry_type.respond_to?(:of)
|
@@ -158,6 +158,19 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
158
158
|
end
|
159
159
|
|
160
160
|
def dry_type_from_primary_type(type, strict, converter)
|
161
|
+
# If a converter is provided, we should use it to coerce the value
|
162
|
+
if converter && !strict && !type.is_a?(Symbol)
|
163
|
+
return Types.Constructor(type) do |value|
|
164
|
+
next value if value.is_a?(type)
|
165
|
+
|
166
|
+
converter.call(value).tap do |new_value|
|
167
|
+
unless new_value.is_a?(type)
|
168
|
+
raise ArgumentError, "Type conversion proc did not convert #{value} to #{type}"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
161
174
|
if type == :any
|
162
175
|
Types::Nominal::Any
|
163
176
|
elsif type == Integer
|
@@ -191,15 +204,11 @@ if Gem.loaded_specs.has_key? "dry-struct"
|
|
191
204
|
# values using the default constructor, `new`.
|
192
205
|
Types.Instance(type)
|
193
206
|
else
|
194
|
-
# dry calls this when initialising the Type. Check if type of input is correct or
|
207
|
+
# dry calls this when initialising the Type. Check if type of input is correct or create new instance
|
195
208
|
Types.Constructor(type) do |value|
|
196
209
|
next value if value.is_a?(type)
|
197
210
|
|
198
|
-
|
199
|
-
converter.call(value)
|
200
|
-
else
|
201
|
-
type.new(**value)
|
202
|
-
end
|
211
|
+
type.new(**value)
|
203
212
|
end
|
204
213
|
end
|
205
214
|
end
|
@@ -68,23 +68,21 @@ module Vident
|
|
68
68
|
|
69
69
|
# Helpers for generating the Stimulus data-* attributes directly
|
70
70
|
|
71
|
-
# Return the HTML `data-controller` attribute
|
72
|
-
def with_controllers
|
73
|
-
"data-controller
|
71
|
+
# Return the HTML `data-controller` attribute for the given controllers
|
72
|
+
def with_controllers(*controllers_to_set)
|
73
|
+
"data-controller=\"#{controller_list(controllers_to_set)}\"".html_safe
|
74
74
|
end
|
75
75
|
|
76
|
-
# Return the HTML `data-target` attribute
|
76
|
+
# Return the HTML `data-target` attribute for the given targets
|
77
77
|
def as_targets(*targets)
|
78
|
-
build_target_data_attributes(parse_targets(targets))
|
79
|
-
|
80
|
-
.join(" ")
|
81
|
-
.html_safe
|
78
|
+
attrs = build_target_data_attributes(parse_targets(targets))
|
79
|
+
attrs.map { |dt, n| "data-#{dt}=\"#{n}\"" }.join(" ").html_safe
|
82
80
|
end
|
83
81
|
alias_method :as_target, :as_targets
|
84
82
|
|
85
|
-
# Return the HTML `data-action` attribute
|
86
|
-
def with_actions(*
|
87
|
-
"data-action='#{parse_actions(
|
83
|
+
# Return the HTML `data-action` attribute for the given actions
|
84
|
+
def with_actions(*actions_to_set)
|
85
|
+
"data-action='#{parse_actions(actions_to_set).join(" ")}'".html_safe
|
88
86
|
end
|
89
87
|
alias_method :with_action, :with_actions
|
90
88
|
|
@@ -101,14 +99,14 @@ module Vident
|
|
101
99
|
end
|
102
100
|
|
103
101
|
# A complete list of Stimulus controllers for this component
|
104
|
-
def controller_list
|
105
|
-
|
102
|
+
def controller_list(controllers_to_set)
|
103
|
+
controllers_to_set&.map { |c| stimulize_path(c) }&.join(" ")
|
106
104
|
end
|
107
105
|
|
108
106
|
# Complete list of actions ready to be use in the data-action attribute
|
109
|
-
def action_list
|
110
|
-
return nil unless
|
111
|
-
parse_actions(
|
107
|
+
def action_list(actions_to_parse)
|
108
|
+
return nil unless actions_to_parse&.size&.positive?
|
109
|
+
parse_actions(actions_to_parse).join(" ")
|
112
110
|
end
|
113
111
|
|
114
112
|
# Complete list of targets ready to be use in the data attributes
|
@@ -124,7 +122,7 @@ module Vident
|
|
124
122
|
|
125
123
|
# stimulus "data-*" attributes map for this component
|
126
124
|
def tag_data_attributes
|
127
|
-
{controller: controller_list, action: action_list}
|
125
|
+
{controller: controller_list(@controllers), action: action_list(@actions)}
|
128
126
|
.merge!(target_list)
|
129
127
|
.merge!(named_classes_list)
|
130
128
|
.merge!(data_map_attributes)
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
if Gem.loaded_specs.has_key? "better_html"
|
4
|
+
require "better_html"
|
5
|
+
require "cgi/util"
|
6
|
+
|
7
|
+
module Vident
|
8
|
+
module RootComponent
|
9
|
+
module UsingBetterHTML
|
10
|
+
# Return the HTML `data-controller` attribute for the given controllers
|
11
|
+
def with_controllers(*controllers_to_set)
|
12
|
+
helpers.html_attributes("data-controller" => controller_list(controllers_to_set)&.html_safe)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Return the HTML `data-target` attribute for the given targets
|
16
|
+
def as_targets(*targets)
|
17
|
+
attrs = build_target_data_attributes(parse_targets(targets))
|
18
|
+
helpers.html_attributes(attrs.transform_keys! { |k| "data-#{k}" })
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return the HTML `data-action` attribute for the given actions
|
22
|
+
def with_actions(*actions_to_set)
|
23
|
+
actions_str = action_list(actions_to_set)
|
24
|
+
actions_str.present? ? helpers.html_attributes("data-action" => actions_str) : nil
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Complete list of actions ready to be use in the data-action attribute
|
30
|
+
def action_list(actions_to_parse)
|
31
|
+
return nil unless actions_to_parse&.size&.positive?
|
32
|
+
# `html_attributes` will escape '->' thus breaking the stimulus action, so we need to do our own escaping
|
33
|
+
actions_str_raw = parse_actions(actions_to_parse).join(" ")
|
34
|
+
CGI.escapeHTML(actions_str_raw).gsub("->", "->").html_safe
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -7,6 +7,9 @@ if Gem.loaded_specs.has_key? "phlex"
|
|
7
7
|
module RootComponent
|
8
8
|
class UsingPhlexHTML < Phlex::HTML
|
9
9
|
include Base
|
10
|
+
if Gem.loaded_specs.has_key? "better_html"
|
11
|
+
include UsingBetterHTML
|
12
|
+
end
|
10
13
|
|
11
14
|
VALID_TAGS = Set[*(Phlex::HTML::VOID_ELEMENTS.keys + Phlex::HTML::STANDARD_ELEMENTS.keys)].freeze
|
12
15
|
|
@@ -7,6 +7,9 @@ if Gem.loaded_specs.has_key? "view_component"
|
|
7
7
|
module RootComponent
|
8
8
|
class UsingViewComponent < ::ViewComponent::Base
|
9
9
|
include Base
|
10
|
+
if Gem.loaded_specs.has_key? "better_html"
|
11
|
+
include UsingBetterHTML
|
12
|
+
end
|
10
13
|
|
11
14
|
SELF_CLOSING_TAGS = Set[:area, :base, :br, :col, :embed, :hr, :img, :input, :link, :meta, :param, :source, :track, :wbr].freeze
|
12
15
|
|
@@ -19,25 +22,28 @@ if Gem.loaded_specs.has_key? "view_component"
|
|
19
22
|
end
|
20
23
|
|
21
24
|
def call
|
22
|
-
# Capture inner block content
|
23
|
-
# It's important that we capture the block content before generating the tag options.
|
24
|
-
# This is because the content could contain calls to `s.data_map`.
|
25
|
-
# These calls add key-value pairs to the internal data_map, which can then be translated into
|
26
|
-
# the correct `data-*` attrs by the tag options.
|
27
|
-
generated = content
|
28
|
-
|
29
25
|
# Generate outer tag options and render
|
30
|
-
tag_type =
|
31
|
-
options =
|
32
|
-
data_attrs = tag_data_attributes
|
33
|
-
options[:data] = options[:data].present? ? data_attrs.merge(options[:data]) : data_attrs
|
34
|
-
options = options.merge(id: @id) if @id
|
26
|
+
tag_type = content_tag_type
|
27
|
+
options = content_tag_options
|
35
28
|
if SELF_CLOSING_TAGS.include?(tag_type)
|
36
29
|
view_context.tag(tag_type, options)
|
37
30
|
else
|
38
|
-
view_context.content_tag(tag_type,
|
31
|
+
view_context.content_tag(tag_type, content, options)
|
39
32
|
end
|
40
33
|
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def content_tag_options
|
38
|
+
options = @html_options&.dup || {}
|
39
|
+
data_attrs = tag_data_attributes
|
40
|
+
options[:data] = options[:data].present? ? data_attrs.merge(options[:data]) : data_attrs
|
41
|
+
options.merge(id: @id) if @id
|
42
|
+
end
|
43
|
+
|
44
|
+
def content_tag_type
|
45
|
+
@element_tag.presence || :div
|
46
|
+
end
|
41
47
|
end
|
42
48
|
end
|
43
49
|
end
|
data/lib/vident/version.rb
CHANGED
data/lib/vident.rb
CHANGED
@@ -26,6 +26,7 @@ end
|
|
26
26
|
|
27
27
|
require_relative "vident/stable_id"
|
28
28
|
require_relative "vident/root_component/base"
|
29
|
+
require_relative "vident/root_component/using_better_html"
|
29
30
|
require_relative "vident/root_component/using_phlex_html"
|
30
31
|
require_relative "vident/root_component/using_view_component"
|
31
32
|
require_relative "vident/base"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vident
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Ierodiaconou
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -31,8 +31,9 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '8'
|
33
33
|
description: Vident makes using Stimulus with your `ViewComponent` or `Phlex` view
|
34
|
-
components as easy as writing Ruby.
|
35
|
-
|
34
|
+
components as easy as writing Ruby. Vident is the base of your design system implementation,
|
35
|
+
which provides helpers for working with Stimulus. For component libraries with ViewComponent
|
36
|
+
or Phlex.
|
36
37
|
email:
|
37
38
|
- stevegeek@gmail.com
|
38
39
|
executables: []
|
@@ -40,6 +41,7 @@ extensions: []
|
|
40
41
|
extra_rdoc_files: []
|
41
42
|
files:
|
42
43
|
- ".standard.yml"
|
44
|
+
- CHANGELOG.md
|
43
45
|
- CODE_OF_CONDUCT.md
|
44
46
|
- Gemfile
|
45
47
|
- LICENSE.txt
|
@@ -57,6 +59,7 @@ files:
|
|
57
59
|
- lib/vident/component.rb
|
58
60
|
- lib/vident/railtie.rb
|
59
61
|
- lib/vident/root_component/base.rb
|
62
|
+
- lib/vident/root_component/using_better_html.rb
|
60
63
|
- lib/vident/root_component/using_phlex_html.rb
|
61
64
|
- lib/vident/root_component/using_view_component.rb
|
62
65
|
- lib/vident/stable_id.rb
|
@@ -90,6 +93,6 @@ requirements: []
|
|
90
93
|
rubygems_version: 3.3.26
|
91
94
|
signing_key:
|
92
95
|
specification_version: 4
|
93
|
-
summary: Vident is
|
94
|
-
|
96
|
+
summary: Vident is the base of your design system implementation, which provides helpers
|
97
|
+
for working with Stimulus. For component libraries with ViewComponent or Phlex.
|
95
98
|
test_files: []
|