ende 0.1.14 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. checksums.yaml +4 -4
  2. data/component.json +1 -1
  3. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +5 -2
  4. data/lib/assets/javascripts/aura/extensions/models.js.coffee.erb +4 -3
  5. data/lib/assets/javascripts/value_objects/phone.js.coffee +8 -2
  6. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +18 -21
  7. data/lib/ende/version.rb +1 -1
  8. data/lib/ende.rb +2 -2
  9. data/vendor/assets/javascripts/ende/build.js +485 -4879
  10. data/vendor/components/component-querystring/component.json +18 -0
  11. data/vendor/components/component-querystring/index.js +49 -0
  12. data/vendor/components/component-trim/component.json +13 -0
  13. data/vendor/components/component-trim/index.js +17 -0
  14. data/vendor/components/indefinido-indemma/.gitignore +14 -0
  15. data/vendor/components/indefinido-indemma/.ruby-gemset +1 -0
  16. data/vendor/components/indefinido-indemma/.ruby-version +1 -0
  17. data/vendor/components/indefinido-indemma/Gemfile +13 -0
  18. data/vendor/components/indefinido-indemma/Guardfile +39 -0
  19. data/vendor/components/indefinido-indemma/History.md +0 -0
  20. data/vendor/components/indefinido-indemma/Readme.md +443 -0
  21. data/vendor/components/indefinido-indemma/build/development.js +331 -0
  22. data/vendor/components/indefinido-indemma/build/release.js +21693 -0
  23. data/vendor/components/indefinido-indemma/build/test.js +331 -0
  24. data/vendor/components/indefinido-indemma/component.json +8 -9
  25. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/component.json +18 -0
  26. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/index.js +110 -0
  27. data/vendor/components/indefinido-indemma/components/chaijs-chai/component.json +47 -0
  28. data/vendor/components/indefinido-indemma/components/chaijs-chai/index.js +1 -0
  29. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/assertion.js +130 -0
  30. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  31. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  32. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  33. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  34. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  35. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  36. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  37. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/eql.js +129 -0
  38. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  39. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  40. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  41. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  42. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  43. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  44. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  45. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  46. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  47. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  48. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  49. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  50. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  51. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  52. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  53. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai.js +80 -0
  54. data/vendor/components/indefinido-indemma/components/component-bind/component.json +14 -0
  55. data/vendor/components/indefinido-indemma/components/component-bind/index.js +24 -0
  56. data/vendor/components/indefinido-indemma/components/component-jquery/component.json +14 -0
  57. data/vendor/components/indefinido-indemma/components/component-jquery/index.js +9601 -0
  58. data/vendor/components/indefinido-indemma/components/component-type/component.json +18 -0
  59. data/vendor/components/indefinido-indemma/components/component-type/index.js +32 -0
  60. data/vendor/components/indefinido-indemma/components/indefinido-advisable/component.json +21 -0
  61. data/vendor/components/indefinido-indemma/components/indefinido-advisable/index.js +1 -0
  62. data/vendor/components/indefinido-indemma/components/indefinido-advisable/lib/advisable.js +60 -0
  63. data/vendor/components/indefinido-indemma/components/indefinido-observable/component.json +25 -0
  64. data/vendor/components/indefinido-indemma/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  65. data/vendor/components/indefinido-indemma/components/indefinido-observable/index.js +1 -0
  66. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  67. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/observable.js +323 -0
  68. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  69. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  70. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  71. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  72. data/vendor/components/indefinido-indemma/components/kapit-observe-utils/component.json +13 -0
  73. data/vendor/components/indefinido-indemma/components/pluma-assimilate/component.json +25 -0
  74. data/vendor/components/indefinido-indemma/components/pluma-assimilate/dist/assimilate.js +87 -0
  75. data/vendor/components/indefinido-indemma/karma.conf.js +86 -0
  76. data/vendor/components/indefinido-indemma/lib/record/associable.js +6 -6
  77. data/vendor/components/indefinido-indemma/lib/record/errors.js +1 -0
  78. data/vendor/components/indefinido-indemma/lib/record/resource.js +14 -3
  79. data/vendor/components/indefinido-indemma/lib/record/rest.js +7 -4
  80. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +45 -15
  81. data/vendor/components/indefinido-indemma/lib/record/scopable.js +13 -3
  82. data/vendor/components/indefinido-indemma/lib/record/validatable.js +20 -9
  83. data/vendor/components/indefinido-indemma/lib/record/validations/confirmation.js +1 -1
  84. data/vendor/components/indefinido-indemma/lib/record/validations/remote.js +6 -5
  85. data/vendor/components/indefinido-indemma/lib/record/validations/type.js +29 -0
  86. data/vendor/components/indefinido-indemma/lib/record.js +1 -11
  87. data/vendor/components/indefinido-indemma/spec/record/associable_spec.js +76 -0
  88. data/vendor/components/indefinido-indemma/spec/record/resource_spec.js +90 -0
  89. data/vendor/components/indefinido-indemma/spec/record/rest_spec.js +32 -0
  90. data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +232 -0
  91. data/vendor/components/indefinido-indemma/spec/record/scopable_spec.js +201 -0
  92. data/vendor/components/indefinido-indemma/spec/record/translationable.js +28 -0
  93. data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +111 -0
  94. data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +43 -0
  95. data/vendor/components/indefinido-indemma/spec/record/validations/confirmation_spec.js +36 -0
  96. data/vendor/components/indefinido-indemma/spec/record/validations/cpf_spec.js +35 -0
  97. data/vendor/components/indefinido-indemma/spec/record/validations/presence_spec.js +28 -0
  98. data/vendor/components/indefinido-indemma/spec/record/validations/remote_spec.js +86 -0
  99. data/vendor/components/indefinido-indemma/spec/record/validations/type_spec.js +48 -0
  100. data/vendor/components/indefinido-indemma/spec/record_spec.js +37 -0
  101. data/vendor/components/indefinido-indemma/spec/spec_helper.js +11 -0
  102. data/vendor/components/indefinido-indemma/spec/support/value_objects/phone.js +45 -0
  103. data/vendor/components/indefinido-indemma/src/lib/extensions/rivets.coffee +17 -0
  104. data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +173 -0
  105. data/vendor/components/indefinido-indemma/src/lib/record/errors.coffee +20 -0
  106. data/vendor/components/indefinido-indemma/src/lib/record/maid.coffee +16 -0
  107. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +103 -0
  108. data/vendor/components/indefinido-indemma/src/lib/record/rest.coffee +28 -0
  109. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +314 -0
  110. data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +266 -0
  111. data/vendor/components/indefinido-indemma/src/lib/record/translationable.coffee +18 -0
  112. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +209 -0
  113. data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +32 -0
  114. data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +19 -0
  115. data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +58 -0
  116. data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +19 -0
  117. data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +65 -0
  118. data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +32 -0
  119. data/vendor/components/indefinido-indemma/src/lib/record.coffee +123 -0
  120. data/vendor/components/indefinido-indemma/src/spec/record/associable_spec.coffee +63 -0
  121. data/vendor/components/indefinido-indemma/src/spec/record/resource_spec.coffee +64 -0
  122. data/vendor/components/indefinido-indemma/src/spec/record/rest_spec.coffee +22 -0
  123. data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +164 -0
  124. data/vendor/components/indefinido-indemma/src/spec/record/scopable_spec.coffee +181 -0
  125. data/vendor/components/indefinido-indemma/src/spec/record/translationable.coffee +19 -0
  126. data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +100 -0
  127. data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +35 -0
  128. data/vendor/components/indefinido-indemma/src/spec/record/validations/confirmation_spec.coffee +25 -0
  129. data/vendor/components/indefinido-indemma/src/spec/record/validations/cpf_spec.coffee +28 -0
  130. data/vendor/components/indefinido-indemma/src/spec/record/validations/presence_spec.coffee +24 -0
  131. data/vendor/components/indefinido-indemma/src/spec/record/validations/remote_spec.coffee +72 -0
  132. data/vendor/components/indefinido-indemma/src/spec/record/validations/type_spec.coffee +33 -0
  133. data/vendor/components/indefinido-indemma/src/spec/record_spec.coffee +23 -0
  134. data/vendor/components/indefinido-indemma/src/spec/spec_helper.coffee +9 -0
  135. data/vendor/components/indefinido-indemma/src/spec/support/value_objects/phone.coffee +30 -0
  136. data/vendor/components/indefinido-indemma/vendor/owl/pluralize.js +190 -0
  137. data/vendor/components/indefinido-observable/lib/observable.js +3 -0
  138. metadata +119 -2
