- CypressWriter
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Sep 2012 18:05:30 +0000
changeset 14 d5b81c30785e
parent 13 f90704544ca0
child 15 31a33727c629
- CypressWriter class definition added:8 methods changed: #documentation - stx_goodies_cypress changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - CypressModel added: #writeTo:using: - CypressMethod added: #category #source #writeTo:using: - CypressAbstractWriter added:30 methods category of: - CypressPackage added: #comment #comment: #definition #writeTo:using: - CypressRepository added:5 methods changed: #directory: category of: - CypressClass added: #comment #comment: #writeTo:using: - extensions ...
CypressAbstractWriter.st
CypressClass.st
CypressMethod.st
CypressPackage.st
CypressRepository.st
CypressWriter.st
Make.proto
Make.spec
abbrev.stc
bc.mak
cypress.rc
libInit.cc
stx_goodies_cypress.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CypressAbstractWriter.st	Mon Sep 17 18:05:30 2012 +0000
@@ -0,0 +1,332 @@
+"{ Package: 'stx:goodies/cypress' }"
+
+Object subclass:#CypressAbstractWriter
+	instanceVariableNames:'repository notice'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Cypress-New-Reader & Writer'
+!
+
+!CypressAbstractWriter class methodsFor:'documentation'!
+
+documentation
+"
+    Base abstract class for writing code in Cypress format. Subclasses may
+    implement various versions of the 'standard'.
+
+    [author:]
+        Jan Vrany <jan.vrany@fit.cvut.cz>
+
+    [instance variables:]
+
+    [class variables:]
+
+    [see also:]
+        CypressWriter
+
+"
+! !
+
+!CypressAbstractWriter class methodsFor:'instance creation'!
+
+onDirectory: aStringOrFilename
+    ^self onRepository: (CypressRepository on: aStringOrFilename)
+
+    "Created: / 17-09-2012 / 17:17:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+onRepository: aCypressRepository
+    ^self new repository: aCypressRepository
+
+    "Created: / 17-09-2012 / 17:16:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter methodsFor:'accessing'!
+
+notice
+    "Return the copyright notice to be written"
+
+    ^notice
+
+    "Created: / 17-09-2012 / 17:18:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+notice: aString
+    "Sets the copyright notice to be written in each file"
+
+    notice := aString.
+
+    "Modified (comment): / 17-09-2012 / 17:19:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository
+    ^ repository
+!
+
+repository:aCypressRepository
+    repository := aCypressRepository.
+    notice := repository properties at: 'copyrightLine' ifAbsent:[nil].
+
+    "Modified: / 17-09-2012 / 17:20:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter methodsFor:'accessing-filenames'!
+
+directoryNameForClass: cclass
+    ^((cclass name copyReplaceAll: $: with: $_) , '.', self suffixForClass).
+
+    "Created: / 17-09-2012 / 18:11:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+directoryNameForExtensions: classname
+    ^((classname copyReplaceAll: $: with: $_) , '.', self suffixForExtensions).
+
+    "Created: / 17-09-2012 / 18:27:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+directoryNameForPackage: aCypressPackage
+
+    ^(aCypressPackage name copy
+        replaceAll:$: with: $_;
+        replaceAll:$/ with: $_;
+        yourself) , '.' , self suffixForPackage
+
+    "Created: / 17-09-2012 / 17:32:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+fileNameForComment
+    ^repository properties at:'commentFile' ifAbsent:['README.md']
+
+    "Created: / 17-09-2012 / 18:07:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+fileNameForMethod: cmethod
+    ^Dictionary new
+        at: $/ put: '__quo__';
+        "/Add more..."
+
+        at: cmethod selector ifAbsent:[
+            ((cmethod selector copyReplaceAll:$: with: $.) , '.st')
+        ]
+
+    "Created: / 17-09-2012 / 18:22:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+filenameNameForProperties
+    ^'properties.ston'
+
+    "Created: / 17-09-2012 / 17:38:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+suffixForClass
+    ^'class'
+
+    "Created: / 17-09-2012 / 18:09:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+suffixForExtensions
+    ^'extension'
+
+    "Created: / 17-09-2012 / 18:09:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+suffixForPackage
+    ^'package'
+
+    "Created: / 17-09-2012 / 18:09:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter methodsFor:'writing'!
+
+write: packageIdOrProjectDefinition
+    | cpkg |
+
+    cpkg := packageIdOrProjectDefinition asCypressPackage.
+    self writePackage: cpkg to: repository directory
+
+    "Created: / 17-09-2012 / 17:22:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter methodsFor:'writing-model'!
+
+writeClass: cclass to: directory
+    self subclassResponsibility
+
+    "Created: / 17-09-2012 / 18:40:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeMethod: cmethod to: directory
+    self subclassResponsibility
+
+    "Created: / 17-09-2012 / 18:40:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writePackage: cpackage to: directory
+    self subclassResponsibility
+
+    "Created: / 17-09-2012 / 17:34:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter methodsFor:'writing-utils'!
+
+writeClasses: classes to: directory
+    "Writes my classes  into 'directory' with given copyrightNotice"
+
+    | obsolete |
+
+    " collect possibly obsolete .class directories "
+    obsolete := Set new.
+    directory directoryContentsAsFilenamesDo:[:each|
+        | suffix |
+
+        each suffix = self suffixForClass ifTrue:[
+            obsolete add: each.
+        ]
+    ].
+
+    " write classes... "
+    classes do:[:cclass|
+        | cpsClsDir |
+
+        cpsClsDir := directory / (self directoryNameForClass: cclass).
+        obsolete remove:cpsClsDir ifAbsent:[].
+        self writeClass: cclass to: directory
+    ].
+
+    " wipe out obsolete .class directories "
+    obsolete do:[:each|
+        each recursiveRemove.
+    ].
+
+    "Created: / 17-09-2012 / 18:12:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeComment: comment to: directory
+    comment isNil ifTrue:[ ^ self ].
+
+    (directory / (self fileNameForComment)) writingFileDo:[:f|
+        f nextPutAll: comment
+    ]
+
+    "Created: / 17-09-2012 / 17:47:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeExtensions: extensions to: directory
+    "Writes extensions into 'directory'/file with given copyrightNotice"
+
+    |  obsolete extensionsPerClass |
+
+    " group extensions by class... "
+    extensionsPerClass := Dictionary new.
+    extensions do:[:cpsMthd |
+        (extensionsPerClass at: cpsMthd klass ifAbsentPut: [ Set new ])
+            add: cpsMthd.
+    ].
+
+    " collect possibly obsolete .extension directories "
+    obsolete := Set new.
+    directory directoryContentsAsFilenamesDo:[:each|
+        | suffix |
+
+        each suffix = 'extension' ifTrue:[
+            obsolete add: each.
+        ]
+    ].
+
+    " write individual extensions... "
+    extensionsPerClass keysAndValuesDo:[:name :cpsMthds |
+        | cpsClsDir cpsCls |
+
+        cpsClsDir := directory / (self directoryNameForExtensions: name).
+        obsolete remove: cpsClsDir ifAbsent:[].
+        cpsClsDir exists ifFalse: [ cpsClsDir makeDirectory ].
+
+        self writeMethods: cpsMthds to: cpsClsDir.
+    ].
+
+    " wipe out obsolete .class directories "
+    obsolete do:[:each|
+        each recursiveRemove.
+    ].
+
+    "Created: / 17-09-2012 / 18:29:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeMethods: methods to:directory 
+     "Writes methods into given 'directory' with copyrightNotice in each file"
+
+    | obsolete instDir classDir |
+
+    instDir := directory / 'instance'.
+    classDir := directory / 'class'.
+
+    " collect possibly obsolete directories/files "
+    obsolete := Set new.
+    instDir exists ifTrue:[
+        obsolete add: instDir.
+        obsolete addAll: instDir directoryContentsAsFilenames
+    ].
+    classDir exists ifTrue:[
+        obsolete add: classDir.
+        obsolete addAll: classDir directoryContentsAsFilenames
+    ].
+
+    methods do:[:cpsMthd|
+        | dir dottedSel file baseNameWithoutSuffix |
+
+        dir := cpsMthd meta ifTrue:[classDir] ifFalse:[instDir].
+        dir exists ifFalse:[ dir makeDirectory ].
+        file := dir / (self fileNameForMethod: cpsMthd).
+        baseNameWithoutSuffix := file withoutSuffix baseName.
+        self writeMethod: cpsMthd to: dir.
+        obsolete := obsolete reject:[:each|
+            each withoutSuffix baseName = baseNameWithoutSuffix
+        ].
+    ].
+
+    " wipe out obsolete directories / files  "
+    obsolete do:[:each|
+        each exists ifTrue:[ each recursiveRemove ]
+    ].
+
+    "Created: / 17-09-2012 / 18:29:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writeProperties: properties to: directory
+    | props propertyFile |
+
+    props := properties copy.
+    props isEmptyOrNil ifTrue:[ ^ self ].
+    propertyFile := directory / self filenameNameForProperties. 
+
+    " add notice "
+    props at: '_cypress_copyright' put: notice.
+
+    " be nice and do not discard properties of others. Merge them"
+    propertyFile exists ifTrue:[
+        | existing |
+        existing := CypressJsonParser parse: propertyFile.
+        existing keysAndValuesDo:[:key :value|
+            (props includesKey: key) ifFalse:[
+                props at: key put: value
+            ]
+        ]
+    ].
+    props isEmpty ifTrue:[
+        propertyFile exist ifTrue:[
+            propertyFile remove
+        ]
+    ] ifFalse:[
+        propertyFile writingFileDo:[:s|
+            props writeCypressJsonOn: s forHtml: false indent: 0.
+        ]
+    ].
+
+    "Created: / 17-09-2012 / 17:38:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!CypressAbstractWriter class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
--- a/CypressClass.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/CypressClass.st	Mon Sep 17 18:05:30 2012 +0000
@@ -28,6 +28,14 @@
 
 !CypressClass methodsFor:'accessing'!
 
