micromicro 1.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -0
  3. data/CONTRIBUTING.md +2 -2
  4. data/README.md +21 -20
  5. data/lib/micro_micro/collectible.rb +2 -0
  6. data/lib/micro_micro/collections/base_collection.rb +7 -1
  7. data/lib/micro_micro/collections/items_collection.rb +3 -1
  8. data/lib/micro_micro/collections/properties_collection.rb +12 -0
  9. data/lib/micro_micro/collections/relationships_collection.rb +11 -10
  10. data/lib/micro_micro/document.rb +11 -99
  11. data/lib/micro_micro/helpers.rb +88 -0
  12. data/lib/micro_micro/implied_property.rb +2 -0
  13. data/lib/micro_micro/item.rb +57 -62
  14. data/lib/micro_micro/parsers/base_implied_property_parser.rb +29 -0
  15. data/lib/micro_micro/parsers/base_property_parser.rb +6 -14
  16. data/lib/micro_micro/parsers/date_time_parser.rb +60 -25
  17. data/lib/micro_micro/parsers/date_time_property_parser.rb +10 -9
  18. data/lib/micro_micro/parsers/embedded_markup_property_parser.rb +4 -3
  19. data/lib/micro_micro/parsers/implied_name_property_parser.rb +15 -17
  20. data/lib/micro_micro/parsers/implied_photo_property_parser.rb +21 -45
  21. data/lib/micro_micro/parsers/implied_url_property_parser.rb +12 -31
  22. data/lib/micro_micro/parsers/plain_text_property_parser.rb +4 -2
  23. data/lib/micro_micro/parsers/url_property_parser.rb +22 -14
  24. data/lib/micro_micro/parsers/value_class_pattern_parser.rb +29 -44
  25. data/lib/micro_micro/property.rb +68 -56
  26. data/lib/micro_micro/relationship.rb +15 -13
  27. data/lib/micro_micro/version.rb +3 -1
  28. data/lib/micromicro.rb +31 -26
  29. data/micromicro.gemspec +14 -9
  30. metadata +23 -32
  31. data/.editorconfig +0 -14
  32. data/.gitignore +0 -34
  33. data/.gitmodules +0 -3
  34. data/.reek.yml +0 -8
  35. data/.rspec +0 -2
  36. data/.rubocop +0 -3
  37. data/.rubocop.yml +0 -25
  38. data/.ruby-version +0 -1
  39. data/.simplecov +0 -13
  40. data/.travis.yml +0 -19
  41. data/Gemfile +0 -14
  42. data/Rakefile +0 -18
@@ -1,50 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  module Parsers
3
- class ImpliedUrlPropertyParser < BasePropertyParser
5
+ class ImpliedUrlPropertyParser < BaseImpliedPropertyParser
6
+ CSS_SELECTORS_ARRAY = ['> a[href]:only-of-type', '> area[href]:only-of-type'].freeze
7
+
4
8
  HTML_ELEMENTS_MAP = {
5
9
  'a' => 'href',
6
10
  'area' => 'href'
7
11
  }.freeze
8
12
 
9
- # @see http://microformats.org/wiki/microformats2-parsing#parsing_for_implied_properties
13
+ # @see https://microformats.org/wiki/microformats2-parsing#parsing_for_implied_properties
10
14
  #
11
15
  # @return [String, nil]
12
16
  def value
13
- @value ||= value_node[HTML_ELEMENTS_MAP[value_node.name]] if value_node
17
+ @value ||= attribute_value
14
18
  end
15
19
 
16
20
  private
17
21
 
