micromicro 1.1.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -1
  3. data/CONTRIBUTING.md +3 -3
  4. data/README.md +9 -102
  5. data/lib/micro_micro/collectible.rb +2 -0
  6. data/lib/micro_micro/collections/base_collection.rb +8 -1
  7. data/lib/micro_micro/collections/items_collection.rb +84 -1
  8. data/lib/micro_micro/collections/properties_collection.rb +111 -0
  9. data/lib/micro_micro/collections/relationships_collection.rb +85 -6
  10. data/lib/micro_micro/document.rb +21 -103
  11. data/lib/micro_micro/helpers.rb +94 -0
  12. data/lib/micro_micro/implied_property.rb +15 -0
  13. data/lib/micro_micro/item.rb +93 -79
  14. data/lib/micro_micro/parsers/base_implied_property_parser.rb +29 -0
  15. data/lib/micro_micro/parsers/base_property_parser.rb +6 -12
  16. data/lib/micro_micro/parsers/date_time_parser.rb +61 -25
  17. data/lib/micro_micro/parsers/date_time_property_parser.rb +10 -6
  18. data/lib/micro_micro/parsers/embedded_markup_property_parser.rb +4 -2
  19. data/lib/micro_micro/parsers/implied_name_property_parser.rb +15 -16
  20. data/lib/micro_micro/parsers/implied_photo_property_parser.rb +21 -43
  21. data/lib/micro_micro/parsers/implied_url_property_parser.rb +12 -30
  22. data/lib/micro_micro/parsers/plain_text_property_parser.rb +4 -1
  23. data/lib/micro_micro/parsers/url_property_parser.rb +22 -12
  24. data/lib/micro_micro/parsers/value_class_pattern_parser.rb +29 -42
  25. data/lib/micro_micro/property.rb +126 -56
  26. data/lib/micro_micro/relationship.rb +38 -13
  27. data/lib/micro_micro/version.rb +3 -1
  28. data/lib/micromicro.rb +32 -26
  29. data/micromicro.gemspec +11 -6
  30. metadata +22 -19
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  class Property
5
+ include Collectible
6
+
3
7
  PROPERTY_PARSERS_MAP = {
4
8
  'dt' => Parsers::DateTimePropertyParser,
5
9
  'e' => Parsers::EmbeddedMarkupPropertyParser,
@@ -7,97 +11,163 @@ module MicroMicro
7
11
  'u' => Parsers::UrlPropertyParser
8
12
  }.freeze
9
13
 
10
- include Collectible
14
+ private_constant :PROPERTY_PARSERS_MAP
15
+
16
+ class PropertyNodeSearch
17
+ attr_reader :node_set
18
+
19
+ def initialize(document)
20
+ @node_set = Nokogiri::XML::NodeSet.new(document, [])
21
+ end
22
+
23
+ def search(context)
24
+ context.each { |node| search(node) } if context.is_a?(Nokogiri::XML::NodeSet)
25
+
26
+ if context.is_a?(Nokogiri::XML::Element) && !Helpers.ignore_node?(context)
27
+ node_set << context if Helpers.property_node?(context)
11
28
 
12
- attr_reader :name, :node, :prefix
29
+ search(context.element_children) unless Helpers.item_node?(context)
30
+ end
31
+
32
+ node_set
33
+ end
34
+ end
35
+
36
+ private_constant :PropertyNodeSearch
37
+
38
+ # This {MicroMicro::Property}'s +name+ value.
39
+ #
40
+ # @return [String]
41
+ attr_reader :name
42
+
43
+ # This {MicroMicro::Property}'s node.
44
+ #
45
+ # @return [Nokogiri::XML::Element]
46
+ attr_reader :node
13
47
 
48
+ # This {MicroMicro::Property}'s +prefix+ value.
49
+ #
50
+ # @return [String] One of +dt+, +e+, +p+, or +u+.
51
+ attr_reader :prefix
52
+
53
+ # Extract {MicroMicro::Property}s from a context.
54
+ #
55
+ # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
56
+ # @return [Array<MicroMicro::Property>]
57
+ def self.from_context(context)
58
+ PropertyNodeSearch
59
+ .new(context.document)
60
+ .search(context)
61
+ .flat_map do |node|
62
+ Helpers.property_class_names_from(node).map { |token| new(node, token) }
63
+ end
64
+ end
65
+
66
+ # Parse a node for property data.
67
+ #
14
68
  # @param node [Nokogiri::XML::Element]