@@ -0,0 +1,77 @@
1
+ // ES5 15.2.3.5
2
+ // http://es5.github.com/#x15.2.3.5
3
+ if (!Object.create) {
4
+
5
+ // Contributed by Brandon Benvie, October, 2012
6
+ var createEmpty;
7
+ var supportsProto = Object.prototype.__proto__ === null;
8
+ if (supportsProto || typeof document == 'undefined') {
9
+ createEmpty = function () {
10
+ return { "__proto__": null };
11
+ };
12
+ } else {
13
+ // In old IE __proto__ can't be used to manually set `null`, nor does
14
+ // any other method exist to make an object that inherits from nothing,
15
+ // aside from Object.prototype itself. Instead, create a new global
16
+ // object and *steal* its Object.prototype and strip it bare. This is
17
+ // used as the prototype to create nullary objects.
18
+ createEmpty = function () {
19
+ var iframe = document.createElement('iframe');
20
+ var parent = document.body || document.documentElement;
21
+ iframe.style.display = 'none';
22
+ parent.appendChild(iframe);
23
+ iframe.src = 'javascript:';
24
+ var empty = iframe.contentWindow.Object.prototype;
25
+ parent.removeChild(iframe);
26
+ iframe = null;
27
+ delete empty.constructor;
28
+ delete empty.hasOwnProperty;
29
+ delete empty.propertyIsEnumerable;
30
+ delete empty.isPrototypeOf;
31
+ delete empty.toLocaleString;
32
+ delete empty.toString;
33
+ delete empty.valueOf;
34
+ empty.__proto__ = null;
35
+
36
+ function Empty() {}
37
+ Empty.prototype = empty;
38
+ // short-circuit future calls
39
+ createEmpty = function () {
40
+ return new Empty();
41
+ };
42
+ return new Empty();
43
+ };
44
+ }
45
+
46
+ Object.create = function create(prototype, properties) {
47
+
48
+ var object;
49
+ function Type() {} // An empty constructor.
50
+
51
+ if (prototype === null) {
52
+ object = createEmpty();
53
+ } else {
54
+ if (typeof prototype !== "object" && typeof prototype !== "function") {
55
+ // In the native implementation `parent` can be `null`
56
+ // OR *any* `instanceof Object` (Object|Function|Array|RegExp|etc)
57
+ // Use `typeof` tho, b/c in old IE, DOM elements are not `instanceof Object`
58
+ // like they are in modern browsers. Using `Object.create` on DOM elements
59
+ // is...err...probably inappropriate, but the native version allows for it.
60
+ throw new TypeError("Object prototype may only be an Object or null"); // same msg as Chrome
61
+ }
62
+ Type.prototype = prototype;
63
+ object = new Type();
64
+ // IE has no built-in implementation of `Object.getPrototypeOf`
65
+ // neither `__proto__`, but this manually setting `__proto__` will
66
+ // guarantee that `Object.getPrototypeOf` will work as expected with
67
+ // objects created using `Object.create`
68
+ object.__proto__ = prototype;
69
+ }
70
+
71
+ if (properties !== void 0) {
72
+ Object.defineProperties(object, properties);
73
+ }
74
+
75
+ return object;
76
+ };
77
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "observe-utils",
3
+ "version": "0.1.0",
4
+ "main": "lib/observe-utils.js",
5
+ "devDependencies": {
6
+ "expect": "~0.2.0",
7
+ "sinon": "http://sinonjs.org/releases/sinon-1.6.0.js",
8
+ "observe-shim": "https://github.com/KapIT/observe-shim.git",
9
+ "mocha": "~1.8.1",
10
+ "es5-shim": "~2.0.8"
11
+ },
12
+ "repo": "https://raw.github.com/kapit/observe-utils"
13
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "assimilate",
3
+ "version": "0.2.0",
4
+ "license": "MIT",
5
+ "repo": "pluma/assimilate",
6
+ "description": "Extends objects.",
7
+ "keywords": [
8
+ "extend",
9
+ "inherit",
10
+ "mixin"
11
+ ],
12
+ "main": "./dist/assimilate.js",
13
+ "dependencies": {},
14
+ "development": {},
15
+ "scripts": [
16
+ "dist/assimilate.js"
17
+ ],
18
+ "styles": [],
19
+ "ignore": [
20
+ "**/.*",
21
+ "build",
22
+ "components",
23
+ "node_modules"
24
+ ]
25
+ }
@@ -0,0 +1,87 @@
1
+ /*! assimilate 0.2.0 Copyright (c) 2013 Alan Plum. MIT licensed. */
2
+ var slice = Array.prototype.slice;
3
+
4
+ function assimilateWithStrategy(strategy, copyInherited, target) {
5
+ var sources = slice.call(arguments, 3),
6
+ i, source, key;
7
+
8
+ if (target === undefined || target === null) {
9
+ target = {};
10
+ }
11
+
12
+ for (i = 0; i < sources.length; i++) {
13
+ source = sources[i];
14
+ if (source === undefined || source === null) continue;
15
+ for (key in source) {
16
+ if (copyInherited || source.hasOwnProperty(key)) {
17
+ strategy(target, source, key, copyInherited);
18
+ }
19
+ }
20
+ }
21
+
22
+ return target;
23
+ }
24
+
25
+ function assimilate() {
26
+ var args = slice.call(arguments, 0);
27
+ return assimilateWithStrategy.apply(
28
+ this, [assimilate.strategies.DEFAULT, false].concat(args)
29
+ );
30
+ }
31
+
32
+ assimilate.withStrategy = function(strategy, copyInherited) {
33
+ if (arguments.length === 1 && typeof strategy === 'boolean') {
34
+ copyInherited = strategy;
35
+ strategy = 'default';
36
+ }
37
+ if (typeof strategy === 'string') {
38
+ strategy = strategy.toUpperCase();
39
+ if (typeof assimilate.strategies[strategy] === 'function') {
40
+ strategy = assimilate.strategies[strategy];
41
+ }
42
+ }
43
+ if (typeof strategy !== 'function') {
44
+ throw new Error('Unknown strategy or not a function: ' + strategy);
45
+ }
46
+ return function() {
47
+ var args = slice.call(arguments, 0);
48
+ return assimilateWithStrategy.apply(
49
+ this, [strategy, !!copyInherited].concat(args)
50
+ );
51
+ };
52
+ };
53
+
54
+ assimilate.strategies = {
55
+ DEFAULT: function(target, source, key) {
56
+ target[key] = source[key];
57
+ },
58
+ DEEP: function(target, source, key, copyInherited) {
59
+ var newValue = source[key];
60
+ var oldValue = target[key];
61
+ if (
62
+ target.hasOwnProperty(key) &&
63
+ typeof newValue === 'object' &&
64
+ typeof oldValue === 'object'
65
+ ) {
66
+ assimilateWithStrategy(
67
+ assimilate.strategies.DEEP, copyInherited, oldValue, newValue
68
+ );
69
+ } else {
70
+ target[key] = newValue;
71
+ }
72
+ },
73
+ STRICT: function(target, source, key) {
74
+ var value = source[key];
75
+ if (value !== undefined) {
76
+ target[key] = value;
77
+ }
78
+ },
79
+ FALLBACK: function(target, source, key) {
80
+ var oldValue = target[key];
81
+ if (oldValue === undefined) {
82
+ target[key] = source[key];
83
+ }
84
+ }
85
+ };
86
+
87
+ module.exports = assimilate;
@@ -0,0 +1,86 @@
1
+ // Karma configuration
2
+ // Generated on Mon May 27 2013 16:00:28 GMT-0300 (BRT)
3
+
4
+
5
+ // base path, that will be used to resolve files and exclude
6
+ basePath = '';
7
+
8
+ // list of files / patterns to load in the browser
9
+ files = [
10
+
11
+ // Test environment
12
+ MOCHA,
13
+ MOCHA_ADAPTER,
14
+ 'vendor/sinon.js',
15
+
16
+ // Test dependencies
17
+ 'build/test.js',
18
+ 'spec/support/**/*.js',
19
+
20
+ // Test Source files
21
+ 'spec/spec_helper.js',
22
+ 'spec/**/*.js'
23
+ ];
24
+
25
+
26
+ // list of files to exclude
27
+ exclude = [
28
+ 'spec/coverage'
29
+ ];
30
+
31
+
32
+ // test results reporter to use
33
+ // possible values: 'dots', 'progress', 'junit'
34
+ reporters = ['progress', 'coverage'];
35
+
36
+
37
+ // web server port
38
+ port = 9876;
39
+
40
+
41
+ // cli runner port
42
+ runnerPort = 9100;
43
+
44
+
45
+ // enable / disable colors in the output (reporters and logs)
46
+ colors = true;
47
+
48
+
49
+ // level of logging
50
+ // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
51
+ logLevel = LOG_INFO;
52
+
53
+
54
+ // enable / disable watching file and executing tests whenever any file changes
55
+ autoWatch = true;
56
+
57
+
58
+ // Start these browsers, currently available:
59
+ // - Chrome
60
+ // - ChromeCanary
61
+ // - Firefox
62
+ // - Opera
63
+ // - Safari (only Mac)
64
+ // - PhantomJS
65
+ // - IE (only Windows)
66
+ browsers = ['Chrome'];
67
+
68
+
69
+ // If browser does not capture in given timeout [ms], kill it
70
+ captureTimeout = 600000;
71
+
72
+
73
+ // Continuous Integration mode
74
+ // if true, it capture browsers, run tests and exit
75
+ singleRun = false;
76
+
77
+ // Coverage preprocessors
78
+ preprocessors = {
79
+ '**/lib/*.js': 'coverage'
80
+ };
81
+
82
+ // Converage configuration
83
+ coverageReporter = {
84
+ type : 'html',
85
+ dir : 'spec/coverage'
86
+ }
@@ -50,13 +50,13 @@ plural = {
50
50
  },
