mysh 0.6.8 → 0.6.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8403491794cc9b50c4dc0bed451e056885cc71d0
4
- data.tar.gz: 72acbb99d7324a29ba47507c011497355fd61069
3
+ metadata.gz: dc2ce1a31750c110022b543778cb28e70b4f2456
4
+ data.tar.gz: e5f15032fa38956e7f06be1f8cc92ce5de7feba9
5
5
  SHA512:
6
- metadata.gz: f82fd9fc077c6f6b3e205eae6cbadba360ef37c98a3a25364c8fd9ba4b6aa7ffbdeaf18fd8be0271bff3f760bdabc7c87cf7f74163c55c3464f1441ca576069d
7
- data.tar.gz: 5ac0b97c97351f5234c4da238869682dd3dcbac81318876cc20f04d4cf97c590caca373caccfc5221f358fd7dff2fdd1593687ad830849dc31c0088c5f687b25
6
+ metadata.gz: 4484f3c07c6ac22a7ccba4b29dd87116926f0731d4b9c54bd54ecefcefcea8676c8fe111d7f7c98be1331ed7ea17798af7d3566ef064d94d879fae89619001fa
7
+ data.tar.gz: 7c4a82903c595abd907bd02285051bbb0805481fa54b65f3993359fea6c24376d6f58646f3400ddc9aab36c636fde249d9265c94960339c365954bdad01f9f42
data/README.md CHANGED
@@ -292,65 +292,20 @@ are:
292
292
 
293
293
  * String#to_host_spec - given a string with a file path/name value, express that
294
294
  string in a manner compatible with the current operating environment.
295
- * Array#format_mysh_columns - take an array and convert it to a string with nice
296
- regular columns.
297
- * Array#puts_mysh_columns - as above, but print the string.
298
- * Array#format_mysh_bullets - take an array and convert it to a string with nice
299
- bullet points. The appearance of each point depends on its structure. See below:
300
- * Array#puts_mysh_bullets - as above, but print the string.
301
-
302
- This must all be confusing. Some examples may help:
303
-
304
- ```
305
- mysh>=puts "lib/mysh/expression/lineage.rb".to_host_spec
306
- lib\mysh\expression\lineage.rb
307
-
308
- mysh>=(1..100).to_a.puts_mysh_columns
309
- 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
310
- 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
311
- 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
312
- 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
313
-
314
- mysh>=["foo", "bar "*30, "some "*25, "stuff"].puts_mysh_bullets
315
- * foo
316
- * bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar
317
- bar bar bar bar bar bar bar bar bar bar bar
318
- * some some some some some some some some some some some some some some some
319
- some some some some some some some some some some
320
- * stuff
321
-
322
- mysh>=[["foo", "bar "*20], ["sna", "foo young "*10 ] ].puts_mysh_bullets
323
- foo bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar bar
324
- bar bar
325
- sna foo young foo young foo young foo young foo young foo young foo young foo
326
- young foo young foo young
327
-
328
- mysh>=[["foo", 1,2,3]].puts_mysh_bullets
329
- foo 1
330
- 2
331
- 3
332
-
333
- mysh>=[[(1..100).to_a]].puts_mysh_bullets
334
- * 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
335
- 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
336
- 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
337
- 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
338
-
339
- mysh>=[["foo", (1..100).to_a], ["baz", "yes"]].puts_mysh_bullets
340
- foo 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
341
- 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
342
- 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
343
- 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
344
- baz yes
345
295
 
346
- ```
296
+ ###### Formatting
297
+
298
+ To assist in creating nicely formatted output, the mysh employs the
299
+ format_output gem. Please refer to that gem for more information.
347
300
 
348
301
  ###### Page Pause
349
302
 
350
303
  Some commands can generate very lengthy output that can scroll off the top of
351
- the screen. to handle this, mysh automatically inserts pauses once per screen.
352
- At this point, it displays a prompt and waits for the users to press a key that
353
- will determine the action to take. The default message is:
304
+ the screen. To handle this, mysh automatically inserts pauses once per screen.
305
+ Now this capability has been moved into the pause_output gem, but since it has
306
+ an impact on the user "experience" it is discussed here. When a pause point is
307
+ reached, mysh displays a prompt and waits for the users to press a key that
308
+ will determine the action to take. The default pause prompt message is:
354
309
 
355
310
  Press a key, a space, or q:
356
311
 
