cryptopunks 2.0.1 → 3.0.1

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.
@@ -1,67 +1,67 @@
1
-
2
-
3
- module Cryptopunks
4
- module Dataset
5
-
6
- def self.read( path='./datasets/punks/*.csv' )
7
-
8
- datasets = Dir.glob( path )
9
- #=> ["./datasets/punks/0-999.csv",
10
- # "./datasets/punks/1000-1999.csv",
11
- # "./datasets/punks/2000-2999.csv",
12
- # "./datasets/punks/3000-3999.csv",
13
- # "./datasets/punks/4000-4999.csv",
14
- # "./datasets/punks/5000-5999.csv",
15
- # "./datasets/punks/6000-6999.csv",
16
- # "./datasets/punks/7000-7999.csv",
17
- # "./datasets/punks/8000-8999.csv",
18
- # "./datasets/punks/9000-9999.csv"]
19
-
20
- rows = []
21
- datasets.each do |dataset|
22
- rows += CsvHash.read( dataset )
23
- end
24
-
25
- # puts " #{rows.size} rows(s)"
26
- #=> 10000 rows(s)
27
-
28
- ### wrap in punk struct for easier access
29
- punks = []
30
- rows.each do |row|
31
- id = row['id'].to_i
32
- type_q = row['type']
33
- count = row['count'].to_i
34
- accessories_q = row['accessories'].split( %r{[ ]*/[ ]*} )
35
-
36
- if count != accessories_q.size
37
- puts "!! ERROR - punk data assertion failed - expected accessories count #{count}; got #{accessories_q.size}"
38
- pp row
39
- exit 1
40
- end
41
-
42
- type = Metadata::Type.find( type_q )
43
- if type.nil?
44
- puts "!! ERROR - punk data assertion failed - unknown punk type >#{type_q}<"
45
- pp row
46
- exit 1
47
- end
48
-
49
- accessories = []
50
- accessories_q.each do |acc_q|
51
- acc = Metadata::Accessory.find( acc_q )
52
- if acc.nil?
53
- puts "!! ERROR - punk data assertion failed - unknown punk accessory type >#{acc_q}<"
54
- pp row
55
- exit 1
56
- end
57
- accessories << acc
58
- end
59
-
60
- punks << Metadata.new( id, type, accessories )
61
- end
62
- punks
63
- end
64
- end # module Dataset
65
- end # module Cryptopunks
66
-
67
-
1
+
2
+
3
+ module Punk
4
+ module Dataset
5
+
6
+ def self.read( path='./datasets/punks/*.csv' )
7
+
8
+ datasets = Dir.glob( path )
9
+ #=> ["./datasets/punks/0-999.csv",
10
+ # "./datasets/punks/1000-1999.csv",
11
+ # "./datasets/punks/2000-2999.csv",
12
+ # "./datasets/punks/3000-3999.csv",
13
+ # "./datasets/punks/4000-4999.csv",
14
+ # "./datasets/punks/5000-5999.csv",
15
+ # "./datasets/punks/6000-6999.csv",
16
+ # "./datasets/punks/7000-7999.csv",
17
+ # "./datasets/punks/8000-8999.csv",
18
+ # "./datasets/punks/9000-9999.csv"]
19
+
20
+ rows = []
21
+ datasets.each do |dataset|
22
+ rows += CsvHash.read( dataset )
23
+ end
24
+
25
+ # puts " #{rows.size} rows(s)"
26
+ #=> 10000 rows(s)
27
+
28
+ ### wrap in punk struct for easier access
29
+ punks = []
30
+ rows.each do |row|
31
+ id = row['id'].to_i
32
+ type_q = row['type']
33
+ count = row['count'].to_i
34
+ accessories_q = row['accessories'].split( %r{[ ]*/[ ]*} )
35
+
36
+ if count != accessories_q.size
37
+ puts "!! ERROR - punk data assertion failed - expected accessories count #{count}; got #{accessories_q.size}"
38
+ pp row
39
+ exit 1
40
+ end
41
+
42
+ type = Metadata::Type.find( type_q )
43
+ if type.nil?
44
+ puts "!! ERROR - punk data assertion failed - unknown punk type >#{type_q}<"
45
+ pp row
46
+ exit 1
47
+ end
48
+
49
+ accessories = []
50
+ accessories_q.each do |acc_q|
51
+ acc = Metadata::Accessory.find( acc_q )
52
+ if acc.nil?
53
+ puts "!! ERROR - punk data assertion failed - unknown punk accessory type >#{acc_q}<"
54
+ pp row
55
+ exit 1
56
+ end
57
+ accessories << acc
58
+ end
59
+
60
+ punks << Metadata.new( id, type, accessories )
61
+ end
62
+ punks
63
+ end
64
+ end # module Dataset
65
+ end # module Punk
66
+
67
+
@@ -1,33 +1,35 @@
1
- module Cryptopunks
2
-
3
-
4
-
5
- class Image
6
-
7
- def self.read( path ) ## convenience helper
8
- img = ChunkyPNG::Image.from_file( path )
9
- new( img )
10
- end
11
-
12
-
13
-
14
- ### keep design & colors keyword args in c'tor here
15
- ## or use parse() like in pixelart - why? why not?
16
-
17
- def initialize( initial=nil, design: nil,
18
- colors: nil )
19
- if initial
20
- ## pass image through as-is
21
- img = initial
22
- else
23
- ## note: unwrap inner image before passing on to super c'tor
24
- img = Pixelart::Image.parse( design, colors: colors ).image
25
- end
26
-
27
- super( img.width, img.height, img )
28
- end
29
-
30
-
31
-
32
- end # class Image
33
- end # module Cryptopunks
1
+ module Punk
2
+
3
+
4
+
5
+ class Image
6
+
7
+ def self.read( path ) ## convenience helper
8
+ img = ChunkyPNG::Image.from_file( path )
9
+ new( img )
10
+ end
11
+
12
+
13
+
14
+ =begin
15
+
16
+ ### keep design & colors keyword args in c'tor here
17
+ ## or use parse() like in pixelart - why? why not?
18
+
19
+ def initialize( initial=nil, design: nil,
20
+ colors: nil )
21
+ if initial
22
+ ## pass image through as-is
23
+ img = initial
24
+ else
25
+ ## note: unwrap inner image before passing on to super c'tor
26
+ img = Pixelart::Image.parse( design, colors: colors ).image
27
+ end
28
+
29
+ super( img.width, img.height, img )
30
+ end
31
+ =end
32
+
33
+
34
+ end # class Image
35
+ end # module Punk
@@ -1,161 +1,161 @@
1
-
2
- module Cryptopunks
3
- ### wrap metadata (e.g. punk types, accessories, etc.
4
- ## in structs for easy/easier access)
5
-
6
-
7
-
8
- class Metadata
9
-
10
- ## nested class
11
- class Type ## todo/check: use alias family or such?
12
- attr_reader :name,
13
- :limit
14
- def initialize( name, limit )
15
- @name = name
16
- @limit = limit
17
- end
18
- ## def to_s() @name; end
19
-
20
- def inspect
21
- %Q{<Type "#{@name}", limit: #{@limit}>}
22
- end
23
-
24
-
25
-
26
- def self.build
27
- TYPES.reduce( {} ) do |h, rec|
28
- type = Type.new( rec[:name], rec[:limit ] )
29
- h[ rec[:name].downcase ] = type
30
- h
31
- end
32
- end
33
-
34
- def self.registry
35
- ## auto-build registry (hash table) lookup (by name)
36
- @@types ||= build
37
- @@types
38
- end
39
-
40
- def self.all() registry.values; end
41
-
42
- def self.find( q ) registry[ q.to_s.downcase ]; end
43
- end ## (nested) class Type
44
-
45
-
46
-
47
- ## nested class
48
- class AccessoryType
49
- attr_reader :name,
50
- :accessories
51
- def initialize( name, accessories=[] )
52
- @name = name
53
- @accessories = accessories
54
- end
55
-
56
-
57
-
58
- def self.build
59
- ACCESSORY_TYPES.reduce( {} ) do |h, rec|
60
- type = AccessoryType.new( rec[:name] )
61
- ## add all accessories
62
- rec[:accessories].each do |rec_acc|
63
- type.accessories << Accessory.new( rec_acc[:name],
64
- type,
65
- rec_acc[:limit].to_i )
66
- end
67
- h[ rec[:name].downcase ] = type
68
- h
69
- end
70
- end
71
-
72
- def self.registry
73
- ## auto-build registry (hash table) lookup (by name)
74
- @@types ||= build
75
- @@types
76
- end
77
-
78
- def self.all() registry.values; end
79
-
80
- def self.find( q ) registry[ q.to_s.downcase ]; end
81
- end ## (nested) class AccessoryType
82
-
83
-
84
- ## nested class
85
- class Accessory
86
-
87
- attr_reader :name,
88
- :type,
89
- :limit
90
- def initialize( name, type, limit )
91
- @name = name
92
- @type = type
93
- @limit = limit
94
- end
95
-
96
-
97
- def inspect
98
- %Q{<Accessory "#{@name}", type: "#{@type.name}", limit: #{@limit}>}
99
- end
100
-
101
-
102
-
103
- def self.build
104
- AccessoryType.all.reduce( {} ) do |h, type|
105
- type.accessories.each do |acc|
106
- h[ acc.name.downcase ] = acc
107
- end
108
- h
109
- end
110
- end
111
-
112
- def self.registry
113
- ## auto-build registry (hash table) lookup (by name)
114
- @@types ||= build
115
- @@types
116
- end
117
-
118
- def self.all() registry.values; end
119
-
120
- def self.find( q ) registry[ q.to_s.downcase ]; end
121
- end ## (nested) class Accessory
122
-
123
-
124
-
125
-
126
-
127
-
128
- attr_reader :id,
129
- :type,
130
- :accessories,
131
- :birthday ## todo/check: use minted or such?
132
-
133
- def initialize( id, type, accessories )
134
- @id = id
135
- @type = type
136
- @accessories = accessories
137
- @birthday = Date.new( 2017, 6, 23) ## all 10,000 minted on June 23, 2017
138
- end
139
-
140
- def is_type?( name ) @type.name == name; end
141
- alias_method :is?, :is_type?
142
-
143
- ## convenience helpers for "classic" (5) types
144
- def alien?() is_type?( 'Alien'); end
145
- def ape?() is_type?( 'Ape' ); end
146
- def zombie?() is_type?( 'Zombie' ); end
147
- def female?() is_type?( 'Female' ); end
148
- def male?() is_type?( 'Male' ); end
149
-
150
- ## convenience helpers to lookup attributes
151
- def has_attribute?( name )
152
- accessories.each do |acc|
153
- return true if acc.name == name
154
- end
155
- false
156
- end
157
- alias_method :has?, :has_attribute?
158
- alias_method :include?, :has_attribute?
159
- end # class Metadata
160
-
161
- end # module Cryptopunks
1
+
2
+ module Punk
3
+ ### wrap metadata (e.g. punk types, accessories, etc.
4
+ ## in structs for easy/easier access)
5
+
6
+
7
+
8
+ class Metadata
9
+
10
+ ## nested class
11
+ class Type ## todo/check: use alias family or such?
12
+ attr_reader :name,
13
+ :limit
14
+ def initialize( name, limit )
15
+ @name = name
16
+ @limit = limit
17
+ end
18
+ ## def to_s() @name; end
19
+
20
+ def inspect
21
+ %Q{<Type "#{@name}", limit: #{@limit}>}
22
+ end
23
+
24
+
25
+
26
+ def self.build
27
+ TYPES.reduce( {} ) do |h, rec|
28
+ type = Type.new( rec[:name], rec[:limit ] )
29
+ h[ rec[:name].downcase ] = type
30
+ h
31
+ end
32
+ end
33
+
34
+ def self.registry
35
+ ## auto-build registry (hash table) lookup (by name)
36
+ @@types ||= build
37
+ @@types
38
+ end
39
+
40
+ def self.all() registry.values; end
41
+
42
+ def self.find( q ) registry[ q.to_s.downcase ]; end
43
+ end ## (nested) class Type
44
+
45
+
46
+
47
+ ## nested class
48
+ class AccessoryType
49
+ attr_reader :name,
50
+ :accessories
51
+ def initialize( name, accessories=[] )
52
+ @name = name
53
+ @accessories = accessories
54
+ end
55
+
56
+
57
+
58
+ def self.build
59
+ ACCESSORY_TYPES.reduce( {} ) do |h, rec|
60
+ type = AccessoryType.new( rec[:name] )
61
+ ## add all accessories
62
+ rec[:accessories].each do |rec_acc|
63
+ type.accessories << Accessory.new( rec_acc[:name],
64
+ type,
65
+ rec_acc[:limit].to_i )
66
+ end
67
+ h[ rec[:name].downcase ] = type
68
+ h
69
+ end
70
+ end
71
+
72
+ def self.registry
73
+ ## auto-build registry (hash table) lookup (by name)
74
+ @@types ||= build
75
+ @@types
76
+ end
77
+
78
+ def self.all() registry.values; end
79
+
80
+ def self.find( q ) registry[ q.to_s.downcase ]; end
81
+ end ## (nested) class AccessoryType
82
+
83
+
84
+ ## nested class
85
+ class Accessory
86
+
87
+ attr_reader :name,
88
+ :type,
89
+ :limit
90
+ def initialize( name, type, limit )
91
+ @name = name
92
+ @type = type
93
+ @limit = limit
94
+ end
95
+
96
+
97
+ def inspect
98
+ %Q{<Accessory "#{@name}", type: "#{@type.name}", limit: #{@limit}>}
99
+ end
100
+
101
+
102
+
103
+ def self.build
104
+ AccessoryType.all.reduce( {} ) do |h, type|
105
+ type.accessories.each do |acc|
106
+ h[ acc.name.downcase ] = acc
107
+ end
108
+ h
109
+ end
110
+ end
111
+
112
+ def self.registry
113
+ ## auto-build registry (hash table) lookup (by name)
114
+ @@types ||= build
115
+ @@types
116
+ end
117
+
118
+ def self.all() registry.values; end
119
+
120
+ def self.find( q ) registry[ q.to_s.downcase ]; end
121
+ end ## (nested) class Accessory
122
+
123
+
124
+
125
+
126
+
127
+
128
+ attr_reader :id,
129
+ :type,
130
+ :accessories,
131
+ :birthday ## todo/check: use minted or such?
132
+
133
+ def initialize( id, type, accessories )
134
+ @id = id
135
+ @type = type
136
+ @accessories = accessories
137
+ @birthday = Date.new( 2017, 6, 23) ## all 10,000 minted on June 23, 2017
138
+ end
139
+
140
+ def is_type?( name ) @type.name == name; end
141
+ alias_method :is?, :is_type?
142
+
143
+ ## convenience helpers for "classic" (5) types
144
+ def alien?() is_type?( 'Alien'); end
145
+ def ape?() is_type?( 'Ape' ); end
146
+ def zombie?() is_type?( 'Zombie' ); end
147
+ def female?() is_type?( 'Female' ); end
148
+ def male?() is_type?( 'Male' ); end
149
+
150
+ ## convenience helpers to lookup attributes
151
+ def has_attribute?( name )
152
+ accessories.each do |acc|
153
+ return true if acc.name == name
154
+ end
155
+ false
156
+ end
157
+ alias_method :has?, :has_attribute?
158
+ alias_method :include?, :has_attribute?
159
+ end # class Metadata
160
+
161
+ end # module Punk