copycats 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 30ab48ee0c735efb58576dbe0a5d3551bf75cf8b
4
- data.tar.gz: 36b71fec5e5d77dcef7b7fd6bdfe49a9eac0faf4
3
+ metadata.gz: 50a95619e02e3d6db1a9fe343844871ee523ba0a
4
+ data.tar.gz: 6dacf27f0f458222fc4c149dd070096de742a5d1
5
5
  SHA512:
6
- metadata.gz: 6c4d1b2aa013871c099267ad5f37ea487c659c5863b4a00410b85a66b6b1095309386143d073f73f2e675248db6902a7b136217f0102fa3478be247f6a9ddae1
7
- data.tar.gz: 77670aa204f204e0a82a3eb122d0a3b9ef4009d111af67fa37b2407b10a8606a530dda12619097131fb298a79938da12b596e965792335ba8d686ae085dd260a
6
+ metadata.gz: 14ba1e1ccfc4df5e04d4e53a6fbf67fdcb2351b19d1c0e7097b19bdca20c9a09993b84f793c5f630d36d3d6f31de6f82cfc863756627a91ffb97c30aba1d378b
7
+ data.tar.gz: cce891ba518978154083f84c9323e4214b95fb241e3d330dc35c470f02491bc1a998e9e00c8afd2c6099c7f85c821f23f5408b2235398ca82a1f7bb57abfe8dc
data/README.md CHANGED
@@ -12,6 +12,80 @@ copycats command line tool (and core library) - crypto cats / kitties collectibl
12
12
 
13
13
 
14
14
 
