From 33dfcc0973c5f56dd909e9b5cf61a354fd11ab95 Mon Sep 17 00:00:00 2001 From: Matthew Marcum Date: Wed, 10 Dec 2014 11:24:26 -0600 Subject: [PATCH] added debug adapter to support ember inspector, updated http-mock and pretender --- addon/debug-adapter.js | 62 +++++++++++++++++++++++ addon/initializers/sl-ember-store.js | 3 ++ package.json | 5 +- server/index.js | 24 +++++---- tests/dummy/app/initializers/pretender.js | 11 +++- 5 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 addon/debug-adapter.js diff --git a/addon/debug-adapter.js b/addon/debug-adapter.js new file mode 100644 index 0000000..b389b0f --- /dev/null +++ b/addon/debug-adapter.js @@ -0,0 +1,62 @@ +import Model from "./model"; + +export default Ember.DataAdapter.extend({ + + detect: function(klass) { + return klass !== Model && Model.detect(klass); + }, + + columnsForType: function( type ) { + var columns = [], + type = type._debugContainerKey.replace( 'model:',''), + record = this.get( 'store' )._cache._getRecords( type ).records[0]; + + if( record ){ + Ember.keys( record.content ).forEach( function( key ){ + columns.push( { name: key, desc: key }); + }); + } + + return columns; + }, + + getRecords: function( type ){ + var type = type._debugContainerKey.replace( 'model:',''); + return this.get( 'store' )._cache._getRecords( type ).records; + }, + + getRecordColumnValues: function( record ){ + var values = {}; + + if( record ){ + Ember.keys( record.content ).forEach( function( key ){ + values[ key ] = Ember.get( record, key ); + }); + } + + return values; + }, + + observeRecord: function( record, recordUpdated ){ + var releaseMethods = Ember.A(), + self = this, + keysToObserve = Ember.keys( record.content ); + + keysToObserve.forEach(function(key) { + var handler = function() { + recordUpdated(self.wrapRecord(record)); + }; + Ember.addObserver(record, key, handler); + releaseMethods.push(function() { + Ember.removeObserver(record, key, handler); + }); + }); + + var release = function() { + releaseMethods.forEach(function(fn) { fn(); } ); + }; + + return release; + } + +}); \ No newline at end of file diff --git a/addon/initializers/sl-ember-store.js b/addon/initializers/sl-ember-store.js index f0f0d29..a548e33 100755 --- a/addon/initializers/sl-ember-store.js +++ b/addon/initializers/sl-ember-store.js @@ -1,6 +1,7 @@ import Store from '../store'; import AjaxAdapter from '../adapters/ajax'; import LocalstorageAdapter from '../adapters/localstorage'; +import DebugAdapter from '../debug-adapter'; /** * @module initializers @@ -21,6 +22,7 @@ export default function( container, application ) { namespace: container.lookup( 'application:main' ).get( 'modulePrefix' ) }); + container.register( 'data-adapter:main', DebugAdapter ); container.register( 'store:main', Store ); container.register( 'adapter:ajax', AjaxAdapter ); container.register( 'adapter:localstorage', localstorageAdapter ); @@ -28,4 +30,5 @@ export default function( container, application ) { application.inject( 'controller', 'store', 'store:main' ); application.inject( 'route', 'store', 'store:main' ); application.inject( 'adapter', 'store', 'store:main' ); + application.inject( 'data-adapter', 'store', 'store:main' ); } \ No newline at end of file diff --git a/package.json b/package.json index 43ff8ca..48f546e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "broccoli-asset-rev": "^1.0.0", "broccoli-ember-hbs-template-compiler": "^1.6.1", "broccoli-static-compiler": "~0.2.1", - "connect-restreamer": "~1.0.1", + "connect-restreamer": "^1.0.1", "ember-cli": "0.1.4", "ember-cli-dependency-checker": "0.0.6", "ember-cli-ic-ajax": "0.1.1", @@ -34,7 +34,8 @@ "ember-cli-qunit": "0.1.2", "ember-export-application-global": "^1.0.0", "express": "^4.8.5", - "glob": "^4.0.5" + "glob": "^4.0.5", + "morgan": "^1.5.0" }, "ember-addon": { "configPath": "tests/dummy/config" diff --git a/server/index.js b/server/index.js index 49a4bff..338300d 100644 --- a/server/index.js +++ b/server/index.js @@ -1,20 +1,22 @@ +// To use it create some files under `routes/` +// e.g. `server/routes/ember-hamsters.js` +// +// module.exports = function(app) { +// app.get('/ember-hamsters', function(req, res) { +// res.send('hello'); +// }); +// }; + module.exports = function(app) { var globSync = require('glob').sync; - var bodyParser = require('body-parser'); var mocks = globSync('./mocks/**/*.js', { cwd: __dirname }).map(require); var proxies = globSync('./proxies/**/*.js', { cwd: __dirname }).map(require); - app.use(bodyParser.json()); - app.use(bodyParser.urlencoded({ - extended: true - })); + // Log proxy requests + var morgan = require('morgan'); + app.use(morgan('dev')); mocks.forEach(function(route) { route(app); }); - - // proxy expects a stream, but express will have turned - // the request stream into an object because bodyParser - // has run. We have to convert it back to stream: - // https://github.com/nodejitsu/node-http-proxy/issues/180 - app.use(require('connect-restreamer')()); proxies.forEach(function(route) { route(app); }); + }; diff --git a/tests/dummy/app/initializers/pretender.js b/tests/dummy/app/initializers/pretender.js index b38e6b0..f2af15e 100755 --- a/tests/dummy/app/initializers/pretender.js +++ b/tests/dummy/app/initializers/pretender.js @@ -47,7 +47,16 @@ export function initialize(/* container, application */) { { "Content-Type":"application/json" }, JSON.stringify( fooRecords ) ]; - }); + }); + this.post( '/foo', function(request){ + var record = JSON.parse( request.requestBody ); + fooRecords[ record.id ]= record; + return [ + 200, + { "Content-Type":"application/json" }, + JSON.stringify( record ) + ]; + }); }); }