diff --git a/repository/BaselineOfSeaside3.package/BaselineOfSeaside3.class/instance/baselinerest..st b/repository/BaselineOfSeaside3.package/BaselineOfSeaside3.class/instance/baselinerest..st index 8c3a0803a..e7066f885 100644 --- a/repository/BaselineOfSeaside3.package/BaselineOfSeaside3.class/instance/baselinerest..st +++ b/repository/BaselineOfSeaside3.package/BaselineOfSeaside3.class/instance/baselinerest..st @@ -11,9 +11,8 @@ baselinerest: spec spec requires: #('Seaside-REST-Core' 'Seaside-Tests-Core') ]. spec group: 'REST' with: #('Seaside-REST-Core'); - group: 'REST Tests' with: #('REST' 'Seaside-Tests-REST-Core') - ]. - + group: 'REST Tests' with: #('REST' 'Seaside-Tests-REST-Core'); + group: 'Examples' with: #('Seaside-REST-Examples') ]. spec for: #'squeakCommon' do: [ spec @@ -24,8 +23,7 @@ baselinerest: spec spec group: 'REST' with: #('Seaside-REST-Core'); group: 'Swagger' with: #('REST' 'Seaside-Swagger-Core'); - group: 'Swagger Tests' with: #('Swagger' 'Seaside-Tests-Swagger-Core') - ]. + group: 'Swagger Tests' with: #('Swagger' 'Seaside-Tests-Swagger-Core') ]. spec for: #(squeak) do:[ spec @@ -35,8 +33,7 @@ baselinerest: spec package: 'Seaside-Squeak-Swagger-Core'; package: 'Seaside-Pharo-Swagger-Core'; package: 'Seaside-Swagger-Core' with: [ - spec includes: #('Seaside-Pharo-Swagger-Core' 'Seaside-Squeak-Swagger-Core') ] - ]. + spec includes: #('Seaside-Pharo-Swagger-Core' 'Seaside-Squeak-Swagger-Core') ] ]. spec for: #(#'pharo4.x' #'pharo5.x' #'pharo6.x' #'pharo7.x' #'pharo8.x') diff --git a/repository/Seaside-Core.package/WAHtmlAttributes.class/instance/encodeOn..st b/repository/Seaside-Core.package/WAHtmlAttributes.class/instance/encodeOn..st index 6a41c7afe..33a5c933b 100644 --- a/repository/Seaside-Core.package/WAHtmlAttributes.class/instance/encodeOn..st +++ b/repository/Seaside-Core.package/WAHtmlAttributes.class/instance/encodeOn..st @@ -8,6 +8,7 @@ encodeOn: aDocument nextPut: Character space; nextPutAll: key. value == true ifFalse: [ - aDocument nextPutAll: '="'; - print: value; - nextPut: $" ] ] ] \ No newline at end of file + aDocument + nextPutAll: '="'; + print: value; + nextPut: $" ] ] ] \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WAComplexRoute.class/instance/matchesParameters..st b/repository/Seaside-REST-Core.package/WAComplexRoute.class/instance/matchesParameters..st index 4cb182ba1..e963497a2 100644 --- a/repository/Seaside-REST-Core.package/WAComplexRoute.class/instance/matchesParameters..st +++ b/repository/Seaside-REST-Core.package/WAComplexRoute.class/instance/matchesParameters..st @@ -1,10 +1,17 @@ testing matchesParameters: aDictionary - parameterMatches size = aDictionary size - ifFalse: [ ^ false ]. + + optionalQueryParameters ifNil:[ + parameterMatches size = aDictionary size + ifFalse: [ ^ false ] ]. parameterMatches keysAndValuesDo: [ :name :match | | value | value := aDictionary at: name ifAbsent: [ ^ false ]. (match matchesName: name value: value) ifFalse: [ ^ false ] ]. + optionalQueryParameters ifNotNil:[ + | allPossibleParameters | + allPossibleParameters := parameterMatches keys, optionalQueryParameters. + (aDictionary keys allSatisfy: [ :k | allPossibleParameters includes: k ]) ifFalse: [ ^ false ] ]. + ^ true \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARoute.class/README.md b/repository/Seaside-REST-Core.package/WARoute.class/README.md index 9022d999a..df4052700 100644 --- a/repository/Seaside-REST-Core.package/WARoute.class/README.md +++ b/repository/Seaside-REST-Core.package/WARoute.class/README.md @@ -1,19 +1,7 @@ I am a message that can be sent if I match a request. Message arguments can be taken from the request. Instance Variables: - method - selector - produces - consumes - -method - - The HTTP method on which to follow this route, eg. 'GET' - -selector - - The selector to perform, eg. #index - -produces - - The MIME type this route produces (Content-Type HTTP header) - -consumes - - The MIME type this route accepts (Accept HTTP header) \ No newline at end of file + method : The HTTP method on which to follow this route, eg. 'GET' + selector : The selector to perform, eg. #index + produces : The MIME type this route produces (Content-Type HTTP header) + consumes : The MIME type this route accepts (Accept HTTP header) \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARoute.class/instance/initializeOptionalQueryFieldParametersFrom..st b/repository/Seaside-REST-Core.package/WARoute.class/instance/initializeOptionalQueryFieldParametersFrom..st new file mode 100644 index 000000000..62a376307 --- /dev/null +++ b/repository/Seaside-REST-Core.package/WARoute.class/instance/initializeOptionalQueryFieldParametersFrom..st @@ -0,0 +1,5 @@ +initialization +initializeOptionalQueryFieldParametersFrom: aString + + optionalQueryParameters := OrderedCollection new. + aString splitOn: $, do: [ :s | optionalQueryParameters add: s ] \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARoute.class/properties.json b/repository/Seaside-REST-Core.package/WARoute.class/properties.json index 06a120632..d9be102bb 100644 --- a/repository/Seaside-REST-Core.package/WARoute.class/properties.json +++ b/repository/Seaside-REST-Core.package/WARoute.class/properties.json @@ -1,5 +1,5 @@ { - "commentStamp" : "pmm 7/28/2011 20:33", + "commentStamp" : "2025-07-20T15:37:39.685139+03:00", "super" : "WAObject", "category" : "Seaside-REST-Core-Route", "classinstvars" : [ ], @@ -9,7 +9,8 @@ "method", "selector", "produces", - "consumes" + "consumes", + "optionalQueryParameters" ], "name" : "WARoute", "type" : "normal" diff --git a/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/create.st b/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/create.st index a6ee19590..5be24cd70 100644 --- a/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/create.st +++ b/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/create.st @@ -1,5 +1,9 @@ private create - ^ path isNil + | route | + route := path isNil ifTrue: [ self createSimpleRoute ] - ifFalse: [ self createComplexRoute ] \ No newline at end of file + ifFalse: [ self createComplexRoute ]. + optionalQueryParameters ifNotNil:[ + route initializeOptionalQueryFieldParametersFrom: optionalQueryParameters ]. + ^ route \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/optionalQueryParameters..st b/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/optionalQueryParameters..st new file mode 100644 index 000000000..23d5c7daf --- /dev/null +++ b/repository/Seaside-REST-Core.package/WARouteBuilder.class/instance/optionalQueryParameters..st @@ -0,0 +1,5 @@ +configuration +optionalQueryParameters: aString + + + optionalQueryParameters := aString \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARouteBuilder.class/properties.json b/repository/Seaside-REST-Core.package/WARouteBuilder.class/properties.json index 053708986..2564d9b8c 100644 --- a/repository/Seaside-REST-Core.package/WARouteBuilder.class/properties.json +++ b/repository/Seaside-REST-Core.package/WARouteBuilder.class/properties.json @@ -12,7 +12,8 @@ "method", "path", "produces", - "consumes" + "consumes", + "optionalQueryParameters" ], "name" : "WARouteBuilder", "type" : "normal" diff --git a/repository/Seaside-REST-Core.package/WARouteContainer.class/README.md b/repository/Seaside-REST-Core.package/WARouteContainer.class/README.md index 14b0f91a1..336f02a59 100644 --- a/repository/Seaside-REST-Core.package/WARouteContainer.class/README.md +++ b/repository/Seaside-REST-Core.package/WARouteContainer.class/README.md @@ -1,11 +1,5 @@ A WARouteContainer is a collection of routes that all accept the same number of path elements ordered by priority. Instance Variables - pathElementCount: - routes: > - -pathElementCount - - the number of path elements that any of the routes in this container accepts - -routes - - the routes ordered by priority + pathElementCount : the number of path elements that any of the routes in this container accepts + routes >: the routes ordered by priority diff --git a/repository/Seaside-REST-Core.package/WARouteContainer.class/instance/routeForElements.parameters.contentType.accept.ifAbsent..st b/repository/Seaside-REST-Core.package/WARouteContainer.class/instance/routeForElements.parameters.contentType.accept.ifAbsent..st index 4a760d6cf..1eb7feb49 100644 --- a/repository/Seaside-REST-Core.package/WARouteContainer.class/instance/routeForElements.parameters.contentType.accept.ifAbsent..st +++ b/repository/Seaside-REST-Core.package/WARouteContainer.class/instance/routeForElements.parameters.contentType.accept.ifAbsent..st @@ -4,8 +4,8 @@ routeForElements: aCollection parameters: aDictionary contentType: aMimeType acc result := (routes select: [ :each | (each matchesPath: aCollection) and: [ (each matchesParameters: aDictionary) - and: [ (aMimeType isNil or: [ each consumes: aMimeType ]) - and: [ aCollectionOfAccept isNil or: [ each produces: aCollectionOfAccept ] ] ] ] ]) asArray. + and: [ (aMimeType isNil or: [ each consumes: aMimeType ]) + and: [ aCollectionOfAccept isNil or: [ each produces: aCollectionOfAccept ] ] ] ] ]) asArray. result isEmpty ifTrue: [ ^ anAbsentBlock value ]. result size = 1 diff --git a/repository/Seaside-REST-Core.package/WARouteContainer.class/properties.json b/repository/Seaside-REST-Core.package/WARouteContainer.class/properties.json index 981da7a3c..ce1318ffe 100644 --- a/repository/Seaside-REST-Core.package/WARouteContainer.class/properties.json +++ b/repository/Seaside-REST-Core.package/WARouteContainer.class/properties.json @@ -1,5 +1,5 @@ { - "commentStamp" : "pmm 9/14/2013 16:04", + "commentStamp" : "2025-07-23T11:12:55.002952+03:00", "super" : "WAObject", "category" : "Seaside-REST-Core-Route", "classinstvars" : [ ], diff --git a/repository/Seaside-REST-Core.package/WARouteResult.class/README.md b/repository/Seaside-REST-Core.package/WARouteResult.class/README.md index df79f18b3..883748291 100644 --- a/repository/Seaside-REST-Core.package/WARouteResult.class/README.md +++ b/repository/Seaside-REST-Core.package/WARouteResult.class/README.md @@ -1,15 +1,6 @@ I am the result of a route look up. I contain all the information required to "execute" the result. Instance Variables: - route - elements > - parameters - -route - the found route - -elements - the unconsumed path elements of the request - -parameters - the query fields of the request \ No newline at end of file + route : the found route + elements >: the unconsumed path elements of the request + parameters : the query fields of the request \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WARouteResult.class/properties.json b/repository/Seaside-REST-Core.package/WARouteResult.class/properties.json index c5577d0c4..687ff8bc3 100644 --- a/repository/Seaside-REST-Core.package/WARouteResult.class/properties.json +++ b/repository/Seaside-REST-Core.package/WARouteResult.class/properties.json @@ -1,5 +1,5 @@ { - "commentStamp" : "pmm 9/14/2013 16:03", + "commentStamp" : "2025-07-23T11:13:39.03153+03:00", "super" : "WAObject", "category" : "Seaside-REST-Core-Route", "classinstvars" : [ ], diff --git a/repository/Seaside-REST-Core.package/WASimpleRoute.class/README.md b/repository/Seaside-REST-Core.package/WASimpleRoute.class/README.md index 51c950272..0c2aa666e 100644 --- a/repository/Seaside-REST-Core.package/WASimpleRoute.class/README.md +++ b/repository/Seaside-REST-Core.package/WASimpleRoute.class/README.md @@ -1,7 +1,4 @@ I match only on an exact number of path elements and no URL parameters. The path elements are turned into message arguments. Instance Variables: - count - -count - - The exact number of path elements that have to be present. \ No newline at end of file + count : The exact number of path elements that have to be present. \ No newline at end of file diff --git a/repository/Seaside-REST-Core.package/WASimpleRoute.class/instance/matchesParameters..st b/repository/Seaside-REST-Core.package/WASimpleRoute.class/instance/matchesParameters..st index b231ca85b..ed3baa42f 100644 --- a/repository/Seaside-REST-Core.package/WASimpleRoute.class/instance/matchesParameters..st +++ b/repository/Seaside-REST-Core.package/WASimpleRoute.class/instance/matchesParameters..st @@ -1,3 +1,7 @@ testing matchesParameters: aDictionary - ^ aDictionary isEmpty \ No newline at end of file + + optionalQueryParameters isNil + ifTrue:[ aDictionary isEmpty ifFalse: [ ^ false ]] + ifFalse:[ (aDictionary keys allSatisfy: [ :k | optionalQueryParameters includes: k ]) ifFalse: [ ^ false ] ]. + ^ true diff --git a/repository/Seaside-REST-Core.package/WASimpleRoute.class/properties.json b/repository/Seaside-REST-Core.package/WASimpleRoute.class/properties.json index 8fde415d3..7d33b0652 100644 --- a/repository/Seaside-REST-Core.package/WASimpleRoute.class/properties.json +++ b/repository/Seaside-REST-Core.package/WASimpleRoute.class/properties.json @@ -1,5 +1,5 @@ { - "commentStamp" : "DamienPollet 6/27/2011 16:35", + "commentStamp" : "2025-07-20T16:19:41.001956+03:00", "super" : "WARoute", "category" : "Seaside-REST-Core-Route", "classinstvars" : [ ], diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/README.md b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/class/register.st b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/class/register.st new file mode 100644 index 000000000..7de6c66f9 --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/class/register.st @@ -0,0 +1,4 @@ +registration +register + + WAAdmin register: self at: 'examples/jsonapi' \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClasses.st b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClasses.st new file mode 100644 index 000000000..05482225d --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClasses.st @@ -0,0 +1,14 @@ +json api +getClasses + + + + + + ^ WAJsonCanvas builder render: [ :json | + json array: [ + Smalltalk allClasses do:[ :class | + json object: [ + json + key: 'name' value: class name; + key: 'instvars' value: [ json array: [ class instVarNames do: [ :iv | json string: iv ] ] ] ] ] ] ] \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClassesMatching..st b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClassesMatching..st new file mode 100644 index 000000000..7c46afdbc --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getClassesMatching..st @@ -0,0 +1,15 @@ +json api +getClassesMatching: classNameSubstring + + + + + + ^ WAJsonCanvas builder render: [ :json | + json array: [ + (Smalltalk allClasses select: [ :class | (class name indexOfSubCollection: classNameSubstring startingAt: 0) ~= 0 ]) + do: [ :class | + json object: [ + json + key: 'name' value: class name; + key: 'instvars' value: [ json array: [ class instVarNames do: [ :iv | json string: iv ] ] ] ] ] ] ] \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getMethodsOf..st b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getMethodsOf..st new file mode 100644 index 000000000..ee06ab7e4 --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/getMethodsOf..st @@ -0,0 +1,17 @@ +json api +getMethodsOf: className + + + + + + | theClass | + theClass := Smalltalk at: className asSymbol ifAbsent: [ self respondNotFound ]. + + ^ WAJsonCanvas builder render: [ :json | + json array: [ + theClass methodsDo: [ :method | + json object: [ + json + key: 'selector' value: method selector; + key: 'source' value: (GRPlatform current sourceCodeStringOf: method) ] ] ] ] \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/respondNotFound.st b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/respondNotFound.st new file mode 100644 index 000000000..a3957970c --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/instance/respondNotFound.st @@ -0,0 +1,6 @@ +helpers +respondNotFound + + self requestContext responseGenerator + notFound; + respond \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/properties.json b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/properties.json new file mode 100644 index 000000000..050ec342c --- /dev/null +++ b/repository/Seaside-REST-Examples.package/WAJsonAPIExample.class/properties.json @@ -0,0 +1,11 @@ +{ + "commentStamp" : "", + "super" : "WARestfulHandler", + "category" : "Seaside-REST-Examples", + "classinstvars" : [ ], + "pools" : [ ], + "classvars" : [ ], + "instvars" : [ ], + "name" : "WAJsonAPIExample", + "type" : "normal" +} \ No newline at end of file diff --git a/repository/Seaside-REST-Examples.package/monticello.meta/categories.st b/repository/Seaside-REST-Examples.package/monticello.meta/categories.st index 7d03212e3..56780837d 100644 --- a/repository/Seaside-REST-Examples.package/monticello.meta/categories.st +++ b/repository/Seaside-REST-Examples.package/monticello.meta/categories.st @@ -1 +1 @@ -SystemOrganization addCategory: #'Seaside-REST-Examples'! +self packageOrganizer ensurePackage: #'Seaside-REST-Examples' withTags: #()! diff --git a/repository/Seaside-REST-Examples.package/monticello.meta/version b/repository/Seaside-REST-Examples.package/monticello.meta/version deleted file mode 100644 index f3657b745..000000000 --- a/repository/Seaside-REST-Examples.package/monticello.meta/version +++ /dev/null @@ -1,2 +0,0 @@ -(name 'Seaside-REST-Examples-pmm.2' message 'Add REST examples from 2014 -https://github.com/SeasideSt/Seaside/issues/891 - add package dependencies' id '538a6be4-3c8a-4040-8eeb-8604b29807ca' date '10 September 2016' time '3:06:07.924364 pm' author 'pmm' ancestors ((name 'Seaside-REST-Examples-pmm.1' message 'Add REST examples from 2014 #891' id '094a45ac-2710-45d1-b6fa-f70f526f4239' date '27 August 2016' time '5:45:35.530479 pm' author 'pmm' ancestors () stepChildren ())) stepChildren ()) \ No newline at end of file diff --git a/repository/Seaside-Tests-REST-Core.package/WAComplexRouteTest.class/instance/testParameterMatchingOptionalParameters.st b/repository/Seaside-Tests-REST-Core.package/WAComplexRouteTest.class/instance/testParameterMatchingOptionalParameters.st new file mode 100644 index 000000000..d8be9c0d5 --- /dev/null +++ b/repository/Seaside-Tests-REST-Core.package/WAComplexRouteTest.class/instance/testParameterMatchingOptionalParameters.st @@ -0,0 +1,11 @@ +tests +testParameterMatchingOptionalParameters + | route | + route := WARoute get: '/{1}/_all_docs?required={2}' selector: #a:required:. + route initializeOptionalQueryFieldParametersFrom: 'sorted,filter'. + self assert: (route matchesParameters: (Dictionary new add: 'required' -> 'true';yourself)). + self assert: (route matchesParameters: (Dictionary new add: 'required' -> 'true'; add: 'sorted' -> 'true'; yourself)). + self assert: (route matchesParameters: (Dictionary new add: 'required' -> 'true'; add: 'sorted' -> 'true'; add: 'filter' -> 'none'; yourself)). + + self deny: (route matchesParameters: (Dictionary new add: 'required' -> 'true'; add: 'key' -> 'value'; yourself)). + self deny: (route matchesParameters: (Dictionary new add: 'required' -> 'true'; add: 'sorted' -> 'true'; add: 'filter' -> 'none'; add: 'key' -> 'value'; yourself)). \ No newline at end of file diff --git a/repository/Seaside-Tests-REST-Core.package/WAPragmaStubHandler.class/instance/getAllDocuments..st b/repository/Seaside-Tests-REST-Core.package/WAPragmaStubHandler.class/instance/getAllDocuments..st index 977e04b6a..6aa51182f 100644 --- a/repository/Seaside-Tests-REST-Core.package/WAPragmaStubHandler.class/instance/getAllDocuments..st +++ b/repository/Seaside-Tests-REST-Core.package/WAPragmaStubHandler.class/instance/getAllDocuments..st @@ -2,4 +2,5 @@ public-documents getAllDocuments: databaseName + \ No newline at end of file