ezycli 1.0
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/bin/ezycli +2 -0
- data/lib/cli.rb +122 -0
- data/lib/plugins/ezycli.rb +66 -0
- data/lib/plugins/history.rb +33 -0
- data/lib/plugins/load.rb +47 -0
- data/lib/plugins/plugs.rb +45 -0
- data/lib/plugins/reload.rb +22 -0
- data/lib/plugins/silence.rb +7 -0
- data/lib/plugins/unload.rb +36 -0
- data/lib/plugins/zlisten.rb +21 -0
- data/lib/plugs/php/hello-world.php +2 -0
- data/lib/vars.rb +11 -0
- metadata +97 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7e64cd48f3f2a4fde16b8ba9db52814a63754c0507c34e5670768ad318f004f5
|
4
|
+
data.tar.gz: c4071c9cc1b7b323ccda055768298d088734c13dd11749736bc85acc6cc0808e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4283c2f58724ba17967e8c38dc0cceb30d8746f519d7e650145e3b1a7c8e432d3653399238e56a246e0cec2c97c42d67049cc601b60dc6fd34754420c093f133
|
7
|
+
data.tar.gz: beac34e32e949527128c52a923db2097927b42fe92a32342c7a1809f44d731c5c576873de754d023405e770d7781fc5682de389fc61f9254a8478c943c3c83c9
|
data/bin/ezycli
ADDED
data/lib/cli.rb
ADDED
@@ -0,0 +1,122 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# SETUP # DO NOT REMOVE ME # THIS SETS UP THE CORRECT COLORS AND LAYOUTS FOR THE APPLICATION
|
4
|
+
# Require the variables that make this application run.
|
5
|
+
require("#{File.expand_path(File.dirname(__FILE__))}/vars.rb")
|
6
|
+
require 'listen'
|
7
|
+
require 'active_support'
|
8
|
+
require 'active_support/core_ext'
|
9
|
+
require 'fileutils'
|
10
|
+
|
11
|
+
# COLORS!
|
12
|
+
def colorize(text, color = "default", bgColor = "default")
|
13
|
+
colors = {"default" => "38","black" => "30","red" => "31","green" => "32","brown" => "33", "blue" => "34", "purple" => "35",
|
14
|
+
"cyan" => "36", "gray" => "37", "dark gray" => "1;30", "light red" => "1;31", "light green" => "1;32", "yellow" => "1;33",
|
15
|
+
"light blue" => "1;34", "light purple" => "1;35", "light cyan" => "1;36", "white" => "1;37"}
|
16
|
+
bgColors = {"default" => "0", "black" => "40", "red" => "41", "green" => "42", "brown" => "43", "blue" => "44",
|
17
|
+
"purple" => "45", "cyan" => "46", "gray" => "47", "dark gray" => "100", "light red" => "101", "light green" => "102",
|
18
|
+
"yellow" => "103", "light blue" => "104", "light purple" => "105", "light cyan" => "106", "white" => "107"}
|
19
|
+
color_code = colors[color]
|
20
|
+
bgColor_code = bgColors[bgColor]
|
21
|
+
return "\033[#{bgColor_code};#{color_code}m#{text}\033[0m"
|
22
|
+
end
|
23
|
+
|
24
|
+
# Color mappings
|
25
|
+
def info
|
26
|
+
return colorize("[INFO] ", "green")
|
27
|
+
end
|
28
|
+
def warning
|
29
|
+
return colorize("[WARNING] ", "yellow")
|
30
|
+
end
|
31
|
+
def error
|
32
|
+
return colorize("[ERROR] ", "red")
|
33
|
+
end
|
34
|
+
def debug
|
35
|
+
return colorize("[DEBUG] ", "blue")
|
36
|
+
end
|
37
|
+
|
38
|
+
def exit_handler
|
39
|
+
if !@newline
|
40
|
+
puts ""
|
41
|
+
end
|
42
|
+
begin
|
43
|
+
save_history
|
44
|
+
rescue NoMethodError => e
|
45
|
+
puts "#{error}Unable to save history!"
|
46
|
+
end
|
47
|
+
puts "#{debug}Exiting ezyCLI"
|
48
|
+
puts "#{info}Have a great day!"
|
49
|
+
end
|
50
|
+
|
51
|
+
# END APPLICATION SETUP BLOCK #
|
52
|
+
|
53
|
+
# Start by first loading all known plugins. This reads the plugin from disk.
|
54
|
+
# TODO: Extend to allow plugin dependencies, i.e. load the plugins this one requires before loading this one.
|
55
|
+
unless File.directory?(File.expand_path("~/.ezycli/plugins"))
|
56
|
+
puts "#{info}Creating plugin directory"
|
57
|
+
FileUtils.mkdir_p(File.expand_path("~/.ezycli/plugins"))
|
58
|
+
end
|
59
|
+
unless File.directory?(File.expand_path("~/.ezycli/plugs/php"))
|
60
|
+
puts "#{info}Creating plugs directory"
|
61
|
+
FileUtils.mkdir_p(File.expand_path("~/.ezycli/plugs/php"))
|
62
|
+
end
|
63
|
+
def application_start
|
64
|
+
Dir["#{File.expand_path(File.dirname(__FILE__))}/plugins/*.rb"].sort.each do |file|
|
65
|
+
puts "#{debug}Loading application plugin #{File.basename(file, ".rb")}"
|
66
|
+
require file
|
67
|
+
@plugin_counter += 1
|
68
|
+
@plugin_array.push(File.basename(file))
|
69
|
+
begin
|
70
|
+
@plugin_help.push(plugin_help) unless @plugin_help.include? plugin_help
|
71
|
+
rescue NameError => e
|
72
|
+
# Do nothing if there's no such method
|
73
|
+
end
|
74
|
+
begin
|
75
|
+
@plugin_commands.merge!(plugin_commands)
|
76
|
+
rescue NameError => e
|
77
|
+
# Do nothing if theunlessre's no such method
|
78
|
+
end
|
79
|
+
begin
|
80
|
+
@plugin_associations.merge!(plugin_associations)
|
81
|
+
rescue NameError => e
|
82
|
+
# Do nothing if there's no such method
|
83
|
+
end
|
84
|
+
end
|
85
|
+
begin
|
86
|
+
load_history
|
87
|
+
rescue NoMethodError => e
|
88
|
+
puts "#{error}Unable to load history!"
|
89
|
+
end
|
90
|
+
puts "#{info}Attempting to load user plugins from #{File.expand_path(File.dirname("~/.ezycli/plugins"))}"
|
91
|
+
Dir["#{File.expand_path("~/.ezycli/plugins")}/*.rb"].sort.each do |file|
|
92
|
+
puts "#{debug}Loading user plugin #{File.basename(file, ".rb")}"
|
93
|
+
require file
|
94
|
+
@plugin_counter += 1
|
95
|
+
@plugin_array.push(File.basename(file))
|
96
|
+
begin
|
97
|
+
@plugin_help.push(plugin_help) unless @plugin_help.include? plugin_help
|
98
|
+
rescue NameError => e
|
99
|
+
# Do nothing if there's no such method
|
100
|
+
end
|
101
|
+
begin
|
102
|
+
@plugin_commands.merge!(plugin_commands)
|
103
|
+
rescue NameError => e
|
104
|
+
# Do nothing if there's no such method
|
105
|
+
end
|
106
|
+
begin
|
107
|
+
@plugin_associations.merge!(plugin_associations)
|
108
|
+
rescue NameError => e
|
109
|
+
# Do nothing if there's no such method
|
110
|
+
end
|
111
|
+
end
|
112
|
+
File.open("#{File.expand_path("~/.ezycli/plugs/php")}/hello-world.php", 'w') { |file| file.write("<?php \necho 'Hello, World!';\n") } unless File.file? "#{File.expand_path("~/.ezycli/plugs/php")}/hello-world.php"
|
113
|
+
File.open("#{File.expand_path("~/.ezycli/plugins")}/test.rb", 'w') { |file| file.write("def test_function\nputs 'This is a test plugin that was automatically generated when you first ran ezyCLI'\nend\n\n############ THESE FUNCTIONS MUST EXIST ############\n\ndef plugin_commands\n# This is where you tell ezyCLI about the plugins it's to use\nreturn {\"testme\" => \"test_function\"}\nend\n\ndef plugin_associations\n# This is where you tell ezyCLI about which plugins belong to which file. I'll eventually fix that.\nreturn \"test\" => [\"testme\"]\nend") } unless File.file? "#{File.expand_path("~/.ezycli/plugins")}/test.rb"
|
114
|
+
end
|
115
|
+
|
116
|
+
# Set the exit handler
|
117
|
+
at_exit {exit_handler}
|
118
|
+
|
119
|
+
# Boot the CLI and let the user know it's now ready to be used.
|
120
|
+
application_start
|
121
|
+
cli_is_ready
|
122
|
+
cli_loop
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "readline"
|
2
|
+
|
3
|
+
# What? you thought that the CLI also wouldn't be a plugin?
|
4
|
+
def cli_is_ready
|
5
|
+
puts "#{info}Loaded #{@plugin_counter} plugin(s)!"
|
6
|
+
puts "#{info}Welcome to the ezyCLI! _stuck? try 'help'"
|
7
|
+
end
|
8
|
+
|
9
|
+
def cli_loop
|
10
|
+
loop {
|
11
|
+
begin
|
12
|
+
input = Readline.readline("ezyCLI> ", true)
|
13
|
+
if input.instance_of? String
|
14
|
+
cli_cmd(input)
|
15
|
+
else
|
16
|
+
exit 0
|
17
|
+
end
|
18
|
+
rescue SystemExit, Interrupt => e
|
19
|
+
exit 0
|
20
|
+
end
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def cli_cmd(cmd)
|
25
|
+
begin
|
26
|
+
case
|
27
|
+
when (cmd.include?("help"))
|
28
|
+
puts "help - Provides this help text"
|
29
|
+
puts "version - Shows the version of ezyCLI"
|
30
|
+
puts "exit - Exits ezyCLI"
|
31
|
+
puts @plugin_help
|
32
|
+
when (cmd.include?("exit"))
|
33
|
+
@newline = 0
|
34
|
+
exit 0
|
35
|
+
when (cmd.include?("version"))
|
36
|
+
puts "ezyCLI version 0.2.3 DEV"
|
37
|
+
when (cmd.empty?)
|
38
|
+
# blank command...
|
39
|
+
else
|
40
|
+
c = cmd.split(" ")
|
41
|
+
if c.count == 1
|
42
|
+
begin
|
43
|
+
send(@plugin_commands["#{cmd}"])
|
44
|
+
rescue ArgumentError => e
|
45
|
+
puts "#{warning}Wrong number of arguments given"
|
46
|
+
rescue TypeError => e
|
47
|
+
puts "#{warning}Unknown command: #{cmd}"
|
48
|
+
end
|
49
|
+
else
|
50
|
+
args = Array.new
|
51
|
+
begin
|
52
|
+
c[1..-1].each do |arg|
|
53
|
+
args.push(arg)
|
54
|
+
end
|
55
|
+
send(@plugin_commands["#{c[0]}"], *args)
|
56
|
+
rescue ArgumentError => e
|
57
|
+
puts "#{warning}Wrong number of arguments given"
|
58
|
+
rescue TypeError => e
|
59
|
+
puts "#{warning}Unknown command: #{cmd}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
rescue NoMethodError => e
|
64
|
+
# Nothing doing
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
def save_history
|
4
|
+
File.open("#{File.expand_path("~/.ezycli")}/.ezycli_history", 'w') { |f| f.write(YAML.dump(Readline::HISTORY.to_a))}
|
5
|
+
puts "#{info}Wrote history to #{File.expand_path("~/.ezycli")}/.ezycli_history"
|
6
|
+
end
|
7
|
+
|
8
|
+
def load_history
|
9
|
+
if File.file?("#{File.expand_path("~/.ezycli")}/.ezycli_history")
|
10
|
+
conf = YAML.load_file "#{File.expand_path("~/.ezycli")}/.ezycli_history"
|
11
|
+
conf.each do |line|
|
12
|
+
if line.present? and !line.include? "exit"
|
13
|
+
Readline::HISTORY.push(line)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
else
|
17
|
+
puts "#{info}Initialized empty history"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
############ THESE FUNCTIONS MUST EXIST ############
|
22
|
+
|
23
|
+
def plugin_commands
|
24
|
+
# I know, I know. I'll clean it up later. shhhhh
|
25
|
+
return {"save" => "save_history", "reset" => "load_history"}
|
26
|
+
end
|
27
|
+
|
28
|
+
def plugin_associations
|
29
|
+
# see the above comment.
|
30
|
+
return "history" => ["save", "reset"]
|
31
|
+
end
|
32
|
+
|
33
|
+
########### THESE FUNCTIONS MUST EXIST ############
|
data/lib/plugins/load.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# Yes, the ability to load plugins is itself a plugin. You may also not unload the plugin loader. This is a hardcoded dep for the application to run correctly
|
2
|
+
|
3
|
+
def load_plugin(plugin_name)
|
4
|
+
if @plugin_associations["plugin_name"]
|
5
|
+
puts "#{error}Cowardly refusing to load a plugin that's already loaded"
|
6
|
+
else
|
7
|
+
begin
|
8
|
+
silence_warnings {load "#{File.expand_path("~/.ezycli/plugins")}/"+plugin_name+".rb"}
|
9
|
+
begin
|
10
|
+
@plugin_help.push(plugin_help) unless @plugin_help.include? plugin_help
|
11
|
+
rescue NameError => e
|
12
|
+
# Do nothing if there's no such method
|
13
|
+
end
|
14
|
+
begin
|
15
|
+
@plugin_commands.merge!(plugin_commands)
|
16
|
+
rescue NameError => e
|
17
|
+
# Do nothing if there's no such method
|
18
|
+
end
|
19
|
+
begin
|
20
|
+
@plugin_associations.merge!(plugin_associations)
|
21
|
+
rescue NameError => e
|
22
|
+
# Do nothing if there's no such method
|
23
|
+
end
|
24
|
+
puts "#{info}Loaded plugin #{plugin_name}"
|
25
|
+
rescue Exception => e
|
26
|
+
puts "#{warning}Failed to load plugin #{plugin_name}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
############ THESE FUNCTIONS MUST EXIST ############
|
32
|
+
|
33
|
+
def plugin_help
|
34
|
+
return ["load - Loads a plugin"]
|
35
|
+
end
|
36
|
+
|
37
|
+
def plugin_commands
|
38
|
+
# I know, I know. I'll clean it up later. shhhhh
|
39
|
+
return {"load" => "load_plugin"}
|
40
|
+
end
|
41
|
+
|
42
|
+
def plugin_associations
|
43
|
+
# see the above comment.
|
44
|
+
return "load" => ["load"]
|
45
|
+
end
|
46
|
+
|
47
|
+
########### THESE FUNCTIONS MUST EXIST ############
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# WARNING: DO NOT MODIFY THIS FILE! I CANNOT BE MORE EXPLICIT!
|
2
|
+
# WARNING: THIS FILE LOADS THE RIGHT PLUG FOR THE LANGUAGE. *DO NOT TOUCH ME*!
|
3
|
+
def plug_exec(language, plugin_name)
|
4
|
+
io = IO.popen("#{language} #{File.expand_path("~/.ezycli/plugs")}/php/#{plugin_name}.php")
|
5
|
+
trap("INT") {
|
6
|
+
puts "#{info}Ctrl-C received, cleaning up"
|
7
|
+
Process.kill("INT", io.pid)
|
8
|
+
}
|
9
|
+
io.each do |line|
|
10
|
+
if line.chomp.include? "Could not open input file"
|
11
|
+
puts "#{error}Failed to run #{language} plug #{plugin_name}"
|
12
|
+
else
|
13
|
+
puts line.chomp
|
14
|
+
end
|
15
|
+
end
|
16
|
+
trap('INT', 'DEFAULT')
|
17
|
+
end
|
18
|
+
|
19
|
+
def plug_loader(language, plugin_name)
|
20
|
+
case
|
21
|
+
when (language == "php")
|
22
|
+
puts "#{warning}Plugs are limited to output only at this time"
|
23
|
+
plug_exec("php", plugin_name)
|
24
|
+
else
|
25
|
+
puts "#{error}Couldn't find suitable plug language for #{language}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
############ THESE FUNCTIONS MUST EXIST ############
|
30
|
+
|
31
|
+
def plugin_help
|
32
|
+
return ["plug - Executes a plug"]
|
33
|
+
end
|
34
|
+
|
35
|
+
def plugin_commands
|
36
|
+
# I know, I know. I'll clean it up later. shhhhh
|
37
|
+
return {"plug" => "plug_loader"}
|
38
|
+
end
|
39
|
+
|
40
|
+
def plugin_associations
|
41
|
+
# see the above comment.
|
42
|
+
return "plug" => ["plug"]
|
43
|
+
end
|
44
|
+
|
45
|
+
########### THESE FUNCTIONS MUST EXIST ############
|
@@ -0,0 +1,22 @@
|
|
1
|
+
def reload_plugin(plugin_name)
|
2
|
+
unload_plugin plugin_name
|
3
|
+
load_plugin plugin_name
|
4
|
+
end
|
5
|
+
|
6
|
+
############ THESE FUNCTIONS MUST EXIST ############
|
7
|
+
|
8
|
+
def plugin_help
|
9
|
+
return ["reload - Reloads a plugin"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def plugin_commands
|
13
|
+
# I know, I know. I'll clean it up later. shhhhh
|
14
|
+
return {"reload" => "reload_plugin"}
|
15
|
+
end
|
16
|
+
|
17
|
+
def plugin_associations
|
18
|
+
# see the above comment.
|
19
|
+
return "reload" => ["reload"]
|
20
|
+
end
|
21
|
+
|
22
|
+
########### THESE FUNCTIONS MUST EXIST ############
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# Yes, the ability to unload plugins is itself a plugin. You may also not unload the plugin unloader. This is a hardcoded dep for the application to run correctly
|
2
|
+
|
3
|
+
def unload_plugin(plugin_name)
|
4
|
+
if REQUIRED_PLUGINS.include? plugin_name
|
5
|
+
puts "#{error}Cowardly refusing to unload a core plugin"
|
6
|
+
else
|
7
|
+
begin
|
8
|
+
@plugin_associations["#{plugin_name}"].each do |ext|
|
9
|
+
@plugin_commands.delete("#{ext}")
|
10
|
+
@plugin_help.reject! {|e| e == ext}
|
11
|
+
end
|
12
|
+
@plugin_associations.delete("#{plugin_name}")
|
13
|
+
puts "#{info}Unloaded plugin #{plugin_name}"
|
14
|
+
rescue Exception => e
|
15
|
+
puts "#{warning}Failed to unload plugin #{plugin_name}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
############ THESE FUNCTIONS MUST EXIST ############
|
21
|
+
|
22
|
+
def plugin_help
|
23
|
+
return ["unload - Unloads a plugin"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def plugin_commands
|
27
|
+
# I know, I know. I'll clean it up later. shhhhh
|
28
|
+
return {"unload" => "unload_plugin"}
|
29
|
+
end
|
30
|
+
|
31
|
+
def plugin_associations
|
32
|
+
# see the above comment.
|
33
|
+
return "unload" => ["unload"]
|
34
|
+
end
|
35
|
+
|
36
|
+
########### THESE FUNCTIONS MUST EXIST ############
|
@@ -0,0 +1,21 @@
|
|
1
|
+
puts "#{debug}Setting up listeners..."
|
2
|
+
listener = Listen.to(File.expand_path("~/.ezycli/plugins")) do |modified, added, removed|
|
3
|
+
puts ""
|
4
|
+
added.each do |ext|
|
5
|
+
puts "#{info}Found new plugin! #{File.basename(ext, ".rb")}"
|
6
|
+
puts "#{debug}Autoloading plugin #{File.basename(ext, ".rb")}"
|
7
|
+
load_plugin File.basename(ext, ".rb")
|
8
|
+
end
|
9
|
+
modified.each do |ext|
|
10
|
+
puts "#{info}Detected change in plugin #{File.basename(ext, ".rb")}"
|
11
|
+
puts "#{debug}Autoreloading plugin #{File.basename(ext, ".rb")}"
|
12
|
+
reload_plugin File.basename(ext, ".rb")
|
13
|
+
end
|
14
|
+
removed.each do |ext|
|
15
|
+
puts "#{info}Detected removal of plugin #{File.basename(ext, ".rb")}"
|
16
|
+
puts "#{debug}Autounloading plugin #{File.basename(ext, ".rb")}"
|
17
|
+
unload_plugin File.basename(ext, ".rb")
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
listener.start
|
data/lib/vars.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/env ruby
|
2
|
+
|
3
|
+
@plugin_counter = 0
|
4
|
+
@plugin_array = Array.new
|
5
|
+
@plugin_help = Array.new
|
6
|
+
@plugin_commands = Hash.new
|
7
|
+
@plugin_associations = Hash.new
|
8
|
+
# The plugins you are not allowed to unload or reload. To reload these, you need to restart the application.
|
9
|
+
REQUIRED_PLUGINS = ["load", "unload", "ezycli"]
|
10
|
+
# Freeze the array, no other plugins should be immutable
|
11
|
+
REQUIRED_PLUGINS.freeze
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ezycli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '1.0'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Theo Morra
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: listen
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.5
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.1.5
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 5.2.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 5.2.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: readline
|
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'
|
55
|
+
description: The ezy way to manage your workspace
|
56
|
+
email: theo@theom.nz
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- bin/ezycli
|
62
|
+
- lib/cli.rb
|
63
|
+
- lib/plugins/ezycli.rb
|
64
|
+
- lib/plugins/history.rb
|
65
|
+
- lib/plugins/load.rb
|
66
|
+
- lib/plugins/plugs.rb
|
67
|
+
- lib/plugins/reload.rb
|
68
|
+
- lib/plugins/silence.rb
|
69
|
+
- lib/plugins/unload.rb
|
70
|
+
- lib/plugins/zlisten.rb
|
71
|
+
- lib/plugs/php/hello-world.php
|
72
|
+
- lib/vars.rb
|
73
|
+
homepage: https://github.com/td512/ezycli
|
74
|
+
licenses:
|
75
|
+
- GPL-3.0+
|
76
|
+
metadata: {}
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options: []
|
79
|
+
require_paths:
|
80
|
+
- lib
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 2.7.3
|
94
|
+
signing_key:
|
95
|
+
specification_version: 4
|
96
|
+
summary: The ezy way to manage your workspace
|
97
|
+
test_files: []
|