ende 0.2.9 → 0.2.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/lib/assets/javascripts/aura/extensions/devise.js.coffee +2 -2
  3. data/lib/assets/javascripts/widgets/viewer/main.js.coffee +1 -1
  4. data/lib/ende/version.rb +1 -1
  5. data/vendor/assets/components/build.js +638 -133
  6. data/vendor/components/indefinido-indemma/.gitignore +14 -0
  7. data/vendor/components/indefinido-indemma/.gitignore~ +2 -0
  8. data/vendor/components/indefinido-indemma/.ruby-gemset +1 -0
  9. data/vendor/components/indefinido-indemma/.ruby-version +1 -0
  10. data/vendor/components/indefinido-indemma/Gemfile +13 -0
  11. data/vendor/components/indefinido-indemma/Guardfile +39 -0
  12. data/vendor/components/indefinido-indemma/History.md +0 -0
  13. data/vendor/components/indefinido-indemma/Readme.md +447 -0
  14. data/vendor/components/indefinido-indemma/build/development.js +340 -0
  15. data/vendor/components/indefinido-indemma/build/release.js +22039 -0
  16. data/vendor/components/indefinido-indemma/build/test.js +22039 -0
  17. data/vendor/components/indefinido-indemma/component.json +7 -3
  18. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/component.json +18 -0
  19. data/vendor/components/indefinido-indemma/components/chaijs-assertion-error/index.js +110 -0
  20. data/vendor/components/indefinido-indemma/components/chaijs-chai/component.json +47 -0
  21. data/vendor/components/indefinido-indemma/components/chaijs-chai/index.js +1 -0
  22. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/assertion.js +130 -0
  23. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/core/assertions.js +1270 -0
  24. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/assert.js +1080 -0
  25. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/expect.js +12 -0
  26. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/interface/should.js +76 -0
  27. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addChainableMethod.js +94 -0
  28. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addMethod.js +37 -0
  29. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/addProperty.js +40 -0
  30. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/eql.js +129 -0
  31. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/flag.js +32 -0
  32. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getActual.js +19 -0
  33. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getEnumerableProperties.js +25 -0
  34. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getMessage.js +49 -0
  35. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getName.js +20 -0
  36. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getPathValue.js +102 -0
  37. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/getProperties.js +35 -0
  38. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/index.js +108 -0
  39. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/inspect.js +320 -0
  40. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/objDisplay.js +48 -0
  41. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteMethod.js +51 -0
  42. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/overwriteProperty.js +54 -0
  43. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/test.js +26 -0
  44. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/transferFlags.js +44 -0
  45. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai/utils/type.js +45 -0
  46. data/vendor/components/indefinido-indemma/components/chaijs-chai/lib/chai.js +80 -0
  47. data/vendor/components/indefinido-indemma/components/component-bind/component.json +14 -0
  48. data/vendor/components/indefinido-indemma/components/component-bind/index.js +24 -0
  49. data/vendor/components/indefinido-indemma/components/component-jquery/component.json +14 -0
  50. data/vendor/components/indefinido-indemma/components/component-jquery/index.js +9601 -0
  51. data/vendor/components/indefinido-indemma/components/component-type/component.json +18 -0
  52. data/vendor/components/indefinido-indemma/components/component-type/index.js +32 -0
  53. data/vendor/components/indefinido-indemma/components/indefinido-advisable/component.json +21 -0
  54. data/vendor/components/indefinido-indemma/components/indefinido-advisable/index.js +1 -0
  55. data/vendor/components/indefinido-indemma/components/indefinido-advisable/lib/advisable.js +60 -0
  56. data/vendor/components/indefinido-indemma/components/indefinido-observable/component.json +25 -0
  57. data/vendor/components/indefinido-indemma/components/indefinido-observable/components/cjohansen-sinon/sinon.js +4290 -0
  58. data/vendor/components/indefinido-indemma/components/indefinido-observable/index.js +1 -0
  59. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/adapters/rivets.js +26 -0
  60. data/vendor/components/indefinido-indemma/components/indefinido-observable/lib/observable.js +323 -0
  61. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors-legacy.js +92 -0
  62. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/accessors.js +173 -0
  63. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/array.indexOf.js +8 -0
  64. data/vendor/components/indefinido-indemma/components/indefinido-observable/vendor/shims/object.create.js +77 -0
  65. data/vendor/components/indefinido-indemma/components/kapit-observe-utils/component.json +13 -0
  66. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/component.json +17 -0
  67. data/vendor/components/indefinido-indemma/components/paulmillr-es6-shim/es6-shim.js +996 -0
  68. data/vendor/components/indefinido-indemma/components/pluma-assimilate/component.json +25 -0
  69. data/vendor/components/indefinido-indemma/components/pluma-assimilate/dist/assimilate.js +127 -0
  70. data/vendor/components/indefinido-indemma/karma.conf.js +86 -0
  71. data/vendor/components/indefinido-indemma/lib/record/associable.js +229 -82
  72. data/vendor/components/indefinido-indemma/lib/record/errors.js +1 -0
  73. data/vendor/components/indefinido-indemma/lib/record/persistable.js +32 -0
  74. data/vendor/components/indefinido-indemma/lib/record/queryable.js +32 -0
  75. data/vendor/components/indefinido-indemma/lib/record/resource.js +12 -4
  76. data/vendor/components/indefinido-indemma/lib/record/rest.js +1 -1
  77. data/vendor/components/indefinido-indemma/lib/record/restfulable.js +38 -27
  78. data/vendor/components/indefinido-indemma/lib/record/scopable.js +15 -2
  79. data/vendor/components/indefinido-indemma/lib/record/storable.js +48 -0
  80. data/vendor/components/indefinido-indemma/lib/record/validatable.js +10 -5
  81. data/vendor/components/indefinido-indemma/lib/record/validations/cpf.js +1 -1
  82. data/vendor/components/indefinido-indemma/lib/record.js +15 -12
  83. data/vendor/components/indefinido-indemma/spec/record/associable_spec.js +137 -0
  84. data/vendor/components/indefinido-indemma/spec/record/persistable_spec.js +36 -0
  85. data/vendor/components/indefinido-indemma/spec/record/queryable_spec.js +33 -0
  86. data/vendor/components/indefinido-indemma/spec/record/resource_spec.js +93 -0
  87. data/vendor/components/indefinido-indemma/spec/record/rest_spec.js +32 -0
  88. data/vendor/components/indefinido-indemma/spec/record/restfulable_spec.js +288 -0
  89. data/vendor/components/indefinido-indemma/spec/record/scopable_spec.js +212 -0
  90. data/vendor/components/indefinido-indemma/spec/record/storable_spec.js +53 -0
  91. data/vendor/components/indefinido-indemma/spec/record/translationable.js +28 -0
  92. data/vendor/components/indefinido-indemma/spec/record/validatable_spec.js +111 -0
  93. data/vendor/components/indefinido-indemma/spec/record/validations/associated_spec.js +43 -0
  94. data/vendor/components/indefinido-indemma/spec/record/validations/confirmation_spec.js +36 -0
  95. data/vendor/components/indefinido-indemma/spec/record/validations/cpf_spec.js +35 -0
  96. data/vendor/components/indefinido-indemma/spec/record/validations/presence_spec.js +28 -0
  97. data/vendor/components/indefinido-indemma/spec/record/validations/remote_spec.js +87 -0
  98. data/vendor/components/indefinido-indemma/spec/record/validations/type_spec.js +48 -0
  99. data/vendor/components/indefinido-indemma/spec/record_spec.js +37 -0
  100. data/vendor/components/indefinido-indemma/spec/spec_helper.js +11 -0
  101. data/vendor/components/indefinido-indemma/spec/support/value_objects/phone.js +45 -0
  102. data/vendor/components/indefinido-indemma/src/lib/extensions/rivets.coffee +17 -0
  103. data/vendor/components/indefinido-indemma/src/lib/record/associable.coffee +342 -0
  104. data/vendor/components/indefinido-indemma/src/lib/record/errors.coffee +20 -0
  105. data/vendor/components/indefinido-indemma/src/lib/record/maid.coffee +16 -0
  106. data/vendor/components/indefinido-indemma/src/lib/record/persistable.coffee +27 -0
  107. data/vendor/components/indefinido-indemma/src/lib/record/queryable.coffee +29 -0
  108. data/vendor/components/indefinido-indemma/src/lib/record/resource.coffee +106 -0
  109. data/vendor/components/indefinido-indemma/src/lib/record/rest.coffee +28 -0
  110. data/vendor/components/indefinido-indemma/src/lib/record/restfulable.coffee +348 -0
  111. data/vendor/components/indefinido-indemma/src/lib/record/scopable.coffee +275 -0
  112. data/vendor/components/indefinido-indemma/src/lib/record/storable.coffee +46 -0
  113. data/vendor/components/indefinido-indemma/src/lib/record/translationable.coffee +18 -0
  114. data/vendor/components/indefinido-indemma/src/lib/record/validatable.coffee +217 -0
  115. data/vendor/components/indefinido-indemma/src/lib/record/validations/associated.coffee +32 -0
  116. data/vendor/components/indefinido-indemma/src/lib/record/validations/confirmation.coffee +19 -0
  117. data/vendor/components/indefinido-indemma/src/lib/record/validations/cpf.coffee +58 -0
  118. data/vendor/components/indefinido-indemma/src/lib/record/validations/presence.coffee +19 -0
  119. data/vendor/components/indefinido-indemma/src/lib/record/validations/remote.coffee +65 -0
  120. data/vendor/components/indefinido-indemma/src/lib/record/validations/type.coffee +32 -0
  121. data/vendor/components/indefinido-indemma/src/lib/record.coffee +136 -0
  122. data/vendor/components/indefinido-indemma/src/spec/record/associable_spec.coffee +130 -0
  123. data/vendor/components/indefinido-indemma/src/spec/record/persistable_spec.coffee +30 -0
  124. data/vendor/components/indefinido-indemma/src/spec/record/queryable_spec.coffee +27 -0
  125. data/vendor/components/indefinido-indemma/src/spec/record/resource_spec.coffee +69 -0
  126. data/vendor/components/indefinido-indemma/src/spec/record/rest_spec.coffee +22 -0
  127. data/vendor/components/indefinido-indemma/src/spec/record/restfulable_spec.coffee +207 -0
  128. data/vendor/components/indefinido-indemma/src/spec/record/scopable_spec.coffee +191 -0
  129. data/vendor/components/indefinido-indemma/src/spec/record/storable_spec.coffee +40 -0
  130. data/vendor/components/indefinido-indemma/src/spec/record/translationable.coffee +19 -0
  131. data/vendor/components/indefinido-indemma/src/spec/record/validatable_spec.coffee +100 -0
  132. data/vendor/components/indefinido-indemma/src/spec/record/validations/associated_spec.coffee +35 -0
  133. data/vendor/components/indefinido-indemma/src/spec/record/validations/confirmation_spec.coffee +25 -0
  134. data/vendor/components/indefinido-indemma/src/spec/record/validations/cpf_spec.coffee +28 -0
  135. data/vendor/components/indefinido-indemma/src/spec/record/validations/presence_spec.coffee +24 -0
  136. data/vendor/components/indefinido-indemma/src/spec/record/validations/remote_spec.coffee +74 -0
  137. data/vendor/components/indefinido-indemma/src/spec/record/validations/type_spec.coffee +33 -0
  138. data/vendor/components/indefinido-indemma/src/spec/record_spec.coffee +23 -0
  139. data/vendor/components/indefinido-indemma/src/spec/spec_helper.coffee +9 -0
  140. data/vendor/components/indefinido-indemma/src/spec/support/value_objects/phone.coffee +30 -0
  141. data/vendor/components/indefinido-indemma/vendor/object/mixin.js +196 -0
  142. data/vendor/components/indefinido-indemma/vendor/owl/pluralize.js +190 -0
  143. metadata +130 -2
