diff --git a/Ride-Builder/RideAppHomePresenterClassHelper.class.st b/Ride-Builder/RideAppHomePresenterClassHelper.class.st index 91bfc64..77e87bf 100644 --- a/Ride-Builder/RideAppHomePresenterClassHelper.class.st +++ b/Ride-Builder/RideAppHomePresenterClassHelper.class.st @@ -22,6 +22,18 @@ RideAppHomePresenterClassHelper class >> indexMethodFor: aSymbol [ ' format: { aSymbol } ] +{ #category : #initialization } +RideAppHomePresenterClassHelper class >> showHomeMethodFor: aSymbol [ + + ^ 'showHome + + + ^ { + (#GET -> ''/''). + (self -> #index) } + ' +] + { #category : #initialization } RideAppHomePresenterClassHelper class >> templatePathMethodFor: aSymbol [ @@ -55,6 +67,13 @@ RideAppHomePresenterClassHelper >> addIndexMethodTo: aClass for: aSymbol [ aClass organization classify: #index under: 'accessing' ] +{ #category : #actions } +RideAppHomePresenterClassHelper >> addShowHomeMethodTo: aClass for: aSymbol [ + + aClass class compile: (self class showHomeMethodFor: aSymbol). + aClass class organization classify: #showHome under: 'accessing' +] + { #category : #actions } RideAppHomePresenterClassHelper >> addTemplatePathMethodTo: aClass for: aSymbol [ @@ -88,6 +107,8 @@ RideAppHomePresenterClassHelper >> for: aSymbol [ | appClass | appClass := super for: aSymbol. + self addShowHomeMethodTo: appClass for: aSymbol. + self addIndexMethodTo: appClass for: aSymbol. self addTemplatePathMethodTo: appClass for: aSymbol. self addWebAppNameMethodTo: appClass for: aSymbol diff --git a/Ride-Builder/RideCRUDHelper.class.st b/Ride-Builder/RideCRUDHelper.class.st index 562bf8a..5998a40 100644 --- a/Ride-Builder/RideCRUDHelper.class.st +++ b/Ride-Builder/RideCRUDHelper.class.st @@ -39,7 +39,35 @@ RideCRUDHelper class >> createMethodFor: aSymbol [ self redirectToIndex ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> createModelMethodFor: aSymbol [ + + ^ 'create{1} + + + ^ \{ + (#POST -> ''/{2}''). + (self -> #create) \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> deleteModelClassMethodFor: aSymbol [ + + ^ 'delete{1} + + + ^ \{ + (#DELETE -> ''/{2}/''). + (self -> #delete) \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } ] { #category : #accessing } @@ -59,7 +87,7 @@ RideCRUDHelper class >> destroyMethodFor: aSymbol [ self redirectToIndex ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } ] { #category : #accessing } @@ -75,7 +103,35 @@ RideCRUDHelper class >> editMethodFor: aSymbol [ ^ self renderUsing: ''edit.html'' ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> editModelByIdClassMethodFor: aSymbol [ + + ^ 'edit{1}ById + + + ^ \{ + (#GET -> ''/{2}//edit''). + (self -> #edit) \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> formActionClassMethodFor: aSymbol [ + + ^ 'formActionOn{1}ById + + + ^ \{ + (#POST -> ''/{2}/''). + (self -> #formAction) \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } ] { #category : #accessing } @@ -91,7 +147,7 @@ RideCRUDHelper class >> indexMethodFor: aSymbol [ ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase. + aSymbol asPlural asSnakeCase. aSymbol uncapitalized asPlural } ] @@ -107,7 +163,7 @@ RideCRUDHelper class >> newModelMethodFor: aSymbol [ ^ self renderUsing: ''new.html'' ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } ] { #category : #accessing } @@ -123,10 +179,50 @@ RideCRUDHelper class >> pluralIndexMethodFor: aSymbol [ ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase. + aSymbol asPlural asSnakeCase. aSymbol uncapitalized asPlural } ] +{ #category : #accessing } +RideCRUDHelper class >> showModelByIdClassMethodFor: aSymbol [ + + ^ 'show{1}ById + + + ^ \{ + (#GET -> ''/{2}/''). + (self -> #index) \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> showModelsMethodFor: aSymbol [ + + ^ 'show{1} + + + ^ \{ + (#GET -> ''/{2}''). + (self -> #index) \} +' format: { + aSymbol asPlural. + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> showNewOneClassMethodFor: aSymbol [ + + ^ 'showNewOne + + + ^ \{ + (#GET -> ''/{1}/new''). + (self -> #newModel) \} +' format: { aSymbol asPlural asSnakeCase } +] + { #category : #accessing } RideCRUDHelper class >> singularIndexMethodFor: aSymbol [ @@ -138,9 +234,9 @@ RideCRUDHelper class >> singularIndexMethodFor: aSymbol [ model ifNil: self modelNotFoundHandler. ^ self renderUsing: ''index.html'' -' format: { +' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } ] { #category : #accessing } @@ -162,7 +258,25 @@ RideCRUDHelper class >> updateMethodFor: aSymbol [ self redirectFor: model ' format: { aSymbol. - aSymbol asLowercase asPlural asSnakeCase } + aSymbol asPlural asSnakeCase } +] + +{ #category : #accessing } +RideCRUDHelper class >> updateModelClassMethodFor: aSymbol [ + + ^ 'update{1} + + + ^ \{ + \{ + (#PUT -> ''/{2}/''). + (self -> #update) \}. + \{ + (#PATCH -> ''/{2}/''). + (self -> #update) \} \} +' format: { + aSymbol. + aSymbol asPlural asSnakeCase } ] { #category : #actions } @@ -179,6 +293,28 @@ RideCRUDHelper >> addCreateMethodTo: aClass for: aSymbol [ aClass organization classify: #create under: 'actions' ] +{ #category : #actions } +RideCRUDHelper >> addCreateModelClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: (self class createModelMethodFor: aSymbol). + selector := 'create{1}' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + +{ #category : #actions } +RideCRUDHelper >> addDeleteModelClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: (self class deleteModelClassMethodFor: aSymbol). + selector := 'delete{1}' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + { #category : #actions } RideCRUDHelper >> addDestroyMethodTo: aClass for: aSymbol [ @@ -193,12 +329,35 @@ RideCRUDHelper >> addEditMethodTo: aClass for: aSymbol [ aClass organization classify: #edit under: 'actions' ] +{ #category : #actions } +RideCRUDHelper >> addEditModelByIdClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: + (self class editModelByIdClassMethodFor: aSymbol). + selector := 'edit{1}ById' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + { #category : #actions } RideCRUDHelper >> addEditTemplateFor: aSymbol [ self subclassResponsibility ] +{ #category : #actions } +RideCRUDHelper >> addFormActionClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: (self class formActionClassMethodFor: aSymbol). + selector := 'formActionOn{1}ById' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + { #category : #actions } RideCRUDHelper >> addFormEditTemplateFor: aSymbol [ @@ -260,26 +419,15 @@ RideCRUDHelper >> addNewTemplateFor: aSymbol [ RideCRUDHelper >> addPluralCRUDMethodsTo: aClass for: aSymbol [ self addPluralIndexMethodTo: aClass for: aSymbol. - "self addIndexMethodTo: aClass for: aSymbol." self addModelsAccessorMethodTo: aClass for: aSymbol. - "self addShowMethodTo: aClass for: aSymbol. - self addNewModelMethodTo: aClass for: aSymbol. - self addEditMethodTo: aClass for: aSymbol. - self addCreateMethodTo: aClass for: aSymbol. - self addUpdateMethodTo: aClass for: aSymbol. - self addDestroyMethodTo: aClass for: aSymbol" + self addShowModelsMethodTo: aClass for: aSymbol. + ] { #category : #actions } RideCRUDHelper >> addPluralCRUDTemplatesTo: aClass for: aSymbol [ self addPluralIndexTemplateFor: aSymbol. - "self addShowTemplateFor: aSymbol. - self addNewTemplateFor: aSymbol. - self addEditTemplateFor: aSymbol. - self addFormNewTemplateFor: aSymbol. - self addFormEditTemplateFor: aSymbol. - self addFormFieldsTemplateFor: aSymbol." self addPluralModelDisplayContentFor: aSymbol ] @@ -290,6 +438,12 @@ RideCRUDHelper >> addPluralIndexMethodTo: aClass for: aSymbol [ aClass organization classify: #index under: 'actions' ] +{ #category : #actions } +RideCRUDHelper >> addPluralIndexTemplateFor: aSymbol [ + + self subclassResponsibility +] + { #category : #actions } RideCRUDHelper >> addPluralIndexTemplateFor: aClass for: aSymbol [ @@ -303,6 +457,34 @@ RideCRUDHelper >> addPluralModelDisplayContentFor: aSymbol [ self subclassResponsibility ] +{ #category : #actions } +RideCRUDHelper >> addShowModelByIdClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: + (self class showModelByIdClassMethodFor: aSymbol). + selector := 'show{1}ById' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + +{ #category : #actions } +RideCRUDHelper >> addShowModelsMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: (self class showModelsMethodFor: aSymbol). + selector := 'show{1}' format: { aSymbol asPlural }. + aClass class organization classify: selector asSymbol under: 'accessing' +] + +{ #category : #actions } +RideCRUDHelper >> addShowNewOneClassMethodTo: aClass for: aSymbol [ + + aClass class compile: (self class showNewOneClassMethodFor: aSymbol). + aClass class organization classify: #showNewOne under: 'accessing' +] + { #category : #actions } RideCRUDHelper >> addSingularCRUDMethodsTo: aClass for: aSymbol [ @@ -311,6 +493,13 @@ RideCRUDHelper >> addSingularCRUDMethodsTo: aClass for: aSymbol [ self addNewModelMethodTo: aClass for: aSymbol. self addEditMethodTo: aClass for: aSymbol. self addCreateMethodTo: aClass for: aSymbol. + self addCreateModelClassMethodTo: aClass for: aSymbol. + self addDeleteModelClassMethodTo: aClass for: aSymbol. + self addEditModelByIdClassMethodTo: aClass for: aSymbol. + self addFormActionClassMethodTo: aClass for: aSymbol. + self addShowNewOneClassMethodTo: aClass for: aSymbol. + self addShowModelByIdClassMethodTo: aClass for: aSymbol. + self addUpdateModelClassMethodTo: aClass for: aSymbol. self addUpdateMethodTo: aClass for: aSymbol. self addDestroyMethodTo: aClass for: aSymbol ] @@ -319,7 +508,6 @@ RideCRUDHelper >> addSingularCRUDMethodsTo: aClass for: aSymbol [ RideCRUDHelper >> addSingularCRUDTemplatesTo: aClass for: aSymbol [ self addSingularIndexTemplateFor: aSymbol. - "self addShowTemplateFor: aSymbol." self addNewTemplateFor: aSymbol. self addEditTemplateFor: aSymbol. self addFormNewTemplateFor: aSymbol. @@ -335,6 +523,12 @@ RideCRUDHelper >> addSingularIndexMethodTo: aClass for: aSymbol [ aClass organization classify: #index under: 'actions' ] +{ #category : #actions } +RideCRUDHelper >> addSingularIndexTemplateFor: aSymbol [ + + self subclassResponsibility +] + { #category : #actions } RideCRUDHelper >> addSingularIndexTemplateFor: aClass for: aSymbol [ @@ -349,6 +543,17 @@ RideCRUDHelper >> addUpdateMethodTo: aClass for: aSymbol [ aClass organization classify: #update under: 'actions' ] +{ #category : #actions } +RideCRUDHelper >> addUpdateModelClassMethodTo: aClass for: aSymbol [ + + | selector | + aClass class compile: (self class updateModelClassMethodFor: aSymbol). + selector := 'update{1}' format: { aSymbol }. + aClass class organization + classify: selector asSymbol + under: 'accessing' +] + { #category : #actions } RideCRUDHelper >> for: aSymbol [ diff --git a/Ride-Builder/RideServerClassHelper.class.st b/Ride-Builder/RideServerClassHelper.class.st index f74415a..5f61b36 100644 --- a/Ride-Builder/RideServerClassHelper.class.st +++ b/Ride-Builder/RideServerClassHelper.class.st @@ -16,18 +16,6 @@ RideServerClassHelper class >> initializeMethodFor: aSymbol [ self router beDeclarative' ] -{ #category : #initialization } -RideServerClassHelper class >> routesDeclarationMethodFor: aSymbol [ - - ^ 'routesDeclaration - ^ \{ - \{ - (#GET -> ''/''). - ({1}HomePresenter -> #index) \}. - \} - ' format: { aSymbol } -] - { #category : #actions } RideServerClassHelper >> addInitializeMethodTo: aClass for: aSymbol [ @@ -35,13 +23,6 @@ RideServerClassHelper >> addInitializeMethodTo: aClass for: aSymbol [ aClass organization classify: #initialize under: 'initialization' ] -{ #category : #actions } -RideServerClassHelper >> addRoutesDeclarationMethodTo: aClass for: aSymbol [ - - aClass compile: (self class routesDeclarationMethodFor: aSymbol). - aClass organization classify: #routesDeclaration under: 'accessing' -] - { #category : #accessing } RideServerClassHelper >> classNameFor: aSymbol [ @@ -61,8 +42,7 @@ RideServerClassHelper >> for: aSymbol [ | appClass | appClass := super for: aSymbol. - self addInitializeMethodTo: appClass for: aSymbol. - self addRoutesDeclarationMethodTo: appClass for: aSymbol + self addInitializeMethodTo: appClass for: aSymbol ] { #category : #accessing } diff --git a/Ride-Tests/RideCoreTest.class.st b/Ride-Tests/RideCoreTest.class.st new file mode 100644 index 0000000..1a2a3a0 --- /dev/null +++ b/Ride-Tests/RideCoreTest.class.st @@ -0,0 +1,111 @@ +Class { + #name : #RideCoreTest, + #superclass : #RideTest, + #category : #'Ride-Tests' +} + +{ #category : #tests } +RideCoreTest >> setUp [ + + super setUp. + + Ride resource: RideResource +] + +{ #category : #tests } +RideCoreTest >> testCamelCaseToSnakeCase [ + + self assert: 'Some' asSnakeCase equals: 'some'. + self assert: 'SomeName' asSnakeCase equals: 'some_name'. + self assert: 'SomeLongerName' asSnakeCase equals: 'some_longer_name' +] + +{ #category : #tests } +RideCoreTest >> testDebugMode [ + + self deny: Ride isDebugMode. + self assert: RideServer defaultDebugMode equals: 0 +] + +{ #category : #tests } +RideCoreTest >> testDefaultHttpBind [ + + + self assert: RideServer defaultHttpBind equals: '0.0.0.0' +] + +{ #category : #tests } +RideCoreTest >> testDefaultHttpPort [ + + self assert: RideServer defaultHttpPort equals: 3004 +] + +{ #category : #tests } +RideCoreTest >> testDefaultMAXAGE [ + + self assert: RideServer defaultMAXAGE equals: 60 * 60 +] + +{ #category : #tests } +RideCoreTest >> testDefaultSMAXAGE [ + + self assert: RideServer defaultSMAXAGE equals: 120 * 60 +] + +{ #category : #tests } +RideCoreTest >> testDefaultWebSocketPort [ + + self assert: RideServer defaultWebSocketPort equals: 3008 +] + +{ #category : #tests } +RideCoreTest >> testHasWebSocket [ + + self deny: RideServer hasWebSocket +] + +{ #category : #tests } +RideCoreTest >> testHttpBind [ + + self assert: RideServer httpBind equals: '0.0.0.0' +] + +{ #category : #tests } +RideCoreTest >> testHttpPort [ + + self assert: RideServer httpPort equals: 3004 +] + +{ #category : #tests } +RideCoreTest >> testSettings [ + + self + assert: RideServer new settings asDictionary + equals: { } asDictionary +] + +{ #category : #tests } +RideCoreTest >> testSnakeCaseRouteToCamelCasePresenterName [ + + self + assert: (RideNameNormalizer presenterNameFromURISegment: 'some') + equals: 'SomePresenter'. + self + assert: + (RideNameNormalizer presenterNameFromURISegment: 'some_thing') + equals: 'SomeThingPresenter'. + self + assert: + (RideNameNormalizer presenterNameFromURISegment: + 'some_thing_modeled') + equals: 'SomeThingModeledPresenter' +] + +{ #category : #tests } +RideCoreTest >> testStartStop [ + + self flag: 'requires Mapless upgrade' + + "RideService start. + RideService stop" +] diff --git a/Ride-Tests/RideDeclarativeRoutingTest.class.st b/Ride-Tests/RideDeclarativeRoutingTest.class.st index d0d2bc2..f1dfecc 100644 --- a/Ride-Tests/RideDeclarativeRoutingTest.class.st +++ b/Ride-Tests/RideDeclarativeRoutingTest.class.st @@ -16,3 +16,26 @@ RideDeclarativeRoutingTest >> testSimpleWithoutParameters [ self assert: response equals: 'CoffeInvoice1'. server stop ] + +{ #category : #tests } +RideDeclarativeRoutingTest >> testTryingToAddAnAlreadyDefinedRoute [ + + | server routes | + routes := OrderedCollection new. + server := RideServer new. + + self + shouldnt: [ + server addRouteDefinition: { (#PATCH -> '/posts/') } to: routes ] + raise: RideAlreadyDefinedRouteError. + + self + shouldnt: [ + server addRouteDefinition: { (#GET -> '/posts/') } to: routes ] + raise: RideAlreadyDefinedRouteError. + + self + should: [ + server addRouteDefinition: { (#PATCH -> '/posts/') } to: routes ] + raise: RideAlreadyDefinedRouteError +] diff --git a/Ride-Tests/RideTest.class.st b/Ride-Tests/RideTest.class.st index 6c6a948..9cfff43 100644 --- a/Ride-Tests/RideTest.class.st +++ b/Ride-Tests/RideTest.class.st @@ -3,28 +3,3 @@ Class { #superclass : #TestCase, #category : #'Ride-Tests' } - -{ #category : #tests } -RideTest >> testCamelCaseToSnakeCase [ - - self assert: 'Some' asSnakeCase equals: 'some'. - self assert: 'SomeName' asSnakeCase equals: 'some_name'. - self assert: 'SomeLongerName' asSnakeCase equals: 'some_longer_name' -] - -{ #category : #tests } -RideTest >> testSnakeCaseRouteToCamelCasePresenterName [ - - self - assert: (RideNameNormalizer presenterNameFromURISegment: 'some') - equals: 'SomePresenter'. - self - assert: - (RideNameNormalizer presenterNameFromURISegment: 'some_thing') - equals: 'SomeThingPresenter'. - self - assert: - (RideNameNormalizer presenterNameFromURISegment: - 'some_thing_modeled') - equals: 'SomeThingModeledPresenter' -] diff --git a/Ride/ManifestRide.class.st b/Ride/ManifestRide.class.st index 5291ee0..82cef1a 100644 --- a/Ride/ManifestRide.class.st +++ b/Ride/ManifestRide.class.st @@ -6,3 +6,10 @@ Class { #superclass : #PackageManifest, #category : #'Ride-Manifest' } + +{ #category : #'code-critics' } +ManifestRide class >> ruleSentNotImplementedRuleV1FalsePositive [ + + + ^ #(#(#(#RGPackageDefinition #(#Ride)) #'2024-03-02T21:33:29.969701-03:00') ) +] diff --git a/Ride/Ride.class.st b/Ride/Ride.class.st index 4ad5e8d..d867c32 100644 --- a/Ride/Ride.class.st +++ b/Ride/Ride.class.st @@ -23,9 +23,9 @@ Ride class >> allowsLoglevel: aSymbol [ { #category : #actions } Ride class >> beDevEnvironment [ - "Sets the OS environment to be in #DEVELOPMENT mode" +