html-attributes-utils 0.9.0 → 0.9.2a1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +39 -1
  3. data/lib/html_attributes_utils.rb +26 -34
  4. metadata +18 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a383443446570cb37c2c67e608c4bcde35ecf1b255eca392cbcc263d5a36ae76
4
- data.tar.gz: 2b81b3e7929301ee349b330dae54131b79f93afe417db7e57b934cc4c8a96615
3
+ metadata.gz: 631ae9c1de4c05565e53583b4d4ad4b11919fb8b4ee65bd0fe8e751ce1cb71cd
4
+ data.tar.gz: 59f130f0f247944cb2c3d72f7a76ebc55bd21f4fb1ce373e8fa0cd99e2b034b1
5
5
  SHA512:
6
- metadata.gz: 9c2568b9c1a67be8cad3df9ccd4eb5f11a9e612c27da3438acddc2587eaaee2d12138adf9397aeb43bb0d05e57b3fa3735df9caf0437a8cb6d53b8eddc937e59
7
- data.tar.gz: ce81b1c86dcbf9e464a9268d02e595a60ee6eb30ba5fd0e5fa829a5f8ed233bee252da1a06716ba9ff0a06a565a70010d71d372acc42796e7c104c6ab222d98f
6
+ metadata.gz: 7419b9e2b423592a8ed9d2c062ba251229833e129d62eb3c4749140e530dd62dbade2e19bdadcbaea0bf5a8d9cef72a7524c23af9db7260f4108920fd13bca27
7
+ data.tar.gz: cf98c264969fb7b22db802c1020f69d8d1659a9dd701bf1768611c4ad0ae134c4e12c18dafbd3e8ad52bc283cad7f1cc0d2fe3fb476cca96d41a34eff96f5c87
data/README.md CHANGED
@@ -1,3 +1,41 @@
1
1
  # HTML Attributes Utilities
2
2
 
