ruby-fs-stack 0.2.3 → 0.2.4
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.rdoc +18 -0
- data/VERSION +1 -1
- data/lib/ruby-fs-stack/errors.rb +74 -0
- data/lib/ruby-fs-stack/fs_communicator.rb +50 -1
- data/ruby-fs-stack.gemspec +3 -2
- data/spec/communicator_spec.rb +125 -1
- data/spec/familytree_v2/match_results_spec.rb +1 -1
- data/spec/familytree_v2/search_results_spec.rb +1 -1
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -30,6 +30,7 @@ or for the pure Ruby implementation
|
|
30
30
|
|
31
31
|
=== Authenticating with FamilySearch
|
32
32
|
|
33
|
+
require 'rubygems'
|
33
34
|
require 'ruby-fs-stack'
|
34
35
|
|
35
36
|
communicator = FsCommunicator.new :domain => 'http://www.dev.usys.org', # or 'https://api.familysearch.org'
|
@@ -58,6 +59,10 @@ or for the pure Ruby implementation
|
|
58
59
|
puts "First spouse's gender: " + person.families[0].parents[1].gender
|
59
60
|
puts "First spouse's ID: " + person.families[0].parents[1].id
|
60
61
|
|
62
|
+
# read multiple persons in one request (up to 10)
|
63
|
+
people = ftcom.person ['KW3B-NNM','KWQS-BBQ','KWQS-BBR'], :parents => 'all', :children => 'all', :families => 'all'
|
64
|
+
people.size #=> 3
|
65
|
+
|
61
66
|
=== Searching Records
|
62
67
|
|
63
68
|
search = communicator.familytree_v2.search :givenName => "John",
|
@@ -78,7 +83,20 @@ or for the pure Ruby implementation
|
|
78
83
|
puts result.mother.full_name #=> "Ruby Johnson"
|
79
84
|
puts result.spouses.first.full_name #=> "Sarah Franklin"
|
80
85
|
end
|
86
|
+
|
87
|
+
=== Combining Records
|
88
|
+
|
89
|
+
# reads the latest version numbers for the people requested and POSTs a combine request.
|
90
|
+
new_person = communicator.familytree_v2.combine ['KWQS-BBQ','KWRS-BBZ','KWQS-BNR']
|
91
|
+
new_person.id #=> 'KWQS-ZZZ'
|
92
|
+
new_person.version #=> '687799'
|
81
93
|
|
94
|
+
== RDoc
|
95
|
+
|
96
|
+
RDoc is hosted at rdoc.info:
|
97
|
+
|
98
|
+
http://rdoc.info/projects/jimmyz/ruby-fs-stack
|
99
|
+
|
82
100
|
== Discussion
|
83
101
|
|
84
102
|
A Google Group has been set up for questions and discussion
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
@@ -0,0 +1,74 @@
|
|
1
|
+
|
2
|
+
module RubyFsStack
|
3
|
+
class FamilySearchError < StandardError
|
4
|
+
attr_reader :communicator
|
5
|
+
def initialize(msg = nil, communicator = nil)
|
6
|
+
@communicator = communicator if communicator
|
7
|
+
super(msg)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# 310 The user needs to go to the family tree and perform
|
12
|
+
# some action, such as read a new version of the conditions of use.
|
13
|
+
class UserActionRequired < FamilySearchError
|
14
|
+
end
|
15
|
+
|
16
|
+
# 400 Bad Request. Generic client error or multiple client errors.
|
17
|
+
class BadRequest < FamilySearchError
|
18
|
+
end
|
19
|
+
|
20
|
+
# 401 Unauthorized. The user has invalid credentials or the session
|
21
|
+
# ID is missing, invalid, or has expired. This error also appears if
|
22
|
+
# the query string contains multiple question marks or the the session
|
23
|
+
# parameter contains letters in an incorrect case.
|
24
|
+
class Unauthorized < FamilySearchError
|
25
|
+
end
|
26
|
+
|
27
|
+
# 403 Forbidden. The user does not have sufficient rights to perform
|
28
|
+
# the operation.
|
29
|
+
class Forbidden < FamilySearchError
|
30
|
+
end
|
31
|
+
|
32
|
+
# 404 Not Found. This request contained an invalid ID or a bad URI.
|
33
|
+
class NotFound < FamilySearchError
|
34
|
+
end
|
35
|
+
|
36
|
+
# 409 Conflict. The action could not be performed because it would
|
37
|
+
# create a conflict.
|
38
|
+
class Conflict < FamilySearchError
|
39
|
+
end
|
40
|
+
|
41
|
+
# 410 Gone. The requested resource has been deleted or recanted OR the
|
42
|
+
# requested version of the API has been retired.
|
43
|
+
class Gone < FamilySearchError
|
44
|
+
end
|
45
|
+
|
46
|
+
# 415 Unsupported media type, invalid content-type in header, or invalid
|
47
|
+
# character encoding.
|
48
|
+
class InvalidContentType < FamilySearchError
|
49
|
+
end
|
50
|
+
|
51
|
+
# 430 Bad version. Incorrect version of the object.
|
52
|
+
class BadVersion < FamilySearchError
|
53
|
+
end
|
54
|
+
|
55
|
+
# 431 Invalid developer key.
|
56
|
+
class InvalidDeveloperKey < FamilySearchError
|
57
|
+
end
|
58
|
+
|
59
|
+
# 500 Server Error. A generic server error or multiple server errors
|
60
|
+
# occurred. If you get this error, please report it at https://issues.devnet.familysearch.org.
|
61
|
+
class ServerError < FamilySearchError
|
62
|
+
end
|
63
|
+
|
64
|
+
# 501 Not Implemented. The requested service or combination of parameters
|
65
|
+
# has not been implemented.
|
66
|
+
class NotImplemented < FamilySearchError
|
67
|
+
end
|
68
|
+
|
69
|
+
# 503 Service Unavailable. FamilySearch or the service that you are using is not currently
|
70
|
+
# available. Or you are being throttled.
|
71
|
+
class ServiceUnavailable < FamilySearchError
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
|
+
require 'ruby-fs-stack/errors'
|
1
2
|
require 'net/https'
|
2
3
|
require 'uri'
|
3
4
|
|
4
5
|
class FsCommunicator
|
5
6
|
attr_accessor :domain, :key, :user_agent, :session, :handle_throttling
|
6
|
-
|
7
|
+
include RubyFsStack
|
7
8
|
# ====Params
|
8
9
|
# <tt>options</tt> - a hash with the following options
|
9
10
|
# * :domain - Defaults to "http://www.dev.usys.org" (the Reference System)
|
@@ -75,11 +76,59 @@ class FsCommunicator
|
|
75
76
|
if res.code == '503' && @handle_throttling
|
76
77
|
sleep 15
|
77
78
|
res = get(url,credentials)
|
79
|
+
elsif res.code != '200'
|
80
|
+
raise_exception(res)
|
78
81
|
end
|
79
82
|
return res
|
80
83
|
end
|
81
84
|
|
82
85
|
private
|
86
|
+
|
87
|
+
# 310 UserActionRequired
|
88
|
+
# 400 BadRequest
|
89
|
+
# 401 Unauthorized
|
90
|
+
# 403 Forbidden
|
91
|
+
# 404 NotFound
|
92
|
+
# 409 Conflict
|
93
|
+
# 410 Gone
|
94
|
+
# 415 InvalidContentType
|
95
|
+
# 430 BadVersion
|
96
|
+
# 431 InvalidDeveloperKey
|
97
|
+
# 500 ServerError
|
98
|
+
# 501 NotImplemented
|
99
|
+
# 503 ServiceUnavailable
|
100
|
+
def raise_exception(res)
|
101
|
+
case res.code
|
102
|
+
when "310"
|
103
|
+
exception = UserActionRequired.new res.message, self
|
104
|
+
when "400"
|
105
|
+
exception = BadRequest.new res.message, self
|
106
|
+
when "401"
|
107
|
+
exception = Unauthorized.new res.message, self
|
108
|
+
when "403"
|
109
|
+
exception = Forbidden.new res.message, self
|
110
|
+
when "404"
|
111
|
+
exception = NotFound.new res.message, self
|
112
|
+
when "409"
|
113
|
+
exception = Conflict.new res.message, self
|
114
|
+
when "410"
|
115
|
+
exception = Gone.new res.message, self
|
116
|
+
when "415"
|
117
|
+
exception = InvalidContentType.new res.message, self
|
118
|
+
when "430"
|
119
|
+
exception = BadVersion.new res.message, self
|
120
|
+
when "431"
|
121
|
+
exception = InvalidDeveloperKey.new res.message, self
|
122
|
+
when "500"
|
123
|
+
exception = ServerError.new res.message, self
|
124
|
+
when "501"
|
125
|
+
exception = NotImplemented.new res.message, self
|
126
|
+
when "503"
|
127
|
+
exception = ServiceUnavailable.new res.message, self
|
128
|
+
end
|
129
|
+
raise exception
|
130
|
+
end
|
131
|
+
|
83
132
|
def set_extra_params(uri,credentials = {})
|
84
133
|
if credentials[:username] && credentials[:password]
|
85
134
|
sessionized_url = add_key(uri)
|
data/ruby-fs-stack.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ruby-fs-stack}
|
8
|
-
s.version = "0.2.
|
8
|
+
s.version = "0.2.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jimmy Zimmerman"]
|
12
|
-
s.date = %q{2009-12-
|
12
|
+
s.date = %q{2009-12-16}
|
13
13
|
s.description = %q{A library that enables you to read and update information with the new.familysearch.org API.}
|
14
14
|
s.email = %q{jimmy.zimmerman@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
31
31
|
"lib/ruby-fs-stack/enunciate/README",
|
32
32
|
"lib/ruby-fs-stack/enunciate/familytree.rb",
|
33
33
|
"lib/ruby-fs-stack/enunciate/identity.rb",
|
34
|
+
"lib/ruby-fs-stack/errors.rb",
|
34
35
|
"lib/ruby-fs-stack/familytree.rb",
|
35
36
|
"lib/ruby-fs-stack/fs_communicator.rb",
|
36
37
|
"lib/ruby-fs-stack/fs_utils.rb",
|
data/spec/communicator_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
require 'ruby-fs-stack/fs_communicator'
|
3
|
+
require 'fakeweb'
|
3
4
|
|
4
5
|
describe FsCommunicator do
|
5
6
|
include HttpCommunicatorHelper
|
@@ -211,4 +212,127 @@ describe FsCommunicator do
|
|
211
212
|
|
212
213
|
end
|
213
214
|
|
215
|
+
# 310 UserActionRequired
|
216
|
+
# 400 BadRequest
|
217
|
+
# 401 Unauthorized
|
218
|
+
# 403 Forbidden
|
219
|
+
# 404 NotFound
|
220
|
+
# 409 Conflict
|
221
|
+
# 410 Gone
|
222
|
+
# 415 InvalidContentType
|
223
|
+
# 430 BadVersion
|
224
|
+
# 431 InvalidDeveloperKey
|
225
|
+
# 500 ServerError
|
226
|
+
# 501 NotImplemented
|
227
|
+
# 503 ServiceUnavailable
|
228
|
+
describe "raising exceptions" do
|
229
|
+
def fake_web(path,status,message)
|
230
|
+
FakeWeb.register_uri(:get, "https://api.familysearch.org#{path}?sessionId=SESSID&dataFormat=application/json", :body => "",
|
231
|
+
:status => [status, message])
|
232
|
+
end
|
233
|
+
|
234
|
+
before(:each) do
|
235
|
+
options = {
|
236
|
+
:domain => 'https://api.familysearch.org',
|
237
|
+
:key => '1111-1111',
|
238
|
+
:user_agent => "FsCommunicator/0.1",
|
239
|
+
:session => 'SESSID'
|
240
|
+
}
|
241
|
+
@com = FsCommunicator.new options
|
242
|
+
@path = '/familytree/v2/person'
|
243
|
+
FakeWeb.allow_net_connect = false
|
244
|
+
end
|
245
|
+
|
246
|
+
it "should raise a UserActionRequired on a 310" do
|
247
|
+
fake_web(@path,'310',"User Action Required")
|
248
|
+
lambda{
|
249
|
+
@com.get(@path)
|
250
|
+
}.should raise_error(RubyFsStack::UserActionRequired)
|
251
|
+
end
|
252
|
+
|
253
|
+
it "should raise a BadRequest on a 400" do
|
254
|
+
fake_web(@path,'400',"Bad Request")
|
255
|
+
lambda{
|
256
|
+
@com.get(@path)
|
257
|
+
}.should raise_error(RubyFsStack::BadRequest)
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should raise a BadRequest on a 401" do
|
261
|
+
fake_web(@path,'401',"Unauthorized")
|
262
|
+
lambda{
|
263
|
+
@com.get(@path)
|
264
|
+
}.should raise_error(RubyFsStack::Unauthorized)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should raise a Forbidden on 403" do
|
268
|
+
fake_web(@path,'403',"Forbidden")
|
269
|
+
lambda{
|
270
|
+
@com.get(@path)
|
271
|
+
}.should raise_error(RubyFsStack::Forbidden)
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should raise a 404 NotFound" do
|
275
|
+
fake_web(@path,'404',"NotFound")
|
276
|
+
lambda{
|
277
|
+
@com.get(@path)
|
278
|
+
}.should raise_error(RubyFsStack::NotFound)
|
279
|
+
end
|
280
|
+
|
281
|
+
it "should raise a 409 Conflict" do
|
282
|
+
fake_web(@path,'409',"Conflict")
|
283
|
+
lambda{
|
284
|
+
@com.get(@path)
|
285
|
+
}.should raise_error(RubyFsStack::Conflict)
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should raise a 410 Gone" do
|
289
|
+
fake_web(@path,'410',"Gone")
|
290
|
+
lambda{
|
291
|
+
@com.get(@path)
|
292
|
+
}.should raise_error(RubyFsStack::Gone)
|
293
|
+
end
|
294
|
+
|
295
|
+
it "should raise a 415 InvalidContentType" do
|
296
|
+
fake_web(@path,'415',"Invalid Content Type")
|
297
|
+
lambda{
|
298
|
+
@com.get(@path)
|
299
|
+
}.should raise_error(RubyFsStack::InvalidContentType)
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should raise a 430 BadVersion" do
|
303
|
+
fake_web(@path,'430',"Bad Version")
|
304
|
+
lambda{
|
305
|
+
@com.get(@path)
|
306
|
+
}.should raise_error(RubyFsStack::BadVersion)
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should raise a 431 InvalidDeveloperKey" do
|
310
|
+
fake_web(@path,'431',"Invalid Developer Key")
|
311
|
+
lambda{
|
312
|
+
@com.get(@path)
|
313
|
+
}.should raise_error(RubyFsStack::InvalidDeveloperKey)
|
314
|
+
end
|
315
|
+
|
316
|
+
it "should raise a 500 ServerError" do
|
317
|
+
fake_web(@path,'500',"Server Error")
|
318
|
+
lambda{
|
319
|
+
@com.get(@path)
|
320
|
+
}.should raise_error(RubyFsStack::ServerError)
|
321
|
+
end
|
322
|
+
|
323
|
+
it "should raise a 501 NotImplemented" do
|
324
|
+
fake_web(@path,'501',"Not Implemented")
|
325
|
+
lambda{
|
326
|
+
@com.get(@path)
|
327
|
+
}.should raise_error(RubyFsStack::NotImplemented)
|
328
|
+
end
|
329
|
+
|
330
|
+
it "should raise a 503 ServiceUnavailable" do
|
331
|
+
fake_web(@path,'503',"Service Unavailable")
|
332
|
+
lambda{
|
333
|
+
@com.get(@path)
|
334
|
+
}.should raise_error(RubyFsStack::ServiceUnavailable)
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
214
338
|
end
|
@@ -2,7 +2,7 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
2
|
require 'ruby-fs-stack/familytree'
|
3
3
|
|
4
4
|
describe Org::Familysearch::Ws::Familytree::V2::Schema::MatchResults, "parsing match results" do
|
5
|
-
FamilyTreeV2 = Org::Familysearch::Ws::Familytree::V2::Schema
|
5
|
+
FamilyTreeV2 = Org::Familysearch::Ws::Familytree::V2::Schema unless Object.const_defined?(:FamilyTreeV2)
|
6
6
|
|
7
7
|
def read_file(filename)
|
8
8
|
fname = File.join(File.dirname(__FILE__),'json',filename)
|
@@ -3,7 +3,7 @@ require 'ruby-fs-stack/familytree'
|
|
3
3
|
|
4
4
|
|
5
5
|
describe Org::Familysearch::Ws::Familytree::V2::Schema::SearchResults do
|
6
|
-
FamilyTreeV2 = Org::Familysearch::Ws::Familytree::V2::Schema
|
6
|
+
FamilyTreeV2 = Org::Familysearch::Ws::Familytree::V2::Schema unless Object.const_defined?(:FamilyTreeV2)
|
7
7
|
|
8
8
|
def read_file(filename)
|
9
9
|
fname = File.join(File.dirname(__FILE__),'json',filename)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-fs-stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jimmy Zimmerman
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-12-
|
12
|
+
date: 2009-12-16 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -56,6 +56,7 @@ files:
|
|
56
56
|
- lib/ruby-fs-stack/enunciate/README
|
57
57
|
- lib/ruby-fs-stack/enunciate/familytree.rb
|
58
58
|
- lib/ruby-fs-stack/enunciate/identity.rb
|
59
|
+
- lib/ruby-fs-stack/errors.rb
|
59
60
|
- lib/ruby-fs-stack/familytree.rb
|
60
61
|
- lib/ruby-fs-stack/fs_communicator.rb
|
61
62
|
- lib/ruby-fs-stack/fs_utils.rb
|