blueprinter icon indicating copy to clipboard operation
blueprinter copied to clipboard

Separate internal options from external ones

Open sandstrom opened this issue 11 months ago • 6 comments

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:

  1. Either into e.g. internal_options and options, and keep things such as :block in the internal set, or
  2. 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

sandstrom avatar Mar 21 '24 12:03 sandstrom