tty-prompt 0.18.1 → 0.19.0

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