tty-prompt 0.12.0 → 0.13.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -3
  3. data/CHANGELOG.md +12 -0
  4. data/README.md +3 -3
  5. data/appveyor.yml +2 -0
  6. data/lib/tty/prompt/keypress.rb +7 -4
  7. data/lib/tty/prompt/reader.rb +1 -1
  8. data/lib/tty/prompt/reader/win_api.rb +14 -0
  9. data/lib/tty/prompt/reader/win_console.rb +9 -2
  10. data/lib/tty/prompt/timeout.rb +44 -23
  11. data/lib/tty/prompt/version.rb +1 -1
  12. data/tty-prompt.gemspec +6 -3
  13. metadata +21 -131
  14. data/spec/spec_helper.rb +0 -45
  15. data/spec/unit/ask_spec.rb +0 -132
  16. data/spec/unit/choice/eql_spec.rb +0 -22
  17. data/spec/unit/choice/from_spec.rb +0 -29
  18. data/spec/unit/choices/add_spec.rb +0 -12
  19. data/spec/unit/choices/each_spec.rb +0 -13
  20. data/spec/unit/choices/find_by_spec.rb +0 -10
  21. data/spec/unit/choices/new_spec.rb +0 -10
  22. data/spec/unit/choices/pluck_spec.rb +0 -9
  23. data/spec/unit/collect_spec.rb +0 -33
  24. data/spec/unit/converters/convert_bool_spec.rb +0 -58
  25. data/spec/unit/converters/convert_char_spec.rb +0 -11
  26. data/spec/unit/converters/convert_custom_spec.rb +0 -14
  27. data/spec/unit/converters/convert_date_spec.rb +0 -34
  28. data/spec/unit/converters/convert_file_spec.rb +0 -17
  29. data/spec/unit/converters/convert_number_spec.rb +0 -39
  30. data/spec/unit/converters/convert_path_spec.rb +0 -18
  31. data/spec/unit/converters/convert_range_spec.rb +0 -22
  32. data/spec/unit/converters/convert_regex_spec.rb +0 -12
  33. data/spec/unit/converters/convert_string_spec.rb +0 -21
  34. data/spec/unit/converters/on_error_spec.rb +0 -9
  35. data/spec/unit/distance/distance_spec.rb +0 -73
  36. data/spec/unit/enum_paginator_spec.rb +0 -65
  37. data/spec/unit/enum_select_spec.rb +0 -310
  38. data/spec/unit/error_spec.rb +0 -20
  39. data/spec/unit/evaluator_spec.rb +0 -67
  40. data/spec/unit/expand_spec.rb +0 -198
  41. data/spec/unit/keypress_spec.rb +0 -58
  42. data/spec/unit/mask_spec.rb +0 -132
  43. data/spec/unit/multi_select_spec.rb +0 -319
  44. data/spec/unit/multiline_spec.rb +0 -77
  45. data/spec/unit/new_spec.rb +0 -20
  46. data/spec/unit/ok_spec.rb +0 -10
  47. data/spec/unit/paginator_spec.rb +0 -63
  48. data/spec/unit/question/checks_spec.rb +0 -97
  49. data/spec/unit/question/default_spec.rb +0 -31
  50. data/spec/unit/question/echo_spec.rb +0 -38
  51. data/spec/unit/question/in_spec.rb +0 -115
  52. data/spec/unit/question/initialize_spec.rb +0 -12
  53. data/spec/unit/question/modifier/apply_to_spec.rb +0 -24
  54. data/spec/unit/question/modifier/letter_case_spec.rb +0 -41
  55. data/spec/unit/question/modifier/whitespace_spec.rb +0 -51
  56. data/spec/unit/question/modify_spec.rb +0 -41
  57. data/spec/unit/question/required_spec.rb +0 -92
  58. data/spec/unit/question/validate_spec.rb +0 -115
  59. data/spec/unit/question/validation/call_spec.rb +0 -31
  60. data/spec/unit/question/validation/coerce_spec.rb +0 -30
  61. data/spec/unit/reader/history_spec.rb +0 -172
  62. data/spec/unit/reader/key_event_spec.rb +0 -86
  63. data/spec/unit/reader/line_spec.rb +0 -110
  64. data/spec/unit/reader/publish_keypress_event_spec.rb +0 -94
  65. data/spec/unit/reader/read_keypress_spec.rb +0 -80
  66. data/spec/unit/reader/read_line_spec.rb +0 -68
  67. data/spec/unit/reader/read_multiline_spec.rb +0 -60
  68. data/spec/unit/result_spec.rb +0 -40
  69. data/spec/unit/say_spec.rb +0 -67
  70. data/spec/unit/select_spec.rb +0 -359
  71. data/spec/unit/slider_spec.rb +0 -96
  72. data/spec/unit/statement/initialize_spec.rb +0 -15
  73. data/spec/unit/suggest_spec.rb +0 -28
  74. data/spec/unit/warn_spec.rb +0 -21
  75. data/spec/unit/yes_no_spec.rb +0 -235
@@ -1,15 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt::Statement, '#new' do
4
- it "forces newline after the prompt message" do
5
- prompt = TTY::TestPrompt.new
6
- statement = described_class.new(prompt)
7
- expect(statement.newline).to eq(true)
8
- end
9
-
10
- it "displays prompt message in color" do
11
- prompt = TTY::TestPrompt.new
12
- statement = described_class.new(prompt)
13
- expect(statement.color).to eq(false)
14
- end
15
- end
@@ -1,28 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt, '#suggest' do
4
- let(:possible) { %w(status stage stash commit branch blame) }
5
-
6
- subject(:prompt) { TTY::TestPrompt.new }
7
-
8
- it 'suggests few matches' do
9
- prompt.suggest('sta', possible)
10
- expect(prompt.output.string).
11
- to eql("Did you mean one of these?\n stage\n stash\n")
12
- end
13
-
14
- it 'suggests a single match for one character' do
15
- prompt.suggest('b', possible)
16
- expect(prompt.output.string).to eql("Did you mean this?\n blame\n")
17
- end
18
-
19
- it 'suggests a single match for two characters' do
20
- prompt.suggest('co', possible)
21
- expect(prompt.output.string).to eql("Did you mean this?\n commit\n")
22
- end
23
-
24
- it 'suggests with different text and indentation' do
25
- prompt.suggest('b', possible, indent: 4, single_text: 'Perhaps you meant?')
26
- expect(prompt.output.string).to eql("Perhaps you meant?\n blame\n")
27
- end
28
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt, '#warn' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new }
6
-
7
- it 'displays one message' do
8
- prompt.warn "Careful young apprentice!"
9
- expect(prompt.output.string).to eql "\e[33mCareful young apprentice!\e[0m\n"
10
- end
11
-
12
- it 'displays many messages' do
13
- prompt.warn "Careful there!", "It's dangerous!"
14
- expect(prompt.output.string).to eql "\e[33mCareful there!\e[0m\n\e[33mIt's dangerous!\e[0m\n"
15
- end
16
-
17
- it 'displays message with option' do
18
- prompt.warn "Careful young apprentice!", newline: false
19
- expect(prompt.output.string).to eql "\e[33mCareful young apprentice!\e[0m"
20
- end
21
- end
@@ -1,235 +0,0 @@
1
- # encoding: utf-8
2
-
3
- RSpec.describe TTY::Prompt, 'confirmation' do
4
-
5
- subject(:prompt) { TTY::TestPrompt.new }
6
-
7
- context '#yes?' do
8
- it 'agrees with question' do
9
- prompt.input << 'yes'
10
- prompt.input.rewind
11
- expect(prompt.yes?("Are you a human?")).to eq(true)
12
- expect(prompt.output.string).to eq([
13
- "Are you a human? \e[90m(Y/n)\e[0m ",
14
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m y",
15
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m ye",
16
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m yes",
17
- "\e[1A\e[2K\e[1G",
18
- "Are you a human? \e[32mYes\e[0m\n"
19
- ].join)
20
- end
21
-
22
- it 'disagrees with question' do
23
- prompt.input << 'no'
24
- prompt.input.rewind
25
- expect(prompt.yes?("Are you a human?")).to eq(false)
26
- expect(prompt.output.string).to eq([
27
- "Are you a human? \e[90m(Y/n)\e[0m ",
28
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m n",
29
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m no",
30
- "\e[1A\e[2K\e[1G",
31
- "Are you a human? \e[32mno\e[0m\n"
32
- ].join)
33
- end
34
-
35
- it 'assumes default true' do
36
- prompt.input << "\r"
37
- prompt.input.rewind
38
- expect(prompt.yes?("Are you a human?")).to eq(true)
39
- expect(prompt.output.string).to eq([
40
- "Are you a human? \e[90m(Y/n)\e[0m ",
41
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m \n",
42
- "\e[1A\e[2K\e[1G",
43
- "Are you a human? \e[32mYes\e[0m\n"
44
- ].join)
45
- end
46
-
47
- it 'changes default' do
48
- prompt.input << "\n"
49
- prompt.input.rewind
50
- expect(prompt.yes?("Are you a human?", default: false)).to eq(false)
51
- expect(prompt.output.string).to eq([
52
- "Are you a human? \e[90m(y/N)\e[0m ",
53
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m \n",
54
- "\e[1A\e[2K\e[1G",
55
- "Are you a human? \e[32mNo\e[0m\n"
56
- ].join)
57
- end
58
-
59
- it "defaults suffix and converter" do
60
- prompt.input << "Nope\n"
61
- prompt.input.rewind
62
- result = prompt.yes?("Are you a human?") do |q|
63
- q.positive 'Yup'
64
- q.negative 'nope'
65
- end
66
- expect(result).to eq(false)
67
- expect(prompt.output.string).to eq([
68
- "Are you a human? \e[90m(Yup/nope)\e[0m ",
69
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m N",
70
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m No",
71
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nop",
72
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nope",
73
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nope\n",
74
- "\e[1A\e[2K\e[1G",
75
- "Are you a human? \e[32mnope\e[0m\n"
76
- ].join)
77
- end
78
-
79
- it "defaults positive and negative" do
80
- prompt.input << "Nope\n"
81
- prompt.input.rewind
82
- result = prompt.yes?("Are you a human?") do |q|
83
- q.suffix 'Yup/nope'
84
- end
85
- expect(result).to eq(false)
86
- expect(prompt.output.string).to eq([
87
- "Are you a human? \e[90m(Yup/nope)\e[0m ",
88
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m N",
89
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m No",
90
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nop",
91
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nope",
92
- "\e[2K\e[1GAre you a human? \e[90m(Yup/nope)\e[0m Nope\n",
93
- "\e[1A\e[2K\e[1G",
94
- "Are you a human? \e[32mnope\e[0m\n"
95
- ].join)
96
- end
97
-
98
- it "customizes question through options" do
99
- prompt.input << "\r"
100
- prompt.input.rewind
101
- result = prompt.yes?("Are you a human?", suffix: 'Agree/Disagree',
102
- positive: 'Agree', negative: 'Disagree')
103
- expect(result).to eq(true)
104
- expect(prompt.output.string).to eq([
105
- "Are you a human? \e[90m(Agree/Disagree)\e[0m ",
106
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m \n",
107
- "\e[1A\e[2K\e[1G",
108
- "Are you a human? \e[32mAgree\e[0m\n"
109
- ].join)
110
- end
111
-
112
- it "customizes question through DSL" do
113
- prompt.input << "disagree\r"
114
- prompt.input.rewind
115
- conversion = proc { |input| !input.match(/^agree$/i).nil? }
116
- result = prompt.yes?("Are you a human?") do |q|
117
- q.suffix 'Agree/Disagree'
118
- q.positive 'Agree'
119
- q.negative 'Disagree'
120
- q.convert conversion
121
- end
122
- expect(result).to eq(false)
123
- expect(prompt.output.string).to eq([
124
- "Are you a human? \e[90m(Agree/Disagree)\e[0m ",
125
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m d",
126
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m di",
127
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m dis",
128
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disa",
129
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disag",
130
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disagr",
131
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disagre",
132
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disagree",
133
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m disagree\n",
134
- "\e[1A\e[2K\e[1G",
135
- "Are you a human? \e[32mDisagree\e[0m\n"
136
- ].join)
137
- end
138
- end
139
-
140
- context '#no?' do
141
- it 'agrees with question' do
142
- prompt.input << 'no'
143
- prompt.input.rewind
144
- expect(prompt.no?("Are you a human?")).to eq(true)
145
- expect(prompt.output.string).to eq([
146
- "Are you a human? \e[90m(y/N)\e[0m ",
147
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m n",
148
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m no",
149
- "\e[1A\e[2K\e[1G",
150
- "Are you a human? \e[32mNo\e[0m\n"
151
- ].join)
152
- end
153
-
154
- it 'disagrees with question' do
155
- prompt.input << 'yes'
156
- prompt.input.rewind
157
- expect(prompt.no?("Are you a human?")).to eq(false)
158
- expect(prompt.output.string).to eq([
159
- "Are you a human? \e[90m(y/N)\e[0m ",
160
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m y",
161
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m ye",
162
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m yes",
163
- "\e[1A\e[2K\e[1G",
164
- "Are you a human? \e[32myes\e[0m\n"
165
- ].join)
166
- end
167
-
168
- it 'assumes default false' do
169
- prompt.input << "\r"
170
- prompt.input.rewind
171
- expect(prompt.no?("Are you a human?")).to eq(true)
172
- expect(prompt.output.string).to eq([
173
- "Are you a human? \e[90m(y/N)\e[0m ",
174
- "\e[2K\e[1GAre you a human? \e[90m(y/N)\e[0m \n",
175
- "\e[1A\e[2K\e[1G",
176
- "Are you a human? \e[32mNo\e[0m\n"
177
- ].join)
178
- end
179
-
180
- it 'changes default' do
181
- prompt.input << "\r"
182
- prompt.input.rewind
183
- expect(prompt.no?("Are you a human?", default: true)).to eq(false)
184
- expect(prompt.output.string).to eq([
185
- "Are you a human? \e[90m(Y/n)\e[0m ",
186
- "\e[2K\e[1GAre you a human? \e[90m(Y/n)\e[0m \n",
187
- "\e[1A\e[2K\e[1G",
188
- "Are you a human? \e[32mYes\e[0m\n"
189
- ].join)
190
- end
191
-
192
- it "defaults suffix and converter" do
193
- prompt.input << "Yup\n"
194
- prompt.input.rewind
195
- result = prompt.no?("Are you a human?") do |q|
196
- q.positive 'yup'
197
- q.negative 'Nope'
198
- end
199
- expect(result).to eq(false)
200
- expect(prompt.output.string).to eq([
201
- "Are you a human? \e[90m(yup/Nope)\e[0m ",
202
- "\e[2K\e[1GAre you a human? \e[90m(yup/Nope)\e[0m Y",
203
- "\e[2K\e[1GAre you a human? \e[90m(yup/Nope)\e[0m Yu",
204
- "\e[2K\e[1GAre you a human? \e[90m(yup/Nope)\e[0m Yup",
205
- "\e[2K\e[1GAre you a human? \e[90m(yup/Nope)\e[0m Yup\n",
206
- "\e[1A\e[2K\e[1G",
207
- "Are you a human? \e[32myup\e[0m\n"
208
- ].join)
209
- end
210
-
211
- it "customizes question through DSL" do
212
- prompt.input << "agree\r"
213
- prompt.input.rewind
214
- conversion = proc { |input| !input.match(/^agree$/i).nil? }
215
- result = prompt.no?("Are you a human?") do |q|
216
- q.suffix 'Agree/Disagree'
217
- q.positive 'Agree'
218
- q.negative 'Disagree'
219
- q.convert conversion
220
- end
221
- expect(result).to eq(false)
222
- expect(prompt.output.string).to eq([
223
- "Are you a human? \e[90m(Agree/Disagree)\e[0m ",
224
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m a",
225
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m ag",
226
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m agr",
227
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m agre",
228
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m agree",
229
- "\e[2K\e[1GAre you a human? \e[90m(Agree/Disagree)\e[0m agree\n",
230
- "\e[1A\e[2K\e[1G",
231
- "Are you a human? \e[32mAgree\e[0m\n"
232
- ].join)
233
- end
234
- end
235
- end