mysh 0.4.0 → 0.5.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.
@@ -12,14 +12,15 @@ module Mysh
12
12
  attr_reader :description
13
13
 
14
14
  #Setup an internal action.
15
- def initialize(name, description)
15
+ def initialize(name = "", description = "", &action)
16
16
  @name, @description = name, description.in_array
17
- @exec_binding = mysh_binding
17
+
18
+ define_singleton_method(:process_command, &action) if block_given?
18
19
  end
19
20
 
20
21
  #Parse the string and call the action.
21
- def quick_parse_and_call(str)
22
- call(Mysh.parse_args(str[1..-1].chomp))
22
+ def process_quick_command(input)
23
+ process_command(input.quick)
23
24
  :internal
24
25
  end
25
26
 
@@ -28,23 +29,11 @@ module Mysh
28
29
  [@name].concat(@description)
29
30
  end
30
31
 
31
- #Evaluate the string in the my shell context.
32
- def mysh_eval(str)
33
- @exec_binding.eval(str)
34
- end
35
-
36
32
  #Get the name without any argument descriptions.
37
33
  def short_name
38
34
  name.split[0] || ""
39
35
  end
40
36
 
41
- private
42
-
43
- #Create a binding for mysh to execute expressions in.
44
- def mysh_binding
45
- binding
46
- end
47
-
48
37
  end
49
38
 
50
39
  end
@@ -10,7 +10,7 @@ module Mysh
10
10
  attr_reader :pool_name
11
11
 
12
12
  #Create a new action pool
13
- def initialize(pool_name, &default_action)
13
+ def initialize(pool_name, default_action = nil)
14
14
  @pool_name, @pool = pool_name, {}
15
15
  @pool.default = default_action
16
16
  end
@@ -3,22 +3,15 @@
3
3
  #* mysh/internal/actions/cd.rb -- The mysh internal cd command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/cd.rb -- The mysh internal cd command.
7
- class CdCommand < Action
8
-
9
- #Execute the cd command.
10
- def call(args)
11
- Dir.chdir(args[0]) unless args.empty?
12
- puts Dir.pwd.decorate
13
- rescue => err
14
- puts "Error: #{err}"
15
- puts err.backtrace if MNV[:debug]
16
- end
17
-
18
- end
19
-
20
6
  #Add the cd command to the library.
21
7
  desc = 'Change directory to the optional <dir> parameter ' +
22
8
  'and then display the current working directory.'
23
- COMMANDS.add_action(CdCommand.new('cd <dir>', desc))
9
+
10
+ action = lambda do |input|
11
+ args = input.args
12
+ Dir.chdir(args[0]) unless args.empty?
13
+ puts Dir.pwd.decorate
14
+ end
15
+
16
+ COMMANDS.add_action(Action.new('cd <dir>', desc, &action))
24
17
  end
@@ -15,12 +15,12 @@ module Mysh
15
15
  #Execute a post-boot command line option.
16
16
  def post_boot(_args); end
17
17
 
18
- alias :call :pre_boot
18
+ alias :process_command :pre_boot
19
19
 
20
20
  #Get an argument for an option.
21
21
  def get_arg(read_point)
22
22
  result = read_point.next
23
- fail if COMMAND_LINE.exists?(result)
23
+ fail if COMMAND_LINE.exists?(result) #An arg should not be a command!
24
24
  result
25
25
  rescue
26
26
  fail "Error in #{short_name.inspect}: Invalid argument: #{result.inspect}"
@@ -46,7 +46,7 @@ module Mysh
46
46
  puts "", msg, ""
47
47
  end
48
48
 
49
- HELP["usage"].call([])
49
+ HELP["usage"].process_command(nil)
50
50
  exit
51
51
  end
52
52
 
@@ -3,18 +3,10 @@
3
3
  #* mysh/internal/actions/comment.rb -- A mysh internal comment.
4
4
  module Mysh
5
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
6
  #Add comments to the library.
17
7
  desc = 'A mysh comment. No action taken'
18
- MYSH_COMMENT = MyshComment.new('#<stuff>', desc)
8
+ action = lambda {|_input| :internal}
9
+
10
+ MYSH_COMMENT = Action.new('#<stuff>', desc, &action)
19
11
  COMMANDS.add_action(MYSH_COMMENT)
20
12
  end
@@ -3,25 +3,18 @@
3
3
  #* mysh/internal/actions/elapsed.rb -- The mysh internal elapsed command.
4
4
  module Mysh
5
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
6
+ #Add the elapsed commands to the library.
7
+ desc = 'Execute a command and then display the elapsed time.'
16
8
 
17
- puts "Elapsed execution time = #{"%.3f" % (end_time - start_time)} seconds."
18
- :internal
19
- end
9
+ action = lambda do |input|
10
+ start_time = Time.now
11
+ Mysh.try_execute_command(input.quick_body)
12
+ end_time = Time.now
20
13
 
14
+ puts "Elapsed execution time = #{"%.3f" % (end_time - start_time)} seconds."
15
+ :internal
21
16
  end
22
17
 
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)
18
+ TIMED_COMMAND = Action.new('%<command>', desc, &action)
26
19
  COMMANDS.add_action(TIMED_COMMAND)
27
20
  end
@@ -3,16 +3,9 @@
3
3
  #* mysh/internal/actions/exit.rb -- The mysh internal exit command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/exit.rb -- The mysh internal exit command.
7
- class ExitCommand < Action
8
-
9
- #Execute the exit command.
10
- def call(_args)
11
- raise MyshExit
12
- end
13
-
14
- end
15
-
16
6
  #Add the exit command to the library.
17
- COMMANDS.add_action(ExitCommand.new('exit', 'Exit the current mysh level.'))
7
+ desc = 'Exit the current mysh level.'
8
+ action = lambda {|_input| raise MyshExit}
9
+
10
+ COMMANDS.add_action(Action.new('exit', desc, &action))
18
11
  end
@@ -13,8 +13,8 @@ module Mysh
13
13
  end
14
14
 
15
15
  #Execute the gls command.
16
- def call(args)
17
- process_args(args)
16
+ def process_command(input)
17
+ process_args(input.args)
18
18
  gather_gems
19
19
  send(@report)
20
20
  end
@@ -4,18 +4,21 @@
4
4
  module Mysh
5
5
 
6
6
  # Help action pool of topics.
7
- HELP = ActionPool.new("HELP") do |args|
7
+ default = Action.new do |args|
8
8
  puts "No help found for #{args[0].inspect}."
9
9
  end
10
10
 
11
+ HELP = ActionPool.new("HELP", default)
12
+
11
13
  #* mysh/internal/actions/help.rb -- The mysh internal help command.
12
14
  class HelpCommand < Action
13
15
 
14
16
  #Execute a help command by routing it to a sub-command.
15
17
  #<br>Endemic Code Smells
16
18
  #* :reek:UtilityFunction
17
- def call(args)
18
- HELP[args[0] || ""].call(args)
19
+ def process_command(input)
20
+ args = input.args
21
+ HELP[args[0] || ""].process_command(args)
19
22
  end
20
23
 
21
24
  end
@@ -13,8 +13,8 @@ module Mysh
13
13
  end
14
14
 
15
15
  #Execute a help command.
16
- def call(_args)
17
- show_handlebar_file(ACTIONS_PATH + 'help/' + @file_name, self)
16
+ def process_command(_args)
17
+ mysh "load #{(ACTIONS_PATH + 'help/' + @file_name).decorate}"
18
18
  end
19
19
 
20
20
  end
@@ -13,8 +13,8 @@ module Mysh
13
13
  end
14
14
 
15
15
  #Execute the history command.
