Grafoscopio/src/Grafoscopio-Utils/GrafoscopioDocumentation.cl...

200 lines
5.9 KiB
Smalltalk

"
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',
'name'
],
#category : #'Grafoscopio-Utils'
}
{ #category : #updating }
GrafoscopioDocumentation class >> documents [
^ self newDefault documents
]
{ #category : #api }
GrafoscopioDocumentation class >> download: aFileName [
self newDefault download: aFileName
]
{ #category : #updating }
GrafoscopioDocumentation class >> listOutdatedDocs [
^ self newDefault listOutdatedDocs
]
{ #category : #updating }
GrafoscopioDocumentation class >> localPlace [
^ self newDefault localPlace
]
{ #category : #'instance creation' }
GrafoscopioDocumentation class >> newDefault [
^ self new
]
{ #category : #updating }
GrafoscopioDocumentation class >> update [
^ self newDefault update
]
{ #category : #updating }
GrafoscopioDocumentation class >> updateAll [
{GrafoscopioDocs . DatavizDocs . OffshoreLeaksDocs} do: [ :docs | docs update ]
]
{ #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 : #accessing }
GrafoscopioDocumentation >> addDocument: aFilePath [
"I add the document contained in aFilePath (a String) to the list of documents that belong
to this collection, taking care of avoiding repetitions"
(self documents includes: aFilePath) ifFalse: [ self documents add: aFilePath ]
]
{ #category : #accessing }
GrafoscopioDocumentation >> documents [
^ documents ifNil: [ documents := OrderedCollection new ]
]
{ #category : #accessing }
GrafoscopioDocumentation >> documents: anObject [
documents := anObject
]
{ #category : #updating }
GrafoscopioDocumentation >> download: fileNameWithRelativePath [
| fileName parentFolder sanitized lastVersion |
fileName := (fileNameWithRelativePath splitOn: $/) last.
sanitized := self repository sanitize: fileNameWithRelativePath.
lastVersion := self repository lastVersionPath: fileNameWithRelativePath.
parentFolder := GrafoscopioUtils
ensureCreateDirectory: sanitized into: self localPlace.
GrafoscopioUtils
downloadingFrom: self repository remote asString, lastVersion
withMessage: 'Downloading ', fileName
into: parentFolder
]
{ #category : #updating }
GrafoscopioDocumentation >> 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 localPlace / relativeFilePath.
localFile exists
ifFalse: [ ^ false ]
ifTrue: [
^ ExternalApp
compareHashFor: localFile
with: (self repository lastHashNumberFor: relativeFilePath) ]
]
{ #category : #updating }
GrafoscopioDocumentation >> listOutdatedDocs [
"I return the list of all documentent where the local copy and the remote copy doesn't match"
^ self documents reject: [ :doc | (self isFileUpdatedFor: doc) ]
]
{ #category : #accessing }
GrafoscopioDocumentation >> localPlace [
^ localPlace.
]
{ #category : #accessing }
GrafoscopioDocumentation >> localPlace: aFileDirectory [
localPlace := aFileDirectory.
self localPlace exists ifFalse: [ self localPlace ensureCreateDirectory ].
]
{ #category : #accessing }
GrafoscopioDocumentation >> name [
^ name
]
{ #category : #accessing }
GrafoscopioDocumentation >> name: anObject [
name := anObject
]
{ #category : #accessing }
GrafoscopioDocumentation >> openNotebookAt: index [
"I open a notebook included with the documentation, located at a given index (anInteger)"
| notebookTemp |
(index between: 1 and: self documents size)
ifFalse: [ ^ self ]
ifTrue: [
notebookTemp := (self localPlace fullName, '/', (self documents at: index)) asFileReference.
notebookTemp exists
ifTrue: [GrafoscopioNotebook new openFromFile: notebookTemp]
ifFalse: [ self updateUI ]]
]
{ #category : #updating }
GrafoscopioDocumentation >> registerIntoDockingBar [
"I detect if any of the documents that are part of my collection contains any metadata
indicating if they should be registered in the main docking bar, and in such case, I add them."
self documents
do: [ :doc | | metadata currentNotebook |
currentNotebook := GrafoscopioNotebook new loadFromFile: self localPlace / doc.
metadata := currentNotebook metadata.
metadata ifNotNil: [
metadata
at: 'showOnHelp'
ifPresent: [ self error:' missing class grafoscopio docking bar' "GrafoscopioDockingBar addToHelpMenu: currentNotebook" ] ] ]
]
{ #category : #accessing }
GrafoscopioDocumentation >> repository [
^ repository
]
{ #category : #accessing }
GrafoscopioDocumentation >> repository: aFossilRepo [
repository := aFossilRepo
]
{ #category : #updating }
GrafoscopioDocumentation >> update [
(self listOutdatedDocs)
ifEmpty: [
self inform: 'All documents in the ', self name,' collection are already updated'.
^ self ]
ifNotEmpty: [:outdatedDocs |
outdatedDocs do: [ :eachDoc | self download: eachDoc ].
self inform: 'Updating of ', self name,' documentation finished.' ]
]
{ #category : #updating }
GrafoscopioDocumentation >> updateDocsPlaceUI [
self current localPlace: (UIManager default chooseDirectory: 'Path to the documentation folder')
]
{ #category : #updating }
GrafoscopioDocumentation >> updateUI [
"Updates documentation (manual, tutorials) from the official repository for a given documentation."
| update |
update := (UIManager default
confirm: 'Do you wish to update the ', self name,' documentation?'
label: 'Update ', self name, ' documentation').
update ifTrue: [ self update ]
]