18
- # @return [Array<String>]
19
- def attribute_values
20
- @attribute_values ||= begin
21
- HTML_ELEMENTS_MAP.map do |element, attribute|
22
- node if node.matches?("#{element}[#{attribute}]")
23
- end.compact
24
- end
25
- end
26
-
27
- # @return [Nokogiri::XML::Element, nil]
28
- def value_node
29
- @value_node ||= begin
30
- return attribute_values.first if attribute_values.any?
31
-
32
- HTML_ELEMENTS_MAP.each do |element, attribute|
33
- child_node = node.at_css("> #{element}[#{attribute}]:only-of-type")
34
-
35
- return child_node if child_node && !Item.item_node?(child_node) && element == child_node.name && child_node[attribute]
36
- end
37
-
38
- if node.element_children.one? && !Item.item_node?(node.first_element_child)
39
- HTML_ELEMENTS_MAP.each do |element, attribute|
40
- child_node = node.first_element_child.at_css("> #{element}[#{attribute}]:only-of-type")
22
+ # @return [Array]
23
+ def child_nodes
24
+ nodes = [node.at_css(*CSS_SELECTORS_ARRAY)]
41
25
 
42
- return child_node if child_node && !Item.item_node?(child_node) && element == child_node.name && child_node[attribute]
43
- end
44
- end
26
+ nodes << node.first_element_child.at_css(*CSS_SELECTORS_ARRAY) if node.element_children.one?
45
27
 
46
- nil
47
- end
28
+ nodes.compact.reject { |child_node| Helpers.item_node?(child_node) }
48
29
  end
49
30
  end
50
31
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  module Parsers
3
5
  class PlainTextPropertyParser < BasePropertyParser
@@ -7,7 +9,7 @@ module MicroMicro
7
9
  'alt' => %w[area img]
8
10
  }.freeze
9
11
 
10
- # @see http://microformats.org/wiki/microformats2-parsing#parsing_a_p-_property
12
+ # @see https://microformats.org/wiki/microformats2-parsing#parsing_a_p-_property
11
13
  #
12
14
  # @return [String]
13
15
  def value
@@ -18,7 +20,7 @@ module MicroMicro
18
20
 
19
21
  # @return [String, nil]
20
22
  def attribute_value
21
- self.class.attribute_value_from(node, HTML_ATTRIBUTES_MAP)
23
+ Helpers.attribute_value_from(node, HTML_ATTRIBUTES_MAP)
22
24
  end
23
25
 
24
26
  # @return [String, nil]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  module Parsers
3
5
  class UrlPropertyParser < BasePropertyParser
@@ -13,41 +15,47 @@ module MicroMicro
13
15
  'value' => %w[data input]
14
16
  }.freeze
15
17
 
16
- # @see http://microformats.org/wiki/microformats2-parsing#parsing_a_u-_property
17
- # @see http://microformats.org/wiki/microformats2-parsing#parse_an_img_element_for_src_and_alt
18
+ # @see https://microformats.org/wiki/microformats2-parsing#parsing_a_u-_property
19
+ # @see https://microformats.org/wiki/microformats2-parsing#parse_an_img_element_for_src_and_alt
18
20
  #
19
21
  # @return [String, Hash{Symbol => String}]
20
22
  def value
21
- @value ||= begin
22
- return resolved_value unless node.matches?('img[alt]')
23
-
24
- {
25
- value: resolved_value,
26
- alt: node['alt'].strip
27
- }
28
- end
23
+ @value ||=
24
+ if node.matches?('img[alt]')
25
+ {
26
+ value: resolved_value,
27
+ alt: node['alt'].strip
28
+ }
29
+ else
30
+ resolved_value
31
+ end
29
32
  end
30
33
 
31
34
  private
32
35
 
33
36
  # @return [String, nil]
34
37
  def attribute_value
35
- self.class.attribute_value_from(node, HTML_ATTRIBUTES_MAP)
38
+ Helpers.attribute_value_from(node, HTML_ATTRIBUTES_MAP)
36
39
  end
37
40
 
38
41
  # @return [String, nil]
39
42
  def extended_attribute_value
40
- self.class.attribute_value_from(node, EXTENDED_HTML_ATTRIBUTES_MAP)
43
+ Helpers.attribute_value_from(node, EXTENDED_HTML_ATTRIBUTES_MAP)
41
44
  end
42
45
 
43
46
  # @return [String]
44
47
  def resolved_value
45
- @resolved_value ||= Absolutely.to_abs(base: node.document.url, relative: unresolved_value.strip)
48
+ @resolved_value ||= node.document.resolve_relative_url(unresolved_value.strip)
49
+ end
50
+
51
+ # @return [String]
52
+ def text_content
53
+ Helpers.text_content_from(node)
46
54
  end
