diff --git a/repository/Brea/BreaDataSource.class.st b/repository/Brea/BreaDataSource.class.st deleted file mode 100644 index 1de0c35..0000000 --- a/repository/Brea/BreaDataSource.class.st +++ /dev/null @@ -1,31 +0,0 @@ -Class { - #name : #BreaDataSource, - #superclass : #Object, - #instVars : [ - 'source', - 'queries' - ], - #category : #Brea -} - -{ #category : #accessing } -BreaDataSource >> queries [ - ^ queries -] - -{ #category : #accessing } -BreaDataSource >> queries: anObject [ - queries := anObject -] - -{ #category : #accessing } -BreaDataSource >> source [ - ^ source -] - -{ #category : #accessing } -BreaDataSource >> source: aDictionary [ - "Key, value pair in aDictionary contain a short name and a url pointing to a local or a remote - resource. If is local a FileLocator should be provided." - source := aDictionary -] diff --git a/repository/Brea/BreaMember.class.st b/repository/Brea/BreaMember.class.st deleted file mode 100644 index 07e8c98..0000000 --- a/repository/Brea/BreaMember.class.st +++ /dev/null @@ -1,489 +0,0 @@ -" -I model a member of a Brea site, usually a human. -" -Class { - #name : #BreaMember, - #superclass : #Object, - #instVars : [ - 'givenName', - 'familyName', - 'picture', - 'country', - 'tags', - 'email', - 'password', - 'webPresence', - 'organizations' - ], - #category : #Brea -} - -{ #category : #converting } -BreaMember >> asStonModified [ - "asSton is generated a core dumped now. This renaming is trying to solve that. Maybe - in the offical release it will be solved" - ^ STON toStringPretty: self -] - -{ #category : #accessing } -BreaMember >> country [ - ^ country -] - -{ #category : #accessing } -BreaMember >> country: anObject [ - country := anObject -] - -{ #category : #public } -BreaMember >> countryTemplate [ - ^ '{{#country}} - - Country - {{.}} - - {{/country}}' asMustacheTemplate value: self -] - -{ #category : #helpers } -BreaMember >> createTestUser [ - ^ self class new - givenName: 'Test'; - familyName: 'User'; - country: 'Neverland'; - memberOf: 'HackBo' withWebsite: 'http://hackbo.co/'; - memberOf: 'mutabiT' withWebsite: 'http://mutabit.com/'; - website: 'http://test.user'; - twitter: '@offrayLC'; - email: 'iam@test.user'; - tags: 'just, a lot, of words, separated, by commas'. -] - -{ #category : #accessing } -BreaMember >> email [ - ^ email -] - -{ #category : #accessing } -BreaMember >> email: anEmailAddress [ - email := (SHA1 new hashMessage: anEmailAddress) hex -] - -{ #category : #accessing } -BreaMember >> facebook [ - ^ self webPresence facebook. -] - -{ #category : #accessing } -BreaMember >> facebook: aProfileName [ - aProfileName = '' - ifTrue: [ self webPresence facebook: nil ] - ifFalse: [ self webPresence facebook: aProfileName ] -] - -{ #category : #public } -BreaMember >> facebookTemplate [ - ^ '{{#facebook}} - - - Facebook - - - {{.}} - - {{/facebook}}' asMustacheTemplate value: self -] - -{ #category : #accessing } -BreaMember >> familyName [ - ^ familyName -] - -{ #category : #accessing } -BreaMember >> familyName: anObject [ - familyName := anObject -] - -{ #category : #helpers } -BreaMember >> fullName [ - ^ self givenName asLowercase, '-', self familyName asLowercase -] - -{ #category : #accessing } -BreaMember >> getGenericProfilePicture [ - "Other considered avatars where: - 'https://upload.wikimedia.org/wikipedia/commons/1/1e/Default-avatar.jpg'" - self picture: 'https://www.jamf.com/jamf-nation/img/default-avatars/generic-user.png'. - ^ picture -] - -{ #category : #accessing } -BreaMember >> givenName [ - ^ givenName -] - -{ #category : #accessing } -BreaMember >> givenName: anObject [ - givenName := anObject -] - -{ #category : #public } -BreaMember >> head [ - ^ '', self headMeta, self headTitle, self headStyles,'' -] - -{ #category : #utility } -BreaMember >> headMeta [ - ^ ' - - - ' -] - -{ #category : #utility } -BreaMember >> headStyles [ - ^ ' - - - - - - ' -] - -{ #category : #utility } -BreaMember >> headTitle [ - ^ self headTitled: 'GIG: Network' -] - -{ #category : #utility } -BreaMember >> headTitled: aString [ - ^ '', aString ,'' -] - -{ #category : #public } -BreaMember >> html [ - "I show the member profile as HTML" - ^ self head, self htmlOutput -] - -{ #category : #public } -BreaMember >> htmlInput [ - "I capture data in a HTML Form and use it to create a new BreaMember" - ^ ' - - - - - - - - Add Member | GIG Network - - - - - - -
-
- -
-
-
-
-
-

Add new member

-
-
-

- Fill out the form. - The fields preceded by [*] are obligatory. -

-
-
- - - Letters and spaces only -
-
- - - Letters and spaces only -

-
- - -
-
- - - Letters and spaces only -

-
- - - Letters and spaces only -

-
- - -
-
- - -

-
- - -
-
- - -

-
- - -
-

- -

-
-
-
-
- -
-
- - - -' -] - -{ #category : #public } -BreaMember >> htmlOutput [ - - ^ self htmlOutputTemplate asMustacheTemplate value: self -] - -{ #category : #public } -BreaMember >> htmlOutputTemplate [ - "I show the member profile as HTML" - ^ '
-
-
-

{{givenName}} {{familyName}}

-
-
- -
-
- - - - - - ', - self countryTemplate, - self organizationsTemplate, - self websiteTemplate, - self twitterTemplate, - self facebookTemplate, - self tagsTemplate, - ' - -
Name{{givenName}} {{familyName}}
-
-
- Read more -
-
-
- ' -] - -{ #category : #accessing } -BreaMember >> instagram [ - ^ self webPresence instagram. -] - -{ #category : #accessing } -BreaMember >> instagram: aProfileName [ - self webPresence instagram: aProfileName -] - -{ #category : #accessing } -BreaMember >> memberOf: anOrgName [ - self organizations add: - (BreaOrganization new name: anOrgName) -] - -{ #category : #accessing } -BreaMember >> memberOf: anOrgName withWebsite: aUrl [ - self organizations add: - (BreaOrganization new - name: anOrgName; - website: aUrl) -] - -{ #category : #accessing } -BreaMember >> organizations [ - ^ organizations ifNil: [ organizations := OrderedCollection new ] -] - -{ #category : #accessing } -BreaMember >> organizations: anOrgListOrName [ - anOrgListOrName splitOn: ',' do: [ :each | self memberOf: each ] -] - -{ #category : #public } -BreaMember >> organizationsTemplate [ - ^ ' - - Organization(s) - - {{#organizations}} - {{name}} - {{/organizations}} - - ' asMustacheTemplate value: self -] - -{ #category : #accessing } -BreaMember >> password [ - ^ password -] - -{ #category : #accessing } -BreaMember >> password: anObject [ - password := anObject -] - -{ #category : #accessing } -BreaMember >> picture [ - ^ picture ifNil: [ ^ self getGenericProfilePicture ] -] - -{ #category : #accessing } -BreaMember >> picture: anImageFilePath [ - picture := anImageFilePath -] - -{ #category : #helpers } -BreaMember >> renderTestUserAsHtml [ - ^ self class new createTestUser html -] - -{ #category : #'server handling' } -BreaMember >> storeInto: aFileDirectory [ - | folder file | - folder := (aFileDirectory asFileReference / self fullName) ensureCreateDirectory. - file := (folder / 'info.ston') ensureCreateFile. - file writeStreamDo: [:stream | - (STON writer on: stream) - newLine: String crlf; - prettyPrint: true; - nextPut: self] -] - -{ #category : #accessing } -BreaMember >> tags [ - ^ tags -] - -{ #category : #accessing } -BreaMember >> tags: anObject [ - tags := anObject -] - -{ #category : #public } -BreaMember >> tagsTemplate [ - ^ '{{#tags}} - - - Tags
- {{.}} - - - {{/tags}}' asMustacheTemplate value: self -] - -{ #category : #accessing } -BreaMember >> twitter [ - ^ self webPresence twitter. -] - -{ #category : #accessing } -BreaMember >> twitter: aProfileName [ - aProfileName = '' - ifTrue: [ self webPresence twitter: nil ] - ifFalse: [ self webPresence twitter: aProfileName ] -] - -{ #category : #public } -BreaMember >> twitterTemplate [ - ^ '{{#twitter}} - - - Twitter - - - {{.}} - - {{/twitter}}' asMustacheTemplate value: self -] - -{ #category : #accessing } -BreaMember >> webPresence [ - ^ webPresence ifNil: [ webPresence := BreaWebPresence new ] -] - -{ #category : #accessing } -BreaMember >> webPresence: anObject [ - webPresence := anObject -] - -{ #category : #accessing } -BreaMember >> website [ - ^ self webPresence website. -] - -{ #category : #accessing } -BreaMember >> website: anUrl [ - self webPresence website: anUrl -] - -{ #category : #public } -BreaMember >> websiteTemplate [ - ^ '{{#website}} - - Website - - {{.}} - - {{/website}}' asMustacheTemplate value: self -] diff --git a/repository/Brea/BreaMemberTest.class.st b/repository/Brea/BreaMemberTest.class.st deleted file mode 100644 index 162a3c5..0000000 --- a/repository/Brea/BreaMemberTest.class.st +++ /dev/null @@ -1,8 +0,0 @@ -" -A BreaMemberTest is a test class for testing the behavior of BreaMember -" -Class { - #name : #BreaMemberTest, - #superclass : #TestCase, - #category : #'Brea-Tests' -} diff --git a/repository/Brea/BreaOrganization.class.st b/repository/Brea/BreaOrganization.class.st deleted file mode 100644 index 7142be6..0000000 --- a/repository/Brea/BreaOrganization.class.st +++ /dev/null @@ -1,32 +0,0 @@ -" -I store the places a BreaMember is affiliated to. -" -Class { - #name : #BreaOrganization, - #superclass : #Object, - #instVars : [ - 'name', - 'website' - ], - #category : #Brea -} - -{ #category : #accessing } -BreaOrganization >> name [ - ^ name -] - -{ #category : #accessing } -BreaOrganization >> name: anObject [ - name := anObject -] - -{ #category : #accessing } -BreaOrganization >> website [ - ^ website -] - -{ #category : #accessing } -BreaOrganization >> website: anObject [ - website := anObject -] diff --git a/repository/Brea/BreaPage.class.st b/repository/Brea/BreaPage.class.st index 9591c77..a1ab14e 100644 --- a/repository/Brea/BreaPage.class.st +++ b/repository/Brea/BreaPage.class.st @@ -76,10 +76,13 @@ BreaPage >> exportAsHTML [ | htmlContents allActions actionsArray semaphore result | self shortName ifNil: [ ^ self ]. self template ifNil: [ ^ self ]. - actionsArray := { [ self populateMetadata ] future. [ self split ] future. }. - self bodyTag ifNotNil: [ actionsArray := actionsArray copyWith: [ self populateBodyAs: self bodyTag ] future ]. + actionsArray := { [ self populateMetadata ] future. }. + self splitters ifNotEmpty: [ actionsArray := actionsArray copyWith: [ [ self split ] future ] ]. + self bodyTag ifNotNil: [ + actionsArray := actionsArray copyWith: [ self populateBodyAs: self bodyTag ] future ]. allActions := TKTFuture all: actionsArray. semaphore := Semaphore new. + "self halt." allActions onSuccessDo: [ :values | result := values last. semaphore signal. @@ -119,7 +122,7 @@ BreaPage >> htmlContents [ { #category : #accessing } BreaPage >> metadata [ - ^ metadata + ^ metadata ifNil: [ self contentsFile metadata ] ] { #category : #accessing } @@ -132,7 +135,7 @@ BreaPage >> metadata: aDictionary [ { #category : #'as yet unclassified' } BreaPage >> populateBodyAs: key [ | allActions result semaphore | - "(self file isMarkdown and: [ self bodyTag isNil ]) ifTrue: [ ^ self ]". + allActions := TKTFuture all: { [ self bodyContentsAsHTML ] future. }. @@ -176,6 +179,7 @@ BreaPage >> shortName: aString [ { #category : #'as yet unclassified' } BreaPage >> split [ + self splitters ifEmpty: [ ^ self ]. self splitters keysAndValuesDo: [ :key :value | self split: key with: value ]. ] diff --git a/repository/Brea/BreaTemplate.class.st b/repository/Brea/BreaTemplate.class.st deleted file mode 100644 index f23e4f9..0000000 --- a/repository/Brea/BreaTemplate.class.st +++ /dev/null @@ -1,89 +0,0 @@ -" -I define a [Mustache][1] template and how it is used to create -derivate output files combining it with particular data sources. - -[1]: https://mustache.github.io/ -" -Class { - #name : #BreaTemplate, - #superclass : #Object, - #instVars : [ - 'template', - 'data', - 'location', - 'queries', - 'outputs' - ], - #category : #Brea -} - -{ #category : #adding } -BreaTemplate >> addDataSourceNamed: name with: source [ - self - data at: name put: source. - self data. -] - -{ #category : #accessing } -BreaTemplate >> data [ - ^ data ifNil: [ data := Dictionary new ] -] - -{ #category : #accessing } -BreaTemplate >> data: aDictionary [ - "Each item in the dictionary is a unique alias (as key) and a data location (as value), - usually on the web. - Alias and locations are used later to define data queries to feed into templates." - data := aDictionary -] - -{ #category : #accessing } -BreaTemplate >> location [ - ^ location -] - -{ #category : #accessing } -BreaTemplate >> location: aFolderPath [ - "This is the place where a template and its derivate files are located. - A shared location is an easy approach to start with and creates more explicit - relation between derived files and templates. - Eventually some re-mapping or re-routing could be used so templates and their outputs - could be further apart." - location := aFolderPath -] - -{ #category : #accessing } -BreaTemplate >> outputs [ - ^ outputs -] - -{ #category : #accessing } -BreaTemplate >> outputs: fileNamesList [ - "fileNamesList contain the files which are derived from the template." - outputs := fileNamesList -] - -{ #category : #accessing } -BreaTemplate >> queries [ - ^ queries ifNil: [ queries := Dictionary new ] -] - -{ #category : #accessing } -BreaTemplate >> queries: aDictionary [ - "aDictionary contains the alias for the query as key and a block that will be executed - on a particular data source, as value." - queries := aDictionary -] - -{ #category : #accessing } -BreaTemplate >> template [ - ^ template -] - -{ #category : #accessing } -BreaTemplate >> template: aFileName [ - "I provide the name of the mustache base template. - The file can have any name, but by convention they end in '.mus.html' 'mus.md' and - so on." - template := aFileName -] diff --git a/repository/Brea/BreaWebPresence.class.st b/repository/Brea/BreaWebPresence.class.st deleted file mode 100644 index 815a62c..0000000 --- a/repository/Brea/BreaWebPresence.class.st +++ /dev/null @@ -1,54 +0,0 @@ -" -I store the common forms of web presence a BreaMember can have online. -" -Class { - #name : #BreaWebPresence, - #superclass : #Object, - #instVars : [ - 'website', - 'twitter', - 'facebook', - 'instagram' - ], - #category : #Brea -} - -{ #category : #accessing } -BreaWebPresence >> facebook [ - ^ facebook -] - -{ #category : #accessing } -BreaWebPresence >> facebook: anObject [ - facebook := anObject -] - -{ #category : #accessing } -BreaWebPresence >> instagram [ - ^ instagram -] - -{ #category : #accessing } -BreaWebPresence >> instagram: anObject [ - instagram := anObject -] - -{ #category : #accessing } -BreaWebPresence >> twitter [ - ^ twitter -] - -{ #category : #accessing } -BreaWebPresence >> twitter: anObject [ - twitter := anObject -] - -{ #category : #accessing } -BreaWebPresence >> website [ - ^ website -] - -{ #category : #accessing } -BreaWebPresence >> website: anObject [ - website := anObject -] diff --git a/repository/Brea/BreaWebsite.class.st b/repository/Brea/BreaWebsite.class.st deleted file mode 100644 index fa187c2..0000000 --- a/repository/Brea/BreaWebsite.class.st +++ /dev/null @@ -1,292 +0,0 @@ -" -I model the fossil repository where public data is stored for the -building of this web site. -" -Class { - #name : #BreaWebsite, - #superclass : #Object, - #instVars : [ - 'fossilRepo', - 'server', - 'template', - 'title' - ], - #category : #Brea -} - -{ #category : #utility } -BreaWebsite class >> availableTemplates [ - self templates keys. -] - -{ #category : #utility } -BreaWebsite class >> demoFolder [ - ^ FileLocator temp asFileReference / 'BreaDemo'. -] - -{ #category : #example } -BreaWebsite class >> example [ - "I run an example mockup of a website using Brea. - After runing me, go to: - - http://localhost:8080/demo - - http://localhost:8080/members/test - - http://localhost:8080/members/add " - self new - local: FileLocator temp asFileReference / 'BreaDemo'; - template: 'portafolio'; - downloadTemplate; - modifyTemplate; - start -] - -{ #category : #example } -BreaWebsite class >> exampleDashboard [ - "I run an example mockup of a website using Brea. - After runing me, go to: http://localhost:8080/demo " - self new - local: FileLocator temp asFileReference / 'BreaDemo'; - template: 'dashboard'; - downloadTemplate; - modifyTemplate; - start -] - -{ #category : #'server handling' } -BreaWebsite class >> stopAll [ - "I stop the server" - Teapot stopAll -] - -{ #category : #utility } -BreaWebsite class >> templates [ - "I provide the supported MDL templates taken from: https://getmdl.io/templates/" - ^ Dictionary new - at: 'portafolio' put: 'https://code.getmdl.io/1.3.0/mdl-template-portfolio.zip'; - at: 'dashboard' put: 'https://code.getmdl.io/1.3.0/mdl-template-dashboard.zip'; - yourself. -] - -{ #category : #utility } -BreaWebsite >> defaultTemplate [ - self template - ifNil: [ - self template: 'portafolio' ]. - ^ self template. -] - -{ #category : #utility } -BreaWebsite >> downloadDefaultTemplate [ - self downloadTemplateNamed: self defaultTemplate Into: self local. -] - -{ #category : #utility } -BreaWebsite >> downloadDefaultTemplateInto: aDirectory [ - | remoteUrl templatesFile | - aDirectory ensureDeleteAll. - aDirectory ensureCreateDirectory. - remoteUrl := self class templates at: self template. - GrafoscopioUtils - downloadingFrom: remoteUrl - withMessage: 'Downloading templates' - into: FileLocator temp asFileReference. - templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last. - ZipArchive new - readFrom: templatesFile; - extractAllTo: aDirectory -] - -{ #category : #utility } -BreaWebsite >> downloadTemplate [ - self downloadTemplateNamed: self template Into: self local. -] - -{ #category : #utility } -BreaWebsite >> downloadTemplateNamed: aName Into: aDirectory [ - "aName: String aDirectory: aFileLocation" - | remoteUrl templatesFile localDirectory | - localDirectory := aDirectory asFileReference. - localDirectory ensureDeleteAll. - localDirectory ensureCreateDirectory. - remoteUrl := self class templates at: aName. - GrafoscopioUtils - downloadingFrom: remoteUrl - withMessage: 'Downloading templates' - into: FileLocator temp asFileReference. - templatesFile := FileLocator temp asFileReference / (remoteUrl splitOn: '/') last. - ZipArchive new - readFrom: templatesFile; - extractAllTo: localDirectory -] - -{ #category : #accessing } -BreaWebsite >> fossilRepo [ - ^ fossilRepo ifNil: [ fossilRepo := FossilRepo new ] -] - -{ #category : #accessing } -BreaWebsite >> fossilRepo: aFossilRepo [ - fossilRepo := aFossilRepo -] - -{ #category : #utility } -BreaWebsite >> local [ - ^ self fossilRepo local -] - -{ #category : #'server handling' } -BreaWebsite >> local: aFilePath [ - "I define the local storage of the Fossil repository. - For the moment aFilePath must be an absolute " - | localSite | - aFilePath asFileReference exists - ifFalse: [ - localSite := (FileLocator temp / 'breaSite') ensureCreateDirectory. - self fossilRepo local: localSite fullName ] - ifTrue: [ self fossilRepo local: aFilePath ]. -] - -{ #category : #'server handling' } -BreaWebsite >> local: aFilePath remote: anUrl [ - "I define the local and remote storages of the Fossil repository" - self remote: anUrl. - self local: aFilePath -] - -{ #category : #utility } -BreaWebsite >> modifyDashboardTemplate [ - "I replace default templates with versioned files, that contains Mustache tags used - for examples." - "This part should be factorized and integrated into a single method tha modifies any - template, instead of repeated the code of modifyPortafolioTemplate." - | remoteRepoUrl files | - remoteRepoUrl := 'http://mutabit.com/repos.fossil/brea/templates/portaforlio'. - files := #('index.html' 'styles.css'). - "files do: [ :file | - GrafoscopioUtils - downloadingFrom: remoteRepoUrl, 'doc/tip/', file - withMessage: 'Replacing ', file - into: self local ]" -] - -{ #category : #utility } -BreaWebsite >> modifyPortafolioTemplate [ - "I replace default templates with versioned files, that contains Mustache tags used - for examples." - | remoteRepoUrl files | - remoteRepoUrl := 'http://mutabit.com/repos.fossil/gig/'. - files := #('index.html' 'styles.css'). - files do: [ :file | - GrafoscopioUtils - downloadingFrom: remoteRepoUrl, 'doc/tip/', file - withMessage: 'Replacing ', file - into: self local ] -] - -{ #category : #utility } -BreaWebsite >> modifyTemplate [ - "I replace default templates with versioned files, that contains Mustache tags used - for examples." - self template = 'portafolio' ifTrue: [ self modifyPortafolioTemplate ]. - self template = 'dashboard' ifTrue: [ self modifyDashboardTemplate ] -] - -{ #category : #'input processing' } -BreaWebsite >> processNewMember: request [ - | member badRequest | - badRequest := [ ^ ZnResponse badRequest: request ]. - (request hasEntity - and: [ request contentType matches: ZnMimeType applicationFormUrlEncoded ]) - ifFalse: [ badRequest ]. - member := BreaMember new - givenName: (request at: #givenName); - familyName: (request at: #familyName); - email: (request at: #email); - country: (request at: #country); - organizations: (request at: #organizations); - picture: (request at: #picture); - website: (request at: #website); - twitter: (request at: #twitter); - facebook: (request at: #facebook); - tags: (request at: #tags). - self store: member. - ^ 'New member stored!' -] - -{ #category : #'server handling' } -BreaWebsite >> remote: anUrl [ - "I define the remote storage of the Fossil repository" - self remote: anUrl. -] - -{ #category : #'server handling' } -BreaWebsite >> routes [ - "I define how the website behaves accordingly to particular routes." - self server - serveStatic: 'demo' from: (self local); - GET: 'members/test' -> [ :req | BreaMember new renderTestUserAsHtml ]; - GET: 'members/add' -> [ :req | BreaMember new htmlInput ]; - POST: 'members/summit' -> [ :req | self processNewMember: req ] -] - -{ #category : #accessing } -BreaWebsite >> server [ - ^ server ifNil: [ self setup ] -] - -{ #category : #accessing } -BreaWebsite >> server: anObject [ - server := anObject -] - -{ #category : #accessing } -BreaWebsite >> setup [ - ^ server := Teapot - configure: - {(#port -> 8080). - (#debugMode -> true)} -] - -{ #category : #'server handling' } -BreaWebsite >> start [ - "I define the config and start the server" - self routes. - self server start -] - -{ #category : #'server handling' } -BreaWebsite >> storageFor: anObject [ - "I define the places where local storage is done for several types of objects" - anObject class = BreaMember - ifTrue: [ ^ self local asFileReference / 'members' ]. - ^ self -] - -{ #category : #'server handling' } -BreaWebsite >> store: anObject [ - "I store different kind of objects in the website repository. - For the moment I will only store BreaMembers, but as long as new - objects will emerge, I will specialize other ways of storage." - anObject storeInto: (self storageFor: anObject) -] - -{ #category : #accessing } -BreaWebsite >> template [ - ^ template -] - -{ #category : #accessing } -BreaWebsite >> template: aTemplateName [ - "I define the default template to be used for the Brea website. - Available options are at self class templates." - template := aTemplateName -] - -{ #category : #accessing } -BreaWebsite >> title [ - ^ title -] - -{ #category : #accessing } -BreaWebsite >> title: anObject [ - title := anObject -]