lib/bindata/dsl.rb in bindata-2.3.3 vs lib/bindata/dsl.rb in bindata-2.3.4
- old
+ new
@@ -1,9 +1,9 @@
module BinData
# Extracts args for Records and Buffers.
#
- # Foo.new(:bar => "baz) is ambiguous as to whether :bar is a value or parameter.
+ # Foo.new(bar: "baz) is ambiguous as to whether :bar is a value or parameter.
#
# BaseArgExtractor always assumes :bar is parameter. This extractor correctly
# identifies it as value or parameter.
module MultiFieldArgSeparator
def separate_args(obj_class, obj_args)
@@ -16,33 +16,32 @@
[value, parameters, parent]
end
def parameters_is_value?(obj_class, value, parameters)
- if value.nil? and parameters.length > 0
+ if value.nil? && !parameters.empty?
field_names_in_parameters?(obj_class, parameters)
else
false
end
end
def field_names_in_parameters?(obj_class, parameters)
field_names = obj_class.fields.field_names
param_keys = parameters.keys
- (field_names & param_keys).length > 0
+ !(field_names & param_keys).empty?
end
end
# BinData classes that are part of the DSL must be extended by this.
module DSLMixin
def dsl_parser(parser_type = nil)
- unless defined? @dsl_parser
- parser_type = superclass.dsl_parser.parser_type if parser_type.nil?
- @dsl_parser = DSLParser.new(self, parser_type)
+ @dsl_parser ||= begin
+ parser_type ||= superclass.dsl_parser.parser_type
+ DSLParser.new(self, parser_type)
end
- @dsl_parser
end
def method_missing(symbol, *args, &block) #:nodoc:
dsl_parser.__send__(symbol, *args, &block)
end
@@ -80,17 +79,15 @@
end
@endian
end
def search_prefix(*args)
- unless defined? @search_prefix
- @search_prefix = parent_attribute(:search_prefix, []).dup
- end
+ @search_prefix ||= parent_attribute(:search_prefix, []).dup
- prefix = args.collect { |name| name.to_sym }.compact
- if prefix.size > 0
- if has_fields?
+ prefix = args.collect(&:to_sym).compact
+ unless prefix.empty?
+ if fields?
dsl_raise SyntaxError, "search_prefix must be called before defining fields"
end
@search_prefix = prefix.concat(@search_prefix)
end
@@ -98,29 +95,25 @@
@search_prefix
end
def hide(*args)
if option?(:hidden_fields)
- hidden = args.collect { |name| name.to_sym }
+ @hide ||= parent_attribute(:hide, []).dup
- unless defined? @hide
- @hide = parent_attribute(:hide, []).dup
- end
+ hidden = args.collect(&:to_sym).compact
+ @hide.concat(hidden)
- @hide.concat(hidden.compact)
@hide
end
end
def fields
- unless defined? @fields
- fields = parent_fields
- @fields = SanitizedFields.new(hints)
- @fields.copy_fields(fields) if fields
+ @fields ||= begin
+ SanitizedFields.new(hints).tap do |san_fields|
+ san_fields.copy_fields(parent_fields) if parent_fields
+ end
end
-
- @fields
end
def dsl_params
abilities = parser_abilities[@parser_type]
send(abilities.at(0), abilities.at(1))
@@ -134,17 +127,17 @@
#-------------
private
def parser_abilities
@abilities ||= {
- :struct => [:to_struct_params, :struct, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
- :array => [:to_object_params, :type, [:multiple_fields, :optional_fieldnames]],
- :buffer => [:to_object_params, :type, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
- :choice => [:to_choice_params, :choices, [:multiple_fields, :all_or_none_fieldnames, :fieldnames_are_values]],
- :delayed_io => [:to_object_params, :type, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
- :primitive => [:to_struct_params, :struct, [:multiple_fields, :optional_fieldnames]],
- :skip => [:to_object_params, :until_valid, [:multiple_fields, :optional_fieldnames]],
+ struct: [:to_struct_params, :struct, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
+ array: [:to_object_params, :type, [:multiple_fields, :optional_fieldnames]],
+ buffer: [:to_object_params, :type, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
+ choice: [:to_choice_params, :choices, [:multiple_fields, :all_or_none_fieldnames, :fieldnames_are_values]],
+ delayed_io: [:to_object_params, :type, [:multiple_fields, :optional_fieldnames, :hidden_fields]],
+ primitive: [:to_struct_params, :struct, [:multiple_fields, :optional_fieldnames]],
+ skip: [:to_object_params, :until_valid, [:multiple_fields, :optional_fieldnames]],
}
end
def option?(opt)
parser_abilities[@parser_type].at(2).include?(opt)
@@ -154,19 +147,19 @@
endian
search_prefix
end
def hints
- { :endian => endian, :search_prefix => search_prefix }
+ { endian: endian, search_prefix: search_prefix }
end
def set_endian(endian)
if endian
- if has_fields?
+ if fields?
dsl_raise SyntaxError, "endian must be called before defining fields"
end
- if not valid_endian?(endian)
+ if !valid_endian?(endian)
dsl_raise ArgumentError, "unknown value for endian '#{endian}'"
end
if endian == :big_and_little
DSLBigAndLittleEndianHandler.handle(@the_class)
@@ -182,12 +175,12 @@
def parent_fields
parent_attribute(:fields)
end
- def has_fields?
- defined? @fields and @fields.length > 0
+ def fields?
+ defined?(@fields) && !@fields.empty?
end
def parse_and_append_field(*args, &block)
parser = DSLFieldParser.new(hints, *args, &block)
begin
@@ -205,22 +198,22 @@
end
def parent_attribute(attr, default = nil)
parent = @the_class.superclass
parser = parent.respond_to?(:dsl_parser) ? parent.dsl_parser : nil
- if parser and parser.respond_to?(attr)
+ if parser && parser.respond_to?(attr)
parser.send(attr)
else
default
end
end
- def dsl_raise(exception, message)
+ def dsl_raise(exception, msg)
backtrace = caller
backtrace.shift while %r{bindata/dsl.rb} =~ backtrace.first
- raise exception, message + " in #{@the_class}", backtrace
+ raise exception, "#{msg} in #{@the_class}", backtrace
end
def to_object_params(key)
case fields.length
when 0
@@ -231,30 +224,30 @@
{key=> [:struct, to_struct_params]}
end
end
def to_choice_params(key)
- if fields.length == 0
+ if fields.empty?
{}
elsif fields.all_field_names_blank?
- {key => fields.collect { |f| f.prototype }}
+ {key => fields.collect(&:prototype)}
else
choices = {}
fields.each { |f| choices[f.name] = f.prototype }
{key => choices}
end
end
def to_struct_params(*unused)
- result = {:fields => fields}
- if not endian.nil?
+ result = {fields: fields}
+ if !endian.nil?
result[:endian] = endian
end
- if not search_prefix.empty?
+ if !search_prefix.empty?
result[:search_prefix] = search_prefix
end
- if option?(:hidden_fields) and not hide.empty?
+ if option?(:hidden_fields) && !hide.empty?
result[:hide] = hide
end
result
end
@@ -282,12 +275,12 @@
instance_eval "class ::#{bnl_class}Le < ::#{bnl_class}; endian :little; end"
end
def override_new_in_class(bnl_class)
endian_classes = {
- :big => class_with_endian(bnl_class, :big),
- :little => class_with_endian(bnl_class, :little),
+ big: class_with_endian(bnl_class, :big),
+ little: class_with_endian(bnl_class, :little),
}
bnl_class.define_singleton_method(:new) do |*args|
if self == bnl_class
_, options, _ = arg_processor.separate_args(self, args)
delegate = endian_classes[options[:endian]]
@@ -298,12 +291,12 @@
end
end
def delegate_field_creation(bnl_class)
endian_classes = {
- :big => class_with_endian(bnl_class, :big),
- :little => class_with_endian(bnl_class, :little),
+ big: class_with_endian(bnl_class, :big),
+ little: class_with_endian(bnl_class, :little),
}
parser = bnl_class.dsl_parser
parser.define_singleton_method(:parse_and_append_field) do |*args, &block|
endian_classes[:big].send(*args, &block)
@@ -331,12 +324,12 @@
end
end
def class_with_endian(class_name, endian)
hints = {
- :endian => endian,
- :search_prefix => class_name.dsl_parser.search_prefix,
+ endian: endian,
+ search_prefix: class_name.dsl_parser.search_prefix,
}
RegisteredClasses.lookup(class_name, hints)
end
def obj_attribute(obj, attr)
@@ -356,11 +349,11 @@
attr_reader :type, :name, :params
def name_from_field_declaration(args)
name, _ = args
- if name == "" or name.is_a?(Hash)
+ if name == "" || name.is_a?(Hash)
nil
else
name
end
end
@@ -382,16 +375,16 @@
params || {}
end
def params_from_block(&block)
bindata_classes = {
- :array => BinData::Array,
- :buffer => BinData::Buffer,
- :choice => BinData::Choice,
- :delayed_io => BinData::DelayedIO,
- :skip => BinData::Skip,
- :struct => BinData::Struct,
+ array: BinData::Array,
+ buffer: BinData::Buffer,
+ choice: BinData::Choice,
+ delayed_io: BinData::DelayedIO,
+ skip: BinData::Skip,
+ struct: BinData::Struct,
}
if bindata_classes.include?(@type)
parser = DSLParser.new(bindata_classes[@type], @type)
parser.endian(@hints[:endian])
@@ -427,11 +420,11 @@
ensure_valid_name(name)
end
def ensure_valid_name(name)
- if name and not option?(:fieldnames_are_values)
+ if name && !option?(:fieldnames_are_values)
if malformed_name?(name)
raise NameError.new("", name), "field '#{name}' is an illegal fieldname"
end
if duplicate_name?(name)
@@ -447,33 +440,33 @@
end
end
end
def must_not_have_a_name_failed?(name)
- option?(:no_fieldnames) and name != nil
+ option?(:no_fieldnames) && !name.nil?
end
def must_have_a_name_failed?(name)
- option?(:mandatory_fieldnames) and name.nil?
+ option?(:mandatory_fieldnames) && name.nil?
end
def all_or_none_names_failed?(name)
- if option?(:all_or_none_fieldnames) and not fields.empty?
+ if option?(:all_or_none_fieldnames) && !fields.empty?
all_names_blank = fields.all_field_names_blank?
no_names_blank = fields.no_field_names_blank?
- (name != nil and all_names_blank) or (name == nil and no_names_blank)
+ (!name.nil? && all_names_blank) || (name.nil? && no_names_blank)
else
false
end
end
def malformed_name?(name)
/^[a-z_]\w*$/ !~ name.to_s
end
def duplicate_name?(name)
- fields.has_field_name?(name)
+ fields.field_name?(name)
end
def name_shadows_method?(name)
@the_class.method_defined?(name)
end