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' }