Commit Graph

31 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
Benjamin Fleischer
d9e76c29d5 Make Adapters registerable so they are not namespace-constrained
Changes:

- Introduce Adapter::get for use by Serializer.adapter
- Move Adapter-finding logic from Adapter::adapter_class into Adapter::get

Introduced interfaces:

- non-inherited methods
```ruby
ActiveModel::Serializer::Adapter.adapter_map     # a Hash<adapter_name, adapter_class>
ActiveModel::Serializer::Adapter.adapters        # an Array<adapter_name>
ActiveModel::Serializer::Adapter.register(name, klass) # adds an adapter to the adapter_map
ActiveModel::Serializer::Adapter.get(name_or_klass)    # raises Argument error when adapter not found
```

- Automatically register adapters when subclassing

```ruby
      def self.inherited(subclass)
        ActiveModel::Serializer::Adapter.register(subclass.to_s.demodulize, subclass)
      end
```

- Preserves subclass method `::adapter_class(adapter)`

```ruby
      def self.adapter_class(adapter)
        ActiveModel::Serializer::Adapter.get(adapter)
      end
```

- Serializer.adapter now uses `Adapter.get(config.adapter)` rather than have duplicate logic
2015-09-08 22:59:36 -05:00
Lucas Hosseini
ebb05959d3 Merge remote-tracking branch 'upstream/master' into improve-tests 2015-09-07 09:03:17 +02:00
Benjamin Fleischer
94469be1ca Add test coverage; account for no artifacts on CI
Drop coverage a bit for JRuby and Rubinius because they
don't generate the same Coverage as CRuby
2015-09-06 09:19:07 -05: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
Lucas Hosseini
b6b8dff8c9 Merge remote-tracking branch 'upstream/master' into improve-tests 2015-09-01 21:25:28 +02:00
Lucas Hosseini
d0d00d02a0 Add ActiveRecord-backed fixtures. 2015-08-31 05:11:32 +02: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
Benjamin Fleischer
9aad8b4d29 Cleanup CaptureWarnings after_run 2015-08-26 09:19:36 -05:00
Benjamin Fleischer
530a1bdfd7 Compartmentalize test helper support 2015-08-26 09:19:36 -05:00
João Moura
b78126565c Merge pull request #954 from bf4/encapsulate_serialization
Encapsulate serialization in ActiveModel::SerializableResource
2015-07-31 03:09:58 -03:00
Benjamin Fleischer
a66df3009a Encapsulate serialization in ActiveModel::SerializableResource
Usage: ActiveModel::SerializableResource.serialize(resource, options)
2015-07-23 11:05:23 -05:00
Benjamin Fleischer
e7174a7820 Capture and print app warnings on test run
Configure not to fail the test, for now
2015-07-14 01:05:26 -05:00
Rodrigo Ra
7412c8d1c8 Fix transient tests failures 2015-06-26 09:33:53 -03:00
Santiago Pastorino
460150fef2 Fix No such file or directory tmp/cache issue in tests 2015-06-10 21:23:23 -03:00
Santiago Pastorino
4752e6723a Make resource generator invoke serializer generator 2015-06-10 20:45:33 -03:00
Santiago Pastorino
e117615465 This should be MAJOR >= 4 2015-06-10 20:26:37 -03:00
Santiago Pastorino
3fb55db1cd Load generators on test_helper and avoid repetead code 2015-06-10 20:26:37 -03:00
Justin Aiken
cf1c57d2a9 Remove unused method 2015-04-27 16:53:36 -06:00
João Moura
49e41cb83c adding tests order config 2015-04-27 15:45:49 -03: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
Tema Bolshakov
b4a313e6d8 Merge remote-tracking branch 'upstream/master' into feature/adapter 2014-08-29 12:55:20 +04:00
Tema Bolshakov
597765e3b0 start implementing json_api adapter to understand how associations should work 2014-08-28 18:55:27 +04:00
Arthur Neves
c8d9ee4ae3
Fix rails 4.0.x build 2014-08-27 10:53:34 -04:00
Steve Klabnik
970b542549 Implement basic rendering
Woo actioncontroller
2014-07-09 17:52:31 -04:00
Steve Klabnik
729a823868 Getting started: attributes.
Super super basic collection of attributes. Nothing fancy.
2014-07-09 16:16:39 -04:00
Steve Klabnik
4fc0f679df Add generators.
This seemed like the easiest place to start.
2014-07-05 12:35:29 -04:00
Steve Klabnik
a5107b32e2 Set up the test helper and Gemfile.
Now Travis will build across all the Rails-es.
2014-07-05 12:03:48 -04:00
Steve Klabnik
99e3d0f70b Set up minitest 2014-07-05 11:55:45 -04:00