tty-prompt 0.18.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -0
  3. data/README.md +174 -63
  4. data/Rakefile +2 -2
  5. data/examples/ask_blank.rb +9 -0
  6. data/examples/enum_select_disabled.rb +1 -1
  7. data/examples/enum_select_paged.rb +1 -1
  8. data/examples/expand_auto.rb +29 -0
  9. data/examples/mask.rb +1 -1
  10. data/examples/multi_select.rb +1 -1
  11. data/examples/multi_select_disabled_paged.rb +22 -0
  12. data/examples/multi_select_paged.rb +1 -1
  13. data/examples/select_disabled_paged.rb +22 -0
  14. data/examples/select_paginated.rb +1 -1
  15. data/lib/tty/prompt.rb +46 -10
  16. data/lib/tty/prompt/{enum_paginator.rb → block_paginator.rb} +19 -18
  17. data/lib/tty/prompt/choice.rb +1 -3
  18. data/lib/tty/prompt/enum_list.rb +31 -9
  19. data/lib/tty/prompt/expander.rb +19 -1
  20. data/lib/tty/prompt/keypress.rb +30 -35
  21. data/lib/tty/prompt/list.rb +112 -40
  22. data/lib/tty/prompt/mask_question.rb +2 -3
  23. data/lib/tty/prompt/multi_list.rb +36 -12
  24. data/lib/tty/prompt/paginator.rb +37 -25
  25. data/lib/tty/prompt/question.rb +29 -5
  26. data/lib/tty/prompt/slider.rb +16 -8
  27. data/lib/tty/prompt/symbols.rb +30 -6
  28. data/lib/tty/prompt/timer.rb +75 -0
  29. data/lib/tty/prompt/version.rb +1 -1
  30. data/spec/spec_helper.rb +18 -2
  31. data/spec/unit/ask_spec.rb +45 -4
  32. data/spec/unit/{enum_paginator_spec.rb → block_paginator_spec.rb} +14 -5
  33. data/spec/unit/choice/from_spec.rb +16 -0
  34. data/spec/unit/enum_select_spec.rb +104 -32
  35. data/spec/unit/expand_spec.rb +104 -12
  36. data/spec/unit/keypress_spec.rb +2 -8
  37. data/spec/unit/mask_spec.rb +9 -1
  38. data/spec/unit/multi_select_spec.rb +348 -118
  39. data/spec/unit/paginator_spec.rb +29 -10
  40. data/spec/unit/select_spec.rb +390 -108
  41. data/spec/unit/slider_spec.rb +48 -6
  42. data/spec/unit/timer_spec.rb +29 -0
  43. data/tty-prompt.gemspec +4 -6
  44. metadata +17 -46
  45. data/lib/tty/prompt/timeout.rb +0 -78
