kittyverse 0.4.4 → 0.4.5
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/Manifest.txt +2 -0
- data/lib/kittyverse.rb +3 -0
- data/lib/kittyverse/gene.rb +55 -0
- data/lib/kittyverse/genome.rb +236 -0
- data/lib/kittyverse/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d79b58472f3570c946876bf0461bf53ff2ddd4b
|
4
|
+
data.tar.gz: b8d563f8322a7328a3107c728623e4e1566845f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 659f667449ad8de67dc8387dfc24367fc113713f25b111bce6ea3dde52154f0204e2124c7088b960e08c579fe7c846e2a5dd43618c2bb6cb716c101e63ed814b
|
7
|
+
data.tar.gz: da6a2ad87961a114488a11febe6963d8a71b06aa38face8aa68a2cc0e35a0ecd0eb55a0d4de4d26983c78ebcf67f52683ccb7516e3da09f9356b3f9c205e81f0
|
data/Manifest.txt
CHANGED
@@ -9,6 +9,8 @@ lib/kittyverse/api/versions.rb
|
|
9
9
|
lib/kittyverse/cattributes.rb
|
10
10
|
lib/kittyverse/config/colors.rb
|
11
11
|
lib/kittyverse/config/fancies.rb
|
12
|
+
lib/kittyverse/gene.rb
|
13
|
+
lib/kittyverse/genome.rb
|
12
14
|
lib/kittyverse/config/purrstiges.rb
|
13
15
|
lib/kittyverse/config/traits.rb
|
14
16
|
lib/kittyverse/config/traits_timeline.rb
|
data/lib/kittyverse.rb
CHANGED
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
class Gene
|
5
|
+
|
6
|
+
### todo/check:
|
7
|
+
## find a better name for Slice(incl.4 genes)
|
8
|
+
## e.g. GeneFour, Gene4, GeneGroup, GeneSlice,TraitGenes,... - why? why not?
|
9
|
+
|
10
|
+
class Slice ## Gene::Slice (nested class)
|
11
|
+
|
12
|
+
attr_reader :type # trait type (tt)
|
13
|
+
attr_reader :d, :r1, :r2, :r3
|
14
|
+
# d (dominant gene) -- todo/check: rename to just d instead of d0 - why? why not?
|
15
|
+
# r1 (1st order recessive gene)
|
16
|
+
# r2 (2nd order recessive gene)
|
17
|
+
# r3 (3rd order recessive gene)
|
18
|
+
alias_method :d0, :d # allow "classic" alias for d too
|
19
|
+
|
20
|
+
## compat: add alias for ("new/modern") p, h1, h2, h3
|
21
|
+
## p(rimary), h(idden) 1, h(idden) 2, h(idden) 3
|
22
|
+
alias_method :p, :d
|
23
|
+
alias_method :h1, :r1
|
24
|
+
alias_method :h2, :r2
|
25
|
+
alias_method :h3, :r3
|
26
|
+
|
27
|
+
|
28
|
+
def initialize( type, d, r1, r2, r3 )
|
29
|
+
@type = TraitType[type] ## lookup trait type by key (e.g. :body, :pattern, etc.)
|
30
|
+
@d = @type[d] ## lookup trait (from trait type) by kai code (e.g. "1", "a", etc.)
|
31
|
+
@r1 = @type[r1]
|
32
|
+
@r2 = @type[r2]
|
33
|
+
@r3 = @type[r3]
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](index)
|
37
|
+
case index
|
38
|
+
when 0 then @d
|
39
|
+
when 1 then @r1
|
40
|
+
when 2 then @r2
|
41
|
+
when 3 then @r3
|
42
|
+
else nil ## return nil for unknown index for now (raise except - why? why not?)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def purebred?() @d == @r1 && @d == @r2 && @d == @r3; end
|
47
|
+
alias_method :pure?, :purebred?
|
48
|
+
|
49
|
+
|
50
|
+
def to_kai
|
51
|
+
@r3.kai + @r2.kai + @r1.kai + @d.kai
|
52
|
+
end ## return a string in kai/base32 notation
|
53
|
+
|
54
|
+
end # class Slice
|
55
|
+
end # class Gene
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
|
4
|
+
class Genome
|
5
|
+
|
6
|
+
def initialize( arg )
|
7
|
+
if arg.is_a? Integer ## use Integer (Fixnum+Bignum??) - why? why not?
|
8
|
+
num = arg
|
9
|
+
kai = Kai.encode( num )
|
10
|
+
else
|
11
|
+
if arg.downcase.start_with?( '0x' ) ## assume hexstring( base16 )
|
12
|
+
kai = Kai.encode( arg.to_i(16) )
|
13
|
+
else # else assume string in kai/base32 format
|
14
|
+
kai = arg
|
15
|
+
kai = kai.gsub( ' ', '' ) ## allow spaces (strip/remove)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
## puts "Genome.initialize #{kai}"
|
19
|
+
|
20
|
+
@kai = kai ## note: store/save kai without any spaces ("compact" format)
|
21
|
+
@genes = build_genes( kai ) ## array of (sliced) genes (block of four genes)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
def kai() Kai.fmt( @kai ); end # return formatted in blocks of 4
|
26
|
+
def bytes() Kai.bytes( @kai ); end
|
27
|
+
|
28
|
+
def num() Kai.decode( @kai ); end
|
29
|
+
alias_method :to_i, :num
|
30
|
+
|
31
|
+
def electrologica() Electrologica.fmt( Electrologica.encode( num ) ); end # return formatted in electrologica base32 format
|
32
|
+
alias_method :codes, :electrologica
|
33
|
+
|
34
|
+
def binary
|
35
|
+
@kai.chars.each_slice(4).map do |slice|
|
36
|
+
buf = ""
|
37
|
+
buf << Kai::BINARY[slice[0]]
|
38
|
+
buf << "-"
|
39
|
+
buf << Kai::BINARY[slice[1]]
|
40
|
+
buf << "-"
|
41
|
+
buf << Kai::BINARY[slice[2]]
|
42
|
+
buf << "-"
|
43
|
+
buf << Kai::BINARY[slice[3]]
|
44
|
+
buf
|
45
|
+
end.join( " " )
|
46
|
+
end
|
47
|
+
alias_method :bin, :binary
|
48
|
+
|
49
|
+
|
50
|
+
def build_genes( kai )
|
51
|
+
kai = kai.reverse ## note: reserve for easy left-to-right access
|
52
|
+
genes = [] ## array of (sliced) genes (block of four genes)
|
53
|
+
## fix/todo: use as_json for "official" api order
|
54
|
+
## note: use insert order from "official" api
|
55
|
+
|
56
|
+
## genes << Gene::Slice.new( :body, kai[0],
|
57
|
+
## kai[1],
|
58
|
+
## kai[2],
|
59
|
+
## kai[3] )
|
60
|
+
## genes << Gene::Slice.new( :pattern, kai[4+0],
|
61
|
+
## kai[4+1],
|
62
|
+
## kai[4+2],
|
63
|
+
## kai[4+3]] )
|
64
|
+
|
65
|
+
keys.each_with_index do |key,i|
|
66
|
+
genes << Gene::Slice.new( key, kai[4*i+0],
|
67
|
+
kai[4*i+1],
|
68
|
+
kai[4*i+2],
|
69
|
+
kai[4*i+3])
|
70
|
+
end
|
71
|
+
genes
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def body() @genes[0]; end ## Fur (FU)
|
76
|
+
def pattern() @genes[1]; end ## Pattern (PA)
|
77
|
+
def coloreyes() @genes[2]; end ## Eyes Color (EC)
|
78
|
+
def eyes() @genes[3]; end ## Eyes Shape (ES)
|
79
|
+
def colorprimary() @genes[4]; end ## Base Color (BC)
|
80
|
+
def colorsecondary() @genes[5]; end ## Highlight Color (HC)
|
81
|
+
def colortertiary() @genes[6]; end ## Accent Color (AC)
|
82
|
+
def wild() @genes[7]; end ## Wild Element (WE)
|
83
|
+
def mouth() @genes[8]; end ## Mouth (MO)
|
84
|
+
def environment() @genes[9]; end ## Environment (EN)
|
85
|
+
def secret() @genes[10]; end ## Secret (SE)
|
86
|
+
def prestige() @genes[11]; end ## Purrstige (PU)
|
87
|
+
|
88
|
+
alias_method :color1, :colorprimary
|
89
|
+
alias_method :color2, :colorsecondary
|
90
|
+
alias_method :color3, :colortertiary
|
91
|
+
## todo: add more alias(es) - why? why not?
|
92
|
+
|
93
|
+
## add (convenience) alias for two-letter (trait type) codes too
|
94
|
+
alias_method :fu, :body
|
95
|
+
alias_method :pa, :pattern
|
96
|
+
alias_method :ec, :coloreyes
|
97
|
+
alias_method :es, :eyes
|
98
|
+
alias_method :bc, :colorprimary
|
99
|
+
alias_method :hc, :colorsecondary
|
100
|
+
alias_method :ac, :colortertiary
|
101
|
+
alias_method :we, :wild
|
102
|
+
alias_method :mo, :mouth
|
103
|
+
alias_method :en, :environment
|
104
|
+
alias_method :se, :secret
|
105
|
+
alias_method :pu, :prestige
|
106
|
+
|
107
|
+
|
108
|
+
def each() @genes.each { |slice| yield(slice) }; end
|
109
|
+
def each_with_index() @genes.each_with_index { |slice,i| yield(slice,i) }; end
|
110
|
+
alias_method :each_slice, :each
|
111
|
+
alias_method :each_slice_with_index, :each_with_index
|
112
|
+
|
113
|
+
def each_gene
|
114
|
+
@genes.each do |slice|
|
115
|
+
yield(slice.p)
|
116
|
+
yield(slice.r1)
|
117
|
+
yield(slice.r2)
|
118
|
+
yield(slice.r3)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
def each_gene_with_index
|
122
|
+
@genes.each_with_index do |slice,i|
|
123
|
+
yield(slice.p, 4*i+0)
|
124
|
+
yield(slice.r1, 4*i+1)
|
125
|
+
yield(slice.r2, 4*i+2)
|
126
|
+
yield(slice.r3, 4*i+3)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def keys ## rename to trait_type_keys - why? why not?
|
131
|
+
[:body, ### todo/fix: use TRAITS.keys or something - why? why not?
|
132
|
+
:pattern,
|
133
|
+
:coloreyes,
|
134
|
+
:eyes,
|
135
|
+
:colorprimary,
|
136
|
+
:colorsecondary,
|
137
|
+
:colortertiary,
|
138
|
+
:wild,
|
139
|
+
:mouth,
|
140
|
+
:environment,
|
141
|
+
:secret,
|
142
|
+
:prestige]
|
143
|
+
end
|
144
|
+
|
145
|
+
def index( key )
|
146
|
+
if key.size == 2 && key =~ /^[A-Za-z]{2}$/ ## check for codes e.g. FU, PA, ... (or fu, pa,...)
|
147
|
+
key = key.upcase.to_sym
|
148
|
+
@@codes_by_index ||= %w(FU PA EC ES BC HC AC WE MO EN SE PU)
|
149
|
+
.each_with_index.reduce({}) do |h,(code,i)|
|
150
|
+
h[code.to_sym]=i; h
|
151
|
+
end
|
152
|
+
@@codes_by_index[ key ]
|
153
|
+
else
|
154
|
+
key = key.downcase.to_sym
|
155
|
+
key = ALT_TRAIT_TYPE_KEYS[ key ] if ALT_TRAIT_TYPE_KEYS[ key ]
|
156
|
+
|
157
|
+
@@keys_by_index ||= keys.each_with_index.reduce({}) do |h,(key,i)|
|
158
|
+
h[key]=i; h
|
159
|
+
end
|
160
|
+
@@keys_by_index[ key ]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
def [](key)
|
166
|
+
if key.is_a? Integer ## assume 0,1,2,3,.. index
|
167
|
+
q , r = key.divmod(4) ## q=quotient, r=rest/modulus
|
168
|
+
## e.g. 3.divmod(4) => [0,3]
|
169
|
+
## 4.divmod(4) => [1,0]
|
170
|
+
## 5.divmod(4) => [1,1] etc.
|
171
|
+
@genes[q][r]
|
172
|
+
else ## assume trait type key / symbol
|
173
|
+
@genes[index(key)]
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def build_tables() GenomeTables.new( self ).build; end
|
179
|
+
end # class Genome
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
class GenomeTables
|
185
|
+
def initialize( genome )
|
186
|
+
@genome = genome
|
187
|
+
end
|
188
|
+
|
189
|
+
def build
|
190
|
+
pos = 0
|
191
|
+
buf = ""
|
192
|
+
buf << "Genes (256-Bit Integer Number):\n"
|
193
|
+
buf << "- Base 10 (Decimal): #{@genome.num}\n"
|
194
|
+
buf << "- Base 2 (Binary): #{@genome.binary}\n"
|
195
|
+
buf << "- Base 2⁵ = 32\n"
|
196
|
+
buf << " - (Kai): #{@genome.kai}\n"
|
197
|
+
buf << " - (Codes): #{@genome.codes}\n"
|
198
|
+
buf << "\n\n"
|
199
|
+
|
200
|
+
@genome.each do |slice|
|
201
|
+
tt = slice.type
|
202
|
+
|
203
|
+
buf << "#{tt.name} (#{tt.code}) - Genes #{tt.genes}\n\n"
|
204
|
+
|
205
|
+
###
|
206
|
+
## fix/todo: add stars for purity?
|
207
|
+
## **** - all traits the same
|
208
|
+
## *** - two same pairs of traits
|
209
|
+
## ** - one pair of same traits
|
210
|
+
|
211
|
+
buf << "|Gene |Binary |Kai |Code | Name | |\n"
|
212
|
+
buf << "|------|---------|-----|-----|----------|---|\n"
|
213
|
+
buf << "| #{pos} | #{slice.d.binary} | #{slice.d.kai} | #{slice.d.code} |**#{fmt_trait(slice.d)}** | d |\n"; pos+=1
|
214
|
+
buf << "| #{pos} | #{slice.r1.binary} | #{slice.r1.kai} | #{slice.r1.code} |#{fmt_trait(slice.r1)} | r1 |\n"; pos+=1
|
215
|
+
buf << "| #{pos} | #{slice.r2.binary} | #{slice.r2.kai} | #{slice.r2.code} |#{fmt_trait(slice.r2)} | r2 |\n"; pos+=1
|
216
|
+
buf << "| #{pos} | #{slice.r3.binary} | #{slice.r3.kai} | #{slice.r3.code} |#{fmt_trait(slice.r3)} | r3 |\n"; pos+=1
|
217
|
+
buf << "\n"
|
218
|
+
|
219
|
+
if tt.key == :body ## add legend for first entry
|
220
|
+
buf << "d = dominant, r1 = 1st order recessive, r2 = 2nd order recessive, r3 = 3rd order recessive\n\n"
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
buf
|
225
|
+
end
|
226
|
+
|
227
|
+
####################
|
228
|
+
## helpers
|
229
|
+
|
230
|
+
def fmt_trait( trait )
|
231
|
+
buf = ""
|
232
|
+
buf << (trait.name || '∅')
|
233
|
+
buf << " #{trait.tier_roman}" if trait.tier > 0
|
234
|
+
buf
|
235
|
+
end
|
236
|
+
end # class GenomeTables
|
data/lib/kittyverse/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kittyverse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base32-alphabets
|
@@ -78,6 +78,8 @@ files:
|
|
78
78
|
- lib/kittyverse/config/traits.rb
|
79
79
|
- lib/kittyverse/config/traits_timeline.rb
|
80
80
|
- lib/kittyverse/fancies.rb
|
81
|
+
- lib/kittyverse/gene.rb
|
82
|
+
- lib/kittyverse/genome.rb
|
81
83
|
- lib/kittyverse/links.rb
|
82
84
|
- lib/kittyverse/mewtations.rb
|
83
85
|
- lib/kittyverse/pages/genes.rb
|