Commit Graph

64 Commits

Author SHA1 Message Date
Benjamin Fleischer
af99c0d9e6 Ensure inheritance hooks run
I was seeing transient failures where adapters may not be registered.

e.g. https://travis-ci.org/rails-api/active_model_serializers/builds/77735382

Since we're using the Adapter, JsonApi, and Json classes
as namespaces, some of the conventions we use for modules don't apply.
Basically, we don't want to define the class anywhere besides itself.
Otherwise, the inherited hooks may not run, and some adapters may not
be registered.

For example:

If we have a class Api `class Api; end`
And Api is also used as a namespace for `Api::Product`
And the classes are defined in different files.

In one file:

```ruby
class Api
  autoload :Product
  def self.inherited(subclass)
    puts
    p [:inherited, subclass.name]
    puts
  end
end
```

And in another:

```ruby
class Api
  class Product < Api
    def sell_sell_sell!
      # TODO: sell
    end
  end
end
```

If we load the Api class file first, the inherited hook will be defined on the class
so that when we load the Api::Product class, we'll see the output:

```plain
[ :inherited, Api::Product]
```

However, if we load the Api::Product class first, since it defines the `Api` class
and then inherited from it, the Api file was never loaded, the hook never defined,
and thus never run.

By defining the class as `class Api::Product < Api` We ensure the the Api class
MUST be defined, and thus, the hook will be defined and run and so sunshine and unicorns.

Appendix:

The below would work, but triggers a circular reference warning.
It's also not recommended to mix require with autoload.

```ruby
require 'api'
class Api
  class Product < Api
    def sell_sell_sell!
      # TODO: sell
    end
  end
end
```

This failure scenario was introduced by removing the circular reference warnings in
https://github.com/rails-api/active_model_serializers/pull/1067

Style note:

To make diffs on the adapters smalleer and easier to read, I've maintained the same
identention that was in the original file.  I've decided to prefer ease of reading
the diff over style, esp. since we may later return to the preferred class declaration style.

 with '#' will be ignored, and an empty message aborts the commit.
2015-09-09 08:55:20 -05:00
Lucas Hosseini
ebb05959d3 Merge remote-tracking branch 'upstream/master' into improve-tests 2015-09-07 09:03:17 +02:00
Benjamin Fleischer
228cc1c92a Rubocop: Consistent spacing 2015-09-03 20:51:40 -05:00
Benjamin Fleischer
bdfe13c527 Style/StringLiterals single quote all the things 2015-09-03 20:50:45 -05:00
Benjamin Fleischer
09c97de90d Add Style enforcer (via Rubocop)
It will fail the build, but as it is currently,
most of the cops are 'todos'. Great for new contributors.. :)
2015-09-03 20:50:45 -05:00
Lucas Hosseini
4bba16bf4e Factor with_adapter + force cache clear before each test. 2015-08-28 17:00:24 +02:00
Benjamin Fleischer
d315151e8a Fix warnings
JRuby-specific: fix 'warning: (...) interpreted as grouped expression'
2015-08-26 09:22:02 -05:00
Bruno Bacarini
5031eb9f96 add test to prev and first with additional params 2015-08-18 19:04:04 -03:00
Bruno Bacarini
2c2f948fa0 Add pagination links automatically
Pagination links will be included in your response automatically as long
as the resource is paginated using Kaminari or WillPaginate
and if you are using a JSON-API adapter. The others adapters does not have this feature.
2015-08-18 19:04:04 -03:00
Bruno Bacarini
a41d90cce4 add self to pagination links 2015-08-18 19:04:04 -03:00
Bruno Bacarini
7be25fef14 include query_parameters on pagination links as well 2015-08-18 19:04:03 -03:00
Bruno Bacarini
e62a7d6f34 return complete URIs on pagination links 2015-08-18 19:04:03 -03:00
Bruno Bacarini
e040d6fcce add action test to pagination links 2015-08-18 19:04:02 -03:00
João M. D. Moura
88eabdf6ac fixing tests by using a Profile intance to avoid unrelated warning 2015-07-31 03:28:50 -03:00
Benjamin Fleischer
df140293d3 Remove unused controller rescue_with_handler
Per
https://github.com/rails-api/active_model_serializers/pull/954#discussion_r32589882

Ref 917, 918
2015-07-23 11:06:11 -05:00
Benjamin Fleischer
a66df3009a Encapsulate serialization in ActiveModel::SerializableResource
Usage: ActiveModel::SerializableResource.serialize(resource, options)
2015-07-23 11:05:23 -05:00
vyrak bunleang
1d31096600 include old implicit serialization custom root tests with failing empty array test 2015-07-16 15:32:09 -06:00
Rodrigo Ra
7412c8d1c8 Fix transient tests failures 2015-06-26 09:33:53 -03:00
João Moura
d589268f95 adding new tests to cover array and object rendering 2015-06-26 02:15:42 -03:00
Aaron Lerch
6892ca39c9 Default the generated cache key to use custom #strftime instead of raw #to_s to achieve more accurate precision 2015-06-25 23:40:18 -04:00
João Moura
f67fd976ec Removing/Updating tests based on new FlattenJson adapter 2015-06-18 19:18:11 -03:00
João Moura
329691276a disabling custom root option 2015-06-15 15:58:39 -03:00
João Moura
1ea5608e78 updating tests to match new adapters structure 2015-06-15 13:39:36 -03:00
Benjamin Fleischer
14439aada4 Use model that doesn't fail with race condition
For some reason, the post would sometimes be serialized as

  "{\"id\":\"1\",
+ \"type\":\"posts\", \"attributes\":{\"title\":\"New Post\",\"body\":\"Body\"},
  \"comments\":[{\"id\":1,\"body\":\"ZOMG A COMMENT\"}],
  \"blog\":{\"id\":999,\"name\":\"Custom blog\"},
  \"author\":{\"id\":1,\"name\":\"Joao Moura.\"}}"

instead of:

  "{\"id\":1,
-  \"title\":\"New Post\",\"body\":\"Body\",
   \"comments\":[{\"id\":1,\"body\":\"ZOMG A COMMENT\"}],
   \"blog\":{\"id\":999,\"name\":\"Custom blog\"},\
   "author\":{\"id\":1,\"name\":\"Joao Moura.\"}}"

To reproduce prior to this PR:
SEED=55284 rake
  1) Failure:
  ActionController::Serialization::ExplicitSerializerTest#test_render_using_explicit_each_serializer
  [active_model_serializers/test/action_controller/explicit_serializer_test.rb:139]:
  --- expected
  +++ actual
  @@ -1 +1 @@
  -"{\"id\":1,\"title\":\"New
  Post\",\"body\":\"Body\",\"comments\":[{\"id\":1,\"body\":\"ZOMG A
  COMMENT\"}],\"blog\":{\"id\":999,\"name\":\"Custom
  blog\"},\"author\":{\"id\":1,\"name\":\"Joao Moura.\"}}"
  +"{\"id\":\"1\",\"type\":\"posts\",\"attributes\":{\"title\":\"New
  Post\",\"body\":\"Body\"},\"comments\":[{\"id\":1,\"body\":\"ZOMG A
  COMMENT\"}],\"blog\":{\"id\":999,\"name\":\"Custom
  blog\"},\"author\":{\"id\":1,\"name\":\"Joao Moura.\"}}"

  137 runs, 211 assertions, 1 failures, 0 errors, 0 skips
  rake aborted!
  Command failed with status (1): [ruby -I"lib:test"
  -r./test/test_helper.rb
  "/$HOME/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/rake/rake_test_loader.rb"
  "test/action_controller/adapter_selector_test.rb"
  "test/action_controller/explicit_serializer_test.rb"
  "test/action_controller/json_api_linked_test.rb"
  "test/action_controller/rescue_from_test.rb"
  "test/action_controller/serialization_scope_name_test.rb"
  "test/action_controller/serialization_test.rb"
  "test/adapter/fragment_cache_test.rb"
  "test/adapter/json/belongs_to_test.rb"
  "test/adapter/json/collection_test.rb"
  "test/adapter/json/has_many_test.rb"
  "test/adapter/json_api/belongs_to_test.rb"
  "test/adapter/json_api/collection_test.rb"
  "test/adapter/json_api/has_many_embed_ids_test.rb"
  "test/adapter/json_api/has_many_explicit_serializer_test.rb"
  "test/adapter/json_api/has_many_test.rb"
  "test/adapter/json_api/has_one_test.rb"
  "test/adapter/json_api/linked_test.rb" "test/adapter/json_test.rb"
  "test/adapter/null_test.rb" "test/adapter_test.rb"
  "test/array_serializer_test.rb" "test/serializers/adapter_for_test.rb"
  "test/serializers/associations_test.rb"
  "test/serializers/attribute_test.rb"
  "test/serializers/attributes_test.rb" "test/serializers/cache_test.rb"
  "test/serializers/configuration_test.rb"
  "test/serializers/fieldset_test.rb"
  "test/serializers/generators_test.rb" "test/serializers/meta_test.rb"
  "test/serializers/options_test.rb"
  "test/serializers/serializer_for_test.rb"
  "test/serializers/urls_test.rb" ]
  /$HOME/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in
  `eval'
  /$HOME/.rvm/gems/ruby-2.2.2/bin/ruby_executable_hooks:15:in
  `<main>'
  Tasks: TOP => default => test
  (See full trace by running task with --trace)
2015-06-12 11:27:28 -05:00
Benjamin Fleischer
a5554e0d9f Use a different controller in different tests
A number of test were defining and using the same controller
MyController = Class.new(ActionController::Base)
which was causing some state to leak across tests.
2015-06-12 11:27:20 -05:00
Edward Loveall
0f0ef2baf5 Don't pass serializer option to associated serializers
Fixes #870

