Skip to content

Commit

Permalink
Merge pull request #3143 from emberjs/serializer-refactor
Browse files Browse the repository at this point in the history
Refactor the Serializer API
  • Loading branch information
wecc committed Jun 5, 2015
2 parents 8b69971 + 3313864 commit 4f0176f
Show file tree
Hide file tree
Showing 20 changed files with 3,652 additions and 284 deletions.
3 changes: 3 additions & 0 deletions FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@ entry in `config/features.json`.

## Feature Flags

* `ds-new-serializer-api`

Activates the new Serializer API for default serializers.
1 change: 1 addition & 0 deletions config/features.json
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
{
"ds-new-serializer-api": null
}
15 changes: 13 additions & 2 deletions packages/activemodel-adapter/lib/system/active-model-serializer.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,19 @@ var ActiveModelSerializer = RESTSerializer.extend({
}
},

/**
`keyForLink` can be used to define a custom key when deserializing link
properties. The `ActiveModelSerializer` camelizes link keys by default.
@method keyForLink
@param {String} key
@param {String} kind `belongsTo` or `hasMany`
@return {String} normalized key
*/
keyForLink: function(key, relationshipKind) {
return camelize(key);
},

/*
Does not serialize hasMany relationships by default.
*/
Expand Down Expand Up @@ -205,10 +218,8 @@ var ActiveModelSerializer = RESTSerializer.extend({
@param {String} prop
@return Object
*/

normalize: function(typeClass, hash, prop) {
this.normalizeLinks(hash);

return this._super(typeClass, hash, prop);
},

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
var SuperVillain, EvilMinion, YellowMinion, DoomsdayDevice, MediocreVillain, TestSerializer, env;
var run = Ember.run;

module("integration/active_model - AMS-namespaced-model-names (new API)", {
setup: function() {
SuperVillain = DS.Model.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
evilMinions: DS.hasMany("evilMinion")
});

EvilMinion = DS.Model.extend({
superVillain: DS.belongsTo('superVillain'),
name: DS.attr('string')
});
YellowMinion = EvilMinion.extend();
DoomsdayDevice = DS.Model.extend({
name: DS.attr('string'),
evilMinion: DS.belongsTo('evilMinion', { polymorphic: true })
});
MediocreVillain = DS.Model.extend({
name: DS.attr('string'),
evilMinions: DS.hasMany('evilMinion', { polymorphic: true })
});
TestSerializer = DS.ActiveModelSerializer.extend({
isNewSerializerAPI: true
});
env = setupStore({
superVillain: SuperVillain,
evilMinion: EvilMinion,
'evilMinions/yellowMinion': YellowMinion,
doomsdayDevice: DoomsdayDevice,
mediocreVillain: MediocreVillain
});
env.store.modelFor('superVillain');
env.store.modelFor('evilMinion');
env.store.modelFor('evilMinions/yellowMinion');
env.store.modelFor('doomsdayDevice');
env.store.modelFor('mediocreVillain');
env.registry.register('serializer:application', TestSerializer);
env.registry.register('serializer:-active-model', TestSerializer);
env.registry.register('adapter:-active-model', TestSerializer);
env.amsSerializer = env.container.lookup("serializer:-active-model");
env.amsAdapter = env.container.lookup("adapter:-active-model");
},

teardown: function() {
run(env.store, 'destroy');
}
});

if (Ember.FEATURES.isEnabled('ds-new-serializer-api')) {

test("extractPolymorphic hasMany", function() {
var json_hash = {
mediocre_villain: { id: 1, name: "Dr Horrible", evil_minion_ids: [{ type: "EvilMinions::YellowMinion", id: 12 }] },
"evil-minions/yellow-minion": [{ id: 12, name: "Alex", doomsday_device_ids: [1] }]
};
var json;

run(function() {
json = env.amsSerializer.normalizeResponse(env.store, MediocreVillain, json_hash, '1', 'find');
});

deepEqual(json, {
"data": {
"id": "1",
"type": "mediocre-villain",
"attributes": {
"name": "Dr Horrible"
},
"relationships": {
"evilMinions": {
"data": [
{ "id": "12", "type": "evil-minions/yellow-minion" }
]
}
}
},
"included": [{
"id": "12",
"type": "evil-minions/yellow-minion",
"attributes": {
"name": "Alex"
},
"relationships": {}
}]
});
});

test("extractPolymorphic belongsTo", function() {
var json_hash = {
doomsday_device: { id: 1, name: "DeathRay", evil_minion_id: { type: "EvilMinions::YellowMinion", id: 12 } },
"evil-minions/yellow-minion": [{ id: 12, name: "Alex", doomsday_device_ids: [1] }]
};
var json;

run(function() {
json = env.amsSerializer.normalizeResponse(env.store, DoomsdayDevice, json_hash, '1', 'find');
});

deepEqual(json, {
"data": {
"id": "1",
"type": "doomsday-device",
"attributes": {
"name": "DeathRay"
},
"relationships": {
"evilMinion": {
"data": { "id": "12", "type": "evil-minions/yellow-minion" }
}
}
},
"included": [{
"id": "12",
"type": "evil-minions/yellow-minion",
"attributes": {
"name": "Alex"
},
"relationships": {}
}]
});
});

}
Loading

0 comments on commit 4f0176f

Please sign in to comment.