micromicro 1.0.0 → 2.0.1

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 (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