tty 0.1.1 → 0.1.2

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: fa48f582822f503a5f6baabe338a3cde4fa5a75c
4
- data.tar.gz: c65742283bfea4e4389b2b8efb311a149b106bd7
3
+ metadata.gz: 4e81389b3c20540a552a4677e80c55307fb8964c
4
+ data.tar.gz: 10b70aa565b3bd550cbb7177826e3075ff47b9f8
5
5
  SHA512:
6
- metadata.gz: c2f866d26af71516c644c099d4cf799acf70bb86c1f8abaa4621b9c97257c8d0f4be3b53700a1ebfe43e58b32f80754101db4e5fb296766ee6d18393f829c23d
7
- data.tar.gz: 7b02be106e54c2885b85a7731bdea9d143214f7eeb288db5285d30015d70fc9085c438a799de9339ceb4f8b46dfb01e8f92fa0a454ba725b46772409e3211699
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
@@ -1,3 +1,10 @@
1
+ 0.1.2 (December 14, 2014)
2
+
3
+ * Add Necromancer for type conversions
4
+ * Remove type conversions
5
+ * Add read_keypress call by @janko-m
6
+ * Add raw mode by @janko-m
7
+
1
8
  0.1.1 (November 23, 2014)
2
9
 
3
10
  * Add TTY::ProgressBar
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'
@@ -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
- @range_converter = TTY::Conversion::RangeConverter.new
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 = @range_converter.convert(value)
269
+ @in = @converter.convert(value).to(:range, strict: true)
253
270
  self
254
271
  end
255
272
 
@@ -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
@@ -30,14 +30,10 @@ module TTY
30
30
  #
31
31
  # @api public
32
32
  def initialize(question, shell = Shell.new)
33
- @bool_converter = Conversion::BooleanConverter.new
34
- @float_converter = Conversion::FloatConverter.new
35
- @range_converter = Conversion::RangeConverter.new
36
- @int_converter = Conversion::IntegerConverter.new
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
- question.character? ? reader.getc(question.mask) : reader.gets
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 read_input.to_sym
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
- question.evaluate_response(@int_converter.convert(read_input))
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
- question.evaluate_response(@float_converter.convert(read_input))
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
- question.evaluate_response(@range_converter.convert(read_input))
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
- question.evaluate_response Date.parse(read_input)
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
- question.evaluate_response DateTime.parse(read_input)
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
- question.evaluate_response(@bool_converter.convert(read_input))
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
@@ -39,6 +39,8 @@ module TTY
39
39
 
40
40
  delegatable_method :dispatch, :read_password
41
41
 
42
+ delegatable_method :dispatch, :read_keypress
43
+
42
44
  # Create response instance when question readed is invoked
43
45
  #
44
46
  # @param [TTY::Shell::Response] response
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
- @array_converter = Conversion::ArrayConverter.new
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 = @array_converter.convert(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
- @array_converter = Conversion::ArrayConverter.new
16
- @elements = @array_converter.convert(aligns)
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
- @array_converter = Conversion::ArrayConverter.new
31
- @elements = @array_converter.convert(array)
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
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TTY
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end # TTY
@@ -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(TTY::Conversion::TypeError)
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 { expect { subject }.to raise_error(ArgumentError) }
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
@@ -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 { vector }.to raise_error(TTY::TypeError)
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.new
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.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-23 00:00:00.000000000 Z
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
@@ -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