3
- This is a small library intended to make it easier to deal with hashes of attributes.
3
+ This is a small library intended to make it easier to deal with HTML
4
+ attributes. It was written to reduce overlap in the
5
+ [govuk-components](https://github.com/DFE-Digital/govuk-components) and
6
+ [govuk-formbuilder](https://github.com/DFE-Digital/govuk-formbuilder) libraries.
7
+
8
+ It provides refinements for `Hash` that allow:
9
+
10
+ * deep merging while protecting default values from being overwritten
11
+ * tidying hashes by removing key/value pairs that have empty or nil values
12
+
13
+ ## Example use
14
+
15
+ ```ruby
16
+ require "html_attributes_utils"
17
+
18
+ def MyPresenter
19
+ using HTMLAttributesUtils
20
+
21
+ def initialize(custom_attributes = {})
22
+ @custom_attributes = custom_attributes
23
+ end
24
+
25
+ def attributes
26
+ default_attributes
27
+ .deep_merge_html_attributes(@custom_attributes)
28
+ .deep_tidy_html_attributes
29
+ end
30
+
31
+ private
32
+
33
+ def default_attributes
34
+ { lang: "en-GB", class: "govuk-juggling-widget" }
35
+ end
36
+ end
37
+
38
+ MyPresenter.new(lang: "fr", class: "stripes", some_other_attr: "").attributes
39
+
40
+ => { lang: "fr", class: ["govuk-juggling-widget", "stripes"] }
41
+ ```
@@ -1,6 +1,23 @@
1
1
  require "active_support/core_ext/hash/keys"
2
2
 
3
3
  module HTMLAttributesUtils
4
+ # DEFAULT_MERGEABLE_ATTRIBUTES is a list of HTML attributes where the value
5
+ # contain multiple elements separated by spaces. We use it to target values
6
+ # to split so the arrays can be cleanly merged.
7
+ #
8
+ # They are stored as nested arrays so when we're walking multiple
9
+ # levels on the deep merge the structure can be identified. This means
10
+ # the library works with the Rails-preferred format of
11
+ # `aria: { describedby: "xyz" }` rather than `aria-describdby: `xyz`
12
+ DEFAULT_MERGEABLE_ATTRIBUTES = [
13
+ %i(class),
14
+ %i(aria controls),
15
+ %i(aria describedby),
16
+ %i(aria flowto),
17
+ %i(aria labelledby),
18
+ %i(aria owns),
19
+ ].freeze
20
+
4
21
  refine Hash do
5
22
  # Merge the incoming hash into the current one in a way that suits
6
23
  # HTML attributes.
@@ -21,18 +38,19 @@ module HTMLAttributesUtils
21
38
  #
22
39
  # => { class: "blue", data: { size: "medium", controller: "reply" } }
23
40
  #
24
- def deep_merge_html_attributes(custom, parents = [], mergeable_attributes: default_mergeable_attributes)
41
+ def deep_merge_html_attributes(custom, parents = [], mergeable_attributes: DEFAULT_MERGEABLE_ATTRIBUTES)
25
42
  return custom unless custom.is_a?(Hash)
26
43
 
27
44
  overrides = custom.deep_symbolize_keys
45
+ originals = deep_symbolize_keys
28
46
 
29
- deep_symbolize_keys.each_with_object(deep_symbolize_keys) { |(key, value), merged|
47
+ originals.each_with_object(originals) { |(key, value), merged|
30
48
  next unless overrides.key?(key)
31
49
 
32
50
  merged[key] = combine_values(
33
51
  value,
34
52
  overrides[key],
35
- parents: parents << key,
53
+ parents: [*parents, *key],
36
54
  mergeable_attributes: mergeable_attributes
37
55
  )
38
56
 
@@ -53,9 +71,7 @@ module HTMLAttributesUtils
53
71
  # => { class: "blue" }
54
72
  #
55
73
  def deep_tidy_html_attributes
56
- each_with_object({}) do |(key, value), tidy|
57
- (tidy[key] = tidy_value(value)) unless skippable_value?(value)
58
- end
74
+ each_with_object({}) { |(k, v), tidied| (tidied[k] = tidy_value(v)) unless v.nil? }.compact
59
75
  end
60
76
 
61
77
  private
@@ -65,27 +81,14 @@ module HTMLAttributesUtils
65
81
  when Hash
66
82
  value.deep_tidy_html_attributes.presence
67
83
  when Array
68
- value.reject(&:blank?).presence
69
- when String
70
- value.strip.presence
71
- else
84
+ (value.empty?) ? nil : value.map { |v| tidy_value(v) }.compact
85
+ when TrueClass, FalseClass
72
86
  value
87
+ else
88
+ value.to_s.strip.presence
73
89
  end
74
90
  end
75
91
 
76
- # Identiy attribute values we don't care about.
77
- #
78
- # We can't check for this using Rails' `#presence` because we want `false` to be
79
- # included so some HTML attributes that default to on can be disabled, like
80
- # `autocomplete: false`
81
- #
82
- # FIXME: there is probably a nicer way of doing this...
83
- def skippable_value?(value)
84
- return false if [true, false].include?(value)
85
-
86
- value.blank?
87
- end
88
-
89
92
  def combine_values(value, override, **kwargs)
90
93
  case split_attribute_list(value, **kwargs)
91
94
  when Array
@@ -117,16 +120,5 @@ module HTMLAttributesUtils
117
120
 
118
121
  value
119
122
  end
120
-
121
- def default_mergeable_attributes
122
- [
123
- %i(class),
124
- %i(aria controls),
125
- %i(aria describedby),
126
- %i(aria flowto),
127
- %i(aria labelledby),
128
- %i(aria owns),
129
- ]
130
- end
131
123
  end
132
124
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: html-attributes-utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.9.2a1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-23 00:00:00.000000000 Z
11
+ date: 2022-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 4.3.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.20'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.20'
69
83
  description: A small collection of utilities to ease working with hashes of HTML attributes
70
84
  email:
71
85
  - peter.yates@graphia.co.uk
@@ -97,9 +111,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
111
  version: '0'
98
112
  required_rubygems_version: !ruby/object:Gem::Requirement
99
113
  requirements:
100
- - - ">="
114
+ - - ">"
101
115
  - !ruby/object:Gem::Version
102
- version: '0'
116
+ version: 1.3.1
103
117
  requirements: []
104
118
  rubygems_version: 3.3.7
105
119
  signing_key: