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