47
55
 
48
56
  # @return [String]
49
57
  def unresolved_value
50
- attribute_value || value_class_pattern_value || extended_attribute_value || Document.text_content_from(node)
58
+ attribute_value || value_class_pattern_value || extended_attribute_value || text_content
51
59
  end
52
60
 
53
61
  # @return [String, nil]
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  module Parsers
3
5
  class ValueClassPatternParser
4
- # @see http://microformats.org/wiki/value-class-pattern#Basic_Parsing
5
- # @see http://microformats.org/wiki/value-class-pattern#Date_and_time_values
6
+ # @see https://microformats.org/wiki/value-class-pattern#Basic_Parsing
7
+ # @see https://microformats.org/wiki/value-class-pattern#Date_and_time_values
6
8
  HTML_ATTRIBUTES_MAP = {
7
9
  'alt' => %w[area img],
8
10
  'value' => %w[data],
@@ -10,72 +12,55 @@ module MicroMicro
10
12
  'datetime' => %w[del ins time]
11
13
  }.freeze
12
14
 
13
- # @param context [Nokogiri::XML::Element]
14
- # @param separator [String]
15
- def initialize(node, separator = '')
16
- @node = node
17
- @separator = separator
18
- end
19
-
20
- # @return [String, nil]
21
- def value
22
- @value ||= values.join(separator).strip if values.any?
23
- end
24
-
25
- # @return [Array<String>]
26
- def values
27
- @values ||= value_nodes.map { |value_node| self.class.value_from(value_node) }.select(&:present?)
28
- end
29
-
30
15
  # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
31
16
  # @param node_set [Nokogiri::XML::NodeSet]
32
17
  # @return [Nokogiri::XML::NodeSet]
33
- def self.nodes_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
34
- context.each { |node| nodes_from(node, node_set) } if context.is_a?(Nokogiri::XML::NodeSet)
18
+ def self.node_set_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
19
+ context.each { |node| node_set_from(node, node_set) } if context.is_a?(Nokogiri::XML::NodeSet)
35
20
 
36
- if context.is_a?(Nokogiri::XML::Element) && !Document.ignore_node?(context)
37
- if value_class_node?(context) || value_title_node?(context)
21
+ if context.is_a?(Nokogiri::XML::Element) && !Helpers.ignore_node?(context)
22
+ if Helpers.value_class_node?(context) || Helpers.value_title_node?(context)
38
23
  node_set << context
39
24
  else
40
- nodes_from(context.element_children, node_set)
25
+ node_set_from(context.element_children, node_set)
41
26
  end
42
27
  end
43
28
 
44
29
  node_set
45
30
  end
46
31
 
47
- # @param node [Nokogiri::XML::Element]
48
- # @return [Boolean]
49
- def self.value_class_node?(node)
50
- node.classes.include?('value')
51
- end
52
-
53
32
  # @param node [Nokogiri::XML::Element]
54
33
  # @return [String, nil]
55
34
  def self.value_from(node)
56
- return node['title'] if value_title_node?(node)
35
+ return node['title'] if Helpers.value_title_node?(node)
57
36
 
58
- HTML_ATTRIBUTES_MAP.each do |attribute, names|
59
- return node[attribute] if names.include?(node.name) && node[attribute]
60
- end
37
+ Helpers.attribute_value_from(node, HTML_ATTRIBUTES_MAP) || node.text
38
+ end
61
39
 
62
- node.text
40
+ # @param context [Nokogiri::XML::Element]
41
+ # @param separator [String]
42
+ def initialize(node, separator = '')
43
+ @node = node
44
+ @separator = separator
63
45
  end
64
46
 
65
- # @param node [Nokogiri::XML::Element]
66
- # @return [Boolean]
67
- def self.value_title_node?(node)
68
- node.classes.include?('value-title')
47
+ # @return [String, nil]
48
+ def value
49
+ @value ||= values.join(separator).strip if values.any?
50
+ end
51
+
52
+ # @return [Array<String>]
53
+ def values
54
+ @values ||=
55
+ self.class
56
+ .node_set_from(node)
57
+ .map { |value_node| self.class.value_from(value_node) }
58
+ .select(&:present?)
69
59
  end
