blueprinter-rb 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -60,7 +60,7 @@ module Blueprinter
60
60
  name,
61
61
  extractor,
62
62
  self,
63
- block: block,
63
+ block: block
64
64
  )
65
65
  end
66
66
 
@@ -125,7 +125,7 @@ module Blueprinter
125
125
  options.fetch(:name) { method },
126
126
  options.fetch(:extractor) { Blueprinter.configuration.extractor_default.new },
127
127
  self,
128
- options.merge(block: block),
128
+ options.merge(block: block)
129
129
  )
130
130
  end
131
131
 
@@ -165,7 +165,7 @@ module Blueprinter
165
165
  method,
166
166
  options.merge(
167
167
  association: true,
168
- extractor: options.fetch(:extractor) { AssociationExtractor.new },
168
+ extractor: options.fetch(:extractor) { AssociationExtractor.new }
169
169
  ),
170
170
  &block
171
171
  )
@@ -254,9 +254,7 @@ module Blueprinter
254
254
  #
255
255
  # @api private
256
256
  def self.prepare(object, view_name:, local_options:, root: nil, meta: nil)
257
- unless view_collection.has_view? view_name
258
- raise BlueprinterError, "View '#{view_name}' is not defined"
259
- end
257
+ raise BlueprinterError, "View '#{view_name}' is not defined" unless view_collection.view? view_name
260
258
 
261
259
  data = prepare_data(object, view_name, local_options)
262
260
  prepend_root_and_meta(data, root, meta)
@@ -281,7 +279,6 @@ module Blueprinter
281
279
  end
282
280
  end
283
281
 
284
-
285
282
  # Specify one transformer to be included for serialization.
286
283
  # Takes a class which extends Blueprinter::Transformer
287
284
  #
@@ -317,7 +314,6 @@ module Blueprinter
317
314
  current_view.add_transformer(transformer)
318
315
  end
319
316
 
320
-
321
317
  # Specify another view that should be mixed into the current view.
322
318
  #
323
319
  # @param view_name [Symbol] the view to mix into the current view.
@@ -340,7 +336,6 @@ module Blueprinter
340
336
  current_view.include_view(view_name)
341
337
  end
342
338
 
343
-
344
339
  # Specify additional views that should be mixed into the current view.
345
340
  #
346
341
  # @param view_name [Array<Symbol>] the views to mix into the current view.
@@ -363,12 +358,10 @@ module Blueprinter
363
358
  #
364
359
  # @return [Array<Symbol>] an array of view names.
365
360
 
366
-
367
361
  def self.include_views(*view_names)
368
362
  current_view.include_views(view_names)
369
363
  end
370
364
 
371
-
372
365
  # Exclude a field that was mixed into the current view.
373
366
  #
374
367
  # @param field_name [Symbol] the field to exclude from the current view.
@@ -446,13 +439,13 @@ module Blueprinter
446
439
  # end
447
440
  # end
448
441
  #
449
- # ExampleBlueprint.has_view?(:custom) => true
450
- # ExampleBlueprint.has_view?(:doesnt_exist) => false
442
+ # ExampleBlueprint.view?(:custom) => true
443
+ # ExampleBlueprint.view?(:doesnt_exist) => false
451
444
  #
452
445
  # @return [Boolean] a boolean value indicating if the view is
453
446
  # supported by this Blueprint.
454
- def self.has_view?(view_name)
455
- view_collection.has_view? view_name
447
+ def self.view?(view_name)
448
+ view_collection.view? view_name
456
449
  end
457
450
  end
458
451
  end
@@ -2,9 +2,10 @@
2
2
 
3
3
  module Blueprinter
4
4
  class Configuration
5
- attr_accessor :association_default, :datetime_format, :deprecations, :field_default, :generator, :if, :method, :sort_fields_by, :unless, :extractor_default, :default_transformers, :custom_array_like_classes
5
+ attr_accessor :association_default, :datetime_format, :deprecations, :field_default, :generator, :if, :method,
6
+ :sort_fields_by, :unless, :extractor_default, :default_transformers, :custom_array_like_classes
6
7
 