51
51
  push: Array.prototype.push,
52
52
  length: 0,
53
- json: function() {
53
+ json: function(methods, omissions) {
54
54
  var record, _i, _len, _results;
55
55
 
56
56
  _results = [];
57
57
  for (_i = 0, _len = this.length; _i < _len; _i++) {
58
58
  record = this[_i];
59
- _results.push(record.json());
59
+ _results.push(record.json(methods, omissions));
60
60
  }
61
61
  return _results;
62
62
  }
@@ -109,21 +109,21 @@ associable = {
109
109
  update_association: function(data) {
110
110
  var associated, association, association_name, id, pluralized_association, _i, _j, _len, _len1, _ref;
111
111
 
112
- id = this._id || data._id || data.id;
112
+ id = this._id || data && (data._id || data.id);
113
113
  if (!id) {
114
114
  return;
115
115
  }
116
- _ref = model[this.resource].has_many;
116
+ _ref = model[this.resource.toString()].has_many;
117
117
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
118
118
  association_name = _ref[_i];
119
119
  pluralized_association = model.pluralize(association_name);
120
120
  association = this[pluralized_association];
121
121
  if (!association.route) {
122
- association.route = "/" + (model.pluralize(this.resource)) + "/" + id + "/" + (model.pluralize(association.resource));
122
+ association.route = "/" + (model.pluralize(this.resource.toString())) + "/" + id + "/" + (model.pluralize(association.resource));
123
123
  for (_j = 0, _len1 = association.length; _j < _len1; _j++) {
124
124
  associated = association[_j];
125
125
  if (!associated.route && (associated.parent != null)) {
126
- associated.route = "/" + (model.pluralize(this.resource)) + "/" + id + "/" + (model.pluralize(association.resource));
126
+ associated.route = "/" + (model.pluralize(this.resource.toString())) + "/" + id + "/" + (model.pluralize(association.resource));
127
127
  }
128
128
  }
129
129
  }
@@ -2,6 +2,8 @@ var model, resource, resourceable, stampit;
2
2
 
3
3
  stampit = require('../../vendor/stampit');
4
4
 
5
+ require('../../vendor/owl/pluralize');
6
+
5
7
  resource = stampit({
6
8
  toString: function() {
7
9
  return this.name;
@@ -11,17 +13,25 @@ resource = stampit({
11
13
  scope: null,
12
14
  singular: false
13
15
  }, function() {
16
+ var _base;
17
+
18
+ if (this.original_reference) {
19
+ stampit.mixIn(this.original_reference, this);
20
+ this.original_reference.toString = this.toString;
21
+ (_base = this.original_reference).param_name || (_base.param_name = this.name);
22
+ return this.original_reference;
23
+ }
14
24
  this.param_name || (this.param_name = this.name);
15
25
  return this;
16
26
  });
17
27
 
18
28
  resourceable = {
19
- pluralize: function(word) {
29
+ pluralize: function(word, count, plural) {
20
30
  if (!(word && word.length)) {
21
31
  throw new TypeError("Invalid string passed to pluralize '" + word + "'");
22
32
  }
23
33
  if (word.indexOf('s') !== word.length - 1) {
24
- return word + 's';
34
+ return owl.pluralize(word, count, plural);
25
35
  } else {
26
36
  return word;
27
37
  }
@@ -30,7 +40,7 @@ resourceable = {
30
40
  if (!(word && word.length)) {
31
41
  throw new TypeError("Invalid string passed to singularize '" + word + "'");
32
42
  }
33
- if (word.indexOf('s') === word.length - 1) {
43
+ if (word.lastIndexOf('s') === word.length - 1) {
34
44
  return word.substring(0, word.length - 1);
35
45
  } else {
36
46
  return word;
@@ -84,6 +94,7 @@ resourceable = {
84
94
  };
85
95
  }
86
96
  if (typeof this.resource === 'object') {
97
+ this.resource.original_reference = this.resource;
87
98
  resource_definition = this.resource;
88
99
  }
89
100
  resource_definition.parent = this.parent_resource;
@@ -7,10 +7,13 @@ module.exports = {
7
7
  return request.call(this, 'get', (this._id ? "" + this.route + "/" + this._id : this.route), data);
8
8
  },
9
9
  put: function(data) {
10
- return request.call(this, 'put', "" + this.route + "/" + this._id, data);
10
+ return request.call(this, 'put', (this._id ? "" + this.route + "/" + this._id : this.route), data);
11
11
  },
12
12
  post: function(data) {
13
13
  return request.call(this, 'post', this.route, data);
14
+ },
15
+ "delete": function(data) {
16
+ return request.call(this, 'delete', this.route, data);
14
17
  }
15
18
  };
16
19
 
@@ -22,9 +25,9 @@ request = function(method, url, data) {
22
25
  data = {};
23
26
  data[param_name] = this.json();
24
27
  }
25
- if (data[param_name]) {
26
- delete data[param_name]._id;
27
- delete data[param_name].id;
28
+ if (data && data[param_name]) {
29
+ delete data[param_name]['id'];
30
+ delete data[param_name]['_id'];
28
31
  }
29
32
  return $.ajax({
30
33
  url: url,
@@ -29,7 +29,7 @@ util = {
29
29
  restful = {
30
30
  model: {
31
31
  create: function() {
32
- var attributes, callback, params, record, _i, _j, _len, _results;
32
+ var attributes, callback, params, record, savings, _i, _j, _len;
33
33
 
34
34
  params = 2 <= arguments.length ? __slice.call(arguments, 0, _i = arguments.length - 1) : (_i = 0, []), callback = arguments[_i++];
35
35
  if (!arguments.length) {
@@ -37,18 +37,19 @@ restful = {
37
37
  }
38
38
  if (typeof callback !== 'function') {
39
39
  params.push(callback);
40
+ callback = void 0;
40
41
  }
41
42
  if (!params.length) {
42
43
  params.unshift({});
43
44
  }
44
- _results = [];
45
+ savings = [];
45
46
  for (_j = 0, _len = params.length; _j < _len; _j++) {
46
47
  attributes = params[_j];
47
48
  record = this(attributes);
48
49
  record.dirty = true;
49
- _results.push(record.save(callback));
50
+ savings.push(record.save(callback));
50
51
  }
51
- return _results;
52
+ return $.when.apply($, savings);
52
53
  },
53
54
  all: function(conditions, callback) {
54
55
  if (conditions == null) {
@@ -92,7 +93,8 @@ restful = {
92
93
  promise = rest.get.call(this, data);
93
94
  route = old_route;
94
95
  return promise;
95
- }
96
+ },
97
+ put: rest.put
96
98
  },
97
99
  record: {
98
100
  reload: function() {
@@ -159,20 +161,43 @@ restful = {
159
161
  }
160
162
  return _results;
161
163
  },
162
- save: function(doned, failed, data) {
164
+ destroy: function(doned, failed, data) {
163
165
  var promise;
164
166
 
165
- if (!this.dirty) {
166
- return $.Deferred().resolve();
167
+ if (!((this.id != null) || (this._id != null))) {
168
+ throw new Error('Can\'t delete record without id!');
167
169
  }
168
- promise = rest[this._id ? 'put' : 'post'].call(this, data);
169
- promise.done(this.saved);
170
+ promise = rest["delete"].call(this, data);
171
+ promise.done(this.destroyed);
170
172
  promise.fail(this.failed);
171
173
  promise.done(doned);
172
174
  promise.fail(failed);
173
- this.lock = JSON.stringify(this.json());
174
175
  return promise;
175
176
  },
177
+ saving: false,
178
+ salvation: null,
179
+ save: function(doned, failed, data) {
180
+ var salvation;
181
+
182
+ if (this.saving) {
183
+ return this.salvation;
184
+ }
185
+ this.lock = JSON.stringify(this.json());
186
+ if (!this.dirty) {
187
+ salvation = $.Deferred().resolveWith(this, null);
188
+ }
189
+ salvation || (salvation = rest[this._id ? 'put' : 'post'].call(this, data));
190
+ this.salvation = salvation;
191
+ this.saving = true;
192
+ salvation.done(this.saved);
193
+ salvation.fail(this.failed);
194
+ salvation.always(function() {
195
+ return this.saving = false;
196
+ });
197
+ salvation.done(doned);
198
+ salvation.fail(failed);
199
+ return salvation;
200
+ },
176
201
  saved: function(data) {
177
202
  var callback, _i, _len, _ref, _results;
178
203
 
@@ -248,9 +273,12 @@ restful = {
248
273
  serialized[this.resource] = this.json();
249
274
  return JSON.stringify(serialized);
250
275
  },
251
- json: function() {
276
+ json: function(methods) {
252
277
  var attribute, json, name, value, _i, _len, _ref;
253
278
 
279
+ if (methods == null) {
280
+ methods = {};
281
+ }
254
282
  json = {};
255
283
  for (name in this) {
256
284
  value = this[name];
@@ -262,13 +290,13 @@ restful = {
262
290
  }
263
291
  if (type(value) === 'object') {
264
292
  if (value.toJSON != null) {
265
- json[name] = value.toJSON();
293
+ json[name] = value.toJSON(methods[name]);
266
294
  } else {
267
295
  _ref = this.nested_attributes;
268
296
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
269
297
  attribute = _ref[_i];
270
298
  if (attribute === name) {
271
- json["" + name + "_attributes"] = value.json();
299
+ json["" + name + "_attributes"] = value.json(methods[name]);
272
300
  }
273
301
  }
274
302
  }
@@ -284,11 +312,13 @@ restful = {
284
312
  delete json.after_initialize;
285
313
  delete json.parent_resource;
286
314
  delete json.nested_attributes;
287
- delete json.on_save;
315
+ delete json.saving;
316
+ delete json.salvation;
288
317
  delete json.element;
289
318
  delete json["default"];
290
319
  delete json.lock;
291
320
  delete json.validated;
321
+ delete json.validation;
292
322
  return json;
293
323
  }
294
324
  }
@@ -43,12 +43,18 @@ scopable = {
43
43
  fail: [],
44
44
  declared: [],
45
45
  fetch: function(data, done, fail) {
46
- var promise, scope;
46
+ var deferred, scope;
47
47
 
48
48
  scope = extend({}, this.scope.data);
49
- promise = rest.get.call(this, extend(scope, data)).done(this.scope.then.concat(done)).fail([this.scope.fail, fail]);
49
+ if (scope.noned != null) {
50
+ deferred = $.Deferred();
51
+ deferred.resolveWith(this, [[]]);
52
+ } else {
53
+ deferred = rest.get.call(this, extend(scope, data));
54
+ }
55
+ deferred.done(this.scope.then.concat(done)).fail([this.scope.fail, fail]);
50
56
  this.scope.clear();
51
- return promise;
57
+ return deferred;
52
58
  },
53
59
  clear: function() {
54
60
  this.data = {};
@@ -84,6 +90,10 @@ scopable = {
84
90
  }
85
91
  },
86
92
  model: {
93
+ none: function() {
94
+ this.scope.data.noned = true;
95
+ return this;
96
+ },
87
97
  fetch: function(data, done, fail) {
88
98
  return this.scope.fetch.call(this, data, done, fail);
89
99
  },
@@ -22,16 +22,21 @@ messages = {
22
22
  confirmation: function(attribute_name) {
23
23
  var confirmation_attribute_name;
24
24
 
25
- confirmation_attribute_name = this.human_attribute_name("" + attribute_name + "_confirmation");
26
- attribute_name = this.human_attribute_name(attribute_name);
27
- return "O campo " + attribute_name + " não está diacordo com a confirmação " + confirmation_attribute_name + ".";
25
+ confirmation_attribute_name = this.human_attribute_name(attribute_name);
26
+ attribute_name = this.human_attribute_name(attribute_name.replace('_confirmation', ''));
27
+ return "O campo " + attribute_name + " não está de acordo com o campo " + confirmation_attribute_name + ".";
28
28
  },
29
29
  associated: function(attribute_name) {
30
30
  attribute_name = this.human_attribute_name(attribute_name);
31
- return "O registro associado " + attribute_name + " não é válido";
31
+ return "O registro associado " + attribute_name + " não é válido.";
32
32
  },
33
33
  server: function(attribute_name, options) {
34
- return "" + (this.human_attribute_name(attribute_name)) + " " + options.server_message + " ";
34
+ attribute_name = this.human_attribute_name(attribute_name);
35
+ return "" + attribute_name + " " + options.server_message + ".";
36
+ },
37
+ type: function(attribute_name, options) {
38
+ attribute_name = this.human_attribute_name(attribute_name);
39
+ return "O campo " + attribute_name + " não está válido.";
35
40
  }
36
41
  };
37
42
 
@@ -64,8 +69,11 @@ errorsable = stampit({
64
69
  splice: Array.prototype.splice
65
70
  }, {
66
71
  model: null,
67
- messages: {},
72
+ messages: null,
68
73
  length: 0
74
+ }, function() {
75
+ this.messages = {};
76
+ return this;
69
77
  });
70
78
 
71
79
  initializers = {
@@ -100,6 +108,7 @@ initializers = {
100
108
  create_validators: function(definitions) {
101
109
  var definition, name, validator, validator_options, _ref, _results;
102
110
 
111
+ this.validators = [];
103
112
  _ref = manager.validators;
104
113
  _results = [];
105
114
  for (name in _ref) {
@@ -136,7 +145,7 @@ initializers = {
136
145
 
137
146
  extensions = {
138
147
  model: {
139
- validators: []
148
+ validators: null
140
149
  },
141
150
  record: {
142
151
  validate_attribute: function(attribute, doned, failed) {
@@ -144,7 +153,7 @@ extensions = {
144
153
 
145
154
  this.errors.messages[attribute] = null;
146
155
  results = [this, attribute];
147
- _ref = model[this.resource].validators;
156
+ _ref = model[this.resource.toString()].validators;
148
157
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
149
158
  validator = _ref[_i];
150
159
  if (validator.attribute_name === attribute) {
@@ -164,7 +173,7 @@ extensions = {
164
173
  }
165
174
  this.errors.clear();
166
175
  results = [this];
167
- _ref = model[this.resource].validators;
176
+ _ref = model[this.resource.toString()].validators;
168
177
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
169
178
  validator = _ref[_i];
170
179
  results.push(validator.validate_each(this, validator.attribute_name, this[validator.attribute_name]));
@@ -213,4 +222,6 @@ require('./validations/presence');
213
222
 
214
223
  require('./validations/remote');
215
224
 
225
+ require('./validations/type');
226
+
216
227
  require('./validations/cpf');
@@ -7,7 +7,7 @@ stampit = require('../../../vendor/stampit');
7
7
  confirmationable = stampit({
8
8
  validate_each: function(record, attribute, value) {
9
9
  if (record[attribute] !== record["" + attribute + "_confirmation"]) {
10
- return record.errors.add(attribute, 'confirmation', this.options);
10
+ return record.errors.add("" + attribute + "_confirmation", 'confirmation', this.options);
11
11
  }
12
12
  }
13
13
  });