help_parser 1.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9580ecb3144e3be88b6961efc2e1edae53964c01
4
+ data.tar.gz: 8924fbd437d234ab59ce1f1bc319be6f9287b93d
5
+ SHA512:
6
+ metadata.gz: d4f0bc72cefd932f76302436d2f898267169a7fc847af683d225333d8d2a7423e9919266b69e03e3168604b6683c4ee1fedbd930d90c837b914f6a601203dac3
7
+ data.tar.gz: e0af58d61f6825f2e72615a3fafc352a3f8b7296b5cfa0f559e3ed5092eaaf8ac9fc2b9306146e292200e9fd77281d2dd0e6595f2d582635b23e9a3f3064e75b
data/History.txt ADDED
@@ -0,0 +1 @@
1
+ === 0.0.0 / 2013-12-04
data/Manifest.txt ADDED
@@ -0,0 +1,23 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.rdoc
4
+ Rakefile
5
+ TODO.txt
6
+ examples/command_suite
7
+ examples/implementation_error_duplicate_key
8
+ examples/implementation_error_redefinition
9
+ examples/implementation_error_terminal
10
+ examples/simple
11
+ features/edge.feature
12
+ features/simple.feature
13
+ features/step_definitions/help_parser_steps.rb
14
+ features/suite.feature
15
+ help_parser.gemspec
16
+ lib/help_parser.rb
17
+ lib/help_parser/help_parser.rb
18
+ lib/help_parser/version.rb
19
+ tasks/gemspecker.rb
20
+ tasks/manifester.rb
21
+ tasks/syntaxer.rb
22
+ tasks/unit_tests.rb
23
+ test/help_parser.rb
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ = HelpParser
2
+
3
+ github :: https://www.github.com/carlosjhr64/help_parser
4
+ rubygems :: https://rubygems.org/gems/help_parser
5
+
6
+ == DESCRIPTION:
7
+
8
+ _HelpParser_ - Parses your help text to define your command line options.
9
+
10
+ == FEATURES/PROBLEMS:
11
+
12
+ * long to short option mapping
13
+ * --no-lopt sets lopt to false
14
+
15
+ == SYNOPSIS:
16
+
17
+ require 'help_parser'
18
+ include HELP_PARSER
19
+ HELP = <<HELP
20
+ Usage:
21
+ mycmdapp [options] command
22
+ Options:
23
+ -h --help Show this help and exit
24
+ -v --version Show the version and exit
25
+ -q --quiet Be quiet
26
+ -V --verbose Say more about whats going on
27
+ HELP
28
+ begin
29
+ OPTIONS = HelpParser.new('1.0.0', HELP)
30
+ puts "Tracing..." unless OPTIONS[:quiet]
31
+ puts "More tracing..." if OPTIONS[:V] # verbose
32
+ # mycmdapp code continues...
33
+ # ...
34
+ rescue UsageException
35
+ puts $!.message # User just wants help or version
36
+ exit 0 # Not an error
37
+ rescue UsageError
38
+ STDERR.puts '*** '+$!.message+' ***'
39
+ STDERR.puts $!.obj.help
40
+ exit 64 # Usage error exit code
41
+ end
42
+
43
+ See `examples/command_suite` for an example of how to build a command suite with _HelpParser_.
44
+
45
+ == INSTALL:
46
+
47
+ $ sudo gem install help_parser
48
+
49
+ == LICENSE:
50
+
51
+ (The MIT License)
52
+
53
+ Copyright (c) 2013 CarlosJHR64
54
+
55
+ Permission is hereby granted, free of charge, to any person obtaining
56
+ a copy of this software and associated documentation files (the
57
+ 'Software'), to deal in the Software without restriction, including
58
+ without limitation the rights to use, copy, modify, merge, publish,
59
+ distribute, sublicense, and/or sell copies of the Software, and to
60
+ permit persons to whom the Software is furnished to do so, subject to
61
+ the following conditions:
62
+
63
+ The above copyright notice and this permission notice shall be
64
+ included in all copies or substantial portions of the Software.
65
+
66
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
67
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
68
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
69
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
70
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
71
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
72
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,94 @@
1
+ require 'find'
2
+
3
+ module RakingTasks
4
+ def RakingTasks.git_tag_list
5
+ `git tag --list`.strip.split("\n")
6
+ end
7
+
8
+ def RakingTasks.git_status_porcelain
9
+ `git status --porcelain`.strip
10
+ end
11
+
12
+ def RakingTasks.gemspec_files
13
+ `ls ./*.gemspec 2> /dev/null`.strip.split("\n")
14
+ end
15
+
16
+ def RakingTasks.uniq_gemspec_file
17
+ gemspecs = RakingTasks.gemspec_files
18
+ raise "Gemspec file not found" if gemspecs.length == 0
19
+ raise "Mutiple gemspec files found" if gemspecs.length > 1
20
+ gemspecs.first
21
+ end
22
+
23
+ def RakingTasks.pkg_gem_files
24
+ `ls ./pkg/*.gem 2> /dev/null`.strip.split("\n")
25
+ end
26
+
27
+ def RakingTasks.gem_files
28
+ `ls ./*.gem 2> /dev/null`.strip.split("\n")
29
+ end
30
+
31
+ def RakingTasks.uniq_gem_file
32
+ gems = RakingTasks.gem_files
33
+ raise "Gem file not found" if gems.length == 0
34
+ raise "Multiple gem files found" if gems.length > 1
35
+ gems.first
36
+ end
37
+
38
+ def RakingTasks.gem_build
39
+ raise "Git status not clear" unless RakingTasks.git_status_porcelain.length == 0
40
+ gems = RakingTasks.gem_files
41
+ raise "Found gem files: #{gems.join(',')}" unless gems.length == 0
42
+ gemspec = RakingTasks.uniq_gemspec_file
43
+ system("gem build #{gemspec}")
44
+ end
45
+
46
+ def RakingTasks.load_existing_tasks
47
+ if Dir.exist?('./tasks')
48
+ Find.find('./tasks') do |fn|
49
+ require fn if fn=~/\.rb/
50
+ end
51
+ end
52
+ end
53
+ end
54
+ RakingTasks.load_existing_tasks
55
+
56
+ desc 'By default, run git status'
57
+ task :default do
58
+ system('git status')
59
+ end
60
+
61
+ desc 'Cucumbers tests'
62
+ task :cucumber do
63
+ system('cucumber -f progress')
64
+ end
65
+
66
+ desc 'Runs all tests'
67
+ task :'test-all' => [:syntaxer, :'unit-tests', :cucumber]
68
+
69
+ desc 'Builds pre-release gem for testing, not published.'
70
+ task :gem_build do
71
+ RakingTasks.gem_build
72
+ end
73
+
74
+ desc 'pushes to rubygems and git'
75
+ task :publish, :version do |t, args|
76
+ version = args[:version]
77
+ tags = RakingTasks.git_tag_list
78
+ raise "#{version} in git tag list" if tags.include?(version)
79
+ RakingTasks.gem_build
80
+ gem = File.basename RakingTasks.uniq_gem_file
81
+ raise "#{version} did not match gem file" unless gem.include?(version)
82
+ pkgem = File.join('pkg', gem)
83
+ raise "pkg/#{gem} exists!?" if File.exist? pkgem
84
+ if system("gem push #{gem}")
85
+ File.rename(gem, pkgem)
86
+ File.open('./History.txt', 'a'){|fh| fh.puts "=== #{version} / #{Time.now}"}
87
+ File.open('./History.txt', 'a'){|fh| fh.puts `md5sum #{pkgem}`}
88
+ system("git commit -m '#{version}' ./History.txt")
89
+ system("git tag '#{version}'")
90
+ system('git push')
91
+ else
92
+ File.unlink(gem)
93
+ end
94
+ end
data/TODO.txt ADDED
File without changes
@@ -0,0 +1,130 @@
1
+ #!/usr/bin/env ruby
2
+ require 'json'
3
+ require 'rainbow'
4
+
5
+ ############################################################
6
+ # Here I show how one might structure a command suite
7
+ # using HelpParser. The output is for cucumber testing.
8
+ ############################################################
9
+
10
+ VERSION = '10.02.3'
11
+ NAME = File.basename($PROGRAM_NAME) # command_suite
12
+ GLOBAL_HELP = <<GLOBAL_HELP
13
+ This is a test script for HelpParser.
14
+
15
+ Usage:
16
+
17
+ #{NAME} [global options] command [command options] [arguments...]
18
+
19
+ Global Options:
20
+
21
+ -h --help Show this help and exit
22
+ -v --version Show the version and exit
23
+ -q --quiet Be quiet
24
+ -V --verbose Say more about whats going on
25
+
26
+ --string=STRING A String value
27
+ --float=FLOAT A Float value
28
+ --integer=INTEGER An Integer value
29
+ --array=val1,val2... An Array of values
30
+
31
+ Commands:
32
+
33
+ first The first command
34
+ second The second command
35
+
36
+ This script is being runned by Ruby #{RUBY_VERSION}.
37
+ GLOBAL_HELP
38
+
39
+ FIRST_HELP = <<FIRST
40
+ #{NAME}-first is the first command of the test script for HelpParser.
41
+ Usage: #{NAME} [global options] first [options]
42
+ Options:
43
+ -h --help Show this help and exit
44
+ --string=STRING A String value
45
+ --float=FLOAT A Float value
46
+ --integer=INTEGER An Integer value
47
+ --array=val1,val2... An Array of values
48
+ FIRST
49
+
50
+ SECOND_HELP = <<SECOND
51
+ #{NAME}-second is the second command of the test script for HelpParser.
52
+ Usage: #{NAME} [global options] second [options]
53
+ Options:
54
+ -h --help Show this help and exit
55
+ --string=STRING A String value
56
+ --float=FLOAT A Float value
57
+ --integer=INTEGER An Integer value
58
+ --array=val1,val2... An Array of values
59
+ SECOND
60
+
61
+ begin
62
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
63
+ require 'help_parser'
64
+ include HELP_PARSER
65
+
66
+ GLOBAL_OPTIONS = HelpParser.new(VERSION, GLOBAL_HELP)
67
+
68
+ STRING = GLOBAL_OPTIONS[:string, 'string1', 'string2']
69
+ FLOAT = GLOBAL_OPTIONS[:float, 1.0, 2.0]
70
+ INTEGER = GLOBAL_OPTIONS[:integer, 1, 2]
71
+ ARRAY = GLOBAL_OPTIONS[:array, [], [1,'two',3.0]]
72
+
73
+ GLOBAL_OPTIONS.usage_error "Need command." if ARGV.empty?
74
+ COMMAND = ARGV.shift
75
+ # I see suites this way:
76
+ # system("command #{ARGV.join(' ')}")
77
+ # but...
78
+ case COMMAND
79
+ when 'first'
80
+ # Just going to reuse VERSION, although
81
+ # the comand could have it's own version number.
82
+ OPTIONS = HelpParser.new(VERSION, FIRST_HELP)
83
+ # CONST = OPTIONS[key, missing_key, missing_value]
84
+ CSTRING = OPTIONS[:string, 'string1', 'string2']
85
+ CFLOAT = OPTIONS[:float, 1.0, 2.0]
86
+ CINTEGER = OPTIONS[:integer, 1, 2]
87
+ CARRAY = OPTIONS[:array, [], [1,'two',3.0]]
88
+ when 'second'
89
+ OPTIONS = HelpParser.new(VERSION, SECOND_HELP)
90
+ CSTRING = OPTIONS[:string, 'string1', 'string2']
91
+ CFLOAT = OPTIONS[:float, 1.0, 2.0]
92
+ CINTEGER = OPTIONS[:integer, 1, 2]
93
+ CARRAY = OPTIONS[:array, [], [1,'two',3.0]]
94
+ else
95
+ GLOBAL_OPTIONS.usage_error "Unrecognized command #{COMMAND}."
96
+ end
97
+
98
+ OUTPUT = {
99
+ :exception => '',
100
+ :message=> '',
101
+ :command => COMMAND,
102
+ :options => OPTIONS,
103
+ :global_options => GLOBAL_OPTIONS,
104
+ # Constants from Global
105
+ :string => STRING,
106
+ :float => FLOAT,
107
+ :integer => INTEGER,
108
+ :array => ARRAY,
109
+ # Constants from Command
110
+ :cstring => CSTRING,
111
+ :cfloat => CFLOAT,
112
+ :cinteger => CINTEGER,
113
+ :carray => CARRAY,
114
+ }
115
+
116
+ rescue Exception
117
+ STDERR.puts $!.message.chomp.color(:blue)
118
+ STDERR.puts $!.backtrace.join("\n").color(:red)
119
+ OUTPUT = {
120
+ :exception => $!.class.to_s,
121
+ :message=> $!.message,
122
+ # These below might be undefined:
123
+ :command => (COMMAND||=''),
124
+ :global_options => (GLOBAL_OPTIONS||={}),
125
+ :command_options => (OPTIONS||={}),
126
+ :options => ($!.respond_to?(:obj))? $!.obj : {},
127
+ }
128
+ end
129
+
130
+ puts JSON.pretty_generate OUTPUT
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # This is used by cucumber for testing.
3
+ # It has a bad help text.
4
+ require 'json'
5
+ require 'rainbow'
6
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
7
+ require 'help_parser'
8
+ include HELP_PARSER
9
+ HELP = <<HELP
10
+ Usage:
11
+ simple [options] arguments...
12
+ Options:
13
+ -z --zebra
14
+ -a --zebra
15
+ HELP
16
+ output = {
17
+ :exception => '',
18
+ :message => '',
19
+ }
20
+ begin
21
+ OPTIONS = HelpParser.new('1.2.3', HELP)
22
+ rescue Exception
23
+ STDERR.puts $!.obj.help.chomp.color(:blue)
24
+ STDERR.puts $!.message.chomp.color(:red)
25
+ output = {
26
+ :exception => $!.class.to_s,
27
+ :message => $!.message,
28
+ }
29
+ end
30
+ puts JSON.pretty_generate output
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # This is used by cucumber for testing.
3
+ # It has a bad help text.
4
+ require 'json'
5
+ require 'rainbow'
6
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
7
+ require 'help_parser'
8
+ include HELP_PARSER
9
+ HELP = <<HELP
10
+ Usage:
11
+ simple [options] arguments...
12
+ Options:
13
+ -z --help
14
+ HELP
15
+ output = {
16
+ :exception => '',
17
+ :message => '',
18
+ }
19
+ begin
20
+ OPTIONS = HelpParser.new('1.2.3', HELP)
21
+ rescue Exception
22
+ STDERR.puts $!.obj.help.chop.color(:blue)
23
+ STDERR.puts $!.message.chomp.color(:red)
24
+ output = {
25
+ :exception => $!.class.to_s,
26
+ :message => $!.message,
27
+ }
28
+ end
29
+ puts JSON.pretty_generate output
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # This is used by cucumber for testing.
3
+ # It has a bad help text.
4
+ require 'json'
5
+ require 'rainbow'
6
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
7
+ require 'help_parser'
8
+ include HELP_PARSER
9
+ HELP = <<HELP
10
+ Usage:
11
+ simple [options] arguments...
12
+ Options:
13
+ -a --aaa
14
+ -b --a
15
+ HELP
16
+ output = {
17
+ :exception => '',
18
+ :message => '',
19
+ }
20
+ begin
21
+ OPTIONS = HelpParser.new('1.2.3', HELP)
22
+ rescue Exception
23
+ STDERR.puts $!.obj.help.chomp.color(:blue)
24
+ STDERR.puts $!.message.chomp.color(:red)
25
+ output = {
26
+ :exception => $!.class.to_s,
27
+ :message => $!.message,
28
+ }
29
+ end
30
+ puts JSON.pretty_generate output
data/examples/simple ADDED
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # This is used by cucumber for testing.
3
+ require 'json'
4
+ require 'rainbow'
5
+ $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + '/../lib')
6
+ require 'help_parser'
7
+ include HELP_PARSER
8
+ HELP = <<HELP
9
+ Usage:
10
+ simple [options] arguments...
11
+ Options:
12
+ -h --help Help already in dictionary
13
+ Missing version in dictionary
14
+ --nocomment
15
+ -s --long=VALUE Full template
16
+ --V Single characters can have long format
17
+ -k Short option does not need a long option
18
+ HELP
19
+ begin
20
+ OPTIONS = HelpParser.new('1.2.3', HELP)
21
+ data = { :exception => '', :message => '', :options => OPTIONS }
22
+ puts JSON.pretty_generate data
23
+ rescue Exception
24
+ STDERR.puts $!.message.chomp.color(:blue)
25
+ STDERR.puts $!.backtrace.join("\n").color(:red)
26
+ data = { :exception => $!.class, :message => $!.message, :options => $!.obj }
27
+ data[:options] = ($!.respond_to?(:obj))? $!.obj : {}
28
+ puts JSON.pretty_generate data
29
+ end