Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'master' into beta
Conflicts:
	Gemfile.lock
	VERSION
  • Loading branch information
rwjblue committed Jan 26, 2014
2 parents 361a00e + 4b3f5d3 commit 3d20662
Show file tree
Hide file tree
Showing 35 changed files with 364 additions and 106 deletions.
4 changes: 3 additions & 1 deletion .jshintrc
Expand Up @@ -30,7 +30,9 @@
"async",
"invokeAsync",
"jQuery",
"expectAssertion"
"expectAssertion",
"expectDeprecation"

],

"node" : false,
Expand Down
4 changes: 2 additions & 2 deletions Gemfile.lock
@@ -1,6 +1,6 @@
GIT
remote: https://github.com/emberjs/ember-dev.git
revision: 87bc39887fdd1fb7332bebad0c91b57fedef059f
revision: 605e4c54fc6695d9061bc597d5abc9cf8d1de259
branch: master
specs:
ember-dev (0.1)
Expand Down Expand Up @@ -33,7 +33,7 @@ PATH
GEM
remote: https://rubygems.org/
specs:
aws-sdk (1.31.3)
aws-sdk (1.32.0)
json (~> 1.4)
nokogiri (>= 1.4.4)
uuidtools (~> 2.1)
Expand Down
2 changes: 1 addition & 1 deletion Rakefile
Expand Up @@ -10,7 +10,7 @@ task :docs => "ember:docs"
task :clean => "ember:clean"
task :dist => "ember:dist"
task :test, [:suite] => "ember:test"
task :default => :dist
task :default => :test

task :publish_build => [:dist, :docs, 'ember:generate_static_test_site'] do
root_dir = Pathname.new(__FILE__).dirname
Expand Down
12 changes: 10 additions & 2 deletions packages/activemodel-adapter/lib/initializers.js
@@ -1,10 +1,18 @@
require("ember-data/system/container_proxy");

Ember.onLoad('Ember.Application', function(Application) {
Application.initializer({
name: "activeModelAdapter",

initialize: function(container, application) {
application.register('serializer:_ams', DS.ActiveModelSerializer);
application.register('adapter:_ams', DS.ActiveModelAdapter);
var proxy = new DS.ContainerProxy(container);
proxy.registerDeprecations([
{deprecated: 'serializer:_ams', valid: 'serializer:-active-model'},
{deprecated: 'adapter:_ams', valid: 'adapter:-active-model'}
]);

application.register('serializer:-active-model', DS.ActiveModelSerializer);
application.register('adapter:-active-model', DS.ActiveModelAdapter);
}
});
});
22 changes: 15 additions & 7 deletions packages/activemodel-adapter/lib/system/active_model_adapter.js
Expand Up @@ -7,6 +7,9 @@ require('activemodel-adapter/system/embedded_records_mixin');
*/

var forEach = Ember.EnumerableUtils.forEach;
var decamelize = Ember.String.decamelize,
underscore = Ember.String.underscore,
pluralize = Ember.String.pluralize;

/**
The ActiveModelAdapter is a subclass of the RESTAdapter designed to integrate
Expand Down Expand Up @@ -58,7 +61,7 @@ var forEach = Ember.EnumerableUtils.forEach;
**/

