blueprinter
blueprinter copied to clipboard
Separate internal options from external ones
Is there an existing issue for this?
- [X] I have searched the existing issues
Is your feature request related to a problem? Please describe
Right now options are used both internally and externally. For example, :block
and :association` are blessed options with internal purpose.
They are sometimes 'scrubbed out' for example this line in AssociationExtractor
:
options_without_default = options.except(:default, :default_if)
This increases the risk of colliding with user-defined options, and also make the internal code slightly harder to follow/modify.
Describe the feature you'd like to see implemented
I would separate the two sets, in one of two ways:
- Either into e.g.
internal_options
andoptions
, and keep things such as:block
in the internal set, or - turn internal options into proper instance variables, such as
@field_block
(see example below).
I'd prefer the second way, but (1) would at least be an improvement over the current state.
# base.rb
def self.field(method, options = {}, &block)
current_view << Field.new(
method,
options.fetch(:name) { method },
options.fetch(:extractor) { Blueprinter.configuration.extractor_default.new },
self,
inline_definition: block)
)
end
# field.rb
class Field
attr_reader :method, :name, :extractor, :options, :blueprint, :inline_definition
def initialize(method, name, extractor, blueprint, inline_definition: nil, options = {})
@method = method
@name = name
@extractor = extractor
@blueprint = blueprint
@options = options
@inline_definition = inline_definition
end
Describe alternatives you've considered
No response
Additional context
No response