cliutils 2.1.4 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +3 -2
  4. data/Gemfile +7 -0
  5. data/HISTORY.md +7 -0
  6. data/README.md +3 -1
  7. data/Rakefile +8 -1
  8. data/cliutils.gemspec +1 -0
  9. data/lib/cliutils/configuration.rb +1 -1
  10. data/lib/cliutils/constants.rb +1 -1
  11. data/lib/cliutils/ext/hash_extensions.rb +16 -12
  12. data/lib/cliutils/messaging.rb +2 -116
  13. data/lib/cliutils/messenger.rb +109 -0
  14. data/lib/cliutils/prefs/pref.rb +10 -10
  15. data/lib/cliutils/prefs/pref_actions/open_url_action.rb +1 -1
  16. data/lib/cliutils/prefs/pref_validators/filepath_exists_validator.rb +2 -0
  17. data/lib/cliutils/prefs/pref_validators/url_validator.rb +1 -1
  18. data/lib/cliutils/prefs.rb +1 -1
  19. data/lib/cliutils/pretty_io.rb +0 -10
  20. data/lib/cliutils.rb +1 -1
  21. data/spec/action/open_url_action_spec.rb +20 -0
  22. data/spec/action/pref_action_spec.rb +11 -0
  23. data/spec/behavior/capitalize_behavior_spec.rb +11 -0
  24. data/spec/behavior/expand_filepath_behavior_spec.rb +11 -0
  25. data/spec/behavior/lowercase_behavior_spec.rb +11 -0
  26. data/spec/behavior/pref_behavior_spec.rb +11 -0
  27. data/spec/behavior/prefix_behavior_spec.rb +12 -0
  28. data/spec/behavior/suffix_behavior_spec.rb +12 -0
  29. data/spec/behavior/titlecase_behavior_spec.rb +10 -0
  30. data/spec/behavior/uppercase_behavior_spec.rb +11 -0
  31. data/spec/configuration_spec.rb +37 -0
  32. data/spec/configurator_spec.rb +104 -0
  33. data/spec/ext/hash_extensions_spec.rb +54 -0
  34. data/spec/ext/logger_extensions_spec.rb +20 -0
  35. data/spec/ext/string_extensions_spec.rb +26 -0
  36. data/spec/messaging_spec.rb +91 -0
  37. data/spec/pref_spec.rb +144 -0
  38. data/spec/prefs_spec.rb +150 -0
  39. data/spec/spec_helper.rb +16 -0
  40. data/spec/validator/alphabetic_validator_spec.rb +20 -0
  41. data/spec/validator/alphanumeric_validator_spec.rb +20 -0
  42. data/spec/validator/date_validator_spec.rb +20 -0
  43. data/spec/validator/datetime_validator_spec.rb +20 -0
  44. data/spec/validator/filepath_exists_validator_spec.rb +20 -0
  45. data/spec/validator/non_nil_validator_spec.rb +24 -0
  46. data/spec/validator/number_validator_spec.rb +20 -0
  47. data/spec/validator/pref_validator_spec.rb +11 -0
  48. data/spec/validator/time_validator_spec.rb +20 -0
  49. data/spec/validator/url_validator_spec.rb +20 -0
  50. data/{test/test_files → support}/configuration.yaml +1 -1
  51. data/support/prefstest.yaml +27 -0
  52. data/{test/test_files → support}/test_action.rb +0 -0
  53. data/support/test_action_empty.rb +7 -0
  54. data/{test/test_files → support}/test_behavior.rb +2 -2
  55. data/support/test_behavior_empty.rb +6 -0
  56. data/{test/test_files → support}/test_validator.rb +0 -2
  57. data/support/test_validator_empty.rb +7 -0
  58. data/test/pref_test.rb +0 -1
  59. data/test/prefs_test.rb +64 -1
  60. data/test/test_helper.rb +2 -2
  61. metadata +91 -67
  62. data/lib/cliutils/logger_delegator.rb +0 -49
  63. data/test/action_tests/open_url_action_test.rb +0 -12
  64. data/test/behavior_tests/capitalize_behavior_test.rb +0 -11
  65. data/test/behavior_tests/expand_filepath_behavior_test.rb +0 -11
  66. data/test/behavior_tests/lowercase_behavior_test.rb +0 -11
  67. data/test/behavior_tests/prefix_behavior_test.rb +0 -12
  68. data/test/behavior_tests/suffix_behavior_test.rb +0 -12
  69. data/test/behavior_tests/titlecase_behavior_test.rb +0 -11
  70. data/test/behavior_tests/uppercase_behavior_test.rb +0 -11
  71. data/test/configuration_test.rb +0 -49
  72. data/test/configurator_test.rb +0 -63
  73. data/test/hash_extensions_test.rb +0 -51
  74. data/test/logger_extensions_test.rb +0 -17
  75. data/test/messaging_test.rb +0 -53
  76. data/test/string_extesions_test.rb +0 -28
  77. data/test/test_files/prefstest.yaml +0 -38
  78. data/test/validator_tests/alphabetic_validator_test.rb +0 -22
  79. data/test/validator_tests/alphanumeric_validator_test.rb +0 -22
  80. data/test/validator_tests/date_validator_test.rb +0 -22
  81. data/test/validator_tests/datetime_validator_test.rb +0 -22
  82. data/test/validator_tests/filepath_exists_validator_test.rb +0 -22
  83. data/test/validator_tests/non_nil_validator_test.rb +0 -30
  84. data/test/validator_tests/number_validator_test.rb +0 -22
  85. data/test/validator_tests/time_validator_test.rb +0 -22
  86. data/test/validator_tests/url_validator_test.rb +0 -22
