drakkon 0.0.3

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.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +50 -0
  3. data/bin/drakkon +16 -0
  4. data/lib/drakkon/build.rb +126 -0
  5. data/lib/drakkon/cli.rb +64 -0
  6. data/lib/drakkon/gem/bundle.rb +116 -0
  7. data/lib/drakkon/gem/cli.rb +46 -0
  8. data/lib/drakkon/gem/configure.rb +73 -0
  9. data/lib/drakkon/gem/gem.rb +56 -0
  10. data/lib/drakkon/gem/helpers/check.rb +110 -0
  11. data/lib/drakkon/gem/helpers/files.rb +57 -0
  12. data/lib/drakkon/gem/helpers/general.rb +21 -0
  13. data/lib/drakkon/gem/helpers/modules.rb +51 -0
  14. data/lib/drakkon/gem/helpers/source.rb +43 -0
  15. data/lib/drakkon/gem/install.rb +24 -0
  16. data/lib/drakkon/init.rb +85 -0
  17. data/lib/drakkon/lib/hub.rb +112 -0
  18. data/lib/drakkon/lib/images/biggest.rb +43 -0
  19. data/lib/drakkon/lib/images/blur.rb +76 -0
  20. data/lib/drakkon/lib/images/bulk_rename.rb +86 -0
  21. data/lib/drakkon/lib/images/canvas.rb +74 -0
  22. data/lib/drakkon/lib/images/cli.rb +78 -0
  23. data/lib/drakkon/lib/images/desaturate.rb +58 -0
  24. data/lib/drakkon/lib/images/flip_flop.rb +76 -0
  25. data/lib/drakkon/lib/images/gif.rb +61 -0
  26. data/lib/drakkon/lib/images/index.rb +185 -0
  27. data/lib/drakkon/lib/images/list.rb +56 -0
  28. data/lib/drakkon/lib/images/modulate.rb +69 -0
  29. data/lib/drakkon/lib/images/resize.rb +83 -0
  30. data/lib/drakkon/lib/images/roll.rb +68 -0
  31. data/lib/drakkon/lib/images/rotate.rb +60 -0
  32. data/lib/drakkon/lib/images/scale.rb +86 -0
  33. data/lib/drakkon/lib/images/sepia.rb +64 -0
  34. data/lib/drakkon/lib/images/shift.rb +89 -0
  35. data/lib/drakkon/lib/images/split.rb +93 -0
  36. data/lib/drakkon/lib/images/spritesheet.rb +85 -0
  37. data/lib/drakkon/lib/images/trim.rb +56 -0
  38. data/lib/drakkon/lib/images/white.rb +56 -0
  39. data/lib/drakkon/lib/logbot.rb +86 -0
  40. data/lib/drakkon/lib/manifest.rb +74 -0
  41. data/lib/drakkon/lib/pastel.rb +49 -0
  42. data/lib/drakkon/lib/settings.rb +130 -0
  43. data/lib/drakkon/lib/shims.rb +8 -0
  44. data/lib/drakkon/lib/version.rb +79 -0
  45. data/lib/drakkon/release.rb +3 -0
  46. data/lib/drakkon/run/commands/images.rb +14 -0
  47. data/lib/drakkon/run/commands/log.rb +57 -0
  48. data/lib/drakkon/run/commands/restart.rb +14 -0
  49. data/lib/drakkon/run/helpers.rb +60 -0
  50. data/lib/drakkon/run/reader_shim.rb +110 -0
  51. data/lib/drakkon/run/tty.rb +119 -0
  52. data/lib/drakkon/run.rb +80 -0
  53. data/lib/drakkon/setup.rb +31 -0
  54. data/lib/drakkon/skeleton/cli.rb +46 -0
  55. data/lib/drakkon/skeleton/deploy.rb +105 -0
  56. data/lib/drakkon/skeleton/helpers/check.rb +143 -0
  57. data/lib/drakkon/skeleton/helpers/general.rb +21 -0
  58. data/lib/drakkon/skeleton/helpers/source.rb +43 -0
  59. data/lib/drakkon/skeleton/install.rb +31 -0
  60. data/lib/drakkon/skeleton/template.rb +14 -0
  61. data/lib/drakkon/web.rb +68 -0
  62. data/lib/drakkon.rb +43 -0
  63. metadata +302 -0