7
- VALID_CALLABLES = %i(if unless).freeze
8
+ VALID_CALLABLES = %i[if unless].freeze
8
9
 
9
10
  def initialize
10
11
  @deprecations = :stderror
@@ -4,8 +4,8 @@
4
4
  module Blueprinter
5
5
  class Deprecation
6
6
  class << self
7
- VALID_BEHAVIORS = %i(silence stderror raise).freeze
8
- MESSAGE_PREFIX = "[DEPRECATION::WARNING] Blueprinter:"
7
+ VALID_BEHAVIORS = %i[silence stderror raise].freeze
8
+ MESSAGE_PREFIX = '[DEPRECATION::WARNING] Blueprinter:'
9
9
 
10
10
  def report(message)
11
11
  full_msg = qualified_message(message)
@@ -28,7 +28,7 @@ module Blueprinter
28
28
 
29
29
  def behavior
30
30
  configured = Blueprinter.configuration.deprecations
31
- return configured unless !VALID_BEHAVIORS.include?(configured)
31
+ return configured if VALID_BEHAVIORS.include?(configured)
32
32
 
33
33
  :stderror
34
34
  end
@@ -3,12 +3,13 @@
3
3
  require_relative 'helpers/type_helpers'
4
4
 
5
5
  module Blueprinter
6
- EMPTY_COLLECTION = "empty_collection"
7
- EMPTY_HASH = "empty_hash"
8
- EMPTY_STRING = "empty_string"
6
+ EMPTY_COLLECTION = 'empty_collection'
7
+ EMPTY_HASH = 'empty_hash'
8
+ EMPTY_STRING = 'empty_string'
9
9
 
10
10
  module EmptyTypes
11
11
  include TypeHelpers
12
+
12
13
  private
13
14
 
14
15
  def use_default_value?(value, empty_type)
@@ -20,12 +21,7 @@ module Blueprinter
20
21
  when Blueprinter::EMPTY_HASH
21
22
  value.is_a?(Hash) && value.empty?
22
23
  when Blueprinter::EMPTY_STRING
23
- value.to_s == ""
24
- else
25
- Blueprinter::Deprecation.report(
26
- "Invalid empty type '#{empty_type}' received. Blueprinter will raise an error in the next major version."\
27
- "Must be one of [nil, Blueprinter::EMPTY_COLLECTION, Blueprinter::EMPTY_HASH, Blueprinter::EMPTY_STRING]"
28
- )
24
+ value.to_s == ''
29
25
  end
30
26
  end
31
27
  end
@@ -2,12 +2,12 @@
2
2
 
3
3
  module Blueprinter
4
4
  class Extractor
5
- def extract(_field_name, _object, _local_options, _options={})
6
- fail NotImplementedError, "An Extractor must implement #extract"
5
+ def extract(_field_name, _object, _local_options, _options = {})
6
+ raise NotImplementedError, 'An Extractor must implement #extract'
7
7
  end
8
8
 
9
- def self.extract(field_name, object, local_options, options={})
10
- self.new.extract(field_name, object, local_options, options)
9
+ def self.extract(field_name, object, local_options, options = {})
10
+ new.extract(field_name, object, local_options, options)
11
11
  end
12
12
  end
13
13
  end
@@ -9,12 +9,13 @@ module Blueprinter
9
9
  @extractor = Blueprinter.configuration.extractor_default.new
10
10
  end
11
11
 
12
- def extract(association_name, object, local_options, options={})
13
- options_without_default = options.reject { |k,_| k == :default || k == :default_if }
12
+ def extract(association_name, object, local_options, options = {})
13
+ options_without_default = options.reject { |k, _| %i[default default_if].include?(k) }
14
14
  # Merge in assocation options hash
15
15
  local_options = local_options.merge(options[:options]) if options[:options].is_a?(Hash)
16
16
  value = @extractor.extract(association_name, object, local_options, options_without_default)
17
17
  return default_value(options) if use_default_value?(value, options[:default_if])
18
+
18
19
  view = options[:view] || :default
19
20
  blueprint = association_blueprint(options[:blueprint], value)
20
21
  blueprint.prepare(value, view_name: view, local_options: local_options)
@@ -3,7 +3,7 @@
3
3
  module Blueprinter
4
4
  # @api private
5
5
  class BlockExtractor < Extractor
6
- def extract(field_name, object, local_options, options = {})
6
+ def extract(_field_name, object, local_options, options = {})
7
7
  options[:block].call(object, local_options)
8
8
  end
9
9
  end
@@ -3,7 +3,7 @@
3
3
  module Blueprinter
4
4
  # @api private
5
5
  class PublicSendExtractor < Extractor
6
- def extract(field_name, object, local_options, options = {})
6
+ def extract(field_name, object, _local_options, _options = {})
7
7
  object.public_send(field_name)
8
8
  end
9
9
  end
@@ -1,65 +1,60 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # @api private
4
- class Blueprinter::Field
5
- attr_reader :method, :name, :extractor, :options, :blueprint
6
- def initialize(method, name, extractor, blueprint, options = {})
7
- @method = method
8
- @name = name
9
- @extractor = extractor
10
- @blueprint = blueprint
11
- @options = options
12
- end
4
+ module Blueprinter
5
+ class Field
6
+ attr_reader :method, :name, :extractor, :options, :blueprint
7
+
8
+ def initialize(method, name, extractor, blueprint, options = {})
9
+ @method = method
10
+ @name = name
11
+ @extractor = extractor
12
+ @blueprint = blueprint
13
+ @options = options
14
+ end
13
15
 
14
- def extract(object, local_options)
15
- extractor.extract(method, object, local_options, options)
16
- end
16
+ def extract(object, local_options)
17
+ extractor.extract(method, object, local_options, options)
18
+ end
17
19
 
18
- def skip?(field_name, object, local_options)
19
- return true if if_callable && !if_callable.call(field_name, object, local_options)
20
- unless_callable && unless_callable.call(field_name, object, local_options)
21
- end
20
+ def skip?(field_name, object, local_options)
21
+ return true if if_callable && !if_callable.call(field_name, object, local_options)
22
22
 
23
- private
23
+ unless_callable && unless_callable.call(field_name, object, local_options)
24
+ end
24
25
 
25
- def if_callable
26
- return @if_callable if defined?(@if_callable)
27
- @if_callable = callable_from(:if)
28
- end
26
+ private
29
27
 
30
- def unless_callable
31
- return @unless_callable if defined?(@unless_callable)
32
- @unless_callable = callable_from(:unless)
33
- end
28
+ def if_callable
29
+ return @if_callable if defined?(@if_callable)
34
30
 
35
- def callable_from(condition)
36
- callable = old_callable_from(condition)
31
+ @if_callable = callable_from(:if)
32
+ end
37
33
 
38
- if callable && callable.arity == 2
39
- Blueprinter::Deprecation.report("`:#{condition}` conditions now expects 3 arguments instead of 2.")
40
- ->(_field_name, obj, options) { callable.call(obj, options) }
41
- else
42
- callable
34
+ def unless_callable
35
+ return @unless_callable if defined?(@unless_callable)
36
+
37
+ @unless_callable = callable_from(:unless)
43
38
  end
44
- end
45
39
 
46
- def old_callable_from(condition)
47
- config = Blueprinter.configuration
40
+ def callable_from(condition)
41
+ config = Blueprinter.configuration
48
42
 
