tty 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +45 -115
- data/lib/tty.rb +3 -31
- data/lib/tty/plugins/plugin.rb +2 -2
- data/lib/tty/terminal.rb +2 -58
- data/lib/tty/terminal/home.rb +27 -9
- data/lib/tty/version.rb +1 -1
- data/spec/tty/plugins/plugin/load_spec.rb +10 -18
- data/spec/tty/system/editor/open_spec.rb +1 -1
- data/spec/tty/terminal/home_spec.rb +18 -26
- data/spec/tty/tty_spec.rb +1 -1
- data/spec/tty/vector/new_spec.rb +1 -1
- metadata +2 -83
- data/lib/tty/shell.rb +0 -211
- data/lib/tty/shell/distance.rb +0 -49
- data/lib/tty/shell/question.rb +0 -335
- data/lib/tty/shell/question/modifier.rb +0 -93
- data/lib/tty/shell/question/validation.rb +0 -92
- data/lib/tty/shell/reader.rb +0 -110
- data/lib/tty/shell/response.rb +0 -249
- data/lib/tty/shell/response_delegation.rb +0 -55
- data/lib/tty/shell/statement.rb +0 -60
- data/lib/tty/shell/suggestion.rb +0 -126
- data/lib/tty/support/utils.rb +0 -16
- data/lib/tty/terminal/echo.rb +0 -38
- data/lib/tty/terminal/raw.rb +0 -38
- data/spec/tty/shell/ask_spec.rb +0 -77
- data/spec/tty/shell/distance/distance_spec.rb +0 -75
- data/spec/tty/shell/distance/initialize_spec.rb +0 -14
- data/spec/tty/shell/error_spec.rb +0 -30
- data/spec/tty/shell/print_table_spec.rb +0 -24
- data/spec/tty/shell/question/argument_spec.rb +0 -30
- data/spec/tty/shell/question/character_spec.rb +0 -24
- data/spec/tty/shell/question/default_spec.rb +0 -25
- data/spec/tty/shell/question/in_spec.rb +0 -23
- data/spec/tty/shell/question/initialize_spec.rb +0 -24
- data/spec/tty/shell/question/modifier/apply_to_spec.rb +0 -34
- data/spec/tty/shell/question/modifier/letter_case_spec.rb +0 -27
- data/spec/tty/shell/question/modifier/whitespace_spec.rb +0 -33
- data/spec/tty/shell/question/modify_spec.rb +0 -44
- data/spec/tty/shell/question/valid_spec.rb +0 -46
- data/spec/tty/shell/question/validate_spec.rb +0 -30
- data/spec/tty/shell/question/validation/coerce_spec.rb +0 -24
- data/spec/tty/shell/question/validation/valid_value_spec.rb +0 -28
- data/spec/tty/shell/reader/getc_spec.rb +0 -42
- data/spec/tty/shell/response/read_bool_spec.rb +0 -40
- data/spec/tty/shell/response/read_char_spec.rb +0 -16
- data/spec/tty/shell/response/read_date_spec.rb +0 -20
- data/spec/tty/shell/response/read_email_spec.rb +0 -42
- data/spec/tty/shell/response/read_multiple_spec.rb +0 -23
- data/spec/tty/shell/response/read_number_spec.rb +0 -28
- data/spec/tty/shell/response/read_range_spec.rb +0 -31
- data/spec/tty/shell/response/read_spec.rb +0 -68
- data/spec/tty/shell/response/read_string_spec.rb +0 -19
- data/spec/tty/shell/say_spec.rb +0 -67
- data/spec/tty/shell/statement/initialize_spec.rb +0 -15
- data/spec/tty/shell/suggest_spec.rb +0 -50
- data/spec/tty/shell/warn_spec.rb +0 -30
- data/spec/tty/terminal/color_spec.rb +0 -16
- data/spec/tty/terminal/echo_spec.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aa562e7fbc18bbf508315687b7ff78d6fcc48065
|
4
|
+
data.tar.gz: 010a69a34e11b44425161db72f4faadf64e28a04
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d01e6e1e38b28bab95f362e574d9727c78d371385eb6ce9b828fee37f23219da45ec15dc765f6a6556a54a02d7d58588c7f3ed9da277bc46a7b0277e74944ecf
|
7
|
+
data.tar.gz: 5ba3bcaac12cd90c4a505452298e3c2d17a791581d6aa8eca8826437cfd1c838dfbb13ba11587a8532bcf5a9fad1a35c0a6dc0425a661097d34ae04752818854
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
0.3.0 (Nov 24, 2015)
|
2
|
+
|
3
|
+
* Extract prompting for user input as dependency on tty-prompt
|
4
|
+
* Extract terminal mode
|
5
|
+
* Remove support utils
|
6
|
+
* Update dependencies to latest
|
7
|
+
* Change home directory implementation
|
8
|
+
|
9
|
+
0.2.1 (Sept 20, 2015)
|
10
|
+
|
11
|
+
* Update dependencies to latest versions
|
12
|
+
|
1
13
|
0.2.0 (July 6, 2015)
|
2
14
|
|
3
15
|
* Extract platform detection as dependency on tty-platform
|
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<div align="center">
|
2
|
+
<a href="http://peter-murach.github.io/tty"><img width="130" src="https://cdn.rawgit.com/peter-murach/tty/master/images/tty.png" alt="tty logo" /></a>
|
3
|
+
</div>
|
4
|
+
<br/>
|
3
5
|
[![Gem Version](https://badge.fury.io/rb/tty.svg)][gem]
|
4
6
|
[![Build Status](https://secure.travis-ci.org/peter-murach/tty.svg?branch=master)][travis]
|
5
7
|
[![Code Climate](https://codeclimate.com/github/peter-murach/tty/badges/gpa.svg)][codeclimate]
|
@@ -34,7 +36,7 @@ Fully modular, choose out of many components to suite your needs and jump-start
|
|
34
36
|
* Text manipulation(wrapping/truncation) [status: ✔ ]
|
35
37
|
* Terminal progress bars drawing. [status: ✔ ]
|
36
38
|
* Terminal spinners. [status: ✔ ]
|
37
|
-
*
|
39
|
+
* Interactive prompt for user input. [status: ✔ ]
|
38
40
|
* File diffs. [status: TODO]
|
39
41
|
* Configuration file management. [status: TODO]
|
40
42
|
* Logging [status: In Progress]
|
@@ -61,12 +63,13 @@ Or install it yourself as:
|
|
61
63
|
* [2. Drawing tables](#2-drawing-tables)
|
62
64
|
* [3. Drawing progress bars](#3-drawing-progress-bars)
|
63
65
|
* [4. Drawing spinners](#4-drawing-spinners)
|
64
|
-
* [5.
|
65
|
-
* [6. Output
|
66
|
-
* [7.
|
67
|
-
* [8. Detecting
|
68
|
-
* [9.
|
69
|
-
* [10.
|
66
|
+
* [5. Prompting for input](#5-prompting-for-input)
|
67
|
+
* [6. Output coloring](#6-output-coloring)
|
68
|
+
* [7. Output paging](#7-output-paging)
|
69
|
+
* [8. Detecting screen properties](#8-detecting-screen-properties)
|
70
|
+
* [9. Detecting platform](#9-detecting-platform)
|
71
|
+
* [10. Searching executables](#10-searching-executables)
|
72
|
+
* [11. Setting editor](#11-setting-editor)
|
70
73
|
|
71
74
|
## 1. Overview
|
72
75
|
|
@@ -111,6 +114,22 @@ screen.width # => 280
|
|
111
114
|
screen.height # => 51
|
112
115
|
```
|
113
116
|
|
117
|
+
To ask for user input use `TTY::Prompt`:
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
prompt = TTY::Prompt.new
|
121
|
+
prompt.ask('Do you like Ruby?', type: :bool) # => true
|
122
|
+
|
123
|
+
# or ask to select from list
|
124
|
+
|
125
|
+
prompt.select("Choose your destiny?", %w(Scorpion Kano Jax))
|
126
|
+
# =>
|
127
|
+
# Choose your destiny? (Use arrow keys, press Enter to select)
|
128
|
+
# ‣ Scorpion
|
129
|
+
# Kano
|
130
|
+
# Jax
|
131
|
+
```
|
132
|
+
|
114
133
|
## 2. Drawing tables
|
115
134
|
|
116
135
|
**TTY** uses the [tty-table](https://github.com/peter-murach/tty-table) component in order to convert data into table and render as string output in tabular form. For example, to render data with ASCII border:
|
@@ -153,7 +172,18 @@ spinner = TTY::Spinner.new('Loading ... ', format: :spin_2)
|
|
153
172
|
|
154
173
|
Please refer to [documentation](https://github.com/peter-murach/tty-spinner) for complete API.
|
155
174
|
|
156
|
-
## 5.
|
175
|
+
## 5. Prompting for input
|
176
|
+
|
177
|
+
**TTY** relies on [tty-prompt](https://github.com/peter-murach/tty-prompt#ttyprompt) component for processing user input.
|
178
|
+
|
179
|
+
```ruby
|
180
|
+
prompt = TTY::Prompt.new
|
181
|
+
prompt.ask('Do you like Ruby?').read_bool # => true
|
182
|
+
```
|
183
|
+
|
184
|
+
Please refer to [documentation](https://github.com/peter-murach/tty-prompt#ttyprompt) for complete API.
|
185
|
+
|
186
|
+
## 6. Output coloring
|
157
187
|
|
158
188
|
In order to colorize your output **TTY** uses the [pastel](https://github.com/peter-murach/pastel) component like so:
|
159
189
|
|
@@ -164,7 +194,7 @@ pastel.red.on_green.bold 'text...' # => red bold text on green background
|
|
164
194
|
|
165
195
|
Please refer to [documentation](https://github.com/peter-murach/pastel) for complete API.
|
166
196
|
|
167
|
-
##
|
197
|
+
## 7. Output paging
|
168
198
|
|
169
199
|
To page terminal output **TTY** relies on [tty-pager](https://github.com/peter-murach/tty-pager) component.
|
170
200
|
|
@@ -177,7 +207,7 @@ pager.page('Very long text...')
|
|
177
207
|
|
178
208
|
Please refer to [documentation](https://github.com/peter-murach/tty-pager) for complete API.
|
179
209
|
|
180
|
-
##
|
210
|
+
## 8. Detecting screen properties
|
181
211
|
|
182
212
|
**TTY** uses the [tty-screen](https://github.com/peter-murach/tty-screen) component to measure the screen properties.
|
183
213
|
|
@@ -192,7 +222,7 @@ screen.height # => 51
|
|
192
222
|
|
193
223
|
Please refer to [documentation](https://github.com/peter-murach/tty-screen) for complete API.
|
194
224
|
|
195
|
-
##
|
225
|
+
## 9. Detecting platform
|
196
226
|
|
197
227
|
To check for platform properties **TTY** uses [tty-platform](https://github.com/peter-murach/tty-platform) component.
|
198
228
|
|
@@ -212,7 +242,7 @@ TTY::Platform.windows? # => false
|
|
212
242
|
|
213
243
|
Please refer to [documentation](https://github.com/peter-murach/tty-platform) for complete API.
|
214
244
|
|
215
|
-
##
|
245
|
+
## 10. Searching executables
|
216
246
|
|
217
247
|
To find executable path **TTY** uses [tty-which](https://github.com/peter-murach/tty-which#ttywhich) component.
|
218
248
|
|
@@ -224,108 +254,8 @@ TTY::Which.which('less') # => '/usr/bin/less'
|
|
224
254
|
|
225
255
|
Please refer to [documentation](https://github.com/peter-murach/tty-which) for complete API.
|
226
256
|
|
227
|
-
##
|
228
|
-
|
229
|
-
Main responsibility is to interact with the prompt and provide convenience methods.
|
230
|
-
|
231
|
-
Available methods are
|
232
|
-
|
233
|
-
```ruby
|
234
|
-
shell = TTY::Shell.new
|
235
|
-
shell.ask # print question
|
236
|
-
shell.read # read from stdin
|
237
|
-
shell.say # print message to stdout
|
238
|
-
shell.confirm # print message(s) in green
|
239
|
-
shell.warn # print message(s) in yellow
|
240
|
-
shell.error # print message(s) in red
|
241
|
-
shell.suggest # print suggestion message based on possible matches
|
242
|
-
shell.print_table # print table to stdout
|
243
|
-
```
|
244
|
-
|
245
|
-
In order to ask question and parse answers:
|
246
|
-
|
247
|
-
```ruby
|
248
|
-
shell = TTY::Shell.new
|
249
|
-
answer = shell.ask("What is your name?").read_string
|
250
|
-
```
|
251
|
-
|
252
|
-
The library provides small DSL to help with parsing and asking precise questions
|
253
|
-
|
254
|
-
```ruby
|
255
|
-
argument # :required or :optional
|
256
|
-
char # turn character based input, otherwise line (default: false)
|
257
|
-
clean # reset question
|
258
|
-
default # default value used if none is provided
|
259
|
-
echo # turn echo on and off (default: true)
|
260
|
-
mask # mask characters i.e '****' (default: false)
|
261
|
-
modify # apply answer modification :upcase, :downcase, :trim, :chomp etc..
|
262
|
-
in # specify range '0-9', '0..9', '0...9' or negative '-1..-9'
|
263
|
-
validate # regex against which stdin input is checked
|
264
|
-
valid # a list of expected valid options
|
265
|
-
```
|
266
|
-
|
267
|
-
You can chain question methods or configure them inside a block
|
268
|
-
|
269
|
-
```ruby
|
270
|
-
shell.ask("What is your name?").argument(:required).default('Piotr').validate(/\w+\s\w+/).read_string
|
271
|
-
|
272
|
-
shell.ask "What is your name?" do
|
273
|
-
argument :required
|
274
|
-
default 'Piotr'
|
275
|
-
validate /\w+\s\w+/
|
276
|
-
valid ['Piotr', 'Piotrek']
|
277
|
-
modify :capitalize
|
278
|
-
end.read_string
|
279
|
-
```
|
280
|
-
|
281
|
-
Reading answers and converting them into required types can be done with custom readers
|
282
|
-
|
283
|
-
```ruby
|
284
|
-
read_bool # return true or false for strings such as "Yes", "No"
|
285
|
-
read_char # return first character
|
286
|
-
read_date # return date type
|
287
|
-
read_datetime # return datetime type
|
288
|
-
read_email # validate answer against email regex
|
289
|
-
read_file # return a File object
|
290
|
-
read_float # return decimal or error if cannot convert
|
291
|
-
read_int # return integer or error if cannot convert
|
292
|
-
read_multiple # return multiple line string
|
293
|
-
read_password # return string with echo turned off
|
294
|
-
read_range # return range type
|
295
|
-
read_regex # return regex expression
|
296
|
-
read_string # return string
|
297
|
-
read_symbol # return symbol
|
298
|
-
read_text # return multiline string
|
299
|
-
read_keypress # return the key pressed
|
300
|
-
```
|
301
|
-
|
302
|
-
For example, if we wanted to ask a user for a single digit in given range
|
303
|
-
|
304
|
-
```ruby
|
305
|
-
ask("Provide number in range: 0-9").in('0-9') do
|
306
|
-
on_error :retry
|
307
|
-
end.read_int
|
308
|
-
```
|
309
|
-
|
310
|
-
on the other hand, if we are interested in range answer then
|
311
|
-
|
312
|
-
```ruby
|
313
|
-
ask("Provide range of numbers?").read_range
|
314
|
-
```
|
315
|
-
|
316
|
-
To suggest possible matches for the user input use `suggest` method like so
|
317
|
-
|
318
|
-
```ruby
|
319
|
-
shell.suggest('sta', ['stage', 'stash', 'commit', 'branch'])
|
320
|
-
# =>
|
321
|
-
Did you mean one of these?
|
322
|
-
stage
|
323
|
-
stash
|
324
|
-
```
|
257
|
+
## 11. Setting editor
|
325
258
|
|
326
|
-
TTY::System.which(cmd) # full path to executable if found, nil otherwise
|
327
|
-
TTY::System.exists?(cmd) # check if command is available
|
328
|
-
TTY::System.editor # provides access to system editor
|
329
259
|
To set preferred editor you can either use shell environment variables such as `EDITOR` and `VISUAL` or set the command(s) manually like so
|
330
260
|
|
331
261
|
```ruby
|
data/lib/tty.rb
CHANGED
@@ -12,35 +12,16 @@ require 'tty-table'
|
|
12
12
|
require 'tty-which'
|
13
13
|
|
14
14
|
require 'tty/version'
|
15
|
-
|
16
|
-
require 'tty/support/utils'
|
17
15
|
require 'tty/support/delegatable'
|
18
16
|
require 'tty/support/coercion'
|
19
17
|
require 'tty/support/unicode'
|
20
|
-
|
21
18
|
require 'tty/terminal'
|
22
19
|
require 'tty/system'
|
23
20
|
require 'tty/vector'
|
24
|
-
require 'tty/shell'
|
25
21
|
require 'tty/logger'
|
26
22
|
require 'tty/plugins'
|
27
|
-
|
28
23
|
require 'tty/plugins/plugin'
|
29
|
-
|
30
|
-
require 'tty/shell/distance'
|
31
|
-
require 'tty/shell/response_delegation'
|
32
|
-
require 'tty/shell/question'
|
33
|
-
require 'tty/shell/question/validation'
|
34
|
-
require 'tty/shell/question/modifier'
|
35
|
-
require 'tty/shell/statement'
|
36
|
-
require 'tty/shell/suggestion'
|
37
|
-
require 'tty/shell/reader'
|
38
|
-
require 'tty/shell/response'
|
39
|
-
|
40
|
-
require 'tty/terminal/echo'
|
41
|
-
require 'tty/terminal/raw'
|
42
24
|
require 'tty/terminal/home'
|
43
|
-
|
44
25
|
require 'tty/system/editor'
|
45
26
|
|
46
27
|
module TTY
|
@@ -51,15 +32,6 @@ module TTY
|
|
51
32
|
# Raised when the operation is not implemented
|
52
33
|
class NoImplementationError < NotImplementedError; end
|
53
34
|
|
54
|
-
# Raised when the required argument is not supplied
|
55
|
-
class ArgumentRequired < ArgumentError; end
|
56
|
-
|
57
|
-
# Raised when the argument validation fails
|
58
|
-
class ArgumentValidation < ArgumentError; end
|
59
|
-
|
60
|
-
# Raised when the argument is not expected
|
61
|
-
class InvalidArgument < ArgumentError; end
|
62
|
-
|
63
35
|
# Raised when the passed in validation argument is of wrong type
|
64
36
|
class ValidationCoercion < TypeError; end
|
65
37
|
|
@@ -93,9 +65,9 @@ module TTY
|
|
93
65
|
# @return [TTY::Shell]
|
94
66
|
#
|
95
67
|
# @api public
|
96
|
-
def shell(input=$stdin, output=$stdout)
|
97
|
-
|
98
|
-
end
|
68
|
+
# def shell(input=$stdin, output=$stdout)
|
69
|
+
# @shell ||= Shell.new(input, output)
|
70
|
+
# end
|
99
71
|
|
100
72
|
# Return shared system object
|
101
73
|
#
|
data/lib/tty/plugins/plugin.rb
CHANGED
@@ -43,9 +43,9 @@ module TTY
|
|
43
43
|
begin
|
44
44
|
require gem_name unless enabled?
|
45
45
|
rescue LoadError => error
|
46
|
-
|
46
|
+
puts("Unable to load plugin #{gem_name} due to #{error}.")
|
47
47
|
rescue => error
|
48
|
-
|
48
|
+
puts("require '#{gem_name}' failed with #{error}")
|
49
49
|
end
|
50
50
|
@enabled = true
|
51
51
|
end
|
data/lib/tty/terminal.rb
CHANGED
@@ -2,67 +2,11 @@
|
|
2
2
|
|
3
3
|
module TTY
|
4
4
|
class Terminal
|
5
|
-
# Return access to color terminal
|
6
|
-
#
|
7
|
-
# @return [TTY::Terminal::Color]
|
8
|
-
#
|
9
|
-
# @api public
|
10
|
-
attr_reader :color
|
11
|
-
|
12
5
|
# Initialize a Terminal
|
13
6
|
#
|
14
7
|
# @api public
|
15
8
|
def initialize(options = {})
|
16
|
-
@
|
17
|
-
@echo = TTY::Terminal::Echo.new
|
18
|
-
@raw = TTY::Terminal::Raw.new
|
19
|
-
@home = Home.new
|
20
|
-
end
|
21
|
-
|
22
|
-
# Switch echo on
|
23
|
-
#
|
24
|
-
# @api public
|
25
|
-
def echo_on
|
26
|
-
@echo.on
|
27
|
-
end
|
28
|
-
|
29
|
-
# Switch echo off
|
30
|
-
#
|
31
|
-
# @api public
|
32
|
-
def echo_off
|
33
|
-
@echo.off
|
34
|
-
end
|
35
|
-
|
36
|
-
# Echo given block
|
37
|
-
#
|
38
|
-
# @param [Boolean] is_on
|
39
|
-
#
|
40
|
-
# @api public
|
41
|
-
def echo(is_on = true, &block)
|
42
|
-
@echo.echo(is_on, &block)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Switch raw mode on
|
46
|
-
#
|
47
|
-
# @api public
|
48
|
-
def raw_on
|
49
|
-
@raw.on
|
50
|
-
end
|
51
|
-
|
52
|
-
# Switch raw mode off
|
53
|
-
#
|
54
|
-
# @api public
|
55
|
-
def raw_off
|
56
|
-
@raw.off
|
57
|
-
end
|
58
|
-
|
59
|
-
# Use raw mode in the given block
|
60
|
-
#
|
61
|
-
# @param [Boolean] is_on
|
62
|
-
#
|
63
|
-
# @api public
|
64
|
-
def raw(is_on = true, &block)
|
65
|
-
@raw.raw(is_on, &block)
|
9
|
+
@home = Home.new
|
66
10
|
end
|
67
11
|
|
68
12
|
# Find user home directory
|
@@ -71,7 +15,7 @@ module TTY
|
|
71
15
|
#
|
72
16
|
# @api public
|
73
17
|
def home
|
74
|
-
@home.
|
18
|
+
@home.find_home
|
75
19
|
end
|
76
20
|
end # Terminal
|
77
21
|
end # TTY
|
data/lib/tty/terminal/home.rb
CHANGED
@@ -4,19 +4,37 @@ module TTY
|
|
4
4
|
class Terminal
|
5
5
|
# A class responsible for locating user home
|
6
6
|
class Home
|
7
|
+
# @api public
|
8
|
+
def initialize(platform = nil)
|
9
|
+
@platform = platform || TTY::Platform
|
10
|
+
end
|
11
|
+
|
7
12
|
# Find user home
|
8
13
|
#
|
9
14
|
# @api public
|
10
|
-
def
|
11
|
-
|
12
|
-
|
15
|
+
def find_home
|
16
|
+
path = @platform.windows? ? windows_home : unix_home
|
17
|
+
File.expand_path(path)
|
18
|
+
end
|
19
|
+
|
20
|
+
def unix_home
|
21
|
+
require 'etc'
|
22
|
+
"~#{Etc.getlogin}"
|
23
|
+
rescue
|
24
|
+
ENV['HOME']
|
25
|
+
end
|
26
|
+
|
27
|
+
def windows_home
|
28
|
+
if (home = ENV['HOME'])
|
29
|
+
home.tr('\\', '/')
|
30
|
+
elsif ENV['HOMEDRIVE'] && ENV['HOMEPATH']
|
31
|
+
File.join(ENV['HOMEDRIVE'], ENV['HOMEPATH'])
|
32
|
+
elsif ENV['USERPROFILE']
|
33
|
+
ENV['USERPROFILE']
|
34
|
+
elsif ENV['HOMEDRIVE'] || ENV['SystemDrive']
|
35
|
+
File.join(ENV['HOMEDRIVE'] || ENV['SystemDrive'], '/')
|
13
36
|
else
|
14
|
-
|
15
|
-
require 'etc'
|
16
|
-
File.expand_path("~#{Etc.getlogin}")
|
17
|
-
rescue
|
18
|
-
TTY::System.windows? ? 'C:/' : '/'
|
19
|
-
end
|
37
|
+
'C:/'
|
20
38
|
end
|
21
39
|
end
|
22
40
|
end # Home
|