link-header-parser 4.0.0 → 5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 173d1c05e3a5c2fe7d8e99454249d73ce780cfcc3bb120d7be5145e9b376ea54
4
- data.tar.gz: a79af8ae39af06d3a4625eab54aa8f51d4574f5789c913d570919c20f877febc
3
+ metadata.gz: a3bede096a22050eb158b8c5e55a8467cf2a0abb91a7058962ab99b1aebe9162
4
+ data.tar.gz: 02a647ff14be96c4dfc11f571694d90ef2e75fe2b3930ceb09c0ecb0ab55d92a
5
5
  SHA512:
6
- metadata.gz: 48085ca777ca8b2e6d859e2920165d7336cd2b909efbdfcc63aaff1980859d77e8cb6f0455dc61c8b089d143206d435639b49a9aef9a7f151c21ca683e9af07d
7
- data.tar.gz: 8fbd4c92cced717fc2a41d213209067824288810d14053236e6ca3ee1363c421a89c49be4ac6f34f9cc3736c91108ec58779a2638fca1efcbbf314ae5bbf1c84
6
+ metadata.gz: af0da321a1652d3f6740fb4396a95d66213334b04eec1bd794652de894f2c7b6d9effd52701722ca851fbb01bcc38601e4c80b20290cede4b4856f36e6436520
7
+ data.tar.gz: ea527e8a58c23acafc460a73224d72204d9b82074dfa53275518eea5fd1aad940489d4efc5b770700a7aaf120160e8f589c36f56d9965ffba47d23174a09c73a
data/CHANGELOG.md CHANGED
@@ -1,11 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 5.0.0 / 2022-11-09
4
+
5
+ - **Breaking change:** Add `#to_ary`/`#to_a` method to `LinkHeadersCollection` (6a478ed)
6
+ - Note: marking this as a breaking change since it changes the existing behavior to return an `Array` of `Hash`es instead of an `Array` of `LinkHeader`s
7
+ - **Breaking change:** Update project Ruby version to 2.7.6 and minimum Ruby version to 2.7 (1e9df45)
8
+ - Improve documentation and privatize constants (8a68aa0)
9
+ - Remove Reek development dependency (423bc7a)
10
+ - Use ruby/debug gem instead of pry-byebug (4cd9d26)
11
+
3
12
  ## 4.0.0 / 2022-01-06
4
13
 
5
14
  - Remove Addressable dependency (daedf22)
6
15
  - **Breaking change:** Update minimum Ruby version to 2.6 (e2343ed)
7
16
  - Migrate to GitHub Actions (509b2c4)
8
- - Update project Ruby version to 2.6.9 (c39bc66)
17
+ - Update project Ruby version to 2.6.10 (c39bc66)
9
18
 
10
19
  ## 3.0.0 / 2021-05-22
11
20
 
data/CONTRIBUTING.md CHANGED
@@ -8,9 +8,9 @@ There are a couple ways you can help improve link-header-parser-ruby:
8
8
 
9
9
  ## Getting Started
10
10
 
11
- link-header-parser-ruby is developed using Ruby 2.6.9 and is additionally tested against Ruby 2.7, 3.0, and 3.1 using [GitHub Actions](https://github.com/jgarber623/link-header-parser-ruby/actions).
11
+ link-header-parser-ruby is developed using Ruby 2.7.6 and is additionally tested against Ruby 3.0 and 3.1 using [GitHub Actions](https://github.com/jgarber623/link-header-parser-ruby/actions).
12
12
 
13
- Before making changes to link-header-parser-ruby, you'll want to install Ruby 2.6.9. 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.6.9 using your method of choice, install the project's gems by running:
13
+ Before making changes to link-header-parser-ruby, you'll want to install Ruby 2.7.6. 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.6 using your method of choice, install the project's gems by running:
14
14
 
15
15
  ```sh
16
16
  bundle install
@@ -22,7 +22,7 @@ bundle install
22
22
  1. Install development dependencies as outlined above.
23
23
  1. Create a feature branch for the code changes you're looking to make: `git checkout -b my-new-feature`.
24
24
  1. _Write some code!_
25
- 1. If your changes would benefit from testing, add the necessary tests and verify everything passes by running `bin/ci`.
25
+ 1. If your changes would benefit from testing, add the necessary tests and verify everything passes by running `bundle exec rspec`.
26
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
27
  1. Push the branch to your fork: `git push -u origin my-new-feature`.
28
28
  1. Create a new [pull request][pulls] and we'll review your changes.
data/README.md CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
  ## Getting Started
12
12
 
13
- Before installing and using link-header-parser-ruby, you'll want to have [Ruby](https://www.ruby-lang.org) 2.6 (or newer) installed. 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).
13
+ Before installing and using link-header-parser-ruby, you'll want to have [Ruby](https://www.ruby-lang.org) 2.7 (or newer) installed. 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).
14
14
 
15
- link-header-parser-ruby is developed using Ruby 2.6.9 and is additionally tested against Ruby 2.7, 3.0, and 3.1 using [GitHub Actions](https://github.com/jgarber623/link-header-parser-ruby/actions).
15
+ link-header-parser-ruby is developed using Ruby 2.7.6 and is additionally tested against Ruby 3.0 and 3.1 using [GitHub Actions](https://github.com/jgarber623/link-header-parser-ruby/actions).
16
16
 
17
17
  ## Installation
18
18
 
@@ -35,14 +35,13 @@ $ bundle install
35
35
  With link-header-parser-ruby added to your project's `Gemfile` and installed, you may parse a URL's HTTP Link headers by doing:
36
36
 
37
37
  ```ruby
38
- require 'http'
38
+ require 'net/http'
39
39
  require 'link-header-parser'
40
40
 
41
- response = HTTP.get('https://sixtwothree.org')
41
+ url = 'https://sixtwothree.org'
42
+ link_headers = Net::HTTP.get_response(URI.parse(url)).get_fields('Link')
42
43
 
43
- link_headers = response.headers.get('link')
44
-
45
- collection = LinkHeaderParser.parse(link_headers, base: response.uri)
44
+ collection = LinkHeaderParser.parse(link_headers, base: url)
46
45
  ```
47
46
 
48
47
  The `parse` method accepts two arguments:
@@ -9,11 +9,20 @@ require_relative 'link_header_parser/link_header_parameter'
9
9
  require_relative 'link_header_parser/link_headers_collection'
10
10
 
11
11
  module LinkHeaderParser
12
- # Parse an array of HTTP Link headers
12
+ # Parse an array of HTTP Link headers.
13
13
  #
14
- # @param headers [Array<String>]
15
- # @param base [String]
16
- # @return [LinkHeaderParser::LinkHeadersCollection]
14
+ # Convenience method for {LinkHeaderParser::LinkHeadersCollection#initialize}.
15
+ #
16
+ # @example
17
+ # require 'net/http'
18
+ #
19
+ # url = 'https://sixtwothree.org'
20
+ # link_headers = Net::HTTP.get_response(URI.parse(url)).get_fields('Link')
21
+ #
22
+ # LinkHeaderParser.parse(link_headers, base: url)
23
+ #
24
+ # @param (see LinkHeaderParser::LinkHeadersCollection#initialize)
25
+ # @return (see LinkHeaderParser::LinkHeadersCollection#initialize)
17
26
  def self.parse(*headers, base:)
18
27
  LinkHeadersCollection.new(*headers, base: base)
19
28
  end
@@ -3,30 +3,43 @@
3
3
  module LinkHeaderParser
4
4
  class LinkHeader
5
5
  FIELD_VALUE_REGEXP_PATTERN = /^\s*<\s*(?<target_string>[^>]+)\s*>\s*(?<parameters>;\s*.*)$/.freeze
6
+ private_constant :FIELD_VALUE_REGEXP_PATTERN
7
+
6
8
  PARAMETERS_REGEXP_PATTERN = /(?<!;)\s*([^;]+)/.freeze
9
+ private_constant :PARAMETERS_REGEXP_PATTERN
7
10
 
11
+ # The +String+ value used to create this {LinkHeader}.
12
+ #
13
+ # @return [String]
8
14
  attr_reader :field_value
9
15
 
10
- # Create a new parsed Link header
16
+ # Create a new parsed Link header.
17
+ #
11
18
  # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
19
+ # IETF RFC 8288 Web Linking Appendix B.2 Parsing a Link Field Value
12
20
  #
13
- # @param field_value [String]
14
- # @param base [String]
21
+ # @param field_value [String, #to_str]
22
+ # @param base [String, #to_str]
15
23
  def initialize(field_value, base:)
16
24
  @field_value = field_value.to_str
17
25
  @base = base.to_str
18
26
  end
19
27
 
20
- # The context URL for this Link header extracted from field_value (or target URL if no context URL is present)
21
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.11)
28
+ # The context URL for this Link header extracted from +field_value+ (or
29
+ # target URL if no context URL is present).
30
+ #
31
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
32
+ # IETF RFC 8288 Web Linking Appendix B.2.2.11 Parsing a Link Field Value
22
33
  #
23
34
  # @return [String]
24
35
  def context_string
25
36
  @context_string ||= grouped_link_parameters[:anchor]&.first || target_string
26
37
  end
27
38
 
28
- # The resolved context URL for this Link header
29
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.12)
39
+ # The resolved context URL for this Link header.
40
+ #
41
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
42
+ # IETF RFC 8288 Web Linking Appendix B.2.2.12 Parsing a Link Field Value
30
43
  #
31
44
  # @return [String]
32
45
  def context_uri
@@ -40,8 +53,10 @@ module LinkHeaderParser
40
53
  "relation_types: #{relation_types.inspect}>"
41
54
  end
42
55
 
43
- # The parsed parameters for this Link header extracted from field_value
56
+ # The parsed parameters for this Link header extracted from +field_value+.
57
+ #
44
58
  # @see https://tools.ietf.org/html/rfc8288#appendix-B.3
59
+ # IETF RFC 8288 Web Linking Appendix B.3 Parsing Parameters
45
60
  #
46
61
  # @return [Array<LinkHeaderParser::LinkHeaderParameter>]
47
62
  def link_parameters
@@ -50,38 +65,50 @@ module LinkHeaderParser
50
65
  .map { |parameter| LinkHeaderParameter.new(parameter) }
51
66
  end
52
67
 
53
- # The relations_string value returned as an Array
54
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.10 and Appendix B.2.2.17.1)
68
+ # The +relations_string+ value returned as an +Array+.
69
+ #
70
+ # @see LinkHeader#relations_string
71
+ #
72
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
73
+ # IETF RFC 8288 Web Linking Appendix B.2.2.10 and Appendix B.2.2.17.1 Parsing a Link Field Value
55
74
  #
56
75
  # @return [Array<String>]
57
76
  def relation_types
58
77
  @relation_types ||= relations_string.split.map(&:downcase)
59
78
  end
60
79
 
61
- # The relation types for this Link header extracted from field_value
62
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.9)
80
+ # The relation types for this Link header extracted from +field_value+.
81
+ #
82
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
83
+ # IETF RFC 8288 Web Linking Appendix B.2.2.9 Parsing a Link Field Value
63
84
  #
64
85
  # @return [String]
65
86
  def relations_string
66
87
  @relations_string ||= grouped_link_parameters[:rel]&.first.to_s
67
88
  end
68
89
 
69
- # The target URL for this Link header extracted from field_value
70
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.4)
90
+ # The target URL for this Link header extracted from +field_value+
91
+ #
92
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
93
+ # IETF RFC 8288 Web Linking Appendix B.2.2.4 Parsing a Link Field Value
71
94
  #
72
95
  # @return [String]
73
96
  def target_string
74
97
  @target_string ||= field_value_match_data[:target_string]
75
98
  end
76
99
 
77
- # The resolved target URL for this Link header
78
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.2 (Appendix B.2.2.8)
100
+ # The resolved target URL for this Link header.
101
+ #
102
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.2
103
+ # IETF RFC 8288 Web Linking Appendix B.2.2.8 Parsing a Link Field Value
79
104
  #
80
105
  # @return [String]
81
106
  def target_uri
82
107
  @target_uri ||= URI.join(base, target_string).normalize.to_s
83
108
  end
84
109
 
110
+ # Return a +Hash+ representation of this {LinkHeader}.
111
+ #
85
112
  # @return [Hash{Symbol => String, Array, Hash{Symbol => Array}}]
86
113
  def to_hash
87
114
  {
@@ -3,10 +3,16 @@
3
3
  module LinkHeaderParser
4
4
  class LinkHeaderParameter
5
5
  PARAMETER_REGEXP_PATTERN = /^(?<name>.+?)(?:="?(?<value>.*?)"?)?$/.freeze
6
+ private_constant :PARAMETER_REGEXP_PATTERN
6
7
 
8
+ # The +String+ value used to create this {LinkHeaderParameter}.
9
+ #
10
+ # @return [String]
7
11
  attr_reader :parameter
8
12
 
9
- # @param parameter [String]
13
+ # Create a new parsed Link header parameter.
14
+ #
15
+ # @param parameter [String, #to_str]
10
16
  def initialize(parameter)
11
17
  @parameter = parameter.to_str
12
18
  end
@@ -18,20 +24,24 @@ module LinkHeaderParser
18
24
  "value: #{value.inspect}>"
19
25
  end
20
26
 
21
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.3 (Appendix B.3.2.9)
27
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.3
28
+ # IETF RFC 8288 Web Linking Appendix B.3.2.9 Parsing Parameters
22
29
  #
23
30
  # @return [String]
24
31
  def name
25
32
  @name ||= parameter_match_data[:name].downcase
26
33
  end
27
34
 
28
- # @see https://tools.ietf.org/html/rfc8288#appendix-B.3 (Appendix B.3.2.8)
35
+ # @see https://tools.ietf.org/html/rfc8288#appendix-B.3
36
+ # IETF RFC 8288 Web Linking Appendix B.3.2.8 Parsing Parameters
29
37
  #
30
38
  # @return [String]
31
39
  def value
32
40
  @value ||= parameter_match_data[:value].to_s
33
41
  end
34
42
 
43
+ # Return an +Array+ representation of this {LinkHeaderParameter}.
44
+ #
35
45
  # @return [Array<String>]
36
46
  def to_ary
37
47
  [name, value]
@@ -8,17 +8,26 @@ module LinkHeaderParser
8
8
 
9
9
  def_delegators :members, :[], :<<, :each, :last, :length, :push
10
10
 
11
+ # The +Array+ of HTTP Link headers used to create this
12
+ # {LinkHeadersCollection}.
13
+ #
14
+ # @return [Array<String>]
11
15
  attr_reader :headers
12
16
 
13
- # @param headers [Array<String>]
14
- # @param base [String]
17
+ # Parse an array of HTTP Link headers.
18
+ #
19
+ # @param headers [Array<String, #to_str>]
20
+ # @param base [String, #to_str]
15
21
  def initialize(*headers, base:)
16
22
  @headers = headers.to_ary.flatten.map(&:to_str)
17
23
  @base = base.to_str
18
24
 
19
- distinct_headers.each { |header| push(LinkHeader.new(header, base: base)) }
25
+ push(*distinct_link_headers)
20
26
  end
21
27
 
28
+ # Retrieve a +Hash+ of this collection's {LinkHeader}s grouped by their
29
+ # relation type(s).
30
+ #
22
31
  # @return [Hash{Symbol => Array<LinkHeaderParser::LinkHeader>}]
23
32
  def group_by_relation_type
24
33
  relation_types.to_h do |relation_type|
@@ -33,17 +42,32 @@ module LinkHeaderParser
33
42
  "relation_types: #{relation_types.inspect}>"
34
43
  end
35
44
 
45
+ # Retrieve a unique sorted +Array+ of this collection's {LinkHeader}
46
+ # relation types.
47
+ #
36
48
  # @return [Array<String>]
37
49
  def relation_types
38
50
  @relation_types ||= flat_map(&:relation_types).uniq.sort
39
51
  end
40
52
 
53
+ # Return an +Array+ representation of this {LinkHeadersCollection}.
54
+ #
55
+ # @see LinkHeader#to_hash
56
+ #
57
+ # @return [Array<Hash>}>]
58
+ def to_ary
59
+ map(&:to_hash)
60
+ end
61
+
62
+ alias to_a to_ary
63
+
41
64
  private
42
65
 
43
66
  attr_reader :base
44
67
 
45
- def distinct_headers
46
- @distinct_headers ||= headers.flat_map { |header| header.split(/,(?=[\s|<])/) }.map(&:strip)
68
+ def distinct_link_headers
69
+ headers.flat_map { |header| header.split(/,(?=[\s|<])/) }
70
+ .map { |header| LinkHeader.new(header.strip, base: base) }
47
71
  end
48
72
 
49
73
  def members
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LinkHeaderParser
4
- VERSION = '4.0.0'
4
+ VERSION = '5.0.0'
5
5
  end
@@ -3,7 +3,7 @@
3
3
  require_relative 'lib/link_header_parser/version'
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.required_ruby_version = '>= 2.6', '< 4'
6
+ spec.required_ruby_version = '>= 2.7', '< 4'
7
7
 
8
8
  spec.name = 'link-header-parser'
9
9
  spec.version = LinkHeaderParser::VERSION
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: link-header-parser
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: 2022-01-06 00:00:00.000000000 Z
11
+ date: 2022-11-09 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Parse HTTP Link headers.
14
14
  email:
@@ -32,7 +32,7 @@ licenses:
32
32
  - MIT
33
33
  metadata:
34
34
  bug_tracker_uri: https://github.com/jgarber623/link-header-parser-ruby/issues
35
- changelog_uri: https://github.com/jgarber623/link-header-parser-ruby/blob/v4.0.0/CHANGELOG.md
35
+ changelog_uri: https://github.com/jgarber623/link-header-parser-ruby/blob/v5.0.0/CHANGELOG.md
36
36
  rubygems_mfa_required: 'true'
37
37
  post_install_message:
38
38
  rdoc_options: []
@@ -42,7 +42,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - ">="
44
44
  - !ruby/object:Gem::Version
45
- version: '2.6'
45
+ version: '2.7'
46
46
  - - "<"
47
47
  - !ruby/object:Gem::Version
48
48
  version: '4'
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  requirements: []
55
- rubygems_version: 3.2.33
55
+ rubygems_version: 3.3.16
56
56
  signing_key:
57
57
  specification_version: 4
58
58
  summary: Parse HTTP Link headers.