active_model_serializers 0.8.3 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -5
  3. data/CONTRIBUTING.md +20 -0
  4. data/DESIGN.textile +4 -4
  5. data/{MIT-LICENSE.txt → MIT-LICENSE} +0 -0
  6. data/README.md +307 -99
  7. data/lib/action_controller/serialization.rb +35 -16
  8. data/lib/action_controller/serialization_test_case.rb +79 -0
  9. data/lib/active_model/array_serializer.rb +40 -79
  10. data/lib/active_model/default_serializer.rb +32 -0
  11. data/lib/active_model/serializable.rb +40 -0
  12. data/lib/active_model/serializer/associations.rb +71 -202
  13. data/lib/active_model/serializer/config.rb +31 -0
  14. data/lib/active_model/serializer/generators/resource_override.rb +13 -0
  15. data/lib/{generators → active_model/serializer/generators}/serializer/USAGE +0 -0
  16. data/lib/active_model/serializer/generators/serializer/scaffold_controller_generator.rb +14 -0
  17. data/lib/active_model/serializer/generators/serializer/serializer_generator.rb +37 -0
  18. data/lib/active_model/serializer/generators/serializer/templates/controller.rb +93 -0
  19. data/lib/active_model/serializer/generators/serializer/templates/serializer.rb +8 -0
  20. data/lib/active_model/serializer/railtie.rb +10 -0
  21. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  22. data/lib/active_model/serializer.rb +186 -433
  23. data/lib/active_model/serializer_support.rb +5 -0
  24. data/lib/active_model_serializers.rb +13 -88
  25. data/test/fixtures/active_record.rb +92 -0
  26. data/test/fixtures/poro.rb +75 -0
  27. data/test/integration/action_controller/serialization_test.rb +287 -0
  28. data/test/integration/action_controller/serialization_test_case_test.rb +61 -0
  29. data/test/integration/active_record/active_record_test.rb +77 -0
  30. data/test/integration/generators/resource_generator_test.rb +26 -0
  31. data/test/integration/generators/scaffold_controller_generator_test.rb +64 -0
  32. data/test/integration/generators/serializer_generator_test.rb +41 -0
  33. data/test/test_app.rb +11 -0
  34. data/test/test_helper.rb +10 -18
  35. data/test/tmp/app/serializers/account_serializer.rb +3 -0
  36. data/test/unit/active_model/array_serializer/except_test.rb +18 -0
  37. data/test/unit/active_model/array_serializer/key_format_test.rb +18 -0
  38. data/test/unit/active_model/array_serializer/meta_test.rb +53 -0
  39. data/test/unit/active_model/array_serializer/only_test.rb +18 -0
  40. data/test/unit/active_model/array_serializer/root_test.rb +102 -0
  41. data/test/unit/active_model/array_serializer/scope_test.rb +24 -0
  42. data/test/unit/active_model/array_serializer/serialization_test.rb +199 -0
  43. data/test/unit/active_model/default_serializer_test.rb +13 -0
  44. data/test/unit/active_model/serializer/associations/build_serializer_test.rb +21 -0
  45. data/test/unit/active_model/serializer/associations_test.rb +19 -0
  46. data/test/unit/active_model/serializer/attributes_test.rb +41 -0
  47. data/test/unit/active_model/serializer/config_test.rb +88 -0
  48. data/test/unit/active_model/serializer/filter_test.rb +69 -0
  49. data/test/unit/active_model/serializer/has_many_test.rb +230 -0
  50. data/test/unit/active_model/serializer/has_one_test.rb +207 -0
  51. data/test/unit/active_model/serializer/key_format_test.rb +25 -0
  52. data/test/unit/active_model/serializer/meta_test.rb +39 -0
  53. data/test/unit/active_model/serializer/options_test.rb +15 -0
  54. data/test/unit/active_model/serializer/root_test.rb +117 -0
  55. data/test/unit/active_model/serializer/scope_test.rb +49 -0
  56. metadata +88 -62
  57. data/.gitignore +0 -18
  58. data/.travis.yml +0 -28
  59. data/Gemfile +0 -4
  60. data/Gemfile.edge +0 -9
  61. data/Rakefile +0 -18
  62. data/active_model_serializers.gemspec +0 -24
  63. data/bench/perf.rb +0 -43
  64. data/cruft.md +0 -19
  65. data/lib/active_record/serializer_override.rb +0 -16
  66. data/lib/generators/resource_override.rb +0 -13
  67. data/lib/generators/serializer/serializer_generator.rb +0 -42
  68. data/lib/generators/serializer/templates/serializer.rb +0 -19
  69. data/test/array_serializer_test.rb +0 -75
  70. data/test/association_test.rb +0 -592
  71. data/test/caching_test.rb +0 -96
  72. data/test/generators_test.rb +0 -85
  73. data/test/no_serialization_scope_test.rb +0 -34
  74. data/test/serialization_scope_name_test.rb +0 -67
  75. data/test/serialization_test.rb +0 -392
  76. data/test/serializer_support_test.rb +0 -51
  77. data/test/serializer_test.rb +0 -1465
  78. data/test/test_fakes.rb +0 -217
