mysh 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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']]]