ende 0.5.20 → 0.5.21
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.
- checksums.yaml +4 -4
- data/component.json +1 -1
- data/components/indefinido/indemma/master/.gitignore +17 -0
- data/components/indefinido/indemma/master/.ruby-gemset +1 -0
- data/components/indefinido/indemma/master/.ruby-version +1 -0
- data/components/indefinido/indemma/master/Gemfile +12 -0
- data/components/indefinido/indemma/master/Guardfile +39 -0
- data/components/indefinido/indemma/master/History.md +0 -0
- data/components/indefinido/indemma/master/Readme.md +445 -0
- data/components/indefinido/indemma/master/build/development.js +26123 -0
- data/components/indefinido/indemma/master/build/release.js +16741 -0
- data/components/indefinido/indemma/master/build/test.js +26123 -0
- data/components/indefinido/indemma/master/component.json +1 -1
- data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/component.json +18 -0
- data/components/indefinido/indemma/master/components/chaijs/assertion-error/1.0.0/index.js +110 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.gitignore +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.mailmap +1 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.npmignore +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/.travis.yml +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/CONTRIBUTING.md +173 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/History.md +895 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/Makefile +93 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/README.md +99 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/ReleaseNotes.md +482 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/bower.json +27 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/chai.js +4782 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/component.json +50 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/index.js +1 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.conf.js +28 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/karma.sauce.js +41 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/assertion.js +130 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/config.js +50 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/core/assertions.js +1314 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/assert.js +1056 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/expect.js +12 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/interface/should.js +78 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addChainableMethod.js +111 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addMethod.js +43 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/addProperty.js +40 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/flag.js +32 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getActual.js +18 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getEnumerableProperties.js +25 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getMessage.js +49 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getName.js +20 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getPathValue.js +102 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/getProperties.js +35 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/index.js +114 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/inspect.js +320 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/objDisplay.js +49 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteChainableMethod.js +53 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteMethod.js +51 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/overwriteProperty.js +54 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/test.js +26 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/transferFlags.js +44 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai/utils/type.js +45 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/lib/chai.js +87 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/package.json +42 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/sauce.browsers.js +128 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_block.sh +7 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/support/sauce/sauce_connect_setup.sh +53 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/assert.js +638 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/auth/.gitkeep +0 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/index.js +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/bootstrap/karma.js +22 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/configuration.js +133 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/errors.js +14 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/display/message.js +47 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/expect.js +814 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/globalShould.js +15 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/plugins.js +24 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/should.js +744 -0
- data/components/indefinido/indemma/master/components/chaijs/chai/1.9.1/test/utilities.js +309 -0
- data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/component.json +20 -0
- data/components/indefinido/indemma/master/components/chaijs/deep-eql/0.1.3/lib/eql.js +257 -0
- data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/component.json +18 -0
- data/components/indefinido/indemma/master/components/chaijs/type-detect/0.1.1/lib/type.js +142 -0
- data/components/indefinido/indemma/master/components/component/bind/1.0.0/component.json +14 -0
- data/components/indefinido/indemma/master/components/component/bind/1.0.0/index.js +23 -0
- data/components/indefinido/indemma/master/components/component/jquery/1.0.0/component.json +10 -0
- data/components/indefinido/indemma/master/components/component/jquery/1.0.0/index.js +10308 -0
- data/components/indefinido/indemma/master/components/component/type/1.0.0/component.json +20 -0
- data/components/indefinido/indemma/master/components/component/type/1.0.0/index.js +32 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/component.json +21 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/index.js +1 -0
- data/components/indefinido/indemma/master/components/indefinido/advisable/master/lib/advisable.js +60 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/component.json +39 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/index.js +1 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/adapters/rivets.js +40 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/notifierable.js +145 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/legacy/schedulerable.js +147 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/lookup.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/keypath_observer.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/observation.js +45 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/selection.js +57 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable/self_observer.js +38 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/observable.js +97 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/lib/platform.js +12 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/observe-js/observe.js +1631 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors-legacy.js +92 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/accessors.js +248 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/array.indexOf.js +8 -0
- data/components/indefinido/indemma/master/components/indefinido/observable/es6-modules/vendor/shims/object.create.js +77 -0
- data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/component.json +25 -0
- data/components/indefinido/indemma/master/components/pluma/assimilate/0.4.0/dist/assimilate.js +127 -0
- data/components/indefinido/indemma/master/karma.conf.js +75 -0
- data/components/indefinido/indemma/master/lib/record/associable.js +4 -2
- data/components/indefinido/indemma/master/lib/record/dirtyable.js +1 -1
- data/components/indefinido/indemma/master/package.json +9 -0
- data/components/indefinido/indemma/master/spec/record/associable_spec.js +211 -0
- data/components/indefinido/indemma/master/spec/record/dirtyable_spec.js +57 -0
- data/components/indefinido/indemma/master/spec/record/maid_spec.js +40 -0
- data/components/indefinido/indemma/master/spec/record/persistable_spec.js +46 -0
- data/components/indefinido/indemma/master/spec/record/queryable_spec.js +39 -0
- data/components/indefinido/indemma/master/spec/record/resource_spec.js +93 -0
- data/components/indefinido/indemma/master/spec/record/rest_spec.js +32 -0
- data/components/indefinido/indemma/master/spec/record/restfulable_spec.js +346 -0
- data/components/indefinido/indemma/master/spec/record/scopable_spec.js +242 -0
- data/components/indefinido/indemma/master/spec/record/storable_spec.js +44 -0
- data/components/indefinido/indemma/master/spec/record/translationable.js +28 -0
- data/components/indefinido/indemma/master/spec/record/validatable_spec.js +142 -0
- data/components/indefinido/indemma/master/spec/record/validations/associated_spec.js +43 -0
- data/components/indefinido/indemma/master/spec/record/validations/confirmation_spec.js +36 -0
- data/components/indefinido/indemma/master/spec/record/validations/cpf_spec.js +34 -0
- data/components/indefinido/indemma/master/spec/record/validations/presence_spec.js +28 -0
- data/components/indefinido/indemma/master/spec/record/validations/remote_spec.js +87 -0
- data/components/indefinido/indemma/master/spec/record/validations/type_spec.js +48 -0
- data/components/indefinido/indemma/master/spec/record_spec.js +49 -0
- data/components/indefinido/indemma/master/spec/spec_helper.js +15 -0
- data/components/indefinido/indemma/master/spec/support/value_objects/phone.js +45 -0
- data/components/indefinido/indemma/master/src/lib/extensions/rivets.coffee +17 -0
- data/components/indefinido/indemma/master/src/lib/record/associable.coffee +419 -0
- data/components/indefinido/indemma/master/src/lib/record/dirtyable.coffee +47 -0
- data/components/indefinido/indemma/master/src/lib/record/errors.coffee +20 -0
- data/components/indefinido/indemma/master/src/lib/record/maid.coffee +16 -0
- data/components/indefinido/indemma/master/src/lib/record/persistable.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/queryable.coffee +29 -0
- data/components/indefinido/indemma/master/src/lib/record/resource.coffee +107 -0
- data/components/indefinido/indemma/master/src/lib/record/rest.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/restfulable.coffee +487 -0
- data/components/indefinido/indemma/master/src/lib/record/scopable.coffee +279 -0
- data/components/indefinido/indemma/master/src/lib/record/storable.coffee +49 -0
- data/components/indefinido/indemma/master/src/lib/record/translationable.coffee +18 -0
- data/components/indefinido/indemma/master/src/lib/record/validatable.coffee +241 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/associated.coffee +34 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/confirmation.coffee +17 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/cpf.coffee +57 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/presence.coffee +16 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/remote.coffee +61 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/type.coffee +31 -0
- data/components/indefinido/indemma/master/src/lib/record/validations/validatorable.coffee +5 -0
- data/components/indefinido/indemma/master/src/lib/record.coffee +143 -0
- data/components/indefinido/indemma/master/src/spec/record/associable_spec.coffee +205 -0
- data/components/indefinido/indemma/master/src/spec/record/dirtyable_spec.coffee +47 -0
- data/components/indefinido/indemma/master/src/spec/record/maid_spec.coffee +34 -0
- data/components/indefinido/indemma/master/src/spec/record/persistable_spec.coffee +39 -0
- data/components/indefinido/indemma/master/src/spec/record/queryable_spec.coffee +33 -0
- data/components/indefinido/indemma/master/src/spec/record/resource_spec.coffee +69 -0
- data/components/indefinido/indemma/master/src/spec/record/rest_spec.coffee +22 -0
- data/components/indefinido/indemma/master/src/spec/record/restfulable_spec.coffee +257 -0
- data/components/indefinido/indemma/master/src/spec/record/scopable_spec.coffee +227 -0
- data/components/indefinido/indemma/master/src/spec/record/storable_spec.coffee +39 -0
- data/components/indefinido/indemma/master/src/spec/record/translationable.coffee +19 -0
- data/components/indefinido/indemma/master/src/spec/record/validatable_spec.coffee +127 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/associated_spec.coffee +35 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/confirmation_spec.coffee +25 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/cpf_spec.coffee +27 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/presence_spec.coffee +24 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/remote_spec.coffee +74 -0
- data/components/indefinido/indemma/master/src/spec/record/validations/type_spec.coffee +33 -0
- data/components/indefinido/indemma/master/src/spec/record_spec.coffee +29 -0
- data/components/indefinido/indemma/master/src/spec/spec_helper.coffee +11 -0
- data/components/indefinido/indemma/master/src/spec/support/value_objects/phone.coffee +30 -0
- data/components/indefinido/indemma/master/vendor/object/mixin.js +196 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/assert.js +199 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/behavior.js +334 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/call.js +205 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/collection.js +155 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/match.js +245 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/mock.js +451 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/sandbox.js +144 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/spy.js +413 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/stub.js +161 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/test.js +77 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/test_case.js +99 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/event.js +94 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server.js +212 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_server_with_clock.js +83 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_timers.js +405 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xdomain_request.js +206 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/fake_xml_http_request.js +575 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/timers_ie.js +31 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/xdr_ie.js +14 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon/util/xhr_ie.js +19 -0
- data/components/indefinido/indemma/master/vendor/spec/sinon.js +383 -0
- data/lib/assets/javascripts/value_objects/phone.js.coffee +3 -1
- data/lib/assets/javascripts/widgets/viewer/plugins/scopable.js.coffee +5 -5
- data/lib/ende/version.rb +1 -1
- data/vendor/assets/components/ende_build.css +4 -4
- data/vendor/assets/components/ende_build.js +7974 -7889
- metadata +191 -5
- data/vendor/assets/component/build.css +0 -112
- data/vendor/assets/components/build.css +0 -112
- data/vendor/assets/components/indemma_with_none.js +0 -30553
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# TODO Add base settings to validation
|
|
2
|
+
# model = window.model
|
|
3
|
+
|
|
4
|
+
# TODO implement method
|
|
5
|
+
# model[resource].validators_on 'field' # Get all validators related to this field
|
|
6
|
+
|
|
7
|
+
stampit = require '../../../vendor/stampit'
|
|
8
|
+
|
|
9
|
+
presenceable = stampit
|
|
10
|
+
validate_each: (record, attribute, value) ->
|
|
11
|
+
if value == null or value == '' or value == undefined
|
|
12
|
+
record.errors.add attribute, 'blank', @options
|
|
13
|
+
|
|
14
|
+
composed = stampit.compose require('./validatorable'), presenceable
|
|
15
|
+
composed.definition_key = 'validates_presence_of'
|
|
16
|
+
module.exports = composed
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# TODO Add base settings to validation
|
|
2
|
+
# model = window.model
|
|
3
|
+
|
|
4
|
+
# TODO implement method
|
|
5
|
+
# model[resource].validators_on 'field' # Get all validators related to this field
|
|
6
|
+
|
|
7
|
+
rest = require '../rest'
|
|
8
|
+
stampit = require '../../../vendor/stampit'
|
|
9
|
+
|
|
10
|
+
remoteable = stampit
|
|
11
|
+
validate_each: (record, attribute, value) ->
|
|
12
|
+
data = @json record
|
|
13
|
+
|
|
14
|
+
# TODO best partial application
|
|
15
|
+
# @post(data).done(_.partial @succeeded, record)
|
|
16
|
+
@post(data).done((json) => @succeeded(json, record))
|
|
17
|
+
|
|
18
|
+
json: (record) ->
|
|
19
|
+
param = @resource.param_name || @resource.toString()
|
|
20
|
+
|
|
21
|
+
data = {}
|
|
22
|
+
data[param] = record.json()
|
|
23
|
+
|
|
24
|
+
# TODO stop renaming id field, lol
|
|
25
|
+
data[param].id ||= data[param]._id
|
|
26
|
+
delete data[param]._id
|
|
27
|
+
|
|
28
|
+
data
|
|
29
|
+
|
|
30
|
+
# TODO Use rest.post
|
|
31
|
+
post: (data) ->
|
|
32
|
+
|
|
33
|
+
jQuery.ajax
|
|
34
|
+
url : @route
|
|
35
|
+
data : data
|
|
36
|
+
type : 'post'
|
|
37
|
+
dataType: 'json'
|
|
38
|
+
context : @
|
|
39
|
+
|
|
40
|
+
succeeded: (json, record) ->
|
|
41
|
+
error_messages = json[@attribute_name]
|
|
42
|
+
|
|
43
|
+
return unless error_messages
|
|
44
|
+
|
|
45
|
+
for error_message in error_messages
|
|
46
|
+
record.errors.add @attribute_name, 'server', server_message: error_message
|
|
47
|
+
,
|
|
48
|
+
message: "Remote validation failed"
|
|
49
|
+
route: null
|
|
50
|
+
, ->
|
|
51
|
+
# TODO discover why @model.route is coming null!
|
|
52
|
+
# Desglobalize model constant
|
|
53
|
+
pluralized_resource = model.pluralize @model.resource.toString()
|
|
54
|
+
@resource = @model.resource
|
|
55
|
+
@route ||= "/#{pluralized_resource}/validate"
|
|
56
|
+
@
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
composed = stampit.compose require('./validatorable'), remoteable
|
|
60
|
+
composed.definition_key = 'validates_remotely'
|
|
61
|
+
module.exports = composed
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# TODO Add base settings to validation
|
|
2
|
+
# model = window.model
|
|
3
|
+
|
|
4
|
+
# TODO implement method
|
|
5
|
+
# model[resource].validators_on 'field' # Get all validators related to this field
|
|
6
|
+
|
|
7
|
+
validations = require '../validatable'
|
|
8
|
+
stampit = require '../../../vendor/stampit'
|
|
9
|
+
|
|
10
|
+
typeable = stampit
|
|
11
|
+
validate_each: (record, attribute, value) ->
|
|
12
|
+
# TODO store type on validator instantiation
|
|
13
|
+
@type ||= model[record.resource.toString()][attribute]
|
|
14
|
+
|
|
15
|
+
if value
|
|
16
|
+
|
|
17
|
+
if value instanceof @type
|
|
18
|
+
|
|
19
|
+
# TODO store type_name on costructor
|
|
20
|
+
@type_name ||= @type.name
|
|
21
|
+
|
|
22
|
+
unless value.valid # Will trigger validation
|
|
23
|
+
record.errors.add attribute, 'type', type_name: @type_name?
|
|
24
|
+
|
|
25
|
+
else
|
|
26
|
+
throw new Error "Invalid attribute value type! Found #{typeof value} expected #{@type.name}"
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
composed = stampit.compose require('./validatorable'), typeable
|
|
30
|
+
composed.definition_key = 'validates_type_of'
|
|
31
|
+
module.exports = composed
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
$ = require 'jquery'
|
|
2
|
+
type = require 'type'
|
|
3
|
+
bind = require 'bind'
|
|
4
|
+
observable = require 'observable'
|
|
5
|
+
advisable = require('advisable' ).mixin
|
|
6
|
+
extend = require 'assimilate'
|
|
7
|
+
merge = require('assimilate').withStrategy 'deep'
|
|
8
|
+
|
|
9
|
+
# TODO support other type of associations
|
|
10
|
+
@model = do -> # mixin
|
|
11
|
+
modelable =
|
|
12
|
+
after_mix: []
|
|
13
|
+
record:
|
|
14
|
+
# TODO usar deferred
|
|
15
|
+
after_initialize: []
|
|
16
|
+
# TODO usar deferred
|
|
17
|
+
before_initialize: []
|
|
18
|
+
every: ->
|
|
19
|
+
# TODO transform model in a array like object and store cache in root
|
|
20
|
+
@cache
|
|
21
|
+
# TODO better find support
|
|
22
|
+
create: (params...) ->
|
|
23
|
+
# Implementat non restful model creation
|
|
24
|
+
throw 'model.create not implemented yet, try using the restful.model.create method'
|
|
25
|
+
# find: (id) ->
|
|
26
|
+
# @where id: id, true
|
|
27
|
+
where: (conditions, first = false) ->
|
|
28
|
+
results = []
|
|
29
|
+
conditions.id = [conditions.id] if type(conditions.id) != 'array'
|
|
30
|
+
# TODO transform model in a array like object and store cache in root
|
|
31
|
+
for record in @cache when conditions.id.indexOf(record._id) isnt -1
|
|
32
|
+
if first
|
|
33
|
+
return record
|
|
34
|
+
else
|
|
35
|
+
results.push record
|
|
36
|
+
|
|
37
|
+
if first then null else results
|
|
38
|
+
|
|
39
|
+
initialize_record = (data = {resource: @resource, parent_resource: @parent_resource}) ->
|
|
40
|
+
data.resource ||= @resource
|
|
41
|
+
data.parent_resource ||= @resource.parent || @parent_resource
|
|
42
|
+
data.route ||= @route
|
|
43
|
+
data.nested_attributes = @nested_attributes || []
|
|
44
|
+
|
|
45
|
+
# instance = record.call extend data, @record # TODO remove @record from outside scop
|
|
46
|
+
after_initialize = (data.after_initialize || []).concat(@record.after_initialize)
|
|
47
|
+
|
|
48
|
+
# TODO only shim in older browsers
|
|
49
|
+
# TODO try to remove _shim need
|
|
50
|
+
creation = extend Object.create(data, {_shim: {}}), @record, creation, after_initialize: after_initialize
|
|
51
|
+
|
|
52
|
+
# TODO use deferred instead of before_initialize array
|
|
53
|
+
for callback, index in @record.before_initialize
|
|
54
|
+
callback.call @, creation
|
|
55
|
+
|
|
56
|
+
instance = record.call creation # TODO remove @record from outside scope
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# Call and remove used callbacks
|
|
60
|
+
# TODO use deferred instead of after_initialize array
|
|
61
|
+
for callback, index in instance.after_initialize
|
|
62
|
+
callback.call instance, instance
|
|
63
|
+
|
|
64
|
+
delete instance.after_initialize
|
|
65
|
+
|
|
66
|
+
instance
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
# Create model
|
|
70
|
+
mixer = (options) ->
|
|
71
|
+
throw 'Model mixin called incorrectly! \n Call with model.call({}) instead of model({}) \n Also the first argument must be non null.' if @ == window
|
|
72
|
+
mixer.stale = true unless mixer.stale # Prevent model changes
|
|
73
|
+
|
|
74
|
+
# TODO Use stampit and solve this mess!!
|
|
75
|
+
if @record and @record.after_initialize
|
|
76
|
+
after_initialize = @record.after_initialize.splice 0
|
|
77
|
+
else
|
|
78
|
+
after_initialize = []
|
|
79
|
+
|
|
80
|
+
# TODO Use stampit and solve this mess!!
|
|
81
|
+
if @after_mix
|
|
82
|
+
after_mix = @after_mix.splice 0
|
|
83
|
+
else
|
|
84
|
+
after_mix = []
|
|
85
|
+
|
|
86
|
+
instance = bind @, initialize_record
|
|
87
|
+
|
|
88
|
+
extend instance, merge @, modelable
|
|
89
|
+
|
|
90
|
+
@record = instance.record = merge {}, instance.record, modelable.record
|
|
91
|
+
@record.after_initialize = instance.record.after_initialize = instance.record.after_initialize.concat after_initialize
|
|
92
|
+
|
|
93
|
+
@record.before_initialize = instance.record.before_initialize.concat []
|
|
94
|
+
|
|
95
|
+
callback.call instance, instance for callback in modelable.after_mix.concat after_mix
|
|
96
|
+
|
|
97
|
+
# Store model for later use
|
|
98
|
+
# TODO implement correctly stampit usage, and remove the need for
|
|
99
|
+
# direct storage
|
|
100
|
+
mixer[@resource.name || @resource.toString()] = instance
|
|
101
|
+
|
|
102
|
+
mixer.mix = (blender) ->
|
|
103
|
+
throw "Trying to change model mixin with #{object} but model already used.\nCheck your configuration order" if @stale
|
|
104
|
+
|
|
105
|
+
blender modelable
|
|
106
|
+
|
|
107
|
+
# window.model
|
|
108
|
+
mixer
|
|
109
|
+
|
|
110
|
+
@record = do -> # mixin
|
|
111
|
+
|
|
112
|
+
callbacks =
|
|
113
|
+
# TODO search for a existing word and rename method, 'smudge' perhaps?
|
|
114
|
+
dirtify: ->
|
|
115
|
+
# TODO add suport to subscribe to any property
|
|
116
|
+
# @subscribe (prop, value, old) ->
|
|
117
|
+
# if prop isnt 'dirty' and not @dirty and value isnt old
|
|
118
|
+
# console.groupCollapsed "◉ Property '#{prop}' dirtied a #{@resource}"
|
|
119
|
+
# console.log old, "→", value
|
|
120
|
+
# console.log @
|
|
121
|
+
# console.groupEnd()
|
|
122
|
+
# @dirty = true
|
|
123
|
+
|
|
124
|
+
recordable =
|
|
125
|
+
# TODO usar deferred
|
|
126
|
+
dirty: false
|
|
127
|
+
after_initialize: [ callbacks.dirtify ]
|
|
128
|
+
|
|
129
|
+
that = (data) ->
|
|
130
|
+
throw "Mixin called incorrectly, call mixin with call method: record.call(object, data)" if @ == window
|
|
131
|
+
|
|
132
|
+
data ||= {}
|
|
133
|
+
after_initialize = (@after_initialize || []).concat(data.after_initialize || []).concat(recordable.after_initialize)
|
|
134
|
+
advisable observable(extend(@, recordable, data, after_initialize: after_initialize))
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
that.mix = (blender) ->
|
|
138
|
+
blender recordable
|
|
139
|
+
|
|
140
|
+
that
|
|
141
|
+
|
|
142
|
+
exports.record = @record
|
|
143
|
+
exports.model = @model
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
root = exports ? window
|
|
2
|
+
|
|
3
|
+
require 'indemma/lib/record/associable.js'
|
|
4
|
+
$ = require 'jquery'
|
|
5
|
+
|
|
6
|
+
describe 'record', ->
|
|
7
|
+
record = root.record
|
|
8
|
+
|
|
9
|
+
it 'should create a record'
|
|
10
|
+
|
|
11
|
+
describe 'model', ->
|
|
12
|
+
model = root.model
|
|
13
|
+
arthur = radio = null
|
|
14
|
+
person = corporation = null
|
|
15
|
+
|
|
16
|
+
beforeEach ->
|
|
17
|
+
corporation = model.call
|
|
18
|
+
resource: 'corporation'
|
|
19
|
+
|
|
20
|
+
# TODO implement support for self referential associations
|
|
21
|
+
friend = model.call
|
|
22
|
+
resource: 'friends'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
person = model.call
|
|
26
|
+
resource : 'person'
|
|
27
|
+
has_many : 'friends'
|
|
28
|
+
belongs_to: 'corporation'
|
|
29
|
+
|
|
30
|
+
radio = corporation
|
|
31
|
+
_id: 1
|
|
32
|
+
name: 'Local Radio'
|
|
33
|
+
|
|
34
|
+
ford = friend
|
|
35
|
+
_id: 2
|
|
36
|
+
name: 'Ford Perfect'
|
|
37
|
+
|
|
38
|
+
@arthur = arthur = person
|
|
39
|
+
_id: 3
|
|
40
|
+
name: 'Arthur Philip Dent'
|
|
41
|
+
|
|
42
|
+
describe 'has_one', ->
|
|
43
|
+
it 'should add a has_one property with the associations descriptions', ->
|
|
44
|
+
$.type(person.has_one).should.be.eq 'array'
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
describe 'belongs_to', ->
|
|
48
|
+
it 'should add a belongs_to property with the associations descriptions', ->
|
|
49
|
+
$.type(person.belongs_to).should.be.eq 'array'
|
|
50
|
+
|
|
51
|
+
describe "{associated}_id", ->
|
|
52
|
+
xdescribe 'with autobuild option on the asssociation', ->
|
|
53
|
+
xit 'should return an partial resource when acessing associated', ->
|
|
54
|
+
@arthur.corporation_id = radio._id
|
|
55
|
+
|
|
56
|
+
@arthur.should.have.property 'corporation'
|
|
57
|
+
@arthur.corporation.should.be.object
|
|
58
|
+
@arthur.corporation.should.have.property 'resource'
|
|
59
|
+
@arthur.corporation.should.have.property '_id', radio._id
|
|
60
|
+
|
|
61
|
+
xit 'should fetch the resource when accessing associated and resource not present', (done) ->
|
|
62
|
+
radio = corporation
|
|
63
|
+
_id: 1
|
|
64
|
+
name: 'Local Radio'
|
|
65
|
+
|
|
66
|
+
@arthur.corporation_id = radio._id
|
|
67
|
+
|
|
68
|
+
@arthur.corporation.should.be.object
|
|
69
|
+
@arthur.corporation.should.have.property 'resource', radio.resource
|
|
70
|
+
@arthur.corporation._id.should.be null
|
|
71
|
+
@arthur.corporation.locking.should.be.object
|
|
72
|
+
|
|
73
|
+
@arthur.corporation.locking.done (corporation) ->
|
|
74
|
+
corporation.should.have.property '_id' , radio.id
|
|
75
|
+
corporation.should.have.property 'name', radio.name
|
|
76
|
+
|
|
77
|
+
it 'should notify changes', ->
|
|
78
|
+
radio = corporation _id: 1, name: 'Local Radio'
|
|
79
|
+
subscribed_id = sinon.spy()
|
|
80
|
+
subscribed = sinon.spy()
|
|
81
|
+
|
|
82
|
+
@arthur.subscribe 'corporation_id', subscribed_id
|
|
83
|
+
@arthur.subscribe 'corporation' , subscribed
|
|
84
|
+
@arthur.corporation_id = radio._id
|
|
85
|
+
@arthur.observation.deliver()
|
|
86
|
+
|
|
87
|
+
@arthur.corporation_id = null
|
|
88
|
+
@arthur.observation.deliver()
|
|
89
|
+
|
|
90
|
+
# Tests
|
|
91
|
+
subscribed.called.should.be.true
|
|
92
|
+
subscribed.callCount.should.be.eq 2
|
|
93
|
+
subscribed_id.called.should.be.true
|
|
94
|
+
subscribed_id.callCount.should.be.eq 2
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
it 'should remove {associated} when nulifying', ->
|
|
98
|
+
radio = corporation _id: 1, name: 'Local Radio'
|
|
99
|
+
subscribed = sinon.spy()
|
|
100
|
+
|
|
101
|
+
# Associate arthur with a corporation through id
|
|
102
|
+
@arthur.subscribe 'corporation_id', subscribed
|
|
103
|
+
@arthur.corporation_id = radio._id
|
|
104
|
+
@arthur.observation.deliver()
|
|
105
|
+
|
|
106
|
+
# Unassociate arthur with a corporation through id
|
|
107
|
+
@arthur.corporation_id = null
|
|
108
|
+
@arthur.observation.deliver()
|
|
109
|
+
|
|
110
|
+
subscribed.called.should.be.true
|
|
111
|
+
subscribed.callCount.should.be.eq 2
|
|
112
|
+
@arthur.should.have.property 'corporation_id', null
|
|
113
|
+
@arthur.should.have.property 'corporation' , null
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
describe "{associated}", ->
|
|
117
|
+
|
|
118
|
+
describe 'with autoload option on the association', ->
|
|
119
|
+
|
|
120
|
+
it 'should create associated when sustained and stored', ->
|
|
121
|
+
radio.sustained.should.be.true
|
|
122
|
+
@arthur.corporation_id = radio._id
|
|
123
|
+
@arthur.should.have.property 'corporation', radio
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
it 'should update {associated_id} and record when associated record changes', ->
|
|
127
|
+
radio = corporation
|
|
128
|
+
_id: 1
|
|
129
|
+
name: 'Local Radio'
|
|
130
|
+
sustained: true
|
|
131
|
+
|
|
132
|
+
expect(@arthur.corporation).to.be.null
|
|
133
|
+
|
|
134
|
+
@arthur.corporation = radio
|
|
135
|
+
|
|
136
|
+
@arthur.corporation_id
|
|
137
|
+
@arthur.should.have.property 'corporation' , radio
|
|
138
|
+
@arthur.should.have.property 'corporation_id', radio._id
|
|
139
|
+
|
|
140
|
+
@arthur.corporation = null
|
|
141
|
+
@arthur.observation.deliver()
|
|
142
|
+
|
|
143
|
+
@arthur.should.have.property 'corporation' , null
|
|
144
|
+
@arthur.should.have.property 'corporation_id', null
|
|
145
|
+
|
|
146
|
+
it 'should notify changes', ->
|
|
147
|
+
radio = corporation _id: 1, name: 'Local Radio'
|
|
148
|
+
subscribed = sinon.spy()
|
|
149
|
+
subscribed_id = sinon.spy()
|
|
150
|
+
|
|
151
|
+
@arthur.subscribe 'corporation' , subscribed
|
|
152
|
+
@arthur.subscribe 'corporation_id', subscribed_id
|
|
153
|
+
@arthur.corporation = radio
|
|
154
|
+
@arthur.observation.deliver()
|
|
155
|
+
|
|
156
|
+
@arthur.corporation = null
|
|
157
|
+
@arthur.observation.deliver()
|
|
158
|
+
|
|
159
|
+
# Tests
|
|
160
|
+
subscribed.called.should.be.true
|
|
161
|
+
subscribed.callCount.should.be.eq 2
|
|
162
|
+
|
|
163
|
+
subscribed_id.called.should.be.true
|
|
164
|
+
subscribed_id.callCount.should.be.eq 2
|
|
165
|
+
|
|
166
|
+
describe "#build_{associated}", ->
|
|
167
|
+
it 'should add builded object to association named attribute', ->
|
|
168
|
+
@arthur = person
|
|
169
|
+
name: 'Arthur Dent'
|
|
170
|
+
|
|
171
|
+
corporation = @arthur.build_corporation()
|
|
172
|
+
@arthur.should.have.property 'corporation'
|
|
173
|
+
expect(corporation).to.be.ok
|
|
174
|
+
|
|
175
|
+
describe 'has_many', ->
|
|
176
|
+
it 'should add a has_many property with the associations descriptions', ->
|
|
177
|
+
$.type(person.has_many).should.be.eq 'array'
|
|
178
|
+
|
|
179
|
+
it 'should return a record factory with associations stored', ->
|
|
180
|
+
person.has_many.should.be.array
|
|
181
|
+
|
|
182
|
+
has_many = Array.prototype.splice.call person.has_many, 0
|
|
183
|
+
|
|
184
|
+
has_many.should.contain 'friends'
|
|
185
|
+
|
|
186
|
+
describe '#()', ->
|
|
187
|
+
|
|
188
|
+
it 'should return a record with an association object', ->
|
|
189
|
+
person().should.have.property 'friends'
|
|
190
|
+
|
|
191
|
+
describe '{generated_association}', ->
|
|
192
|
+
association = null
|
|
193
|
+
|
|
194
|
+
beforeEach -> association = person().friends
|
|
195
|
+
|
|
196
|
+
it 'should have query methods', ->
|
|
197
|
+
# THINK Why has many check is here
|
|
198
|
+
# association.should.have.property 'has_many'
|
|
199
|
+
association.should.have.property 'find'
|
|
200
|
+
association.should.have.property 'each'
|
|
201
|
+
association.should.have.property 'reload'
|
|
202
|
+
|
|
203
|
+
describe '#every', ->
|
|
204
|
+
|
|
205
|
+
it 'should auto observe nested associations attributes'
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require 'indemma/lib/record/restfulable.js'
|
|
2
|
+
require 'indemma/lib/record/dirtyable.js'
|
|
3
|
+
|
|
4
|
+
'use strict'
|
|
5
|
+
|
|
6
|
+
root = exports ? window
|
|
7
|
+
|
|
8
|
+
model = root.model # TODO model = require 'indemma/model'
|
|
9
|
+
record = root.record # TODO model = require 'indemma/record'
|
|
10
|
+
jQuery = require 'component-jquery'
|
|
11
|
+
|
|
12
|
+
describe 'dirtyable', ->
|
|
13
|
+
|
|
14
|
+
describe 'when included', ->
|
|
15
|
+
it 'sets te dirtyable loaded flag on model', ->
|
|
16
|
+
model.dirtyable.should.be.true
|
|
17
|
+
|
|
18
|
+
describe 'record', ->
|
|
19
|
+
# TODO Convert to @arthur
|
|
20
|
+
describe '()', ->
|
|
21
|
+
|
|
22
|
+
beforeEach ->
|
|
23
|
+
# TODO Convert to @arthur
|
|
24
|
+
@person = model.call resource: 'person'
|
|
25
|
+
@arthur = @person name : 'Arthur Philip Dent'
|
|
26
|
+
|
|
27
|
+
describe '.dirty', ->
|
|
28
|
+
it 'should exist after initialization', ->
|
|
29
|
+
@arthur.should.have.property 'dirty'
|
|
30
|
+
|
|
31
|
+
it 'should be true on record changes', ->
|
|
32
|
+
@arthur.name = 10
|
|
33
|
+
|
|
34
|
+
# Force instantaneous delivery
|
|
35
|
+
@arthur.observation.deliver()
|
|
36
|
+
|
|
37
|
+
@arthur.dirty.should.be.true
|
|
38
|
+
|
|
39
|
+
describe '.saved()', ->
|
|
40
|
+
beforeEach -> sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
|
|
41
|
+
afterEach -> jQuery.ajax.restore()
|
|
42
|
+
|
|
43
|
+
it 'should clean record after', ->
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
describe 'model' , ->
|
|
47
|
+
describe '()', ->
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
maid = require 'indemma/lib/record/maid.js'
|
|
4
|
+
|
|
5
|
+
describe 'maid', ->
|
|
6
|
+
|
|
7
|
+
beforeEach ->
|
|
8
|
+
@personable = model.call
|
|
9
|
+
resource: 'person'
|
|
10
|
+
washing: true
|
|
11
|
+
|
|
12
|
+
it 'should save upon record dirtying', (done) ->
|
|
13
|
+
@arthur = @personable name: 'Arthur Dent'
|
|
14
|
+
|
|
15
|
+
sinon.stub(@arthur, 'save').returns true
|
|
16
|
+
@arthur.name = 'Arthur Philip Dent'
|
|
17
|
+
|
|
18
|
+
setTimeout =>
|
|
19
|
+
@arthur.save.called.should.be.true
|
|
20
|
+
done()
|
|
21
|
+
, 1000
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
it 'should not save upon record creation', (done) ->
|
|
25
|
+
@timeout 10000
|
|
26
|
+
sinon.stub(jQuery, "ajax").returns(jQuery.Deferred())
|
|
27
|
+
@arthur = @personable name: 'Arthur Dent'
|
|
28
|
+
|
|
29
|
+
setTimeout =>
|
|
30
|
+
jQuery.ajax.called.should.be.false
|
|
31
|
+
jQuery.ajax.restore()
|
|
32
|
+
done()
|
|
33
|
+
, 2000
|
|
34
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
root = exports ? window
|
|
2
|
+
|
|
3
|
+
require 'indemma/lib/record/persistable.js'
|
|
4
|
+
|
|
5
|
+
describe 'persistable', ->
|
|
6
|
+
|
|
7
|
+
describe 'model', ->
|
|
8
|
+
it 'should set the persistable key', ->
|
|
9
|
+
model.should.have.property 'persistable', true
|
|
10
|
+
|
|
11
|
+
describe '#find', ->
|
|
12
|
+
beforeEach ->
|
|
13
|
+
@xhr = jQuery.Deferred()
|
|
14
|
+
sinon.stub(jQuery, "ajax").returns @xhr
|
|
15
|
+
|
|
16
|
+
@personable = model.call
|
|
17
|
+
resource : 'person'
|
|
18
|
+
has_many : 'friends'
|
|
19
|
+
belongs_to: 'corporation'
|
|
20
|
+
|
|
21
|
+
@arthur = @personable
|
|
22
|
+
name: 'Arthur Philip Dent'
|
|
23
|
+
|
|
24
|
+
@xhr.resolveWith @arthur, [_id: 1]
|
|
25
|
+
|
|
26
|
+
# TODO use another way to check if record has persisted
|
|
27
|
+
@arthur.dirty = true
|
|
28
|
+
|
|
29
|
+
afterEach -> jQuery.ajax.restore()
|
|
30
|
+
|
|
31
|
+
it 'should try to store a record after saving when initialzed without id', (done) ->
|
|
32
|
+
sinon.stub(@personable.storage, 'store').returns true
|
|
33
|
+
|
|
34
|
+
@arthur.save =>
|
|
35
|
+
expect(@personable.storage.store.calledOnce).to.be.true
|
|
36
|
+
done()
|
|
37
|
+
|
|
38
|
+
@personable.storage.store.restore()
|
|
39
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
root = exports ? window
|
|
2
|
+
|
|
3
|
+
queryable = require 'indemma/lib/record/queryable.js'
|
|
4
|
+
|
|
5
|
+
describe 'queryable', ->
|
|
6
|
+
|
|
7
|
+
describe 'model', ->
|
|
8
|
+
beforeEach ->
|
|
9
|
+
@personable = model.call
|
|
10
|
+
resource : 'person'
|
|
11
|
+
|
|
12
|
+
it 'should set the queryable key', ->
|
|
13
|
+
model.should.have.property 'queryable', true
|
|
14
|
+
|
|
15
|
+
it 'should create a storage', ->
|
|
16
|
+
@personable.should.have.property 'storage'
|
|
17
|
+
|
|
18
|
+
describe '#find', ->
|
|
19
|
+
beforeEach ->
|
|
20
|
+
@xhr = jQuery.Deferred()
|
|
21
|
+
sinon.stub(jQuery, "ajax").returns @xhr
|
|
22
|
+
|
|
23
|
+
@arthur = @personable
|
|
24
|
+
_id: '1'
|
|
25
|
+
name: 'Arthur Philip Dent'
|
|
26
|
+
|
|
27
|
+
@arthur.save()
|
|
28
|
+
@xhr.resolveWith @arthur, [@arthur.json()]
|
|
29
|
+
|
|
30
|
+
afterEach -> jQuery.ajax.restore()
|
|
31
|
+
|
|
32
|
+
it 'should retrieve a record by key', ->
|
|
33
|
+
@personable.find('1').should.have.property 'name', @arthur.name
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require 'indemma/lib/record/restfulable.js'
|
|
2
|
+
require 'indemma/lib/record/resource.js'
|
|
3
|
+
|
|
4
|
+
root = exports ? window
|
|
5
|
+
|
|
6
|
+
model = root.model # TODO model = require 'indemma/model'
|
|
7
|
+
record = root.record # TODO model = require 'indemma/record'
|
|
8
|
+
jQuery = require 'component-jquery'
|
|
9
|
+
|
|
10
|
+
describe 'resource', ->
|
|
11
|
+
|
|
12
|
+
describe 'with scope option', ->
|
|
13
|
+
person = towel = null
|
|
14
|
+
|
|
15
|
+
beforeEach ->
|
|
16
|
+
person = model.call
|
|
17
|
+
resource: 'person'
|
|
18
|
+
|
|
19
|
+
towel = model.call
|
|
20
|
+
resource:
|
|
21
|
+
name: 'towel'
|
|
22
|
+
scope: 'users'
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
it 'should be prefixed with scope', ->
|
|
26
|
+
towel. route.should.be.eq '/users/towels'
|
|
27
|
+
towel( { } ).route.should.be.eq '/users/towels'
|
|
28
|
+
towel(id: 1).route.should.be.eq '/users/towels'
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
describe 'with singular resource', ->
|
|
32
|
+
towel = null
|
|
33
|
+
|
|
34
|
+
beforeEach ->
|
|
35
|
+
towel = model.call
|
|
36
|
+
resource:
|
|
37
|
+
name: 'towel'
|
|
38
|
+
singular: true
|
|
39
|
+
|
|
40
|
+
deferred = jQuery.Deferred()
|
|
41
|
+
|
|
42
|
+
context = towel(name: 'Arthur Philip Dent')
|
|
43
|
+
context.lock = JSON.stringify context.json()
|
|
44
|
+
deferred.resolveWith context, [_id: 1, name: 'Arthur Philip Dent']
|
|
45
|
+
|
|
46
|
+
sinon.stub(jQuery, "ajax").returns(deferred)
|
|
47
|
+
|
|
48
|
+
promises = towel.create {name: 'Arthur Philip Dent'}, {name: 'Ford'}
|
|
49
|
+
|
|
50
|
+
afterEach -> jQuery.ajax.restore()
|
|
51
|
+
|
|
52
|
+
it 'the route should be in singular form', ->
|
|
53
|
+
towel. route.should.be.eq '/towel'
|
|
54
|
+
towel( { } ).route.should.be.eq '/towel'
|
|
55
|
+
towel(id: 1).route.should.be.eq '/towel'
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
describe 'when included', ->
|
|
59
|
+
xit 'sets the resource loaded flag on model', ->
|
|
60
|
+
# model.resource.should.be.true
|
|
61
|
+
|
|
62
|
+
describe 'model' , ->
|
|
63
|
+
it 'add methods to model object'
|
|
64
|
+
|
|
65
|
+
describe '#pluralize', ->
|
|
66
|
+
xit 'transforms word into plural form'
|
|
67
|
+
|
|
68
|
+
describe '#singularize', ->
|
|
69
|
+
xit 'transforms word into singular form'
|