diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 196e2b7..8a6bf3e 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -124,11 +124,11 @@ Style/Documentation: - 'lib/comma/object.rb' - 'lib/comma/relation.rb' -# Offense count: 3 +# Offense count: 2 Style/MissingRespondToMissing: Exclude: - 'lib/comma/data_extractor.rb' - - 'lib/comma/header_extractor.rb' + - 'lib/comma/extractor.rb' # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). diff --git a/lib/comma/data_extractor.rb b/lib/comma/data_extractor.rb index d795346..7503d9a 100644 --- a/lib/comma/data_extractor.rb +++ b/lib/comma/data_extractor.rb @@ -49,28 +49,24 @@ def method_missing(_symbol, *_args, &_block) end end - def method_missing(sym, *args, &block) - @results << ExtractValueFromInstance.new(@instance).extract(sym, &block) if - args.blank? - - args.each do |arg| - case arg - when Hash - arg.each do |k, _v| - @results << ExtractValueFromAssociationOfInstance.new(@instance, sym).extract(k, &block) - end - when Symbol - @results << ExtractValueFromAssociationOfInstance.new(@instance, sym).extract(arg, &block) - when String - @results << ExtractValueFromInstance.new(@instance).extract(sym, &block) - else - raise "Unknown data symbol #{arg.inspect}" - end - end - end - def __static_column__(_header = nil, &block) @results << (block ? yield(@instance) : nil) end + + private + + def extract_column(method, association: nil, **, &block) + value_extractor(association).extract(method, &block) + end + + def value_extractor(association) + return ExtractValueFromInstance.new(@instance) unless association + + ExtractValueFromAssociationOfInstance.new(@instance, association) + end + + def column_kind + 'data' + end end end diff --git a/lib/comma/extractor.rb b/lib/comma/extractor.rb index 01a02a7..53045ab 100644 --- a/lib/comma/extractor.rb +++ b/lib/comma/extractor.rb @@ -37,6 +37,26 @@ def __use__(style) end end + def method_missing(sym, *args, &block) + if args.empty? + @results << extract_column(sym, &block) + return + end + + args.each do |arg| + case arg + when Hash + arg.each { |k, v| @results << extract_column(k, association: sym, label: v, &block) } + when Symbol + @results << extract_column(arg, association: sym, label: arg, &block) + when String + @results << extract_column(sym, label: arg, &block) + else + raise "Unknown #{column_kind} symbol #{arg.inspect}" + end + end + end + private def convert_to_data_value(result) diff --git a/lib/comma/header_extractor.rb b/lib/comma/header_extractor.rb index d474192..b549eee 100644 --- a/lib/comma/header_extractor.rb +++ b/lib/comma/header_extractor.rb @@ -16,31 +16,22 @@ class HeaderExtractor < Extractor end self.value_humanizer = DEFAULT_VALUE_HUMANIZER - def method_missing(sym, *args, &_block) - model_class = @instance.class - @results << value_humanizer.call(sym, model_class) if args.blank? - args.each do |arg| - case arg - when Hash - arg.each do |_k, v| - @results << value_humanizer.call(v, get_association_class(model_class, sym)) - end - when Symbol - @results << value_humanizer.call(arg, get_association_class(model_class, sym)) - when String - @results << value_humanizer.call(arg, model_class) - else - raise "Unknown header symbol #{arg.inspect}" - end - end - end - def __static_column__(header = '', &_block) @results << header end private + def extract_column(method, association: nil, label: nil, **) + model_class = @instance.class + target_class = association ? get_association_class(model_class, association) : model_class + value_humanizer.call(label || method, target_class) + end + + def column_kind + 'header' + end + def get_association_class(model_class, association) return unless model_class.respond_to?(:reflect_on_association)