Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .rubocop_todo.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down
36 changes: 16 additions & 20 deletions lib/comma/data_extractor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
20 changes: 20 additions & 0 deletions lib/comma/extractor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Comment thread
Copilot marked this conversation as resolved.

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)
Expand Down
29 changes: 10 additions & 19 deletions lib/comma/header_extractor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down
Loading