kittyverse 0.5.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Manifest.txt +2 -3
- data/README.md +28 -24
- data/Rakefile +1 -1
- data/lib/kittyverse.rb +5 -9
- data/lib/kittyverse/cattributes.rb +1 -1
- data/lib/kittyverse/config/exclusives.rb +197 -0
- data/lib/kittyverse/config/fancies.rb +310 -178
- data/lib/kittyverse/config/purrstiges.rb +178 -11
- data/lib/kittyverse/config/special_editions.rb +135 -0
- data/lib/kittyverse/fancies.rb +4 -1
- data/lib/kittyverse/version.rb +4 -7
- data/test/test_cattributes.rb +0 -2
- data/test/test_fancies.rb +0 -2
- data/test/test_genome.rb +3 -0
- data/test/test_traits.rb +0 -2
- metadata +10 -13
- data/LICENSE.md +0 -116
- data/lib/kittyverse/api/client.rb +0 -147
- data/lib/kittyverse/api/versions.rb +0 -91
@@ -1,45 +1,186 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
###########################################
|
4
2
|
## Purrstige Traits / Cattributes
|
5
3
|
|
4
|
+
|
5
|
+
## trait recipe helpers / shortcuts
|
6
|
+
EN00_EN15 = ['EN00','EN01','EN02','EN03',
|
7
|
+
'EN04','EN05','EN06','EN07',
|
8
|
+
'EN08','EN09','EN10','EN11',
|
9
|
+
'EN12','EN13','EN14','EN15'] # Any non-visible Env (EN00-EN15)
|
10
|
+
|
11
|
+
PU16_PU29 = ['PU16','PU17','PU18','PU19',
|
12
|
+
'PU20','PU21','PU22','PU23',
|
13
|
+
'PU24','PU25','PU26','PU27',
|
14
|
+
'PU28','PU29' ]
|
15
|
+
PU24_PU27 = ['PU24','PU25','PU26','PU27']
|
16
|
+
PU24_PU30 = ['PU24','PU25','PU26','PU27',
|
17
|
+
'PU28','PU29','PU30']
|
18
|
+
PU28_PU29 = ['PU28','PU29']
|
19
|
+
PU28_PU30 = ['PU28','PU29','PU30']
|
20
|
+
|
21
|
+
|
22
|
+
WE00_WE07 = ['WE00', 'WE01', 'WE02', 'WE03',
|
23
|
+
'WE04', 'WE05', 'WE06', 'WE07']
|
24
|
+
WE00_WE15 = ['WE00', 'WE01', 'WE02', 'WE03',
|
25
|
+
'WE04', 'WE05', 'WE06', 'WE07',
|
26
|
+
'WE08', 'WE09', 'WE10', 'WE11',
|
27
|
+
'WE12', 'WE13', 'WE14', 'WE15']
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
PURRSTIGES_HACKATAO = {
|
32
|
+
# This weekend a set of Hackatao Purrstige traits are making
|
33
|
+
# their way into CryptoKitties.
|
34
|
+
# The "HaCKittieZ" will be breedable for a limited time from October 24th - 31st.
|
35
|
+
#
|
36
|
+
# Hackatao are decentralized artists widely known for
|
37
|
+
# their beautiful illustrations and collected among cool cats in the community.
|
38
|
+
#
|
39
|
+
# HaCKittieZ is our collaboration with renowned artist Hackatao and Async Art
|
40
|
+
# to give you incredible ways to personalize your CryptoKitties
|
41
|
+
# and push the boundaries of programmable art.
|
42
|
+
# A set of Purrstige traits designed by Hackatao will be breedable for a limited time.
|
43
|
+
# The HaCKittieZ traits can be mixed and matched to personalize
|
44
|
+
# your Kitties and create exciting permutations!
|
45
|
+
|
46
|
+
# 24.10.20 - New Purrstige - Meowfoolest
|
47
|
+
meowfoolest: { name: 'Meowfoolest',
|
48
|
+
recipe: {
|
49
|
+
time: { start: '2020-10-24', end: '2020-10-31'}, count: 254,
|
50
|
+
traits: ['liger', 'shale', 'PU30', 'daemonwings'] },
|
51
|
+
},
|
52
|
+
# 24.10.20 - New Purrstige - Meowfool
|
53
|
+
meowfool: { name: 'Meowfool',
|
54
|
+
recipe: {
|
55
|
+
time: { start: '2020-10-24', end: '2020-10-31'}, count: 388,
|
56
|
+
traits: ['shale', 'daemonwings', PU28_PU29] },
|
57
|
+
},
|
58
|
+
# 24.10.20 - New Purrstige - Meownificent
|
59
|
+
meownificent: { name: 'Meownificent',
|
60
|
+
recipe: {
|
61
|
+
time: { start: '2020-10-24', end: '2020-10-31'}, count: 260,
|
62
|
+
traits: [ 'liger', 'shale', 'PU30', WE00_WE15] },
|
63
|
+
},
|
64
|
+
# 24.10.20 - New Purrstige - Meowthulhu
|
65
|
+
meowthulhu: { name: 'Meowthulhu',
|
66
|
+
recipe: {
|
67
|
+
time: { start: '2020-10-24', end: '2020-10-31'}, count: 950,
|
68
|
+
traits: [ 'daemonwings', PU28_PU30] },
|
69
|
+
},
|
70
|
+
# 24.10.20 - New Purrstige - Meownique
|
71
|
+
meownique: { name: 'Meownique',
|
72
|
+
recipe: {
|
73
|
+
time: { start: '2020-10-24', end: '2020-10-31'}, count: 557,
|
74
|
+
traits: [ 'shale', PU28_PU29, WE00_WE15] },
|
75
|
+
},
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
PURRSTIGES_KITTENHEIM = {
|
81
|
+
# 07.11.19 - New Purrstige - Purrior
|
82
|
+
purrior: { name: 'Purrior',
|
83
|
+
recipe: {
|
84
|
+
time: { start: '2019-11-07', end: '2019-12-01' }, count: 120,
|
85
|
+
traits: [] },
|
86
|
+
},
|
87
|
+
# 06.11.19 - New Purrstige - Centurion
|
88
|
+
centurion: { name: 'Centurion',
|
89
|
+
recipe: {
|
90
|
+
time: { start: '2019-11-06', end: '2019-12-01' }, count: 144,
|
91
|
+
traits: [] },
|
92
|
+
},
|
93
|
+
# 03.11.19 - New Purrstige - Explorer
|
94
|
+
explorer: { name: 'Explorer',
|
95
|
+
recipe: {
|
96
|
+
time: { start: '2019-11-03', end: '2019-12-01' }, count: 162,
|
97
|
+
traits: ['lykoi', 'daemonhorns', ['rascal', 'camo'], 'PU28'] },
|
98
|
+
},
|
99
|
+
# 02.11.19 - New Purrstige - Guard
|
100
|
+
guard: { name: 'Guard',
|
101
|
+
recipe: {
|
102
|
+
time: { start: '2019-11-02', end: '2019-12-01' }, count: 220,
|
103
|
+
traits: [] },
|
104
|
+
},
|
105
|
+
# 01.11.19 - New Purrstige - Velite
|
106
|
+
velite: { name: 'Velite',
|
107
|
+
recipe: {
|
108
|
+
time: { start: '2019-11-01', end: '2019-12-01' }, count: 273,
|
109
|
+
traits: [] },
|
110
|
+
},
|
111
|
+
# 01.11.19 - New Purrstige - Scout
|
112
|
+
scout: { name: 'Scout',
|
113
|
+
recipe: {
|
114
|
+
time: { start: '2019-11-01', end: '2019-12-01' }, count: 140,
|
115
|
+
traits: [] },
|
116
|
+
},
|
117
|
+
# 02.11.19 - New Purrstige - Dominator
|
118
|
+
dominator: { name: 'Dominator',
|
119
|
+
recipe: {
|
120
|
+
time: { start: '2019-11-02', end: '2019-12-01' }, count: 141,
|
121
|
+
traits: ['lykoi', 'daemonhorns', PU24_PU27] },
|
122
|
+
},
|
123
|
+
|
124
|
+
# Nov 1, 2019 - Brassard trait is discovered. Purrstige
|
125
|
+
brassard: { name: 'Brassard',
|
126
|
+
recipe: {
|
127
|
+
time: { start: '2019-11-01', end: '2019-12-01' }, count: 793,
|
128
|
+
traits: [WE00_WE07, PU24_PU27] },
|
129
|
+
},
|
130
|
+
|
131
|
+
# Nov 1, 2019 - Aegis trait is discovered. Purrstige
|
132
|
+
aegis: { name: 'Aegis',
|
133
|
+
recipe: {
|
134
|
+
time: { start: '2019-11-01', end: '2019-12-01' }, count: 617,
|
135
|
+
traits: [] },
|
136
|
+
},
|
137
|
+
}
|
138
|
+
|
139
|
+
|
6
140
|
PURRSTIGES_ROBOKITTY = {
|
7
141
|
###
|
8
142
|
# May 1, 2019
|
9
143
|
# 7 Robokitty Purrstiges
|
144
|
+
|
145
|
+
# 12.12.19 - New Purrstige - Driver
|
146
|
+
driver: { name: 'Driver',
|
147
|
+
recipe: {
|
148
|
+
time: { start: '2019-12-12', end: '2019-12-13' }, count: 257,
|
149
|
+
traits: ['ragdoll', TOTESBASIC, WE00_WE15, 'drift', PU24_PU30] },
|
150
|
+
},
|
10
151
|
bionic: { name: 'Bionic',
|
11
152
|
recipe: {
|
12
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
153
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 624,
|
13
154
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU30'] }
|
14
155
|
},
|
15
156
|
fileshare: { name: 'Fileshare',
|
16
157
|
recipe: {
|
17
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
158
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 683,
|
18
159
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU29'] }
|
19
160
|
},
|
20
161
|
pawsfree: { name: 'Pawsfree',
|
21
162
|
recipe: {
|
22
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
163
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 430,
|
23
164
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU28'] }
|
24
165
|
},
|
25
166
|
uplink: { name: 'Uplink',
|
26
167
|
recipe: {
|
27
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
168
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 1151,
|
28
169
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU27'] }
|
29
170
|
},
|
30
171
|
gaunlet: { name: 'Gauntlet',
|
31
172
|
recipe: {
|
32
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
173
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 905,
|
33
174
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU26'] }
|
34
175
|
},
|
35
176
|
catterypack: { name: 'Catterypack',
|
36
177
|
recipe: {
|
37
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
178
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 513,
|
38
179
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU25'] }
|
39
180
|
},
|
40
181
|
squelch: { name: 'Squelch',
|
41
182
|
recipe: {
|
42
|
-
time: { start: '2019-05-01', end: '2019-08-31' },
|
183
|
+
time: { start: '2019-05-01', end: '2019-08-31' }, count: 828,
|
43
184
|
traits: ['ragdoll', 'WE05', TOTESBASIC, 'PU24'] }
|
44
185
|
}
|
45
186
|
}
|
@@ -143,6 +284,9 @@ inaband: { name: 'Inaband',
|
|
143
284
|
}
|
144
285
|
|
145
286
|
|
287
|
+
|
288
|
+
|
289
|
+
|
146
290
|
###############
|
147
291
|
## todo:
|
148
292
|
## - use PURRSTIGES_XMAS?! and other themes too - why? why not?
|
@@ -157,15 +301,36 @@ inaband: { name: 'Inaband',
|
|
157
301
|
PRESTIGES = PURRSTIGES =
|
158
302
|
{
|
159
303
|
|
304
|
+
# 01.01.20 - New Purrstige - Confettibox
|
305
|
+
confettibox: { name: 'Confettibox',
|
306
|
+
recipe: {
|
307
|
+
time: { start: '2020-01-01', end: '2020-01-15' }, count: 554,
|
308
|
+
traits: ['tinybox', 'PU26'] },
|
309
|
+
},
|
310
|
+
# 01.12.19 - New Purrstige - Celebration
|
311
|
+
celebration: { name: 'Celebration',
|
312
|
+
recipe: {
|
313
|
+
time: { start: '2019-12-01', end: '?' }, count: 1080,
|
314
|
+
traits: [EN00_EN15, PU16_PU29] },
|
315
|
+
},
|
316
|
+
# 01.12.19 - New Purrstige - Grandfinale
|
317
|
+
grandfinale: { name: 'Grandfinale',
|
318
|
+
recipe: {
|
319
|
+
time: { start: '2019-12-01', end: '?' }, count: 520,
|
320
|
+
traits: [EN00_EN15, 'PU30'] },
|
321
|
+
},
|
322
|
+
|
323
|
+
|
324
|
+
|
160
325
|
# Jun 28, 2019 - Werekitty trait is discovered. Purrstige
|
161
326
|
werekitty: { name: 'Werekitty',
|
162
327
|
recipe: {
|
163
328
|
time: { start: '2019-06-28', end: '2019-07-27' }, count: 438,
|
164
329
|
traits: ['moonrise', 'littlefoot', 'PU24',
|
165
|
-
|
330
|
+
EN00_EN15] },
|
166
331
|
desc: 'Monster Month Purrstige Trait'
|
167
332
|
},
|
168
|
-
|
333
|
+
|
169
334
|
##
|
170
335
|
# Mar 15, 2019
|
171
336
|
# Oohshiny trait is discovered. Purrstige
|
@@ -223,3 +388,5 @@ oohshiny: { name: 'Oohshiny',
|
|
223
388
|
}.merge( PURRSTIGES_ROBOKITTY )
|
224
389
|
.merge( PURRSTIGES_PIRATE )
|
225
390
|
.merge( PURRSTIGES_ALPACAT )
|
391
|
+
.merge( PURRSTIGES_KITTENHEIM )
|
392
|
+
.merge( PURRSTIGES_HACKATAO )
|
@@ -0,0 +1,135 @@
|
|
1
|
+
###
|
2
|
+
## Special Editions - Crypto Kitties
|
3
|
+
## see https://www.cryptokitties.co/catalogue/special-edition-cats
|
4
|
+
##
|
5
|
+
## These cool Kitties have limited edition art
|
6
|
+
## and are never obtainable through breeding
|
7
|
+
|
8
|
+
|
9
|
+
SPECIAL_EDITIONS = {
|
10
|
+
|
11
|
+
frostymcwhiskers: { name: 'Frosty McWhiskers', date: '2020-12-14',
|
12
|
+
specialedition: {
|
13
|
+
limit: 104 },
|
14
|
+
},
|
15
|
+
|
16
|
+
###
|
17
|
+
# The redemption window to claim to your very own Fannie Special Edition Kitty
|
18
|
+
# will be closing this Saturday. For each Fannie, you'll need to submit
|
19
|
+
# a unique trio of Wild West Kitties (one Pickett, one Reeves and one Dart)
|
20
|
+
# to our Kitty Bounty Wallet along with a valid submission form
|
21
|
+
# before the deadline on 12/5/2020 at 11:59pm PT
|
22
|
+
fannie: { name: 'Fannie', date: '2020-12-14', ## first/lowest id: #1_992_009
|
23
|
+
specialedition: {
|
24
|
+
limit: 58 },
|
25
|
+
},
|
26
|
+
|
27
|
+
# With transactions getting stuck and costs to gift Kitties soaring through the roofs,
|
28
|
+
# we've decided to extend the window to redeem your Katz band members
|
29
|
+
# for Special Edition Mascots.
|
30
|
+
# The new redemption window ends on September 1st, 11:59pm PT.
|
31
|
+
## Gas prices have slowed down redemption but there are currently
|
32
|
+
## 20 Algies and 30 Eddies earmarked for distribution.
|
33
|
+
|
34
|
+
algie: { name: 'Algie', date: '2020-10-29', ## first/lowest id: #1_137_676 !! - todo/check - first birthdate?
|
35
|
+
specialedition: {
|
36
|
+
limit: 179 },
|
37
|
+
},
|
38
|
+
|
39
|
+
eddie: { name: 'Eddie', date: '2020-09-03', # first/lowest id: #1_967_278
|
40
|
+
specialedition: {
|
41
|
+
limit: 110 },
|
42
|
+
},
|
43
|
+
|
44
|
+
marty: { name: 'Marty', date: '2020-09-01',
|
45
|
+
specialedition: {
|
46
|
+
limit: 188 },
|
47
|
+
desc: 'Collaboration with Muse',
|
48
|
+
},
|
49
|
+
|
50
|
+
pandora: { name: 'Pandora', date: '2020-07-31',
|
51
|
+
specialedition: {
|
52
|
+
limit: 50 },
|
53
|
+
desc: 'CryptoKitty Box Support',
|
54
|
+
},
|
55
|
+
|
56
|
+
holli: { name: 'Holli', date: '2020-07-03', # first/lowest id: #1_949_215
|
57
|
+
specialedition: {
|
58
|
+
limit: 59 },
|
59
|
+
},
|
60
|
+
|
61
|
+
kikuyu: { name: 'Kikuyu', date: '2020-06-13',
|
62
|
+
specialedition: {
|
63
|
+
limit: 263 },
|
64
|
+
desc: 'For Hunter+Zelig+Bodhi',
|
65
|
+
},
|
66
|
+
|
67
|
+
flowtron: { name: 'Flowtron', date: '2020-05-21',
|
68
|
+
specialedition: {
|
69
|
+
limit: 303 },
|
70
|
+
desc: 'Exchange on Flow Fancy Set',
|
71
|
+
},
|
72
|
+
|
73
|
+
catterina: { name: 'Catterina', date: '2020-05-13',
|
74
|
+
specialedition: {
|
75
|
+
limit: 100 },
|
76
|
+
desc: 'Momo Wang',
|
77
|
+
},
|
78
|
+
|
79
|
+
negabillie: { name: 'Nega Billie', date: '2020-04-27',
|
80
|
+
specialedition: {
|
81
|
+
limit: 68 },
|
82
|
+
},
|
83
|
+
|
84
|
+
##############
|
85
|
+
# 2019
|
86
|
+
carl: { name: 'Carl', date: '2019-08-20', # first/lowest id: #1_680_709
|
87
|
+
specialedition: {
|
88
|
+
limit: 40 },
|
89
|
+
},
|
90
|
+
|
91
|
+
alice: { name: 'Alice', date: '2019-08-23', # first/lowest id: #1_681_913
|
92
|
+
specialedition: {
|
93
|
+
limit: 88 },
|
94
|
+
},
|
95
|
+
|
96
|
+
|
97
|
+
'kitt-e': { name: 'KITT-E', date: '2019-05-10',
|
98
|
+
specialedition: {
|
99
|
+
limit: 500 },
|
100
|
+
desc: 'Dapper (Crypto Contract) Wallet Promotion Cat'
|
101
|
+
},
|
102
|
+
# Apr 10, 2019 - Sparkles Special Edition Cat is released.Special Edition Cat
|
103
|
+
sparkles: { name: 'Sparkles', date: '2019-04-10',
|
104
|
+
specialedition: {
|
105
|
+
limit: 100 },
|
106
|
+
desc: 'Freebie for CryptoKitties Community Events'
|
107
|
+
},
|
108
|
+
|
109
|
+
## date: '2019-01-10 ??? -- use for date "announced" or something - why? why not?
|
110
|
+
aeoncat: { name: 'Aeoncat',
|
111
|
+
specialedition: {
|
112
|
+
time: { start: '2019-01-17', end: '2019-01-28' },
|
113
|
+
limit: 380 }, ## Don't sleep - there's only 380 up for grabs!
|
114
|
+
desc: 'Goddess Aeona - Goddess of Nature - Gods Unchained Promotion'
|
115
|
+
},
|
116
|
+
|
117
|
+
#############################
|
118
|
+
## 2018
|
119
|
+
## December
|
120
|
+
catzy: { name: 'Catzy', date: '2018-12-31',
|
121
|
+
specialedition: {
|
122
|
+
limit: 10, ids: (1137653..1137662).to_a },
|
123
|
+
desc: 'Changpeng "CZ" Zhao - CEO of Binance - Top 10 Blockchain Influencer of the Year 2018 by CoinDesk'
|
124
|
+
},
|
125
|
+
purremyallaire: { name: 'Purremy Allaire', date: '2018-12-31',
|
126
|
+
specialedition: {
|
127
|
+
limit: 10, ids: (1137663..1137672).to_a },
|
128
|
+
desc: 'Jeremy Allaire - Top 10 Blockchain Influencer of the Year 2018 by CoinDesk'
|
129
|
+
},
|
130
|
+
lilbub: { name: 'Lil Bub Ub Bub (BUB)', date: '2018-11-13',
|
131
|
+
specialedition: {
|
132
|
+
limit: 500 }
|
133
|
+
},
|
134
|
+
}
|
135
|
+
|
data/lib/kittyverse/fancies.rb
CHANGED
@@ -141,6 +141,9 @@ class Fancy
|
|
141
141
|
## auto-fill fancies
|
142
142
|
FANCIES.each do |key,h|
|
143
143
|
|
144
|
+
puts "fancy:"
|
145
|
+
pp h
|
146
|
+
|
144
147
|
name = h[:name]
|
145
148
|
name_cn = h[:name_cn] # add chinese name if present
|
146
149
|
|
@@ -174,7 +177,7 @@ class Fancy
|
|
174
177
|
variants: h[:recipe][:variants], ## todo/fix: turn variant hash into variant ??? - why? why not?
|
175
178
|
limit: h[:recipe][:limit],
|
176
179
|
time_start: h[:recipe][:time] && h[:recipe][:time][:start] ? Date.strptime( h[:recipe][:time][:start], '%Y-%m-%d' ) : nil,
|
177
|
-
time_end: h[:recipe][:time] && h[:recipe][:time][:end]
|
180
|
+
time_end: h[:recipe][:time] && h[:recipe][:time][:end] && h[:recipe][:time][:end] != '?' ? Date.strptime( h[:recipe][:time][:end], '%Y-%m-%d' ) : nil )
|
178
181
|
|
179
182
|
## note: support overflow "shortcut" - overflow+limit => count
|
180
183
|
count = if h[:recipe][:overflow]
|
data/lib/kittyverse/version.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
|
4
1
|
class Kittyverse
|
5
2
|
|
6
|
-
MAJOR =
|
7
|
-
MINOR =
|
3
|
+
MAJOR = 1
|
4
|
+
MINOR = 0
|
8
5
|
PATCH = 0
|
9
6
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
10
7
|
|
@@ -13,11 +10,11 @@ class Kittyverse
|
|
13
10
|
end
|
14
11
|
|
15
12
|
def self.banner
|
16
|
-
"kittyverse/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}]"
|
13
|
+
"kittyverse/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
|
17
14
|
end
|
18
15
|
|
19
16
|
def self.root
|
20
|
-
|
17
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
|
21
18
|
end
|
22
19
|
|
23
20
|
end # module Kittyverse
|
data/test/test_cattributes.rb
CHANGED
data/test/test_fancies.rb
CHANGED