+comment
+    ^ comment
+!
+
+comment:something
+    comment := something.
+!
+
 methods
 
     methods isNil ifTrue:[
@@ -87,30 +95,6 @@
     "Created: / 11-09-2012 / 11:15:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!CypressClass methodsFor:'reading & writing'!
-
-readFrom:filename
-    "Initializes the receiver from directory/file named 'filename'"
-
-    ^ self shouldImplement
-!
-
-writeTo:directory notice:copyrightNotice
-     "Writes the receiver into given 'directory' with
-      copyrightNotice in each file"
-
-    | dir |
-
-    dir := directory asFilename.
-    dir exists ifFalse: [ dir recursiveMakeDirectory ].
-
-
-    self writePropertiesTo: directory notice: copyrightNotice.
-    self writeMethodsTo: directory notice: copyrightNotice.
-
-    "Modified (comment): / 11-09-2012 / 11:19:33 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !CypressClass methodsFor:'reading & writing - private'!
 
 writeMethodsTo:directory notice:copyrightNotice
--- a/CypressMethod.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/CypressMethod.st	Mon Sep 17 18:05:30 2012 +0000
@@ -26,6 +26,10 @@
 
 !CypressMethod methodsFor:'accessing'!
 
+category
+    ^ category
+!
+
 klass
     ^ klass
 !
@@ -44,6 +48,10 @@
     ^self name
 
     "Created: / 11-09-2012 / 11:18:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+source
+    ^ source
 ! !
 
 !CypressMethod methodsFor:'initialization'!
@@ -64,29 +72,6 @@
     "Created: / 11-09-2012 / 00:05:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
-!CypressMethod methodsFor:'reading & writing'!
-
-readFrom:filename
-    "Initializes the receiver from directory/file named 'filename'"
-
-    ^ self shouldImplement
-!
-
-writeTo:filename notice:copyrightNotice
-    "Writes the receiver into given 'directory' with
-     copyrightNotice in each file"
-
-    filename writingFileDo:[:s|
-        s nextPut:$"; cr.
-        s nextPutAll: 'notice: '; nextPutAll: copyrightNotice; cr.
-        s nextPutAll: 'category: '; nextPutAll: category ? '* as yet unclassified *'; cr.
-        s nextPut:$"; cr.
-        s nextPutAll: source.
-    ].
-
-    "Modified: / 11-09-2012 / 11:36:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
 !CypressMethod class methodsFor:'documentation'!
 
 version_SVN
--- a/CypressPackage.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/CypressPackage.st	Mon Sep 17 18:05:30 2012 +0000
@@ -47,6 +47,18 @@
     "Created: / 10-09-2012 / 23:45:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
+comment
+    ^ comment
+!
+
+comment:something
+    comment := something.
+!
+
+definition
+    ^ definition
+!
+
 extensions
 
     extensions isNil ifTrue:[
@@ -87,30 +99,6 @@
 
 !CypressPackage methodsFor:'reading & writing'!
 
-readFrom:aStringOrFilename
-    "Initializes the receiver from directory/file named 'filename'"
-
-    | dir |
-
-    dir := aStringOrFilename asFilename.
-    self readPropertiesFrom: dir.
-
-    classes := OrderedCollection new.
-    extensions := OrderedCollection new.
-
-    dir directoryContentsAsFilenamesDo:[:each|
-        each suffix = 'class' ifTrue:[
-            self halt.
-        ].
-        each suffix = 'extension' ifTrue:[
-            self halt.
-        ]
-
-    ]
-
-    "Modified: / 13-09-2012 / 15:52:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
 writeTo: directory
     | notice |
 
@@ -121,23 +109,6 @@
     self writeTo: directory asFilename notice: notice.
 
     "Created: / 11-09-2012 / 11:45:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-writeTo: directory notice:copyrightNotice
-    "Writes the receiver into directory/file named 'filename'
-     with given copyrightNotice"
-
-    | dir notice |
-
-    dir := directory asFilename.
-    dir exists ifFalse: [ dir recursiveMakeDirectory ].
-    notice := copyrightNotice isNil ifTrue:[definition legalCopyright] ifFalse:[copyrightNotice].
-
-    self writePropertiesTo: dir notice: notice.
-    self writeClassesTo:  dir notice: notice.
-    self writeExtensionsTo: dir notice: notice.
-
-    "Modified: / 13-09-2012 / 14:47:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !CypressPackage methodsFor:'reading & writing - private'!
--- a/CypressRepository.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/CypressRepository.st	Mon Sep 17 18:05:30 2012 +0000
@@ -61,73 +61,36 @@
     "Sets the root directory of a Cypress Repository"
 
     directory := aStringOrFilename asFilename.
-    self readPropertiesFrom: directory.
-
-    "Modified: / 13-09-2012 / 14:49:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!CypressRepository methodsFor:'reading'!
+    self readProperties.
 
-read: packageName
-    "Reads the package from repository. Returns package contents as changeset.
-     To load that package into an image, send it #apply"
-    ^self read: packageName as: nil
-
-    "Created: / 13-09-2012 / 15:21:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 17-09-2012 / 18:49:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-read: packageName as: packageId
-    "Reads the package from repository. Returns package contents as changeset.
-     If packageId is not nil, then force package to be a 'packageId',
-     otherwise, use package name specified in package properties.
-     To load that package into an image, send it #apply"
+package
+    "Returns a CypressPackage which the receiver belongs to"
 
-    | cpkgdir cpkg |
+    ^ self shouldImplement
+! !
+
+!CypressRepository methodsFor:'private'!
 
-    cpkgdir := directory / packageName.
-    cpkgdir exists ifFalse:[
-        "Try add '.package'..."
-        cpkgdir := directory / (packageName , '.package').
-        cpkgdir exists ifFalse:[
-            "Hmm...maybe a Smalltalk/X package Id, not a directory name,
-            let's try"
-            cpkgdir := directory / ((packageName asString copy replaceAll:$: with:$_; replaceAll:$/ with:$_) , '.package').
-            cpkgdir exists ifFalse:[
-                self error:'Cannot find package , ' , packageName, ' in repository'.
-                ^nil.
-            ]
-        ]
+readProperties
+    | propertyFile |
+
+    propertyFile := directory / 'properties.ston'.
+    propertyFile exists ifTrue:[
+        properties := CypressJsonParser parse: propertyFile.
+        ^self
     ].
 
-    cpkg := CypressPackage fromDirectory: cpkgdir.
-    ^cpkg
-
-    "Created: / 13-09-2012 / 15:37:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!CypressRepository methodsFor:'writing'!
-
-write: packageId 
-    ^self write: packageId as: nil
-
-    "Created: / 13-09-2012 / 14:23:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
+    propertyFile := directory / 'properties.json'.
+    propertyFile exists ifTrue:[
+        properties := CypressJsonParser parse: propertyFile.
+        ^self
+    ].
+    properties := Dictionary new
 
-write: packageId as: packageNameOrNil
-    "Writes a package into repository under given name. If
-     'packageNameOrNil' is nil, then default filename is used"
-
-    | cpkg cpkgdir |
-    cpkg := packageId asCypressPackage.
-    cpkgdir := packageNameOrNil isNil ifTrue:[
-        directory / ((cpkg name copy replaceAll:$: with:$_; replaceAll:$/ with:$_) , '.package').
-    ] ifFalse:[
-        directory / (packageNameOrNil endsWith:'.package') ifTrue:[packageNameOrNil] ifFalse:[packageNameOrNil , '.package'].
-    ].
-    directory exists ifFalse:[ directory recursiveMakeDirectory ].
-    cpkg writeTo: cpkgdir notice: (properties at: 'copyrightLine' ifAbsent:[nil])
-
-    "Created: / 13-09-2012 / 14:22:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Created: / 17-09-2012 / 18:49:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !CypressRepository class methodsFor:'documentation'!
--- a/CypressWriter.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/CypressWriter.st	Mon Sep 17 18:05:30 2012 +0000
@@ -1,7 +1,7 @@
 "{ Package: 'stx:goodies/cypress' }"
 
-Object subclass:#CypressWriter
-	instanceVariableNames:'repository'
+CypressAbstractWriter subclass:#CypressWriter
+	instanceVariableNames:''
 	classVariableNames:''
 	poolDictionaries:''
 	category:'Cypress-New-Reader & Writer'
@@ -14,8 +14,7 @@
     An entry point to write a package in Cypress format.
     Example:
 
-    CypressWriter new
-        repository: '~/Projects/SmalltalkX/repositories/git/cypress/implementations/smalltalkx/packages';
+    (CypressWriter onDirectory:'~/Projects/SmalltalkX/repositories/git/cypress/implementations/smalltalkx/packages');
         write: #'stx:goodies/cypress'.
 
     [author:]
@@ -26,18 +25,61 @@
     [class variables:]
 
     [see also:]
+        'Cypress spec' - https://github.com/CampSmalltalk/Cypress/wiki
 
 "
 ! !
 
-!CypressWriter methodsFor:'accessing'!
+!CypressWriter methodsFor:'writing-model'!
+
+writeClass: cclass to: directory
+
+    | clsdir |
 
-repository
-    ^ repository
+    clsdir := directory / (self directoryNameForClass: cclass).
+    clsdir exists ifFalse:[ clsdir recursiveMakeDirectory ].
+
+    self 
+        writeProperties: cclass properties to: clsdir;
+        writeComment: cclass comment to: clsdir;
+        writeMethods: cclass methods to: clsdir
+
+    "Created: / 17-09-2012 / 18:34:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 !
 
-repository:aStringOrFilename
-    repository := aStringOrFilename.
+writeMethod: cmethod to: directory
+    | mthfile |
+
+    mthfile := directory / (self fileNameForMethod: cmethod).
+
+    self writeProperties: cmethod properties to: directory.
+
+    mthfile writingFileDo:[:s|
+        s nextPut:$"; cr.
+        s nextPutAll: 'notice: '; nextPutAll: notice; cr.
+        s nextPutAll: 'category: '; nextPutAll: cmethod category ? '* as yet unclassified *'; cr.
+        s nextPut:$"; cr.
+        s nextPutAll: cmethod source.
+    ].
+
+    "Created: / 17-09-2012 / 18:35:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+writePackage: cpackage to: directory
+
+    | pkgdir |
+
+    notice isNil ifTrue:[ notice := cpackage definition legalCopyright ].
+    pkgdir := repository directory / (self directoryNameForPackage: cpackage).
+    pkgdir exists ifFalse:[ pkgdir recursiveMakeDirectory ].
+
+    self 
+        writeProperties: cpackage properties to: pkgdir;
+        writeComment: cpackage comment to: pkgdir;
+        writeClasses: cpackage classes to: pkgdir;
+        writeExtensions: cpackage extensions to: pkgdir.
+
+    "Created: / 17-09-2012 / 17:44:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !CypressWriter class methodsFor:'documentation'!
--- a/Make.proto	Thu Sep 13 14:58:01 2012 +0000
+++ b/Make.proto	Mon Sep 17 18:05:30 2012 +0000
@@ -180,6 +180,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)CypressAbstractWriter.$(O) CypressAbstractWriter.$(H): CypressAbstractWriter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDefinition.$(O) CypressDefinition.$(H): CypressDefinition.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDefinitionIndex.$(O) CypressDefinitionIndex.$(H): CypressDefinitionIndex.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDependencySorter.$(O) CypressDependencySorter.$(H): CypressDependencySorter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -194,7 +195,6 @@
 $(OUTDIR)CypressPatchOperation.$(O) CypressPatchOperation.$(H): CypressPatchOperation.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressSnapshot.$(O) CypressSnapshot.$(H): CypressSnapshot.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressStructure.$(O) CypressStructure.$(H): CypressStructure.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)CypressWriter.$(O) CypressWriter.$(H): CypressWriter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)stx_goodies_cypress.$(O) stx_goodies_cypress.$(H): stx_goodies_cypress.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressAddition.$(O) CypressAddition.$(H): CypressAddition.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressPatchOperation.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressClass.$(O) CypressClass.$(H): CypressClass.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressModel.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -208,6 +208,7 @@
 $(OUTDIR)CypressPackageStructure.$(O) CypressPackageStructure.$(H): CypressPackageStructure.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressStructure.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressRemoval.$(O) CypressRemoval.$(H): CypressRemoval.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressPatchOperation.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)CypressRepository.$(O) CypressRepository.$(H): CypressRepository.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressModel.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)CypressWriter.$(O) CypressWriter.$(H): CypressWriter.st $(INCLUDE_TOP)/stx/goodies/cypress/CypressAbstractWriter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/CharacterArray.$(H) $(INCLUDE_TOP)/stx/libbasic/ByteArray.$(H) $(INCLUDE_TOP)/stx/libbasic/UninterpretedBytes.$(H) $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/Array.$(H) $(INCLUDE_TOP)/stx/libbasic/Boolean.$(H) $(INCLUDE_TOP)/stx/libbasic/Character.$(H) $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Class.$(H) $(INCLUDE_TOP)/stx/libbasic/ClassDescription.$(H) $(INCLUDE_TOP)/stx/libbasic/Behavior.$(H) $(INCLUDE_TOP)/stx/libbasic/Dictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Set.$(H) $(INCLUDE_TOP)/stx/libbasic/Number.$(H) $(INCLUDE_TOP)/stx/libbasic/ArithmeticValue.$(H) $(INCLUDE_TOP)/stx/libbasic/String.$(H) $(INCLUDE_TOP)/stx/libbasic/Method.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/ConfigurableFeatures.$(H) $(INCLUDE_TOP)/stx/libbasic/PackageId.$(H) $(INCLUDE_TOP)/stx/libbasic/Symbol.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/Make.spec	Thu Sep 13 14:58:01 2012 +0000
