webmention 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ - 1.9.2
6
+ notifications:
7
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify gem's dependencies in webmention.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,67 @@
1
+ Webmention Client
2
+ =================
3
+
4
+ A Ruby gem for sending [webmention](http://indiewebcamp.com/webmention) (and [pingback](http://indiewebcamp.com/pingback)) notifications.
5
+
6
+ [![Build Status](https://travis-ci.org/icco/mention-client-ruby.png?branch=master)](https://travis-ci.org/icco/mention-client-ruby)
7
+
8
+ Installation
9
+ ------------
10
+
11
+ gem install webmention
12
+
13
+
14
+ Usage
15
+ -----
16
+
17
+ ### Send webmentions to all links on a page
18
+
19
+ ```ruby
20
+ client = Webmention::Client.new url
21
+ sent = client.send_mentions
22
+
23
+ puts "Sent #{sent} mentions"
24
+ ```
25
+
26
+ This will find all absolute links on the page at `url` and will attempt to send
27
+ mentions to each. This is accomplished by doing a HEAD request and looking at the headers
28
+ for supported servers, if none are found, then it searches the body of the page.
29
+
30
+ After finding either webmention or pingback endpoints, the request is sent to each.
31
+
32
+ ### Send webmention to a specific URL
33
+
34
+ ```ruby
35
+ # Discover the webmention endpoint of a target and send the mention
36
+
37
+ source = "http://source.example.com/post/100" # For example, your page
38
+ target = "http://indiewebcamp.com/" # The page you linked to
39
+
40
+ if endpoint = Webmention::Client.supports_webmention?(target)
41
+ Webmention::Client.send_mention endpoint, source, target
42
+ end
43
+ ```
44
+
45
+
46
+ Webmention
47
+ ----------
48
+
49
+ To learn more about Webmention, see [webmention.org](http://webmention.org).
50
+
51
+
52
+ License
53
+ -------
54
+
55
+ Copyright 2013 by Aaron Parecki
56
+
57
+ Licensed under the Apache License, Version 2.0 (the "License");
58
+ you may not use this file except in compliance with the License.
59
+ You may obtain a copy of the License at
60
+
61
+ http://www.apache.org/licenses/LICENSE-2.0
62
+
63
+ Unless required by applicable law or agreed to in writing, software
64
+ distributed under the License is distributed on an "AS IS" BASIS,
65
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
66
+ See the License for the specific language governing permissions and
67
+ limitations under the License.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs << 'lib/webmention'
6
+ t.test_files = FileList['test/lib/webmention/*_test.rb']
7
+ t.verbose = true
8
+ end
9
+
10
+ task :default => :test
data/example.rb ADDED
@@ -0,0 +1,20 @@
1
+ require './lib/webmention.rb'
2
+
3
+ # Send webmentions to any links on the page that have a webmention endpoint
4
+ url = 'http://aaronparecki.com/notes/2013/06/23/1/indiewebcamp'
5
+ client = Webmention::Client.new url
6
+ sent = client.send_mentions
7
+ puts "Sent #{sent} mentions"
8
+
9
+
10
+ # Discover the webmention endpoint of a target and send the mention
11
+ target = "http://indiewebcamp.com/"
12
+ endpoint = Webmention::Client.supports_webmention? target
13
+ if endpoint
14
+ Webmention::Client.send_mention endpoint, "http://source.example.com/post/100", target
15
+ end
16
+
17
+
18
+ # You can also use the client to send to a specific webmention endpoint
19
+ Webmention::Client.send_mention "http://webmention.io/example/webmention", "http://source.example.com/post/100", "http://target.example.com/post/100"
20
+
data/lib/webmention.rb CHANGED
@@ -1,2 +1,9 @@
1
1
  require 'json'
2
+ require 'net/http'
3
+ require 'nokogiri'
4
+ require 'open-uri'
5
+ require 'set'
6
+ require 'uri'
7
+
8
+ require 'webmention/version'
2
9
  require 'webmention/client'
@@ -0,0 +1,170 @@
1
+ module Webmention
2
+ class Client
3
+ # Public: Returns a URI of the url initialized with.
4
+ attr_reader :url
5
+
6
+ # Public: Returns an array of links contained within the url.
7
+ attr_reader :links
8
+
9
+ # Public: Create a new client
10
+ #
11
+ # url - The url you want us to crawl.
12
+ def initialize(url)
13
+ @url = URI.parse(url)
14
+ @links ||= Set.new
15
+
16
+ unless Webmention::Client.valid_http_url? @url
17
+ raise ArgumentError.new "#{@url} is not a valid HTTP or HTTPS URI."
18
+ end
19
+ end
20
+
21
+ # Public: Crawl the url this client was initialized with.
22
+ #
23
+ # Returns the number of links found.
24
+ def crawl
25
+ @links ||= Set.new
26
+ if @url.nil?
27
+ raise ArgumentError.new "url is nil."
28
+ end
29
+
30
+ Nokogiri::HTML(open(self.url)).css('a').each do |link|
31
+ link = link.attribute('href').to_s
32
+ if Webmention::Client.valid_http_url? link
33
+ @links.add link
34
+ end
35
+ end
36
+
37
+ return @links.count
38
+ end
39
+
40
+ # Public: Sends mentions to each of the links found in the page.
41
+ #
42
+ # Returns the number of links mentioned.
43
+ def send_mentions
44
+ if self.links.nil? or self.links.empty?
45
+ self.crawl
46
+ end
47
+
48
+ cnt = 0
49
+ self.links.each do |link|
50
+ endpoint = Webmention::Client.supports_webmention? link
51
+ if endpoint
52
+ cnt += 1 if Webmention::Client.send_mention endpoint, self.url, link
53
+ end
54
+ end
55
+
56
+ return cnt
57
+ end
58
+
59
+ # Public: Send a mention to an endoint about a link from a link.
60
+ #
61
+ # endpoint - URL to send mention to.
62
+ # source - Source of mention (your page).
63
+ # target - The link that was mentioned in the source page.
64
+ #
65
+ # Returns a boolean.
66
+ def self.send_mention endpoint, source, target
67
+ data = {
68
+ :source => source,
69
+ :target => target,
70
+ }
71
+
72
+ uri = URI.parse(endpoint)
73
+ http = Net::HTTP.new(uri.host, uri.port)
74
+
75
+ request = Net::HTTP::Post.new(uri.request_uri)
76
+ request.set_form_data(data)
77
+ request['Content-Type'] = "application/x-www-form-urlencoded"
78
+ request['Accept'] = 'application/json'
79
+ response = http.request(request)
80
+
81
+ return response.code.to_i == 200
82
+ end
83
+
84
+ # Public: Fetch a url and check if it supports webmention
85
+ #
86
+ # url - URL to check
87
+ #
88
+ # Returns false if does not support webmention, returns string
89
+ # of url to ping if it does.
90
+ def self.supports_webmention? url
91
+ return false if !Webmention::Client.valid_http_url? url
92
+
93
+ doc = nil
94
+
95
+ begin
96
+ uri = URI.parse(url)
97
+ http = Net::HTTP.new(uri.host, uri.port)
98
+ http.open_timeout = 3 # in seconds
99
+ http.read_timeout = 3 # in seconds
100
+
101
+ request = Net::HTTP::Get.new(uri.request_uri)
102
+ # Send a user agent like a browser because some sites seem to reject requests made by non-browsers
103
+ request["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 (https://rubygems.org/gems/webmention)"
104
+ request["Accept"] = "*/*"
105
+
106
+ response = http.request(request)
107
+
108
+ # First check the HTTP Headers
109
+ if !response['Link'].nil?
110
+ endpoint = self.discover_webmention_endpoint_from_header response['Link']
111
+ return endpoint if endpoint
112
+ end
113
+
114
+ # Do we support webmention?
115
+ endpoint = self.discover_webmention_endpoint_from_html response.body.to_s
116
+ return endpoint if endpoint
117
+
118
+ # TODO: Move to supports_pingback? method
119
+ # Last chance, do we support Pingback?
120
+ # if !doc.css('link[rel="pingback"]').empty?
121
+ # return doc.css('link[rel="pingback"]').attribute("href").value
122
+ # end
123
+
124
+ rescue EOFError
125
+ rescue Errno::ECONNRESET
126
+ end
127
+
128
+ return false
129
+ end
130
+
131
+ def self.discover_webmention_endpoint_from_html html
132
+ doc = Nokogiri::HTML(html)
133
+ if !doc.css('link[rel="webmention"]').empty?
134
+ doc.css('link[rel="webmention"]').attribute("href").value
135
+ elsif !doc.css('link[rel="http://webmention.org/"]').empty?
136
+ doc.css('link[rel="http://webmention.org/"]').attribute("href").value
137
+ elsif !doc.css('link[rel="http://webmention.org"]').empty?
138
+ doc.css('link[rel="http://webmention.org"]').attribute("href").value
139
+ else
140
+ false
141
+ end
142
+ end
143
+
144
+ def self.discover_webmention_endpoint_from_header header
145
+ if matches = header.match(%r{<(https?://[^>]+)>; rel="webmention"})
146
+ return matches[1]
147
+ elsif matches = header.match(%r{rel="webmention"; <(https?://[^>]+)>})
148
+ return matches[1]
149
+ elsif matches = header.match(%r{<(https?://[^>]+)>; rel="http://webmention\.org/?"})
150
+ return matches[1]
151
+ elsif matches = header.match(%r{rel="http://webmention\.org/?"; <(https?://[^>]+)>})
152
+ return matches[1]
153
+ end
154
+ return false
155
+ end
156
+
157
+ # Public: Use URI to parse a url and check if it is HTTP or HTTPS.
158
+ #
159
+ # url - URL to check
160
+ #
161
+ # Returns a boolean.
162
+ def self.valid_http_url? url
163
+ if url.is_a? String
164
+ url = URI.parse(url)
165
+ end
166
+
167
+ return (url.is_a? URI::HTTP or url.is_a? URI::HTTPS)
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,3 @@
1
+ module Webmention
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,77 @@
1
+ class SampleData
2
+
3
+ def self.rel_webmention_href
4
+ <<-eos
5
+ <html>
6
+ <head>
7
+ <link rel="webmention" href="http://webmention.io/example/webmention">
8
+ </head>
9
+ </html>
10
+ eos
11
+ end
12
+
13
+ def self.rel_href_webmention
14
+ <<-eos
15
+ <html>
16
+ <head>
17
+ <link href="http://webmention.io/example/webmention" rel="webmention">
18
+ </head>
19
+ </html>
20
+ eos
21
+ end
22
+
23
+ def self.rel_webmention_org_href
24
+ <<-eos
25
+ <html>
26
+ <head>
27
+ <link rel="http://webmention.org" href="http://webmention.io/example/webmention">
28
+ </head>
29
+ </html>
30
+ eos
31
+ end
32
+
33
+ def self.rel_href_webmention_org
34
+ <<-eos
35
+ <html>
36
+ <head>
37
+ <link href="http://webmention.io/example/webmention" rel="http://webmention.org">
38
+ </head>
39
+ </html>
40
+ eos
41
+ end
42
+
43
+ def self.rel_webmention_org_slash_href
44
+ <<-eos
45
+ <html>
46
+ <head>
47
+ <link rel="http://webmention.org/" href="http://webmention.io/example/webmention">
48
+ </head>
49
+ </html>
50
+ eos
51
+ end
52
+
53
+ def self.rel_href_webmention_org_slash
54
+ <<-eos
55
+ <html>
56
+ <head>
57
+ <link href="http://webmention.io/example/webmention" rel="http://webmention.org/">
58
+ </head>
59
+ </html>
60
+ eos
61
+ end
62
+
63
+ def self.sample_source_post_html
64
+ <<-eos
65
+ <html>
66
+ <head>
67
+ <title>Sample Post</title>
68
+ </head>
69
+ <body>
70
+ <p><a href="http://target.example.com/post/4">Link to Target 4</a></p>
71
+ <p><a href="http://target.example.com/post/5">Link to Target 5</a></p>
72
+ </body>
73
+ </html>
74
+ eos
75
+ end
76
+
77
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe Webmention::Client do
4
+ before do
5
+ WebMock.stub_request(:any, 'http://source.example.com/post/100').to_return(
6
+ :status => 200,
7
+ :body => SampleData.sample_source_post_html,
8
+ :headers => {}
9
+ )
10
+
11
+ @client = Webmention::Client.new "http://source.example.com/post/100"
12
+ end
13
+
14
+ describe "#crawl" do
15
+ describe "when a valid url" do
16
+ it "should return a count and list of links" do
17
+ @client.crawl.must_be :>, 0
18
+ @client.links.must_include 'http://target.example.com/post/4'
19
+ @client.links.must_include 'http://target.example.com/post/5'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,88 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe Webmention::Client do
4
+ before do
5
+ WebMock.stub_request(:any, 'http://example.com/header').to_return(
6
+ :status => 200,
7
+ :body => '<html>example</html>',
8
+ :headers => {
9
+ 'Link' => 'rel="webmention"; <http://webmention.io/example/webmention>'
10
+ }
11
+ )
12
+
13
+ WebMock.stub_request(:any, 'http://example.com/html').to_return(
14
+ :status => 200,
15
+ :body => '<html><head><link rel="webmention" href="http://webmention.io/example/webmention"></head><body>example</body></html>'
16
+ )
17
+
18
+ WebMock.stub_request(:any, 'http://example.com/none').to_return(
19
+ :status => 200,
20
+ :body => '<html><head></head><body>example</body></html>'
21
+ )
22
+ end
23
+
24
+ describe "#discover_webmention_endpoint_from_url" do
25
+ it "should find endpoint from html head" do
26
+ Webmention::Client.supports_webmention?("http://example.com/html").must_equal "http://webmention.io/example/webmention"
27
+ end
28
+
29
+ it "should find endpoint from http header" do
30
+ Webmention::Client.supports_webmention?("http://example.com/header").must_equal "http://webmention.io/example/webmention"
31
+ end
32
+
33
+ it "should return false when no endpoint found" do
34
+ Webmention::Client.supports_webmention?("http://example.com/none").must_equal false
35
+ end
36
+ end
37
+
38
+ describe "#discover_webmention_endpoint_from_string" do
39
+ it "should find rel=webmention followed by href in header" do
40
+ Webmention::Client.discover_webmention_endpoint_from_header('rel="webmention"; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
41
+ end
42
+
43
+ it "should find href followed by rel=webmention in header" do
44
+ Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel="webmention"').must_equal "http://webmention.io/example/webmention"
45
+ end
46
+
47
+ it "should find rel=http://webmention.org followed by href in header" do
48
+ Webmention::Client.discover_webmention_endpoint_from_header('rel="http://webmention.org"; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
49
+ end
50
+
51
+ it "should find href followed by rel=http://webmention.org in header" do
52
+ Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel="http://webmention.org"').must_equal "http://webmention.io/example/webmention"
53
+ end
54
+
55
+ it "should find rel=http://webmention.org/ followed by href in header" do
56
+ Webmention::Client.discover_webmention_endpoint_from_header('rel="http://webmention.org/"; <http://webmention.io/example/webmention>').must_equal "http://webmention.io/example/webmention"
57
+ end
58
+
59
+ it "should find href followed by rel=http://webmention.org/ in header" do
60
+ Webmention::Client.discover_webmention_endpoint_from_header('<http://webmention.io/example/webmention>; rel="http://webmention.org"').must_equal "http://webmention.io/example/webmention"
61
+ end
62
+
63
+ it "should find rel=webmention followed by href in html" do
64
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_webmention_href).must_equal "http://webmention.io/example/webmention"
65
+ end
66
+
67
+ it "should find href followed by rel=webmention in html" do
68
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_href_webmention).must_equal "http://webmention.io/example/webmention"
69
+ end
70
+
71
+ it "should find rel=http://webmention.org followed by href in html" do
72
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_webmention_org_href).must_equal "http://webmention.io/example/webmention"
73
+ end
74
+
75
+ it "should find href followed by rel=http://webmention.org in html" do
76
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_href_webmention_org).must_equal "http://webmention.io/example/webmention"
77
+ end
78
+
79
+ it "should find rel=http://webmention.org/ followed by href in html" do
80
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_webmention_org_slash_href).must_equal "http://webmention.io/example/webmention"
81
+ end
82
+
83
+ it "should find href followed by rel=http://webmention.org/ in html" do
84
+ Webmention::Client.discover_webmention_endpoint_from_html(SampleData.rel_href_webmention_org_slash).must_equal "http://webmention.io/example/webmention"
85
+ end
86
+ end
87
+
88
+ end
@@ -0,0 +1,38 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe Webmention::Client do
4
+ before do
5
+ WebMock.stub_request(:any, 'http://source.example.com/post/100').to_return(
6
+ :status => 200,
7
+ :body => SampleData.sample_source_post_html,
8
+ :headers => {}
9
+ )
10
+
11
+ WebMock.stub_request(:any, 'http://target.example.com/post/4').to_return(
12
+ :status => 200,
13
+ :body => SampleData.rel_webmention_href,
14
+ :headers => {}
15
+ )
16
+
17
+ WebMock.stub_request(:any, 'http://target.example.com/post/5').to_return(
18
+ :status => 200,
19
+ :body => '',
20
+ :headers => {
21
+ 'Link' => 'rel="webmention"; <http://webmention.io/example/webmention>'
22
+ }
23
+ )
24
+
25
+ WebMock.stub_request(:any, 'http://webmention.io/example/webmention').to_return(
26
+ :status => 200
27
+ )
28
+
29
+ @client = Webmention::Client.new "http://source.example.com/post/100"
30
+ end
31
+
32
+ describe "#send_mentions" do
33
+ it "should return number of mentions sent" do
34
+ @client = Webmention::Client.new "http://source.example.com/post/100"
35
+ @client.send_mentions.must_equal 2
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe Webmention::Client do
4
+ describe "#new" do
5
+ describe "when a valid url" do
6
+ it "should not throw an error for http" do
7
+ client = Webmention::Client.new "http://google.com"
8
+ client.url.must_equal URI.parse("http://google.com")
9
+ end
10
+
11
+ it "should not throw an error for https" do
12
+ client = Webmention::Client.new "https://google.com"
13
+ client.url.must_equal URI.parse("https://google.com")
14
+ end
15
+ end
16
+
17
+ describe "when an invalid url" do
18
+ it "should raise an error for ftp" do
19
+ lambda do
20
+ Webmention::Client.new "ftp://google.com"
21
+ end.must_raise(ArgumentError)
22
+ end
23
+
24
+ it "should raise an error for no protocol" do
25
+ lambda do
26
+ Webmention::Client.new "google.com"
27
+ end.must_raise(ArgumentError)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../../test_helper'
2
+
3
+ describe Webmention do
4
+
5
+ it "must be defined" do
6
+ Webmention::VERSION.wont_be_nil
7
+ end
8
+
9
+ end
@@ -0,0 +1,5 @@
1
+ require 'minitest/autorun'
2
+ require 'webmock/minitest'
3
+
4
+ require File.expand_path('../../lib/webmention.rb', __FILE__)
5
+ require File.expand_path('../data/sample_html.rb', __FILE__)
@@ -0,0 +1,30 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'webmention/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'webmention'
7
+ s.version = Webmention::VERSION
8
+ s.date = '2013-09-14'
9
+ s.homepage = 'https://github.com/indieweb/mention-client-ruby'
10
+ s.summary = 'A gem for sending webmention (and pingback) notifications'
11
+ s.authors = [
12
+ 'Aaron Parecki',
13
+ 'Nat Welch'
14
+ ]
15
+
16
+ s.email = 'aaron@parecki.com'
17
+
18
+ s.files = `git ls-files`.split($/)
19
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
21
+ s.require_paths = ['lib']
22
+
23
+ s.add_dependency 'json'
24
+ s.add_dependency 'nokogiri'
25
+
26
+ s.add_development_dependency 'bundler', '~> 1.3'
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'minitest'
29
+ s.add_development_dependency 'webmock'
30
+ end
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webmention
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Aaron Parecki
9
+ - Nat Welch
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-07-02 00:00:00.000000000 Z
13
+ date: 2013-09-14 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: json
@@ -28,7 +29,7 @@ dependencies:
28
29
  - !ruby/object:Gem::Version
29
30
  version: '0'
30
31
  - !ruby/object:Gem::Dependency
31
- name: rest-client
32
+ name: nokogiri
32
33
  requirement: !ruby/object:Gem::Requirement
33
34
  none: false
34
35
  requirements:
@@ -43,13 +44,93 @@ dependencies:
43
44
  - - ! '>='
44
45
  - !ruby/object:Gem::Version
45
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '1.3'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: minitest
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: webmock
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
46
111
  description:
47
112
  email: aaron@parecki.com
48
113
  executables: []
49
114
  extensions: []
50
115
  extra_rdoc_files: []
51
116
  files:
117
+ - .gitignore
118
+ - .travis.yml
119
+ - Gemfile
120
+ - README.md
121
+ - Rakefile
122
+ - example.rb
52
123
  - lib/webmention.rb
124
+ - lib/webmention/client.rb
125
+ - lib/webmention/version.rb
126
+ - test/data/sample_html.rb
127
+ - test/lib/webmention/crawl_test.rb
128
+ - test/lib/webmention/discovery_test.rb
129
+ - test/lib/webmention/mention_test.rb
130
+ - test/lib/webmention/url_test.rb
131
+ - test/lib/webmention/version_test.rb
132
+ - test/test_helper.rb
133
+ - webmention.gemspec
53
134
  homepage: https://github.com/indieweb/mention-client-ruby
54
135
  licenses: []
55
136
  post_install_message:
@@ -74,5 +155,12 @@ rubygems_version: 1.8.23
74
155
  signing_key:
75
156
  specification_version: 3
76
157
  summary: A gem for sending webmention (and pingback) notifications
77
- test_files: []
158
+ test_files:
159
+ - test/data/sample_html.rb
160
+ - test/lib/webmention/crawl_test.rb
161
+ - test/lib/webmention/discovery_test.rb
162
+ - test/lib/webmention/mention_test.rb
163
+ - test/lib/webmention/url_test.rb
164
+ - test/lib/webmention/version_test.rb
165
+ - test/test_helper.rb
78
166
  has_rdoc: