webmention 0.1.5 → 0.1.6

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fb054d8a144253225b03c07b8cb1b70e78b01c5d
4
+ data.tar.gz: a73bd416adcbcd7c3aac45eb3fc053cb2a2296f8
5
+ SHA512:
6
+ metadata.gz: 792d42a1dea5a5be92f1550753688699ddd4da47a166ed52fa09463cae5ce2c5264fc924cc10bb585f3f5eb84a2f7283805db44f11f82b5f6e3833e51da63bba
7
+ data.tar.gz: f8dd7faaa37ea1de848ccdb6b40dc737707a18c2f93a412d6ea48c2be8ae34058ca887506b3c84f42b93aed89835940003d944f6409e88bc842f6ce321aa2f62
@@ -1,7 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
4
- - 1.9.3
5
- - 1.9.2
3
+ - 2.4.1
4
+ - 2.3.4
5
+ - 2.2.7
6
6
  notifications:
7
7
  email: false
@@ -69,6 +69,9 @@ module Webmention
69
69
  :target => target,
70
70
  }
71
71
 
72
+ # Ensure the endpoint is an absolute URL
73
+ endpoint = absolute_endpoint endpoint, target
74
+
72
75
  begin
73
76
  response = HTTParty.post(endpoint, {
74
77
  :body => data
@@ -105,7 +108,7 @@ module Webmention
105
108
  })
106
109
 
107
110
  # First check the HTTP Headers
108
- if !response.headers['Link'].nil?
111
+ if !response.headers['Link'].nil?
109
112
  endpoint = self.discover_webmention_endpoint_from_header response.headers['Link']
110
113
  return endpoint if endpoint
111
114
  end
@@ -129,25 +132,29 @@ module Webmention
129
132
 
130
133
  def self.discover_webmention_endpoint_from_html html
131
134
  doc = Nokogiri::HTML(html)
132
- if !doc.css('[rel="webmention"]').empty?
133
- doc.css('[rel="webmention"]').attribute("href").value
134
- elsif !doc.css('[rel="http://webmention.org/"]').empty?
135
- doc.css('[rel="http://webmention.org/"]').attribute("href").value
136
- elsif !doc.css('[rel="http://webmention.org"]').empty?
137
- doc.css('[rel="http://webmention.org"]').attribute("href").value
135
+ if !doc.css('[rel~="webmention"]').css('[href]').empty?
136
+ doc.css('[rel~="webmention"]').css('[href]').attribute("href").value
137
+ elsif !doc.css('[rel="http://webmention.org/"]').css('[href]').empty?
138
+ doc.css('[rel="http://webmention.org/"]').css('[href]').attribute("href").value
139
+ elsif !doc.css('[rel="http://webmention.org"]').css('[href]').empty?
140
+ doc.css('[rel="http://webmention.org"]').css('[href]').attribute("href").value
138
141
  else
139
142
  false
140
143
  end
141
144
  end
142
145
 
143
146
  def self.discover_webmention_endpoint_from_header header
