On 30 June 2018 at 16:24, Ben Coman <btc@openinworld.com> wrote:
On 16 Jun 2018, at 15:38, Ben Coman <btc@openInWorld.com> wrote:

Le 16/06/2018 �� 10:43, Ben Coman a ��crit��:
How can a fileout/filein be done using Tonel format?
In the first case as a script?
and secondly as a possible menu option for Pharo?

This is to facilitate transfer of student coding exercises for Exercism.
http://exercism.io/languages/pharo/launch

Could Tonel handle a full package export in one file?

On 16 June 2018 at 17:13, Hilaire <hilaire@drgeo.eu> wrote:
Hi Ben,

I am not sure, but the purpose of Tonel is to propose a file representation of "one class=one file".

Sure thats how Tonel came about, and its how we mostly use it, but is this an inherent limitation?��
Each method is prefixed with its class, so from my 100ft viewpoint it seems feasible to transport a whole package in one Tonel file.��


Why not using Fileout st files to transfer the code?

The same question might be asked why Iceberg didn't just use a Fileout at class level.��
The Tonel��format is more readable, especially minus the scattering of exclamation marks.
��
I also meant to ask, what methods are used to file-in a Tonel file ?
Or more the point, what method process a string in Tonel format that has been downloaded from a website?

Actually, hunting around a bit I found....

TonelParserTest >> testMethodDefList
shows that... ((TonelParser on: tonelString readStream) perform:��#methodDefList)
returns an array of MCMethodDefinitions that respond to #load
with...
MCMethodDefinition >>��load
self actualClass
compile: source
classified: category
withStamp: timeStamp
notifying: nil

And...��
TonelParserTest >>��testTypeDef
shows that ((TonelParser on: tonelString��readStream) perform: #typeDef)
returns a��MCClassDefinition that also responds to #load
with...
MCClassDefinition >> load
self createClass


So as an experiment I deleted MCMockClassD,
then in playground evaluated...
�� �� parser := (TonelParser on: tonelString readStream).
�� �� classDef := parser perform: #typeDef.
�� �� methodDefs := parser perform: #methodDefList.
�� �� classDef load.
�� �� methodDefs do: [ :md | md load ].

and super cool...�� ��MCMockClassD>>one�� was restored.
So is that the correct way to use it?

cheers -ben



On 29 Jun 2018, at 17:11, Tim Mackinnon <tim@testit.works> wrote:

Just as a followup to this - Bens suggestion can be slightly simplified (and less dependent on implementation details) as:

tonelStream := ������path���./src/Polymorph-Widgets-Rules/IconShortcutRule.class.st' asFileReference readStream.
parser := (TonelParser on: tonelStream).
parser document do: [ :item | item load ��].

If you want to load an entire directory you can use a reader (but sadly the reader doesn���t let you load only one file)

tonelLocator := ������path���./src/Polymorph-Widgets-Rules/IconShortcutRule.class.st' asFileReference.
(TonelReader on: tonelLocator fileName: tonelLocator path parent pathString ) loadDefinitions.

Thought this might help someone in the future (particularly if you are recovering a deleted file(s) from git ;)

Tim

On 30 June 2018 at 07:31, Tim Mackinnon��<tim@testit.works>��wrote:
As another output (and an answer to Ben���s question) - to output, you need a snapshot - the easiest I could work out was something like:

TonelWriter new sourceDir: '.' asFileReference; writeSnapshot: (MCPackage named: HelloWorldTest package name) snapshot.



hey! thats super cool.�� Perhaps we do that writing to a memory file-system, then upload those files a strings to the Execism server.
Do you have a similar idea for the reverse?

And I just noticed your comment in the Exercism issue (https://github.com/exercism/pharo/issues/6)
May as well copy it here...

To read it back in:

sourceDir := '.' asFileReference.
(TonelReader on: tonelLocator fileName: sourceDir pathString ) loadDefinitions.
�� ��cheers -ben