+++ b/Make.spec	Mon Sep 17 18:05:30 2012 +0000
@@ -73,11 +73,12 @@
 	CypressPackageStructure \
 	CypressRemoval \
 	CypressModel \
-	CypressWriter \
 	CypressClass \
 	CypressMethod \
 	CypressPackage \
 	CypressRepository \
+	CypressAbstractWriter \
+	CypressWriter \
 
 
 
@@ -106,11 +107,12 @@
     $(OUTDIR)CypressPackageStructure.$(O) \
     $(OUTDIR)CypressRemoval.$(O) \
     $(OUTDIR)CypressModel.$(O) \
-    $(OUTDIR)CypressWriter.$(O) \
     $(OUTDIR)CypressClass.$(O) \
     $(OUTDIR)CypressMethod.$(O) \
     $(OUTDIR)CypressPackage.$(O) \
     $(OUTDIR)CypressRepository.$(O) \
+    $(OUTDIR)CypressAbstractWriter.$(O) \
+    $(OUTDIR)CypressWriter.$(O) \
     $(OUTDIR)extensions.$(O) \
 
 
--- a/abbrev.stc	Thu Sep 13 14:58:01 2012 +0000
+++ b/abbrev.stc	Mon Sep 17 18:05:30 2012 +0000
@@ -30,8 +30,9 @@
 CypressSnapshotTest CypressSnapshotTest stx:goodies/cypress 'Cypress-Tests' 1
 CypressStructureTest CypressStructureTest stx:goodies/cypress 'Cypress-Tests' 1
 CypressModel CypressModel stx:goodies/cypress 'Cypress-New-Model' 0
