social_graph 0.0.1

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.
Files changed (2) hide show
  1. data/lib/social_graph.rb +156 -0
  2. metadata +46 -0
@@ -0,0 +1,156 @@
1
+ # Google Social Graph API interface, v 0.0.1
2
+ # Author: Chris Heald, Tag Team Interactive ( cheald at gmail / cheald at tagteaminteractive.com )
3
+ # License: LGPL 2.1
4
+ # http://creativecommons.org/licenses/LGPL/2.1/
5
+
6
+ require 'cgi'
7
+ require 'rubygems'
8
+ require 'json'
9
+ require 'net/http'
10
+
11
+ # === About
12
+ # Provides an interface to Google's SocialGraph API ( http://code.google.com/apis/socialgraph/ )
13
+
14
+
15
+ module Google
16
+ # SocialGraph query object. Create with the identity URL(s) to check and pull information from.
17
+ # Note that you shouldn't mix multiple users' identities in one SocialGraph object!
18
+ # === Searching the social graph
19
+ #
20
+ # require 'social_graph'
21
+ # # We'll use Digg's Kevin Rose as our victim because hey, he's a pretty popular guy!
22
+ #
23
+ # result = Google::SocialGraph.new "http://www.digg.com/users/kevinrose/"
24
+ #
25
+ # # Get all people that Kevin refers to as a, acquaintance, contact, friend, or someone he's met
26
+ # graph.refers_to_as([:acquaintance, :contact, :friend, :met]).inspect
27
+ #
28
+ # # Now let's get a list of all the people that say they've met Kevin
29
+ # graph.referred_to_as(:met).inspect
30
+ #
31
+ # # Anyone can say anything they want, but we want to know where else on the web we KNOW is Kevin.
32
+ # # This looks for mutual links between sites to each other, with the given XFN identity.
33
+ # graph.mutual_reference_as(:me).inspect
34
+ #
35
+ # # We can also find people that Kevin is a friend with (and people who are friends with Kevin back!)
36
+ # graph.mutual_reference_as([:friend, :met, :contact]).inspect
37
+
38
+ class SocialGraph
39
+ HOST = "socialgraph.apis.google.com"
40
+ OPT_KEYS = [:edi, :edo, :fme, :pretty, :callback, :sgn]
41
+ DEFAULT_OPTIONS = {:edi => true, :edo => true, :fme => true, :pretty => 0, :callback => nil, :sgn => nil}
42
+
43
+ # Create a new graph query. Pass a URL or array of URLs to use as the query entry point.
44
+ # For example, if you wanted to find relationships to Kevin Rose, you might use his Digg profile at http://www.digg.com/users/kevinrose/
45
+ #
46
+ # Note that any page that supports XFN will work. Pages that don't support XFN won't return any useful info, but they won't cause problems either.
47
+ def initialize(urls)
48
+ @urls = urls
49
+ end
50
+
51
+ # Perform the query and return the graph info from Google as a Ruby hash. You can see the full option reference at http://code.google.com/apis/socialgraph/docs/api.html
52
+ #
53
+ # See DEFAULT_OPTIONS for the options passed in by default.
54
+ #
55
+ # Unless you want the raw info, you don't need to use this directly. Use +refers_to_as+, +referred_to_as+, +mutual_reference_as+, and +attributes+ instead.
56
+ def query(options = nil)
57
+ return @result unless @result.nil?
58
+
59
+ options ||= DEFAULT_OPTIONS.clone
60
+
61
+ path = "/lookup?"
62
+ q = {}
63
+ if @urls.is_a? String then
64
+ q[:q] = CGI::escape(@urls)
65
+ elsif @urls.is_a? Array then
66
+ q[:q] = @urls.collect {|u| CGI::escape u}.join(",")
67
+ end
68
+ options.delete_if {|k,v| !OPT_KEYS.include? k.to_sym}
69
+ q = q.merge(options)
70
+ query = q.collect {|k, v| "#{k}=#{v.to_s}" }.join("&")
71
+ path = "/lookup?#{query}"
72
+ debug_msg("Fetching #{HOST}#{path}")
73
+ body = Net::HTTP.get(HOST, path)
74
+ @result = JSON.parse(body)
75
+ return @result
76
+ end
77
+
78
+ # Get a list of attributes from your search. For example, if you wanted a list of RSS feeds attached to this user, then you would get:
79
+ #
80
+ # query.attributes(:rss)
81
+ def attributes(attr, options = {})
82
+ result = query
83
+ results = {}
84
+ (result["nodes"] || []).each do |node|
85
+ node_addr = node[0]
86
+ attr_hash = node[1]["attributes"]
87
+ if attr_hash.nil?
88
+ results[node_addr] = nil if options[:include_nil]
89
+ next
90
+ end
91
+ results[node_addr] = attr_hash[attr.to_s] unless attr_hash[attr.to_s].nil?
92
+ end
93
+ return results
94
+ end
95
+
96
+ # Turn debugging or off. When debugging is on, will write to RAILS_DEFAULT_LOGGER (if running under rails), or STDOUT otherwise.
97
+ def debug=(b)
98
+ @debugging = b
99
+ end
100
+
101
+ # Get a list of all people this person refers to with the given XFN tag. A list of valid tags can be found at http://gmpg.org/xfn/join
102
+ #
103
+ # For example, refers_to_as(:me) will get all nodes this person identifies as him/herself. This can help you discover a user's identities elsewhere.
104
+ #
105
+ # Another example would be refers_to_as(:friend) to get all people this person calls "friend".
106
+ def refers_to_as(relationship)
107
+ relationship_map(relationship, "nodes_referenced")
108
+ end
109
+
110
+ # Get a list of all people that refer to this person with the given XFN tag. A list of valid tags can be found at http://gmpg.org/xfn/join
111
+ #
112
+ # For example, referred_to_as(:me) will get all nodes that refer to this person as him/herself. This can help you discover a user's identities elsewhere.
113
+ # However, note that anyone can refer to this person with an XFN "me" tag, so don't trust it unless there's a mutual connection.
114
+ #
115
+ # Another example would be referred_to_as(:friend) to get all people that call this person "friend".
116
+ def referred_to_as(relationship)
117
+ relationship_map(relationship, "nodes_referenced_by")
118
+ end
119
+
120
+ # Combines +refers_to_as+ and +referred_to_as+ to get verified relationships.
121
+ #
122
+ # For example mutual_reference_as(:me) would return all nodes where any two nodes reference each other with a "me" XFN tag.
123
+ def mutual_reference_as(relationship)
124
+ (relationship_map(relationship, "nodes_referenced") & relationship_map(relationship, "nodes_referenced_by")).uniq
125
+ end
126
+
127
+ private
128
+
129
+ def relationship_map(relationships, key)
130
+ relationships = relationships.to_s if relationships.is_a?(Symbol)
131
+ relationships = relationships.collect {|r| r.to_s} if relationships.is_a?(Array)
132
+ raise "SocialGraph#Relationships accepts only a string or array of strings." if ![Array,String].include? relationships.class
133
+
134
+ nodes = []
135
+ query["nodes"].each do |node|
136
+ node[1][key].each do |ref|
137
+ if relationships.is_a?(Array) and !(ref[1]["types"] & relationships).empty?
138
+ nodes.push ref[0]
139
+ elsif relationships.is_a?(String) and ref[1]["types"].include? relationships
140
+ nodes.push ref[0]
141
+ end
142
+ end
143
+ end
144
+ return nodes.uniq
145
+ end
146
+
147
+ def debug_msg(s)
148
+ return unless @debugging
149
+ if defined? RAILS_DEFAULT_LOGGER
150
+ RAILS_DEFAULT_LOGGER.debug s
151
+ else
152
+ puts s
153
+ end
154
+ end
155
+ end
156
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: social_graph
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2008-02-01 00:00:00 -07:00
8
+ summary: A library for accessing the Google SocialGraph API
9
+ require_paths:
10
+ - lib
11
+ email: cheald@gmail.com
12
+ homepage:
13
+ rubyforge_project:
14
+ description: A library for accessing the Google SocialGraph API (http://code.google.com/apis/socialgraph/)
15
+ autorequire: rake
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Chris Heald
31
+ files:
32
+ - lib/social_graph.rb
33
+ test_files: []
34
+
35
+ rdoc_options: []
36
+
37
+ extra_rdoc_files: []
38
+
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ requirements: []
44
+
45
+ dependencies: []
46
+