From 76b5b00961ccb4fefccc3df0b7486b15976628e4 Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Fri, 29 May 2026 11:25:35 +0200 Subject: [PATCH 1/3] fix: move requestUserDirectory to presenter layer --- .../StFileBrowserAbstractPresenter.class.st | 18 ++++++++- .../StFileSystemModel.class.st | 38 +++---------------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st index d88b4e46e..63da9ae00 100644 --- a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st +++ b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st @@ -66,8 +66,8 @@ StFileBrowserAbstractPresenter >> bookmarksTreeTable [ { #category : 'utilities' } StFileBrowserAbstractPresenter >> createDirectory [ - - self model createDirectory. + + self model createDirectory: (self requestDirectoryName: 'default-directory'). self updateFileSystemPresenters. ] @@ -163,6 +163,20 @@ StFileBrowserAbstractPresenter >> openOnLastDirectory [ ^ StFileBrowserSettings openOnLastDirectory ] +{ #category : 'utilities' } +StFileBrowserAbstractPresenter >> requestDirectoryName: defaultName [ + "Open a dialog to request a directory from the user" + + | answer | + answer := [ self + request: 'Folder name' + initialAnswer: defaultName + title: 'Create New Folder' ] + on: SpCancelledInteractionError + do: [ : ex | self inform: 'Cancelled'. nil ]. + ^ answer +] + { #category : 'initialization' } StFileBrowserAbstractPresenter >> resetBookmarks [ "Reset bookmarks to their defaults" diff --git a/src/NewTools-FileBrowser/StFileSystemModel.class.st b/src/NewTools-FileBrowser/StFileSystemModel.class.st index 7d84c7601..d9332175b 100644 --- a/src/NewTools-FileBrowser/StFileSystemModel.class.st +++ b/src/NewTools-FileBrowser/StFileSystemModel.class.st @@ -90,29 +90,17 @@ StFileSystemModel >> bookmarks: aCollectionOfGroupBookMark [ ] { #category : 'utilities' } -StFileSystemModel >> createDirectory [ - "Create a directory with a default name" - - ^ self createDirectory: 'new-folder' -] - -{ #category : 'utilities' } -StFileSystemModel >> createDirectory: initialName [ +StFileSystemModel >> createDirectory: name [ "Create a directory named initialName " - | name path | - - (name := self requestUserDirectory: initialName) isEmptyOrNil - ifTrue: [ ^ self ]. - (path := currentDirectory / name) exists - ifFalse: [ + | path | + name isEmptyOrNil ifTrue: [ ^ self ]. + (path := currentDirectory / name) exists ifFalse: [ (currentDirectory / name) ensureCreateDirectory. self openFolder: currentDirectory. ^ self ]. - path isDirectory - ifTrue: [ self application alert: 'A folder with that name already exists.' ]. - path isFile - ifTrue: [ self application alert: 'A file with that name already exists.' ]. + path isDirectory ifTrue: [ self application alert: 'A folder with that name already exists.' ]. + path isFile ifTrue: [ self application alert: 'A file with that name already exists.' ]. self createDirectory: name ] @@ -168,20 +156,6 @@ StFileSystemModel >> openFolder: aFileReference [ self history register: self currentDirectory. ] -{ #category : 'utilities' } -StFileSystemModel >> requestUserDirectory: initialName [ - "Open a dialog to request a directory from the user" - - | answer | - answer := [ self - request: 'Folder name' - initialAnswer: initialName - title: 'Create New Folder' ] - on: SpCancelledInteractionError - do: [ : ex | self inform: 'Cancelled'. nil ]. - ^ answer -] - { #category : 'initialization' } StFileSystemModel >> resetBookmarks [ "Reset the global bookmarks" From f6c7473365c4f4975213c2e70ec2b0a213c224b4 Mon Sep 17 00:00:00 2001 From: Nicolas Potel Date: Fri, 29 May 2026 14:51:36 +0200 Subject: [PATCH 2/3] fix: throw error and then alter when incorrect directory name + adding some tests --- .../StFileSystemModelTest.class.st | 56 +++++++++++++++++++ .../StFileBrowserAbstractPresenter.class.st | 8 ++- .../StFileSystemModel.class.st | 15 ++--- 3 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 src/NewTools-FileBrowser-Tests/StFileSystemModelTest.class.st diff --git a/src/NewTools-FileBrowser-Tests/StFileSystemModelTest.class.st b/src/NewTools-FileBrowser-Tests/StFileSystemModelTest.class.st new file mode 100644 index 000000000..64be1ac02 --- /dev/null +++ b/src/NewTools-FileBrowser-Tests/StFileSystemModelTest.class.st @@ -0,0 +1,56 @@ +Class { + #name : 'StFileSystemModelTest', + #superclass : 'TestCase', + #category : 'NewTools-FileBrowser-Tests-Utils', + #package : 'NewTools-FileBrowser-Tests', + #tag : 'Utils' +} + +{ #category : 'tests' } +StFileSystemModelTest >> testCreateDirectory [ + + | model fileRef | + model := StFileSystemModel new. + model currentDirectory: self temporaryDirectory. + model history: ConfigurableHistoryIterator new. + + fileRef := self temporaryDirectory / 'abc'. + + model createDirectory: 'abc'. + + self assert: fileRef exists. + self assert: fileRef isDirectory +] + +{ #category : 'tests' } +StFileSystemModelTest >> testCreateDirectoryShouldNotDuplicateFile [ + + | model fileRef | + model := StFileSystemModel new. + model currentDirectory: self temporaryDirectory. + + fileRef := self temporaryDirectory / 'abc'. + fileRef ensureCreateFile . + self should: [ model createDirectory: 'abc' ] raise: Error description: 'A file with that name already exists.' +] + +{ #category : 'tests' } +StFileSystemModelTest >> testCreateDirectoryShouldNotDuplicateFolder [ + + | model fileRef | + model := StFileSystemModel new. + model currentDirectory: self temporaryDirectory. + + fileRef := self temporaryDirectory / 'abc'. + fileRef ensureCreateDirectory. + self should: [ model createDirectory: 'abc' ] raise: Error description: 'A folder with that name already exists.' +] + +{ #category : 'tests' } +StFileSystemModelTest >> testCreateDirectoryShouldNotWorkWithEmptyName [ + + | model | + model := StFileSystemModel new. + self assert: (model createDirectory: '') equals: model. + self assert: (model createDirectory: nil) equals: model. +] diff --git a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st index 63da9ae00..f78f2061f 100644 --- a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st +++ b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st @@ -66,9 +66,11 @@ StFileBrowserAbstractPresenter >> bookmarksTreeTable [ { #category : 'utilities' } StFileBrowserAbstractPresenter >> createDirectory [ - - self model createDirectory: (self requestDirectoryName: 'default-directory'). - self updateFileSystemPresenters. + + [ self model createDirectory: (self requestDirectoryName: 'default-directory') ] + on: Error + do: [ :ex | self application alert: ex messageText ]. + self updateFileSystemPresenters ] { #category : 'accessing' } diff --git a/src/NewTools-FileBrowser/StFileSystemModel.class.st b/src/NewTools-FileBrowser/StFileSystemModel.class.st index d9332175b..acf2d7b40 100644 --- a/src/NewTools-FileBrowser/StFileSystemModel.class.st +++ b/src/NewTools-FileBrowser/StFileSystemModel.class.st @@ -95,13 +95,14 @@ StFileSystemModel >> createDirectory: name [ | path | name isEmptyOrNil ifTrue: [ ^ self ]. - (path := currentDirectory / name) exists ifFalse: [ - (currentDirectory / name) ensureCreateDirectory. - self openFolder: currentDirectory. - ^ self ]. - path isDirectory ifTrue: [ self application alert: 'A folder with that name already exists.' ]. - path isFile ifTrue: [ self application alert: 'A file with that name already exists.' ]. - self createDirectory: name + + path := currentDirectory / name. + path isDirectory ifTrue: [ self error: 'A folder with that name already exists.' ]. + path isFile ifTrue: [ self error: 'A file with that name already exists.' ]. + + path exists ifTrue: [ ^ self ]. + (currentDirectory / name) ensureCreateDirectory. + self openFolder: currentDirectory ] { #category : 'accessing' } From 7ba4163dec6b70a9417a02707a01e9144f984b6a Mon Sep 17 00:00:00 2001 From: Nicolas Date: Fri, 29 May 2026 15:12:00 +0200 Subject: [PATCH 3/3] Fix formatting of error handling --- .../StFileBrowserAbstractPresenter.class.st | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st index f78f2061f..a6facebfd 100644 --- a/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st +++ b/src/NewTools-FileBrowser/StFileBrowserAbstractPresenter.class.st @@ -175,7 +175,7 @@ StFileBrowserAbstractPresenter >> requestDirectoryName: defaultName [ initialAnswer: defaultName title: 'Create New Folder' ] on: SpCancelledInteractionError - do: [ : ex | self inform: 'Cancelled'. nil ]. + do: [ :ex | self inform: 'Cancelled'. nil ]. ^ answer ]