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,57 @@
1
+ module Drakkon
2
+ module Gems
3
+ # Gem file manipulation and selection
4
+ module GemHelpers
5
+ def select_files
6
+ data[:files] ||= {}
7
+ file_edit
8
+ end
9
+
10
+ def file_edit
11
+ # Select File
12
+ file = prompt_file
13
+ file_id = file.to_sym
14
+
15
+ if data[:files].key?(file_id) && prompt.yes?("Remove File? #{file.pastel(:bright_blue)}")
16
+ data[:files].delete file_id
17
+ return
18
+ end
19
+
20
+ # Fine Weight
21
+ weight = prompt.ask("File: #{file.pastel(:bright_blue)}, What weight?", convert: :integer, default: 10)
22
+
23
+ # Datas
24
+ file_data = {
25
+ weight:,
26
+ file:
27
+ }
28
+
29
+ # Save
30
+ data[:files][file_id] = file_data
31
+ end
32
+
33
+ def path_files
34
+ Dir["#{data[:path]}/**/*.rb"].map { |x| x.gsub("#{data[:path]}/", '') }
35
+ end
36
+
37
+ def prompt_file
38
+ prompt.select('Select File:', filter: true, per_page: 25) do |menu|
39
+ path_files.each do |file|
40
+ name = if data[:files].key? file.to_sym
41
+ "#{file.pastel(:bright_blue)} #{'✔'.pastel(:bright_green)}"
42
+ else
43
+ file
44
+ end
45
+
46
+ menu.choice name:, value: file
47
+ end
48
+ end
49
+
50
+ # Return
51
+ end
52
+
53
+ # =============================================================
54
+ end
55
+ # =============================================================
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def prompt
6
+ TTY::Prompt.new(active_color: :cyan)
7
+ end
8
+
9
+ def read_config
10
+ @config = JSON.parse(File.read(config_file), { symbolize_names: true })
11
+ end
12
+
13
+ def config_file
14
+ "#{data[:path]}/drakkon.json"
15
+ end
16
+
17
+ # =============================================================
18
+ end
19
+ # =============================================================
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def select_modules
6
+ data[:modules] = prompt_modules.map do |selected|
7
+ modules.find { |x| x[:name] == selected }
8
+ end
9
+ end
10
+
11
+ def refresh_modules
12
+ read_config
13
+ valid_structure?
14
+ load_modules
15
+
16
+ data[:modules] = data[:modules].map(&:name).map do |selected|
17
+ modules.find { |x| x[:name] == selected }
18
+ end
19
+ end
20
+
21
+ def prompt_modules
22
+ prompt.multi_select('Select Modules:', filter: true, per_page: modules.count) do |menu|
23
+ # menu.default *data[:modules].map(&:name) if data[:modules]
24
+ # menu.default 'Core - Daemon Core Modules'
25
+
26
+ defaults = []
27
+
28
+ modules.each do |mod|
29
+ # Format
30
+ name = mod.name.pastel(:bright_blue)
31
+ name += " - #{mod[:description]}".pastel(:bright_black) if mod.key?(:description)
32
+
33
+ # Preselect Previous ones if exists
34
+ defaults.push(name) if data[:modules]&.any? { |x| x[:name] == mod&.name }
35
+
36
+ # Choice
37
+ menu.choice name:, value: mod[:name]
38
+ end
39
+
40
+ # Defaults
41
+ menu.default(*defaults)
42
+ end
43
+
44
+ # Return
45
+ end
46
+
47
+ # =============================================================
48
+ end
49
+ # =============================================================
50
+ end
51
+ end
@@ -0,0 +1,43 @@
1
+ module Drakkon
2
+ module Gems
3
+ # General Helpers for Gem Class
4
+ module GemHelpers
5
+ def source_setup
6
+ @source = source?(args.shift).to_sym
7
+
8
+ case source
9
+ when :local
10
+ data[:path] = path?(args.shift)
11
+ # Using Name within package
12
+ # @id = "#{source}--#{data[:path]}"
13
+ end
14
+ end
15
+
16
+ def source?(source)
17
+ return source if sources.include?(source)
18
+
19
+ prompt.select('Gem Source?', sources, filter: true)
20
+ end
21
+
22
+ def sources
23
+ [
24
+ 'local'
25
+ ]
26
+ end
27
+
28
+ def path?(path)
29
+ return path unless path.nil?
30
+
31
+ loop do
32
+ dir = prompt.ask('Local Path? (e.g. /data/gem/location)')
33
+
34
+ return dir if File.directory?(dir)
35
+
36
+ LogBot.fatal('Gem', "Invalid Directory / Not found! #{dir.pastel(:red)}")
37
+ end
38
+ end
39
+ # =============================================================
40
+ end
41
+ # =============================================================
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ module Drakkon
2
+ module Gems
3
+ # Run Command for CLI
4
+ module Install
5
+ def self.opts
6
+ @opts
7
+ end
8
+
9
+ def self.start(args)
10
+ gem = Gems::Gem.new
11
+ gem.intall_setup(args)
12
+ rescue TTY::Reader::InputInterrupt
13
+ exit 0
14
+ end
15
+
16
+ def self.prompt
17
+ TTY::Prompt.new(active_color: :cyan)
18
+ end
19
+
20
+ #=======================================================
21
+ end
22
+ #=======================================================
23
+ end
24
+ end
@@ -0,0 +1,85 @@
1
+ module Drakkon
2
+ # Run Command for CLI
3
+ module Init
4
+ # General Run
5
+ def self.go!(_raw = nil)
6
+ if Settings.init?
7
+ LogBot.info('Init', 'Already Configured!')
8
+ exit(0)
9
+ end
10
+
11
+ run!
12
+ rescue SystemExit, Interrupt
13
+ LogBot.info('Init', 'Exiting')
14
+ exit
15
+ end
16
+
17
+ def self.run!
18
+ exit if prompt.no?("Init Drakkon here? #{Dir.pwd.pastel(:yellow)}")
19
+ LogBot.info('Init', 'Start')
20
+ settings
21
+ directories
22
+ metadata
23
+
24
+ # TODO: Validate / Confirm
25
+ File.write('app/main.rb', main_tick)
26
+ end
27
+
28
+ def self.metadata
29
+ # Icon is required for build
30
+ FileUtils.cp(metdata_dir('icon.png'), 'metadata/')
31
+
32
+ # Copy metdata files
33
+ FileUtils.cp(metdata_dir('game_metadata.txt'), 'metadata/')
34
+ end
35
+
36
+ def self.metdata_dir(file_name = nil)
37
+ "#{Run.version_dir}/mygame/metadata/#{file_name}"
38
+ end
39
+
40
+ def self.settings
41
+ LogBot.info('Init', 'Settings Setup')
42
+
43
+ opts = {
44
+ platforms: [],
45
+ version: Hub.version_latest,
46
+ image_index: true,
47
+ manifest: true,
48
+ gems: {}
49
+ }
50
+
51
+ # TODO: Be better, this is lazy...
52
+ opts.each do |key, value|
53
+ Settings.update(key, value)
54
+ end
55
+ end
56
+
57
+ def self.directories
58
+ LogBot.info('Init', 'Directories Setup')
59
+
60
+ ['app', 'fonts', 'metadata', 'fonts', 'sounds', 'sprites', 'app/drakkon'].each do |dir|
61
+ next if Dir.exist?(dir)
62
+
63
+ Dir.mkdir dir
64
+ end
65
+ end
66
+
67
+ def self.main_tick
68
+ <<~MAIN
69
+ require 'app/drakkon/bundle.rb'
70
+
71
+ def tick(gtk_args)
72
+ # args.gtk.slowmo! 2
73
+ # =========================================================
74
+ end
75
+ MAIN
76
+ end
77
+
78
+ def self.prompt
79
+ TTY::Prompt.new(active_color: :cyan)
80
+ end
81
+
82
+ #=======================================================
83
+ end
84
+ #=======================================================
85
+ end
@@ -0,0 +1,112 @@
1
+ module Drakkon
2
+ # General Info Helpers
3
+ module Hub
4
+ # Ensrue Setup
5
+ def self.init
6
+ # rubocop:disable Lint/NonAtomicFileOperation
7
+ # Ensure Home Directory; It is neccessary stupid rubocop
8
+ Dir.mkdir(Hub.dir) unless Dir.exist?(Hub.dir)
9
+ # rubocop:enable Lint/NonAtomicFileOperation
10
+
11
+ setup unless File.exist?(config_file)
12
+ end
13
+
14
+ def self.setup
15
+ LogBot.info('Hub', 'Init Config')
16
+ opts = config_defaults
17
+
18
+ # TODO: Be better, this is lazy...
19
+ opts.each do |key, value|
20
+ Hub.update(key, value)
21
+ end
22
+ end
23
+
24
+ def self.config_defaults
25
+ {
26
+ versions: [],
27
+ skeletons: {}
28
+ }
29
+ end
30
+
31
+ # Combine Dir Location
32
+ def self.dir
33
+ "#{Dir.home}/.drakkon"
34
+ end
35
+
36
+ def self.config_file
37
+ "#{dir}/config.json"
38
+ end
39
+
40
+ def self.version?(version)
41
+ versions.include? version
42
+ end
43
+
44
+ def self.versions
45
+ config.versions
46
+ end
47
+
48
+ def self.version_latest
49
+ list = versions.map { |v| v.split('.').map(&:to_i) }
50
+ latest = list.sort.reverse.max
51
+ latest.join('.')
52
+ end
53
+
54
+ def self.versions_sorted
55
+ list = versions.map { |v| v.split('.').map(&:to_i) }
56
+ list.sort.reverse.map { |v| v.join('.') }
57
+ end
58
+
59
+ def self.version_add(version)
60
+ config[:versions].push version
61
+
62
+ update(:versions, config[:versions])
63
+ end
64
+
65
+ def self.config
66
+ # Write Default
67
+ File.write(config_file, Oj.dump({})) unless File.exist?(config_file)
68
+
69
+ @config ||= JSON.parse(File.read(config_file), { symbolize_names: true })
70
+
71
+ # TODO: Optimize this a bit more
72
+ config_defaults.each do |key, value|
73
+ @config[key] ||= value
74
+ end
75
+
76
+ @config
77
+ end
78
+
79
+ def self.update(key, value)
80
+ config[key] = value
81
+ write
82
+ end
83
+
84
+ def self.delete(key)
85
+ config.delete key
86
+ write
87
+ end
88
+
89
+ def self.write
90
+ # LogBot.debug('Hub', "Writing Config: #{config_file}")
91
+ File.write(config_file, Oj.dump(config))
92
+ end
93
+
94
+ def self.log_file
95
+ "#{dir}/output.log"
96
+ end
97
+
98
+ # =========================
99
+ # Template Helpers
100
+ # =========================
101
+ def self.skeletons?
102
+ !config.skeletons.empty?
103
+ end
104
+
105
+ def self.skeletons
106
+ config.skeletons
107
+ end
108
+
109
+ # ======================================================================
110
+ end
111
+ # ======================================================================
112
+ end
@@ -0,0 +1,43 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Biggest
5
+ def self.run!(_args = [])
6
+ start
7
+ end
8
+
9
+ def self.start
10
+ index = []
11
+ LogBot.info('Image Biggest Index')
12
+ images.each do |img|
13
+ index.push process(img)
14
+ end
15
+
16
+ w = index.max_by(&:w).w
17
+ h = index.max_by(&:h).h
18
+
19
+ puts "Largest Size is: { w: #{w}, h: #{h} }"
20
+ end
21
+
22
+ def self.process(file)
23
+ # LogBot.info('Image Biggest', file)
24
+ img = MiniMagick::Image.open(file)
25
+
26
+ {
27
+ w: img.width,
28
+ h: img.height
29
+ }
30
+ end
31
+
32
+ def self.images
33
+ Dir["#{Dir.pwd}/**/*.png"]
34
+ end
35
+
36
+ def self.prompt
37
+ TTY::Prompt.new(active_color: :cyan)
38
+ end
39
+ # =========================================================
40
+ end
41
+ # =========================================================
42
+ end
43
+ end
@@ -0,0 +1,76 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Blur
5
+ def self.run!(args = [])
6
+ # Sizing
7
+ size = if args.empty?
8
+ prompt.ask('Blur Size? (e.g. 20x20): ', default: '5x5')
9
+ else
10
+ args.shift
11
+ end
12
+
13
+ # TODO: Recommend as Options
14
+ # TODO: Blur Options
15
+
16
+ # Potentially Support Custom Filters?
17
+ filter = if args.empty?
18
+ 'Gaussian'
19
+ else
20
+ args.shift
21
+ end
22
+
23
+ puts <<~HELP
24
+ Usage [size] [filter = Gaussian]
25
+ - Run in the directory you wish to modify the images
26
+ - Blurs the images via MiniMagick
27
+
28
+ Filter: #{filter} to Size: #{size}
29
+ Current Directory;
30
+ #{Dir.pwd.pastel(:yellow)}
31
+
32
+ Images:
33
+ HELP
34
+
35
+ images.sort.each do |img|
36
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
37
+ puts " - #{img_s}"
38
+ end
39
+ puts
40
+
41
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Blur!? #{'(Destructive)'.pastel(:red)}"
42
+
43
+ start(filter, size)
44
+ end
45
+
46
+ def self.start(filter, size)
47
+ images.each do |img|
48
+ LogBot.info('Image Blur', img)
49
+ process(img, filter, size)
50
+ end
51
+ end
52
+
53
+ def self.process(file, filter, size)
54
+ image = MiniMagick::Image.open(file)
55
+
56
+ # Ignore if the same
57
+ return if image.width == size.split('x', 2).first.to_i
58
+
59
+ LogBot.info('Image Blur', "Blurring: #{file}")
60
+ image.filter filter
61
+ image.blur size
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,86 @@
1
+ module Drakkon
2
+ module Images
3
+ # This renames png's in a directory to match the index_frame 0..10 etc
4
+ module BulkRename
5
+ def self.run!(args = [])
6
+ args ||= []
7
+ sort_method = if args.empty?
8
+ :mtime
9
+ else
10
+ args.shift.to_sym
11
+ end
12
+
13
+ # Lazy Safety
14
+ sort_method = :mtime unless %i[name mtime].include?(sort_method)
15
+
16
+ puts <<~HELP
17
+ Usage [sort_method = mtime, name]
18
+ - Run in the directory you wish to rename the images (uses mtime)
19
+
20
+ Current Directory;
21
+ #{Dir.pwd.pastel(:yellow)}
22
+
23
+ Images:
24
+ HELP
25
+
26
+ list = sorted_images(sort_method)
27
+
28
+ list.each do |img|
29
+ img_s = img.gsub("#{Dir.pwd}/", '').pastel(:yellow)
30
+ puts " - #{img_s}"
31
+ end
32
+ puts
33
+
34
+ exit unless prompt.yes? "#{'Are you sure?'.pastel(:bright_yellow)} Rename!? #{'(Destructive)'.pastel(:red)}"
35
+
36
+ start(list)
37
+ end
38
+
39
+ def self.start(list)
40
+ # Create tmp_dir to send stuff too
41
+ Dir.mktmpdir do |tmp_dir|
42
+ # Move / rename all out into tmp_dir to avoid clobbering
43
+ list.each_with_index do |f, i|
44
+ FileUtils.mv(f, "#{tmp_dir}/#{i}.png")
45
+ end
46
+
47
+ # Move all back
48
+ Dir["#{tmp_dir}/*.png"].each do |f|
49
+ FileUtils.mv(f, Dir.pwd)
50
+ end
51
+ end
52
+ end
53
+
54
+ def self.sorted_images(sort_method)
55
+ case sort_method
56
+ when :mtime then images.sort_by { |x| File.mtime(x) }
57
+ when :name then images.sort_by { |x| File.basename(x) }
58
+ end
59
+ end
60
+
61
+ def self.process(file, filter, size)
62
+ image = MiniMagick::Image.open(file)
63
+
64
+ # Ignore if the same for w/h
65
+ return if image.width == size.split('x', 2).first.to_i && image.height == size.split('x', 2).last.to_i
66
+
67
+ LogBot.info('Image Resize', "Resizing: #{file}: #{size}")
68
+ image.filter filter
69
+ image.resize size
70
+ image.write file
71
+ end
72
+
73
+ def self.images
74
+ # Dir["#{Dir.pwd}/*.png"].sort_by(&:File.basename)
75
+
76
+ Dir["#{Dir.pwd}/*.png"].sort_by { |x| File.mtime(x) }
77
+ end
78
+
79
+ def self.prompt
80
+ TTY::Prompt.new(active_color: :cyan)
81
+ end
82
+ # =========================================================
83
+ end
84
+ # =========================================================
85
+ end
86
+ end
@@ -0,0 +1,74 @@
1
+ module Drakkon
2
+ module Images
3
+ # General Image Index Helper
4
+ module Canvas
5
+ def self.run!(args = [])
6
+ # Sizing
7
+ size = if args.empty?
8
+ prompt.ask('Size? (e.g. 200x200): ')
9
+ else
10
+ args.shift
11
+ end
12
+
13
+ gravity = if args.empty?
14
+ prompt.ask('Gravity? (west,east,north,south): ', default: 'south')
15
+ else
16
+ args.shift
17
+ end
18
+
19
+ puts <<~HELP
20
+ Usage [WxH] [gravity]
21
+ - Run in the directory you wish to modify the images
22
+ - Adjust images via MiniMagick (extent)
23
+ #{' '}
24
+
25
+ Canvas: Size: #{size}, Gravity: #{gravity}
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)} Canvas!? #{'(Destructive)'.pastel(:red)}"
39
+
40
+ start(size, gravity)
41
+ end
42
+
43
+ def self.start(size, gravity)
44
+ images.each do |img|
45
+ LogBot.info('Image Shift', img)
46
+ process(img, gravity, size)
47
+ end
48
+ end
49
+
50
+ def self.process(file, gravity, size)
51
+ image = MiniMagick::Image.open(file)
52
+ LogBot.info('Image Canvas', file)
53
+
54
+ img = image.combine_options do |cmd|
55
+ cmd.gravity gravity
56
+ cmd.background 'transparent'
57
+ cmd.extent size
58
+ end
59
+
60
+ img.write file
61
+ end
62
+
63
+ def self.images
64
+ Dir["#{Dir.pwd}/**/*.png"]
65
+ end
66
+
67
+ def self.prompt
68
+ TTY::Prompt.new(active_color: :cyan)
69
+ end
70
+ # =========================================================
71
+ end
72
+ # =========================================================
73
+ end
74
+ end