Skip to content

Commit 04ecd09

Browse files
committed
Added new encoding mode - #unknownAsNil and #loose.
- If encodeMode is #unknownAsNil, unknown types(classes) will be encoded as nil values. - If encodeMode is #loose, #asMpConverted will be sent to the unknown class's instances. You can override the method to convert your instance as MessagePack-compatible value. For example, this mode allows encoding IdentityDictionary as MessagePack map.
1 parent c2a6883 commit 04ecd09

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+317
-0
lines changed

.filetree

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{ "packageExtension" : ".package" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*MessagePack-Core-unpacking
2+
fromMessagePack: bytes setting: settingBlock
3+
^ MpDecoder decode: bytes setting: settingBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
*MessagePack-Core-converting
2+
asMpMap
3+
| dic |
4+
dic := Dictionary new: self size.
5+
self keysAndValuesDo: [:k :v | dic at: k put: v].
6+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
decode customization
2+
bytesAsString
3+
| map |
4+
map := self actionMap.
5+
map at: MpConstants map16 put: #readString16.
6+
map at: MpConstants map32 put: #readString32.
7+
8+
self isBytesAsString: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
accessing
2+
isBytesAsString: aBoolean
3+
4+
isBytesAsString := aBoolean == true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
decode customization
2+
isBytesAsString
3+
isBytesAsString ifNil: [isBytesAsString := false].
4+
^ isBytesAsString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
actions
2+
decode: byteArray setting: settingBlock
3+
^self new decode: byteArray setting: settingBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
actions
2+
decodeFrom: aStream setting: settingBlock
3+
^self new decodeFrom: aStream setting: settingBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
decoding
2+
decode: byteArray setting: settingBlock
3+
settingBlock value: self settings.
4+
^self decodeFrom: byteArray readStream
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
decoding
2+
decodeFrom: aStream setting: settingBlock
3+
settingBlock value: self settings.
4+
self readStream: aStream "binary".
5+
^self decode
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
reading-string
2+
readFixString: firstByte
3+
| size |
4+
size := (firstByte bitAnd: 2r11111).
5+
^(self readStream next: size) asString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
reading-string
2+
readString16
3+
^self readRaw16 asString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
reading-string
2+
readString32
3+
^self readRaw32 asString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
actions
2+
encode: anObject on: aStream setting: aBlock
3+
^self new encode: anObject on: aStream setting: aBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
actions
2+
encode: anObject setting: settingBlock
3+
^self new encode: anObject setting: settingBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
encoding
2+
encode: anObject on: aStream setting: aBlock
3+
aBlock value: self settings.
4+
self write: anObject on: aStream.
5+
^self contents.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
encoding
2+
encode: anObject setting: aBlock
3+
^self encode: anObject on: self writeStream setting: aBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
writing-helper
2+
writeUnknown: unknown withHandler: aBlock
3+
| mode |
4+
mode := self settings encodeMode.
5+
mode == #strict ifTrue: [^aBlock value].
6+
mode == #unknownAsNil ifTrue: [^self writeNil: unknown].
7+
mode == #loose ifTrue: [^self writeObject: unknown asMpConverted].
8+
9+
"If non supported mode, we just use handler"
10+
^aBlock value
11+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
accessing
2+
bytesAsString: aBoolean
3+
^self at: #bytesAsString ifAbsentPut: aBoolean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
accessing
2+
bytesAsString
3+
^self at: #bytesAsString ifAbsentPut: [false]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
accessing
2+
decodeMode: aSymbol
3+
"#strict #unknownAsNil #loose"
4+
^self at: #decodeMode ifAbsentPut: aSymbol
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
accessing
2+
decodeMode
3+
^self at: #decodeMode ifAbsent: [#strict]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
accessing
2+
encodeMode: aSymbol
3+
"#strict #unknownAsNil #loose"
4+
^self at: #encodeMode ifAbsentPut: aSymbol
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
accessing
2+
encodeMode
3+
^self at: #encodeMode ifAbsent: [#strict]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
printing
2+
printOn: aStream
3+
aStream nextPutAll: 'a MpSettings('.
4+
self settingsDict printOn: aStream.
5+
aStream nextPutAll: ')'.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
*MessagePack-Core-converting
2+
asMpConverted
3+
"Override"
4+
"Only called if you select #loose encodeMode"
5+
^self asMpMap
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
*MessagePack-Core-converting
2+
asMpMap
3+
"Override"
4+
"Only called if you select #loose encodeMode"
5+
^Dictionary new
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*MessagePack-Core-packing
2+
messagePacked: settingBlock
3+
^ MpEncoder encode: self setting: settingBlock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*MessagePack-Core-converting
2+
asMpConverted
3+
^self asString
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"class" : {
3+
},
4+
"instance" : {
5+
"asMpConverted" : "MasashiUmezawa 2/2/2013 00:36" } }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{
2+
"name" : "Symbol" }

repository/MessagePackTest.package/MpSettingsTestCase.class/README.md

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fixtures
2+
arrayWithNil
3+
^ Array with: nil with: 2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fixtures
2+
arrayWithUnknown
3+
^ Array with: Date today with: 2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
fixtures
2+
complexDictionaryAfterConverted
3+
| dic dicIn|
4+
dic := Dictionary new.
5+
dicIn := Dictionary new.
6+
7+
self simpleIdentityDictionary keysAndValuesDo: [:k :v | dicIn at: (MpPortableUtil default bytesFromString: k) put: (MpPortableUtil default bytesFromString: v)].
8+
9+
dic at: (MpPortableUtil default bytesFromString: #key1) put: (MpPortableUtil default bytesFromString: 'aaa').
10+
dic at: (MpPortableUtil default bytesFromString: #key2) put: dicIn.
11+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fixtures
2+
complexIdentityDictionary
3+
| dic |
4+
dic := IdentityDictionary new.
5+
dic at: #key1 put: 'aaa'.
6+
dic at: #key2 put: self simpleIdentityDictionary.
7+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
private
2+
createStringSized: size
3+
^ self newCollection: String sized: size withAll: (Character value: (self atRandom: 255))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fixtures
2+
dictionaryWithNil
3+
| dic |
4+
dic := Dictionary new.
5+
dic at: 'key1' put: nil.
6+
dic at: 'key2' put: 'bbb'.
7+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fixtures
2+
dictionaryWithUnknown
3+
| dic |
4+
dic := Dictionary new.
5+
dic at: 'key1' put: Time now.
6+
dic at: 'key2' put: 'bbb'.
7+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
fixtures
2+
simpleIdentityDictionary
3+
| dic |
4+
dic := IdentityDictionary new.
5+
dic at: #key1 put: 'aaa'.
6+
dic at: #key2 put: 'bbb'.
7+
^dic
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fixtures
2+
simpleString
3+
^'This is a test'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fixtures
2+
simpleStringContainedArray
3+
^ #('this' 'is' 'a' 'test')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
private
2+
stringSizes
3+
^ #(0 1 31 32 65535 65536)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
fixtures
2+
stringsArray
3+
^ self stringSizes collect: [:each | self createStringSized: each]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
testing
2+
testPackStringArrayAsArrayOfBytes
3+
"self debug: #testPackStringArrayAsArrayOfBytes"
4+
| bytes |
5+
self should: [self simpleStringContainedArray messagePacked] raise: MpError.
6+
7+
bytes := self simpleStringContainedArray messagePacked: [:settings | settings stringAsBytes: true].
8+
9+
self assert: (bytes = (self simpleStringContainedArray collect: [:each | (MpPortableUtil default bytesFromString: each)]) messagePacked)
10+
11+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
testing
2+
testPackStringAsBytes
3+
"self debug: #testPackStringAsBytes"
4+
| bytes |
5+
self should: [self simpleString messagePacked] raise: MpError.
6+
7+
bytes := self simpleString messagePacked: [:settings | settings stringAsBytes: true].
8+
9+
self assert: (bytes = (MpPortableUtil default bytesFromString: self simpleString) messagePacked)
10+
11+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
testing
2+
testPackUnknownContainedArray
3+
"self debug: #testPackUnknownContainedArray"
4+
| bytes |
5+
self should: [self arrayWithUnknown messagePacked] raise: MpError.
6+
7+
bytes := self arrayWithUnknown messagePacked: [:settings | settings encodeMode: #unknownAsNil].
8+
9+
self assert: (bytes = self arrayWithNil messagePacked)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
testing
2+
testPackUnknownContainedDictionary
3+
"self debug: #testPackUnknownContainedDictionary"
4+
| bytes |
5+
self should: [self dictionaryWithUnknown messagePacked] raise: MpError.
6+
7+
bytes := self dictionaryWithUnknown messagePacked: [:settings | settings stringAsBytes: true; encodeMode: #unknownAsNil].
8+
9+
self assert: (bytes = (self dictionaryWithNil messagePacked: [:settings | settings stringAsBytes: true]))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
testing
2+
testPackUnpackComplexIdentityDictionary
3+
"self debug: #testPackUnpackComplexIdentityDictionary"
4+
| bytes convertedDic unpacked1 unpacked2 |
5+
self should: [self complexIdentityDictionary messagePacked] raise: MpError.
6+
7+
bytes := self complexIdentityDictionary messagePacked: [:se | se stringAsBytes: true; encodeMode: #loose].
8+
9+
convertedDic := self complexDictionaryAfterConverted.
10+
11+
unpacked1 := Object fromMessagePack: bytes setting: [:se | se bytesAsString: true].
12+
unpacked2 := Object fromMessagePack: convertedDic messagePacked setting: [:se | se bytesAsString: true].
13+
14+
self should: [self collectionEquals: unpacked1 with: unpacked2]
15+
16+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
testing
2+
testPackUnpackSimpleIdentityDictionary
3+
"self debug: #testPackUnpackSimpleIdentityDictionary"
4+
| bytes convertedDic unpacked1 unpacked2 |
5+
self should: [self simpleIdentityDictionary messagePacked] raise: MpError.
6+
7+
bytes := self simpleIdentityDictionary messagePacked: [:se | se stringAsBytes: true; encodeMode: #loose].
8+
9+
convertedDic := Dictionary new.
10+
self simpleIdentityDictionary keysAndValuesDo: [:k :v | convertedDic at: (MpPortableUtil default bytesFromString: k) put: (MpPortableUtil default bytesFromString: v)].
11+
12+
unpacked1 := Object fromMessagePack: bytes setting: [:se | se bytesAsString: true].
13+
unpacked2 := Object fromMessagePack: convertedDic messagePacked setting: [:se | se bytesAsString: true].
14+
15+
self should: [self collectionEquals: unpacked1 with: unpacked2]
16+
17+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
testing
2+
testPackUnpackStrings
3+
"self debug: #testPackUnpackStrings"
4+
self stringsArray do: [:each | | packed unpacked |
5+
packed := each messagePacked: [:se | se stringAsBytes: true].
6+
self should: [packed isMemberOf: ByteArray].
7+
unpacked := Object fromMessagePack: packed.
8+
self should: [self collectionEquals: unpacked asString with: each]
9+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
testing
2+
testUnpackBytesAsString
3+
"self debug: #testUnpackBytesAsString"
4+
| bytes unpackedAsByteArrays unpacked |
5+
bytes := self simpleStringContainedArray messagePacked: [:se | se stringAsBytes: true].
6+
unpackedAsByteArrays := Object fromMessagePack: bytes.
7+
self assert: (unpackedAsByteArrays = (self simpleStringContainedArray collect: [:each | MpPortableUtil default bytesFromString: each])).
8+
9+
unpacked := Object fromMessagePack: bytes setting: [:se | se bytesAsString: true].
10+
self assert: (unpacked = self simpleStringContainedArray)
11+
12+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"class" : {
3+
},
4+
"instance" : {
5+
"arrayWithNil" : "MasashiUmezawa 2/2/2013 20:59",
6+
"arrayWithUnknown" : "MasashiUmezawa 2/2/2013 20:58",
7+
"complexDictionaryAfterConverted" : "MasashiUmezawa 2/2/2013 21:50",
8+
"complexIdentityDictionary" : "MasashiUmezawa 2/2/2013 20:28",
9+
"createStringSized:" : "MasashiUmezawa 2/2/2013 21:20",
10+
"dictionaryWithNil" : "MasashiUmezawa 2/2/2013 21:01",
11+
"dictionaryWithUnknown" : "MasashiUmezawa 2/2/2013 21:02",
12+
"simpleIdentityDictionary" : "MasashiUmezawa 2/2/2013 20:19",
13+
"simpleString" : "MasashiUmezawa 2/2/2013 20:47",
14+
"simpleStringContainedArray" : "MasashiUmezawa 2/2/2013 21:16",
15+
"stringSizes" : "MasashiUmezawa 2/2/2013 21:13",
16+
"stringsArray" : "MasashiUmezawa 2/2/2013 21:17",
17+
"testPackStringArrayAsArrayOfBytes" : "MasashiUmezawa 2/2/2013 21:17",
18+
"testPackStringAsBytes" : "MasashiUmezawa 2/2/2013 20:56",
19+
"testPackUnknownContainedArray" : "MasashiUmezawa 2/2/2013 21:03",
20+
"testPackUnknownContainedDictionary" : "MasashiUmezawa 2/2/2013 21:07",
21+
"testPackUnpackComplexIdentityDictionary" : "MasashiUmezawa 2/2/2013 21:50",
22+
"testPackUnpackSimpleIdentityDictionary" : "MasashiUmezawa 2/2/2013 21:35",
23+
"testPackUnpackStrings" : "MasashiUmezawa 2/2/2013 21:21",
24+
"testUnpackBytesAsString" : "MasashiUmezawa 2/2/2013 22:00" } }

0 commit comments

Comments
 (0)