49
- # Use field-level callable, or when not defined, try global callable
50
- tmp = if options.key?(condition)
51
- options.fetch(condition)
52
- elsif config.valid_callable?(condition)
53
- config.public_send(condition)
54
- end
43
+ # Use field-level callable, or when not defined, try global callable
44
+ tmp = if options.key?(condition)
45
+ options.fetch(condition)
46
+ elsif config.valid_callable?(condition)
47
+ config.public_send(condition)
48
+ end
55
49
 
56
- return false unless tmp
50
+ return false unless tmp
57
51
 
58
- case tmp
59
- when Proc then tmp
60
- when Symbol then blueprint.method(tmp)
61
- else
62
- raise ArgumentError, "#{tmp.class} is passed to :#{condition}"
52
+ case tmp
53
+ when Proc then tmp
54
+ when Symbol then blueprint.method(tmp)
55
+ else
56
+ raise ArgumentError, "#{tmp.class} is passed to :#{condition}"
57
+ end
63
58
  end
64
59
  end
65
60
  end
@@ -26,7 +26,7 @@ module Blueprinter
26
26
  when Proc then format.call(value)
27
27
  when String then value.strftime(format)
28
28
  else
29
- raise InvalidDateTimeFormatterError, 'Cannot format DateTime object with invalid formatter: #{format.class}'
29
+ raise InvalidDateTimeFormatterError, "Cannot format DateTime object with invalid formatter: #{format.class}"
30
30
  end
31
31
  end
32
32
  end
@@ -35,7 +35,8 @@ module Blueprinter
35
35
 
36
36
  def prepend_root_and_meta(data, root, meta)
37
37
  return data unless root
38
- ret = {root => data}
38
+
39
+ ret = { root => data }
39
40
  meta ? ret.merge!(meta: meta) : ret
40
41
  end
41
42
 
@@ -46,6 +47,7 @@ module Blueprinter
46
47
  def object_to_hash(object, view_name:, local_options:)
47
48
  result_hash = view_collection.fields_for(view_name).each_with_object({}) do |field, hash|
48
49
  next if field.skip?(field.name, object, local_options)
50
+
49
51
  hash[field.name] = field.extract(object, local_options)
50
52
  end
51
53
  view_collection.transformers(view_name).each do |transformer|
@@ -59,9 +61,9 @@ module Blueprinter
59
61
  when String, Symbol
60
62
  # no-op
61
63
  when NilClass
62
- raise BlueprinterError, "meta requires a root to be passed" if meta
64
+ raise BlueprinterError, 'meta requires a root to be passed' if meta
63
65
  else
64
- raise BlueprinterError, "root should be one of String, Symbol, NilClass"
66
+ raise BlueprinterError, 'root should be one of String, Symbol, NilClass'
65
67
  end
66
68
  end
67
69
 
@@ -71,10 +73,10 @@ module Blueprinter
71
73
 
72
74
  def validate_blueprint!(blueprint, method)
73
75
  validate_presence_of_blueprint!(blueprint)
74
- unless dynamic_blueprint?(blueprint)
75
- validate_blueprint_has_ancestors!(blueprint, method)
76
- validate_blueprint_has_blueprinter_base_ancestor!(blueprint, method)
77
- end
76
+ return if dynamic_blueprint?(blueprint)
77
+
78
+ validate_blueprint_has_ancestors!(blueprint, method)
79
+ validate_blueprint_has_blueprinter_base_ancestor!(blueprint, method)
78
80
  end
79
81
 
80
82
  def validate_presence_of_blueprint!(blueprint)
@@ -86,10 +88,10 @@ module Blueprinter
86
88
  # it means it, at the very least, does not have Blueprinter::Base as
87
89
  # one of its ancestor classes (e.g: Hash) and thus an error should
88
90
  # be raised.
89
- unless blueprint.respond_to?(:ancestors)
90
- raise BlueprinterError, "Blueprint provided for #{association_name} "\
91
+ return if blueprint.respond_to?(:ancestors)
92
+
93
+ raise BlueprinterError, "Blueprint provided for #{association_name} " \
91
94
  'association is not valid.'