@@ -0,0 +1,78 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Entry Point For Images Subcommand
4
+ module CLI
5
+ def self.run!(args = [])
6
+ args ||= []
7
+ cmd = if args.empty?
8
+ nil
9
+ else
10
+ args.shift.to_sym
11
+ end
12
+ start(cmd, args)
13
+ end
14
+
15
+ # rubocop:disable Metrics/CyclomaticComplexity
16
+ def self.start(cmd, args)
17
+ case cmd
18
+ when :list then Images::List.run!(args)
19
+ when :biggest then Images::Biggest.run!(args)
20
+ when :white then Images::White.run!(args)
21
+ when :resize then Images::Resize.run!(args)
22
+ when :shift then Images::Shift.run!(args)
23
+ when :roll then Images::Roll.run!(args)
24
+ when :scale then Images::Scale.run!(args)
25
+ when :flip_flop then Images::FlipFlop.run!(args)
26
+ when :rotate then Images::Rotate.run!(args)
27
+ when :canvas then Images::Canvas.run!(args)
28
+ when :blur then Images::Blur.run!(args)
29
+ when :split then Images::SplitSpriteSheet.run!(args)
30
+ when :combine then Images::SpriteSheetCombine.run!(args)
31
+ when :trim then Images::Trim.run!(args)
32
+ when :gif_split then Images::GifSplit.run!(args)
33
+ when :sepia then Images::Sepia.run!(args)
34
+ when :modulate then Images::Modulate.run!(args)
35
+ when :bulk_rename then Images::BulkRename.run!(args)
36
+ when :index then Images::Index.run!(force: true)
37
+ when :exit then exit(0)
38
+ else
39
+ start(menu, args)
40
+ end
41
+ end
42
+ # rubocop:enable Metrics/CyclomaticComplexity
43
+
44
+ def self.menu
45
+ prompt.select('Image Helpers:', filter: true, per_page: 20) do |menu|
46
+ menu.choice name: 'Listing; Filter', value: :list
47
+ menu.choice name: 'Biggest: Find largest dimensions', value: :biggest
48
+ menu.choice name: 'Convert alpha to white', value: :white
49
+ menu.choice name: 'Resize WxH', value: :resize
50
+ menu.choice name: 'Scale', value: :scale
51
+ menu.choice name: 'Shift (Splice/Gravity)', value: :shift
52
+ menu.choice name: 'Roll', value: :roll
53
+ menu.choice name: 'Flip/Flop', value: :flip_flop
54
+ menu.choice name: 'Rotate', value: :rotate
55
+ menu.choice name: 'Canvas (Change/Retain)', value: :canvas
56
+ menu.choice name: 'Desaturate (Grey Colorspace)', value: :desaturate
57
+ menu.choice name: 'Blur', value: :blur
58
+ menu.choice name: 'Split SpriteSheet (split)', value: :split
59
+ menu.choice name: 'Create SpriteSheet (combine)', value: :combine
60
+ menu.choice name: 'Trim Transparency (trim)', value: :trim
61
+ menu.choice name: 'Gif Split (gif_split)', value: :gif_split
62
+ menu.choice name: 'Sepia', value: :sepia
63
+ menu.choice name: 'Modulate', value: :modulate
64
+ menu.choice name: 'Index (Re-run Index)', value: :index
65
+ menu.choice name: 'exit', value: :exit
66
+ end
67
+ rescue TTY::Reader::InputInterrupt
68
+ exit 0
69
+ end
70
+
71
+ def self.prompt
72
+ TTY::Prompt.new(active_color: :cyan)
73
+ end
74
+ # =========================================================
75
+ end
76
+ # =========================================================
77
+ end
78
+ end
@@ -0,0 +1,58 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Desaturate
5
+ def self.run!(_args = [])
6
+ puts <<~HELP
7
+ Usage [WxH] [gravity]
8
+ - Run in the directory you wish to modify the images
9
+ - Adjust images via MiniMagick (extent)
10
+
11
+ Desaturate:
12
+ Current Directory;
13
+ #{Dir.pwd.pastel(:yellow)}
14
+
15
+ Images:
16
+ HELP
17
+
18
+ images.sort.each do |img|
19
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
20
+ puts " - #{img_s}"
21
+ end
22
+ puts
23
+
24
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Desaturate!? #{'(Destructive)'.pastel(:red)}"
25
+
26
+ start
27
+ end
28
+
29
+ def self.start
30
+ images.each do |img|
31
+ LogBot.info('Image Shift', img)
32
+ process(img)
33
+ end
34
+ end
35
+
36
+ def self.process(file)
37
+ image = MiniMagick::Image.open(file)
38
+ LogBot.info('Image Desaturate', file)
39
+
40
+ img = image.combine_options do |cmd|
41
+ cmd.colorspace 'Gray'
42
+ end
43
+
44
+ img.write file
45
+ end
46
+
47
+ def self.images
48
+ Dir["#{Dir.pwd}/**/*.png"]
49
+ end
50
+
51
+ def self.prompt
52
+ TTY::Prompt.new(active_color: :cyan)
53
+ end
54
+ # =========================================================
55
+ end
56
+ # =========================================================
57
+ end
58
+ end
@@ -0,0 +1,76 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module FlipFlop
5
+ def self.run!(args = [])
6
+ # X
7
+ horizontal = if args.empty?
8
+ prompt.yes?('Flip Horizontally?')
9
+ else
10
+ v = args.shift.downcase
11
+ %w[yes y].include?(v)
12
+ end
13
+
14
+ # Y
15
+ vertical = if args.empty?
16
+ prompt.yes?('Flip Vertically?')
17
+ else
18
+ v = args.shift.downcase
19
+ %w[yes y].include?(v)
20
+ end
21
+
22
+ puts <<~HELP
23
+ Usage [horizontal] [vertical]
24
+ - Run in the directory you wish to modify the images
25
+ - Flip/Flop the images via MiniMagick
26
+ - y / yes / Y / Yes for affirmative args
27
+
28
+
29
+
30
+
31
+ Horizontal: #{horizontal}
32
+ Vertical: #{vertical}
33
+ Current Directory;
34
+ #{Dir.pwd.pastel(:yellow)}
35
+
36
+ Images:
37
+ HELP
38
+
39
+ images.sort.each do |img|
40
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
41
+ puts " - #{img_s}"
42
+ end
43
+ puts
44
+
45
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Flip/Flop!? #{'(Destructive)'.pastel(:red)}"
46
+
47
+ start(horizontal, vertical)
48
+ end
49
+
50
+ def self.start(horizontal, vertical)
51
+ images.each do |img|
52
+ LogBot.info('Image Flip Flop', img)
53
+ process(img, horizontal, vertical)
54
+ end
55
+ end
56
+
57
+ def self.process(file, horizontal, vertical)
58
+ image = MiniMagick::Image.open(file)
59
+
60
+ image.flip if vertical
61
+ image.flop if horizontal
62
+ image.write file
63
+ end
64
+
65
+ def self.images
66
+ Dir["#{Dir.pwd}/**/*.png"]
67
+ end
68
+
69
+ def self.prompt
70
+ TTY::Prompt.new(active_color: :cyan)
71
+ end
72
+ # =========================================================
73
+ end
74
+ # =========================================================
75
+ end
76
+ end
@@ -0,0 +1,61 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module GifSplit
5
+ def self.run!(args = [])
6
+ image = if args.empty?
7
+ prompt.select('What gif to split?', images, filter: true)
8
+ else
9
+ args.first
10
+ end
11
+
12
+ png_image = "#{Dir.pwd}/#{image}.png"
13
+ image = "#{Dir.pwd}/#{image}.gif"
14
+
15
+ unless File.exist?(image)
16
+ LogBot.fatal('Split', "Unable to find: '#{image}'")
17
+ exit 1
18
+ end
19
+
20
+ puts <<~HELP
21
+ Usage [file]
22
+ - Modify one gif into a directory of split images
23
+
24
+
25
+ Split:
26
+ Current Directory: #{Dir.pwd.pastel(:yellow)}
27
+
28
+ Gif to Split: #{image}
29
+ HELP
30
+
31
+ puts
32
+
33
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Split!? #{'(Destructive)'.pastel(:red)}"
34
+
35
+ process(image, png_image)
36
+ rescue TTY::Reader::InputInterrupt
37
+ exit 0
38
+ end
39
+
40
+ def self.process(file, png_image)
41
+ LogBot.info('Gif Split', file)
42
+ convert = MiniMagick::Tool::Convert.new
43
+ convert << file
44
+ convert << png_image
45
+ convert.call
46
+ end
47
+
48
+ def self.images
49
+ Dir["#{Dir.pwd}/*.gif"].map do |x|
50
+ File.basename(x, '.gif')
51
+ end.sort
52
+ end
53
+
54
+ def self.prompt
55
+ TTY::Prompt.new(active_color: :cyan)
56
+ end
57
+ # =========================================================
58
+ end
59
+ # =========================================================
60
+ end
61
+ end
@@ -0,0 +1,185 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Index
5
+ def self.index
6
+ @index ||= {}
7
+
8
+ @index
9
+ end
10
+
11
+ def self.catalog
12
+ # Better way to do this?
13
+ @catalog ||= Hash.new { |hash, key| hash[key] = Hash.new(&hash.default_proc) }
14
+
15
+ @catalog
16
+ end
17
+
18
+ # No Animations
19
+ def self.sprites
20
+ @sprites ||= {}
21
+
22
+ @sprites
23
+ end
24
+
25
+ def self.all
26
+ @all ||= []
27
+
28
+ @all
29
+ end
30
+
31
+ def self.context
32
+ @context ||= Dir.pwd
33
+
34
+ @context
35
+ end
36
+
37
+ def self.digest
38
+ list = Dir["#{sprites_directory}**/*.png"]
39
+ Digest::MD5.hexdigest(list.map { |x| Digest::MD5.file(x).hexdigest }.join)
40
+ end
41
+
42
+ def self.sprites_directory
43
+ "#{context}/sprites/"
44
+ end
45
+
46
+ def self.run!(force: false, dir: nil)
47
+ @context = dir || Dir.pwd
48
+
49
+ # Create Directory if sprites directory is missing
50
+ FileUtils.mkdir_p(sprites_directory)
51
+
52
+ if Settings.config[:image_digest] == digest
53
+ LogBot.info('Images Index', 'Nothing New')
54
+ return unless force
55
+ end
56
+
57
+ build_index
58
+
59
+ Settings.update(:image_digest, digest)
60
+
61
+ File.write("#{context}/app/drakkon/image_index.rb", result)
62
+ end
63
+
64
+ def self.build_index
65
+ check sprites_directory
66
+ end
67
+
68
+ def self.result
69
+ <<~RB
70
+ module Drakkon
71
+ module Images
72
+ def self.index
73
+ #{index.inspect}
74
+ end
75
+
76
+ def self.catalog
77
+ #{catalog.inspect}
78
+ end
79
+
80
+ def self.sprites
81
+ #{sprites.inspect}
82
+ end
83
+
84
+ def self.reset_all
85
+ #{all.inspect}.each do |sprite|
86
+ $gtk.reset_sprite "sprites/\#{sprite}.png"
87
+ end
88
+ end
89
+ end
90
+ end
91
+ RB
92
+ end
93
+
94
+ # Recursively Go through
95
+ def self.check(dir = nil)
96
+ LogBot.info('Image Index', "Check: #{dir}")
97
+
98
+ # Collect Images
99
+ list = Dir["#{dir}/*"]
100
+
101
+ # Ignore Empties
102
+ return if list.empty?
103
+
104
+ # Check if its an Animation Directory
105
+ if animation_directory?(list)
106
+ LogBot.info('Image Index', "Animation: #{dir}")
107
+ process_animation(list)
108
+ return
109
+ end
110
+
111
+ # Do other things
112
+ Dir["#{dir}/*"].each do |file|
113
+ if File.directory?(file)
114
+ Index.check(file)
115
+ elsif File.extname(file) == '.png'
116
+ process(file)
117
+ end
118
+ end
119
+
120
+ :done
121
+ end
122
+
123
+ def self.animation_directory?(list)
124
+ # Ignore Directories
125
+ return false if list.any? { |x| File.directory? x }
126
+
127
+ list.reject { |x| x.include? 'png' }.empty? && list.all? do |x|
128
+ File.basename(x).split('.png', 2).first.numeric?
129
+ end
130
+ end
131
+
132
+ def self.process(file = nil)
133
+ details = dimensions(file)
134
+ details[:path] = file.gsub(sprites_directory, '')[1..].gsub('.png', '')
135
+
136
+ # Catalog
137
+ catalog_list = details[:path].split('/')
138
+ catalog_location = []
139
+ catalog_list.each do |idx|
140
+ catalog_location.push idx
141
+ catalog.dig(*catalog_location)
142
+ end
143
+ catalog.dig(*catalog_list).merge! details
144
+
145
+ # Full Index Push
146
+ index[details[:path]] = details
147
+
148
+ # Just Sprites Push
149
+ sprites[details[:path]] = details
150
+
151
+ all.push details[:path]
152
+ end
153
+
154
+ def self.dimensions(file)
155
+ img = MiniMagick::Image.open(file)
156
+ # data = "{ path: \"#{root}/#{file.gsub('.png', '')}\", w: #{img.width}, h: #{img.height} }"
157
+
158
+ {
159
+ w: img.width,
160
+ h: img.height
161
+ }
162
+ end
163
+
164
+ def self.process_animation(list = nil)
165
+ # Append all images to `all`
166
+ list.each do |file|
167
+ all.push file.gsub(sprites_directory, '')[1..].gsub('.png', '')
168
+ end
169
+
170
+ # Nab one to get data
171
+ file = list.first
172
+ details = dimensions(file)
173
+
174
+ # Frames and Path
175
+ details[:frames] = list.count
176
+ details[:root_path] = File.dirname(file).gsub(sprites_directory, '')[1..]
177
+
178
+ # Store via Root Path
179
+ index[details[:root_path]] = details
180
+ end
181
+ # =========================================================
182
+ end
183
+ # =========================================================
184
+ end
185
+ end
@@ -0,0 +1,56 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module List
5
+ def self.run!(args = [])
6
+ puts args
7
+ require "#{Dir.pwd}/app/drakkon/image_index"
8
+
9
+ loop do
10
+ r = listy_list(index(args))
11
+ break if r == 'exit'
12
+
13
+ puts <<~OUTPUT
14
+
15
+ #{r.pastel(:bright_blue)}
16
+
17
+ **Drakkon::Images.index['#{r}']
18
+
19
+
20
+ OUTPUT
21
+ end
22
+ end
23
+
24
+ def self.index(args)
25
+ if args.empty?
26
+
27
+ Images.index.keys
28
+ else
29
+
30
+ idx = args.flat_map do |filter|
31
+ Images.index.keys.grep(/#{filter}/)
32
+ end
33
+
34
+ idx.compact.uniq
35
+ end
36
+ end
37
+
38
+ def self.listy_list(list)
39
+ prompt.select('Filter:', filter: true) do |menu|
40
+ menu.choice name: 'exit'
41
+ list.each do |img|
42
+ menu.choice name: img
43
+ end
44
+ end
45
+ rescue TTY::Reader::InputInterrupt
46
+ exit 0
47
+ end
48
+
49
+ def self.prompt
50
+ TTY::Prompt.new(active_color: :cyan)
51
+ end
52
+ # =========================================================
53
+ end
54
+ # =========================================================
55
+ end
56
+ end
@@ -0,0 +1,69 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ # https://imagemagick.org/script/command-line-options.php#modulate
5
+ module Modulate
6
+ def self.run!(args = [])
7
+ # Amount
8
+ amount = if args.empty?
9
+ puts 'Amount Syntax: brightness,saturation,hue'
10
+ prompt.ask('Amount? (e.g. 100,20): ')
11
+ else
12
+ args.shift
13
+ end
14
+
15
+ puts <<~HELP
16
+ Usage
17
+ - Run in the directory you wish to modify the images
18
+ - Modulates images via MiniMagick
19
+ -modulate 100,50,80
20
+
21
+
22
+ Modulate Amount: #{amount}
23
+ Current Directory;
24
+ #{Dir.pwd.pastel(:yellow)}
25
+
26
+ Current Directory;
27
+ #{Dir.pwd.pastel(:yellow)}
28
+
29
+ Images:
30
+ HELP
31
+
32
+ images.sort.each do |img|
33
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
34
+ puts " - #{img_s}"
35
+ end
36
+ puts
37
+
38
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Modulate!? #{'(Destructive)'.pastel(:red)}"
39
+
40
+ start(amount)
41
+ end
42
+
43
+ def self.start(amount)
44
+ images.each do |img|
45
+ LogBot.info('Image Mod', img)
46
+ process(img, amount)
47
+ end
48
+ end
49
+
50
+ def self.process(file, amount)
51
+ convert = MiniMagick::Tool::Convert.new
52
+ convert << file
53
+ convert.modulate(amount)
54
+ convert << file
55
+ convert.call
56
+ end
57
+
58
+ def self.images
59
+ Dir["#{Dir.pwd}/**/*.png"]
60
+ end
61
+
62
+ def self.prompt
63
+ TTY::Prompt.new(active_color: :cyan)
64
+ end
65
+ # =========================================================
66
+ end
67
+ # =========================================================
68
+ end
69
+ end
@@ -0,0 +1,83 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Resize
5
+ def self.run!(args = [])
6
+ # Sizing
7
+ size = if args.empty?
8
+ prompt.ask('Target Size? (e.g. 200x200): ')
9
+ else
10
+ args.shift
11
+ end
12
+
13
+ # Recommend as Options?
14
+ # image.filter 'Sinc'
15
+ # image.filter 'Gaussian'
16
+
17
+ # Potentially Support Custom Filters?
18
+ filter = if args.empty?
19
+ 'Lanczos2'
20
+ else
21
+ args.shift
22
+ end
23
+
24
+ puts <<~HELP
25
+ Usage [size] [filter = Lanczos2]
26
+ - Run in the directory you wish to modify the images
27
+ - Resizes the images via MiniMagick
28
+ - Sizes are #{'width'.pastel(:blue)} x #{'height'.pastel(:blue)}
29
+ - 200x200, 150,175, and etc
30
+
31
+
32
+
33
+ #{'Note: this will be best fit! This will retain aspect ratio!'.pastel(:bright_blue)}
34
+
35
+ Filter: #{filter} to Size: #{size}
36
+ Current Directory;
37
+ #{Dir.pwd.pastel(:yellow)}
38
+
39
+ Images:
40
+ HELP
41
+
42
+ images.sort.each do |img|
43
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
44
+ puts " - #{img_s}"
45
+ end
46
+ puts
47
+
48
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Resize!? #{'(Destructive)'.pastel(:red)}"
49
+
50
+ start(filter, size)
51
+ end
52
+
53
+ def self.start(filter, size)
54
+ images.each do |img|
55
+ LogBot.info('Image Resize', img)
56
+ process(img, filter, size)
57
+ end
58
+ end
59
+
60
+ def self.process(file, filter, size)
61
+ image = MiniMagick::Image.open(file)
62
+
63
+ # Ignore if the same for w/h
64
+ return if image.width == size.split('x', 2).first.to_i && image.height == size.split('x', 2).last.to_i
65
+
66
+ LogBot.info('Image Resize', "Resizing: #{file}: #{size}")
67
+ image.filter filter
68
+ image.resize size
69
+ image.write file
70
+ end
71
+
72
+ def self.images
73
+ Dir["#{Dir.pwd}/**/*.png"]
74
+ end
75
+
76
+ def self.prompt
77
+ TTY::Prompt.new(active_color: :cyan)
78
+ end
79
+ # =========================================================
80
+ end
81
+ # =========================================================
82
+ end
83
+ end