@@ -996,7 +951,6 @@ application gem uses the following exception classes:
996
951
  StandardError # From Ruby.
997
952
  MyshException # The abstract base exception for mysh.
998
953
  MyshExit # Exit the current mysh processing loop.
999
- MyshStopOutput # Stop further output from a verbose command.
1000
954
  MyshUsage # Internal: Used by the --help options.
1001
955
 
1002
956
 
data/lib/mysh.rb CHANGED
@@ -4,11 +4,12 @@
4
4
 
5
5
  require 'English'
6
6
  require 'in_array'
7
+ require 'pause_output'
8
+ require 'format_output'
7
9
 
8
10
  require_relative 'mysh/exceptions'
9
11
  require_relative 'mysh/binding_wrapper'
10
12
  require_relative 'mysh/input_wrapper'
11
- require_relative 'mysh/output_pager'
12
13
  require_relative 'mysh/user_input'
13
14
  require_relative 'mysh/expression'
14
15
  require_relative 'mysh/internal'
@@ -6,8 +6,5 @@ class MyshException < StandardError; end
6
6
  # Exit the current mysh processing loop.
7
7
  class MyshExit < MyshException; end
8
8
 
9
- # Stop further output from a verbose command.
10
- class MyshStopOutput < MyshException; end
11
-
12
9
  # Display usage info and exit.
13
10
  class MyshUsage < MyshException; end
@@ -15,24 +15,6 @@ 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_boolean
23
- $stdout = OutputPager.new if (outer = $stdout.equal?($mysh_out))
24
- end
25
-
26
- yield
27
-
28
- rescue MyshStopOutput
29
- raise unless outer
30
- return
31
-
32
- ensure
33
- $stdout = saved
34
- end
35
-
36
18
  # Unwrap one mysh layer.
37
19
  def cancel
38
20
  raise MyshExit
data/lib/mysh/internal.rb CHANGED
@@ -4,7 +4,6 @@ require_relative 'internal/actions/actions_path'
4
4
  require_relative 'internal/action'
5
5
  require_relative 'internal/action_pool'
6
6
  require_relative 'internal/manage'
7
- require_relative 'internal/format'
8
7
  require_relative 'internal/to_file_spec'
9
8
 
10
9
  #Load up the internal actions!
@@ -46,7 +46,7 @@ module Mysh
46
46
  exit
47
47
 
48
48
  rescue => err
49
- more do
49
+ more(MNV) do
50
50
  puts "", err.to_s, ""
51
51
  HELP["usage"].process_command(nil)
52
52
  end
@@ -45,7 +45,7 @@ module Mysh
45
45
 
46
46
  #The brief gem list report.
47
47
  def short_report
48
- puts @specs.map {|spec| spec.name}.format_mysh_columns, ""
48
+ puts @specs.map {|spec| spec.name}.format_output_columns, ""
49
49
  end
50
50
 
51
51
  #The long-winded gem list report.
@@ -54,7 +54,7 @@ module Mysh
54
54
  buffer.concat(info(spec))
55
55
  end
56
56
 
57
- puts report.format_mysh_bullets
57
+ report.puts_format_output_bullets
58
58
  end
59
59
 
60
60
  #Get detailed information on a gem specification.
@@ -15,7 +15,7 @@ module Mysh
15
15
  if help.empty?
16
16
  puts "No help found for #{topic.inspect}."
17
17
  else
18
- puts help.format_mysh_bullets
18
+ help.puts_format_output_bullets
19
19
  end
20
20
  end
21
21
 
@@ -8,7 +8,7 @@ quick form, ? is used, the space is optional.
8
8
 
9
9
  The available help topics are:
10
10
 
11
- {{ HELP.actions_info.format_mysh_bullets }}
11
+ {{ HELP.actions_info.format_output_bullets }}
12
12
 
13
13
  Brief summaries are also available on the following internal commands:
14
14
 
@@ -11,7 +11,7 @@ In mysh, commands fall into one of three broad categories. There are:
11
11
  2) Internal mysh commands are processed within mysh itself. The following set
12
12
  of commands are supported:
13
13
 
14
- {{ Mysh::COMMANDS.actions_info.format_mysh_bullets }}
14
+ {{ Mysh::COMMANDS.actions_info.format_output_bullets }}
15
15
 
16
16
  3) All other commands are executed by the system using the standard shell or
17
17
  the appropriate ruby interpreter. If the command has a '.rb' extension, it
