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
@@ -0,0 +1,69 @@
|
|
1
|
+
module Org::Familysearch::Ws::Familytree::V2::Schema
|
2
|
+
|
3
|
+
class NameForm
|
4
|
+
def set_name(name)
|
5
|
+
split_pieces = name.match(/(.*)\/(.*)\//)
|
6
|
+
# if there is a name like John Jacob /Felch/, split to name pieces, otherwise use fullText
|
7
|
+
if split_pieces
|
8
|
+
given_pieces = split_pieces[1]
|
9
|
+
family_pieces = split_pieces[2]
|
10
|
+
self.pieces = given_pieces.split(" ").collect do |piece|
|
11
|
+
p = NamePiece.new
|
12
|
+
p.type = "Given"
|
13
|
+
p.postdelimiters = " "
|
14
|
+
p.value = piece
|
15
|
+
p
|
16
|
+
end
|
17
|
+
self.pieces = self.pieces + family_pieces.split(" ").collect do |piece|
|
18
|
+
p = NamePiece.new
|
19
|
+
p.type = "Family"
|
20
|
+
p.predelimiters = ""
|
21
|
+
p.value = piece
|
22
|
+
p
|
23
|
+
end
|
24
|
+
else
|
25
|
+
self.fullText = name
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def surname
|
30
|
+
if self.pieces.nil?
|
31
|
+
(self.fullText.nil?) ? nil : self.fullText.split(' ').last
|
32
|
+
else
|
33
|
+
piece = self.pieces.find{|piece|piece.type == 'Family'}
|
34
|
+
(piece.nil?) ? nil : piece.value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def buildFullText
|
39
|
+
if self.pieces.nil?
|
40
|
+
return ''
|
41
|
+
else
|
42
|
+
self.pieces.collect{|piece| "#{piece.predelimiters}#{piece.value}#{piece.postdelimiters}"}.join('')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class NameValue
|
48
|
+
def add_form(value)
|
49
|
+
self.forms = []
|
50
|
+
f = NameForm.new
|
51
|
+
f.set_name(value)
|
52
|
+
self.forms << f
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class NameAssertion
|
58
|
+
def add_value(value)
|
59
|
+
self.value = NameValue.new
|
60
|
+
self.value.add_form(value)
|
61
|
+
end
|
62
|
+
|
63
|
+
def select(value_id)
|
64
|
+
self.action = 'Select'
|
65
|
+
self.value = AssertionValue.new
|
66
|
+
self.value.id = value_id
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Org::Familysearch::Ws::Familytree::V2::Schema
|
2
|
+
class Note
|
3
|
+
|
4
|
+
#Builds out the elements needed for the note.
|
5
|
+
# ====Params
|
6
|
+
# * <tt>options</tt> - Options for the note including the following:
|
7
|
+
# * <tt>:personId</tt> - the person ID if attaching to a person assertion.
|
8
|
+
# * <tt>:spouseIds</tt> - an Array of spouse IDs if creating a note attached to a spouse
|
9
|
+
# relationship assertion.
|
10
|
+
# * <tt>:parentIds</tt> - an Array of parent IDs if creating a note attached to a parent
|
11
|
+
# relationship assertion. If creating a note for a child-parent or parent-child
|
12
|
+
# relationship, you will need only one parent ID in the array along with a :childId option.
|
13
|
+
# * <tt>:childId</tt> - a child ID.
|
14
|
+
# * <tt>:text</tt> - the text of the note (required).
|
15
|
+
# * <tt>:assertionId</tt> - the valueId of the assertion you are attaching this note to.
|
16
|
+
def build(options)
|
17
|
+
if spouseIds = options[:spouseIds]
|
18
|
+
self.spouses = spouseIds.collect do |id|
|
19
|
+
s = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
20
|
+
s.id = id
|
21
|
+
s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
if parentIds = options[:parentIds]
|
25
|
+
self.parents = parentIds.collect do |id|
|
26
|
+
p = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
27
|
+
p.id = id
|
28
|
+
p
|
29
|
+
end
|
30
|
+
end
|
31
|
+
if personId = options[:personId]
|
32
|
+
self.person = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
33
|
+
self.person.id = personId
|
34
|
+
end
|
35
|
+
if childId = options[:childId]
|
36
|
+
self.child = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
37
|
+
self.child.id = childId
|
38
|
+
end
|
39
|
+
if assertionId = options[:assertionId]
|
40
|
+
self.assertion = Org::Familysearch::Ws::Familytree::V2::Schema::EntityReference.new
|
41
|
+
self.assertion.id = assertionId
|
42
|
+
end
|
43
|
+
if text = options[:text]
|
44
|
+
self.text = text
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Org::Familysearch::Ws::Familytree::V2::Schema
|
2
|
+
|
3
|
+
class OrdinanceType
|
4
|
+
|
5
|
+
# Born in Covenant -> Possibly needs to be changed to no underscores
|
6
|
+
# Born_in_Covenant = "Born_in_Covenant"
|
7
|
+
|
8
|
+
# Override the incorrect constants in the enunciate library
|
9
|
+
with_warnings_suppressed do
|
10
|
+
# Sealing to parents.
|
11
|
+
Sealing_to_Parents = "Sealing to Parents"
|
12
|
+
|
13
|
+
# Sealing to spouse.
|
14
|
+
Sealing_to_Spouse = "Sealing to Spouse"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
class OrdinanceValue
|
20
|
+
|
21
|
+
def add_date(value)
|
22
|
+
self.date = GenDate.new
|
23
|
+
self.date.original = value
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_place(value)
|
27
|
+
self.place = Place.new
|
28
|
+
self.place.original = value
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_mother(mother_id)
|
32
|
+
add_parent('Female',mother_id)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_father(father_id)
|
36
|
+
add_parent('Male',father_id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_parent(gender, id)
|
40
|
+
add_parents!
|
41
|
+
parent = PersonReference.new
|
42
|
+
parent.id = id
|
43
|
+
parent.gender = gender
|
44
|
+
self.parents << parent
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def add_parents!
|
49
|
+
self.parents ||= []
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
class OrdinanceAssertion
|
55
|
+
|
56
|
+
def add_value(options)
|
57
|
+
raise ArgumentError, "missing option[:type]" if options[:type].nil?
|
58
|
+
raise ArgumentError, "missing option[:place]" if options[:place].nil?
|
59
|
+
self.value = OrdinanceValue.new
|
60
|
+
self.value.type = options[:type]
|
61
|
+
self.value.add_date(options[:date]) if options[:date]
|
62
|
+
self.value.add_place(options[:place]) if options[:place]
|
63
|
+
self.value.temple = options[:temple] if options[:temple]
|
64
|
+
if options[:type] == OrdinanceType::Sealing_to_Parents
|
65
|
+
self.value.add_mother(options[:mother])
|
66
|
+
self.value.add_father(options[:father])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Org::Familysearch::Ws::Familytree::V2::Schema
|
2
|
+
class PedigreePerson < Person
|
3
|
+
attr_accessor :pedigree
|
4
|
+
|
5
|
+
def initialize(pedigree = nil, person = nil)
|
6
|
+
if person
|
7
|
+
@id = person.id
|
8
|
+
# @version = person.version if person.version
|
9
|
+
@assertions = person.assertions if person.assertions
|
10
|
+
@families = person.families if person.families
|
11
|
+
@parents = person.parents if person.parents
|
12
|
+
@properties = person.properties if person.properties
|
13
|
+
end
|
14
|
+
if pedigree
|
15
|
+
@pedigree = pedigree
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def father
|
20
|
+
pedigree.get_person(father_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def mother
|
24
|
+
pedigree.get_person(mother_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
class Pedigree
|
32
|
+
attr_accessor :person_hash
|
33
|
+
|
34
|
+
def initialize
|
35
|
+
@person_hash = {}
|
36
|
+
@persons = []
|
37
|
+
end
|
38
|
+
|
39
|
+
def injest(pedigree)
|
40
|
+
@person_hash.merge!(pedigree.person_hash)
|
41
|
+
graft_persons_to_self(pedigree.persons)
|
42
|
+
@persons = @persons + pedigree.persons
|
43
|
+
end
|
44
|
+
|
45
|
+
def <<(person)
|
46
|
+
p = PedigreePerson.new(self, person)
|
47
|
+
@persons << p
|
48
|
+
@person_hash[p.id] = p
|
49
|
+
end
|
50
|
+
|
51
|
+
def continue_nodes
|
52
|
+
@persons.select do |person|
|
53
|
+
(!person.mother_id.nil? && person.mother.nil?) || (!person.father_id.nil? && person.father.nil?)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def continue_node_ids
|
58
|
+
continue_nodes.collect{|n|n.id}
|
59
|
+
end
|
60
|
+
|
61
|
+
def continue_ids
|
62
|
+
cns = continue_nodes
|
63
|
+
father_ids = cns.select{|n|!n.father_id.nil?}.collect{|n|n.father_id}
|
64
|
+
mother_ids = cns.select{|n|!n.mother_id.nil?}.collect{|n|n.mother_id}
|
65
|
+
father_ids + mother_ids
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_person(id)
|
69
|
+
@person_hash[id]
|
70
|
+
end
|
71
|
+
|
72
|
+
def person_ids
|
73
|
+
@persons.collect{|p|p.id}
|
74
|
+
end
|
75
|
+
|
76
|
+
def init_jaxb_json_hash(_o)
|
77
|
+
@id = String.from_json(_o['id']) unless _o['id'].nil?
|
78
|
+
@requestedId = String.from_json(_o['requestedId']) unless _o['requestedId'].nil?
|
79
|
+
if !_o['persons'].nil?
|
80
|
+
@persons = Array.new
|
81
|
+
_oa = _o['persons']
|
82
|
+
_oa.each do | _item |
|
83
|
+
pedigree_person = Org::Familysearch::Ws::Familytree::V2::Schema::PedigreePerson.from_json(_item)
|
84
|
+
pedigree_person.pedigree = self
|
85
|
+
@persons.push pedigree_person
|
86
|
+
@person_hash[pedigree_person.id] = pedigree_person
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def root
|
92
|
+
persons.first
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
def graft_persons_to_self(persons_to_graft)
|
97
|
+
persons_to_graft.each do |person|
|
98
|
+
person.pedigree = self
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,495 @@
|
|
1
|
+
module Org::Familysearch::Ws::Familytree::V2::Schema
|
2
|
+
|
3
|
+
class PersonAssertions
|
4
|
+
def add_gender(value)
|
5
|
+
self.genders ||= []
|
6
|
+
g = GenderAssertion.new
|
7
|
+
g.add_value(value)
|
8
|
+
self.genders << g
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_name(value)
|
12
|
+
self.names ||= []
|
13
|
+
n = NameAssertion.new
|
14
|
+
n.add_value(value)
|
15
|
+
self.names << n
|
16
|
+
end
|
17
|
+
|
18
|
+
def select_name(value_id)
|
19
|
+
self.names ||= []
|
20
|
+
n = NameAssertion.new
|
21
|
+
n.select(value_id)
|
22
|
+
self.names << n
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_event(options)
|
26
|
+
self.events ||= []
|
27
|
+
e = EventAssertion.new
|
28
|
+
e.add_value(options)
|
29
|
+
self.events << e
|
30
|
+
end
|
31
|
+
|
32
|
+
def select_event_summary(type,value_id)
|
33
|
+
self.events ||= []
|
34
|
+
e = EventAssertion.new
|
35
|
+
e.select(type,value_id)
|
36
|
+
self.events << e
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_ordinance(options)
|
40
|
+
self.ordinances ||= []
|
41
|
+
o = OrdinanceAssertion.new
|
42
|
+
o.add_value(options)
|
43
|
+
self.ordinances << o
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class Person
|
49
|
+
|
50
|
+
def full_names
|
51
|
+
if assertions && assertions.names
|
52
|
+
return assertions.names.collect do |name|
|
53
|
+
(name.value.forms[0].fullText.nil?) ? name.value.forms[0].buildFullText : name.value.forms[0].fullText
|
54
|
+
end
|
55
|
+
else
|
56
|
+
[]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def full_name
|
61
|
+
self.full_names.first
|
62
|
+
end
|
63
|
+
|
64
|
+
def surnames
|
65
|
+
if assertions && assertions.names
|
66
|
+
names = assertions.names.collect do |name|
|
67
|
+
name.value.forms[0].surname
|
68
|
+
end
|
69
|
+
return names.reject{|n|n.nil?}
|
70
|
+
else
|
71
|
+
[]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def surname
|
76
|
+
surnames.first
|
77
|
+
end
|
78
|
+
|
79
|
+
def gender
|
80
|
+
if assertions && assertions.genders && assertions.genders[0] && assertions.genders[0].value
|
81
|
+
assertions.genders[0].value.type
|
82
|
+
else
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# Convenience method for adding the gender.
|
88
|
+
#
|
89
|
+
# ====Params
|
90
|
+
# <tt>value</tt> - 'Male' or 'Female'
|
91
|
+
def add_gender(value)
|
92
|
+
add_assertions!
|
93
|
+
assertions.add_gender(value)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Convenience method for adding a name. It fills in the necessary
|
97
|
+
# structure underneath to create the name.
|
98
|
+
#
|
99
|
+
# ====Params
|
100
|
+
# <tt>value</tt> - the name to be added
|
101
|
+
#
|
102
|
+
# ====Example
|
103
|
+
#
|
104
|
+
# person.add_name 'Parker Felch' # Sets the fullText to "Parker Felch"
|
105
|
+
# person.add_name 'Parker Jones /Felch/' # Does not set the fullText, but sets the name pieces.
|
106
|
+
def add_name(value)
|
107
|
+
add_assertions!
|
108
|
+
assertions.add_name(value)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Select the name for the summary view. This should be called on a Person record that
|
112
|
+
# contains a person id and version.
|
113
|
+
#
|
114
|
+
# ====Params
|
115
|
+
# <tt>value_id</tt> - the value id of a name assertion that you would like to set as the summary
|
116
|
+
#
|
117
|
+
# ===Example
|
118
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
119
|
+
# person.select_name_summary('1000134')
|
120
|
+
# com.familytree_v2.save_person person
|
121
|
+
#
|
122
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
123
|
+
def select_name_summary(value_id)
|
124
|
+
add_assertions!
|
125
|
+
assertions.select_name(value_id)
|
126
|
+
end
|
127
|
+
|
128
|
+
def births
|
129
|
+
select_events('Birth')
|
130
|
+
end
|
131
|
+
|
132
|
+
# It should return the selected birth assertion unless it is
|
133
|
+
# not set in which case it will return the first
|
134
|
+
def birth
|
135
|
+
birth = births.find{|b|!b.selected.nil?}
|
136
|
+
birth ||= births[0]
|
137
|
+
birth
|
138
|
+
end
|
139
|
+
|
140
|
+
def deaths
|
141
|
+
select_events('Death')
|
142
|
+
end
|
143
|
+
|
144
|
+
# It should return the selected death assertion unless it is
|
145
|
+
# not set in which case it will return the first
|
146
|
+
def death
|
147
|
+
death = deaths.find{|b|!b.selected.nil?}
|
148
|
+
death ||= deaths[0]
|
149
|
+
death
|
150
|
+
end
|
151
|
+
|
152
|
+
# This should only be called on a person containing relationships
|
153
|
+
def marriages(for_person)
|
154
|
+
select_spouse_events('Marriage',for_person)
|
155
|
+
end
|
156
|
+
|
157
|
+
# This should only be called on a person containing relationships
|
158
|
+
def divorces(for_person)
|
159
|
+
select_spouse_events('Divorce',for_person)
|
160
|
+
end
|
161
|
+
|
162
|
+
# Add an event with type of Birth
|
163
|
+
#
|
164
|
+
# ====Params
|
165
|
+
# * <tt>options</tt> - accepts a :date and :place option
|
166
|
+
#
|
167
|
+
# ====Example
|
168
|
+
#
|
169
|
+
# person.add_birth :date => '12 Aug 1902', :place => 'United States'
|
170
|
+
def add_birth(options)
|
171
|
+
add_assertions!
|
172
|
+
options[:type] = 'Birth'
|
173
|
+
assertions.add_event(options)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Select the birth for the summary view. This should be called on a Person record that
|
177
|
+
# contains a person id and version.
|
178
|
+
#
|
179
|
+
# ====Params
|
180
|
+
# <tt>value_id</tt> - the value id of a birth assertion that you would like to set as the summary
|
181
|
+
#
|
182
|
+
# ===Example
|
183
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
184
|
+
# person.select_birth_summary('1000134')
|
185
|
+
# com.familytree_v2.save_person person
|
186
|
+
#
|
187
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
188
|
+
def select_birth_summary(value_id)
|
189
|
+
add_assertions!
|
190
|
+
assertions.select_event_summary('Birth',value_id)
|
191
|
+
end
|
192
|
+
|
193
|
+
# Add an event with type of Birth
|
194
|
+
#
|
195
|
+
# ====Params
|
196
|
+
# * <tt>options</tt> - accepts a :date and :place option
|
197
|
+
#
|
198
|
+
# ====Example
|
199
|
+
#
|
200
|
+
# person.add_birth :date => '12 Aug 1902', :place => 'United States'
|
201
|
+
def add_death(options)
|
202
|
+
add_assertions!
|
203
|
+
options[:type] = 'Death'
|
204
|
+
assertions.add_event(options)
|
205
|
+
end
|
206
|
+
|
207
|
+
# Select the death for the summary view. This should be called on a Person record that
|
208
|
+
# contains a person id and version.
|
209
|
+
#
|
210
|
+
# ====Params
|
211
|
+
# <tt>value_id</tt> - the value id of a death assertion that you would like to set as the summary
|
212
|
+
#
|
213
|
+
# ===Example
|
214
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
215
|
+
# person.select_death_summary('1000134')
|
216
|
+
# com.familytree_v2.save_person person
|
217
|
+
#
|
218
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
219
|
+
def select_death_summary(value_id)
|
220
|
+
add_assertions!
|
221
|
+
assertions.select_event_summary('Death',value_id)
|
222
|
+
end
|
223
|
+
|
224
|
+
# Select the mother for the summary view. This should be called on a Person record that
|
225
|
+
# contains a person id and version.
|
226
|
+
#
|
227
|
+
# Make sure you set both the mother and father before saving the person. Otherwise you will
|
228
|
+
# set a single parent as the summary.
|
229
|
+
#
|
230
|
+
# ====Params
|
231
|
+
# <tt>person_id</tt> - the person id of the mother that you would like to set as the summary
|
232
|
+
#
|
233
|
+
# ===Example
|
234
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
235
|
+
# person.select_mother_summary('KWQS-BBQ')
|
236
|
+
# person.select_father_summary('KWQS-BBT')
|
237
|
+
# com.familytree_v2.save_person person
|
238
|
+
#
|
239
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
240
|
+
def select_mother_summary(person_id)
|
241
|
+
add_parents!
|
242
|
+
couple = parents[0] || ParentsReference.new
|
243
|
+
couple.select_parent(person_id,'Female')
|
244
|
+
parents[0] = couple
|
245
|
+
end
|
246
|
+
|
247
|
+
# Select the father for the summary view. This should be called on a Person record that
|
248
|
+
# contains a person id and version.
|
249
|
+
#
|
250
|
+
# Make sure you set both the mother and father before saving the person. Otherwise you will
|
251
|
+
# set a single parent as the summary.
|
252
|
+
#
|
253
|
+
# ====Params
|
254
|
+
# <tt>person_id</tt> - the person id of the father that you would like to set as the summary
|
255
|
+
#
|
256
|
+
# ===Example
|
257
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
258
|
+
# person.select_father_summary('KWQS-BBQ')
|
259
|
+
# person.select_mother_summary('KWQS-BBT')
|
260
|
+
# com.familytree_v2.save_person person
|
261
|
+
#
|
262
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
263
|
+
def select_father_summary(person_id)
|
264
|
+
add_parents!
|
265
|
+
couple = parents[0] || ParentsReference.new
|
266
|
+
couple.select_parent(person_id,'Male')
|
267
|
+
parents[0] = couple
|
268
|
+
end
|
269
|
+
|
270
|
+
# Select the spouse for the summary view. This should be called on a Person record that
|
271
|
+
# contains a person id and version.
|
272
|
+
#
|
273
|
+
# ====Params
|
274
|
+
# <tt>person_id</tt> - the person id of the spouse that you would like to set as the summary
|
275
|
+
#
|
276
|
+
# ===Example
|
277
|
+
# person = com.familytree_v2.person 'KWQS-BBR', :names => 'none', :genders => 'none', :events => 'none'
|
278
|
+
# person.select_spouse_summary('KWQS-BBQ')
|
279
|
+
# com.familytree_v2.save_person person
|
280
|
+
#
|
281
|
+
# This is the recommended approach, to start with a "Version" person (no names, genders, or events)
|
282
|
+
def select_spouse_summary(person_id)
|
283
|
+
add_families!
|
284
|
+
family = FamilyReference.new
|
285
|
+
family.select_spouse(person_id)
|
286
|
+
families << family
|
287
|
+
end
|
288
|
+
|
289
|
+
def baptisms
|
290
|
+
select_ordinances('Baptism')
|
291
|
+
end
|
292
|
+
|
293
|
+
def confirmations
|
294
|
+
select_ordinances('Confirmation')
|
295
|
+
end
|
296
|
+
|
297
|
+
def initiatories
|
298
|
+
select_ordinances('Initiatory')
|
299
|
+
end
|
300
|
+
|
301
|
+
def endowments
|
302
|
+
select_ordinances('Endowment')
|
303
|
+
end
|
304
|
+
|
305
|
+
def sealing_to_parents
|
306
|
+
select_ordinances(OrdinanceType::Sealing_to_Parents)
|
307
|
+
end
|
308
|
+
|
309
|
+
def sealing_to_spouses(id)
|
310
|
+
select_relationship_ordinances(:relationship_type => 'spouse', :id => id, :type => OrdinanceType::Sealing_to_Spouse)
|
311
|
+
end
|
312
|
+
|
313
|
+
# Add a baptism ordinance
|
314
|
+
#
|
315
|
+
# ====Params
|
316
|
+
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
317
|
+
#
|
318
|
+
# ====Example
|
319
|
+
#
|
320
|
+
# person.add_baptism :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
321
|
+
def add_baptism(options)
|
322
|
+
add_assertions!
|
323
|
+
options[:type] = 'Baptism'
|
324
|
+
assertions.add_ordinance(options)
|
325
|
+
end
|
326
|
+
|
327
|
+
# Add a confirmation ordinance
|
328
|
+
#
|
329
|
+
# ====Params
|
330
|
+
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
331
|
+
#
|
332
|
+
# ====Example
|
333
|
+
#
|
334
|
+
# person.add_confirmation :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
335
|
+
def add_confirmation(options)
|
336
|
+
add_assertions!
|
337
|
+
options[:type] = 'Confirmation'
|
338
|
+
assertions.add_ordinance(options)
|
339
|
+
end
|
340
|
+
|
341
|
+
# Add a initiatory ordinance
|
342
|
+
#
|
343
|
+
# ====Params
|
344
|
+
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
345
|
+
#
|
346
|
+
# ====Example
|
347
|
+
#
|
348
|
+
# person.add_initiatory :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
349
|
+
def add_initiatory(options)
|
350
|
+
add_assertions!
|
351
|
+
options[:type] = 'Initiatory'
|
352
|
+
assertions.add_ordinance(options)
|
353
|
+
end
|
354
|
+
|
355
|
+
# Add a endowment ordinance
|
356
|
+
#
|
357
|
+
# ====Params
|
358
|
+
# * <tt>options</tt> - accepts a :date, :place, and :temple option
|
359
|
+
#
|
360
|
+
# ====Example
|
361
|
+
#
|
362
|
+
# person.add_endowment :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
363
|
+
def add_endowment(options)
|
364
|
+
add_assertions!
|
365
|
+
options[:type] = 'Endowment'
|
366
|
+
assertions.add_ordinance(options)
|
367
|
+
end
|
368
|
+
|
369
|
+
# Add a sealing to parents ordinance
|
370
|
+
#
|
371
|
+
# ====Params
|
372
|
+
# * <tt>options</tt> - accepts a :date, :place, :temple, :mother, and :father option
|
373
|
+
#
|
374
|
+
# ====Example
|
375
|
+
#
|
376
|
+
# person.add_sealing_to_parents :date => '14 Aug 2009', :temple => 'SGEOR', :place => 'Salt Lake City, Utah'
|
377
|
+
def add_sealing_to_parents(options)
|
378
|
+
raise ArgumentError, ":mother option is required" if options[:mother].nil?
|
379
|
+
raise ArgumentError, ":father option is required" if options[:father].nil?
|
380
|
+
add_assertions!
|
381
|
+
options[:type] = OrdinanceType::Sealing_to_Parents
|
382
|
+
assertions.add_ordinance(options)
|
383
|
+
end
|
384
|
+
|
385
|
+
# This method should really only be called from FamilytreeV2::Communicator#write_relationships
|
386
|
+
#
|
387
|
+
# ====Params
|
388
|
+
# * <tt>options</tt> - requires the following:
|
389
|
+
# * :type - 'parent', 'child', 'spouse'
|
390
|
+
# * :with - ID of the person with whom you are making the relationship
|
391
|
+
# * :lineage (optional) - 'Biological', 'Adoptive', etc.
|
392
|
+
# * :event - a hash with values {:type => 'Marriage', :date => '15 Nov 2007', :place => 'Utah, United States'}
|
393
|
+
def create_relationship(options)
|
394
|
+
raise ArgumentError, ":type option is required" if options[:type].nil?
|
395
|
+
raise ArgumentError, ":with option is required" if options[:with].nil?
|
396
|
+
add_relationships!
|
397
|
+
self.relationships.add_relationship(options)
|
398
|
+
end
|
399
|
+
|
400
|
+
# This method should only be called from FamilytreeV2::Communicator#combine
|
401
|
+
#
|
402
|
+
# ====Params
|
403
|
+
# * <tt>persons</tt> - an array of person objects. All persons must have an id and version
|
404
|
+
def create_combine(persons)
|
405
|
+
self.personas = Org::Familysearch::Ws::Familytree::V2::Schema::PersonPersonas.new
|
406
|
+
self.personas.personas = persons.map do |person|
|
407
|
+
persona = Org::Familysearch::Ws::Familytree::V2::Schema::PersonPersona.new
|
408
|
+
persona.id = person.id
|
409
|
+
persona.version = person.version
|
410
|
+
persona
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
def father_id
|
415
|
+
parent_id('Male')
|
416
|
+
end
|
417
|
+
|
418
|
+
def mother_id
|
419
|
+
parent_id('Female')
|
420
|
+
end
|
421
|
+
|
422
|
+
def spouse_id
|
423
|
+
if families && families[0] && families[0].parents
|
424
|
+
spouse_ref = families[0].parents.find{|p|p.id != self.id}
|
425
|
+
spouse_ref.id if spouse_ref
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
private
|
430
|
+
|
431
|
+
def parent_id(gender)
|
432
|
+
if parents && parents[0]
|
433
|
+
parent_ref = parents[0].parents.find{|p|p.gender == gender}
|
434
|
+
parent_ref.id if parent_ref
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
def add_parents!
|
439
|
+
self.parents ||= []
|
440
|
+
end
|
441
|
+
|
442
|
+
def add_families!
|
443
|
+
self.families ||= []
|
444
|
+
end
|
445
|
+
|
446
|
+
def add_relationships!
|
447
|
+
self.relationships ||= PersonRelationships.new
|
448
|
+
end
|
449
|
+
|
450
|
+
def add_assertions!
|
451
|
+
if assertions.nil?
|
452
|
+
self.assertions = PersonAssertions.new
|
453
|
+
end
|
454
|
+
end
|
455
|
+
|
456
|
+
def select_events(type)
|
457
|
+
if assertions && assertions.events
|
458
|
+
assertions.events.select{|e| e.value.type == type}
|
459
|
+
else
|
460
|
+
[]
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
def select_spouse_events(type,for_person)
|
465
|
+
spouse = relationships.spouses.find{|s|s.requestedId=for_person}
|
466
|
+
if spouse.assertions && spouse.assertions.events
|
467
|
+
spouse.assertions.events.select{|e| e.value.type == type}
|
468
|
+
else
|
469
|
+
[]
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
473
|
+
def select_ordinances(type)
|
474
|
+
if assertions && assertions.ordinances
|
475
|
+
assertions.ordinances.select{|e| e.value.type == type}
|
476
|
+
else
|
477
|
+
[]
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
# only ordinance type is Sealing_to_Spouse
|
482
|
+
def select_relationship_ordinances(options)
|
483
|
+
raise ArgumentError, ":id required" if options[:id].nil?
|
484
|
+
if self.relationships
|
485
|
+
spouse_relationship = self.relationships.spouses.find{|s|s.id == options[:id]}
|
486
|
+
if spouse_relationship && spouse_relationship.assertions && spouse_relationship.assertions.ordinances
|
487
|
+
spouse_relationship.assertions.ordinances
|
488
|
+
else
|
489
|
+
[]
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
493
|
+
|
494
|
+
end
|
495
|
+
end
|