mysh 0.6.8 → 0.6.9

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