shellopts 2.0.0.pre.13 → 2.0.0.pre.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/TODO +15 -135
- data/lib/ext/algorithm.rb +14 -0
- data/lib/ext/ruby_env.rb +8 -0
- data/lib/shellopts.rb +90 -228
- data/lib/shellopts/args.rb +1 -1
- data/lib/shellopts/ast/command.rb +101 -30
- data/lib/shellopts/ast/dump.rb +28 -0
- data/lib/shellopts/ast/option.rb +8 -14
- data/lib/shellopts/ast/parser.rb +106 -0
- data/lib/shellopts/constants.rb +88 -0
- data/lib/shellopts/exceptions.rb +21 -0
- data/lib/shellopts/formatter.rb +125 -0
- data/lib/shellopts/grammar/analyzer.rb +76 -0
- data/lib/shellopts/grammar/command.rb +67 -60
- data/lib/shellopts/grammar/dump.rb +56 -0
- data/lib/shellopts/grammar/lexer.rb +56 -0
- data/lib/shellopts/grammar/option.rb +49 -60
- data/lib/shellopts/grammar/parser.rb +78 -0
- data/lib/shellopts/version.rb +2 -2
- data/shellopts.gemspec +1 -1
- metadata +13 -15
- data/lib/ext/array.rb +0 -9
- data/lib/main.rb +0 -1
- data/lib/shellopts/ast/node.rb +0 -37
- data/lib/shellopts/ast/program.rb +0 -14
- data/lib/shellopts/compiler.rb +0 -128
- data/lib/shellopts/generator.rb +0 -15
- data/lib/shellopts/grammar/node.rb +0 -33
- data/lib/shellopts/grammar/program.rb +0 -65
- data/lib/shellopts/idr.rb +0 -236
- data/lib/shellopts/main.rb +0 -10
- data/lib/shellopts/option_struct.rb +0 -148
- data/lib/shellopts/parser.rb +0 -106
- data/lib/shellopts/shellopts.rb +0 -123
data/lib/shellopts/shellopts.rb
DELETED
@@ -1,123 +0,0 @@
|
|
1
|
-
|
2
|
-
require "shellopts"
|
3
|
-
|
4
|
-
require "shellopts/args.rb"
|
5
|
-
|
6
|
-
# TODO
|
7
|
-
#
|
8
|
-
# PROCESSING
|
9
|
-
# 1. Compile spec string and yield a grammar
|
10
|
-
# 2. Parse the options using the grammar and yield an AST
|
11
|
-
# 3. Construct the Program model from the AST
|
12
|
-
# 4. Apply defaults to the model
|
13
|
-
# 6. Run validations on the model
|
14
|
-
# 5. Create representation from the model
|
15
|
-
#
|
16
|
-
|
17
|
-
module ShellOpts
|
18
|
-
# The command line processing object
|
19
|
-
class ShellOpts
|
20
|
-
# Name of program
|
21
|
-
attr_accessor :name
|
22
|
-
|
23
|
-
# Usage string. If #usage is nil, the auto-generated default is used
|
24
|
-
def usage() @usage || @grammar.usage end
|
25
|
-
def usage=(usage) @usage = usage end
|
26
|
-
|
27
|
-
# Specification of the command
|
28
|
-
attr_reader :spec
|
29
|
-
|
30
|
-
# Original argv argument
|
31
|
-
attr_reader :argv
|
32
|
-
|
33
|
-
# The grammar compiled from the spec string
|
34
|
-
attr_reader :grammar
|
35
|
-
|
36
|
-
# The AST parsed from the command line arguments
|
37
|
-
attr_reader :ast
|
38
|
-
|
39
|
-
# The IDR generated from the Ast
|
40
|
-
attr_reader :idr
|
41
|
-
|
42
|
-
# Compile a spec string into a grammar
|
43
|
-
#
|
44
|
-
# +spec+ is the spec string, and +argv+ the command line (typically the
|
45
|
-
# global ARGV array). +name+ is the name of the program and defaults to the
|
46
|
-
# basename of the program
|
47
|
-
#
|
48
|
-
# Syntax errors in the spec string are caused by the developer and cause
|
49
|
-
# #initialize to raise a +ShellOpts::CompilerError+ exception. Errors in
|
50
|
-
# the +argv+ arguments are caused by the user and cause #process to raise
|
51
|
-
# ShellOpts::UserError exception
|
52
|
-
#
|
53
|
-
# TODO: Change to (name, spec, argv, usage: nil) because
|
54
|
-
# ShellOpts::ShellOpts isn't a magician like the ShellOpts module
|
55
|
-
def initialize(spec, argv, name: ::ShellOpts.default_name, usage: ::ShellOpts.default_usage)
|
56
|
-
@name = name
|
57
|
-
@spec = spec
|
58
|
-
@usage = usage
|
59
|
-
@argv = argv
|
60
|
-
begin
|
61
|
-
@grammar = Grammar.compile(@name, @spec)
|
62
|
-
rescue Grammar::Compiler::Error => ex
|
63
|
-
raise CompilerError.new(5, ex.message)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Process command line arguments and return self. Raises a
|
68
|
-
# ShellOpts::UserError in case of an error
|
69
|
-
def process
|
70
|
-
begin
|
71
|
-
@ast = Ast.parse(@grammar, @argv)
|
72
|
-
@idr = Idr.generate(self)
|
73
|
-
rescue Ast::Parser::Error => ex
|
74
|
-
raise UserError.new(ex.message)
|
75
|
-
end
|
76
|
-
self
|
77
|
-
end
|
78
|
-
|
79
|
-
# Return an array representation of options and commands in the same order
|
80
|
-
# as on the command line. Each option or command is represented by a [name,
|
81
|
-
# value] pair. The value of an option is be nil if the option didn't have
|
82
|
-
# an argument and else either a String, Integer, or Float. The value of a
|
83
|
-
# command is an array of its options and commands
|
84
|
-
def to_a() idr.to_a end
|
85
|
-
|
86
|
-
# Return a hash representation of the options. See {ShellOpts::OptionsHash}
|
87
|
-
def to_h(key_type: ::ShellOpts.default_key_type, aliases: {})
|
88
|
-
@idr.to_h(key_type: :key_type, aliases: aliases)
|
89
|
-
end
|
90
|
-
|
91
|
-
# TODO
|
92
|
-
# Return OptionHash object
|
93
|
-
# def to_hash(...)
|
94
|
-
|
95
|
-
# Return a struct representation of the options. See {ShellOpts::OptionStruct}
|
96
|
-
def to_struct(key_type: ::ShellOpts.default_key_type, aliases: {})
|
97
|
-
@idr.to_struct(key_type: key_type, aliases: aliases)
|
98
|
-
end
|
99
|
-
|
100
|
-
# List of remaining non-option command line arguments. Returns a Argv object
|
101
|
-
def args() Args.new(self, ast&.arguments) end
|
102
|
-
|
103
|
-
# Iterate options and commands as name/value pairs. Same as +to_a.each+
|
104
|
-
def each(&block) to_a.each(&block) end
|
105
|
-
|
106
|
-
# Print error messages and spec string and exit with status 1. This method
|
107
|
-
# should be called in response to user-errors (eg. specifying an illegal
|
108
|
-
# option)
|
109
|
-
def error(*msgs, exit: true)
|
110
|
-
msg = "#{name}: #{msgs.join}\n" + (@usage ? usage : "Usage: #{name} #{usage}")
|
111
|
-
$stderr.puts msg.rstrip
|
112
|
-
exit(1) if exit
|
113
|
-
end
|
114
|
-
|
115
|
-
# Print error message and exit with status 1. This method should called in
|
116
|
-
# response to system errors (like disk full)
|
117
|
-
def fail(*msgs, exit: true)
|
118
|
-
$stderr.puts "#{name}: #{msgs.join}"
|
119
|
-
exit(1) if exit
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|