Class: RuboCop::Cop::Obsession::Rails::FullyDefinedJsonField

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/obsession/rails/fully_defined_json_field.rb

Overview

This cop checks for json(b) fields that are not fully defined with defaults or comments.

  • json(b) fields should have a default value like {} or [] so code can do my_field or my_field.first without fear that my_field is nil.

  • It is impossible to know the structure of a json(b) field just by reading the schema, because json(b) is an unstructured type. That’s why an “Example: …” Postgres comment should always be present when defining the field.

Examples:


# bad
def change
  add_column :languages, :items, :jsonb
end

# good
def change
  add_column :languages,
             :items,
             :jsonb,
             default: [],
             comment: "Example: [{ 'name': 'ruby' }, { 'name': 'python' }]"
end

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/rubocop/cop/obsession/rails/fully_defined_json_field.rb', line 55

def on_send(node)
  return if !json_field?(node)
  options_node = node.children[5]

  if !has_default?(options_node)
    add_offense(node, message: 'Add default value of {} or []')
  end

  if !has_comment_with_example?(options_node)
    add_offense(
      node,
      message:
        'Add `comment: "Example: <example>"` option with an example array or hash value'
    )
  end
end