mysh 0.6.9 → 0.6.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -5
  3. data/lib/mysh.rb +19 -9
  4. data/lib/mysh/{internal/action.rb → action.rb} +8 -8
  5. data/lib/mysh/{internal/action_pool.rb → action_pool.rb} +8 -8
  6. data/lib/mysh/{internal/actions/command_line.rb → command_line.rb} +10 -10
  7. data/lib/mysh/{internal/actions/command_line → command_line}/debug.rb +9 -11
  8. data/lib/mysh/command_line/history.rb +61 -0
  9. data/lib/mysh/{internal/actions/command_line → command_line}/init.rb +8 -8
  10. data/lib/mysh/{internal/actions/command_line → command_line}/load.rb +5 -5
  11. data/lib/mysh/{internal/actions/command_line → command_line}/pause.rb +6 -8
  12. data/lib/mysh/{internal/actions/command_line → command_line}/post_prompt.rb +10 -12
  13. data/lib/mysh/{internal/actions/command_line → command_line}/pre_prompt.rb +10 -12
  14. data/lib/mysh/{internal/actions/command_line → command_line}/prompt.rb +9 -10
  15. data/lib/mysh/command_line/quit.rb +19 -0
  16. data/lib/mysh/{internal/actions/command_line → command_line}/usage.rb +4 -4
  17. data/lib/mysh/expression.rb +11 -31
  18. data/lib/mysh/external.rb +4 -5
  19. data/lib/mysh/globalize.rb +14 -10
  20. data/lib/mysh/handlebars.rb +10 -13
  21. data/lib/mysh/handlebars/eval_handlebars.rb +38 -0
  22. data/lib/mysh/{internal/actions/help → help}/env.txt +0 -0
  23. data/lib/mysh/{internal/actions/help → help}/expr.txt +0 -0
  24. data/lib/mysh/{internal/actions/help → help}/gem.txt +0 -0
  25. data/lib/mysh/{internal/actions/help → help}/gls.txt +0 -0
  26. data/lib/mysh/{internal/actions/help → help}/h_o_h.txt +1 -1
  27. data/lib/mysh/{internal/actions/help → help}/hbar.txt +11 -0
  28. data/lib/mysh/{internal/actions/help → help}/help.txt +0 -0
  29. data/lib/mysh/{internal/actions/help → help}/history.txt +7 -0
  30. data/lib/mysh/{internal/actions/help → help}/init.txt +0 -0
  31. data/lib/mysh/{internal/actions/help → help}/kbd.txt +0 -0
  32. data/lib/mysh/{internal/actions/help → help}/math.txt +0 -0
  33. data/lib/mysh/{internal/actions/help → help}/mls.txt +0 -0
  34. data/lib/mysh/{internal/actions/help → help}/quick.txt +0 -0
  35. data/lib/mysh/{internal/actions/help → help}/ruby.txt +0 -0
  36. data/lib/mysh/{internal/actions/help → help}/show.txt +0 -0
  37. data/lib/mysh/{internal/actions/help → help}/term.txt +0 -0
  38. data/lib/mysh/{internal/actions/help → help}/timed.txt +0 -0
  39. data/lib/mysh/help/type.txt +28 -0
  40. data/lib/mysh/{internal/actions/help → help}/types.txt +0 -0
  41. data/lib/mysh/{internal/actions/help → help}/usage.txt +0 -0
  42. data/lib/mysh/{internal/actions/help → help}/vars.txt +4 -4
  43. data/lib/mysh/input_wrapper.rb +13 -13
  44. data/lib/mysh/internal.rb +20 -8
  45. data/lib/mysh/internal/{actions/cancel.rb → cancel.rb} +0 -0
  46. data/lib/mysh/internal/{actions/cd.rb → cd.rb} +2 -2
  47. data/lib/mysh/internal/{actions/comment.rb → comment.rb} +2 -2
  48. data/lib/mysh/internal/{actions/elapsed.rb → elapsed.rb} +2 -2
  49. data/lib/mysh/internal/{actions/exit.rb → exit.rb} +0 -0
  50. data/lib/mysh/internal/{actions/gls.rb → gls.rb} +6 -7
  51. data/lib/mysh/internal/{actions/help.rb → help.rb} +7 -9
  52. data/lib/mysh/internal/{actions/history.rb → history.rb} +10 -9
  53. data/lib/mysh/internal/load.rb +45 -0
  54. data/lib/mysh/internal/{actions/mls.rb → mls.rb} +2 -2
  55. data/lib/mysh/internal/{actions/pwd.rb → pwd.rb} +1 -1
  56. data/lib/mysh/internal/{actions/say.rb → say.rb} +1 -1
  57. data/lib/mysh/internal/{actions/show.rb → show.rb} +7 -6
  58. data/lib/mysh/internal/{actions/help → support}/sub_help.rb +9 -7
  59. data/lib/mysh/internal/type.rb +38 -0
  60. data/lib/mysh/internal/{actions/vars.rb → vars.rb} +8 -8
  61. data/lib/mysh/{init.rb → load_init_file.rb} +3 -3
  62. data/lib/mysh/process.rb +7 -7
  63. data/lib/mysh/quick.rb +10 -4
  64. data/lib/mysh/shell_variables.rb +9 -4
  65. data/lib/mysh/shell_variables/evaluate.rb +2 -11
  66. data/lib/mysh/shell_variables/shell_variable_keeper.rb +6 -7
  67. data/lib/mysh/shell_variables/shell_variable_store.rb +13 -14
  68. data/lib/mysh/{internal/actions/show → show}/env.rb +3 -5
  69. data/lib/mysh/{internal/actions/show → show}/gem.rb +3 -16
  70. data/lib/mysh/{internal/actions/show → show}/ruby.rb +0 -0
  71. data/lib/mysh/{internal/actions/show → show}/term.rb +5 -7
  72. data/lib/mysh/sources/console.rb +11 -7
  73. data/lib/mysh/sources/parse.rb +7 -10
  74. data/lib/mysh/sources/smart_auto_complete.rb +5 -5
  75. data/lib/mysh/sources/string.rb +6 -6
  76. data/lib/mysh/string_helpers.rb +37 -0
  77. data/lib/mysh/system.rb +2 -2
  78. data/lib/mysh/user_input.rb +5 -9
  79. data/lib/mysh/version.rb +4 -4
  80. data/mysh.gemspec +4 -3
  81. data/samples/show.txt +2 -0
  82. data/tests/my_shell_tests.rb +18 -6
  83. metadata +77 -65
  84. data/lib/mysh/binding_wrapper.rb +0 -21
  85. data/lib/mysh/handlebars/string.rb +0 -22
  86. data/lib/mysh/internal/actions/actions_path.rb +0 -15
  87. data/lib/mysh/internal/actions/command_line/quit.rb +0 -19
  88. data/lib/mysh/internal/actions/load.rb +0 -36
  89. data/lib/mysh/internal/actions/type.rb +0 -22
  90. data/lib/mysh/internal/manage.rb +0 -20
  91. data/lib/mysh/internal/to_file_spec.rb +0 -26
  92. data/lib/mysh/pre_processor.rb +0 -11
