no more Immutable types :)

This commit is contained in:
DadaMonad 2015-01-16 20:02:06 +00:00
parent f1f710b269
commit e54402e842
10 changed files with 190 additions and 152 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -111,7 +111,7 @@ module.exports = (HB)->
else else
throw new Error "The #{content.constructor.name}-type is not (yet) supported in Yatta." throw new Error "The #{content.constructor.name}-type is not (yet) supported in Yatta."
else else
super name, (new types.ImmutableObject undefined, content).execute() super name, content
else # is this even necessary ? I have to define every type anyway.. (see Number type below) else # is this even necessary ? I have to define every type anyway.. (see Number type below)
super name super name
@ -139,7 +139,7 @@ module.exports = (HB)->
types.Number = {} types.Number = {}
types.Number.create = (content)-> types.Number.create = (content)->
(new types.ImmutableObject undefined, content).execute() content
text_types text_types

View File

@ -31,27 +31,20 @@ module.exports = (HB)->
# @see JsonTypes.val # @see JsonTypes.val
# #
val: (name, content)-> val: (name, content)->
if content? if arguments.length > 1
@retrieveSub(name).replace content @retrieveSub(name).replace content
@ @
else if name? else if name?
prop = @map[name] prop = @map[name]
if prop? and not prop.isContentDeleted() if prop? and not prop.isContentDeleted()
obj = prop.val() prop.val()
if obj instanceof types.ImmutableObject
obj.val()
else
obj
else else
undefined undefined
else else
result = {} result = {}
for name,o of @map for name,o of @map
if not o.isContentDeleted() if not o.isContentDeleted()
obj = o.val() result[name] = o.val()
if obj instanceof types.ImmutableObject # or obj instanceof MapManager TODO: do you want deep json?
obj = obj.val()
result[name] = obj
result result
delete: (name)-> delete: (name)->
@ -253,7 +246,11 @@ module.exports = (HB)->
# @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created. # @param {Object} uid A unique identifier. If uid is undefined, a new uid will be created.
# #
constructor: (content, parent, uid, prev, next, origin, is_deleted)-> constructor: (content, parent, uid, prev, next, origin, is_deleted)->
# see encode to see, why we are doing it this way
if content? and content.creator?
@saveOperation 'content', content @saveOperation 'content', content
else
@content = content
@saveOperation 'parent', parent @saveOperation 'parent', parent
super uid, prev, next, origin # Parent is already saved by Replaceable super uid, prev, next, origin # Parent is already saved by Replaceable
@is_deleted = is_deleted @is_deleted = is_deleted
@ -270,9 +267,9 @@ module.exports = (HB)->
res = super res = super
if @content? if @content?
if @next_cl.type isnt "Delimiter" if @next_cl.type isnt "Delimiter"
@content.deleteAllObservers() @content.deleteAllObservers?()
@content.applyDelete() @content.applyDelete?()
@content.dontSync() @content.dontSync?()
@content = null @content = null
res res
@ -321,7 +318,6 @@ module.exports = (HB)->
json = json =
{ {
'type': @type 'type': @type
'content': @content?.getUid()
'parent' : @parent.getUid() 'parent' : @parent.getUid()
'prev': @prev_cl.getUid() 'prev': @prev_cl.getUid()
'next': @next_cl.getUid() 'next': @next_cl.getUid()
@ -329,6 +325,14 @@ module.exports = (HB)->
'uid' : @getUid() 'uid' : @getUid()
'is_deleted': @is_deleted 'is_deleted': @is_deleted
} }
if @content instanceof types.Operation
json['content'] = @content.getUid()
else
# This could be a security concern.
# Throw error if the users wants to trick us
if @content? and @content.creator?
throw new Error "You must not set creator here!"
json['content'] = @content
json json
types.Replaceable.parse = (json)-> types.Replaceable.parse = (json)->

View File

@ -181,7 +181,7 @@ module.exports = (HB)->
list.insert 0, content list.insert 0, content
list list
else if (not mutable?) or (mutable is "immutable") else if (not mutable?) or (mutable is "immutable")
(new types.ImmutableObject undefined, content).execute() content
else else
throw new Error "Specify either \"mutable\" or \"immutable\"!!" throw new Error "Specify either \"mutable\" or \"immutable\"!!"
@ -377,7 +377,7 @@ module.exports = (HB)->
word.insert 0, content word.insert 0, content
word word
else if (not mutable?) or (mutable is "immutable") else if (not mutable?) or (mutable is "immutable")
(new types.ImmutableObject undefined, content).execute() content
else else
throw new Error "Specify either \"mutable\" or \"immutable\"!!" throw new Error "Specify either \"mutable\" or \"immutable\"!!"

View File

@ -130,6 +130,16 @@ describe "JsonFramework", ->
expect(@yTest.getSomeUser().val('object').val('q')).to.equal "rr" expect(@yTest.getSomeUser().val('object').val('q')).to.equal "rr"
expect(@yTest.getSomeUser().val('null') is null).to.be.ok expect(@yTest.getSomeUser().val('null') is null).to.be.ok
it "handles immutables and primitive data types (2)", ->
@yTest.users[0].val('string', "text", "immutable")
@yTest.users[1].val('number', 4, "immutable")
@yTest.users[2].val('object', {q:"rr"}, "immutable")
@yTest.users[0].val('null', null)
@yTest.compareAll()
expect(@yTest.getSomeUser().val('string')).to.equal "text"
expect(@yTest.getSomeUser().val('number')).to.equal 4
expect(@yTest.getSomeUser().val('object').val('q')).to.equal "rr"
expect(@yTest.getSomeUser().val('null') is null).to.be.ok
it "Observers work on JSON Types (add type observers, local and foreign)", -> it "Observers work on JSON Types (add type observers, local and foreign)", ->
u = @yTest.users[0] u = @yTest.users[0]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long