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.
- checksums.yaml +7 -0
- data/README.md +50 -0
- data/bin/drakkon +16 -0
- data/lib/drakkon/build.rb +126 -0
- data/lib/drakkon/cli.rb +64 -0
- data/lib/drakkon/gem/bundle.rb +116 -0
- data/lib/drakkon/gem/cli.rb +46 -0
- data/lib/drakkon/gem/configure.rb +73 -0
- data/lib/drakkon/gem/gem.rb +56 -0
- data/lib/drakkon/gem/helpers/check.rb +110 -0
- data/lib/drakkon/gem/helpers/files.rb +57 -0
- data/lib/drakkon/gem/helpers/general.rb +21 -0
- data/lib/drakkon/gem/helpers/modules.rb +51 -0
- data/lib/drakkon/gem/helpers/source.rb +43 -0
- data/lib/drakkon/gem/install.rb +24 -0
- data/lib/drakkon/init.rb +85 -0
- data/lib/drakkon/lib/hub.rb +112 -0
- data/lib/drakkon/lib/images/biggest.rb +43 -0
- data/lib/drakkon/lib/images/blur.rb +76 -0
- data/lib/drakkon/lib/images/bulk_rename.rb +86 -0
- data/lib/drakkon/lib/images/canvas.rb +74 -0
- data/lib/drakkon/lib/images/cli.rb +78 -0
- data/lib/drakkon/lib/images/desaturate.rb +58 -0
- data/lib/drakkon/lib/images/flip_flop.rb +76 -0
- data/lib/drakkon/lib/images/gif.rb +61 -0
- data/lib/drakkon/lib/images/index.rb +185 -0
- data/lib/drakkon/lib/images/list.rb +56 -0
- data/lib/drakkon/lib/images/modulate.rb +69 -0
- data/lib/drakkon/lib/images/resize.rb +83 -0
- data/lib/drakkon/lib/images/roll.rb +68 -0
- data/lib/drakkon/lib/images/rotate.rb +60 -0
- data/lib/drakkon/lib/images/scale.rb +86 -0
- data/lib/drakkon/lib/images/sepia.rb +64 -0
- data/lib/drakkon/lib/images/shift.rb +89 -0
- data/lib/drakkon/lib/images/split.rb +93 -0
- data/lib/drakkon/lib/images/spritesheet.rb +85 -0
- data/lib/drakkon/lib/images/trim.rb +56 -0
- data/lib/drakkon/lib/images/white.rb +56 -0
- data/lib/drakkon/lib/logbot.rb +86 -0
- data/lib/drakkon/lib/manifest.rb +74 -0
- data/lib/drakkon/lib/pastel.rb +49 -0
- data/lib/drakkon/lib/settings.rb +130 -0
- data/lib/drakkon/lib/shims.rb +8 -0
- data/lib/drakkon/lib/version.rb +79 -0
- data/lib/drakkon/release.rb +3 -0
- data/lib/drakkon/run/commands/images.rb +14 -0
- data/lib/drakkon/run/commands/log.rb +57 -0
- data/lib/drakkon/run/commands/restart.rb +14 -0
- data/lib/drakkon/run/helpers.rb +60 -0
- data/lib/drakkon/run/reader_shim.rb +110 -0
- data/lib/drakkon/run/tty.rb +119 -0
- data/lib/drakkon/run.rb +80 -0
- data/lib/drakkon/setup.rb +31 -0
- data/lib/drakkon/skeleton/cli.rb +46 -0
- data/lib/drakkon/skeleton/deploy.rb +105 -0
- data/lib/drakkon/skeleton/helpers/check.rb +143 -0
- data/lib/drakkon/skeleton/helpers/general.rb +21 -0
- data/lib/drakkon/skeleton/helpers/source.rb +43 -0
- data/lib/drakkon/skeleton/install.rb +31 -0
- data/lib/drakkon/skeleton/template.rb +14 -0
- data/lib/drakkon/web.rb +68 -0
- data/lib/drakkon.rb +43 -0
- metadata +302 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: fe3b0f0a63a77864c2d03aef71e713d3200108e461f828507cc93ddf2813e2d9
|
4
|
+
data.tar.gz: 7377e89e87729eba3a86d116964838863020be2bc5f863a8d89ace95262a742a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9da3704ab83a2ca35cb0bf61502339580b8895a8a13008d271e5969a99da945a37000ef684507d8933cea3bdda837cb06fdd5a9ae2d0db6e3b6a403fb1cf8b49
|
7
|
+
data.tar.gz: c5e4ac342e42a7ca6498987430b9311df618033c7fa50f0ad92cbf020a8bd1cdf3871e434631c733c6f66faded93664c9092b0548ce44d68a5269ce2d1649e9f
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# Drakkon
|
2
|
+
|
3
|
+
Runtime Helper for DragonRuby Games!
|
4
|
+
|
5
|
+
# Requirements
|
6
|
+
|
7
|
+
- Lots
|
8
|
+
|
9
|
+
### Ubuntu
|
10
|
+
|
11
|
+
I'm Sure there's something
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
```
|
16
|
+
gem install drakkon
|
17
|
+
```
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
```
|
22
|
+
drakkon .
|
23
|
+
```
|
24
|
+
|
25
|
+
## Testing
|
26
|
+
|
27
|
+
```
|
28
|
+
bundle exec rake
|
29
|
+
```
|
30
|
+
|
31
|
+
## Release Process
|
32
|
+
|
33
|
+
- Update CHANGELOG
|
34
|
+
- Increment `release.rb`
|
35
|
+
- Create MR
|
36
|
+
- Merge to Master
|
37
|
+
|
38
|
+
```
|
39
|
+
# Build and Push
|
40
|
+
bundle exec rake build
|
41
|
+
gem push pkg/drakkon-1.x.x.gem
|
42
|
+
```
|
43
|
+
|
44
|
+
## TODO
|
45
|
+
|
46
|
+
- See Issues (Readme Todo's suck)
|
47
|
+
|
48
|
+
## License
|
49
|
+
|
50
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/bin/drakkon
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'drakkon'
|
4
|
+
|
5
|
+
# Signal.trap('INT') { exit }
|
6
|
+
|
7
|
+
flair = <<~FLAIR
|
8
|
+
_______________________________________
|
9
|
+
| ___ ____ ____ _ _ _ _ ____ __ _ |
|
10
|
+
| |__> |--< |--| |-:_ |-:_ [__] | \\| |
|
11
|
+
|_______________________________________|
|
12
|
+
FLAIR
|
13
|
+
|
14
|
+
puts flair.pastel(:bright_red)
|
15
|
+
|
16
|
+
Drakkon::CLI.init
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Drakkon
|
2
|
+
# Run Command for CLI
|
3
|
+
module Build
|
4
|
+
def self.args(raw = nil)
|
5
|
+
@args ||= raw
|
6
|
+
|
7
|
+
@args
|
8
|
+
end
|
9
|
+
|
10
|
+
# General Run
|
11
|
+
# rubocop:disable Metrics/AbcSize
|
12
|
+
def self.go!(raw, publish = '--package')
|
13
|
+
Settings.ready?
|
14
|
+
args(raw)
|
15
|
+
|
16
|
+
Settings.update(:platforms, platform_setup) unless Settings.platforms?
|
17
|
+
|
18
|
+
builder = if args.empty?
|
19
|
+
Settings.platforms
|
20
|
+
else
|
21
|
+
platforms.select { |i| args.any? { |a| i.include? a } }
|
22
|
+
end
|
23
|
+
|
24
|
+
if builder.empty?
|
25
|
+
LogBot.fatal('Build',
|
26
|
+
"No valid platforms found! #{args.inspect.pastel(:red)} : #{builder.inspect.pastel(:red)}")
|
27
|
+
exit(0)
|
28
|
+
end
|
29
|
+
|
30
|
+
list = builder.join(',')
|
31
|
+
LogBot.info('Build', "Building for platforms: #{list}")
|
32
|
+
|
33
|
+
# Save Current Directory before changing to Version Directory
|
34
|
+
context = Dir.pwd
|
35
|
+
context_name = File.basename(context)
|
36
|
+
version = metadata_version(context)
|
37
|
+
|
38
|
+
# Yes... build.build! :D
|
39
|
+
Dir.chdir(version_dir) do
|
40
|
+
# Clean Up Accidental Leftovers
|
41
|
+
FileUtils.rm_r(context_name) if Dir.exist? context_name
|
42
|
+
|
43
|
+
# DragonRuby Publish doesn't like symlinks or PATH...
|
44
|
+
FileUtils.cp_r(context, context_name)
|
45
|
+
|
46
|
+
# Clean Builds Dir
|
47
|
+
FileUtils.rm_r(Dir['builds/*'])
|
48
|
+
|
49
|
+
# Remove Project's Builds Directory / Copied Version
|
50
|
+
FileUtils.rm_r("#{context_name}/builds") if Dir.exist? "#{context_name}/builds"
|
51
|
+
|
52
|
+
# Execute
|
53
|
+
system build!(list, context_name, publish)
|
54
|
+
|
55
|
+
# Preflight
|
56
|
+
FileUtils.mkdir_p("#{context}/builds")
|
57
|
+
FileUtils.mkdir_p("#{context}/builds/#{version}")
|
58
|
+
|
59
|
+
# Copy back to Project Dir
|
60
|
+
FileUtils.cp_r(Dir['builds/*'], "#{context}/builds/#{version}/")
|
61
|
+
|
62
|
+
# Copy Settings
|
63
|
+
copy = Settings.config.dig(:builds, :copy)
|
64
|
+
|
65
|
+
if copy
|
66
|
+
FileUtils.mkdir_p("#{copy}/#{version}")
|
67
|
+
FileUtils.cp(Dir['builds/*.zip'], "#{copy}/#{version}/")
|
68
|
+
end
|
69
|
+
|
70
|
+
# Clean Up
|
71
|
+
FileUtils.rm_r(context_name)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
# rubocop:enable Metrics/AbcSize
|
75
|
+
|
76
|
+
def self.metadata_version(context)
|
77
|
+
File.read("#{context}/metadata/game_metadata.txt").split("\n").find { |y| y.include? 'version' }.split('=').last
|
78
|
+
end
|
79
|
+
|
80
|
+
# DEW THE BUILD
|
81
|
+
def self.build!(list, context, package = '--package')
|
82
|
+
"PATH=#{version_dir}:$PATH dragonruby-publish #{package} --platforms=#{list} #{context}"
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.version_dir
|
86
|
+
"#{Hub.dir}/#{Settings.version}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.force_images?
|
90
|
+
args.include?('images')
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.force_manifest?
|
94
|
+
args.include?('manifest')
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.platform_setup
|
98
|
+
prompt.multi_select('Select Platforms to build for (these will be the future default):', platforms, filter: true)
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.platforms
|
102
|
+
%w[
|
103
|
+
windows-amd64
|
104
|
+
linux-amd64
|
105
|
+
macos
|
106
|
+
android-0
|
107
|
+
android
|
108
|
+
googleplay-0
|
109
|
+
googleplay
|
110
|
+
html5-0
|
111
|
+
html5
|
112
|
+
linux-raspberrypi
|
113
|
+
mac-0
|
114
|
+
oculusquest-0
|
115
|
+
oculusquest
|
116
|
+
]
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.prompt
|
120
|
+
TTY::Prompt.new(active_color: :cyan)
|
121
|
+
end
|
122
|
+
|
123
|
+
#=======================================================
|
124
|
+
end
|
125
|
+
#=======================================================
|
126
|
+
end
|
data/lib/drakkon/cli.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
module Drakkon
|
2
|
+
# General Entrypoint for CLI
|
3
|
+
module CLI
|
4
|
+
# Entrypoint for the CLI
|
5
|
+
def self.init
|
6
|
+
# Home Directory Handling
|
7
|
+
Hub.init
|
8
|
+
|
9
|
+
# Split up CLI Args
|
10
|
+
cmd = ARGV[0]
|
11
|
+
args = ARGV[1..]
|
12
|
+
|
13
|
+
start(cmd&.to_sym, args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.start(cmd, args)
|
17
|
+
case cmd
|
18
|
+
when :init then Init.go!(args)
|
19
|
+
when :setup then Setup.go!(args)
|
20
|
+
when :run then Run.go!(args)
|
21
|
+
when :build then Build.go!(args)
|
22
|
+
when :publish then Build.go!([], '')
|
23
|
+
when :images then Images::CLI.run!(args)
|
24
|
+
when :install then Version.install!(args)
|
25
|
+
when :gem then Gems::CLI.init!(args)
|
26
|
+
when :skeleton then Skeleton::CLI.init!(args)
|
27
|
+
when :versions then Version.list
|
28
|
+
when :console then console
|
29
|
+
when :web then Web.run!(args)
|
30
|
+
when :exit then exit(0)
|
31
|
+
else
|
32
|
+
start(menu, args)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.prompt
|
37
|
+
TTY::Prompt.new(active_color: :cyan)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.console
|
41
|
+
binding.pry
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.menu
|
45
|
+
prompt.select('Wat do?', filter: true, per_page: 100) do |menu|
|
46
|
+
menu.choice name: 'run', value: :run
|
47
|
+
menu.choice name: 'setup (config/initialization)', value: :setup
|
48
|
+
menu.choice name: 'build', value: :build
|
49
|
+
menu.choice name: 'publish', value: :publish
|
50
|
+
menu.choice name: 'install (DragonRuby Versions)', value: :install
|
51
|
+
menu.choice name: 'images', value: :images
|
52
|
+
menu.choice name: 'gem (Shared Code)', value: :gem
|
53
|
+
menu.choice name: 'skeleton (Templates)', value: :skeleton
|
54
|
+
menu.choice name: 'console (pry)', value: :console
|
55
|
+
menu.choice name: 'exit', value: :exit
|
56
|
+
end
|
57
|
+
rescue TTY::Reader::InputInterrupt
|
58
|
+
exit 0
|
59
|
+
end
|
60
|
+
|
61
|
+
#=======================================================
|
62
|
+
end
|
63
|
+
#=======================================================
|
64
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Run Command for CLI
|
4
|
+
module Bundle
|
5
|
+
def self.build!(args, context)
|
6
|
+
return if Settings.gems.empty?
|
7
|
+
|
8
|
+
@context = context
|
9
|
+
|
10
|
+
if Settings.config[:bundle_digest] == digest && !args.include?('bundle')
|
11
|
+
LogBot.info('Gems Bundle', 'Nothing New')
|
12
|
+
return unless args.include?('bundle')
|
13
|
+
else
|
14
|
+
LogBot.info('Gems Bundle', 'Bundling')
|
15
|
+
end
|
16
|
+
|
17
|
+
idx = collect
|
18
|
+
|
19
|
+
do_the_bundle(idx)
|
20
|
+
|
21
|
+
Settings.update(:bundle_digest, digest)
|
22
|
+
rescue TTY::Reader::InputInterrupt
|
23
|
+
exit 0
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.do_the_bundle(idx)
|
27
|
+
# Make Directory `app/drakkon` if it doesn't exist
|
28
|
+
FileUtils.mkdir_p('app/drakkon') unless File.directory?('app/drakkon')
|
29
|
+
|
30
|
+
# Touch the file if it doesn't exist
|
31
|
+
FileUtils.touch(bundle_file) unless File.exist?(bundle_file)
|
32
|
+
|
33
|
+
File.open(bundle_file, 'w') do |f|
|
34
|
+
# Index Writer
|
35
|
+
idx.keys.sort.reverse.each do |i|
|
36
|
+
idx[i].each do |file|
|
37
|
+
f << File.read(file)
|
38
|
+
f << "\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Include other files
|
43
|
+
f << "require 'app/drakkon/image_index.rb' \n" if Settings.image_index?
|
44
|
+
f << "require 'app/drakkon/manifest.rb' \n" if Settings.manifest?
|
45
|
+
|
46
|
+
# File Close
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.collect
|
51
|
+
idx = {}
|
52
|
+
Settings.gems.each_value do |gem|
|
53
|
+
case gem[:source].to_sym
|
54
|
+
when :local then collect_local_source(idx, gem)
|
55
|
+
else
|
56
|
+
LogBot.fatal('Bundle', "Invalid Source: #{gem[:source].pastel(:red)}")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
idx
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.collect_local_source(idx, gem)
|
64
|
+
path = gem[:data][:path]
|
65
|
+
|
66
|
+
# Modules
|
67
|
+
gem[:data][:modules].each do |mod|
|
68
|
+
idx[mod.weight] ||= []
|
69
|
+
mod.files.each do |file|
|
70
|
+
file_name = "#{path}/#{file}.rb"
|
71
|
+
unless File.exist?(file_name)
|
72
|
+
LogBot.fatal('Bundle',
|
73
|
+
"Module File not found #{mod.name.pastel(:bright_blue)}, #{file_name.pastel(:red)}")
|
74
|
+
next
|
75
|
+
end
|
76
|
+
|
77
|
+
idx[mod.weight].push file_name
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Files
|
82
|
+
if gem[:data].key?(:files)
|
83
|
+
gem[:data][:files].each_value do |f|
|
84
|
+
idx[f.weight] ||= []
|
85
|
+
idx[f.weight].push "#{path}/#{f.file}"
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
# Return
|
91
|
+
end
|
92
|
+
|
93
|
+
# ====================================================
|
94
|
+
# General Helpers
|
95
|
+
# ====================================================
|
96
|
+
def self.bundle_file
|
97
|
+
"#{drakkon_dir}/bundle.rb"
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.drakkon_dir
|
101
|
+
"#{@context}/app/drakkon"
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.prompt
|
105
|
+
TTY::Prompt.new(active_color: :cyan)
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.digest
|
109
|
+
Digest::MD5.hexdigest Settings.gems.to_s
|
110
|
+
end
|
111
|
+
|
112
|
+
#=======================================================
|
113
|
+
end
|
114
|
+
#=======================================================
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Run Command for CLI
|
4
|
+
module CLI
|
5
|
+
def self.args(raw = [])
|
6
|
+
@args ||= raw
|
7
|
+
|
8
|
+
@args
|
9
|
+
end
|
10
|
+
|
11
|
+
# General Run
|
12
|
+
def self.init!(raw)
|
13
|
+
args(raw)
|
14
|
+
cmd = args.shift
|
15
|
+
|
16
|
+
start(cmd&.to_sym)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.start(cmd)
|
20
|
+
case cmd
|
21
|
+
when :install then Gems::Install.start(args)
|
22
|
+
when :configure then Gems::Configure.start(args)
|
23
|
+
|
24
|
+
else
|
25
|
+
start(menu)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.prompt
|
30
|
+
TTY::Prompt.new(active_color: :cyan)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.menu
|
34
|
+
prompt.select('Wat do?', filter: true) do |menu|
|
35
|
+
menu.choice name: 'install (New Gem)', value: :install
|
36
|
+
menu.choice name: 'configure', value: :configure unless Settings.gems.empty?
|
37
|
+
end
|
38
|
+
rescue TTY::Reader::InputInterrupt
|
39
|
+
exit 0
|
40
|
+
end
|
41
|
+
|
42
|
+
#=======================================================
|
43
|
+
end
|
44
|
+
#=======================================================
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Run Command for CLI
|
4
|
+
module Configure
|
5
|
+
def self.opts
|
6
|
+
@opts
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.start(args)
|
10
|
+
if Settings.gems.empty?
|
11
|
+
LogBot.fatal('Gem Configure', 'No gems! Install one first!')
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
15
|
+
# Allow CLI/Gem Edit
|
16
|
+
# TODO: Refactor
|
17
|
+
# This feels pretty icky, would probably be good to refactor when my brain is working
|
18
|
+
gem_name = args.shift&.to_sym
|
19
|
+
gem_name = nil if !gem_name.nil? && !Settings.gems.keys.include?(gem_name)
|
20
|
+
|
21
|
+
gem_name = gem_select if gem_name.nil?
|
22
|
+
# ======================================================================
|
23
|
+
|
24
|
+
# Initial Opts
|
25
|
+
initial_opt = args.shift&.to_sym
|
26
|
+
|
27
|
+
case initial_opt || modify_options(gem_name)
|
28
|
+
when :modules
|
29
|
+
gem = Gem.new
|
30
|
+
gem.edit(gem_name, Settings.gems[gem_name], :modules)
|
31
|
+
when :files
|
32
|
+
gem = Gem.new
|
33
|
+
gem.edit(gem_name, Settings.gems[gem_name], :files)
|
34
|
+
|
35
|
+
when :delete
|
36
|
+
LogBot.info('Gem', "Removing #{gem_name.pastel(:bright_blue)}")
|
37
|
+
Settings.gems.delete gem_name
|
38
|
+
Settings.write
|
39
|
+
when :refresh
|
40
|
+
LogBot.info('Gem', "Refreshing #{gem_name.pastel(:bright_blue)} Modules")
|
41
|
+
gem = Gem.new
|
42
|
+
gem.edit(gem_name, Settings.gems[gem_name], :refresh)
|
43
|
+
end
|
44
|
+
rescue TTY::Reader::InputInterrupt
|
45
|
+
exit 0
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.gem_select
|
49
|
+
prompt.select('Which gem do you want to edit?:', filter: true) do |menu|
|
50
|
+
Settings.gems.each_key do |gem|
|
51
|
+
menu.choice name: gem, value: gem
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.modify_options(gem_name)
|
57
|
+
prompt.select("Editing #{gem_name.pastel(:bright_blue)}. What do you want to do?", filter: true) do |menu|
|
58
|
+
menu.choice name: 'Edit Modules', value: :modules
|
59
|
+
menu.choice name: 'Edit Files', value: :files
|
60
|
+
menu.choice name: 'Refresh Modules', value: :refresh
|
61
|
+
menu.choice name: 'Remove', value: :remove
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.prompt
|
66
|
+
TTY::Prompt.new(active_color: :cyan)
|
67
|
+
end
|
68
|
+
|
69
|
+
#=======================================================
|
70
|
+
end
|
71
|
+
#=======================================================
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# Placeholders
|
4
|
+
module GemHelpers
|
5
|
+
end
|
6
|
+
|
7
|
+
# General Encompasing thingy
|
8
|
+
class Gem
|
9
|
+
include GemHelpers
|
10
|
+
attr_accessor :args, :opts, :name, :data, :source, :config, :modules
|
11
|
+
|
12
|
+
def initialize(opts = {})
|
13
|
+
@opts = opts
|
14
|
+
@data = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def edit(name, details, action = :modules)
|
18
|
+
@name = name.to_sym
|
19
|
+
@source = details[:source]
|
20
|
+
@data = details[:data]
|
21
|
+
do_the_check(installing: false)
|
22
|
+
|
23
|
+
case action
|
24
|
+
when :modules then select_modules
|
25
|
+
when :files then select_files
|
26
|
+
when :refresh then refresh_modules
|
27
|
+
end
|
28
|
+
|
29
|
+
update_gem_data
|
30
|
+
end
|
31
|
+
|
32
|
+
def intall_setup(args)
|
33
|
+
@args = args
|
34
|
+
source_setup
|
35
|
+
do_the_check
|
36
|
+
select_modules
|
37
|
+
|
38
|
+
update_gem_data
|
39
|
+
end
|
40
|
+
|
41
|
+
def update_gem_data
|
42
|
+
gem_data = {
|
43
|
+
source:,
|
44
|
+
data:
|
45
|
+
}
|
46
|
+
|
47
|
+
Settings.gems[name.to_sym] = gem_data
|
48
|
+
Settings.write
|
49
|
+
end
|
50
|
+
|
51
|
+
def prompt_source; end
|
52
|
+
# ========================================================================
|
53
|
+
end
|
54
|
+
# ========================================================================
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Drakkon
|
2
|
+
module Gems
|
3
|
+
# General Helpers for Gem Class
|
4
|
+
module GemHelpers
|
5
|
+
def do_the_check(installing: true)
|
6
|
+
unless File.exist? config_file
|
7
|
+
LogBot.fatal('Gem', "Drakkon config file not found! #{config_file}")
|
8
|
+
exit 0
|
9
|
+
end
|
10
|
+
|
11
|
+
# Validate Config Structure
|
12
|
+
read_config
|
13
|
+
|
14
|
+
# Valid Structure - Name
|
15
|
+
valid_structure?
|
16
|
+
|
17
|
+
# Validate / Find Valid Modules
|
18
|
+
load_modules
|
19
|
+
|
20
|
+
# Check for Conflict
|
21
|
+
return if installing == false
|
22
|
+
|
23
|
+
if Settings.config[:gems].key?(name)
|
24
|
+
LogBot.fatal('Gem', 'Duplicate Gem already installed')
|
25
|
+
exit 0
|
26
|
+
end
|
27
|
+
|
28
|
+
# I hate the other syntax
|
29
|
+
:return
|
30
|
+
end
|
31
|
+
|
32
|
+
def valid_structure?
|
33
|
+
unless config.key? :name
|
34
|
+
LogBot.fatal('Gem', 'Name not found!')
|
35
|
+
exit 0
|
36
|
+
end
|
37
|
+
|
38
|
+
@name = config[:name].to_sym
|
39
|
+
|
40
|
+
# Validate Versioning
|
41
|
+
valid_version?
|
42
|
+
end
|
43
|
+
|
44
|
+
def valid_version?
|
45
|
+
unless config.key? :version
|
46
|
+
LogBot.fatal('Gem', 'Version not found')
|
47
|
+
exit 0
|
48
|
+
end
|
49
|
+
|
50
|
+
Semantic::Version.new config[:version]
|
51
|
+
rescue StandardError => e
|
52
|
+
LogBot.fatal('Gem',
|
53
|
+
"Invalid Version: #{config[:version].pastel.to_s.pastel(:green)}; #{e.message.pastel(:yellow)}")
|
54
|
+
exit 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_modules
|
58
|
+
@modules = config[:modules].select do |mod|
|
59
|
+
valid_mod?(mod)
|
60
|
+
end
|
61
|
+
|
62
|
+
return unless module_duplicates?
|
63
|
+
|
64
|
+
LogBot.fatal('Gem', "Duplicate Modules: #{module_duplicates}")
|
65
|
+
exit 0
|
66
|
+
end
|
67
|
+
|
68
|
+
def valid_mod?(mod)
|
69
|
+
unless mod.key?(:name)
|
70
|
+
LogBot.fatal('Gem', "Invalid Mod. No name found: #{mod}")
|
71
|
+
return false
|
72
|
+
end
|
73
|
+
|
74
|
+
unless files_exist?(mod[:files])
|
75
|
+
LogBot.fatal('Gem', "Invalid Mod: Not all files found: #{mod}")
|
76
|
+
return false
|
77
|
+
end
|
78
|
+
|
79
|
+
true
|
80
|
+
end
|
81
|
+
|
82
|
+
def files_exist?(files)
|
83
|
+
files.all? do |file|
|
84
|
+
if File.exist?("#{data[:path]}/#{file}.rb")
|
85
|
+
true
|
86
|
+
else
|
87
|
+
LogBot.fatal('Gem', "Missing File: #{file.pastel(:red)}")
|
88
|
+
exit 1
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def module_index
|
94
|
+
modules.map(&:name)
|
95
|
+
end
|
96
|
+
|
97
|
+
# Helper to make easier to identify dupes
|
98
|
+
def module_duplicates
|
99
|
+
module_index.tally.select { |_, count| count > 1 }.keys
|
100
|
+
end
|
101
|
+
|
102
|
+
def module_duplicates?
|
103
|
+
module_index.count != module_index.uniq.count
|
104
|
+
end
|
105
|
+
|
106
|
+
# =============================================================
|
107
|
+
end
|
108
|
+
# =============================================================
|
109
|
+
end
|
110
|
+
end
|