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