Is there a chance to get this methods (or any better versions of them)
added to Metacello?

>>extractZip: fileRef in: dst
    " If fileRef is a ZIP archive, uncompress its contents in dst and
delete it "

    | zipArchive |
    (fileRef fullName endsWith: '.zip')
        ifFalse: [ ^ self ].
    zipArchive := ZipArchive new.
    [ zipArchive
        readFrom: fileRef fullName;
        extractAllTo: dst ]
        ensure: [ zipArchive close ].
    fileRef delete


>>extractGZip: fileRef in: dst
    " If fileRef is a ZIP archive, uncompress its contents in dst and
delete it "

    | unzipped |
    (fileRef fullName endsWith: '.gz')
        ifFalse: [ ^ self ].
    unzipped := GZipReadStream unzip: fileRef basename to: dst.
    (Smalltalk hasClassNamed: #OSProcess)
        ifTrue: [
            (Smalltalk at: #OSProcess) thisOSProcess waitForCommandOutput:
'tar xvf ' , unzipped asFileReference fullName.
            fileRef delete.
            unzipped asFileReference delete ]

>>uncompress: fileRef
    " Private - Uncompress fileRef to the current working directory "

    | dst |
    dst := FileSystem workingDirectory.
    self extractZip: fileRef in: dst.
    self extractGZip: fileRef in: dst.

>>downloadResourcesFrom: urlString
    " Private - Download files from urlString "

    ^ [ ZnEasy get: urlString ]
        on: ZnEntityTooLarge
        do: [ : ex | ex resume  ].


I use them to download external resources for my projects as follows:

First I add a #preLoadDoIt: send in my baseline:

    spec for: #'common' do: [
        spec blessing: #'baseline'.
        spec preLoadDoIt: #preLoad.
         ....

>>preLoad

    | url fileRef response |

    self logCr: '====== Downloading my resource files...'.
    url := self platformFilesUrl asZnUrl.
    fileRef := FileSystem disk workingDirectory / url pathSegments last.
    (response := self downloadResourcesFrom: url) isSuccess
        ifTrue: [
            self logCr: '====== Writing resource file...'.
            fileRef writeStreamDo: [ : stream | stream nextPutAll: response
contents ] ]
        ifFalse: [ self error: 'Cannot download data files' ].
    self logCr: '====== Uncompressing files...'.
    self uncompress: fileRef.

Hernán

Reply via email to