15
- # @param name [String]
16
- # @param prefix [String<dt, e, p, u>]
17
- def initialize(node, name:, prefix:)
69
+ # @param token [String] A hyphen-separated token representing a microformats2
70
+ # property value (e.g. +p-name+, +u-url+).
71
+ def initialize(node, token)
18
72
  @node = node
19
- @name = name
20
- @prefix = prefix
73
+ @prefix, @name = token.split(/-/, 2)
21
74
  end
22
75
 
76
+ # Is this {MicroMicro::Property} a datetime property?
77
+ #
78
+ # @return [Boolean]
79
+ def date_time_property?
80
+ prefix == 'dt'
81
+ end
82
+
83
+ # Is this {MicroMicro::Property} an embedded markup property?
84
+ #
85
+ # @return [Boolean]
86
+ def embedded_markup_property?
87
+ prefix == 'e'
88
+ end
89
+
90
+ # Always return +false+ when asked if this {MicroMicro::Property} is an
91
+ # implied property.
92
+ #
93
+ # @see MicroMicro::ImpliedProperty#implied?
94
+ #
23
95
  # @return [Boolean]
24
96
  def implied?
25
97
  false
26
98
  end
27
99
 
28
100
  # @return [String]
101
+ #
102
+ # :nocov:
29
103
  def inspect
