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