mini_readline 0.5.2 → 0.6.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4c4b59c3ed5eef086cdc8d84721c915aff9245a9
4
- data.tar.gz: 59cd9ed8d1551f35eff77d4741c0d929840adf29
3
+ metadata.gz: 677e16d732f1de6aaab8fe7a37c41e1abb18364c
4
+ data.tar.gz: f42cd241844d9810a030317fcd9f9ae4efaeeb58
5
5
  SHA512:
6
- metadata.gz: 01bbf868f58fd910b4b98bbc6a07847250ebb45ffa03aed55cb7e044d79d1a0844350f8d942850d56872e42fc8e14d8889e6252103b610b18ce9a2c8f0304a9c
7
- data.tar.gz: 80c1d3a44427f21da3f44b70253af0fa62856aad01aa63a23b50fb2090f5f108e9c36b2d11e4c8483b215d791281b658112d3c1d09c770e353c93286bd65cc16
6
+ metadata.gz: e2f9de63c86714f2e338c361477c020d0d38ad9f9f1082eee28a358b0391f9eac9f0dff12b51df75c194294c7d721051518984f2d3d3148831e3f6cd08f06f7d
7
+ data.tar.gz: fc33371d82f378538db0ef0df28e40615b977729a5fbb6526ca43b3f1db6477d6d08758b0c22e4c5e058389a78bc85bc15f0cdabbfdb66496e8904faffdee7b1
data/README.md CHANGED
@@ -282,15 +282,31 @@ the environment and plugs in the needed object. This can be overridden where
282
282
  special io needs exist.
283
283
 
284
284
  ### Auto-Complete
285
- The mini readline gem comes with three auto-complete engines. These are:
286
- * MiniReadline::ArraySource - Make a selection from an array of choices. That
287
- array is found in the option :array_src. This can either be an array of
288
- strings or a proc (or lambda) that returns an array of strings.
289
- * MiniReadline::FileFolderSource - A simple, in-line auto-complete for files
290
- and folders that do **not** contain embedded spaces.
291
- * MiniReadline::QuotedFileFolderSource - A simple, in-line auto-complete for
292
- files and folders embedded in quotes. For example "foo bar.rb". Note that the
293
- file names may contain spaces. This is the default auto-complete data source.
285
+ The mini readline gem comes with four auto-complete engines. These are:
286
+
287
+ ###### MiniReadline::ArraySource
288
+ Make a selection from an array of choices. That array is found in the
289
+ option :array_src. This can either be an array of strings or a proc (or lambda)
290
+ that returns an array of strings. This is an excellent choice for choosing
291
+ from a list or program generated selection of choices.
292
+
293
+ ###### MiniReadline::FileFolderSource
294
+ A simple, in-line auto-complete for files and folders. This is an excellent
295
+ choice for cases where file names are to be used by a ruby program or passed
296
+ to a Linux/Other command line shell.
297
+
298
+ ###### MiniReadline::QuotedFileFolderSource
299
+ A simple, in-line auto-complete for files and folders embedded in quotes.
300
+ This is a good choice where the returned string is to be evaluated as ruby
301
+ code. The enclosing quotes will ensure that file names are evaluated as
302
+ strings. NOTE: This is the default auto-complete data source.
303
+
304
+ ###### MiniReadline::AutoFileSource
305
+ This auto-complete for files and folders is designed to automatically select
306
+ the appropriate folder separator character and use quotes when files contain
307
+ embedded spaces. This is a good choice when building commands with files that
308
+ will be passed to the command line processor in multi-platform, portable
309
+ environments.
294
310
 
295
311
  ### Adding Custom Auto-Completers
296
312
  It is possible, and fairly straightforward to add application specific
@@ -344,6 +360,13 @@ options.
344
360
  statement to permit the use of clearer, easier to read access to regular
345
361
  expression results.
346
362
 
363
+ ### Important Security Note
364
+
365
+ It must be remembered that any time strings are passed to the command line
366
+ processor, there are serious security concerns. Passing such strings should
367
+ only be done in cases where the user would be trusted with access to the
368
+ command line itself. Untrusted users should **never** be given such access!
369
+
347
370
  ## Demo
348
371
  A simple demo of mini_readline in action is available. To access this demo use
349
372
  the following from the mini_readline root folder:
@@ -37,10 +37,12 @@ module MiniReadline
37
37
  #* prompt - A string used to prompt the user. '>' is popular.
38
38
  #* options - A hash of options; Typically symbol: value
39
39
  def readline(options = {})
40
+ suppress_warnings
40
41
  initialize_parms(options)
41
42
  @edit.edit_process
42
43
  ensure
43
44
  @term.conclude
45
+ restore_warnings
44
46
  end
45
47
 
46
48
  #Initialize the read line process. This basically process the arguments
@@ -78,5 +80,18 @@ module MiniReadline
78
80
  fail "Too long: #{prompt.inspect}"
79
81
  end
80
82
  end
83
+
84
+ #No warnings please!
85
+ def suppress_warnings
86
+ @old_stderr = $stderr
87
+ $stderr = File.open(File::NULL, 'w')
88
+ end
89
+
90
+ #Restore warnings to their typical ugliness.
91
+ def restore_warnings
92
+ $stderr.close
93
+ $stderr = @old_stderr
94
+ end
95
+
81
96
  end
