geni 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -1
- data/README.md +8 -3
- data/Rakefile +9 -0
- data/geni.gemspec +7 -15
- data/lib/geni.rb +8 -2
- data/lib/geni/base.rb +30 -3
- data/lib/geni/client.rb +41 -19
- data/lib/geni/document.rb +9 -0
- data/lib/geni/photo.rb +10 -0
- data/lib/geni/profile.rb +68 -37
- data/lib/geni/profile/immediate_family.rb +51 -0
- data/lib/geni/project.rb +19 -0
- data/lib/geni/taggable.rb +27 -0
- data/lib/geni/union.rb +15 -0
- data/lib/geni/video.rb +9 -0
- data/spec/geni/client_spec.rb +79 -0
- data/spec/geni/document_spec.rb +53 -0
- data/spec/geni/immediate_family_spec.rb +45 -0
- data/spec/geni/photo_spec.rb +67 -0
- data/spec/geni/profile_spec.rb +73 -0
- data/spec/geni/project_spec.rb +44 -0
- data/spec/geni/union_spec.rb +44 -0
- data/spec/geni/video_spec.rb +56 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/support/mocked_responses/06668c1bc97e251b3c2965712e3b990e.json +1 -0
- data/spec/support/mocked_responses/09df004f19d20d8d685db52796b552bf.json +1 -0
- data/spec/support/mocked_responses/12536c37e1bcef230f105a0fa930eae9.json +1 -0
- data/spec/support/mocked_responses/155ed9f9c6912c19cd4d6be2ad4b9163.json +1 -0
- data/spec/support/mocked_responses/1b640e767a27039b60daab80aa3e38da.json +1 -0
- data/spec/support/mocked_responses/44795c1cebac8aee4c72ab4cde5b7c34.json +1 -0
- data/spec/support/mocked_responses/4e55df6914e067b371e7ea54ac372591.json +1 -0
- data/spec/support/mocked_responses/55c9a8f9e64187f2e7389b7cecec4bd0.json +1 -0
- data/spec/support/mocked_responses/5643d7ffaa0b17a4340b57446228f455.json +1 -0
- data/spec/support/mocked_responses/6df2af74f5544a90b96921edc9aa346d.json +1 -0
- data/spec/support/mocked_responses/7215a02ec26d1c9df055275958824c7b.json +1 -0
- data/spec/support/mocked_responses/7c4840e03bece51bb7154893682ec2a6.json +1 -0
- data/spec/support/mocked_responses/9ae308e89eb74fc5aea5164c8affa422.json +1 -0
- data/spec/support/mocked_responses/9e1dcf9ed89704ecac0e1734f9ac9e6e.json +1 -0
- data/spec/support/mocked_responses/a060207b22ab180a065704b8dd031511.json +1 -0
- data/spec/support/mocked_responses/a4a8ee1c8c387c8cad34c7c62f2d1d27.json +1 -0
- data/spec/support/mocked_responses/a5a1df59373b2159fbd3b906b9494f6f.json +1 -0
- data/spec/support/mocked_responses/b28e773e9568bf5e2ac10e425241bf51.json +1 -0
- data/spec/support/mocked_responses/b4856ae6ff428888301f716b52ea161b.json +1 -0
- data/spec/support/mocked_responses/b73322abb23cf869241bda85b20080f5.json +1 -0
- data/spec/support/mocked_responses/c21daf2c09c09b947b5b8de0a69278d9.json +1 -0
- data/spec/support/mocked_responses/c234b7016ed809af64cfaf699a509512.json +1 -0
- data/spec/support/mocked_responses/d2e9479730282f7493eaf6513497d454.json +1 -0
- data/spec/support/mocked_responses/d5b2f2087b8831ce4df5e7e9f5a1085a.json +1 -0
- data/spec/support/mocked_responses/dee607809468ee9a94e56eeae28ecc34.json +1 -0
- data/spec/support/mocked_responses/deea226a6d94d6165febb07a56ba4261.json +1 -0
- data/spec/support/mocked_responses/f4f38a4038abc4227a1b4b18fd12b978.json +1 -0
- metadata +83 -8
- data/lib/geni/family.rb +0 -39
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -33,12 +33,17 @@ Simple Ruby client to the [Geni](http://www.geni.com) REST/OAuth API.
|
|
33
33
|
puts profile.name
|
34
34
|
end
|
35
35
|
|
36
|
+
Support is available for profiles, documents, photos, projects, unions, videos.
|
37
|
+
|
36
38
|
I've also put [a demo Rails app](https://github.com/aurels/geni-rails-example) online to show the usage of the gem with Rails or Sinatra.
|
37
39
|
|
38
|
-
#
|
40
|
+
# Tests
|
41
|
+
|
42
|
+
To run the specs :
|
43
|
+
|
44
|
+
$ rake spec
|
39
45
|
|
40
|
-
|
41
|
-
+ This gem only access profile and immediate family information. I don't have a paid account, I cannot implement everything now.
|
46
|
+
All request responses are stubbed via Faraday in `spec/support/mocked_responses`.
|
42
47
|
|
43
48
|
# Feedback and help
|
44
49
|
|
data/Rakefile
ADDED
data/geni.gemspec
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{geni}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.6"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
-
s.authors = ["Aurélien Malisart","Matt Johnston"]
|
8
|
+
s.authors = ["Aurélien Malisart", "Matt Johnston"]
|
9
9
|
s.date = %q{2011-02-03}
|
10
10
|
s.description = %q{A Ruby client to the geni.com API}
|
11
11
|
s.email = %q{aurelien.malisart@gmail.com}
|
@@ -15,19 +15,8 @@ Gem::Specification.new do |s|
|
|
15
15
|
"README.md"
|
16
16
|
]
|
17
17
|
|
18
|
-
s.files =
|
19
|
-
|
20
|
-
"README.md",
|
21
|
-
"lib/geni.rb",
|
22
|
-
"lib/array_hacks.rb",
|
23
|
-
"lib/oauth_hacks.rb",
|
24
|
-
"lib/geni/base.rb",
|
25
|
-
"lib/geni/client.rb",
|
26
|
-
"lib/geni/family.rb",
|
27
|
-
"lib/geni/profile.rb",
|
28
|
-
"geni.gemspec",
|
29
|
-
"LICENSE"
|
30
|
-
]
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
31
20
|
s.homepage = %q{http://github.com/aurels/geni}
|
32
21
|
s.rdoc_options = ["--charset=UTF-8"]
|
33
22
|
s.require_paths = ['lib']
|
@@ -40,5 +29,8 @@ Gem::Specification.new do |s|
|
|
40
29
|
s.specification_version = 3
|
41
30
|
s.add_dependency(%q<oauth2>, ["= 0.1.1"])
|
42
31
|
s.add_dependency(%q<json>, ["= 1.5.0"])
|
32
|
+
|
33
|
+
s.add_development_dependency("rake", "~> 0.8.7")
|
34
|
+
s.add_development_dependency("rspec", "2.5.0")
|
43
35
|
end
|
44
36
|
end
|
data/lib/geni.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
require 'oauth2'
|
2
2
|
require 'oauth_hacks'
|
3
3
|
require 'array_hacks'
|
4
|
-
|
4
|
+
|
5
5
|
require 'geni/base'
|
6
|
+
require 'geni/taggable'
|
6
7
|
require 'geni/profile'
|
7
|
-
require 'geni/
|
8
|
+
require 'geni/union'
|
9
|
+
require 'geni/project'
|
10
|
+
require 'geni/photo'
|
11
|
+
require 'geni/document'
|
12
|
+
require 'geni/video'
|
13
|
+
require 'geni/client'
|
data/lib/geni/base.rb
CHANGED
@@ -1,12 +1,39 @@
|
|
1
1
|
module Geni
|
2
2
|
class Base
|
3
|
-
attr_reader :client
|
4
|
-
|
3
|
+
attr_reader :id, :client
|
4
|
+
|
5
5
|
def initialize(params = {})
|
6
|
+
@id = params[:id]
|
6
7
|
@client = params[:client]
|
7
|
-
params[:
|
8
|
+
@fetched = params[:fetched] || false
|
9
|
+
|
10
|
+
if params.has_key?(:attrs)
|
11
|
+
params[:attrs].each_pair do |key, value|
|
12
|
+
instance_variable_set("@#{key}", value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def fetched?
|
18
|
+
@fetched
|
19
|
+
end
|
20
|
+
|
21
|
+
def fetch
|
22
|
+
client.access_token.get("/api/#{id}").each_pair do |attr, value|
|
8
23
|
instance_variable_set("@#{attr}".to_sym, value)
|
9
24
|
end
|
25
|
+
@fetched = true
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def has_fetchable_attributes(attribute_names)
|
30
|
+
attribute_names.each do |attribute_name|
|
31
|
+
define_method "#{attribute_name}" do
|
32
|
+
self.fetch unless self.fetched?
|
33
|
+
instance_variable_get("@#{attribute_name}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
10
37
|
end
|
11
38
|
end
|
12
39
|
end
|
data/lib/geni/client.rb
CHANGED
@@ -18,33 +18,55 @@ module Geni
|
|
18
18
|
|
19
19
|
@access_token = OAuth2::AccessToken.new(oauth_client, params[:token])
|
20
20
|
end
|
21
|
+
|
22
|
+
TYPES = {
|
23
|
+
'profile' => Geni::Profile,
|
24
|
+
'union' => Geni::Union,
|
25
|
+
'project' => Geni::Project,
|
26
|
+
'photo' => Geni::Photo,
|
27
|
+
'document' => Geni::Document,
|
28
|
+
'video' => Geni::Video
|
29
|
+
}
|
21
30
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
else
|
29
|
-
return []
|
30
|
-
end
|
31
|
-
else
|
32
|
-
url = "/api/profile-#{id_or_ids}"
|
31
|
+
TYPES.each_pair do |type, klass|
|
32
|
+
define_method "get_#{type}" do |id|
|
33
|
+
entity = klass.new({
|
34
|
+
:client => self,
|
35
|
+
:id => id
|
36
|
+
})
|
33
37
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_profiles(ids)
|
41
|
+
return [] if ids.empty?
|
42
|
+
return [get_profile(ids.first)] if ids.one?
|
43
|
+
|
44
|
+
numbers = ids.collect { |id| id.gsub(/profile-/, '') }.join(',')
|
45
|
+
url = "/api/profile-#{numbers}"
|
46
|
+
results = access_token.get(url)['results']
|
37
47
|
|
38
|
-
|
48
|
+
results.collect do |profile_attrs|
|
39
49
|
Geni::Profile.new({
|
40
|
-
:client
|
41
|
-
:attrs
|
50
|
+
:client => self,
|
51
|
+
:attrs => profile_attrs,
|
52
|
+
:fetched => true
|
42
53
|
})
|
43
54
|
end
|
44
|
-
|
45
|
-
id_or_ids.kind_of?(Array) ? profiles : profiles.first
|
46
55
|
end
|
47
56
|
|
57
|
+
def me
|
58
|
+
Geni::Profile.new({
|
59
|
+
:client => self,
|
60
|
+
:attrs => access_token.get('/api/profile'),
|
61
|
+
:fetched => true
|
62
|
+
})
|
63
|
+
end
|
64
|
+
|
65
|
+
def [](entity_id)
|
66
|
+
entity_type = entity_id.split('-').first
|
67
|
+
send("get_#{entity_type}", entity_id)
|
68
|
+
end
|
69
|
+
|
48
70
|
def redirect_uri(request)
|
49
71
|
uri = URI.parse(request.url)
|
50
72
|
uri.path = @callback
|
data/lib/geni/photo.rb
ADDED
data/lib/geni/profile.rb
CHANGED
@@ -1,36 +1,22 @@
|
|
1
|
+
require 'geni/profile/immediate_family'
|
2
|
+
|
1
3
|
module Geni
|
2
4
|
class Profile < Base
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
attr_reader :public
|
19
|
-
attr_reader :big_tree
|
20
|
-
attr_reader :claimed
|
21
|
-
attr_reader :locked
|
22
|
-
attr_reader :birth_date
|
23
|
-
attr_reader :birth_location
|
24
|
-
attr_reader :birth_location
|
25
|
-
attr_reader :death_date
|
26
|
-
attr_reader :death_location
|
27
|
-
attr_reader :burial_date
|
28
|
-
attr_reader :url
|
29
|
-
attr_reader :language
|
30
|
-
attr_reader :curator
|
31
|
-
attr_reader :mugshot_urls
|
32
|
-
attr_reader :birth_date_parts
|
33
|
-
attr_reader :relationship
|
5
|
+
|
6
|
+
has_fetchable_attributes %w[
|
7
|
+
first_name middle_name maiden_name last_name suffix display_name name gender
|
8
|
+
current_residence created_by merge_note public big_tree claimed locked birth_date
|
9
|
+
borth_date_parts birth_location baptism_date baptism_date_parts baptism_location
|
10
|
+
death_date death_date_parts death_location burial_date blurial_date_parts blurial_location
|
11
|
+
url language mugshot_urls relationship is_alive
|
12
|
+
]
|
13
|
+
|
14
|
+
def immediate_family
|
15
|
+
@immediate_family ||= Geni::Profile::ImmediateFamily.new({
|
16
|
+
:client => client,
|
17
|
+
:attrs => client.access_token.get("/api/#{id}/immediate-family")
|
18
|
+
})
|
19
|
+
end
|
34
20
|
|
35
21
|
def parents
|
36
22
|
immediate_family.parents
|
@@ -55,12 +41,57 @@ module Geni
|
|
55
41
|
def partners
|
56
42
|
immediate_family.partners
|
57
43
|
end
|
58
|
-
|
59
|
-
def
|
60
|
-
@
|
61
|
-
|
62
|
-
|
63
|
-
|
44
|
+
|
45
|
+
def managers
|
46
|
+
@manager_profiles ||= @managers.collect do |profile_link|
|
47
|
+
client.get_profile(profile_link.split('-').last)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def merged_into
|
52
|
+
@merged_into_profiles ||= @merged_into.to_a.collect do |profile_link|
|
53
|
+
client.get_profile(profile_link.split('-').last)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def requested_merges
|
58
|
+
@requested_merges_profiles ||= @requested_merges.to_a.collect do |profile_link|
|
59
|
+
client.get_profile(profile_link.split('-').last)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def curator
|
64
|
+
@curator_profile ||= @curator.nil? ? nil : client.get_profile(@curator.split('/').last)
|
65
|
+
end
|
66
|
+
|
67
|
+
def photos
|
68
|
+
@photos ||= client.access_token.get("/api/#{id}/photos")['results'].to_a.collect do |photo_attrs|
|
69
|
+
Geni::Photo.new({
|
70
|
+
:client => client,
|
71
|
+
:attrs => photo_attrs,
|
72
|
+
:fetched => true
|
73
|
+
})
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def videos
|
78
|
+
@videos ||= client.access_token.get("/api/#{id}/videos")['results'].to_a.collect do |video_attrs|
|
79
|
+
Geni::Photo.new({
|
80
|
+
:client => client,
|
81
|
+
:attrs => video_attrs,
|
82
|
+
:fetched => true
|
83
|
+
})
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def documents
|
88
|
+
@documents ||= client.access_token.get("/api/#{id}/documents")['results'].collect do |documents_attrs|
|
89
|
+
Geni::Photo.new({
|
90
|
+
:client => client,
|
91
|
+
:attrs => documents_attrs,
|
92
|
+
:fetched => true
|
93
|
+
})
|
94
|
+
end
|
64
95
|
end
|
65
96
|
end
|
66
97
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Geni
|
2
|
+
class Profile < Base
|
3
|
+
class ImmediateFamily
|
4
|
+
attr_reader :client, :focus
|
5
|
+
|
6
|
+
def initialize(params)
|
7
|
+
@client = params[:client]
|
8
|
+
|
9
|
+
params[:attrs].each_pair do |key, value|
|
10
|
+
instance_variable_set("@#{key}", value)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def parents
|
15
|
+
@parents ||= profiles(walk(focus_node, ['child', 'partner']))
|
16
|
+
end
|
17
|
+
|
18
|
+
def partners
|
19
|
+
@partners ||= profiles(walk(focus_node, ['partner', 'partner']))
|
20
|
+
end
|
21
|
+
|
22
|
+
def children
|
23
|
+
@children ||= profiles(walk(focus_node, ['partner', 'child']))
|
24
|
+
end
|
25
|
+
|
26
|
+
def siblings
|
27
|
+
@siblings ||= profiles(walk(focus_node, ['child', 'child']))
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def focus_node
|
33
|
+
@nodes[@focus['id']]
|
34
|
+
end
|
35
|
+
|
36
|
+
def walk(node, rels)
|
37
|
+
return node if rels.empty?
|
38
|
+
|
39
|
+
node['edges'].collect do |edge_id, edge|
|
40
|
+
if edge['rel'] == rels.first && edge_id != @focus['id']
|
41
|
+
walk(@nodes[edge_id], rels.tail)
|
42
|
+
end
|
43
|
+
end.compact.flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
def profiles(nodes)
|
47
|
+
client.get_profiles(nodes.collect { |node| node['id'] })
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/geni/project.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Geni
|
2
|
+
class Project < Base
|
3
|
+
has_fetchable_attributes %w[name description url]
|
4
|
+
|
5
|
+
['collaborators', 'profiles', 'followers'].each do |relation_name|
|
6
|
+
define_method relation_name do
|
7
|
+
if instance_variable_get("@#{relation_name}").nil?
|
8
|
+
profile_ids = client.access_token.get("/api/#{id}/#{relation_name}")['results'].collect do |profile|
|
9
|
+
profile['id'].split('-').last
|
10
|
+
end
|
11
|
+
|
12
|
+
instance_variable_set("@#{relation_name}", client.get_profiles(profile_ids))
|
13
|
+
else
|
14
|
+
instance_variable_get("@#{relation_name}")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Geni
|
2
|
+
module Taggable
|
3
|
+
def tags
|
4
|
+
return @tags if @tags
|
5
|
+
|
6
|
+
response_hash = client.access_token.get("/api/#{id}/tags")
|
7
|
+
|
8
|
+
if response_hash.has_key?('results')
|
9
|
+
profile_ids = response_hash['results'].collect do |profile|
|
10
|
+
profile['id']
|
11
|
+
end
|
12
|
+
|
13
|
+
@tags = client.get_profiles(profile_ids)
|
14
|
+
else
|
15
|
+
@tags = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def tag
|
20
|
+
raise NotImplementedError
|
21
|
+
end
|
22
|
+
|
23
|
+
def untag
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|