Class: Methadone::OptionParserProxy

Inherits:
BasicObject
Defined in:
lib/methadone/main.rb

Overview

Methadone Internal - treat as private

A proxy to OptionParser that intercepts #on so that we can allow a simpler interface

Instance Method Summary collapse

Constructor Details

#initialize(option_parser, options) ⇒ OptionParserProxy

Create the proxy

option_parser

An OptionParser instance

options

a hash that will store the options set via automatic setting. The caller should retain a reference to this



393
394
395
396
397
398
399
400
401
402
403
404
# File 'lib/methadone/main.rb', line 393

def initialize(option_parser,options)
  @option_parser = option_parser
  @options = options
  @user_specified_banner = false
  @accept_options = false
  @args = []
  @arg_options = {}
  @arg_documentation = {}
  @description = nil
  @version = nil
  set_banner
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &block) ⇒ Object

Defers all calls save #on to the underlying OptionParser instance



466
467
468
# File 'lib/methadone/main.rb', line 466

def method_missing(sym,*args,&block)
  @option_parser.send(sym,*args,&block)
end

Instance Method Details

#arg(arg_name, *options) ⇒ Object

Sets the banner to include these arg names



447
448
449
450
451
452
453
454
455
456
457
# File 'lib/methadone/main.rb', line 447

def arg(arg_name,*options)
  options << :optional if options.include?(:any) && !options.include?(:optional)
  options << :required unless options.include? :optional
  options << :one unless options.include?(:any) || options.include?(:many)
  @args << arg_name
  @arg_options[arg_name] = options
  options.select { |_| _.kind_of? ::String }.each do |doc|
    @arg_documentation[arg_name] = doc + (options.include?(:optional) ? " (optional)" : "")
  end
  set_banner
end

#banner=(new_banner) ⇒ Object

Proxies to underlying OptionParser



441
442
443
444
# File 'lib/methadone/main.rb', line 441

def banner=(new_banner)
  @option_parser.banner=new_banner
  @user_specified_banner = true
end

#check_args!Object



406
407
408
409
410
411
412
413
414
415
416
# File 'lib/methadone/main.rb', line 406

def check_args!
  ::Hash[@args.zip(::ARGV)].each do |arg_name,arg_value|
    if @arg_options[arg_name].include? :required
      if arg_value.nil?
        message = "'#{arg_name.to_s}' is required"
        message = "at least one " + message if @arg_options[arg_name].include? :many
        raise ::OptionParser::ParseError,message
      end
    end
  end
end

#description(desc) ⇒ Object



459
460
461
462
# File 'lib/methadone/main.rb', line 459

def description(desc)
  @description = desc
  set_banner
end

#on(*args, &block) ⇒ Object

If invoked as with OptionParser, behaves the exact same way. If invoked without a block, however, the options hash given to the constructor will be used to store the parsed command-line value. See #opts in the Main module for how that works.



423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
# File 'lib/methadone/main.rb', line 423

def on(*args,&block)
  @accept_options = true
  args = add_default_value_to_docstring(*args)
  if block
    @option_parser.on(*args,&block)
  else
    opt_names = option_names(*args)
    @option_parser.on(*args) do |value|
      opt_names.each do |name| 
        @options[name] = value 
        @options[name.to_s] = value 
      end
    end
  end
  set_banner
end

#post_setupObject

We need some documentation to appear at the end, after all OptionParser setup has occured, but before we actually start. This method serves that purpose



483
484
485
486
487
488
489
490
491
492
493
# File 'lib/methadone/main.rb', line 483

def post_setup
  unless @arg_documentation.empty?
    @option_parser.separator ''
    @option_parser.separator "Arguments:"
    @option_parser.separator ''
    @args.each do |arg|
      @option_parser.separator "    #{arg}"
      @option_parser.separator "        #{@arg_documentation[arg]}"
    end
  end
end

#to_sObject

Since we extend Object on 1.8.x, to_s is defined and thus not proxied by method_missing



471
472
473
# File 'lib/methadone/main.rb', line 471

def to_s #::nodoc::
  @option_parser.to_s
end

#version(version) ⇒ Object

Sets the version for the banner



476
477
478
479
# File 'lib/methadone/main.rb', line 476

def version(version)
  @version = version
  set_banner
end