ruby-fs-stack 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +9 -2
- data/VERSION +1 -1
- data/lib/ruby-fs-stack/fs_communicator.rb +42 -12
- data/ruby-fs-stack.gemspec +3 -2
- data/spec/communicator_spec.rb +76 -6
- data/spec/fixtures/fakeweb_response.txt +12 -0
- metadata +3 -2
data/README.rdoc
CHANGED
@@ -32,10 +32,17 @@ or for the pure Ruby implementation
|
|
32
32
|
|
33
33
|
require 'rubygems'
|
34
34
|
require 'ruby-fs-stack'
|
35
|
-
|
35
|
+
|
36
|
+
# Optionally, you can pass a logger to the communicator
|
37
|
+
# the logger can be the standard Ruby Logger or any logger
|
38
|
+
# that responds to :info or :debug like the Rails logger
|
39
|
+
require 'logger'
|
40
|
+
logger = Logger.new('fs_stack.log')
|
41
|
+
|
36
42
|
communicator = FsCommunicator.new :domain => 'http://www.dev.usys.org', # or 'https://api.familysearch.org'
|
37
43
|
:key => 'DEVELOPER-KEY',
|
38
|
-
:user_agent => 'Ruby-Fs-Stack/v.1 (JimmyZimmerman) FsCommunicator/0.1 (Ruby)'
|
44
|
+
:user_agent => 'Ruby-Fs-Stack/v.1 (JimmyZimmerman) FsCommunicator/0.1 (Ruby)',
|
45
|
+
:logger => logger
|
39
46
|
|
40
47
|
communicator.identity_v1.authenticate :username => 'USERNAME', :password => 'PASSWORD' #=> true
|
41
48
|
communicator.session #=> "USYSE4EF197..."
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -3,7 +3,7 @@ require 'net/https'
|
|
3
3
|
require 'uri'
|
4
4
|
|
5
5
|
class FsCommunicator
|
6
|
-
attr_accessor :domain, :key, :user_agent, :session, :handle_throttling
|
6
|
+
attr_accessor :domain, :key, :user_agent, :session, :handle_throttling, :logger
|
7
7
|
include RubyFsStack
|
8
8
|
# ====Params
|
9
9
|
# <tt>options</tt> - a hash with the following options
|
@@ -17,6 +17,10 @@ class FsCommunicator
|
|
17
17
|
# You will likely want this turned off when running this library from Rails or any other
|
18
18
|
# system that is single-threaded so as to not sleep the entire process until throttling
|
19
19
|
# is successful.
|
20
|
+
# * :logger - (optional) if a logger is assigned to the communicator, all get requests and
|
21
|
+
# responses will be logged. The request and response ("GET /path" and "200 OK") will be
|
22
|
+
# logged at the info level. Headers and request/response bodies will be logged at the debug
|
23
|
+
# level.
|
20
24
|
def initialize(options = {})
|
21
25
|
# merge default options with options hash
|
22
26
|
o = {
|
@@ -24,13 +28,15 @@ class FsCommunicator
|
|
24
28
|
:key => '',
|
25
29
|
:user_agent => 'FsCommunicator/0.1 (Ruby)', # should be overridden by options user_agent
|
26
30
|
:session => nil,
|
27
|
-
:handle_throttling => false
|
31
|
+
:handle_throttling => false,
|
32
|
+
:logger => nil
|
28
33
|
}.merge(options)
|
29
34
|
@domain = o[:domain]
|
30
35
|
@key = o[:key]
|
31
36
|
@user_agent = o[:user_agent]
|
32
37
|
@session = o[:session]
|
33
38
|
@handle_throttling = o[:handle_throttling]
|
39
|
+
@logger = o[:logger]
|
34
40
|
end
|
35
41
|
|
36
42
|
def post(url,payload)
|
@@ -40,15 +46,16 @@ class FsCommunicator
|
|
40
46
|
request.body = payload
|
41
47
|
request['Content-Type'] = "application/json"
|
42
48
|
request['User-Agent'] = self.user_agent
|
49
|
+
|
43
50
|
http = Net::HTTP.new(uri.host, uri.port)
|
44
|
-
if uri.scheme == 'https'
|
45
|
-
|
46
|
-
|
47
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
48
|
-
end
|
51
|
+
set_ssl(http) if uri.scheme == 'https'
|
52
|
+
|
53
|
+
log_request('POST',full_url,request) if logger
|
49
54
|
res = http.start do |ht|
|
50
55
|
ht.request(request)
|
51
56
|
end
|
57
|
+
log_response(res) if logger
|
58
|
+
|
52
59
|
if res.code == '503' && @handle_throttling
|
53
60
|
sleep 15
|
54
61
|
res = post(url,payload)
|
@@ -66,15 +73,16 @@ class FsCommunicator
|
|
66
73
|
if credentials[:username] && credentials[:password]
|
67
74
|
request.basic_auth credentials[:username], credentials[:password]
|
68
75
|
end
|
76
|
+
|
69
77
|
http = Net::HTTP.new(uri.host, uri.port)
|
70
|
-
if uri.scheme == 'https'
|
71
|
-
|
72
|
-
|
73
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
74
|
-
end
|
78
|
+
set_ssl(http) if uri.scheme == 'https'
|
79
|
+
|
80
|
+
log_request('GET',full_url,request) if logger
|
75
81
|
res = http.start do |ht|
|
76
82
|
ht.request(request)
|
77
83
|
end
|
84
|
+
log_response(res) if logger
|
85
|
+
|
78
86
|
if res.code == '503' && @handle_throttling
|
79
87
|
sleep 15
|
80
88
|
res = get(url,credentials)
|
@@ -131,6 +139,28 @@ class FsCommunicator
|
|
131
139
|
raise exception
|
132
140
|
end
|
133
141
|
|
142
|
+
def log_request(method,url,request)
|
143
|
+
logger.info "#{method} #{url}"
|
144
|
+
request.each_header do |k,v|
|
145
|
+
logger.debug "#{k}: #{v}"
|
146
|
+
end
|
147
|
+
logger.debug request.body unless request.body.nil?
|
148
|
+
end
|
149
|
+
|
150
|
+
def log_response(response)
|
151
|
+
logger.info "#{response.code} #{response.message}"
|
152
|
+
response.each_header do |k,v|
|
153
|
+
logger.debug "#{k}: #{v}"
|
154
|
+
end
|
155
|
+
logger.debug response.body
|
156
|
+
end
|
157
|
+
|
158
|
+
def set_ssl(http)
|
159
|
+
http.use_ssl = true
|
160
|
+
http.ca_file = File.join File.dirname(__FILE__), 'assets','entrust-ca.crt'
|
161
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
162
|
+
end
|
163
|
+
|
134
164
|
def set_extra_params(uri,credentials = {})
|
135
165
|
if credentials[:username] && credentials[:password]
|
136
166
|
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.
|
8
|
+
s.version = "0.3.0"
|
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-18}
|
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 = [
|
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
|
|
54
54
|
"spec/familytree_v2/match_results_spec.rb",
|
55
55
|
"spec/familytree_v2/person_spec.rb",
|
56
56
|
"spec/familytree_v2/search_results_spec.rb",
|
57
|
+
"spec/fixtures/fakeweb_response.txt",
|
57
58
|
"spec/fs_utils_spec.rb",
|
58
59
|
"spec/identity_v1/identity_spec.rb",
|
59
60
|
"spec/identity_v1/json/login.js",
|
data/spec/communicator_spec.rb
CHANGED
@@ -1,9 +1,18 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
require 'ruby-fs-stack/fs_communicator'
|
3
3
|
require 'fakeweb'
|
4
|
+
require 'logger'
|
4
5
|
|
5
6
|
describe FsCommunicator do
|
6
7
|
include HttpCommunicatorHelper
|
8
|
+
|
9
|
+
def fake_web(path,status,message,body = '')
|
10
|
+
FakeWeb.register_uri(:get, "https://api.familysearch.org#{path}?sessionId=SESSID&dataFormat=application/json", :body => body,
|
11
|
+
:status => [status, message])
|
12
|
+
FakeWeb.register_uri(:post, "https://api.familysearch.org#{path}?sessionId=SESSID&dataFormat=application/json", :body => body,
|
13
|
+
:status => [status, message])
|
14
|
+
end
|
15
|
+
|
7
16
|
describe "initializing" do
|
8
17
|
it "should accept a hash of options" do
|
9
18
|
lambda {
|
@@ -226,12 +235,6 @@ describe FsCommunicator do
|
|
226
235
|
# 501 NotImplemented
|
227
236
|
# 503 ServiceUnavailable
|
228
237
|
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
|
-
FakeWeb.register_uri(:post, "https://api.familysearch.org#{path}?sessionId=SESSID&dataFormat=application/json", :body => "",
|
233
|
-
:status => [status, message])
|
234
|
-
end
|
235
238
|
|
236
239
|
before(:each) do
|
237
240
|
options = {
|
@@ -376,4 +379,71 @@ describe FsCommunicator do
|
|
376
379
|
end
|
377
380
|
end
|
378
381
|
|
382
|
+
describe "logging" do
|
383
|
+
|
384
|
+
before(:each) do
|
385
|
+
@logger = Logger.new(STDOUT)
|
386
|
+
options = {
|
387
|
+
:domain => 'https://api.familysearch.org',
|
388
|
+
:key => '1111-1111',
|
389
|
+
:user_agent => "FsCommunicator/0.1",
|
390
|
+
:session => 'SESSID',
|
391
|
+
:logger => @logger
|
392
|
+
}
|
393
|
+
@com = FsCommunicator.new options
|
394
|
+
end
|
395
|
+
|
396
|
+
it "should accept an optional logger object when initializing" do
|
397
|
+
@com.logger.should == @logger
|
398
|
+
end
|
399
|
+
|
400
|
+
it "should be able to assign a logger after initialization" do
|
401
|
+
@com.logger = @logger
|
402
|
+
@com.logger.should == @logger
|
403
|
+
end
|
404
|
+
|
405
|
+
it "should log each GET request URL and headers" do
|
406
|
+
response = File.join(File.dirname(__FILE__),'fixtures','fakeweb_response.txt')
|
407
|
+
FakeWeb.register_uri(:get, "https://api.familysearch.org/familytree/v2/person/KWQS-BBQ?sessionId=SESSID&dataFormat=application/json",
|
408
|
+
:response => response)
|
409
|
+
@com.logger.should_receive(:info).with(/GET \/familytree\/v2\/person/)
|
410
|
+
@com.logger.should_receive(:debug).with("accept: */*")
|
411
|
+
@com.logger.should_receive(:debug).with("user-agent: FsCommunicator/0.1")
|
412
|
+
@com.logger.should_receive(:info).with("200 OK")
|
413
|
+
@com.logger.should_receive(:debug).with("app_svr_id: 9.32")
|
414
|
+
@com.logger.should_receive(:debug).with("expires: Thu, 01 Jan 1970 00:00:00 GMT")
|
415
|
+
@com.logger.should_receive(:debug).with("content-language: en-US")
|
416
|
+
@com.logger.should_receive(:debug).with("date: Thu, 17 Dec 2009 23:58:48 GMT")
|
417
|
+
@com.logger.should_receive(:debug).with("content-length: 779")
|
418
|
+
@com.logger.should_receive(:debug).with("x-processing-time: 152")
|
419
|
+
@com.logger.should_receive(:debug).with("cache-control: no-store, no-cache")
|
420
|
+
@com.logger.should_receive(:debug).with("content-type: application/json;charset=utf-8")
|
421
|
+
@com.logger.should_receive(:debug).with(/\{"persons":/)
|
422
|
+
@com.get('/familytree/v2/person/KWQS-BBQ')
|
423
|
+
end
|
424
|
+
|
425
|
+
it "should log each POST request URL and headers" do
|
426
|
+
response = File.join(File.dirname(__FILE__),'fixtures','fakeweb_response.txt')
|
427
|
+
FakeWeb.register_uri(:post, "https://api.familysearch.org/familytree/v2/person/KWQS-BBQ?sessionId=SESSID&dataFormat=application/json",
|
428
|
+
:response => response)
|
429
|
+
@com.logger.should_receive(:info).with(/POST \/familytree\/v2\/person/)
|
430
|
+
@com.logger.should_receive(:debug).with("accept: */*")
|
431
|
+
@com.logger.should_receive(:debug).with("user-agent: FsCommunicator/0.1")
|
432
|
+
@com.logger.should_receive(:debug).with("content-type: application/json")
|
433
|
+
@com.logger.should_receive(:debug).with("CONTENT")
|
434
|
+
@com.logger.should_receive(:info).with("200 OK")
|
435
|
+
@com.logger.should_receive(:debug).with("app_svr_id: 9.32")
|
436
|
+
@com.logger.should_receive(:debug).with("expires: Thu, 01 Jan 1970 00:00:00 GMT")
|
437
|
+
@com.logger.should_receive(:debug).with("content-language: en-US")
|
438
|
+
@com.logger.should_receive(:debug).with("date: Thu, 17 Dec 2009 23:58:48 GMT")
|
439
|
+
@com.logger.should_receive(:debug).with("content-length: 779")
|
440
|
+
@com.logger.should_receive(:debug).with("x-processing-time: 152")
|
441
|
+
@com.logger.should_receive(:debug).with("cache-control: no-store, no-cache")
|
442
|
+
@com.logger.should_receive(:debug).with("content-type: application/json;charset=utf-8")
|
443
|
+
@com.logger.should_receive(:debug).with(/\{"persons":/)
|
444
|
+
@com.post('/familytree/v2/person/KWQS-BBQ','CONTENT')
|
445
|
+
end
|
446
|
+
|
447
|
+
end
|
448
|
+
|
379
449
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Content-Type: application/json;charset=utf-8
|
3
|
+
Expires: Thu, 01 Jan 1970 00:00:00 GMT
|
4
|
+
Cache-Control: no-store
|
5
|
+
Cache-Control: no-cache
|
6
|
+
X-PROCESSING-TIME: 152
|
7
|
+
Date: Thu, 17 Dec 2009 23:58:48 GMT
|
8
|
+
Content-Language: en-US
|
9
|
+
APP_SVR_ID: 9.32
|
10
|
+
Content-Length: 779
|
11
|
+
|
12
|
+
{"persons":[{"id":"KW3B-N9X","version":"8590000133","assertions":{"events":[{"value":{"type":"Birth","date":{"selected":false,"normalized":"11 March 1950","original":"11 Mar 1950","astro":{"earliest":"2433352","latest":"2433352"}},"place":{"selected":false,"normalized":{"value":"Utah, United States","id":"27","version":"3.5.0"},"original":"Utah"}}}],"names":[{"value":{"type":"Name","forms":[{"selected":false,"pieces":[{"value":"API","type":"Given","predelimiters":"","postdelimiters":" "},{"value":"User","type":"Given","predelimiters":"","postdelimiters":" "},{"value":"1241","type":"Family","predelimiters":"","postdelimiters":""}],"fullText":"API User 1241"}]}}],"genders":[{"value":{"type":"Male"}}]}}],"version":"2.0.20091103.5176","statusCode":200,"statusMessage":"OK"}
|
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.
|
4
|
+
version: 0.3.0
|
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-18 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- spec/familytree_v2/match_results_spec.rb
|
80
80
|
- spec/familytree_v2/person_spec.rb
|
81
81
|
- spec/familytree_v2/search_results_spec.rb
|
82
|
+
- spec/fixtures/fakeweb_response.txt
|
82
83
|
- spec/fs_utils_spec.rb
|
83
84
|
- spec/identity_v1/identity_spec.rb
|
84
85
|
- spec/identity_v1/json/login.js
|