16
- def call(args)
17
- @args, @history = args, Mysh.input.history
16
+ def process_command(input)
17
+ @args, @history = input.args, Mysh.input.history
18
18
 
19
19
  #The history command should not be part of the history.
20
20
  @history.pop
@@ -3,40 +3,34 @@
3
3
  #* mysh/internal/actions/load.rb -- The mysh load command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/load.rb -- The mysh load command.
7
- class LoadCommand < Action
8
-
9
- #Execute the load command.
10
- #<br>Endemic Code Smells
11
- #* :reek:TooManyStatements
12
- def call(args)
13
- file_name = args.shift
14
-
15
- if file_name
16
- file_ext, @exec_binding = File.extname(file_name), binding
17
-
18
- if file_ext == '.mysh'
19
- Mysh.process_file(file_name)
20
- :internal
21
- elsif file_ext == '.txt'
22
- show_handlebar_file(file_name, self)
23
- :internal
24
- elsif ["", ".rb"].include?(file_ext)
25
- load file_name
26
- :internal
27
- else
28
- fail "Error: Unknown file type: #{file_name.inspect}"
29
- end
30
-
6
+ #Add the load command to the library.
7
+ desc = "Load a ruby program, mysh script, " +
8
+ "or text file into the mysh environment."
9
+
10
+ action = lambda do |input|
11
+ args = input.args
12
+ file_name = args.shift
13
+
14
+ if file_name
15
+ file_ext = File.extname(file_name)
16
+
17
+ if file_ext == '.mysh'
18
+ Mysh.process_file(file_name)
19
+ :internal
20
+ elsif file_ext == '.txt'
21
+ show_handlebar_file(file_name, BindingWrapper.new(binding))
22
+ :internal
23
+ elsif file_ext == '.rb'
24
+ load file_name
25
+ :internal
31
26
  else
32
- fail "Error: A load file must be specified."
27
+ fail "Error: Unknown file type: #{file_name.inspect}"
33
28
  end
34
29
 
30
+ else
31
+ fail "Error: A load file must be specified."
35
32
  end
36
-
37
33
  end
38
34
 
39
- #Add the load command to the library.
40
- desc = 'Load a ruby program, mysh script, or text file into the mysh environment.'
41
- COMMANDS.add_action(LoadCommand.new('load file', desc))
35
+ COMMANDS.add_action(Action.new('load file', desc, &action))
42
36
  end
@@ -3,16 +3,8 @@
3
3
  #* mysh/internal/actions/pwd.rb -- The mysh internal pwd command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/pwd.rb -- The mysh internal pwd command.
7
- class PwdCommand < Action
8
-
9
- #Execute the cd command.
10
- def call(_args)
11
- puts Dir.pwd.decorate
12
- end
13
-
14
- end
15
-
16
6
  desc = 'Display the current working directory.'
17
- COMMANDS.add_action(PwdCommand.new('pwd', desc))
7
+ action = lambda {|_input| puts Dir.pwd.decorate}
8
+
9
+ COMMANDS.add_action(Action.new('pwd', desc, &action))
18
10
  end
@@ -3,16 +3,8 @@
3
3
  #* mysh/internal/actions/quit.rb -- The mysh internal quit command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/quit.rb -- The mysh internal quit command.
7
- class QuitCommand < Action
8
-
9
- #Execute the quit command.
10
- def call(_args)
11
- exit
12
- end
13
-
14
- end
15
-
16
6
  #Add the quit command to the library.
17
- COMMANDS.add_action(QuitCommand.new('quit', 'Quit out of the mysh.'))
7
+ desc = 'Quit out of the mysh.'
8
+
9
+ COMMANDS.add_action(Action.new('quit', desc) {|_input| exit })
18
10
  end
@@ -3,18 +3,9 @@
3
3
  #* mysh/internal/actions/say.rb -- A mysh internal say command.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/say.rb -- A mysh internal say command.
