From 8b4da9e5e9b8c15957f5bc3792574fab323b9964 Mon Sep 17 00:00:00 2001 From: Anatoliy Chakkaev <anatoliy.chakkaev@flatsoft.com> Date: Mon, 29 Oct 2012 03:21:51 +0400 Subject: [PATCH] Remove globals, read yaml --- index.js | 11 ++++--- lib/railway.js | 86 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 63 insertions(+), 34 deletions(-) diff --git a/index.js b/index.js index bbc8d8bf..a986ba30 100644 --- a/index.js +++ b/index.js @@ -5,10 +5,13 @@ exports.Schema = require('./lib/schema').Schema; exports.AbstractClass = require('./lib/abstract-class').AbstractClass; exports.Validatable = require('./lib/validatable').Validatable; -exports.init = function (root) { - if (!global.railway) return; - railway.orm = exports; - require('./lib/railway')(root); +exports.init = function (rw) { + if (global.railway) { + railway.orm = exports; + } else { + rw.orm = {Schema: exports.Schema, AbstractClass: exports.AbstractClass}; + } + require('./lib/railway')(rw); }; try { diff --git a/lib/railway.js b/lib/railway.js index 907bc093..d391c9be 100644 --- a/lib/railway.js +++ b/lib/railway.js @@ -1,36 +1,57 @@ var fs = require('fs'); var path = require('path'); -var Schema = railway.orm.Schema; +var Schema = require('./schema').Schema; var existsSync = fs.existsSync || path.existsSync; -railway.orm._schemas = []; - -module.exports = function init(root) { - -var confFile = (root || app.root) + '/config/database.json'; -var config; - -if (existsSync(confFile)) { - try { - config = JSON.parse(fs.readFileSync(confFile, 'utf-8'))[app.set('env')]; - // when driver name started with point - look for driver in app root (relative path) - if (config.driver && config.driver.match(/^\./)) { - config.driver = path.join(app.root, config.driver); - } - } catch (e) { - console.log('Could not parse config/database.json'); - throw e; - } -} else { - config = {}; +if (global.railway) { + railway.orm._schemas = []; } -var schema = new Schema(config && config.driver || 'memory', config); -schema.log = log; -railway.orm._schemas.push(schema); +module.exports = function init(root) { + var railway, app; -context = prepareContext(schema); + if (typeof root !== 'object' || root.constructor.name !== 'Railway') { + railway = global.railway; + app = global.app; + railway.models = app.models; + } else { + railway = root; + app = railway.app; + root = railway.root; + } + + railway.orm._schemas = []; + + var confFile = (root || app.root) + '/config/database'; + var config; + + if (existsSync(confFile + '.json')) { + try { + config = JSON.parse(fs.readFileSync(confFile + '.json', 'utf-8'))[app.set('env')]; + } catch (e) { + console.log('Could not parse config/database.json'); + throw e; + } + } else if (existsSync(confFile + '.yml')) { + try { + config = railway.utils.readYaml(confFile + '.yml')[app.set('env')]; + } catch (e) { + console.log('Could not parse config/database.yml'); + throw e; + } + config = {}; + } + // when driver name started with point - look for driver in app root (relative path) + if (config.driver && config.driver.match(/^\./)) { + config.driver = path.join(app.root, config.driver); + } + + var schema = new Schema(config && config.driver || 'memory', config); + schema.log = log; + railway.orm._schemas.push(schema); + +var context = prepareContext(railway, app, schema); // run schema first var schemaFile = (root || app.root) + '/db/schema.'; @@ -43,7 +64,12 @@ if (existsSync(schemaFile + 'js')) { } if (schemaFile) { - railway.utils.runCode(schemaFile, context); + var code = fs.readFileSync(schemaFile); + if (schemaFile.match(/\.coffee$/)) { + code = require('coffee-script').compile(code); + } + var fn = new Function('context', 'require', 'with(context){(function(){' + code + '})()}'); + fn(context, require); } // and freeze schemas @@ -54,8 +80,8 @@ railway.orm._schemas.forEach(function (schema) { // check validations and display warning var displayWarning = false; -Object.keys(app.models).forEach(function (model) { - var Model = app.models[model]; +Object.keys(railway.models).forEach(function (model) { + var Model = railway.models[model]; if (Model._validations) { displayWarning = true; } @@ -77,7 +103,7 @@ function log(str, startTime) { }); } -function prepareContext(defSchema, done) { +function prepareContext(railway, app, defSchema, done) { var ctx = {app: app}, models = {}, settings = {}, @@ -145,7 +171,7 @@ function prepareContext(defSchema, done) { callback && callback(); m = (schema || defSchema).define(className, models[cname], settings[cname]); } - return global[cname] = app.models[cname] = ctx[cname] = m; + return railway.models[cname] = ctx[cname] = m; }; /**