Commit af81a40 introduced passing a serializer's 'options'
along to its associated model serializers.

Thus, an explicit 'each_serializer' passed to render for a
singular resource would be passed on as the implicit 'serializer'
for its associations.

With @bf4
2015-06-10 18:20:34 -04:00
Chris Branson
d34bba07b9 Ensure the adapters honor a custom root option and include meta when required 2015-06-04 17:33:41 +01:00
João Moura
a40df8fd3d reverting PR #909 and adding json api usage advise on readme 2015-05-27 18:35:00 -03:00
Benedikt Deicke
4f576a1463 Adjusts JsonApi adapter to serialize relationships in a nested relationships hash 2015-05-21 16:35:35 +02:00
Benedikt Deicke
ca41901fb8 Adjusts JsonApi adapter to serialize attributes in a nested attributes hash 2015-05-21 16:23:01 +02:00
João Moura
5f05944826 Merge pull request #918 from aceofsales/rescue_from
Adding rescue_with_handler to clear state
2015-05-20 23:39:45 -03:00
Ryan Schlesinger
9355416ad0 Add rescue_from handler to clear state
Fixes #917
2015-05-19 17:23:29 -07:00
João Moura
9b502a4ae0 changing tests name to support new default adapter 2015-05-11 16:23:38 -03:00
João Moura
fc6276cab8 Merge pull request #888 from groyoh/fix-action-controller-test-name
Changed duplicated test name in action controller test
2015-04-28 12:09:02 -03:00
groyoh
1ef2badb32 Changed duplicated test name in action controller test 2015-04-27 21:22:28 +02:00
João Moura
49e41cb83c adding tests order config 2015-04-27 15:45:49 -03:00
João Moura
792fb8a905 Adding Fragment Cache to AMS
It's an upgrade based on the new Cache implementation #693.
It allows to use the Rails conventions to cache
specific attributes or associations.
It's based on the Cache Composition implementation.
2015-04-05 18:19:57 -03:00
Mateo Murphy
9480b567ef Refactor TestUser in SerializationScopeNameTest
Use the same base class we use for other test models
2015-03-23 13:44:30 -04:00
Mateo Murphy
33f3a88ba0 Implement included and id and type as per spec 2015-03-22 20:43:56 -04:00
Mateo Murphy
d82c599c68 Always use plural for linked types
Although spec is agnostic about inflection rules, examples given are plural
2015-03-22 20:43:11 -04:00
Mateo Murphy
0f55f21266 Update format of links 2015-03-22 20:41:20 -04:00
Mateo Murphy
da86747a3e Use symbol for root in jsonapi, fix tests 2015-03-22 20:38:29 -04:00
Guillermo Iguaran
b68d7f4826 Merge pull request #852 from mateomurphy/serializer-options-fix
Fix options merge order in `each_association`
2015-03-22 18:54:07 -05:00
Mateo Murphy
03372ea61d Fix options merge order in each_association
Custom association serializers were getting clobbered when using an each serializer.
2015-03-20 00:22:46 -04:00
Mateo Murphy
ca985e1afd Use association value for determining serializer used
Ensures overridden association value works when orignal association does not return a result.
2015-03-19 23:28:00 -04:00
Robbie Pitts
ad5677c4ec Make json api adapter 'include' option accept an array, accommodate comma delimited string for legacy reasons 2015-03-11 10:01:44 -04:00
Mateo Murphy
232e367560 Add serialization_scope_name_test 2015-02-12 17:48:43 -05:00
Joao Moura
8a432ad2b3 Adding cache support to version 0.10.0
It's a new implementation of cache based on ActiveSupport::Cache.
The implementation abstracts the cache in Adapter class on a
private method called cached_object, this method is intended
to be used on Adapters inside serializable_hash method in order
to cache each instance of the object that will be returned by
the serializer.

Some of its features are:
- A different syntax. (no longer need the cache_key method).
- An options argument that have the same arguments of ActiveSupport::Cache::Store, plus a key option that will be the prefix of the object cache on a pattern "#{key}-#{object.id}".
- It cache the objects individually and not the whole Serializer return, re-using it in different requests (as a show and a index method for example.)
2015-02-02 14:53:34 -02:00
Alexandre de Oliveira
e47231cdc8 Support overriding association methods
You can override associations to define custom scope on them.
2015-01-29 16:52:18 -02:00
Nicolás Hock Isaza
1d7d9fd6aa Fix nested include attributes
When the requests asked for a nested attribute in the `include` and it's
missing or empty, don't break because the type of the object can't be
determined.

If the request is for a collection and none of the elements has the
attribute, it will not be added to the `linked` key, similar to what
happens with simple includes.
2015-01-13 14:49:58 -05:00