Hi,

I have consolidated all repositories where STON code lives so that they are now 
all in sync, and in sync with changes from Pharo 7.

 http://ss3.gemtalksystems.com/ss/STON/
 http://smalltalkhub.com/mc/SvenVanCaekenberghe/STON/main/
 https://github.com/svenvc/ston

There are 2 CI builds

 https://travis-ci.org/svenvc/ston
 https://ci.inria.fr/pharo-contribution/job/STON/

The project's format will remain FileTree (until Tonel is supported on other 
Smalltalk implementations).


Last week I applied a couple of changes that I wanted to apply for a long time.

Traits are no longer used in the implementation (which should help porting to 
other Smalltalk implementations).

More specifically the following are used (again)

- Class>>#stonOn:
- ClassDescription>>#stonContainsSubObjects
- Metaclass>>#stonName
- Metaclass>>#stonOn:

instead of

- TClass>>#stonOn:
- TClassDescription>>#stonContainsSubObjects
- TApplyingOnClassSide>>#stonName
- TApplyingOnClassSide>>#stonOn:

use #instanceSide instead of #theNonMetaClass in MetaClass>>#stonOn:

Reorganised the packages with sub tags.

Add support for Fraction and ScaledDecimal literals (not in JSON mode). 
Previously a float conversion meant there was a loss of information.

Change the representation of Date to include a timezone offset (since the 
current Date implementation is sensitive to this).

 2018-10-11Z
 2018-10-11+00:00
 2018-10-11+02:00

A missing timezone offset is interpreted as being the local timezone offset.

Add more special representations for common value style objects. One of STON's 
goals is to be a human readable and human editable representation of an object 
graph while remaining 100% correct (not losing information). The following were 
added for this reason:

MimeType and URL using ZnMimeType and ZnUrl respectively as simplified values.

 MimeType['application/json']
 URL['https://pharo.org']

Color

 Color[#red]
 Color{#red:1.0,#green:0.0,#blue:0.0,#alpha:0.4}

FileReferences to the DiskFileSystem (effectively normal files)

 FILE['/tmp/foo.txt']

Here is an example of how much difference that makes. Given the following 
Dictionary

{ 
  #background->Color red. 
  #workdir->'/tmp/pharo/work/' asFileReference. 
  #home->'https://pharo.org/experimental' asUrl. 
  #datatype->'application/json' asMIMEType } asDictionary

Which contains real objects as its values.

was serialised by STON BEFORE the changes as

{
        #datatype : ZnMimeType {
                #main : 'application',
                #sub : 'json'
        },
        #background : Color {
                #rgb : 1072693248,
                #cachedDepth : 32,
                #cachedBitPattern : Bitmap [
                        4294901760
                ],
                #alpha : 255
        },
        #home : ZnUrl {
                #scheme : #https,
                #host : 'pharo.org',
                #segments : OrderedCollection [
                        'experimental'
                ]
        },
        #workdir : FileReference {
                #filesystem : FileSystem {
                        #store : MacStore {
                                #maxFileNameLength : 255
                        }
                },
                #path : AbsolutePath [ 'tmp', 'pharo', 'work' ]
        }
}

which is 100% correct, but not very human friendly.

Now, AFTER the changes, the STON serialisation looks as follows:

{
        #datatype : MimeType [ 'application/json' ],
        #background : Color [ #red ],
        #home : URL [ 'https://pharo.org/experimental' ],
        #workdir : FILE [ '/tmp/pharo/work' ]
}

which is a huge improvement, IMO.

What do you think ? Comments, feedback, remarks ?
Any other suggestions for other object that could use this treatment ?

Sven


Reply via email to