From da14f4965146e91959dc304fa061705b3342624e Mon Sep 17 00:00:00 2001 From: Blake West Date: Wed, 10 Dec 2014 15:52:10 -0800 Subject: [PATCH] Fixed a bug where true values would fail looking for traits. - If a trait was passed with a true value, but wasn't a trait, it could fail if the defined factory didn't have any traits defined. Fixed that. - Added tests. Bumped version. Remade gulp files. --- bower.json | 2 +- dist/replicator.js | 4 +++- dist/replicator.min.js | 2 +- src/replicator.js | 4 +++- test/test.js | 24 +++++++++++++++++------- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/bower.json b/bower.json index 9814251..d98c6e5 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "replicator", - "version": "0.1.2", + "version": "0.1.3", "homepage": "https://github.com/hinthealth/replicator", "authors": [ "Blake West ", diff --git a/dist/replicator.js b/dist/replicator.js index a29a37a..68014ac 100755 --- a/dist/replicator.js +++ b/dist/replicator.js @@ -99,6 +99,8 @@ var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G. }; function getPropsForOneTrait(factoryName, trait) { + // Shouldn't be needed. Just to be paranoid. + sharedTraits[factoryName] = sharedTraits[factoryName] || {}; return sharedTraits[factoryName][trait]; } @@ -165,7 +167,7 @@ var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G. // Set on data store sharedRegistry[factoryName] = props; factoryCounts[factoryName] = 1; - trait[factoryName] = {}; + sharedTraits[factoryName] = {}; return factory; } diff --git a/dist/replicator.min.js b/dist/replicator.min.js index e44d902..517abe1 100755 --- a/dist/replicator.min.js +++ b/dist/replicator.min.js @@ -1 +1 @@ -(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ef||"undefined"==typeof i)return 1;if(f>i||"undefined"==typeof f)return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&"object"==typeof u&&o&&"object"==typeof o&&i&&"object"==typeof i)return!1;for(u=a(),u["false"]=u["null"]=u["true"]=u.undefined=!1,o=a(),o.k=n,o.l=u,o.push=e;++te?0:e);++r3&&"function"==typeof i[a-2])var c=tt(i[--a-1],i[a--],2);else a>2&&"function"==typeof i[a-1]&&(c=i[--a]);for(;++f=d&&i===n,c=[];if(a){var p=o(r);p?(i=t,r=p):a=!1}for(;++ui(r,p)&&c.push(p);return a&&l(r),c}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r=d&&a===n,v=u||h?f():s;for(h&&(v=o(v),a=t);++ia(v,y))&&((u||h)&&v.push(y),s.push(g))}return h?(c(v.k),l(v)):u&&c(v),s}function ct(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if("number"==typeof o)for(;++re?Se(0,o+e):e)||0,$e(n)?i=-1o&&(o=f)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),It(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Ft(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if("number"==typeof i)for(u&&(e=n[++o]);++oarguments.length;return t=J.createCallback(t,r,4),Nt(n,function(n,r,o){e=u?(u=!1,n):t(e,n,r,o)}),e}function $t(n){var t=-1,e=n?n.length:0,r=Xt("number"==typeof e?e:0);return It(n,function(n){var e=ft(0,++t);r[t]=r[e],r[e]=n}),r}function Tt(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if("number"==typeof u)for(;++er?Se(0,u+r):r||0}else if(r)return r=Wt(t,e),t[r]===e?r:-1;return n(t,e,r)}function zt(n,t,e){if("number"!=typeof t&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++uu;)r=u+o>>>1,e(n[r])e?0:e);++t0?l=_e(u,e):(i&&he(i),e=p,i=l=p=h,e&&(s=Ue(),f=n.apply(c,o),l||i||(o=c=null)))}var o,i,f,a,c,l,p,s=0,v=!1,g=!0;if(!bt(n))throw new ie;if(t=Se(0,t)||0,!0===e)var y=!0,g=!1;else wt(e)&&(y=e.leading,v="maxWait"in e&&(Se(t,e.maxWait)||0),g="trailing"in e?e.trailing:g);return function(){if(o=arguments,a=Ue(),c=this,p=g&&(l||!y),!1===v)var e=y&&!l;else{i||y||(s=a);var h=v-(a-s),m=0>=h;m?(i&&(i=he(i)),s=a,f=n.apply(c,o)):i||(i=_e(r,h))}return m&&l?l=he(l):l||t===v||(l=_e(u,t)),e&&(m=!0,f=n.apply(c,o)),!m||l||i||(o=c=null),f}}function Ut(n){return n}function Gt(n,t,e){var r=!0,u=t&&dt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=dt(t)),!1===e?r=!1:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=bt(o);It(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(de.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this;i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,R)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,fe=[],ae=re.prototype,ce=e._,le=ae.toString,pe=ue("^"+oe(le).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,he=e.clearTimeout,ve=te.floor,ge=ne.prototype.toString,ye=ht(ye=re.getPrototypeOf)&&ye,me=ae.hasOwnProperty,de=fe.push,_e=e.setTimeout,be=fe.splice,we=fe.unshift,je=function(){try{var n={},t=ht(t=re.defineProperty)&&t,e=t(n,n,n)&&t}catch(r){}return e}(),ke=ht(ke=re.create)&&ke,xe=ht(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ee=ht(Ee=re.keys)&&Ee,Se=te.max,Ie=te.min,Ne=e.parseInt,Ae=te.random,Re={};Re[D]=Xt,Re[$]=Yt,Re[T]=Zt,Re[B]=ne,Re[z]=re,Re[q]=ee,Re[W]=ue,Re[P]=oe,Q.prototype=J.prototype;var Fe=J.support={};Fe.funcDecomp=!ht(e.a)&&N.test(s),Fe.funcNames="string"==typeof ne.name,J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:E,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t;var r=new n;n.prototype=null}return r||e.Object()}}());var De=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,$e=xe||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&le.call(n)==D||!1},Te=Ee?function(n){return wt(n)?Ee(n):[]}:H,Be={"&":"&","<":"<",">":">",'"':""","'":"'"},qe=_t(Be),ze=ue("("+Te(qe).join("|")+")","g"),We=ue("["+Te(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||le.call(n)!=z)return!1;var t=n.valueOf,e=ht(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:vt(n)}:vt,Ke=ct(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=ct(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=ct(function(n,t,e){n[e]=t}),Ve=At,Ue=ht(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ne(b+"08")?Ne:function(n,t){return Ne(kt(n)?n.replace(S,""):n,t||0)};return J.after=function(n,t){if(!bt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,!0,!1,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e=d&&o(r?e[r]:s)))}var p=e[0],v=-1,g=p?p.length:0,y=[];n:for(;++v(m?t(m,h):a(s,h))){for(r=u,(m||s).push(h);--r;)if(m=i[r],0>(m?t(m,h):a(e[r],h)))continue n;y.push(h)}}for(;u--;)(m=i[u])&&l(m);return c(i),c(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u="function"==typeof t,o=n?n.length:0,i=Xt("number"==typeof o?o:0);return It(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Te,J.map=At,J.mapValues=function(n,t,e){var r={};return t=J.createCallback(t,e,3),v(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=Rt,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!bt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),e>3&&"function"==typeof t[e-2])var r=tt(t[--e-1],t[e--],2);else e>2&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=p(arguments,1,e),u=-1,o=f(),i=f();++uf&&(o=f)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),It(n,function(n,e,r){e=t(n,e,r),u>e&&(u=e,o=n)});return o},J.omit=function(n,t,e){var r={};if("function"!=typeof t){var u=[];g(n,function(n,t){u.push(t)});for(var u=rt(u,ut(arguments,!0,!1,1)),o=-1,i=u.length;++oe?Se(0,r+e):Ie(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=ce,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&("boolean"==typeof n&&u?(e=n,n=1):u||"boolean"!=typeof t||(e=t,u=!0)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Ae(),Ie(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):ft(n,t)},J.reduce=Ft,J.reduceRight=Dt,J.result=function(n,t){if(n){var e=n[t];return bt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return"number"==typeof t?t:Te(n).length},J.some=Tt,J.sortedIndex=Wt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Te(o),o=xt(o),f=0,a=e.interpolate||I,c="__p+='",a=ue((e.escape||I).source+"|"+a.source+"|"+(a===E?x:I).source+"|"+(e.evaluate||I).source+"|$","g");n.replace(a,function(t,e,r,o,a,l){return r||(r=o),c+=n.slice(f,l).replace(A,i),e&&(c+="'+__e("+e+")+'"),a&&(u=!0,c+="';"+a+";\n__p+='"),r&&(c+="'+((__t=("+r+"))==null?'':__t)+'"),f=l+t.length,t}),c+="';",a=e=e.variable,a||(e="obj",c="with("+e+"){"+c+"}"),c=(u?c.replace(w,""):c).replace(j,"$1").replace(k,"$1;"),c="function("+e+"){"+(a?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+c+"return __p}";try{var l=ne(r,"return "+c).apply(h,o)}catch(p){throw p.source=c,p}return t?l(t):(l.source=c,l)},J.unescape=function(n){return null==n?"":oe(n).replace(ze,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t},J.all=Ot,J.any=Tt,J.detect=St,J.findWhere=St,J.foldl=Ft,J.foldr=Dt,J.include=Ct,J.inject=Ft,Gt(function(){var n={};return v(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),!1),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if("number"!=typeof t&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:h;return p(n,Se(0,u-r))},J.sample=function(n,t,e){return n&&"number"!=typeof n.length&&(n=xt(n)),null==t||e?n?n[ft(0,n.length-1)]:h:(n=$t(n),n.length=Ie(Se(0,t),n.length),n)},J.take=Bt,J.head=Bt,v(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&"function"==typeof t)?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=!0,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,It(["join","pop","shift"],function(n){var t=fe[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);return n?new Q(e,n):e}}),It(["push","reverse","sort","unshift"],function(n){var t=fe[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),It(["concat","slice","splice"],function(n){var t=fe[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var h,v=[],g=[],y=0,m=+new Date+"",d=75,_=40,b=" \f \n\r\u2028\u2029 ᠎              ",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,E=/<%=([\s\S]+?)%>/g,S=RegExp("^["+b+"]*0+(?=.$)"),I=/($^)/,N=/\bthis\b/,A=/['\n\r\t\u2028\u2029\\]/g,R="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),F="[object Arguments]",D="[object Array]",$="[object Boolean]",T="[object Date]",B="[object Function]",q="[object Number]",z="[object Object]",W="[object RegExp]",P="[object String]",K={};K[B]=!1,K[F]=K[D]=K[$]=K[T]=K[q]=K[z]=K[W]=K[P]=!0;var L={leading:!1,maxWait:0,trailing:!1},M={configurable:!1,enumerable:!1,value:null,writable:!1},V={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},U={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X);var Y=s();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(G._=Y,define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this),function(){"use strict";function n(n,t){var e={};return _(t).pick(function(n){return n===!0}).each(function(t,r){var o=u(n,r);_.isObject(o)&&_.extend(e,o)}),e}function t(n,t,e,r){var u=_.keys(_.extend({},n,t)),o=_.xor(u,_.keys(e));if(o.length)throw new Error("Couldnn't add unregistered attributes "+o.join(",")+" in a build of factory "+r)}function e(n){return l[n]}function r(n,t){return _.pick(t,function(t,e){return!u(n,e)})}function u(n,t){return p[n][t]}function o(n,t){_.each(n,function(e,r){_.isFunction(e)&&(n[r]=e(n,t))})}function i(u,i){var f=e(u),a=n(u,i),c=r(u,i),l=_.extend({},f,a,c);h.enforce&&t(f,a,l,u);var p=s[u];return o(l,p),s[u]++,l}function f(n,t){if(!_.isString(n))throw new Error("A factory name is required.");t=t||{};var e=function(t,e){return p[n]=p[n]||{},p[n][t]=e,r},r={trait:e};return l[n]=t,s[n]=1,e[n]={},r}function a(n,t,e){if(e=e||1,!_.isString(n))throw new Error("A factory name is required.");if(!l[n])throw new Error("Can't build "+n+". It has not been defined");var r=[];return _.each(_.range(e),function(){r.push(i(n,t))}),1===e&&(r=r[0]),function(t){return t?a(n,t)():r}}function c(n,t,e){return function(){return v.build(n,t,e)}}var l={},p={},s={},h={enforce:!0},v={define:f,makeFactory:a,build:function(n,t,e){return this.makeFactory(n,t,e)()},embed:c,config:function(n){return n?void _.extend(h,n):h}};window.Replicator=v}(); \ No newline at end of file +(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++ef||"undefined"==typeof i)return 1;if(f>i||"undefined"==typeof f)return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&"object"==typeof u&&o&&"object"==typeof o&&i&&"object"==typeof i)return!1;for(u=a(),u["false"]=u["null"]=u["true"]=u.undefined=!1,o=a(),o.k=n,o.l=u,o.push=e;++te?0:e);++r3&&"function"==typeof i[a-2])var c=tt(i[--a-1],i[a--],2);else a>2&&"function"==typeof i[a-1]&&(c=i[--a]);for(;++f=d&&i===n,c=[];if(a){var p=o(r);p?(i=t,r=p):a=!1}for(;++ui(r,p)&&c.push(p);return a&&l(r),c}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r=d&&a===n,v=u||h?f():s;for(h&&(v=o(v),a=t);++ia(v,y))&&((u||h)&&v.push(y),s.push(g))}return h?(c(v.k),l(v)):u&&c(v),s}function ct(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if("number"==typeof o)for(;++re?Se(0,o+e):e)||0,$e(n)?i=-1o&&(o=f)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),It(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Ft(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if("number"==typeof i)for(u&&(e=n[++o]);++oarguments.length;return t=J.createCallback(t,r,4),Nt(n,function(n,r,o){e=u?(u=!1,n):t(e,n,r,o)}),e}function $t(n){var t=-1,e=n?n.length:0,r=Xt("number"==typeof e?e:0);return It(n,function(n){var e=ft(0,++t);r[t]=r[e],r[e]=n}),r}function Tt(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if("number"==typeof u)for(;++er?Se(0,u+r):r||0}else if(r)return r=Wt(t,e),t[r]===e?r:-1;return n(t,e,r)}function zt(n,t,e){if("number"!=typeof t&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++uu;)r=u+o>>>1,e(n[r])e?0:e);++t0?l=_e(u,e):(i&&he(i),e=p,i=l=p=h,e&&(s=Ue(),f=n.apply(c,o),l||i||(o=c=null)))}var o,i,f,a,c,l,p,s=0,v=!1,g=!0;if(!bt(n))throw new ie;if(t=Se(0,t)||0,!0===e)var y=!0,g=!1;else wt(e)&&(y=e.leading,v="maxWait"in e&&(Se(t,e.maxWait)||0),g="trailing"in e?e.trailing:g);return function(){if(o=arguments,a=Ue(),c=this,p=g&&(l||!y),!1===v)var e=y&&!l;else{i||y||(s=a);var h=v-(a-s),m=0>=h;m?(i&&(i=he(i)),s=a,f=n.apply(c,o)):i||(i=_e(r,h))}return m&&l?l=he(l):l||t===v||(l=_e(u,t)),e&&(m=!0,f=n.apply(c,o)),!m||l||i||(o=c=null),f}}function Ut(n){return n}function Gt(n,t,e){var r=!0,u=t&&dt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=dt(t)),!1===e?r=!1:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=bt(o);It(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(de.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this;i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,R)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,fe=[],ae=re.prototype,ce=e._,le=ae.toString,pe=ue("^"+oe(le).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,he=e.clearTimeout,ve=te.floor,ge=ne.prototype.toString,ye=ht(ye=re.getPrototypeOf)&&ye,me=ae.hasOwnProperty,de=fe.push,_e=e.setTimeout,be=fe.splice,we=fe.unshift,je=function(){try{var n={},t=ht(t=re.defineProperty)&&t,e=t(n,n,n)&&t}catch(r){}return e}(),ke=ht(ke=re.create)&&ke,xe=ht(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ee=ht(Ee=re.keys)&&Ee,Se=te.max,Ie=te.min,Ne=e.parseInt,Ae=te.random,Re={};Re[D]=Xt,Re[$]=Yt,Re[T]=Zt,Re[B]=ne,Re[z]=re,Re[q]=ee,Re[W]=ue,Re[P]=oe,Q.prototype=J.prototype;var Fe=J.support={};Fe.funcDecomp=!ht(e.a)&&N.test(s),Fe.funcNames="string"==typeof ne.name,J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:E,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t;var r=new n;n.prototype=null}return r||e.Object()}}());var De=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,$e=xe||function(n){return n&&"object"==typeof n&&"number"==typeof n.length&&le.call(n)==D||!1},Te=Ee?function(n){return wt(n)?Ee(n):[]}:H,Be={"&":"&","<":"<",">":">",'"':""","'":"'"},qe=_t(Be),ze=ue("("+Te(qe).join("|")+")","g"),We=ue("["+Te(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||le.call(n)!=z)return!1;var t=n.valueOf,e=ht(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:vt(n)}:vt,Ke=ct(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=ct(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=ct(function(n,t,e){n[e]=t}),Ve=At,Ue=ht(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ne(b+"08")?Ne:function(n,t){return Ne(kt(n)?n.replace(S,""):n,t||0)};return J.after=function(n,t){if(!bt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,!0,!1,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e=d&&o(r?e[r]:s)))}var p=e[0],v=-1,g=p?p.length:0,y=[];n:for(;++v(m?t(m,h):a(s,h))){for(r=u,(m||s).push(h);--r;)if(m=i[r],0>(m?t(m,h):a(e[r],h)))continue n;y.push(h)}}for(;u--;)(m=i[u])&&l(m);return c(i),c(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u="function"==typeof t,o=n?n.length:0,i=Xt("number"==typeof o?o:0);return It(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Te,J.map=At,J.mapValues=function(n,t,e){var r={};return t=J.createCallback(t,e,3),v(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=Rt,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!bt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),e>3&&"function"==typeof t[e-2])var r=tt(t[--e-1],t[e--],2);else e>2&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=p(arguments,1,e),u=-1,o=f(),i=f();++uf&&(o=f)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),It(n,function(n,e,r){e=t(n,e,r),u>e&&(u=e,o=n)});return o},J.omit=function(n,t,e){var r={};if("function"!=typeof t){var u=[];g(n,function(n,t){u.push(t)});for(var u=rt(u,ut(arguments,!0,!1,1)),o=-1,i=u.length;++oe?Se(0,r+e):Ie(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=ce,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&("boolean"==typeof n&&u?(e=n,n=1):u||"boolean"!=typeof t||(e=t,u=!0)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Ae(),Ie(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):ft(n,t)},J.reduce=Ft,J.reduceRight=Dt,J.result=function(n,t){if(n){var e=n[t];return bt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return"number"==typeof t?t:Te(n).length},J.some=Tt,J.sortedIndex=Wt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Te(o),o=xt(o),f=0,a=e.interpolate||I,c="__p+='",a=ue((e.escape||I).source+"|"+a.source+"|"+(a===E?x:I).source+"|"+(e.evaluate||I).source+"|$","g");n.replace(a,function(t,e,r,o,a,l){return r||(r=o),c+=n.slice(f,l).replace(A,i),e&&(c+="'+__e("+e+")+'"),a&&(u=!0,c+="';"+a+";\n__p+='"),r&&(c+="'+((__t=("+r+"))==null?'':__t)+'"),f=l+t.length,t}),c+="';",a=e=e.variable,a||(e="obj",c="with("+e+"){"+c+"}"),c=(u?c.replace(w,""):c).replace(j,"$1").replace(k,"$1;"),c="function("+e+"){"+(a?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+c+"return __p}";try{var l=ne(r,"return "+c).apply(h,o)}catch(p){throw p.source=c,p}return t?l(t):(l.source=c,l)},J.unescape=function(n){return null==n?"":oe(n).replace(ze,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t},J.all=Ot,J.any=Tt,J.detect=St,J.findWhere=St,J.foldl=Ft,J.foldr=Dt,J.include=Ct,J.inject=Ft,Gt(function(){var n={};return v(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),!1),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if("number"!=typeof t&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:h;return p(n,Se(0,u-r))},J.sample=function(n,t,e){return n&&"number"!=typeof n.length&&(n=xt(n)),null==t||e?n?n[ft(0,n.length-1)]:h:(n=$t(n),n.length=Ie(Se(0,t),n.length),n)},J.take=Bt,J.head=Bt,v(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&"function"==typeof t)?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=!0,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,It(["join","pop","shift"],function(n){var t=fe[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);return n?new Q(e,n):e}}),It(["push","reverse","sort","unshift"],function(n){var t=fe[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),It(["concat","slice","splice"],function(n){var t=fe[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var h,v=[],g=[],y=0,m=+new Date+"",d=75,_=40,b=" \f \n\r\u2028\u2029 ᠎              ",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,E=/<%=([\s\S]+?)%>/g,S=RegExp("^["+b+"]*0+(?=.$)"),I=/($^)/,N=/\bthis\b/,A=/['\n\r\t\u2028\u2029\\]/g,R="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),F="[object Arguments]",D="[object Array]",$="[object Boolean]",T="[object Date]",B="[object Function]",q="[object Number]",z="[object Object]",W="[object RegExp]",P="[object String]",K={};K[B]=!1,K[F]=K[D]=K[$]=K[T]=K[q]=K[z]=K[W]=K[P]=!0;var L={leading:!1,maxWait:0,trailing:!1},M={configurable:!1,enumerable:!1,value:null,writable:!1},V={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},U={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X);var Y=s();"function"==typeof define&&"object"==typeof define.amd&&define.amd?(G._=Y,define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this),function(){"use strict";function n(n,t){var e={};return _(t).pick(function(n){return n===!0}).each(function(t,r){var o=u(n,r);_.isObject(o)&&_.extend(e,o)}),e}function t(n,t,e,r){var u=_.keys(_.extend({},n,t)),o=_.xor(u,_.keys(e));if(o.length)throw new Error("Couldnn't add unregistered attributes "+o.join(",")+" in a build of factory "+r)}function e(n){return l[n]}function r(n,t){return _.pick(t,function(t,e){return!u(n,e)})}function u(n,t){return p[n]=p[n]||{},p[n][t]}function o(n,t){_.each(n,function(e,r){_.isFunction(e)&&(n[r]=e(n,t))})}function i(u,i){var f=e(u),a=n(u,i),c=r(u,i),l=_.extend({},f,a,c);h.enforce&&t(f,a,l,u);var p=s[u];return o(l,p),s[u]++,l}function f(n,t){if(!_.isString(n))throw new Error("A factory name is required.");t=t||{};var e=function(t,e){return p[n]=p[n]||{},p[n][t]=e,r},r={trait:e};return l[n]=t,s[n]=1,p[n]={},r}function a(n,t,e){if(e=e||1,!_.isString(n))throw new Error("A factory name is required.");if(!l[n])throw new Error("Can't build "+n+". It has not been defined");var r=[];return _.each(_.range(e),function(){r.push(i(n,t))}),1===e&&(r=r[0]),function(t){return t?a(n,t)():r}}function c(n,t,e){return function(){return v.build(n,t,e)}}var l={},p={},s={},h={enforce:!0},v={define:f,makeFactory:a,build:function(n,t,e){return this.makeFactory(n,t,e)()},embed:c,config:function(n){return n?void _.extend(h,n):h}};window.Replicator=v}(); \ No newline at end of file diff --git a/src/replicator.js b/src/replicator.js index 69ee3e1..051cfbb 100644 --- a/src/replicator.js +++ b/src/replicator.js @@ -43,6 +43,8 @@ }; function getPropsForOneTrait(factoryName, trait) { + // Shouldn't be needed. Just to be paranoid. + sharedTraits[factoryName] = sharedTraits[factoryName] || {}; return sharedTraits[factoryName][trait]; } @@ -109,7 +111,7 @@ // Set on data store sharedRegistry[factoryName] = props; factoryCounts[factoryName] = 1; - trait[factoryName] = {}; + sharedTraits[factoryName] = {}; return factory; } diff --git a/test/test.js b/test/test.js index b7b6fd4..cecb53a 100644 --- a/test/test.js +++ b/test/test.js @@ -147,8 +147,8 @@ describe('Replicator', function() { describe('when passed a hash', function() { describe('with values other than true', function() { it('should set them as properties',function() { - Replicator.define('user', {is_confirmed: false}); - Replicator.makeFactory('user', {is_confirmed: true})().is_confirmed.should.eql(true); + Replicator.define('user', {name: "joe"}); + Replicator.makeFactory('user', {name: "blake"})().name.should.eql("blake"); }); }); describe('with true values', function() { @@ -156,16 +156,26 @@ describe('Replicator', function() { it('should set the traits', function() { Replicator .define('user', {name: 'Joe', is_confirmed: false}) - .trait('is_confirmed', {is_confirmed: true, age: 18}); + .trait('isConfirmed', {is_confirmed: true, age: 18}); - Replicator.makeFactory('user', {is_confirmed: true})() + Replicator.makeFactory('user', {isConfirmed: true})() .should.eql({name: 'Joe', is_confirmed: true, age: 18}); }); }); describe('that don\'t match traits', function() { - it('should set them as properties',function() { - Replicator.define('user', {is_confirmed: false}); - Replicator.makeFactory('user', {is_confirmed: true})().is_confirmed.should.eql(true); + describe('but are valid properties', function() { + it('should set them as properties',function() { + Replicator.define('patient', {is_confirmed: false}); + Replicator.makeFactory('patient', {is_confirmed: true})().is_confirmed.should.eql(true); + }); + }); + describe('but are not valid properties', function() { + it('should throw a helpful error message', function() { + Replicator.define('patient', {is_confirmed: false}); + ( function() { + Replicator.makeFactory('patient', {withPaymentMethod: true})().is_confirmed.should.eql(true); + }).should.throw(/unregistered/) + }); }); }); });