70
60
 
71
61
  private
72
62
 
73
63
  attr_reader :node, :separator
74
-
75
- # @return [Nokogiri::XML::NodeSet]
76
- def value_nodes
77
- @value_nodes ||= self.class.nodes_from(node)
78
- end
79
64
  end
80
65
  end
81
66
  end
@@ -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,17 +11,46 @@ module MicroMicro
7
11
  'u' => Parsers::UrlPropertyParser
8
12
  }.freeze
9
13
 
10
- include Collectible
11
-
12
14
  attr_reader :name, :node, :prefix
13
15
 
16
+ # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
17
+ # @return [Array<MicroMicro::Property>]
18
+ def self.from_context(context)
19
+ node_set_from(context).flat_map do |node|
20
+ Helpers.property_class_names_from(node).map { |token| new(node, token) }
21
+ end
22
+ end
23
+
24
+ # @param context [Nokogiri::XML::NodeSet, Nokogiri::XML::Element]
25
+ # @param node_set [Nokogiri::XML::NodeSet]
26
+ # @return [Nokogiri::XML::NodeSet]
27
+ def self.node_set_from(context, node_set = Nokogiri::XML::NodeSet.new(context.document, []))
28
+ context.each { |node| node_set_from(node, node_set) } if context.is_a?(Nokogiri::XML::NodeSet)
29
+
30
+ if context.is_a?(Nokogiri::XML::Element) && !Helpers.ignore_node?(context)
31
+ node_set << context if Helpers.property_node?(context)
32
+
33
+ node_set_from(context.element_children, node_set) unless Helpers.item_node?(context)
34
+ end
35
+
36
+ node_set
37
+ end
38
+
14
39
  # @param node [Nokogiri::XML::Element]
15
- # @param name [String]
16
- # @param prefix [String<dt, e, p, u>]
17
- def initialize(node, name:, prefix:)
40
+ # @param token [String]
41
+ def initialize(node, token)
18
42
  @node = node
19
- @name = name
20
- @prefix = prefix
43
+ @prefix, @name = token.split(/-/, 2)
44
+ end
45
+
46
+ # @return [Boolean]
47
+ def date_time_property?
48
+ prefix == 'dt'
49
+ end
50
+
51
+ # @return [Boolean]
52
+ def embedded_markup_property?
53
+ prefix == 'e'
21
54
  end
22
55
 
23
56
  # @return [Boolean]
@@ -25,10 +58,15 @@ module MicroMicro
25
58
  false
26
59
  end
27
60
 
61
+ # :nocov:
28
62
  # @return [String]
29
63
  def inspect
