mysh 0.6.9 → 0.6.16

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.
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
-