@@ -0,0 +1,45 @@
1
+ # coding: utf-8
2
+
3
+ # The mysh load command.
4
+ module Mysh
5
+
6
+ # Add the load command to the library.
7
+ desc = "Load ruby programs, mysh scripts, " +
8
+ "or text files into the mysh environment."
9
+
10
+ action = lambda do |input|
11
+ count = 0
12
+ args = input.args
13
+
14
+ args.each do |file_name|
15
+ puts file_name if args.length > 1
16
+ Mysh.load_a_file(file_name)
17
+ count += 1
18
+ end
19
+
20
+ if count > 0
21
+ :internal
22
+ else
23
+ fail "Error: A load file must be specified."
24
+ end
25
+ end
26
+
27
+ # Load a single file.
28
+ def self.load_a_file(file_name)
29
+ case File.extname(file_name)
30
+ when '.mysh'
31
+ Mysh.process_file(file_name)
32
+ :internal
33
+ when '.txt'
34
+ show_handlebar_file(file_name, binding)
35
+ :internal
36
+ when '.rb'
37
+ load file_name
38
+ :internal
39
+ else
40
+ fail "Error: Unknown file type: #{file_name.inspect}"
41
+ end
42
+ end
43
+
44
+ COMMANDS.add_action(Action.new('load <files>', desc, &action))
45
+ end
@@ -2,10 +2,10 @@
2
2
 
