genealogy 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/genealogy/alter_methods.rb +9 -1
- data/lib/genealogy/constants.rb +10 -9
- data/lib/genealogy/ineligible_methods.rb +51 -11
- data/lib/genealogy/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: da5a494d35d958b648df8c4f1976db27abd22d9b1388cf9bdbfa82f9ff5ac92c
|
|
4
|
+
data.tar.gz: 75613c06ae73ff27fb53b24dc9dd867fd56e5c8b72c43ea54afb08a6d7601373
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5061aa292b318ed81e38ae9897ed4f25f6edab8a6a84d0667a50e1940269e0739000091884fa953d6948978397bd63c23695ae49d11f14fecc63c6c2c0fe1362
|
|
7
|
+
data.tar.gz: c794897c6484d2ebcc254a870e5456064a01e3538695ece896f2c926eff0f3928b942b9732eb0abf513d5f218310628088bc1019fbae0fb117fefe59fc462604
|
|
@@ -175,7 +175,15 @@ module Genealogy
|
|
|
175
175
|
# @return [Boolean]
|
|
176
176
|
def add_siblings(*args)
|
|
177
177
|
options = args.extract_options!
|
|
178
|
-
|
|
178
|
+
case options[:half]
|
|
179
|
+
when :father
|
|
180
|
+
check_incompatible_relationship(:paternal_half_sibling, *args)
|
|
181
|
+
when :mother
|
|
182
|
+
check_incompatible_relationship(:maternal_half_sibling, *args)
|
|
183
|
+
when nil
|
|
184
|
+
check_incompatible_relationship(:sibling, *args)
|
|
185
|
+
end
|
|
186
|
+
|
|
179
187
|
transaction do
|
|
180
188
|
args.inject(true) do |res,sib|
|
|
181
189
|
res &= case options[:half]
|
data/lib/genealogy/constants.rb
CHANGED
|
@@ -31,6 +31,7 @@ module Genealogy
|
|
|
31
31
|
|
|
32
32
|
PARENT2LINEAGE = ActiveSupport::HashWithIndifferentAccess.new({ father: :paternal, mother: :maternal })
|
|
33
33
|
LINEAGE2PARENT = ActiveSupport::HashWithIndifferentAccess.new({ paternal: :father, maternal: :mother })
|
|
34
|
+
OPPOSITELINEAGE = ActiveSupport::HashWithIndifferentAccess.new({ paternal: :maternal, maternal: :paternal })
|
|
34
35
|
PARENT2SEX = ActiveSupport::HashWithIndifferentAccess.new({ father: :male, mother: :female })
|
|
35
36
|
SEX2PARENT = ActiveSupport::HashWithIndifferentAccess.new({ male: :father, female: :mother })
|
|
36
37
|
OPPOSITESEX = ActiveSupport::HashWithIndifferentAccess.new({male: :female, female: :male})
|
|
@@ -38,18 +39,18 @@ module Genealogy
|
|
|
38
39
|
AKA = ActiveSupport::HashWithIndifferentAccess.new({
|
|
39
40
|
father: "F",
|
|
40
41
|
mother: "M",
|
|
41
|
-
paternal_grandfather: "PGF",
|
|
42
|
-
paternal_grandmother: "PGM",
|
|
43
|
-
maternal_grandfather: "MGF",
|
|
44
|
-
maternal_grandmother: "MGM",
|
|
42
|
+
paternal_grandfather: "PGF",
|
|
43
|
+
paternal_grandmother: "PGM",
|
|
44
|
+
maternal_grandfather: "MGF",
|
|
45
|
+
maternal_grandmother: "MGM",
|
|
45
46
|
children: "C",
|
|
46
|
-
siblings: "S",
|
|
47
|
+
siblings: "S",
|
|
47
48
|
half_siblings: "HS",
|
|
48
49
|
paternal_half_siblings: "PHS",
|
|
49
|
-
maternal_half_siblings: "MHS",
|
|
50
|
-
grandchildren: "GC",
|
|
51
|
-
uncles_and_aunts: "U&A",
|
|
50
|
+
maternal_half_siblings: "MHS",
|
|
51
|
+
grandchildren: "GC",
|
|
52
|
+
uncles_and_aunts: "U&A",
|
|
52
53
|
nieces_and_nephews: "N&N"
|
|
53
54
|
})
|
|
54
55
|
end
|
|
55
|
-
end
|
|
56
|
+
end
|
|
@@ -14,7 +14,7 @@ module Genealogy
|
|
|
14
14
|
# @return [Array, NilClass] Return nil if $1 already assigned
|
|
15
15
|
def self.generate_method_ineligibles_parent_with_docs(parent_role,unexpected_sex)
|
|
16
16
|
define_method "ineligible_#{parent_role}s" do
|
|
17
|
-
unless self.send(parent_role)
|
|
17
|
+
unless self.send(parent_role)
|
|
18
18
|
ineligibles = []
|
|
19
19
|
ineligibles |= descendants | [self] | gclass.send("#{unexpected_sex}s") if gclass.ineligibility_level >= PEDIGREE
|
|
20
20
|
if gclass.ineligibility_level >= PEDIGREE_AND_DATES and birth_range
|
|
@@ -32,7 +32,7 @@ module Genealogy
|
|
|
32
32
|
|
|
33
33
|
# @!macro [attach] generate_method_ineligible_grandparent_with_docs
|
|
34
34
|
# @method ineligible_$1_grand$3s
|
|
35
|
-
# list of individual who cannot be $1 grand$3 according to the ineligibility level in use. If `self`'s $2 is known, it returns $2's ineligible $3s.
|
|
35
|
+
# list of individual who cannot be $1 grand$3 according to the ineligibility level in use. If `self`'s $2 is known, it returns $2's ineligible $3s.
|
|
36
36
|
# Otherwise, at `:pedigree` level it returns `self` along with descendants, full siblings and all $4s.
|
|
37
37
|
# At `:pedigree_and_dates` level it also includes all individuals who were not fertile during `self`'s $2 estimated birth period.
|
|
38
38
|
# @return [Array, NilClass] Return nil if $1 grand$3 already assigned
|
|
@@ -41,11 +41,11 @@ module Genealogy
|
|
|
41
41
|
define_method "ineligible_#{relationship}s" do
|
|
42
42
|
unless send(relationship)
|
|
43
43
|
ineligibles = []
|
|
44
|
-
if parent = send(parent_role)
|
|
44
|
+
if parent = send(parent_role)
|
|
45
45
|
ineligibles |= parent.send("ineligible_#{grandparent2parent_role}s")
|
|
46
46
|
elsif gclass.ineligibility_level >= PEDIGREE
|
|
47
47
|
ineligibles |= descendants | siblings | [self] | gclass.send("#{unexpected_sex}s")
|
|
48
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
|
48
|
+
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
|
49
49
|
ineligibles |= (gclass.all - ineligibles).find_all do |indiv|
|
|
50
50
|
!indiv.can_procreate_during?(send("#{parent_role}_birth_range"))
|
|
51
51
|
end
|
|
@@ -55,13 +55,13 @@ module Genealogy
|
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
57
|
end
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
generate_method_ineligible_grandparent_with_docs(:paternal,:father,:father, :female)
|
|
60
60
|
generate_method_ineligible_grandparent_with_docs(:paternal,:father,:mother, :male)
|
|
61
61
|
generate_method_ineligible_grandparent_with_docs(:maternal,:mother,:father, :female)
|
|
62
62
|
generate_method_ineligible_grandparent_with_docs(:maternal,:mother,:mother, :male)
|
|
63
63
|
|
|
64
|
-
# list of individual who cannot be children according to the ineligibility level in use.
|
|
64
|
+
# list of individual who cannot be children according to the ineligibility level in use.
|
|
65
65
|
# At `:pedigree` level it returns `self` along with their ancestors, children, full siblings and all individuals that already have father (if male) or mother (if female).
|
|
66
66
|
# At `:pedigree_and_dates` level it also includes all individuals who was born outside `self`'s fertility range, if estimable.
|
|
67
67
|
# @return [Array]
|
|
@@ -74,9 +74,9 @@ module Genealogy
|
|
|
74
74
|
ineligibles
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
# list of individual who cannot be siblings according to the ineligibility level in use.
|
|
77
|
+
# list of individual who cannot be siblings according to the ineligibility level in use.
|
|
78
78
|
# At `:pedigree` level it returns `self` along with their full siblings, ancestors, descendants and all individuals with different father or mother.
|
|
79
|
-
# At `:pedigree_and_dates` level it also includes all individuals who cannot be siblings for age reasons. For each parent, if it is known
|
|
79
|
+
# At `:pedigree_and_dates` level it also includes all individuals who cannot be siblings for age reasons. For each parent, if it is known
|
|
80
80
|
# it includes parent's ineligible children, otherwise it tries to estimate parent's fertility period: if it's possible it includes all individuals whose estimated birth period doesn't overlap parent's fertility period.
|
|
81
81
|
# @return [Array]
|
|
82
82
|
def ineligible_siblings
|
|
@@ -86,7 +86,7 @@ module Genealogy
|
|
|
86
86
|
ineligibles |= (father ? gclass.all_with(:father).where("father_id != ?", father) : [])
|
|
87
87
|
ineligibles |= (mother ? gclass.all_with(:mother).where("mother_id != ?", mother) : [])
|
|
88
88
|
end
|
|
89
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
|
89
|
+
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
|
90
90
|
[:father,:mother].each do |parent|
|
|
91
91
|
if p = send(parent)
|
|
92
92
|
# if a parent is present ineligible siblings are parent's ineligible children
|
|
@@ -104,10 +104,50 @@ module Genealogy
|
|
|
104
104
|
end
|
|
105
105
|
end
|
|
106
106
|
end
|
|
107
|
-
else
|
|
108
107
|
end
|
|
109
108
|
ineligibles
|
|
110
109
|
end
|
|
111
110
|
|
|
111
|
+
# @!macro [attach] generate_method_ineligibles_half_siblings_with_docs
|
|
112
|
+
# @method ineligible_$1_half_siblings
|
|
113
|
+
# list of individual who cannot be $1 half_sibling according to the ineligibility level in use.
|
|
114
|
+
# At `:pedigree` level it returns `self` along with siblings, other lineage halfsiblngs and all individuals with differnt $2
|
|
115
|
+
# At `:pedigree_and_dates` level it also includes all individuals who cannot be siblings for age reasons. If $2 is known it includes $2's ineligible children,
|
|
116
|
+
# otherwise it tries to estimate $2's fertility period: if it's possible it includes all individuals whose estimated birth period doesn't overlap $2's fertility period.
|
|
117
|
+
# @return [Array]
|
|
118
|
+
def self.generate_method_ineligibles_half_siblings_with_docs(lineage,parent_role)
|
|
119
|
+
define_method "ineligible_#{lineage}_half_siblings" do
|
|
120
|
+
ineligibles = []
|
|
121
|
+
parent = LINEAGE2PARENT[lineage]
|
|
122
|
+
p = send(parent)
|
|
123
|
+
if gclass.ineligibility_level >= PEDIGREE
|
|
124
|
+
ineligibles |= siblings | [self,p]
|
|
125
|
+
ineligibles |= send("#{OPPOSITELINEAGE[lineage]}_half_siblings") # other lineage half siblings would become full siblings so they cannot be current lineage half sibling
|
|
126
|
+
ineligibles |= gclass.all_with(parent).where("#{parent}_id != ?", p) if p
|
|
127
|
+
end
|
|
128
|
+
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
|
129
|
+
if p
|
|
130
|
+
# if a parent is present ineligible siblings are parent's ineligible children
|
|
131
|
+
ineligibles |= p.ineligible_children
|
|
132
|
+
elsif parent_fertility_range = send("#{parent}_fertility_range")
|
|
133
|
+
# if it's possible to estimate parent's fertility period
|
|
134
|
+
remainings = gclass.all - ineligibles
|
|
135
|
+
# includes all individuals whose estimated birth period doesn't overlap parent's fertility period
|
|
136
|
+
ineligibles |= remainings.find_all do |indiv|
|
|
137
|
+
if ibr = indiv.birth_range
|
|
138
|
+
!parent_fertility_range.overlaps? ibr
|
|
139
|
+
else
|
|
140
|
+
false
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
ineligibles
|
|
146
|
+
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
generate_method_ineligibles_half_siblings_with_docs(:paternal, :father)
|
|
150
|
+
generate_method_ineligibles_half_siblings_with_docs(:maternal, :mother)
|
|
151
|
+
|
|
112
152
|
end
|
|
113
|
-
end
|
|
153
|
+
end
|
data/lib/genealogy/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: genealogy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- masciugo
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-07-
|
|
11
|
+
date: 2018-07-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activerecord
|