30
- format(%(#<#{self.class.name}:%#0x name: #{name.inspect}, prefix: #{prefix.inspect}, value: #{value.inspect}>), object_id)
104
+ "#<#{self.class}:#{format('%#0x', object_id)} " \
105
+ "name: #{name.inspect}, " \
106
+ "prefix: #{prefix.inspect}, " \
107
+ "value: #{value.inspect}>"
31
108
  end
109
+ # :nocov:
32
110
 
111
+ # Parse this {MicroMicro::Property}'s node as a {MicroMicro::Item}, if
112
+ # applicable.
113
+ #
33
114
  # @return [MicroMicro::Item, nil]
34
115
  def item
35
116
  @item ||= Item.new(node) if item_node?
36
117
  end
37
118
 
119
+ # Should this {MicroMicro::Property}'s node be parsed as a
120
+ # {MicroMicro::Item}?
121
+ #
122
+ # @see MicroMicro::Helpers.item_node?
123
+ #
38
124
  # @return [Boolean]
39
125
  def item_node?
40
- @item_node ||= Item.item_node?(node)
126
+ @item_node ||= Helpers.item_node?(node)
41
127
  end
42
128
 
43
- # @return [String, Hash]
44
- def value
45
- @value ||= begin
46
- return parser.value unless item_node?
47
-
48
- hash = item.to_h
49
-
50
- return hash.merge(parser.value) if prefix == 'e'
51
-
52
- p_property = item.properties.find { |property| property.name == 'name' } if prefix == 'p'
53
- u_property = item.properties.find { |property| property.name == 'url' } if prefix == 'u'
54
-
55
- hash.merge(value: (p_property || u_property || parser).value)
56
- end
129
+ # Is this {MicroMicro::Property} a plain text property?
130
+ #
131
+ # @return [Boolean]
132
+ def plain_text_property?
133
+ prefix == 'p'
57
134
  end
58
135
 
136
+ # Is this {MicroMicro::Property} a url property?
137
+ #
59
138
  # @return [Boolean]
60
- def value?
61
- value.present?
139
+ def url_property?
140
+ prefix == 'u'
62
141
  end
63
142
 
64
- # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
65
- # @param node_set [Nokogiri::XML::NodeSet]
66
- # @return [Nokogiri::XML::NodeSet]
67
- def self.nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
68
- context.each { |node| nodes_from(node, node_set) } if context.is_a?(Nokogiri::XML::NodeSet)
143
+ # Return this {MicroMicro::Property}'s parsed value.
144
+ #
145
+ # @return [String, Hash]
146
+ #
147
+ # rubocop:disable Metrics
148
+ def value
149
+ @value ||=
150
+ if item_node?
151
+ hash = item.to_h
69
152
 
70
- if context.is_a?(Nokogiri::XML::Element) && !Document.ignore_node?(context)
71
- node_set << context if property_node?(context)
153
+ return hash.merge(parser.value) if embedded_markup_property?
72
154
 
73
- nodes_from(context.element_children, node_set) unless Item.item_node?(context)
74
- end
155
+ p_property = item.properties.find { |property| property.name == 'name' } if plain_text_property?
156
+ u_property = item.properties.find { |property| property.name == 'url' } if url_property?
75
157
 
76
- node_set
77
- end
78
-
79
- # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
80
- # @return [Array<MicroMicro::Property>]
81
- def self.properties_from(context)
82
- nodes_from(context).map do |node|
83
- types_from(node).map { |prefix, name| new(node, name: name, prefix: prefix) }
84
- end.flatten
158
+ hash.merge(value: (p_property || u_property || parser).value)
159
+ else
160
+ parser.value
161
+ end
85
162
  end
163
+ # rubocop:enable Metrics
86
164
 
87
- # @param node [Nokogiri::XML::Element]
88
- # @return [Boolean]
89
- def self.property_node?(node)
90
- types_from(node).any?
91
- end
92
-
93
- # @param node [Nokogiri::XML::Element]
94
- # @return [Array<Array(String, String)>]
165
+ # Returns +true+ if this {MicroMicro::Property}'s +value+ is anything other
166
+ # than blank or +nil+.
95
167
  #
96
- # @example
97
- # node = Nokogiri::HTML('<a href="https://sixtwothree.org" class="p-name u-url">Jason Garber</a>').at_css('a')
98
- # MicroMicro::Property.types_from(node) #=> [['p', 'name'], ['u', 'url']]
99
- def self.types_from(node)
100
- node.classes.select { |token| token.match?(/^(?:dt|e|p|u)(?:-[0-9a-z]+)?(?:-[a-z]+)+$/) }.map { |token| token.split(/-/, 2) }.uniq
168
+ # @return [Boolean]
169
+ def value?
170
+ value.present?
101
171
  end
102
172
 
103
173
  private
@@ -1,32 +1,60 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  class Relationship
3
5
  include Collectible
4
6
 
7
+ # Extract {MicroMicro::Relationship}s from a context.
8
+ #
9
+ # @param context [Nokogiri::HTML::Document, Nokogiri::XML::Element]
10
+ # @return [Array<MicroMicro::Relationship>]
11
+ def self.from_context(context)
12
+ context.css('[href][rel]:not([rel=""])')
13
+ .reject { |node| Helpers.ignore_nodes?(node.ancestors) }
14
+ .map { |node| new(node) }
15
+ end
16
+
17
+ # Parse a node for relationship data.
18
+ #
5
19
  # @param node [Nokogiri::XML::Element]
20
+ # @return [MicroMicro::Relationship]
6
21
  def initialize(node)
7
22
  @node = node
8
23
  end
9
24
 
25
+ # The value of the node's +href+ attribute.
26
+ #
10
27
  # @return [String]
11
28
  def href
12
29
  @href ||= node['href']
13
30
  end
14
31
 
32
+ # The value of the node's +hreflang+ attribute, if present.
33
+ #
15
34
  # @return [String, nil]
16
35
  def hreflang
17
36
  @hreflang ||= node['hreflang']&.strip
18
37
  end
19
38
 
20
39
  # @return [String]
40
+ #
41
+ # :nocov:
21
42
  def inspect
22
- format(%(#<#{self.class.name}:%#0x href: #{href.inspect}, rels: #{rels.inspect}>), object_id)
43
+ "#<#{self.class}:#{format('%#0x', object_id)} " \
44
+ "href: #{href.inspect}, " \
45
+ "rels: #{rels.inspect}>"
23
46
  end
47
+ # :nocov:
24
48
 
49
+ # The value of the node's +media+ attribute, if present.
50
+ #
25
51
  # @return [String, nil]
26
52
  def media
27
53
  @media ||= node['media']&.strip
28
54
  end
29
55
 
56
+ # Return the parsed {MicroMicro::Relationship} as a Hash.
57
+ #
30
58
  # @return [Hash{Symbol => String}]
31
59
  def to_h
32
60
  {
@@ -40,40 +68,37 @@ module MicroMicro
40
68
  }.select { |_, value| value.present? }
41
69
  end
42
70
 
71
+ # An Array of unique values from node's +rel+ attribute.
72
+ #
43
73
  # @return [Array<String>]
44
74
  def rels
45
75
  @rels ||= node['rel'].split.uniq.sort
46
76
  end
47
77
 
78
+ # The node's text content.
79
+ #
48
80
  # @return [String]
49
81
  def text
50
82
  @text ||= node.text
51
83
  end
52
84
 
85
+ # The value of the node's +title+ attribute, if present.
86
+ #
53
87
  # @return [String, nil]
54
88
  def title
55
89
  @title ||= node['title']&.strip
56
90
  end
57
91
 
92
+ # The value of the node's +type+ attribute, if present.
93
+ #
58
94
  # @return [String, nil]
59
95
  def type
60
96
  @type ||= node['type']&.strip
61
97
  end
62
98
 
63
- # @param context [Nokogiri::HTML::Document, Nokogiri::XML::Element]
64
- # @return [Nokogiri::XML::NodeSet]
65
- def self.nodes_from(context)
66
- context.css('[href][rel]:not([rel=""])').reject { |node| (node.ancestors.map(&:name) & Document.ignored_node_names).any? }
67
- end
68
-
69
- # @param context [Nokogiri::HTML::Document, Nokogiri::XML::Element]
70
- # @return [Array<MicroMicro::Relationship>]
71
- def self.relationships_from(context)
72
- nodes_from(context).map { |node| new(node) }
73
- end
74
-
75
99
  private
76
100
 
101
+ # @return [Nokogiri::XML::Element]
77
102
  attr_reader :node
78
103
  end
79
104
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
- VERSION = '1.1.0'.freeze
4
+ VERSION = '3.0.0'
3
5
  end
data/lib/micromicro.rb CHANGED
@@ -1,48 +1,54 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
- require 'addressable/uri'
4
5
  require 'active_support/core_ext/array/grouping'
5
6
  require 'active_support/core_ext/hash/deep_transform_values'
6
7
  require 'active_support/core_ext/hash/keys'
7
8
  require 'active_support/core_ext/hash/slice'
8
9
  require 'active_support/core_ext/object/blank'
9
10
  require 'nokogiri'
11
+ require 'nokogiri/html-ext'
12
+
13
+ require_relative 'micro_micro/version'
14
+ require_relative 'micro_micro/collectible'
15
+ require_relative 'micro_micro/helpers'
10
16
 
11
- require 'micro_micro/version'
12
- require 'micro_micro/collectible'
17
+ require_relative 'micro_micro/parsers/date_time_parser'
18
+ require_relative 'micro_micro/parsers/value_class_pattern_parser'
13
19
 
14
- require 'micro_micro/parsers/date_time_parser'
15
- require 'micro_micro/parsers/value_class_pattern_parser'
20
+ require_relative 'micro_micro/parsers/base_property_parser'
21
+ require_relative 'micro_micro/parsers/date_time_property_parser'
22
+ require_relative 'micro_micro/parsers/embedded_markup_property_parser'
23
+ require_relative 'micro_micro/parsers/plain_text_property_parser'
24
+ require_relative 'micro_micro/parsers/url_property_parser'
16
25
 
17
- require 'micro_micro/parsers/base_property_parser'
18
- require 'micro_micro/parsers/date_time_property_parser'
19
- require 'micro_micro/parsers/embedded_markup_property_parser'
20
- require 'micro_micro/parsers/implied_name_property_parser'
21
- require 'micro_micro/parsers/implied_photo_property_parser'
22
- require 'micro_micro/parsers/implied_url_property_parser'
23
- require 'micro_micro/parsers/plain_text_property_parser'
24
- require 'micro_micro/parsers/url_property_parser'
26
+ require_relative 'micro_micro/parsers/base_implied_property_parser'
27
+ require_relative 'micro_micro/parsers/implied_name_property_parser'
28
+ require_relative 'micro_micro/parsers/implied_photo_property_parser'
29
+ require_relative 'micro_micro/parsers/implied_url_property_parser'
25
30
 
26
- require 'micro_micro/document'
27
- require 'micro_micro/item'
28
- require 'micro_micro/property'
29
- require 'micro_micro/implied_property'
30
- require 'micro_micro/relationship'
31
+ require_relative 'micro_micro/document'
32
+ require_relative 'micro_micro/item'
33
+ require_relative 'micro_micro/property'
34
+ require_relative 'micro_micro/implied_property'
35
+ require_relative 'micro_micro/relationship'
31
36
 
32
- require 'micro_micro/collections/base_collection'
33
- require 'micro_micro/collections/items_collection'
34
- require 'micro_micro/collections/properties_collection'
35
- require 'micro_micro/collections/relationships_collection'
37
+ require_relative 'micro_micro/collections/base_collection'
38
+ require_relative 'micro_micro/collections/items_collection'
39
+ require_relative 'micro_micro/collections/properties_collection'
40
+ require_relative 'micro_micro/collections/relationships_collection'
36
41
 
37
42
  module MicroMicro
38
43
  # Parse a string of HTML for microformats2-encoded data.
39
- # Convenience method for MicroMicro::Document.new.
40
44
  #
45
+ # Convenience method for {MicroMicro::Document#initialize}.
46
+ #
47
+ # @example
41
48
  # MicroMicro.parse('<a href="/" class="h-card" rel="me">Jason Garber</a>', 'https://sixtwothree.org')
42
49
  #
43
- # @param markup [String] The HTML to parse for microformats2-encoded data.
44
- # @param base_url [String] The URL associated with markup. Used for relative URL resolution.
45
- # @return [MicroMicro::Document]
50
+ # @param (see MicroMicro::Document#initialize)
51
+ # @return (see MicroMicro::Document#initialize)
46
52
  def self.parse(markup, base_url)
47
53
  Document.new(markup, base_url)
48
54
  end
data/micromicro.gemspec CHANGED
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/micro_micro/version'
2
4
 
3
5
  Gem::Specification.new do |spec|
4
- spec.required_ruby_version = Gem::Requirement.new('>= 2.5', '< 4')
6
+ spec.required_ruby_version = '>= 2.7', '< 4'
5
7
 
6
8
  spec.name = 'micromicro'
7
9
  spec.version = MicroMicro::VERSION
@@ -19,10 +21,13 @@ Gem::Specification.new do |spec|
19
21
 
20
22
  spec.require_paths = ['lib']
21
23
 
22
- spec.metadata['bug_tracker_uri'] = "#{spec.homepage}/issues"
23
- spec.metadata['changelog_uri'] = "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md"
24
+ spec.metadata = {
25
+ 'bug_tracker_uri' => "#{spec.homepage}/issues",
26
+ 'changelog_uri' => "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md",
27
+ 'rubygems_mfa_required' => 'true'
28
+ }
24
29
 
25
- spec.add_runtime_dependency 'addressable', '~> 2.7'
26
- spec.add_runtime_dependency 'activesupport', '~> 6.1'
27
- spec.add_runtime_dependency 'nokogiri', '~> 1.11'
30
+ spec.add_runtime_dependency 'activesupport', '~> 7.0'
31
+ spec.add_runtime_dependency 'nokogiri', '>= 1.13'
32
+ spec.add_runtime_dependency 'nokogiri-html-ext', '~> 0.2.2'
28
33
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micromicro
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Garber
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-11 00:00:00.000000000 Z
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: addressable
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.7'
19
+ version: '7.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.7'
26
+ version: '7.0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: activesupport
28
+ name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '6.1'
33
+ version: '1.13'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '6.1'
40
+ version: '1.13'
41
41
  - !ruby/object:Gem::Dependency
42
- name: nokogiri
42
+ name: nokogiri-html-ext
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.11'
47
+ version: 0.2.2
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.11'
54
+ version: 0.2.2
55
55
  description: Extract microformats2-encoded data from HTML documents.
56
56
  email:
57
57
  - jason@sixtwothree.org
@@ -69,8 +69,10 @@ files:
69
69
  - lib/micro_micro/collections/properties_collection.rb
70
70
  - lib/micro_micro/collections/relationships_collection.rb
71
71
  - lib/micro_micro/document.rb
72
+ - lib/micro_micro/helpers.rb
72
73
  - lib/micro_micro/implied_property.rb
73
74
  - lib/micro_micro/item.rb
75
+ - lib/micro_micro/parsers/base_implied_property_parser.rb
74
76
  - lib/micro_micro/parsers/base_property_parser.rb
75
77
  - lib/micro_micro/parsers/date_time_parser.rb
76
78
  - lib/micro_micro/parsers/date_time_property_parser.rb
@@ -91,8 +93,9 @@ licenses:
91
93
  - MIT
92
94
  metadata:
93
95
  bug_tracker_uri: https://github.com/jgarber623/micromicro/issues
94
- changelog_uri: https://github.com/jgarber623/micromicro/blob/v1.1.0/CHANGELOG.md
95
- post_install_message:
96
+ changelog_uri: https://github.com/jgarber623/micromicro/blob/v3.0.0/CHANGELOG.md
97
+ rubygems_mfa_required: 'true'
98
+ post_install_message:
96
99
  rdoc_options: []
97
100
  require_paths:
98
101
  - lib
@@ -100,7 +103,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
100
103
  requirements:
101
104
  - - ">="
102
105
  - !ruby/object:Gem::Version
103
- version: '2.5'
106
+ version: '2.7'
104
107
  - - "<"
105
108
  - !ruby/object:Gem::Version
106
109
  version: '4'
@@ -110,8 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
113
  - !ruby/object:Gem::Version
111
114
  version: '0'
112
115
  requirements: []
113
- rubygems_version: 3.2.16
114
- signing_key:
116
+ rubygems_version: 3.3.16
117
+ signing_key:
115
118
  specification_version: 4
116
119
  summary: Extract microformats2-encoded data from HTML documents.
117
120
  test_files: []