mikeric-dopplr 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/README.md +60 -0
- data/lib/dopplr/city.rb +27 -0
- data/lib/dopplr/client.rb +68 -0
- data/lib/dopplr/traveller.rb +72 -0
- data/lib/dopplr/trip.rb +31 -0
- data/lib/dopplr.rb +12 -0
- data/test/helpers.rb +7 -0
- data/test/unit/client_test.rb +41 -0
- metadata +80 -0
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Dopplr
|
2
|
+
|
3
|
+
This library provides objects for talking to some of the data available in Dopplr, The Social Atlas. It is essentially a multi-user wrapping of the Dopplr API, with each object being bound to a client.
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
### First things first
|
8
|
+
|
9
|
+
Require the Dopplr library and create a `Dopplr::Client` instance. Return a login URL for the user to obtain a token, store the token for that user.
|
10
|
+
|
11
|
+
require 'dopplr'
|
12
|
+
|
13
|
+
client = Dopplr::Client.new #=> #<Dopplr::Client:0x578208 ...>
|
14
|
+
client.login_url "http://www.you.com/" #=> "https://www.dopplr.com/api/..."
|
15
|
+
|
16
|
+
Now that you have a single-use token, assign it to the `Dopplr::Client` object and generate a session token.
|
17
|
+
|
18
|
+
client.token = '1a2b3c4d5e6f' #=> '1a2b3c4d5e6f'
|
19
|
+
client.create_session #=> '3c4d5e6f1a2b'
|
20
|
+
|
21
|
+
### Instantiating and working with objects
|
22
|
+
|
23
|
+
All Dopplr objects are created using the client as a base, you can then branch of from them to dig deeper.
|
24
|
+
|
25
|
+
mike = client.traveller #=> Dopplr::Traveller for the token holder
|
26
|
+
chicago = client.city 4887398 #=> Dopplr::City for ID 4887398
|
27
|
+
montreal = mike.home_city #=> Dopplr::City for mike's home city
|
28
|
+
trip = mike.trips.first #=> Dopplr::Trip for mike's first trip
|
29
|
+
|
30
|
+
Return some basic information about each object.
|
31
|
+
|
32
|
+
montreal.country #=> "Canada"
|
33
|
+
montreal.timezone #=> "America/Montreal"
|
34
|
+
montreal.localtime #=> Wed Jul 22 09:30:15 2009
|
35
|
+
|
36
|
+
chicago.url #=> "http://www.dopplr.com/place/us/il/chicago"
|
37
|
+
chicago.latitude #=> 41.85
|
38
|
+
chicago.longitude #=> -87.6501
|
39
|
+
|
40
|
+
mike.name #=> "Mike Richards"
|
41
|
+
mike.status #=> "is at home in Montreal"
|
42
|
+
mike.travel_today #=> false
|
43
|
+
|
44
|
+
trip.city.name #=> "Calgary"
|
45
|
+
trip.start #=> Sat Feb 16 00:00:00 2008
|
46
|
+
trip.return_transport #=> "plane"
|
47
|
+
|
48
|
+
Get trips and fellows for a particular traveller.
|
49
|
+
|
50
|
+
mike.trips #=> [#<Dopplr::Trip:0x56f4a0 ...>, ...]
|
51
|
+
|
52
|
+
mike.fellows #=> {:can_see_trips_of => [#<Dopplr::Traveller:0x570954 ...>, ...],
|
53
|
+
:shows_trips_to => [#<Dopplr::Traveller:0x59e8b1 ...> ...]}
|
54
|
+
|
55
|
+
Return a new `Dopplr::City` object without knowing the geoname_id (I'm feeling lucky).
|
56
|
+
|
57
|
+
portland = client.find_city "Portland"
|
58
|
+
|
59
|
+
portland.country #=> "United States"
|
60
|
+
portland.geoname_id #=> 5746545
|
data/lib/dopplr/city.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Dopplr
|
2
|
+
class City
|
3
|
+
attr_reader :name, :country, :timezone, :localtime, :latitude, :longitude
|
4
|
+
attr_reader :geoname_id, :country_code, :woeid, :rgb, :utc_offset, :url
|
5
|
+
|
6
|
+
def initialize(client, id)
|
7
|
+
@client = client
|
8
|
+
@geoname_id = id
|
9
|
+
populate
|
10
|
+
end
|
11
|
+
|
12
|
+
def populate
|
13
|
+
info = @client.get('city_info', :geoname_id => @geoname_id)['city']
|
14
|
+
@name = info['name']
|
15
|
+
@country = info['country']
|
16
|
+
@timezone = info['timezone']
|
17
|
+
@latitude = info['latitude']
|
18
|
+
@longitude = info['longitude']
|
19
|
+
@country_code = info['country_code']
|
20
|
+
@woeid = info['woeid']
|
21
|
+
@rgb = info['rgb']
|
22
|
+
@utc_offset = info['utcoffset']
|
23
|
+
@url = info['url']
|
24
|
+
@localtime = Time.parse info['localtime'].slice(0..-7)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Dopplr
|
2
|
+
class Client
|
3
|
+
attr_accessor :token
|
4
|
+
|
5
|
+
def initialize(token=nil)
|
6
|
+
@token = token
|
7
|
+
end
|
8
|
+
|
9
|
+
# Makes an API call with @token.
|
10
|
+
def get(path, params={})
|
11
|
+
params['format'] = 'js'
|
12
|
+
params_uri = URI.escape(params.collect{|key,value| "#{key}=#{value}"}.join('&'))
|
13
|
+
url = "/api/#{path}/?#{params_uri}"
|
14
|
+
http = Net::HTTP.new("www.dopplr.com", 443)
|
15
|
+
http.use_ssl = true
|
16
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
17
|
+
http.start do |http|
|
18
|
+
request = Net::HTTP::Get.new url, 'Authorization' => "AuthSub token=\"#{@token}\""
|
19
|
+
JSON.parse(http.request(request).body)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns a URL for getting a token.
|
24
|
+
def login_url(url)
|
25
|
+
return "https://www.dopplr.com/api/AuthSubRequest?scope=#{CGI.escape("http://www.dopplr.com/")}&next=#{CGI.escape(url)}&session=1"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Changes @token into a session token.
|
29
|
+
def create_session
|
30
|
+
@token = get('AuthSubSessionToken')['token']
|
31
|
+
end
|
32
|
+
|
33
|
+
# Performs a search query.
|
34
|
+
def search(term, type=:all)
|
35
|
+
if type == :all
|
36
|
+
get 'search', :q => term
|
37
|
+
elsif type == :city
|
38
|
+
get 'city_search', :q => term
|
39
|
+
elsif type == :traveller
|
40
|
+
get 'traveller_search', :q => term
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns a new City object.
|
45
|
+
def city(city_id)
|
46
|
+
City.new(self, city_id)
|
47
|
+
end
|
48
|
+
|
49
|
+
# I'm feeling lucky city search.
|
50
|
+
def find_city(name)
|
51
|
+
city get('city_search', :q => name)['city'][0]['geoname_id']
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns a new Trip object.
|
55
|
+
def trip(trip_id)
|
56
|
+
Trip.new(self, trip_id)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Returns a new Traveller object.
|
60
|
+
def traveller(username = nil)
|
61
|
+
if username
|
62
|
+
Traveller.new(self, username)
|
63
|
+
else
|
64
|
+
Traveller.new(self)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Dopplr
|
2
|
+
class Traveller
|
3
|
+
attr_reader :nick, :name, :status, :travel_today, :icon_id, :email_sha1, :url
|
4
|
+
|
5
|
+
def initialize(client, user = nil)
|
6
|
+
@client = client
|
7
|
+
@params = {}
|
8
|
+
@params[:traveller] = user if user
|
9
|
+
populate
|
10
|
+
end
|
11
|
+
|
12
|
+
def populate
|
13
|
+
info = @client.get('traveller_info', @params)['traveller']
|
14
|
+
@nick = info['nick']
|
15
|
+
@name = info['name']
|
16
|
+
@status = info['status']
|
17
|
+
@travel_today = info['travel_today']
|
18
|
+
@icon_id = info['icon_id']
|
19
|
+
@email_sha1 = info['sha1email']
|
20
|
+
@url = info['url']
|
21
|
+
end
|
22
|
+
|
23
|
+
def current_city(options = {})
|
24
|
+
unless @current_city && !options[:force]
|
25
|
+
info = @client.get('traveller_info', @params)['traveller']
|
26
|
+
@current_city = City.new @client, info['current_city']['geoname_id']
|
27
|
+
end
|
28
|
+
@current_city
|
29
|
+
end
|
30
|
+
|
31
|
+
def home_city(options = {})
|
32
|
+
unless @home_city && !options[:force]
|
33
|
+
info = @client.get('traveller_info', @params)['traveller']
|
34
|
+
@home_city = City.new @client, info['home_city']['geoname_id']
|
35
|
+
end
|
36
|
+
@home_city
|
37
|
+
end
|
38
|
+
|
39
|
+
def trips(options = {})
|
40
|
+
unless @trips && !options[:force]
|
41
|
+
trips = @client.get('trips_info', @params)['trip']
|
42
|
+
if !trips.empty?
|
43
|
+
@trips = trips.map do |trip|
|
44
|
+
Trip.new @client, trip['id']
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
@trips ||= []
|
49
|
+
end
|
50
|
+
|
51
|
+
def fellows(options = {})
|
52
|
+
unless @fellows && !options[:force]
|
53
|
+
fellows = @client.get('fellows', @params)
|
54
|
+
fellows['can_see_trips_of'].map! do |fellow|
|
55
|
+
Traveller.new @client, fellow['nick']
|
56
|
+
end
|
57
|
+
fellows['shows_trips_to'].map! do |fellow|
|
58
|
+
hash = fellow.inject({}) do |memo, (key, value)|
|
59
|
+
memo[key.to_sym] = value
|
60
|
+
memo
|
61
|
+
end
|
62
|
+
Struct.new(*hash.keys).new(*hash.values_at(*hash.keys))
|
63
|
+
end
|
64
|
+
@fellows = fellows.inject({}) do |memo, (key, value)|
|
65
|
+
memo[key.to_sym] = value
|
66
|
+
memo
|
67
|
+
end
|
68
|
+
end
|
69
|
+
@fellows
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/dopplr/trip.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module Dopplr
|
2
|
+
class Trip
|
3
|
+
attr_reader :start, :finish, :city, :outgoing_transport, :return_transport, :tags, :notes
|
4
|
+
attr_reader :trip_id, :url
|
5
|
+
|
6
|
+
def initialize(client, id)
|
7
|
+
@client = client
|
8
|
+
@trip_id = id
|
9
|
+
populate
|
10
|
+
end
|
11
|
+
|
12
|
+
def populate
|
13
|
+
info = @client.get('trip_info', :trip_id => @trip_id)['trip']
|
14
|
+
@outgoing_transport = info['outgoing_transport_type']
|
15
|
+
@return_transport = info['return_transport_type']
|
16
|
+
@tags = info['tag']
|
17
|
+
@notes = info['note']
|
18
|
+
@url = info['url']
|
19
|
+
@start = Time.parse info['start']
|
20
|
+
@finish = Time.parse info['finish']
|
21
|
+
end
|
22
|
+
|
23
|
+
def city(options = {})
|
24
|
+
unless @city && !options[:force]
|
25
|
+
info = @client.get('trip_info', :trip_id => @trip_id)['trip']
|
26
|
+
@city = City.new @client, info['city']['geoname_id']
|
27
|
+
end
|
28
|
+
@city
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/dopplr.rb
ADDED
data/test/helpers.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../helpers'
|
2
|
+
|
3
|
+
class ClientTest < Test::Unit::TestCase
|
4
|
+
context "A client" do
|
5
|
+
setup do
|
6
|
+
@client = Dopplr::Client.new
|
7
|
+
end
|
8
|
+
|
9
|
+
should "provide a proper login url" do
|
10
|
+
assert_equal @client.login_url("http://www.you.com/"), "https://www.dopplr.com/api/AuthSubRequest?scope=http%3A%2F%2Fwww.dopplr.com%2F&next=http%3A%2F%2Fwww.you.com%2F&session=1"
|
11
|
+
end
|
12
|
+
|
13
|
+
context "with a valid session token" do
|
14
|
+
setup do
|
15
|
+
@client.token = 'TOKEN'
|
16
|
+
end
|
17
|
+
|
18
|
+
should "have a base traveller" do
|
19
|
+
traveller = @client.traveller
|
20
|
+
assert_equal traveller.nick, 'mikeric'
|
21
|
+
end
|
22
|
+
|
23
|
+
should "be able to create new objects" do
|
24
|
+
assert @client.city 6173331
|
25
|
+
assert @client.trip 525522
|
26
|
+
end
|
27
|
+
|
28
|
+
should "be able to perform search queries" do
|
29
|
+
city_search = @client.search "Montreal", :city
|
30
|
+
assert city_search['city']
|
31
|
+
traveller_search = @client.search "Mike", :traveller
|
32
|
+
assert traveller_search['traveller']
|
33
|
+
end
|
34
|
+
|
35
|
+
should "be able to find a city" do
|
36
|
+
city = @client.find_city "Portland"
|
37
|
+
assert_equal city.geoname_id, 5746545
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
metadata
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mikeric-dopplr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Mike Richards
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-08-06 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: json
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.1.5
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: thoughtbot-shoulda
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description:
|
36
|
+
email: mike22e@gmail.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- README.md
|
43
|
+
files:
|
44
|
+
- README.md
|
45
|
+
- lib/dopplr.rb
|
46
|
+
- lib/dopplr/client.rb
|
47
|
+
- lib/dopplr/city.rb
|
48
|
+
- lib/dopplr/traveller.rb
|
49
|
+
- lib/dopplr/trip.rb
|
50
|
+
- test/helpers.rb
|
51
|
+
- test/unit/client_test.rb
|
52
|
+
has_rdoc: false
|
53
|
+
homepage: http://github.com/mikeric/dopplr
|
54
|
+
licenses:
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: "0"
|
71
|
+
version:
|
72
|
+
requirements: []
|
73
|
+
|
74
|
+
rubyforge_project:
|
75
|
+
rubygems_version: 1.3.5
|
76
|
+
signing_key:
|
77
|
+
specification_version: 2
|
78
|
+
summary: A Ruby library for talking to the Dopplr API
|
79
|
+
test_files: []
|
80
|
+
|