genealogy 2.0.2 → 2.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/genealogy/ineligible_methods.rb +42 -45
- data/lib/genealogy/query_methods.rb +5 -5
- data/lib/genealogy/util_methods.rb +2 -2
- data/lib/genealogy/version.rb +1 -1
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 471eb61c7e2d5e29edac1c8796a0f35ab53d9405
|
4
|
+
data.tar.gz: ae2209d3c81a59f012649877ad9678eff6b4ddd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4fe4635b6ad80fe2cbd6dfb6d6fb1c8740e7bb9c8e429e8aac7fb82231c3e1520c9d19a10587f6e0485d984030cfde9e6f625f5b94cc303a0b82b9c20aae0700
|
7
|
+
data.tar.gz: ff633aa6af193a025ae015edbaca533956b8e2fa2f391640bd213aacb08ecaccc00bfebf27d654b516cf053bb5f44b8efa09de049f22357b0c5474376b1cc2b9
|
@@ -6,57 +6,48 @@ module Genealogy
|
|
6
6
|
|
7
7
|
include Constants
|
8
8
|
|
9
|
-
# @!macro [attach]
|
9
|
+
# @!macro [attach] generate_method_ineligibles_parent_with_docs
|
10
10
|
# @method ineligible_$1s
|
11
|
-
# list of individual who cannot be $1
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
# list of individual who cannot be $1 according to the ineligibility level in use.
|
12
|
+
# At `:pedigree` level it returns `self` along with their descendants and all $2s.
|
13
|
+
# At `:pedigree_and_dates` level it also includes all individuals who were not fertile during `self`'s estimated birth period.
|
14
|
+
# @return [Array, NilClass] Return nil if $1 already assigned
|
15
|
+
def self.generate_method_ineligibles_parent_with_docs(parent_role,unexpected_sex)
|
16
|
+
define_method "ineligible_#{parent_role}s" do
|
17
|
+
unless self.send(parent_role)
|
16
18
|
ineligibles = []
|
17
|
-
ineligibles |= descendants | [self] | gclass.send("#{
|
18
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES and
|
19
|
+
ineligibles |= descendants | [self] | gclass.send("#{unexpected_sex}s") if gclass.ineligibility_level >= PEDIGREE
|
20
|
+
if gclass.ineligibility_level >= PEDIGREE_AND_DATES and birth_range
|
19
21
|
ineligibles |= (gclass.all - ineligibles).find_all do |indiv|
|
20
|
-
|
21
|
-
if birth
|
22
|
-
!indiv.can_procreate_on?(birth)
|
23
|
-
else
|
24
|
-
!indiv.can_procreate_during?(life_range)
|
25
|
-
end
|
26
|
-
else
|
27
|
-
false
|
28
|
-
end
|
22
|
+
!indiv.can_procreate_during?(birth_range)
|
29
23
|
end
|
30
24
|
end
|
31
25
|
ineligibles
|
32
26
|
end
|
33
27
|
end
|
34
28
|
end
|
35
|
-
|
36
|
-
|
29
|
+
generate_method_ineligibles_parent_with_docs(:father, :female)
|
30
|
+
generate_method_ineligibles_parent_with_docs(:mother, :male)
|
37
31
|
|
38
32
|
|
39
|
-
# @!macro [attach]
|
40
|
-
# @method ineligible_$1_grand$
|
41
|
-
# list of individual who cannot be $1 grand$2
|
42
|
-
#
|
43
|
-
|
44
|
-
|
33
|
+
# @!macro [attach] generate_method_ineligible_grandparent_with_docs
|
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.
|
36
|
+
# Otherwise, at `:pedigree` level it returns `self` along with descendants, full siblings and all $4s.
|
37
|
+
# At `:pedigree_and_dates` level it also includes all individuals who were not fertile during `self`'s $2 estimated birth period.
|
38
|
+
# @return [Array, NilClass] Return nil if $1 grand$3 already assigned
|
39
|
+
def self.generate_method_ineligible_grandparent_with_docs(lineage,parent_role,grandparent2parent_role,unexpected_sex)
|
40
|
+
relationship = "#{lineage}_grand#{grandparent2parent_role}"
|
45
41
|
define_method "ineligible_#{relationship}s" do
|
46
42
|
unless send(relationship)
|
47
|
-
parent = send(LINEAGE2PARENT[lineage])
|
48
43
|
ineligibles = []
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
(gclass.all - ineligibles).find_all do |indiv|
|
55
|
-
|
56
|
-
!indiv.can_procreate_during?(send("#{LINEAGE2PARENT[lineage]}_birth_range"))
|
57
|
-
else
|
58
|
-
false
|
59
|
-
end
|
44
|
+
if parent = send(parent_role)
|
45
|
+
ineligibles |= parent.send("ineligible_#{grandparent2parent_role}s")
|
46
|
+
elsif gclass.ineligibility_level >= PEDIGREE
|
47
|
+
ineligibles |= descendants | siblings | [self] | gclass.send("#{unexpected_sex}s")
|
48
|
+
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
49
|
+
ineligibles |= (gclass.all - ineligibles).find_all do |indiv|
|
50
|
+
!indiv.can_procreate_during?(send("#{parent_role}_birth_range"))
|
60
51
|
end
|
61
52
|
end
|
62
53
|
end
|
@@ -65,12 +56,14 @@ module Genealogy
|
|
65
56
|
end
|
66
57
|
end
|
67
58
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
59
|
+
generate_method_ineligible_grandparent_with_docs(:paternal,:father,:father, :female)
|
60
|
+
generate_method_ineligible_grandparent_with_docs(:paternal,:father,:mother, :male)
|
61
|
+
generate_method_ineligible_grandparent_with_docs(:maternal,:mother,:father, :female)
|
62
|
+
generate_method_ineligible_grandparent_with_docs(:maternal,:mother,:mother, :male)
|
72
63
|
|
73
|
-
# list of individual who cannot be children
|
64
|
+
# list of individual who cannot be children according to the ineligibility level in use.
|
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
|
+
# At `:pedigree_and_dates` level it also includes all individuals who was born outside `self`'s fertility range, if estimable.
|
74
67
|
# @return [Array]
|
75
68
|
def ineligible_children
|
76
69
|
ineligibles = []
|
@@ -81,7 +74,10 @@ module Genealogy
|
|
81
74
|
ineligibles
|
82
75
|
end
|
83
76
|
|
84
|
-
# list of individual who cannot be
|
77
|
+
# list of individual who cannot be siblings according to the ineligibility level in use.
|
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
|
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.
|
85
81
|
# @return [Array]
|
86
82
|
def ineligible_siblings
|
87
83
|
ineligibles = []
|
@@ -91,13 +87,14 @@ module Genealogy
|
|
91
87
|
ineligibles |= (mother ? gclass.all_with(:mother).where("mother_id != ?", mother) : [])
|
92
88
|
end
|
93
89
|
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
94
|
-
# if a parent is present ineligible siblings are parent's ineligible children, otherwise try to estimate parent birth range.
|
95
|
-
# If it's possible ineligible siblings are all individuals whose life range overlaps parent birth range
|
96
90
|
[:father,:mother].each do |parent|
|
97
91
|
if p = send(parent)
|
92
|
+
# if a parent is present ineligible siblings are parent's ineligible children
|
98
93
|
ineligibles |= p.ineligible_children
|
99
94
|
elsif parent_fertility_range = send("#{parent}_fertility_range")
|
95
|
+
# if it's possible to estimate parent's fertility period
|
100
96
|
remainings = gclass.all - ineligibles
|
97
|
+
# includes all individuals whose estimated birth period doesn't overlap parent's fertility period
|
101
98
|
ineligibles |= remainings.find_all do |indiv|
|
102
99
|
if ibr = indiv.birth_range
|
103
100
|
!parent_fertility_range.overlaps? ibr
|
@@ -9,19 +9,19 @@ module Genealogy
|
|
9
9
|
def parents
|
10
10
|
[father,mother]
|
11
11
|
end
|
12
|
-
# @return [ActiveRecord]
|
12
|
+
# @return [ActiveRecord, NilClass]
|
13
13
|
def paternal_grandfather
|
14
14
|
father && father.father
|
15
15
|
end
|
16
|
-
# @return [ActiveRecord]
|
16
|
+
# @return [ActiveRecord, NilClass]
|
17
17
|
def paternal_grandmother
|
18
18
|
father && father.mother
|
19
19
|
end
|
20
|
-
# @return [ActiveRecord]
|
20
|
+
# @return [ActiveRecord, NilClass]
|
21
21
|
def maternal_grandfather
|
22
22
|
mother && mother.father
|
23
23
|
end
|
24
|
-
# @return [ActiveRecord]
|
24
|
+
# @return [ActiveRecord, NilClass]
|
25
25
|
def maternal_grandmother
|
26
26
|
mother && mother.mother
|
27
27
|
end
|
@@ -101,7 +101,7 @@ module Genealogy
|
|
101
101
|
ids = siblings(half: :father).pluck(:id) | siblings(half: :mother).pluck(:id)
|
102
102
|
result.where(id: ids)
|
103
103
|
when :include # including half siblings
|
104
|
-
result.where("father_id
|
104
|
+
result.where("father_id = ? or mother_id = ?", father_id, mother_id)
|
105
105
|
else
|
106
106
|
raise ArgumentError, "Admitted values for :half options are: :father, :mother, false, true or nil"
|
107
107
|
end
|
@@ -63,14 +63,14 @@ module Genealogy
|
|
63
63
|
# @param [Date] date
|
64
64
|
# @return [Boolean] or nil if cannot be computable (#fertility_range returns nil)
|
65
65
|
def can_procreate_on?(date)
|
66
|
-
fertility_range.cover? date if date and fertility_range
|
66
|
+
fertility_range.cover? date if (date and fertility_range)
|
67
67
|
end
|
68
68
|
|
69
69
|
# It tests whether fertility range overlaps specified period
|
70
70
|
# @param [Range] period
|
71
71
|
# @return [Boolean] or nil if cannot be computable (#fertility_range returns nil)
|
72
72
|
def can_procreate_during?(period)
|
73
|
-
fertility_range.overlaps? period if period and fertility_range
|
73
|
+
fertility_range.overlaps? period if (period and fertility_range)
|
74
74
|
end
|
75
75
|
|
76
76
|
# @!macro [attach] generate
|
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.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- masciugo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mysql2
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pg
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -244,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
244
272
|
version: '0'
|
245
273
|
requirements: []
|
246
274
|
rubyforge_project: "[none]"
|
247
|
-
rubygems_version: 2.
|
275
|
+
rubygems_version: 2.2.2
|
248
276
|
signing_key:
|
249
277
|
specification_version: 4
|
250
278
|
summary: Make ActiveRecord model act as a pedigree
|