@@ -8,5 +8,5 @@ quick form, @ is used, the space is optional.
8
8
 
9
9
  The available show items are:
10
10
 
11
- {{ SHOW.actions_info.format_mysh_bullets }}
11
+ {{ SHOW.actions_info.format_output_bullets }}
12
12
 
@@ -4,5 +4,5 @@ Usage: mysh <args>
4
4
 
5
5
  Where args are one or more of the following command options:
6
6
 
7
- {{ Mysh::COMMAND_LINE.actions_info.format_mysh_bullets }}
7
+ {{ Mysh::COMMAND_LINE.actions_info.format_output_bullets }}
8
8
 
@@ -15,7 +15,7 @@ module Mysh
15
15
  if results.empty?
16
16
  puts "No modules found for filter #{filter.inspect}.", ""
17
17
  else
18
- puts results.format_mysh_bullets, ""
18
+ puts results.format_output_bullets, ""
19
19
  end
20
20
  end
21
21
 
@@ -9,10 +9,11 @@ module Mysh
9
9
  # Execute the @env shell command.
10
10
  def process_command(_args)
11
11
  print WORKING unless @ran_once
12
+ Gem.refresh
12
13
 
13
14
  puts "Key mysh environment information.", "",
14
- info.format_mysh_bullets, "",
15
- path.format_mysh_bullets, ""
15
+ info.format_output_bullets, "",
16
+ path.format_output_bullets, ""
16
17
 
17
18
  @ran_once = true
18
19
  end
@@ -3,12 +3,13 @@
3
3
  # Get help on the gem environment.
4
4
  module Mysh
5
5
 
6
- # Get help on the gem environment.
6
+ # Get information on the gem environment.
7
7
  class GemInfoCommand < Action
8
8
 
9
9
  #Execute the @gem shell command.
10
10
  def process_command(input)
11
11
  print WORKING unless @ran_once
12
+ Gem.refresh
12
13
 
13
14
  args = input.cooked_body.split(" ")[1..-1]
14
15
 
@@ -26,8 +27,8 @@ module Mysh
26
27
  # A general info request
27
28
  def general
28
29
  puts "Key gem system information.", "",
29
- info.format_mysh_bullets, "",
30
- path.format_mysh_bullets, ""
30
+ info.format_output_bullets, "",
31
+ path.format_output_bullets, ""
31
32
  end
32
33
 
33
34
  # Get the info
@@ -62,27 +63,31 @@ module Mysh
62
63
  def specific(args)
63
64
  details = []
64
65
 
65
- args.each do |gem|
66
- version_list = Gem::Specification.find_all_by_name(gem)
67
- .map{|s| s.version.to_s}
66
+ args.each do |gem_name|
67
+ version_list = Gem::Specification.find_all_by_name(gem_name)
68
+ .map {|spec| spec.version.to_s}
68
69
  .join(", ")
69
- details << [gem, version_list]
70
+ details << [gem_name, version_list]
70
71
 
71
- latest = insouciant {latest_version_for(gem).to_s}
72
+ latest = insouciant {latest_version_for(gem_name).to_s}
72
73
  details << ["latest", latest]
73
74
  details << [" ", " "]
74
75
  end
75
76
 
76
77
  puts "Info on specified gems.", "",
77
- details.format_mysh_bullets
78
+ details.format_output_bullets
78
79
  end
79
80
 
80
81
  # Get the latest version for the named gem. Patched code.
81
82
  def latest_version_for(name)
82
83
  dependency = Gem::Dependency.new(name)
83
84
  fetcher = Gem::SpecFetcher.fetcher
84
- spec = fetcher.spec_for_dependency(dependency)[0][-1][0]
85
- spec && spec.version
85
+ if specs = fetcher.spec_for_dependency(dependency)[0][-1]
86
+ spec = specs[0]
87
+ spec && spec.version
88
+ else
89
+ "<Not found in repository>"
90
+ end
86
91
  end
87
92
 
88
93
  end
@@ -9,8 +9,8 @@ module Mysh
9
9
  #Execute the @ruby shell command.
10
10
  def process_command(_input)
11
11
  puts "Key ruby environment information.", ""
12
- puts info.format_mysh_bullets, "",
13
- path.format_mysh_bullets, ""
12
+ puts info.format_output_bullets, "",
13
+ path.format_output_bullets, ""
14
14
  end
15
15
 
