CypressPackage.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 17 Sep 2012 21:34:55 +0000
changeset 15 31a33727c629
parent 14 d5b81c30785e
child 17 d387df3d4e46
permissions -rw-r--r--
- Getting rid of old Cypress implementation. - Reader does not work yet

"{ Package: 'stx:goodies/cypress' }"

CypressModel subclass:#CypressPackage
	instanceVariableNames:'definition comment classes extensions'
	classVariableNames:''
	poolDictionaries:''
	category:'Cypress-New-Model'
!


!CypressPackage class methodsFor:'instance creation'!

fromDirectory: directory
    "Reads a CypressPackage from given directory"

    ^self new initializeFromDirectory: directory

    "Created: / 13-09-2012 / 15:34:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fromPackage: packageId
    "Creates new CypressPackage for given package id"

    ^self fromPackageDefinition: (ProjectDefinition definitionClassForPackage: packageId createIfAbsent: true).

    "Created: / 10-09-2012 / 23:34:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

fromPackageDefinition: projectDefinition

    ^self new initializeFromPackageDefinition: projectDefinition

    "Created: / 10-09-2012 / 23:34:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!CypressPackage methodsFor:'accessing'!

classes

    classes isNil ifTrue:[
        classes := definition classes collect:[:cls|
            CypressClass fromClass: cls.
        ]
    ].
    ^classes

    "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:[
        extensions := definition extensions collect:[:mthd|
            CypressMethod fromMethod: mthd
        ]
    ].
    ^extensions

    "Created: / 11-09-2012 / 11:03:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!CypressPackage methodsFor:'initialization'!

initializeFromDirectory: directory
    self readFrom: directory

    "Created: / 13-09-2012 / 15:35:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

initializeFromPackageDefinition: projectDefinition
    definition := projectDefinition.
    name := projectDefinition package asString.
    properties := Dictionary new.

    properties 
        at: '_cypress_copyright' put: (definition legalCopyright);
        at: '_stx_name' put: name.

    "Created: / 10-09-2012 / 23:35:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!CypressPackage methodsFor:'reading & writing'!

writeTo: directory
    | notice |

    notice := definition legalCopyright.
    (self properties includesKey:'licenseFile') ifTrue:[
        notice := notice , ' (for license, see file ' , (self properties at:'licenseFile') , ')'.
    ].
    self writeTo: directory asFilename notice: notice.

    "Created: / 11-09-2012 / 11:45:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!CypressPackage methodsFor:'reading & writing - private'!

writeClassesTo: directory notice:copyrightNotice
    "Writes my classes  into 'directory' with given copyrightNotice"

    | obsolete |

    " collect possibly obsolete .class directories "
    obsolete := Set new.
    directory directoryContentsAsFilenamesDo:[:each|
        | suffix |

        each suffix = 'class' ifTrue:[
            obsolete add: each.
        ]
    ].

    " write classes... "
    self classes do:[:cpsCls|
        | cpsClsDir |

        cpsClsDir := directory / ((cpsCls name copyReplaceAll: $: with: $_) , '.class').
        obsolete remove: cpsClsDir ifAbsent:[].
        cpsCls writeTo: cpsClsDir notice:copyrightNotice
    ].

    " wipe out obsolete .class directories "
    obsolete do:[:each|
        each recursiveRemove.
    ].

    "Created: / 11-09-2012 / 11:10:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

writeExtensionsTo: directory notice:copyrightNotice
    "Writes extensions into 'directory'/file with given copyrightNotice"

    |  obsolete extensionsPerClass |

    " group extensions by class... "
    extensionsPerClass := Dictionary new.
    self 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 / ((name copyReplaceAll: $: with: $_) , '.extension').
        obsolete remove: cpsClsDir ifAbsent:[].
        cpsClsDir exists ifFalse: [ cpsClsDir makeDirectory ].

        " Here we create fake CypressClass with only extension methods - this
          way I can reuse logic allready coded in CypressClass. "
        cpsCls := CypressClass new.
        cpsCls new initializeWithMethods: cpsMthds.
        cpsCls writeMethodsTo: cpsClsDir notice:copyrightNotice.
    ].

    " wipe out obsolete .class directories "
    obsolete do:[:each|
        each recursiveRemove.
    ].

    "Created: / 11-09-2012 / 11:12:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !

!CypressPackage class methodsFor:'documentation'!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !