artbase 0.1.0 → 0.2.0
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/CHANGELOG.md +3 -3
- data/Manifest.txt +3 -6
- data/README.md +274 -39
- data/Rakefile +38 -29
- data/bin/artbase +17 -17
- data/lib/artbase/attributes.rb +83 -83
- data/lib/artbase/collection/base.rb +268 -0
- data/lib/artbase/collection/image.rb +39 -39
- data/lib/artbase/collection/opensea.rb +297 -484
- data/lib/artbase/collection/token.rb +362 -72
- data/lib/artbase/collection.rb +12 -12
- data/lib/artbase/helper.rb +168 -149
- data/lib/artbase/image/sample.rb +31 -0
- data/lib/artbase/image.rb +31 -75
- data/lib/artbase/retry.rb +41 -0
- data/lib/artbase/tool.rb +169 -159
- data/lib/artbase/version.rb +22 -22
- data/lib/artbase.rb +103 -42
- metadata +22 -12
- data/LICENSE.md +0 -116
- data/lib/artbase/image/24x24.rb +0 -68
- data/lib/artbase/image/32x32.rb +0 -43
- data/lib/artbase/image/60x60.rb +0 -70
- data/lib/artbase/image/80x80.rb +0 -90
- data/lib/artbase/opensea.rb +0 -144
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d2702ba1ca72c303474ee868074e5fc244d1a510d240cb7b533813b85f07bdd
|
4
|
+
data.tar.gz: 46591b009738fc8c45bd777b56b74dab8195f2fee6f967efa3a05b1c5efbe92b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a1a11ce316e7de3ec11b001262eb614b34cb0b53f9237357c60026fabddafd8b38839ba1ab77221f5062044aced9df44d082fe7146e68dc9dca4ee40dc5d1d0
|
7
|
+
data.tar.gz: 12dacbd59d727be09dbb626156a79e54dbc10a52ed13ed9b3963ee731dffcad45c08d23b812494780ff86bba51ea34fb3205258663759835ce94384229229b76
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
### 0.0.1 / 2018-10-18
|
2
|
-
|
3
|
-
* Everything is new. First release
|
1
|
+
### 0.0.1 / 2018-10-18
|
2
|
+
|
3
|
+
* Everything is new. First release
|
data/Manifest.txt
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
CHANGELOG.md
|
2
|
-
LICENSE.md
|
3
2
|
Manifest.txt
|
4
3
|
README.md
|
5
4
|
Rakefile
|
@@ -7,15 +6,13 @@ bin/artbase
|
|
7
6
|
lib/artbase.rb
|
8
7
|
lib/artbase/attributes.rb
|
9
8
|
lib/artbase/collection.rb
|
9
|
+
lib/artbase/collection/base.rb
|
10
10
|
lib/artbase/collection/image.rb
|
11
11
|
lib/artbase/collection/opensea.rb
|
12
12
|
lib/artbase/collection/token.rb
|
13
13
|
lib/artbase/helper.rb
|
14
14
|
lib/artbase/image.rb
|
15
|
-
lib/artbase/image/
|
16
|
-
lib/artbase/
|
17
|
-
lib/artbase/image/60x60.rb
|
18
|
-
lib/artbase/image/80x80.rb
|
19
|
-
lib/artbase/opensea.rb
|
15
|
+
lib/artbase/image/sample.rb
|
16
|
+
lib/artbase/retry.rb
|
20
17
|
lib/artbase/tool.rb
|
21
18
|
lib/artbase/version.rb
|
data/README.md
CHANGED
@@ -1,39 +1,274 @@
|
|
1
|
-
# artbase ("right-clicker") command line tool & scripts - download complete pixel art collections - yes, you can! - automate "right-click 'n' download" and much more
|
2
|
-
|
3
|
-
* home :: [github.com/pixelartexchange/artbase](https://github.com/pixelartexchange/artbase)
|
4
|
-
* bugs :: [github.com/pixelartexchange/artbase/issues](https://github.com/pixelartexchange/artbase/issues)
|
5
|
-
* gem :: [rubygems.org/gems/artbase](https://rubygems.org/gems/artbase)
|
6
|
-
* rdoc :: [rubydoc.info/gems/artbase](http://rubydoc.info/gems/artbase)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
## Usage
|
11
|
-
|
12
|
-
|
13
|
-
Note: The artbase is alpha - it's still the early days - it's a work-in-progress.
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
1
|
+
# artbase ("right-clicker") command line tool & scripts - download complete pixel art collections - yes, you can! - automate "right-click 'n' download" and much more
|
2
|
+
|
3
|
+
* home :: [github.com/pixelartexchange/artbase](https://github.com/pixelartexchange/artbase)
|
4
|
+
* bugs :: [github.com/pixelartexchange/artbase/issues](https://github.com/pixelartexchange/artbase/issues)
|
5
|
+
* gem :: [rubygems.org/gems/artbase](https://rubygems.org/gems/artbase)
|
6
|
+
* rdoc :: [rubydoc.info/gems/artbase](http://rubydoc.info/gems/artbase)
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
## Usage
|
11
|
+
|
12
|
+
|
13
|
+
Note: The artbase is alpha - it's still the early days - it's a work-in-progress.
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
Let's try the 100 Blocky Doge (60x60) collection.
|
19
|
+
|
20
|
+
|
21
|
+
### Step 0 - Collection Configuration Script
|
22
|
+
|
23
|
+
Create a directory with the collection slug (e.g. `blockydoge`)
|
24
|
+
matching the OpenSea collection slug
|
25
|
+
and add a config script - `blockydoge/config.rb`:
|
26
|
+
|
27
|
+
``` ruby
|
28
|
+
COLLECTION = Collection.new(
|
29
|
+
|
30
|
+
'blockydoge', # opensea collection slug
|
31
|
+
100, # number of items
|
32
|
+
|
33
|
+
format: '60x60', # original pixel format
|
34
|
+
source: '512x512', # "big" source pixel format for
|
35
|
+
# downloaded image referenced in meta data
|
36
|
+
|
37
|
+
#####
|
38
|
+
# "automagically" get the id from the meta data name field
|
39
|
+
# via a "one-off / custom / hand-written" regex
|
40
|
+
# e.g. Blocky Doge #1 => 1
|
41
|
+
meta_slugify: /^Blocky Doge #(?<num>[0-9]+)$/,
|
42
|
+
)
|
43
|
+
```
|
44
|
+
|
45
|
+
Sorry for the "magic" config format for now -
|
46
|
+
see the [**opensea.sandbox**](https://github.com/pixelartexchange/opensea.sandbox) for many more "real-world" examples.
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
That's it now you can:
|
53
|
+
|
54
|
+
- Download all meta data files via the OpenSea API
|
55
|
+
- Download all referenced images in the meta data file
|
56
|
+
- Pixelate all downloaded images from the source format (e.g. 512x512) to the original format (e.g. 60x60)
|
57
|
+
- Generate an all-in-one composite with the pixelated images
|
58
|
+
- Export all meta data attributes / traits to an all-in-one datafile in the comma-separated-values (.csv) format
|
59
|
+
|
60
|
+
|
61
|
+
### Download all meta data files via the OpenSea API
|
62
|
+
|
63
|
+
Let's try:
|
64
|
+
|
65
|
+
```
|
66
|
+
$ artbase blockydoge meta
|
67
|
+
```
|
68
|
+
|
69
|
+
Note: All meta data files get stored by convention in `blockydoge/meta`.
|
70
|
+
Resulting in a file tree like:
|
71
|
+
|
72
|
+
```
|
73
|
+
blockydoge/meta/
|
74
|
+
0.json
|
75
|
+
1.json
|
76
|
+
2.json
|
77
|
+
3.json
|
78
|
+
4.json
|
79
|
+
5.json
|
80
|
+
6.json
|
81
|
+
7.json
|
82
|
+
8.json
|
83
|
+
9.json
|
84
|
+
10.json
|
85
|
+
11.json
|
86
|
+
12.json
|
87
|
+
...
|
88
|
+
```
|
89
|
+
|
90
|
+
Example - `blockydoge/meta/0.json`:
|
91
|
+
|
92
|
+
``` json
|
93
|
+
{
|
94
|
+
"id": 52224520,
|
95
|
+
"token_id": "154226446513437...7290852067901441",
|
96
|
+
"num_sales": 1,
|
97
|
+
"image_url": "https://lh3.googleusercontent.com/fIQQ0A7...gTlbgMTQ",
|
98
|
+
"image_preview_url": "https://lh3.googleusercontent.com/fIQQ0A7...gTlbgMTQ=s250",
|
99
|
+
"image_thumbnail_url": "https://lh3.googleusercontent.com/fIQQ0A7...gTlbgMTQ=s128",
|
100
|
+
"image_original_url": null,
|
101
|
+
"name": "Blocky Doge #1",
|
102
|
+
"description": "Blocky Doge ... 100 unique pixelated Doge avatars...",
|
103
|
+
"external_link": null,
|
104
|
+
|
105
|
+
...
|
106
|
+
|
107
|
+
"traits": [
|
108
|
+
{ "trait_type": "Fur", "value": "Red Fur", ... },
|
109
|
+
{ "trait_type": "Hat", "value": "Pink Party Hat", ... },
|
110
|
+
{ "trait_type": "Expression", "value": "Smiley", ... },
|
111
|
+
],
|
112
|
+
|
113
|
+
...
|
114
|
+
}
|
115
|
+
```
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
### Download all referenced images in the meta data file
|
120
|
+
|
121
|
+
Let's try:
|
122
|
+
|
123
|
+
```
|
124
|
+
$ artbase blockydoge img
|
125
|
+
```
|
126
|
+
|
127
|
+
Note: All referenced images (in the source format e.g. 512x512)
|
128
|
+
get stored by convention in `blockydoge/i`.
|
129
|
+
Resulting in a file tree like:
|
130
|
+
|
131
|
+
```
|
132
|
+
blockydoge/i/
|
133
|
+
0.png
|
134
|
+
1.png
|
135
|
+
2.png
|
136
|
+
3.png
|
137
|
+
4.png
|
138
|
+
5.png
|
139
|
+
6.png
|
140
|
+
7.png
|
141
|
+
8.png
|
142
|
+
9.png
|
143
|
+
10.png
|
144
|
+
11.png
|
145
|
+
12.png
|
146
|
+
...
|
147
|
+
```
|
148
|
+
|
149
|
+
Example - `blockydoge/i/0.png` (512x512):
|
150
|
+
|
151
|
+

|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
|
156
|
+
|
157
|
+
### Pixelate all downloaded images from the source format (e.g. 512x512) to the original format (e.g. 60x60)
|
158
|
+
|
159
|
+
Let's try:
|
160
|
+
|
161
|
+
```
|
162
|
+
$ artbase blockydoge px
|
163
|
+
```
|
164
|
+
|
165
|
+
Note: All referenced images pixelated down to the orginal format (e.g. 60x60)
|
166
|
+
get stored by convention in `blockydoge/ii`.
|
167
|
+
Resulting in a tree like:
|
168
|
+
|
169
|
+
```
|
170
|
+
blockydoge/ii/
|
171
|
+
000001.png
|
172
|
+
000002.png
|
173
|
+
000003.png
|
174
|
+
000004.png
|
175
|
+
000005.png
|
176
|
+
000006.png
|
177
|
+
000007.png
|
178
|
+
000008.png
|
179
|
+
000009.png
|
180
|
+
000010.png
|
181
|
+
000011.png
|
182
|
+
000012.png
|
183
|
+
000013.png
|
184
|
+
...
|
185
|
+
```
|
186
|
+
|
187
|
+
|
188
|
+
Example - `blockydoge/ii/000001.png` to `000013.png` (60x60):
|
189
|
+
|
190
|
+

|
191
|
+

|
192
|
+

|
193
|
+

|
194
|
+

|
195
|
+

|
196
|
+

|
197
|
+

|
198
|
+

|
199
|
+

|
200
|
+

|
201
|
+

|
202
|
+

|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
### Generate an all-in-one composite with the pixelated images
|
208
|
+
|
209
|
+
Let's try:
|
210
|
+
|
211
|
+
```
|
212
|
+
$ artbase blockydoge composite
|
213
|
+
```
|
214
|
+
|
215
|
+
Note: The all-in-one composite image gets saved by convention to `blockydoge/tmp/blockydoge-60x60.png`. Example:
|
216
|
+
|
217
|
+

|
218
|
+
|
219
|
+
|
220
|
+
|
221
|
+
### Export all meta data attributes / traits to an all-in-one datafile in the comma-separated-values (.csv) format
|
222
|
+
|
223
|
+
|
224
|
+
Let's try:
|
225
|
+
|
226
|
+
```
|
227
|
+
$ artbase blockydoge export
|
228
|
+
```
|
229
|
+
|
230
|
+
Note: The all-in-one datafile gets saved by convention to `blockydoge/tmp/blockydoge.csv`.
|
231
|
+
Example:
|
232
|
+
|
233
|
+
|
234
|
+
```
|
235
|
+
ID, Name, Fur, Hat, Expression, Glasses, Accessories, Mask, Collar
|
236
|
+
0, Blocky Doge #1, Red Fur, Pink Party Hat, Smiley, , , ,
|
237
|
+
1, Blocky Doge #2, Black and Tan Fur, Orange Cap, Tongue Out, , , ,
|
238
|
+
2, Blocky Doge #3, , , Cream Fur, Teal Glasses, , ,
|
239
|
+
3, Blocky Doge #4, Meme Fur, , , Maroon Glasses, , ,
|
240
|
+
4, Blocky Doge #5, Black and Tan Fur, Blue Party Hat, , , , ,
|
241
|
+
5, Blocky Doge #6, Red Fur, Pink Cap, , , , ,
|
242
|
+
6, Blocky Doge #7, Red Fur, , , , None, ,
|
243
|
+
7, Blocky Doge #8, Meme Fur, White Cap, , , , ,
|
244
|
+
8, Blocky Doge #9, Cream Fur, , , Sunglasses, , ,
|
245
|
+
9, Blocky Doge #10, Meme Fur, , , , , Lavender Mask,
|
246
|
+
10, Blocky Doge #11, Black and Tan Fur, , , Black Glasses, , ,
|
247
|
+
11, Blocky Doge #12, Black and Tan Fur, , , , , Salmon Mask,
|
248
|
+
12, Blocky Doge #13, Cream Fur, Green Party Hat, , , , ,
|
249
|
+
...
|
250
|
+
```
|
251
|
+
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
That's it for now.
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
## Install
|
260
|
+
|
261
|
+
Just install the gem:
|
262
|
+
|
263
|
+
$ gem install artbase
|
264
|
+
|
265
|
+
|
266
|
+
## License
|
267
|
+
|
268
|
+
The `artbase` scripts are dedicated to the public domain.
|
269
|
+
Use it as you please with no restrictions whatsoever.
|
270
|
+
|
271
|
+
|
272
|
+
## Questions? Comments?
|
273
|
+
|
274
|
+
Post them on the [CryptoPunksDev reddit](https://old.reddit.com/r/CryptoPunksDev). Thanks.
|
data/Rakefile
CHANGED
@@ -1,29 +1,38 @@
|
|
1
|
-
require 'hoe'
|
2
|
-
require './lib/artbase/version.rb'
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
self.
|
15
|
-
|
16
|
-
|
17
|
-
self.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
self.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/artbase/version.rb'
|
3
|
+
|
4
|
+
|
5
|
+
###
|
6
|
+
# hack/ quick fix for broken intuit_values - overwrite with dummy
|
7
|
+
class Hoe
|
8
|
+
def intuit_values( input ); end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
Hoe.spec 'artbase' do
|
13
|
+
|
14
|
+
self.version = Artbase::VERSION
|
15
|
+
|
16
|
+
self.summary = "artbase"
|
17
|
+
self.description = summary
|
18
|
+
|
19
|
+
self.urls = { home: 'https://github.com/pixelartexchange/artbase'}
|
20
|
+
|
21
|
+
self.author = 'Gerald Bauer'
|
22
|
+
self.email = 'wwwmake@googlegroups.com'
|
23
|
+
|
24
|
+
# switch extension to .markdown for gihub formatting
|
25
|
+
self.readme_file = 'README.md'
|
26
|
+
self.history_file = 'CHANGELOG.md'
|
27
|
+
|
28
|
+
self.extra_deps = [
|
29
|
+
['webclient', '>= 0.2.2'],
|
30
|
+
]
|
31
|
+
|
32
|
+
self.licenses = ['Public Domain']
|
33
|
+
|
34
|
+
self.spec_extras = {
|
35
|
+
required_ruby_version: '>= 2.2.2'
|
36
|
+
}
|
37
|
+
|
38
|
+
end
|
data/bin/artbase
CHANGED
@@ -1,17 +1,17 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
###################
|
4
|
-
# == DEV TIPS:
|
5
|
-
#
|
6
|
-
# For local testing run like:
|
7
|
-
#
|
8
|
-
# ruby -Ilib bin/artbase
|
9
|
-
#
|
10
|
-
# Set the executable bit in Linux. Example:
|
11
|
-
#
|
12
|
-
# % chmod a+x bin/artbase
|
13
|
-
#
|
14
|
-
|
15
|
-
require 'artbase'
|
16
|
-
|
17
|
-
Artbase::Tool.main
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
###################
|
4
|
+
# == DEV TIPS:
|
5
|
+
#
|
6
|
+
# For local testing run like:
|
7
|
+
#
|
8
|
+
# ruby -Ilib bin/artbase
|
9
|
+
#
|
10
|
+
# Set the executable bit in Linux. Example:
|
11
|
+
#
|
12
|
+
# % chmod a+x bin/artbase
|
13
|
+
#
|
14
|
+
|
15
|
+
require 'artbase'
|
16
|
+
|
17
|
+
Artbase::Tool.main
|
data/lib/artbase/attributes.rb
CHANGED
@@ -1,83 +1,83 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
def counter_to_text( counter )
|
4
|
-
|
5
|
-
counter = counter.to_a
|
6
|
-
|
7
|
-
attribute_counter = counter[0]
|
8
|
-
more_counter = counter[1..-1]
|
9
|
-
|
10
|
-
|
11
|
-
puts "Attribute Counts\n"
|
12
|
-
trait_type, h = attribute_counter
|
13
|
-
|
14
|
-
total = h[:by_type].values.reduce(0) { |sum,count| sum+count }
|
15
|
-
|
16
|
-
|
17
|
-
types = h[:by_type]
|
18
|
-
types = types.sort { |l,r| l[0]<=>r[0] } ## sort by name
|
19
|
-
|
20
|
-
puts "\n"
|
21
|
-
puts "|Name|Total (%)|"
|
22
|
-
puts "|--------|----------:|"
|
23
|
-
|
24
|
-
types.each do |rec|
|
25
|
-
name = rec[0]
|
26
|
-
count = rec[1]
|
27
|
-
percent = Float(count*100)/Float(total)
|
28
|
-
|
29
|
-
puts "| **#{name} Attributes** | #{count} (#{'%.2f' % percent}) |"
|
30
|
-
end
|
31
|
-
puts "\n"
|
32
|
-
|
33
|
-
more_counter.each_with_index do |(trait_type, h),i|
|
34
|
-
print " · " if i > 0 ## add separator
|
35
|
-
print "#{trait_type } (#{h[:by_type].size})"
|
36
|
-
end
|
37
|
-
puts "\n\n"
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
more_counter.each do |trait_type, h|
|
42
|
-
print "### #{trait_type } (#{h[:by_type].size}) - "
|
43
|
-
print "∑Total #{h[:count]}/#{total}\n"
|
44
|
-
|
45
|
-
puts "\n"
|
46
|
-
puts "|Name|Total (%)|"
|
47
|
-
puts "|--------|----------:|"
|
48
|
-
|
49
|
-
types = h[:by_type]
|
50
|
-
types = types.sort do |l,r|
|
51
|
-
# sort by 1) by count
|
52
|
-
# 2) by name a-z
|
53
|
-
res = r[1] <=> l[1]
|
54
|
-
res = l[0] <=> r[0] if res == 0
|
55
|
-
res
|
56
|
-
end ## sort by count
|
57
|
-
types.each do |rec|
|
58
|
-
name = rec[0]
|
59
|
-
count = rec[1]
|
60
|
-
percent = Float(count*100)/Float(total)
|
61
|
-
|
62
|
-
puts "| **#{name}** | #{count} (#{'%.2f' % percent}) |"
|
63
|
-
end
|
64
|
-
puts "\n\n"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
def counter_to_csv( counter )
|
72
|
-
|
73
|
-
puts "type, name, count"
|
74
|
-
counter.each do |trait_type, h|
|
75
|
-
puts "#{trait_type}, ∑ Total, #{h[:count]}"
|
76
|
-
h[:by_type].each do |trait_value, count|
|
77
|
-
puts "#{trait_type}, #{trait_value}, #{count}"
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
|
83
|
-
|
1
|
+
|
2
|
+
|
3
|
+
def counter_to_text( counter )
|
4
|
+
|
5
|
+
counter = counter.to_a
|
6
|
+
|
7
|
+
attribute_counter = counter[0]
|
8
|
+
more_counter = counter[1..-1]
|
9
|
+
|
10
|
+
|
11
|
+
puts "Attribute Counts\n"
|
12
|
+
trait_type, h = attribute_counter
|
13
|
+
|
14
|
+
total = h[:by_type].values.reduce(0) { |sum,count| sum+count }
|
15
|
+
|
16
|
+
|
17
|
+
types = h[:by_type]
|
18
|
+
types = types.sort { |l,r| l[0]<=>r[0] } ## sort by name
|
19
|
+
|
20
|
+
puts "\n"
|
21
|
+
puts "|Name|Total (%)|"
|
22
|
+
puts "|--------|----------:|"
|
23
|
+
|
24
|
+
types.each do |rec|
|
25
|
+
name = rec[0]
|
26
|
+
count = rec[1]
|
27
|
+
percent = Float(count*100)/Float(total)
|
28
|
+
|
29
|
+
puts "| **#{name} Attributes** | #{count} (#{'%.2f' % percent}) |"
|
30
|
+
end
|
31
|
+
puts "\n"
|
32
|
+
|
33
|
+
more_counter.each_with_index do |(trait_type, h),i|
|
34
|
+
print " · " if i > 0 ## add separator
|
35
|
+
print "#{trait_type } (#{h[:by_type].size})"
|
36
|
+
end
|
37
|
+
puts "\n\n"
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
more_counter.each do |trait_type, h|
|
42
|
+
print "### #{trait_type } (#{h[:by_type].size}) - "
|
43
|
+
print "∑Total #{h[:count]}/#{total}\n"
|
44
|
+
|
45
|
+
puts "\n"
|
46
|
+
puts "|Name|Total (%)|"
|
47
|
+
puts "|--------|----------:|"
|
48
|
+
|
49
|
+
types = h[:by_type]
|
50
|
+
types = types.sort do |l,r|
|
51
|
+
# sort by 1) by count
|
52
|
+
# 2) by name a-z
|
53
|
+
res = r[1] <=> l[1]
|
54
|
+
res = l[0] <=> r[0] if res == 0
|
55
|
+
res
|
56
|
+
end ## sort by count
|
57
|
+
types.each do |rec|
|
58
|
+
name = rec[0]
|
59
|
+
count = rec[1]
|
60
|
+
percent = Float(count*100)/Float(total)
|
61
|
+
|
62
|
+
puts "| **#{name}** | #{count} (#{'%.2f' % percent}) |"
|
63
|
+
end
|
64
|
+
puts "\n\n"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
def counter_to_csv( counter )
|
72
|
+
|
73
|
+
puts "type, name, count"
|
74
|
+
counter.each do |trait_type, h|
|
75
|
+
puts "#{trait_type}, ∑ Total, #{h[:count]}"
|
76
|
+
h[:by_type].each do |trait_value, count|
|
77
|
+
puts "#{trait_type}, #{trait_value}, #{count}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|