webmention-endpoint 0.3.1 → 1.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
  SHA1:
3
- metadata.gz: 44d656cb6bdecf2ed67ff6dc978c1ff93735c706
4
- data.tar.gz: 2bce5bbb6e3c2b0ba283749c2c59c7c12ba09a1d
3
+ metadata.gz: 0d245a49f0a3fe53fdee075040a00815e6165d6c
4
+ data.tar.gz: '09cde84455b4cc0652c4f02f7f76ba2c1e50092f'
5
5
  SHA512:
6
- metadata.gz: a7f7773495fa464aae5b582acd008d327815089ec5d3815ce58a0dece1c2790ce468f18c2c31340a55cf237cd628de2085bdc895bb00920c92bca2289df980b2
7
- data.tar.gz: f24d832906bf72d03de05c0182da820bcece136ae08c44aeb576a66f74bd033e6a789fbd3053a70938ec3809c5bd9331c4f67241e1ce857f497bd7b27c404e8b
6
+ metadata.gz: 91b061d760180be8fda3aa7ce5a879309d63ce1c71131ac7f4affc88b2b9956d6f8f9d3f73e857d97f5182a30f84ce179fa878eb84a3187c07e94f911b6b7610
7
+ data.tar.gz: ed7b10de7d833d3178e6d9e4b08e65b5b40dd3f7195e87e0a046b627ae1d94b1c5a96924906938e9169a24a12e7f50eb87a9bd2dfe1358f6944862ee7a7431df
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.0 / 2018-07-17
4
+
5
+ - Adds new `Webmention::Endpoint::Client` and `Webmention::Endpoint::Response` classes and refactors `Webmention::Endpoint::Discover` API ([a05d041](https://github.com/jgarber623/webmention-endpoint-ruby/commit/a05d041)).
6
+ - Updates specs ([706f39b](https://github.com/jgarber623/webmention-endpoint-ruby/commit/706f39b)) and documentation ([7110b8c](https://github.com/jgarber623/webmention-endpoint-ruby/commit/7110b8c)).
7
+
3
8
  ## 0.3.1 / 2018-07-05
4
9
 
5
10
  - Updates [Absolutely](https://github.com/jgarber623/absolutely) to v1.1.0 ([4a62800](https://github.com/jgarber623/webmention-endpoint-ruby/commit/4a62800)).
data/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  ## Key Features
13
13
 
14
- - Compliant with [Section 3.1.2](https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint) of [the W3C's Webmention specification](https://www.w3.org/TR/webmention/).
14
+ - Compliant with [Section 3.1.2](https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint) of [the W3C's Webmention Recommendation](https://www.w3.org/TR/webmention/).
15
15
  - Passes all Endpoint Discovery tests on [webmention.rocks](https://webmention.rocks).
16
16
  - Supports Ruby 2.4 and newer.
17
17
 
@@ -51,7 +51,7 @@ endpoint = Webmention::Endpoint.discover('https://webmention.rocks/test/1')
51
51
  puts endpoint # returns String: 'https://webmention.rocks/test/1/webmention'
52
52
  ```
53
53
 
54
- This example will search `https://webmention.rocks/test/1` for a valid Webmention endpoint in accordance with the rules described in [the W3C's Webmention specification](https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint). In this case, the program returns a string: `https://webmention.rocks/test/1/webmention`.
54
+ This example will search `https://webmention.rocks/test/1` for a valid Webmention endpoint in accordance with the rules described in [the W3C's Webmention Recommendation](https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint). In this case, the program returns a string: `https://webmention.rocks/test/1/webmention`.
55
55
 
56
56
  If no endpoint is discovered at the provided URL, the program will return `nil`:
57
57
 
@@ -65,18 +65,15 @@ puts endpoint.nil? # returns Boolean: true
65
65
 
66
66
  ### Advanced Usage
67
67
 
68
- Should the need arise, you may work directly with the `Webmention::Endpoint::Discover` class:
68
+ Should the need arise, you may work directly with the `Webmention::Endpoint::Client` class:
69
69
 
70
70
  ```ruby
71
71
  require 'webmention/endpoint'
72
72
 
73
- discoverer = Webmention::Endpoint::Discover.new('https://webmention.rocks/test/1')
73
+ client = Webmention::Endpoint::Client.new('https://webmention.rocks/test/1')
74
74
 
75
- puts discoverer.url # returns String: 'https://webmention.rocks/test/1'
76
- puts discoverer.endpoint # returns String: 'https://webmention.rocks/test/1/webmention'
77
-
78
- puts discoverer.uri # returns Addressable::URI
79
- puts discoverer.response # returns HTTP::Response
75
+ puts client.response # returns HTTP::Response
76
+ puts client.endpoint # returns String: 'https://webmention.rocks/test/1/webmention'
80
77
  ```
81
78
 
82
79
  ### Exception Handling
@@ -5,12 +5,14 @@ require 'nokogiri'
5
5
 
6
6
  require 'webmention/endpoint/version'
7
7
  require 'webmention/endpoint/error'
8
+ require 'webmention/endpoint/client'
8
9
  require 'webmention/endpoint/discover'
10
+ require 'webmention/endpoint/response'
9
11
 
10
12
  module Webmention
11
13
  module Endpoint
12
14
  def self.discover(url)
13
- Discover.new(url).endpoint
15
+ Client.new(url).endpoint
14
16
  end
15
17
  end
16
18
  end
@@ -0,0 +1,21 @@
1
+ module Webmention
2
+ module Endpoint
3
+ class Client
4
+ def initialize(url)
5
+ raise ArgumentError, "url must be a String (given #{url.class.name})" unless url.is_a?(String)
6
+
7
+ @uri = Addressable::URI.parse(url)
8
+ rescue Addressable::URI::InvalidURIError => error
9
+ raise InvalidURIError, error
10
+ end
11
+
12
+ def endpoint
13
+ @endpoint ||= Discover.new(response).endpoint
14
+ end
15
+
16
+ def response
17
+ @response ||= Response.new(@uri).response
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,11 +1,6 @@
1
1
  module Webmention
2
2
  module Endpoint
3
3
  class Discover
4
- HTTP_HEADERS_OPTS = {
5
- accept: '*/*',
6
- user_agent: 'Webmention Endpoint Discovery (https://rubygems.org/gems/webmention-endpoint)'
7
- }.freeze
8
-
9
4
  # Ultra-orthodox pattern matching allowed values in Link header `rel` parameter
10
5
  # https://tools.ietf.org/html/rfc8288#section-3.3
11
6
  REGEXP_REG_REL_TYPE_PATTERN = '[a-z\d][a-z\d\-\.]*'.freeze
@@ -18,44 +13,26 @@ module Webmention
18
13
  # https://www.w3.org/TR/webmention/#sender-discovers-receiver-webmention-endpoint-p-1
19
14
  REGEXP_WEBMENTION_REL_PATTERN = /(?:;|\s)rel="?(?:#{REGEXP_REG_REL_TYPE_PATTERN}+\s)?webmention(?:\s#{REGEXP_REG_REL_TYPE_PATTERN})?"?/
20
15
 
21
- attr_reader :uri, :url
22
-
23
- def initialize(url)
24
- raise ArgumentError, "url must be a String (given #{url.class.name})" unless url.is_a?(String)
16
+ def initialize(response)
17
+ raise ArgumentError, "response must be an HTTP::Response (given #{response.class.name})" unless response.is_a?(HTTP::Response)
25
18
 
26
- @url = url
27
- @uri = Addressable::URI.parse(url)
28
- rescue Addressable::URI::InvalidURIError => error
29
- raise InvalidURIError, error
19
+ @response = response
30
20
  end
31
21
 
32
22
  def endpoint
33
23
  return unless endpoint_from_http_request
34
24
 
35
- @endpoint ||= Absolutely.to_absolute_uri(base: url, relative: endpoint_from_http_request)
25
+ @endpoint ||= Absolutely.to_absolute_uri(base: @response.uri.to_s, relative: endpoint_from_http_request)
36
26
  rescue Absolutely::InvalidURIError => error
37
27
  raise InvalidURIError, error
38
28
  end
39
29
 
40
- def response
41
- @response ||= HTTP.follow.headers(HTTP_HEADERS_OPTS).timeout(
42
- connect: 10,
43
- read: 10
44
- ).get(uri)
45
- rescue HTTP::ConnectionError => error
46
- raise ConnectionError, error
47
- rescue HTTP::TimeoutError => error
48
- raise TimeoutError, error
49
- rescue HTTP::Redirector::TooManyRedirectsError => error
50
- raise TooManyRedirectsError, error
51
- end
52
-
53
30
  private
54
31
 
55
32
  def endpoint_from_body
56
- return unless response.mime_type == 'text/html'
33
+ return unless @response.mime_type == 'text/html'
57
34
 
58
- doc = Nokogiri::HTML(response.body.to_s)
35
+ doc = Nokogiri::HTML(@response.body.to_s)
59
36
 
60
37
  # Search response body for first `a` or `link` element with valid `rel` and `href` attributes
61
38
  link_element = doc.css('[rel~="webmention"][href]').select { |element| %w[a link].include?(element.name) }.shift
@@ -64,7 +41,7 @@ module Webmention
64
41
  end
65
42
 
66
43
  def endpoint_from_headers
67
- link_headers = response.headers.get('link')
44
+ link_headers = @response.headers.get('link')
68
45
 
69
46
  return unless link_headers
70
47
 
@@ -0,0 +1,29 @@
1
+ module Webmention
2
+ module Endpoint
3
+ class Response
4
+ HTTP_HEADERS_OPTS = {
5
+ accept: '*/*',
6
+ user_agent: 'Webmention Endpoint Discovery (https://rubygems.org/gems/webmention-endpoint)'
7
+ }.freeze
8
+
9
+ def initialize(uri)
10
+ raise ArgumentError, "uri must be an Addressable::URI (given #{uri.class.name})" unless uri.is_a?(Addressable::URI)
11
+
12
+ @uri = uri
13
+ end
14
+
15
+ def response
16
+ @response ||= HTTP.follow.headers(HTTP_HEADERS_OPTS).timeout(
17
+ connect: 10,
18
+ read: 10
19
+ ).get(@uri)
20
+ rescue HTTP::ConnectionError => error
21
+ raise ConnectionError, error
22
+ rescue HTTP::TimeoutError => error
23
+ raise TimeoutError, error
24
+ rescue HTTP::Redirector::TooManyRedirectsError => error
25
+ raise TooManyRedirectsError, error
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  module Webmention
2
2
  module Endpoint
3
- VERSION = '0.3.1'.freeze
3
+ VERSION = '1.0.0'.freeze
4
4
  end
5
5
  end
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency 'bundler', '~> 1.16', '>= 1.16.2'
24
24
  spec.add_development_dependency 'rake', '~> 12.3', '>= 12.3.1'
25
25
  spec.add_development_dependency 'rspec', '~> 3.7'
26
- spec.add_development_dependency 'rubocop', '~> 0.57.2'
26
+ spec.add_development_dependency 'rubocop', '~> 0.58.0'
27
27
  spec.add_development_dependency 'rubocop-rspec', '~> 1.27'
28
28
  spec.add_development_dependency 'simplecov', '~> 0.16.1'
29
29
  spec.add_development_dependency 'simplecov-console', '~> 0.4.2'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmention-endpoint
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.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: 2018-07-05 00:00:00.000000000 Z
11
+ date: 2018-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,14 +70,14 @@ dependencies:
70
70
  requirements:
71
71
  - - "~>"
72
72
  - !ruby/object:Gem::Version
73
- version: 0.57.2
73
+ version: 0.58.0
74
74
  type: :development
75
75
  prerelease: false
76
76
  version_requirements: !ruby/object:Gem::Requirement
77
77
  requirements:
78
78
  - - "~>"
79
79
  - !ruby/object:Gem::Version
80
- version: 0.57.2
80
+ version: 0.58.0
81
81
  - !ruby/object:Gem::Dependency
82
82
  name: rubocop-rspec
83
83
  requirement: !ruby/object:Gem::Requirement
@@ -210,8 +210,10 @@ files:
210
210
  - README.md
211
211
  - Rakefile
212
212
  - lib/webmention/endpoint.rb
213
+ - lib/webmention/endpoint/client.rb
213
214
  - lib/webmention/endpoint/discover.rb
214
215
  - lib/webmention/endpoint/error.rb
216
+ - lib/webmention/endpoint/response.rb
215
217
  - lib/webmention/endpoint/version.rb
216
218
  - webmention-endpoint.gemspec
217
219
  homepage: https://github.com/jgarber623/webmention-endpoint-ruby