diff --git a/source/BaselineOfStargate/BaselineOfStargate.class.st b/source/BaselineOfStargate/BaselineOfStargate.class.st index 5a9c2f6..4e77428 100644 --- a/source/BaselineOfStargate/BaselineOfStargate.class.st +++ b/source/BaselineOfStargate/BaselineOfStargate.class.st @@ -16,7 +16,7 @@ BaselineOfStargate >> baseline: spec [ spec group: 'CI' with: 'Tests'; group: 'Examples' with: #('Deployment' 'Stargate-Examples'); - group: 'Tools' with: #('Buoy-Tools' 'Teapot-Tools'); + group: 'Tools' with: #('Teapot-Tools'); group: 'Development' with: #('Tests' 'Tools') ] ] diff --git a/source/Stargate-Examples/PetsRESTfulController.class.st b/source/Stargate-Examples/PetsRESTfulController.class.st index 3a98bff..f7c8eb4 100644 --- a/source/Stargate-Examples/PetsRESTfulController.class.st +++ b/source/Stargate-Examples/PetsRESTfulController.class.st @@ -52,9 +52,9 @@ PetsRESTfulController >> defaultPaginationLimit [ { #category : #API } PetsRESTfulController >> deletePetBasedOn: anHttpRequest within: aContext [ - [ pets remove: (self petIdentifiedUsing: anHttpRequest) ] + [ pets remove: ( self petIdentifiedUsing: anHttpRequest ) ] on: ObjectNotFound - do: [ :signal | HTTPClientError signalNotFound ]. + do: [ :signal | HTTPClientError notFound signal ]. ^ ZnResponse noContent ] diff --git a/source/Stargate-MigrationTo2/HTTPClientError.extension.st b/source/Stargate-MigrationTo2/HTTPClientError.extension.st new file mode 100644 index 0000000..c5e29a9 --- /dev/null +++ b/source/Stargate-MigrationTo2/HTTPClientError.extension.st @@ -0,0 +1,104 @@ +Extension { #name : #HTTPClientError } + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalBadRequest: aFailureExplanation [ + + self + deprecated: 'Use badRequest signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalBadRequest: `@message' -> '`@receiver badRequest signal: `@message'. + + ^ self signal: 400 describedBy: aFailureExplanation +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalConflict: aFailureExplanation [ + + self + deprecated: 'Use conflict signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalConflict: `@message' -> '`@receiver conflict signal: `@message'. + + ^self signal: 409 describedBy: aFailureExplanation +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalNotFound [ + + self + deprecated: 'Use notFound signal instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalNotFound' -> '`@receiver notFound signal'. + + ^ self signal: 404 describedBy: 'Not found' +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalNotFound: aFailureExplanation [ + + self + deprecated: 'Use notFound signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalNotFound: `@message' -> '`@receiver notFound signal: `@message'. + + ^ self signal: 404 describedBy: aFailureExplanation +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalPreconditionFailed [ + + self + deprecated: 'Use preconditionFailed signal instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalPreconditionFailed' -> '`@receiver preconditionFailed signal'. + + ^ self + signal: 428 + describedBy: + 'One or more conditions given in the request header fields evaluated to false when tested on the server.' +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalPreconditionRequired: aFailureExplanation [ + + self + deprecated: 'Use preconditionRequired signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: '`@receiver signalPreconditionRequired: `@messageText' -> '`@receiver preconditionRequired signal: `@messageText'. + + ^ self signal: 428 describedBy: aFailureExplanation +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalUnprocessableEntity: aFailureExplanation [ + + self + deprecated: 'Use unprocessableEntity signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: + '`@receiver signalUnprocessableEntity: `@message' + -> '`@receiver unprocessableEntity signal: `@message'. + + ^ self signal: 422 describedBy: aFailureExplanation +] + +{ #category : #'*Stargate-MigrationTo2' } +HTTPClientError class >> signalUnsupportedMediaType: aFailureExplanation [ + + self + deprecated: 'Use unsupportedMediaType signal: instead' + on: '2019-06-19' + in: #Stargate2 + transformWith: + '`@receiver signalUnsupportedMediaType: `@message' + -> '`@receiver unsupportedMediaType signal: `@message'. + + ^ self signal: 415 describedBy: aFailureExplanation +] diff --git a/source/Stargate-MigrationTo2/package.st b/source/Stargate-MigrationTo2/package.st new file mode 100644 index 0000000..a401ae3 --- /dev/null +++ b/source/Stargate-MigrationTo2/package.st @@ -0,0 +1 @@ +Package { #name : #'Stargate-MigrationTo2' } diff --git a/source/Stargate-Model-Tests/HTTPClientErrorTest.class.st b/source/Stargate-Model-Tests/HTTPClientErrorTest.class.st deleted file mode 100644 index 0c624fe..0000000 --- a/source/Stargate-Model-Tests/HTTPClientErrorTest.class.st +++ /dev/null @@ -1,71 +0,0 @@ -" -A HTTPClientErrorTest is a test class for testing the behavior of HTTPClientError -" -Class { - #name : #HTTPClientErrorTest, - #superclass : #TestCase, - #category : #'Stargate-Model-Tests-Controllers' -} - -{ #category : #tests } -HTTPClientErrorTest >> test404 [ - - self - should: [ HTTPClientError signalNotFound ] - raise: HTTPClientError - withExceptionDo: [ :signal | - self - assert: signal code equals: 404; - assert: signal messageText equals: 'Not found' ] -] - -{ #category : #tests } -HTTPClientErrorTest >> test409 [ - - self - should: [ HTTPClientError signalConflict: 'Sigmund Freud' ] - raise: HTTPClientError - withExceptionDo: [ :signal | - self - assert: signal code equals: 409; - assert: signal messageText equals: 'Sigmund Freud' ] -] - -{ #category : #tests } -HTTPClientErrorTest >> test422 [ - - self - should: [ HTTPClientError signalUnprocessableEntity: 'Cannot be processed'] - raise: HTTPClientError - withExceptionDo: [ :signal | - self - assert: signal code equals: 422; - assert: signal messageText equals: 'Cannot be processed' ] -] - -{ #category : #tests } -HTTPClientErrorTest >> testCode [ - - self - should: [ HTTPClientError signal: 404 describedBy: 'Not Found' ] - raise: HTTPClientError - withExceptionDo: [ :signal | - self - assert: signal code equals: 404; - assert: signal messageText equals: 'Not Found' ] -] - -{ #category : #tests } -HTTPClientErrorTest >> testNotAcceptableAsJSON [ - - | error json | - - error := HTTPNotAcceptable messageText: 'Ouch!' accepting: {'application/xml' asMediaType}. - json := NeoJSONObject fromString: (NeoJSONWriter toStringPretty: error). - - self - assert: json message equals: 'Ouch!'; - assert: json code equals: 406; - assert: json allowedMediaTypes size equals: 1; - assert: json allowedMediaTypes first equals: 'application/xml' -] diff --git a/source/Stargate-Model-Tests/HTTPNotAcceptableTest.extension.st b/source/Stargate-Model-Tests/HTTPNotAcceptableTest.extension.st new file mode 100644 index 0000000..91f1790 --- /dev/null +++ b/source/Stargate-Model-Tests/HTTPNotAcceptableTest.extension.st @@ -0,0 +1,16 @@ +Extension { #name : #HTTPNotAcceptableTest } + +{ #category : #'*Stargate-Model-Tests' } +HTTPNotAcceptableTest >> testNotAcceptableAsJSON [ + + | error json | + + error := HTTPNotAcceptable messageText: 'Ouch!' accepting: {'application/xml' asMediaType}. + json := NeoJSONObject fromString: (NeoJSONWriter toStringPretty: error). + + self + assert: json message equals: 'Ouch!'; + assert: json code equals: 406; + assert: json allowedMediaTypes size equals: 1; + assert: json allowedMediaTypes first equals: 'application/xml' +] diff --git a/source/Stargate-Model/HTTPClientError.class.st b/source/Stargate-Model/HTTPClientError.class.st index 423a632..48af0c1 100644 --- a/source/Stargate-Model/HTTPClientError.class.st +++ b/source/Stargate-Model/HTTPClientError.class.st @@ -7,69 +7,7 @@ Class { #category : #'Stargate-Model-Controllers' } -{ #category : #signaling } -HTTPClientError class >> signal: aCode describedBy: aFailureExplanation [ - - ^ self new - tag: aCode; - signal: aFailureExplanation -] - -{ #category : #signaling } -HTTPClientError class >> signalBadRequest: aFailureExplanation [ - - ^ self signal: 400 describedBy: aFailureExplanation -] - -{ #category : #signaling } -HTTPClientError class >> signalConflict: aFailureExplanation [ - - ^self signal: 409 describedBy: aFailureExplanation -] - -{ #category : #signaling } -HTTPClientError class >> signalNotFound [ - - ^self signal: 404 describedBy: 'Not found' -] - -{ #category : #signaling } -HTTPClientError class >> signalNotFound: aFailureExplanation [ - - ^self signal: 404 describedBy: aFailureExplanation -] - -{ #category : #signaling } -HTTPClientError class >> signalPreconditionFailed [ - - ^ self signal: 412 describedBy: 'One or more conditions given in the request header fields evaluated to false when tested on the server.' -] - -{ #category : #signaling } -HTTPClientError class >> signalPreconditionRequired: aMessageText [ - - ^ self signal: 428 describedBy: aMessageText -] - -{ #category : #signaling } -HTTPClientError class >> signalUnprocessableEntity: aFailureExplanation [ - - ^ self signal: 422 describedBy: aFailureExplanation -] - -{ #category : #signaling } -HTTPClientError class >> signalUnsupportedMediaType: aFailureExplanation [ - - ^ self signal: 415 describedBy: aFailureExplanation -] - -{ #category : #accessing } -HTTPClientError >> code [ - - ^self tag -] - -{ #category : #converting } +{ #category : #'*Stargate-Model' } HTTPClientError >> neoJsonOn: neoJSONWriter [ neoJSONWriter diff --git a/source/Stargate-Model/HTTPClientError.extension.st b/source/Stargate-Model/HTTPClientError.extension.st new file mode 100644 index 0000000..806ad5c --- /dev/null +++ b/source/Stargate-Model/HTTPClientError.extension.st @@ -0,0 +1,10 @@ +Extension { #name : #HTTPClientError } + +{ #category : #'*Stargate-Model' } +HTTPClientError >> neoJsonOn: neoJSONWriter [ + + neoJSONWriter + writeMap: + {(#code -> self code). + (#message -> self messageText)} asDictionary +] diff --git a/source/Stargate-Model/HTTPNotAcceptable.class.st b/source/Stargate-Model/HTTPNotAcceptable.class.st index a55343b..e5a942c 100644 --- a/source/Stargate-Model/HTTPNotAcceptable.class.st +++ b/source/Stargate-Model/HTTPNotAcceptable.class.st @@ -20,35 +20,7 @@ Class { #category : #'Stargate-Model-Controllers' } -{ #category : #'instance creation' } -HTTPNotAcceptable class >> messageText: aMessageText accepting: allowedMediaTypes [ - - ^ self new - tag: 406; - messageText: aMessageText; - allowedMediaTypes: allowedMediaTypes asArray; - yourself -] - -{ #category : #signalling } -HTTPNotAcceptable class >> signal: aMessageText accepting: allowedMediaTypes [ - - ^ (self messageText: aMessageText accepting: allowedMediaTypes asArray) signal -] - -{ #category : #accessing } -HTTPNotAcceptable >> allowedMediaTypes [ - - ^ allowedMediaTypes -] - -{ #category : #accessing } -HTTPNotAcceptable >> allowedMediaTypes: anArray [ - - allowedMediaTypes := anArray -] - -{ #category : #converting } +{ #category : #'*Stargate-Model' } HTTPNotAcceptable >> neoJsonOn: neoJSONWriter [ (neoJSONWriter customMappingFor: ZnMimeType) encoder: [ :mediaType | mediaType asString ]. diff --git a/source/Stargate-Model/HTTPNotAcceptable.extension.st b/source/Stargate-Model/HTTPNotAcceptable.extension.st new file mode 100644 index 0000000..31d9274 --- /dev/null +++ b/source/Stargate-Model/HTTPNotAcceptable.extension.st @@ -0,0 +1,12 @@ +Extension { #name : #HTTPNotAcceptable } + +{ #category : #'*Stargate-Model' } +HTTPNotAcceptable >> neoJsonOn: neoJSONWriter [ + + (neoJSONWriter customMappingFor: ZnMimeType) encoder: [ :mediaType | mediaType asString ]. + neoJSONWriter + writeMap: + {(#code -> self code). + (#message -> self messageText). + (#allowedMediaTypes -> self allowedMediaTypes)} asDictionary +] diff --git a/source/Stargate-Model/RESTfulControllerPaginateCollectionsPolicy.class.st b/source/Stargate-Model/RESTfulControllerPaginateCollectionsPolicy.class.st index 78d22eb..dab083a 100644 --- a/source/Stargate-Model/RESTfulControllerPaginateCollectionsPolicy.class.st +++ b/source/Stargate-Model/RESTfulControllerPaginateCollectionsPolicy.class.st @@ -42,7 +42,7 @@ RESTfulControllerPaginateCollectionsPolicy >> evaluateQuery: aQueryEvaluationBlo pagination := [ self paginationFrom: anHttpRequest ] on: InstanceCreationFailed - do: [ :error | HTTPClientError signalBadRequest: error messageText ]. + do: [ :error | HTTPClientError badRequest signal: error messageText ]. ^ resourceController evaluateQuery: [ aQueryEvaluationBlock cull: pagination ] ] diff --git a/source/Stargate-Model/ResourceRESTfulController.class.st b/source/Stargate-Model/ResourceRESTfulController.class.st index c4d30ee..d618349 100644 --- a/source/Stargate-Model/ResourceRESTfulController.class.st +++ b/source/Stargate-Model/ResourceRESTfulController.class.st @@ -23,17 +23,21 @@ Class { ResourceRESTfulController >> assert: etag matchesEntityTagOf: entity encodedAs: mediaType within: aContext [ etag = ( self entityTagOf: entity encodedAs: mediaType within: aContext ) - ifFalse: [ HTTPClientError signalPreconditionFailed ] + ifFalse: [ HTTPClientError preconditionFailed signal ] ] { #category : #'private - transformations' } ResourceRESTfulController >> decode: theRepresentation at: aKey from: sourceMediaType within: aContext [ - ^ [ [ (mappingRuleSet ruleToDecode: sourceMediaType to: aKey) applyOn: theRepresentation within: aContext ] + ^ [ [ ( mappingRuleSet ruleToDecode: sourceMediaType to: aKey ) + applyOn: theRepresentation + within: aContext + ] on: KeyNotFound , NeoJSONParseError - do: [ :signal | HTTPClientError signalBadRequest: signal messageText ] ] + do: [ :signal | HTTPClientError badRequest signal: signal messageText ] + ] on: MappingNotFound - do: [ :signal | HTTPClientError signalUnsupportedMediaType: signal messageText ] + do: [ :signal | HTTPClientError unsupportedMediaType signal: signal messageText ] ] { #category : #'private - transformations' } @@ -43,7 +47,7 @@ ResourceRESTfulController >> encode: theResource at: aKey to: targetMediaType wi applyOn: theResource within: aContext ] on: MappingNotFound - do: [ :signal | HTTPClientError signalUnsupportedMediaType: signal messageText ] + do: [ :signal | HTTPClientError unsupportedMediaType signal: signal messageText ] ] { #category : #'private - accessing' } @@ -55,7 +59,9 @@ ResourceRESTfulController >> entityTagOf: resource encodedAs: mediaType within: { #category : #'private - accessing' } ResourceRESTfulController >> entityTagToMatchBasedOn: anHttpRequest [ - ^ (anHttpRequest headers at: #'If-Match' ifAbsent: [ HTTPClientError signalPreconditionRequired: 'Missing If-Match header.' ]) asETag + ^ ( anHttpRequest headers + at: #'If-Match' + ifAbsent: [ HTTPClientError preconditionRequired signal: 'Missing If-Match header.' ] ) asETag ] { #category : #'private - querying' } @@ -63,9 +69,10 @@ ResourceRESTfulController >> evaluateQuery: aQueryEvaluationBlock [ ^ [ [ aQueryEvaluationBlock value ] on: TeaNoSuchParam - do: [ :signal | HTTPClientError signalBadRequest: signal messageText ] ] + do: [ :signal | HTTPClientError badRequest signal: signal messageText ] + ] on: ObjectNotFound - do: [ :signal | HTTPClientError signalNotFound: signal messageText ] + do: [ :signal | HTTPClientError notFound signal: signal messageText ] ] { #category : #'private - API' } @@ -133,7 +140,7 @@ ResourceRESTfulController >> handleConflictsIn: aBlock [ ^ aBlock on: ConflictingObjectFound - do: [ :signal | HTTPClientError signalConflict: signal messageText ] + do: [ :signal | HTTPClientError conflict signal: signal messageText ] ] { #category : #'private - accessing' }