opt_parse_validator 0.0.14.1 → 0.0.15.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.
- checksums.yaml +4 -4
- data/README.md +16 -13
- data/lib/opt_parse_validator/opts/alias.rb +26 -0
- data/lib/opt_parse_validator/opts/base.rb +5 -0
- data/lib/opt_parse_validator/opts/credentials.rb +2 -3
- data/lib/opt_parse_validator/opts/uri.rb +1 -3
- data/lib/opt_parse_validator/opts.rb +1 -1
- data/lib/opt_parse_validator/version.rb +1 -1
- data/lib/opt_parse_validator.rb +51 -43
- data/opt_parse_validator.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4781af5c07e14acc18ea3aeb507e30a695fb76f1
|
|
4
|
+
data.tar.gz: d30c05cf7536638a26646750bbf1ec35e8add56a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: cb916606bb5d3eee896ca9adfa54cfcaa7d77710c5d4a0a7defb2602a89b5b8ba2d20f09b386084193a77f2b22858edb8db7789f594b0e4ad8e182447b57f36d
|
|
7
|
+
data.tar.gz: '094c7bb730917e6a488490380417a5e4d3e92681c132116956150724020247c6afdbb8f44dc5ea7268c2e3922c89c4ab9df3c50a4aae653dd5121830418a884e'
|
data/README.md
CHANGED
|
@@ -4,7 +4,7 @@ OptParseValidator
|
|
|
4
4
|
[](https://badge.fury.io/rb/opt_parse_validator)
|
|
5
5
|
[](https://travis-ci.org/wpscanteam/OptParseValidator)
|
|
6
6
|
[](https://coveralls.io/r/wpscanteam/OptParseValidator?branch=master)
|
|
7
|
-
[](https://codeclimate.com/github/wpscanteam/OptParseValidator/maintainability)
|
|
8
8
|
[](https://gemnasium.com/wpscanteam/OptParseValidator)
|
|
9
9
|
|
|
10
10
|
|
|
@@ -19,18 +19,17 @@ OptParseValidator
|
|
|
19
19
|
|
|
20
20
|
require 'opt_parse_validator'
|
|
21
21
|
|
|
22
|
-
# For contructor options, such as setting a banner, the summary width and indent,
|
|
23
|
-
# see http://ruby-doc.org/stdlib-2.4.2/libdoc/optparse/rdoc/OptionParser.html#method-c-new
|
|
24
|
-
parser = OptParseValidator::OptParser.new
|
|
25
|
-
|
|
26
|
-
parser.add(
|
|
27
|
-
OptParseValidator::OptString.new(['-m', '--mandatory PARAM', 'A Mandatory CLI option'], required: true),
|
|
28
|
-
OptParseValidator::OptBoolean.new(['--test', '-t', 'Option Helper Message']),
|
|
29
|
-
OptParseValidator::OptFilePath.new(['-o', '--output FILE', 'Output to FILE'], writable: true, exists: false)
|
|
30
|
-
)
|
|
31
|
-
|
|
32
22
|
begin
|
|
33
|
-
|
|
23
|
+
# For constructor options, such as setting a banner, the summary width and indent,
|
|
24
|
+
# see http://ruby-doc.org/stdlib-2.4.2/libdoc/optparse/rdoc/OptionParser.html#method-c-new
|
|
25
|
+
parsed_cli_options = OptParseValidator::OptParser.new.add(
|
|
26
|
+
OptParseValidator::OptString.new(['-m', '--mandatory PARAM', 'A Mandatory CLI option'], required: true),
|
|
27
|
+
OptParseValidator::OptBoolean.new(['--test', '-t', 'Option Helper Message']),
|
|
28
|
+
OptParseValidator::OptFilePath.new(['-o', '--output FILE', 'Output to FILE'], writable: true, exists: false),
|
|
29
|
+
OptParseValidator::OptAlias.new(['--alias', '-a'], alias_for: '--test -o file.txt')
|
|
30
|
+
).results
|
|
31
|
+
|
|
32
|
+
p parsed_cli_options
|
|
34
33
|
rescue OptParseValidator::Error => e
|
|
35
34
|
puts 'Parsing Error: ' + e.message
|
|
36
35
|
end
|
|
@@ -41,11 +40,13 @@ Then have a play with
|
|
|
41
40
|
```ruby test.rb -m hh -t```
|
|
42
41
|
```ruby test.rb -t```
|
|
43
42
|
|
|
43
|
+
It is worth to note that when aliases are used, it is recommended to provide them first in the CLI. Otherwise, they might override user-suplied cli options. For example, using the options above, ```ruby test.rb -m aa -o override.txt --alias``` won't have the desired effect (to have --output as override.txt), but ```ruby test.rb --alias -m aa -o override.txt``` will.
|
|
44
|
+
|
|
44
45
|
For more option examples, see
|
|
45
46
|
- https://github.com/wpscanteam/CMSScanner/blob/master/app/controllers/core/cli_options.rb
|
|
46
47
|
- https://github.com/wpscanteam/wpscan-v3/blob/master/app/controllers/enumeration/cli_options.rb
|
|
47
48
|
|
|
48
|
-
Please
|
|
49
|
+
Please feel free to send Pull Requests to improve this Readme
|
|
49
50
|
|
|
50
51
|
### Global Attributes
|
|
51
52
|
|
|
@@ -56,6 +57,8 @@ Some attributes are available for all Validators:
|
|
|
56
57
|
- :value_if_empty (Value to use if no argument has been supplied for the related option)
|
|
57
58
|
|
|
58
59
|
### Available Validators & Associated Attributes:
|
|
60
|
+
- Alias:
|
|
61
|
+
- :alias_for (mandatory)
|
|
59
62
|
- Array
|
|
60
63
|
- :separator (default: ',')
|
|
61
64
|
- Boolean
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module OptParseValidator
|
|
2
|
+
# Implementation of the Alias Option
|
|
3
|
+
class OptAlias < OptBase
|
|
4
|
+
def initialize(option, attrs = {})
|
|
5
|
+
raise Error, 'The :alias_for attribute is required' unless attrs.key?(:alias_for)
|
|
6
|
+
|
|
7
|
+
super(option, attrs)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def append_help_messages
|
|
11
|
+
super
|
|
12
|
+
|
|
13
|
+
option << "Alias for #{alias_for}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [ String ]
|
|
17
|
+
def alias_for
|
|
18
|
+
@alias_for ||= attrs[:alias_for]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @return [ Boolean ]
|
|
22
|
+
def alias?
|
|
23
|
+
true
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -3,9 +3,8 @@ module OptParseValidator
|
|
|
3
3
|
class OptCredentials < OptBase
|
|
4
4
|
# @return [ Hash ] A hash containing the :username and :password
|
|
5
5
|
def validate(value)
|
|
6
|
-
unless value.index(':')
|
|
7
|
-
|
|
8
|
-
end
|
|
6
|
+
raise Error, 'Incorrect credentials format, username:password expected' unless value.index(':')
|
|
7
|
+
|
|
9
8
|
creds = value.split(':', 2)
|
|
10
9
|
|
|
11
10
|
{ username: creds[0], password: creds[1] }
|
|
@@ -25,9 +25,7 @@ module OptParseValidator
|
|
|
25
25
|
def validate(value)
|
|
26
26
|
uri = Addressable::URI.parse(value)
|
|
27
27
|
|
|
28
|
-
if !uri.scheme && default_protocol
|
|
29
|
-
uri = Addressable::URI.parse("#{default_protocol}://#{value}")
|
|
30
|
-
end
|
|
28
|
+
uri = Addressable::URI.parse("#{default_protocol}://#{value}") if !uri.scheme && default_protocol
|
|
31
29
|
|
|
32
30
|
unless allowed_protocols.empty? || allowed_protocols.include?(uri.scheme)
|
|
33
31
|
# For future refs: will have to check if the uri.scheme exists,
|
data/lib/opt_parse_validator.rb
CHANGED
|
@@ -25,46 +25,30 @@ module OptParseValidator
|
|
|
25
25
|
super(banner, width, indent)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
# @
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
def add(*options)
|
|
32
|
-
options.each { |option| add_option(option) }
|
|
28
|
+
# @return [ OptParseValidator::OptionsFiles ]
|
|
29
|
+
def options_files
|
|
30
|
+
@options_files ||= OptionsFiles.new
|
|
33
31
|
end
|
|
34
32
|
|
|
35
|
-
# @param [ OptBase ]
|
|
33
|
+
# @param [ Array<OptBase> ] options
|
|
36
34
|
#
|
|
37
|
-
# @return [
|
|
38
|
-
def
|
|
39
|
-
|
|
35
|
+
# @return [ Self ] For chaining #new.add.results
|
|
36
|
+
def add(*options)
|
|
37
|
+
options.each do |option|
|
|
38
|
+
check_option(option)
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
# Set the default option value if it exists
|
|
44
|
-
# The default value is not validated as provided by devs
|
|
45
|
-
# and should be set to the correct format/value directly
|
|
46
|
-
@results[opt.to_sym] = opt.default unless opt.default.nil?
|
|
40
|
+
@opts << option
|
|
41
|
+
@symbols_used << option.to_sym
|
|
47
42
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
# e.g --proxy Invalid Scheme format.
|
|
55
|
-
raise e.is_a?(Error) ? e.class : Error, "#{opt.to_long} #{e}"
|
|
56
|
-
end
|
|
43
|
+
# Set the default option value if it exists
|
|
44
|
+
# The default value is not validated as it is provided by devs
|
|
45
|
+
# and should be set to the correct format/value directly
|
|
46
|
+
@results[option.to_sym] = option.default unless option.default.nil?
|
|
47
|
+
|
|
48
|
+
register_callback(option)
|
|
57
49
|
end
|
|
58
|
-
end
|
|
59
50
|
|
|
60
|
-
|
|
61
|
-
#
|
|
62
|
-
# @param [ OptBase ] opt
|
|
63
|
-
#
|
|
64
|
-
# @return [ void ]
|
|
65
|
-
def check_option(opt)
|
|
66
|
-
raise Error, "The option is not an OptBase, #{opt.class} supplied" unless opt.is_a?(OptBase)
|
|
67
|
-
raise Error, "The option #{opt.to_sym} is already used !" if @symbols_used.include?(opt.to_sym)
|
|
51
|
+
self
|
|
68
52
|
end
|
|
69
53
|
|
|
70
54
|
# @return [ Hash ]
|
|
@@ -79,6 +63,38 @@ module OptParseValidator
|
|
|
79
63
|
raise e.is_a?(Error) ? e.class : Error, e.message
|
|
80
64
|
end
|
|
81
65
|
|
|
66
|
+
protected
|
|
67
|
+
|
|
68
|
+
# Ensures the opt given is valid
|
|
69
|
+
#
|
|
70
|
+
# @param [ OptBase ] opt
|
|
71
|
+
#
|
|
72
|
+
# @return [ void ]
|
|
73
|
+
def check_option(opt)
|
|
74
|
+
raise Error, "The option is not an OptBase, #{opt.class} supplied" unless opt.is_a?(OptBase)
|
|
75
|
+
raise Error, "The option #{opt.to_sym} is already used !" if @symbols_used.include?(opt.to_sym)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# @param [ OptBase ] opt
|
|
79
|
+
#
|
|
80
|
+
# @return [ void ]
|
|
81
|
+
def register_callback(opt)
|
|
82
|
+
on(*opt.option) do |arg|
|
|
83
|
+
begin
|
|
84
|
+
if opt.alias?
|
|
85
|
+
parse!(opt.alias_for.split(' '))
|
|
86
|
+
else
|
|
87
|
+
@results[opt.to_sym] = opt.normalize(opt.validate(arg))
|
|
88
|
+
end
|
|
89
|
+
rescue StandardError => e
|
|
90
|
+
# Adds the long option name to the message
|
|
91
|
+
# And raises it as an OptParseValidator::Error if not already one
|
|
92
|
+
# e.g --proxy Invalid Scheme format.
|
|
93
|
+
raise e.is_a?(Error) ? e.class : Error, "#{opt.to_long} #{e}"
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
82
98
|
# @return [ Void ]
|
|
83
99
|
def load_options_files
|
|
84
100
|
files_data = options_files.parse
|
|
@@ -90,23 +106,15 @@ module OptParseValidator
|
|
|
90
106
|
end
|
|
91
107
|
end
|
|
92
108
|
|
|
93
|
-
# @return [ OptParseValidator::OptionsFiles ]
|
|
94
|
-
def options_files
|
|
95
|
-
@options_files ||= OptionsFiles.new
|
|
96
|
-
end
|
|
97
|
-
|
|
98
109
|
# Ensure that all required options are supplied
|
|
99
110
|
# Should be overriden to modify the behavior
|
|
100
111
|
#
|
|
101
112
|
# @return [ Void ]
|
|
102
113
|
def post_processing
|
|
103
114
|
@opts.each do |opt|
|
|
104
|
-
if opt.required?
|
|
105
|
-
raise NoRequiredOption, "The option #{opt} is required" unless @results.key?(opt.to_sym)
|
|
106
|
-
end
|
|
115
|
+
raise NoRequiredOption, "The option #{opt} is required" if opt.required? && !@results.key?(opt.to_sym)
|
|
107
116
|
|
|
108
|
-
next if opt.required_unless.empty?
|
|
109
|
-
next if @results.key?(opt.to_sym)
|
|
117
|
+
next if opt.required_unless.empty? || @results.key?(opt.to_sym)
|
|
110
118
|
|
|
111
119
|
fail_msg = "One of the following options is required: #{opt}, #{opt.required_unless.join(', ')}"
|
|
112
120
|
|
data/opt_parse_validator.gemspec
CHANGED
|
@@ -41,6 +41,6 @@ Gem::Specification.new do |s|
|
|
|
41
41
|
s.add_development_dependency 'rake', '~> 12.0'
|
|
42
42
|
s.add_development_dependency 'rspec', '~> 3.7.0'
|
|
43
43
|
s.add_development_dependency 'rspec-its', '~> 1.2.0'
|
|
44
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
|
44
|
+
s.add_development_dependency 'rubocop', '~> 0.52.0'
|
|
45
45
|
s.add_development_dependency 'simplecov', '~> 0.14.0' # Can't update to 0.15 as it breaks coveralls dep
|
|
46
46
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: opt_parse_validator
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.15.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- WPScanTeam
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2018-01-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -114,14 +114,14 @@ dependencies:
|
|
|
114
114
|
requirements:
|
|
115
115
|
- - "~>"
|
|
116
116
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: 0.
|
|
117
|
+
version: 0.52.0
|
|
118
118
|
type: :development
|
|
119
119
|
prerelease: false
|
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
121
|
requirements:
|
|
122
122
|
- - "~>"
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 0.
|
|
124
|
+
version: 0.52.0
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
|
126
126
|
name: simplecov
|
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -155,6 +155,7 @@ files:
|
|
|
155
155
|
- lib/opt_parse_validator/options_file/yml.rb
|
|
156
156
|
- lib/opt_parse_validator/options_files.rb
|
|
157
157
|
- lib/opt_parse_validator/opts.rb
|
|
158
|
+
- lib/opt_parse_validator/opts/alias.rb
|
|
158
159
|
- lib/opt_parse_validator/opts/array.rb
|
|
159
160
|
- lib/opt_parse_validator/opts/base.rb
|
|
160
161
|
- lib/opt_parse_validator/opts/boolean.rb
|