16
16
  private
@@ -9,9 +9,10 @@ module Mysh
9
9
  #Execute the @term shell command.
10
10
  def process_command(_args)
11
11
  print WORKING unless @ran_once
12
+ Gem.refresh
12
13
 
13
14
  puts "Key term information.", "",
14
- info.format_mysh_bullets, ""
15
+ info.format_output_bullets, ""
15
16
 
16
17
  @ran_once = true
17
18
  end
@@ -50,7 +50,7 @@ module Mysh
50
50
  puts (MNV.keys - ['$'.to_sym])
51
51
  .sort
52
52
  .map {|sym| ["$" + sym.to_s, MNV.get_source(sym)]}
53
- .format_mysh_bullets
53
+ .format_output_bullets
54
54
  end
55
55
 
56
56
  end
data/lib/mysh/process.rb CHANGED
@@ -42,7 +42,7 @@ module Mysh
42
42
  def self.try_execute_command(str)
43
43
  input = InputWrapper.new(str)
44
44
 
45
- more do
45
+ more(MNV) do
46
46
  try_execute_quick(input) ||
47
47
  try_execute_internal(input) ||
48
48
  try_execute_external(input) ||
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.8"
5
+ VERSION = "0.6.9"
6
6
 
7
7
  #A brief summary of this gem.
8
8
  SUMMARY = "mysh -- a Ruby inspired command line shell."
data/mysh.gemspec CHANGED
@@ -31,6 +31,9 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'reek', "~> 5.0.2"
32
32
 
33
33
  spec.add_runtime_dependency 'mini_readline', "~> 0.9.0"
34
+ spec.add_runtime_dependency 'mini_term', "~> 0.1.0"
35
+ spec.add_runtime_dependency 'pause_output', "~> 0.1.0"
36
+ spec.add_runtime_dependency 'format_output', "~> 0.1.0"
34
37
  spec.add_runtime_dependency 'vls', "~> 0.4.1"
35
38
  spec.add_runtime_dependency 'in_array', "~> 0.1.8"
36
39
  end
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)**2} ],
10
- ["Cubes", Array.new(count){|i| (i+1)**3} ]].format_mysh_bullets }}
10
+ ["Cubes", Array.new(count){|i| (i+1)**3} ]].format_output_bullets }}
11
11
 
@@ -73,52 +73,6 @@ class MyShellTester < Minitest::Test
73
73
  (4).lineage)
74
74
  end
75
75
 
76
- def test_some_formatting
77
- assert_equal("1 4\n2 5\n3 ", [1,2,3,4,5].format_mysh_columns(5))
78
- assert_equal(["1 4", "2 5", "3 "], [1,2,3,4,5].format_description(5))
79
-
80
- assert_equal(["1 2", "3 4", "5"], "1 2 3 4 5".format_description(5))
81
-
82
- assert_equal([], [].format_description(5))
83
- assert_equal([], nil.format_description(5))
84
-
85
- result =
86
- "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" +
87
- "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" +
88
- "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" +
89
- "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"
90
-
91
- assert_equal(result, (1..100).to_a.format_mysh_columns)
92
-
93
- data =
94
- [["key_largo", "/long_folder_name_one/long_folder_name_two/long_folder_name_three/fine_descriptive_name"],
95
- ["key_west", "Semper ubi sub ubi. Semper ubi sub ubi. Semper ubi sub ubi. Semper ubi sub ubi. "],
96
- ["counting", Array.new(100) {|i| i} ],
97
- ["pie", Math::PI]
98
- ]
99
-
100
- result =
101
- "key_largo /long_folder_name_one/long_folder_name_two/long_folder_name_three/fin\n" +
102
- " e_descriptive_name\n" +
103
- "key_west Semper ubi sub ubi. Semper ubi sub ubi. Semper ubi sub ubi. Semper\n" +
104
- " ubi sub ubi.\n" +
105
- "counting 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95\n" +
106
- " 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96\n" +
107
- " 2 7 12 17 22 27 32 37 42 47 52 57 62 67 72 77 82 87 92 97\n" +
108
- " 3 8 13 18 23 28 33 38 43 48 53 58 63 68 73 78 83 88 93 98\n" +
109
- " 4 9 14 19 24 29 34 39 44 49 54 59 64 69 74 79 84 89 94 99\n" +
110
- "pie 3.141592653589793"
111
-
112
- assert_equal(result, data.format_mysh_bullets)
113
-
114
- assert_equal("", [].format_mysh_bullets)
115
-
116
- data = ["apple", "cherry", "victory"]
117
- result = "* apple\n* cherry\n* victory"
118
- assert_equal(result, data.format_mysh_bullets)
119
-
120
- end
121
-
122
76
  def test_mysh_variables