3
3
  require 'vls'
4
4
 
5
- #* mysh/internal/actions/mls.rb -- The mysh module ls command.
5
+ # The mysh module ls command.
6
6
  module Mysh
7
7
 
8
- #Add the mls command to the library.
8
+ # Add the mls command to the library.
9
9
  desc = 'Display modules with version info. See ?mls for more.'
10
10
 
11
11
  action = lambda do |input|
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/actions/pwd.rb -- The mysh internal pwd command.
3
+ # The mysh internal pwd command.
4
4
  module Mysh
5
5
 
6
6
  desc = 'Display the current working directory.'
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/actions/say.rb -- A mysh internal say command.
3
+ # The mysh internal say command.
4
4
  module Mysh
5
5
 
6
6
  #Add says to the library.
@@ -1,19 +1,19 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/actions/show.rb -- The mysh internal show command.
3
+ # The mysh internal show command.
4
4
  module Mysh
5
5
 
6
6
  # The working message for long duration processing.
7
7
  WORKING = "Working...\r"
8
8
 
9
- #Show items.
9
+ # Show items.
10
10
  default = Action.new do |input|
11
11
  puts "No show data found for #{input.raw.inspect}. See ?@ for more."
12
12
  end
13
13
 
14
14
  SHOW = ActionPool.new("SHOW", default)
15
15
 
16
- #The shared description.
16
+ # The shared description.
17
17
  desc = "Display information about a part of mysh. See ?@ for more."
18
18
 
19
19
  action = lambda do |input|
@@ -26,11 +26,12 @@ module Mysh
26
26
  end
27
27
  end
28
28
 
29
- #The show command action object.
29
+ # The show command action object.
30
30
  COMMANDS.add_action(Action.new('show <item>', desc, &action))
31
31
  SHOW_COMMAND = Action.new('@<item>', desc, &action)
32
32
  COMMANDS.add_action(SHOW_COMMAND)
33
33
  end
34
34
 
35
- #Load up the extra help actions!
36
- Dir[Mysh::Action::ACTIONS_PATH + 'show/*.rb'].each {|file| require file }
35
+ # Load up the various show actions!
36
+ path = MYSH_LIB + "mysh/show/*.rb"
37
+ Dir[path].each {|file| require file }
@@ -1,12 +1,12 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/actions/help/sub_help.rb -- The mysh internal help sub commands.
3
+ # The mysh internal help sub commands.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/help/sub_help.rb -- The mysh internal help sub commands.
6
+ # The mysh internal help sub commands.
7
7
  class HelpSubCommand < Action
8
8
 
9
- #Setup a help command.
9
+ # Setup a help command.
10
10
  def initialize(name, description, file_name)
11
11
  super(name, description)
12
12
  @file_name = file_name
@@ -14,12 +14,13 @@ module Mysh
14
14
 
15
15
  #Execute a help command.
16
16
  def process_command(_args)
17
- mysh "load #{(ACTIONS_PATH + 'help/' + @file_name).to_host_spec}"
17
+ path = MYSH_LIB + "mysh/help/" + @file_name
18
+ mysh "load #{path.to_host_spec}"
18
19
  end
19
20
 
20
21
  end
21
22
 
22
- #Add help topics here. Don't sweat the order; they get sorted by name.
23
+ # Add help topics here. Don't sweat the order; they get sorted by name.
23
24
  # Name Description Help File