-CypressWriter CypressWriter stx:goodies/cypress 'Cypress-New-Reader & Writer' 0
 CypressClass CypressClass stx:goodies/cypress 'Cypress-New-Model' 0
 CypressMethod CypressMethod stx:goodies/cypress 'Cypress-New-Model' 0
 CypressPackage CypressPackage stx:goodies/cypress 'Cypress-New-Model' 0
 CypressRepository CypressRepository stx:goodies/cypress 'Cypress-New-Model' 0
+CypressAbstractWriter CypressAbstractWriter stx:goodies/cypress 'Cypress-New-Reader & Writer' 0
+CypressWriter CypressWriter stx:goodies/cypress 'Cypress-New-Reader & Writer' 0
--- a/bc.mak	Thu Sep 13 14:58:01 2012 +0000
+++ b/bc.mak	Mon Sep 17 18:05:30 2012 +0000
@@ -116,6 +116,7 @@
 
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)CypressAbstractWriter.$(O) CypressAbstractWriter.$(H): CypressAbstractWriter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDefinition.$(O) CypressDefinition.$(H): CypressDefinition.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDefinitionIndex.$(O) CypressDefinitionIndex.$(H): CypressDefinitionIndex.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressDependencySorter.$(O) CypressDependencySorter.$(H): CypressDependencySorter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -130,7 +131,6 @@
 $(OUTDIR)CypressPatchOperation.$(O) CypressPatchOperation.$(H): CypressPatchOperation.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressSnapshot.$(O) CypressSnapshot.$(H): CypressSnapshot.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressStructure.$(O) CypressStructure.$(H): CypressStructure.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)CypressWriter.$(O) CypressWriter.$(H): CypressWriter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)stx_goodies_cypress.$(O) stx_goodies_cypress.$(H): stx_goodies_cypress.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressAddition.$(O) CypressAddition.$(H): CypressAddition.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressPatchOperation.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressClass.$(O) CypressClass.$(H): CypressClass.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressModel.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -144,6 +144,7 @@
 $(OUTDIR)CypressPackageStructure.$(O) CypressPackageStructure.$(H): CypressPackageStructure.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressStructure.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressRemoval.$(O) CypressRemoval.$(H): CypressRemoval.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressPatchOperation.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)CypressRepository.$(O) CypressRepository.$(H): CypressRepository.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressModel.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)CypressWriter.$(O) CypressWriter.$(H): CypressWriter.st $(INCLUDE_TOP)\stx\goodies\cypress\CypressAbstractWriter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\CharacterArray.$(H) $(INCLUDE_TOP)\stx\libbasic\ByteArray.$(H) $(INCLUDE_TOP)\stx\libbasic\UninterpretedBytes.$(H) $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\Array.$(H) $(INCLUDE_TOP)\stx\libbasic\Boolean.$(H) $(INCLUDE_TOP)\stx\libbasic\Character.$(H) $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Class.$(H) $(INCLUDE_TOP)\stx\libbasic\ClassDescription.$(H) $(INCLUDE_TOP)\stx\libbasic\Behavior.$(H) $(INCLUDE_TOP)\stx\libbasic\Dictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Set.$(H) $(INCLUDE_TOP)\stx\libbasic\Number.$(H) $(INCLUDE_TOP)\stx\libbasic\ArithmeticValue.$(H) $(INCLUDE_TOP)\stx\libbasic\String.$(H) $(INCLUDE_TOP)\stx\libbasic\Method.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\ConfigurableFeatures.$(H) $(INCLUDE_TOP)\stx\libbasic\PackageId.$(H) $(INCLUDE_TOP)\stx\libbasic\Symbol.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/cypress.rc	Thu Sep 13 14:58:01 2012 +0000