DS.ActiveModelAdapter = DS.RESTAdapter.extend({
defaultSerializer: '_ams',
defaultSerializer: '-active-model',
/**
The ActiveModelAdapter overrides the `pathForType` method to build
underscored URLs by decamelizing and pluralizing the object type name.
Expand All @@ -73,8 +76,9 @@ DS.ActiveModelAdapter = DS.RESTAdapter.extend({
@returns String
*/
pathForType: function(type) {
var decamelized = Ember.String.decamelize(type);
return Ember.String.pluralize(decamelized);
var decamelized = decamelize(type);
var underscored = underscore(decamelized);
return pluralize(underscored);
},

/**
Expand All @@ -97,12 +101,16 @@ DS.ActiveModelAdapter = DS.RESTAdapter.extend({
var error = this._super(jqXHR);

if (jqXHR && jqXHR.status === 422) {
var jsonErrors = Ember.$.parseJSON(jqXHR.responseText)["errors"],
var response = Ember.$.parseJSON(jqXHR.responseText),
errors = {};

forEach(Ember.keys(jsonErrors), function(key) {
errors[Ember.String.camelize(key)] = jsonErrors[key];
});
if (response.errors !== undefined) {
var jsonErrors = response.errors;

forEach(Ember.keys(jsonErrors), function(key) {
errors[Ember.String.camelize(key)] = jsonErrors[key];
});
}

return new DS.InvalidError(errors);
} else {
Expand Down
25 changes: 15 additions & 10 deletions packages/activemodel-adapter/lib/system/active_model_serializer.js
Expand Up @@ -4,8 +4,13 @@ require('ember-data/serializers/rest_serializer');
@module ember-data
*/

var get = Ember.get;
var forEach = Ember.EnumerableUtils.forEach;
var get = Ember.get,
forEach = Ember.EnumerableUtils.forEach,
camelize = Ember.String.camelize,
capitalize = Ember.String.capitalize,
decamelize = Ember.String.decamelize,
singularize = Ember.String.singularize,
underscore = Ember.String.underscore;

DS.ActiveModelSerializer = DS.RESTSerializer.extend({
// SERIALIZE
Expand All @@ -18,7 +23,7 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
@returns String
*/
keyForAttribute: function(attr) {
return Ember.String.decamelize(attr);
return decamelize(attr);
},

/**
Expand All @@ -31,11 +36,11 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
@returns String
*/
keyForRelationship: function(key, kind) {
key = Ember.String.decamelize(key);
key = decamelize(key);
if (kind === "belongsTo") {
return key + "_id";
} else if (kind === "hasMany") {
return Ember.String.singularize(key) + "_ids";
return singularize(key) + "_ids";
} else {
return key;
}
Expand All @@ -56,7 +61,7 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
@param {Object} options
*/
serializeIntoHash: function(data, type, record, options) {
var root = Ember.String.decamelize(type.typeKey);
var root = underscore(decamelize(type.typeKey));
data[root] = this.serialize(record, options);
},

Expand All @@ -72,7 +77,7 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
var key = relationship.key,
belongsTo = get(record, key);
key = this.keyForAttribute(key);
json[key + "_type"] = Ember.String.capitalize(belongsTo.constructor.typeKey);
json[key + "_type"] = capitalize(camelize(belongsTo.constructor.typeKey));
},

// EXTRACT
Expand All @@ -85,8 +90,8 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
@returns String the model's typeKey
*/
typeForRoot: function(root) {
var camelized = Ember.String.camelize(root);
return Ember.String.singularize(camelized);
var camelized = camelize(root);
return singularize(camelized);
},

/**
Expand Down Expand Up @@ -141,7 +146,7 @@ DS.ActiveModelSerializer = DS.RESTSerializer.extend({
var links = data.links;

for (var link in links) {
var camelizedLink = Ember.String.camelize(link);
var camelizedLink = camelize(link);

if (camelizedLink !== link) {
links[camelizedLink] = links[link];
Expand Down
Expand Up @@ -16,16 +16,6 @@ module("integration/active_model_adapter - AMS Adapter", {
}
});

function ajaxResponse(value) {
adapter.ajax = function(url, verb, hash) {
passedUrl = url;
passedVerb = verb;
passedHash = hash;

return Ember.RSVP.resolve(value);
};
}

test('buildURL - decamelizes names', function() {
equal(adapter.buildURL('superUser', 1), "/super_users/1");
});
Expand Down
Expand Up @@ -59,8 +59,8 @@ test("serialize", function() {
var json = env.amsSerializer.serialize(tom);

deepEqual(json, {
first_name: "Tom",
last_name: "Dale",
first_name: "Tom",
last_name: "Dale",
home_planet_id: get(league, "id")
});
});
Expand All @@ -73,21 +73,36 @@ test("serializeIntoHash", function() {

deepEqual(json, {
home_planet: {
name: "Umber"
name: "Umber"
}
});
});

test("serializeIntoHash with decamelized types", function() {
HomePlanet.typeKey = 'home-planet';
league = env.store.createRecord(HomePlanet, { name: "Umber", id: "123" });
var json = {};

env.amsSerializer.serializeIntoHash(json, HomePlanet, league);

deepEqual(json, {
home_planet: {
name: "Umber"
}
});
});


test("normalize", function() {
var superVillain_hash = {first_name: "Tom", last_name: "Dale", home_planet_id: "123", evil_minion_ids: [1,2]};

var json = env.amsSerializer.normalize(SuperVillain, superVillain_hash, "superVillain");

deepEqual(json, {
firstName: "Tom",
lastName: "Dale",
firstName: "Tom",
lastName: "Dale",
homePlanet: "123",
evilMinions: [1,2]
evilMinions: [1,2]
});
});

Expand Down Expand Up @@ -158,12 +173,22 @@ test("serialize polymorphic", function() {
var json = env.amsSerializer.serialize(ray);

deepEqual(json, {
name: "DeathRay",
name: "DeathRay",
evil_minion_type: "YellowMinion",
evil_minion_id: "124"
});
});

test("serialize polymorphic when type key is not camelized", function() {
YellowMinion.typeKey = 'yellow-minion';
var tom = env.store.createRecord(YellowMinion, {name: "Alex", id: "124"});
var ray = env.store.createRecord(DoomsdayDevice, {evilMinion: tom, name: "DeathRay"});

var json = env.amsSerializer.serialize(ray);

deepEqual(json["evil_minion_type"], "YellowMinion");
});

test("extractPolymorphic hasMany", function() {
env.container.register('adapter:yellowMinion', DS.ActiveModelAdapter);
MediocreVillain.toString = function() { return "MediocreVillain"; };
Expand Down
@@ -0,0 +1,22 @@
var env, store, adapter;
module("unit/adapter/path_for_type - DS.ActiveModelAdapter#pathForType", {
setup: function() {
env = setupStore({
adapter: DS.ActiveModelAdapter
});

adapter = env.adapter;
}
});

test('pathForType - works with camelized types', function() {
equal(adapter.pathForType('superUser'), "super_users");
});

test('pathForType - works with dasherized types', function() {
equal(adapter.pathForType('super-user'), "super_users");
});

test('pathForType - works with underscored types', function() {
equal(adapter.pathForType('super_user'), "super_users");
});
13 changes: 7 additions & 6 deletions packages/ember-data/lib/adapters/rest_adapter.js
Expand Up @@ -109,7 +109,7 @@ var forEach = Ember.ArrayPolyfills.forEach;
@extends DS.Adapter
*/
DS.RESTAdapter = DS.Adapter.extend({
defaultSerializer: '_rest',
defaultSerializer: '-rest',


/**
Expand Down Expand Up @@ -167,7 +167,7 @@ DS.RESTAdapter = DS.Adapter.extend({
The `find` method makes an Ajax request to a URL computed by `buildURL`, and returns a
promise for the resulting payload.
This method performs an HTTP `GET` request with the id provided as part of the querystring.
This method performs an HTTP `GET` request with the id provided as part of the query string.
@method find
@param {DS.Store} store
Expand Down Expand Up @@ -497,11 +497,12 @@ DS.RESTAdapter = DS.Adapter.extend({
@returns {String} path
**/
pathForType: function(type) {
return Ember.String.pluralize(type);
var camelized = Ember.String.camelize(type);
return Ember.String.pluralize(camelized);
},

/**
Takes an ajax response, and returns a relavant error.
Takes an ajax response, and returns a relevant error.
Returning a `DS.InvalidError` from this method will cause the
record to transition into the `invalid` state and make the
Expand Down Expand Up @@ -562,7 +563,7 @@ DS.RESTAdapter = DS.Adapter.extend({
@method ajax
@private
@param {String} url
@param {String} type The request type GET, POST, PUT, DELETE ect.
@param {String} type The request type GET, POST, PUT, DELETE etc.
@param {Object} hash
@return {Promise} promise
*/
Expand All @@ -588,7 +589,7 @@ DS.RESTAdapter = DS.Adapter.extend({
@method ajaxOptions
@private
@param {String} url
@param {String} type The request type GET, POST, PUT, DELETE ect.
@param {String} type The request type GET, POST, PUT, DELETE etc.
@param {Object} hash
@return {Object} hash
*/
Expand Down

0 comments on commit 3d20662

Please sign in to comment.