" 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 ] ]