24
25
  help = [['', 'General help on mysh.', 'help.txt' ],
25
26
  ['set', 'Help on mysh variables.', 'vars.txt' ],
@@ -34,13 +35,14 @@ module Mysh
34
35
  ['usage', 'Help on mysh usage.', 'usage.txt' ],
35
36
  ['=', 'Help on ruby expressions.', 'expr.txt' ],
36
37
  ['quick', 'Help on quick commands.', 'quick.txt' ],
37
- ['gls', 'Help on gls internal mysh command.', 'gls.txt' ],
38
- ['mls', 'Help on mls internal mysh command.', 'mls.txt' ],
38
+ ['gls', 'Help on the gls command.', 'gls.txt' ],
39
+ ['mls', 'Help on the mls command.', 'mls.txt' ],
39
40
  ['!', 'Help on the history command.', 'history.txt'],
40
41
  ['history', 'Help on the history command.', 'history.txt'],
41
42
  ['kbd', 'Help on mysh keyboard mapping.', 'kbd.txt' ],
42
43
  ['{{', 'Help on mysh handlebars.', 'hbar.txt' ],
43
44
  ['init', 'Help on mysh initialization.', 'init.txt' ],
45
+ ['type', 'Help on the type command.', 'type.txt' ],
44
46
  ['types', 'Help on mysh file types.', 'types.txt' ],
45
47
  ['help', 'This help on the help command.', 'h_o_h.txt' ],
46
48
  ['?', 'This help on the help command.', 'h_o_h.txt' ]
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+
3
+ # The mysh type command.
4
+ module Mysh
5
+
6
+ # Add the type command to the library.
7
+ desc = 'Display one or more text files with optional support for ' +
8
+ 'embedded handlebars and shell variables. See ?type for more.'
9
+
10
+ action = lambda do |input|
11
+ count = 0
12
+ cooked = MNV[:type] !~ /\A(raw|false|no|off)\z/i
13
+ args = input.args
14
+
15
+ args.each do |file_name|
16
+ puts file_name if args.length > 1
17
+
18
+ case file_name
19
+ when "-c"
20
+ cooked = false
21
+ when "+c"
22
+ cooked = true
23
+ else
24
+ if cooked
25
+ show_handlebar_file(file_name, binding)
26
+ else
27
+ puts IO.read(file_name)
28
+ end
29
+ end
30
+
31
+ count += 1
32
+ end
33
+
34
+ fail "A text file must be specified." if count == 0
35
+ end
36
+
37
+ COMMANDS.add_action(Action.new('type <files>', desc, &action))
38
+ end
@@ -1,24 +1,24 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/actions/vars.rb -- The mysh internal variables commands.
3
+ # The mysh internal variables commands.
4
4
  module Mysh
5
5
 
6
- #* mysh/internal/actions/vars.rb -- The mysh internal variable commands.
6
+ # The mysh internal variable commands.
7
7
  class VarsCommand < Action
8
8
 
9
- #The mysh variable parsing regex.
9
+ # The mysh variable parsing regex.
10
10
  VAR_EXP = %r{(?<name> [a-z][a-z0-9_]*){0}
11
11
  (?<equals> =){0}
12
12
  (?<value> \S.*){0}
13
13
  \$ (\g<name> \s* (\g<equals> \s* \g<value>?)?)?}x
14
14
 
15
- #Setup an internal action.
15
+ # Setup an internal action.
16
16
  def initialize(name, description)
17
17
  @var_name = @equals = @value = nil
18
18
  super(name, description)
19
19
  end
20
20
 
21
- #Execute a command against the internal mysh variables.
21
+ # Execute a command against the internal mysh variables.
22
22
  def process_command(input)
23
23
  if (match = VAR_EXP.match(input.raw_body))
24
24
  @var_name, @equals, @value = match[:name], match[:equals], match[:value]
@@ -30,7 +30,7 @@ module Mysh
30
30
  :internal
31
31
  end
32
32
 
33
- #Do the actual work here.
33
+ # Do the actual work here.
34
34
  def do_command
35
35
  sym = @var_name.to_sym if @var_name
36
36
 
@@ -45,7 +45,7 @@ module Mysh
45
45
  end
46
46
  end
47
47
 
48
- #Display all variables neatly.
48
+ # Display all variables neatly.
49
49
  def show_all_values
50
50
  puts (MNV.keys - ['$'.to_sym])
51
51
  .sort
@@ -55,7 +55,7 @@ module Mysh
55
55
 
56
56
  end
57
57
 
58
- #The show command action object.
58
+ # The set command action object.
59
59
  desc = 'Set/query mysh variables. See ?set for more.'
60
60
  COMMANDS.add_action(VarsCommand.new('set <$name>=value', desc))
61
61
  end
@@ -1,12 +1,12 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/init.rb -- The mysh init file loader.
3
+ # The mysh initial file loader.
4
4
  module Mysh
5
5
 
6
- #Set the init file used to startup mysh to none so far.
6
+ # Set the initial file used to startup mysh to none so far.
7
7
  $mysh_init_file = nil
8
8
 
9
- #Perform init phase processing.
9
+ # Perform initial phase processing.
10
10
  def self.mysh_load_init
11
11
 
12
12
  unless $mysh_init_file
@@ -1,24 +1,24 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/process.rb -- The mysh command processors.
3
+ # The mysh command processors.
4
4
  module Mysh
5
5
 
6
- #Process from the console.
6
+ # Process from the console.
7
7
  def self.process_console
8
8
  process_source(Console.new)
9
9
  end
10
10
 
11
- #Process from a string.
11
+ # Process from a string.
12
12
  def self.process_string(str)
13
13
  process_source(StringSource.new(str))
14
14
  end
15
15
 
16
- #Process from a file.
16
+ # Process from a file.
17
17
  def self.process_file(name)
18
18
  process_source(StringSource.new(IO.read(name)))
19
19
  end
20
20
 
21
- #Process commands from a source.
21
+ # Process commands from a source.
22
22
  def self.process_source(source)
23
23
  until source.eoi? do
24
24
  execute_a_command(source)
@@ -26,7 +26,7 @@ module Mysh
26
26
  rescue MyshExit
27
27
  end
28
28
 
29
- #Execute a single line of input and handle exceptions.
29
+ # Execute a single line of input and handle exceptions.
30
30
  def self.execute_a_command(source)
31
31
  try_execute_command(get_command(source))
32
32
 
@@ -38,7 +38,7 @@ module Mysh
38
38
  puts err.backtrace if MNV[:debug].extract_boolean || defined?(MiniTest)
39
39
  end
40
40
 
41
- #Try to execute a single line of input. Does not handle exceptions.
41
+ # Try to execute a single line of input. Does not handle exceptions.
42
42
  def self.try_execute_command(str)
43
43
  input = InputWrapper.new(str)
44
44
 
@@ -1,19 +1,25 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/quick.rb -- The mysh internal quick commands.
3
+ # The mysh internal quick commands.
4
4
  module Mysh
5
5
 
6
- #A hash of quick command short cuts and their actions.
6
+ # A hash of quick command short cuts and their actions.
7
7
  QUICK = Hash.new(lambda {|_input| false })
8
8
 
9
9
  QUICK['!'] = lambda {|input| HISTORY_COMMAND.process_quick_command(input)}
10
10
  QUICK['#'] = lambda {|input| MYSH_COMMENT.process_command(input)}
11
11
  QUICK['%'] = lambda {|input| TIMED_COMMAND.process_command(input)}
12
- QUICK['='] = lambda {|input| $mysh_exec_host.execute(input.raw.preprocess)}
13
12
  QUICK['?'] = lambda {|input| HELP_COMMAND.process_quick_command(input)}
14
13
  QUICK['@'] = lambda {|input| SHOW_COMMAND.process_quick_command(input)}
15
14
 
16
- #Try to execute the inputing as a quick command.
15
+ QUICK['='] = lambda do |input|
16
+ cmd = "$mysh_exec_result=(" + input.raw[1..-1].preprocess + ")"
17
+ puts cmd if MNV[:debug].extract_boolean
18
+ pp $mysh_exec_binding.eval(cmd)
19
+ :expression
20
+ end
21
+
22
+ # Try to execute the inputing as a quick command.
17
23
  def self.try_execute_quick(input)
18
24
  QUICK[input.quick_command].call(input)
19
25
  end
@@ -4,13 +4,13 @@ require_relative 'shell_variables/shell_variable_store'
4
4
  require_relative 'shell_variables/shell_variable_keeper'
5
5
  require_relative 'shell_variables/evaluate'
6
6
 
7
- #* mysh/shell_variables.rb -- Adds support for mysh scripting variables.
7
+ # Adds support for mysh scripting variables.
8
8
  module Mysh
9
9
 
10
- #Set up some essential entries.
10
+ # Set up some essential entries.
11
11
  MNV['$'.to_sym] = "$"
12
12
 
13
- #Set up some default values.
13
+ # Set up some default values.
14
14
  MNV[:debug] = "false"
15
15
  MNV[:prompt] = "mysh>"
16
16
  MNV[:post_prompt] = "$prompt"
@@ -19,7 +19,10 @@ module Mysh
19
19
  MNV[:page_width] = "{{ MiniTerm.width }}"
20
20
  MNV[:page_height] = "{{ MiniTerm.height }}"
21
21
  MNV[:page_pause] = "on"
22
- MNV[:page_msg] = "Press a key, a space, or q:"
22
+
23
+ MNV[:history] = "on"
24
+ MNV[:no_dups] = "on"
25
+ MNV[:no_move] = "on"
23
26
 
24
27
  MNV[:d] = "{{ Time.now.strftime(MNV[:date_fmt]) }}"
25
28
  MNV[:h] = "{{ ENV['HOME'].to_host_spec }}"
@@ -31,4 +34,6 @@ module Mysh
31
34
 
32
35
  MNV[:date_fmt] = "%Y-%m-%d"
33
36
  MNV[:time_fmt] = "%H:%M"
37
+
38
+ MNV[:type] = "raw"
34
39
  end
@@ -1,18 +1,9 @@
1
1
  # coding: utf-8
2
2
 
3
- #Monkey patches for Mysh variables
3
+ # Monkey patches for Mysh variables
4
4
  class String
5
5
 
6
- #Extract common mysh data from this string.
7
- def extract_boolean
8
- if self =~ /\A(false|no|off)\z/i
9
- false
10
- else
11
- self
12
- end
13
- end
14
-
15
- #Evaluate any variable substitutions in the input.
6
+ # Evaluate any variable substitutions in the string.
16
7
  def eval_variables
17
8
  self.gsub(/((?<!\\)\$\$)|((?<!\\)\$[a-z][a-z0-9_]*)/) do |str|
18
9
  sym = str[1..-1].to_sym
@@ -1,17 +1,17 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/shell_variables/shell_variable_keeper.rb -- The keeper of mysh values.
3
+ # The keeper of mysh values.
4
4
  module Mysh
5
5
 
6
- #The keeper of mysh variable values.
6
+ # The keeper of mysh variable values.
7
7
  class Keeper
8
8
 
9
- #Set up this variable
9
+ # Set up this variable
10
10
  def initialize(value="")
11
11
  @value = value
12
12
  end
13
13
 
14
- #Get the value of this variable.
14
+ # Get the value of this variable.
15
15
  def get_value(loop_check={})
16
16
  my_id = self.object_id
17
17
  fail "Mysh variable looping error." if loop_check[my_id]
@@ -21,12 +21,12 @@ module Mysh
21
21
  loop_check.delete(my_id)
22
22
  end
23
23
 
24
- #Get the source code of this variable.
24
+ # Get the source code of this variable.
25
25
  def get_source
26
26
  @value
27
27
  end
28
28
 
29
- #Set the value of this variable.
29
+ # Set the value of this variable.
30
30
  def set_value(value)
31
31
  @value = value
32
32
  end
@@ -34,4 +34,3 @@ module Mysh
34
34
  end
35
35
 
36
36
  end
37
-