tty 0.1.1 → 0.1.2
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 +4 -4
- data/.travis.yml +1 -5
- data/CHANGELOG.md +7 -0
- data/README.md +1 -0
- data/lib/tty.rb +2 -1
- data/lib/tty/shell/question.rb +19 -2
- data/lib/tty/shell/reader.rb +9 -0
- data/lib/tty/shell/response.rb +37 -16
- data/lib/tty/shell/response_delegation.rb +2 -0
- data/lib/tty/table.rb +2 -2
- data/lib/tty/table/operation/alignment_set.rb +2 -2
- data/lib/tty/terminal.rb +24 -0
- data/lib/tty/terminal/raw.rb +38 -0
- data/lib/tty/vector.rb +2 -2
- data/lib/tty/version.rb +1 -1
- data/spec/tty/shell/response/read_bool_spec.rb +1 -2
- data/spec/tty/shell/response/read_range_spec.rb +3 -1
- data/spec/tty/vector/new_spec.rb +4 -3
- data/tty.gemspec +1 -0
- metadata +17 -18
- data/lib/tty/conversion.rb +0 -16
- data/lib/tty/conversion/converter/array.rb +0 -35
- data/lib/tty/conversion/converter/boolean.rb +0 -49
- data/lib/tty/conversion/converter/float.rb +0 -28
- data/lib/tty/conversion/converter/integer.rb +0 -28
- data/lib/tty/conversion/converter/range.rb +0 -41
- data/spec/tty/conversion/converter/array/convert_spec.rb +0 -37
- data/spec/tty/conversion/converter/boolean/convert_spec.rb +0 -117
- data/spec/tty/conversion/converter/float/convert_spec.rb +0 -35
- data/spec/tty/conversion/converter/integer/convert_spec.rb +0 -42
- data/spec/tty/conversion/converter/range/convert_spec.rb +0 -75
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e81389b3c20540a552a4677e80c55307fb8964c
|
4
|
+
data.tar.gz: 10b70aa565b3bd550cbb7177826e3075ff47b9f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 07691cae6416ce1edee73949c2088ce1be07ab2f764b8ca1c59af6e5d2c98a03efaad09a64171a87eba9152c507277bdc01ba91a024edfd28cecfad92f68aa7d
|
7
|
+
data.tar.gz: 4be98f8a15d2cf8a363b56c27d101c901a8f4091c24fe470a17350ec952d2b0ce1b2b143d2e887392f83d290a6ddfd6e2b5437e87307012a5f59e951d1a61601
|
data/.travis.yml
CHANGED
@@ -7,15 +7,11 @@ rvm:
|
|
7
7
|
- 2.1.0
|
8
8
|
- ruby-head
|
9
9
|
- rbx-2
|
10
|
+
- jruby-19mode
|
10
11
|
matrix:
|
11
12
|
include:
|
12
|
-
- rvm: jruby-19mode
|
13
|
-
- rvm: jruby-20mode
|
14
|
-
- rvm: jruby-21mode
|
15
13
|
- rvm: jruby-head
|
16
14
|
allow_failures:
|
17
|
-
- rvm: jruby-20mode
|
18
|
-
- rvm: jruby-21mode
|
19
15
|
- rvm: ruby-head
|
20
16
|
- rvm: jruby-head
|
21
17
|
fast_finish: true
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -527,6 +527,7 @@ read_regex # return regex expression
|
|
527
527
|
read_string # return string
|
528
528
|
read_symbol # return symbol
|
529
529
|
read_text # return multiline string
|
530
|
+
read_keypress # return the key pressed
|
530
531
|
```
|
531
532
|
|
532
533
|
For example, if we wanted to ask a user for a single digit in given range
|
data/lib/tty.rb
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'equatable'
|
4
4
|
require 'pastel'
|
5
|
+
require 'necromancer'
|
5
6
|
require 'tty-screen'
|
6
7
|
require 'tty-spinner'
|
7
8
|
require 'tty-progressbar'
|
8
9
|
|
9
10
|
require 'tty/version'
|
10
11
|
|
11
|
-
require 'tty/conversion'
|
12
12
|
require 'tty/support/utils'
|
13
13
|
require 'tty/support/delegatable'
|
14
14
|
require 'tty/support/coercion'
|
@@ -35,6 +35,7 @@ require 'tty/shell/reader'
|
|
35
35
|
require 'tty/shell/response'
|
36
36
|
|
37
37
|
require 'tty/terminal/echo'
|
38
|
+
require 'tty/terminal/raw'
|
38
39
|
require 'tty/terminal/home'
|
39
40
|
require 'tty/terminal/pager'
|
40
41
|
require 'tty/terminal/pager/basic'
|
data/lib/tty/shell/question.rb
CHANGED
@@ -56,6 +56,7 @@ module TTY
|
|
56
56
|
@shell = shell || Shell.new
|
57
57
|
@required = options.fetch(:required) { false }
|
58
58
|
@echo = options.fetch(:echo) { true }
|
59
|
+
@raw = options.fetch(:raw) { false }
|
59
60
|
@mask = options.fetch(:mask) { false }
|
60
61
|
@character = options.fetch(:character) { false }
|
61
62
|
@in = options.fetch(:in) { false }
|
@@ -64,7 +65,7 @@ module TTY
|
|
64
65
|
@validation = Validation.new options.fetch(:validation) { nil }
|
65
66
|
@default_value = nil
|
66
67
|
@error = false
|
67
|
-
@
|
68
|
+
@converter = Necromancer.new
|
68
69
|
end
|
69
70
|
|
70
71
|
# Set a new prompt
|
@@ -198,6 +199,22 @@ module TTY
|
|
198
199
|
!!@echo
|
199
200
|
end
|
200
201
|
|
202
|
+
# Turn raw mode on or off. This enables character-based input.
|
203
|
+
#
|
204
|
+
# @api public
|
205
|
+
def raw(value = nil)
|
206
|
+
return @raw if value.nil?
|
207
|
+
@raw = value
|
208
|
+
self
|
209
|
+
end
|
210
|
+
|
211
|
+
# Check if raw mode is set
|
212
|
+
#
|
213
|
+
# @api public
|
214
|
+
def raw?
|
215
|
+
!!@raw
|
216
|
+
end
|
217
|
+
|
201
218
|
# Set character for masking the STDIN input
|
202
219
|
#
|
203
220
|
# @param [String] character
|
@@ -249,7 +266,7 @@ module TTY
|
|
249
266
|
# @api public
|
250
267
|
def in(value = nil)
|
251
268
|
return @in if value.nil?
|
252
|
-
@in = @
|
269
|
+
@in = @converter.convert(value).to(:range, strict: true)
|
253
270
|
self
|
254
271
|
end
|
255
272
|
|
data/lib/tty/shell/reader.rb
CHANGED
@@ -75,6 +75,15 @@ module TTY
|
|
75
75
|
shell.input.gets
|
76
76
|
end
|
77
77
|
|
78
|
+
# Reads at maximum +maxlen+ characters.
|
79
|
+
#
|
80
|
+
# @param [Integer] maxlen
|
81
|
+
#
|
82
|
+
# @api public
|
83
|
+
def readpartial(maxlen)
|
84
|
+
shell.input.readpartial(maxlen)
|
85
|
+
end
|
86
|
+
|
78
87
|
private
|
79
88
|
|
80
89
|
# Handle single character by appending to or removing from output
|
data/lib/tty/shell/response.rb
CHANGED
@@ -30,14 +30,10 @@ module TTY
|
|
30
30
|
#
|
31
31
|
# @api public
|
32
32
|
def initialize(question, shell = Shell.new)
|
33
|
-
@
|
34
|
-
@
|
35
|
-
@
|
36
|
-
@
|
37
|
-
|
38
|
-
@question = question
|
39
|
-
@shell = shell
|
40
|
-
@reader = Reader.new(shell)
|
33
|
+
@question = question
|
34
|
+
@shell = shell
|
35
|
+
@converter = Necromancer.new
|
36
|
+
@reader = Reader.new(shell)
|
41
37
|
end
|
42
38
|
|
43
39
|
# Read input from STDIN either character or line
|
@@ -59,7 +55,15 @@ module TTY
|
|
59
55
|
reader.getc(question.mask)
|
60
56
|
else
|
61
57
|
TTY.terminal.echo(question.echo) do
|
62
|
-
|
58
|
+
TTY.terminal.raw(question.raw) do
|
59
|
+
if question.raw?
|
60
|
+
reader.readpartial(10)
|
61
|
+
elsif question.character?
|
62
|
+
reader.getc(question.mask)
|
63
|
+
else
|
64
|
+
reader.gets
|
65
|
+
end
|
66
|
+
end
|
63
67
|
end
|
64
68
|
end
|
65
69
|
end
|
@@ -93,7 +97,7 @@ module TTY
|
|
93
97
|
#
|
94
98
|
# @api public
|
95
99
|
def read_symbol(error = nil)
|
96
|
-
question.evaluate_response
|
100
|
+
question.evaluate_response(read_input.to_sym)
|
97
101
|
end
|
98
102
|
|
99
103
|
# Read answer from predifined choicse
|
@@ -108,14 +112,16 @@ module TTY
|
|
108
112
|
#
|
109
113
|
# @api public
|
110
114
|
def read_int(error = nil)
|
111
|
-
|
115
|
+
response = @converter.convert(read_input).to(:integer)
|
116
|
+
question.evaluate_response(response)
|
112
117
|
end
|
113
118
|
|
114
119
|
# Read float value
|
115
120
|
#
|
116
121
|
# @api public
|
117
122
|
def read_float(error = nil)
|
118
|
-
|
123
|
+
response = @converter.convert(read_input).to(:float)
|
124
|
+
question.evaluate_response(response)
|
119
125
|
end
|
120
126
|
|
121
127
|
# Read regular expression
|
@@ -129,28 +135,32 @@ module TTY
|
|
129
135
|
#
|
130
136
|
# @api public
|
131
137
|
def read_range
|
132
|
-
|
138
|
+
response = @converter.convert(read_input).to(:range, strict: true)
|
139
|
+
question.evaluate_response(response)
|
133
140
|
end
|
134
141
|
|
135
142
|
# Read date
|
136
143
|
#
|
137
144
|
# @api public
|
138
145
|
def read_date
|
139
|
-
|
146
|
+
response = @converter.convert(read_input).to(:date)
|
147
|
+
question.evaluate_response(response)
|
140
148
|
end
|
141
149
|
|
142
150
|
# Read datetime
|
143
151
|
#
|
144
152
|
# @api public
|
145
153
|
def read_datetime
|
146
|
-
|
154
|
+
response = @converter.convert(read_input).to(:datetime)
|
155
|
+
question.evaluate_response(response)
|
147
156
|
end
|
148
157
|
|
149
158
|
# Read boolean
|
150
159
|
#
|
151
160
|
# @api public
|
152
161
|
def read_bool(error = nil)
|
153
|
-
|
162
|
+
response = @converter.convert(read_input).to(:boolean, strict: true)
|
163
|
+
question.evaluate_response(response)
|
154
164
|
end
|
155
165
|
|
156
166
|
# Read file contents
|
@@ -193,6 +203,17 @@ module TTY
|
|
193
203
|
question.evaluate_response read_input
|
194
204
|
end
|
195
205
|
|
206
|
+
# Read a single keypress
|
207
|
+
#
|
208
|
+
# @api public
|
209
|
+
def read_keypress
|
210
|
+
question.echo false
|
211
|
+
question.raw true
|
212
|
+
question.evaluate_response(read_input).tap do |key|
|
213
|
+
raise Interrupt if key == "\x03" # Ctrl-C
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
196
217
|
private
|
197
218
|
|
198
219
|
# Ignore exception
|
data/lib/tty/table.rb
CHANGED
@@ -110,7 +110,7 @@ module TTY
|
|
110
110
|
# @api private
|
111
111
|
def initialize(options = {}, &block)
|
112
112
|
validate_options! options
|
113
|
-
@
|
113
|
+
@converter = Necromancer.new
|
114
114
|
@header = (value = options[:header]) ? Header.new(value) : nil
|
115
115
|
@rows = coerce(options.fetch(:rows) { Row.new([]) })
|
116
116
|
@rotated = false
|
@@ -457,7 +457,7 @@ module TTY
|
|
457
457
|
#
|
458
458
|
# @api public
|
459
459
|
def coerce(rows)
|
460
|
-
rows = @
|
460
|
+
rows = @converter.convert(rows).to(:array)
|
461
461
|
rows.map { |row| to_row(row, header) }
|
462
462
|
end
|
463
463
|
|
@@ -12,8 +12,8 @@ module TTY
|
|
12
12
|
#
|
13
13
|
# @api private
|
14
14
|
def initialize(aligns, widths = nil)
|
15
|
-
@
|
16
|
-
@elements = @
|
15
|
+
@converter = Necromancer.new
|
16
|
+
@elements = @converter.convert(aligns).to(:array)
|
17
17
|
@widths = widths
|
18
18
|
end
|
19
19
|
|
data/lib/tty/terminal.rb
CHANGED
@@ -22,6 +22,7 @@ module TTY
|
|
22
22
|
def initialize(options = {})
|
23
23
|
@color = Pastel.new
|
24
24
|
@echo = TTY::Terminal::Echo.new
|
25
|
+
@raw = TTY::Terminal::Raw.new
|
25
26
|
@pager = TTY::Terminal::Pager
|
26
27
|
@home = Home.new
|
27
28
|
end
|
@@ -49,6 +50,29 @@ module TTY
|
|
49
50
|
@echo.echo(is_on, &block)
|
50
51
|
end
|
51
52
|
|
53
|
+
# Switch raw mode on
|
54
|
+
#
|
55
|
+
# @api public
|
56
|
+
def raw_on
|
57
|
+
@raw.on
|
58
|
+
end
|
59
|
+
|
60
|
+
# Switch raw mode off
|
61
|
+
#
|
62
|
+
# @api public
|
63
|
+
def raw_off
|
64
|
+
@raw.off
|
65
|
+
end
|
66
|
+
|
67
|
+
# Use raw mode in the given block
|
68
|
+
#
|
69
|
+
# @param [Boolean] is_on
|
70
|
+
#
|
71
|
+
# @api public
|
72
|
+
def raw(is_on = true, &block)
|
73
|
+
@raw.raw(is_on, &block)
|
74
|
+
end
|
75
|
+
|
52
76
|
# Find user home directory
|
53
77
|
#
|
54
78
|
# @return [String]
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module TTY
|
4
|
+
class Terminal
|
5
|
+
# A class responsible for toggling raw mode.
|
6
|
+
class Raw
|
7
|
+
# Turn raw mode on
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
def on
|
11
|
+
%x{stty raw} if TTY::System.unix?
|
12
|
+
end
|
13
|
+
|
14
|
+
# Turn raw mode off
|
15
|
+
#
|
16
|
+
# @api public
|
17
|
+
def off
|
18
|
+
%x{stty -raw} if TTY::System.unix?
|
19
|
+
end
|
20
|
+
|
21
|
+
# Wrap code block inside raw mode
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
def raw(is_on=true, &block)
|
25
|
+
value = nil
|
26
|
+
begin
|
27
|
+
on if is_on
|
28
|
+
value = block.call if block_given?
|
29
|
+
off
|
30
|
+
return value
|
31
|
+
rescue NoMethodError, Interrupt
|
32
|
+
off
|
33
|
+
exit
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end # Echo
|
37
|
+
end # Terminal
|
38
|
+
end # TTY
|
data/lib/tty/vector.rb
CHANGED
@@ -27,8 +27,8 @@ module TTY
|
|
27
27
|
#
|
28
28
|
# @api public
|
29
29
|
def initialize(array = [])
|
30
|
-
@
|
31
|
-
@elements = @
|
30
|
+
@converter = Necromancer.new
|
31
|
+
@elements = @converter.convert(array).to(:array, strict: true)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Return element at index.
|
data/lib/tty/version.rb
CHANGED
@@ -11,7 +11,7 @@ describe TTY::Shell::Question, '#read_bool' do
|
|
11
11
|
input << 'invalid'
|
12
12
|
input.rewind
|
13
13
|
q = shell.ask("Do you read books?")
|
14
|
-
expect { q.read_bool }.to raise_error(
|
14
|
+
expect { q.read_bool }.to raise_error(Necromancer::ConversionTypeError)
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'reads negative boolean' do
|
@@ -37,5 +37,4 @@ describe TTY::Shell::Question, '#read_bool' do
|
|
37
37
|
answer = q.read_bool
|
38
38
|
expect(answer).to eql true
|
39
39
|
end
|
40
|
-
|
41
40
|
end
|
@@ -24,6 +24,8 @@ describe TTY::Shell::Question, '#read_range' do
|
|
24
24
|
context 'with invalid range' do
|
25
25
|
let(:value) { "abcd" }
|
26
26
|
|
27
|
-
it
|
27
|
+
it "fails to convert to range" do
|
28
|
+
expect { subject }.to raise_error(Necromancer::ConversionTypeError)
|
29
|
+
end
|
28
30
|
end
|
29
31
|
end # read_range
|
data/spec/tty/vector/new_spec.rb
CHANGED
@@ -19,7 +19,7 @@ describe TTY::Vector, '#new' do
|
|
19
19
|
let(:argument) { nil }
|
20
20
|
|
21
21
|
it 'throws type error' do
|
22
|
-
expect
|
22
|
+
expect(vector.to_a).to eq([])
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -33,11 +33,12 @@ describe TTY::Vector, '#new' do
|
|
33
33
|
|
34
34
|
context 'with an argument that respond to #to_ary' do
|
35
35
|
let(:argument) {
|
36
|
-
Class.new do
|
36
|
+
Custom = Class.new do
|
37
37
|
def to_ary
|
38
38
|
['Piotr']
|
39
39
|
end
|
40
|
-
end
|
40
|
+
end
|
41
|
+
Custom.new
|
41
42
|
}
|
42
43
|
|
43
44
|
it 'sets elements' do
|
data/tty.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.require_paths = ["lib"]
|
19
19
|
|
20
20
|
gem.add_dependency 'equatable', '~> 0.5.0'
|
21
|
+
gem.add_dependency 'necromancer', '~> 0.3.0'
|
21
22
|
gem.add_dependency 'pastel', '~> 0.4.0'
|
22
23
|
gem.add_dependency 'tty-screen', '~> 0.1.0'
|
23
24
|
gem.add_dependency 'tty-spinner', '~> 0.1.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: equatable
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.5.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: necromancer
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: pastel
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -116,12 +130,6 @@ files:
|
|
116
130
|
- benchmarks/table.rb
|
117
131
|
- images/tty.png
|
118
132
|
- lib/tty.rb
|
119
|
-
- lib/tty/conversion.rb
|
120
|
-
- lib/tty/conversion/converter/array.rb
|
121
|
-
- lib/tty/conversion/converter/boolean.rb
|
122
|
-
- lib/tty/conversion/converter/float.rb
|
123
|
-
- lib/tty/conversion/converter/integer.rb
|
124
|
-
- lib/tty/conversion/converter/range.rb
|
125
133
|
- lib/tty/logger.rb
|
126
134
|
- lib/tty/plugins.rb
|
127
135
|
- lib/tty/plugins/plugin.rb
|
@@ -181,6 +189,7 @@ files:
|
|
181
189
|
- lib/tty/terminal/pager.rb
|
182
190
|
- lib/tty/terminal/pager/basic.rb
|
183
191
|
- lib/tty/terminal/pager/system.rb
|
192
|
+
- lib/tty/terminal/raw.rb
|
184
193
|
- lib/tty/text.rb
|
185
194
|
- lib/tty/text/distance.rb
|
186
195
|
- lib/tty/text/truncation.rb
|
@@ -188,11 +197,6 @@ files:
|
|
188
197
|
- lib/tty/vector.rb
|
189
198
|
- lib/tty/version.rb
|
190
199
|
- spec/spec_helper.rb
|
191
|
-
- spec/tty/conversion/converter/array/convert_spec.rb
|
192
|
-
- spec/tty/conversion/converter/boolean/convert_spec.rb
|
193
|
-
- spec/tty/conversion/converter/float/convert_spec.rb
|
194
|
-
- spec/tty/conversion/converter/integer/convert_spec.rb
|
195
|
-
- spec/tty/conversion/converter/range/convert_spec.rb
|
196
200
|
- spec/tty/logger/log_spec.rb
|
197
201
|
- spec/tty/logger/new_spec.rb
|
198
202
|
- spec/tty/logger/valid_level_spec.rb
|
@@ -395,11 +399,6 @@ summary: A toolbox for developing beautiful command line clients. It provides a
|
|
395
399
|
information back.
|
396
400
|
test_files:
|
397
401
|
- spec/spec_helper.rb
|
398
|
-
- spec/tty/conversion/converter/array/convert_spec.rb
|
399
|
-
- spec/tty/conversion/converter/boolean/convert_spec.rb
|
400
|
-
- spec/tty/conversion/converter/float/convert_spec.rb
|
401
|
-
- spec/tty/conversion/converter/integer/convert_spec.rb
|
402
|
-
- spec/tty/conversion/converter/range/convert_spec.rb
|
403
402
|
- spec/tty/logger/log_spec.rb
|
404
403
|
- spec/tty/logger/new_spec.rb
|
405
404
|
- spec/tty/logger/valid_level_spec.rb
|
data/lib/tty/conversion.rb
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
TypeError = Class.new(StandardError)
|
6
|
-
|
7
|
-
# Raised when cannot conver to a given type
|
8
|
-
NoTypeConversionAvailable = Class.new(StandardError)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
require 'tty/conversion/converter/array'
|
13
|
-
require 'tty/conversion/converter/boolean'
|
14
|
-
require 'tty/conversion/converter/float'
|
15
|
-
require 'tty/conversion/converter/integer'
|
16
|
-
require 'tty/conversion/converter/range'
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
class ArrayConverter
|
6
|
-
|
7
|
-
attr_reader :target
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
def initialize(source = String)
|
12
|
-
@source = source
|
13
|
-
@target = Array
|
14
|
-
end
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
def convert(value, copy = false)
|
18
|
-
case value
|
19
|
-
when Array
|
20
|
-
copy ? value.dup : value
|
21
|
-
when Hash
|
22
|
-
Array(value)
|
23
|
-
else
|
24
|
-
begin
|
25
|
-
converted = value.to_ary
|
26
|
-
rescue Exception => e
|
27
|
-
raise TTY::TypeError,
|
28
|
-
"Cannot convert #{value.class} into an Array (#{e.message})"
|
29
|
-
end
|
30
|
-
converted
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end # ArrayConverter
|
34
|
-
end # Conversion
|
35
|
-
end # TTY
|
@@ -1,49 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
class BooleanConverter
|
6
|
-
|
7
|
-
attr_reader :target
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
def initialize(source = String)
|
12
|
-
@source = source
|
13
|
-
@target = [TrueClass, FalseClass]
|
14
|
-
end
|
15
|
-
|
16
|
-
def boolean?(value)
|
17
|
-
target.any? { |klass| value.is_a?(klass) }
|
18
|
-
end
|
19
|
-
|
20
|
-
# Convert value to boolean type including range of strings such as
|
21
|
-
#
|
22
|
-
# @param [Object] value
|
23
|
-
#
|
24
|
-
# @example
|
25
|
-
# coerce("True") # => true
|
26
|
-
#
|
27
|
-
# other values coerced to true are:
|
28
|
-
# 1, t, T, TRUE, true, True, y, Y, YES, yes, Yes
|
29
|
-
#
|
30
|
-
# @example
|
31
|
-
# coerce("False") # => false
|
32
|
-
#
|
33
|
-
# other values coerced to false are:
|
34
|
-
# 0, f, F, FALSE, false, False, n, N, No, no, No
|
35
|
-
#
|
36
|
-
# @api public
|
37
|
-
def convert(value)
|
38
|
-
case value.to_s
|
39
|
-
when /^(yes|y|t(rue)?|1)$/i
|
40
|
-
return true
|
41
|
-
when /^(no|n|f(alse)?|0)$/i
|
42
|
-
return false
|
43
|
-
else
|
44
|
-
fail TypeError, "Expected boolean type, got #{value}"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end # BooleanConverter
|
48
|
-
end # Conversion
|
49
|
-
end # TTY
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
class FloatConverter
|
6
|
-
|
7
|
-
attr_reader :target
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
def initialize(source = String)
|
12
|
-
@source = source
|
13
|
-
@target = Float
|
14
|
-
end
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
def convert(value, strict = false)
|
18
|
-
Kernel.send(target.name.to_sym, value.to_s)
|
19
|
-
rescue
|
20
|
-
if strict
|
21
|
-
raise InvalidArgument, "#{value} could not be coerced into #{target.name}"
|
22
|
-
else
|
23
|
-
value.to_f
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end # IntegerConverter
|
27
|
-
end # Conversion
|
28
|
-
end # TTY
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
class IntegerConverter
|
6
|
-
|
7
|
-
attr_reader :target
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
def initialize(source = String)
|
12
|
-
@source = source
|
13
|
-
@target = Integer
|
14
|
-
end
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
def convert(value, strict = false)
|
18
|
-
Kernel.send(target.name.to_sym, value.to_s)
|
19
|
-
rescue
|
20
|
-
if strict
|
21
|
-
raise InvalidArgument, "#{value} could not be coerced into #{target.name}"
|
22
|
-
else
|
23
|
-
value.to_i
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end # IntegerConverter
|
27
|
-
end # Conversion
|
28
|
-
end # TTY
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module TTY
|
4
|
-
module Conversion
|
5
|
-
class RangeConverter
|
6
|
-
|
7
|
-
attr_reader :target
|
8
|
-
|
9
|
-
attr_reader :source
|
10
|
-
|
11
|
-
def initialize(source = String)
|
12
|
-
@source = source
|
13
|
-
@target = Range
|
14
|
-
end
|
15
|
-
|
16
|
-
# Convert value to Range type with possible ranges
|
17
|
-
#
|
18
|
-
# @param [Object] value
|
19
|
-
#
|
20
|
-
# @example
|
21
|
-
# coerce('0,9') # => (0..9)
|
22
|
-
#
|
23
|
-
# @example
|
24
|
-
# coerce('0-9') # => (0..9)
|
25
|
-
#
|
26
|
-
# @api public
|
27
|
-
def convert(value)
|
28
|
-
case value.to_s
|
29
|
-
when /\A(\-?\d+)\Z/
|
30
|
-
::Range.new($1.to_i, $1.to_i)
|
31
|
-
when /\A(-?\d+?)(\.{2}\.?|-|,)(-?\d+)\Z/
|
32
|
-
::Range.new($1.to_i, $3.to_i, $2 == '...')
|
33
|
-
when /\A(\w)(\.{2}\.?|-|,)(\w)\Z/
|
34
|
-
::Range.new($1.to_s, $3.to_s, $2 == '...')
|
35
|
-
else
|
36
|
-
fail InvalidArgument, "#{value} could not be coerced into Range type"
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end # RangeConverter
|
40
|
-
end # Conversion
|
41
|
-
end # TTY
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe TTY::Conversion::ArrayConverter do
|
6
|
-
let(:object) { described_class.new }
|
7
|
-
let(:enumerable) { [] }
|
8
|
-
|
9
|
-
subject { object.convert(enumerable) }
|
10
|
-
|
11
|
-
context 'Array type' do
|
12
|
-
it { is_expected.to eq(enumerable) }
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'Hash type' do
|
16
|
-
let(:enumerable) { {a: 1, b: 2} }
|
17
|
-
|
18
|
-
it { is_expected.to include([:a, 1]) }
|
19
|
-
|
20
|
-
it { is_expected.to include([:b, 2]) }
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'responds to #to_ary' do
|
24
|
-
let(:converted) { [] }
|
25
|
-
let(:enumerable) { double('Enumerable', to_ary: converted) }
|
26
|
-
|
27
|
-
it { is_expected.to eq(converted) }
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'does not respond to #to_ary' do
|
31
|
-
let(:enumerable) { double('Enumerable') }
|
32
|
-
|
33
|
-
it 'raises error' do
|
34
|
-
expect { subject }.to raise_error(TTY::TypeError)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
@@ -1,117 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe TTY::Conversion::BooleanConverter, '#convert' do
|
6
|
-
let(:object) { described_class.new }
|
7
|
-
|
8
|
-
subject(:converter) { object.convert(value) }
|
9
|
-
|
10
|
-
context "with empty" do
|
11
|
-
let(:value) { '' }
|
12
|
-
|
13
|
-
it { expect { subject }.to raise_error(TTY::Conversion::TypeError) }
|
14
|
-
end
|
15
|
-
|
16
|
-
context "with true" do
|
17
|
-
let(:value) { true }
|
18
|
-
|
19
|
-
it { is_expected.to eq(true) }
|
20
|
-
end
|
21
|
-
|
22
|
-
context "with 'true'" do
|
23
|
-
let(:value) { 'true' }
|
24
|
-
|
25
|
-
it { is_expected.to eq(true) }
|
26
|
-
end
|
27
|
-
|
28
|
-
context "with TRUE" do
|
29
|
-
let(:value) { TRUE }
|
30
|
-
|
31
|
-
it { is_expected.to eq(true) }
|
32
|
-
end
|
33
|
-
|
34
|
-
context "with 'TRUE'" do
|
35
|
-
let(:value) { 'TRUE' }
|
36
|
-
|
37
|
-
it { is_expected.to eq(true) }
|
38
|
-
end
|
39
|
-
|
40
|
-
context "with 't'" do
|
41
|
-
let(:value) { 't' }
|
42
|
-
|
43
|
-
it { is_expected.to eq(true) }
|
44
|
-
end
|
45
|
-
|
46
|
-
context "with 'T'" do
|
47
|
-
let(:value) { 'T' }
|
48
|
-
|
49
|
-
it { is_expected.to eq(true) }
|
50
|
-
end
|
51
|
-
|
52
|
-
context "with 1" do
|
53
|
-
let(:value) { 1 }
|
54
|
-
|
55
|
-
it { is_expected.to eq(true) }
|
56
|
-
end
|
57
|
-
|
58
|
-
context "with '1'" do
|
59
|
-
let(:value) { '1' }
|
60
|
-
|
61
|
-
it { is_expected.to eq(true) }
|
62
|
-
end
|
63
|
-
|
64
|
-
context "with false" do
|
65
|
-
let(:value) { false }
|
66
|
-
|
67
|
-
it { is_expected.to eq(false) }
|
68
|
-
end
|
69
|
-
|
70
|
-
context "with 'false'" do
|
71
|
-
let(:value) { 'false' }
|
72
|
-
|
73
|
-
it { is_expected.to eq(false) }
|
74
|
-
end
|
75
|
-
|
76
|
-
context "with FALSE" do
|
77
|
-
let(:value) { FALSE }
|
78
|
-
|
79
|
-
it { is_expected.to eq(false) }
|
80
|
-
end
|
81
|
-
|
82
|
-
context "with 'FALSE'" do
|
83
|
-
let(:value) { 'FALSE' }
|
84
|
-
|
85
|
-
it { is_expected.to eq(false) }
|
86
|
-
end
|
87
|
-
|
88
|
-
context "with 'f'" do
|
89
|
-
let(:value) { 'f' }
|
90
|
-
|
91
|
-
it { is_expected.to eq(false) }
|
92
|
-
end
|
93
|
-
|
94
|
-
context "with 'F'" do
|
95
|
-
let(:value) { 'F' }
|
96
|
-
|
97
|
-
it { is_expected.to eq(false) }
|
98
|
-
end
|
99
|
-
|
100
|
-
context "with 0" do
|
101
|
-
let(:value) { 0 }
|
102
|
-
|
103
|
-
it { is_expected.to eq(false) }
|
104
|
-
end
|
105
|
-
|
106
|
-
context "with '0'" do
|
107
|
-
let(:value) { '0' }
|
108
|
-
|
109
|
-
it { is_expected.to eq(false) }
|
110
|
-
end
|
111
|
-
|
112
|
-
context "with FOO" do
|
113
|
-
let(:value) { 'FOO' }
|
114
|
-
|
115
|
-
it { expect { subject }.to raise_error(TTY::Conversion::TypeError) }
|
116
|
-
end
|
117
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe TTY::Conversion::FloatConverter, '#convert' do
|
6
|
-
let(:object) { described_class.new }
|
7
|
-
let(:strict) { true }
|
8
|
-
|
9
|
-
subject(:converter) { object.convert(value, strict) }
|
10
|
-
|
11
|
-
context 'with empty' do
|
12
|
-
let(:value) { '' }
|
13
|
-
|
14
|
-
it { expect { subject }.to raise_error(TTY::InvalidArgument) }
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'with 1 as string' do
|
18
|
-
let(:value) { '1' }
|
19
|
-
|
20
|
-
it { is_expected.to eql 1.0 }
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'with float' do
|
24
|
-
let(:value) { '1.2a' }
|
25
|
-
|
26
|
-
it { expect { subject }.to raise_error(TTY::InvalidArgument) }
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with float not strict' do
|
30
|
-
let(:value) { '1.2abc'}
|
31
|
-
let(:strict) { false }
|
32
|
-
|
33
|
-
it { is_expected.to eql 1.2 }
|
34
|
-
end
|
35
|
-
end
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe TTY::Conversion::IntegerConverter, '#convert' do
|
6
|
-
let(:object) { described_class.new }
|
7
|
-
let(:strict) { true }
|
8
|
-
|
9
|
-
subject(:converter) { object.convert(value, strict) }
|
10
|
-
|
11
|
-
context 'with empty' do
|
12
|
-
let(:value) { '' }
|
13
|
-
|
14
|
-
it { expect { subject }.to raise_error(TTY::InvalidArgument) }
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'with 1 as string' do
|
18
|
-
let(:value) { '1' }
|
19
|
-
|
20
|
-
it { is_expected.to eql 1 }
|
21
|
-
end
|
22
|
-
|
23
|
-
context 'with float' do
|
24
|
-
let(:value) { 1.2 }
|
25
|
-
|
26
|
-
it { expect { subject }.to raise_error(TTY::InvalidArgument) }
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'with float not strict' do
|
30
|
-
let(:value) { 1.2 }
|
31
|
-
let(:strict) { false }
|
32
|
-
|
33
|
-
it { is_expected.to eql 1 }
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with letters not strict' do
|
37
|
-
let(:value) { '1abc' }
|
38
|
-
let(:strict) { false }
|
39
|
-
|
40
|
-
it { is_expected.to eql 1 }
|
41
|
-
end
|
42
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe TTY::Conversion::RangeConverter, '#convert' do
|
6
|
-
let(:object) { described_class.new }
|
7
|
-
|
8
|
-
subject(:converter) { object.convert(value) }
|
9
|
-
|
10
|
-
context 'with empty' do
|
11
|
-
let(:value) { '' }
|
12
|
-
|
13
|
-
it { expect { subject }.to raise_error(TTY::InvalidArgument) }
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'with 1' do
|
17
|
-
let(:value) { '1' }
|
18
|
-
|
19
|
-
it { is_expected.to eq(1..1) }
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'with 1..10' do
|
23
|
-
let(:value) { '1..10' }
|
24
|
-
|
25
|
-
it { is_expected.to eq(1..10) }
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'with 1-10' do
|
29
|
-
let(:value) { '1-10' }
|
30
|
-
|
31
|
-
it { is_expected.to eq(1..10) }
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'with 1,10' do
|
35
|
-
let(:value) { '1,10' }
|
36
|
-
|
37
|
-
it { is_expected.to eq(1..10) }
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'with 1...10' do
|
41
|
-
let(:value) { '1...10'}
|
42
|
-
|
43
|
-
it { is_expected.to eq(1...10) }
|
44
|
-
end
|
45
|
-
|
46
|
-
context 'with -1..10' do
|
47
|
-
let(:value) { '-1..10' }
|
48
|
-
|
49
|
-
it { is_expected.to eq(-1..10) }
|
50
|
-
end
|
51
|
-
|
52
|
-
context 'with 1..-10' do
|
53
|
-
let(:value) { '1..-10' }
|
54
|
-
|
55
|
-
it { is_expected.to eq(1..-10) }
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'with a..z' do
|
59
|
-
let(:value) { 'a..z' }
|
60
|
-
|
61
|
-
it { is_expected.to eq('a'..'z')}
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'with a-z' do
|
65
|
-
let(:value) { 'a-z' }
|
66
|
-
|
67
|
-
it { is_expected.to eq('a'..'z')}
|
68
|
-
end
|
69
|
-
|
70
|
-
context 'with A..Z' do
|
71
|
-
let(:value) { 'A..Z' }
|
72
|
-
|
73
|
-
it { is_expected.to eq('A'..'Z')}
|
74
|
-
end
|
75
|
-
end # coerce
|