144
- if matches = header.match(%r{<(https?://[^>]+)>; rel="webmention"})
147
+ if matches = header.match(%r{<([^>]+)>; rel="[^"]*\s?webmention\s?[^"]*"})
148
+ return matches[1]
149
+ elsif matches = header.match(%r{<([^>]+)>; rel=webmention})
150
+ return matches[1]
151
+ elsif matches = header.match(%r{rel="[^"]*\s?webmention\s?[^"]*"; <([^>]+)>})
145
152
  return matches[1]
146
- elsif matches = header.match(%r{rel="webmention"; <(https?://[^>]+)>})
153
+ elsif matches = header.match(%r{rel=webmention; <([^>]+)>})
147
154
  return matches[1]
148
- elsif matches = header.match(%r{<(https?://[^>]+)>; rel="http://webmention\.org/?"})
155
+ elsif matches = header.match(%r{<([^>]+)>; rel="http://webmention\.org/?"})
149
156
  return matches[1]
150
- elsif matches = header.match(%r{rel="http://webmention\.org/?"; <(https?://[^>]+)>})
157
+ elsif matches = header.match(%r{rel="http://webmention\.org/?"; <([^>]+)>})
151
158
  return matches[1]
152
159
  end
153
160
  return false
@@ -165,5 +172,19 @@ module Webmention
165
172
 
166
173
  return (url.is_a? URI::HTTP or url.is_a? URI::HTTPS)
167
174
  end
175
+
176
+ # Public: Takes an endpoint and ensures an absolute URL is returned
177
+ #
178
+ # endpoint - Endpoint which may be an absolute or relative URL
179
+ # url - URL of the webmention
180
+ #
181
+ # Returns original endpoint if it is already an absolute URL; constructs
182
+ # new absolute URL using relative endpoint if not
183
+ def self.absolute_endpoint endpoint, url
184
+ unless Webmention::Client.valid_http_url? endpoint
185
+ endpoint = URI.join(url, endpoint).to_s
186
+ end
187
+ endpoint
188
+ end
168
189
  end
169
190
  end
@@ -1,3 +1,3 @@
1
1
  module Webmention
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -82,5 +82,44 @@ class SampleData
82
82
  </html>
83
83
  eos
84
84
  end
85
+
86
+ def self.rel_webmention_relative_with_path
87
+ <<-eos
88
+ <html>
89
+ <head>
90
+ <link href="/example/webmention" rel="webmention">
91
+ </head>
92
+ </html>
93
+ eos
94
+ end
85
95
 
96
+ def self.rel_webmention_relative_without_path
97
+ <<-eos
98
+ <html>
99
+ <head>
100
+ <link href="webmention.php" rel="webmention">
101
+ </head>
102
+ </html>
103
+ eos
104
+ end
105
+
106
+ def self.link_tag_multiple_rel_values
107
+ <<-eos
108
+ <html>
109
+ <head>
110
+ <link href="http://webmention.io/example/webmention" rel="webmention foo bar">
111
+ </head>
112
+ </html>
113
+ eos
114
+ end
115
+
116
+ def self.empty_link_tag_no_href
117
+ <<-eos
118
+ <html>
119
+ <head>
120
+ <link href="" rel="webmention">
121
+ </head>
122
+ </html>
123
+ eos
124
+ end
86
125
  end
@@ -36,14 +36,22 @@ describe Webmention::Client do
36
36
  end
37
37
 
38
38
  describe "#discover_webmention_endpoint_from_string" do
39
- it "should find rel=webmention followed by href in header" do
39
+ it "should find rel=\"webmention\" followed by href in header" do
40
40
  Webmention::Client.discover_webmention_endpoint_from_header('rel="webmention"; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
41
41
  end
42
42
 
43
- it "should find href followed by rel=webmention in header" do
43
+ it "should find rel=webmention followed by href in header" do
44
+ Webmention::Client.discover_webmention_endpoint_from_header('rel=webmention; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
45
+ end
46
+
47
+ it "should find href followed by rel=\"webmention\" in header" do
44
48
  Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel="webmention"').must_equal "http://webmention.io/example/webmention"
45
49
  end
46
50
 
51
+ it "should find href followed by rel=webmention in header" do
52
+ Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel=webmention').must_equal "http://webmention.io/example/webmention"
53
+ end
54
+
47
55
  it "should find rel=http://webmention.org followed by href in header" do
48
56
  Webmention::Client.discover_webmention_endpoint_from_header('rel="http://webmention.org"; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
49
57
  end
@@ -83,6 +91,34 @@ describe Webmention::Client do
83
91
  it "should find href followed by rel=http://webmention.org/ in html" do
84
92
  Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_href_webmention_org_slash).must_equal "http://webmention.io/example/webmention"
85
93
  end
94
+
95
+ it "should find rel=webmention followed by relative href with path in header" do
96
+ Webmention::Client.discover_webmention_endpoint_from_header('</example/webmention>; rel="http://webmention.org"').must_equal "/example/webmention"
97
+ end
98
+
99
+ it "should find rel=webmention followed by relative href with path in html" do
100
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_webmention_relative_with_path).must_equal "/example/webmention"
101
+ end
102
+
103
+ it "should find rel=webmention followed by relative href without path in header" do
104
+ Webmention::Client.discover_webmention_endpoint_from_header('<webmention.php>; rel="http://webmention.org"').must_equal "webmention.php"
105
+ end
106
+
107
+ it "should find rel=webmention followed by relative href without path in html" do
108
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_webmention_relative_without_path).must_equal "webmention.php"
109
+ end
110
+
111
+ it "should find webmention in a link tag among multiple rel values" do
112
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.link_tag_multiple_rel_values).must_equal "http://webmention.io/example/webmention"
113
+ end
114
+
115
+ it "should find webmention in a link header among multiple rel values" do
116
+ Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel="webmention foo bar"').must_equal "http://webmention.io/example/webmention"
117
+ end
118
+
119
+ it "should find rel=webmention in a link tag with an empty href" do
120
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.empty_link_tag_no_href).must_equal ""
121
+ end
86
122
  end
87
123
 
88
124
  end
@@ -28,4 +28,18 @@ describe Webmention::Client do
28
28
  end
29
29
  end
30
30
  end
31
+
32
+ describe "#absolute_endpoint" do
33
+ it "should expand an endpoint url with a path to an absolute url based on the webmention url" do
34
+ Webmention::Client.absolute_endpoint('/webmention', 'http://webmention.io/example/1').must_equal "http://webmention.io/webmention"
35
+ end
36
+
37
+ it "should expand an endpoint url without a path to an absolute url based on the webmention url" do
38
+ Webmention::Client.absolute_endpoint('webmention.php', 'http://webmention.io/example/1').must_equal "http://webmention.io/example/webmention.php"
39
+ end
40
+
41
+ it "should take an empty endpoint url and return the webmention url" do
42
+ Webmention::Client.absolute_endpoint('', 'http://webmention.io/example/1').must_equal "http://webmention.io/example/1"
43
+ end
44
+ end
31
45
  end
@@ -5,7 +5,7 @@ require 'webmention/version'
5
5
  Gem::Specification.new do |s|
6
6
  s.name = 'webmention'
7
7
  s.version = Webmention::VERSION
8
- s.date = '2014-05-25'
8
+ s.date = '2017-06-27'
9
9
  s.homepage = 'https://github.com/indieweb/mention-client-ruby'
10
10
  s.summary = 'A gem for sending webmention (and pingback) notifications'
11
11
  s.authors = [
@@ -24,10 +24,10 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.add_dependency 'json'
26
26
  s.add_dependency 'nokogiri'
27
- s.add_dependency 'httparty', '~> 0.13.1'
27
+ s.add_dependency 'httparty', '~> 0.15.5'
28
28
  s.add_dependency 'link_header', '~> 0.0.8'
29
29
 
30
- s.add_development_dependency 'bundler', '~> 1.3'
30
+ s.add_development_dependency 'bundler'
31
31
  s.add_development_dependency 'rake'
32
32
  s.add_development_dependency 'minitest'
33
33
  s.add_development_dependency 'webmock'
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmention
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
5
- prerelease:
4
+ version: 0.1.6
6
5
  platform: ruby
7
6
  authors:
8
7
  - Aaron Parecki
@@ -10,134 +9,118 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2014-05-25 00:00:00.000000000 Z
12
+ date: 2017-06-27 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: json
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
- - - ! '>='
18
+ - - ">="
21
19
  - !ruby/object:Gem::Version
22
20
  version: '0'
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
- - - ! '>='
25
+ - - ">="
29
26
  - !ruby/object:Gem::Version
30
27
  version: '0'
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: nokogiri
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - ">="
37
33
  - !ruby/object:Gem::Version
38
34
  version: '0'
39
35
  type: :runtime
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - ">="
45
40
  - !ruby/object:Gem::Version
46
41
  version: '0'
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: httparty
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ~>
46
+ - - "~>"
53
47
  - !ruby/object:Gem::Version
54
- version: 0.13.1
48
+ version: 0.15.5
55
49
  type: :runtime
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ~>
53
+ - - "~>"
61
54
  - !ruby/object:Gem::Version
62
- version: 0.13.1
55
+ version: 0.15.5
63
56
  - !ruby/object:Gem::Dependency
64
57
  name: link_header
65
58
  requirement: !ruby/object:Gem::Requirement
66
- none: false
67
59
  requirements:
68
- - - ~>
60
+ - - "~>"
69
61
  - !ruby/object:Gem::Version
70
62
  version: 0.0.8
71
63
  type: :runtime
72
64
  prerelease: false
73
65
  version_requirements: !ruby/object:Gem::Requirement
74
- none: false
75
66
  requirements:
76
- - - ~>
67
+ - - "~>"
77
68
  - !ruby/object:Gem::Version
78
69
  version: 0.0.8
79
70
  - !ruby/object:Gem::Dependency
80
71
  name: bundler
81
72
  requirement: !ruby/object:Gem::Requirement
82
- none: false
83
73
  requirements:
84
- - - ~>
74
+ - - ">="
85
75
  - !ruby/object:Gem::Version
86
- version: '1.3'
76
+ version: '0'
87
77
  type: :development
88
78
  prerelease: false
89
79
  version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
80
  requirements:
92
- - - ~>
81
+ - - ">="
93
82
  - !ruby/object:Gem::Version
94
- version: '1.3'
83
+ version: '0'
95
84
  - !ruby/object:Gem::Dependency
96
85
  name: rake
97
86
  requirement: !ruby/object:Gem::Requirement
98
- none: false
99
87
  requirements:
100
- - - ! '>='
88
+ - - ">="
101
89
  - !ruby/object:Gem::Version
102
90
  version: '0'
103
91
  type: :development
104
92
  prerelease: false
105
93
  version_requirements: !ruby/object:Gem::Requirement
106
- none: false
107
94
  requirements:
108
- - - ! '>='
95
+ - - ">="
109
96
  - !ruby/object:Gem::Version
110
97
  version: '0'
111
98
  - !ruby/object:Gem::Dependency
112
99
  name: minitest
113
100
  requirement: !ruby/object:Gem::Requirement
114
- none: false
115
101
  requirements:
116
- - - ! '>='
102
+ - - ">="
117
103
  - !ruby/object:Gem::Version
118
104
  version: '0'
119
105
  type: :development
120
106
  prerelease: false
121
107
  version_requirements: !ruby/object:Gem::Requirement
122
- none: false
123
108
  requirements:
124
- - - ! '>='
109
+ - - ">="
125
110
  - !ruby/object:Gem::Version
126
111
  version: '0'
127
112
  - !ruby/object:Gem::Dependency
128
113
  name: webmock
129
114
  requirement: !ruby/object:Gem::Requirement
130
- none: false
131
115
  requirements:
132
- - - ! '>='
116
+ - - ">="
133
117
  - !ruby/object:Gem::Version
134
118
  version: '0'
135
119
  type: :development
136
120
  prerelease: false
137
121
  version_requirements: !ruby/object:Gem::Requirement
138
- none: false
139
122
  requirements:
140
- - - ! '>='
123
+ - - ">="
141
124
  - !ruby/object:Gem::Version
142
125
  version: '0'
143
126
  description:
@@ -147,8 +130,8 @@ executables:
147
130
  extensions: []
148
131
  extra_rdoc_files: []
149
132
  files:
150
- - .gitignore
151
- - .travis.yml
133
+ - ".gitignore"
134
+ - ".travis.yml"
152
135
  - Gemfile
153
136
  - README.md
154
137
  - Rakefile
@@ -167,27 +150,26 @@ files:
167
150
  - webmention.gemspec
168
151
  homepage: https://github.com/indieweb/mention-client-ruby
169
152
  licenses: []
153
+ metadata: {}
170
154
  post_install_message:
171
155
  rdoc_options: []
172
156
  require_paths:
173
157
  - lib
174
158
  required_ruby_version: !ruby/object:Gem::Requirement
175
- none: false
176
159
  requirements:
177
- - - ! '>='
160
+ - - ">="
178
161
  - !ruby/object:Gem::Version
179
162
  version: 1.9.3
180
163
  required_rubygems_version: !ruby/object:Gem::Requirement
181
- none: false
182
164
  requirements:
183
- - - ! '>='
165
+ - - ">="
184
166
  - !ruby/object:Gem::Version
185
167
  version: '0'
186
168
  requirements: []
187
169
  rubyforge_project:
188
- rubygems_version: 1.8.23
170
+ rubygems_version: 2.5.2
189
171
  signing_key:
190
- specification_version: 3
172
+ specification_version: 4
191
173
  summary: A gem for sending webmention (and pingback) notifications
192
174
  test_files:
193
175
  - test/data/sample_html.rb