lib/samovar/options.rb in samovar-1.10.0 vs lib/samovar/options.rb in samovar-2.0.0

- old
+ new

@@ -16,94 +16,20 @@ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -require_relative 'flags' +require_relative 'option' module Samovar - class Option - def initialize(flags, description, key: nil, default: nil, value: nil, type: nil, &block) - @flags = Flags.new(flags) - @description = description - - if key - @key = key - else - @key = @flags.first.key - end - - @default = default - - # If the value is given, it overrides the user specified input. - @value = value - @value ||= true if @flags.boolean? - - @type = type - @block = block - end - - attr :flags - attr :description - attr :type - - attr :default - - attr :key - - def coerce_type(result) - if @type == Integer - Integer(result) - elsif @type == Float - Float(result) - elsif @type == Symbol - result.to_sym - elsif @type.respond_to? :call - @type.call(result) - elsif @type.respond_to? :new - @type.new(result) - end - end - - def coerce(result) - if @type - result = coerce_type(result) - end - - if @block - result = @block.call(result) - end - - return result - end - - def parse(input, default = @default) - if result = @flags.parse(input) - @value.nil? ? coerce(result) : @value - end || default - end - - def to_s - @flags - end - - def to_a - unless @default.nil? - [@flags, @description, "Default: #{@default}"] - else - [@flags, @description] - end - end - end - class Options def self.parse(*args, **options, &block) options = self.new(*args, **options) options.instance_eval(&block) if block_given? - return options + return options.freeze end def initialize(title = "Options", key: :options) @title = title @ordered = [] @@ -114,17 +40,54 @@ @key = key @defaults = {} end + def initialize_dup(source) + super + + @ordered = @ordered.dup + @keyed = @keyed.dup + @defaults = @defaults.dup + end + + attr :title + attr :ordered + attr :key attr :defaults + def freeze + return self if frozen? + + @ordered.freeze + @keyed.freeze + @defaults.freeze + + @ordered.each(&:freeze) + + super + end + + def each(&block) + @ordered.each(&block) + end + + def empty? + @ordered.empty? + end + def option(*args, **options, &block) self << Option.new(*args, **options, &block) end + def merge!(options) + options.each do |option| + self << option + end + end + def << option @ordered << option option.flags.each do |flag| @keyed[flag.prefix] = option @@ -136,10 +99,10 @@ if default = option.default @defaults[option.key] = option.default end end - def parse(input, default) + def parse(input, parent = nil, default = nil) values = (default || @defaults).dup while option = @keyed[input.first] if result = option.parse(input) values[option.key] = result