92
- end
93
95
  end
94
96
 
95
97
  def validate_blueprint_has_blueprinter_base_ancestor!(blueprint, association_name)
@@ -98,9 +100,9 @@ module Blueprinter
98
100
  return if blueprint.ancestors.include? Blueprinter::Base
99
101
 
100
102
  # Raise error describing what's wrong.
101
- raise BlueprinterError, "Class #{blueprint.name} does not inherit from "\
102
- 'Blueprinter::Base and is not a valid Blueprinter '\
103
- "for #{association_name} association."
103
+ raise BlueprinterError, "Class #{blueprint.name} does not inherit from " \
104
+ 'Blueprinter::Base and is not a valid Blueprinter ' \
105
+ "for #{association_name} association."
104
106
  end
105
107
 
106
108
  def jsonify(blob)
@@ -4,11 +4,11 @@ module Blueprinter
4
4
  # @api private
5
5
  class Transformer
6
6
  def transform(_result_hash, _primary_obj, _options = {})
7
- fail NotImplementedError, "A Transformer must implement #transform"
7
+ raise NotImplementedError, 'A Transformer must implement #transform'
8
8
  end
9
9
 
10
10
  def self.transform(result_hash, primary_obj, options = {})
11
- self.new.transform(result_hash, primary_obj, options)
11
+ new.transform(result_hash, primary_obj, options)
12
12
  end
13
13
  end
14
14
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Blueprinter
4
- VERSION = '1.1.1'
4
+ VERSION = '1.2.0'
5
5
  end
@@ -20,14 +20,14 @@ module Blueprinter
20
20
  view_transformers.empty? ? Blueprinter.configuration.default_transformers : view_transformers
21
21
  end
22
22
 
23
- def track_definition_order(method, is_view = true)
24
- if @sort_by_definition
25
- @definition_order << DefinitionPlaceholder.new(method, is_view)
26
- end
23
+ def track_definition_order(method, viewable: true)
24
+ return unless @sort_by_definition
25
+
26
+ @definition_order << DefinitionPlaceholder.new(method, viewable)
27
27
  end
28
28
 
29
29
  def inherit(view)
30
- view.fields.values.each do |field|
30
+ view.fields.each_value do |field|
31
31
  self << field
32
32
  end
33
33
 
@@ -71,7 +71,7 @@ module Blueprinter
71
71
  end
72
72
 
73
73
  def <<(field)
74
- track_definition_order(field.name,false)
74
+ track_definition_order(field.name, viewable: false)
75
75
  fields[field.name] = field
76
76
  end
77
77
  end
@@ -4,6 +4,7 @@ module Blueprinter
4
4
  # @api private
5
5
  class ViewCollection
6
6
  attr_reader :views, :sort_by_definition
7
+
7
8
  def initialize
