diff --git a/.project b/.project new file mode 100644 index 0000000..46c7795 --- /dev/null +++ b/.project @@ -0,0 +1,3 @@ +{ + 'srcDirectory' : 'repository' +} \ No newline at end of file diff --git a/repository/.properties b/repository/.properties new file mode 100644 index 0000000..ad0471d --- /dev/null +++ b/repository/.properties @@ -0,0 +1,3 @@ +{ + #format : #tonel +} \ No newline at end of file diff --git a/repository/Grafoscopio-Utils/GrafoscopioDocumentation.class.st b/repository/Grafoscopio-Utils/GrafoscopioDocumentation.class.st new file mode 100644 index 0000000..5902ef5 --- /dev/null +++ b/repository/Grafoscopio-Utils/GrafoscopioDocumentation.class.st @@ -0,0 +1,215 @@ +" +I model a documentation object for Grafoscopio. +Documents are stored in a fossil repository and have +relative paths to it. +" +Class { + #name : #GrafoscopioDocumentation, + #superclass : #Object, + #instVars : [ + 'repository', + 'documents', + 'localPlace' + ], + #category : #'Grafoscopio-Utils' +} + +{ #category : #queries } +GrafoscopioDocumentation class >> current [ + "I model the important documents that belong to the Grafoscopio documentation. + When more documents become more mature and usable, I will include them." + + | gfcDocumentation | + gfcDocumentation := self new. + gfcDocumentation repository: (FossilRepo new remote: 'http://mutabit.com/repos.fossil/grafoscopio'). + gfcDocumentation documents + add: 'Docs/Es/Tutoriales/tutorial.ston'; + add: 'Docs/En/Books/Manual/manual.ston'; + add: 'Docs/En/dev-notes.ston'; + add: 'Docs/En/Books/Manual/manual.pdf'. + gfcDocumentation localPlace. + ^ gfcDocumentation +] + +{ #category : #operation } +GrafoscopioDocumentation class >> dataviz [ + "I model the important documents that belong to the Grafoscopio documentation. + When more documents become more mature and usable, I will include them." + + | gfcDocumentation | + gfcDocumentation := self new. + gfcDocumentation repository: (FossilRepo new remote: 'http://mutabit.com/repos.fossil/grafoscopio'). + gfcDocumentation documents + add: 'Packages/Dataviz/dataviz.ston'. + gfcDocumentation localPlace. + ^ gfcDocumentation +] + +{ #category : #updating } +GrafoscopioDocumentation class >> download: fileNameWithRelativePath [ + | fileName relativePathFolders newPath parentFolder | + fileName := (fileNameWithRelativePath splitOn: $/) last. + relativePathFolders := (fileNameWithRelativePath splitOn: $/) allButLast. + newPath := self current localPlace path. + relativePathFolders do: [ :folder | newPath := newPath / folder ]. + parentFolder := newPath asFileReference. + parentFolder exists ifFalse: [ parentFolder ensureCreateDirectory ]. + GrafoscopioDockingBar + downloadingFrom: self current repository remote asString, '/doc/tip/', fileNameWithRelativePath + withMessage: 'Downloading ', fileName + into: parentFolder +] + +{ #category : #updating } +GrafoscopioDocumentation class >> initialize [ + self + update: 'current'; + update: 'dataviz' +] + +{ #category : #updating } +GrafoscopioDocumentation class >> isFileUpdatedFor: relativeFilePath [ + "I compare if the local and remote copies of a relativeFilePath are updated for the current + documentation and return true if they are and false in any other case" + | localFile | + localFile := self current localPlace / relativeFilePath. + localFile exists + ifFalse: [ ^ false ] + ifTrue: [ ^ ExternalApp compareHashFor: localFile with: (self current repository lastHashNumberFor: relativeFilePath) ] +] + +{ #category : #updating } +GrafoscopioDocumentation class >> listOutdatedDocsIn: aDocumentsListName [ + "I return the list of all documentent where the local copy and the remote copy doesn't match" + aDocumentsListName ifNil: [ ^ self ]. + aDocumentsListName ifEmpty: [ ^ self ]. + ^ (self perform: aDocumentsListName asSymbol) documents reject: [ :doc | (self isFileUpdatedFor: doc) ] +] + +{ #category : #updating } +GrafoscopioDocumentation class >> listOutdatedIn: aGrafoscopioDocumentation [ + "I return the list of all documentent where the local copy and the remote copy doesn't match" + self listOutdatedDocsIn: (self perform: aGrafoscopioDocumentation) documents +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openDatavizIntro [ + self openNotebookFrom: 'dataviz' At: 1 +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openDevNotes [ + self openNotebookFrom: 'current' At: 3 +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openManual [ + "I open the proper notebook in the adecuate documentation." + self openNotebookFrom: 'current' At: 2 +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openNotebookFrom: aDocumentation At: index [ + "I open a notebook included with the documentation, located at a given index" + | notebookTemp gfcDocs | + gfcDocs := self perform: aDocumentation asSymbol. + (index between: 1 and: gfcDocs documents size) + ifFalse: [ ^ self ] + ifTrue: [ + notebookTemp := (gfcDocs localPlace fullName, '/', (gfcDocs documents at: index)) asFileReference. + notebookTemp exists + ifTrue: [GrafoscopioNotebook new openFromFile: notebookTemp] + ifFalse: [ self updateUIFor: aDocumentation ]] +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openPDFManual [ + "I open the documentation in PDF format. I only work on Unix right now, but in the future my creator hopes to be able + to have truly multiplatform support" + | pdfManual docs | + docs := self current. + pdfManual := docs documents at: 4. + WebBrowser openOn: (docs localPlace / pdfManual) fullName. +] + +{ #category : #operation } +GrafoscopioDocumentation class >> openTutorial [ + "I open the proper notebook in the adecuate documentation." + self openNotebookFrom: 'current' At: 1 +] + +{ #category : #updating } +GrafoscopioDocumentation class >> update: aDocumentationName [ + (self listOutdatedDocsIn: aDocumentationName) + ifEmpty: [ + self inform: 'All documents in the ', aDocumentationName,' collection are already updated'. + ^ self ] + ifNotEmpty: [:outdatedDocs | + outdatedDocs do: [ :eachDoc | self download: eachDoc]. + self inform: 'Updating of ', aDocumentationName,' documentation finished.' ] +] + +{ #category : #operation } +GrafoscopioDocumentation class >> updateAll [ + self + update: 'current'; + update: 'dataviz' +] + +{ #category : #updating } +GrafoscopioDocumentation class >> updateAllUI [ + "Updates documentation (manual, tutorials) from the official repository for a given documentation." + | update | + update := (UIManager default + confirm: 'Do you wish to update the documentation?' + label: 'Update documentation'). + update + ifTrue: [ self updateAll ] +] + +{ #category : #updating } +GrafoscopioDocumentation class >> updateDocsPlaceUI [ + self current localPlace: (UIManager default chooseDirectory: 'Path to the documentation folder') +] + +{ #category : #updating } +GrafoscopioDocumentation class >> updateUIFor: aDocumentationName [ + "Updates documentation (manual, tutorials) from the official repository for a given documentation." + | update | + update := (UIManager default + confirm: 'Do you wish to update the ', aDocumentationName,' documentation?' + label: 'Update ', aDocumentationName, ' documentation'). + update ifTrue: [ self update: aDocumentationName ] +] + +{ #category : #accessing } +GrafoscopioDocumentation >> documents [ + ^ documents ifNil: [ documents := OrderedCollection new ] +] + +{ #category : #accessing } +GrafoscopioDocumentation >> documents: anObject [ + documents := anObject +] + +{ #category : #accessing } +GrafoscopioDocumentation >> localPlace [ + ^ localPlace ifNil: [ + localPlace := FileLocator workingDirectory asFileReference / 'Grafoscopio'. + self localPlace exists ifFalse: [ self localPlace ensureCreateDirectory ] ]. +] + +{ #category : #accessing } +GrafoscopioDocumentation >> localPlace: anObject [ + localPlace := anObject +] + +{ #category : #accessing } +GrafoscopioDocumentation >> repository [ + ^ repository +] + +{ #category : #accessing } +GrafoscopioDocumentation >> repository: anObject [ + repository := anObject +] diff --git a/repository/Grafoscopio-Utils/GrafoscopioUtils.class.st b/repository/Grafoscopio-Utils/GrafoscopioUtils.class.st new file mode 100644 index 0000000..e35d89c --- /dev/null +++ b/repository/Grafoscopio-Utils/GrafoscopioUtils.class.st @@ -0,0 +1,29 @@ +" +I contain simple functionality used by Grafoscopio, Datavis or other + related projects. +" +Class { + #name : #GrafoscopioUtils, + #superclass : #Object, + #category : #'Grafoscopio-Utils' +} + +{ #category : #'graphical interface' } +GrafoscopioUtils class >> downloadingFrom: downloadUrl withMessage: aString into: location [ + | fileName | + fileName := (downloadUrl splitOn: $/) last. + (location / fileName) exists ifTrue: [ (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. +] diff --git a/repository/Grafoscopio-Utils/package.st b/repository/Grafoscopio-Utils/package.st new file mode 100644 index 0000000..5f58ad1 --- /dev/null +++ b/repository/Grafoscopio-Utils/package.st @@ -0,0 +1 @@ +Package { #name : #'Grafoscopio-Utils' }