mysh 0.3.0 → 0.4.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 +4 -4
- data/README.md +95 -28
- data/lib/mysh.rb +13 -39
- data/lib/mysh/binding_wrapper.rb +21 -0
- data/lib/mysh/exceptions.rb +4 -0
- data/lib/mysh/expression.rb +11 -4
- data/lib/mysh/external_ruby.rb +20 -7
- data/lib/mysh/globalize.rb +18 -0
- data/lib/mysh/handlebars.rb +0 -3
- data/lib/mysh/init.rb +26 -0
- data/lib/mysh/internal/action.rb +7 -2
- data/lib/mysh/internal/action_pool.rb +9 -4
- data/lib/mysh/internal/actions/command_line.rb +56 -0
- data/lib/mysh/internal/actions/command_line/debug.rb +39 -0
- data/lib/mysh/internal/actions/command_line/init.rb +50 -0
- data/lib/mysh/internal/actions/command_line/load.rb +25 -0
- data/lib/mysh/internal/actions/command_line/post_prompt.rb +44 -0
- data/lib/mysh/internal/actions/command_line/pre_prompt.rb +44 -0
- data/lib/mysh/internal/actions/command_line/prompt.rb +42 -0
- data/lib/mysh/internal/actions/command_line/quit.rb +19 -0
- data/lib/mysh/internal/actions/command_line/usage.rb +23 -0
- data/lib/mysh/internal/actions/comment.rb +20 -0
- data/lib/mysh/internal/actions/elapsed.rb +27 -0
- data/lib/mysh/internal/actions/exit.rb +2 -3
- data/lib/mysh/internal/actions/gls.rb +1 -1
- data/lib/mysh/internal/actions/help/expr.txt +6 -9
- data/lib/mysh/internal/actions/help/quick.txt +6 -0
- data/lib/mysh/internal/actions/help/sub_help.rb +1 -0
- data/lib/mysh/internal/actions/help/usage.txt +8 -0
- data/lib/mysh/internal/actions/help/vars.txt +2 -2
- data/lib/mysh/internal/actions/load.rb +42 -0
- data/lib/mysh/internal/actions/quit.rb +18 -0
- data/lib/mysh/internal/actions/say.rb +20 -0
- data/lib/mysh/internal/actions/show/env.rb +13 -11
- data/lib/mysh/internal/actions/type.rb +4 -3
- data/lib/mysh/internal/actions/vars.rb +5 -5
- data/lib/mysh/internal/manage.rb +1 -1
- data/lib/mysh/process.rb +52 -0
- data/lib/mysh/quick.rb +3 -1
- data/lib/mysh/shell_variables.rb +0 -1
- data/lib/mysh/sources/console.rb +44 -0
- data/lib/mysh/{user_input → sources}/parse.rb +1 -1
- data/lib/mysh/{user_input/smart_source.rb → sources/smart_auto_complete.rb} +1 -1
- data/lib/mysh/sources/string.rb +33 -0
- data/lib/mysh/user_input.rb +14 -30
- data/lib/mysh/version.rb +1 -1
- data/samples/load.rb +6 -0
- data/samples/script.mysh +11 -0
- data/samples/sleep.rb +6 -0
- data/samples/sleep.txt +2 -0
- data/tests/my_shell_tests.rb +6 -4
- metadata +30 -5
- data/lib/mysh/shell_variables/globalize.rb +0 -9
data/lib/mysh/internal/action.rb
CHANGED
@@ -19,8 +19,8 @@ module Mysh
|
|
19
19
|
|
20
20
|
#Parse the string and call the action.
|
21
21
|
def quick_parse_and_call(str)
|
22
|
-
call(Mysh.parse_args(str[1
|
23
|
-
:
|
22
|
+
call(Mysh.parse_args(str[1..-1].chomp))
|
23
|
+
:internal
|
24
24
|
end
|
25
25
|
|
26
26
|
#Get information about the action.
|
@@ -33,6 +33,11 @@ module Mysh
|
|
33
33
|
@exec_binding.eval(str)
|
34
34
|
end
|
35
35
|
|
36
|
+
#Get the name without any argument descriptions.
|
37
|
+
def short_name
|
38
|
+
name.split[0] || ""
|
39
|
+
end
|
40
|
+
|
36
41
|
private
|
37
42
|
|
38
43
|
#Create a binding for mysh to execute expressions in.
|
@@ -20,15 +20,20 @@ module Mysh
|
|
20
20
|
@pool[index]
|
21
21
|
end
|
22
22
|
|
23
|
+
#Does this action exist?
|
24
|
+
def exists?(index)
|
25
|
+
@pool.has_key?(index)
|
26
|
+
end
|
27
|
+
|
23
28
|
#Add an action to the pool.
|
24
29
|
def add_action(action)
|
25
|
-
|
30
|
+
short_name = action.short_name
|
26
31
|
|
27
|
-
if @pool.key?(
|
28
|
-
fail "Add error: Action #{
|
32
|
+
if @pool.key?(short_name)
|
33
|
+
fail "Add error: Action #{short_name.inspect} already exists in #{pool_name}."
|
29
34
|
end
|
30
35
|
|
31
|
-
@pool[
|
36
|
+
@pool[short_name] = action
|
32
37
|
end
|
33
38
|
|
34
39
|
#Get information on all actions.
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line.rb -- The mysh internal command line option.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
# Action pool of command line options.
|
7
|
+
COMMAND_LINE = ActionPool.new("COMMAND_LINE")
|
8
|
+
|
9
|
+
#* mysh/internal/actions/command_line.rb -- The mysh internal command line option.
|
10
|
+
class CommandOption < Action
|
11
|
+
|
12
|
+
#Execute a pre-boot command line option.
|
13
|
+
def pre_boot(_args); end
|
14
|
+
|
15
|
+
#Execute a post-boot command line option.
|
16
|
+
def post_boot(_args); end
|
17
|
+
|
18
|
+
alias :call :pre_boot
|
19
|
+
|
20
|
+
#Get an argument for an option.
|
21
|
+
def get_arg(read_point)
|
22
|
+
result = read_point.next
|
23
|
+
fail if COMMAND_LINE.exists?(result)
|
24
|
+
result
|
25
|
+
rescue
|
26
|
+
fail "Error in #{short_name.inspect}: Invalid argument: #{result.inspect}"
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
#Execute command line options.
|
32
|
+
#<br>Endemic Code Smells
|
33
|
+
#* :reek:TooManyStatements
|
34
|
+
def self.process_command_args(args, phase)
|
35
|
+
read_point = args.each
|
36
|
+
|
37
|
+
loop do
|
38
|
+
next_option = read_point.next
|
39
|
+
next_command = COMMAND_LINE[next_option]
|
40
|
+
raise "Error: Invalid option #{next_option.inspect}" unless next_command
|
41
|
+
next_command.send(phase, read_point)
|
42
|
+
end
|
43
|
+
|
44
|
+
rescue => err
|
45
|
+
unless (msg = err.to_s).empty?
|
46
|
+
puts "", msg, ""
|
47
|
+
end
|
48
|
+
|
49
|
+
HELP["usage"].call([])
|
50
|
+
exit
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
#Load up the extra help actions!
|
56
|
+
Dir[Mysh::Action::ACTIONS_PATH + 'command_line/*.rb'].each {|file| require file }
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/debug.rb -- The mysh help command debug.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/debug.rb -- The mysh help command debug.
|
7
|
+
class DebugOption < CommandOption
|
8
|
+
|
9
|
+
#Execute the help command line option.
|
10
|
+
#<br>Endemic Code Smells
|
11
|
+
#* :reek:UtilityFunction
|
12
|
+
def post_boot(_args)
|
13
|
+
MNV[:debug] = "on"
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
#Add the debug command line option to the library.
|
19
|
+
desc = 'Turn on mysh debugging.'
|
20
|
+
COMMAND_LINE.add_action(DebugOption.new('--debug', desc))
|
21
|
+
COMMAND_LINE.add_action(DebugOption.new('-d', desc))
|
22
|
+
|
23
|
+
#* mysh/internal/actions/command_line/debug.rb -- The mysh help command no debug.
|
24
|
+
class NoDebugOption < CommandOption
|
25
|
+
|
26
|
+
#Execute the help command line option.
|
27
|
+
#<br>Endemic Code Smells
|
28
|
+
#* :reek:UtilityFunction
|
29
|
+
def post_boot(_args)
|
30
|
+
MNV[:debug] = "off"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
#Add the debug command line option to the library.
|
36
|
+
desc = 'Turn off mysh debugging.'
|
37
|
+
COMMAND_LINE.add_action(NoDebugOption.new('--no-debug', desc))
|
38
|
+
COMMAND_LINE.add_action(NoDebugOption.new('-nd', desc))
|
39
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/init.rb -- The mysh init and no-init commands.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/init.rb -- The mysh init command.
|
7
|
+
class InitOption < CommandOption
|
8
|
+
|
9
|
+
#Skip over the argument for pre_boot.
|
10
|
+
def pre_boot(read_point)
|
11
|
+
file_name = get_arg(read_point).decorate
|
12
|
+
|
13
|
+
if $mysh_init_file
|
14
|
+
$mysh_init_file = $mysh_init_file.in_array + [file_name]
|
15
|
+
else
|
16
|
+
$mysh_init_file = file_name
|
17
|
+
end
|
18
|
+
|
19
|
+
mysh "load #{file_name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
#Execute the init command line option.
|
23
|
+
def post_boot(read_point)
|
24
|
+
get_arg(read_point)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
#Add the init command line option to the library.
|
30
|
+
desc = 'Initialize mysh by loading the specified file.'
|
31
|
+
COMMAND_LINE.add_action(InitOption.new('--init filename', desc))
|
32
|
+
COMMAND_LINE.add_action(InitOption.new('-i filename', desc))
|
33
|
+
|
34
|
+
|
35
|
+
#* mysh/internal/actions/command_line/init.rb -- The mysh no init command.
|
36
|
+
class NoInitOption < CommandOption
|
37
|
+
|
38
|
+
#Skip over the argument for pre_boot.
|
39
|
+
def pre_boot(_args)
|
40
|
+
fail "The mysh is already initialized." if $mysh_init_file
|
41
|
+
$mysh_init_file = "<none>"
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
#Add the no init command line option to the library.
|
47
|
+
desc = 'Do not load a file to initialize mysh.'
|
48
|
+
COMMAND_LINE.add_action(NoInitOption.new('--no-init', desc))
|
49
|
+
COMMAND_LINE.add_action(NoInitOption.new('-ni', desc))
|
50
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/load.rb -- The mysh load command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/load.rb -- The mysh load command.
|
7
|
+
class LoadOption < CommandOption
|
8
|
+
|
9
|
+
#Skip over the argument for pre_boot.
|
10
|
+
def pre_boot(read_point)
|
11
|
+
get_arg(read_point)
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute the load command line option.
|
15
|
+
def post_boot(read_point)
|
16
|
+
mysh "load #{get_arg(read_point).decorate}"
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
#Add the load command line option to the library.
|
22
|
+
desc = 'Load the specified file into the mysh.'
|
23
|
+
COMMAND_LINE.add_action(LoadOption.new('--load filename', desc))
|
24
|
+
COMMAND_LINE.add_action(LoadOption.new('-l filename', desc))
|
25
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/prompt.rb -- The mysh post prompt command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/post_prompt.rb -- The mysh post prompt command.
|
7
|
+
class PostpromptOption < CommandOption
|
8
|
+
|
9
|
+
#Skip over the argument for pre_boot.
|
10
|
+
def pre_boot(read_point)
|
11
|
+
get_arg(read_point)
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute the prompt command line option.
|
15
|
+
#<br>Endemic Code Smells
|
16
|
+
#* :reek:UtilityFunction
|
17
|
+
def post_boot(read_point)
|
18
|
+
MNV[:post_prompt] = get_arg(read_point)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
#Add the post prompt command line option to the library.
|
24
|
+
desc = 'Set the mysh line continuation prompt to "str".'
|
25
|
+
COMMAND_LINE.add_action(PostpromptOption.new('--post-prompt "str"', desc))
|
26
|
+
COMMAND_LINE.add_action(PostpromptOption.new('-pp "str"', desc))
|
27
|
+
|
28
|
+
#* mysh/internal/actions/command_line/post_prompt.rb -- The mysh command no post prompt.
|
29
|
+
class NoPostpromptOption < CommandOption
|
30
|
+
|
31
|
+
#Execute the no post prompt command line option.
|
32
|
+
#<br>Endemic Code Smells
|
33
|
+
#* :reek:UtilityFunction
|
34
|
+
def post_boot(_args)
|
35
|
+
MNV[:post_prompt] = ""
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
#Add the prompt command line option to the library.
|
41
|
+
desc = 'Turn off mysh post prompting.'
|
42
|
+
COMMAND_LINE.add_action(NoPostpromptOption.new('--no-post-prompt', desc))
|
43
|
+
COMMAND_LINE.add_action(NoPostpromptOption.new('-npp', desc))
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/prompt.rb -- The mysh pre_prompt command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/pre_prompt.rb -- The mysh pre_prompt command.
|
7
|
+
class PrepromptOption < CommandOption
|
8
|
+
|
9
|
+
#Skip over the argument for pre_boot.
|
10
|
+
def pre_boot(read_point)
|
11
|
+
get_arg(read_point)
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute the prompt command line option.
|
15
|
+
#<br>Endemic Code Smells
|
16
|
+
#* :reek:UtilityFunction
|
17
|
+
def post_boot(read_point)
|
18
|
+
MNV[:pre_prompt] = get_arg(read_point)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
#Add the pre prompt command line option to the library.
|
24
|
+
desc = 'Set the mysh pre prompt to "str".'
|
25
|
+
COMMAND_LINE.add_action(PrepromptOption.new('--pre-prompt "str"', desc))
|
26
|
+
COMMAND_LINE.add_action(PrepromptOption.new('-pr "str"', desc))
|
27
|
+
|
28
|
+
#* mysh/internal/actions/command_line/pre_prompt.rb -- The mysh command no pre_prompt.
|
29
|
+
class NoPrepromptOption < CommandOption
|
30
|
+
|
31
|
+
#Execute the no pre_prompt command line option.
|
32
|
+
#<br>Endemic Code Smells
|
33
|
+
#* :reek:UtilityFunction
|
34
|
+
def post_boot(_args)
|
35
|
+
MNV[:pre_prompt] = ""
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
#Add the prompt command line option to the library.
|
41
|
+
desc = 'Turn off mysh pre prompting.'
|
42
|
+
COMMAND_LINE.add_action(NoPrepromptOption.new('--no-pre-prompt', desc))
|
43
|
+
COMMAND_LINE.add_action(NoPrepromptOption.new('-npr', desc))
|
44
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/prompt.rb -- The mysh prompt command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/prompt.rb -- The mysh prompt command.
|
7
|
+
class PromptOption < CommandOption
|
8
|
+
|
9
|
+
#Skip over the argument for pre_boot.
|
10
|
+
def pre_boot(read_point)
|
11
|
+
get_arg(read_point)
|
12
|
+
end
|
13
|
+
|
14
|
+
#Execute the prompt command line option.
|
15
|
+
def post_boot(read_point)
|
16
|
+
MNV[:prompt] = get_arg(read_point)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
#Add the prompt command line option to the library.
|
22
|
+
desc = 'Set the mysh prompt to "str".'
|
23
|
+
COMMAND_LINE.add_action(PromptOption.new('--prompt "str"', desc))
|
24
|
+
COMMAND_LINE.add_action(PromptOption.new('-p "str"', desc))
|
25
|
+
|
26
|
+
#* mysh/internal/actions/command_line/prompt.rb -- The mysh prompt command no prompt.
|
27
|
+
class NoPromptOption < CommandOption
|
28
|
+
|
29
|
+
#Execute the no prompt command line option.
|
30
|
+
#<br>Endemic Code Smells
|
31
|
+
#* :reek:UtilityFunction
|
32
|
+
def post_boot(_args)
|
33
|
+
MNV[:prompt] = ""
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
#Add the prompt command line option to the library.
|
39
|
+
desc = 'Turn off mysh prompting.'
|
40
|
+
COMMAND_LINE.add_action(NoPromptOption.new('--no-prompt', desc))
|
41
|
+
COMMAND_LINE.add_action(NoPromptOption.new('-np', desc))
|
42
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/quit.rb -- The mysh quit command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/quit.rb -- The mysh quit command.
|
7
|
+
class QuitOption < CommandOption
|
8
|
+
|
9
|
+
#Execute the quit command line option.
|
10
|
+
def post_boot(_args)
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
#Add the quit command line option to the library.
|
17
|
+
desc = 'Quit out of the mysh program.'
|
18
|
+
COMMAND_LINE.add_action(QuitOption.new('--quit', desc))
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/command_line/usage.rb -- The mysh help command usage.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/command_line/usage.rb -- The mysh help command usage.
|
7
|
+
class UsageOption < CommandOption
|
8
|
+
|
9
|
+
#Execute the help command line option. (Punt to error handler with no msg)
|
10
|
+
def pre_boot(_args)
|
11
|
+
raise ""
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
#Add the usage command line option to the library.
|
17
|
+
desc = 'Display mysh usage info and exit.'
|
18
|
+
|
19
|
+
USAGE = UsageOption.new('--help', desc)
|
20
|
+
COMMAND_LINE.add_action(USAGE)
|
21
|
+
COMMAND_LINE.add_action(UsageOption.new('-h', desc))
|
22
|
+
COMMAND_LINE.add_action(UsageOption.new('-?', desc))
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/comment.rb -- A mysh internal comment.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/comment.rb -- A mysh internal comment.
|
7
|
+
class MyshComment < Action
|
8
|
+
|
9
|
+
#Ignore a comment.
|
10
|
+
def call(_args)
|
11
|
+
:internal
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
#Add comments to the library.
|
17
|
+
desc = 'A mysh comment. No action taken'
|
18
|
+
MYSH_COMMENT = MyshComment.new('#<stuff>', desc)
|
19
|
+
COMMANDS.add_action(MYSH_COMMENT)
|
20
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* mysh/internal/actions/elapsed.rb -- The mysh internal elapsed command.
|
4
|
+
module Mysh
|
5
|
+
|
6
|
+
#* mysh/internal/actions/elapsed.rb -- The mysh internal elapsed command.
|
7
|
+
class TimedCommand < Action
|
8
|
+
|
9
|
+
#Execute the elapsed command.
|
10
|
+
#<br>Endemic Code Smells
|
11
|
+
#* :reek:DuplicateMethodCall -- needed due to time side effects.
|
12
|
+
def call(str)
|
13
|
+
start_time = Time.now
|
14
|
+
Mysh.try_execute_command(str[1..-1])
|
15
|
+
end_time = Time.now
|
16
|
+
|
17
|
+
puts "Elapsed execution time = #{"%.3f" % (end_time - start_time)} seconds."
|
18
|
+
:internal
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
#Add the elapsed commands to the library.
|
24
|
+
desc = 'Execute a command and then display the elapsed time.'
|
25
|
+
TIMED_COMMAND = TimedCommand.new('%<command>', desc)
|
26
|
+
COMMANDS.add_action(TIMED_COMMAND)
|
27
|
+
end
|