@@ -0,0 +1,40 @@
1
+ root = exports ? window
2
+
3
+ storable = require 'indemma/lib/record/storable'
4
+
5
+ describe 'storable', ->
6
+ it 'should set the storable key', ->
7
+ model.should.have.property 'storable', true
8
+
9
+ beforeEach ->
10
+ @storage = storable()
11
+
12
+ describe "#store", ->
13
+
14
+ describe "write", ->
15
+ it "should write object on deep storage"
16
+ # storage.store 'users.1', data
17
+
18
+ it "should write object on storage", ->
19
+ data = name: 'Arthur Dent'
20
+ @storage.store '1', data
21
+ @storage.writes.should.be.eq 1
22
+ @storage.database['1'].should.be.eq data
23
+
24
+ it "should mark an object as sustained", ->
25
+ data = name: 'Arthur Dent'
26
+ @storage.store '1', data
27
+ data.should.have.property 'sustained', true
28
+
29
+
30
+ describe "read", ->
31
+ data = null
32
+
33
+ beforeEach ->
34
+ data = name: 'Arthur Dent'
35
+ @storage.store '1', data
36
+
37
+ it "should save object on storage", ->
38
+ @storage.store('1').should.be.eq data
39
+
40
+ it "should unmark an object as sustained"
@@ -0,0 +1,19 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/translationable'
4
+
5
+ describe 'model', ->
6
+ model = root.model
7
+ person = null
8
+
9
+ beforeEach ->
10
+ person = model.call
11
+ resource : 'person'
12
+ name: String
13
+ translation:
14
+ attributes:
15
+ name: 'Batata'
16
+
17
+ describe '#human_attribute_name', ->
18
+ it 'should return the translated attribute name', ->
19
+ person.human_attribute_name('name').should.be.eq 'Batata'
@@ -0,0 +1,100 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model', ->
6
+ model = root.model
7
+ person = corporation = null
8
+
9
+ beforeEach ->
10
+ person = model.call resource : 'person'
11
+
12
+ it 'should store validators', ->
13
+ person.should.have.property 'validators'
14
+ person.validators.should.be.an 'array'
15
+
16
+ describe '#()', ->
17
+
18
+ describe 'validators instatiation', ->
19
+
20
+ it 'should instantiate validators with prefix validates_', ->
21
+ person = model.call
22
+ resource : 'person'
23
+ name : String
24
+ validates_presence_of: 'name'
25
+
26
+ person.validators.should.not.be.empty
27
+ validator = person.validators[0]
28
+ validator.should.have.property 'attribute_name', 'name'
29
+
30
+ it 'should instantiate validators with in the key validates'
31
+ #person = model.call
32
+ # resource : 'person'
33
+ # name : String
34
+ # validates : {name: {presence: true} }
35
+
36
+ #person.validators.should.have.key 'name'
37
+
38
+ describe '#validate_attribute', ->
39
+
40
+ beforeEach ->
41
+ # TODO implement better model redefinition pattern
42
+ person.validators.length = 0
43
+
44
+ person = model.call
45
+ resource : 'person'
46
+ name : String
47
+ validates_presence_of: 'name'
48
+
49
+ it 'should add error messages for the validated attribute', ->
50
+ arthur = person name: null
51
+
52
+ arthur.validate_attribute 'name'
53
+
54
+ arthur.errors.length.should.be.eq 1
55
+ arthur.errors.messages.should.have.property 'name'
56
+
57
+ describe '.valid', ->
58
+ person = null
59
+
60
+ beforeEach ->
61
+ # TODO implement better model redefinition pattern
62
+ person.validators.length = 0
63
+
64
+ person = model.call
65
+ resource : 'person'
66
+ name : String
67
+ validates_presence_of: 'name'
68
+
69
+ # TODO more specific .valid test functionality
70
+ it 'should be true when valid', ->
71
+ arthur = person name: "Arthur"
72
+
73
+ arthur.should.have.property 'valid'
74
+ arthur.valid.should.be.true
75
+ arthur.errors.length.should.be.eq 0
76
+
77
+
78
+ it 'should exist as read only property', ->
79
+ arthur = person name: "Arthur"
80
+ expect(-> arthur.valid = false).to.throw Error
81
+
82
+ it 'should validate record', ->
83
+ anonymous = person name: null
84
+ anonymous.valid.should.be.false
85
+ anonymous.errors.length.should.be.eq 1
86
+
87
+ it 'should not validate record util it changes', ->
88
+ anonymous = person name: null
89
+
90
+ anonymous.valid.should.be.false
91
+ anonymous.errors.length.should.be.eq 1
92
+
93
+ validation = anonymous.validation
94
+ # We expect it to not instanitante new validation deferred
95
+ anonymous.validate().should.be.eq validation
96
+
97
+ # Record for some reason changed
98
+ anonymous.dirty = true
99
+ # We expect it to instanitante new validation deferred
100
+ anonymous.validate().should.not.be.eq validation
@@ -0,0 +1,35 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates_associated', ->
6
+
7
+ describe 'basic usage', ->
8
+ model = root.model
9
+ person = address = null
10
+
11
+ beforeEach ->
12
+ address = model.call
13
+ resource : 'address'
14
+ street : String
15
+ validates_presence_of: 'street'
16
+
17
+ person = model.call
18
+ resource : 'person'
19
+ has_one : 'address'
20
+ validates_associated: 'address'
21
+
22
+ afterEach ->
23
+ person.validators.length = 0
24
+ address.validators.length = 0
25
+
26
+ describe '#validate', ->
27
+
28
+ it 'should add error to record when fields does not match', ->
29
+ arthur = person {}
30
+ arthur.build_address street: null
31
+
32
+ arthur.valid
33
+
34
+ arthur.errors.messages.should.have.deep.property 'address', 'O registro associado address não é válido.'
35
+ arthur.address.errors.messages.should.have.deep.property 'street', 'O campo street não pode ficar em branco.'
@@ -0,0 +1,25 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates_confirmation_of', ->
6
+
7
+ describe 'basic usage', ->
8
+ model = root.model
9
+ person = null
10
+
11
+ beforeEach ->
12
+ person = model.call
13
+ resource : 'person'
14
+ password : String
15
+ validates_confirmation_of: 'password'
16
+
17
+ afterEach ->
18
+ person.validators.length = 0
19
+
20
+ describe '#validate', ->
21
+
22
+ it 'should add error to record when fields does not match', ->
23
+ arthur = person password: "domo", password_confirmation: "kun"
24
+ arthur.valid
25
+ arthur.errors.messages.should.have.deep.property 'password_confirmation', 'O campo password não está de acordo com o campo password_confirmation.'
@@ -0,0 +1,28 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates_cpf_format', ->
6
+
7
+ describe 'basic usage', ->
8
+ model = root.model
9
+ person = null
10
+
11
+ beforeEach ->
12
+ person = model.call
13
+ resource : 'person'
14
+ cpf : String
15
+ validates_cpf_format: 'cpf'
16
+
17
+ afterEach ->
18
+ # Clear validators from resource
19
+ person?.validators.length = 0
20
+
21
+ describe '#validate', ->
22
+
23
+ it 'should add error to record when fields is in invalid format', ->
24
+ arthur = person cpf: '871.943.417-00'
25
+ arthur.valid
26
+
27
+ # TODO figure out why the heck the validators aren't being reset
28
+ arthur.errors.messages.should.have.deep.property 'cpf', "O campo cpf não está válido."
@@ -0,0 +1,24 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates presence of', ->
6
+
7
+ describe 'basic usage', ->
8
+ model = root.model
9
+ person = null
10
+
11
+ beforeEach ->
12
+ person = model.call
13
+ resource : 'person'
14
+ name : String
15
+ belongs_to: 'corporation'
16
+ validates_presence_of: 'name'
17
+
18
+ afterEach ->
19
+ person.validators.length = 0
20
+
21
+ describe '#validate', ->
22
+
23
+ it 'should add error to record when required field is empty (null, undefined or \'\')'
24
+
@@ -0,0 +1,74 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates_remotely', ->
6
+ model = root.model
7
+ request = arthur = person = null
8
+
9
+ describe 'basic usage', ->
10
+
11
+ beforeEach ->
12
+ person = model.call
13
+ resource : 'person'
14
+ name : String
15
+ validates_remotely: 'name'
16
+
17
+ arthur = person name: "Arthur Dent"
18
+
19
+ afterEach ->
20
+ person?.validators.length = 0
21
+
22
+ describe '#validate', ->
23
+
24
+ beforeEach ->
25
+ request = jQuery.Deferred()
26
+ sinon.stub(jQuery, "ajax").returns(request)
27
+
28
+ afterEach -> jQuery.ajax.restore()
29
+
30
+ it 'should send paramenters accordingly', ->
31
+ arthur.validate()
32
+
33
+ jQuery.ajax.called.should.be.true
34
+
35
+ jQuery.ajax.calledWithMatch(
36
+ url: '/people/validate'
37
+ type: 'post'
38
+ data:
39
+ person:
40
+ name: 'Arthur Dent'
41
+ ).should.be.true
42
+
43
+
44
+ it 'should add errors to record when request responds with errors', ->
45
+ arthur.validate()
46
+ request.resolveWith arthur,
47
+ [name: ['The name should be Marvin!', 'The name should be in lowercase!']]
48
+
49
+ arthur.errors.length.should.be.eq 2
50
+ arthur.errors.messages.name.should.exist
51
+
52
+ describe 'with options usage', ->
53
+
54
+ beforeEach ->
55
+ person?.validators.length = 0
56
+
57
+ person = model.call
58
+ resource : 'person'
59
+ name : String
60
+ validates_remotely: 'name'
61
+
62
+ arthur = person name: "Arthur Dent"
63
+
64
+ describe '#validate', ->
65
+
66
+ beforeEach ->
67
+ request = jQuery.Deferred()
68
+ sinon.stub(jQuery, "ajax").returns(request)
69
+
70
+ afterEach -> jQuery.ajax.restore()
71
+
72
+ it 'should make ajax call', ->
73
+ arthur.validate()
74
+ jQuery.ajax.called.should.be.true
@@ -0,0 +1,33 @@
1
+ root = exports ? window
2
+
3
+ require 'indemma/lib/record/validatable'
4
+
5
+ describe 'model #() validates type of', ->
6
+
7
+ describe 'basic usage', ->
8
+ model = root.model
9
+ person = null
10
+
11
+ beforeEach ->
12
+ person = model.call
13
+ resource : 'person'
14
+ name : String
15
+ phone : Phone
16
+ validates_type_of: ['name', 'phone']
17
+
18
+ afterEach ->
19
+ person.validators.length = 0
20
+
21
+ describe '#validate', ->
22
+
23
+ #it 'should use Phone#valid getter to find out if object is valid'
24
+ it 'should use Phone#validate to find out if attribute is valid'
25
+ it 'should add error to record when phone typed attribute has an non valid phone value', ->
26
+ arthur = person phone: new Phone 'batata'
27
+ arthur.valid.should.be.false
28
+ arthur.errors.messages.should.have.property 'phone'
29
+ expect(arthur.errors.messages.phone).to.match /não está válido/
30
+
31
+ it 'should throw error to when phone typed attribute has an non phone value', ->
32
+ arthur = person phone: 'batata'
33
+ expect( -> arthur.valid).to.throw /invalid attribute value type/i
@@ -0,0 +1,23 @@
1
+ root = exports ? window
2
+
3
+ describe 'record', ->
4
+ record = root.record
5
+
6
+ it 'should create a record', ->
7
+ arthur = record.call resource: 'person'
8
+ arthur.should.be.object
9
+
10
+ describe 'model', ->
11
+ model = root.model
12
+
13
+ describe '#()', ->
14
+
15
+ xit 'should throw exception if no resource is passed'
16
+
17
+ it 'should create a record factory', ->
18
+ person = model.call resource: 'person'
19
+ person.should.be.object
20
+
21
+ john = person()
22
+ john.should.be.object
23
+ john.resource.should.have.property 'name', 'person'
@@ -0,0 +1,9 @@
1
+ root = exports ? window
2
+
3
+ indemma = require 'indemma'
4
+ chai = require 'chaijs-chai'
5
+
6
+ # sinon is included on karma.conf.js
7
+
8
+ root.expect = chai.expect
9
+ root.should = chai.should()
@@ -0,0 +1,30 @@
1
+ # TODO locales support
2
+ class @Phone
3
+
4
+ constructor: (@area_code, @number) ->
5
+ {@area_code, @number} = @area_code if typeof @area_code == 'object'
6
+
7
+
8
+ # TODO parse argument types to validate value object domain
9
+ # constraints
10
+
11
+ unless @number
12
+ @number = @area_code
13
+ @area_code = null
14
+
15
+ Object.defineProperty @, 'valid', get: @validate
16
+
17
+ # TODO move type validation to indemma files
18
+ validate: -> @area_code? && @number?
19
+
20
+ toString: ->
21
+ formatted_number = @number.substr(0, 4) + '-' + @number.substr(4) if @number?
22
+
23
+ if @area_code?
24
+ "(#{@area_code}) #{formatted_number}"
25
+ else
26
+ formatted_number
27
+
28
+ toJSON: ->
29
+ area_code: @area_code
30
+ number: @number
@@ -0,0 +1,196 @@
1
+ /*jslint browser: true, forin: true, plusplus: true, indent: 4 */
2
+ (function(Object, mixin) {
3
+ "use strict"; // happy linter ^_____^
4
+
5
+ /* <droppable> interesting code after line 110, here
6
+ * ad-hoc polyfill section for this purpose only
7
+ * never use these functions outside this closure ... like ...
8
+ ne*/var
9
+
10
+ // borrowed methods for unknown Objects
11
+ ObjectPrototype = Object.prototype,
12
+
13
+ lookupGetter = ObjectPrototype.__lookupGetter__,
14
+ lookupSetter = ObjectPrototype.__lookupSetter__,
15
+ defineGetter = ObjectPrototype.__defineGetter__,
16
+ defineSetter = ObjectPrototype.__defineSetter__,
17
+ has = ObjectPrototype.hasOwnProperty,
18
+
19
+ emptyArray = [],
20
+ // slice = emptyArray.slice,
21
+
22
+ // for IE < 9 and non IE5 yet browsers
23
+ goNative = true,
24
+ defineProperty = (function(defineProperty){
25
+ try{
26
+ return defineProperty && defineProperty({},'_',{value:1})._ && defineProperty;
27
+ } catch(IE8) {
28
+ goNative = false;
29
+ }
30
+ }(Object.defineProperty)) ||
31
+ function (o, k, d) {
32
+ var
33
+ get = d.get, // has.call(d, 'get') would be better but
34
+ set = d.set; // ES5 is just like this
35
+ if (get && defineGetter) {
36
+ defineGetter.call(o, k, get);
37
+ }
38
+ if (set && defineSetter) {
39
+ defineSetter.call(o, k, set);
40
+ }
41
+ if (!(get || set)) {
42
+ o[k] = d.value;
43
+ }
44
+ },
45
+ // for IE < 9 and non IE5 yet browsers
46
+ getOwnPropertyNames = (goNative && Object.getOwnPropertyNames) ||
47
+ (function () {
48
+ var
49
+ addHiddenOwnProperties = function (result) {
50
+ return result;
51
+ },
52
+ list = [],
53
+ key,
54
+ i,
55
+ length;
56
+
57
+ for (key in {valueOf: key}) {
58
+ list.push(key);
59
+ }
60
+
61
+ if (!list.length) {
62
+ length = list.push(
63
+ 'constructor',
64
+ 'hasOwnProperty',
65
+ 'isPrototypeOf',
66
+ 'propertyIsEnumerable',
67
+ 'toLocaleString',
68
+ 'toString',
69
+ 'valueOf'
70
+ ) - 1;
71
+ addHiddenOwnProperties = function (result, o) {
72
+ for (i = 0; i < length; i++) {
73
+ key = list[i];
74
+ if (has.call(o, key)) {
75
+ result.push(key);
76
+ }
77
+ }
78
+ return result;
79
+ };
80
+ }
81
+
82
+ return function (o) {
83
+ var
84
+ result = [],
85
+ key;
86
+ for (key in o) {
87
+ if (has.call(o, key)) {
88
+ result.push(key);
89
+ }
90
+ }
91
+ return addHiddenOwnProperties(result, o);
92
+ };
93
+ }()),
94
+ // IE < 9 or other non ES5 yet browsers
95
+ getOwnPropertyDescriptor = (goNative && Object.getOwnPropertyDescriptor) ||
96
+ function (o, k) {
97
+ var
98
+ descriptor = {
99
+ enumerable: true,
100
+ configurable: true
101
+ },
102
+ get = lookupGetter && lookupGetter.call(o, k),
103
+ set = lookupSetter && lookupSetter.call(o, k);
104
+ if (get) {
105
+ descriptor.get = get;
106
+ }
107
+ if (set) {
108
+ descriptor.set = set;
109
+ }
110
+ if (!(get || set)) {
111
+ descriptor.writable = true;
112
+ descriptor.value = o[k];
113
+ }
114
+ return descriptor;
115
+ };
116
+ // </droppable>
117
+
118
+ // if already defined get out of here
119
+ // this should be
120
+ // if (mixin in Object) return;
121
+ // but for some reason I went for JSLint ...
122
+ if (Object[mixin]) {
123
+ return;
124
+ }
125
+ // same descriptor as other spec'd methods
126
+ defineProperty(
127
+ Object,
128
+ mixin,
129
+ {
130
+ enumerable: false,
131
+ writable: true,
132
+ configurable: true,
133
+ value: function (
134
+ target, // object to enrich with
135
+ source, // mixin object or Trait (Function)
136
+ args // optional arguments for Trait
137
+ ) {
138
+ var
139
+ i,
140
+ length,
141
+ keys,
142
+ key;
143
+
144
+ if (typeof source === 'function') {
145
+ // if the source is a function
146
+ // it will be invoked with object as target
147
+ // this let us define mixin as closures
148
+ // function addFunctionality() {
149
+ // this.functionality = function () {
150
+ // // do amazing stuff
151
+ // }
152
+ // }
153
+ // addFunctionality.call(Class.prototype);
154
+ // addFunctionality.call(genericObject);
155
+ // // or
156
+ // Object.mixin(Class.prototype, addFunctionality);
157
+
158
+ source.apply(target, args || emptyArray);
159
+ /*
160
+ // try to perform as fast as possible
161
+ if (arguments.length < 3) {
162
+ // so if no extra args are passed ...
163
+ source.call(target);
164
+ } else {
165
+ // there is no need to slice them as done here
166
+ source.apply(target, slice.call(arguments, 2));
167
+ }
168
+ */
169
+ } else {
170
+ // if source is an object
171
+ // grab all possibe properties
172
+ // and per each of them ...
173
+ keys = getOwnPropertyNames(source);
174
+ length = keys.length;
175
+ i = 0;
176
+ while (i < length) {
177
+ key = keys[i++];
178
+ // ... define it ...
179
+ defineProperty(
180
+ target,
181
+ key,
182
+ // ... using the same descriptor
183
+ getOwnPropertyDescriptor(
184
+ source,
185
+ key
186
+ )
187
+ );
188
+ }
189
+ }
190
+ // always return the initial target
191
+ // ignoring all possible different return with functions
192
+ return target;
193
+ }
194
+ }
195
+ );
196
+ }(Object, 'mixin'));