diff --git a/APLSource/Admin/DeleteLinksInDocuments_APLFiles.aplf b/APLSource/Admin/DeleteLinksInDocuments_APLFiles.aplf index 480830c8..46999f6c 100644 --- a/APLSource/Admin/DeleteLinksInDocuments_APLFiles.aplf +++ b/APLSource/Admin/DeleteLinksInDocuments_APLFiles.aplf @@ -32,6 +32,6 @@ ⎕NDELETE targetFolder :EndIf :Else - ∘∘∘ ⍝ Not implemented (yet?!) ⍝TODO⍝ + ∘∘∘ ⍝ Not implemented (yet?!) :EndIf :EndIf diff --git a/APLSource/Cider/API/CreateCreateProjectParms.aplf b/APLSource/Cider/API/CreateCreateProjectParms.aplf new file mode 100644 index 00000000..6ae7d3e9 --- /dev/null +++ b/APLSource/Cider/API/CreateCreateProjectParms.aplf @@ -0,0 +1 @@ + CreateCreateProjectParms←{⍺←⊢ ⋄ ⍺ ##.CreateCreateProjectParms ⍵} diff --git a/APLSource/Cider/API/CreateProject.aplf b/APLSource/Cider/API/CreateProject.aplf new file mode 100644 index 00000000..7e890559 --- /dev/null +++ b/APLSource/Cider/API/CreateProject.aplf @@ -0,0 +1 @@ + CreateProject←{1:shy←##.CreateProject ⍵} diff --git a/APLSource/Cider/UC/configFilename.aplf b/APLSource/Cider/ConfigFilename.aplf similarity index 50% rename from APLSource/Cider/UC/configFilename.aplf rename to APLSource/Cider/ConfigFilename.aplf index 86195ac8..3afe5c02 100644 --- a/APLSource/Cider/UC/configFilename.aplf +++ b/APLSource/Cider/ConfigFilename.aplf @@ -1,2 +1,2 @@ - r←configFilename + r←ConfigFilename r←'cider.config' diff --git a/APLSource/Cider/UC/CreateConfigFile.aplf b/APLSource/Cider/CreateConfigFile.aplf similarity index 56% rename from APLSource/Cider/UC/CreateConfigFile.aplf rename to APLSource/Cider/CreateConfigFile.aplf index bd5e99f2..e3b42afe 100644 --- a/APLSource/Cider/UC/CreateConfigFile.aplf +++ b/APLSource/Cider/CreateConfigFile.aplf @@ -1,24 +1,24 @@ - {name}←CreateConfigFile(filename name);config;globalCiderConfigFilename;tatinVars +{name}←CreateConfigFile(filename name);config;globalCiderConfigFilename;tatinVars ⍝ Copies the config template file over and injects the last part of the path of "filename" as "projectSpace" - ('The folder already hosts a file "',configFilename,'"')Assert~⎕NEXISTS filename - globalCiderConfigFilename←P.GetCiderGlobalConfigHomeFolder,'cider.config.template' - tatinVars←P.##.TatinVars + ('The folder already hosts a file "',ConfigFilename,'"')Assert~⎕NEXISTS filename + globalCiderConfigFilename←GetCiderGlobalConfigHomeFolder,'cider.config.template' + tatinVars←##.TatinVars :If 0=⎕NEXISTS globalCiderConfigFilename ⍝ First attempt - globalCiderConfigFilename(⎕NCOPY P.##.F.ExecNfunction)tatinVars.HOME,'/cider.config.template' + globalCiderConfigFilename(⎕NCOPY F.ExecNfunction)tatinVars.HOME,'/cider.config.template' :ElseIf ≢/{⊃⎕NGET ⍵}¨globalCiderConfigFilename(tatinVars.HOME,'/cider.config.template') ⍝ Replace by the template if changed - globalCiderConfigFilename(⎕NCOPY⍠('IfExists' 'Replace')P.##.F.ExecNfunction)tatinVars.HOME,'/cider.config.template' + globalCiderConfigFilename(⎕NCOPY⍠('IfExists' 'Replace')F.ExecNfunction)tatinVars.HOME,'/cider.config.template' :EndIf - config←⎕JSON⍠('Dialect' 'JSON5')⊣⊃P.##.F.NGET globalCiderConfigFilename + config←⎕JSON⍠('Dialect' 'JSON5')⊣⊃F.NGET globalCiderConfigFilename :If 0=⎕SE.Link.⎕NC'Version' ⍝ There was no such function prior to Link 3 :OrIf 3=⌊⊃⊃(//)⎕VFI{⍵/⍨2>+\⍵='.'}⎕SE.Link.Version ⍝ Version 3.x? - config.LINK.watch←(1+P.HasDotNet)⊃'ns' 'both' + config.LINK.watch←(1+HasDotNet)⊃'ns' 'both' :EndIf :If (⊃name)∊'#⎕' name←{⍵↓⍨⍵⍳'.'}name :EndIf ((~name∊⎕D,⎕A,'_∆⍙',⎕C ⎕A)/name)←'_' config.CIDER.projectSpace←⍕name - config P.##.Put_JSON5 filename + config Put_JSON5 filename ⍝Done diff --git a/APLSource/Cider/CreateCreateProjectParms.aplf b/APLSource/Cider/CreateCreateProjectParms.aplf new file mode 100644 index 00000000..a781c7fc --- /dev/null +++ b/APLSource/Cider/CreateCreateProjectParms.aplf @@ -0,0 +1,21 @@ + parms←{parms_}CreateCreateProjectParms folder;list;b;l +⍝ Creates a namespace with all parameters one might pass to `CreateProject`.\\ +⍝ `folder` must point to the folder hosting the project to be created. +⍝ `parms_`, if specified, must be a namespace with some such parameters. +⍝ Parameters passed this way take precedence. + parms_←{0<⎕NC ⍵:⍎⍵ ⋄ ⍬}'parms_' + parms←(1⊃1↓⎕RSI,⎕THIS).⎕NS'' ⍝ Create namespace where we got called from + parms.folder←folder + parms.acceptConfig←0 + parms.ignoreUserExec←0 + parms.namespace←'' + :If ~(⊂parms_)∊''⍬ + '⍺ must not contain references'Assert 0=≢parms_.⎕NL 9 + (b{0=+/b:'' ⋄ 'Invalid parameter: ',⊃{⍺,',',⍵}/⍺/⍵}l)Assert 0=+/b←~(l←' '~⍨¨↓parms_.⎕NL 2)∊' '~⍨¨↓parms.⎕NL 2 + :If 0<≢list←' '~⍨¨↓parms_.⎕NL 2 + parms⍎¨list{' '=1↑0⍴⍵:⍺,'←''',⍵,'''' ⋄ ⍵≡⍬:⍺,'←⍬' ⋄ ⍺,'←',⍕⍵}¨parms_.{⍎⍵}¨list + :EndIf + :EndIf + 'Must not be empty: "folder"'Assert 0<≢parms.folder + ('Is not a folder: ',parms.folder)Assert F.IsDir parms.folder +⍝Done diff --git a/APLSource/Cider/CreateProject.aplf b/APLSource/Cider/CreateProject.aplf new file mode 100644 index 00000000..a1a76b2b --- /dev/null +++ b/APLSource/Cider/CreateProject.aplf @@ -0,0 +1,21 @@ + {r}←CreateProject parms;filename;config;projectFolder;list +⍝ Create a project according to what's specified in parms. +⍝ Returns always ''. Throws errors in case the project cannot be created + parms←parms CreateCreateProjectParms ⍬ + r←'' + filename←(AddSlash parms.folder),'cider.config' + :If 0=≢parms.namespace + parms.namespace←{{⍵↑⍨1+-⌊/(⌽⍵)⍳'/\'}¯1↓⍵}1⊃1 ⎕NPARTS filename + :EndIf + :If ~(⊂,1 ⎕C parms.namespace)∊,¨'#' '⎕SE' + ('Not a valid APL name: <',parms.namespace,'>')Assert ¯1≠⎕NC parms.namespace + :EndIf + :If ~⎕NEXISTS parms.folder + 'Invalid folder: parent must exist'Assert{0=≢⍵:1 ⋄ ⎕NEXISTS ⍵}1⊃⎕NPARTS{⍵↓⍨-(¯1↑⍵)∊'/\'}parms.folder ⍝ Parent folder must exist + parms.folder←∊1 ⎕NPARTS parms.folder + ⎕MKDIR parms.folder + :EndIf + CreateConfigFile filename parms.namespace + config←⎕JSON⍠('Dialect' 'JSON5')⊣⊃⎕NGET filename + ('Invalid config file: ',filename)Assert 0 PerformConfigChecks config +⍝Done diff --git a/APLSource/Cider/History.apla b/APLSource/Cider/History.apla index 0561271b..a107a7f3 100644 --- a/APLSource/Cider/History.apla +++ b/APLSource/Cider/History.apla @@ -1,6 +1,7 @@ ( '* 0.41.0 ⋄ 2024-06-20' - ' * Cider now adds its own version number to a project config file whenever it is written to disk.' + ' * API functions `CreateProject` and `CreateCreateProjectParms` added ' + ' * Cider now adds its own version number to a project config file whenever it is written to disk' ' * Cider''s "Make" now re-creates the UCMD cache' '* 0.40.1 ⋄ 2024-06-18' ' * NuGet-related test cases are now executed in their own, independent process' diff --git a/APLSource/Cider/PolishProperties.aplf b/APLSource/Cider/PolishProperties.aplf index 5151c201..5273a1a5 100644 --- a/APLSource/Cider/PolishProperties.aplf +++ b/APLSource/Cider/PolishProperties.aplf @@ -55,7 +55,7 @@ f3←1 :EndIf :If f1∨f2∨f3 - config Put_JSON5(F.AddTrailingSep parms.folder),'cider.config' + config Put_JSON5(F.AddTrailingSep parms.folder),ConfigFilename p'Modified file "cider.config" saved in ',parms.folder :EndIf :If errorFlag diff --git a/APLSource/Cider/ProjectConfig.aplf b/APLSource/Cider/ProjectConfig.aplf index 4163f71d..ed12c875 100644 --- a/APLSource/Cider/ProjectConfig.aplf +++ b/APLSource/Cider/ProjectConfig.aplf @@ -7,8 +7,8 @@ path←GetFolderFromAlias path ('Alias "',path,'" not found')Assert 0<≢path :EndIf - :If 'cider.config'{⍺≡⎕C(-≢⍺)↑⍵}path - :AndIf (¯1↑(-≢'cider.config')↓path)∊'/\' + :If ConfigFilename{⍺≡⎕C(-≢⍺)↑⍵}path + :AndIf (¯1↑(-≢ConfigFilename)↓path)∊'/\' filename←path :Else filename←path,'/cider.config' diff --git a/APLSource/Cider/Public.aplf b/APLSource/Cider/Public.aplf index 3c162e39..2bd433d4 100644 --- a/APLSource/Cider/Public.aplf +++ b/APLSource/Cider/Public.aplf @@ -5,6 +5,8 @@ r,←⊂'AddTatinDependencies' r,←⊂'CloseProject' r,←⊂'CreateOpenParms' + r,←⊂'CreateCreateProjectParms' + r,←⊂'CreateProject' r,←⊂'DropAlias' r,←⊂'GetCiderAliasFileContent' r,←⊂'GetCiderAliasFilename' diff --git a/APLSource/Cider/ReadProjectConfigFile.aplf b/APLSource/Cider/ReadProjectConfigFile.aplf index f1311f69..6e2327fc 100644 --- a/APLSource/Cider/ReadProjectConfigFile.aplf +++ b/APLSource/Cider/ReadProjectConfigFile.aplf @@ -3,7 +3,7 @@ ⍝ `projectFolder` may or may not carry the filename as such. ⍝ Check the config file for some entries and adds them if they are missing. In such a ⍝ case the config file is also written back to file. - projectFolder2←'cider.config'{⍺≡(-≢⍺)↑⍵:⍵ ⋄ ({⍵,'/'/⍨~(¯1↑⍵)∊'/\'}⍵),⍺}projectFolder + projectFolder2←ConfigFilename{⍺≡(-≢⍺)↑⍵:⍵ ⋄ ({⍵,'/'/⍨~(¯1↑⍵)∊'/\'}⍵),⍺}projectFolder config←Get_JSON5 projectFolder2 saveFlag←0 :If 0=config.CIDER.dependencies.⎕NC'tatin' diff --git a/APLSource/Cider/UC/CreateProject_.aplf b/APLSource/Cider/UC/CreateProject_.aplf index f9610728..ac8458e6 100644 --- a/APLSource/Cider/UC/CreateProject_.aplf +++ b/APLSource/Cider/UC/CreateProject_.aplf @@ -12,7 +12,7 @@ :Return :EndIf :EndIf - filename←(AddSlash folder),configFilename + filename←(AddSlash folder),##.ConfigFilename :If 0=⎕NC'namespace' :OrIf 0=≢namespace namespace←{{⍵↑⍨1+-⌊/(⌽⍵)⍳'/\'}¯1↓⍵}1⊃1 ⎕NPARTS filename @@ -21,7 +21,7 @@ ('Not a valid APL name: <',namespace,'>')Assert ¯1≠⎕NC namespace :EndIf :If acceptFlag - ('The -acceptConfig flag was set but no file "',configFilename,'" was found')Assert ⎕NEXISTS filename + ('The -acceptConfig flag was set but no file "',##.ConfigFilename,'" was found')Assert ⎕NEXISTS filename :Else :If ~⎕NEXISTS folder 'Invalid path: parent must exist'Assert{0=≢⍵:1 ⋄ ⎕NEXISTS ⍵}1⊃⎕NPARTS{⍵↓⍨-(¯1↑⍵)∊'/\'}folder ⍝ Parent folder must exist @@ -32,7 +32,7 @@ r←'Cancelled by user' ⋄ →0 :EndIf :EndIf - CreateConfigFile filename namespace + P.##.CreateConfigFile filename namespace :EndIf :If ~noEditFlag :If ¯1=P.ProjectConfig filename @@ -59,7 +59,7 @@ :Else :If 0<≢((⍎config.CIDER.parent)⍎config.CIDER.projectSpace).⎕NL 9~⍨⍳16 :If 1<≢list←⊃P.##.F.Dir projectFolder - :OrIf 'cider.config'≢{1≠≢⍵:0 ⋄ ⊃,/1↓⎕NPARTS⊃⍵}list + :OrIf P.##.ConfigFilename≢{1≠≢⍵:0 ⋄ ⊃,/1↓⎕NPARTS⊃⍵}list :If batch ⍝In batch mode there is nothing we can do but throw an error 'Both the target namespace and the source folder are not empty'Assert 0 diff --git a/APLSource/Cider/UC/Help.aplf b/APLSource/Cider/UC/Help.aplf index c86e87aa..3bf18d74 100644 --- a/APLSource/Cider/UC/Help.aplf +++ b/APLSource/Cider/UC/Help.aplf @@ -56,7 +56,7 @@ :Case 1 :Select ⎕C Cmd :Case ⎕C'OpenProject' - r,←⊂'Takes a path to a folder that must host a file "',configFilename,'" or a pre-defined alias.' + r,←⊂'Takes a path to a folder that must host a file "',##.ConfigFilename,'" or a pre-defined alias.' r,←⊂'The config file must specify all variables required by Cider, including "source".' r,←⊂'The contents of "source" is then linked to "parent.projectSpace" by default.' r,←⊂'If no folder or alias is specified, Cider will present a list with all defined aliases.' @@ -179,20 +179,19 @@ r,←⊂' into an edit window, and will add all remaining ones as aliase.' :Case ⎕C'CreateProject' r,←⊂'Requires a path to a folder ("source") that is about to become a project.' - r,←⊂'' r,←⊂'You might also specify a namespace. If no namespace is provided then the name of the namespace' r,←⊂'is derived from the path. If the namespace does not yet exist it will be created.' r,←⊂'The namespace will be LINKed to "source", and a namespace CiderConfig, holding the configuration' r,←⊂'data, will be injected into the namespace.' r,←⊂'For a root project (the whole of #, NOT recommended) you must specify # as 2nd argument.' r,←⊂'' - r,←⊂' * Creates a file "',configFilename,'" in that folder' + r,←⊂' * Creates a file "',##.ConfigFilename,'" in that folder' r,←⊂' * Lets the user edit that file and makes sure that all mandatory settings are specified correctly' - r,←⊂' * In case an alias is specified the alias is saved' + r,←⊂' * In case an alias is specified, the alias is saved' r,←⊂' * Finally it attempts to open the new project' r,←⊂'' - r,←⊂'If no path is specified it acts on the current directory, but in that case the user' - r,←⊂'is prompted for confirmation to avoid mishaps.' + r,←⊂'If no path is specified it acts on the current directory, but in that case the user is prompted' + r,←⊂'for confirmation to avoid mishaps.' r,←⊂'' r,←⊂'-acceptConfig: By default a file cider.config is created, and an error is thrown in' r,←⊂' case it already exists. You can use -acceptConfig to force CreateProject' @@ -201,12 +200,11 @@ r,←⊂'-alias: In case you are going to work on the new project frequently you may specify' r,←⊂' -alias=name; from then on you can use the [alias] rather than the path.' r,←⊂' Note that aliases are not case sensitive.' - r,←⊂'-batch After a project has been created successfully, the user will be asked whether' - r,←⊂' she wants to open the project as well. You can enforce that without the user' - r,←⊂' being interrogated by setting the -batch flag. Mainly useful for test cases and' - r,←⊂' and possibly an automated build process.' - r,←⊂'-ignoreUserExec Suppress execution of a user function defined in Cider''s config file on this occasion' - r,←⊂' You don''t want to run a general user function in test suite, for example.' + r,←⊂'-batch After a project has been created successfully, the user will be asked whether she' + r,←⊂' wants to open the project as well. You can enforce that without the user being' + r,←⊂' questioned by setting the -batch flag. Mainly useful for test cases and possibly' + r,←⊂' an automated build process.' + r,←⊂'-ignoreUserExec Suppress execution of a user function defined in Cider''s config file on this occasion.' :Case ⎕C'CloseProject' r,←⊂'Breaks the Link between one or more projects and their associated files on disk.' r,←⊂'' diff --git a/APLSource/Cider/UC/OpenFileDialogBox.aplf b/APLSource/Cider/UC/OpenFileDialogBox.aplf index 7ace1ebc..f40b8f90 100644 --- a/APLSource/Cider/UC/OpenFileDialogBox.aplf +++ b/APLSource/Cider/UC/OpenFileDialogBox.aplf @@ -8,7 +8,7 @@ ref←⎕NEW⊂'FileBox' ref.Caption←caption ref.(onFileBoxOK onFileBoxCancel)←1 - ref.File←'cider.config' + ref.File←##.ConfigFilename res←ref.Wait :If 'FileBoxOK'≡2⊃res opCode←1 diff --git a/APLSource/Cider/Version.aplf b/APLSource/Cider/Version.aplf index 5bf488f0..1a2ffc05 100644 --- a/APLSource/Cider/Version.aplf +++ b/APLSource/Cider/Version.aplf @@ -1,3 +1,3 @@ r←Version ⍝ See also `History` - r←'0.41.0-beta-3+671' + r←'0.41.0-beta-4+671' diff --git a/APLSource/Cider/WriteProjectConfigFile.aplf b/APLSource/Cider/WriteProjectConfigFile.aplf index f3c445d1..22848fb0 100644 --- a/APLSource/Cider/WriteProjectConfigFile.aplf +++ b/APLSource/Cider/WriteProjectConfigFile.aplf @@ -1,6 +1,6 @@ {r}←config WriteProjectConfigFile path;path2 ⍝ Writes project configuration "config" to file.\\ ⍝ `path` may or may not carry the filename as such. - path2←'cider.config'{⍺≡(-≢⍺)↑⍵:⍵ ⋄ ({⍵,'/'/⍨~(¯1↑⍵)∊'/\'}⍵),⍺}path + path2←ConfigFilename{⍺≡(-≢⍺)↑⍵:⍵ ⋄ ({⍵,'/'/⍨~(¯1↑⍵)∊'/\'}⍵),⍺}path r←config Put_JSON5 path2 ⍝Done diff --git a/APLSource/TestCases/Test_Create_500.aplf b/APLSource/TestCases/Test_Create_500.aplf new file mode 100644 index 00000000..a77103ff --- /dev/null +++ b/APLSource/TestCases/Test_Create_500.aplf @@ -0,0 +1,29 @@ + R←Test_Create_500(stopFlag batchFlag);⎕TRAP;tempDir;parms;rc;parms2;res +⍝ Create a new project via the API + ⎕TRAP←(999 'C' '∘∘∘ ⍝ Deliberate error')(0 'N') + R←T._Failed + + tempDir←∆GetFolderInTempDir⊃⎕SI + 3 ⎕MKDIR tempDir,'/APLSource' + (⊂'r←TheAnswerIs' 'r←42')⎕NPUT(tempDir,'/APLSource/TheAnswerIs.aplf')1 + + parms←##.Cider.CreateCreateProjectParms tempDir + ##.Cider.CreateProject parms + + #.⎕EX'Foo' ⋄ #.⎕SHADOW'Foo' + parms2←##.Cider.CreateOpenParms ⍬ + parms2.folder←parms.folder + parms2.batch←1 + parms2.ignoreUserExec←1 + parms2.parent←'#' + parms2.projectSpace←'Foo' + res←##.Cider.OpenProject parms2 + →T.GoToTidyUp~∨/'Project successfully opened and established in "#.Foo"'⍷∊res + + R←T._OK + +∆TidyUp: + Assert 0 ##.Cider.CloseProject'#.Foo' + rc←⊃FilesAndDirs.RmDir tempDir,'/..' + Assert rc∧.=0 +⍝Done diff --git a/APLSource/TestCases/Test_Misc_016.aplf b/APLSource/TestCases/Test_Misc_016.aplf index 779578f3..c1f89b0a 100644 --- a/APLSource/TestCases/Test_Misc_016.aplf +++ b/APLSource/TestCases/Test_Misc_016.aplf @@ -1,4 +1,4 @@ - r←Test_Misc_016(stopFlag batchFlag);⎕TRAP;b;folder;parms;log;success;msg;rc;res;en;cfg;body;pkgCfg;name;ref + r←Test_Misc_016(stopFlag batchFlag);⎕TRAP;b;folder;parms;log;success;msg;rc;res;en;cfg;body;pkgCfg;name;ref;stop ⍝ Test the "tatinVars" property ⎕TRAP←(999 'C' '. ⍝ Deliberate error')(0 'N') @@ -12,7 +12,8 @@ :Else ⎕SE.Cider.##.CommTools.YesOrNo_Answers←1 2⍴'OpenAsWell@' 'n' :EndIf - (rc msg res)←∆UCMD'CreateProject ',folder,' -noEdit -ignoreUserExec' + stop←0 + (rc msg res)←stop ∆UCMD'CreateProject ',folder,' -noEdit -ignoreUserExec' msg Assert rc=0 cfg←∆GetJSON5 folder,'/cider.config' body←'r←Hello' 'r←42' diff --git a/APLSource/TestCases/Test_OpenAndClose_001.aplf b/APLSource/TestCases/Test_OpenAndClose_001.aplf index 3c8d6a8d..59fd9dd1 100644 --- a/APLSource/TestCases/Test_OpenAndClose_001.aplf +++ b/APLSource/TestCases/Test_OpenAndClose_001.aplf @@ -17,7 +17,7 @@ {}⎕SE.Link.Add'#.Foo.Hello' list←FilesAndDirs.ListFiles projectFolder1 →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list aliase←##.Cider.GetCiderAliasFileContent ⍬ →T.GoToTidyUp~(⊂⎕C'test-case-alias-Foo')∊aliase[;1] @@ -31,7 +31,7 @@ Assert rc=0 list←FilesAndDirs.ListFiles projectFolder2 →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list aliase←##.Cider.GetCiderAliasFileContent ⍬ →T.GoToTidyUp~∧/(⎕C'test-case-alias-Foo' 'test-case-alias-Goo')∊aliase[;1] diff --git a/APLSource/TestCases/Test_OpenAndClose_002.aplf b/APLSource/TestCases/Test_OpenAndClose_002.aplf index 0b4410e8..e047f79c 100644 --- a/APLSource/TestCases/Test_OpenAndClose_002.aplf +++ b/APLSource/TestCases/Test_OpenAndClose_002.aplf @@ -15,7 +15,7 @@ msg Assert 0=rc list←FilesAndDirs.ListFiles tempDir →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list R←T._OK diff --git a/APLSource/TestCases/Test_OpenAndClose_004.aplf b/APLSource/TestCases/Test_OpenAndClose_004.aplf index 17f5e430..65e83d07 100644 --- a/APLSource/TestCases/Test_OpenAndClose_004.aplf +++ b/APLSource/TestCases/Test_OpenAndClose_004.aplf @@ -17,7 +17,7 @@ {}⎕SE.Link.Add'#.Foo.Hello' list←FilesAndDirs.ListFiles projectFolder1 →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list aliase←##.Cider.GetCiderAliasFileContent ⍬ →T.GoToTidyUp~(⊂⎕C'test-case-alias-Foo')∊aliase[;1] @@ -31,7 +31,7 @@ Assert rc=0 list←FilesAndDirs.ListFiles projectFolder2 →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list aliase←##.Cider.GetCiderAliasFileContent ⍬ →T.GoToTidyUp~∧/(⎕C'test-case-alias-Foo' 'test-case-alias-Goo')∊aliase[;1] @@ -45,7 +45,7 @@ Assert rc=0 list←FilesAndDirs.ListFiles projectFolder3 →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list →T.GoToTidyUp 3≠0 ##.Cider.CloseProject'#.Foo' '[test-case-alias-Goo]' '[Does not exist]'projectFolder3 diff --git a/APLSource/TestCases/Test_OpenAndClose_010.aplf b/APLSource/TestCases/Test_OpenAndClose_010.aplf index 0aa92e64..6c455c77 100644 --- a/APLSource/TestCases/Test_OpenAndClose_010.aplf +++ b/APLSource/TestCases/Test_OpenAndClose_010.aplf @@ -21,7 +21,7 @@ Assert'Project successfully opened and established in '{⍺≡(≢⍺)↑⍵}res list←FilesAndDirs.ListFiles tempDir →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list →T.GoToTidyUp 1≠#.Foo.∆INIT res←∆LINK'Break' '#.Foo' Assert res ∆StartsWith'Unlinked:' diff --git a/APLSource/TestCases/Test_UC_040.aplf b/APLSource/TestCases/Test_UC_040.aplf index e26dc2d9..40f82bca 100644 --- a/APLSource/TestCases/Test_UC_040.aplf +++ b/APLSource/TestCases/Test_UC_040.aplf @@ -15,7 +15,7 @@ list←FilesAndDirs.ListFiles tempDir →T.GoToTidyUp 1≠≢list - →T.GoToTidyUp'cider.config'≢⊃,/1↓⎕NPARTS 1⊃list + →T.GoToTidyUp ##.Cider.ConfigFilename≢⊃,/1↓⎕NPARTS 1⊃list config←##.Cider.ReadProjectConfigFile tempDir →T.GoToTidyUp'config.CIDER.projectSpace'≡config.CIDER.projectSpace diff --git a/apl-package.json b/apl-package.json index d8dbf51c..c869ee12 100644 --- a/apl-package.json +++ b/apl-package.json @@ -21,5 +21,5 @@ tags: "project-management", tatin_version: "0.103.0", userCommandScript: "APLSource/Cider_UC.dyalog", - version: "0.41.0+739", + version: "0.41.0+743", } diff --git a/docs/Cider-API-Reference.md b/docs/Cider-API-Reference.md index 47431721..5dc3489b 100644 --- a/docs/Cider-API-Reference.md +++ b/docs/Cider-API-Reference.md @@ -6,7 +6,7 @@ # Cider's API --- Syntax Reference -Although the API functions are similar to their user command equivalents, they are not identical. Also, the API offers more functions while there is no API equivalent for `]CreateProject`. +Although the API functions are similar to their user command equivalents, they are not identical. Also, the API offers more functions. While for the user commands the help provided by the `-??` syntax is sufficient, this document deals with the API. @@ -97,6 +97,31 @@ You may specify any of them or both, in any order. Returns the number of projects closed as result. +## CreateCreateProjectParms + +``` +parms←{parms} CreateCreateProjectParms folder +``` + +An ambivalent function that returns a namespace with default parameters required by the [`CreateProject`](#)function. + +The mandatory right argument must be the folder where the project lives. + +The optional left argument might be a namespace holding some of the parameters. The values are copied then over. + +These are the parameters: + +``` + acceptConfig 0 + folder /path/2/project + ignoreUserExec 0 + namespace '' +``` + +`namespace` defaults to the last part in `folder`. + +For the meaning of the other parameters refer to `]Cider.CreatePoject -??`. + ## CreateOpenParms ``` @@ -110,7 +135,7 @@ A monadic function that returns a namespace with default parameters required by alias '' batch 0 checkPackageVersions ⍬ - folder '' + folder '' ignoreUserExec 0 importFlag 0 noPkgLoad 0 @@ -126,7 +151,13 @@ This is useful for creating a namespace with the defaults, set required paramete ## CreateProject -There is no API equivalent for the user command `]Cider.CreateProject`. +``` +r←CreateProject parms +``` + +`parms` is typically create by calling [`CreateCreateProjectParms`](#). + +This function can be used to create a project under program control. ## DropAlias @@ -529,3 +560,5 @@ This can be just `1.2.3`, but it may be something like `1.2.3-beta-1+113` + + diff --git a/docs/Cider-User-Guide.md b/docs/Cider-User-Guide.md index 430c9a62..1d1f1dd6 100644 --- a/docs/Cider-User-Guide.md +++ b/docs/Cider-User-Guide.md @@ -840,5 +840,6 @@ An example: + diff --git a/html/Cider-API-Reference.html b/html/Cider-API-Reference.html index 9656384d..2387dbd4 100644 --- a/html/Cider-API-Reference.html +++ b/html/Cider-API-Reference.html @@ -18,7 +18,7 @@
Although the API functions are similar to their user command equivalents, they are not identical. Also, the API offers more functions while there is no API equivalent for ]CreateProject
.
Although the API functions are similar to their user command equivalents, they are not identical. Also, the API offers more functions.
While for the user commands the help provided by the -??
syntax is sufficient, this document deals with the API.
Note that while the Cider package (code) is loaded into ⎕SE._Cider
, the API is available via ⎕SE.Cider
. The user is supposed to call functions in ⎕SE.Cider
but not in ⎕SE.Cider_
.
The API functions are ordered alphabetically.
@@ -88,8 +88,24 @@You may specify any of them or both, in any order.
Returns the number of projects closed as result.
+parms←{parms} CreateCreateProjectParms folder
+An ambivalent function that returns a namespace with default parameters required by the CreateProject
function.
The mandatory right argument must be the folder where the project lives.
+The optional left argument might be a namespace holding some of the parameters. The values are copied then over.
+These are the parameters:
+ acceptConfig 0
+ folder /path/2/project
+ ignoreUserExec 0
+ namespace ''
+namespace
defaults to the last part in folder
.
For the meaning of the other parameters refer to ]Cider.CreatePoject -??
.
parms←CreateOpenParms y
@@ -97,7 +113,7 @@ alias ''
batch 0
checkPackageVersions ⍬
- folder ''
+ folder ''
ignoreUserExec 0
importFlag 0
noPkgLoad 0
@@ -110,20 +126,22 @@ 5. CreateOpenParms
This is useful for creating a namespace with the defaults, set required parameters (at least folder
and projectSpace
), make amendments and pass the namespace as argument to OpenProject
.
-There is no API equivalent for the user command ]Cider.CreateProject
.
+r←CreateProject parms
+parms
is typically create by calling CreateCreateProjectParms
.
+This function can be used to create a project under program control.
{successFlag}←DropAlias alias
Takes an alias and removes it.
r←{filename} GetCiderAliasFileContent dummy
@@ -133,14 +151,14 @@ 8. GetCiderAliasFileContent
Every record of that file contains two pieces of information: an alias and its associated path. The file might be empty.
filename←GetCiderAliasFilename
Niladic function that returns the path to the file that is used by Cider to manage alias names and their paths.
r←GetCiderGlobalConfigFileContent
@@ -148,7 +166,7 @@ 10. GetCiderGlobalConfigFileConten
The global configuration file is optional. If it exists it will hold user preferences.
The user may specify a fully qualified function name, usually situated in ⎕SE
. This function will then be called after a project (any project!) was opened by Cider.
@@ -156,14 +174,14 @@ 10.1. ExecuteAfterProjectOpen
This setting defines the same function for all your Cider projects, which is why it is not part of the file cider.config.template
but defined in Cider's global config file.
filename←GetCiderGlobalConfigFilename
Returns the name of Cider's global configuration file.
folder←GetCiderGlobalConfigHomeFolder
@@ -171,7 +189,7 @@ 12. GetCiderGlobalConfigHomeFolder<
On Windows, this is typically C:/Users/<⎕AN>/.cider/config.json
r←GetMyUCMDsFolder
@@ -179,7 +197,7 @@ 13. GetMyUCMDsFolder
Note that this folder is created under Windows by the Dyalog installation routine, but not on other platforms.
r←name GetNuGetDependencies config
@@ -187,7 +205,7 @@ 14. GetNuGetDependencies
Returns either the value of nuget
in the given branch or an empty vector if nuget
is not defined.
r←{current}GetProgramFilesFolder postFix
@@ -201,7 +219,7 @@ 15. GetProgramFilesFolder
C:\Users\kai\Documents\Dyalog APL-64 18.2 Unicode Files
r←name GetTatinDependencies config
@@ -209,14 +227,14 @@ Returns either the value of tatin
in the given branch or an empty vector if tatin
is not defined.
boolean←HasDotNet
Returns a 1 if either .NET Core or .NET is available and the bridge DLL was successfully loaded and 0 otherwise.
r←ListNuGetDependencies projectFolder
@@ -224,7 +242,7 @@ Note that there can be only one NuGet installation folder: currently you cannot have NuGet packages for development purposes. This restriction may be lifted in a future release.
r←ListOpenProjects verboseFlag
@@ -257,7 +275,7 @@ r←ListTatinDependencies projectFolder
@@ -271,7 +289,7 @@ (successFlag ∆LOG)←OpenProject y
@@ -308,7 +326,7 @@ This must be one of:
@@ -319,7 +337,7 @@Note that this must not be empty but it might be ./
representing the current directory.
The alias under which you might want to access the project in the future.
@@ -331,7 +349,7 @@If you specify an alias on folder
but also on alias
, then Cider expects the alias on folder
to be defined, and will use that one to open the project. It will then overwrite the former alias with the one defined on alias
.
This is ignored in case…
@@ -359,30 +377,30 @@Defaults to #
but might as be something like ⎕SE
or #.Foo.Goo.Boo
. However, all namespaces listed must exist.
The name of the namespace the project is injected into. If this is empty it is going to be #
or ⎕SE
, depending from where the function was called from.
This flag is ignored in case Cider's own global config file defines not function on ExecuteAfterProjectOpen
, but if there is a fully qualified function name defined then this flag can be used to prevent the function from execution with a particular call of OpenProject
.
Defaults to 0 meaning that the code is not imported but linked.
@@ -390,19 +408,19 @@Note that this has implications on how Cider deals with Tatin packages, see there.
Defaults to 0, meaning that Cider will load Tatin packages by honoring the config file's dependencies
and dependencies_dev
parameters. However, there might be circumstances when you do not want packages to be loaded. This can be achieved by setting the noPkgLoad
flag to 1.
Defaults to 0, meaning that the function prints messages to the session. If this is 1 then no messages are printed but what would have been printed is still returned as second element of the result of the function.
Defaults to 0, meaning that the projects initialisation function (if any) will be executed.
@@ -410,7 +428,7 @@An example might be an automated build process: that might need to open the project but without actually initialising it.
Defaults to “both”, meaning that changing any APL objects in the workspaces will result in Link updating the corresponding file on disk, and any change on disk will be reflected by changing the workspace.
@@ -427,7 +445,7 @@watch←'both'|'dir'
{r}←ProjectConfig path
@@ -436,7 +454,7 @@ Asks for permission before writing changes back to file, and performs checks before writing it back to file.
config←ReadProjectConfigFile projectFolder
@@ -445,7 +463,7 @@ Note that the function checks whether the sub-keys dependency.tatin
and dependency.nuget
are defined; if not they are created and the data is written to file.
{r}←config WriteProjectConfigFile path
@@ -453,7 +471,7 @@ path
may or may not come the actual filename `cider.config'
r←Version
diff --git a/tatin-packages_dev/apl-buildlist.json b/tatin-packages_dev/apl-buildlist.json
index addfe7ab..bdcf3789 100644
--- a/tatin-packages_dev/apl-buildlist.json
+++ b/tatin-packages_dev/apl-buildlist.json
@@ -4,7 +4,7 @@
"aplteam-MakeHelpers-0.13.0",
"aplteam-FilesAndDirs-5.7.1",
"aplteam-CommTools-1.7.1",
- "aplteam-CodeCoverage-0.10.6",
+ "aplteam-CodeCoverage-0.10.7",
"aplteam-APLTreeUtils2-1.4.0",
"aplteam-APLProcess-0.7.0",
"aplteam-ZipArchive-1.1.0",
diff --git a/tatin-packages_dev/apl-dependencies.txt b/tatin-packages_dev/apl-dependencies.txt
index 186d9863..218e301d 100644
--- a/tatin-packages_dev/apl-dependencies.txt
+++ b/tatin-packages_dev/apl-dependencies.txt
@@ -1,6 +1,6 @@
aplteam-APLTreeUtils2-1.4.0
aplteam-FilesAndDirs-5.7.1
-aplteam-CodeCoverage-0.10.6
+aplteam-CodeCoverage-0.10.7
aplteam-Tester2-3.7.0
aplteam-CommTools-1.7.1
aplteam-MakeHelpers-0.13.0
diff --git a/tatin-packages_dev/aplteam-APLProcess-0.7.0/apl-package.json b/tatin-packages_dev/aplteam-APLProcess-0.7.0/apl-package.json
index ab91113e..43c7f8d9 100644
--- a/tatin-packages_dev/aplteam-APLProcess-0.7.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-APLProcess-0.7.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20231001.045851,
description: "Start an APL process from within Dyalog APL",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-APLTreeUtils2-1.2.0/apl-package.json b/tatin-packages_dev/aplteam-APLTreeUtils2-1.2.0/apl-package.json
index a73f5156..91163d42 100644
--- a/tatin-packages_dev/aplteam-APLTreeUtils2-1.2.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-APLTreeUtils2-1.2.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20230508.171103,
description: "General utilities required by most members of the APLTree library",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-APLTreeUtils2-1.3.1/apl-package.json b/tatin-packages_dev/aplteam-APLTreeUtils2-1.3.1/apl-package.json
index a9f6aa6f..eb6b0bb5 100644
--- a/tatin-packages_dev/aplteam-APLTreeUtils2-1.3.1/apl-package.json
+++ b/tatin-packages_dev/aplteam-APLTreeUtils2-1.3.1/apl-package.json
@@ -4,6 +4,7 @@
date: 20231210.133211,
description: "General utilities required by most members of the APLTree library",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-APLTreeUtils2-1.4.0/apl-package.json b/tatin-packages_dev/aplteam-APLTreeUtils2-1.4.0/apl-package.json
index 3f199d4c..fb22cb64 100644
--- a/tatin-packages_dev/aplteam-APLTreeUtils2-1.4.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-APLTreeUtils2-1.4.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20240325.144117,
description: "General utilities required by most members of the APLTree library",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-CodeCoverage-0.10.6/APLSource/CodeCoverage.aplc b/tatin-packages_dev/aplteam-CodeCoverage-0.10.7/APLSource/CodeCoverage.aplc
similarity index 98%
rename from tatin-packages_dev/aplteam-CodeCoverage-0.10.6/APLSource/CodeCoverage.aplc
rename to tatin-packages_dev/aplteam-CodeCoverage-0.10.7/APLSource/CodeCoverage.aplc
index b30a4f06..98bb5ded 100644
--- a/tatin-packages_dev/aplteam-CodeCoverage-0.10.6/APLSource/CodeCoverage.aplc
+++ b/tatin-packages_dev/aplteam-CodeCoverage-0.10.7/APLSource/CodeCoverage.aplc
@@ -54,13 +54,17 @@
∇ r←Version
:Access Public Shared
- r←'CodeCoverage' '0.10.6+52' '2024-03-13'
+ r←'CodeCoverage' '0.10.7+52' '2024-06-05'
∇
∇ History
:Access Public Shared
- ⍝ * 0.10.6 from 2024-01-30
- ⍝ * Neither `#` nor `⎕SE` were allowed
+ ⍝ * 0.10.7 from 2024-06-05
+ ⍝ * Bug fixes
+ ⍝ * A comma-separated list as argument to ⎕NEW caused a LENGTH ERROR
+ ⍝ * CodeCoverage tests attempted to act on itself - that cannot work properly because the tests overwrite ⎕PROFILE
+ ⍝ * 0.10.6 from 2024-01-30
+ ⍝ * Neither `#` nor `⎕SE` were allowed
⍝ * 0.10.5 from 2024-01-12
⍝ * Link to `Tester2` in the documentation corrected
⍝ * 0.10.4 from 2024-01-12
@@ -141,7 +145,7 @@
'Must be character vector'⎕SIGNAL 11/⍨' '≠1↑0⍴v
('Has invalid characters',b/v)⎕SIGNAL 11/⍨∨/b←~v∊APL_Chars,',⎕#.'
v2←','(≠⊆⊢),v
- :If ~v2∊,¨'#' '⎕SE'
+ :If ~∧/v2∊,¨'#' '⎕SE'
:If ∨/~b←0<⎕NC↑v2
11 ⎕SIGNAL⍨'Unknown names: ',⊃{⍺,',',⍵}/(~b)/v2
:EndIf
@@ -419,7 +423,7 @@
⍝ again, for example.
:Access Public Instance
r←⍬
- {Stop ⍵}⍣(~⊃∆STOPPED)⊣⍬
+ 0 0⍴{Stop ⍵}⍣(~⊃∆STOPPED)⊣⍬
_data←_data[;1]{(⊃⍺)(∪⊃,/⍵)}⌸_data[;2]
names←CollectDataForCoverageReport _watch
details←0 4⍴⍬
@@ -568,7 +572,7 @@
:If ⎕NEXISTS cr.filename
cr.tno←cr.filename ⎕FTIE 0
cr.names←⎕FREAD cr.tno,1
- ⎕←'tied ',cr.filename,' for listings'
+ ⎕←'Tied ',cr.filename,' for listings'
:Else
⎕←'Did not find file "',cr.filename,'" with CRs collected by fn "Finalize" - will try to work without it'
cr.tno←0
diff --git a/tatin-packages_dev/aplteam-CodeCoverage-0.10.6/LICENSE b/tatin-packages_dev/aplteam-CodeCoverage-0.10.7/LICENSE
similarity index 100%
rename from tatin-packages_dev/aplteam-CodeCoverage-0.10.6/LICENSE
rename to tatin-packages_dev/aplteam-CodeCoverage-0.10.7/LICENSE
diff --git a/tatin-packages_dev/aplteam-CodeCoverage-0.10.6/apl-package.json b/tatin-packages_dev/aplteam-CodeCoverage-0.10.7/apl-package.json
similarity index 89%
rename from tatin-packages_dev/aplteam-CodeCoverage-0.10.6/apl-package.json
rename to tatin-packages_dev/aplteam-CodeCoverage-0.10.7/apl-package.json
index b9b7ef03..ab77b48d 100644
--- a/tatin-packages_dev/aplteam-CodeCoverage-0.10.6/apl-package.json
+++ b/tatin-packages_dev/aplteam-CodeCoverage-0.10.7/apl-package.json
@@ -1,9 +1,10 @@
{
api: "CodeCoverage",
assets: "",
- date: 20240313.194252,
+ date: 20240605.104238,
description: "Monitors which parts of an application got actually executed",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
@@ -21,5 +22,5 @@
tags: "code-coverage,test-framework,unit-tests",
uri: "https://tatin.dev/",
userCommandScript: "",
- version: "0.10.6+67",
+ version: "0.10.7+68",
}
diff --git a/tatin-packages_dev/aplteam-CommTools-1.7.1/apl-package.json b/tatin-packages_dev/aplteam-CommTools-1.7.1/apl-package.json
index 2d846b30..40b300a1 100644
--- a/tatin-packages_dev/aplteam-CommTools-1.7.1/apl-package.json
+++ b/tatin-packages_dev/aplteam-CommTools-1.7.1/apl-package.json
@@ -4,6 +4,7 @@
date: 20231104.11033,
description: "Communication tools for interactions in the session: YesOrNo and Select",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-DotNetZip-2.0.2/apl-package.json b/tatin-packages_dev/aplteam-DotNetZip-2.0.2/apl-package.json
index d33d8253..d3344215 100644
--- a/tatin-packages_dev/aplteam-DotNetZip-2.0.2/apl-package.json
+++ b/tatin-packages_dev/aplteam-DotNetZip-2.0.2/apl-package.json
@@ -4,6 +4,7 @@
date: 20220531.123346,
description: "Zipping and unzipping with.NET Core on all major platforms",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-FilesAndDirs-5.7.1/apl-package.json b/tatin-packages_dev/aplteam-FilesAndDirs-5.7.1/apl-package.json
index 17dcdf52..8ee020e3 100644
--- a/tatin-packages_dev/aplteam-FilesAndDirs-5.7.1/apl-package.json
+++ b/tatin-packages_dev/aplteam-FilesAndDirs-5.7.1/apl-package.json
@@ -4,6 +4,7 @@
date: 20240404.082054,
description: "Utilities for doing gymnastics with files and directories",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 0,
diff --git a/tatin-packages_dev/aplteam-IniFiles-5.0.3/apl-package.json b/tatin-packages_dev/aplteam-IniFiles-5.0.3/apl-package.json
index b7395255..41f8a93a 100644
--- a/tatin-packages_dev/aplteam-IniFiles-5.0.3/apl-package.json
+++ b/tatin-packages_dev/aplteam-IniFiles-5.0.3/apl-package.json
@@ -4,6 +4,7 @@
date: 20220413.144352,
description: "Allows instantiating good old INI files in APL; comes with extended syntax supporting APL-like data structures",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-MakeHelpers-0.13.0/apl-package.json b/tatin-packages_dev/aplteam-MakeHelpers-0.13.0/apl-package.json
index 03dc9683..233056de 100644
--- a/tatin-packages_dev/aplteam-MakeHelpers-0.13.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-MakeHelpers-0.13.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20240406.063333,
description: "Collections of helpers for building an application",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-MarkAPL-12.1.1/apl-package.json b/tatin-packages_dev/aplteam-MarkAPL-12.1.1/apl-package.json
index 8a22d42f..b7efa78d 100644
--- a/tatin-packages_dev/aplteam-MarkAPL-12.1.1/apl-package.json
+++ b/tatin-packages_dev/aplteam-MarkAPL-12.1.1/apl-package.json
@@ -4,6 +4,7 @@
date: 20240129.060735,
description: "Converts Markdown to HTML5",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-OS-3.1.1/apl-package.json b/tatin-packages_dev/aplteam-OS-3.1.1/apl-package.json
index 95178eb3..432f4dad 100644
--- a/tatin-packages_dev/aplteam-OS-3.1.1/apl-package.json
+++ b/tatin-packages_dev/aplteam-OS-3.1.1/apl-package.json
@@ -4,6 +4,7 @@
date: 20230508.172522,
description: "OS-related tools for all major platforms",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-Tester2-3.7.0/apl-package.json b/tatin-packages_dev/aplteam-Tester2-3.7.0/apl-package.json
index f4b5cc07..a7181929 100644
--- a/tatin-packages_dev/aplteam-Tester2-3.7.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-Tester2-3.7.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20240303.0801,
description: "Dyalog APL test framework",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,
diff --git a/tatin-packages_dev/aplteam-ZipArchive-1.1.0/apl-package.json b/tatin-packages_dev/aplteam-ZipArchive-1.1.0/apl-package.json
index 054914ad..1e2f0c7d 100644
--- a/tatin-packages_dev/aplteam-ZipArchive-1.1.0/apl-package.json
+++ b/tatin-packages_dev/aplteam-ZipArchive-1.1.0/apl-package.json
@@ -4,6 +4,7 @@
date: 20230612.055539,
description: "Zipping and unzipping with .NET on Windows and zip/unzip on other platforms",
documentation: "",
+ exclude: "",
files: "",
group: "aplteam",
io: 1,