├── .project ├── src ├── .properties ├── Dynabook-Core │ ├── package.st │ ├── LlLibrary.extension.st │ ├── PpEventLog.extension.st │ ├── PpInventory.extension.st │ ├── VsPriceList.extension.st │ ├── PpProjectList.extension.st │ ├── MpAddressBook.extension.st │ ├── PpLocationList.extension.st │ ├── RlResourceLibrary.extension.st │ ├── CwSoftwareCatalog.extension.st │ ├── SmallProjectRegistry.extension.st │ ├── DbTDomainObject.extension.st │ ├── MsalOneNotePage.extension.st │ ├── PpEvent.extension.st │ ├── DbEventRecording.class.st │ ├── DbMsalApp.class.st │ └── DbSoup.class.st ├── BaselineOfDynabook │ ├── package.st │ ├── BaselineOf.extension.st │ ├── BaselineOfCustomDynabookExample.class.st │ └── BaselineOfDynabook.class.st ├── Dynabook-GToolkit │ ├── package.st │ ├── MpRelatableEntity.extension.st │ ├── GtHome.extension.st │ ├── DbSoup.extension.st │ ├── PpEventUIDReference.class.st │ ├── Object.extension.st │ ├── DataSeries.extension.st │ ├── GtHomeMultiCardSection.extension.st │ ├── DbGtHomeUtilitiesSection.class.st │ └── DbGtHomeDomainSection.class.st ├── Dynabook-Persistence │ ├── package.st │ └── DynabookDB.class.st └── Dynabook-SmalltalkCI │ └── package.st ├── .github ├── FUNDING.yml └── workflows │ └── runTests.yaml ├── icons ├── noun-file-4980207.png ├── noun-home-323099.png ├── noun-bridge-4982741.png ├── noun-project-2662138.png ├── noun-calendar-4979381.png ├── noun-database-4716694.png ├── noun-inventory-2895895.png ├── noun-address-book-148913.png ├── noun-library-book-4329851.png ├── noun-computer-network-1836808.png └── noun-financial-advice-book-4450943.png ├── lepiter ├── lepiter.properties ├── a7eqsme04w1hmeaadczw5kfyl.bak └── a7eqsme04w1hmeaadczw5kfyl.lepiter ├── .smalltalk.ston ├── .gitignore └── README.md /.project: -------------------------------------------------------------------------------- 1 | { 2 | 'srcDirectory' : 'src' 3 | } -------------------------------------------------------------------------------- /src/.properties: -------------------------------------------------------------------------------- 1 | { 2 | #format : #tonel 3 | } -------------------------------------------------------------------------------- /src/Dynabook-Core/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Dynabook-Core' } 2 | -------------------------------------------------------------------------------- /src/BaselineOfDynabook/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #BaselineOfDynabook } 2 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Dynabook-GToolkit' } 2 | -------------------------------------------------------------------------------- /src/Dynabook-Persistence/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Dynabook-Persistence' } 2 | -------------------------------------------------------------------------------- /src/Dynabook-SmalltalkCI/package.st: -------------------------------------------------------------------------------- 1 | Package { #name : #'Dynabook-SmalltalkCI' } 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: seandenigris 4 | -------------------------------------------------------------------------------- /icons/noun-file-4980207.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-file-4980207.png -------------------------------------------------------------------------------- /icons/noun-home-323099.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-home-323099.png -------------------------------------------------------------------------------- /icons/noun-bridge-4982741.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-bridge-4982741.png -------------------------------------------------------------------------------- /icons/noun-project-2662138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-project-2662138.png -------------------------------------------------------------------------------- /icons/noun-calendar-4979381.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-calendar-4979381.png -------------------------------------------------------------------------------- /icons/noun-database-4716694.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-database-4716694.png -------------------------------------------------------------------------------- /icons/noun-inventory-2895895.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-inventory-2895895.png -------------------------------------------------------------------------------- /icons/noun-address-book-148913.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-address-book-148913.png -------------------------------------------------------------------------------- /icons/noun-library-book-4329851.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-library-book-4329851.png -------------------------------------------------------------------------------- /icons/noun-computer-network-1836808.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-computer-network-1836808.png -------------------------------------------------------------------------------- /lepiter/lepiter.properties: -------------------------------------------------------------------------------- 1 | { 2 | "uuid" : "e82cba9f-e8c9-0d00-a113-8d1a0e7a63ac", 3 | "schema" : "4.1", 4 | "databaseName" : "Dynabook" 5 | } -------------------------------------------------------------------------------- /icons/noun-financial-advice-book-4450943.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/seandenigris/Dynabook/HEAD/icons/noun-financial-advice-book-4450943.png -------------------------------------------------------------------------------- /src/BaselineOfDynabook/BaselineOf.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #BaselineOf } 2 | 3 | { #category : #'*BaselineOfDynabook' } 4 | BaselineOf class >> isDynabook [ 5 | ^ false 6 | ] 7 | -------------------------------------------------------------------------------- /src/Dynabook-Core/LlLibrary.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #LlLibrary } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | LlLibrary >> dbCollectionAccessor [ 5 | 6 | ^ #works 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/PpEventLog.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PpEventLog } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | PpEventLog >> dbCollectionAccessor [ 5 | 6 | ^ #events 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/PpInventory.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PpInventory } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | PpInventory >> dbCollectionAccessor [ 5 | 6 | ^ #items 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/VsPriceList.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #VsPriceList } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | VsPriceList >> dbCollectionAccessor [ 5 | 6 | ^ #prices 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/PpProjectList.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PpProjectList } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | PpProjectList >> dbCollectionAccessor [ 5 | 6 | ^ #allChildren 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/MpAddressBook.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MpAddressBook } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | MpAddressBook >> dbCollectionAccessor [ 5 | 6 | ^ #privateContacts 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/PpLocationList.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PpLocationList } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | PpLocationList >> dbCollectionAccessor [ 5 | 6 | ^ #allChildren 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/RlResourceLibrary.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #RlResourceLibrary } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | RlResourceLibrary >> dbCollectionAccessor [ 5 | 6 | ^ #resources 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/CwSoftwareCatalog.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #CwSoftwareCatalog } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | CwSoftwareCatalog >> dbCollectionAccessor [ 5 | 6 | ^ #collection 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/MpRelatableEntity.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MpRelatableEntity } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | MpRelatableEntity >> lepiterPageTitle [ 5 | ^ self fullName 6 | ] 7 | -------------------------------------------------------------------------------- /src/Dynabook-Core/SmallProjectRegistry.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #SmallProjectRegistry } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | SmallProjectRegistry >> dbCollectionAccessor [ 5 | 6 | ^ #projects 7 | ] 8 | -------------------------------------------------------------------------------- /src/Dynabook-Core/DbTDomainObject.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #DbTDomainObject } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | DbTDomainObject >> dbUIDReference [ 5 | ^ DbObjectUIDReference new 6 | uid: self ensureUUID; 7 | yourself 8 | ] 9 | -------------------------------------------------------------------------------- /.smalltalk.ston: -------------------------------------------------------------------------------- 1 | SmalltalkCISpec { 2 | #loading : [ 3 | SCIMetacelloLoadSpec { 4 | #baseline : 'Dynabook', 5 | #directory : 'src', 6 | #onConflict : #useIncoming 7 | } 8 | ], 9 | #testing : { 10 | #failOnZeroTests : false } 11 | } -------------------------------------------------------------------------------- /src/Dynabook-Core/MsalOneNotePage.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #MsalOneNotePage } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | MsalOneNotePage >> dbImportMeeting [ 5 | | event | 6 | event := self asPpEvent 7 | import; 8 | yourself. 9 | 10 | "How to do this via MS Graph? 11 | self moveToSectionNamed: 'Meeting Notes (Dynabook)'." 12 | 13 | ^ event 14 | ] 15 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/GtHome.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #GtHome } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | GtHome >> dynabookDomainSection [ 5 | 6 | 7 | ^ DbGtHomeDomainSection new 8 | ] 9 | 10 | { #category : #'*Dynabook-GToolkit' } 11 | GtHome >> dynabookUtilitiesSection [ 12 | 13 | 14 | ^ DbGtHomeUtilitiesSection new 15 | ] 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # changes file 2 | *.changes 3 | *.chg 4 | 5 | # system image 6 | *.image 7 | *.img7 8 | *.img 9 | 10 | # Pharo Smalltalk Debug log file 11 | PharoDebug.log 12 | 13 | # Squeak Smalltalk Debug log file 14 | SqueakDebug.log 15 | 16 | # Dolphin Smalltalk source file 17 | *.sml 18 | 19 | # Dolphin Smalltalk error file 20 | *.errors 21 | 22 | # Monticello package cache 23 | /package-cache 24 | 25 | # playground cache 26 | /play-cache 27 | /play-stash 28 | 29 | # Metacello-github cache 30 | /github-cache 31 | github-*.zip 32 | -------------------------------------------------------------------------------- /src/Dynabook-Core/PpEvent.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #PpEvent } 2 | 3 | { #category : #'*Dynabook-Core' } 4 | PpEvent >> ensureRecording [ 5 | ^ self propertyAt: #recording ifAbsentPut: [ 6 | | recording | 7 | recording := DbEventRecording of: self. 8 | LlLibrary uniqueInstance beAwareOf: recording. 9 | recording ] 10 | ] 11 | 12 | { #category : #'*Dynabook-Core' } 13 | PpEvent >> hasRecording [ 14 | ^ self hasProperty: #recording 15 | ] 16 | 17 | { #category : #'*Dynabook-Core' } 18 | PpEvent >> oneNotePage [ 19 | 20 | ^ self 21 | propertyAt: #oneNotePageID 22 | ifPresent: [ :pageID | 23 | DbMsalApp uniqueInstance oneNote pageWithID: pageID ] 24 | ] 25 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/DbSoup.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #DbSoup } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | DbSoup class >> addSourceForOlReferencedClass: aClass withBuilder: aBlock [ 5 | "Convenience message because usually one wants to add to both ObjectiveLepiter (to support per-instance pages) and DbSoup" 6 | 7 | ^ self uniqueInstance 8 | addSourceForOlReferencedClass: aClass 9 | withBuilder: aBlock 10 | ] 11 | 12 | { #category : #'*Dynabook-GToolkit' } 13 | DbSoup >> addSourceForOlReferencedClass: aClass withBuilder: aBlock [ 14 | 15 | OlObjectPageType 16 | modelReferenceForClass: aClass 17 | builder: aBlock. 18 | 19 | self sources add: aBlock value 20 | ] 21 | -------------------------------------------------------------------------------- /.github/workflows/runTests.yaml: -------------------------------------------------------------------------------- 1 | # Adapted from https://github.com/seandenigris/Pharo-Enhancements/blob/master/.github/workflows/ci.yaml 2 | 3 | name: CI 4 | 5 | # Controls when the action will run. 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the master branch 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # Adapted from https://docs.github.com/en/actions/using-workflows/reusing-workflows 17 | jobs: 18 | test-and-release: 19 | uses: seandenigris/Pharo-Enhancements/.github/workflows/ci_reusable.yaml@master 20 | with: 21 | project-name: Dynabook -------------------------------------------------------------------------------- /src/Dynabook-Core/DbEventRecording.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #DbEventRecording, 3 | #superclass : #LlAuthoredWork, 4 | #instVars : [ 5 | 'event' 6 | ], 7 | #category : #'Dynabook-Core' 8 | } 9 | 10 | { #category : #'as yet unclassified' } 11 | DbEventRecording class >> of: aPpEvent [ 12 | 13 | ^ self new 14 | event: aPpEvent; 15 | yourself 16 | ] 17 | 18 | { #category : #accessing } 19 | DbEventRecording >> event [ 20 | 21 | ^ event 22 | ] 23 | 24 | { #category : #accessing } 25 | DbEventRecording >> event: anObject [ 26 | 27 | event := anObject 28 | ] 29 | 30 | { #category : #accessing } 31 | DbEventRecording >> participants [ 32 | ^ self event participants 33 | ] 34 | 35 | { #category : #accessing } 36 | DbEventRecording >> title [ 37 | ^ self event displayString 38 | ] 39 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/PpEventUIDReference.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #PpEventUIDReference, 3 | #superclass : #DbObjectUIDReference, 4 | #category : #'Dynabook-GToolkit' 5 | } 6 | 7 | { #category : #accessing } 8 | PpEventUIDReference class >> leJsonV4Name [ 9 | ^ 'ppEventUIDReference' 10 | ] 11 | 12 | { #category : #accessing } 13 | PpEventUIDReference >> detectUID: anObject ifNone: noneBlock [ 14 | "anObject - must respond to olDetectUIDBlock. See implementors" 15 | 16 | | detectBlock | 17 | detectBlock := self wrappedUidDetector: anObject olDetectUIDBlock. 18 | self source allEventsDo: [ :e | (detectBlock value: e) ifTrue: [ ^ e ] ]. 19 | ^ noneBlock value 20 | ] 21 | 22 | { #category : #accessing } 23 | PpEventUIDReference >> initialize [ 24 | super initialize. 25 | self sourceClassName: PpEventLog 26 | ] 27 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/Object.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #Object } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | Object >> gtMagritteFor: aView [ 5 | 6 | 7 | "We do not compute descriptions because this can be expensive 8 | and we want the view to be fast." 9 | self hasMagritteDescription ifFalse: [ ^ aView empty ]. 10 | 11 | ^ aView explicit 12 | title: 'GT Magritte'; 13 | priority: 105; 14 | stencil: [ self asGtMagritteViewModel ]; 15 | actionButtonIcon: BrGlamorousVectorIcons inspect 16 | label: 'Memento' 17 | tooltip: 'Inspect Memento' 18 | action: [ :aButton :aTab | 19 | aTab viewContentElement 20 | allChildrenBreadthFirstDetect: [ :anElement | 21 | anElement userData includesKey: 22 | GtMagritteViewModel gtMementoSymbol ] 23 | ifFound: [ :anElement | 24 | aButton phlow spawnObject: 25 | (anElement userData at: GtMagritteViewModel gtMementoSymbol) ] ] 26 | ] 27 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/DataSeries.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #DataSeries } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | DataSeries >> chart [ 5 | | aData aBarWidthScale | 6 | aData := GtPlotterDataGroup new values: self sortDescending associations. 7 | aData := aData colored: Color blue. 8 | aData := aData labelled: [ :e | e key ]. 9 | 10 | aBarWidthScale := GtPlotterLinearScale new 11 | domainFrom: 0 12 | to: [ 7836 ] value. 13 | 14 | ^ GtPlotterHorizontalBarChart new 15 | barHeightData: [ :e | e ]; 16 | barWidthData: [ :e | e value ]; 17 | barWidthScale: aBarWidthScale; 18 | with: aData 19 | ] 20 | 21 | { #category : #'*Dynabook-GToolkit' } 22 | DataSeries >> chartTitled: aString [ 23 | 24 | | label | 25 | label := aString asRopedText 26 | fontSize: 36; 27 | bold; 28 | yourself. 29 | 30 | ^ BrVerticalPane new 31 | vMatchParent; 32 | hMatchParent; 33 | alignCenter; 34 | addChild: self chart create; 35 | addChild: (BlTextElement text: label); 36 | yourself 37 | ] 38 | -------------------------------------------------------------------------------- /src/Dynabook-Core/DbMsalApp.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #DbMsalApp, 3 | #superclass : #MsalApplication, 4 | #classVars : [ 5 | 'UniqueInstance' 6 | ], 7 | #category : #'Dynabook-Core-MSAuthLibrary' 8 | } 9 | 10 | { #category : #initialization } 11 | DbMsalApp class >> initialize [ 12 | 13 | SessionManager default 14 | registerUserClassNamed: self name 15 | ] 16 | 17 | { #category : #resetting } 18 | DbMsalApp class >> reset [ 19 | 20 | self uniqueInstance reset 21 | ] 22 | 23 | { #category : #persistence } 24 | DbMsalApp class >> restoreFrom: anObject [ 25 | 26 | UniqueInstance := anObject 27 | ] 28 | 29 | { #category : #'startup/shutdown' } 30 | DbMsalApp class >> shutDown: isImageQuitting [ 31 | 32 | isImageQuitting ifTrue: [ self uniqueInstance logOut ] 33 | ] 34 | 35 | { #category : #persistence } 36 | DbMsalApp class >> spData [ 37 | 38 | ^ UniqueInstance 39 | ] 40 | 41 | { #category : #'instance creation' } 42 | DbMsalApp class >> uniqueInstance [ 43 | 44 | ^ UniqueInstance ifNil: [ UniqueInstance := self new ] 45 | ] 46 | 47 | { #category : #accessing } 48 | DbMsalApp class >> uniqueInstance: anObject [ 49 | 50 | UniqueInstance := anObject 51 | ] 52 | 53 | { #category : #accessing } 54 | DbMsalApp >> scopes [ 55 | ^ { 'Notes.ReadWrite' } 56 | ] 57 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/GtHomeMultiCardSection.extension.st: -------------------------------------------------------------------------------- 1 | Extension { #name : #GtHomeMultiCardSection } 2 | 3 | { #category : #'*Dynabook-GToolkit' } 4 | GtHomeMultiCardSection >> buttonPriority: aNumber titled: aString icon: iconable tooltip: tipString action: aValuable [ 5 | "Requires `#iconFolder` to be implemented 6 | 7 | iconable - can be icon itself, icon file, or icon path string" 8 | 9 | | icon stencil | 10 | icon := self iconFrom: iconable. 11 | 12 | stencil := GtToolButtonStencil new 13 | title: aString; 14 | action: aValuable; 15 | description: tipString. 16 | 17 | icon ifNotNil: [ 18 | stencil 19 | icon: icon; 20 | iconSize: 50@50 ]. 21 | 22 | ^ GtHomeCard explicit 23 | priority: aNumber; 24 | stencil: [ stencil ]; 25 | yourself 26 | ] 27 | 28 | { #category : #'*Dynabook-GToolkit' } 29 | GtHomeMultiCardSection >> buttonPriority: aNumber titled: aString icon: iconable tooltip: tipString inspecting: aValuable [ 30 | 31 | ^ self 32 | buttonPriority: aNumber 33 | titled: aString 34 | icon: iconable 35 | tooltip: tipString 36 | action: [ :card | 37 | self 38 | showSpaceWithTitle: aString 39 | with: 40 | (GtInspector 41 | createOn: aValuable value) maximized 42 | from: card ] 43 | ] 44 | 45 | { #category : #'*Dynabook-GToolkit' } 46 | GtHomeMultiCardSection >> iconFrom: iconable [ 47 | 48 | iconable isString ifTrue: [ ^ self iconFromFileNamed: iconable ]. 49 | (iconable isKindOf: AbstractFileReference) 50 | ifTrue: [ ^ GtFileUtility imageElementFromFileReference: iconable ]. 51 | 52 | ^ iconable 53 | ] 54 | -------------------------------------------------------------------------------- /src/Dynabook-Persistence/DynabookDB.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #DynabookDB, 3 | #superclass : #SpFileDatabase, 4 | #category : #'Dynabook-Persistence' 5 | } 6 | 7 | { #category : #accessing } 8 | DynabookDB class >> backupDirectoryParent [ 9 | 10 | ^ FileLocator dynabookData / 'Dynabook' 11 | ] 12 | 13 | { #category : #accessing } 14 | DynabookDB class >> dataVersion [ 15 | 16 | ^ 2 17 | ] 18 | 19 | { #category : #accessing } 20 | DynabookDB class >> metadata [ 21 | 22 | ^ super metadata 23 | at: #gitCommit put: self package peIceRepository workingCopy referenceCommit id; 24 | yourself 25 | ] 26 | 27 | { #category : #'loading/saving' } 28 | DynabookDB class >> schema [ 29 | 30 | ^ { 31 | BabySignLanguageDB. 32 | BroadcastifyDB. 33 | ComputerWorldDB. 34 | DbMsalApp. 35 | FlashcardsStDB. 36 | IdeasDB. 37 | JokesDB. 38 | LivingLibraryDB. 39 | SmallWorldDB. 40 | TheProjectProjectDB. 41 | UkuleleDB. 42 | VirtualStashDB. 43 | } 44 | ] 45 | 46 | { #category : #migrations } 47 | DynabookDB class >> version2Migration [ 48 | 49 | 50 | | copyMaterials | 51 | copyMaterials := [ :inst | 52 | inst supportMaterials: (inst instVarNamed: #supportMaterials) ]. 53 | 54 | ^ SpDataMigration new 55 | dataVersion: 2; 56 | preMaterialize: [ 57 | PpEvent addInstVarNamed: #supportMaterials. 58 | PpValue addInstVarNamed: #supportMaterials ]; 59 | postMaterialize: [ 60 | PpEvent allSubInstances do: copyMaterials. 61 | PpValue allSubInstances do: copyMaterials. 62 | PpEvent removeInstVarNamed: #supportMaterials. 63 | PpValue removeInstVarNamed: #supportMaterials ] 64 | ] 65 | -------------------------------------------------------------------------------- /src/Dynabook-Core/DbSoup.class.st: -------------------------------------------------------------------------------- 1 | " 2 | A facade presenting something like HPI's soup, a collection from which all interesting domain objects are easily reachable. 3 | " 4 | Class { 5 | #name : #DbSoup, 6 | #superclass : #Object, 7 | #instVars : [ 8 | 'sources' 9 | ], 10 | #classVars : [ 11 | 'UniqueInstance' 12 | ], 13 | #category : #'Dynabook-Core-Soup' 14 | } 15 | 16 | { #category : #accessing } 17 | DbSoup class >> detectUID: anObject [ 18 | "See instance-side comment" 19 | 20 | ^ self uniqueInstance detectUID: anObject 21 | ] 22 | 23 | { #category : #accessing } 24 | DbSoup class >> detectUID: anObject ifNone: noneBlock [ 25 | "See instance-side comment" 26 | 27 | ^ self uniqueInstance 28 | detectUID: anObject 29 | ifNone: noneBlock 30 | ] 31 | 32 | { #category : #'as yet unclassified' } 33 | DbSoup class >> uniqueInstance [ 34 | ^ UniqueInstance ifNil: [ UniqueInstance := self new ] 35 | ] 36 | 37 | { #category : #accessing } 38 | DbSoup >> detectUID: anObject [ 39 | "anObject - must understand #olDetectUIDBlock. See implementors" 40 | 41 | ^ self 42 | detectUID: anObject 43 | ifNone: [ self error: 'UID not found!' ] 44 | ] 45 | 46 | { #category : #accessing } 47 | DbSoup >> detectUID: anObject ifNone: noneBlock [ 48 | "anObject - must understand #olDetectUIDBlock. See implementors" 49 | 50 | self sources do: [ :source | 51 | | result | 52 | result := source 53 | detectUID: anObject 54 | ifNone: [ nil ]. 55 | result ifNotNil: [ ^ result ] ]. 56 | 57 | ^ noneBlock value 58 | ] 59 | 60 | { #category : #accessing } 61 | DbSoup >> gtSpotterSearchesInContext: aSpotterContext [ 62 | | spotterSources | 63 | "Halt now." 64 | spotterSources := (self sources asOrderedCollection asAsyncStream collect: [ :e | e source ]) withoutDuplicates useIdentityComparison. 65 | ^ spotterSources flatCollect: [ :source | source gtSpotterSearchesInContext: aSpotterContext ]. 66 | ] 67 | 68 | { #category : #accessing } 69 | DbSoup >> sources [ 70 | 71 | ^ sources ifNil: [ sources := Set new ]. 72 | ] 73 | 74 | { #category : #views } 75 | DbSoup >> sourcesGtViewFor: aView [ 76 | 77 | sources ifNil: [ ^ aView empty ]. 78 | ^ aView columnedList 79 | title: 'Sources'; 80 | items: [ sources asOrderedCollection ]; 81 | column: 'Value' text: [ :each | each displayString ] 82 | ] 83 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/DbGtHomeUtilitiesSection.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #DbGtHomeUtilitiesSection, 3 | #superclass : #GtHomeMultiCardSection, 4 | #classVars : [ 5 | 'DataDB' 6 | ], 7 | #category : #'Dynabook-GToolkit' 8 | } 9 | 10 | { #category : #accessing } 11 | DbGtHomeUtilitiesSection class >> dataDB: anSpFileDatabaseClass [ 12 | 13 | DataDB := anSpFileDatabaseClass 14 | ] 15 | 16 | { #category : #stencils } 17 | DbGtHomeUtilitiesSection >> baselineCard [ 18 | 19 | 20 | ^ self 21 | buttonPriority: 30 22 | titled: 'Baseline' 23 | icon: BrGlamorousVectorIcons largeBook 24 | tooltip: '' 25 | action: [ :card | 26 | self 27 | showSpaceWithIcon: BrGlamorousVectorIcons emphasizedBrowse 28 | title: 'Coder' 29 | with: (GtCoder forClass: BaselineOfDynabook) createInPager maximized 30 | from: card ] 31 | ] 32 | 33 | { #category : #stencils } 34 | DbGtHomeUtilitiesSection >> bridgeCard [ 35 | 36 | 37 | ^ self 38 | buttonPriority: 20 39 | titled: 'PBridge - Restart' 40 | icon: 'noun-bridge-4982741.png' 41 | tooltip: 'Stop and then start PBApplication' 42 | action: [ :card | 43 | PBApplication stop; start. 44 | UIManager default inform: 'Python Bridge Restarted' ] 45 | ] 46 | 47 | { #category : #stencils } 48 | DbGtHomeUtilitiesSection >> dataCard [ 49 | 50 | 51 | ^ self 52 | buttonPriority: 10 53 | titled: 'SP Data' 54 | icon: 'noun-database-4716694.png' 55 | tooltip: 'Inspect persisted DB' 56 | inspecting: [ self dataDB ] 57 | ] 58 | 59 | { #category : #accessing } 60 | DbGtHomeUtilitiesSection >> dataDB [ 61 | ^ DataDB ifNil: [ DynabookDB ] 62 | ] 63 | 64 | { #category : #accessing } 65 | DbGtHomeUtilitiesSection >> defaultPriority [ 66 | ^ 20 67 | ] 68 | 69 | { #category : #accessing } 70 | DbGtHomeUtilitiesSection >> iconFolder [ 71 | ^ BaselineOfDynabook iconFolder 72 | ] 73 | 74 | { #category : #'api - instantiation' } 75 | DbGtHomeUtilitiesSection >> sectionTitle [ 76 | 77 | ^ 'Dynabook - Utilities' 78 | ] 79 | 80 | { #category : #stencils } 81 | DbGtHomeUtilitiesSection >> updateHomeCard [ 82 | 83 | 84 | ^ self 85 | buttonPriority: 40 86 | titled: 'Update These' 87 | icon: 'noun-home-323099.png' 88 | "iconSize: 55@55;" 89 | tooltip: 'Refresh after making changes' 90 | action: [ :card | GtHome allInstances do: #updateSections ] 91 | ] 92 | -------------------------------------------------------------------------------- /src/BaselineOfDynabook/BaselineOfCustomDynabookExample.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #BaselineOfCustomDynabookExample, 3 | #superclass : #BaselineOf, 4 | #category : #BaselineOfDynabook 5 | } 6 | 7 | { #category : #accessing } 8 | BaselineOfCustomDynabookExample class >> dataFolder [ 9 | ^ FileLocator dynabookData / 'Dynabook' 10 | ] 11 | 12 | { #category : #initialization } 13 | BaselineOfCustomDynabookExample class >> pipEnvPostLoad [ 14 | | pyBridgeFolder | 15 | pyBridgeFolder := FileLocator imageDirectory / 'PythonBridgeRuntime'. 16 | 17 | SuLn new 18 | original: '/opt/homebrew/lib/libxyz.dylib' asFileReference; 19 | link: pyBridgeFolder / 'libxyz.dylib'; 20 | run. 21 | 22 | BaselineOfDynabook pipEnvPostLoad 23 | ] 24 | 25 | { #category : #setup } 26 | BaselineOfCustomDynabookExample class >> setUp [ 27 | 28 | | homebrewBinaryFolder homebrewInstalled msalAppIdFile | 29 | DbGtHomeUtilitiesSection dataDB: #MyDynabookDB asClass. 30 | 31 | PpInactiveStatus label: 'Never Doing'. 32 | PpInboxStatus label: 'Captured'. 33 | 34 | homebrewBinaryFolder := '/opt/homebrew/bin' asFileReference. 35 | homebrewInstalled := { SuFfmpeg. SuImageMagick. SuSocat. Tesseract }. 36 | homebrewInstalled do: [ :e | e binaryFolder: homebrewBinaryFolder ]. 37 | 38 | #SuperuserDB asClass restoreLastBackup. 39 | #MyDynabookDB asClass restoreLastBackup. 40 | 41 | MsalOneNotePage handlers addAll: { 42 | PpNotePageMoveToPpProject 43 | }. 44 | 45 | PBPharoPipenvProcess pipenvPath: FileLocator home / '.pyenv/shims/pipenv'. 46 | 47 | BaselineOfDynabook lepiterReloadLogicalDBFromPropertiesFile: self dataFolder / 'logical-database.properties'. 48 | 49 | BlGlutinHostSpace zoomFactor: 1.2. 50 | 51 | Transcript clear "workaround for GT issue where long transcript can bog down system". 52 | 53 | "MSAL Setup" 54 | msalAppIdFile := self dataFolder / 'msal-app-id'. 55 | DbMsalApp id: msalAppIdFile contents. 56 | ] 57 | 58 | { #category : #baselines } 59 | BaselineOfCustomDynabookExample >> baseline: spec [ 60 | 61 | 62 | spec for: #'common' do: [ 63 | spec 64 | baseline: 'Dynabook' with: [ 65 | spec repository: 'github://seandenigris/Dynabook' ]; 66 | baseline: 'Fuel' with: [ 67 | spec 68 | preLoadDoIt: #fuelPreLoad; 69 | repository: 'github://theseion/Fuel:5.2.1'; 70 | loads: #Tests "Needed in GT, where tests are already loaded, to replace outdated version and avoid error. This is combined with a warning resolution in the Metacello load script. See https://github.com/theseion/Fuel/issues/257#issuecomment-981098972" ]; 71 | baseline: 'MyAdditionalCoolComponent' with: [ 72 | spec repository: 'github://me/MyAdditionalCoolComponent' ]. 73 | 74 | spec 75 | package: 'MyDynabook' with: [ 76 | spec requires: #('Fuel' 'MyAdditionalCoolComponent') ] ]. 77 | ] 78 | 79 | { #category : #accessing } 80 | BaselineOfCustomDynabookExample >> customProjectAttributes [ 81 | 82 | ^ self isGTImage 83 | ifTrue: [ #(GToolkit) ] 84 | ifFalse: [ #(notGToolkit) ]. 85 | ] 86 | 87 | { #category : #accessing } 88 | BaselineOfCustomDynabookExample >> fuelPreLoad [ 89 | BaselineOfDynabook fuelPreLoad 90 | ] 91 | 92 | { #category : #testing } 93 | BaselineOfCustomDynabookExample >> isGTImage [ 94 | 95 | ^ RPackageOrganizer default packageNames anySatisfy: [ :pn | pn beginsWith: 'Lepiter-' ]. 96 | "Implementation note: used to check for GToolkit prefix, but P7 has a GToolkit-Examples package. Lepiter, OTOH, could only be loaded in a GT image" 97 | ] 98 | 99 | { #category : #loading } 100 | BaselineOfCustomDynabookExample >> postLoad [ 101 | 102 | self class setUp 103 | ] 104 | -------------------------------------------------------------------------------- /src/Dynabook-GToolkit/DbGtHomeDomainSection.class.st: -------------------------------------------------------------------------------- 1 | Class { 2 | #name : #DbGtHomeDomainSection, 3 | #superclass : #GtHomeMultiCardSection, 4 | #category : #'Dynabook-GToolkit' 5 | } 6 | 7 | { #category : #'as yet unclassified' } 8 | DbGtHomeDomainSection >> addressBookCard [ 9 | 10 | 11 | ^ self 12 | buttonPriority: 10 13 | titled: 'Address Book' 14 | icon: 'noun-address-book-148913.png' 15 | tooltip: 'Inspect default address book' 16 | inspecting: [ MpAddressBook uniqueInstance ] 17 | ] 18 | 19 | { #category : #'as yet unclassified' } 20 | DbGtHomeDomainSection >> booksCard [ 21 | 22 | 23 | ^ self 24 | buttonPriority: 20 25 | titled: 'Books - Personal' 26 | icon: 'noun-financial-advice-book-4450943.png' 27 | tooltip: 'Inspect personal books' 28 | inspecting: [ VsBooks personal ] 29 | ] 30 | 31 | { #category : #'as yet unclassified' } 32 | DbGtHomeDomainSection >> dailyNoteCard [ 33 | 34 | 35 | ^ self 36 | buttonPriority: 40 37 | titled: 'Daily Note' 38 | icon: nil 39 | tooltip: 'Create a TPP note for today' 40 | inspecting: [ 41 | | page | 42 | page := LePage journalOn: Date today. 43 | LeDatabasesRegistry defaultPrimaryDatabase addPage: page ] 44 | ] 45 | 46 | { #category : #'as yet unclassified' } 47 | DbGtHomeDomainSection >> defaultPriority [ 48 | ^ 10 49 | ] 50 | 51 | { #category : #'as yet unclassified' } 52 | DbGtHomeDomainSection >> eventLogCard [ 53 | 54 | 55 | ^ self 56 | buttonPriority: 30 57 | titled: 'Event Log' 58 | icon: 'noun-calendar-4979381.png' 59 | tooltip: 'Inspect default event log' 60 | inspecting: [ PpEventLog uniqueInstance ] 61 | ] 62 | 63 | { #category : #'as yet unclassified' } 64 | DbGtHomeDomainSection >> iconFolder [ 65 | ^ BaselineOfDynabook iconFolder 66 | ] 67 | 68 | { #category : #'as yet unclassified' } 69 | DbGtHomeDomainSection >> inventoryCard [ 70 | 71 | 72 | ^ self 73 | buttonPriority: 50 74 | titled: 'Inventory' 75 | icon: 'noun-inventory-2895895.png' 76 | tooltip: 'Inspect Inventory' 77 | inspecting: [ PpInventory uniqueInstance ] 78 | ] 79 | 80 | { #category : #'as yet unclassified' } 81 | DbGtHomeDomainSection >> livingLibraryCard [ 82 | 83 | 84 | ^ self 85 | buttonPriority: 70 86 | titled: 'LL Library' 87 | icon: 'noun-library-book-4329851.png' 88 | tooltip: 'Inspect default library' 89 | inspecting: [ LlLibrary uniqueInstance ] 90 | ] 91 | 92 | { #category : #'as yet unclassified' } 93 | DbGtHomeDomainSection >> locationsCard [ 94 | 95 | 96 | ^ self 97 | buttonPriority: 60 98 | titled: 'Locations' 99 | icon: 'noun-inventory-2895895.png' 100 | tooltip: 'Inspect Location List' 101 | inspecting: [ PpLocationList uniqueInstance ] 102 | ] 103 | 104 | { #category : #'as yet unclassified' } 105 | DbGtHomeDomainSection >> networkedDevicesCard [ 106 | 107 | 108 | ^ self 109 | buttonPriority: 80 110 | titled: 'Network Devices' 111 | icon: 'noun-computer-network-1836808.png' 112 | tooltip: 'Inspect devices' 113 | inspecting: [ CwNetworkDevice db ] 114 | ] 115 | 116 | { #category : #'as yet unclassified' } 117 | DbGtHomeDomainSection >> projectListCard [ 118 | 119 | 120 | ^ self 121 | buttonPriority: 90 122 | titled: 'Projects' 123 | icon: 'noun-project-2662138.png' 124 | tooltip: 'Inspect default project list' 125 | inspecting: [ PpProjectList uniqueInstance ] 126 | ] 127 | 128 | { #category : #'as yet unclassified' } 129 | DbGtHomeDomainSection >> resourceLibraryCard [ 130 | 131 | 132 | ^ self 133 | buttonPriority: 100 134 | titled: 'Resource Library' 135 | icon: 'noun-file-4980207.png' 136 | tooltip: 'Inspect default resource library' 137 | inspecting: [ RlResourceLibrary uniqueInstance ] 138 | ] 139 | 140 | { #category : #'as yet unclassified' } 141 | DbGtHomeDomainSection >> sectionTitle [ 142 | 143 | ^ 'Dynabook' 144 | ] 145 | 146 | { #category : #'as yet unclassified' } 147 | DbGtHomeDomainSection >> softwareCatalogCard [ 148 | 149 | 150 | ^ self 151 | buttonPriority: 110 152 | titled: 'Software Catalog' 153 | icon: nil 154 | tooltip: 'Inspect default catalog' 155 | inspecting: [ CwSoftwareCatalog uniqueInstance ] 156 | ] 157 | -------------------------------------------------------------------------------- /lepiter/a7eqsme04w1hmeaadczw5kfyl.bak: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "uid" : { 5 | "__type" : "uuid", 6 | "uuid" : "cd6242a1-e8c9-0d00-a114-d6460e7a63ac" 7 | }, 8 | "pageType" : { 9 | "__type" : "namedPage", 10 | "title" : "PythonBridge Integration" 11 | }, 12 | "children" : { 13 | "__type" : "snippets", 14 | "items" : [ 15 | { 16 | "__type" : "textSnippet", 17 | "children" : { 18 | "__type" : "snippets", 19 | "items" : [ ] 20 | }, 21 | "createEmail" : { 22 | "__type" : "email", 23 | "emailString" : "" 24 | }, 25 | "createTime" : { 26 | "__type" : "time", 27 | "time" : { 28 | "__type" : "dateAndTime", 29 | "dateAndTimeString" : "2023-12-27T19:21:52.238042-05:00" 30 | } 31 | }, 32 | "editEmail" : { 33 | "__type" : "email", 34 | "emailString" : "" 35 | }, 36 | "editTime" : { 37 | "__type" : "time", 38 | "time" : { 39 | "__type" : "dateAndTime", 40 | "dateAndTimeString" : "2023-12-27T19:22:42.777168-05:00" 41 | } 42 | }, 43 | "uid" : { 44 | "__type" : "uid", 45 | "uidString" : "8hQ/oujJDQChFihXDnpjrA==" 46 | }, 47 | "paragraphStyle" : { 48 | "__type" : "textStyle" 49 | }, 50 | "string" : "PythonBridge uses this canned Pipfile:" 51 | }, 52 | { 53 | "__type" : "pharoSnippet", 54 | "children" : { 55 | "__type" : "snippets", 56 | "items" : [ ] 57 | }, 58 | "createEmail" : { 59 | "__type" : "email", 60 | "emailString" : "" 61 | }, 62 | "createTime" : { 63 | "__type" : "time", 64 | "time" : { 65 | "__type" : "dateAndTime", 66 | "dateAndTimeString" : "2023-12-27T19:22:28.181753-05:00" 67 | } 68 | }, 69 | "editEmail" : { 70 | "__type" : "email", 71 | "emailString" : "" 72 | }, 73 | "editTime" : { 74 | "__type" : "time", 75 | "time" : { 76 | "__type" : "dateAndTime", 77 | "dateAndTimeString" : "2023-12-27T19:22:29.271444-05:00" 78 | } 79 | }, 80 | "uid" : { 81 | "__type" : "uid", 82 | "uidString" : "0fbHpejJDQCicQ1ADnpjrA==" 83 | }, 84 | "code" : "FileLocator imageDirectory / 'gt-extra/feenkcom/PythonBridge/PythonBridgeRuntime/Pipfile'" 85 | }, 86 | { 87 | "__type" : "textSnippet", 88 | "children" : { 89 | "__type" : "snippets", 90 | "items" : [ ] 91 | }, 92 | "createEmail" : { 93 | "__type" : "email", 94 | "emailString" : "" 95 | }, 96 | "createTime" : { 97 | "__type" : "time", 98 | "time" : { 99 | "__type" : "dateAndTime", 100 | "dateAndTimeString" : "2023-12-27T19:22:45.772524-05:00" 101 | } 102 | }, 103 | "editEmail" : { 104 | "__type" : "email", 105 | "emailString" : "" 106 | }, 107 | "editTime" : { 108 | "__type" : "time", 109 | "time" : { 110 | "__type" : "dateAndTime", 111 | "dateAndTimeString" : "2023-12-27T19:27:19.35576-05:00" 112 | } 113 | }, 114 | "uid" : { 115 | "__type" : "uid", 116 | "uidString" : "GGbUpujJDQCisvI9DnpjrA==" 117 | }, 118 | "paragraphStyle" : { 119 | "__type" : "textStyle" 120 | }, 121 | "string" : "We need to add all our dependencies, which means collecting the dependencies from each component project. How will we do it? We will use the power of Smalltalk to generate it, of course!" 122 | }, 123 | { 124 | "__type" : "textSnippet", 125 | "children" : { 126 | "__type" : "snippets", 127 | "items" : [ ] 128 | }, 129 | "createEmail" : { 130 | "__type" : "email", 131 | "emailString" : "" 132 | }, 133 | "createTime" : { 134 | "__type" : "time", 135 | "time" : { 136 | "__type" : "dateAndTime", 137 | "dateAndTimeString" : "2023-12-27T19:27:19.55573-05:00" 138 | } 139 | }, 140 | "editEmail" : { 141 | "__type" : "email", 142 | "emailString" : "" 143 | }, 144 | "editTime" : { 145 | "__type" : "time", 146 | "time" : { 147 | "__type" : "dateAndTime", 148 | "dateAndTimeString" : "2023-12-27T19:34:34.222097-05:00" 149 | } 150 | }, 151 | "uid" : { 152 | "__type" : "uid", 153 | "uidString" : "nf0lt+jJDQCm41nbDnpjrA==" 154 | }, 155 | "paragraphStyle" : { 156 | "__type" : "textStyle" 157 | }, 158 | "string" : "There is no hook provided for this, so we'll override {{gtMethod:PBPharoPlatform>>#copyApplicationTo:application:}}, appending our Pipfile generation code" 159 | }, 160 | { 161 | "__type" : "textSnippet", 162 | "children" : { 163 | "__type" : "snippets", 164 | "items" : [ ] 165 | }, 166 | "createEmail" : { 167 | "__type" : "email", 168 | "emailString" : "" 169 | }, 170 | "createTime" : { 171 | "__type" : "time", 172 | "time" : { 173 | "__type" : "dateAndTime", 174 | "dateAndTimeString" : "2023-12-27T19:33:07.19089-05:00" 175 | } 176 | }, 177 | "editEmail" : { 178 | "__type" : "email", 179 | "emailString" : "" 180 | }, 181 | "editTime" : { 182 | "__type" : "time", 183 | "time" : { 184 | "__type" : "dateAndTime", 185 | "dateAndTimeString" : "2023-12-27T19:36:49.147117-05:00" 186 | } 187 | }, 188 | "uid" : { 189 | "__type" : "uid", 190 | "uidString" : "T3rey+jJDQCoXtDcDnpjrA==" 191 | }, 192 | "paragraphStyle" : { 193 | "__type" : "textStyle" 194 | }, 195 | "string" : "For configuration tasks that must be performed after the pipenv environment is installed, you can override {{gtMethod:PBPharoPlatform>>#forceInstallEnvironmentForApp:}} " 196 | }, 197 | { 198 | "__type" : "textSnippet", 199 | "children" : { 200 | "__type" : "snippets", 201 | "items" : [ ] 202 | }, 203 | "createEmail" : { 204 | "__type" : "email", 205 | "emailString" : "" 206 | }, 207 | "createTime" : { 208 | "__type" : "time", 209 | "time" : { 210 | "__type" : "dateAndTime", 211 | "dateAndTimeString" : "2023-12-27T19:21:12.357252-05:00" 212 | } 213 | }, 214 | "editEmail" : { 215 | "__type" : "email", 216 | "emailString" : "" 217 | }, 218 | "editTime" : { 219 | "__type" : "time", 220 | "time" : { 221 | "__type" : "dateAndTime", 222 | "dateAndTimeString" : "2023-12-27T19:21:12.357252-05:00" 223 | } 224 | }, 225 | "uid" : { 226 | "__type" : "uid", 227 | "uidString" : "ngFDoejJDQChFbMBDnpjrA==" 228 | }, 229 | "paragraphStyle" : { 230 | "__type" : "textStyle" 231 | }, 232 | "string" : "" 233 | } 234 | ] 235 | }, 236 | "createEmail" : { 237 | "__type" : "email", 238 | "emailString" : "" 239 | }, 240 | "createTime" : { 241 | "__type" : "time", 242 | "time" : { 243 | "__type" : "dateAndTime", 244 | "dateAndTimeString" : "2023-12-27T19:21:12.316936-05:00" 245 | } 246 | }, 247 | "editEmail" : { 248 | "__type" : "email", 249 | "emailString" : "" 250 | }, 251 | "editTime" : { 252 | "__type" : "time", 253 | "time" : { 254 | "__type" : "dateAndTime", 255 | "dateAndTimeString" : "2023-12-27T19:35:26.252009-05:00" 256 | } 257 | } 258 | } -------------------------------------------------------------------------------- /lepiter/a7eqsme04w1hmeaadczw5kfyl.lepiter: -------------------------------------------------------------------------------- 1 | { 2 | "__schema" : "4.1", 3 | "__type" : "page", 4 | "uid" : { 5 | "__type" : "uuid", 6 | "uuid" : "cd6242a1-e8c9-0d00-a114-d6460e7a63ac" 7 | }, 8 | "pageType" : { 9 | "__type" : "namedPage", 10 | "title" : "PythonBridge Integration" 11 | }, 12 | "children" : { 13 | "__type" : "snippets", 14 | "items" : [ 15 | { 16 | "__type" : "textSnippet", 17 | "children" : { 18 | "__type" : "snippets", 19 | "items" : [ ] 20 | }, 21 | "createEmail" : { 22 | "__type" : "email", 23 | "emailString" : "" 24 | }, 25 | "createTime" : { 26 | "__type" : "time", 27 | "time" : { 28 | "__type" : "dateAndTime", 29 | "dateAndTimeString" : "2023-12-27T19:21:52.238042-05:00" 30 | } 31 | }, 32 | "editEmail" : { 33 | "__type" : "email", 34 | "emailString" : "" 35 | }, 36 | "editTime" : { 37 | "__type" : "time", 38 | "time" : { 39 | "__type" : "dateAndTime", 40 | "dateAndTimeString" : "2023-12-27T19:22:42.777168-05:00" 41 | } 42 | }, 43 | "uid" : { 44 | "__type" : "uid", 45 | "uidString" : "8hQ/oujJDQChFihXDnpjrA==" 46 | }, 47 | "paragraphStyle" : { 48 | "__type" : "textStyle" 49 | }, 50 | "string" : "PythonBridge uses this canned Pipfile:" 51 | }, 52 | { 53 | "__type" : "pharoSnippet", 54 | "children" : { 55 | "__type" : "snippets", 56 | "items" : [ ] 57 | }, 58 | "createEmail" : { 59 | "__type" : "email", 60 | "emailString" : "" 61 | }, 62 | "createTime" : { 63 | "__type" : "time", 64 | "time" : { 65 | "__type" : "dateAndTime", 66 | "dateAndTimeString" : "2023-12-27T19:22:28.181753-05:00" 67 | } 68 | }, 69 | "editEmail" : { 70 | "__type" : "email", 71 | "emailString" : "" 72 | }, 73 | "editTime" : { 74 | "__type" : "time", 75 | "time" : { 76 | "__type" : "dateAndTime", 77 | "dateAndTimeString" : "2023-12-27T19:22:29.271444-05:00" 78 | } 79 | }, 80 | "uid" : { 81 | "__type" : "uid", 82 | "uidString" : "0fbHpejJDQCicQ1ADnpjrA==" 83 | }, 84 | "code" : "FileLocator imageDirectory / 'gt-extra/feenkcom/PythonBridge/PythonBridgeRuntime/Pipfile'" 85 | }, 86 | { 87 | "__type" : "textSnippet", 88 | "children" : { 89 | "__type" : "snippets", 90 | "items" : [ ] 91 | }, 92 | "createEmail" : { 93 | "__type" : "email", 94 | "emailString" : "" 95 | }, 96 | "createTime" : { 97 | "__type" : "time", 98 | "time" : { 99 | "__type" : "dateAndTime", 100 | "dateAndTimeString" : "2023-12-27T19:22:45.772524-05:00" 101 | } 102 | }, 103 | "editEmail" : { 104 | "__type" : "email", 105 | "emailString" : "" 106 | }, 107 | "editTime" : { 108 | "__type" : "time", 109 | "time" : { 110 | "__type" : "dateAndTime", 111 | "dateAndTimeString" : "2023-12-27T19:27:19.35576-05:00" 112 | } 113 | }, 114 | "uid" : { 115 | "__type" : "uid", 116 | "uidString" : "GGbUpujJDQCisvI9DnpjrA==" 117 | }, 118 | "paragraphStyle" : { 119 | "__type" : "textStyle" 120 | }, 121 | "string" : "We need to add all our dependencies, which means collecting the dependencies from each component project. How will we do it? We will use the power of Smalltalk to generate it, of course!" 122 | }, 123 | { 124 | "__type" : "textSnippet", 125 | "children" : { 126 | "__type" : "snippets", 127 | "items" : [ ] 128 | }, 129 | "createEmail" : { 130 | "__type" : "email", 131 | "emailString" : "" 132 | }, 133 | "createTime" : { 134 | "__type" : "time", 135 | "time" : { 136 | "__type" : "dateAndTime", 137 | "dateAndTimeString" : "2023-12-27T19:27:19.55573-05:00" 138 | } 139 | }, 140 | "editEmail" : { 141 | "__type" : "email", 142 | "emailString" : "" 143 | }, 144 | "editTime" : { 145 | "__type" : "time", 146 | "time" : { 147 | "__type" : "dateAndTime", 148 | "dateAndTimeString" : "2023-12-27T19:34:34.222097-05:00" 149 | } 150 | }, 151 | "uid" : { 152 | "__type" : "uid", 153 | "uidString" : "nf0lt+jJDQCm41nbDnpjrA==" 154 | }, 155 | "paragraphStyle" : { 156 | "__type" : "textStyle" 157 | }, 158 | "string" : "There is no hook provided for this, so we'll override {{gtMethod:PBPharoPlatform>>#copyApplicationTo:application:}}, appending our Pipfile generation code" 159 | }, 160 | { 161 | "__type" : "textSnippet", 162 | "children" : { 163 | "__type" : "snippets", 164 | "items" : [ ] 165 | }, 166 | "createEmail" : { 167 | "__type" : "email", 168 | "emailString" : "" 169 | }, 170 | "createTime" : { 171 | "__type" : "time", 172 | "time" : { 173 | "__type" : "dateAndTime", 174 | "dateAndTimeString" : "2023-12-27T19:33:07.19089-05:00" 175 | } 176 | }, 177 | "editEmail" : { 178 | "__type" : "email", 179 | "emailString" : "" 180 | }, 181 | "editTime" : { 182 | "__type" : "time", 183 | "time" : { 184 | "__type" : "dateAndTime", 185 | "dateAndTimeString" : "2023-12-27T19:36:51.257033-05:00" 186 | } 187 | }, 188 | "uid" : { 189 | "__type" : "uid", 190 | "uidString" : "T3rey+jJDQCoXtDcDnpjrA==" 191 | }, 192 | "paragraphStyle" : { 193 | "__type" : "textStyle" 194 | }, 195 | "string" : "For configuration tasks that must be performed after the pipenv environment is installed, you can override {{gtMethod:PBPharoPlatform>>#forceInstallEnvironmentForApp:}}." 196 | }, 197 | { 198 | "__type" : "textSnippet", 199 | "children" : { 200 | "__type" : "snippets", 201 | "items" : [ ] 202 | }, 203 | "createEmail" : { 204 | "__type" : "email", 205 | "emailString" : "" 206 | }, 207 | "createTime" : { 208 | "__type" : "time", 209 | "time" : { 210 | "__type" : "dateAndTime", 211 | "dateAndTimeString" : "2023-12-27T19:21:12.357252-05:00" 212 | } 213 | }, 214 | "editEmail" : { 215 | "__type" : "email", 216 | "emailString" : "" 217 | }, 218 | "editTime" : { 219 | "__type" : "time", 220 | "time" : { 221 | "__type" : "dateAndTime", 222 | "dateAndTimeString" : "2023-12-27T19:21:12.357252-05:00" 223 | } 224 | }, 225 | "uid" : { 226 | "__type" : "uid", 227 | "uidString" : "ngFDoejJDQChFbMBDnpjrA==" 228 | }, 229 | "paragraphStyle" : { 230 | "__type" : "textStyle" 231 | }, 232 | "string" : "" 233 | } 234 | ] 235 | }, 236 | "createEmail" : { 237 | "__type" : "email", 238 | "emailString" : "" 239 | }, 240 | "createTime" : { 241 | "__type" : "time", 242 | "time" : { 243 | "__type" : "dateAndTime", 244 | "dateAndTimeString" : "2023-12-27T19:21:12.316936-05:00" 245 | } 246 | }, 247 | "editEmail" : { 248 | "__type" : "email", 249 | "emailString" : "" 250 | }, 251 | "editTime" : { 252 | "__type" : "time", 253 | "time" : { 254 | "__type" : "dateAndTime", 255 | "dateAndTimeString" : "2023-12-27T19:35:26.252009-05:00" 256 | } 257 | } 258 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TLDR What would a Dynabook (a la Alan Kay) look like from the inside? Here is the result of one user's system, lived in and honed for over a decade. # Overview NB. Much of the following is an export of the class comment of [`BaselineOfDynabook`](https://github.com/seandenigris/Dynabook/blob/master/src/BaselineOfDynabook/BaselineOfDynabook.class.st). When viewed from inside the system, it is live, dynamic and beautiful. "Just the markdown" only gives you a taste. We suggest you dive in and view the documentation as it was intended as quickly as possible - it will be more enjoyable and productive! Alan Kay's Dynabook [2] dream is often explored from the perspective of creating such a system. But what would/could a Dynabook look like after actually being lived in for a long period. What sorts of tools and services would appear? How would they interact? You can start by exploring my core components (start with the class comments of the BaslineOfXyzs): ```smalltalk BaselineOfDynabook coreBaselines ``` ## What is a Dynabook? Buckle your seatbelt. Here's an excerpt from my longer blog post ["Programmers: You Probably Don’t Know What a Computer Is"](http://seandenigris.com/blog/?p=1092), about Smalltalk, the environment powering this system: You may not realize it, but you have opened a portal to some of the greatest minds in the history of our industry. In the beginning, for many of our heroes — Doug Engelbart, Alan Kay, Seymour Papert — computing was about the possibility of evolving the general level of human thought for the benefit of mankind. Effective critical thinking is vital to modern life e.g. the proper functioning of democratic governments. Yet traditional media have been ineffective at improving our thought on a large scale. Today, we’re mostly glorified “caveman with briefcases”, reacting to the same human universals as our distant ancestors — Fantasies, Stories, Superstition, Religion/Magic, Vendetta. So what does this have to do with computing?! I’m glad you asked :) In 1972, Alan Kay envisioned a “dynamic medium for creative thought” which he called a Dynabook [1]. It was an answer to the problem described above — a computer to support and guide minds to the level required to overcome our uglier instincts, and replace them with our highest ideas, like Equal Rights, Democracy, Slow Deep Thinking, Legal System over Vendetta, Theory of Harmony — ideas which do not take seed on their own, but must be actively nurtured. So what does this have to do with programming?! I’m glad you asked that, too :) Smalltalk is interim [2] Dynabook software! You have in your hands, not a programming language, but a live, dynamic, turtles-all-the-way-down environment designed to provide “support for the creative spirit in everyone”. More practically, Smalltalk is a programming tool that allows productivity unimaginable in most systems. And, if you put in enough time and effort to actually think in it, it will help you program better in any language you use. But, I think it would be a great waste if you left Smalltalk “a better programmer”, when the questions before you are: - What really matters? - How can computers fulfill on that? - How can I, as a programmer, contribute to that? From PARC's 1977 paper [1]: The Learning Research Group... is concerned with all aspects of the communication and manipulation of knowledge. We design, build, and use dynamic media which can be used by human beings of all ages. Several years ago, we crystallized our dreams into a design idea for a personal dynamic medium the size of a notebook (the Dynabook) which could be owned by everyone and could have the power to handle virtually all of its owner's information-related needs. Towards this goal we have designed and built a communications system: the Smalltalk language, implemented on small computers we refer to as "interim Dynabooks." We are exploring the use of this system as a programming and problem solving tool; as an interactive memory for the storage and manipulation of data; as a text editor; and as a medium for expression through drawing, painting, animating pictures, and composing and generating music. 2 | # Components The following projects are the core components: - [FIT Protocol](https://github.com/seandenigris/FIT-Protocol-4-GToolkit) - Read, analyze and visualize [Garmin's Flexible and Interoperable Data Transfer (FIT) protocol](https://developer.garmin.com/fit/overview/). Runs on [the amazing GToolkit platform](https://gtoolkit.com) 3 | - [Bookmark Magic](https://github.com/SeanDeNigris/Bookmark-Magic) - URL bookmarking in a live, dynamic world. 4 | - [Ukulele](https://github.com/seandenigris/Ukulele-Pharo) - TLDR: A companion in learning and playing, in a live system of supporting objects e.g. media library, bookmarking, contact management (e.g. for teachers and peers). Currently manages things related to playing e.g. songs, lessons, tabs. 5 | - [The Project Project](https://github.com/SeanDeNigris/The-Project-Project) - Project Management unleashed from an "application" stovepipe, running on GToolkit (Smalltalk) 6 | - [Tracking Numbers](https://github.com/seandenigris/Tracking-ST) - Tracking numbers, unleashed from an application stovepipe, on GToolkit (Smalltalk) 7 | - [Flashcards St](https://github.com/seandenigris/Flashcards-St) - Unleash flashcards from simple text on "front" and "back". Any object can be for multiple cards (or card types) 8 | - [Ideas](https://github.com/SeanDeNigris/ideas) - KMS mind-map interface powered by @feenkcom's #GToolkit. Features (like dictionary terms), - concepts made up of other concepts, (like dictionary definitions) connect concepts in an interesting/value-added way 9 | - [Superuser](https://github.com/seandenigris/Superuser) - An attemple to make Unix commands more sane. 10 | - [Nature](https://github.com/seandenigris/Nature) - A naturalist's companion, focused on identifying and logging plant and mushrooms. 11 | - [Broadcastify](https://github.com/seandenigris/Broadcastify-Alive) - [Broadcastify](https://www.broadcastify.com) OO client model for Glamorous Toolkit 12 | - [Small World](https://github.com/seandenigris/SmallWorld) - Project catalog akin to Squeak Map. The idea is that, with one click, you can load your favorite projects in the best way for that particular image (dialect, version, etc.) in that context (development, deployment, etc.). Right now I've just been using it myself for a few years. 13 | - [Computer World](https://github.com/seandenigris/Computer-World) - Bring to life computing objects like applications, servers, etc. 14 | - [My People](https://github.com/SeanDeNigris/My-People) - Address Book service, minus the usual application stovepipe, running on GT (Smalltalk) 15 | - [Quote Me](https://github.com/SeanDeNigris/Quote-Me) - Quotation DB freed from an "application" stovepipe, in GToolkit (Smalltalk) 16 | - [Resources Live](https://github.com/seandenigris/Resources-Live) - Free users to communicate with objects instead of managing files. Files conflate what a thing is with where it is. We take care of the boring location part for you. So you can "play an mp3" instead of "opening an mp3 file in a player app". Nicer, no? 17 | - [Baby Sign Language](https://github.com/SeanDeNigris/Baby-Sign-Language) 18 | - [Virtual Stash](https://github.com/SeanDeNigris/Virtual-Stash) - Picture GnuCash, minus the application stovepipe, running on GToolkit (Smalltalk) 19 | - [Living Library](https://github.com/SeanDeNigris/Living-Library) - A reimagination of what a library can be once freed from a being a physical building housing (only) physical items # Icon Attribution Our GTooklit Home Section uses the following icons from [Noun Project](https://thenounproject.com/browse/icons/term/inventory/): - Financial Advice Book by Juicy Fish - Database by Larea - Library Book by Kmg Design - Project by WEBTECHOPS LLP - File by Gilang Kampus - Bridge by Wan Ikhsan - inventory by Eucalyp - Computer Network by Vectors Market ## References 1. ["Personal Dynamic Media"](https://www.computer.org/csdl/magazine/co/1977/03/01646405/13rRUxZRbs8) 2. [Smalltalk: Design Principles Behind Smalltalk](http://www.cs.virginia.edu/~evans/cs655/readings/smalltalk.html) # Installation In GToolkit (preferably) or Pharo (v. 10 best supported at time of writing), do the following: ```smalltalk [ EpMonitor current disable. [ Metacello new baseline: 'Dynabook'; repository: 'github://seandenigris/Dynabook'; "onConflict: [ :ex | ex allow ];" load ] ensure: [ EpMonitor current enable ]. ] fork. 20 | ``` N.B. you only have to do the outer fork if on GT and you want the UI to stay responsive during the load. # Disclaimer 21 | 22 | This project is part of a ~20 year (as of 2021) exploration of the [Dynabook](https://github.com/seandenigris/Dynabook) idea (a la Alan Kay). It's intensely personal and opinionated and I've open sourced it due to repeated requests. Use at your own risk. Any part may change at any time. I'm happy to give support when I have time in the form of explanations, but do not expect me to implement any particular feature, or even accept PRs if they don't feel right. That said, I'm happy to have anyone along on the journey :) 23 | # License Explanation 24 | The license is MIT. However, my original intent was to release my Dynabook libraries under a copy far left license (free use for cooperatives, but negotiated licenses for those utilizing paid labor for profit). I love sharing any work I do, but am disgusted by the prospect that (especially multi-billion-dollar) corporations will exploit my work for free, especially toward ends with which I don't philosophically agree. However, after many discussions with colleagues, it appears that at this moment there is just no way to protect one's work from parasites without effectively keeping it from everyone. Even GPL, which doesn't even come close to "solving" the problem stated above, seems enough to put off most people. In closing, now that my intentions are clear, I request the following from any entity utilizing wage labor or selling for profit who uses my work: 25 | 1. Attribution 26 | 2. Pay for what you use, or don't use it 27 | 28 | While there may be no legal means for me to enforce the above given that this code is released under MIT, my intentions should be clear; violate the above at risk to your own conscience. -------------------------------------------------------------------------------- /src/BaselineOfDynabook/BaselineOfDynabook.class.st: -------------------------------------------------------------------------------- 1 | " 2 | Alan Kay's Dynabook [2] dream is often explored from the perspective of creating such a system. But what would/could a Dynabook look like after actually being lived in for a long period. What sorts of tools and services would appear? How would they interact? 3 | 4 | You can start by exploring my core components (start with the class comments of the BaslineOfXyzs): 5 | ```smalltalk 6 | BaselineOfDynabook coreBaselines 7 | ``` 8 | ## What is a Dynabook? 9 | Buckle your seatbelt. Here's an excerpt from my longer blog post [""Programmers: You Probably Don’t Know What a Computer Is""](http://seandenigris.com/blog/?p=1092), about Smalltalk, the environment powering this system: 10 | 11 | You may not realize it, but you have opened a portal to some of the greatest minds in the history of our industry. In the beginning, for many of our heroes — Doug Engelbart, Alan Kay, Seymour Papert — computing was about the possibility of evolving the general level of human thought for the benefit of mankind. Effective critical thinking is vital to modern life e.g. the proper functioning of democratic governments. Yet traditional media have been ineffective at improving our thought on a large scale. Today, we’re mostly glorified “caveman with briefcases”, reacting to the same human universals as our distant ancestors — Fantasies, Stories, Superstition, Religion/Magic, Vendetta. 12 | 13 | So what does this have to do with computing?! 14 | 15 | I’m glad you asked :) In 1972, Alan Kay envisioned a “dynamic medium for creative thought” which he called a Dynabook [1]. It was an answer to the problem described above — a computer to support and guide minds to the level required to overcome our uglier instincts, and replace them with our highest ideas, like Equal Rights, Democracy, Slow Deep Thinking, Legal System over Vendetta, Theory of Harmony — ideas which do not take seed on their own, but must be actively nurtured. 16 | 17 | So what does this have to do with programming?! 18 | 19 | I’m glad you asked that, too :) Smalltalk is interim [2] Dynabook software! You have in your hands, not a programming language, but a live, dynamic, turtles-all-the-way-down environment designed to provide “support for the creative spirit in everyone”. 20 | 21 | More practically, Smalltalk is a programming tool that allows productivity unimaginable in most systems. And, if you put in enough time and effort to actually think in it, it will help you program better in any language you use. But, I think it would be a great waste if you left Smalltalk “a better programmer”, when the questions before you are: 22 | 23 | - What really matters? 24 | - How can computers fulfill on that? 25 | - How can I, as a programmer, contribute to that? 26 | 27 | From PARC's 1977 paper [1]: 28 | The Learning Research Group... is concerned with all aspects of the communication and manipulation of knowledge. We design, build, and use dynamic media which can be used by human beings of all ages. Several years ago, we crystallized our dreams into a design idea for a personal dynamic medium the size of a notebook (the Dynabook) which could be owned by everyone and could have the power to handle virtually all of its owner's information-related needs. Towards this goal we have designed and built a communications system: the Smalltalk language, implemented on small computers we refer to as ""interim Dynabooks."" We are exploring the use of this system as a programming and problem solving tool; as an interactive memory for the storage and manipulation of data; as a text editor; and as a medium for expression through drawing, painting, animating pictures, and composing and generating music. 29 | # Components 30 | The following projects are the core components: 31 | 32 | - [FIT Protocol](https://github.com/seandenigris/FIT-Protocol-4-GToolkit) - Read, analyze and visualize Garmin's Flexible and Interoperable Data Transfer (FIT) protocol](https://developer.garmin.com/fit/overview/). Runs on [the amazing GToolkit platform](https://gtoolkit.com) 33 | - [Bookmark Magic](https://github.com/SeanDeNigris/Bookmark-Magic) - URL bookmarking in a live, dynamic world. 34 | - [Ukulele](https://github.com/seandenigris/Ukulele-Pharo) - TLDR: A companion in learning and playing, in a live system of supporting objects e.g. media library, bookmarking, contact management (e.g. for teachers and peers). Currently manages things related to playing e.g. songs, lessons, tabs. 35 | - [The Project Project](https://github.com/SeanDeNigris/The-Project-Project) - Project Management unleashed from an ""application"" stovepipe, running on GToolkit (Smalltalk) 36 | - [Tracking Numbers](https://github.com/seandenigris/Tracking-ST) - Tracking numbers, unleashed from an application stovepipe, on GToolkit (Smalltalk) 37 | - [Flashcards St](https://github.com/seandenigris/Flashcards-St) - Unleash flashcards from simple text on ""front"" and ""back"". Any object can be `material` for multiple cards (or card types) 38 | - [Ideas](https://github.com/SeanDeNigris/ideas) - KMS mind-map interface powered by @feenkcom's #GToolkit. Features `concepts` (like dictionary terms), `compound concepts` - concepts made up of other concepts, `ideas` (like dictionary definitions) connect concepts in an interesting/value-added way 39 | - [Superuser](https://github.com/seandenigris/Superuser) - An attemple to make Unix commands more sane. 40 | - [Nature](https://github.com/seandenigris/Nature) - A naturalist's companion, focused on identifying and logging plant and mushrooms. 41 | - [Broadcastify](https://github.com/seandenigris/Broadcastify-Alive) - [Broadcastify](https://www.broadcastify.com) OO client model for Glamorous Toolkit 42 | - [Small World](https://github.com/seandenigris/SmallWorld) - Project catalog akin to Squeak Map. The idea is that, with one click, you can load your favorite projects in the best way for that particular image (dialect, version, etc.) in that context (development, deployment, etc.). Right now I've just been using it myself for a few years. 43 | - [Computer World](https://github.com/seandenigris/Computer-World) - Bring to life computing objects like applications, servers, etc. 44 | - [My People](https://github.com/SeanDeNigris/My-People) - Address Book service, minus the usual application stovepipe, running on GT (Smalltalk) 45 | - [Quote Me](https://github.com/SeanDeNigris/Quote-Me) - Quotation DB freed from an ""application"" stovepipe, in GToolkit (Smalltalk) 46 | - [Resources Live](https://github.com/seandenigris/Resources-Live) - Free users to communicate with *objects* instead of managing *files*. Files conflate *what* a thing is with *where* it is. We take care of the boring location part for you. So you can ""play an mp3"" instead of ""opening an mp3 file in a player app"". Nicer, no? 47 | - [Baby Sign Language](https://github.com/SeanDeNigris/Baby-Sign-Language) 48 | - [Virtual Stash](https://github.com/SeanDeNigris/Virtual-Stash) - Picture GnuCash, minus the application stovepipe, running on GToolkit (Smalltalk) 49 | - [Living Library](https://github.com/SeanDeNigris/Living-Library) - A reimagination of what a library can be once freed from a being a physical building housing (only) physical items 50 | # Icon Attribution 51 | Our GTooklit Home Section uses the following icons from [Noun Project](https://thenounproject.com/browse/icons/term/inventory/): 52 | - Financial Advice Book by Juicy Fish 53 | - Database by Larea 54 | - Library Book by Kmg Design 55 | - Project by WEBTECHOPS LLP 56 | - File by Gilang Kampus 57 | - Bridge by Wan Ikhsan 58 | - inventory by Eucalyp 59 | - Computer Network by Vectors Market 60 | ## References 61 | 1. [""Personal Dynamic Media""](https://www.computer.org/csdl/magazine/co/1977/03/01646405/13rRUxZRbs8) 62 | 2. [Smalltalk: Design Principles Behind Smalltalk](http://www.cs.virginia.edu/~evans/cs655/readings/smalltalk.html) 63 | " 64 | Class { 65 | #name : #BaselineOfDynabook, 66 | #superclass : #BaselineOf, 67 | #category : #BaselineOfDynabook 68 | } 69 | 70 | { #category : #accessing } 71 | BaselineOfDynabook class >> componentSectionString [ 72 | 73 | | componentList template | 74 | 75 | template := '# Components 76 | The following projects are the core components: 77 | {componentList}'. 78 | 79 | componentList := String streamContents: [ :str | 80 | self coreProjects 81 | do: [ :p | 82 | str << '- [' << p name << '](' << p repository url asString << ')'. 83 | p description ifNotEmpty: [ :d | str << ' - ' << d ] ] 84 | separatedBy: [ str lf ] ]. 85 | 86 | ^ template format: { 87 | #componentList -> componentList } asDictionary. 88 | ] 89 | 90 | { #category : #accessing } 91 | BaselineOfDynabook class >> coreBaselines [ 92 | | classesForVersion projects | 93 | classesForVersion := [ :v | 94 | v projects 95 | select: [ :e | Smalltalk hasClassNamed: e className ] 96 | thenCollect: [ :e | e className asClass ] ]. 97 | projects := Set new. 98 | self project version 99 | withDeep: [ :each | each projects collect: #version ] 100 | relationDo: [ :a :b | 101 | projects 102 | addAll: (classesForVersion value: a); 103 | addAll: (classesForVersion value: b) ]. 104 | ^ projects select: #isDynabook 105 | ] 106 | 107 | { #category : #accessing } 108 | BaselineOfDynabook class >> coreProjects [ 109 | ^ self coreBaselines collect: [ :bl | SmallProjectRegistry uniqueInstance detectForBaseline: bl ] 110 | ] 111 | 112 | { #category : #configuration } 113 | BaselineOfDynabook class >> dataFolder [ 114 | ^ FileLocator dynabookData / 'Dynabook' 115 | ] 116 | 117 | { #category : #utilites } 118 | BaselineOfDynabook class >> fuelPreLoad [ 119 | "Needed for Fuel 5.1.0 to load cleanly (at least on GT)" 120 | 121 | | fuelPackages fuelVersion | 122 | 123 | fuelVersion := FLVersion current. 124 | (fuelVersion major >= 5 and: [ fuelVersion minor >= 2 and: [ fuelVersion patch >= 2 ] ]) ifTrue: [ ^ self ]. 125 | 126 | fuelPackages := RPackage organizer packages 127 | select: [ :e | e name beginsWith: 'Fuel-' ]. 128 | fuelPackages do: #removeFromSystem 129 | ] 130 | 131 | { #category : #utilites } 132 | BaselineOfDynabook class >> lepiterReloadLogicalDBFromPropertiesFile: aFileReference [ 133 | 134 | | props | 135 | props := LeLogicalDatabaseProperties 136 | forPropertiesFile: aFileReference 137 | ifAbsentUse: []. 138 | 139 | LeDatabasesRegistry defaultLogicalDatabase 140 | properties: props; 141 | reload. 142 | ] 143 | 144 | { #category : #utilites } 145 | BaselineOfDynabook class >> pipEnvPostLoad [ 146 | 147 | PBApplication cwInstallAllModules. 148 | BaselineOfLivingLibrary pipEnvPostLoad. 149 | ] 150 | 151 | { #category : #baseline } 152 | BaselineOfDynabook >> baseline: spec [ 153 | 154 | 155 | spec for: #'common' do: [ 156 | spec 157 | baseline: #'BabySignLanguage' with: [ 158 | spec repository: 'github://seandenigris/Baby-Sign-Language' ]; 159 | baseline: #'Broadcastify' with: [ 160 | spec repository: 'github://seandenigris/Broadcastify-Alive' ]; 161 | baseline: #'ClickUp' with: [ 162 | spec repository: 'github://seandenigris/ClickUp-St' ]; 163 | baseline: #'ComputerWorld' with: [ 164 | spec repository: 'github://seandenigris/Computer-World' ]; 165 | baseline: #'DynabookFoundation' with: [ 166 | spec repository: 'github://seandenigris/Dynabook-Foundation' ]; 167 | baseline: #'FITProtocol' with: [ 168 | spec repository: 'github://seandenigris/FITProtocol4GToolkit' ]; 169 | baseline: #'FlashcardsSt' with: [ 170 | spec repository: 'github://seandenigris/Flashcards' ]; 171 | baseline: #'Ideas' with: [ 172 | spec repository: 'github://seandenigris/ideas' ]; 173 | baseline: #'Jokes' with: [ 174 | spec repository: 'github://seandenigris/Jokes' ]; 175 | baseline: #'LivingLibrary' with: [ 176 | spec repository: 'github://seandenigris/Living-Library' ]; 177 | baseline: #'MSAL' with: [ 178 | spec repository: 'github://seandenigris/MSAL-Smalltalk' ]; 179 | baseline: #'MyPeople' with: [ 180 | spec repository: 'github://SeanDeNigris/My-People' ]; 181 | baseline: #'Nature' with: [ 182 | spec repository: 'github://seandenigris/Nature' ]; 183 | baseline: #'PharoEnhancements' with: [ 184 | spec repository: 'github://seandenigris/Pharo-Enhancements' ]; 185 | baseline: #'ResourcesLive' with: [ 186 | spec repository: 'github://seandenigris/Resources-Live' ]; 187 | baseline: #'SimplePersistence' with: [ 188 | spec repository: 'github://seandenigris/Simple-Persistence' ]; 189 | baseline: #'SmallWorld' with: [ 190 | spec repository: 'github://seandenigris/SmallWorld' ]; 191 | baseline: #'TheProjectProject' with: [ 192 | spec repository: 'github://seandenigris/The-Project-Project' ]; 193 | baseline: #'Ukulele' with: [ 194 | spec repository: 'github://seandenigris/Ukulele-Pharo' ]; 195 | baseline: #'VirtualStash' with: [ 196 | spec repository: 'github://seandenigris/Virtual-Stash' ]. 197 | spec 198 | postLoadDoIt: #postLoad; 199 | package: #'Dynabook-Core' with: [ spec requires: #(ComputerWorld DynabookFoundation Jokes LivingLibrary MSAL MyPeople TheProjectProject ResourcesLive) ]; 200 | package: #'Dynabook-Persistence' with: [ spec requires: #(#'Dynabook-Core' SimplePersistence) ] ]. 201 | 202 | spec for: #GToolkit do: [ 203 | spec 204 | baseline: #ObjectiveLepiter with: [ 205 | spec repository: 'github://seandenigris/Objective-Lepiter' ]. 206 | spec 207 | postLoadDoIt: #gtPostLoad; 208 | package: #'Dynabook-GToolkit' with: [ spec requires: #(ObjectiveLepiter PharoEnhancements) ] ] 209 | ] 210 | 211 | { #category : #accessing } 212 | BaselineOfDynabook >> customProjectAttributes [ 213 | ^ self isGTImage 214 | ifFalse: [ #(notGToolkit) ] 215 | ifTrue: [ #(GToolkit) ] 216 | ] 217 | 218 | { #category : #accessing } 219 | BaselineOfDynabook >> gtPostLoad [ 220 | 221 | self postLoad. 222 | 223 | self olReferenceBuilderMap keysAndValuesDo: [ :aClass :aBlock | 224 | OlObjectPageType 225 | modelReferenceForClass: aClass 226 | builder: aBlock ]. 227 | 228 | QuLeSources providers: { 229 | 230 | DbObjectUIDReference new 231 | sourceClass: LlLibrary; 232 | yourself. 233 | 234 | DbObjectUIDReference new 235 | sourceClass: LlWorkplace; 236 | yourself. 237 | 238 | PpEventUIDReference new 239 | sourceClass: PpEventLog; 240 | yourself. 241 | 242 | QuSnippetSource new. 243 | } asOrderedCollection. 244 | ] 245 | 246 | { #category : #testing } 247 | BaselineOfDynabook >> isGTImage [ 248 | 249 | ^ RPackageOrganizer default packageNames anySatisfy: [ :pn | pn beginsWith: 'Lepiter-' ]. 250 | "Implementation note: used to check for GToolkit prefix, but P7 has a GToolkit-Examples package. Lepiter, OTOH, could only be loaded in a GT image" 251 | ] 252 | 253 | { #category : #accessing } 254 | BaselineOfDynabook >> olReferenceBuilderMap [ 255 | 256 | ^ Dictionary new 257 | at: CwSoftware put: [ 258 | DbObjectUIDReference new 259 | sourceClass: CwSoftwareCatalog; 260 | yourself ]; 261 | at: LlAuthoredWork put: [ 262 | DbObjectUIDReference new 263 | sourceClass: LlLibrary; 264 | yourself ]; 265 | at: LlLibraryItem put: [ 266 | DbObjectUIDReference new 267 | sourceClass: LlLibrary; 268 | collectionGetter: #copies; 269 | yourself ]; 270 | at: LlWorkplaceComment put: [ 271 | DbObjectUIDReference new 272 | sourceClass: LlWorkplace; 273 | yourself ]; 274 | at: MpRelatableEntity put: [ 275 | DbObjectUIDReference new 276 | sourceClass: MpAddressBook; 277 | yourself ]; 278 | at: PpEvent put: [ 279 | PpEventUIDReference new 280 | sourceClass: PpEventLog; 281 | yourself ]; 282 | at: PpInventoryItem put: [ 283 | DbObjectUIDReference new 284 | sourceClass: PpInventory; 285 | yourself ]; 286 | at: PpLocation put: [ 287 | DbObjectUIDReference new 288 | sourceClass: PpLocationList; 289 | yourself ]; 290 | at: PpValue put: [ 291 | DbObjectUIDReference new 292 | sourceClass: PpProjectList; 293 | yourself ]; 294 | at: RlResource put: [ 295 | DbObjectUIDReference new 296 | sourceClass: RlResourceLibrary; 297 | yourself ]; 298 | at: SmallProject put: [ 299 | DbObjectUIDReference new 300 | sourceClass: SmallProjectRegistry; 301 | yourself ]; 302 | at: VsPrice put: [ 303 | DbObjectUIDReference new 304 | sourceClass: VsPriceList; 305 | yourself ]; 306 | yourself 307 | ] 308 | 309 | { #category : #accessing } 310 | BaselineOfDynabook >> postLoad [ 311 | 312 | self olReferenceBuilderMap do: [ :aBlock | 313 | DbSoup uniqueInstance sources add: aBlock value ]. 314 | ] 315 | --------------------------------------------------------------------------------