CypressPackage.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 18 Sep 2012 13:00:02 +0000
changeset 18 fb5dc5aae98c
parent 17 d387df3d4e46
child 20 cdf3ee8ceeaa
permissions -rw-r--r--
- CypressFileTreeReader added: #readPackage:as:from: changed: #readPackage:from: category of:8 methods - CypressAbstractWriter category of:11 methods - CypressRepository added: #packageDirectoryForPackageName:in: #read:as: changed: #initialize #read: category of: #read: #writer - CypressAbstractReader class definition added: #packageDirectoryForPackageName:in: #readPackage:as:from: #readPackage:from: - extensions ...

"{ 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 := OrderedCollection new.
    ].
    ^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 := OrderedCollection new.   
    ].
    ^extensions

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

!CypressPackage methodsFor:'converting'!

asChange
    "superclass CypressModel says that I am responsible to implement this method"

    ^ self shouldNotImplement

    "Modified: / 18-09-2012 / 10:54:06 / 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.

    classes := definition classes collect:[:cls|CypressClass fromClass: cls].
    extensions := definition extensions collect:[:mthd|CypressMethod fromMethod: mthd].

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

!CypressPackage methodsFor:'private'!

changesInto:aChangeSet
    "superclass CypressModel says that I am responsible to implement this method"

    self classes do:[:each|each changesInto: aChangeSet].
    self extensions do:[:each|each changesInto: aChangeSet].

    "Modified: / 18-09-2012 / 10:57:53 / 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::                                                                                                                        $'
! !