@@ -0,0 +1,91 @@
1
+ require_relative 'spec_helper'
2
+ require 'cliutils/ext/logger_extensions'
3
+ require 'cliutils/ext/string_extensions'
4
+ require 'cliutils/messaging'
5
+ require 'cliutils/pretty_io'
6
+
7
+ describe CLIUtils::Messaging do
8
+ include CLIUtils::Messaging
9
+
10
+ it 'gives a set of standard message formats' do
11
+ out = capture_stdout { messenger.error('error') }
12
+ expect(out).to eq('# error'.red + "\n")
13
+
14
+ out = capture_stdout { messenger.info('info') }
15
+ expect(out).to eq('# info'.blue + "\n")
16
+
17
+ out = capture_stdout { messenger.section('section') }
18
+ expect(out).to eq('---> section'.purple + "\n")
19
+
20
+ out = capture_stdout { messenger.success('success') }
21
+ expect(out).to eq('# success'.green + "\n")
22
+
23
+ out = capture_stdout { messenger.warn('warn') }
24
+ expect(out).to eq('# warn'.yellow + "\n")
25
+ end
26
+
27
+ it 'wraps strings' do
28
+ CLIUtils::PrettyIO.wrap = true
29
+ CLIUtils::PrettyIO.wrap_char_limit = 35
30
+ long_str = 'This is a really long string that should wrap itself at ' \
31
+ 'some point, okay?'
32
+ expected_str = "# This is a really long string that\n# should wrap " \
33
+ "itself at some point,\n# okay?"
34
+
35
+ out = capture_stdout { messenger.info(long_str) }
36
+ expect(out).to eq(expected_str.blue + "\n")
37
+
38
+ CLIUtils::PrettyIO.wrap = false
39
+ out = capture_stdout { messenger.info(long_str) }
40
+ expect(out).to eq("# #{ long_str }".blue + "\n")
41
+ end
42
+
43
+ let(:output_filepath) { '/tmp/file1.txt' }
44
+ it 'attaches and detaches various Logger instances' do
45
+ file_logger = Logger.new(output_filepath)
46
+ file_logger.formatter = proc do |severity, datetime, progname, msg|
47
+ "#{ severity }: #{ msg }\n"
48
+ end
49
+
50
+ out = capture_stdout do
51
+ messenger.attach(FILE: file_logger)
52
+ messenger.debug('Debug test')
53
+ messenger.info('Info test')
54
+ messenger.error('Error test')
55
+ messenger.detach(:FILE)
56
+ messenger.warn('Warn test')
57
+ end
58
+
59
+ File.open(output_filepath, 'r') do |f|
60
+ file_contents = f.read.lines.to_a[1..-1].join
61
+ m = "DEBUG: Debug test\nINFO: Info test\nERROR: Error test\n"
62
+ expect(file_contents).to eq(m)
63
+ end
64
+ FileUtils.rm(output_filepath)
65
+ end
66
+
67
+ it 'raises an exception when attempting to detach an unknown target' do
68
+ m = 'Cannot detach invalid target: bachya'
69
+ expect { messenger.detach(:bachya) }.to raise_error(RuntimeError, m)
70
+ end
71
+
72
+ it 'allows users to deliver answers to prompts' do
73
+ Readline.stub(:readline).and_return('Yes', '')
74
+ Readline.stub(:completion_proc=).and_return("\t")
75
+ expect(messenger.prompt('Do you like cheese?', 'No')).to eq('Yes')
76
+ expect(messenger.prompt('Do you like cheese?', 'No')).to eq('No')
77
+ expect(messenger.prompt('Do you like cheese?', '')).to eq('')
78
+ end
79
+
80
+ it 'warns about deprecated methods' do
81
+ out = capture_stdout { messenger.info_block('test') }
82
+ s = 'As of 2.2.0, `info_block` is deprecated and nonfunctioning.'
83
+ expect(out).to eq("# #{ s }".yellow + "\n")
84
+ end
85
+
86
+ it 'outputs a useful ASCII color chart' do
87
+ s = "----------------------------------------------------------------\nESC[0;Foreground;Background\n\e[0;30;40m 30;40 \e[0;30;41m 30;41 \e[0;30;42m 30;42 \e[0;30;43m 30;43 \e[0;30;44m 30;44 \e[0;30;45m 30;45 \e[0;30;46m 30;46 \e[0;30;47m 30;47 \e[0m\n\e[0;31;40m 31;40 \e[0;31;41m 31;41 \e[0;31;42m 31;42 \e[0;31;43m 31;43 \e[0;31;44m 31;44 \e[0;31;45m 31;45 \e[0;31;46m 31;46 \e[0;31;47m 31;47 \e[0m\n\e[0;32;40m 32;40 \e[0;32;41m 32;41 \e[0;32;42m 32;42 \e[0;32;43m 32;43 \e[0;32;44m 32;44 \e[0;32;45m 32;45 \e[0;32;46m 32;46 \e[0;32;47m 32;47 \e[0m\n\e[0;33;40m 33;40 \e[0;33;41m 33;41 \e[0;33;42m 33;42 \e[0;33;43m 33;43 \e[0;33;44m 33;44 \e[0;33;45m 33;45 \e[0;33;46m 33;46 \e[0;33;47m 33;47 \e[0m\n\e[0;34;40m 34;40 \e[0;34;41m 34;41 \e[0;34;42m 34;42 \e[0;34;43m 34;43 \e[0;34;44m 34;44 \e[0;34;45m 34;45 \e[0;34;46m 34;46 \e[0;34;47m 34;47 \e[0m\n\e[0;35;40m 35;40 \e[0;35;41m 35;41 \e[0;35;42m 35;42 \e[0;35;43m 35;43 \e[0;35;44m 35;44 \e[0;35;45m 35;45 \e[0;35;46m 35;46 \e[0;35;47m 35;47 \e[0m\n\e[0;36;40m 36;40 \e[0;36;41m 36;41 \e[0;36;42m 36;42 \e[0;36;43m 36;43 \e[0;36;44m 36;44 \e[0;36;45m 36;45 \e[0;36;46m 36;46 \e[0;36;47m 36;47 \e[0m\n\e[0;37;40m 37;40 \e[0;37;41m 37;41 \e[0;37;42m 37;42 \e[0;37;43m 37;43 \e[0;37;44m 37;44 \e[0;37;45m 37;45 \e[0;37;46m 37;46 \e[0;37;47m 37;47 \e[0m\n----------------------------------------------------------------\nESC[1;Foreground;Background\n\e[1;30;40m 30;40 \e[1;30;41m 30;41 \e[1;30;42m 30;42 \e[1;30;43m 30;43 \e[1;30;44m 30;44 \e[1;30;45m 30;45 \e[1;30;46m 30;46 \e[1;30;47m 30;47 \e[0m\n\e[1;31;40m 31;40 \e[1;31;41m 31;41 \e[1;31;42m 31;42 \e[1;31;43m 31;43 \e[1;31;44m 31;44 \e[1;31;45m 31;45 \e[1;31;46m 31;46 \e[1;31;47m 31;47 \e[0m\n\e[1;32;40m 32;40 \e[1;32;41m 32;41 \e[1;32;42m 32;42 \e[1;32;43m 32;43 \e[1;32;44m 32;44 \e[1;32;45m 32;45 \e[1;32;46m 32;46 \e[1;32;47m 32;47 \e[0m\n\e[1;33;40m 33;40 \e[1;33;41m 33;41 \e[1;33;42m 33;42 \e[1;33;43m 33;43 \e[1;33;44m 33;44 \e[1;33;45m 33;45 \e[1;33;46m 33;46 \e[1;33;47m 33;47 \e[0m\n\e[1;34;40m 34;40 \e[1;34;41m 34;41 \e[1;34;42m 34;42 \e[1;34;43m 34;43 \e[1;34;44m 34;44 \e[1;34;45m 34;45 \e[1;34;46m 34;46 \e[1;34;47m 34;47 \e[0m\n\e[1;35;40m 35;40 \e[1;35;41m 35;41 \e[1;35;42m 35;42 \e[1;35;43m 35;43 \e[1;35;44m 35;44 \e[1;35;45m 35;45 \e[1;35;46m 35;46 \e[1;35;47m 35;47 \e[0m\n\e[1;36;40m 36;40 \e[1;36;41m 36;41 \e[1;36;42m 36;42 \e[1;36;43m 36;43 \e[1;36;44m 36;44 \e[1;36;45m 36;45 \e[1;36;46m 36;46 \e[1;36;47m 36;47 \e[0m\n\e[1;37;40m 37;40 \e[1;37;41m 37;41 \e[1;37;42m 37;42 \e[1;37;43m 37;43 \e[1;37;44m 37;44 \e[1;37;45m 37;45 \e[1;37;46m 37;46 \e[1;37;47m 37;47 \e[0m\n----------------------------------------------------------------\nESC[4;Foreground;Background\n\e[4;30;40m 30;40 \e[4;30;41m 30;41 \e[4;30;42m 30;42 \e[4;30;43m 30;43 \e[4;30;44m 30;44 \e[4;30;45m 30;45 \e[4;30;46m 30;46 \e[4;30;47m 30;47 \e[0m\n\e[4;31;40m 31;40 \e[4;31;41m 31;41 \e[4;31;42m 31;42 \e[4;31;43m 31;43 \e[4;31;44m 31;44 \e[4;31;45m 31;45 \e[4;31;46m 31;46 \e[4;31;47m 31;47 \e[0m\n\e[4;32;40m 32;40 \e[4;32;41m 32;41 \e[4;32;42m 32;42 \e[4;32;43m 32;43 \e[4;32;44m 32;44 \e[4;32;45m 32;45 \e[4;32;46m 32;46 \e[4;32;47m 32;47 \e[0m\n\e[4;33;40m 33;40 \e[4;33;41m 33;41 \e[4;33;42m 33;42 \e[4;33;43m 33;43 \e[4;33;44m 33;44 \e[4;33;45m 33;45 \e[4;33;46m 33;46 \e[4;33;47m 33;47 \e[0m\n\e[4;34;40m 34;40 \e[4;34;41m 34;41 \e[4;34;42m 34;42 \e[4;34;43m 34;43 \e[4;34;44m 34;44 \e[4;34;45m 34;45 \e[4;34;46m 34;46 \e[4;34;47m 34;47 \e[0m\n\e[4;35;40m 35;40 \e[4;35;41m 35;41 \e[4;35;42m 35;42 \e[4;35;43m 35;43 \e[4;35;44m 35;44 \e[4;35;45m 35;45 \e[4;35;46m 35;46 \e[4;35;47m 35;47 \e[0m\n\e[4;36;40m 36;40 \e[4;36;41m 36;41 \e[4;36;42m 36;42 \e[4;36;43m 36;43 \e[4;36;44m 36;44 \e[4;36;45m 36;45 \e[4;36;46m 36;46 \e[4;36;47m 36;47 \e[0m\n\e[4;37;40m 37;40 \e[4;37;41m 37;41 \e[4;37;42m 37;42 \e[4;37;43m 37;43 \e[4;37;44m 37;44 \e[4;37;45m 37;45 \e[4;37;46m 37;46 \e[4;37;47m 37;47 \e[0m\n----------------------------------------------------------------\nESC[5;Foreground;Background\n\e[5;30;40m 30;40 \e[5;30;41m 30;41 \e[5;30;42m 30;42 \e[5;30;43m 30;43 \e[5;30;44m 30;44 \e[5;30;45m 30;45 \e[5;30;46m 30;46 \e[5;30;47m 30;47 \e[0m\n\e[5;31;40m 31;40 \e[5;31;41m 31;41 \e[5;31;42m 31;42 \e[5;31;43m 31;43 \e[5;31;44m 31;44 \e[5;31;45m 31;45 \e[5;31;46m 31;46 \e[5;31;47m 31;47 \e[0m\n\e[5;32;40m 32;40 \e[5;32;41m 32;41 \e[5;32;42m 32;42 \e[5;32;43m 32;43 \e[5;32;44m 32;44 \e[5;32;45m 32;45 \e[5;32;46m 32;46 \e[5;32;47m 32;47 \e[0m\n\e[5;33;40m 33;40 \e[5;33;41m 33;41 \e[5;33;42m 33;42 \e[5;33;43m 33;43 \e[5;33;44m 33;44 \e[5;33;45m 33;45 \e[5;33;46m 33;46 \e[5;33;47m 33;47 \e[0m\n\e[5;34;40m 34;40 \e[5;34;41m 34;41 \e[5;34;42m 34;42 \e[5;34;43m 34;43 \e[5;34;44m 34;44 \e[5;34;45m 34;45 \e[5;34;46m 34;46 \e[5;34;47m 34;47 \e[0m\n\e[5;35;40m 35;40 \e[5;35;41m 35;41 \e[5;35;42m 35;42 \e[5;35;43m 35;43 \e[5;35;44m 35;44 \e[5;35;45m 35;45 \e[5;35;46m 35;46 \e[5;35;47m 35;47 \e[0m\n\e[5;36;40m 36;40 \e[5;36;41m 36;41 \e[5;36;42m 36;42 \e[5;36;43m 36;43 \e[5;36;44m 36;44 \e[5;36;45m 36;45 \e[5;36;46m 36;46 \e[5;36;47m 36;47 \e[0m\n\e[5;37;40m 37;40 \e[5;37;41m 37;41 \e[5;37;42m 37;42 \e[5;37;43m 37;43 \e[5;37;44m 37;44 \e[5;37;45m 37;45 \e[5;37;46m 37;46 \e[5;37;47m 37;47 \e[0m\n----------------------------------------------------------------\nESC[7;Foreground;Background\n\e[7;30;40m 30;40 \e[7;30;41m 30;41 \e[7;30;42m 30;42 \e[7;30;43m 30;43 \e[7;30;44m 30;44 \e[7;30;45m 30;45 \e[7;30;46m 30;46 \e[7;30;47m 30;47 \e[0m\n\e[7;31;40m 31;40 \e[7;31;41m 31;41 \e[7;31;42m 31;42 \e[7;31;43m 31;43 \e[7;31;44m 31;44 \e[7;31;45m 31;45 \e[7;31;46m 31;46 \e[7;31;47m 31;47 \e[0m\n\e[7;32;40m 32;40 \e[7;32;41m 32;41 \e[7;32;42m 32;42 \e[7;32;43m 32;43 \e[7;32;44m 32;44 \e[7;32;45m 32;45 \e[7;32;46m 32;46 \e[7;32;47m 32;47 \e[0m\n\e[7;33;40m 33;40 \e[7;33;41m 33;41 \e[7;33;42m 33;42 \e[7;33;43m 33;43 \e[7;33;44m 33;44 \e[7;33;45m 33;45 \e[7;33;46m 33;46 \e[7;33;47m 33;47 \e[0m\n\e[7;34;40m 34;40 \e[7;34;41m 34;41 \e[7;34;42m 34;42 \e[7;34;43m 34;43 \e[7;34;44m 34;44 \e[7;34;45m 34;45 \e[7;34;46m 34;46 \e[7;34;47m 34;47 \e[0m\n\e[7;35;40m 35;40 \e[7;35;41m 35;41 \e[7;35;42m 35;42 \e[7;35;43m 35;43 \e[7;35;44m 35;44 \e[7;35;45m 35;45 \e[7;35;46m 35;46 \e[7;35;47m 35;47 \e[0m\n\e[7;36;40m 36;40 \e[7;36;41m 36;41 \e[7;36;42m 36;42 \e[7;36;43m 36;43 \e[7;36;44m 36;44 \e[7;36;45m 36;45 \e[7;36;46m 36;46 \e[7;36;47m 36;47 \e[0m\n\e[7;37;40m 37;40 \e[7;37;41m 37;41 \e[7;37;42m 37;42 \e[7;37;43m 37;43 \e[7;37;44m 37;44 \e[7;37;45m 37;45 \e[7;37;46m 37;46 \e[7;37;47m 37;47 \e[0m\n"
88
+ out = capture_stdout { messenger.color_chart }
89
+ expect(out).to eq(s)
90
+ end
91
+ end
data/spec/pref_spec.rb ADDED
@@ -0,0 +1,144 @@
1
+ require_relative 'spec_helper'
2
+ require 'cliutils/ext/hash_extensions'
3
+ require 'cliutils/prefs/pref'
4
+ require 'cliutils/prefs/pref_actions/pref_action'
5
+ require 'cliutils/prefs/pref_behaviors/pref_behavior'
6
+ require 'cliutils/prefs/pref_validators/pref_validator'
7
+ require File.join(File.dirname(__FILE__), '..', 'support/test_action.rb')
8
+ require File.join(File.dirname(__FILE__), '..', 'support/test_behavior.rb')
9
+ require File.join(File.dirname(__FILE__), '..', 'support/test_validator.rb')
10
+ require 'yaml'
11
+
12
+ describe CLIUtils::Pref do
13
+ let(:base_path) { File.join(File.dirname(__FILE__), '..', 'support') }
14
+ let(:pref_data) {
15
+ {
16
+ behaviors: [{ name: "#{ File.join(base_path, 'test_behavior.rb') }" }],
17
+ config_key: 'test_prompt',
18
+ config_section: 'app_data',
19
+ default: 'bachya',
20
+ options: ['bachya'],
21
+ pre: {
22
+ message: 'Test pre message',
23
+ action: "#{ File.join(base_path, 'test_action.rb') }",
24
+ parameters: {
25
+ param1: 'value1'
26
+ }
27
+ },
28
+ post: {
29
+ message: 'Test post message',
30
+ action: "#{ File.join(base_path, 'test_action.rb') }"
31
+ },
32
+ prereqs: [
33
+ { config_section: 'section' },
34
+ { config_value: 'value' }
35
+ ],
36
+ prompt_text: 'Test',
37
+ validators: ["#{ File.join(base_path, 'test_validator.rb') }"],
38
+ }
39
+ }
40
+
41
+ let(:pref_data2) {
42
+ {
43
+ behaviors: [{ name: 'test' }],
44
+ config_key: 'test_prompt',
45
+ config_section: 'app_data',
46
+ default: 'bachya',
47
+ options: ['bachya'],
48
+ pre: {
49
+ message: 'Test pre message',
50
+ action: 'test',
51
+ parameters: {
52
+ param1: 'value1'
53
+ }
54
+ },
55
+ post: {
56
+ message: 'Test post message',
57
+ action: 'test'
58
+ },
59
+ prereqs: [
60
+ { config_section: 'section' },
61
+ { config_value: 'value' }
62
+ ],
63
+ prompt_text: 'Test',
64
+ validators: ['test'],
65
+ }
66
+ }
67
+
68
+ let(:pref_data3) {
69
+ {
70
+ behaviors: [{ name: 'capitalize' }],
71
+ config_key: 'test_prompt',
72
+ config_section: 'app_data',
73
+ prompt_text: 'Test',
74
+ validators: ['non_nil'],
75
+ }
76
+ }
77
+
78
+ let(:pref_data4) {
79
+ {
80
+ config_key: 'test_prompt',
81
+ config_section: 'app_data',
82
+ prompt_text: 'Test',
83
+ validators: ['non_nilz'],
84
+ }
85
+ }
86
+
87
+ it 'instantiates via a hash' do
88
+ pref = CLIUtils::Pref.new(pref_data)
89
+ expect(pref.answer).to eq(nil)
90
+ expect(pref.behavior_objects[0].class).to eq(CLIUtils::TestBehavior)
91
+ expect(pref.behaviors).to eq([{ name: "#{ File.join(base_path, 'test_behavior.rb') }" }])
92
+ expect(pref.config_key).to eq(pref_data[:config_key])
93
+ expect(pref.config_section).to eq(pref_data[:config_section])
94
+ expect(pref.default).to eq(pref_data[:default])
95
+ expect(pref.last_error_message).to eq(nil)
96
+ expect(pref.options).to eq(['bachya'])
97
+ expect(pref.post).to eq({ message: 'Test post message', action: "#{ File.join(base_path, 'test_action.rb') }" })
98
+ expect(pref.pre).to eq({message: 'Test pre message', action: "#{ File.join(base_path, 'test_action.rb') }", parameters: { param1: 'value1' } })
99
+ expect(pref.prereqs).to eq([{ config_section: 'section' }, { config_value: 'value' }])
100
+ expect(pref.validator_objects[0].class).to eq(CLIUtils::TestValidator)
101
+ expect(pref.validators).to eq([File.join(base_path, 'test_validator.rb')])
102
+ end
103
+
104
+ it 'runs pre-registered assets' do
105
+ Readline.stub(:readline).and_return('', 'bachya', '')
106
+ CLIUtils::Prefs.register_action(File.join(base_path, 'test_action.rb'))
107
+ CLIUtils::Prefs.register_behavior(File.join(base_path, 'test_behavior.rb'))
108
+ CLIUtils::Prefs.register_validator(File.join(base_path, 'test_validator.rb'))
109
+
110
+ p = CLIUtils::Pref.new(pref_data2)
111
+ out = capture_stdout { p.deliver }
112
+ expect(out).to eq("\e[34m# Test pre message\e[0m\nhere\n\e[34m# Test post message\e[0m\nhere\n")
113
+ end
114
+
115
+ it 'runs built-in assets' do
116
+ Readline.stub(:readline).and_return('', 'bachya')
117
+ p = CLIUtils::Pref.new(pref_data3)
118
+ out = capture_stdout { p.deliver }
119
+ expect(out).to eq("\e[31m# Nil text not allowed\e[0m\n")
120
+ end
121
+
122
+ it 'returns an error when a validator fails' do
123
+ Readline.stub(:readline).and_return('', 'bachyazzz', 'bachya', '')
124
+ p = CLIUtils::Pref.new(pref_data)
125
+ out = capture_stdout { p.deliver }
126
+
127
+ m = "\e[34m# Test pre message\e[0m\nhere\n\e[31m# Invalid option chosen " \
128
+ "(\"bachyazzz\"); valid options are: [\"bachya\"]\e[0m\n\e[34m# Test post " \
129
+ "message\e[0m\nhere\n"
130
+ expect(out).to eq(m)
131
+ end
132
+
133
+ it 'raises an exception when given an unknown asset' do
134
+ m = "\e[33m# Skipping undefined Pref Validator: non_nilz\e[0m\n"
135
+ out = capture_stdout { p = CLIUtils::Pref.new(pref_data4) }
136
+ expect(out).to eq("\e[33m# Skipping undefined Pref Validator: non_nilz\e[0m\n")
137
+ end
138
+
139
+ it 'compares equality to other Pref instances' do
140
+ p1 = CLIUtils::Pref.new(pref_data)
141
+ p2 = CLIUtils::Pref.new(pref_data)
142
+ expect(p1).to eq(p2)
143
+ end
144
+ end
@@ -0,0 +1,150 @@
1
+ require_relative 'spec_helper'
2
+ require 'cliutils/messaging'
3
+ require 'cliutils/prefs'
4
+ require 'cliutils/prefs/pref'
5
+
6
+ describe CLIUtils::Pref do
7
+ let(:base_filepath) { File.join(File.dirname(__FILE__), '..', 'support') }
8
+ let(:prefs_filepath) { File.join(base_filepath, 'prefstest.yaml') }
9
+
10
+ let(:hash_data) {
11
+ {
12
+ prompts: [
13
+ {
14
+ prompt_text: 'What is your name?',
15
+ default: 'Bob Cobb',
16
+ config_key: :name,
17
+ config_section: :personal_info
18
+ },
19
+ {
20
+ prompt_text: 'What is your age?',
21
+ default: '45',
22
+ config_key: :age,
23
+ config_section: :personal_info
24
+ },
25
+ {
26
+ prompt_text: 'Batman or Superman?',
27
+ default: 'Batman',
28
+ config_key: :superhero,
29
+ config_section: :personal_info
30
+ }
31
+ ]
32
+ }
33
+ }
34
+
35
+ let(:array_data) {
36
+ [
37
+ {
38
+ prompt_text: 'What is your name?',
39
+ default: 'Bob Cobb',
40
+ config_key: :name,
41
+ config_section: :personal_info
42
+ },
43
+ {
44
+ prompt_text: 'What is your age?',
45
+ default: '45',
46
+ config_key: :age,
47
+ config_section: :personal_info,
48
+ prereqs: {
49
+ config_key: :name,
50
+ config_value: 'Bob Cobb'
51
+ }
52
+ },
53
+ {
54
+ prompt_text: 'Batman or Superman?',
55
+ default: 'Batman',
56
+ config_key: :superhero,
57
+ config_section: :personal_info
58
+ }
59
+ ]
60
+ }
61
+
62
+ it 'loads prefs from a YAML file' do
63
+ prefs = CLIUtils::Prefs.new(prefs_filepath)
64
+ expect(prefs.prompts.count).to eq(4)
65
+ expect(prefs.prompts[2].prompt_text).to eq('Why do you prefer Superman?!')
66
+ expect(prefs.prompts[2].config_key).to eq('superman_answer')
67
+ expect(prefs.prompts[2].config_section).to eq('personal_info')
68
+ end
69
+
70
+ it 'raises an exception when attempting to load a nonexistant YAML file' do
71
+ m = 'Invalid configuration file: bachya'
72
+ expect { p = CLIUtils::Prefs.new('bachya') }.to raise_error(RuntimeError, m)
73
+ end
74
+
75
+ it 'loads prefs from a Hash' do
76
+ prefs = CLIUtils::Prefs.new(hash_data)
77
+ expect(prefs.prompts.count).to eq(3)
78
+ expect(prefs.prompts[1].prompt_text).to eq('What is your age?')
79
+ expect(prefs.prompts[1].config_key).to eq(:age)
80
+ expect(prefs.prompts[1].config_section).to eq(:personal_info)
81
+ end
82
+
83
+ it 'loads prefs from an Array' do
84
+ prefs = CLIUtils::Prefs.new(array_data)
85
+ expect(prefs.prompts.count).to eq(3)
86
+ expect(prefs.prompts[1].prompt_text).to eq('What is your age?')
87
+ expect(prefs.prompts[1].config_key).to eq(:age)
88
+ expect(prefs.prompts[1].config_section).to eq(:personal_info)
89
+ end
90
+
91
+ it 'raises an exception when given bad Prefs data' do
92
+ m = 'Invalid configuration data'
93
+ expect { p = CLIUtils::Prefs.new(:bachya) }.to raise_error(RuntimeError, m)
94
+ end
95
+
96
+ it 'delivers prompts for the user to answer' do
97
+ Readline.stub(:readline).and_return('')
98
+ prefs = CLIUtils::Prefs.new(prefs_filepath)
99
+ prefs.ask
100
+
101
+ expect(prefs.prompts[0].answer).to eq('Batman')
102
+ expect(prefs.prompts[1].answer).to eq('Y')
103
+ expect(prefs.prompts[2].answer).to eq(nil)
104
+ expect(prefs.prompts[3].answer).to eq(nil)
105
+ end
106
+
107
+ it 'uses Configurator values as part of its prompts' do
108
+ c = CLIUtils::Configurator.new('/tmp/file1.txt')
109
+ c.add_section(:personal_info)
110
+ c.personal_info['superhero'] = 'Superman'
111
+
112
+ Readline.stub(:readline).and_return('')
113
+ prefs = CLIUtils::Prefs.new(prefs_filepath, c)
114
+ prefs.ask
115
+
116
+ expect(prefs.prompts[0].answer).to eq('Batman')
117
+ expect(prefs.prompts[1].answer).to eq('Y')
118
+ expect(prefs.prompts[2].answer).to eq(nil)
119
+ expect(prefs.prompts[3].answer).to eq(nil)
120
+ end
121
+
122
+ it 'pre-registers and de-registers Actions' do
123
+ CLIUtils::Prefs.register_action(File.join(base_filepath, 'test_action.rb'))
124
+ expect(CLIUtils::Prefs.registered_actions.count).to eq(1)
125
+
126
+ CLIUtils::Prefs.deregister_action(:Test)
127
+ expect(CLIUtils::Prefs.registered_actions.count).to eq(0)
128
+ end
129
+
130
+ it 'pre-registers and de-registers Behaviors' do
131
+ CLIUtils::Prefs.register_behavior(File.join(base_filepath, 'test_behavior.rb'))
132
+ expect(CLIUtils::Prefs.registered_behaviors.count).to eq(1)
133
+
134
+ CLIUtils::Prefs.deregister_behavior(:Test)
135
+ expect(CLIUtils::Prefs.registered_behaviors.count).to eq(0)
136
+ end
137
+
138
+ it 'pre-registers and de-registers Validators' do
139
+ CLIUtils::Prefs.register_validator(File.join(base_filepath, 'test_validator.rb'))
140
+ expect(CLIUtils::Prefs.registered_validators.count).to eq(1)
141
+
142
+ CLIUtils::Prefs.deregister_validator(:Test)
143
+ expect(CLIUtils::Prefs.registered_validators.count).to eq(0)
144
+ end
145
+
146
+ it 'raises an exception when registering a bad Action/Behavior/Validator' do
147
+ m = 'Registration failed because of unknown filepath: bachya'
148
+ expect { CLIUtils::Prefs.register_validator('bachya') }.to raise_error(RuntimeError, m)
149
+ end
150
+ end
@@ -0,0 +1,16 @@
1
+ require 'coveralls'
2
+ require 'rspec'
3
+ # require 'simplecov'
4
+ require 'stringio'
5
+
6
+ # SimpleCov.start
7
+ Coveralls.wear!
8
+
9
+ def capture_stdout
10
+ old = $stdout
11
+ $stdout = fake = StringIO.new
12
+ yield
13
+ fake.string
14
+ ensure
15
+ $stdout = old
16
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../spec_helper'
2
+ require 'cliutils/messaging'
3
+ require 'cliutils/prefs/pref_validators/pref_validator'
4
+ require 'cliutils/prefs/pref_validators/alphabetic_validator'
5
+
6
+ describe CLIUtils::AlphabeticValidator do
7
+ it 'confirms that its input is alphabetic' do
8
+ v = CLIUtils::AlphabeticValidator.new
9
+ v.validate('bachya')
10
+ expect(v.is_valid).to be_true
11
+ expect(v.message).to eq('Response is not alphabetic: bachya')
12
+ end
13
+
14
+ it 'confirms that its input is not alphabetic' do
15
+ v = CLIUtils::AlphabeticValidator.new
16
+ v.validate('12345')
17
+ expect(v.is_valid).to_not be_true
18
+ expect(v.message).to eq('Response is not alphabetic: 12345')
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ require_relative '../spec_helper'
2
+ require 'cliutils/messaging'
3
+ require 'cliutils/prefs/pref_validators/pref_validator'
4
+ require 'cliutils/prefs/pref_validators/alphanumeric_validator'
5
+
6
+ describe CLIUtils::AlphanumericValidator do
7
+ it 'confirms that its input is alphanumeric' do
8
+ v = CLIUtils::AlphanumericValidator.new
9
+ v.validate('bachya91238 ')
10
+ expect(v.is_valid).to be_true
11
+ expect(v.message).to eq('Response is not alphanumeric: bachya91238 ')
12
+ end
13
+
14
+ it 'confirms that its input is not alphanumeric' do
15
+ v = CLIUtils::AlphanumericValidator.new
16
+ v.validate('!@&^')
17
+ expect(v.is_valid).to_not be_true
18
+ expect(v.message).to eq('Response is not alphanumeric: !@&^')
19
+ end
20
+ end