30
- format(%(#<#{self.class.name}:%#0x name: #{name.inspect}, prefix: #{prefix.inspect}, value: #{value.inspect}>), object_id)
64
+ "#<#{self.class}:#{format('%#0x', object_id)} " \
65
+ "name: #{name.inspect}, " \
66
+ "prefix: #{prefix.inspect}, " \
67
+ "value: #{value.inspect}>"
31
68
  end
69
+ # :nocov:
32
70
 
33
71
  # @return [MicroMicro::Item, nil]
34
72
  def item
@@ -37,67 +75,41 @@ module MicroMicro
37
75
 
38
76
  # @return [Boolean]
39
77
  def item_node?
40
- @item_node ||= Item.item_node?(node)
78
+ @item_node ||= Helpers.item_node?(node)
41
79
  end
42
80
 
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
81
+ # @return [Boolean]
82
+ def plain_text_property?
83
+ prefix == 'p'
57
84
  end
58
85
 
59
86
  # @return [Boolean]
60
- def value?
61
- value.present?
87
+ def url_property?
88
+ prefix == 'u'
62
89
  end
63
90
 
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)
69
-
70
- if context.is_a?(Nokogiri::XML::Element) && !Document.ignore_node?(context)
71
- node_set << context if property_node?(context)
91
+ # @return [String, Hash]
92
+ # rubocop:disable Metrics
93
+ def value
94
+ @value ||=
95
+ if item_node?
96
+ hash = item.to_h
72
97
 
73
- nodes_from(context.element_children, node_set) unless Item.item_node?(context)
74
- end
98
+ return hash.merge(parser.value) if embedded_markup_property?
75
99
 
76
- node_set
77
- end
100
+ p_property = item.properties.find { |property| property.name == 'name' } if plain_text_property?
101
+ u_property = item.properties.find { |property| property.name == 'url' } if url_property?
78
102
 
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
103
+ hash.merge(value: (p_property || u_property || parser).value)
104
+ else
105
+ parser.value
106
+ end
85
107
  end
108
+ # rubocop:enable Metrics
86
109
 
87
- # @param node [Nokogiri::XML::Element]
88
110
  # @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)>]
95
- #
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
111
+ def value?
112
+ value.present?
101
113
  end
102
114
 
103
115
  private
@@ -1,7 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
4
  class Relationship
3
5
  include Collectible
4
6
 
7
+ # @param context [Nokogiri::HTML::Document, Nokogiri::XML::Element]
8
+ # @return [Array<MicroMicro::Relationship>]
9
+ def self.relationships_from(context)
10
+ context.css('[href][rel]:not([rel=""])')
11
+ .reject { |node| Helpers.ignore_nodes?(node.ancestors) }
12
+ .map { |node| new(node) }
13
+ end
14
+
5
15
  # @param node [Nokogiri::XML::Element]
6
16
  def initialize(node)
7
17
  @node = node
@@ -17,10 +27,14 @@ module MicroMicro
17
27
  @hreflang ||= node['hreflang']&.strip
18
28
  end
19
29
 
30
+ # :nocov:
20
31
  # @return [String]
21
32
  def inspect
22
- format(%(#<#{self.class.name}:%#0x href: #{href.inspect}, rels: #{rels.inspect}>), object_id)
33
+ "#<#{self.class}:#{format('%#0x', object_id)} " \
34
+ "href: #{href.inspect}, " \
35
+ "rels: #{rels.inspect}>"
23
36
  end
37
+ # :nocov:
24
38
 
25
39
  # @return [String, nil]
26
40
  def media
@@ -60,18 +74,6 @@ module MicroMicro
60
74
  @type ||= node['type']&.strip
61
75
  end
62
76
 
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
77
  private
76
78
 
77
79
  attr_reader :node
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MicroMicro
2
- VERSION = '1.0.0'.freeze
4
+ VERSION = '2.0.1'
3
5
  end
data/lib/micromicro.rb CHANGED
@@ -1,38 +1,43 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
- require 'absolutely'
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'
16
+
17
+ require_relative 'micro_micro/parsers/date_time_parser'
18
+ require_relative 'micro_micro/parsers/value_class_pattern_parser'
19
+
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'
25
+
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'
30
+
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'
10
36
 
11
- require 'micro_micro/version'
12
- require 'micro_micro/collectible'
13
-
14
- require 'micro_micro/parsers/date_time_parser'
15
- require 'micro_micro/parsers/value_class_pattern_parser'
16
-
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'
25
-
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
-
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.
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', '< 2.8')
6
+ spec.required_ruby_version = '>= 2.7', '< 4'
5
7
 
6
8
  spec.name = 'micromicro'
7
9
  spec.version = MicroMicro::VERSION
@@ -13,16 +15,19 @@ Gem::Specification.new do |spec|
13
15
  spec.homepage = 'https://github.com/jgarber623/micromicro'
14
16
  spec.license = 'MIT'
15
17
 
16
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(bin|spec)/}) }
18
- end
18
+ spec.files = Dir['lib/**/*'].reject { |f| File.directory?(f) }
19
+ spec.files += %w[LICENSE CHANGELOG.md CONTRIBUTING.md README.md]
20
+ spec.files += %w[micromicro.gemspec]
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 'absolutely', '~> 5.0'
26
- spec.add_runtime_dependency 'activesupport', '~> 6.0'
27
- spec.add_runtime_dependency 'nokogiri', '~> 1.10'
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