123
77
  assert_equal("", MNV[:test])
124
78
  assert_equal("", MNV.get_source(:test))
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.8
4
+ version: 0.6.9
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-12-09 00:00:00.000000000 Z
11
+ date: 2018-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -108,6 +108,48 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: 0.9.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: mini_term
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.1.0
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.1.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: pause_output
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.1.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.1.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: format_output
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.1.0
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.1.0
111
153
  - !ruby/object:Gem::Dependency
112
154
  name: vls
113
155
  requirement: !ruby/object:Gem::Requirement
@@ -215,16 +257,8 @@ files:
215
257
  - lib/mysh/internal/actions/show/term.rb
216
258
  - lib/mysh/internal/actions/type.rb
217
259
  - lib/mysh/internal/actions/vars.rb
218
- - lib/mysh/internal/format.rb
219
- - lib/mysh/internal/format/array.rb
220
- - lib/mysh/internal/format/bullets.rb
221
- - lib/mysh/internal/format/columns.rb
222
- - lib/mysh/internal/format/nil.rb
223
- - lib/mysh/internal/format/object.rb
224
- - lib/mysh/internal/format/string.rb
225
260
  - lib/mysh/internal/manage.rb
226
261
  - lib/mysh/internal/to_file_spec.rb
227
- - lib/mysh/output_pager.rb
228
262
  - lib/mysh/pre_processor.rb
229
263
  - lib/mysh/process.rb
230
264
  - lib/mysh/quick.rb
