genealogy 2.6.4 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/genealogy/alter_methods.rb +4 -6
- data/lib/genealogy/complex_query_methods.rb +0 -1
- data/lib/genealogy/constants.rb +53 -48
- data/lib/genealogy/current_spouse_methods.rb +0 -2
- data/lib/genealogy/genealogy.rb +21 -20
- data/lib/genealogy/ineligible_methods.rb +12 -14
- data/lib/genealogy/query_methods.rb +47 -8
- data/lib/genealogy/util_methods.rb +5 -7
- data/lib/genealogy/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 639bb06863d19cad4c662b7850f4e4bb543bb7f0b9fd5154816b0fda326056d8
|
4
|
+
data.tar.gz: e64f5b21c41397ee24f45591f81c651c0d876413dbb302586c8a8db147696805
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb37b3ef1a4414dcd3d505102cdd05699663ed5d0da01e2d0fc26fe8364b6d03f377f3f132e226532089e7893e8051354f43690175b0fcdb7f78d7820483d233
|
7
|
+
data.tar.gz: 2e238f05371e623cc1de5318bbe3453c968d66f85edeb698f07fb5fe50f34f8b441c193ea73c4ee7bb6a56a3cfb11533ac06c60ad7fbc737d80fb358065751db
|
@@ -3,8 +3,6 @@ module Genealogy
|
|
3
3
|
module AlterMethods
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
include Constants
|
7
|
-
|
8
6
|
# @!macro [attach] generate
|
9
7
|
# @method add_$1(parent)
|
10
8
|
# Add $1
|
@@ -76,7 +74,7 @@ module Genealogy
|
|
76
74
|
def self.generate_method_add_grandparent(lineage,grandparent)
|
77
75
|
relationship = "#{lineage}_grand#{grandparent}"
|
78
76
|
define_method "add_#{relationship}" do |gp|
|
79
|
-
parent = LINEAGE2PARENT[lineage]
|
77
|
+
parent = gclass::LINEAGE2PARENT[lineage]
|
80
78
|
raise_if_gap_on(parent)
|
81
79
|
check_incompatible_relationship(relationship,gp)
|
82
80
|
send(parent).send("add_#{grandparent}",gp)
|
@@ -95,7 +93,7 @@ module Genealogy
|
|
95
93
|
def self.generate_method_remove_grandparent(lineage,grandparent)
|
96
94
|
relationship = "#{lineage}_grand#{grandparent}"
|
97
95
|
define_method "remove_#{relationship}" do
|
98
|
-
parent = LINEAGE2PARENT[lineage]
|
96
|
+
parent = gclass::LINEAGE2PARENT[lineage]
|
99
97
|
raise_if_gap_on(parent)
|
100
98
|
send(parent).send("remove_#{grandparent}")
|
101
99
|
end
|
@@ -115,7 +113,7 @@ module Genealogy
|
|
115
113
|
def self.generate_method_add_grandparents_by_lineage(lineage)
|
116
114
|
relationship = "#{lineage}_grandparents"
|
117
115
|
define_method "add_#{relationship}" do |gf,gm|
|
118
|
-
parent = LINEAGE2PARENT[lineage]
|
116
|
+
parent = gclass::LINEAGE2PARENT[lineage]
|
119
117
|
raise_if_gap_on(parent)
|
120
118
|
send(parent).send("add_parents",gf,gm)
|
121
119
|
end
|
@@ -131,7 +129,7 @@ module Genealogy
|
|
131
129
|
def self.generate_method_remove_grandparents_by_lineage(lineage)
|
132
130
|
relationship = "#{lineage}_grandparents"
|
133
131
|
define_method "remove_#{relationship}" do
|
134
|
-
parent = LINEAGE2PARENT[lineage]
|
132
|
+
parent = gclass::LINEAGE2PARENT[lineage]
|
135
133
|
raise_if_gap_on(parent)
|
136
134
|
send(parent).send("remove_parents")
|
137
135
|
end
|
data/lib/genealogy/constants.rb
CHANGED
@@ -1,56 +1,61 @@
|
|
1
1
|
module Genealogy
|
2
2
|
module Constants
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do |base|
|
6
|
+
# deafault options for has_parent method
|
7
|
+
base.const_set :DEFAULTS, {
|
8
|
+
column_names: {
|
9
|
+
sex: 'sex',
|
10
|
+
father_id: 'father_id',
|
11
|
+
mother_id: 'mother_id',
|
12
|
+
current_spouse_id: 'current_spouse_id',
|
13
|
+
birth_date: 'birth_date',
|
14
|
+
death_date: 'death_date'
|
15
|
+
},
|
16
|
+
perform_validation: true,
|
17
|
+
ineligibility: :pedigree,
|
18
|
+
current_spouse: false,
|
19
|
+
sex_values: ['M','F'],
|
20
|
+
limit_ages: {
|
21
|
+
min_male_procreation_age: 12,
|
22
|
+
max_male_procreation_age: 75,
|
23
|
+
min_female_procreation_age: 9,
|
24
|
+
max_female_procreation_age: 50,
|
25
|
+
max_male_life_expectancy: 110,
|
26
|
+
max_female_life_expectancy: 110
|
27
|
+
}
|
24
28
|
}
|
25
|
-
}
|
26
29
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
# ineligibility levels
|
31
|
+
base.const_set :PEDIGREE, 1
|
32
|
+
base.const_set :PEDIGREE_AND_DATES, 2
|
33
|
+
base.const_set :OFF, 0
|
34
|
+
|
35
|
+
base.const_set :PARENT2LINEAGE, ActiveSupport::HashWithIndifferentAccess.new({ father: :paternal, mother: :maternal })
|
36
|
+
base.const_set :LINEAGE2PARENT, ActiveSupport::HashWithIndifferentAccess.new({ paternal: :father, maternal: :mother })
|
37
|
+
base.const_set :OPPOSITELINEAGE, ActiveSupport::HashWithIndifferentAccess.new({ paternal: :maternal, maternal: :paternal })
|
38
|
+
base.const_set :PARENT2SEX, ActiveSupport::HashWithIndifferentAccess.new({ father: :male, mother: :female })
|
39
|
+
base.const_set :SEX2PARENT, ActiveSupport::HashWithIndifferentAccess.new({ male: :father, female: :mother })
|
40
|
+
base.const_set :OPPOSITESEX, ActiveSupport::HashWithIndifferentAccess.new({male: :female, female: :male})
|
31
41
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
42
|
+
base.const_set :AKA, ActiveSupport::HashWithIndifferentAccess.new({
|
43
|
+
father: "F",
|
44
|
+
mother: "M",
|
45
|
+
paternal_grandfather: "PGF",
|
46
|
+
paternal_grandmother: "PGM",
|
47
|
+
maternal_grandfather: "MGF",
|
48
|
+
maternal_grandmother: "MGM",
|
49
|
+
children: "C",
|
50
|
+
siblings: "S",
|
51
|
+
half_siblings: "HS",
|
52
|
+
paternal_half_siblings: "PHS",
|
53
|
+
maternal_half_siblings: "MHS",
|
54
|
+
grandchildren: "GC",
|
55
|
+
uncles_and_aunts: "U&A",
|
56
|
+
nieces_and_nephews: "N&N"
|
57
|
+
})
|
38
58
|
|
39
|
-
|
40
|
-
father: "F",
|
41
|
-
mother: "M",
|
42
|
-
paternal_grandfather: "PGF",
|
43
|
-
paternal_grandmother: "PGM",
|
44
|
-
maternal_grandfather: "MGF",
|
45
|
-
maternal_grandmother: "MGM",
|
46
|
-
children: "C",
|
47
|
-
siblings: "S",
|
48
|
-
half_siblings: "HS",
|
49
|
-
paternal_half_siblings: "PHS",
|
50
|
-
maternal_half_siblings: "MHS",
|
51
|
-
grandchildren: "GC",
|
52
|
-
uncles_and_aunts: "U&A",
|
53
|
-
nieces_and_nephews: "N&N"
|
54
|
-
})
|
59
|
+
end
|
55
60
|
end
|
56
61
|
end
|
data/lib/genealogy/genealogy.rb
CHANGED
@@ -2,9 +2,7 @@ module Genealogy
|
|
2
2
|
|
3
3
|
extend ActiveSupport::Concern
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
include Genealogy::Constants
|
5
|
+
class_methods do
|
8
6
|
|
9
7
|
# gives to ActiveRecord model geneaogy capabilities. Modules UtilMethods QueryMethods IneligibleMethods AlterMethods and SpouseMethods are included
|
10
8
|
# @param [Hash] options
|
@@ -22,16 +20,19 @@ module Genealogy
|
|
22
20
|
|
23
21
|
def has_parents options = {}
|
24
22
|
|
25
|
-
include
|
26
|
-
include
|
27
|
-
include
|
28
|
-
include
|
29
|
-
include
|
30
|
-
include
|
31
|
-
|
23
|
+
include Constants
|
24
|
+
include UtilMethods
|
25
|
+
include QueryMethods
|
26
|
+
include ComplexQueryMethods
|
27
|
+
include IneligibleMethods
|
28
|
+
include AlterMethods
|
29
|
+
include CurrentSpouseMethods
|
32
30
|
|
33
31
|
check_has_parents_options(options)
|
34
32
|
|
33
|
+
# instance_variable_set(:@role_as_relative, nil)
|
34
|
+
attr_accessor :role_as_relative
|
35
|
+
|
35
36
|
# keep track of the original extend class to prevent wrong scopes in query method in case of STI
|
36
37
|
class_attribute :gclass, instance_writer: false
|
37
38
|
self.gclass = self
|
@@ -43,22 +44,22 @@ module Genealogy
|
|
43
44
|
class_attribute :ineligibility_level, instance_accessor: false
|
44
45
|
self.ineligibility_level = case options[:ineligibility]
|
45
46
|
when :pedigree
|
46
|
-
PEDIGREE
|
47
|
+
gclass::PEDIGREE
|
47
48
|
when true
|
48
|
-
PEDIGREE
|
49
|
+
gclass::PEDIGREE
|
49
50
|
when :pedigree_and_dates
|
50
|
-
PEDIGREE_AND_DATES
|
51
|
+
gclass::PEDIGREE_AND_DATES
|
51
52
|
when false
|
52
|
-
OFF
|
53
|
+
gclass::OFF
|
53
54
|
when nil
|
54
|
-
PEDIGREE
|
55
|
+
gclass::PEDIGREE
|
55
56
|
else
|
56
57
|
raise ArgumentError, "ineligibility option must be one among :pedigree, :pedigree_and_dates or false"
|
57
58
|
end
|
58
59
|
|
59
60
|
## limit_ages
|
60
|
-
if ineligibility_level >= PEDIGREE_AND_DATES
|
61
|
-
DEFAULTS[:limit_ages].each do |age,v|
|
61
|
+
if ineligibility_level >= gclass::PEDIGREE_AND_DATES
|
62
|
+
gclass::DEFAULTS[:limit_ages].each do |age,v|
|
62
63
|
class_attribute age, instance_accessor: false
|
63
64
|
self.send("#{age}=", options[:limit_ages].try(:[],age) || v)
|
64
65
|
end
|
@@ -67,12 +68,12 @@ module Genealogy
|
|
67
68
|
[:current_spouse, :perform_validation].each do |opt|
|
68
69
|
ca = "#{opt}_enabled"
|
69
70
|
class_attribute ca, instance_accessor: false
|
70
|
-
self.send "#{ca}=", options.key?(opt) ? options[opt] : DEFAULTS[opt]
|
71
|
+
self.send "#{ca}=", options.key?(opt) ? options[opt] : gclass::DEFAULTS[opt]
|
71
72
|
end
|
72
73
|
|
73
74
|
|
74
75
|
# column names class attributes
|
75
|
-
DEFAULTS[:column_names].merge(options[:column_names]).each do |k,v|
|
76
|
+
gclass::DEFAULTS[:column_names].merge(options[:column_names]).each do |k,v|
|
76
77
|
class_attribute_name = "#{k}_column"
|
77
78
|
class_attribute class_attribute_name, instance_accessor: false
|
78
79
|
self.send("#{class_attribute_name}=", v)
|
@@ -81,7 +82,7 @@ module Genealogy
|
|
81
82
|
|
82
83
|
## sex
|
83
84
|
class_attribute :sex_values, :sex_male_value, :sex_female_value, instance_accessor: false
|
84
|
-
self.sex_values = options[:sex_values] || DEFAULTS[:sex_values]
|
85
|
+
self.sex_values = options[:sex_values] || gclass::DEFAULTS[:sex_values]
|
85
86
|
self.sex_male_value = self.sex_values.first
|
86
87
|
self.sex_female_value = self.sex_values.last
|
87
88
|
|
@@ -4,8 +4,6 @@ module Genealogy
|
|
4
4
|
module IneligibleMethods
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
include Constants
|
8
|
-
|
9
7
|
# @!macro [attach] generate_method_ineligibles_parent_with_docs
|
10
8
|
# @method ineligible_$1s
|
11
9
|
# list of individual who cannot be $1 according to the ineligibility level in use.
|
@@ -16,8 +14,8 @@ module Genealogy
|
|
16
14
|
define_method "ineligible_#{parent_role}s" do
|
17
15
|
unless self.send(parent_role)
|
18
16
|
ineligibles = []
|
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
|
17
|
+
ineligibles |= descendants | [self] | gclass.send("#{unexpected_sex}s") if gclass.ineligibility_level >= gclass::PEDIGREE
|
18
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE_AND_DATES and birth_range
|
21
19
|
ineligibles |= (gclass.all - ineligibles).find_all do |indiv|
|
22
20
|
!indiv.can_procreate_during?(birth_range)
|
23
21
|
end
|
@@ -43,9 +41,9 @@ module Genealogy
|
|
43
41
|
ineligibles = []
|
44
42
|
if parent = send(parent_role)
|
45
43
|
ineligibles |= parent.send("ineligible_#{grandparent2parent_role}s")
|
46
|
-
elsif gclass.ineligibility_level >= PEDIGREE
|
44
|
+
elsif gclass.ineligibility_level >= gclass::PEDIGREE
|
47
45
|
ineligibles |= descendants | siblings | [self] | gclass.send("#{unexpected_sex}s")
|
48
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
46
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE_AND_DATES
|
49
47
|
ineligibles |= (gclass.all - ineligibles).find_all do |indiv|
|
50
48
|
!indiv.can_procreate_during?(send("#{parent_role}_birth_range"))
|
51
49
|
end
|
@@ -67,8 +65,8 @@ module Genealogy
|
|
67
65
|
# @return [Array]
|
68
66
|
def ineligible_children
|
69
67
|
ineligibles = []
|
70
|
-
ineligibles |= ancestors | children | siblings | [self] | gclass.all_with(SEX2PARENT[ssex]) if gclass.ineligibility_level >= PEDIGREE
|
71
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES and fertility_range
|
68
|
+
ineligibles |= ancestors | children | siblings | [self] | gclass.all_with(gclass::SEX2PARENT[ssex]) if gclass.ineligibility_level >= gclass::PEDIGREE
|
69
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE_AND_DATES and fertility_range
|
72
70
|
ineligibles |= (gclass.all - ineligibles).find_all{ |indiv| !can_procreate_during?(indiv.birth_range)}
|
73
71
|
end
|
74
72
|
ineligibles
|
@@ -81,12 +79,12 @@ module Genealogy
|
|
81
79
|
# @return [Array]
|
82
80
|
def ineligible_siblings
|
83
81
|
ineligibles = []
|
84
|
-
if gclass.ineligibility_level >= PEDIGREE
|
82
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE
|
85
83
|
ineligibles |= ancestors | descendants | siblings | [self]
|
86
84
|
ineligibles |= (father ? gclass.all_with(:father).where("father_id != ?", father) : [])
|
87
85
|
ineligibles |= (mother ? gclass.all_with(:mother).where("mother_id != ?", mother) : [])
|
88
86
|
end
|
89
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
87
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE_AND_DATES
|
90
88
|
[:father,:mother].each do |parent|
|
91
89
|
if p = send(parent)
|
92
90
|
# if a parent is present ineligible siblings are parent's ineligible children
|
@@ -118,14 +116,14 @@ module Genealogy
|
|
118
116
|
def self.generate_method_ineligibles_half_siblings_with_docs(lineage,parent_role)
|
119
117
|
define_method "ineligible_#{lineage}_half_siblings" do
|
120
118
|
ineligibles = []
|
121
|
-
parent = LINEAGE2PARENT[lineage]
|
119
|
+
parent = gclass::LINEAGE2PARENT[lineage]
|
122
120
|
p = send(parent)
|
123
|
-
if gclass.ineligibility_level >= PEDIGREE
|
121
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE
|
124
122
|
ineligibles |= p.ineligible_children
|
125
|
-
ineligibles |= send("#{OPPOSITELINEAGE[lineage]}_half_siblings") # other lineage half siblings would become full siblings so they cannot be current lineage half sibling
|
123
|
+
ineligibles |= send("#{gclass::OPPOSITELINEAGE[lineage]}_half_siblings") # other lineage half siblings would become full siblings so they cannot be current lineage half sibling
|
126
124
|
ineligibles |= gclass.all_with(parent)
|
127
125
|
end
|
128
|
-
if gclass.ineligibility_level >= PEDIGREE_AND_DATES
|
126
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE_AND_DATES
|
129
127
|
if p
|
130
128
|
# if a parent is present ineligible siblings are parent's ineligible children
|
131
129
|
ineligibles |= p.ineligible_children
|
@@ -3,8 +3,6 @@ module Genealogy
|
|
3
3
|
module QueryMethods
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
include Constants
|
7
|
-
|
8
6
|
# @return [2-elements Array] father and mother
|
9
7
|
def parents
|
10
8
|
[father,mother]
|
@@ -51,17 +49,17 @@ module Genealogy
|
|
51
49
|
# @return [ActiveRecord::Relation] children
|
52
50
|
def children(options = {})
|
53
51
|
raise SexError, "Sex value not valid for #{self}. It's needed to look for children" unless gclass.sex_values.include? sex_before_type_cast
|
54
|
-
result = gclass.where("#{SEX2PARENT[ssex]}_id" => self)
|
52
|
+
result = gclass.where("#{gclass::SEX2PARENT[ssex]}_id" => self)
|
55
53
|
if options.keys.include? :spouse
|
56
54
|
check_indiv(spouse = options[:spouse],opposite_ssex)
|
57
|
-
result = result.where("#{SEX2PARENT[opposite_ssex]}_id" => spouse ) if spouse
|
55
|
+
result = result.where("#{gclass::SEX2PARENT[opposite_ssex]}_id" => spouse ) if spouse
|
58
56
|
end
|
59
57
|
result
|
60
58
|
end
|
61
59
|
|
62
60
|
# @return [ActiveRecord::Relation] list of individuals with whom has had children
|
63
61
|
def spouses
|
64
|
-
gclass.where(id: children.pluck("#{SEX2PARENT[opposite_ssex]}_id".to_sym).compact.uniq) | (self.class.current_spouse_enabled ? [] : [current_spouse])
|
62
|
+
gclass.where(id: children.pluck("#{gclass::SEX2PARENT[opposite_ssex]}_id".to_sym).compact.uniq) | (self.class.current_spouse_enabled ? [] : [current_spouse])
|
65
63
|
end
|
66
64
|
|
67
65
|
# @param [Hash] options
|
@@ -275,6 +273,7 @@ module Genealogy
|
|
275
273
|
# family hash with roles as keys? :spouse and individuals as values. Defaults roles are :father, :mother, :children, :siblings and current_spouse if enabled
|
276
274
|
# @option options [Symbol] half to filter siblings (see #siblings)
|
277
275
|
# @option options [Boolean] extended to include roles for grandparents, grandchildren, uncles, aunts, nieces, nephews and cousins
|
276
|
+
# @option options [Boolean] singular_role to use singularized role as keys
|
278
277
|
# @return [Hash] family hash with roles as keys? :spouse and individuals as values.
|
279
278
|
def family_hash(options = {})
|
280
279
|
roles = [:father, :mother, :children, :siblings]
|
@@ -294,7 +293,42 @@ module Genealogy
|
|
294
293
|
raise ArgumentError, "Admitted values for :half options are: :father, :mother, :include, :include_separately, nil"
|
295
294
|
end
|
296
295
|
roles += [:paternal_grandfather, :paternal_grandmother, :maternal_grandfather, :maternal_grandmother, :grandchildren, :uncles_and_aunts, :nieces_and_nephews, :cousins] if options[:extended] == true
|
297
|
-
roles.inject({}){|res,role| res.merge!({role => self.send(role)})}
|
296
|
+
res = roles.inject({}){|res,role| res.merge!({role => self.send(role)})}
|
297
|
+
if options[:singular_role] == true
|
298
|
+
res2 = {
|
299
|
+
father: res[:father],
|
300
|
+
mother: res[:mother],
|
301
|
+
daughter: res[:children].females,
|
302
|
+
son: res[:children].males,
|
303
|
+
sister: res[:siblings].females,
|
304
|
+
brother: res[:siblings].males
|
305
|
+
}
|
306
|
+
|
307
|
+
res2[:current_spouse] = res[:current_spouse] if res.has_key? :current_spouse
|
308
|
+
|
309
|
+
res2.merge!({
|
310
|
+
paternal_grandfather: res[:paternal_grandfather],
|
311
|
+
paternal_grandmother: res[:paternal_grandmother],
|
312
|
+
maternal_grandfather: res[:maternal_grandfather],
|
313
|
+
maternal_grandmother: res[:maternal_grandmother],
|
314
|
+
grandchild: res[:grandchildren],
|
315
|
+
uncle: res[:uncles_and_aunts].males,
|
316
|
+
aunts: res[:uncles_and_aunts].females,
|
317
|
+
nephew: res[:nieces_and_nephews].males,
|
318
|
+
niece: res[:nieces_and_nephews].females,
|
319
|
+
cousin: res[:cousins]
|
320
|
+
}) if options[:extended] == true
|
321
|
+
|
322
|
+
res2.merge!({
|
323
|
+
paternal_half_brother: res[:paternal_half_siblings].males,
|
324
|
+
paternal_half_sister: res[:paternal_half_siblings].females,
|
325
|
+
maternal_half_brother: res[:maternal_half_siblings].males,
|
326
|
+
maternal_half_sister: res[:maternal_half_siblings].females,
|
327
|
+
}) if options[:half] == :include_separately
|
328
|
+
|
329
|
+
res = res2
|
330
|
+
end
|
331
|
+
res
|
298
332
|
end
|
299
333
|
|
300
334
|
# family_hash with option extended: :true
|
@@ -307,8 +341,13 @@ module Genealogy
|
|
307
341
|
# @return [Array]
|
308
342
|
# @see #family_hash
|
309
343
|
def family(options = {})
|
310
|
-
|
311
|
-
|
344
|
+
family_hash(options).inject([]) do |memo, r|
|
345
|
+
[r.last].compact.flatten.each do |relative|
|
346
|
+
relative.role_as_relative = r.first.to_s.singularize.to_sym
|
347
|
+
memo << relative
|
348
|
+
end
|
349
|
+
memo
|
350
|
+
end
|
312
351
|
end
|
313
352
|
|
314
353
|
# family with option extended: :true
|
@@ -3,8 +3,6 @@ module Genealogy
|
|
3
3
|
module UtilMethods
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
|
-
include Constants
|
7
|
-
|
8
6
|
# Genealogy thinks time in term of Date, not DateTime
|
9
7
|
# @return [Date]
|
10
8
|
def birth
|
@@ -80,9 +78,9 @@ module Genealogy
|
|
80
78
|
def self.generate_method_parent_birth_range(parent)
|
81
79
|
define_method "#{parent}_birth_range" do
|
82
80
|
if birth
|
83
|
-
(birth - gclass.send("max_#{PARENT2SEX[parent]}_procreation_age").years)..(birth - gclass.send("min_#{PARENT2SEX[parent]}_procreation_age").years)
|
81
|
+
(birth - gclass.send("max_#{gclass::PARENT2SEX[parent]}_procreation_age").years)..(birth - gclass.send("min_#{gclass::PARENT2SEX[parent]}_procreation_age").years)
|
84
82
|
elsif life_range
|
85
|
-
(life_range.begin - gclass.send("max_#{PARENT2SEX[parent]}_procreation_age").years)..(life_range.end - gclass.send("min_#{PARENT2SEX[parent]}_procreation_age").years)
|
83
|
+
(life_range.begin - gclass.send("max_#{gclass::PARENT2SEX[parent]}_procreation_age").years)..(life_range.end - gclass.send("min_#{gclass::PARENT2SEX[parent]}_procreation_age").years)
|
86
84
|
end
|
87
85
|
end
|
88
86
|
end
|
@@ -96,7 +94,7 @@ module Genealogy
|
|
96
94
|
def self.generate_method_parent_fertility_range(parent)
|
97
95
|
define_method "#{parent}_fertility_range" do
|
98
96
|
if parent_birth_range = send("#{parent}_birth_range")
|
99
|
-
(parent_birth_range.begin + gclass.send("min_#{PARENT2SEX[parent]}_procreation_age").years)..(parent_birth_range.end + gclass.send("max_#{PARENT2SEX[parent]}_procreation_age").years)
|
97
|
+
(parent_birth_range.begin + gclass.send("min_#{gclass::PARENT2SEX[parent]}_procreation_age").years)..(parent_birth_range.end + gclass.send("max_#{gclass::PARENT2SEX[parent]}_procreation_age").years)
|
100
98
|
end
|
101
99
|
end
|
102
100
|
end
|
@@ -119,7 +117,7 @@ module Genealogy
|
|
119
117
|
# opposite sex in terms of :male or :female
|
120
118
|
# @return [Symbol]
|
121
119
|
def opposite_ssex
|
122
|
-
OPPOSITESEX[ssex]
|
120
|
+
gclass::OPPOSITESEX[ssex]
|
123
121
|
end
|
124
122
|
|
125
123
|
# @return [Boolean]
|
@@ -160,7 +158,7 @@ module Genealogy
|
|
160
158
|
# puts "[#{__method__}]: #{arg} class: #{arg.class}, #{self} class: #{self.class}"
|
161
159
|
next if relative.nil?
|
162
160
|
check_indiv(relative)
|
163
|
-
if gclass.ineligibility_level >= PEDIGREE
|
161
|
+
if gclass.ineligibility_level >= gclass::PEDIGREE
|
164
162
|
if ineligibles = self.send("ineligible_#{relationship.to_s.pluralize}")
|
165
163
|
# puts "[#{__method__}]: checking if #{relative} can be #{relationship} of #{self}"
|
166
164
|
raise IncompatibleRelationshipException, "#{relative} can't be #{relationship} of #{self}" if ineligibles.include? relative
|
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.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- masciugo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -272,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
272
272
|
- !ruby/object:Gem::Version
|
273
273
|
version: '0'
|
274
274
|
requirements: []
|
275
|
-
rubygems_version: 3.
|
275
|
+
rubygems_version: 3.1.2
|
276
276
|
signing_key:
|
277
277
|
specification_version: 4
|
278
278
|
summary: Make ActiveRecord model act as a pedigree
|