15
+ ## Updates
16
+
17
+ New Traits / Catttributes:
18
+
19
+ ### 2018
20
+
21
+ March
22
+
23
+ - Mar/16: **thunderstruck** - pattern (i)
24
+ - Mar/16: **rascal** - pattern (3)
25
+
26
+ <!-- break -->
27
+
28
+ - Mar/14: **dragonfruit** - base color (e)
29
+
30
+ <!-- break -->
31
+
32
+ - Mar/9: **belch** - mouth (7)
33
+
34
+ <!-- break -->
35
+
36
+ - Mar/8: **pixiebob** - fur (8)
37
+ - Mar/8: **poisonberry** - highlight color (4)
38
+ - Mar/8: **safetyvest** - highlight color (i)
39
+
40
+ <!-- break -->
41
+
42
+ - Mar/5: **cyan** - eye color (g)
43
+
44
+
45
+
46
+ February
47
+
48
+ - Feb/28: **missmuffet** - accent color (e)
49
+ - Feb/28: **wiley** - eye shape (f)
50
+
51
+ <!-- break -->
52
+
53
+ - Feb/23: **dippedcone** - pattern (j)
54
+ - Feb/23: **leopard** - pattern (5)
55
+
56
+ <!-- break -->
57
+
58
+ - Feb/20: **harbourfog** - base color (9)
59
+
60
+ <!-- break -->
61
+
62
+ - Feb/13: **baddate** - eye shape (b)
63
+
64
+ <!-- break -->
65
+
66
+ - Feb/12: **wuvme** - mouth (3)
67
+ - Feb/12: **yokel** - mouth (q)
68
+ - Feb/12: **starstruck** - mouth (i)
69
+
70
+ <!-- break -->
71
+
72
+ - Feb/9: **egyptiankohl** - highlight color (3)
73
+ - Feb/9: **bobtail** - fur (6)
74
+
75
+ <!-- break -->
76
+
77
+ - Feb/6: **tiger** - pattern (2)
78
+
79
+ <!-- break -->
80
+
81
+ - Feb/2: **birman** - fur (4)
82
+ - Feb/2: **coralsunrise** - eye color (c)
83
+
84
+ (Source: [CryptoKitties Updates](https://updates.cryptokitties.co))
85
+
86
+
87
+
88
+
15
89
  ## kitty Command Line Tool
16
90
 
17
91
  Use the `kitty` command line tool to (auto-)read kitty data records
@@ -245,6 +319,107 @@ Table Diagram
245
319
  ![](copycats-tables.png)
246
320
 
247
321
 
322
+ SQL Tables (in SQLite Dialect)
323
+
324
+ ``` sql
325
+ CREATE TABLE kitties (
326
+ id INTEGER PRIMARY KEY AUTOINCREMENT
327
+ NOT NULL,
328
+ name VARCHAR,
329
+ genes_kai VARCHAR NOT NULL,
330
+ gen INTEGER NOT NULL,
331
+ birthdate DATETIME NOT NULL,
332
+ day_count INTEGER NOT NULL,
333
+ matron_id INTEGER,
334
+ sire_id INTEGER,
335
+ body_id INTEGER NOT NULL,
336
+ pattern_id INTEGER NOT NULL,
337
+ coloreyes_id INTEGER NOT NULL,
338
+ eyes_id INTEGER NOT NULL,
339
+ color1_id INTEGER NOT NULL,
340
+ color2_id INTEGER NOT NULL,
341
+ color3_id INTEGER NOT NULL,
342
+ wild_id INTEGER NOT NULL,
343
+ mouth_id INTEGER NOT NULL
344
+ );
345
+
346
+
347
+ CREATE TABLE genes (
348
+ id INTEGER PRIMARY KEY AUTOINCREMENT
349
+ NOT NULL,
350
+ kitty_id INTEGER NOT NULL,
351
+ n INTEGER NOT NULL,
352
+ gene VARCHAR NOT NULL,
353
+ gene_n INTEGER NOT NULL,
354
+ trait_id INTEGER NOT NULL
355
+ );
356
+
357
+
358
+ CREATE TABLE traits (
359
+ id INTEGER PRIMARY KEY AUTOINCREMENT
360
+ NOT NULL,
361
+ trait_type_id INTEGER NOT NULL,
362
+ name VARCHAR NOT NULL,
363
+ n INTEGER NOT NULL,
364
+ kai VARCHAR NOT NULL,
365
+ tier INTEGER
366
+ );
367
+
368
+ CREATE TABLE trait_types (
369
+ id INTEGER PRIMARY KEY AUTOINCREMENT
370
+ NOT NULL,
371
+ name VARCHAR NOT NULL,
372
+ [key] VARCHAR NOT NULL
373
+ );
374
+
375
+ ```
376
+
377
+ ## Database Setup
378
+
379
+ Use the kitty setup command to setup an SQLite database and (auto-)read
380
+ all datafiles. Example:
381
+
382
+ ```
383
+ $ kitty setup
384
+ ```
385
+
386
+ This will create:
387
+
388
+ - a single-file SQLite database `kitties.db`
389
+ - setup all tables
390
+ - add all known traits and trait types (body, pattern, eyes, ...) and
391
+ - (auto-)read all datafiles (`**/*.csv`) in the `.` and all subdirectories
392
+
393
+
394
+ Note: Use the `-i/--include` option to change the default data directory (that is, `.`)
395
+ and use the `-n/--dbname` option to change the default SQLite database name (that is, `kitties.db`)
396
+ and use the `-d/--dbpath` option to change the default SQLite database path (that is, `.`).
397
+
398
+
399
+ Showtime! Use the sqlite3 command line tool
400
+ and try some queries. Example:
401
+
402
+ ```
403
+ $ sqlite3 kitties.db
404
+
405
+ sqlite> SELECT * FROM kitties WHERE id = 1;
406
+
407
+ 1||ccac 7787 fa7f afaa 1646 7755 f9ee 4444 6766 7366 cccc eede|0|2017-11-23 06:19:59|...
408
+
409
+ sqlite> SELECT * FROM genes WHERE trait_id = 14; -- sphynx (14)
410
+
411
+ 1|1|0|d|0|14
412
+ 3|1|2|r2|2|14
413
+ 4|1|3|r3|3|14
414
+ 38|2|1|r1|1|14
415
+ 146|5|1|r1|1|14
416
+ 181|6|0|d|0|14
417
+ 183|6|2|r2|2|14
418
+ ...
419
+ ```
420
+
421
+
422
+
248
423
  ## Database Queries
249
424
 
250
425
  ### SQL
@@ -404,6 +579,11 @@ $ gem install copycats
404
579
  ```
405
580
 
406
581
 
582
+ ## Questions? Comments?
583
+
584
+ Post them on the [cryptokitties reddit](https://www.reddit.com/r/cryptokitties). Thanks.
585
+
586
+
407
587
 
408
588
  ## License
409
589
 
data/lib/copycats/data.rb CHANGED
@@ -129,26 +129,70 @@ def read_datafiles( data_dir: './data' )
129
129
  kitties = CSV.read( file, headers:true )
130
130
  pp kitties.headers
131
131
 
132
- ## note: for now use first 5 rows for testing
133
- ## kitties[0..4].each do |row|
132
+ ## check format
133
+ if kitties.headers.include?( 'id' ) &&
134
+ kitties.headers.include?( 'gen' ) &&
135
+ kitties.headers.include?( 'matron_id' ) &&
136
+ kitties.headers.include?( 'sire_id' ) &&
137
+ kitties.headers.include?( 'birthdate' ) &&
138
+ kitties.headers.include?( 'genes' ) &&
139
+ kitties.headers.include?( 'name' )
140
+ ## "standard" format
141
+ ## required headers include: id, gen, matron_id, sire_id, birthdate, genes, name
142
+ headers = {
143
+ 'id' => 'id',
144
+ 'gen' => 'gen',
145
+ 'matron_id' => 'matron_id',
146
+ 'sire_id' => 'sire_id',
147
+ 'birthdate' => 'birthdate',
148
+ 'genes' => 'genes',
149
+ 'name' => 'name'
150
+ }
151
+ elsif kitties.headers.include?( 'id' ) &&
152
+ kitties.headers.include?( 'matron_id' ) &&
153
+ kitties.headers.include?( 'sire_id' ) &&
154
+ kitties.headers.include?( 'gen' ) &&
155
+ kitties.headers.include?( 'birth_date' ) &&
156
+ kitties.headers.include?( 'genes_kai' )
157
+ ## "kittydex" format
158
+ ## see https://cryptokittydex.com/resources
159
+ ## required headers include: id, matron_id, sire_id, gen, birth_date, genes_kai
160
+ headers = {
161
+ 'id' => 'id',
162
+ 'matron_id' => 'matron_id',
163
+ 'sire_id' => 'sire_id',
164
+ 'gen' => 'gen',
165
+ 'birthdate' => 'birth_date',
166
+ 'genes' => 'genes_kai',
167
+ 'name' => 'name' ## note: will always be nil (is missing in kittydex)
168
+ }
169
+ else
170
+ ## unknown format
171
+ puts "!!! unknown datafile format; matching headers NOT found / missing"
172
+ exit 1
173
+ end
174
+
134
175
 
135
176
  ## start of kitties blockchain / genesis
136
177
  genesisdate = Date.new( 2017, 11, 23) ## 2017-11-23
137
178
 
179
+ ## note: for now use first 5 rows for testing
180
+ ## kitties[0..4].each do |row|
181
+
138
182
  kitties.each do |row|
139
183
  ## puts row['id'] + '|' + row['gen'] + '|' + row['genes_kai']
140
184
  k = Copycats::Model::Kitty.new
141
- k.id = row['id'].to_i
142
- k.gen = row['gen'].to_i
143
- k.matron_id = row['matron_id'] unless row['matron_id'].blank?
144
- k.sire_id = row['sire_id'] unless row['sire_id'].blank?
145
- k.name = row['name'] unless row['name'].blank?
185
+ k.id = row[headers['id']].to_i
186
+ k.gen = row[headers['gen']].to_i
187
+ k.matron_id = row[headers['matron_id']].to_i unless row[headers['matron_id']].blank? || row[headers['matron_id']] == '0'
188
+ k.sire_id = row[headers['sire_id']].to_i unless row[headers['sire_id']].blank? || row[headers['sire_id']] == '0'
189
+ k.name = row[headers['name']] unless row[headers['name']].blank?
146
190
 
147
- ## todo: pretty print (format genes_kai !!!!)
148
- k.genes_kai = row['genes'] || row['genes_kai'] ### .gsub( ' ', '' ) ## remove all spaces - why? why not?
191
+ ## todo: pretty print (format genes !!!!)
192
+ k.genes_kai = row[headers['genes']] ### .gsub( ' ', '' ) ## remove all spaces - why? why not?
149
193
 
150
194
  ## pp row['birthdate']
151
- birthdate = DateTime.strptime( row['birthdate'], '%Y-%m-%d %H:%M:%S' )
195
+ birthdate = DateTime.strptime( row[headers['birthdate']], '%Y-%m-%d %H:%M:%S' )
152
196
  k.birthdate = birthdate
153
197
  k.day_count = (birthdate.to_date.jd - genesisdate.jd)+1
154
198
 
@@ -26,7 +26,7 @@ TRAITS =
26
26
  '5' => '',
27
27
  '6' => 'bobtail',
28
28
  '7' => '',
29
- '8' => '',
29
+ '8' => 'pixiebob',
30
30
  '9' => '',
31
31
  'a' => 'cymric',
32
32
  'b' => 'chartreux',
@@ -59,7 +59,7 @@ TRAITS =
59
59
  kai: {
60
60
  '1' => '',
61
61
  '2' => 'tiger',
62
- '3' => '',
62
+ '3' => 'rascal',
63
63
  '4' => 'ganado',
64
64
  '5' => 'leopard',
65
65
  '6' => 'camo ',
@@ -74,7 +74,7 @@ TRAITS =
74
74
  'f' => 'totesbasic', ## use totesbasic_f - why? why not?
75
75
  'g' => 'totesbasic', ## use totesbasic_g
76
76
  'h' => '',
77
- 'i' => '',
77
+ 'i' => 'thunderstruck',
78
78
  'j' => 'dippedcone',
79
79
  'k' => '',
80
80
  'm' => 'tigerpunk',
@@ -110,7 +110,7 @@ TRAITS =
110
110
  'd' => '',
111
111
  'e' => '',
112
112
  'f' => '',
113
- 'g' => '',
113
+ 'g' => 'cyan',
114
114
  'h' => 'pumpkin',
115
115
  'i' => 'limegreen',
116
116
  'j' => '',
@@ -167,6 +167,7 @@ TRAITS =
167
167
  '8' => 'nachocheez',
168
168
  '9' => 'harbourfog',
169
169
  'b' => 'greymatter',
170
+ 'd' => 'dragonfruit',
170
171
  'f' => 'hintomint',
171
172
  'g' => 'bananacream',
172
173
  'h' => 'cloudwhite',
@@ -181,6 +182,7 @@ TRAITS =
181
182
  name: 'Highlight Color', ## colorsecondary / sec color / pattern color
182
183
  kai: {
183
184
  '3' => 'egyptiankohl',
185
+ '4' => 'poisonberry',
184
186
  '5' => 'lilac',
185
187
  '6' => 'apricot',
186
188
  '7' => 'royalpurple',
@@ -191,6 +193,7 @@ TRAITS =
191
193
  'd' => 'coffee',
192
194
  'e' => 'lemonade',
193
195
  'f' => 'chocolate',
196
+ 'i' => 'safetyvest',
194
197
  'j' => 'turtleback',
195
198
  'm' => 'wolfgrey',
196
199
  'n' => 'cerulian',
@@ -254,7 +257,7 @@ TRAITS =
254
257
  '4' => 'gerbil',
255
258
  '5' => '',
256
259
  '6' => '',
257
- '7' => '',
260
+ '7' => 'belch',
258
261
  '8' => '',
259
262
  '9' => 'beard',
260
263
  'a' => 'pouty',
@@ -5,7 +5,7 @@ module Copycats
5
5
 
6
6
  MAJOR = 0
7
7
  MINOR = 6
8
- PATCH = 0
8
+ PATCH = 1
9
9
  VERSION = [MAJOR,MINOR,PATCH].join('.')
10
10
 
11
11
  def self.version
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: copycats
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gerald Bauer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-16 00:00:00.000000000 Z
11
+ date: 2018-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord