mysh 0.1.17 → 0.2.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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mysh.rb +28 -25
  3. data/lib/mysh/expression.rb +1 -9
  4. data/lib/mysh/external_ruby.rb +1 -1
  5. data/lib/mysh/internal/action.rb +3 -11
  6. data/lib/mysh/internal/action_pool.rb +6 -20
  7. data/lib/mysh/internal/actions/actions_path.rb +2 -2
  8. data/lib/mysh/internal/actions/cd.rb +14 -23
  9. data/lib/mysh/internal/actions/exit.rb +10 -7
  10. data/lib/mysh/internal/actions/gls.rb +63 -8
  11. data/lib/mysh/internal/actions/help.rb +20 -33
  12. data/lib/mysh/internal/actions/help/help.txt +4 -4
  13. data/lib/mysh/internal/actions/help/help_env.txt +14 -0
  14. data/lib/mysh/internal/actions/help/help_expr.txt +3 -2
  15. data/lib/mysh/internal/actions/help/help_gls.txt +41 -0
  16. data/lib/mysh/internal/actions/help/help_help.txt +7 -4
  17. data/lib/mysh/internal/actions/help/help_math.txt +1 -1
  18. data/lib/mysh/internal/actions/help/help_ruby.txt +21 -0
  19. data/lib/mysh/internal/actions/help/help_show.txt +12 -0
  20. data/lib/mysh/internal/actions/help/history.txt +19 -0
  21. data/lib/mysh/internal/actions/help/quick.txt +25 -0
  22. data/lib/mysh/internal/actions/help/sub_help.rb +41 -0
  23. data/lib/mysh/internal/actions/history.rb +46 -10
  24. data/lib/mysh/internal/actions/pwd.rb +18 -0
  25. data/lib/mysh/internal/actions/show.rb +22 -13
  26. data/lib/mysh/internal/actions/show/env.rb +43 -0
  27. data/lib/mysh/internal/actions/show/ruby.rb +50 -0
  28. data/lib/mysh/internal/actions/type.rb +27 -0
  29. data/lib/mysh/internal/actions/vls.rb +12 -12
  30. data/lib/mysh/internal/decorate.rb +2 -2
  31. data/lib/mysh/internal/format.rb +2 -4
  32. data/lib/mysh/internal/format/array.rb +23 -13
  33. data/lib/mysh/internal/format/bullets.rb +2 -2
  34. data/lib/mysh/internal/format/columns.rb +6 -11
  35. data/lib/mysh/internal/format/nil.rb +13 -0
  36. data/lib/mysh/internal/format/string.rb +23 -9
  37. data/lib/mysh/internal/manage.rb +2 -2
  38. data/lib/mysh/quick.rb +32 -0
  39. data/lib/mysh/user_input.rb +11 -4
  40. data/lib/mysh/user_input/parse.rb +1 -1
  41. data/lib/mysh/user_input/smart_source.rb +1 -1
  42. data/lib/mysh/version.rb +1 -1
  43. data/mysh.gemspec +1 -1
  44. data/samples/show.txt +1 -1
  45. data/tests/my_shell_tests.rb +25 -18
  46. metadata +16 -3
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+
3
+ #* mysh/internal/actions/type.rb -- The mysh type command.
4
+ module Mysh
5
+
6
+ #* mysh/internal/actions/type.rb -- The mysh type command.
7
+ class TypeCommand < Action
8
+
9
+ #Execute the type command.
10
+ def call(args)
11
+ file_name = args.shift
12
+
13
+ @exec_binding = binding
14
+
15
+ if file_name
16
+ show_handlebar_file(file_name)
17
+ else
18
+ puts "Error: A text file must be specified."
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ #Add the type command to the library.
25
+ desc = 'Display a text file with optional embedded handlebars.'
26
+ COMMANDS.add_action(TypeCommand.new('type', desc))
27
+ end
@@ -1,22 +1,22 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/actions/vls.rb -- The mysh module version ls command.
4
- module Mysh
5
-
6
- #* internal/actions/vls.rb -- The mysh module version ls command.
7
- class Action
3
+ require 'vls'
8
4
 
9
- desc = 'Display the loaded modules, matching the optional mask, ' +
10
- 'that have version info.'
5
+ #* mysh/internal/actions/vls.rb -- The mysh module vls (Version LS) command.
6
+ module Mysh
11
7
 
12
- COMMANDS.add('vls <mask>', desc) do |args|
13
- mask = args.shift || /./
8
+ #* mysh/internal/actions/vls.rb -- The mysh module vls (Version LS) command.
9
+ class VlsCommand < Action
14
10
 
15
- puts VersionLS.vls(mask).mysh_bulletize.join("\n")
16
- puts
11
+ #Execute the vls command.
12
+ def call(args)
13
+ puts VersionLS.vls(args[0] || /./).mysh_bulletize, ""
17
14
  end
18
15
 
19
16
  end
20
17
 
18
+ #Add the vls command to the library.
19
+ desc = 'Display the loaded modules, matching the optional mask, that ' +
20
+ 'have version info.'
21
+ COMMANDS.add_action(VlsCommand.new('vls <mask>', desc))
21
22
  end
22
-
@@ -1,9 +1,9 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/decorate.rb -- mysh internal file name beauty treatments.
3
+ #* mysh/internal/decorate.rb -- mysh internal file name beauty treatments.
4
4
  module Mysh
5
5
 
6
- #The mysh internal file name beauty treatments.
6
+ #* mysh/internal/decorate.rb -- The mysh internal file name beauty treatments.
7
7
  class Action
8
8
 
9
9
  #Make the file name fit the local system.
@@ -1,14 +1,11 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/format.rb - Some formatting facilities for mysh.
3
+ #* mysh/internal/format.rb - Some formatting facilities for mysh.
4
4
  module Mysh
5
5
 
6
6
  #Assume an 80 column working area for formatting.
7
7
  PAGE_WIDTH = 80
8
8
 
9
- #Assume an in infinite page length for formatting.
10
- PAGE_LENGTH = false
11
-
12
9
  end
13
10
 
14
11
  require_relative 'format/bullets'
@@ -16,4 +13,5 @@ require_relative 'format/columns'
16
13
  require_relative 'format/array'
17
14
  require_relative 'format/string'
18
15
  require_relative 'format/object'
16
+ require_relative 'format/nil'
19
17
 
@@ -7,28 +7,38 @@ class Array
7
7
 
8
8
  #Print out the array with efficient columns.
9
9
  def puts_mysh_columns(page_width = Mysh::PAGE_WIDTH)
10
-
11
10
  puts format_mysh_columns(page_width)
12
11
  end
13
12
 
14
13
  #Convert the array to strings with efficient columns.
15
14
  #<br>Returns
16
- #* An array of pages, that is, arrays of strings.
17
- def format_mysh_columns(page_width = Mysh::PAGE_WIDTH)
18
- builder = Mysh::ColumnizedPage.new(Mysh::PAGE_LENGTH, page_width)
15
+ #* An array of strings.
16
+ #<br>Endemic Code Smells
17
+ #* :reek:FeatureEnvy -- false positive.
18
+ def raw_mysh_columns(page_width)
19
+ builder = Mysh::ColumnizedPage.new(page_width)
19
20
 
20
- self.each {|item| builder.add(item)}
21
+ each {|item| builder.add(item)}
21
22
 
22
23
  builder.render
23
24
  end
24
25
 
25
- alias :format_description :format_mysh_columns
26
+ alias :format_description :raw_mysh_columns
27
+
28
+ #Convert the array to strings with efficient columns.
29
+ #<br>Returns
30
+ #* A string.
31
+ #<br>Endemic Code Smells
32
+ #* :reek:FeatureEnvy -- false positive.
33
+ def format_mysh_columns(page_width = Mysh::PAGE_WIDTH)
34
+ raw_mysh_columns(page_width).join("\n")
35
+ end
26
36
 
27
37
  #Get the widest element of an array.
28
38
  #<br>Returns
29
39
  #* The width of the widest string in the array.
30
40
  def mysh_column_width
31
- (self.max_by {|item| item.length}).length
41
+ max_by {|item| item.length}.length
32
42
  end
33
43
 
34
44
 
@@ -40,16 +50,16 @@ class Array
40
50
  end
41
51
 
42
52
  #Convert the array to strings with bullet points.
43
- #<br>
44
- #* An array of strings
53
+ #<br>Returns
54
+ #* A string.
55
+ #<br>Endemic Code Smells
56
+ #* :reek:FeatureEnvy -- false positive.
45
57
  def mysh_bulletize(page_width = Mysh::PAGE_WIDTH)
46
58
  builder = Mysh::BulletPoints.new(page_width)
47
59
 
48
- self.each do |pair|
49
- builder.add(*pair)
50
- end
60
+ each {|pair| builder.add(*pair)}
51
61
 
52
- builder.render
62
+ builder.render.join("\n")
53
63
  end
54
64
 
55
65
  end
@@ -1,9 +1,9 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/format/bullets.rb - Print out bullet points.
3
+ #* mysh/internal/format/bullets.rb - Print out bullet points.
4
4
  module Mysh
5
5
 
6
- #A class to display data in bullet points.
6
+ #* mysh/internal/format/bullets.rb - A class to display data in bullet points.
7
7
  class BulletPoints
8
8
 
9
9
  #Prepare a blank slate.
@@ -1,13 +1,13 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/format/bullets.rb - Print out data in neat columns.
3
+ #* mysh/internal/format/columns.rb - Print out data in neat columns.
4
4
  module Mysh
5
5
 
6
- #A class to display data in columns.
6
+ #* mysh/internal/format/columns.rb - A class to display data in columns.
7
7
  class ColumnizedPage
8
8
  #Prepare a blank page.
9
- def initialize(page_length, page_width)
10
- @page_length, @page_width = page_length, page_width
9
+ def initialize(page_width)
10
+ @page_width = page_width
11
11
  @page_data = []
12
12
  end
13
13
 
@@ -52,24 +52,19 @@ module Mysh
52
52
  end
53
53
 
54
54
  #Make sure the page fits within its boundaries.
55
- #<br>Returns
56
- #* The number if items that did not fit in the page.
57
55
  def adjust_configuration
58
56
  while total_width >= @page_width
59
- return @page_data.pop.length if rows == @page_length
60
57
  add_a_row
61
58
  end
62
-
63
- 0
64
59
  end
65
60
 
66
61
  #Add a row to the page, moving items as needed.
67
62
  def add_a_row
68
- target = rows + 1
63
+ new_rows = rows + 1
69
64
  pool, @page_data = @page_data.flatten, []
70
65
 
71
66
  until pool.empty?
72
- @page_data << pool.shift(target)
67
+ @page_data << pool.shift(new_rows)
73
68
  end
74
69
  end
75
70
 
@@ -0,0 +1,13 @@
1
+ # coding: utf-8
2
+
3
+ #* internal/format/nil.rb - Support for displaying nothing formatted neatly.
4
+ class NilClass
5
+
6
+ #Create a bullet point description from nothing.
7
+ def format_description(_max_width)
8
+ []
9
+ end
10
+
11
+ end
12
+
13
+
@@ -4,38 +4,52 @@
4
4
  class String
5
5
 
6
6
  #Create a bullet point description from this string.
7
+ #<br>Returns
8
+ #* An array of strings.
7
9
  def format_description(max_width)
8
10
  do_format_description(split(' ').each, max_width)
9
11
  end
10
12
 
11
13
  #Do the formatting legwork.
14
+ #<br>Returns
15
+ #* An array of strings.
12
16
  def do_format_description(input, max_width)
13
- result, build = [], ""
17
+ buffer, build, empty = [], "", false
14
18
 
15
- loop do
16
- build = build.split_if_over(input.next, max_width, result)
17
- .split_if_huge(max_width, result)
19
+ loop do #Grab "words" of input, splitting off lines as needed.
20
+ empty = (build = build.split_if_over(input.next, max_width, buffer)
21
+ .split_if_huge(max_width, buffer)).empty?
18
22
  end
19
23
 
20
- result << build
24
+ unless empty
25
+ buffer << build
26
+ end
27
+
28
+ buffer
21
29
  end
22
30
 
23
31
  #Split if adding a word goes over a little.
32
+ #<br>Returns
33
+ #* A string.
24
34
  def split_if_over(word, max_width, buffer)
25
- word.prepend(" ") unless self.empty?
35
+ word.prepend(" ") unless empty? #Add a space except for the first word.
36
+
26
37
  word_len = word.length
27
38
 
28
39
  if (length + word_len) >= max_width && word_len < max_width
29
- buffer << self
30
- word.lstrip
40
+ buffer << self #Line done, add to buffer.
41
+ word.lstrip #Start of a new line, remove the leading space.
31
42
  else
32
43
  self + word
33
44
  end
34
-
35
45
  end
36
46
 
37
47
  #Split up a overlong blob of text.
48
+ #<br>Returns
49
+ #* A string.
38
50
  def split_if_huge(max_width, buffer)
51
+
52
+ #Slice away any excess text into lines in the buffer.
39
53
  while length >= max_width
40
54
  buffer << slice!(0, max_width)
41
55
  end
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- #* internal/manage.rb -- Manage mysh internal commands.
3
+ #* mysh/internal/manage.rb -- Manage mysh internal commands.
4
4
  module Mysh
5
5
 
6
6
  #Set up the command action pool.
@@ -19,7 +19,7 @@ module Mysh
19
19
  action, args = parse_command(str.chomp)
20
20
 
21
21
  if (action)
22
- action.execute(args)
22
+ action.call(args)
23
23
  :internal
24
24
  end
25
25
  end
data/lib/mysh/quick.rb ADDED
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ #* mysh/internal/quick.rb -- The mysh internal quick commands.
4
+ module Mysh
5
+
6
+ #Try to execute the string as a quick command.
7
+ def self.try_execute_quick_command(str)
8
+ case str[0]
9
+ when '!'
10
+ HISTORY_COMMAND.call(parse_args(str[1...-1]))
11
+ :history
12
+
13
+ when '='
14
+ @exec_host.execute(str)
15
+ :expression
16
+
17
+ when '?'
18
+ HELP_COMMAND.call(parse_args(str[1...-1]))
19
+ :help
20
+
21
+ when '@'
22
+ SHOW_COMMAND.call(parse_args(str[1...-1]))
23
+ :show
24
+
25
+ else
26
+ false
27
+ end
28
+ end
29
+
30
+
31
+ end
32
+
@@ -1,16 +1,24 @@
1
1
  # coding: utf-8
2
2
 
3
+ require 'mini_readline'
4
+
3
5
  require_relative 'user_input/smart_source'
4
6
  require_relative 'user_input/parse'
5
7
  require_relative 'user_input/handlebars'
6
8
 
7
- #* user_input.rb -- Get a command from the user.
9
+ #* mysh/user_input.rb -- Get some text from the user.
8
10
  module Mysh
9
11
 
12
+ class << self
13
+ #The input text source.
14
+ attr_reader :input
15
+ end
16
+
10
17
  #Get one command from the user.
11
18
  def self.get_command
12
- input = @input.readline(prompt: 'mysh>')
13
- get_command_extra(input)
19
+ initial_input = @input.readline(prompt: 'mysh>')
20
+ @input.instance_options[:initial] = ""
21
+ get_command_extra(initial_input)
14
22
  end
15
23
 
16
24
  private
@@ -36,4 +44,3 @@ module Mysh
36
44
 
37
45
  end
38
46
 
39
-
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- #* user_input/parse.rb -- mysh general parser.
3
+ #* mysh/user_input/parse.rb -- mysh general parser.
4
4
  module Mysh
5
5
 
6
6
  #Parse a string into components.
@@ -1,6 +1,6 @@
1
1
  # coding: utf-8
2
2
 
3
- #* array_source.rb - An array as the source for auto-complete.
3
+ #* mysh/user_input/smart_source.rb - An adaptive source for auto-complete.
4
4
  module Mysh
5
5
 
6
6
  #* array_source.rb - An array as the source for auto-complete.
data/lib/mysh/version.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Mysh
4
4
  #The version string of MY SHell.
5
- VERSION = "0.1.17"
5
+ VERSION = "0.2.0"
6
6
 
7
7
  #A brief summary of this gem.
8
8
  SUMMARY = "mysh -- a Ruby inspired command line shell."
data/mysh.gemspec CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.summary = Mysh::SUMMARY
13
13
  spec.description = "mysh -- a Ruby inspired command shell " +
14
14
  "for CLI and application use."
15
- spec.homepage = "http://teuthida-technologies.com/"
15
+ spec.homepage = "https://github.com/PeterCamilleri/mysh"
16
16
 
17
17
  spec.license = "MIT"
18
18
 
data/samples/show.txt CHANGED
@@ -7,5 +7,5 @@ Args = {{ args.inspect }}
7
7
 
8
8
  {{ [["Numbers", Array.new(count){|i| (i+1)} ],
9
9
  ["Squares", Array.new(count){|i| (i+1)*(i+1)} ],
10
- ["Cubes", Array.new(count){|i| (i+1)*(i+1)*(i+1)} ]].mysh_bulletize.join("\n") }}
10
+ ["Cubes", Array.new(count){|i| (i+1)*(i+1)*(i+1)} ]].mysh_bulletize }}
11
11
 
@@ -27,18 +27,18 @@ class MyShellTester < Minitest::Test
27
27
  assert_equal(Class, Mysh::ExecHost.class)
28
28
 
29
29
  assert_equal(Mysh::ActionPool, Mysh::COMMANDS.class)
30
- assert_equal(Mysh::ActionPool, Mysh::Action::HELP.class)
30
+ assert_equal(Mysh::ActionPool, Mysh::HELP.class)
31
31
  end
32
32
 
33
33
  def test_for_internal_commands
34
34
  assert(Mysh::COMMANDS['exit'], "The exit command is missing.")
35
35
  assert(Mysh::COMMANDS['quit'], "The quit command is missing.")
36
36
 
37
- assert(Mysh::COMMANDS['history'], "The history command is missing.")
38
- assert(Mysh::COMMANDS['!'], "The ! command is missing.")
37
+ assert(Mysh::COMMANDS['history'], "The history command is missing.")
38
+ assert(Mysh::COMMANDS['!<index>'], "The ! command is missing.")
39
39
 
40
40
  assert(Mysh::COMMANDS['help'], "The help command is missing.")
41
- assert(Mysh::COMMANDS['?'], "The ? command is missing.")
41
+ assert(Mysh::COMMANDS['?<topic>'], "The ? command is missing.")
42
42
 
43
43
  assert(Mysh::COMMANDS['cd'], "The cd command is missing.")
44
44
  assert(Mysh::COMMANDS['pwd'], "The pwd command is missing.")
@@ -79,11 +79,19 @@ class MyShellTester < Minitest::Test
79
79
  end
80
80
 
81
81
  def test_some_formatting
82
+ assert_equal("1 4\n2 5\n3 ", [1,2,3,4,5].format_mysh_columns(5))
83
+ assert_equal(["1 4", "2 5", "3 "], [1,2,3,4,5].format_description(5))
84
+
85
+ assert_equal(["1 2", "3 4", "5"], "1 2 3 4 5".format_description(5))
86
+
87
+ assert_equal([], [].format_description(5))
88
+ assert_equal([], nil.format_description(5))
89
+
82
90
  result =
83
- ["1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 ",
84
- "2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 ",
85
- "3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 79 83 87 91 95 99 ",
86
- "4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100"]
91
+ "1 5 9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97 \n" +
92
+ "2 6 10 14 18 22 26 30 34 38 42 46 50 54 58 62 66 70 74 78 82 86 90 94 98 \n" +
93
+ "3 7 11 15 19 23 27 31 35 39 43 47 51 55 59 63 67 71 75 79 83 87 91 95 99 \n" +
94
+ "4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100"
87
95
 
88
96
  assert_equal(result, (1..100).to_a.format_mysh_columns)
89
97
 
@@ -95,17 +103,16 @@ class MyShellTester < Minitest::Test
95
103
  ]
96
104
 
97
105
  result =
98
- ["key_largo /long_folder_name_one/long_folder_name_two/long_folder_name_three/fin",
99
- " e_descriptive_name",
100
- "key_west Semper ubi sub ubi. Semper ubi sub ubi. Semper ubi sub ubi. Semper",
101
- " ubi sub ubi.",
102
- "counting 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95",
103
- " 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96",
104
- " 2 7 12 17 22 27 32 37 42 47 52 57 62 67 72 77 82 87 92 97",
105
- " 3 8 13 18 23 28 33 38 43 48 53 58 63 68 73 78 83 88 93 98",
106
- " 4 9 14 19 24 29 34 39 44 49 54 59 64 69 74 79 84 89 94 99",
106
+ "key_largo /long_folder_name_one/long_folder_name_two/long_folder_name_three/fin\n" +
107
+ " e_descriptive_name\n" +
108
+ "key_west Semper ubi sub ubi. Semper ubi sub ubi. Semper ubi sub ubi. Semper\n" +
109
+ " ubi sub ubi.\n" +
110
+ "counting 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" +
111
+ " 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96\n" +
112
+ " 2 7 12 17 22 27 32 37 42 47 52 57 62 67 72 77 82 87 92 97\n" +
113
+ " 3 8 13 18 23 28 33 38 43 48 53 58 63 68 73 78 83 88 93 98\n" +
114
+ " 4 9 14 19 24 29 34 39 44 49 54 59 64 69 74 79 84 89 94 99\n" +
107
115
  "pie 3.141592653589793"
108
- ]
109
116
 
110
117
  assert_equal(result, data.mysh_bulletize)
111
118
  end