+++ b/cypress.rc	Mon Sep 17 18:05:30 2012 +0000
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_goodies_cypress.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,13,13
+  FILEVERSION     6,2,14,14
   PRODUCTVERSION  6,2,3,1
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "Jan Vrany\0"
       VALUE "FileDescription", "Cypress Package Format Reader/Writer (LIB)\0"
-      VALUE "FileVersion", "6.2.13.13\0"
+      VALUE "FileVersion", "6.2.14.14\0"
       VALUE "InternalName", "stx:goodies/cypress\0"
       VALUE "LegalCopyright", "Copyright Jan Vrany & Dale Henrichs 2012\0"
       VALUE "ProductName", "Cypress\0"
       VALUE "ProductVersion", "6.2.3.1\0"
-      VALUE "ProductDate", "Thu, 13 Sep 2012 14:57:42 GMT\0"
+      VALUE "ProductDate", "Mon, 17 Sep 2012 18:06:18 GMT\0"
     END
 
   END
--- a/libInit.cc	Thu Sep 13 14:58:01 2012 +0000
+++ b/libInit.cc	Mon Sep 17 18:05:30 2012 +0000
@@ -27,6 +27,7 @@
 void _libstx_goodies_cypress_Init(pass, __pRT__, snd)
 OBJ snd; struct __vmData__ *__pRT__; {
 __BEGIN_PACKAGE2__("libstx_goodies_cypress", _libstx_goodies_cypress_Init, "stx:goodies/cypress");
+_CypressAbstractWriter_Init(pass,__pRT__,snd);
 _CypressDefinition_Init(pass,__pRT__,snd);
 _CypressDefinitionIndex_Init(pass,__pRT__,snd);
 _CypressDependencySorter_Init(pass,__pRT__,snd);
@@ -41,7 +42,6 @@
 _CypressPatchOperation_Init(pass,__pRT__,snd);
 _CypressSnapshot_Init(pass,__pRT__,snd);
 _CypressStructure_Init(pass,__pRT__,snd);
-_CypressWriter_Init(pass,__pRT__,snd);
 _stx_137goodies_137cypress_Init(pass,__pRT__,snd);
 _CypressAddition_Init(pass,__pRT__,snd);
 _CypressClass_Init(pass,__pRT__,snd);
@@ -55,6 +55,7 @@
 _CypressPackageStructure_Init(pass,__pRT__,snd);
 _CypressRemoval_Init(pass,__pRT__,snd);
 _CypressRepository_Init(pass,__pRT__,snd);
+_CypressWriter_Init(pass,__pRT__,snd);
 
 _stx_137goodies_137cypress_extensions_Init(pass,__pRT__,snd);
 __END_PACKAGE__();
--- a/stx_goodies_cypress.st	Thu Sep 13 14:58:01 2012 +0000
+++ b/stx_goodies_cypress.st	Mon Sep 17 18:05:30 2012 +0000
@@ -38,9 +38,9 @@
         #'stx:goodies/simpleServices'
         #'stx:goodies/sunit'    "TestCase - superclass of CypressAbstractTest "
         #'stx:goodies/webServer'
-        #'stx:libbasic'    "ArithmeticValue - superclass of extended Number "
+        #'stx:libbasic'    "ExecutableFunction - superclass of extended CompiledCode "
         #'stx:libbasic2'
-        #'stx:libbasic3'    "ClassDefinitionChange - referenced by CypressClassStructure>>changesOn: "
+        #'stx:libbasic3'    "MethodDefinitionChange - referenced by CypressMethodStructure>>changesOn: "
         #'stx:libcomp'    "Parser - referenced by CypressPackageReader>>readMethodStructureFor:in:methodProperties: "
         #'stx:libcompat'
         #'stx:libdb/libodbc'
@@ -94,11 +94,12 @@
         (CypressSnapshotTest autoload)
         (CypressStructureTest autoload)
         CypressModel
-        CypressWriter
         CypressClass
         CypressMethod
         CypressPackage
         CypressRepository
+        CypressAbstractWriter
+        CypressWriter
     )
 !