82
97
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'auto_complete/auto_manager'
4
4
  require_relative 'auto_complete/file_folder_source'
5
+ require_relative 'auto_complete/auto_file_source'
5
6
  require_relative 'auto_complete/quoted_file_folder_source'
6
7
  require_relative 'auto_complete/array_source'
7
8
 
@@ -0,0 +1,79 @@
1
+ # coding: utf-8
2
+
3
+ #* auto_file.rb - The data source for mysh file name auto-complete.
4
+ module MiniReadline
5
+
6
+ #* auto_file_source.rb - A flexible file source for shell emulation.
7
+ class AutoFileSource
8
+
9
+ #Create a new file/folder auto-data source. NOP
10
+ def initialize(_options)
11
+ #Do nothing here!
12
+ end
13
+
14
+ #Construct a new data list for auto-complete
15
+ def rebuild(str)
16
+ extract_root_pivot(str)
17
+
18
+ list = Dir.glob(dress_down(@pivot) + '*')
19
+
20
+ @cycler = list.empty? ? nil : list.cycle
21
+ end
22
+
23
+ #The regex for extraction of the root and pivot.
24
+ EXTRACT = /("[^"\s][^"]*"?$)|(\S+$)/
25
+
26
+ #Parse the string into the two basic components.
27
+ def extract_root_pivot(str)
28
+ @root, @pivot = EXTRACT =~ str ? [$PREMATCH, $MATCH] : [str, ""]
29
+ end
30
+
31
+ #Get the next string for auto-complete
32
+ def next
33
+ @root + dress_up(@cycler.next)
34
+ end
35
+
36
+ #Prepare the file name for internal use.
37
+ #<br>Endemic Code Smells
38
+ #* :reek:UtilityFunction
39
+ def dress_down(name)
40
+ name.gsub("\\", "/").gsub('"', '')
41
+ end
42
+
43
+ #Prepare the file name for external use.
44
+ #<br>Endemic Code Smells
45
+ #* :reek:UtilityFunction
46
+ def dress_up(name)
47
+ dress_up_quotes(dress_up_slashes(name))
48
+ end
49
+
50
+ #Dress up slashes and backslashes.
51
+ def dress_up_slashes(name)
52
+ backslash? ? name.gsub("/", "\\") : name
53
+ end
54
+
55
+ #Dress up in quotes if needed.
56
+ #<br>Endemic Code Smells
57
+ #* :reek:UtilityFunction
58
+ def dress_up_quotes(name)
59
+ name[' '] ? "\"#{name}\"" : name
60
+ end
61
+
62
+ #Does this file name use backslashes?
63
+ def backslash?
64
+ if @pivot.end_with?("\\")
65
+ true
66
+ elsif @pivot.end_with?("/")
67
+ false
68
+ elsif @pivot["\\"]
69
+ true
70
+ elsif @pivot["/"]
71
+ false
72
+ else
73
+ MiniReadline::PLATFORM == :windows
74
+ end
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -1,4 +1,4 @@
1
1
  module MiniReadline
2
2
  #The current version of the mini_readline gem.
3
- VERSION = "0.5.2"
3
+ VERSION = "0.6.0"
4
4
  end
@@ -119,7 +119,7 @@ class MiniReadlineTester < Minitest::Test
119
119
  assert(result.is_a?(String))
120
120
  end
121
121
 
122
- def test_file_quoated
122
+ def test_file_quoted
123
123
  puts "\nPlease select an quoted file."
124
124
 
125
125
  edit = MiniReadline::Readline.new(auto_complete: true,
@@ -129,6 +129,16 @@ class MiniReadlineTester < Minitest::Test
129
129
  assert(result.is_a?(String))
130
130
  end
131
131
 
132
+ def test_file_shell
133
+ puts "\nPlease select an auto file."
134
+
135
+ edit = MiniReadline::Readline.new(auto_complete: true,
136
+ auto_source: MiniReadline::AutoFileSource)
137
+
138
+ result = edit.readline(prompt: "File: ")
139
+ assert(result.is_a?(String))
140
+ end
141
+
132
142
  def test_end_of_input_detection
133
143
  edit = MiniReadline::Readline.new()
134
144
  puts "Exit by signaling end of input"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_readline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Camilleri
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-03 00:00:00.000000000 Z
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -98,6 +98,7 @@ files:
98
98
  - lib/mini_readline/read_line/edit.rb
99
99
  - lib/mini_readline/read_line/edit/auto_complete.rb
100
100
  - lib/mini_readline/read_line/edit/auto_complete/array_source.rb
101
+ - lib/mini_readline/read_line/edit/auto_complete/auto_file_source.rb
101
102
  - lib/mini_readline/read_line/edit/auto_complete/auto_manager.rb
102
103
  - lib/mini_readline/read_line/edit/auto_complete/file_folder_source.rb
103
104
  - lib/mini_readline/read_line/edit/auto_complete/quoted_file_folder_source.rb