2021-02-23 16:55:45 +00:00
|
|
|
"
|
|
|
|
I contain simple general functionality used by Grafoscopio, Dataviz
|
|
|
|
or other related projects.
|
|
|
|
"
|
|
|
|
Class {
|
|
|
|
#name : #GrafoscopioUtils,
|
|
|
|
#superclass : #Object,
|
2022-01-22 15:23:56 +00:00
|
|
|
#category : #'Grafoscopio-Utils-Core'
|
2021-02-23 16:55:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
{ #category : #utilities }
|
|
|
|
GrafoscopioUtils class >> checksumFor: aFileReference [
|
|
|
|
^ (SHA1 new hashMessage: aFileReference binaryReadStream contents) hex.
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #updating }
|
|
|
|
GrafoscopioUtils class >> download: fileNameWithRelativePath from: urlString into: aFolder [
|
|
|
|
| fileName parentFolder |
|
|
|
|
fileName := (fileNameWithRelativePath splitOn: $/) last.
|
|
|
|
parentFolder := self ensureCreateDirectory: fileNameWithRelativePath into: aFolder.
|
|
|
|
self
|
|
|
|
downloadingFrom: urlString, fileNameWithRelativePath
|
|
|
|
withMessage: 'Downloading ', fileName
|
|
|
|
into: parentFolder
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #'graphical interface' }
|
|
|
|
GrafoscopioUtils class >> downloadingFrom: downloadUrl withMessage: aString into: location [
|
|
|
|
| fileName |
|
|
|
|
fileName := (self sanitize: downloadUrl) segments last.
|
|
|
|
(location / fileName) ensureDelete.
|
|
|
|
[: bar |
|
|
|
|
bar title: aString.
|
|
|
|
[ZnClient new
|
|
|
|
enforceHttpSuccess: true;
|
|
|
|
url: downloadUrl;
|
|
|
|
downloadTo: location;
|
|
|
|
signalProgress: true
|
|
|
|
]
|
|
|
|
on: HTTPProgress
|
|
|
|
do: [ :progress |
|
|
|
|
progress isEmpty ifFalse: [ bar current: progress percentage ].
|
|
|
|
progress resume ].
|
|
|
|
] asJob run.
|
|
|
|
|
|
|
|
^ (location / fileName) asFileReference
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #utilities }
|
|
|
|
GrafoscopioUtils class >> ensureCreateDirectory: fileNameWithRelativePath into: aFolder [
|
|
|
|
| relativePathFolders parentFolder newPath |
|
|
|
|
relativePathFolders := (fileNameWithRelativePath splitOn: $/) allButLast.
|
|
|
|
newPath := aFolder path.
|
|
|
|
relativePathFolders do: [ :folder | newPath := newPath / folder ].
|
|
|
|
parentFolder := newPath asFileReference.
|
|
|
|
parentFolder ensureCreateDirectory.
|
|
|
|
^ parentFolder
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #persistence }
|
|
|
|
GrafoscopioUtils class >> exportAsSton: anObject on: aFileReference [
|
|
|
|
aFileReference exists ifTrue: [ aFileReference ensureDelete ].
|
|
|
|
aFileReference ensureCreateFile.
|
|
|
|
aFileReference writeStreamDo: [ :stream |
|
|
|
|
(STON writer on: stream)
|
2022-01-22 15:23:56 +00:00
|
|
|
newLine: String lf;
|
2021-02-23 16:55:45 +00:00
|
|
|
prettyPrint: true;
|
|
|
|
keepNewLines: true;
|
|
|
|
nextPut: anObject ].
|
2022-01-22 15:23:56 +00:00
|
|
|
^ aFileReference
|
2021-02-23 16:55:45 +00:00
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #'graphical interface' }
|
|
|
|
GrafoscopioUtils class >> getContentsFrom: url withMessage: aString [
|
|
|
|
| client |
|
|
|
|
[: bar |
|
|
|
|
bar title: aString.
|
|
|
|
[client := ZnClient new
|
|
|
|
enforceHttpSuccess: true;
|
|
|
|
get: (url);
|
|
|
|
signalProgress: true
|
|
|
|
]
|
|
|
|
on: HTTPProgress
|
|
|
|
do: [ :progress |
|
|
|
|
progress isEmpty ifFalse: [ bar current: progress percentage ].
|
|
|
|
progress resume ].
|
|
|
|
] asJob run.
|
|
|
|
^ client contents.
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #persistence }
|
|
|
|
GrafoscopioUtils class >> joinLinesFor: aCollection [
|
|
|
|
|
|
|
|
| joinedLines |
|
|
|
|
|
|
|
|
joinedLines := WriteStream on: ''.
|
|
|
|
aCollection do: [ :line | joinedLines nextPutAll: line; crlf ].
|
|
|
|
^ joinedLines contents
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #utilities }
|
|
|
|
GrafoscopioUtils class >> perform: aString on: anObject [
|
|
|
|
|
|
|
|
| msg |
|
|
|
|
msg := self selectorAndArgumentsFrom: aString.
|
|
|
|
msg
|
|
|
|
at: 'args'
|
|
|
|
ifPresent: [ ^ anObject perform: (msg at: 'selector') withArguments: (msg at: 'args') ]
|
|
|
|
ifAbsent: [ ^ anObject perform: (msg at: 'selector') ]
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #private }
|
|
|
|
GrafoscopioUtils class >> sanitize: url [
|
|
|
|
"I remove white spaces in url's and prepend 'http://' to urls when it is ommited, so
|
|
|
|
operations that rely on sane and well formed urls don't throw error messages."
|
|
|
|
| sanitized modUrl |
|
|
|
|
modUrl := url.
|
|
|
|
[modUrl asString endsWith: ' ']
|
|
|
|
whileTrue: [ modUrl := modUrl copyFrom: 1 to: (modUrl size - 1) ].
|
|
|
|
(url asString beginsWith: 'http') "http or https"
|
|
|
|
ifFalse: [ sanitized := ('http://', modUrl) asUrl ]
|
|
|
|
ifTrue: [ sanitized := modUrl asUrl ].
|
|
|
|
^ sanitized
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #utilities }
|
|
|
|
GrafoscopioUtils class >> selectorAndArgumentsFrom: aString [
|
|
|
|
"I return from aString a dictionary that contains a message and an array of arguments used
|
|
|
|
in such string. Notice that the keyword message must contain spaces between the ':' and its
|
|
|
|
respective argument.
|
|
|
|
See GrafoscopioUtilsTest for examples"
|
|
|
|
| msgArray answer keywords selector args |
|
|
|
|
answer := OrderedDictionary new.
|
|
|
|
msgArray := aString splitOn: ':'.
|
|
|
|
msgArray size = 1
|
|
|
|
ifTrue: [
|
|
|
|
^ answer
|
|
|
|
at: 'selector' put: (msgArray at: 1) asSymbol;
|
|
|
|
yourself ].
|
|
|
|
selector := ''.
|
|
|
|
args := OrderedCollection new.
|
|
|
|
aString
|
|
|
|
splitOn: Character space
|
|
|
|
do: [ :part |
|
|
|
|
part endsWithAColon
|
|
|
|
ifTrue: [ selector := selector, part ]
|
|
|
|
ifFalse: [ args add: part ] ].
|
|
|
|
answer
|
|
|
|
at: 'selector' put: selector asSymbol;
|
|
|
|
at: 'args' put: args asArray.
|
|
|
|
^ answer
|
|
|
|
]
|
|
|
|
|
|
|
|
{ #category : #updating }
|
|
|
|
GrafoscopioUtils class >> update [
|
|
|
|
"Updates GrafoscopioUtils with new versions of itself take from the source code repository."
|
|
|
|
Gofer new
|
|
|
|
smalltalkhubUser: 'Offray' project: 'Grafoscopio';
|
|
|
|
package: 'Grafoscopio-Utils';
|
|
|
|
load.
|
|
|
|
]
|