diff --git a/.github/workflows/loading-groups.yml b/.github/workflows/loading-groups.yml index db4f758..215ccfc 100644 --- a/.github/workflows/loading-groups.yml +++ b/.github/workflows/loading-groups.yml @@ -8,7 +8,7 @@ jobs: strategy: fail-fast: false matrix: - smalltalk: [ Pharo64-11, Pharo64-10, Pharo64-9.0, Pharo64-8.0 ] + smalltalk: [ Pharo64-11, Pharo64-10, Pharo64-9.0 ] load-spec: [ deployment, dependent-sunit-extensions, tests, tools, development ] name: ${{ matrix.smalltalk }} + ${{ matrix.load-spec }} steps: diff --git a/.github/workflows/loading-gs64-components.yml b/.github/workflows/loading-gs64-components.yml new file mode 100644 index 0000000..97fcae4 --- /dev/null +++ b/.github/workflows/loading-gs64-components.yml @@ -0,0 +1,19 @@ +name: 'GS64 Components Loading' + +on: [push,pull_request,workflow_dispatch] + +jobs: + component-loading: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + load-spec: [ Deployment, Dependent-SUnit-Extensions ] + name: GS64 + ${{ matrix.load-spec }} + steps: + - uses: actions/checkout@v3 + - name: Load component in image + uses: ba-st-actions/gs64-ci@v1 + with: + project_name: 'Hyperspace' + load_spec: 'Hyperspace-${{ matrix.load-spec }}' diff --git a/.github/workflows/notify.yml b/.github/workflows/notify.yml index bfe0828..bc6862d 100644 --- a/.github/workflows/notify.yml +++ b/.github/workflows/notify.yml @@ -1,8 +1,6 @@ name: Release Notifications -on: - release: - types: [published] +on: workflow_dispatch jobs: notify: diff --git a/.github/workflows/unit-tests-gs64.yml b/.github/workflows/unit-tests-gs64.yml new file mode 100644 index 0000000..1ae449a --- /dev/null +++ b/.github/workflows/unit-tests-gs64.yml @@ -0,0 +1,15 @@ +name: 'GS64 Unit Tests' + +on: [push,pull_request,workflow_dispatch] + +jobs: + unit-tests: + runs-on: ubuntu-latest + name: GS64 Unit Tests + steps: + - uses: actions/checkout@v3 + - name: Load Image and Run Tests + uses: ba-st-actions/gs64-ci@v1 + with: + project_name: 'Hyperspace' + run_tests: 'true' diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index cc54e9c..14f66b0 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - smalltalk: [ Pharo64-11, Pharo64-10, Pharo64-9.0, Pharo64-8.0, Pharo64-7.0 ] + smalltalk: [ Pharo64-11, Pharo64-10, Pharo64-9.0 ] name: ${{ matrix.smalltalk }} steps: - uses: actions/checkout@v3 diff --git a/README.md b/README.md index 714ab76..7499280 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,21 @@ Building blocks for Internet technologies on top of [Zinc HTTP Components](https://github.com/svenvc/zinc) -[![Unit Tests](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests.yml) +[![Pharo - Unit Tests](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests.yml) +[![GS64 - Unit Tests](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests-gs64.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/unit-tests-gs64.yml) [![Coverage Status](https://codecov.io/github/ba-st/Hyperspace/coverage.svg?branch=release-candidate)](https://codecov.io/gh/ba-st/Hyperspace/branch/release-candidate) + [![Baseline Groups](https://github.com/ba-st/Hyperspace/actions/workflows/loading-groups.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/loading-groups.yml) +[![GS64 Components](https://github.com/ba-st/Hyperspace/actions/workflows/loading-gs64-components.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/loading-gs64-components.yml) [![Markdown Lint](https://github.com/ba-st/Hyperspace/actions/workflows/markdown-lint.yml/badge.svg)](https://github.com/ba-st/Hyperspace/actions/workflows/markdown-lint.yml) [![GitHub release](https://img.shields.io/github/release/ba-st/Hyperspace.svg)](https://github.com/ba-st/Hyperspace/releases/latest) -[![Pharo 7.0](https://img.shields.io/badge/Pharo-7.0-informational)](https://pharo.org) -[![Pharo 8.0](https://img.shields.io/badge/Pharo-8.0-informational)](https://pharo.org) [![Pharo 9.0](https://img.shields.io/badge/Pharo-9.0-informational)](https://pharo.org) [![Pharo 10](https://img.shields.io/badge/Pharo-10-informational)](https://pharo.org) [![Pharo 11](https://img.shields.io/badge/Pharo-11-informational)](https://pharo.org) +[![GS64 3.6.6](https://img.shields.io/badge/GS64-3.6.6-informational)](https://gemtalksystems.com/products/gs64/) + ## Quick links - [**Explore the docs**](docs/README.md) diff --git a/docs/reference/Baseline-groups.md b/docs/reference/Baseline-groups.md index b54e405..d9b3e19 100644 --- a/docs/reference/Baseline-groups.md +++ b/docs/reference/Baseline-groups.md @@ -1,4 +1,6 @@ -# Baseline Groups +# Baseline Groups & GS 64 Components + +## Pharo Baseline Groups Hyperspace includes the following groups in its Baseline that can be used as loading targets: @@ -11,3 +13,12 @@ loading targets: particular case it is the same as `Tests` - `Development` will load all the needed packages to develop and contribute to the project + +## GS64 Components + +Hyperspace includes the following components in its Rowan configuration that +can be used as loading targets: + +- `Deployment` will load all the packages needed in a deployed application +- `Tests` will load the test cases +- `Dependent-SUnit-Extensions` will load extensions to SUnit diff --git a/rowan/components/Dependent-SUnit-Extensions.ston b/rowan/components/Dependent-SUnit-Extensions.ston new file mode 100644 index 0000000..7e91872 --- /dev/null +++ b/rowan/components/Dependent-SUnit-Extensions.ston @@ -0,0 +1,20 @@ +RwSimpleProjectLoadComponentV2 { + #name : 'Dependent-SUnit-Extensions', + #condition : 'sunit', + #projectNames : [ ], + #componentNames : [ + 'Deployment' + ], + #packageNames : [ + 'Hyperspace-SUnit-Model' + ], + #conditionalPackageMapSpecs : { + 'gemstone' : { + 'allusers' : { + #packageNameToPlatformPropertiesMap : { + 'Hyperspace-SUnit-Model' : { 'symbolDictName' : 'Globals' } + } + } + } + } +} diff --git a/rowan/components/Deployment.ston b/rowan/components/Deployment.ston new file mode 100644 index 0000000..dd583e4 --- /dev/null +++ b/rowan/components/Deployment.ston @@ -0,0 +1,23 @@ +RwSimpleProjectLoadComponentV2 { + #name : 'Deployment', + #projectNames : [ + 'Zinc' + ], + #componentNames : [ ], + #packageNames : [ + 'Hyperspace-Model', + 'Hyperspace-Extensions', + 'Hyperspace-GS64-Extensions' + ], + #conditionalPackageMapSpecs : { + 'gemstone' : { + 'allusers' : { + #packageNameToPlatformPropertiesMap : { + 'Hyperspace-Model' : { 'symbolDictName' : 'Hyperspace' }, + 'Hyperspace-Extensions' : { 'symbolDictName' : 'Zinc' }, + 'Hyperspace-GS64-Extensions' : { 'symbolDictName' : 'Globals' } + } + } + } + } +} diff --git a/rowan/components/Tests.ston b/rowan/components/Tests.ston new file mode 100644 index 0000000..4c568fe --- /dev/null +++ b/rowan/components/Tests.ston @@ -0,0 +1,23 @@ +RwSimpleProjectLoadComponentV2 { + #name : 'Tests', + #condition : 'tests', + #projectNames : [ ], + #componentNames : [ + 'Deployment', + 'Dependent-SUnit-Extensions' + ], + #packageNames : [ + 'Hyperspace-Model-Tests', + 'Hyperspace-SUnit-Model-Tests' + ], + #conditionalPackageMapSpecs : { + 'gemstone' : { + 'allusers' : { + #packageNameToPlatformPropertiesMap : { + 'Hyperspace-Model-Tests' : { 'symbolDictName' : 'Hyperspace' }, + 'Hyperspace-SUnit-Model-Tests' : { 'symbolDictName' : 'Hyperspace' } + } + } + } + } +} diff --git a/rowan/project.ston b/rowan/project.ston new file mode 100644 index 0000000..a644b14 --- /dev/null +++ b/rowan/project.ston @@ -0,0 +1,11 @@ +RwProjectSpecificationV2 { + #specName : 'project', + #projectSpecPath : 'rowan', + #componentsPath : 'rowan/components', + #packagesPath : 'source', + #projectsPath : 'rowan/projects', + #specsPath : 'rowan/specs', + #packageFormat : 'tonel', + #packageConvention : 'Rowan', + #comment : 'Hyperspace project specification' +} diff --git a/rowan/projects/Zinc.ston b/rowan/projects/Zinc.ston new file mode 100644 index 0000000..6e513ee --- /dev/null +++ b/rowan/projects/Zinc.ston @@ -0,0 +1,10 @@ +RwLoadSpecificationV2 { + #specName: 'Zinc', + #projectName : 'Zinc', + #gitUrl : 'https://github.com/ba-st-dependencies/Zinc.git', + #revision : 'v5', + #projectSpecFile : 'rowan/project.ston', + #componentNames : [ + 'Deployment' + ] +} diff --git a/rowan/specs/Hyperspace-CI.ston b/rowan/specs/Hyperspace-CI.ston new file mode 100644 index 0000000..7008b73 --- /dev/null +++ b/rowan/specs/Hyperspace-CI.ston @@ -0,0 +1,14 @@ +RwLoadSpecificationV2 { + #specName: 'Hyperspace-CI', + #projectName : 'Hyperspace', + #diskUrl : '/opt/gemstone/projects/Hyperspace', + #projectSpecFile : 'rowan/project.ston', + #componentNames : [ + 'Tests' + ], + #customConditionalAttributes : [ + 'tests', + 'sunit' + ], + #comment : 'Loading spec for the continuous integration setup' +} diff --git a/rowan/specs/Hyperspace-Dependent-SUnit-Extensions.ston b/rowan/specs/Hyperspace-Dependent-SUnit-Extensions.ston new file mode 100644 index 0000000..9ce7d68 --- /dev/null +++ b/rowan/specs/Hyperspace-Dependent-SUnit-Extensions.ston @@ -0,0 +1,12 @@ +RwLoadSpecificationV2 { + #specName: 'Hyperspace-CI', + #projectName : 'Hyperspace', + #diskUrl : '/opt/gemstone/projects/Hyperspace', + #projectSpecFile : 'rowan/project.ston', + #componentNames : [ + 'Dependent-SUnit-Extensions' + ], + #customConditionalAttributes : [ + 'sunit' + ] +} diff --git a/rowan/specs/Hyperspace-Deployment.ston b/rowan/specs/Hyperspace-Deployment.ston new file mode 100644 index 0000000..4fe49e0 --- /dev/null +++ b/rowan/specs/Hyperspace-Deployment.ston @@ -0,0 +1,9 @@ +RwLoadSpecificationV2 { + #specName: 'Hyperspace-CI', + #projectName : 'Hyperspace', + #diskUrl : '/opt/gemstone/projects/Hyperspace', + #projectSpecFile : 'rowan/project.ston', + #componentNames : [ + 'Deployment' + ] +} diff --git a/source/.properties b/source/.properties index 53a5454..f668380 100644 --- a/source/.properties +++ b/source/.properties @@ -1,3 +1,4 @@ { - #format : #tonel + #format : #tonel, + #convention : 'Rowan' } diff --git a/source/BaselineOfHyperspace/BaselineOfHyperspace.class.st b/source/BaselineOfHyperspace/BaselineOfHyperspace.class.st index 664c272..5f48680 100644 --- a/source/BaselineOfHyperspace/BaselineOfHyperspace.class.st +++ b/source/BaselineOfHyperspace/BaselineOfHyperspace.class.st @@ -50,16 +50,29 @@ BaselineOfHyperspace >> setUpDependencies: spec [ BaselineOfHyperspace >> setUpPackages: spec [ spec - package: 'Hyperspace-Model' with: [ spec requires: #('Buoy-Deployment' 'Zinc-Core')]; + package: 'Hyperspace-Model' + with: [ spec requires: #( 'Buoy-Deployment' 'Zinc-Core' ) ]; group: 'Deployment' with: 'Hyperspace-Model'; - package: 'Hyperspace-Model-Tests' - with: [ spec requires: #( 'Hyperspace-Model' 'Dependent-SUnit-Extensions' ) ]; + package: 'Hyperspace-Extensions' + with: [ spec requires: 'Hyperspace-Model' ]; + group: 'Deployment' with: 'Hyperspace-Extensions'; + package: 'Hyperspace-Pharo-Extensions' + with: [ spec requires: 'Hyperspace-Model' ]; + group: 'Deployment' with: 'Hyperspace-Pharo-Extensions'. + + spec + package: 'Hyperspace-Model-Tests' with: [ + spec requires: + #( 'Hyperspace-Model' 'Hyperspace-Extensions' + 'Hyperspace-Pharo-Extensions' 'Dependent-SUnit-Extensions' ) ]; group: 'Tests' with: 'Hyperspace-Model-Tests'. spec - package: 'Hyperspace-SUnit-Model' with: [ spec requires: 'Buoy-SUnit' ]; + package: 'Hyperspace-SUnit-Model' + with: [ spec requires: 'Buoy-SUnit' ]; group: 'Dependent-SUnit-Extensions' with: 'Hyperspace-SUnit-Model'; - package: 'Hyperspace-SUnit-Model-Tests' with: [ spec requires: 'Hyperspace-SUnit-Model' ]; + package: 'Hyperspace-SUnit-Model-Tests' + with: [ spec requires: 'Hyperspace-SUnit-Model' ]; group: 'Tests' with: 'Hyperspace-SUnit-Model-Tests'. spec group: 'Tools' with: 'Buoy-Tools' diff --git a/source/Hyperspace-Model/ZnClient.extension.st b/source/Hyperspace-Extensions/ZnClient.extension.st similarity index 67% rename from source/Hyperspace-Model/ZnClient.extension.st rename to source/Hyperspace-Extensions/ZnClient.extension.st index a5e945b..a955d1d 100644 --- a/source/Hyperspace-Model/ZnClient.extension.st +++ b/source/Hyperspace-Extensions/ZnClient.extension.st @@ -1,12 +1,12 @@ Extension { #name : #ZnClient } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> logLevel [ ^ logLevel ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> query [ "Execute an HTTP QUERY the request set up and return the response #contents." @@ -17,32 +17,32 @@ ZnClient >> query [ ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> resetRequest [ request := ZnRequest empty. response := nil ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> setAccept: object [ request setAccept: object ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> setIfMatchTo: etag [ request setIfMatchTo: etag ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> setIfNoneMatchTo: etag [ request setIfNoneMatchTo: etag ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnClient >> setLogLevelAtLeastTo: integer [ self logLevel: (integer max: logLevel) diff --git a/source/Hyperspace-Model/ZnEntity.extension.st b/source/Hyperspace-Extensions/ZnEntity.extension.st similarity index 87% rename from source/Hyperspace-Model/ZnEntity.extension.st rename to source/Hyperspace-Extensions/ZnEntity.extension.st index c61d474..264aeef 100644 --- a/source/Hyperspace-Model/ZnEntity.extension.st +++ b/source/Hyperspace-Extensions/ZnEntity.extension.st @@ -1,6 +1,6 @@ Extension { #name : #ZnEntity } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnEntity class >> with: anObject ofType: aMimeType [ | entity | diff --git a/source/Hyperspace-Extensions/ZnMimeType.extension.st b/source/Hyperspace-Extensions/ZnMimeType.extension.st new file mode 100644 index 0000000..206b41e --- /dev/null +++ b/source/Hyperspace-Extensions/ZnMimeType.extension.st @@ -0,0 +1,28 @@ +Extension { #name : #ZnMimeType } + +{ #category : #'*Hyperspace-Extensions' } +ZnMimeType >> accepts: aMimeType [ + + ^ (aMimeType main = '*' or: [ aMimeType main = self main ]) and: [ + aMimeType sub = '*' or: [ + self sub = aMimeType sub or: [ + ($+ split: self sub) includes: aMimeType sub ] ] ] +] + +{ #category : #'*Hyperspace-Extensions' } +ZnMimeType >> asMediaType [ + + ^ self +] + +{ #category : #'*Hyperspace-Extensions' } +ZnMimeType >> quality [ + + ^ Float readFrom: (self parameterAt: 'q' ifAbsent: [ ^1.0 ]) +] + +{ #category : #'*Hyperspace-Extensions' } +ZnMimeType >> version: aVersionString [ + + self parameters at: 'version' put: aVersionString +] diff --git a/source/Hyperspace-Model/ZnRequest.extension.st b/source/Hyperspace-Extensions/ZnRequest.extension.st similarity index 71% rename from source/Hyperspace-Model/ZnRequest.extension.st rename to source/Hyperspace-Extensions/ZnRequest.extension.st index ea896d8..4975632 100644 --- a/source/Hyperspace-Model/ZnRequest.extension.st +++ b/source/Hyperspace-Extensions/ZnRequest.extension.st @@ -1,48 +1,48 @@ Extension { #name : #ZnRequest } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> acceptLanguage [ ^ self headers at: 'Accept-Language' ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> hasLanguageProrityList [ ^ self headers includesKey: 'Accept-Language' ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest class >> query: urlObject [ ^ self supportQUERYDuring: [ self method: #QUERY url: urlObject ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> readFrom: stream [ ^ self class supportQUERYDuring: [ super readFrom: stream ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> setAcceptLanguage: acceptLanguageDirectives [ self headers at: 'Accept-Language' put: acceptLanguageDirectives asString ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> setIfMatchTo: etag [ self headers at: 'If-Match' put: etag asString ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest >> setIfNoneMatchTo: etag [ self headers at: 'If-None-Match' put: etag asString ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnRequest class >> supportQUERYDuring: aBlock [ ^ aBlock diff --git a/source/Hyperspace-Model/ZnResponse.extension.st b/source/Hyperspace-Extensions/ZnResponse.extension.st similarity index 77% rename from source/Hyperspace-Model/ZnResponse.extension.st rename to source/Hyperspace-Extensions/ZnResponse.extension.st index 76cfe6a..6918699 100644 --- a/source/Hyperspace-Model/ZnResponse.extension.st +++ b/source/Hyperspace-Extensions/ZnResponse.extension.st @@ -1,30 +1,30 @@ Extension { #name : #ZnResponse } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> addCachingDirective: aDirective [ self headers at: 'Cache-Control' add: aDirective ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> addContentLanguage: aLanguageTag [ self headers at: 'Content-Language' add: aLanguageTag ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> addLink: aLink [ self headers at: 'Link' add: aLink ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> addToVary: headerName [ self headers at: 'Vary' add: headerName ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> cachingDirectives [ | directives | @@ -35,7 +35,7 @@ ZnResponse >> cachingDirectives [ ifFalse: [ Array with: directives ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> contentLanguageTags [ | headerValue | @@ -46,19 +46,19 @@ ZnResponse >> contentLanguageTags [ ifFalse: [ Array with: headerValue asLanguageTag ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> entityTag [ ^ (self headers at: 'ETag') asEntityTag ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> hasLocation [ ^ self headers includesKey: 'Location' ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> links [ | headerValue | @@ -69,13 +69,13 @@ ZnResponse >> links [ ifFalse: [ Array with: headerValue asWebLink ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> setEntityTag: aStringOrEntityTag [ self headers at: 'ETag' put: aStringOrEntityTag asEntityTag asString ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> varyHeaderNames [ | headerValue | @@ -86,7 +86,7 @@ ZnResponse >> varyHeaderNames [ ifFalse: [ Array with: headerValue ] ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnResponse >> withEntityTagDo: foundBlock ifAbsent: absentBlock [ self headers at: 'ETag' ifPresent: [ :headerValue | ^ foundBlock cull: headerValue asEntityTag ]. diff --git a/source/Hyperspace-Model/ZnSingleThreadedServer.extension.st b/source/Hyperspace-Extensions/ZnSingleThreadedServer.extension.st similarity index 70% rename from source/Hyperspace-Model/ZnSingleThreadedServer.extension.st rename to source/Hyperspace-Extensions/ZnSingleThreadedServer.extension.st index cc05fe8..88c505d 100644 --- a/source/Hyperspace-Model/ZnSingleThreadedServer.extension.st +++ b/source/Hyperspace-Extensions/ZnSingleThreadedServer.extension.st @@ -1,12 +1,12 @@ Extension { #name : #ZnSingleThreadedServer } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnSingleThreadedServer >> logLevel [ ^ logLevel ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnSingleThreadedServer >> setLogLevelAtLeastTo: integer [ self logLevel: (integer max: logLevel) diff --git a/source/Hyperspace-Model/ZnUrl.extension.st b/source/Hyperspace-Extensions/ZnUrl.extension.st similarity index 76% rename from source/Hyperspace-Model/ZnUrl.extension.st rename to source/Hyperspace-Extensions/ZnUrl.extension.st index 1a5857e..6fb9e6d 100644 --- a/source/Hyperspace-Model/ZnUrl.extension.st +++ b/source/Hyperspace-Extensions/ZnUrl.extension.st @@ -1,6 +1,6 @@ Extension { #name : #ZnUrl } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnUrl >> asAbsoluteUrl [ AssertionChecker @@ -11,7 +11,7 @@ ZnUrl >> asAbsoluteUrl [ ^ self ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnUrl >> asHostedAt: aBaseUrl [ ^ self copy @@ -21,13 +21,13 @@ ZnUrl >> asHostedAt: aBaseUrl [ yourself ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnUrl >> asWebLink [ ^ WebLink to: self ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnUrl >> queryAt: aKey putUrl: anUnencodedUrl [ | encodedUrl | @@ -36,7 +36,7 @@ ZnUrl >> queryAt: aKey putUrl: anUnencodedUrl [ ^ self queryAt: aKey put: encodedUrl ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Extensions' } ZnUrl >> start: startIndex limit: limitCount [ self diff --git a/source/Hyperspace-Extensions/package.st b/source/Hyperspace-Extensions/package.st new file mode 100644 index 0000000..28205ee --- /dev/null +++ b/source/Hyperspace-Extensions/package.st @@ -0,0 +1 @@ +Package { #name : #'Hyperspace-Extensions' } diff --git a/source/Hyperspace-GS64-Extensions/CharacterCollection.extension.st b/source/Hyperspace-GS64-Extensions/CharacterCollection.extension.st new file mode 100644 index 0000000..9d416b0 --- /dev/null +++ b/source/Hyperspace-GS64-Extensions/CharacterCollection.extension.st @@ -0,0 +1,31 @@ +Extension { #name : #CharacterCollection } + +{ #category : #'*Hyperspace-GS64-Extensions' } +CharacterCollection >> asAbsoluteUrl [ + + ^ self asUrl asAbsoluteUrl +] + +{ #category : #'*Hyperspace-GS64-Extensions' } +CharacterCollection >> asEntityTag [ + + ^ EntityTag fromString: self +] + +{ #category : #'*Hyperspace-GS64-Extensions' } +CharacterCollection >> asLanguageTag [ + + ^ LanguageTag fromString: self +] + +{ #category : #'*Hyperspace-GS64-Extensions' } +CharacterCollection >> asMediaType [ + + ^ self asZnMimeType +] + +{ #category : #'*Hyperspace-GS64-Extensions' } +CharacterCollection >> asWebLink [ + + ^ WebLink fromString: self +] diff --git a/source/Hyperspace-GS64-Extensions/package.st b/source/Hyperspace-GS64-Extensions/package.st new file mode 100644 index 0000000..02f9af5 --- /dev/null +++ b/source/Hyperspace-GS64-Extensions/package.st @@ -0,0 +1 @@ +Package { #name : #'Hyperspace-GS64-Extensions' } diff --git a/source/Hyperspace-Model-Tests/HTTPErrorTest.class.st b/source/Hyperspace-Model-Tests/HTTPErrorTest.class.st index dfbcced..d00c7f2 100644 --- a/source/Hyperspace-Model-Tests/HTTPErrorTest.class.st +++ b/source/Hyperspace-Model-Tests/HTTPErrorTest.class.st @@ -7,6 +7,23 @@ Class { #category : #'Hyperspace-Model-Tests-Exceptions' } +{ #category : #tests } +HTTPErrorTest >> testHandlingExceptionSelectorSets [ + + self + should: [ HTTPClientError notFound signal ] + raise: HTTPClientError notFound , HTTPServerError; + should: [ HTTPServerError serviceUnavailable signal ] + raise: HTTPClientError notFound , HTTPServerError. + + self + should: [ + [ HTTPServerError serviceUnavailable signal ] + on: HTTPClientError notFound , HTTPServerError internalServerError + do: [ :signal | self fail ] ] + raise: HTTPServerError serviceUnavailable +] + { #category : #tests } HTTPErrorTest >> testHandlingHTTPClientError [ diff --git a/source/Hyperspace-Model-Tests/RetryTest.class.st b/source/Hyperspace-Model-Tests/RetryTest.class.st index 8fc89b9..2c26337 100644 --- a/source/Hyperspace-Model-Tests/RetryTest.class.st +++ b/source/Hyperspace-Model-Tests/RetryTest.class.st @@ -347,7 +347,7 @@ RetryTest >> testOnWhenExpectedErrorIsRaisedAndSeveralErrorsHandled [ ] configuredBy: [ :retry | retry - on: AssertionFailed , self expectedError; + on: self expectedError , AssertionFailed; upTo: 1 ] ]. @@ -363,7 +363,7 @@ RetryTest >> testOnWhenExpectedErrorIsRaisedAndSeveralErrorsHandled [ ] configuredBy: [ :retry | retry - on: AssertionFailed , self expectedError; + on: self expectedError , AssertionFailed; upTo: 1 ] ] diff --git a/source/Hyperspace-Model-Tests/WebLinkTest.class.st b/source/Hyperspace-Model-Tests/WebLinkTest.class.st index 28174cb..5493707 100644 --- a/source/Hyperspace-Model-Tests/WebLinkTest.class.st +++ b/source/Hyperspace-Model-Tests/WebLinkTest.class.st @@ -262,6 +262,7 @@ WebLinkTest >> testPrinting [ self assert: self googleUrl asWebLink printString equals: ''; + assert: self googleUrl asWebLink asString equals: ''; assert: ( self googleUrl asWebLink relationType: 'search' ) printString equals: ';rel=search' ] diff --git a/source/Hyperspace-Model-Tests/ZnClientHyperspaceExtensionsTest.class.st b/source/Hyperspace-Model-Tests/ZnClientHyperspaceExtensionsTest.class.st index 0142f87..4a41700 100644 --- a/source/Hyperspace-Model-Tests/ZnClientHyperspaceExtensionsTest.class.st +++ b/source/Hyperspace-Model-Tests/ZnClientHyperspaceExtensionsTest.class.st @@ -8,7 +8,7 @@ Class { ZnClientHyperspaceExtensionsTest >> handleRequest: request [ self - assert: request method equals: #QUERY; + assert: request method equals: 'QUERY'; assertUrl: request url equals: 'hello'. ^ ZnResponse ok: (ZnEntity text: 'hello') ] @@ -66,9 +66,9 @@ ZnClientHyperspaceExtensionsTest >> testSetIfMatchTo [ client := ZnClient new. - self should: [ client request headers at: #'If-Match' ] raise: KeyNotFound. + self should: [ client request headers at: 'If-Match' ] raise: KeyNotFound. client setIfMatchTo: ( EntityTag with: '12345' ). - self assert: ( client request headers at: #'If-Match' ) equals: '"12345"' + self assert: ( client request headers at: 'If-Match' ) equals: '"12345"' ] { #category : #tests } @@ -78,9 +78,9 @@ ZnClientHyperspaceExtensionsTest >> testSetIfNoneMatchTo [ client := ZnClient new. - self should: [ client request headers at: #'If-None-Match' ] raise: KeyNotFound. + self should: [ client request headers at: 'If-None-Match' ] raise: KeyNotFound. client setIfNoneMatchTo: ( EntityTag with: '12345' ). - self assert: ( client request headers at: #'If-None-Match' ) equals: '"12345"' + self assert: ( client request headers at: 'If-None-Match' ) equals: '"12345"' ] { #category : #tests } diff --git a/source/Hyperspace-Model-Tests/ZnRequestHyperspaceExtensionsTest.class.st b/source/Hyperspace-Model-Tests/ZnRequestHyperspaceExtensionsTest.class.st index 17fa8d0..4e0c99b 100644 --- a/source/Hyperspace-Model-Tests/ZnRequestHyperspaceExtensionsTest.class.st +++ b/source/Hyperspace-Model-Tests/ZnRequestHyperspaceExtensionsTest.class.st @@ -47,7 +47,7 @@ ZnRequestHyperspaceExtensionsTest >> testIfMatch [ setIfMatchTo: ( EntityTag with: '12345' ); yourself. - self assert: ( request headers at: #'If-Match' ) equals: '"12345"' + self assert: ( request headers at: 'If-Match' ) equals: '"12345"' ] { #category : #tests } @@ -59,14 +59,13 @@ ZnRequestHyperspaceExtensionsTest >> testIfNoneMatch [ setIfNoneMatchTo: ( EntityTag with: '12345' ); yourself. - self assert: (request headers at: #'If-None-Match') equals: '"12345"' + self assert: (request headers at: 'If-None-Match') equals: '"12345"' ] { #category : #tests } ZnRequestHyperspaceExtensionsTest >> testQuery [ | request output | - request := ZnRequest query: self googleUrl / 'search'. self assert: request method equals: #QUERY. @@ -86,7 +85,7 @@ ZnRequestHyperspaceExtensionsTest >> testReadQueryRequest [ 'QUERY /search HTTP/1.1Host: google.com' expandMacros readStream. self - assert: request method equals: #QUERY; + assert: request method equals: 'QUERY'; assertUrl: request url equals: 'search'; assertUrl: request host equals: 'http://google.com' ] diff --git a/source/Hyperspace-Model/ExceptionSelectorSet.class.st b/source/Hyperspace-Model/ExceptionSelectorSet.class.st new file mode 100644 index 0000000..2252819 --- /dev/null +++ b/source/Hyperspace-Model/ExceptionSelectorSet.class.st @@ -0,0 +1,29 @@ +Class { + #name : #ExceptionSelectorSet, + #superclass : #Object, + #instVars : [ + 'value', + 'suffix', + 'selectors' + ], + #category : #'Hyperspace-Model-IETF' +} + +{ #category : #'exception selector' } +ExceptionSelectorSet >> , exceptionSelector [ + + selectors add: exceptionSelector +] + +{ #category : #'exception selector' } +ExceptionSelectorSet >> handles: anException [ + + ^ selectors anySatisfy: [ :selector | selector handles: anException ] +] + +{ #category : #initialization } +ExceptionSelectorSet >> initialize [ + + super initialize. + selectors := OrderedCollection new +] diff --git a/source/Hyperspace-Model/HTTPError.class.st b/source/Hyperspace-Model/HTTPError.class.st index 7369566..ab05d06 100644 --- a/source/Hyperspace-Model/HTTPError.class.st +++ b/source/Hyperspace-Model/HTTPError.class.st @@ -20,13 +20,10 @@ HTTPError class >> code: aCode [ ^ instance ] -{ #category : #'error handling' } -HTTPError >> - anotherException [ +{ #category : #'exception selector' } +HTTPError >> , exceptionSelector [ - ^ ExceptionSetWithExclusions new - add: self; - addExclusion: anotherException; - yourself + ^ ExceptionSelectorSet new , self , exceptionSelector ] { #category : #accessing } @@ -41,7 +38,7 @@ HTTPError >> code: anErrorCode [ code := anErrorCode ] -{ #category : #'error handling' } +{ #category : #'exception selector' } HTTPError >> handles: aSignal [ ^ ( self class handles: aSignal ) and: [ aSignal code = self code ] diff --git a/source/Hyperspace-Model/LanguageRange.class.st b/source/Hyperspace-Model/LanguageRange.class.st index 42c633a..59dac00 100644 --- a/source/Hyperspace-Model/LanguageRange.class.st +++ b/source/Hyperspace-Model/LanguageRange.class.st @@ -58,6 +58,12 @@ LanguageRange >> = anObject [ checkAgainst: anObject ] +{ #category : #converting } +LanguageRange >> asString [ + + ^ self printString +] + { #category : #comparing } LanguageRange >> hash [ diff --git a/source/Hyperspace-Model/LanguageTag.class.st b/source/Hyperspace-Model/LanguageTag.class.st index e464735..d220a02 100644 --- a/source/Hyperspace-Model/LanguageTag.class.st +++ b/source/Hyperspace-Model/LanguageTag.class.st @@ -62,6 +62,12 @@ LanguageTag >> asLanguageTag [ ^ self ] +{ #category : #printing } +LanguageTag >> asString [ + + ^ self printString +] + { #category : #private } LanguageTag >> assertIsValid [ diff --git a/source/Hyperspace-Model/PortAvailabilityChecker.class.st b/source/Hyperspace-Model/PortAvailabilityChecker.class.st index c20598e..48c2b7b 100644 --- a/source/Hyperspace-Model/PortAvailabilityChecker.class.st +++ b/source/Hyperspace-Model/PortAvailabilityChecker.class.st @@ -5,9 +5,6 @@ Whenever possible, it is best to let the OS provide us a free port. But if you n Class { #name : #PortAvailabilityChecker, #superclass : #Object, - #instVars : [ - 'portNumberA' - ], #classInstVars : [ 'uniqueInstance' ], @@ -35,7 +32,7 @@ PortAvailabilityChecker >> isAvailableForTCP: portNumber [ ^ [ | socket | - socket := Socket newTCP. + socket := ZnNetworkingUtils default socketClass newTCP. ZnNetworkingUtils default setServerSocketOptions: socket. socket listenOn: portNumber. [ diff --git a/source/Hyperspace-Model/WebLink.class.st b/source/Hyperspace-Model/WebLink.class.st index a675e67..18518e1 100644 --- a/source/Hyperspace-Model/WebLink.class.st +++ b/source/Hyperspace-Model/WebLink.class.st @@ -105,6 +105,12 @@ WebLink >> asByteArray [ ^ self printString asByteArray ] +{ #category : #printing } +WebLink >> asString [ + + ^ self printString +] + { #category : #converting } WebLink >> asWebLink [ @@ -258,7 +264,8 @@ WebLink >> quoteValueWhenNeeded: aString [ "Values including ; or , needs to be quoted" self assertNotEmpty: aString. - ^ ( aString includesAnyOf: ';,' ) then: [ '"<1s>"' expandMacrosWith: aString ] + ^ ((aString includes: $;) or: [ aString includes: $, ]) + then: [ '"<1s>"' expandMacrosWith: aString ] otherwise: [ aString ] ] diff --git a/source/Hyperspace-Model/ZnMimeType.extension.st b/source/Hyperspace-Model/ZnMimeType.extension.st deleted file mode 100644 index 7bb5d1b..0000000 --- a/source/Hyperspace-Model/ZnMimeType.extension.st +++ /dev/null @@ -1,27 +0,0 @@ -Extension { #name : #ZnMimeType } - -{ #category : #'*Hyperspace-Model' } -ZnMimeType >> accepts: aMimeType [ - - ^ (aMimeType main = '*' or: [ aMimeType main = self main ]) - and: [ aMimeType sub = '*' - or: [ self sub = aMimeType sub or: [ (self sub splitOn: $+) includes: aMimeType sub ] ] ] -] - -{ #category : #'*Hyperspace-Model' } -ZnMimeType >> asMediaType [ - - ^ self -] - -{ #category : #'*Hyperspace-Model' } -ZnMimeType >> quality [ - - ^ Float readFrom: (self parameterAt: 'q' ifAbsent: [ ^1.0 ]) -] - -{ #category : #'*Hyperspace-Model' } -ZnMimeType >> version: aVersionString [ - - self parameters at: 'version' put: aVersionString -] diff --git a/source/Hyperspace-Pharo-Extensions/HTTPError.extension.st b/source/Hyperspace-Pharo-Extensions/HTTPError.extension.st new file mode 100644 index 0000000..5f86d66 --- /dev/null +++ b/source/Hyperspace-Pharo-Extensions/HTTPError.extension.st @@ -0,0 +1,10 @@ +Extension { #name : #HTTPError } + +{ #category : #'*Hyperspace-Pharo-Extensions' } +HTTPError >> - anotherException [ + + ^ ExceptionSetWithExclusions new + add: self; + addExclusion: anotherException; + yourself +] diff --git a/source/Hyperspace-Model/String.extension.st b/source/Hyperspace-Pharo-Extensions/String.extension.st similarity index 56% rename from source/Hyperspace-Model/String.extension.st rename to source/Hyperspace-Pharo-Extensions/String.extension.st index 92fa431..2b35ad4 100644 --- a/source/Hyperspace-Model/String.extension.st +++ b/source/Hyperspace-Pharo-Extensions/String.extension.st @@ -1,30 +1,30 @@ Extension { #name : #String } -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Pharo-Extensions' } String >> asAbsoluteUrl [ ^ self asUrl asAbsoluteUrl ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Pharo-Extensions' } String >> asEntityTag [ ^ EntityTag fromString: self ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Pharo-Extensions' } String >> asLanguageTag [ ^ LanguageTag fromString: self ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Pharo-Extensions' } String >> asMediaType [ ^ self asZnMimeType ] -{ #category : #'*Hyperspace-Model' } +{ #category : #'*Hyperspace-Pharo-Extensions' } String >> asWebLink [ ^ WebLink fromString: self diff --git a/source/Hyperspace-Pharo-Extensions/ZnNetworkingUtils.extension.st b/source/Hyperspace-Pharo-Extensions/ZnNetworkingUtils.extension.st new file mode 100644 index 0000000..0952402 --- /dev/null +++ b/source/Hyperspace-Pharo-Extensions/ZnNetworkingUtils.extension.st @@ -0,0 +1,7 @@ +Extension { #name : #ZnNetworkingUtils } + +{ #category : #'*Hyperspace-Pharo-Extensions' } +ZnNetworkingUtils >> socketClass [ + + ^ Socket +] diff --git a/source/Hyperspace-Pharo-Extensions/package.st b/source/Hyperspace-Pharo-Extensions/package.st new file mode 100644 index 0000000..8b280a4 --- /dev/null +++ b/source/Hyperspace-Pharo-Extensions/package.st @@ -0,0 +1 @@ +Package { #name : #'Hyperspace-Pharo-Extensions' }