8
9
  @views = {
9
10
  identifier: View.new(:identifier),
@@ -18,8 +19,8 @@ module Blueprinter
18
19
  end
19
20
  end
20
21
 
21
- def has_view?(view_name)
22
- views.has_key? view_name
22
+ def view?(view_name)
23
+ views.key? view_name
23
24
  end
24
25
 
25
26
  def fields_for(view_name)
@@ -28,8 +29,8 @@ module Blueprinter
28
29
  fields, excluded_fields = sortable_fields(view_name)
29
30
  sorted_fields = sort_by_definition ? sort_by_def(view_name, fields) : fields.values.sort_by(&:name)
30
31
 
31
- (identifier_fields + sorted_fields).tap do |fields|
32
- fields.reject! { |field| excluded_fields.include?(field.name) }
32
+ (identifier_fields + sorted_fields).tap do |fields_array|
33
+ fields_array.reject! { |field| excluded_fields.include?(field.name) }
33
34
  end
34
35
  end
35
36
 
@@ -69,7 +70,9 @@ module Blueprinter
69
70
  # select and order members of fields according to traversal of the definition_orders
70
71
  def sort_by_def(view_name, fields)
71
72
  ordered_fields = {}
72
- views[:default].definition_order.each { |definition| add_to_ordered_fields(ordered_fields, definition, fields, view_name) }
73
+ views[:default].definition_order.each do |definition|
74
+ add_to_ordered_fields(ordered_fields, definition, fields, view_name)
75
+ end
73
76
  ordered_fields.values
74
77
  end
75
78
 
@@ -78,7 +81,9 @@ module Blueprinter
78
81
  def add_to_ordered_fields(ordered_fields, definition, fields, view_name_filter = nil)
79
82
  if definition.view?
80
83
  if view_name_filter.nil? || view_name_filter == definition.name
81
- views[definition.name].definition_order.each { |_definition| add_to_ordered_fields(ordered_fields, _definition, fields) }
84
+ views[definition.name].definition_order.each do |defined|
85
+ add_to_ordered_fields(ordered_fields, defined, fields)
86
+ end
82
87
  end
83
88
  else
84
89
  ordered_fields[definition.name] = fields[definition.name]
@@ -3,39 +3,31 @@
3
3
  module Blueprinter
4
4
  module Generators
5
5
  class BlueprintGenerator < ::Rails::Generators::NamedBase
6
- desc "Generates blueprint for ActiveRecord model with the given NAME."
6
+ desc 'Generates blueprint for ActiveRecord model with the given NAME.'
7
7
 
8
8
  attr_accessor :options
9
9
 
10
- source_root File.expand_path("../templates", __FILE__)
10
+ source_root File.expand_path('templates', __dir__)
11
11
 
12
+ class_option :blueprints_dir, default: 'app/blueprints', desc: 'path to new blueprint', aliases: '-d'
12
13
 
14
+ class_option :identifier, default: nil,
15
+ desc: 'Add an identifer to the generated blueprint, either uses :id or your specified value', aliases: '-i', banner: 'id'
13
16
 
14
- class_option :blueprints_dir, default: "app/blueprints", desc: "path to new blueprint", aliases: "-d"
17
+ class_option :fields, type: :array, default: [], desc: 'Manually add specified fields'
15
18
 
19
+ class_option :detect_fields, type: :boolean, default: false,
20
+ desc: 'Introspect on the model to set fields in the generated blueprint. Will be merged with any manually specified'
16
21
 
22
+ class_option :associations, type: :array, default: [], desc: 'Manually add specified associations', aliases: '-a'
17
23
 
18
- class_option :identifier, default: nil, desc: "Add an identifer to the generated blueprint, either uses :id or your specified value", aliases: "-i", banner: "id"
19
-
20
-
21
-
22
- class_option :fields, type: :array, default: [], desc: "Manually add specified fields"
23
-
24
- class_option :detect_fields, type: :boolean, default: false, desc: "Introspect on the model to set fields in the generated blueprint. Will be merged with any manually specified"
25
-
26
-
27
-
28
- class_option :associations, type: :array, default: [], desc: "Manually add specified associations", aliases: "-a"
29
-
30
- class_option :detect_associations, type: :boolean, default: false, desc: "Introspect on the model to set associations in the generated blueprint. Will be merged with any manually specified"
31
-
32
-
33
-
34
- class_option :wrap_at, type: :numeric, default: 80, desc: "Maximum length of generated fields line", aliases: "-w"
35
-
36
- class_option :indentation, type: :string, default: "two", desc: "Indentation of generated file", banner: "two|four|tab"
24
+ class_option :detect_associations, type: :boolean, default: false,
25
+ desc: 'Introspect on the model to set associations in the generated blueprint. Will be merged with any manually specified'
37
26
 
27
+ class_option :wrap_at, type: :numeric, default: 80, desc: 'Maximum length of generated fields line', aliases: '-w'
38
28
 
29
+ class_option :indentation, type: :string, default: 'two', desc: 'Indentation of generated file',
30
+ banner: 'two|four|tab'
39
31
 
40
32
  remove_class_option :skip_namespace
41
33
 
@@ -44,30 +36,28 @@ module Blueprinter
44
36
  end
45
37
 
46
38
  def create_blueprint
47
- template "blueprint.rb", File.join(path, "#{file_path}_blueprint.rb")
39
+ template 'blueprint.rb', File.join(path, "#{file_path}_blueprint.rb")
48
40
  end
49
41
 
50
-
51
-
52
42
  private
53
43
 
54
44
  def path
55
- options["blueprints_dir"]
45
+ options['blueprints_dir']
56
46
  end
57
47
 
58
48
  def identifier_symbol
59
- if options['identifier']
60
- options['identifier'] == "identifier" ? :id : options['identifier']
61
- end
49
+ return unless options['identifier']
50
+
51
+ options['identifier'] == 'identifier' ? :id : options['identifier']
62
52
  end
63
53
 
64
54
  def fields
65
- fs = if options["detect_fields"]
66
- Array.new(options["fields"]).concat(introspected_fields)
55
+ fs = if options['detect_fields']
56
+ Array.new(options['fields']).concat(introspected_fields)
67
57
  else
68
- options["fields"]
58
+ options['fields']
69
59
  end
70
- fs.reject {|f| f.blank? }.uniq
60
+ fs.reject(&:blank?).uniq
71
61
  end
72
62
 
73
63
  def introspected_fields
@@ -77,30 +67,29 @@ module Blueprinter
77
67
  # split at wrap_at chars, two indentations
78
68
  def formatted_fields
79
69
  two_indents = indent * 2
80
- fields_string = fields.reduce([]) do |memo, f|
81
- if !memo.last.nil?
70
+ fields_string = fields.each_with_object([]) do |f, memo|
71
+ if memo.last.nil?
72
+ memo << " :#{f},"
73
+ else
82
74
  now = "#{memo.last} :#{f},"
83
- if now.length > options["wrap_at"].to_i
75
+ if now.length > options['wrap_at'].to_i
84
76
  memo << ":#{f},"
85
77
  else
86
78
  memo[memo.length - 1] = now
87
79
  end
88
- else
89
- memo << " :#{f},"
90
80
  end
91
- memo
92
81
  end.join("\n#{two_indents}")
93
82
 
94
- fields_string[0,fields_string.length - 1]
83
+ fields_string[0, fields_string.length - 1]
95
84
  end
96
85
 
97
86
  def associations
98
- as = if options["detect_associations"]
99
- Array.new(options["associations"]).concat(introspected_associations.keys)
87
+ as = if options['detect_associations']
88
+ Array.new(options['associations']).concat(introspected_associations.keys)
100
89
  else
101
- options["associations"]
90
+ options['associations']
102
91
  end
103
- as.reject {|f| f.blank? }.uniq
92
+ as.reject(&:blank?).uniq
104
93
  end
105
94
 
106
95
  def introspected_associations
@@ -114,15 +103,13 @@ module Blueprinter
114
103
  def association_class(association_name)
115
104
  introspected_name = if introspected_associations[association_name].respond_to?(:klass)
116
105
  introspected_associations[association_name].klass.to_s
117
- else
118
- nil
119
106
  end
120
107
  "#{introspected_name || association_name.camelcase}Blueprint"
121
108
  end
122
109
 
123
110
  def indent
124
- user_intended = {two: " ", four: " ", tab:"\t"}[options["indentation"].intern]
125
- user_intended.nil? ? " " : user_intended
111
+ user_intended = { two: ' ', four: ' ', tab: "\t" }[options['indentation'].intern]
112
+ user_intended.nil? ? ' ' : user_intended
126
113
  end
127
114
  end
128
115
  end