Skip to content

Commit

Permalink
Merge 00c54ba into 2e31a14
Browse files Browse the repository at this point in the history
  • Loading branch information
kylefritz committed Mar 30, 2014
2 parents 2e31a14 + 00c54ba commit fe1c787
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 3 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,23 @@ def default_serializer_options
end
```

## Changing the Key Format

You can specify that serializers use the lower-camel key format at the config, class or instance level.

```ruby

ActiveModel::Serializer.setup do |config|
config.key_format = :lower_camel
end

class BlogLowerCamelSerializer < ActiveModel::Serializer
format_keys :lower_camel
end

BlogSerializer.new(object, key_format: :lower_camel)
```

## Getting the old version

If you find that your project is already relying on the old rails to_json
Expand Down
5 changes: 3 additions & 2 deletions lib/active_model/array_serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@ def initialize(object, options={})
@meta = options[@meta_key]
@each_serializer = options[:each_serializer]
@resource_name = options[:resource_name]
@key_format = options[:key_format]
end
attr_accessor :object, :scope, :root, :meta_key, :meta
attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format

def json_key
if root.nil?
Expand All @@ -33,7 +34,7 @@ def json_key

def serializer_for(item)
serializer_class = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer
serializer_class.new(item, scope: scope)
serializer_class.new(item, scope: scope, key_format: key_format)
end

def serializable_object
Expand Down
31 changes: 31 additions & 0 deletions lib/active_model/serializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ def embed(type, options={})
WARN
end

def format_keys(format)
@key_format = format
end
attr_reader :key_format

if RUBY_VERSION >= '2.0'
def serializer_for(resource)
if resource.respond_to?(:to_ary)
Expand Down Expand Up @@ -110,6 +115,7 @@ def initialize(object, options={})
@wrap_in_array = options[:_wrap_in_array]
@only = Array(options[:only]) if options[:only]
@except = Array(options[:except]) if options[:except]
@key_format = options[:key_format]
end
attr_accessor :object, :scope, :root, :meta_key, :meta

Expand Down Expand Up @@ -190,10 +196,35 @@ def serialize_ids(association)
end
end

def key_format
@key_format || self.class.key_format || CONFIG.key_format
end

def format_key(key)
if key_format == :lower_camel
key.to_s.camelize(:lower)
else
key
end
end

def convert_keys(hash)
Hash[hash.map do |k,v|
key = if k.is_a?(Symbol)
format_key(k).to_sym
else
format_key(k)
end

[key ,v]
end]
end

def serializable_object(options={})
return @wrap_in_array ? [] : nil if @object.nil?
hash = attributes
hash.merge! associations
hash = convert_keys(hash) if key_format.present?
@wrap_in_array ? [hash] : hash
end
alias_method :serializable_hash, :serializable_object
Expand Down
3 changes: 2 additions & 1 deletion lib/active_model/serializer/associations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def initialize(name, options={})
@options = options
self.embed = options.fetch(:embed) { CONFIG.embed }
@embed_in_root = options.fetch(:embed_in_root) { options.fetch(:include) { CONFIG.embed_in_root } }
@key_format = options.fetch(:key_format) { CONFIG.key_format }
@embed_key = options[:embed_key] || :id
@key = options[:key]
@embedded_key = options[:root] || name
Expand All @@ -24,7 +25,7 @@ def initialize(name, options={})
end

attr_reader :name, :embed_ids, :embed_objects
attr_accessor :embed_in_root, :embed_key, :key, :embedded_key, :root_key, :serializer_from_options, :options
attr_accessor :embed_in_root, :embed_key, :key, :embedded_key, :root_key, :serializer_from_options, :options, :key_format
alias embed_ids? embed_ids
alias embed_objects? embed_objects
alias embed_in_root? embed_in_root
Expand Down
11 changes: 11 additions & 0 deletions test/fixtures/poro.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ def comments
class Comment < Model
end

class Blog < Model
end

###
## Serializers
###
Expand Down Expand Up @@ -62,3 +65,11 @@ class PostSerializer < ActiveModel::Serializer
class CommentSerializer < ActiveModel::Serializer
attributes :content
end

class BlogSerializer < ActiveModel::Serializer
attributes :name, :display_name
end

class BlogLowerCamelSerializer < BlogSerializer
format_keys :lower_camel
end
18 changes: 18 additions & 0 deletions test/unit/active_model/array_serializer/key_format_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
require 'test_helper'

module ActiveModel
class ArraySerializer
class KeyFormatTest < Minitest::Test
def test_array_serializer_pass_options_to_items_serializers
array = [Blog.new({ name: 'Name 1', display_name: 'Display Name 1'}),
Blog.new({ name: 'Name 2', display_name: 'Display Name 2'})]
serializer = ArraySerializer.new(array, key_format: :lower_camel)

expected = [{ name: 'Name 1', displayName: 'Display Name 1' },
{ name: 'Name 2', displayName: 'Display Name 2' }]

assert_equal expected, serializer.serializable_array
end
end
end
end
2 changes: 2 additions & 0 deletions test/unit/active_model/serializer/config_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class ApplyConfigTest < Minitest::Test
def test_apply_config_to_associations
CONFIG.embed = :ids
CONFIG.embed_in_root = true
CONFIG.key_format = :lower_camel

association = PostSerializer._associations[:comments]
old_association = association.dup
Expand All @@ -76,6 +77,7 @@ def test_apply_config_to_associations
assert association.embed_ids?
assert !association.embed_objects?
assert association.embed_in_root
assert_equal :lower_camel, association.key_format
ensure
PostSerializer._associations[:comments] = old_association
CONFIG.clear
Expand Down
25 changes: 25 additions & 0 deletions test/unit/active_model/serializer/key_format_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
require 'test_helper'

module ActiveModel
class Serializer
class KeyFormatTest < Minitest::Test
def test_lower_camel_format_option
object = Blog.new({ name: 'Name 1', display_name: 'Display Name 1'})
serializer = BlogSerializer.new(object, key_format: :lower_camel)

expected = { name: 'Name 1', displayName: 'Display Name 1' }

assert_equal expected, serializer.serializable_object
end

def test_lower_camel_format_serializer
object = Blog.new({ name: 'Name 1', display_name: 'Display Name 1'})
serializer = BlogLowerCamelSerializer.new(object)

expected = { name: 'Name 1', displayName: 'Display Name 1' }

assert_equal expected, serializer.serializable_object
end
end
end
end

0 comments on commit fe1c787

Please sign in to comment.