micromicro 1.1.0 → 3.0.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.
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: []