em-redfinger 0.1.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.
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format nested
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Intridea, Inc. and Michael Bleigh
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ EM-Redfinger
2
+ ============
3
+
4
+ This library is an exeperimental EventMachine version of the simple
5
+ [redfinger](https://github.com/intridea/redfinger) ruby lib. The logic
6
+ is *exactly* the same as I've just changed HTTP calls to no use
7
+ rest-client, and hooked a bunch of callback here and there.
8
+
9
+ EM::Redfinger is a simple Ruby library built to consume the Webfinger
10
+ protocol using EventMachine. It's simple!
11
+
12
+ For more information about Webfinger, see:
13
+
14
+ * http://hueniverse.com/2009/08/introducing-webfinger/
15
+ * http://code.google.com/p/webfinger/
16
+
17
+ Installation
18
+ ------------
19
+
20
+ EM-Redfinger is a gem:
21
+
22
+ gem install em-redfinger
23
+
24
+ Usage
25
+ -----
26
+
27
+ Just call it with an e-mail address of a domain that provides the Webfinger protocol:
28
+
29
+ ~~~~~ ruby
30
+ require 'em-redfinger'
31
+
32
+ EM::Redfinger.finger('youraccount@joindiaspora.com') do |finger|
33
+ # ...
34
+ end
35
+ ~~~~~
36
+
37
+ From there, you have access to the links provided in the response as
38
+ well as some shortcuts for common uses:
39
+
40
+ ~~~~~ ruby
41
+ Redfinger.finger('youraccount@joindiaspora.com') do |finger|
42
+ finger.hcard.first.to_s # => "https://joindiaspora.com/hcard/users/you"
43
+ end
44
+ ~~~~~
45
+
46
+ Links are simple hash based objects that store the 'rel' URI (such as
47
+ that for hCard, OpenID, etc.), the 'href' (the actual destination URI),
48
+ and the content type if specified. Note you can also just use `#to_s` on
49
+ a link to get the destination URI.
50
+
51
+ So how can you use Webfinger to your advantage? Let's take the example
52
+ of hCard. If you install the `mofo` library you can do this:
53
+
54
+ ~~~~~ ruby
55
+ require 'mofo'
56
+ require 'em-redfinger'
57
+
58
+ EM::Redfinger.finger('example@joindiaspora.com') do |finger|
59
+ hcard_uri = finger.hcard.first.to_s
60
+ hcard = hCard.find(hcard_uri)
61
+ hcard.fn # => "Example Guy"
62
+ hcard.title # => "Title guy gave himself on Google profile"
63
+ end
64
+ ~~~~~
65
+
66
+ Note that the Webfinger protocol is still in its alpha/infancy and there
67
+ will likely be many changes as time progresses. This library will do
68
+ its best to stay up-to-date and current with these changes over time.
69
+
70
+ Note on Patches/Pull Requests
71
+ -----------------------------
72
+
73
+ * Fork the project.
74
+ * Make your feature addition or bug fix.
75
+ * Add tests for it. This is important so I don't break it in a
76
+ future version unintentionally.
77
+ * Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
78
+ * Send me a pull request. Bonus points for topic branches.
79
+
80
+ Copyright
81
+ ---------
82
+
83
+ Copyright (c) 2011 Intridea, Inc. and Michael Bleigh. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "em-redfinger"
8
+ gem.summary = %Q{A Ruby WebFinger client.}
9
+ gem.description = %Q{A Ruby Webfinger client}
10
+ gem.email = "oz@cyprio.net"
11
+ gem.homepage = "http://github.com/oz/em-redfinger"
12
+ gem.authors = ["Michael Bleigh", "Arnaud Berthomier"]
13
+ gem.add_dependency(%q<em-http-request>, ">= 1.0.0")
14
+ gem.add_dependency(%q<em-http-request>, ">= 1.0.0")
15
+ gem.add_dependency "nokogiri", ">= 1.4.0"
16
+ gem.add_dependency "hashie"
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
22
+
23
+ require 'rspec/core/rake_task'
24
+ RSpec::Core::RakeTask.new(:spec)
25
+
26
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
27
+ spec.rcov = true
28
+ end
29
+
30
+ task :spec => :check_dependencies
31
+ task :default => :spec
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "em-redfinger"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Bleigh", "Arnaud Berthomier"]
12
+ s.date = "2011-11-10"
13
+ s.description = "A Ruby Webfinger client"
14
+ s.email = "oz@cyprio.net"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".rspec",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "em-redfinger.gemspec",
26
+ "lib/em-redfinger.rb",
27
+ "lib/em-redfinger/client.rb",
28
+ "lib/em-redfinger/finger.rb",
29
+ "lib/em-redfinger/link.rb",
30
+ "lib/em-redfinger/link_helpers.rb",
31
+ "redfinger.gemspec",
32
+ "spec/redfinger/client_spec.rb",
33
+ "spec/redfinger_spec.rb",
34
+ "spec/spec.opts",
35
+ "spec/spec_helper.rb"
36
+ ]
37
+ s.homepage = "http://github.com/oz/em-redfinger"
38
+ s.require_paths = ["lib"]
39
+ s.rubygems_version = "1.8.10"
40
+ s.summary = "A Ruby WebFinger client."
41
+
42
+ if s.respond_to? :specification_version then
43
+ s.specification_version = 3
44
+
45
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
+ s.add_runtime_dependency(%q<em-http-request>, [">= 1.0.0"])
47
+ s.add_runtime_dependency(%q<em-http-request>, [">= 1.0.0"])
48
+ s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.0"])
49
+ s.add_runtime_dependency(%q<hashie>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<em-http-request>, [">= 1.0.0"])
52
+ s.add_dependency(%q<em-http-request>, [">= 1.0.0"])
53
+ s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
54
+ s.add_dependency(%q<hashie>, [">= 0"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<em-http-request>, [">= 1.0.0"])
58
+ s.add_dependency(%q<em-http-request>, [">= 1.0.0"])
59
+ s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
60
+ s.add_dependency(%q<hashie>, [">= 0"])
61
+ end
62
+ end
63
+
@@ -0,0 +1,26 @@
1
+ require 'eventmachine'
2
+ require 'em-http'
3
+
4
+ require 'em-redfinger/link_helpers'
5
+ require 'em-redfinger/link'
6
+ require 'em-redfinger/finger'
7
+ require 'em-redfinger/client'
8
+
9
+ module EventMachine
10
+ module Redfinger
11
+ class ResourceNotFound < StandardError; end
12
+ # A SecurityException occurs when something in the
13
+ # webfinger process does not appear safe, such as
14
+ # mismatched domains or an unverified XRD signature.
15
+ class SecurityException < StandardError; end
16
+
17
+ # There's no LRDD template attribute available in the requested
18
+ # account.
19
+ class NoLRDDTemplate < StandardError; end
20
+
21
+ # Finger the provided e-mail address.
22
+ def self.finger(email)
23
+ EM::Redfinger::Client.new(email).finger { |finger| yield finger }
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,82 @@
1
+ require 'em-http-request'
2
+ require 'nokogiri'
3
+ require 'uri'
4
+
5
+ module EM
6
+ module Redfinger
7
+ class Client
8
+ attr_accessor :account, :domain, :uri_template, :xrd_timeout, :xrd_open_timeout
9
+
10
+ def initialize(email, uri_template = nil)
11
+ self.account = normalize(email)
12
+ self.domain = account.split('@').last
13
+ self.xrd_timeout = 10
14
+ self.xrd_open_timeout = 5
15
+ end
16
+
17
+ def finger
18
+ retrieve_template_from_xrd do
19
+ url = swizzle
20
+ tries = 0
21
+ begin
22
+ tries += 1
23
+ http = EM::HttpRequest.new(url).get
24
+ http.callback {
25
+ raise Redfinger::ResourceNotFound if http.response_header.status == 404
26
+ yield Finger.new self.account, http.response
27
+ }
28
+ rescue Redfinger::ResourceNotFound
29
+ url = swizzle(account_with_scheme)
30
+ retry if tries < 2
31
+ raise Redfinger::ResourceNotFound
32
+ end
33
+ end
34
+ end
35
+
36
+ def xrd_url(ssl = true)
37
+ "http#{ 's' if ssl }://#{ domain }/.well-known/host-meta"
38
+ end
39
+
40
+ private
41
+
42
+ def swizzle(account = nil)
43
+ retrieve_template_from_xrd { |uri_template|
44
+ account ||= self.account
45
+ uri_template.gsub '{uri}', URI.escape(self.account)
46
+ }
47
+ end
48
+
49
+ def retrieve_template_from_xrd(ssl = true, &block)
50
+ return yield(self.uri_template) if self.uri_template
51
+
52
+ http = EM::HttpRequest.new(xrd_url(ssl),
53
+ :connect_timeout => self.xrd_open_timeout,
54
+ :inactivity_timeout => self.xrd_timeout
55
+ ).get
56
+ http.callback {
57
+ if http.response_header.status != 200
58
+ raise Redfinger::ResourceNotFound, 'Unable to find the host XRD file.'
59
+ end
60
+ doc = Nokogiri::XML::Document.parse(http.response)
61
+ lrdd = doc.at('Link[rel=lrdd]')
62
+ raise Redfinger::NoLRDDTemplate if lrdd.nil?
63
+
64
+ self.uri_template = lrdd.attribute('template').value
65
+ yield self.uri_template
66
+ }
67
+ http.errback {
68
+ raise Redfinger::ResourceNotFound, 'Unable to find the host XRD file.'
69
+ }
70
+ end
71
+
72
+ def normalize(email)
73
+ email.sub! /^acct:/, ''
74
+ email.downcase
75
+ end
76
+
77
+ def account_with_scheme
78
+ 'acct:' + account
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,26 @@
1
+ require 'nokogiri'
2
+
3
+ module EM
4
+ module Redfinger
5
+ # The result of a Webfinger. For more information about
6
+ # special helpers that are availale to pull specific types
7
+ # of URLs, see Redfinger::LinkHelpers
8
+ class Finger
9
+ def initialize(subject, xml) # :nodoc:
10
+ @doc = Nokogiri::XML::Document.parse(xml)
11
+ @subject = subject
12
+ end
13
+
14
+ # All of the links provided by the Webfinger response.
15
+ def links
16
+ @links ||= @doc.css('Link').map{|l| Link.from_xml(l)}
17
+ end
18
+
19
+ def inspect # :nodoc:
20
+ "<#Redfinger::Finger subject=\"#{@subject}\">"
21
+ end
22
+
23
+ include Redfinger::LinkHelpers
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ require 'nokogiri'
2
+ require 'hashie'
3
+
4
+ module EM
5
+ module Redfinger
6
+ class Link < Hashie::Mash
7
+ def self.from_xml(xml_link)
8
+ new_link = Link.new
9
+ new_link[:rel] = xml_link['rel']
10
+ new_link[:href] = xml_link['href']
11
+ new_link[:type] = xml_link['type']
12
+ new_link
13
+ end
14
+
15
+ # Outputs the URL of the link, useful for using
16
+ # a Link directly in other libraries.
17
+ def to_s
18
+ self.href
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ require 'nokogiri'
2
+
3
+ module EM
4
+ module Redfinger
5
+ module LinkHelpers
6
+ # An array of links with hCard information about this e-mail address.
7
+ def hcard
8
+ relmap('http://microformats.org/profile/hcard')
9
+ end
10
+
11
+ # An array of links of OpenID providers for this e-mail address.
12
+ def open_id
13
+ relmap('http://specs.openid.net/auth/', true)
14
+ end
15
+
16
+ # An array of links to profile pages belonging to this e-mail address.
17
+ def profile_page
18
+ relmap('http://webfinger.net/rel/profile-page')
19
+ end
20
+
21
+ # An array of links to XFN compatible URLs for this e-mail address.
22
+ def xfn
23
+ relmap('http://gmpg.org/xfn/', true)
24
+ end
25
+
26
+ protected
27
+
28
+ def relmap(uri, substring=false)
29
+ @doc.css("Link[rel#{'^' if substring}=\"#{uri}\"]").map{|e| Link.from_xml(e)}
30
+ end
31
+ end
32
+ end
33
+ end
data/redfinger.gemspec ADDED
@@ -0,0 +1,65 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "redfinger"
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Michael Bleigh"]
12
+ s.date = "2011-11-10"
13
+ s.description = "A Ruby Webfinger client"
14
+ s.email = "michael@intridea.com"
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".rspec",
21
+ "LICENSE",
22
+ "README.md",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "em-redfinger.gemspec",
26
+ "lib/em-redfinger.rb",
27
+ "lib/em-redfinger/client.rb",
28
+ "lib/em-redfinger/finger.rb",
29
+ "lib/em-redfinger/link.rb",
30
+ "lib/em-redfinger/link_helpers.rb",
31
+ "spec/redfinger/client_spec.rb",
32
+ "spec/redfinger_spec.rb",
33
+ "spec/spec.opts",
34
+ "spec/spec_helper.rb"
35
+ ]
36
+ s.homepage = "http://github.com/mbleigh/redfinger"
37
+ s.require_paths = ["lib"]
38
+ s.rubygems_version = "1.8.10"
39
+ s.summary = "A Ruby WebFinger client."
40
+
41
+ if s.respond_to? :specification_version then
42
+ s.specification_version = 3
43
+
44
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
45
+ s.add_runtime_dependency(%q<rest-client>, [">= 1.5.0"])
46
+ s.add_runtime_dependency(%q<nokogiri>, [">= 1.4.0"])
47
+ s.add_runtime_dependency(%q<hashie>, [">= 0"])
48
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
49
+ s.add_development_dependency(%q<webmock>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<rest-client>, [">= 1.5.0"])
52
+ s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
53
+ s.add_dependency(%q<hashie>, [">= 0"])
54
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
55
+ s.add_dependency(%q<webmock>, [">= 0"])
56
+ end
57
+ else
58
+ s.add_dependency(%q<rest-client>, [">= 1.5.0"])
59
+ s.add_dependency(%q<nokogiri>, [">= 1.4.0"])
60
+ s.add_dependency(%q<hashie>, [">= 0"])
61
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
62
+ s.add_dependency(%q<webmock>, [">= 0"])
63
+ end
64
+ end
65
+
@@ -0,0 +1,85 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ class HaltSuccessError < StandardError; end
4
+
5
+ describe Redfinger::Client do
6
+ describe '#new' do
7
+ it 'should remove acct: if it is already in URI form' do
8
+ Redfinger::Client.new('acct:abc@example.com').account.should == 'abc@example.com'
9
+ end
10
+
11
+ it 'should set the domain to whatevers after the @ sign' do
12
+ Redfinger::Client.new('abc@example.com').domain.should == 'example.com'
13
+ Redfinger::Client.new('abc@frog.co.uk').domain.should == 'frog.co.uk'
14
+ end
15
+ end
16
+
17
+ describe '#retrieve_template_from_xrd' do
18
+ it 'should make an SSL request to get the host XRD document' do
19
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_raise(HaltSuccessError)
20
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(HaltSuccessError)
21
+ end
22
+
23
+ it 'should make an HTTP request if HTTPS cannot connect' do
24
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_raise(Errno::ECONNREFUSED)
25
+ stub_request(:get, 'http://example.com/.well-known/host-meta').to_raise(HaltSuccessError)
26
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(HaltSuccessError)
27
+ end
28
+
29
+ it 'should make an HTTP request if the HTTPS request times out in Net::HTTP' do
30
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_raise(Errno::ETIMEDOUT)
31
+ stub_request(:get, 'http://example.com/.well-known/host-meta').to_raise(HaltSuccessError)
32
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(HaltSuccessError)
33
+ end
34
+
35
+ it 'should make an HTTP request if the HTTPS request times out in RestClient' do
36
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_raise(RestClient::RequestTimeout)
37
+ stub_request(:get, 'http://example.com/.well-known/host-meta').to_raise(HaltSuccessError)
38
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(HaltSuccessError)
39
+ end
40
+
41
+ it 'should make an HTTP request if the server throws a 403 forbidden on the HTTPS request' do
42
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_return(:status => [403, "Forbidden"])
43
+ stub_request(:get, 'http://example.com/.well-known/host-meta').to_raise(HaltSuccessError)
44
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(HaltSuccessError)
45
+ end
46
+
47
+ it 'should raise Redfinger::ResourceNotFound if HTTP fails as well' do
48
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_raise(Errno::ECONNREFUSED)
49
+ stub_request(:get, 'http://example.com/.well-known/host-meta').to_raise(Errno::ECONNREFUSED)
50
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(Redfinger::ResourceNotFound)
51
+ end
52
+
53
+ it 'should raise Redfinger::ResourceNotFound on 404 as well as HTTP fail' do
54
+ stub_request(:get, /.well-known\/host-meta/).to_return(:status => 404, :body => '404 Not Found')
55
+ lambda{Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd)}.should raise_error(Redfinger::ResourceNotFound)
56
+ end
57
+
58
+ it 'should return the template' do
59
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_return(:status => 200, :body => host_xrd)
60
+ Redfinger::Client.new('acct:abc@example.com').send(:retrieve_template_from_xrd).should == 'http://example.com/webfinger/?q={uri}'
61
+ end
62
+ end
63
+
64
+ describe '#finger' do
65
+ it 'should fetch the URI template if is not set' do
66
+ stub_success
67
+ @client = Redfinger::Client.new('abc@example.com')
68
+ @client.should_receive(:retrieve_template_from_xrd).and_raise(HaltSuccessError)
69
+ lambda{@client.finger}.should raise_error(HaltSuccessError)
70
+ end
71
+
72
+ it 'should NOT fetch the URI template if it is already set' do
73
+ stub_success
74
+ @client = Redfinger::Client.new('abc@example.com')
75
+ @client.should_not_receive(:retrieve_template_from_xrd)
76
+ @client.uri_template = 'http://example.com/webfinger/?q={uri}'
77
+ @client.finger
78
+ end
79
+
80
+ it 'should return a Finger' do
81
+ stub_success
82
+ Redfinger::Client.new('abc@example.com').finger.should be_kind_of(Redfinger::Finger)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,10 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe Redfinger do
4
+ describe '#finger' do
5
+ it 'should initialize a new client' do
6
+ Redfinger::Client.should_receive(:new).with('abc@example.com').and_return(mock("Redfinger::Client", :finger => nil))
7
+ Redfinger.finger('abc@example.com')
8
+ end
9
+ end
10
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,48 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'rubygems'
5
+ require 'redfinger'
6
+ require 'rspec'
7
+ require 'rspec/autorun'
8
+ require 'webmock/rspec'
9
+
10
+ include WebMock::API
11
+
12
+ def host_xrd
13
+ <<-XML
14
+ <?xml version='1.0' encoding='UTF-8'?>
15
+ <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
16
+ <Link rel='lrdd'
17
+ template='http://example.com/webfinger/?q={uri}'>
18
+ <Title>Resource Descriptor</Title>
19
+ </Link>
20
+ </XRD>
21
+ XML
22
+ end
23
+
24
+ def finger_xrd
25
+ <<-XML
26
+ <?xml version='1.0'?>
27
+ <XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'>
28
+ <Alias>http://www.google.com/profiles/abc</Alias>
29
+ <Link rel='http://portablecontacts.net/spec/1.0' href='http://www-opensocial.googleusercontent.com/api/people/'/>
30
+ <Link rel='http://webfinger.net/rel/profile-page' href='http://www.google.com/profiles/abc' type='text/html'/>
31
+ <Link rel='http://microformats.org/profile/hcard' href='http://www.google.com/profiles/abc' type='text/html'/>
32
+ <Link rel='http://gmpg.org/xfn/11' href='http://www.google.com/profiles/abc' type='text/html'/>
33
+ <Link rel='http://specs.openid.net/auth/2.0/provider' href='http://www.google.com/profiles/abc'/>
34
+ <Link rel='describedby' href='http://www.google.com/profiles/abc' type='text/html'/>
35
+ <Link rel='describedby' href='http://s2.googleusercontent.com/webfinger/?q=acct%3Aabc%example.com&amp;fmt=foaf' type='application/rdf+xml'/>
36
+ <Link rel='http://schemas.google.com/g/2010#updates-from' href='http://buzz.googleapis.com/feeds/100660544095714416357/public/posted' type='application/atom+xml'/>
37
+ </XRD>
38
+ XML
39
+ end
40
+
41
+ def stub_success(address = 'abc@example.com')
42
+ stub_request(:get, 'https://example.com/.well-known/host-meta').to_return(:status => 200, :body => host_xrd)
43
+ stub_request(:get, /webfinger\/\?q=#{address}/).to_return(:status => 200, :body => finger_xrd)
44
+ end
45
+
46
+ RSpec.configure do |config|
47
+
48
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-redfinger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Michael Bleigh
9
+ - Arnaud Berthomier
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2011-11-10 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: em-http-request
17
+ requirement: &10819880 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *10819880
26
+ - !ruby/object:Gem::Dependency
27
+ name: em-http-request
28
+ requirement: &10819120 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: *10819120
37
+ - !ruby/object:Gem::Dependency
38
+ name: nokogiri
39
+ requirement: &10818540 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: 1.4.0
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: *10818540
48
+ - !ruby/object:Gem::Dependency
49
+ name: hashie
50
+ requirement: &10817940 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: *10817940
59
+ description: A Ruby Webfinger client
60
+ email: oz@cyprio.net
61
+ executables: []
62
+ extensions: []
63
+ extra_rdoc_files:
64
+ - LICENSE
65
+ - README.md
66
+ files:
67
+ - .rspec
68
+ - LICENSE
69
+ - README.md
70
+ - Rakefile
71
+ - VERSION
72
+ - em-redfinger.gemspec
73
+ - lib/em-redfinger.rb
74
+ - lib/em-redfinger/client.rb
75
+ - lib/em-redfinger/finger.rb
76
+ - lib/em-redfinger/link.rb
77
+ - lib/em-redfinger/link_helpers.rb
78
+ - redfinger.gemspec
79
+ - spec/redfinger/client_spec.rb
80
+ - spec/redfinger_spec.rb
81
+ - spec/spec.opts
82
+ - spec/spec_helper.rb
83
+ homepage: http://github.com/oz/em-redfinger
84
+ licenses: []
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 1.8.10
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: A Ruby WebFinger client.
107
+ test_files: []