mysh 0.6.3 → 0.6.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db73fad7b11e3e399b5fce1390213a5e5aba485f
4
- data.tar.gz: 38dff27207d3d2bb068f126c67fadd6e36caa653
3
+ metadata.gz: dcab3e7234b02634d2b6d35c021a6e74d1e500e9
4
+ data.tar.gz: 9bc8b2270e6a4616d5c9f01802383992be7d010d
5
5
  SHA512:
6
- metadata.gz: 655af01e192a8a526bcd14d6237a9c63890f3c19a3eda6f13ca3cbc0bb312bb0249e34d39eebbd16211455865dde162d79372d23ffe4a440ae4e68bb9ecd2e4c
7
- data.tar.gz: af77111bf507908117c3c800d8d76893bc67d9781acc41cda1e8ffca50fd0386916d30e8d20ada80c0bf2e4ec2fefabc6780b3e6ca87b2c860c6bbff5c193081
6
+ metadata.gz: 79c6c862dd727aa571b5d465a0cd61509615b08ee016bb6b9b981f7aa1f305fc9627014ff80a63332ed2e933a300e875cd1efff4b02dd37c1ac7731f6aa76957
7
+ data.tar.gz: c6cfd30e004d5e2e12120c3aa0876cc485b6b8aae49d64fc432e968daf3d93b1d73d5f2c85fbae4d58e37544bb6c25d6e948d067720906fe2375598c9011f859
data/README.md CHANGED
@@ -203,16 +203,18 @@ Normally an input is one line entered by the user. Like this:
203
203
  ```
204
204
  mysh> ls *.rb
205
205
  ```
206
- In mysh, the user is able to chain together multiple lines and have them
207
- treated as a single input. So for the following scenario:
206
+ In mysh, the user is able enter Ruby code directly at the command line. Since
207
+ these commands can be rather long, there is a need to to chain together
208
+ multiple lines and have them treated as a single input. So for the following
209
+ scenario:
208
210
  ```
209
- mysh>line one\
210
- mysh\line two\
211
- mysh\line three
211
+ mysh>= "line one" +\
212
+ mysh\"line two" +\
213
+ mysh\"line three"
212
214
  ```
213
215
  The input string will be:
214
216
  ```
215
- "line one\nline two\nline three\n"
217
+ "="line one" +\n"line two" +\n"line three"\n"
216
218
  ```
217
219
  Note that while the prompt is user configurable, it will always end with '>'
218
220
  for the initial line and '\\' for subsequent lines.
@@ -582,6 +584,8 @@ types | Help on mysh file types.
582
584
  usage | Help on mysh usage options.
