micromicro 4.0.0 → 5.0.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: c4ed4ff8b2b7284cd01096982ef345571ffb1de9c10e5943b725976aa6778674
4
- data.tar.gz: 9275bb41d54398977ea98439e76b0adab839ffa38869a2ecbe63468fed0dc376
3
+ metadata.gz: 0da58d9d4ae907a7a85ef964bcf30bb185e12023a6206a31ec41d53c38740fc1
4
+ data.tar.gz: 4672c50b4dc4e5975599bd81feed4a10e5e7ebd25f786ea6d1a1a22c35647528
5
5
  SHA512:
6
- metadata.gz: 0e87a9b3275b7c212e485459a520ea3b7a687550450f42ff5ade89069e1fc610d64e9c918eec27c1a88be8807f14f652351c81150a3028884b37a050db7c0f70
7
- data.tar.gz: 50278fa0b0130004d98b5851dc4530f19c6888028266538bd0d05e43820ff3b3d64af6aadc937e1497cce158a134553c1605857e342cc2511e67450c1314411d
6
+ metadata.gz: 93c205bc429bc5b9bf76add264e131dd8e7fb4bb83fe9960eb94399cebfe52c04ffe71e6859770b216450cb52b0cdf604b8a3dff78745901900e860354cd1a2e
7
+ data.tar.gz: ceee04c5ead6017a402f7c025f813e3d30b9b70c033966b14122f64897199a6e60c1b2dc89a47ed5798884ac2960d24055ed341b2e6bc85f877eb46a388745b4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.0.0 / 2023-12-11
4
+
5
+ - Remove upper version constraint (#79) (86f09d8)
6
+ - Miscellaneous cleanup (#78) (4023177)
7
+ - **Breaking change:** remove `Collectible` module (`next_all` and `prev_all`
8
+ no longer mixed in to various collection classes)
9
+ - reduce reliance on ActiveSupport
10
+ - Address RuboCop Performance warnings (#77) (2d5d0c2)
11
+ - RuboCop formatting fixes (#76) (9ab491e)
12
+ - RuboCop: Single quotes within interpolated string (#75) (37f66c0)
13
+ - RuboCop: `Style/StringLiterals` (#74) (918b58a)
14
+ - Address RuboCop `Style/StringLiterals` warnings' (#73) (3fb3cf4)
15
+ - Add IRB config file (#72) (1ce9fab)
16
+ - Update project files (#71) (85a5dd4)
17
+ - Remove CodeClimate references (#70) (0b86c34)
18
+ - RuboCop: `Style/PerlBackrefs` (a360af0)
19
+ - RuboCop: `Lint/RedundantDirGlobSort` (15c8aca)
20
+ - RuboCop: `Style/RedundantRegexpArgument` (8c93eb7)
21
+ - RuboCop: `Style/RedundantFreeze` (feaee51)
22
+ - **Breaking change:** Set minimum supported Ruby to 3.0 (f39dbef)
23
+ - **Breaking change:** Update development Ruby to v3.0.6 (6869e22)
24
+
3
25
  ## 4.0.0 / 2023-03-14
4
26
 
5
27
  - Parse HTML with `Nokogiri::HTML5::Document.parse` (330a2d1, 0de40d7)
data/README.md CHANGED
@@ -5,14 +5,12 @@
5
5
  [![Gem](https://img.shields.io/gem/v/micromicro.svg?logo=rubygems&style=for-the-badge)](https://rubygems.org/gems/micromicro)
6
6
  [![Downloads](https://img.shields.io/gem/dt/micromicro.svg?logo=rubygems&style=for-the-badge)](https://rubygems.org/gems/micromicro)
7
7
  [![Build](https://img.shields.io/github/actions/workflow/status/jgarber623/micromicro/ci.yml?branch=main&logo=github&style=for-the-badge)](https://github.com/jgarber623/micromicro/actions/workflows/ci.yml)
8
- [![Maintainability](https://img.shields.io/codeclimate/maintainability/jgarber623/micromicro.svg?logo=code-climate&style=for-the-badge)](https://codeclimate.com/github/jgarber623/micromicro)
9
- [![Coverage](https://img.shields.io/codeclimate/c/jgarber623/micromicro.svg?logo=code-climate&style=for-the-badge)](https://codeclimate.com/github/jgarber623/micromicro/code)
10
8
 
11
9
  ## Key Features
12
10
 
13
11
  - Parses microformats2-encoded HTML documents according to the [microformats2 parsing specification](https://microformats.org/wiki/microformats2-parsing)
14
12
  - Passes all microformats2 tests from [the official test suite](https://github.com/microformats/tests)¹
15
- - Supports Ruby 2.7 and newer
13
+ - Supports Ruby 3.0 and newer
16
14
 
17
15
  **Note:** MicroMicro **does not** parse [Classic Microformats](https://microformats.org/wiki/Main_Page#Classic_Microformats) (referred to in [the parsing specification](https://microformats.org/wiki/microformats2-parsing#note_backward_compatibility_details) as "backcompat root classes" and "backcompat properties" and in vocabulary specifications in the "Parser Compatibility" sections [e.g. [h-entry](https://microformats.org/wiki/h-entry#Parser_Compatibility)]). To parse documents marked up with Classic Microformats, consider using [the official microformats-ruby parser](https://github.com/microformats/microformats-ruby).
18
16
 
@@ -20,7 +18,7 @@
20
18
 
21
19
  ## Installation
22
20
 
23
- Before installing and using MicroMicro, you'll want to have [Ruby](https://www.ruby-lang.org) 2.7 (or newer) installed. If you're using [Bundler](https://bundler.io) to manage gem dependencies, add MicroMicro to your project's Gemfile:
21
+ Before installing and using MicroMicro, you'll want to have [Ruby](https://www.ruby-lang.org) 3.0 (or newer) installed. If you're using [Bundler](https://bundler.io) to manage gem dependencies, add MicroMicro to your project's Gemfile:
24
22
 
25
23
  ```ruby
26
24
  gem 'micromicro'
@@ -50,10 +48,6 @@ doc.to_h
50
48
 
51
49
  See [USAGE.md](https://github.com/jgarber623/micromicro/blob/main/USAGE.md) for detailed examples of MicroMicro's features. Additional structured documentation is available on [RubyDoc.info](https://rubydoc.info/gems/micromicro).
52
50
 
53
- ## Contributing
54
-
55
- Interested in helping improve MicroMicro? Awesome! Your help is greatly appreciated. See [CONTRIBUTING.md](https://github.com/jgarber623/micromicro/blob/main/CONTRIBUTING.md) for details.
56
-
57
51
  ## Acknowledgments
58
52
 
59
53
  MicroMicro wouldn't exist without the hard work of everyone involved in the [microformats](https://microformats.org) community. Additionally, the comprehensive [microformats test suite](https://github.com/microformats/tests) was invaluable in the development of this Ruby gem.
@@ -58,7 +58,7 @@ module MicroMicro
58
58
  #
59
59
  # @return [Array<String>]
60
60
  def types
61
- @types ||= flat_map(&:types).uniq.sort
61
+ @types ||= Set[*flat_map(&:types)].to_a.sort
62
62
  end
63
63
 
64
64
  # Recursively search this collection for {MicroMicro::Item}s matching the
@@ -70,10 +70,10 @@ module MicroMicro
70
70
  # either a String or an Array of Strings.
71
71
  #
72
72
  # @example Search using a Hash with a String value
73
- # MicroMicro.parse(markup, url).items.where(types: 'h-card')
73
+ # MicroMicro.parse(markup, url).items.where(types: "h-card")
74
74
  #
75
75
  # @example Search using a Hash with an Array value
76
- # MicroMicro.parse(markup, url).items.where(types: ['h-card', 'h-entry'])
76
+ # MicroMicro.parse(markup, url).items.where(types: ["h-card", "h-entry"])
77
77
  #
78
78
  # When passing a block, each {MicroMicro::Item} in this collection is
79
79
  # yielded to the block and the returned collection will include
@@ -82,7 +82,7 @@ module MicroMicro
82
82
  #
83
83
  # @example Search using a block
84
84
  # MicroMicro.parse(markup, url).items.where do |item|
85
- # item.properties.names.include?('email')
85
+ # item.properties.names.include?("email")
86
86
  # end
87
87
  #
88
88
  # @param args [Hash{Symbol => String, Array<String>}]
@@ -37,7 +37,7 @@ module MicroMicro
37
37
  #
38
38
  # @return [Array<String>]
39
39
  def names
40
- @names ||= map(&:name).uniq.sort
40
+ @names ||= Set[*map(&:name)].to_a.sort
41
41
  end
42
42
 
43
43
  # A collection of plain text {MicroMicro::Property}s parsed from the node.
@@ -91,7 +91,7 @@ module MicroMicro
91
91
  #
92
92
  # @return [Array<String, Hash>]
93
93
  def values
94
- @values ||= map(&:value).uniq
94
+ @values ||= Set[*map(&:value)].to_a
95
95
  end
96
96
 
97
97
  # Search this collection for {MicroMicro::Property}s matching the given
@@ -103,10 +103,10 @@ module MicroMicro
103
103
  # either a String or an Array of Strings.
104
104
  #
105
105
  # @example Search using a Hash with a String value
106
- # MicroMicro.parse(markup, url).properties.where(name: 'url')
106
+ # MicroMicro.parse(markup, url).properties.where(name: "url")
107
107
  #
108
108
  # @example Search using a Hash with an Array value
109
- # MicroMicro.parse(markup, url).properties.where(name: ['name', 'url'])
109
+ # MicroMicro.parse(markup, url).properties.where(name: ["name", "url"])
110
110
  #
111
111
  # When passing a block, each {MicroMicro::Property} in this collection
112
112
  # is yielded to the block and the returned collection will include
@@ -38,9 +38,10 @@ module MicroMicro
38
38
  #
39
39
  # @return [Hash{Symbol => Array<String>}]
40
40
  def group_by_rel
41
- each_with_object(Hash.new { |hash, key| hash[key] = Set.new }) do |member, hash|
42
- member.rels.each { |rel| hash[rel.to_sym] << member.href }
43
- end.transform_values(&:to_a)
41
+ obj = Hash.new { |hash, key| hash[key] = Set.new }
42
+
43
+ each_with_object(obj) { |member, hash| member.rels.each { |rel| hash[rel.to_sym] << member.href } }
44
+ .transform_values(&:to_a)
44
45
  end
45
46
 
46
47
  # Return a Hash of this collection's {MicroMicro::Relationship}s grouped
@@ -61,7 +62,7 @@ module MicroMicro
61
62
  #
62
63
  # @return [Array<String>]
63
64
  def rels
64
- @rels ||= flat_map(&:rels).uniq.sort
65
+ @rels ||= Set[*flat_map(&:rels)].to_a.sort
65
66
  end
66
67
 
67
68
  # Retrieve an Array of this collection's unique {MicroMicro::Relationship}
@@ -71,7 +72,7 @@ module MicroMicro
71
72
  #
72
73
  # @return [Array<String>]
73
74
  def urls
74
- @urls ||= map(&:href).uniq.sort
75
+ @urls ||= Set[*map(&:href)].to_a.sort
75
76
  end
76
77
 
77
78
  # Search this collection for {MicroMicro::Relationship}s matching the
@@ -83,10 +84,10 @@ module MicroMicro
83
84
  # values may be either a String or an Array of Strings.
84
85
  #
85
86
  # @example Search using a Hash with a String value
86
- # MicroMicro.parse(markup, url).relationships.where(rels: 'webmention')
87
+ # MicroMicro.parse(markup, url).relationships.where(rels: "webmention")
87
88
  #
88
89
  # @example Search using a Hash with an Array value
89
- # MicroMicro.parse(markup, url).relationships.where(rels: ['me', 'webmention'])
90
+ # MicroMicro.parse(markup, url).relationships.where(rels: ["me", "webmention"])
90
91
  #
91
92
  # When passing a block, each {MicroMicro::Relationship} in this collection
92
93
  # is yielded to the block and the returned collection will include
@@ -5,10 +5,10 @@ module MicroMicro
5
5
  # Parse a string of HTML for microformats2-encoded data.
6
6
  #
7
7
  # @example Parse a String of markup
8
- # MicroMicro::Document.new('<a href="/" class="h-card" rel="me">Jason Garber</a>', 'https://sixtwothree.org')
8
+ # MicroMicro::Document.new(%(<a href="/" class="h-card" rel="me">Jason Garber</a>), "https://sixtwothree.org")
9
9
  #
10
10
  # @example Parse a String of markup from a URL
11
- # url = 'https://tantek.com'
11
+ # url = "https://tantek.com"
12
12
  # markup = Net::HTTP.get(URI.parse(url))
13
13
  #
14
14
  # doc = MicroMicro::Document.new(markup, url)
@@ -57,7 +57,7 @@ module MicroMicro
57
57
  {
58
58
  items: items.to_a,
59
59
  rels: relationships.group_by_rel,
60
- 'rel-urls': relationships.group_by_url
60
+ "rel-urls": relationships.group_by_url
61
61
  }
62
62
  end
63
63
 
@@ -10,9 +10,9 @@ module MicroMicro
10
10
  # @param attributes_map [Hash{String => Array}]
11
11
  # @return [String, nil]
12
12
  def self.attribute_value_from(node, attributes_map)
13
- attributes_map.filter_map do |attribute, names|
14
- node[attribute] if names.include?(node.name) && node[attribute]
15
- end.first
13
+ attributes_map
14
+ .filter_map { |attribute, names| node[attribute] if names.include?(node.name) && node[attribute] }
15
+ .first
16
16
  end
17
17
 
18
18
  # @param node [Nokogiri::XML::Element]
@@ -54,7 +54,7 @@ module MicroMicro
54
54
  # @param node [Nokogiri::XML::Element]
55
55
  # @return [Array<String>]
56
56
  def self.root_class_names_from(node)
57
- node.classes.grep(/^h(?:-[0-9a-z]+)?(?:-[a-z]+)+$/).uniq.sort
57
+ Set[*node.classes.grep(/^h(?:-[0-9a-z]+)?(?:-[a-z]+)+$/)].to_a.sort
58
58
  end
59
59
 
60
60
  # @see https://microformats.org/wiki/microformats2-parsing#parse_an_element_for_properties
@@ -79,7 +79,7 @@ module MicroMicro
79
79
  # @param node [Nokogiri::XML::Element]
80
80
  # @return [Boolean]
81
81
  def self.value_class_node?(node)
82
- node.classes.include?('value')
82
+ node.classes.include?("value")
83
83
  end
84
84
 
85
85
  # @see https://microformats.org/wiki/value-class-pattern#Parsing_value_from_a_title_attribute
@@ -88,7 +88,7 @@ module MicroMicro
88
88
  # @param node [Nokogiri::XML::Element]
89
89
  # @return [Boolean]
90
90
  def self.value_title_node?(node)
91
- node.classes.include?('value-title')
91
+ node.classes.include?("value-title")
92
92
  end
93
93
  end
94
94
  end
@@ -3,9 +3,9 @@
3
3
  module MicroMicro
4
4
  class ImpliedProperty < Property
5
5
  IMPLIED_PROPERTY_PARSERS_MAP = {
6
- 'name' => Parsers::ImpliedNamePropertyParser,
7
- 'photo' => Parsers::ImpliedPhotoPropertyParser,
8
- 'url' => Parsers::ImpliedUrlPropertyParser
6
+ "name" => Parsers::ImpliedNamePropertyParser,
7
+ "photo" => Parsers::ImpliedPhotoPropertyParser,
8
+ "url" => Parsers::ImpliedUrlPropertyParser
9
9
  }.freeze
10
10
 
11
11
  private_constant :IMPLIED_PROPERTY_PARSERS_MAP
@@ -2,8 +2,6 @@
2
2
 
3
3
  module MicroMicro
4
4
  class Item
5
- include Collectible
6
-
7
5
  class ItemNodeSearch
8
6
  attr_reader :node_set
9
7
 
@@ -30,6 +28,11 @@ module MicroMicro
30
28
 
31
29
  private_constant :ItemNodeSearch
32
30
 
31
+ # The {MicroMicro::ItemsCollection} to which this {MicroMicro::Item} belongs.
32
+ #
33
+ # @return [MicroMicro::PropertiesCollection]
34
+ attr_accessor :collection
35
+
33
36
  # Extract {MicroMicro::Item}s from a context.
34
37
  #
35
38
  # @param context [Nokogiri::HTML5::Document, Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
@@ -74,7 +77,7 @@ module MicroMicro
74
77
  #
75
78
  # @return [String, nil]
76
79
  def id
77
- @id ||= node['id']&.strip
80
+ @id ||= node["id"]&.strip
78
81
  end
79
82
 
80
83
  # Does this {MicroMicro::Item} have an +id+ attribute value?
@@ -140,7 +143,7 @@ module MicroMicro
140
143
 
141
144
  # @return [MicroMicro::ImpliedProperty]
142
145
  def implied_name
143
- @implied_name ||= ImpliedProperty.new(node, 'p-name')
146
+ @implied_name ||= ImpliedProperty.new(node, "p-name")
144
147
  end
145
148
 
146
149
  # @return [Boolean]
@@ -150,7 +153,7 @@ module MicroMicro
150
153
 
151
154
  # @return [MicroMicro::ImpliedProperty]
152
155
  def implied_photo
153
- @implied_photo ||= ImpliedProperty.new(node, 'u-photo')
156
+ @implied_photo ||= ImpliedProperty.new(node, "u-photo")
154
157
  end
155
158
 
156
159
  # @return [Boolean]
@@ -160,7 +163,7 @@ module MicroMicro
160
163
 
161
164
  # @return [MicroMicro::ImpliedProperty]
162
165
  def implied_url
163
- @implied_url ||= ImpliedProperty.new(node, 'u-url')
166
+ @implied_url ||= ImpliedProperty.new(node, "u-url")
164
167
  end
165
168
 
166
169
  # @return [Boolean]
@@ -170,7 +173,7 @@ module MicroMicro
170
173
 
171
174
  # @return [Boolean]
172
175
  def imply_name?
173
- properties.names.none?('name') &&
176
+ properties.names.none?("name") &&
174
177
  properties.none?(&:embedded_markup_property?) &&
175
178
  properties.none?(&:plain_text_property?) &&
176
179
  !nested_items?
@@ -178,14 +181,14 @@ module MicroMicro
178
181
 
179
182
  # @return [Boolean]
180
183
  def imply_photo?
181
- properties.names.none?('photo') &&
184
+ properties.names.none?("photo") &&
182
185
  properties.reject(&:implied?).none?(&:url_property?) &&
183
186
  !nested_items?
184
187
  end
185
188
 
186
189
  # @return [Boolean]
187
190
  def imply_url?
188
- properties.names.none?('url') &&
191
+ properties.names.none?("url") &&
189
192
  properties.reject(&:implied?).none?(&:url_property?) &&
190
193
  !nested_items?
191
194
  end
@@ -14,9 +14,10 @@ module MicroMicro
14
14
  def candidate_node
15
15
  @candidate_node ||=
16
16
  candidate_nodes.find do |node|
17
- self.class::HTML_ELEMENTS_MAP.filter_map do |name, attribute|
18
- node if name == node.name && node[attribute]
19
- end.any?
17
+ self
18
+ .class::HTML_ELEMENTS_MAP
19
+ .filter_map { |name, attribute| node if name == node.name && node[attribute] }
20
+ .any?
20
21
  end
21
22
  end
22
23
 
@@ -18,7 +18,7 @@ module MicroMicro
18
18
  def value
19
19
  @value ||=
20
20
  Helpers.text_content_from(node) do |context|
21
- context.css('img').each { |img| img.content = " #{img['alt'] || img['src']} " }
21
+ context.css("img").each { |img| img.content = " #{img['alt'] || img['src']} " }
22
22
  end
23
23
  end
24
24
 
@@ -24,7 +24,7 @@ module MicroMicro
24
24
  (?:#{DATE_REGEXP_PATTERN})?
25
25
  (?:\s?#{TIME_REGEXP_PATTERN}(?:#{TIMEZONE_REGEXP_PATTERN})?)?
26
26
  \z
27
- /x.freeze
27
+ /x
28
28
 
29
29
  # Parse a string for date and/or time values according to the Microformats
30
30
  # Value Class Pattern date and time parsing specification.
@@ -39,11 +39,7 @@ module MicroMicro
39
39
 
40
40
  # Define getter and predicate methods for all possible named captures
41
41
  # returned by the DATE_TIME_TIMEZONE_REGEXP regular expression.
42
- [
43
- :year, :ordinal, :month, :day,
44
- :hours, :minutes, :seconds,
45
- :abbreviation, :zulu, :offset
46
- ].each do |name|
42
+ %i[year ordinal month day hours minutes seconds abbreviation zulu offset].each do |name|
47
43
  define_method(name) { values[name] }
48
44
  define_method("#{name}?") { public_send(name).present? }
49
45
  end
@@ -62,15 +58,15 @@ module MicroMicro
62
58
  def normalized_hours
63
59
  @normalized_hours ||=
64
60
  if hours?
65
- return (hours.to_i + 12).to_s if abbreviation&.tr('.', '')&.downcase == 'pm'
61
+ return (hours.to_i + 12).to_s if abbreviation&.tr(".", "")&.downcase == "pm"
66
62
 
67
- format('%<hours>02d', hours: hours)
63
+ format("%<hours>02d", hours: hours)
68
64
  end
69
65
  end
70
66
 
71
67
  # @return [String]
72
68
  def normalized_minutes
73
- @normalized_minutes ||= minutes || '00'
69
+ @normalized_minutes ||= minutes || "00"
74
70
  end
75
71
 
76
72
  # @return [String, nil]
@@ -80,12 +76,12 @@ module MicroMicro
80
76
 
81
77
  # @return [String, nil]
82
78
  def normalized_time
83
- @normalized_time ||= [normalized_hours, normalized_minutes, seconds].compact.join(':') if normalized_hours
79
+ @normalized_time ||= [normalized_hours, normalized_minutes, seconds].compact.join(":") if normalized_hours
84
80
  end
85
81
 
86
82
  # @return [String, nil]
87
83
  def normalized_timezone
88
- @normalized_timezone ||= zulu || offset&.tr(':', '')
84
+ @normalized_timezone ||= zulu || offset&.tr(":", "")
89
85
  end
90
86
 
91
87
  # @return [String, nil]
@@ -4,9 +4,9 @@ module MicroMicro
4
4
  module Parsers
5
5
  class DateTimePropertyParser < BasePropertyParser
6
6
  HTML_ATTRIBUTES_MAP = {
7
- 'datetime' => %w[del ins time],
8
- 'title' => %w[abbr],
9
- 'value' => %w[data input]
7
+ "datetime" => %w[del ins time],
8
+ "title" => %w[abbr],
9
+ "value" => %w[data input]
10
10
  }.freeze
11
11
 
12
12
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_a_dt-_property
@@ -25,9 +25,13 @@ module MicroMicro
25
25
  # @return [MicroMicro::Parsers::DateTimeParser, nil]
26
26
  def adopted_date_time_parser
27
27
  @adopted_date_time_parser ||=
28
- (property.prev_all.reverse + property.next_all).filter_map do |prop|
29
- DateTimeParser.new(prop.value) if prop.date_time_property?
30
- end.find(&:normalized_date)
28
+ begin
29
+ head, tail = property.collection.split(property)
30
+
31
+ (head.reverse + tail)
32
+ .filter_map { |prop| DateTimeParser.new(prop.value) if prop.date_time_property? }
33
+ .find(&:normalized_date)
34
+ end
31
35
  end
32
36
 
33
37
  # @return [String, nil]
@@ -37,7 +41,7 @@ module MicroMicro
37
41
 
38
42
  # @return [MicroMicro::Parsers::DateTimeParser]
39
43
  def date_time_parser
40
- @date_time_parser ||= DateTimeParser.new(ValueClassPatternParser.new(node, ' ').value)
44
+ @date_time_parser ||= DateTimeParser.new(ValueClassPatternParser.new(node, " ").value)
41
45
  end
42
46
 
43
47
  # @see https://microformats.org/wiki/value-class-pattern#microformats2_parsers_implied_date
@@ -15,7 +15,7 @@ module MicroMicro
15
15
 
16
16
  # @return [String, nil]
17
17
  def alt
18
- @alt ||= node['alt']&.strip
18
+ @alt ||= node["alt"]&.strip
19
19
  end
20
20
 
21
21
  # @return [Boolean]
@@ -25,7 +25,7 @@ module MicroMicro
25
25
 
26
26
  # @return [Hash{Symbol => String}, nil]
27
27
  def srcset
28
- @srcset ||= image_candidates if node['srcset']
28
+ @srcset ||= image_candidates if node["srcset"]
29
29
  end
30
30
 
31
31
  # @return [Boolean]
@@ -49,20 +49,17 @@ module MicroMicro
49
49
  attr_reader :node
50
50
 
51
51
  # @return [Hash{Symbol => String}]
52
- #
53
- # rubocop:disable Style/PerlBackrefs
54
52
  def image_candidates
55
- node['srcset']
56
- .split(',')
53
+ node["srcset"]
54
+ .split(",")
57
55
  .each_with_object({}) do |candidate, hash|
58
56
  candidate.strip.match(/^(.+?)(\s+.+)?$/) do
59
- key = ($2 || '1x').strip.to_sym
57
+ key = (Regexp.last_match(2) || "1x").strip.to_sym
60
58
 
61
- hash[key] = $1 unless hash[key]
59
+ hash[key] = Regexp.last_match(1) unless hash[key]
62
60
  end
63
61
  end
64
62
  end
65
- # rubocop:enable Style/PerlBackrefs
66
63
  end
67
64
  end
68
65
  end
@@ -4,9 +4,9 @@ module MicroMicro
4
4
  module Parsers
5
5
  class ImpliedNamePropertyParser < BaseImpliedPropertyParser
6
6
  HTML_ELEMENTS_MAP = {
7
- 'img' => 'alt',
8
- 'area' => 'alt',
9
- 'abbr' => 'title'
7
+ "img" => "alt",
8
+ "area" => "alt",
9
+ "abbr" => "title"
10
10
  }.freeze
11
11
 
12
12
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_for_implied_properties
@@ -22,15 +22,15 @@ module MicroMicro
22
22
  # @return [Array]
23
23
  def child_nodes
24
24
  [
25
- node.at_css('> :only-child'),
26
- node.at_css('> :only-child > :only-child')
27
- ].compact.reject { |child_node| Helpers.item_node?(child_node) }
25
+ node.at_css("> :only-child"),
26
+ node.at_css("> :only-child > :only-child")
27
+ ].delete_if { |child_node| child_node.nil? || Helpers.item_node?(child_node) }
28
28
  end
29
29
 
30
30
  # @return [String]
31
31
  def text_content
32
32
  Helpers.text_content_from(node) do |context|
33
- context.css('img').each { |img| img.content = img['alt'] }
33
+ context.css("img").each { |img| img.content = img["alt"] }
34
34
  end
35
35
  end
36
36
  end
@@ -3,11 +3,11 @@
3
3
  module MicroMicro
4
4
  module Parsers
5
5
  class ImpliedPhotoPropertyParser < BaseImpliedPropertyParser
6
- CSS_SELECTORS_ARRAY = ['> img[src]:only-of-type', '> object[data]:only-of-type'].freeze
6
+ CSS_SELECTORS_ARRAY = ["> img[src]:only-of-type", "> object[data]:only-of-type"].freeze
7
7
 
8
8
  HTML_ELEMENTS_MAP = {
9
- 'img' => 'src',
10
- 'object' => 'data'
9
+ "img" => "src",
10
+ "object" => "data"
11
11
  }.freeze
12
12
 
13
13
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_for_implied_properties
@@ -19,7 +19,7 @@ module MicroMicro
19
19
  def value
20
20
  @value ||=
21
21
  if attribute_value
22
- if candidate_node.matches?('img[alt], img[srcset]')
22
+ if candidate_node.matches?("img[alt], img[srcset]")
23
23
  ImageElementParser.new(candidate_node, attribute_value).to_h
24
24
  else
25
25
  attribute_value
@@ -35,7 +35,7 @@ module MicroMicro
35
35
 
36
36
  nodes << node.first_element_child.at_css(*CSS_SELECTORS_ARRAY) if node.element_children.one?
37
37
 
38
- nodes.compact.reject { |child_node| Helpers.item_node?(child_node) }
38
+ nodes.delete_if { |child_node| child_node.nil? || Helpers.item_node?(child_node) }
39
39
  end
40
40
  end
41
41
  end
@@ -3,11 +3,11 @@
3
3
  module MicroMicro
4
4
  module Parsers
5
5
  class ImpliedUrlPropertyParser < BaseImpliedPropertyParser
6
- CSS_SELECTORS_ARRAY = ['> a[href]:only-of-type', '> area[href]:only-of-type'].freeze
6
+ CSS_SELECTORS_ARRAY = ["> a[href]:only-of-type", "> area[href]:only-of-type"].freeze
7
7
 
8
8
  HTML_ELEMENTS_MAP = {
9
- 'a' => 'href',
10
- 'area' => 'href'
9
+ "a" => "href",
10
+ "area" => "href"
11
11
  }.freeze
12
12
 
13
13
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_for_implied_properties
@@ -26,7 +26,7 @@ module MicroMicro
26
26
 
27
27
  nodes << node.first_element_child.at_css(*CSS_SELECTORS_ARRAY) if node.element_children.one?
28
28
 
29
- nodes.compact.reject { |child_node| Helpers.item_node?(child_node) }
29
+ nodes.delete_if { |child_node| child_node.nil? || Helpers.item_node?(child_node) }
30
30
  end
31
31
  end
32
32
  end
@@ -4,9 +4,9 @@ module MicroMicro
4
4
  module Parsers
5
5
  class PlainTextPropertyParser < BasePropertyParser
6
6
  HTML_ATTRIBUTES_MAP = {
7
- 'title' => %w[abbr link],
8
- 'value' => %w[data input],
9
- 'alt' => %w[area img]
7
+ "title" => %w[abbr link],
8
+ "value" => %w[data input],
9
+ "alt" => %w[area img]
10
10
  }.freeze
11
11
 
12
12
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_a_p-_property
@@ -4,15 +4,15 @@ module MicroMicro
4
4
  module Parsers
5
5
  class UrlPropertyParser < BasePropertyParser
6
6
  HTML_ATTRIBUTES_MAP = {
7
- 'href' => %w[a area link],
8
- 'src' => %w[audio iframe img source video],
9
- 'poster' => %w[video],
10
- 'data' => %w[object]
7
+ "href" => %w[a area link],
8
+ "src" => %w[audio iframe img source video],
9
+ "poster" => %w[video],
10
+ "data" => %w[object]
11
11
  }.freeze
12
12
 
13
13
  EXTENDED_HTML_ATTRIBUTES_MAP = {
14
- 'title' => %w[abbr],
15
- 'value' => %w[data input]
14
+ "title" => %w[abbr],
15
+ "value" => %w[data input]
16
16
  }.freeze
17
17
 
18
18
  # @see https://microformats.org/wiki/microformats2-parsing#parsing_a_u-_property
@@ -23,7 +23,7 @@ module MicroMicro
23
23
  # @return [String, Hash{Symbol => String}]
24
24
  def value
25
25
  @value ||=
26
- if node.matches?('img[alt], img[srcset]')
26
+ if node.matches?("img[alt], img[srcset]")
27
27
  ImageElementParser.new(node, resolved_value).to_h
28
28
  else
29
29
  resolved_value
@@ -8,10 +8,10 @@ module MicroMicro
8
8
  # @see https://microformats.org/wiki/value-class-pattern#Date_and_time_values
9
9
  # microformats.org: Value Class Pattern § Date and time values
10
10
  HTML_ATTRIBUTES_MAP = {
11
- 'alt' => %w[area img],
12
- 'value' => %w[data],
13
- 'title' => %w[abbr],
14
- 'datetime' => %w[del ins time]
11
+ "alt" => %w[area img],
12
+ "value" => %w[data],
13
+ "title" => %w[abbr],
14
+ "datetime" => %w[del ins time]
15
15
  }.freeze
16
16
 
17
17
  # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
@@ -34,14 +34,14 @@ module MicroMicro
34
34
  # @param node [Nokogiri::XML::Element]
35
35
  # @return [String, nil]
36
36
  def self.value_from(node)
37
- return node['title'] if Helpers.value_title_node?(node)
37
+ return node["title"] if Helpers.value_title_node?(node)
38
38
 
39
39
  Helpers.attribute_value_from(node, HTML_ATTRIBUTES_MAP) || node.text
40
40
  end
41
41
 
42
42
  # @param node [Nokogiri::XML::Element]
43
43
  # @param separator [String]
44
- def initialize(node, separator = '')
44
+ def initialize(node, separator = "")
45
45
  @node = node
46
46
  @separator = separator
47
47
  end
@@ -54,10 +54,11 @@ module MicroMicro
54
54
  # @return [Array<String>]
55
55
  def values
56
56
  @values ||=
57
- self.class
58
- .node_set_from(node)
59
- .map { |value_node| self.class.value_from(value_node) }
60
- .compact_blank!
57
+ self
58
+ .class
59
+ .node_set_from(node)
60
+ .map { |value_node| self.class.value_from(value_node) }
61
+ .compact_blank!
61
62
  end
62
63
 
63
64
  private
@@ -2,13 +2,11 @@
2
2
 
3
3
  module MicroMicro
4
4
  class Property
5
- include Collectible
6
-
7
5
  PROPERTY_PARSERS_MAP = {
8
- 'dt' => Parsers::DateTimePropertyParser,
9
- 'e' => Parsers::EmbeddedMarkupPropertyParser,
10
- 'p' => Parsers::PlainTextPropertyParser,
11
- 'u' => Parsers::UrlPropertyParser
6
+ "dt" => Parsers::DateTimePropertyParser,
7
+ "e" => Parsers::EmbeddedMarkupPropertyParser,
8
+ "p" => Parsers::PlainTextPropertyParser,
9
+ "u" => Parsers::UrlPropertyParser
12
10
  }.freeze
13
11
 
14
12
  private_constant :PROPERTY_PARSERS_MAP
@@ -35,6 +33,12 @@ module MicroMicro
35
33
 
36
34
  private_constant :PropertyNodeSearch
37
35
 
36
+ # The {MicroMicro::PropertiesCollection} to which this
37
+ # {MicroMicro::Property} belongs.
38
+ #
39
+ # @return [MicroMicro::PropertiesCollection]
40
+ attr_accessor :collection
41
+
38
42
  # This {MicroMicro::Property}'s +name+ value.
39
43
  #
40
44
  # @return [String]
@@ -70,21 +74,21 @@ module MicroMicro
70
74
  # property value (e.g. +p-name+, +u-url+).
71
75
  def initialize(node, token)
72
76
  @node = node
73
- @prefix, @name = token.split(/-/, 2)
77
+ @prefix, @name = token.split("-", 2)
74
78
  end
75
79
 
76
80
  # Is this {MicroMicro::Property} a datetime property?
77
81
  #
78
82
  # @return [Boolean]
79
83
  def date_time_property?
80
- prefix == 'dt'
84
+ prefix == "dt"
81
85
  end
82
86
 
83
87
  # Is this {MicroMicro::Property} an embedded markup property?
84
88
  #
85
89
  # @return [Boolean]
86
90
  def embedded_markup_property?
87
- prefix == 'e'
91
+ prefix == "e"
88
92
  end
89
93
 
90
94
  # Always return +false+ when asked if this {MicroMicro::Property} is an
@@ -130,14 +134,14 @@ module MicroMicro
130
134
  #
131
135
  # @return [Boolean]
132
136
  def plain_text_property?
133
- prefix == 'p'
137
+ prefix == "p"
134
138
  end
135
139
 
136
140
  # Is this {MicroMicro::Property} a url property?
137
141
  #
138
142
  # @return [Boolean]
139
143
  def url_property?
140
- prefix == 'u'
144
+ prefix == "u"
141
145
  end
142
146
 
143
147
  # Return this {MicroMicro::Property}'s parsed value.
@@ -152,8 +156,8 @@ module MicroMicro
152
156
 
153
157
  return hash.merge(parser.value) if embedded_markup_property?
154
158
 
155
- p_property = item.properties.find_by(name: 'name') if plain_text_property?
156
- u_property = item.properties.find_by(name: 'url') if url_property?
159
+ p_property = item.properties.find_by(name: "name") if plain_text_property?
160
+ u_property = item.properties.find_by(name: "url") if url_property?
157
161
 
158
162
  hash.merge(value: (p_property || u_property || parser).value)
159
163
  else
@@ -2,16 +2,20 @@
2
2
 
3
3
  module MicroMicro
4
4
  class Relationship
5
- include Collectible
5
+ # The {MicroMicro::RelationshipsCollection} to which this
6
+ # {MicroMicro::Relationship} belongs.
7
+ #
8
+ # @return [MicroMicro::RelationshipsCollection]
9
+ attr_accessor :collection
6
10
 
7
11
  # Extract {MicroMicro::Relationship}s from a context.
8
12
  #
9
13
  # @param context [Nokogiri::HTML5::Document, Nokogiri::XML::Element]
10
14
  # @return [Array<MicroMicro::Relationship>]
11
15
  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) }
16
+ context
17
+ .css(%([href][rel]:not([rel=""])))
18
+ .filter_map { |node| new(node) unless Helpers.ignore_nodes?(node.ancestors) }
15
19
  end
16
20
 
17
21
  # Parse a node for relationship data.
@@ -26,14 +30,14 @@ module MicroMicro
26
30
  #
27
31
  # @return [String]
28
32
  def href
29
- @href ||= node['href']
33
+ @href ||= node["href"]
30
34
  end
31
35
 
32
36
  # The value of the node's +hreflang+ attribute, if present.
33
37
  #
34
38
  # @return [String, nil]
35
39
  def hreflang
36
- @hreflang ||= node['hreflang']&.strip
40
+ @hreflang ||= node["hreflang"]&.strip
37
41
  end
38
42
 
39
43
  # @return [String]
@@ -50,7 +54,7 @@ module MicroMicro
50
54
  #
51
55
  # @return [String, nil]
52
56
  def media
53
- @media ||= node['media']&.strip
57
+ @media ||= node["media"]&.strip
54
58
  end
55
59
 
56
60
  # Return the parsed {MicroMicro::Relationship} as a Hash.
@@ -72,7 +76,7 @@ module MicroMicro
72
76
  #
73
77
  # @return [Array<String>]
74
78
  def rels
75
- @rels ||= node['rel'].split.uniq.sort
79
+ @rels ||= Set[*node["rel"].split].to_a.sort
76
80
  end
77
81
 
78
82
  # The node's text content.
@@ -86,14 +90,14 @@ module MicroMicro
86
90
  #
87
91
  # @return [String, nil]
88
92
  def title
89
- @title ||= node['title']&.strip
93
+ @title ||= node["title"]&.strip
90
94
  end
91
95
 
92
96
  # The value of the node's +type+ attribute, if present.
93
97
  #
94
98
  # @return [String, nil]
95
99
  def type
96
- @type ||= node['type']&.strip
100
+ @type ||= node["type"]&.strip
97
101
  end
98
102
 
99
103
  private
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MicroMicro
4
- VERSION = '4.0.0'
4
+ VERSION = "5.0.0"
5
5
  end
data/lib/micromicro.rb CHANGED
@@ -1,44 +1,42 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'forwardable'
4
-
5
- require 'active_support/core_ext/array/grouping'
6
- require 'active_support/core_ext/enumerable'
7
- require 'active_support/core_ext/hash/deep_transform_values'
8
- require 'active_support/core_ext/hash/except'
9
- require 'active_support/core_ext/object/blank'
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'
16
-
17
- require_relative 'micro_micro/parsers/date_time_parser'
18
- require_relative 'micro_micro/parsers/image_element_parser'
19
- require_relative 'micro_micro/parsers/value_class_pattern_parser'
20
-
21
- require_relative 'micro_micro/parsers/base_property_parser'
22
- require_relative 'micro_micro/parsers/date_time_property_parser'
23
- require_relative 'micro_micro/parsers/embedded_markup_property_parser'
24
- require_relative 'micro_micro/parsers/plain_text_property_parser'
25
- require_relative 'micro_micro/parsers/url_property_parser'
26
-
27
- require_relative 'micro_micro/parsers/base_implied_property_parser'
28
- require_relative 'micro_micro/parsers/implied_name_property_parser'
29
- require_relative 'micro_micro/parsers/implied_photo_property_parser'
30
- require_relative 'micro_micro/parsers/implied_url_property_parser'
31
-
32
- require_relative 'micro_micro/document'
33
- require_relative 'micro_micro/item'
34
- require_relative 'micro_micro/property'
35
- require_relative 'micro_micro/implied_property'
36
- require_relative 'micro_micro/relationship'
37
-
38
- require_relative 'micro_micro/collections/base_collection'
39
- require_relative 'micro_micro/collections/items_collection'
40
- require_relative 'micro_micro/collections/properties_collection'
41
- require_relative 'micro_micro/collections/relationships_collection'
3
+ require "forwardable"
4
+
5
+ require "active_support/core_ext/array/grouping"
6
+ require "active_support/core_ext/enumerable"
7
+ require "active_support/core_ext/hash/deep_transform_values"
8
+ require "active_support/core_ext/object/blank"
9
+ require "nokogiri"
10
+ require "nokogiri/html-ext"
11
+
12
+ require_relative "micro_micro/version"
13
+ require_relative "micro_micro/helpers"
14
+
15
+ require_relative "micro_micro/parsers/date_time_parser"
16
+ require_relative "micro_micro/parsers/image_element_parser"
17
+ require_relative "micro_micro/parsers/value_class_pattern_parser"
18
+
19
+ require_relative "micro_micro/parsers/base_property_parser"
20
+ require_relative "micro_micro/parsers/date_time_property_parser"
21
+ require_relative "micro_micro/parsers/embedded_markup_property_parser"
22
+ require_relative "micro_micro/parsers/plain_text_property_parser"
23
+ require_relative "micro_micro/parsers/url_property_parser"
24
+
25
+ require_relative "micro_micro/parsers/base_implied_property_parser"
26
+ require_relative "micro_micro/parsers/implied_name_property_parser"
27
+ require_relative "micro_micro/parsers/implied_photo_property_parser"
28
+ require_relative "micro_micro/parsers/implied_url_property_parser"
29
+
30
+ require_relative "micro_micro/document"
31
+ require_relative "micro_micro/item"
32
+ require_relative "micro_micro/property"
33
+ require_relative "micro_micro/implied_property"
34
+ require_relative "micro_micro/relationship"
35
+
36
+ require_relative "micro_micro/collections/base_collection"
37
+ require_relative "micro_micro/collections/items_collection"
38
+ require_relative "micro_micro/collections/properties_collection"
39
+ require_relative "micro_micro/collections/relationships_collection"
42
40
 
43
41
  module MicroMicro
44
42
  # Parse a string of HTML for microformats2-encoded data.
@@ -46,7 +44,7 @@ module MicroMicro
46
44
  # Convenience method for {MicroMicro::Document#initialize}.
47
45
  #
48
46
  # @example
49
- # MicroMicro.parse('<a href="/" class="h-card" rel="me">Jason Garber</a>', 'https://sixtwothree.org')
47
+ # MicroMicro.parse(%(<a href="/" class="h-card" rel="me">Jason Garber</a>), "https://sixtwothree.org")
50
48
  #
51
49
  # @param (see MicroMicro::Document#initialize)
52
50
  # @return (see MicroMicro::Document#initialize)
data/micromicro.gemspec CHANGED
@@ -1,33 +1,33 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/micro_micro/version'
3
+ require_relative "lib/micro_micro/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.required_ruby_version = '>= 2.7', '< 4'
6
+ spec.required_ruby_version = ">= 3.0"
7
7
 
8
- spec.name = 'micromicro'
8
+ spec.name = "micromicro"
9
9
  spec.version = MicroMicro::VERSION
10
- spec.authors = ['Jason Garber']
11
- spec.email = ['jason@sixtwothree.org']
10
+ spec.authors = ["Jason Garber"]
11
+ spec.email = ["jason@sixtwothree.org"]
12
12
 
13
- spec.summary = 'Extract microformats2-encoded data from HTML documents.'
13
+ spec.summary = "Extract microformats2-encoded data from HTML documents."
14
14
  spec.description = spec.summary
15
- spec.homepage = 'https://github.com/jgarber623/micromicro'
16
- spec.license = 'MIT'
15
+ spec.homepage = "https://github.com/jgarber623/micromicro"
16
+ spec.license = "MIT"
17
17
 
18
- spec.files = Dir['lib/**/*'].reject { |f| File.directory?(f) }
19
- spec.files += %w[LICENSE CHANGELOG.md CONTRIBUTING.md README.md]
18
+ spec.files = Dir["lib/**/*"].reject { |f| File.directory?(f) }
19
+ spec.files += %w[LICENSE CHANGELOG.md README.md]
20
20
  spec.files += %w[micromicro.gemspec]
21
21
 
22
- spec.require_paths = ['lib']
22
+ spec.require_paths = ["lib"]
23
23
 
24
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'
25
+ "bug_tracker_uri" => "#{spec.homepage}/issues",
26
+ "changelog_uri" => "#{spec.homepage}/blob/v#{spec.version}/CHANGELOG.md",
27
+ "rubygems_mfa_required" => "true"
28
28
  }
29
29
 
30
- spec.add_runtime_dependency 'activesupport', '~> 7.0'
31
- spec.add_runtime_dependency 'nokogiri', '>= 1.14'
32
- spec.add_runtime_dependency 'nokogiri-html-ext', '~> 0.4.0'
30
+ spec.add_runtime_dependency "activesupport", "~> 7.0"
31
+ spec.add_runtime_dependency "nokogiri", ">= 1.14"
32
+ spec.add_runtime_dependency "nokogiri-html-ext", "~> 0.4.0"
33
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: micromicro
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Garber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-14 00:00:00.000000000 Z
11
+ date: 2023-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -60,10 +60,8 @@ extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
62
  - CHANGELOG.md
63
- - CONTRIBUTING.md
64
63
  - LICENSE
65
64
  - README.md
66
- - lib/micro_micro/collectible.rb
67
65
  - lib/micro_micro/collections/base_collection.rb
68
66
  - lib/micro_micro/collections/items_collection.rb
69
67
  - lib/micro_micro/collections/properties_collection.rb
@@ -94,7 +92,7 @@ licenses:
94
92
  - MIT
95
93
  metadata:
96
94
  bug_tracker_uri: https://github.com/jgarber623/micromicro/issues
97
- changelog_uri: https://github.com/jgarber623/micromicro/blob/v4.0.0/CHANGELOG.md
95
+ changelog_uri: https://github.com/jgarber623/micromicro/blob/v5.0.0/CHANGELOG.md
98
96
  rubygems_mfa_required: 'true'
99
97
  post_install_message:
100
98
  rdoc_options: []
@@ -104,17 +102,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
102
  requirements:
105
103
  - - ">="
106
104
  - !ruby/object:Gem::Version
107
- version: '2.7'
108
- - - "<"
109
- - !ruby/object:Gem::Version
110
- version: '4'
105
+ version: '3.0'
111
106
  required_rubygems_version: !ruby/object:Gem::Requirement
112
107
  requirements:
113
108
  - - ">="
114
109
  - !ruby/object:Gem::Version
115
110
  version: '0'
116
111
  requirements: []
117
- rubygems_version: 3.3.26
112
+ rubygems_version: 3.2.33
118
113
  signing_key:
119
114
  specification_version: 4
120
115
  summary: Extract microformats2-encoded data from HTML documents.
data/CONTRIBUTING.md DELETED
@@ -1,37 +0,0 @@
1
- # Contributing to MicroMicro
2
-
3
- There are a couple ways you can help improve MicroMicro:
4
-
5
- 1. Fix an existing [issue][issues] and submit a [pull request][pulls].
6
- 1. Review open [pull requests][pulls].
7
- 1. Report a new [issue][issues]. _Only do this after you've made sure the behavior or problem you're observing isn't already documented in an open issue._
8
-
9
- ## Getting Started
10
-
11
- MicroMicro is developed using Ruby 2.7.7 and is additionally tested against Ruby 3.0, 3.1, and 3.2 using [GitHub Actions](https://github.com/jgarber623/micromicro/actions).
12
-
13
- Before making changes to MicroMicro, you'll want to install Ruby 2.7.7. It's recommended that you use a Ruby version managment tool like [rbenv](https://github.com/rbenv/rbenv), [chruby](https://github.com/postmodern/chruby), or [rvm](https://github.com/rvm/rvm). Once you've installed Ruby 2.7.7 using your method of choice, install the project's gems by running:
14
-
15
- ```sh
16
- bundle install
17
- ```
18
-
19
- ## Making Changes
20
-
21
- 1. Fork and clone the project's repo.
22
- 1. Install development dependencies as outlined above.
23
- 1. Create a feature branch for the code changes you're looking to make: `git checkout -b my-new-feature`.
24
- 1. _Write some code!_
25
- 1. If your changes would benefit from testing, add the necessary tests and verify everything passes by running `bundle exec rspec`.
26
- 1. Commit your changes: `git commit -am 'Add some new feature or fix some issue'`. _(See [this excellent article](https://chris.beams.io/posts/git-commit/) for tips on writing useful Git commit messages.)_
27
- 1. Push the branch to your fork: `git push -u origin my-new-feature`.
28
- 1. Create a new [pull request][pulls] and we'll review your changes.
29
-
30
- ## Code Style
31
-
32
- Code formatting conventions are defined in the `.editorconfig` file which uses the [EditorConfig](http://editorconfig.org) syntax. There are [plugins for a variety of editors](http://editorconfig.org/#download) that utilize the settings in the `.editorconfig` file. We recommended you install the EditorConfig plugin for your editor of choice.
33
-
34
- Your bug fix or feature addition won't be rejected if it runs afoul of any (or all) of these guidelines, but following the guidelines will definitely make everyone's lives a little easier.
35
-
36
- [issues]: https://github.com/jgarber623/micromicro/issues
37
- [pulls]: https://github.com/jgarber623/micromicro/pulls
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module MicroMicro
4
- module Collectible
5
- attr_accessor :collection
6
-
7
- def next_all
8
- collection.split(self).last
9
- end
10
-
11
- def prev_all
12
- collection.split(self).first
13
- end
14
- end
15
- end