@@ -13,7 +13,7 @@ RSpec.describe TTY::Prompt, '#slider' do
13
13
  expect(prompt.output.string).to eq([
14
14
  "\e[?25lWhat size? ",
15
15
  symbols[:line] * 6,
16
- "\e[32m#{symbols[:handle]}\e[0m",
16
+ "\e[32m#{symbols[:bullet]}\e[0m",
17
17
  "#{symbols[:line] * 5} 44",
18
18
  "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
19
19
  "\e[2K\e[1G\e[1A\e[2K\e[1G",
@@ -28,7 +28,7 @@ RSpec.describe TTY::Prompt, '#slider' do
28
28
  expect(prompt.output.string).to eq([
29
29
  "\e[?25lWhat size? ",
30
30
  symbols[:line] * 3,
31
- "\e[32m#{symbols[:handle]}\e[0m",
31
+ "\e[32m#{symbols[:bullet]}\e[0m",
32
32
  "#{symbols[:line] * 8} 38",
33
33
  "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
34
34
  "\e[2K\e[1G\e[1A\e[2K\e[1G",
@@ -50,7 +50,7 @@ RSpec.describe TTY::Prompt, '#slider' do
50
50
  expect(prompt.output.string).to eq([
51
51
  "\e[?25lWhat size? ",
52
52
  symbols[:pipe] + symbols[:line] * 3,
53
- "\e[32m#{symbols[:handle]}\e[0m",
53
+ "\e[32m#{symbols[:bullet]}\e[0m",
54
54
  "#{symbols[:line] * 7 + symbols[:pipe]} 6%",
55
55
  "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
56
56
  "\e[2K\e[1G\e[1A\e[2K\e[1G",
@@ -66,7 +66,7 @@ RSpec.describe TTY::Prompt, '#slider' do
66
66
  expect(prompt.output.string).to eq([
67
67
  "\e[?25lWhat size? ",
68
68
  symbols[:line] * 5,
69
- "\e[31m#{symbols[:handle]}\e[0m",
69
+ "\e[31m#{symbols[:bullet]}\e[0m",
70
70
  "#{symbols[:line] * 5} 5",
71
71
  "\n\e[36m(Use arrow keys, press Enter to select)\e[0m",
72
72
  "\e[2K\e[1G\e[1A\e[2K\e[1G",
@@ -87,14 +87,56 @@ RSpec.describe TTY::Prompt, '#slider' do
87
87
  expect(prompt.output.string).to eq([
88
88
  "\e[?25lWhat size? ",
89
89
  symbols[:line] * 10,
90
- "\e[32m#{symbols[:handle]}\e[0m 10",
90
+ "\e[32m#{symbols[:bullet]}\e[0m 10",
91
91
  "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
92
92
  "\e[2K\e[1G\e[1A\e[2K\e[1G",
93
93
  "What size? ",
94
94
  symbols[:line] * 10,
95
- "\e[32m#{symbols[:handle]}\e[0m 10",
95
+ "\e[32m#{symbols[:bullet]}\e[0m 10",
96
96
  "\e[2K\e[1G",
97
97
  "What size? \e[32m10\e[0m\n\e[?25h"
98
98
  ].join)
99
99
  end
100
+
101
+ it "changes all display symbols" do
102
+ prompt = TTY::TestPrompt.new(symbols: {
103
+ bullet: 'x',
104
+ line: '_'
105
+ })
106
+ prompt.input << "\r"
107
+ prompt.input.rewind
108
+
109
+ expect(prompt.slider('What size?', min: 32, max: 54, step: 2)).to eq(44)
110
+
111
+ expect(prompt.output.string).to eq([
112
+ "\e[?25lWhat size? ",
113
+ '_' * 6,
114
+ "\e[32mx\e[0m",
115
+ "#{'_' * 5} 44",
116
+ "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
117
+ "\e[2K\e[1G\e[1A\e[2K\e[1G",
118
+ "What size? \e[32m44\e[0m\n\e[?25h"
119
+ ].join)
120
+ end
121
+
122
+ it "changes all display symbols per instance" do
123
+ prompt = TTY::TestPrompt.new
124
+ prompt.input << "\r"
125
+ prompt.input.rewind
126
+
127
+ answer = prompt.slider('What size?', min: 32, max: 54, step: 2) do |range|
128
+ range.symbols bullet: 'x', line: '_'
129
+ end
130
+
131
+ expect(answer).to eq(44)
132
+ expect(prompt.output.string).to eq([
133
+ "\e[?25lWhat size? ",
134
+ '_' * 6,
135
+ "\e[32mx\e[0m",
136
+ "#{'_' * 5} 44",
137
+ "\n\e[90m(Use arrow keys, press Enter to select)\e[0m",
138
+ "\e[2K\e[1G\e[1A\e[2K\e[1G",
139
+ "What size? \e[32m44\e[0m\n\e[?25h"
140
+ ].join)
141
+ end
100
142
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe TTY::Prompt::Timer do
4
+ it "times out loop execution" do
5
+ timer = TTY::Prompt::Timer.new(0.03, 0.01)
6
+ yielded = []
7
+
8
+ timer.while_remaining do |remaining|
9
+ expect(remaining).to be_within(0.1).of(timer.duration - yielded.size * 0.01)
10
+ yielded << remaining
11
+ sleep(0.01)
12
+ end
13
+ end
14
+
15
+ it "registers a tick event" do
16
+ timer = TTY::Prompt::Timer.new(0.03, 0.01)
17
+ yielded = []
18
+
19
+ timer.on_tick do |time|
20
+ yielded << time
21
+ end
22
+
23
+ timer.while_remaining do
24
+ # busy work
25
+ end
26
+
27
+ expect(yielded.size).to be >= 2
28
+ end
29
+ end
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "tty-prompt"
7
7
  spec.version = TTY::Prompt::VERSION
8
8
  spec.authors = ["Piotr Murach"]
9
- spec.email = [""]
9
+ spec.email = ["me@piotrmurach.com"]
10
10
  spec.summary = %q{A beautiful and powerful interactive command line prompt.}
11
11
  spec.description = %q{A beautiful and powerful interactive command line prompt with a robust API for getting and validating complex inputs.}
12
12
  spec.homepage = "https://piotrmurach.github.io/tty"
@@ -21,13 +21,11 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.required_ruby_version = '>= 2.0.0'
23
23
 
24
- spec.add_dependency 'necromancer', '~> 0.4.0'
24
+ spec.add_dependency 'necromancer', '~> 0.5.0'
25
25
  spec.add_dependency 'pastel', '~> 0.7.0'
26
- spec.add_dependency 'timers', '~> 4.0'
27
- spec.add_dependency 'tty-cursor', '~> 0.6.0'
28
- spec.add_dependency 'tty-reader', '~> 0.5.0'
26
+ spec.add_dependency 'tty-reader', '~> 0.6.0'
29
27
 
30
- spec.add_development_dependency 'bundler', '>= 1.5.0', '< 2.0'
28
+ spec.add_development_dependency 'bundler', '>= 1.5.0'
31
29
  spec.add_development_dependency 'rake'
32
30
  spec.add_development_dependency 'rspec', '~> 3.0'
33
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tty-prompt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.1
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Murach
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-29 00:00:00.000000000 Z
11
+ date: 2019-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: necromancer
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.4.0
19
+ version: 0.5.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.4.0
26
+ version: 0.5.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pastel
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.7.0
41
41
  - !ruby/object:Gem::Dependency
42
- name: timers
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '4.0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '4.0'
55
- - !ruby/object:Gem::Dependency
56
- name: tty-cursor
42
+ name: tty-reader
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - "~>"
@@ -66,20 +52,6 @@ dependencies:
66
52
  - - "~>"
67
53
  - !ruby/object:Gem::Version
68
54
  version: 0.6.0
69
- - !ruby/object:Gem::Dependency
70
- name: tty-reader
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 0.5.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 0.5.0
83
55
  - !ruby/object:Gem::Dependency
84
56
  name: bundler
85
57
  requirement: !ruby/object:Gem::Requirement
@@ -87,9 +59,6 @@ dependencies:
87
59
  - - ">="
88
60
  - !ruby/object:Gem::Version
89
61
  version: 1.5.0
90
- - - "<"
91
- - !ruby/object:Gem::Version
92
- version: '2.0'
93
62
  type: :development
94
63
  prerelease: false
95
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -97,9 +66,6 @@ dependencies:
97
66
  - - ">="
98
67
  - !ruby/object:Gem::Version
99
68
  version: 1.5.0
100
- - - "<"
101
- - !ruby/object:Gem::Version
102
- version: '2.0'
103
69
  - !ruby/object:Gem::Dependency
104
70
  name: rake
105
71
  requirement: !ruby/object:Gem::Requirement
@@ -131,7 +97,7 @@ dependencies:
131
97
  description: A beautiful and powerful interactive command line prompt with a robust
132
98
  API for getting and validating complex inputs.
133
99
  email:
134
- - ''
100
+ - me@piotrmurach.com
135
101
  executables: []
136
102
  extensions: []
137
103
  extra_rdoc_files: []
@@ -141,6 +107,7 @@ files:
141
107
  - README.md
142
108
  - Rakefile
143
109
  - examples/ask.rb
110
+ - examples/ask_blank.rb
144
111
  - examples/ask_valid.rb
145
112
  - examples/collect.rb
146
113
  - examples/echo.rb
@@ -149,6 +116,7 @@ files:
149
116
  - examples/enum_select_paged.rb
150
117
  - examples/enum_select_wrapped.rb
151
118
  - examples/expand.rb
119
+ - examples/expand_auto.rb
152
120
  - examples/in.rb
153
121
  - examples/inputs.rb
154
122
  - examples/key_events.rb
@@ -156,12 +124,14 @@ files:
156
124
  - examples/mask.rb
157
125
  - examples/multi_select.rb
158
126
  - examples/multi_select_disabled.rb
127
+ - examples/multi_select_disabled_paged.rb
159
128
  - examples/multi_select_paged.rb
160
129
  - examples/multi_select_wrapped.rb
161
130
  - examples/multiline.rb
162
131
  - examples/pause.rb
163
132
  - examples/select.rb
164
133
  - examples/select_disabled.rb
134
+ - examples/select_disabled_paged.rb
165
135
  - examples/select_enum.rb
166
136
  - examples/select_filtered.rb
167
137
  - examples/select_paginated.rb
@@ -172,6 +142,7 @@ files:
172
142
  - lib/tty-prompt.rb
173
143
  - lib/tty/prompt.rb
174
144
  - lib/tty/prompt/answers_collector.rb
145
+ - lib/tty/prompt/block_paginator.rb
175
146
  - lib/tty/prompt/choice.rb
176
147
  - lib/tty/prompt/choices.rb
177
148
  - lib/tty/prompt/confirm_question.rb
@@ -180,7 +151,6 @@ files:
180
151
  - lib/tty/prompt/converters.rb
181
152
  - lib/tty/prompt/distance.rb
182
153
  - lib/tty/prompt/enum_list.rb
183
- - lib/tty/prompt/enum_paginator.rb
184
154
  - lib/tty/prompt/evaluator.rb
185
155
  - lib/tty/prompt/expander.rb
186
156
  - lib/tty/prompt/keypress.rb
@@ -199,12 +169,13 @@ files:
199
169
  - lib/tty/prompt/statement.rb
200
170
  - lib/tty/prompt/suggestion.rb
201
171
  - lib/tty/prompt/symbols.rb
202
- - lib/tty/prompt/timeout.rb
172
+ - lib/tty/prompt/timer.rb
203
173
  - lib/tty/prompt/utils.rb
204
174
  - lib/tty/prompt/version.rb
205
175
  - lib/tty/test_prompt.rb
206
176
  - spec/spec_helper.rb
207
177
  - spec/unit/ask_spec.rb
178
+ - spec/unit/block_paginator_spec.rb
208
179
  - spec/unit/choice/eql_spec.rb
209
180
  - spec/unit/choice/from_spec.rb
210
181
  - spec/unit/choices/add_spec.rb
@@ -225,7 +196,6 @@ files:
225
196
  - spec/unit/converters/convert_string_spec.rb
226
197
  - spec/unit/converters/on_error_spec.rb
227
198
  - spec/unit/distance/distance_spec.rb
228
- - spec/unit/enum_paginator_spec.rb
229
199
  - spec/unit/enum_select_spec.rb
230
200
  - spec/unit/error_spec.rb
231
201
  - spec/unit/evaluator_spec.rb
@@ -257,6 +227,7 @@ files:
257
227
  - spec/unit/statement/initialize_spec.rb
258
228
  - spec/unit/subscribe_spec.rb
259
229
  - spec/unit/suggest_spec.rb
230
+ - spec/unit/timer_spec.rb
260
231
  - spec/unit/warn_spec.rb
261
232
  - spec/unit/yes_no_spec.rb
262
233
  - tasks/console.rake
@@ -282,14 +253,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
282
253
  - !ruby/object:Gem::Version
283
254
  version: '0'
284
255
  requirements: []
285
- rubyforge_project:
286
- rubygems_version: 2.7.3
256
+ rubygems_version: 3.0.3
287
257
  signing_key:
288
258
  specification_version: 4
289
259
  summary: A beautiful and powerful interactive command line prompt.
290
260
  test_files:
291
261
  - spec/spec_helper.rb
292
262
  - spec/unit/ask_spec.rb
263
+ - spec/unit/block_paginator_spec.rb
293
264
  - spec/unit/choice/eql_spec.rb
294
265
  - spec/unit/choice/from_spec.rb
295
266
  - spec/unit/choices/add_spec.rb
@@ -310,7 +281,6 @@ test_files:
310
281
  - spec/unit/converters/convert_string_spec.rb
311
282
  - spec/unit/converters/on_error_spec.rb
312
283
  - spec/unit/distance/distance_spec.rb
313
- - spec/unit/enum_paginator_spec.rb
314
284
  - spec/unit/enum_select_spec.rb
315
285
  - spec/unit/error_spec.rb
316
286
  - spec/unit/evaluator_spec.rb
@@ -342,5 +312,6 @@ test_files:
342
312
  - spec/unit/statement/initialize_spec.rb
343
313
  - spec/unit/subscribe_spec.rb
344
314
  - spec/unit/suggest_spec.rb
315
+ - spec/unit/timer_spec.rb
345
316
  - spec/unit/warn_spec.rb
346
317
  - spec/unit/yes_no_spec.rb
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'timers'
4
-
5
- module TTY
6
- class Prompt
7
- class Timeout
8
- # A class responsible for measuring interval
9
- #
10
- # @api private
11
- def initialize(options = {})
12
- @interval_handler = options.fetch(:interval_handler) { proc {} }
13
- @lock = Mutex.new
14
- @running = true
15
- @timers = Timers::Group.new
16
- end
17
-
18
- def self.timeout(time, interval, &block)
19
- (@scheduler ||= new).timeout(time, interval, &block)
20
- end
21
-
22
- # Evalute block and time it
23
- #
24
- # @param [Float] time
25
- # the time by which to stop
26
- # @param [Float] interval
27
- # the interval time for each tick
28
- #
29
- # @api public
30
- def timeout(time, interval, &job)
31
- input_thread = Thread.new { job.() }
32
- timing_thread = measure_intervals(time, interval, input_thread)
33
- [input_thread, timing_thread].each(&:join)
34
- end
35
-
36
- # Cancel this timeout measurement
37
- #
38
- # @api public
39
- def cancel
40
- return unless @running
41
- @running = false
42
- end
43
-
44
- # Measure intervals and terminate input
45
- #
46
- # @api private
47
- def measure_intervals(time, interval, input_thread)
48
- Thread.new do
49
- Thread.current.abort_on_exception = true
50
- start = Time.now
51
-
52
- interval_timer = @timers.every(interval) do
53
- runtime = Time.now - start
54
- delta = time - runtime
55
- if delta.round >= 0
56
- @interval_handler.(delta.round)
57
- end
58
- end
59
-
60
- while @running
61
- @lock.synchronize {
62
- @timers.wait
63
- runtime = Time.now - start
64
- delta = time - runtime
65
-
66
- if delta <= 0.0
67
- @running = false
68
- end
69
- }
70
- end
71
-
72
- input_thread.terminate
73
- interval_timer.cancel
74
- end
75
- end
76
- end # Scheduler
77
- end # Prompt
78
- end # TTY