583
585
  {{ | Help on mysh handlebars.
584
586
 
587
+ Also, absent any detailed help information, the help command will show the
588
+ summary of any internal command.
585
589
 
586
590
  ### Shell Info
587
591
 
@@ -889,6 +893,19 @@ information.
889
893
  To add a new help topic, simply add the new help file to the help folder and
890
894
  and a corresponding line entry to to the help variable.
891
895
 
896
+ #### Exceptions:
897
+
898
+ As an application, exception handling is largely an internal matter. However,
899
+ since user code can be embedded in mysh, they should be documented. The mysh
900
+ application gem uses the following exception classes:
901
+
902
+ Exception # From Ruby.
903
+ StandardError # From Ruby.
904
+ MyshException # The abstract base exception for mysh.
905
+ MyshExit # Exit the current mysh processing loop.
906
+ MyshStopOutput # Stop further output from a verbose command.
907
+
908
+
892
909
  ## Contributing
893
910
 
894
911
  All participation is welcomed. There are two fabulous plans to choose from:
data/lib/mysh.rb CHANGED
@@ -8,6 +8,7 @@ require 'in_array'
8
8
  require_relative 'mysh/exceptions'
9
9
  require_relative 'mysh/binding_wrapper'
10
10
  require_relative 'mysh/input_wrapper'
11
+ require_relative 'mysh/output_pager'
11
12
  require_relative 'mysh/user_input'
12
13
  require_relative 'mysh/expression'
13
14
  require_relative 'mysh/internal'
@@ -1,4 +1,10 @@
1
1
  # coding: utf-8
2
2
 
3
- #Exit the current mysh processing loop.
4
- class MyshExit < Exception; end
3
+ # The abstract base exception of the mysh.
4
+ class MyshException < StandardError; end
5
+
6
+ # Exit the current mysh processing loop.
7
+ class MyshExit < MyshException; end
8
+
9
+ # Stop further output from a verbose command.
10
+ class MyshStopOutput < MyshException; end
@@ -15,4 +15,20 @@ class Object
15
15
  Mysh.try_execute_command(str)
16
16
  end
17
17
 
18
+ # Execute a block with page paused output.
19
+ def more
20
+ saved = $stdout
21
+
22
+ if MNV[:page_pause].extract_mysh_types
23
+ $stdout = OutputPager.new if (outer = $stdout.equal?($mysh_out))
24
+ end
25
+
26
+ yield
27
+ rescue MyshStopOutput
28
+ raise unless outer
29
+ return
30
+ ensure
31
+ $stdout = saved
32
+ end
33
+
18
34
  end
@@ -11,7 +11,13 @@ module Mysh
11
11
  if (args = input.args).empty?
12
12
  puts Dir.pwd.to_host_spec
13
13
  else
14
- Dir.chdir(args[0]) unless args.empty?
14
+ begin
15
+ Dir.chdir(args[0])
16
+ rescue Errno::ENOENT
17
+ puts "Cannot find \"#{args[0]}\""
18
+ rescue Errno::EINVAL
19
+ puts "The file \"#{args[0]}\" is not a directory."
20
+ end
15
21
  end
16
22
  end
17
23
 
@@ -4,7 +4,7 @@
4
4
  module Mysh
5
5
 
6
6
  #Add the elapsed commands to the library.
7
- desc = 'Execute a command and then display the elapsed time.'
7
+ desc = 'Execute a command and then display the elapsed time. See ?% for more.'
8
8
 
9
9
  action = lambda do |input|
10
10
  start_time = Time.now
@@ -5,7 +5,18 @@ module Mysh
5
5
 
6
6
  # Help action pool of topics.
7
7
  default = Action.new do |args|
8
- puts "No help found for #{args[0].inspect}."
8
+ topic = args[0]
9
+ help = []
10
+
11
+ COMMANDS.actions_info.each do |cmd|
12
+ help << cmd if cmd[0].start_with?(topic)
13
+ end
14
+
15
+ if help.empty?
16
+ puts "No help found for #{topic.inspect}."
17
+ else
18
+ puts help.format_mysh_bullets
19
+ end
9
20
  end
10
21
 
11
22
  HELP = ActionPool.new("HELP", default)
@@ -24,7 +35,7 @@ module Mysh
24
35
  end
25
36
 
26
37
  # The base help command.
27
- desc = 'Display help information for mysh with an optional topic.'
38
+ desc = 'Display help information for mysh with an optional topic. See ?? for more.'
28
39
  COMMANDS.add_action(HelpCommand.new('help <topic>', desc))
29
40
  #The help command action object.
30
41
  HELP_COMMAND = HelpCommand.new('?<topic>', desc)
@@ -25,15 +25,15 @@ crass mini_portile2 rack-test thread_safe
25
25
 
26
26
  mysh>gls -l vls
27
27
  name vls
28
- version 0.4.0
29
- date 2016-10-08 00:00:00 UTC
28
+ version 0.4.1
29
+ date 2016-10-27 00:00:00 UTC
30
30
  summary A version listing utility.
31
31
  description A CLI and Rails console utility that lists the versions of modules
32
32
  used by the specified gems/ruby files or Rails project.
33
33
  executables vls
34
34
  authors Peter Camilleri
35
35
  email peter.c.camilleri@gmail.com
36
- homepage http://teuthida-technologies.com/
36
+ homepage https://github.com/PeterCamilleri/vls
37
37
 
38
38
  A complete guide to the gem specification's properties may be found at:
39
39
  http://guides.rubygems.org/specification-reference/
@@ -10,3 +10,11 @@ The available help topics are:
10
10
 
11
11
  {{ HELP.actions_info.format_mysh_bullets }}
12
12
 
13
+ Brief summaries are also available on the following internal commands:
14
+
15
+ {{ Mysh::COMMANDS.actions_info
16
+ .reject{|cmd| cmd[1]["See ?"]}
17
+ .map{|cmd| cmd[0].split[0] }
18
+ .join(" ")
19
+ }}
20
+
@@ -1,17 +1,9 @@
1
1
  # coding: utf-8
2
2
 
3
- #* mysh/internal/format.rb - Some formatting facilities for mysh.
4
- module Mysh
5
-
6
- #Assume an 80 column working area for formatting.
7
- PAGE_WIDTH = 80
8
-
9
- end
10
-
3
+ # Grab the mysh formatters
11
4
  require_relative 'format/bullets'
12
5
  require_relative 'format/columns'
13
6
  require_relative 'format/array'
14
7
  require_relative 'format/string'
15
8
  require_relative 'format/object'
16
9
  require_relative 'format/nil'
17
-
@@ -6,7 +6,7 @@ class Array
6
6
  # Columns ========================================================
7
7
 
8
8
  #Print out the array with efficient columns.
9
- def puts_mysh_columns(page_width = Mysh::PAGE_WIDTH)
9
+ def puts_mysh_columns(page_width = MiniTerm.width)
10
10
  puts format_mysh_columns(page_width)
11
11
  end
12
12
 
@@ -30,7 +30,7 @@ class Array
30
30
  #* A string.
31
31
  #<br>Endemic Code Smells
32
32
  #* :reek:FeatureEnvy -- false positive.
33
- def format_mysh_columns(page_width = Mysh::PAGE_WIDTH)
33
+ def format_mysh_columns(page_width = MiniTerm.width)
34
34
  raw_mysh_columns(page_width).join("\n")
35
35
  end
36
36
 
@@ -45,7 +45,7 @@ class Array
45
45
  # Bullets ========================================================
46
46
 
47
47
  #Print out the array as bullet points.
48
- def puts_mysh_bullets(page_width = Mysh::PAGE_WIDTH)
48
+ def puts_mysh_bullets(page_width = MiniTerm.width)
49
49
  puts format_mysh_bullets(page_width)
50
50
  end
51
51
 
@@ -54,7 +54,7 @@ class Array
54
54
  #* A string.
55
55
  #<br>Endemic Code Smells
56
56
  #* :reek:FeatureEnvy -- false positive.
57
- def format_mysh_bullets(page_width = Mysh::PAGE_WIDTH)
57
+ def format_mysh_bullets(page_width = MiniTerm.width)
58
58
  return "" if empty?
59
59
 
60
60
  builder = Mysh::BulletPoints.new(page_width)
@@ -0,0 +1,101 @@
1
+ # coding: utf-8
2
+
3
+ $mysh_out = $stdout # Keep a copy of the real $stdout.
4
+
5
+ # A class to manage paged output.
6
+ class OutputPager
7
+
8
+ # Set up the initial values.
9
+ def initialize
10
+ @lines = 0
11
+ @chars = 0
12
+ end
13
+
14
+ # Write out a general string with page pauses.
15
+ def write(str)
16
+ while !str.empty?
17
+ pre,mid,str = str.partition("\n")
18
+ write_str(pre) unless pre.empty?
19
+ writeln unless mid.empty?
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ # Write out a simple string with no embedded new-lines.
26
+ def write_str(str)
27
+ loop do
28
+ len = str.length
29
+
30
+ if @chars + len < chars_per_line
31
+ $mysh_out.write(str)
32
+ @chars += len
33
+ return
34
+ else
35
+ tilt = chars_per_line - @chars
36
+ $mysh_out.write(str[0, tilt])
37
+ count_lines
38
+
39
+ str = (str[tilt..-1])
40
+ end
41
+ end
42
+ end
43
+
44
+ # Write out a new-line.
45
+ def writeln
46
+ $mysh_out.write("\n")
47
+ count_lines
48
+ end
49
+
50
+ # A new line is out, count it!
51
+ def count_lines
52
+ @chars = 0
53
+ @lines += 1
54
+
55
+ if @lines >= (lines_per_page - 1)
56
+ case pause.downcase
57
+ when " "
58
+ @lines -= 1
59
+ when "q"
60
+ raise MyshStopOutput
61
+ else
62
+ @lines = 0
63
+ end
64
+ end
65
+ end
66
+
67
+ # Pause waiting for the user.
68
+ def pause
69
+ msg = pause_message
70
+ $mysh_out.write(msg)
71
+
72
+ MiniTerm.raw do |term|
73
+ result = term.get_raw_char
74
+ term.flush
75
+ result
76
+ end
77
+
78
+ ensure
79
+ $mysh_out.write("\r" + " " * msg.length + "\r")
80
+ end
81
+
82
+ # How many lines fit on a page?
83
+ def lines_per_page
84
+ result = MNV[:page_height].to_i
85
+ result = MiniTerm.height if result < 2
86
+ result
87
+ end
88
+
89
+ # How many characters fit on a line?
90
+ def chars_per_line
91
+ result = MNV[:page_width].to_i
92
+ result = MiniTerm.width if result < 20
93
+ result
94
+ end
95
+
96
+ # Get the text of the pause message.
97
+ def pause_message
98
+ MNV.key?(:page_msg) ? MNV[:page_msg] : "Press enter, space or q:"
99
+ end
100
+
101
+ end
data/lib/mysh/process.rb CHANGED
@@ -39,10 +39,12 @@ module Mysh
39
39
  def self.try_execute_command(str)
40
40
  input = InputWrapper.new(str)
41
41
 
42
- try_execute_quick(input) ||
43
- try_execute_internal(input) ||
44
- try_execute_external(input) ||
45
- try_execute_system(input)
42
+ more do
43
+ try_execute_quick(input) ||
44
+ try_execute_internal(input) ||
45
+ try_execute_external(input) ||
46
+ try_execute_system(input)
47
+ end
46
48
  end
47
49
 
48
50
  end
@@ -16,6 +16,11 @@ module Mysh
16
16
  MNV[:post_prompt] = "$prompt"
17
17
  MNV[:pre_prompt] = "$w"
18
18
 
19
+ MNV[:page_width] = "{{ MiniTerm.width }}"
20
+ MNV[:page_height] = "{{ MiniTerm.height }}"
21
+ MNV[:page_pause] = "on"
22
+ MNV[:page_msg] = "Press a key, a space, or q:"
23
+
19
24
  MNV[:d] = "{{ Time.now.strftime(MNV[:date_fmt]) }}"
20
25
  MNV[:h] = "{{ ENV['HOME'].to_host_spec }}"
21
26
  MNV[:r] = "{{ RbConfig.ruby.to_host_spec }}"
@@ -16,13 +16,19 @@ module Mysh
16
16
 
17
17
  #Construct a new data list for auto-complete
18
18
  def rebuild(str)
19
+ if /(?<=\s|^)\$[a-z][a-z0-9_]*\z/ =~ str
20
+ sym = $MATCH[1..-1].to_sym
21
+ @active_source = nil
22
+ return @str = $PREMATCH + MNV[sym] if MNV.key?(sym)
23
+ end
24
+
19
25
  @active_source = (@prefix || str[0]) == '=' ? @quote_source : @auto_source
20
26
  @active_source.rebuild(str)
21
27
  end
22
28
 
23
29
  #Get the next string for auto-complete
24
30
  def next
25
- @active_source.next
31
+ @active_source ? @active_source.next : @str
26
32
  end
27
33
 
28
34
  end
@@ -18,7 +18,7 @@ module Mysh
18
18
 
19
19
  #Get any continuations of the inputs
20
20
  def self.get_command_extra(source, str)
21
- if /\\\s*$/ =~ str
21
+ if str.start_with?("=") && /\\\s*$/ =~ str
22
22
  get_command_extra(source, $PREMATCH + "\n" + source.get_command_extra(str))
23
23
  else
24
24
  str
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.6.3"
5
+ VERSION = "0.6.4"
6
6
 
7
7
  #A brief summary of this gem.
8
8
  SUMMARY = "mysh -- a Ruby inspired command line shell."
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mysh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.6.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-06 00:00:00.000000000 Z
11
+ date: 2018-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -220,6 +220,7 @@ files:
220
220
  - lib/mysh/internal/format/string.rb
221
221
  - lib/mysh/internal/manage.rb
222
222
  - lib/mysh/internal/to_file_spec.rb
223
+ - lib/mysh/output_pager.rb
223
224
  - lib/mysh/pre_processor.rb
224
225
  - lib/mysh/process.rb
225
226
  - lib/mysh/quick.rb