7
- class SayCommand < Action
8
-
9
- #Say something!
10
- def call(args)
11
- puts args.join(' ')
12
- :internal
13
- end
14
-
15
- end
16
-
17
6
  #Add says to the library.
18
7
  desc = 'Display the text in the command arguments.'
19
- COMMANDS.add_action(SayCommand.new('say <stuff>', desc))
8
+ action = lambda {|input| puts input.cooked_body}
9
+
10
+ COMMANDS.add_action(Action.new('say <stuff>', desc, &action))
20
11
  end
@@ -4,31 +4,28 @@
4
4
  module Mysh
5
5
 
6
6
  #Show items.
7
- SHOW = ActionPool.new("SHOW") do |args|
8
- puts "No show data found for #{args[0].inspect}. See ?@ for more."
7
+ default = Action.new do |input|
8
+ puts "No show data found for #{input.raw.inspect}. See ?@ for more."
9
9
  end
10
10
 
11
- #* mysh/internal/actions/show.rb -- The mysh internal show command.
12
- class ShowCommand < Action
13
-
14
- #Execute a help command by routing it to a sub-command.
15
- #<br>Endemic Code Smells
16
- #* :reek:UtilityFunction :reek:FeatureEnvy
17
- def call(args)
18
- if args.empty?
19
- puts "An item is needed for the show command."
20
- else
21
- SHOW[args[0]].call(args)
22
- end
23
- end
11
+ SHOW = ActionPool.new("SHOW", default)
12
+
13
+ #The shared description.
14
+ desc = "Display information about a part of mysh. See ?@ for more."
24
15
 
16
+ action = lambda do |input|
17
+ item = input.args[0]
18
+
19
+ if item.empty?
20
+ puts "An item is needed for the show command."
21
+ else
22
+ SHOW[item].process_command(input)
23
+ end
25
24
  end
26
25
 
27
- # The base help command.
28
- desc = 'Display information about a part of mysh. See ?@ for more.'
29
- COMMANDS.add_action(ShowCommand.new('show <item>', desc))
30
26
  #The show command action object.
31
- SHOW_COMMAND = ShowCommand.new('@<item>', desc)
27
+ COMMANDS.add_action(Action.new('show <item>', desc, &action))
28
+ SHOW_COMMAND = Action.new('@<item>', desc, &action)
32
29
  COMMANDS.add_action(SHOW_COMMAND)
33
30
  end
34
31
 
@@ -7,7 +7,7 @@ module Mysh
7
7
  class EnvInfoCommand < Action
8
8
 
9
9
  #Execute the ? shell command.
10
- def call(_args)
10
+ def process_command(_args)
11
11
  puts "Key mysh environment information.", ""
12
12
  puts info.format_mysh_bullets, "",
13
13
  path.format_mysh_bullets, ""
@@ -20,15 +20,15 @@ module Mysh
20
20
  #* :reek:UtilityFunction
21
21
  def info
22
22
  [["version", Mysh::VERSION],
23
- ["init file", $mysh_init_file],
23
+ ["init file", $mysh_init_file.decorate],
24
24
  ["user", ENV['USER']],
25
- ["home", ENV['HOME']],
25
+ ["home", (ENV['HOME'] || "").decorate],
26
26
  ["name", $PROGRAM_NAME.decorate],
27
- ["os shell", ENV['SHELL'] || ENV['ComSpec']],
27
+ ["os shell", (ENV['SHELL'] || ENV['ComSpec'] || "").decorate],
28
28
  ["host", ENV['HOSTNAME'] || ENV['COMPUTERNAME']],
29
29
  ["os", ENV['OS']],
30
30
  ["platform", MiniReadline::TERM_PLATFORM],
31
- ["java?", MiniReadline::TERM_JAVA != nil],
31
+ ["java?", MiniReadline::TERM_JAVA ? true : false],
32
32
  ["term", ENV['TERM']],
33
33
  ["disp", ENV['DISPLAY']],
34
34
  ["edit", ENV['EDITOR']]]