data/.travis.yml DELETED
@@ -1,28 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 1.8.7
4
- - 1.9.2
5
- - 1.9.3
6
- - 2.0.0
7
- - ree
8
- - jruby-18mode
9
- - jruby-19mode
10
- - rbx-2
11
- gemfile:
12
- - Gemfile
13
- - Gemfile.edge
14
- matrix:
15
- allow_failures:
16
- - gemfile: Gemfile.edge
17
- exclude:
18
- # Edge Rails is only compatible with 1.9.3
19
- - gemfile: Gemfile.edge
20
- rvm: 1.8.7
21
- - gemfile: Gemfile.edge
22
- rvm: 1.9.2
23
- - gemfile: Gemfile.edge
24
- rvm: ree
25
- - gemfile: Gemfile.edge
26
- rvm: jruby-18mode
27
- - gemfile: Gemfile.edge
28
- rvm: rbx-18mode
data/Gemfile DELETED
@@ -1,4 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify gem dependencies in active_model_serializers.gemspec
4
- gemspec
data/Gemfile.edge DELETED
@@ -1,9 +0,0 @@
1
- source 'http://rubygems.org'
2
-
3
- gemspec
4
-
5
- gem 'rails', github: 'rails/rails'
6
-
7
- # Current dependencies of edge rails
8
- gem 'journey', github: 'rails/journey'
9
- gem 'activerecord-deprecated_finders' , github: 'rails/activerecord-deprecated_finders'
data/Rakefile DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env rake
2
- require "bundler/gem_tasks"
3
- require "rake/testtask"
4
-
5
- desc 'Run tests'
6
- Rake::TestTask.new(:test) do |t|
7
- t.libs << 'lib'
8
- t.libs << 'test'
9
- t.pattern = 'test/**/*_test.rb'
10
- t.verbose = true
11
- end
12
-
13
- desc 'Benchmark'
14
- task :bench do
15
- load 'bench/perf.rb'
16
- end
17
-
18
- task :default => :test
@@ -1,24 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- $:.unshift File.expand_path("../lib", __FILE__)
4
- require "active_model/serializers/version"
5
-
6
- Gem::Specification.new do |gem|
7
- gem.authors = ["José Valim", "Yehuda Katz"]
8
- gem.email = ["jose.valim@gmail.com", "wycats@gmail.com"]
9
- gem.description = %q{Making it easy to serialize models for client-side use}
10
- gem.summary = %q{Bringing consistency and object orientation to model serialization. Works great for client-side MVC frameworks!}
11
- gem.homepage = "https://github.com/rails-api/active_model_serializers"
12
-
13
- gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
14
- gem.files = `git ls-files`.split("\n")
15
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
- gem.name = "active_model_serializers"
17
- gem.require_paths = ["lib"]
18
- gem.version = ActiveModel::Serializer::VERSION
19
-
20
- gem.add_dependency 'activemodel', '>= 3.0'
21
- gem.add_development_dependency "rails", ">= 3.0"
22
- gem.add_development_dependency "pry"
23
- gem.add_development_dependency "minitest"
24
- end
data/bench/perf.rb DELETED
@@ -1,43 +0,0 @@
1
- require "rubygems"
2
- require "bundler/setup"
3
- require "active_model_serializers"
4
- require "active_support/json"
5
- require "benchmark"
6
-
7
- class User < Struct.new(:id,:name,:age,:about)
8
- include ActiveModel::SerializerSupport
9
-
10
- def fast_hash
11
- h = {
12
- id: read_attribute_for_serialization(:id),
13
- name: read_attribute_for_serialization(:name),
14
- about: read_attribute_for_serialization(:about)
15
- }
16
- h[:age] = read_attribute_for_serialization(:age) if age > 18
17
- h
18
- end
19
- end
20
-
21
- class UserSerializer < ActiveModel::Serializer
22
- attributes :id, :name, :age, :about
23
-
24
- def include_age?
25
- object.age > 18
26
- end
27
- end
28
-
29
-
30
-
31
- u = User.new(1, "sam", 10, "about")
32
- s = UserSerializer.new(u)
33
-
34
- n = 100000
35
-
36
- Benchmark.bmbm {|x|
37
- x.report("init") { n.times { UserSerializer.new(u) } }
38
- x.report("fast_hash") { n.times { u.fast_hash } }
39
- x.report("attributes") { n.times { UserSerializer.new(u).attributes } }
40
- x.report("serializable_hash") { n.times { UserSerializer.new(u).serializable_hash } }
41
- }
42
-
43
-
data/cruft.md DELETED
@@ -1,19 +0,0 @@
1
- As of Ruby 1.9.3, it is impossible to dynamically generate a Symbol
2
- through interpolation without generating garbage. Theoretically, Ruby
3
- should be able to take care of this by building up the String in C and
4
- interning the C String.
5
-
6
- Because of this, we avoid generating dynamic Symbols at runtime. For
7
- example, instead of generating the instrumentation event dynamically, we
8
- have a constant with a Hash of events:
9
-
10
- ```ruby
11
- INSTRUMENT = {
12
- :serialize => :"serialize.serializer",
13
- :associations => :"associations.serializer"
14
- }
15
- ```
16
-
17
- If Ruby ever fixes this issue and avoids generating garbage with dynamic
18
- symbols, this code can be removed.
19
-
@@ -1,16 +0,0 @@
1
- # We do not recommend that you use AM::S in this way, but if you must, here
2
- # is a mixin that overrides ActiveRecord::Base#to_json and #as_json.
3
-
4
- module ActiveRecord
5
- module SerializerOverride
6
- def to_json options = {}
7
- active_model_serializer.new(self).to_json options
8
- end
9
-
10
- def as_json options={}
11
- active_model_serializer.new(self).as_json options
12
- end
13
- end
14
-
15
- Base.send(:include, SerializerOverride)
16
- end
@@ -1,13 +0,0 @@
1
- require "rails/generators"
2
- require "rails/generators/rails/resource/resource_generator"
3
-
4
- module Rails
5
- module Generators
6
- ResourceGenerator.class_eval do
7
- def add_serializer
8
- invoke "serializer"
9
- end
10
- end
11
- end
12
- end
13
-
@@ -1,42 +0,0 @@
1
- module Rails
2
- module Generators
3
- class SerializerGenerator < NamedBase
4
- source_root File.expand_path("../templates", __FILE__)
5
- check_class_collision :suffix => "Serializer"
6
-
7
- argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
8
-
9
- class_option :parent, :type => :string, :desc => "The parent class for the generated serializer"
10
-
11
- def create_serializer_file
12
- template 'serializer.rb', File.join('app/serializers', class_path, "#{file_name}_serializer.rb")
13
- end
14
-
15
- private
16
- def generate_id_method
17
- RUBY_VERSION =~ /1\.8/
18
- end
19
-
20
- def attributes_names
21
- [:id] + attributes.select { |attr| !attr.reference? }.map { |a| a.name.to_sym }
22
- end
23
-
24
- def association_names
25
- attributes.select { |attr| attr.reference? }.map { |a| a.name.to_sym }
26
- end
27
-
28
- def parent_class_name
29
- if options[:parent]
30
- options[:parent]
31
- # Only works on 3.2
32
- # elsif (n = Rails::Generators.namespace) && n.const_defined?(:ApplicationSerializer)
33
- # "ApplicationSerializer"
34
- elsif defined?(::ApplicationSerializer)
35
- "ApplicationSerializer"
36
- else
37
- "ActiveModel::Serializer"
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,19 +0,0 @@
1
- <% module_namespacing do -%>
2
- class <%= class_name %>Serializer < <%= parent_class_name %>
3
- attributes <%= attributes_names.map(&:inspect).join(", ") %>
4
- <% association_names.each do |attribute| -%>
5
- has_one :<%= attribute %>
6
- <% end -%>
7
- <% if generate_id_method %>
8
-
9
- # due to the difference between 1.8 and 1.9 with respect to #id and
10
- # #object_id, we recommend that if you wish to serialize id columns, you
11
- # do this. Feel free to remove this if you don't feel that it's appropriate.
12
- #
13
- # For more: https://github.com/rails-api/active_model_serializers/issues/127
14
- def id
15
- object.read_attribute_for_serialization(:id)
16
- end
17
- <% end -%>
18
- end
19
- <% end -%>
@@ -1,75 +0,0 @@
1
- require "test_helper"
2
- require "test_fakes"
3
-
4
- class ArraySerializerTest < ActiveModel::TestCase
5
-
6
- def test_array_items_do_not_have_root
7
- array = [
8
- BasicActiveModel.new(:name => "First model"),
9
- BasicActiveModel.new(:name => "Second model")
10
- ]
11
- expected = { "root" => [
12
- { :name => "First model" },
13
- { :name => "Second model" }
14
- ] }
15
-
16
- default_serializer = array.active_model_serializer.new(array, :root => "root")
17
- each_serializer = array.active_model_serializer.new(array, :root => "root", :each_serializer => BasicSerializer)
18
-
19
- default_json = default_serializer.as_json
20
- each_json = each_serializer.as_json
21
-
22
- assert_equal(expected, default_json)
23
- assert_equal(expected, each_json)
24
- end
25
-
26
- # serialize different typed objects
27
- def test_array_serializer
28
- model = Model.new
29
- user = User.new
30
- comments = Comment.new(:title => "Comment1", :id => 1)
31
-
32
- array = [model, user, comments]
33
- serializer = array.active_model_serializer.new(array, :scope => {:scope => true})
34
- assert_equal([
35
- { :model => "Model" },
36
- { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true },
37
- { :title => "Comment1" }
38
- ], serializer.as_json)
39
- end
40
-
41
- def test_array_serializer_with_root
42
- comment1 = Comment.new(:title => "Comment1", :id => 1)
43
- comment2 = Comment.new(:title => "Comment2", :id => 2)
44
-
45
- array = [ comment1, comment2 ]
46
-
47
- serializer = array.active_model_serializer.new(array, :root => :comments)
48
-
49
- assert_equal({ :comments => [
50
- { :title => "Comment1" },
51
- { :title => "Comment2" }
52
- ]}, serializer.as_json)
53
- end
54
-
55
- def test_array_serializer_with_hash
56
- hash = {:value => "something"}
57
- array = [hash]
58
- serializer = array.active_model_serializer.new(array, :root => :items)
59
- assert_equal({ :items => [ hash.as_json ]}, serializer.as_json)
60
- end
61
-
62
- def test_array_serializer_with_specified_seriailizer
63
- post1 = Post.new(:title => "Post1", :author => "Author1", :id => 1)
64
- post2 = Post.new(:title => "Post2", :author => "Author2", :id => 2)
65
-
66
- array = [ post1, post2 ]
67
-
68
- serializer = array.active_model_serializer.new array, :each_serializer => CustomPostSerializer
69
-
70
- assert_equal([
71
- { :title => "Post1" },
72
- { :title => "Post2" }
73
- ], serializer.as_json)
74
- end
75
- end