ruby-fs-stack 0.4.12 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +25 -1
- data/VERSION +1 -1
- data/lib/ruby-fs-stack/familytree.rb +13 -1435
- data/lib/ruby-fs-stack/familytree/characteristic.rb +12 -0
- data/lib/ruby-fs-stack/familytree/communicator.rb +412 -0
- data/lib/ruby-fs-stack/familytree/event.rb +49 -0
- data/lib/ruby-fs-stack/familytree/exist.rb +8 -0
- data/lib/ruby-fs-stack/familytree/gender.rb +9 -0
- data/lib/ruby-fs-stack/familytree/match.rb +3 -0
- data/lib/ruby-fs-stack/familytree/name.rb +69 -0
- data/lib/ruby-fs-stack/familytree/note.rb +48 -0
- data/lib/ruby-fs-stack/familytree/ordinance.rb +70 -0
- data/lib/ruby-fs-stack/familytree/pedigree.rb +103 -0
- data/lib/ruby-fs-stack/familytree/person.rb +495 -0
- data/lib/ruby-fs-stack/familytree/relationship.rb +209 -0
- data/lib/ruby-fs-stack/familytree/search.rb +27 -0
- data/lib/ruby-fs-stack/identity.rb +1 -37
- data/lib/ruby-fs-stack/identity/communicator.rb +41 -0
- data/ruby-fs-stack.gemspec +59 -43
- data/spec/{familytree_v2/familytree_communicator_spec.rb → ruby-fs-stack/familytree/communicator_spec.rb} +91 -1
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/combine_request.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/combine_response.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/fakeweb_contributor.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/fakeweb_pedigree.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/fakeweb_pedigree2.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/fakeweb_properties.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/match_KW3B-NNM.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/note_create_response.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/KJ86-3VD_all.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/KJ86-3VD_parents_families.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/KJ86-3VD_version.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/fakeweb_10_batch.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/fakeweb_6_batch.txt +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/multiple_version_read.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/post_response.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/relationship_not_found.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/relationship_read.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/relationship_update.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/person/spouse_read.js +0 -0
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/json/search.js +0 -0
- data/spec/{familytree_v2/match_results_spec.rb → ruby-fs-stack/familytree/match_spec.rb} +1 -1
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/note_spec.rb +1 -1
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/pedigree_spec.rb +1 -1
- data/spec/{familytree_v2 → ruby-fs-stack/familytree}/person_spec.rb +1 -3
- data/spec/{familytree_v2/relationships_spec.rb → ruby-fs-stack/familytree/relationship_spec.rb} +1 -3
- data/spec/{familytree_v2/search_results_spec.rb → ruby-fs-stack/familytree/search_spec.rb} +1 -1
- data/spec/ruby-fs-stack/familytree/spec_helper.rb +2 -0
- data/spec/{communicator_spec.rb → ruby-fs-stack/fs_communicator_spec.rb} +5 -5
- data/spec/{fs_utils_spec.rb → ruby-fs-stack/fs_utils_spec.rb} +1 -1
- data/spec/ruby-fs-stack/identity/communicator_spec.rb +82 -0
- data/spec/{identity_v1 → ruby-fs-stack/identity}/json/login.js +0 -0
- metadata +61 -45
- data/spec/identity_v1/identity_spec.rb +0 -50
data/README.rdoc
CHANGED
@@ -62,10 +62,34 @@ or for the pure Ruby implementation
|
|
62
62
|
puts "First spouse's gender: " + person.families[0].parents[1].gender
|
63
63
|
puts "First spouse's ID: " + person.families[0].parents[1].id
|
64
64
|
|
65
|
-
#
|
65
|
+
# Read multiple persons in one request.
|
66
|
+
# You can request as many person records as needed. The communicator will
|
67
|
+
# check the person.max.ids property from the /familytree/v2/properties call
|
68
|
+
# and will automatically break the array into appropriate slices, then return the whole.
|
66
69
|
people = communicator.familytree_v2.person ['KW3B-NNM','KWQS-BBQ','KWQS-BBR'], :parents => 'all', :children => 'all', :families => 'all'
|
67
70
|
people.size #=> 3
|
68
71
|
|
72
|
+
# Ruby blocks:
|
73
|
+
# You can pass a block to the person read that will be executed for each person
|
74
|
+
# or set of persons immediately after they are read. This is useful if you want to
|
75
|
+
# create a progress indicator if you are requesting a very large array of persons.
|
76
|
+
ids = ['KWCZ-1WL','KWCH-DGY','KWZR-RPD','KWCH-DPM','KWCH-DP9',
|
77
|
+
'KN1H-HBK','KLYL-KPZ','2794-46L','279W-NDV','KWJJ-5Y3','26KN-QTT',
|
78
|
+
'KWCV-7F7','2NQ9-FGV','K2WM-SHZ','KCR4-MBW','KWZR-RPX']
|
79
|
+
# because we are passing 16 ids, this will require 2 person reads (10 persons each read)
|
80
|
+
# the block will be called twice with the persons in each batch passed
|
81
|
+
progress_count = 0
|
82
|
+
communicator.familytree_v2.person ids do |persons|
|
83
|
+
progress_count += persons.size
|
84
|
+
puts progress_count
|
85
|
+
end
|
86
|
+
|
87
|
+
# if a single ID is passed, then the block will receive a single person, not an array
|
88
|
+
# of persons
|
89
|
+
communicator.familytree_v2.person :me do |person|
|
90
|
+
puts person.id
|
91
|
+
end
|
92
|
+
|
69
93
|
=== Searching Records
|
70
94
|
|
71
95
|
search = communicator.familytree_v2.search :givenName => "John",
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.5.0
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require 'ruby-fs-stack/
|
3
|
-
require 'ruby-fs-stack/fs_utils'
|
2
|
+
require 'ruby-fs-stack/familytree/communicator'
|
4
3
|
|
5
4
|
# Including more than one enunciate library raises a warning of
|
6
5
|
# already initialized constant.
|
@@ -9,1437 +8,16 @@ with_warnings_suppressed do
|
|
9
8
|
require 'ruby-fs-stack/enunciate/familytree'
|
10
9
|
end
|
11
10
|
|
11
|
+
require 'ruby-fs-stack/familytree/gender'
|
12
|
+
require 'ruby-fs-stack/familytree/name'
|
13
|
+
require 'ruby-fs-stack/familytree/event'
|
14
|
+
require 'ruby-fs-stack/familytree/ordinance'
|
15
|
+
require 'ruby-fs-stack/familytree/characteristic'
|
16
|
+
require 'ruby-fs-stack/familytree/exist'
|
17
|
+
require 'ruby-fs-stack/familytree/relationship'
|
18
|
+
require 'ruby-fs-stack/familytree/person'
|
19
|
+
require 'ruby-fs-stack/familytree/search'
|
20
|
+
require 'ruby-fs-stack/familytree/match'
|
21
|
+
require 'ruby-fs-stack/familytree/pedigree'
|
22
|
+
require 'ruby-fs-stack/familytree/note'
|
12
23
|
|
13
|
-
module FamilytreeV2
|
14
|
-
|
15
|
-
# This method gets mixed into the FsCommunicator so that
|
16
|
-
# you can make calls on the familytree_v2 module
|
17
|
-
def familytree_v2
|
18
|
-
@familytree_v2_com ||= Communicator.new self # self at this point refers to the FsCommunicator instance
|
19
|
-
end
|
20
|
-
|
21
|
-
class Communicator
|
22
|
-
Base = '/familytree/v2/'
|
23
|
-
|
24
|
-
# ===params
|
25
|
-
# fs_communicator: FsCommunicator instance
|
26
|
-
def initialize(fs_communicator)
|
27
|
-
@fs_communicator = fs_communicator
|
28
|
-
end
|
29
|
-
|
30
|
-
# ===params
|
31
|
-
# <tt>id_or_ids</tt> should be a string of the persons identifier. For the 'me' person, use :me or 'me'. Can also accept an array of ID strings.
|
32
|
-
# <tt>options</tt> accepts a hash of parameters as documented by the API.
|
33
|
-
# For full parameter documentation, see DevNet[https://devnet.familysearch.org/docs/api-manual-reference-system/familytree-v2/r_api_family_tree_person_read_v2.html]
|
34
|
-
#
|
35
|
-
# ===Example
|
36
|
-
# # communicator is an authenticated FsCommunicator object
|
37
|
-
# # Request a person with no assertions, only the version.
|
38
|
-
# p = communicator.familytree_v2.person :me, :names => 'none', :genders => 'none', :events => 'none'
|
39
|
-
#
|
40
|
-
# p.version # => '90194378772'
|
41
|
-
# p.id # => 'KW3B-NNM'
|
42
|
-
def person(id_or_ids, options = {})
|
43
|
-
if id_or_ids.kind_of? Array
|
44
|
-
multiple_ids = true
|
45
|
-
url = Base + 'person/' + id_or_ids.join(',')
|
46
|
-
props = properties()
|
47
|
-
if id_or_ids.size > props['person.max.ids']
|
48
|
-
persons = []
|
49
|
-
id_or_ids.each_slice(props['person.max.ids']) do |ids_slice|
|
50
|
-
persons = persons + person(ids_slice,options)
|
51
|
-
end
|
52
|
-
return persons
|
53
|
-
end
|
54
|
-
else
|
55
|
-
multiple_ids = false
|
56
|
-
id = id_or_ids.to_s
|
57
|
-
if id == 'me'
|
58
|
-
url = Base + 'person'
|
59
|
-
else
|
60
|
-
url = Base + 'person/' + id
|
61
|
-
end
|
62
|
-
end
|
63
|
-
url += add_querystring(options)
|
64
|
-
response = @fs_communicator.get(url)
|
65
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
66
|
-
if multiple_ids
|
67
|
-
return familytree.persons
|
68
|
-
else
|
69
|
-
person = familytree.persons.find{|p| p.requestedId == id }
|
70
|
-
person ||= familytree.persons.first if id == 'me'
|
71
|
-
return person
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
def save_person(person)
|
76
|
-
if person.id.nil?
|
77
|
-
url = Base + 'person'
|
78
|
-
else
|
79
|
-
url = Base + 'person/' + person.id
|
80
|
-
end
|
81
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.new
|
82
|
-
familytree.persons = [person]
|
83
|
-
response = @fs_communicator.post(url,familytree.to_json)
|
84
|
-
res_familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
85
|
-
person = res_familytree.persons.first
|
86
|
-
return person
|
87
|
-
end
|
88
|
-
|
89
|
-
# ====Params
|
90
|
-
# <tt>search_params</tt> - A hash of search parameters matching API doc
|
91
|
-
def search(search_params)
|
92
|
-
url = Base + 'search'
|
93
|
-
url += add_querystring(search_params)
|
94
|
-
response = @fs_communicator.get(url)
|
95
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
96
|
-
# require 'pp'
|
97
|
-
# pp familytree
|
98
|
-
familytree.searches[0]
|
99
|
-
end
|
100
|
-
|
101
|
-
# ====Params
|
102
|
-
# <tt>id_or_hash</tt> - Either an ID or a hash of match parameters matching API doc
|
103
|
-
# <tt>hash</tt> - if the first parameter is an ID, then this will contain the hash
|
104
|
-
# of match parameters.
|
105
|
-
def match(id_or_hash, hash={})
|
106
|
-
url = Base + 'match'
|
107
|
-
if id_or_hash.kind_of? String
|
108
|
-
id = id_or_hash
|
109
|
-
url += "/#{id}"
|
110
|
-
params_hash = hash
|
111
|
-
elsif id_or_hash.kind_of? Hash
|
112
|
-
id = nil
|
113
|
-
params_hash = id_or_hash
|
114
|
-
else
|
115
|
-
raise ArgumentError, "first parameter must be a kind of String or Hash"
|
116
|
-
end
|
117
|
-
url += add_querystring(params_hash) #"?" + FsUtils.querystring_from_hash(params_hash) unless params_hash.empty?
|
118
|
-
response = @fs_communicator.get(url)
|
119
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
120
|
-
# require 'pp'
|
121
|
-
# pp familytree
|
122
|
-
familytree.matches[0]
|
123
|
-
end
|
124
|
-
|
125
|
-
# ====Params
|
126
|
-
# * <tt>base_id</tt> - The root person for creating the relationship
|
127
|
-
# * <tt>options</tt> - Should include either :parent, :spouse, or :child. :lineage and :event is optional
|
128
|
-
#
|
129
|
-
# :lineage can be set to the following values:
|
130
|
-
# * 'Biological'
|
131
|
-
# * 'Adoptive'
|
132
|
-
# * 'Foster'
|
133
|
-
# * 'Guardianship'
|
134
|
-
# * 'Step'
|
135
|
-
# * 'Other'
|
136
|
-
#
|
137
|
-
# :event should be a hash with the following values
|
138
|
-
# ** :type - "Marriage", etc. (REQUIRED)
|
139
|
-
# ** :place - "Utah, United States" (optional)
|
140
|
-
# ** :date - "Nov 2009"
|
141
|
-
#
|
142
|
-
# :ordinance should be a hash with the following values
|
143
|
-
# ** :type - "Sealing_to_Spouse", etc. (REQUIRED)
|
144
|
-
# ** :place - "Utah, United States" (optional)
|
145
|
-
# ** :date - "Nov 2009"
|
146
|
-
# ** :temple - 'SLAKE'
|
147
|
-
#
|
148
|
-
# If the :lineage is set, the parent-child relationships will be written via a characteristic.
|
149
|
-
# Otherwise, an exists assertion will be created to just establish the relationship.
|
150
|
-
# ====Example
|
151
|
-
#
|
152
|
-
# communicator.familytree_v2.write_relationship 'KWQS-BBQ', :parent => 'KWQS-BBT', :lineage => 'Biological'
|
153
|
-
# communicator.familytree_v2.write_relationship 'KWQS-BBQ', :parent => 'KWQS-BBT', :lineage => 'Adoptive'
|
154
|
-
# communicator.familytree_v2.write_relationship 'KWQS-BBQ', :spouse => 'KWRT-BBZ', :event => {:type => 'Marriage', :date => '15 Aug 1987', :place => 'Utah, United States'}
|
155
|
-
def write_relationship(base_id,options)
|
156
|
-
|
157
|
-
relationship_type = get_relationship_type(options)
|
158
|
-
with_id = options[relationship_type.to_sym]
|
159
|
-
|
160
|
-
# Get the existing person/relationship or create a new person
|
161
|
-
unless person = relationship(base_id,options.merge({:events => 'none'}))
|
162
|
-
person = Org::Familysearch::Ws::Familytree::V2::Schema::Person.new
|
163
|
-
person.id = base_id
|
164
|
-
end
|
165
|
-
|
166
|
-
# Add the relationship to the person with all of the correct options
|
167
|
-
r_options = {:type => relationship_type, :with => with_id}
|
168
|
-
r_options[:event] = options[:event] if options[:event]
|
169
|
-
r_options[:ordinance] = options[:ordinance] if options[:ordinance]
|
170
|
-
r_options[:lineage] = options[:lineage] if options[:lineage]
|
171
|
-
person.create_relationship r_options
|
172
|
-
|
173
|
-
# Create the payload
|
174
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.new
|
175
|
-
familytree.persons = [person]
|
176
|
-
|
177
|
-
# Get the most current related ID for the URI
|
178
|
-
rels = person.relationships.get_relationships_of_type(r_options[:type])
|
179
|
-
rel = rels.find{|r|r.id == r_options[:with] || r.requestedId == r_options[:with]}
|
180
|
-
related_id = rel.id
|
181
|
-
url = "#{Base}person/#{base_id}/#{relationship_type}/#{related_id}"
|
182
|
-
|
183
|
-
# Post the response and return the resulting person/relationship record from response
|
184
|
-
response = @fs_communicator.post(url,familytree.to_json)
|
185
|
-
res_familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
186
|
-
person = res_familytree.persons.first
|
187
|
-
return person
|
188
|
-
end
|
189
|
-
|
190
|
-
# ====Params
|
191
|
-
# * <tt>base_id</tt> - The root person for creating the relationship
|
192
|
-
# * <tt>options</tt> - Should include either :parent, :spouse, or :child. :lineage and :event is optional.
|
193
|
-
# Other Relationship Read parameters may be included in options such as :events => 'all',
|
194
|
-
# :characteristics => 'all', etc.
|
195
|
-
#
|
196
|
-
# If the :lineage is set, the parent-child relationships will be written via a characteristic.
|
197
|
-
# Otherwise, an exists assertion will be created to just establish the relationship.
|
198
|
-
# ====Example
|
199
|
-
#
|
200
|
-
# communicator.familytree_v2.relationship 'KWQS-BBQ', :parent => 'KWQS-BBT'
|
201
|
-
# communicator.familytree_v2.relationship 'KWQS-BBQ', :parent => 'KWQS-BBT'
|
202
|
-
def relationship(base_id,options)
|
203
|
-
begin
|
204
|
-
r_type = get_relationship_type(options)
|
205
|
-
with_id = options[r_type.to_sym]
|
206
|
-
url = "#{Base}person/#{base_id}/#{r_type}/#{with_id}"
|
207
|
-
options.reject!{|k,v| k.to_s == 'spouse'}
|
208
|
-
url += add_querystring(options)
|
209
|
-
res = @fs_communicator.get(url)
|
210
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(res.body)
|
211
|
-
person = familytree.persons.find{|p|p.requestedId == base_id}
|
212
|
-
return person
|
213
|
-
rescue RubyFsStack::NotFound
|
214
|
-
return nil
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
# Writes a note attached to the value ID of the specific person or relationship.
|
219
|
-
#
|
220
|
-
# ====Params
|
221
|
-
# * <tt>options</tt> - Options for the note including the following:
|
222
|
-
# * <tt>:personId</tt> - the person ID if attaching to a person assertion.
|
223
|
-
# * <tt>:spouseIds</tt> - an Array of spouse IDs if creating a note attached to a spouse
|
224
|
-
# relationship assertion.
|
225
|
-
# * <tt>:parentIds</tt> - an Array of parent IDs if creating a note attached to a parent
|
226
|
-
# relationship assertion. If creating a note for a child-parent or parent-child
|
227
|
-
# relationship, you will need only one parent ID in the array along with a :childId option.
|
228
|
-
# * <tt>:childId</tt> - a child ID.
|
229
|
-
# * <tt>:text</tt> - the text of the note (required).
|
230
|
-
# * <tt>:assertionId</tt> - the valueId of the assertion you are attaching this note to.
|
231
|
-
#
|
232
|
-
def write_note(options)
|
233
|
-
url = "#{Base}note"
|
234
|
-
note = Org::Familysearch::Ws::Familytree::V2::Schema::Note.new
|
235
|
-
note.build(options)
|
236
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.new
|
237
|
-
familytree.notes = [note]
|
238
|
-
res = @fs_communicator.post(url,familytree.to_json)
|
239
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(res.body)
|
240
|
-
return familytree.notes.first
|
241
|
-
end
|
242
|
-
|
243
|
-
# Combines person into a new person
|
244
|
-
#
|
245
|
-
# ====Params
|
246
|
-
# * <tt>person_array</tt> - an array of person IDs.
|
247
|
-
def combine(person_array)
|
248
|
-
url = Base + 'person'
|
249
|
-
version_persons = self.person person_array, :genders => 'none', :events => 'none', :names => 'none'
|
250
|
-
combine_person = Org::Familysearch::Ws::Familytree::V2::Schema::Person.new
|
251
|
-
combine_person.create_combine(version_persons)
|
252
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.new
|
253
|
-
familytree.persons = [combine_person]
|
254
|
-
res = @fs_communicator.post(url,familytree.to_json)
|
255
|
-
familytree = Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(res.body)
|
256
|
-
return familytree.persons[0]
|
257
|
-
end
|
258
|
-
|
259
|
-
def pedigree(id_or_ids)
|
260
|
-
if id_or_ids.kind_of? Array
|
261
|
-
multiple_ids = true
|
262
|
-
url = Base + 'pedigree/' + id_or_ids.join(',')
|
263
|
-
else
|
264
|
-
multiple_ids = false
|
265
|
-
id = id_or_ids.to_s
|
266
|
-
if id == 'me'
|
267
|
-
url = Base + 'pedigree'
|
268
|
-
else
|
269
|
-
url = Base + 'pedigree/' + id
|
270
|
-
end
|
271
|
-
end
|
272
|
-
# url += add_querystring(options)
|
273
|
-
response = @fs_communicator.get(url)
|
274
|
-
familytree = parse_response(response)
|
275
|
-
if multiple_ids
|
276
|
-
return familytree.pedigrees
|
277
|
-
else
|
278
|
-
pedigree = familytree.pedigrees.find{|p| p.requestedId == id }
|
279
|
-
pedigree ||= familytree.pedigrees.first if id == 'me'
|
280
|
-
return pedigree
|
281
|
-
end
|
282
|
-
end
|
283
|
-
|
284
|
-
# ===params
|
285
|
-
# <tt>id_or_ids</tt> should be a string of the persons identifier. For the 'me' person, use :me or 'me'. Can also accept an array of ID strings.
|
286
|
-
# <tt>options</tt> accepts a hash of parameters as documented by the API.
|
287
|
-
# For full parameter documentation, see DevNet[https://devnet.familysearch.org/docs/api-manual-reference-system/familytree-v2/r_api_family_tree_person_read_v2.html]
|
288
|
-
#
|
289
|
-
# ===Example
|
290
|
-
# # communicator is an authenticated FsCommunicator object
|
291
|
-
# # Request a person with no assertions, only the version.
|
292
|
-
# p = communicator.familytree_v2.person :me, :names => 'none', :genders => 'none', :events => 'none'
|
293
|
-
#
|
294
|
-
# p.version # => '90194378772'
|
295
|
-
# p.id # => 'KW3B-NNM'
|
296
|
-
def contributor(id_or_ids)
|
297
|
-
if id_or_ids.kind_of? Array
|
298
|
-
multiple_ids = true
|
299
|
-
url = Base + 'contributor/' + id_or_ids.join(',')
|
300
|
-
props = properties()
|
301
|
-
if id_or_ids.size > props['contributor.max.ids']
|
302
|
-
contributors = []
|
303
|
-
id_or_ids.each_slice(props['contributor.max.ids']) do |ids_slice|
|
304
|
-
contributors = contributors + contributor(ids_slice)
|
305
|
-
end
|
306
|
-
return contributors
|
307
|
-
end
|
308
|
-
else
|
309
|
-
multiple_ids = false
|
310
|
-
id = id_or_ids.to_s
|
311
|
-
if id == 'me'
|
312
|
-
url = Base + 'contributor'
|
313
|
-
else
|
314
|
-
url = Base + 'contributor/' + id
|
315
|
-
end
|
316
|
-
end
|
317
|
-
response = @fs_communicator.get(url)
|
318
|
-
familytree = parse_response(response)
|
319
|
-
if multiple_ids
|
320
|
-
return familytree.contributors
|
321
|
-
else
|
322
|
-
return familytree.contributors.first
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
def properties
|
327
|
-
if @properties_hash
|
328
|
-
return @properties_hash
|
329
|
-
else
|
330
|
-
url = Base + 'properties'
|
331
|
-
response = @fs_communicator.get(url)
|
332
|
-
familytree = parse_response(response)
|
333
|
-
@properties_hash = {}
|
334
|
-
familytree.properties.each do |prop|
|
335
|
-
@properties_hash[prop.name] = prop.value.to_i
|
336
|
-
end
|
337
|
-
return @properties_hash
|
338
|
-
end
|
339
|
-
end
|
340
|
-
|
341
|
-
private
|
342
|
-
|
343
|
-
def parse_response(response)
|
344
|
-
Org::Familysearch::Ws::Familytree::V2::Schema::FamilyTree.from_json JSON.parse(response.body)
|
345
|
-
end
|
346
|
-
#options will either have a :parent, :child, or :spouse key. We need to find which one
|
347
|
-
def get_relationship_type(options)
|
348
|
-
keys = options.keys.collect{|k|k.to_s}
|
349
|
-
key = keys.find{|k| ['parent','child','spouse'].include? k}
|
350
|
-
key
|
351
|
-
end
|
352
|
-
|
353
|
-
def add_querystring(options)
|
354
|
-
params = options.reject{|k,v| ['parent','child','lineage','event'].include? k.to_s }
|
355
|
-
(params.empty?) ? '' : "?" + FsUtils.querystring_from_hash(params)
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
end
|
360
|
-
|
361
|
-
# Mix in the module so that the fs_familytree_v1 can be called
|
362
|
-
class FsCommunicator
|
363
|
-
include FamilytreeV2
|
364
|
-
end
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
module Org::Familysearch::Ws::Familytree::V2::Schema
|
369
|
-
|
370
|
-
class GenderAssertion
|
371
|
-
def add_value(value)
|
372
|
-
self.value = GenderValue.new
|
373
|
-
self.value.type = value
|
374
|
-
end
|
375
|
-
end
|
376
|
-
|
377
|
-
class NameForm
|
378
|
-
def set_name(name)
|
379
|
-
split_pieces = name.match(/(.*)\/(.*)\//)
|
380
|
-
# if there is a name like John Jacob /Felch/, split to name pieces, otherwise use fullText
|
381
|
-
if split_pieces
|
382
|
-
given_pieces = split_pieces[1]
|
383
|
-
family_pieces = split_pieces[2]
|
384
|
-
self.pieces = given_pieces.split(" ").collect do |piece|
|
385
|
-
p = NamePiece.new
|
386
|
-
p.type = "Given"
|
387
|
-
p.postdelimiters = " "
|
388
|
-
p.value = piece
|
389
|
-
p
|
390
|
-
end
|
391
|
-
self.pieces = self.pieces + family_pieces.split(" ").collect do |piece|
|
392
|
-
p = NamePiece.new
|
393
|
-
p.type = "Family"
|
394
|
-
p.predelimiters = ""
|
395
|
-
p.value = piece
|
396
|
-
p
|
397
|
-
end
|
398
|
-
else
|
399
|
-
self.fullText = name
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
def surname
|
404
|
-
if self.pieces.nil?
|
405
|
-
(self.fullText.nil?) ? nil : self.fullText.split(' ').last
|
406
|
-
else
|
407
|
-
piece = self.pieces.find{|piece|piece.type == 'Family'}
|
408
|
-
(piece.nil?) ? nil : piece.value
|
409
|
-
end
|
410
|
-
end
|
411
|
-
|
412
|
-
def buildFullText
|
413
|
-
if self.pieces.nil?
|
414
|
-
return ''
|
415
|
-
else
|
416
|
-
self.pieces.collect{|piece| "#{piece.predelimiters}#{piece.value}#{piece.postdelimiters}"}.join('')
|
417
|
-
end
|
418
|
-
end
|
419
|
-
end
|
420
|
-
|
421
|
-
class NameValue
|
422
|
-
def add_form(value)
|
423
|
-
self.forms = []
|
424
|
-
f = NameForm.new
|
425
|
-
f.set_name(value)
|
426
|
-
self.forms << f
|
427
|
-
end
|
428
|
-
|
429
|
-
end
|
430
|
-
|
431
|
-
class NameAssertion
|
432
|
-
def add_value(value)
|
433
|
-
self.value = NameValue.new
|
434
|
-
self.value.add_form(value)
|
435
|
-
end
|
436
|
-
|
437
|
-
def select(value_id)
|
438
|
-
self.action = 'Select'
|
439
|
-
self.value = AssertionValue.new
|
440
|
-
self.value.id = value_id
|
441
|
-
end
|
442
|
-
end
|
443
|
-
|
444
|
-
class EventValue
|
445
|
-
def add_date(value)
|
446
|
-
self.date = GenDate.new
|
447
|
-
self.date.original = value
|
448
|
-
end
|
449
|
-
|
450
|
-
def add_place(value)
|
451
|
-
self.place = Place.new
|
452
|
-
self.place.original = value
|
453
|
-
end
|
454
|
-
end
|
455
|
-
|
456
|
-
class EventAssertion
|
457
|
-
# ====Params
|
458
|
-
# * <tt>options</tt> - requires a :type option and accepts an (optional) :date and :place option
|
459
|
-
#
|
460
|
-
# ====Example
|
461
|
-
#
|
462
|
-
# person.add_birth :date => '12 Aug 1902', :place => 'United States'
|
463
|
-
def add_value(options)
|
464
|
-
raise ArgumentError, "missing option[:type]" if options[:type].nil?
|
465
|
-
self.value = EventValue.new
|
466
|
-
self.value.type = options[:type]
|
467
|
-
self.value.add_date(options[:date]) if options[:date]
|
468
|
-
self.value.add_place(options[:place]) if options[:place]
|
469
|
-
end
|
470
|
-
|
471
|
-
def select(type,value_id)
|
472
|
-
self.value = EventValue.new
|
473
|
-
self.value.id = value_id
|
474
|
-
self.value.type = type
|
475
|
-
self.action = 'Select'
|
476
|
-
end
|
477
|
-
|
478
|
-
# To make porting code from v1 to v2 easier, date will reference
|
479
|
-
# value.date
|
480
|
-
def date
|
481
|
-
value.date
|
482
|
-
end
|
483
|
-
|
484
|
-
# To make porting code from v1 to v2 easier, date will reference
|
485
|
-
# value.date
|
486
|
-
def place
|
487
|
-
value.place
|
488
|
-
end
|
489
|
-
end
|
490
|
-
|
491
|
-
class OrdinanceType
|
492
|
-
|
493
|
-
# Born in Covenant -> Possibly needs to be changed to no underscores
|
494
|
-
# Born_in_Covenant = "Born_in_Covenant"
|
495
|
-
|
496
|
-
# Override the incorrect constants in the enunciate library
|
497
|
-
with_warnings_suppressed do
|
498
|
-
# Sealing to parents.
|
499
|
-
Sealing_to_Parents = "Sealing to Parents"
|
500
|
-
|
501
|
-
# Sealing to spouse.
|
502
|
-
Sealing_to_Spouse = "Sealing to Spouse"
|
503
|
-
end
|
504
|
-
end
|
505
|
-
|
506
|
-
|
507
|
-
class OrdinanceValue
|
508
|
-
|
509
|
-
def add_date(value)
|
510
|
-
self.date = GenDate.new
|
511
|
-
self.date.original = value
|
512
|
-
end
|
513
|
-
|
514
|
-
def add_place(value)
|
515
|
-
self.place = Place.new
|
516
|
-
self.place.original = value
|
517
|
-
end
|
518
|
-
|
519
|
-
def add_mother(mother_id)
|
520
|
-
add_parent('Female',mother_id)
|
521
|
-
end
|
522
|
-
|
523
|
-
def add_father(father_id)
|
524
|
-
add_parent('Male',father_id)
|
525
|
-
end
|
526
|
-
|
527
|
-
def add_parent(gender, id)
|
528
|
-
add_parents!
|
529
|
-
parent = PersonReference.new
|
530
|
-
parent.id = id
|
531
|
-
parent.gender = gender
|
532
|
-
self.parents << parent
|
533
|
-
end
|
534
|
-
|
535
|
-
private
|
536
|
-
def add_parents!
|
537
|
-
self.parents ||= []
|
538
|
-
end
|
539
|
-
|
540
|
-
end
|
541
|
-
|
542
|
-
class OrdinanceAssertion
|
543
|
-
|
544
|
-
def add_value(options)
|
545
|
-
raise ArgumentError, "missing option[:type]" if options[:type].nil?
|
546
|
-
raise ArgumentError, "missing option[:place]" if options[:place].nil?
|
547
|
-
self.value = OrdinanceValue.new
|
548
|
-
self.value.type = options[:type]
|
549
|
-
self.value.add_date(options[:date]) if options[:date]
|
550
|
-
self.value.add_place(options[:place]) if options[:place]
|
551
|
-
self.value.temple = options[:temple] if options[:temple]
|
552
|
-
if options[:type] == OrdinanceType::Sealing_to_Parents
|
553
|
-
self.value.add_mother(options[:mother])
|
554
|
-
self.value.add_father(options[:father])
|
555
|
-
end
|
556
|
-
end
|
557
|
-
end
|
558
|
-
|
559
|
-
class PersonAssertions
|
560
|
-
def add_gender(value)
|
561
|
-
self.genders ||= []
|
562
|
-
g = GenderAssertion.new
|
563
|
-
g.add_value(value)
|
564
|
-
self.genders << g
|
565
|
-
end
|
566
|
-
|
567
|
-
def add_name(value)
|
568
|
-
self.names ||= []
|
569
|
-
n = NameAssertion.new
|
570
|
-
n.add_value(value)
|
571
|
-
self.names << n
|
572
|
-
end
|
573
|
-
|
574
|
-
def select_name(value_id)
|
575
|
-
self.names ||= []
|
576
|
-
n = NameAssertion.new
|
577
|
-
n.select(value_id)
|
578
|
-
self.names << n
|
579
|
-
end
|
580
|
-
|
581
|
-
def add_event(options)
|
582
|
-
self.events ||= []
|
583
|
-
e = EventAssertion.new
|
584
|
-
e.add_value(options)
|
585
|
-
self.events << e
|
586
|
-
end
|
587
|
-
|
588
|
-
def select_event_summary(type,value_id)
|
589
|
-
self.events ||= []
|
590
|
-
e = EventAssertion.new
|
591
|
-
e.select(type,value_id)
|
592
|
-
self.events << e
|
593
|
-
end
|
594
|
-
|
595
|
-
def add_ordinance(options)
|
596
|
-
self.ordinances ||= []
|
597
|
-
o = OrdinanceAssertion.new
|
598
|
-
o.add_value(options)
|
599
|
-
self.ordinances << o
|
600
|
-
end
|
601
|
-
|
602
|
-
end
|
603
|
-
|
604
|
-
class CharacteristicAssertion
|
605
|
-
# ====Params
|
606
|
-
# * <tt>options</tt> - same as RelationshipAssertions#add_characteristic
|
607
|
-
def add_value(options)
|
608
|
-
self.value = CharacteristicValue.new
|
609
|
-
self.value.type = options[:type]
|
610
|
-
self.value.lineage = options[:lineage] if options[:lineage]
|
611
|
-
end
|
612
|
-
end
|
613
|
-
|
614
|
-
class ExistsAssertion
|
615
|
-
def add_value
|
616
|
-
self.value = ExistsValue.new
|
617
|
-
end
|
618
|
-
end
|
619
|
-
|
620
|
-
class RelationshipAssertions
|
621
|
-
# ====Params
|
622
|
-
# * <tt>options</tt> - :type ('Lineage' or valid CharacteristicType), :lineage => 'Biological', etc.
|
623
|
-
def add_characteristic(options)
|
624
|
-
self.characteristics ||= []
|
625
|
-
characteristic = CharacteristicAssertion.new
|
626
|
-
characteristic.add_value(options)
|
627
|
-
self.characteristics << characteristic
|
628
|
-
end
|
629
|
-
|
630
|
-
# ====Params
|
631
|
-
# * <tt>options</tt> - Accepts the following options
|
632
|
-
# ** :type - 'Marriage', etc. REQUIRED
|
633
|
-
# ** :date - 'Utah, United States' (optional)
|
634
|
-
# ** :place - '16 Nov 1987' (optional)
|
635
|
-
def add_event(options)
|
636
|
-
self.events ||= []
|
637
|
-
event = EventAssertion.new
|
638
|
-
event.add_value(options)
|
639
|
-
self.events << event
|
640
|
-
end
|
641
|
-
|
642
|
-
# ====Params
|
643
|
-
# * <tt>options</tt> - Accepts the following options
|
644
|
-
# ** :type - 'Sealing_to_Spouse', etc. REQUIRED
|
645
|
-
# ** :date - 'Utah, United States' (optional)
|
646
|
-
# ** :place - '16 Nov 1987' (optional)
|
647
|
-
# ** :temple - 'SLAKE'
|
648
|
-
def add_ordinance(options)
|
649
|
-
self.ordinances ||= []
|
650
|
-
ordinance = OrdinanceAssertion.new
|
651
|
-
ordinance.add_value(options)
|
652
|
-
self.ordinances << ordinance
|
653
|
-
end
|
654
|
-
|
655
|
-
def add_exists
|
656
|
-
self.exists ||= []
|
657
|
-
exist = ExistsAssertion.new
|
658
|
-
exist.add_value
|
659
|
-
self.exists << exist
|
660
|
-
end
|
661
|
-
end
|
662
|
-
|
663
|
-
class Relationship
|
664
|
-
def add_lineage_characteristic(lineage)
|
665
|
-
add_assertions!
|
666
|
-
self.assertions.add_characteristic(:type => 'Lineage', :lineage => lineage)
|
667
|
-
end
|
668
|
-
|
669
|
-
def add_exists
|
670
|
-
add_assertions!
|
671
|
-
self.assertions.add_exists
|
672
|
-
end
|
673
|
-
|
674
|
-
# ====Params
|
675
|
-
# * <tt>event_hash</tt> - Accepts the following options
|
676
|
-
# ** :type - 'Marriage', etc. REQUIRED
|
677
|
-
# ** :date - 'Utah, United States' (optional)
|
678
|
-
# ** :place - '16 Nov 1987' (optional)
|
679
|
-
def add_event(event_hash)
|
680
|
-
add_assertions!
|
681
|
-
self.assertions.add_event(event_hash)
|
682
|
-
end
|
683
|
-
|
684
|
-
# ====Params
|
685
|
-
# * <tt>ordinance_hash</tt> - Accepts the following options
|
686
|
-
# ** :type - 'Sealing_to_Spouse', etc. REQUIRED
|
687
|
-
# ** :date - 'Utah, United States' (optional)
|
688
|
-
# ** :place - '16 Nov 1987' (optional)
|
689
|
-
# ** :temple - 'SLAKE'
|
690
|
-
def add_ordinance(ordinance_hash)
|
691
|
-
add_assertions!
|
692
|
-
self.assertions.add_ordinance(ordinance_hash)
|
693
|
-
end
|
694
|
-
|
695
|
-
private
|
696
|
-
def add_assertions!
|
697
|
-
self.assertions ||= RelationshipAssertions.new
|
698
|
-
end
|
699
|
-
end
|
700
|
-
|
701
|
-
class FamilyReference
|
702
|
-
def select_spouse(spouse_id)
|
703
|
-
add_parents!
|
704
|
-
self.action = 'Select'
|
705
|
-
parent = PersonReference.new
|
706
|
-
parent.id = spouse_id
|
707
|
-
self.parents << parent
|
708
|
-
end
|
709
|
-
|
710
|
-
private
|
711
|
-
def add_parents!
|
712
|
-
self.parents ||= []
|
713
|
-
end
|
714
|
-
end
|
715
|
-
|
716
|
-
class ParentsReference
|
717
|
-
def select_parent(parent_id, gender)
|
718
|
-
add_parents!
|
719
|
-
self.action = 'Select'
|
720
|
-
parent = PersonReference.new
|
721
|
-
parent.gender = gender
|
722
|
-
parent.id = parent_id
|
723
|
-
self.parents << parent
|
724
|
-
end
|
725
|
-
|
726
|
-
private
|
727
|
-
def add_parents!
|
728
|
-
self.parents ||= []
|
729
|
-
end
|
730
|
-
end
|
731
|
-
|
732
|
-
class PersonRelationships
|
733
|
-
def initialize
|
734
|
-
@parents = []
|
735
|
-
@spouses = []
|
736
|
-
@children = []
|
737
|
-
end
|
738
|
-
|
739
|
-
# ====Params
|
740
|
-
# * <tt>options</tt> - requires the following:
|
741
|
-
# ** :type - 'parent', 'child', 'spouse'
|
742
|
-
# ** :with - ID of the person with whom you are making the relationship
|
743
|
-
# ** :lineage (optional) - 'Biological', 'Adoptive', etc.
|
744
|
-
# ** :event - a hash with values {:type => 'Marriage', :date => '15 Nov 2007', :place => 'Utah, United States'}
|
745
|
-
# ** :ordinance - a hash with values {:date => '15 Nov 2007', :temple => 'SLAKE', :place => 'Utah, United States', :type => "Sealing_to_Spouse"}
|
746
|
-
def add_relationship(options)
|
747
|
-
relationship = self.get_relationships_of_type(options[:type]).find{|r|r.id == options[:with] || r.requestedId == options[:with]}
|
748
|
-
if relationship.nil?
|
749
|
-
relationship = Relationship.new
|
750
|
-
relationship.id = options[:with]
|
751
|
-
end
|
752
|
-
if options[:lineage]
|
753
|
-
relationship.add_lineage_characteristic(options[:lineage]) if options[:lineage]
|
754
|
-
else
|
755
|
-
relationship.add_exists
|
756
|
-
end
|
757
|
-
if options[:event]
|
758
|
-
relationship.add_event(options[:event])
|
759
|
-
end
|
760
|
-
if options[:ordinance]
|
761
|
-
relationship.add_ordinance(options[:ordinance])
|
762
|
-
end
|
763
|
-
s_command = set_command(options[:type])
|
764
|
-
self.send(s_command.to_sym,[relationship])
|
765
|
-
end
|
766
|
-
|
767
|
-
# ====Params
|
768
|
-
# * type - should be 'child', 'spouse', or 'parent'
|
769
|
-
def get_relationships_of_type(type)
|
770
|
-
g_command = get_command(type)
|
771
|
-
relationships = self.send(g_command.to_sym)
|
772
|
-
end
|
773
|
-
|
774
|
-
# Overriding the Enunciate code because of a bug (parents, spouses, and children were not pluralized)
|
775
|
-
# the json hash for this PersonRelationships
|
776
|
-
def to_jaxb_json_hash
|
777
|
-
_h = {}
|
778
|
-
if !parents.nil?
|
779
|
-
_ha = Array.new
|
780
|
-
parents.each { | _item | _ha.push _item.to_jaxb_json_hash }
|
781
|
-
_h['parents'] = _ha
|
782
|
-
end
|
783
|
-
if !spouses.nil?
|
784
|
-
_ha = Array.new
|
785
|
-
spouses.each { | _item | _ha.push _item.to_jaxb_json_hash }
|
786
|
-
_h['spouses'] = _ha
|
787
|
-
end
|
788
|
-
if !children.nil?
|
789
|
-
_ha = Array.new
|
790
|
-
children.each { | _item | _ha.push _item.to_jaxb_json_hash }
|
791
|
-
_h['children'] = _ha
|
792
|
-
end
|
793
|
-
return _h
|
794
|
-
end
|
795
|
-
|
796
|
-
# Overriding the Enunciate code because of a bug
|
797
|
-
#initializes this PersonRelationships with a json hash
|
798
|
-
def init_jaxb_json_hash(_o)
|
799
|
-
if !_o['parents'].nil?
|
800
|
-
@parents = Array.new
|
801
|
-
_oa = _o['parents']
|
802
|
-
_oa.each { | _item | @parents.push Org::Familysearch::Ws::Familytree::V2::Schema::Relationship.from_json(_item) }
|
803
|
-
end
|
804
|
-
if !_o['spouses'].nil?
|
805
|
-
@spouses = Array.new
|
806
|
-
_oa = _o['spouses']
|
807
|
-
_oa.each { | _item | @spouses.push Org::Familysearch::Ws::Familytree::V2::Schema::Relationship.from_json(_item) }
|
808
|
-
end
|
809
|
-
if !_o['children'].nil?
|
810
|
-
@children = Array.new
|
811
|
-
_oa = _o['children']
|
812
|
-
_oa.each { | _item | @children.push Org::Familysearch::Ws::Familytree::V2::Schema::Relationship.from_json(_item) }
|
813
|
-
end
|
814
|
-
end
|
815
|
-
|
816
|
-
private
|
817
|
-
def get_command(type)
|
818
|
-
(type.to_s == 'child') ? 'children' : "#{type}s"
|
819
|
-
end
|
820
|
-
|
821
|
-
def set_command(type)
|
822
|
-
get_command(type)+"="
|
823
|
-
end
|
824
|
-
end
|
825
|
-
|
826
|
-
class Person
|
827
|
-
|
828
|
-
def full_names
|
829
|
-
if assertions && assertions.names
|
830
|
-
return assertions.names.collect do |name|
|
831
|
-
(name.value.forms[0].fullText.nil?) ? name.value.forms[0].buildFullText : name.value.forms[0].fullText
|
832
|
-
end
|
833
|
-
else
|
834
|
-
[]
|
835
|
-
end
|
836
|
-
end
|
837
|
-
|
838
|
-
def full_name
|
839
|
-
self.full_names.first
|
840
|
-
end
|
841
|
-
|
842
|
-
def surnames
|
843
|
-
if assertions && assertions.names
|
844
|
-
names = assertions.names.collect do |name|
|
845
|
-
name.value.forms[0].surname
|
846
|
-
end
|
847
|
-
return names.reject{|n|n.nil?}
|
848
|
-
else
|
849
|
-
[]
|
850
|
-
end
|
851
|
-
end
|
852
|
-
|
853
|
-
def surname
|
854
|
-
surnames.first
|
855
|
-
end
|
856
|
-
|
857
|
-
def gender
|
858
|
-
if assertions && assertions.genders && assertions.genders[0] && assertions.genders[0].value
|
859
|
-
assertions.genders[0].value.type
|
860
|
-
else
|
861
|
-
nil
|
862
|
-
end
|
863
|
-
end
|
864
|
-
|
865
|
-
# Convenience method for adding the gender.
|
866
|
-
#
|
867
|
-
# ====Params
|
868
|
-
# <tt>value</tt> - 'Male' or 'Female'
|
869
|
-
def add_gender(value)
|
870
|
-
add_assertions!
|
871
|
-
assertions.add_gender(value)
|
872
|
-
end
|
873
|
-
|
874
|
-
# Convenience method for adding a name. It fills in the necessary
|
875
|
-
# structure underneath to create the name.
|
876
|
-
#
|
877
|
-
# ====Params
|
878
|
-
# <tt>value</tt> - the name to be added
|
879
|
-
#
|
880
|
-
# ====Example
|
881
|
-
#
|
882
|
-
# person.add_name 'Parker Felch' # Sets the fullText to "Parker Felch"
|
883
|
-
# person.add_name 'Parker Jones /Felch/' # Does not set the fullText, but sets the name pieces.
|
884
|
-
def add_name(value)
|
885
|
-
add_assertions!
|
886
|
-
assertions.add_name(value)
|
887
|
-
end
|
888
|
-
|
889
|
-
# Select the name for the summary view. This should be called on a Person record that
|
890
|
-
# contains a person id and version.
|
891
|
-
#
|
892
|
-
# ====Params
|
893
|
-
# <tt>value_id</tt> - the value id of a name assertion that you would like to set as the summary
|
894
|
-
#
|
895
|
-
# ===Example
|
896
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
897
|
-
# person.select_name_summary('1000134')
|
898
|
-
# com.familytree_v2.save_person person
|
899
|
-
#
|
900
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
901
|
-
def select_name_summary(value_id)
|
902
|
-
add_assertions!
|
903
|
-
assertions.select_name(value_id)
|
904
|
-
end
|
905
|
-
|
906
|
-
def births
|
907
|
-
select_events('Birth')
|
908
|
-
end
|
909
|
-
|
910
|
-
# It should return the selected birth assertion unless it is
|
911
|
-
# not set in which case it will return the first
|
912
|
-
def birth
|
913
|
-
birth = births.find{|b|!b.selected.nil?}
|
914
|
-
birth ||= births[0]
|
915
|
-
birth
|
916
|
-
end
|
917
|
-
|
918
|
-
def deaths
|
919
|
-
select_events('Death')
|
920
|
-
end
|
921
|
-
|
922
|
-
# It should return the selected death assertion unless it is
|
923
|
-
# not set in which case it will return the first
|
924
|
-
def death
|
925
|
-
death = deaths.find{|b|!b.selected.nil?}
|
926
|
-
death ||= deaths[0]
|
927
|
-
death
|
928
|
-
end
|
929
|
-
|
930
|
-
# This should only be called on a person containing relationships
|
931
|
-
def marriages(for_person)
|
932
|
-
select_spouse_events('Marriage',for_person)
|
933
|
-
end
|
934
|
-
|
935
|
-
# This should only be called on a person containing relationships
|
936
|
-
def divorces(for_person)
|
937
|
-
select_spouse_events('Divorce',for_person)
|
938
|
-
end
|
939
|
-
|
940
|
-
# Add an event with type of Birth
|
941
|
-
#
|
942
|
-
# ====Params
|
943
|
-
# * <tt>options</tt> - accepts a :date and :place option
|
944
|
-
#
|
945
|
-
# ====Example
|
946
|
-
#
|
947
|
-
# person.add_birth :date => '12 Aug 1902', :place => 'United States'
|
948
|
-
def add_birth(options)
|
949
|
-
add_assertions!
|
950
|
-
options[:type] = 'Birth'
|
951
|
-
assertions.add_event(options)
|
952
|
-
end
|
953
|
-
|
954
|
-
# Select the birth for the summary view. This should be called on a Person record that
|
955
|
-
# contains a person id and version.
|
956
|
-
#
|
957
|
-
# ====Params
|
958
|
-
# <tt>value_id</tt> - the value id of a birth assertion that you would like to set as the summary
|
959
|
-
#
|
960
|
-
# ===Example
|
961
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
962
|
-
# person.select_birth_summary('1000134')
|
963
|
-
# com.familytree_v2.save_person person
|
964
|
-
#
|
965
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
966
|
-
def select_birth_summary(value_id)
|
967
|
-
add_assertions!
|
968
|
-
assertions.select_event_summary('Birth',value_id)
|
969
|
-
end
|
970
|
-
|
971
|
-
# Add an event with type of Birth
|
972
|
-
#
|
973
|
-
# ====Params
|
974
|
-
# * <tt>options</tt> - accepts a :date and :place option
|
975
|
-
#
|
976
|
-
# ====Example
|
977
|
-
#
|
978
|
-
# person.add_birth :date => '12 Aug 1902', :place => 'United States'
|
979
|
-
def add_death(options)
|
980
|
-
add_assertions!
|
981
|
-
options[:type] = 'Death'
|
982
|
-
assertions.add_event(options)
|
983
|
-
end
|
984
|
-
|
985
|
-
# Select the death for the summary view. This should be called on a Person record that
|
986
|
-
# contains a person id and version.
|
987
|
-
#
|
988
|
-
# ====Params
|
989
|
-
# <tt>value_id</tt> - the value id of a death assertion that you would like to set as the summary
|
990
|
-
#
|
991
|
-
# ===Example
|
992
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
993
|
-
# person.select_death_summary('1000134')
|
994
|
-
# com.familytree_v2.save_person person
|
995
|
-
#
|
996
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
997
|
-
def select_death_summary(value_id)
|
998
|
-
add_assertions!
|
999
|
-
assertions.select_event_summary('Death',value_id)
|
1000
|
-
end
|
1001
|
-
|
1002
|
-
# Select the mother for the summary view. This should be called on a Person record that
|
1003
|
-
# contains a person id and version.
|
1004
|
-
#
|
1005
|
-
# Make sure you set both the mother and father before saving the person. Otherwise you will
|
1006
|
-
# set a single parent as the summary.
|
1007
|
-
#
|
1008
|
-
# ====Params
|
1009
|
-
# <tt>person_id</tt> - the person id of the mother that you would like to set as the summary
|
1010
|
-
#
|
1011
|
-
# ===Example
|
1012
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
1013
|
-
# person.select_mother_summary('KWQS-BBQ')
|
1014
|
-
# person.select_father_summary('KWQS-BBT')
|
1015
|
-
# com.familytree_v2.save_person person
|
1016
|
-
#
|
1017
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
1018
|
-
def select_mother_summary(person_id)
|
1019
|
-
add_parents!
|
1020
|
-
couple = parents[0] || ParentsReference.new
|
1021
|
-
couple.select_parent(person_id,'Female')
|
1022
|
-
parents[0] = couple
|
1023
|
-
end
|
1024
|
-
|
1025
|
-
# Select the father for the summary view. This should be called on a Person record that
|
1026
|
-
# contains a person id and version.
|
1027
|
-
#
|
1028
|
-
# Make sure you set both the mother and father before saving the person. Otherwise you will
|
1029
|
-
# set a single parent as the summary.
|
1030
|
-
#
|
1031
|
-
# ====Params
|
1032
|
-
# <tt>person_id</tt> - the person id of the father that you would like to set as the summary
|
1033
|
-
#
|
1034
|
-
# ===Example
|
1035
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
1036
|
-
# person.select_father_summary('KWQS-BBQ')
|
1037
|
-
# person.select_mother_summary('KWQS-BBT')
|
1038
|
-
# com.familytree_v2.save_person person
|
1039
|
-
#
|
1040
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
1041
|
-
def select_father_summary(person_id)
|
1042
|
-
add_parents!
|
1043
|
-
couple = parents[0] || ParentsReference.new
|
1044
|
-
couple.select_parent(person_id,'Male')
|
1045
|
-
parents[0] = couple
|
1046
|
-
end
|
1047
|
-
|
1048
|
-
# Select the spouse for the summary view. This should be called on a Person record that
|
1049
|
-
# contains a person id and version.
|
1050
|
-
#
|
1051
|
-
# ====Params
|
1052
|
-
# <tt>person_id</tt> - the person id of the spouse that you would like to set as the summary
|
1053
|
-
#
|
1054
|
-
# ===Example
|
1055
|
-
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
1056
|
-
# person.select_spouse_summary('KWQS-BBQ')
|
1057
|
-
# com.familytree_v2.save_person person
|
1058
|
-
#
|
1059
|
-
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
1060
|
-
def select_spouse_summary(person_id)
|
1061
|
-
add_families!
|
1062
|
-
family = FamilyReference.new
|
1063
|
-
family.select_spouse(person_id)
|
1064
|
-
families << family
|
1065
|
-
end
|
1066
|
-
|
1067
|
-
def baptisms
|
1068
|
-
select_ordinances('Baptism')
|
1069
|
-
end
|
1070
|
-
|
1071
|
-
def confirmations
|
1072
|
-
select_ordinances('Confirmation')
|
1073
|
-
end
|
1074
|
-
|
1075
|
-
def initiatories
|
1076
|
-
select_ordinances('Initiatory')
|
1077
|
-
end
|
1078
|
-
|
1079
|
-
def endowments
|
1080
|
-
select_ordinances('Endowment')
|
1081
|
-
end
|
1082
|
-
|
1083
|
-
def sealing_to_parents
|
1084
|
-
select_ordinances(OrdinanceType::Sealing_to_Parents)
|
1085
|
-
end
|
1086
|
-
|
1087
|
-
def sealing_to_spouses(id)
|
1088
|
-
select_relationship_ordinances(:relationship_type => 'spouse', :id => id, :type => OrdinanceType::Sealing_to_Spouse)
|
1089
|
-
end
|
1090
|
-
|
1091
|
-
# Add a baptism ordinance
|
1092
|
-
#
|
1093
|
-
# ====Params
|
1094
|
-
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
1095
|
-
#
|
1096
|
-
# ====Example
|
1097
|
-
#
|
1098
|
-
# person.add_baptism :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
1099
|
-
def add_baptism(options)
|
1100
|
-
add_assertions!
|
1101
|
-
options[:type] = 'Baptism'
|
1102
|
-
assertions.add_ordinance(options)
|
1103
|
-
end
|
1104
|
-
|
1105
|
-
# Add a confirmation ordinance
|
1106
|
-
#
|
1107
|
-
# ====Params
|
1108
|
-
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
1109
|
-
#
|
1110
|
-
# ====Example
|
1111
|
-
#
|
1112
|
-
# person.add_confirmation :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
1113
|
-
def add_confirmation(options)
|
1114
|
-
add_assertions!
|
1115
|
-
options[:type] = 'Confirmation'
|
1116
|
-
assertions.add_ordinance(options)
|
1117
|
-
end
|
1118
|
-
|
1119
|
-
# Add a initiatory ordinance
|
1120
|
-
#
|
1121
|
-
# ====Params
|
1122
|
-
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
1123
|
-
#
|
1124
|
-
# ====Example
|
1125
|
-
#
|
1126
|
-
# person.add_initiatory :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
1127
|
-
def add_initiatory(options)
|
1128
|
-
add_assertions!
|
1129
|
-
options[:type] = 'Initiatory'
|
1130
|
-
assertions.add_ordinance(options)
|
1131
|
-
end
|
1132
|
-
|
1133
|
-
# Add a endowment ordinance
|
1134
|
-
#
|
1135
|
-
# ====Params
|
1136
|
-
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
1137
|
-
#
|
1138
|
-
# ====Example
|
1139
|
-
#
|
1140
|
-
# person.add_endowment :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
1141
|
-
def add_endowment(options)
|
1142
|
-
add_assertions!
|
1143
|
-
options[:type] = 'Endowment'
|
1144
|
-
assertions.add_ordinance(options)
|
1145
|
-
end
|
1146
|
-
|
1147
|
-
# Add a sealing to parents ordinance
|
1148
|
-
#
|
1149
|
-
# ====Params
|
1150
|
-
# * <tt>options</tt> - accepts a :date, :place, :temple, :mother, and :father option
|
1151
|
-
#
|
1152
|
-
# ====Example
|
1153
|
-
#
|
1154
|
-
# person.add_sealing_to_parents :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
1155
|
-
def add_sealing_to_parents(options)
|
1156
|
-
raise ArgumentError, ":mother option is required" if options[:mother].nil?
|
1157
|
-
raise ArgumentError, ":father option is required" if options[:father].nil?
|
1158
|
-
add_assertions!
|
1159
|
-
options[:type] = OrdinanceType::Sealing_to_Parents
|
1160
|
-
assertions.add_ordinance(options)
|
1161
|
-
end
|
1162
|
-
|
1163
|
-
# This method should really only be called from FamilytreeV2::Communicator#write_relationships
|
1164
|
-
#
|
1165
|
-
# ====Params
|
1166
|
-
# * <tt>options</tt> - requires the following:
|
1167
|
-
# * :type - 'parent', 'child', 'spouse'
|
1168
|
-
# * :with - ID of the person with whom you are making the relationship
|
1169
|
-
# * :lineage (optional) - 'Biological', 'Adoptive', etc.
|
1170
|
-
# * :event - a hash with values {:type => 'Marriage', :date => '15 Nov 2007', :place => 'Utah, United States'}
|
1171
|
-
def create_relationship(options)
|
1172
|
-
raise ArgumentError, ":type option is required" if options[:type].nil?
|
1173
|
-
raise ArgumentError, ":with option is required" if options[:with].nil?
|
1174
|
-
add_relationships!
|
1175
|
-
self.relationships.add_relationship(options)
|
1176
|
-
end
|
1177
|
-
|
1178
|
-
# This method should only be called from FamilytreeV2::Communicator#combine
|
1179
|
-
#
|
1180
|
-
# ====Params
|
1181
|
-
# * <tt>persons</tt> - an array of person objects. All persons must have an id and version
|
1182
|
-
def create_combine(persons)
|
1183
|
-
self.personas = Org::Familysearch::Ws::Familytree::V2::Schema::PersonPersonas.new
|
1184
|
-
self.personas.personas = persons.map do |person|
|
1185
|
-
persona = Org::Familysearch::Ws::Familytree::V2::Schema::PersonPersona.new
|
1186
|
-
persona.id = person.id
|
1187
|
-
persona.version = person.version
|
1188
|
-
persona
|
1189
|
-
end
|
1190
|
-
end
|
1191
|
-
|
1192
|
-
def father_id
|
1193
|
-
parent_id('Male')
|
1194
|
-
end
|
1195
|
-
|
1196
|
-
def mother_id
|
1197
|
-
parent_id('Female')
|
1198
|
-
end
|
1199
|
-
|
1200
|
-
def spouse_id
|
1201
|
-
if families && families[0] && families[0].parents
|
1202
|
-
spouse_ref = families[0].parents.find{|p|p.id != self.id}
|
1203
|
-
spouse_ref.id if spouse_ref
|
1204
|
-
end
|
1205
|
-
end
|
1206
|
-
|
1207
|
-
private
|
1208
|
-
|
1209
|
-
def parent_id(gender)
|
1210
|
-
if parents && parents[0]
|
1211
|
-
parent_ref = parents[0].parents.find{|p|p.gender == gender}
|
1212
|
-
parent_ref.id if parent_ref
|
1213
|
-
end
|
1214
|
-
end
|
1215
|
-
|
1216
|
-
def add_parents!
|
1217
|
-
self.parents ||= []
|
1218
|
-
end
|
1219
|
-
|
1220
|
-
def add_families!
|
1221
|
-
self.families ||= []
|
1222
|
-
end
|
1223
|
-
|
1224
|
-
def add_relationships!
|
1225
|
-
self.relationships ||= PersonRelationships.new
|
1226
|
-
end
|
1227
|
-
|
1228
|
-
def add_assertions!
|
1229
|
-
if assertions.nil?
|
1230
|
-
self.assertions = PersonAssertions.new
|
1231
|
-
end
|
1232
|
-
end
|
1233
|
-
|
1234
|
-
def select_events(type)
|
1235
|
-
if assertions && assertions.events
|
1236
|
-
assertions.events.select{|e| e.value.type == type}
|
1237
|
-
else
|
1238
|
-
[]
|
1239
|
-
end
|
1240
|
-
end
|
1241
|
-
|
1242
|
-
def select_spouse_events(type,for_person)
|
1243
|
-
spouse = relationships.spouses.find{|s|s.requestedId=for_person}
|
1244
|
-
if spouse.assertions && spouse.assertions.events
|
1245
|
-
spouse.assertions.events.select{|e| e.value.type == type}
|
1246
|
-
else
|
1247
|
-
[]
|
1248
|
-
end
|
1249
|
-
end
|
1250
|
-
|
1251
|
-
def select_ordinances(type)
|
1252
|
-
if assertions && assertions.ordinances
|
1253
|
-
assertions.ordinances.select{|e| e.value.type == type}
|
1254
|
-
else
|
1255
|
-
[]
|
1256
|
-
end
|
1257
|
-
end
|
1258
|
-
|
1259
|
-
# only ordinance type is Sealing_to_Spouse
|
1260
|
-
def select_relationship_ordinances(options)
|
1261
|
-
raise ArgumentError, ":id required" if options[:id].nil?
|
1262
|
-
if self.relationships
|
1263
|
-
spouse_relationship = self.relationships.spouses.find{|s|s.id == options[:id]}
|
1264
|
-
if spouse_relationship && spouse_relationship.assertions && spouse_relationship.assertions.ordinances
|
1265
|
-
spouse_relationship.assertions.ordinances
|
1266
|
-
else
|
1267
|
-
[]
|
1268
|
-
end
|
1269
|
-
end
|
1270
|
-
end
|
1271
|
-
|
1272
|
-
end
|
1273
|
-
|
1274
|
-
class SearchPerson
|
1275
|
-
alias :name :full_name
|
1276
|
-
alias :ref :id
|
1277
|
-
def events
|
1278
|
-
(assertions && assertions.events) ? assertions.events : []
|
1279
|
-
end
|
1280
|
-
|
1281
|
-
# Always will return nil. Method is here for v1 backwards compatibility
|
1282
|
-
def marriage
|
1283
|
-
nil
|
1284
|
-
end
|
1285
|
-
end
|
1286
|
-
|
1287
|
-
class SearchResult
|
1288
|
-
alias :ref :id
|
1289
|
-
|
1290
|
-
def father
|
1291
|
-
parents.find{|p|p.gender == 'Male'}
|
1292
|
-
end
|
1293
|
-
|
1294
|
-
def mother
|
1295
|
-
parents.find{|p|p.gender == 'Female'}
|
1296
|
-
end
|
1297
|
-
end
|
1298
|
-
|
1299
|
-
class PedigreePerson < Person
|
1300
|
-
attr_accessor :pedigree
|
1301
|
-
|
1302
|
-
def initialize(pedigree = nil, person = nil)
|
1303
|
-
if person
|
1304
|
-
@id = person.id
|
1305
|
-
# @version = person.version if person.version
|
1306
|
-
@assertions = person.assertions if person.assertions
|
1307
|
-
@families = person.families if person.families
|
1308
|
-
@parents = person.parents if person.parents
|
1309
|
-
@properties = person.properties if person.properties
|
1310
|
-
end
|
1311
|
-
if pedigree
|
1312
|
-
@pedigree = pedigree
|
1313
|
-
end
|
1314
|
-
end
|
1315
|
-
|
1316
|
-
def father
|
1317
|
-
pedigree.get_person(father_id)
|
1318
|
-
end
|
1319
|
-
|
1320
|
-
def mother
|
1321
|
-
pedigree.get_person(mother_id)
|
1322
|
-
end
|
1323
|
-
|
1324
|
-
end
|
1325
|
-
|
1326
|
-
class Pedigree
|
1327
|
-
attr_accessor :person_hash
|
1328
|
-
|
1329
|
-
def initialize
|
1330
|
-
@person_hash = {}
|
1331
|
-
@persons = []
|
1332
|
-
end
|
1333
|
-
|
1334
|
-
def injest(pedigree)
|
1335
|
-
@person_hash.merge!(pedigree.person_hash)
|
1336
|
-
graft_persons_to_self(pedigree.persons)
|
1337
|
-
@persons = @persons + pedigree.persons
|
1338
|
-
end
|
1339
|
-
|
1340
|
-
def <<(person)
|
1341
|
-
p = PedigreePerson.new(self, person)
|
1342
|
-
@persons << p
|
1343
|
-
@person_hash[p.id] = p
|
1344
|
-
end
|
1345
|
-
|
1346
|
-
def continue_nodes
|
1347
|
-
@persons.select do |person|
|
1348
|
-
(!person.mother_id.nil? && person.mother.nil?) || (!person.father_id.nil? && person.father.nil?)
|
1349
|
-
end
|
1350
|
-
end
|
1351
|
-
|
1352
|
-
def continue_node_ids
|
1353
|
-
continue_nodes.collect{|n|n.id}
|
1354
|
-
end
|
1355
|
-
|
1356
|
-
def continue_ids
|
1357
|
-
cns = continue_nodes
|
1358
|
-
father_ids = cns.select{|n|!n.father_id.nil?}.collect{|n|n.father_id}
|
1359
|
-
mother_ids = cns.select{|n|!n.mother_id.nil?}.collect{|n|n.mother_id}
|
1360
|
-
father_ids + mother_ids
|
1361
|
-
end
|
1362
|
-
|
1363
|
-
def get_person(id)
|
1364
|
-
@person_hash[id]
|
1365
|
-
end
|
1366
|
-
|
1367
|
-
def person_ids
|
1368
|
-
@persons.collect{|p|p.id}
|
1369
|
-
end
|
1370
|
-
|
1371
|
-
def init_jaxb_json_hash(_o)
|
1372
|
-
@id = String.from_json(_o['id']) unless _o['id'].nil?
|
1373
|
-
@requestedId = String.from_json(_o['requestedId']) unless _o['requestedId'].nil?
|
1374
|
-
if !_o['persons'].nil?
|
1375
|
-
@persons = Array.new
|
1376
|
-
_oa = _o['persons']
|
1377
|
-
_oa.each do | _item |
|
1378
|
-
pedigree_person = Org::Familysearch::Ws::Familytree::V2::Schema::PedigreePerson.from_json(_item)
|
1379
|
-
pedigree_person.pedigree = self
|
1380
|
-
@persons.push pedigree_person
|
1381
|
-
@person_hash[pedigree_person.id] = pedigree_person
|
1382
|
-
end
|
1383
|
-
end
|
1384
|
-
end
|
1385
|
-
|
1386
|
-
def root
|
1387
|
-
persons.first
|
1388
|
-
end
|
1389
|
-
|
1390
|
-
private
|
1391
|
-
def graft_persons_to_self(persons_to_graft)
|
1392
|
-
persons_to_graft.each do |person|
|
1393
|
-
person.pedigree = self
|
1394
|
-
end
|
1395
|
-
end
|
1396
|
-
|
1397
|
-
end
|
1398
|
-
|
1399
|
-
class Note
|
1400
|
-
|
1401
|
-
#Builds out the elements needed for the note.
|
1402
|
-
# ====Params
|
1403
|
-
# * <tt>options</tt> - Options for the note including the following:
|
1404
|
-
# * <tt>:personId</tt> - the person ID if attaching to a person assertion.
|
1405
|
-
# * <tt>:spouseIds</tt> - an Array of spouse IDs if creating a note attached to a spouse
|
1406
|
-
# relationship assertion.
|
1407
|
-
# * <tt>:parentIds</tt> - an Array of parent IDs if creating a note attached to a parent
|
1408
|
-
# relationship assertion. If creating a note for a child-parent or parent-child
|
1409
|
-
# relationship, you will need only one parent ID in the array along with a :childId option.
|
1410
|
-
# * <tt>:childId</tt> - a child ID.
|
1411
|
-
# * <tt>:text</tt> - the text of the note (required).
|
1412
|
-
# * <tt>:assertionId</tt> - the valueId of the assertion you are attaching this note to.
|
1413
|
-
def build(options)
|
1414
|
-
if spouseIds = options[:spouseIds]
|
1415
|
-
self.spouses = spouseIds.collect do |id|
|
1416
|
-
s = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
1417
|
-
s.id = id
|
1418
|
-
s
|
1419
|
-
end
|
1420
|
-
end
|
1421
|
-
if parentIds = options[:parentIds]
|
1422
|
-
self.parents = parentIds.collect do |id|
|
1423
|
-
p = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
1424
|
-
p.id = id
|
1425
|
-
p
|
1426
|
-
end
|
1427
|
-
end
|
1428
|
-
if personId = options[:personId]
|
1429
|
-
self.person = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
1430
|
-
self.person.id = personId
|
1431
|
-
end
|
1432
|
-
if childId = options[:childId]
|
1433
|
-
self.child = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
1434
|
-
self.child.id = childId
|
1435
|
-
end
|
1436
|
-
if assertionId = options[:assertionId]
|
1437
|
-
self.assertion = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
1438
|
-
self.assertion.id = assertionId
|
1439
|
-
end
|
1440
|
-
if text = options[:text]
|
1441
|
-
self.text = text
|
1442
|
-
end
|
1443
|
-
end
|
1444
|
-
end
|
1445
|
-
end
|