cryptopunks 1.3.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +4 -0
- data/Rakefile +1 -0
- data/lib/cryptopunks/contract/punksdata-assets.rb +338 -0
- data/lib/cryptopunks/contract/punksdata-contract.rb +55 -0
- data/lib/cryptopunks/contract/punksdata-meta.rb +2107 -0
- data/lib/cryptopunks/generator.rb +3 -0
- data/lib/cryptopunks/tool.rb +264 -0
- data/lib/cryptopunks/version.rb +2 -2
- data/lib/cryptopunks.rb +13 -78
- metadata +20 -2
@@ -0,0 +1,264 @@
|
|
1
|
+
module Cryptopunks
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
class Tool
|
6
|
+
def run( args )
|
7
|
+
Toolii.run( args )
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
class Opts
|
14
|
+
def merge_gli_options!( options = {} )
|
15
|
+
# puts " update options:"
|
16
|
+
# puts options.inspect
|
17
|
+
|
18
|
+
@file = options[:file] if options[:file]
|
19
|
+
@outdir = options[:dir] if options[:dir]
|
20
|
+
|
21
|
+
@zoom = options[:zoom] if options[:zoom]
|
22
|
+
@offset = options[:offset] if options[:offset]
|
23
|
+
|
24
|
+
@verbose = true if options[:verbose] == true
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def verbose=(boolean) # add: alias for debug ??
|
29
|
+
@verbose = boolean
|
30
|
+
end
|
31
|
+
|
32
|
+
def verbose?
|
33
|
+
return false if @verbose.nil? # default verbose/debug flag is false
|
34
|
+
@verbose == true
|
35
|
+
end
|
36
|
+
|
37
|
+
def file() @file || './punks.png'; end
|
38
|
+
def file?() @file; end ## note: let's you check if file is set (or "untouched")
|
39
|
+
|
40
|
+
def zoom() @zoom || 1; end
|
41
|
+
def zoom?() @zoom; end
|
42
|
+
|
43
|
+
def offset() @offset || 0; end
|
44
|
+
def offset?() @offset; end
|
45
|
+
|
46
|
+
def outdir() @outdir || '.'; end
|
47
|
+
def outdir?() @outdir; end
|
48
|
+
end # class Opts
|
49
|
+
|
50
|
+
|
51
|
+
|
52
|
+
## note: use gli "dsl" inside a class / namespace
|
53
|
+
class Toolii
|
54
|
+
extend GLI::App
|
55
|
+
|
56
|
+
opts = Opts.new
|
57
|
+
|
58
|
+
|
59
|
+
program_desc 'punk (or cryptopunk) command line tool'
|
60
|
+
|
61
|
+
version Cryptopunks::VERSION
|
62
|
+
|
63
|
+
|
64
|
+
desc "Zoom factor x2, x4, x8, etc."
|
65
|
+
arg_name 'ZOOM'
|
66
|
+
default_value opts.zoom
|
67
|
+
flag [:z, :zoom], type: Integer
|
68
|
+
|
69
|
+
desc "Start counting at offset"
|
70
|
+
arg_name 'NUM'
|
71
|
+
default_value opts.offset
|
72
|
+
flag [:offset], type: Integer
|
73
|
+
|
74
|
+
desc "Output directory"
|
75
|
+
arg_name 'DIR'
|
76
|
+
default_value opts.outdir
|
77
|
+
flag [:d, :dir,
|
78
|
+
:o, :out, :outdir], type: String
|
79
|
+
|
80
|
+
### todo/check: move option to -t/--tile command only - why? why not?
|
81
|
+
desc "True Official Genuine CryptoPunks™ all-in-one composite image"
|
82
|
+
arg_name 'FILE'
|
83
|
+
default_value opts.file
|
84
|
+
flag [:f, :file], type: String
|
85
|
+
|
86
|
+
|
87
|
+
|
88
|
+
### global option (required)
|
89
|
+
## todo: add check that path is valid?? possible?
|
90
|
+
desc '(Debug) Show debug messages'
|
91
|
+
switch [:verbose], negatable: false ## todo: use -w for short form? check ruby interpreter if in use too?
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
desc "Get punk characters via image tiles from all-in-one punk series composite (#{opts.file}) - for IDs use 0 to 9999"
|
96
|
+
command [:t, :tile] do |c|
|
97
|
+
c.action do |g,o,args|
|
98
|
+
|
99
|
+
# puts "opts:"
|
100
|
+
# puts opts.inspect
|
101
|
+
|
102
|
+
puts "==> reading >#{opts.file}<..."
|
103
|
+
punks = ImageComposite.read( opts.file )
|
104
|
+
|
105
|
+
|
106
|
+
puts " setting zoom to #{opts.zoom}x" if opts.zoom != 1
|
107
|
+
|
108
|
+
## make sure outdir exits (default is current working dir e.g. .)
|
109
|
+
FileUtils.mkdir_p( opts.outdir ) unless Dir.exist?( opts.outdir )
|
110
|
+
|
111
|
+
args.each_with_index do |arg,index|
|
112
|
+
punk_index = arg.to_i( 10 ) ## assume base 10 decimal
|
113
|
+
|
114
|
+
punk = punks[ punk_index ]
|
115
|
+
|
116
|
+
punk_name = "punk-" + "%04d" % (punk_index + opts.offset)
|
117
|
+
|
118
|
+
## if zoom - add x2,x4 or such
|
119
|
+
if opts.zoom != 1
|
120
|
+
punk = punk.zoom( opts.zoom )
|
121
|
+
punk_name << "@#{opts.zoom}x"
|
122
|
+
end
|
123
|
+
|
124
|
+
path = "#{opts.outdir}/#{punk_name}.png"
|
125
|
+
puts "==> (#{index+1}/#{args.size}) saving punk ##{punk_index+opts.offset} to >#{path}<..."
|
126
|
+
|
127
|
+
punk.save( path )
|
128
|
+
end
|
129
|
+
puts 'Done.'
|
130
|
+
end # action
|
131
|
+
end # command tile
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
desc 'Generate punk characters from text attributes (from scratch / zero) via builtin punk spritesheet'
|
136
|
+
command [:g, :gen, :generate] do |c|
|
137
|
+
c.action do |g,o,args|
|
138
|
+
|
139
|
+
puts "==> generating >#{args.join( ' + ' )}<..."
|
140
|
+
punk = Image.generate( *args )
|
141
|
+
|
142
|
+
puts " setting zoom to #{opts.zoom}x" if opts.zoom != 1
|
143
|
+
|
144
|
+
## make sure outdir exits (default is current working dir e.g. .)
|
145
|
+
FileUtils.mkdir_p( opts.outdir ) unless Dir.exist?( opts.outdir )
|
146
|
+
|
147
|
+
punk_index = 0 ## assume base 10 decimal
|
148
|
+
punk_name = "punk-" + "%04d" % (punk_index + opts.offset)
|
149
|
+
|
150
|
+
## if zoom - add x2,x4 or such
|
151
|
+
if opts.zoom != 1
|
152
|
+
punk = punk.zoom( opts.zoom )
|
153
|
+
punk_name << "@#{opts.zoom}x"
|
154
|
+
end
|
155
|
+
|
156
|
+
path = "#{opts.outdir}/#{punk_name}.png"
|
157
|
+
puts "==> saving punk ##{punk_index+opts.offset} to >#{path}<..."
|
158
|
+
|
159
|
+
punk.save( path )
|
160
|
+
puts 'Done.'
|
161
|
+
end # action
|
162
|
+
end # command generate
|
163
|
+
|
164
|
+
|
165
|
+
desc 'Query (builtin off-chain) punk contract for punk text attributes by IDs - use 0 to 9999'
|
166
|
+
command [:q, :query] do |c|
|
167
|
+
c.action do |g,o,args|
|
168
|
+
|
169
|
+
# puts "opts:"
|
170
|
+
# puts opts.inspect
|
171
|
+
|
172
|
+
args.each_with_index do |arg,index|
|
173
|
+
punk_index = arg.to_i( 10 ) ## assume base 10 decimal
|
174
|
+
|
175
|
+
puts "==> (#{index+1}/#{args.size}) punk ##{punk_index}..."
|
176
|
+
|
177
|
+
attribute_names = CryptopunksData.punk_attributes( punk_index )
|
178
|
+
## downcase name and change spaces to underscore
|
179
|
+
attribute_names = attribute_names.map do |name|
|
180
|
+
name.downcase.gsub( ' ', '_' )
|
181
|
+
end
|
182
|
+
|
183
|
+
print " "
|
184
|
+
print attribute_names.join( ' ' )
|
185
|
+
print "\n"
|
186
|
+
end
|
187
|
+
puts 'Done.'
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
desc 'List all punk archetype and attribute names from builtin punk spritesheet'
|
194
|
+
command [:l, :ls, :list] do |c|
|
195
|
+
c.action do |g,o,args|
|
196
|
+
|
197
|
+
generator = Cryptopunks.generator
|
198
|
+
|
199
|
+
puts "==> Archetypes"
|
200
|
+
generator.meta.each do |rec|
|
201
|
+
next unless rec.archetype?
|
202
|
+
|
203
|
+
print " "
|
204
|
+
print "%-30s" % "#{rec.name} / (#{rec.gender})"
|
205
|
+
print " - #{rec.type}"
|
206
|
+
print "\n"
|
207
|
+
end
|
208
|
+
|
209
|
+
puts ""
|
210
|
+
puts "==> Attributes"
|
211
|
+
generator.meta.each do |rec|
|
212
|
+
next unless rec.attribute?
|
213
|
+
|
214
|
+
print " "
|
215
|
+
print "%-30s" % "#{rec.name} / (#{rec.gender})"
|
216
|
+
print " - #{rec.type}"
|
217
|
+
print "\n"
|
218
|
+
end
|
219
|
+
|
220
|
+
puts ""
|
221
|
+
puts " See github.com/cryptopunksnotdead/punks.spritesheet for more."
|
222
|
+
puts ""
|
223
|
+
|
224
|
+
puts 'Done.'
|
225
|
+
end # action
|
226
|
+
end # command list
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
pre do |g,c,o,args|
|
231
|
+
opts.merge_gli_options!( g )
|
232
|
+
opts.merge_gli_options!( o )
|
233
|
+
|
234
|
+
if opts.verbose?
|
235
|
+
## LogUtils::Logger.root.level = :debug
|
236
|
+
end
|
237
|
+
|
238
|
+
## logger.debug "Executing #{c.name}"
|
239
|
+
true
|
240
|
+
end
|
241
|
+
|
242
|
+
post do |global,c,o,args|
|
243
|
+
## logger.debug "Executed #{c.name}"
|
244
|
+
true
|
245
|
+
end
|
246
|
+
|
247
|
+
|
248
|
+
on_error do |e|
|
249
|
+
puts
|
250
|
+
puts "*** error: #{e.message}"
|
251
|
+
|
252
|
+
if opts.verbose?
|
253
|
+
puts e.backtrace
|
254
|
+
end
|
255
|
+
|
256
|
+
false # skip default error handling
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
### exit run(ARGV) ## note: use Toolii.run( ARGV ) outside of class
|
261
|
+
end # class Toolii
|
262
|
+
end # module Cryptopunks
|
263
|
+
|
264
|
+
|
data/lib/cryptopunks/version.rb
CHANGED
data/lib/cryptopunks.rb
CHANGED
@@ -7,6 +7,7 @@ require 'csvreader'
|
|
7
7
|
## extra stdlibs
|
8
8
|
require 'digest' ## move/add to pixelart upstream - why? why not?
|
9
9
|
require 'optparse'
|
10
|
+
require 'gli' ## used for command line tool
|
10
11
|
|
11
12
|
|
12
13
|
|
@@ -71,100 +72,34 @@ end # module Cryptopunks
|
|
71
72
|
|
72
73
|
|
73
74
|
|
75
|
+
####
|
76
|
+
# add CryptoPunksData (off-chain) contract
|
77
|
+
require 'cryptopunks/contract/punksdata-assets'
|
78
|
+
require 'cryptopunks/contract/punksdata-meta'
|
79
|
+
require 'cryptopunks/contract/punksdata-contract'
|
80
|
+
CryptoPunksData = CryptopunksData
|
81
|
+
PunksData = CryptopunksData
|
74
82
|
|
75
83
|
|
76
84
|
|
77
|
-
module Cryptopunks
|
78
|
-
class Tool
|
79
|
-
def run( args )
|
80
|
-
opts = { zoom: 1,
|
81
|
-
outdir: '.',
|
82
|
-
file: './punks.png',
|
83
|
-
offset: 0,
|
84
|
-
}
|
85
|
-
|
86
|
-
parser = OptionParser.new do |cmd|
|
87
|
-
cmd.banner = "Usage: punk (or cryptopunk) [options] IDs"
|
88
|
-
|
89
|
-
cmd.separator " Mint punk characters from composite (#{opts[:file]}) - for IDs use 0 to 9999"
|
90
|
-
cmd.separator ""
|
91
|
-
cmd.separator " Options:"
|
92
|
-
|
93
|
-
cmd.on("-z", "--zoom=ZOOM", "Zoom factor x2, x4, x8, etc. (default: #{opts[:zoom]})", Integer ) do |zoom|
|
94
|
-
opts[:zoom] = zoom
|
95
|
-
end
|
96
|
-
|
97
|
-
cmd.on("-d", "--dir=DIR", "Output directory (default: #{opts[:outdir]})", String ) do |outdir|
|
98
|
-
opts[:outdir] = outdir
|
99
|
-
end
|
100
|
-
|
101
|
-
cmd.on("-f", "--file=FILE", "True Official Genuine CryptoPunks™ composite image (default: #{opts[:file]})", String ) do |file|
|
102
|
-
opts[:file] = file
|
103
|
-
end
|
104
|
-
|
105
|
-
cmd.on("--offset=NUM", "Start counting at offset (default: #{opts[:offset]})", Integer ) do |offset|
|
106
|
-
opts[:offset] = offset
|
107
|
-
end
|
108
|
-
|
109
|
-
cmd.on("-h", "--help", "Prints this help") do
|
110
|
-
puts cmd
|
111
|
-
exit
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
parser.parse!( args )
|
116
|
-
|
117
|
-
puts "opts:"
|
118
|
-
pp opts
|
119
|
-
|
120
|
-
puts "==> reading >#{opts[:file]}<..."
|
121
|
-
punks = ImageComposite.read( opts[:file] )
|
122
|
-
|
123
|
-
|
124
|
-
puts " setting zoom to #{opts[:zoom]}x" if opts[:zoom] != 1
|
125
|
-
|
126
|
-
## make sure outdir exits (default is current working dir e.g. .)
|
127
|
-
FileUtils.mkdir_p( opts[:outdir] ) unless Dir.exist?( opts[:outdir] )
|
128
|
-
|
129
|
-
args.each_with_index do |arg,index|
|
130
|
-
punk_index = arg.to_i
|
131
|
-
|
132
|
-
punk = punks[ punk_index ]
|
133
85
|
|
134
|
-
punk_name = "punk-" + "%04d" % (punk_index + opts[:offset])
|
135
86
|
|
136
|
-
|
137
|
-
if opts[:zoom] != 1
|
138
|
-
punk = punk.zoom( opts[:zoom] )
|
139
|
-
punk_name << "x#{opts[:zoom]}"
|
140
|
-
end
|
87
|
+
require 'cryptopunks/tool'
|
141
88
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
punk.save( path )
|
146
|
-
end
|
147
|
-
|
148
|
-
puts "done"
|
149
|
-
end ## method run
|
150
|
-
end # class Tool
|
151
|
-
|
152
|
-
|
153
|
-
def self.main( args=ARGV )
|
154
|
-
Tool.new.run( args )
|
155
|
-
end
|
89
|
+
### add tool convenience helper
|
90
|
+
module Cryptopunks
|
91
|
+
def self.main( args=ARGV ) Tool.new.run( args ); end
|
156
92
|
end ## module Cryptopunks
|
157
93
|
|
158
94
|
|
159
95
|
|
160
96
|
|
97
|
+
|
161
98
|
### add some convenience shortcuts
|
162
99
|
CryptoPunks = Cryptopunks
|
163
100
|
Punks = Cryptopunks
|
164
101
|
|
165
102
|
|
166
|
-
|
167
|
-
|
168
103
|
###
|
169
104
|
# note: for convenience auto include Pixelart namespace!!! - why? why not?
|
170
105
|
include Pixelart
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cryptopunks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-10-
|
11
|
+
date: 2021-10-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pixelart
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: gli
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rdoc
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -97,10 +111,14 @@ files:
|
|
97
111
|
- lib/cryptopunks/attributes.rb
|
98
112
|
- lib/cryptopunks/colors.rb
|
99
113
|
- lib/cryptopunks/composite.rb
|
114
|
+
- lib/cryptopunks/contract/punksdata-assets.rb
|
115
|
+
- lib/cryptopunks/contract/punksdata-contract.rb
|
116
|
+
- lib/cryptopunks/contract/punksdata-meta.rb
|
100
117
|
- lib/cryptopunks/dataset.rb
|
101
118
|
- lib/cryptopunks/generator.rb
|
102
119
|
- lib/cryptopunks/image.rb
|
103
120
|
- lib/cryptopunks/structs.rb
|
121
|
+
- lib/cryptopunks/tool.rb
|
104
122
|
- lib/cryptopunks/version.rb
|
105
123
|
homepage: https://github.com/cryptopunksnotdead/cryptopunks
|
106
124
|
licenses:
|