@@ -1,9 +0,0 @@
1
- # coding: utf-8
2
-
3
- # Grab the mysh formatters
4
- require_relative 'format/bullets'
5
- require_relative 'format/columns'
6
- require_relative 'format/array'
7
- require_relative 'format/string'
8
- require_relative 'format/object'
9
- require_relative 'format/nil'
@@ -1,77 +0,0 @@
1
- # coding: utf-8
2
-
3
- #* internal/format/array.rb - Support for displaying an array formatted neatly.
4
- class Array
5
-
6
- # Columns ========================================================
7
-
8
- #Print out the array with efficient columns.
9
- def puts_mysh_columns(page_width = MiniTerm.width)
10
- puts format_mysh_columns(page_width)
11
- end
12
-
13
- #Convert the array to strings with efficient columns.
14
- #<br>Returns
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)
20
-
21
- each {|item| builder.add(item)}
22
-
23
- builder.render
24
- end
25
-
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 = MiniTerm.width)
34
- raw_mysh_columns(page_width).join("\n")
35
- end
36
-
37
- #Get the widest element of an array.
38
- #<br>Returns
39
- #* The width of the widest string in the array.
40
- def mysh_column_width
41
- max_by {|item| item.length}.length
42
- end
43
-
44
-
45
- # Bullets ========================================================
46
-
47
- #Print out the array as bullet points.
48
- def puts_mysh_bullets(page_width = MiniTerm.width)
49
- puts format_mysh_bullets(page_width)
50
- end
51
-
52
- #Convert the array to strings with bullet points.
53
- #<br>Returns
54
- #* A string.
55
- #<br>Endemic Code Smells
56
- #* :reek:FeatureEnvy -- false positive.
57
- def format_mysh_bullets(page_width = MiniTerm.width)
58
- return "" if empty?
59
-
60
- builder = Mysh::BulletPoints.new(page_width)
61
-
62
- each {|pair| builder.add(*pair.prepare_bullet_data)}
63
-
64
- builder.render.join("\n")
65
- end
66
-
67
- #Get data ready for being in a bullet point.
68
- def prepare_bullet_data
69
- if length < 2
70
- ["*", self[0]]
71
- else
72
- self
73
- end
74
- end
75
-
76
- end
77
-
@@ -1,58 +0,0 @@
1
- # coding: utf-8
2
-
3
- #* mysh/internal/format/bullets.rb - Print out bullet points.
4
- module Mysh
5
-
6
- #* mysh/internal/format/bullets.rb - A class to display data in bullet points.
7
- class BulletPoints
8
-
9
- #Prepare a blank slate.
10
- def initialize(page_width)
11
- @page_width = page_width
12
- @bullet_data = []
13
- @key_length = nil
14
- end
15
-
16
- #Add items to these bullet points.
17
- def add(bullet, *items)
18
- items.each do |item|
19
- @bullet_data << [bullet.to_s, item]
20
- bullet = ""
21
- end
22
- end
23
-
24
- #Render the bullet points as an array of strings.
25
- def render
26
- @key_length, results = get_key_length, []
27
-
28
- @bullet_data.each do |key, item|
29
- results.concat(render_bullet(key, item))
30
- end
31
-
32
- @bullet_data = []
33
- results
34
- end
35
-
36
- private
37
-
38
- #Allowing for a trailing space, how large is the largest bullet?
39
- def get_key_length
40
- (@bullet_data.max_by {|line| line[0].length})[0].length + 1
41
- end
42
-
43
- #Render one bullet point.
44
- def render_bullet(key, item)
45
- result = []
46
-
47
- item.format_description(@page_width - @key_length - 1).each do |desc_line|
48
- result << key.ljust(@key_length) + desc_line
49
- key = ""
50
- end
51
-
52
- result
53
- end
54
-
55
- end
56
-
57
- end
58
-
@@ -1,117 +0,0 @@
1
- # coding: utf-8
2
-
3
- #* mysh/internal/format/columns.rb - Print out data in neat columns.
4
- module Mysh
5
-
6
- #* mysh/internal/format/columns.rb - A class to display data in columns.
7
- class ColumnizedPage
8
- #Prepare a blank page.
9
- def initialize(page_width)
10
- @page_width = page_width
11
- @page_data = []
12
- end
13
-
14
- #Add an item to this page.
15
- #<br>Returns
16
- #* The number if items that did not fit in the page.
17
- def add(raw_item)
18
- item = raw_item.to_s
19
- fail "Item too large to fit." unless item.length < @page_width
20
-
21
- if (column = find_next_column)
22
- @page_data[column] << item
23
- else
24
- @page_data << [item]
25
- end
26
-
27
- adjust_configuration
28
- end
29
-
30
- #Render the page as an array of strings.
31
- def render
32
- results, column_widths = [], get_column_widths
33
-
34
- rows.times { |row_index| results << render_row(row_index, column_widths)}
35
-
36
- @page_data.clear
37
- results
38
- end
39
-
40
- private
41
-
42
- #Get the widths of all columns
43
- def get_column_widths
44
- @page_data.map {|column| column.mysh_column_width}
45
- end
46
-
47
- #Render a single row of data.
48
- def render_row(row_index, widths)
49
- @page_data.each_with_index.map do |column, index|
50
- column[row_index].to_s.ljust(widths[index])
51
- end.join(" ")
52
- end
53
-
54
- #Make sure the page fits within its boundaries.
55
- def adjust_configuration
56
- while total_width >= @page_width
57
- add_a_row
58
- end
59
- end
60
-
61
- #Add a row to the page, moving items as needed.
62
- def add_a_row
63
- new_rows = rows + 1
64
- pool, @page_data = @page_data.flatten, []
65
-
66
- until pool.empty?
67
- @page_data << pool.shift(new_rows)
68
- end
69
- end
70
-
71
- #Compute the total width of all of the columns.
72
- #<br>Returns
73
- #* The sum of the widths of the widest items of each column plus a space
74
- # between each of those columns.
75
- def total_width
76
- if empty?
77
- 0
78
- else
79
- #The starting point, @page_data.length-1, represents the spaces needed
80
- #between the columns. So N columns means N-1 spaces.
81
- @page_data.inject(@page_data.length-1) do |sum, column|
82
- sum + column.mysh_column_width
83
- end
84
- end
85
- end
86
-
87
- #Does the data fit on the page?
88
- def fits?
89
- total_width < @page_width
90
- end
91
-
92
- #How many rows are currently in this page?
93
- def rows
94
- empty? ? 0 : @page_data[0].length
95
- end
96
-
97
- #Is this page empty?
98
- def empty?
99
- @page_data.empty?
100
- end
101
-
102
- #Which column will receive the next item?
103
- #<br>Returns
104
- #* The index of the first non-filled column or nil if none found.
105
- def find_next_column
106
- (1...(@page_data.length)).each do |index|
107
- if @page_data[index].length < @page_data[index-1].length
108
- return index
109
- end
110
- end
111
-
112
- nil
113
- end
114
- end
115
-
116
- end
117
-
@@ -1,13 +0,0 @@
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
-
@@ -1,18 +0,0 @@
1
- # coding: utf-8
2
-
3
- #* internal/format/object.rb - Support for displaying data formatted neatly.
4
- class Object
5
-
6
- #Create a bullet point description from this object.
7
- def format_description(max_width)
8
- self.to_s.format_description(max_width)
9
- end
10
-
11
- #Get data ready for being in a bullet point.
12
- def prepare_bullet_data
13
- ["*", self]
14
- end
15
-
16
- end
17
-
18
-
@@ -1,60 +0,0 @@
1
- # coding: utf-8
2
-
3
- #* internal/format/string.rb - Support for displaying data formatted neatly.
4
- class String
5
-
6
- #Create a bullet point description from this string.
7
- #<br>Returns
8
- #* An array of strings.
9
- def format_description(max_width)
10
- do_format_description(split(' ').each, max_width)
11
- end
12
-
13
- #Do the formatting legwork.
14
- #<br>Returns
15
- #* An array of strings.
16
- def do_format_description(input, max_width)
17
- buffer, build, empty = [], "", false
18
-
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?
22
- end
23
-
24
- unless empty
25
- buffer << build
26
- end
27
-
28
- buffer
29
- end
30
-
31
- #Split if adding a word goes over a little.
32
- #<br>Returns
33
- #* A string.
34
- def split_if_over(word, max_width, buffer)
35
- word.prepend(" ") unless empty? #Add a space except for the first word.
36
-
37
- word_len = word.length
38
-
39
- if (length + word_len) >= max_width && word_len < max_width
40
- buffer << self #Line done, add to buffer.
41
- word.lstrip #Start of a new line, remove the leading space.
42
- else
43
- self + word
44
- end
45
- end
46
-
47
- #Split up a overlong blob of text.
48
- #<br>Returns
49
- #* A string.
50
- def split_if_huge(max_width, buffer)
51
-
52
- #Slice away any excess text into lines in the buffer.
53
- while length >= max_width
54
- buffer << slice!(0, max_width)
55
- end
56
-
57
- self
58
- end
59
- end
60
-
@@ -1,106 +0,0 @@
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
- # Write out an object as a string.
24
- def <<(obj)
25
- write(obj.to_s)
26
- end
27
-
28
- private
29
-
30
- # Write out a simple string with no embedded new-lines.
31
- def write_str(str)
32
- loop do
33
- len = str.length
34
-
35
- if @chars + len < chars_per_line
36
- $mysh_out.write(str)
37
- @chars += len
38
- return
39
- else
40
- tilt = chars_per_line - @chars
41
- $mysh_out.write(str[0, tilt])
42
- count_lines
43
-
44
- str = (str[tilt..-1])
45
- end
46
- end
47
- end
48
-
49
- # Write out a new-line.
50
- def writeln
51
- $mysh_out.write("\n")
52
- count_lines
53
- end
54
-
55
- # A new line is out, count it!
56
- def count_lines
57
- @chars = 0
58
- @lines += 1
59
-
60
- if @lines >= (lines_per_page - 1)
61
- case pause.downcase
62
- when " "
63
- @lines -= 1
64
- when "q"
65
- raise MyshStopOutput
66
- else
67
- @lines = 0
68
- end
69
- end
70
- end
71
-
72
- # Pause waiting for the user.
73
- def pause
74
- msg = pause_message
75
- $mysh_out.write(msg)
76
-
77
- MiniTerm.raw do |term|
78
- result = term.get_raw_char
79
- term.flush
80
- result
81
- end
82
-
83
- ensure
84
- $mysh_out.write("\r" + " " * msg.length + "\r")
85
- end
86
-
87
- # How many lines fit on a page?
88
- def lines_per_page
89
- result = MNV[:page_height].to_i
90
- result = MiniTerm.height if result < 2
91
- result
92
- end
93
-
94
- # How many characters fit on a line?
95
- def chars_per_line
96
- result = MNV[:page_width].to_i
97
- result = MiniTerm.width if result < 20
98
- result
99
- end
100
-
101
- # Get the text of the pause message.
102
- def pause_message
103
- MNV.key?(:page_msg) ? MNV[:page_msg] : "Press enter, space or q:"
104
- end
105
-
106
- end