opt_parse_validator 0.0.14.1 → 0.0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/opt_parse_validator.svg)](https://badge.fury.io/rb/opt_parse_validator)
|
5
5
|
[![Build Status](https://img.shields.io/travis/wpscanteam/OptParseValidator.svg)](https://travis-ci.org/wpscanteam/OptParseValidator)
|
6
6
|
[![Coverage Status](https://img.shields.io/coveralls/wpscanteam/OptParseValidator.svg)](https://coveralls.io/r/wpscanteam/OptParseValidator?branch=master)
|
7
|
-
[![Code Climate](https://
|
7
|
+
[![Code Climate](https://api.codeclimate.com/v1/badges/56f0307bbbda6d41b99a/maintainability)](https://codeclimate.com/github/wpscanteam/OptParseValidator/maintainability)
|
8
8
|
[![Dependency Status](https://img.shields.io/gemnasium/wpscanteam/OptParseValidator.svg)](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
|