Project

General

Profile

Bug #12323 ยป example.rb

Option of example code - SerSamgy (Semyon Gaivoronskiy), 04/27/2016 05:01 PM

 
require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'

class OptparseExample
Version = '1.0.0'

CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }

class ScriptOptions
attr_accessor :library, :inplace, :encoding, :transfer_type,
:verbose, :extension, :delay, :time, :record_separator,
:list

def initialize
self.library = []
self.inplace = false
self.encoding = "utf8"
self.transfer_type = :auto
self.verbose = false
end
end

# Return a structure describing the options.
def self.parse(args)
# The options specified on the command line will be collected in
# *options*.
@options = ScriptOptions.new
option_parser.parse!(args)
@options
end
attr_reader :parser, :options
def self.option_parser
@parser ||= OptionParser.new do |parser|
parser.banner = "Usage: example.rb [options]"
parser.separator ""
parser.separator "Specific options:"
# add additional options
perform_inplace_option parser
delay_execution_option parser
execute_at_time_option parser
specify_record_separator_option parser
list_example_option parser
specify_encoding_option parser
optional_option_argument_with_keyword_completion_option parser
boolean_verbose_option parser
parser.separator ""
parser.separator "Common options:"
# No argument, shows at tail. This will print an options summary.
# Try it and see!
parser.on_tail("-h", "--help", "Show this message") do
puts parser
exit
end
# Another typical switch to print the version.
parser.on_tail("--version", "Show version") do
puts Version
exit
end
end
end

def self.perform_inplace_option(parser)
# Specifies an optional option argument
parser.on("-i", "--inplace [EXTENSION]",
"Edit ARGV files in place",
"(make backup if EXTENSION supplied)") do |ext|
@options.inplace = true
@options.extension = ext || ''
@options.extension.sub!(/\A\.?(?=.)/, ".") # Ensure extension begins with dot.
end
end
def self.delay_execution_option(parser)
# Cast 'delay' argument to a Float.
parser.on("--delay N", Float, "Delay N seconds before executing") do |n|
@options.delay = n
end
end
def self.execute_at_time_option(parser)
# Cast 'time' argument to a Time object.
parser.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
@options.time = time
end
end
def self.specify_record_separator_option(parser)
# Cast to octal integer.
parser.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
"Specify record separator (default \\0)") do |rs|
@options.record_separator = rs
end
end
def self.list_example_option(parser)
# List of arguments.
parser.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
@options.list = list
end
end
def self.specify_encoding_option(parser)
# Keyword completion. We are specifying a specific set of arguments (CODES
# and CODE_ALIASES - notice the latter is a Hash), and the user may provide
# the shortest unambiguous text.
code_list = (CODE_ALIASES.keys + CODES).join(', ')
parser.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
"(#{code_list})") do |encoding|
@options.encoding = encoding
end
end
def self.optional_option_argument_with_keyword_completion_option(parser)
# Optional '--type' option argument with keyword completion.
parser.on("--type [TYPE]", [:text, :binary, :auto],
"Select transfer type (text, binary, auto)") do |t|
@options.transfer_type = t
end
end
def self.boolean_verbose_option(parser)
# Boolean switch.
parser.on("-v", "--[no-]verbose", "Run verbosely") do |v|
@options.verbose = v
end
end
end # class OptparseExample

options = OptparseExample.parse(ARGV)
pp options
pp ARGV
    (1-1/1)