SAS Packages Framework, version 20251017

SAS Packages Framework, version 20251017

Changes:
- New parameters `workInTestResults=` and `testWorkPath=` added to the `%generatePackage()` macro.
- Documentation updated.
This commit is contained in:
Bart Jablonski
2025-10-19 21:36:03 +02:00
parent 9cf3332e60
commit b4b319a2e0
16 changed files with 667 additions and 451 deletions

View File

@@ -3,7 +3,7 @@
Macro to generate SAS packages.
Version 20250729
Version 20251017
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -20,30 +20,36 @@
filesLocation /* location of package files
e.g. /path/to/package/files/locatiion or C:\my\package\files */
/* testing options: */
,testPackage=Y /* indicator if tests should be executed,
default value Y means "execute tests" */
,packages= /* location of other packages if there are
dependencies in loading, must be a single directory
if more than one are provided only the first is used */
,testResults= /* location where tests results should be stored,
if null (the default) the WORK is used */
,sasexe= /* a DIRECTORY where the SAS binary is located,
if null (the default) then the !SASROOT is used */
,sascfgFile= /* a FILE with testing session configuration parameters
if null (the default) then no config file is pointed
during the SAS invocation,
if set to DEF then the !SASROOT/sasv9.cfg is used */
,delTestWork=1 /* indicates if `WORK` directories generated by user tests
should be deleted, i.e. the (NO)WORKTERM option is set,
default value 1 means "delete tests work" */
,markdownDoc=0 /* indicates if a markdown file with documentation
be generated from help info blocks */
,easyArch=0 /* when creating documentation file indicates if a copy of
the zip and markdown files with the version number in the
file name be created */
,testPackage=Y /* indicator if tests should be executed,
default value Y means "execute tests" */
,packages= /* location of other packages if there are
dependencies in loading, must be a single directory
if more than one are provided only the first is used */
,testResults= /* location where tests results should be stored,
if null (the default) the WORK is used */
,workInTestResults=0 /* indicates if WORK directories for tests should located
in the same place as results */
,testWorkPath= /* location where tests SAS sessions' work directories
should be stored, if null (the default) the main SAS
session WORK is used. Takes precedence over workInTestResults= */
,sasexe= /* a DIRECTORY where the SAS binary is located,
if null (the default) then the !SASROOT is used */
,sascfgFile= /* a FILE with testing session configuration parameters
if null (the default) then no config file is pointed
during the SAS invocation,
if set to DEF then the !SASROOT/sasv9.cfg is used */
,delTestWork=1 /* indicates if `WORK` directories generated by user tests
should be deleted, i.e. the (NO)WORKTERM option is set,
default value 1 means "delete tests work" */
/* documentation options: */
,markdownDoc=0 /* indicates if a markdown file with documentation
be generated from help info blocks */
,easyArch=0 /* when creating documentation file indicates if a copy of
the zip and markdown files with the version number in the
file name be created */
)/ secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20250729. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20251017. Run %generatePackage() for help info.'
;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do;
@@ -54,75 +60,87 @@ des = 'Macro to generate SAS packages, version 20250729. Run %generatePackage()
;
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
%put ;
%put #################################################################################;
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20250729` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%generatePackage())` macro generates SAS packages. #;
%put # It wraps-up the package content, i.e. macros, functions, formats, etc., #;
%put # into the zip file and generate all metadata content required by other #;
%put # macros from the SAS Packages Framework. #;
%put # #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
%put # to read about the details of package generation process. #;
%put # Tutorials available at: `https://github.com/yabwon/HoW-SASPackages` #;
%put # #;
%put #### Parameters: #;
%put # #;
%put # 1. `filesLocation=` Location of package files, example value: #;
%put # `%nrstr(%%sysfunc(pathname(work))/packagename)`. #;
%put # Default use case: #;
%put # `%nrstr(%%generatePackage(filesLocation=/path/to/packagename))` #;
%put # If empty displays this help information. #;
%put # #;
%put # Testing parameters: #;
%put # #;
%put # - `testPackage=` Indicator if tests should be executed. #;
%put # Default value: `Y`, means "execute tests" #;
%put # #;
%put # - `packages=` Location of other packages for testing #;
%put # if there are dependencies in loading the package. #;
%put # Has to be a single directory, if more than one are #;
%put # provided than only the first is used. #;
%put # If path to location contains spaces it should be quoted! #;
%put # #;
%put # - `testResults=` Location where tests results should be stored, #;
%put # if null (the default) then the session WORK is used. #;
%put # #;
%put # - `sasexe=` Location of a DIRECTORY where the SAS binary is located, #;
%put # if null (the default) then the `!SASROOT` is used. #;
%put # #;
%put # - `sascfgFile=` Location of a FILE with testing session configuration #;
%put # parameters, if null (the default) then no config file #;
%put # is pointed during the SAS invocation, #;
%put # if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. #;
%put # #;
%put # - `delTestWork=` Indicates if `WORK` directories generated by user tests #;
%put # should be deleted, i.e. the (NO)WORKTERM option is set. #;
%put # The default value: `1` means "delete tests work". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `markdownDoc=` Indicates if a markdown file with documentation #;
%put # be generated from help information blocks. #;
%put # The default value: `0` means "do not generate the file". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `easyArch=` When creating documentation file (`markdownDoc=1`) #;
%put # indicates if a copy of the zip and markdown files #;
%put # with the version number in the file name be created #;
%put # The default value: `0` means "do not create files". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put #-------------------------------------------------------------------------------#;
%put #################################################################################;
%put ######################################################################################;
%put ### This is short help information for the `generatePackage` macro #;
%put #------------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20251017` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%generatePackage())` macro generates SAS packages. #;
%put # It wraps-up the package content, i.e. macros, functions, formats, etc., #;
%put # into the zip file and generate all metadata content required by other #;
%put # macros from the SAS Packages Framework. #;
%put # #;
%put #------------------------------------------------------------------------------------#;
%put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
%put # to read about the details of package generation process. #;
%put # Tutorials available at: `https://github.com/yabwon/HoW-SASPackages` #;
%put # #;
%put #### Parameters: #;
%put # #;
%put # 1. `filesLocation=` Location of package files, example value: #;
%put # `%nrstr(%%sysfunc(pathname(work))/packagename)`. #;
%put # Default use case: #;
%put # `%nrstr(%%generatePackage(filesLocation=/path/to/packagename))` #;
%put # If empty displays this help information. #;
%put # #;
%put # Testing parameters: #;
%put # #;
%put # - `testPackage=` Indicator if tests should be executed. #;
%put # Default value: `Y`, means "execute tests" #;
%put # #;
%put # - `packages=` Location of other packages for testing #;
%put # if there are dependencies in loading the package. #;
%put # Has to be a single directory, if more than one are #;
%put # provided than only the first is used. #;
%put # If path to location contains spaces it should be quoted! #;
%put # #;
%put # - `testResults=` Location where tests results should be stored, #;
%put # if null (the default) then the session WORK is used. #;
%put # #;
%put # - `workInTestResults=` Indicates if WORK directories for test sessions should #;
%put # be located in the same place as results. #;
%put # The default value: `0` means "do not do this". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `testWorkPath=` Points a location where tests sessions work directories #;
%put # should be stored. By default it is null what means that #;
%put # a sub-directory of the main SAS session WORK is used. #;
%put # Takes precedence over `workInTestResults=`. #;
%put # #;
%put # - `sasexe=` Location of a DIRECTORY where the SAS binary is located, #;
%put # if null (the default) then the `!SASROOT` is used. #;
%put # #;
%put # - `sascfgFile=` Location of a FILE with testing session configuration #;
%put # parameters, if null (the default) then no config file #;
%put # is pointed during the SAS invocation, #;
%put # if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. #;
%put # #;
%put # - `delTestWork=` Indicates if `WORK` directories generated by user tests #;
%put # should be deleted, i.e. the (NO)WORKTERM option is set. #;
%put # The default value: `1` means "delete tests work". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # Documentation parameters: #;
%put # #;
%put # - `markdownDoc=` Indicates if a markdown file with documentation #;
%put # be generated from help information blocks. #;
%put # The default value: `0` means "do not generate the file". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `easyArch=` When creating documentation file (`markdownDoc=1`) #;
%put # indicates if a copy of the zip and markdown files #;
%put # with the version number in the file name be created #;
%put # The default value: `0` means "do not create files". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put #------------------------------------------------------------------------------------#;
%put ######################################################################################;
%put ;
options &options_tmp.;
%GOTO ENDofgeneratePackage;
@@ -873,7 +891,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
%end;
footnote1 "SAS Packages Framework, version 20250729";
footnote1 "SAS Packages Framework, version 20251017";
proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
@@ -941,27 +959,27 @@ run;
file &zipReferrence.(license.sas) encoding = &packageEncoding.;
length packageAuthor $ 1024;
packageAuthor = symget('packageAuthor');
put " ";
put "Copyright (c) since %sysfunc(today(),year4.) " packageAuthor ;
put " ";
put "Permission is hereby granted, free of charge, to any person obtaining a copy ";
put 'of this software and associated documentation files (the "Software"), to deal ';
put "in the Software without restriction, including without limitation the rights ";
put "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ";
put "copies of the Software, and to permit persons to whom the Software is ";
put "furnished to do so, subject to the following conditions: ";
put " ";
put "The above copyright notice and this permission notice shall be included ";
put "in all copies or substantial portions of the Software. ";
put " ";
put 'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ';
put "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ";
put "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ";
put "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ";
put "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ";
put "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ";
put "SOFTWARE. ";
put " ";
put " ";
put "Copyright (c) since %sysfunc(today(),year4.) " packageAuthor ;
put " ";
put "Permission is hereby granted, free of charge, to any person obtaining a copy";
put 'of this software and associated documentation files (the "Software"), to deal';
put "in the Software without restriction, including without limitation the rights";
put "to use, copy, modify, merge, publish, distribute, sublicense, and/or sell";
put "copies of the Software, and to permit persons to whom the Software is";
put "furnished to do so, subject to the following conditions:";
put " ";
put "The above copyright notice and this permission notice shall be included";
put "in all copies or substantial portions of the Software.";
put " ";
put 'THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR';
put "IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,";
put "FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE";
put "AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER";
put "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,";
put "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE";
put "SOFTWARE.";
put " ";
run;
%end;
@@ -1697,7 +1715,7 @@ data _null_;
%end;
put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20250729.;''' /
' !! '' %put with the SAS Packages Framework version 20251017.;''' /
' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ;
@@ -1862,7 +1880,7 @@ data _null_;
%end;
put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20250729.; '' !! ' /
''' %put with the SAS Packages Framework version 20251017.; '' !! ' /
''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' /
@@ -2669,7 +2687,7 @@ data _null_;
%end;
put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20250729`*";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20251017`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /;
@@ -3224,16 +3242,57 @@ options DLCREATEDIR; /* turns-on creation of subdirectories by libname */
/* temporary location for tests results is WORK unless developer provide &testResults. */
%local testPackageTimesamp;
%let testPackageTimesamp = %sysfunc(lowcase(&packageName._%sysfunc(datetime(),b8601dt15.)));
%if %qsysfunc(fileexist(%bquote(&testResults.))) %then
%if %qsysfunc(fileexist(%superq(testResults))) %then
%do;
libname TEST "&testResults./test_&testPackageTimesamp.";
%end;
%else
%do;
%if NOT %sysevalf(%superq(testResults)=,boolean) %then
%do;
%put WARNING: The testResults path:;
%put WARNING- %superq(testResults);
%put WARNING- does not exist. WORK will be used.;
%put WARNING- ;
%end;
libname TEST "&SASWORK./test_&testPackageTimesamp.";
%end;
/* test work points to the SAS session work */
libname TESTWORK "&SASWORK./testwork_&testPackageTimesamp.";
/* test WORK points to the SAS session WORK or to directory pointed by the developer */
%if %qsysfunc(fileexist(%superq(testWorkPath))) %then
%do;
libname TESTWORK "&testWorkPath./testwork_&testPackageTimesamp.";
%put NOTE- ;
%PUT NOTE: WORK libname directories from test SAS sessions will not be deleted.;
%if %sysevalf(1=%superq(workInTestResults),boolean) %then
%do;
%put NOTE- Parameter workInTestResults is ignored;
%end;
%put NOTE- ;
%let delTestWork=0;
%end;
%else %if %sysevalf(1=%superq(workInTestResults),boolean) %then
%do;
libname TESTWORK "%sysfunc(pathname(TEST))";
%put NOTE- ;
%PUT NOTE: WORK libname directories from test SAS sessions will be located in the;
%PUT NOTE- same directory where test resulrs are stored, and will not be deleted.;
%put NOTE- ;
%let delTestWork=0;
%end;
%else
%do;
%if NOT %sysevalf(%superq(testWorkPath)=,boolean) %then
%do;
%put WARNING: The testWorkPath path:;
%put WARNING- %superq(testWorkPath);
%put WARNING- does not exist. WORK will be used.;
%put WARNING- ;
%end;
libname TESTWORK "&SASWORK./testwork_&testPackageTimesamp.";
%end;
%local dirForTest dirForTestWork;
%let dirForTest = %sysfunc(pathname(TEST));
%let dirForTestWork = %sysfunc(pathname(TESTWORK));
@@ -3247,7 +3306,7 @@ filename currdir ".";
filename currdir list;
/* if your package uses any other packages this points to their location */
/* test if packages fileref exists and, if do, use it */
/* test if packages fileref exists and, if it does, use it */
/* if no one is provided the filesLocation is used as a replacement */
%if %bquote(&packages.)= %then %let packages=%sysfunc(pathname(packages));
%if %bquote(&packages.)= %then %let packages=&filesLocation.;
@@ -3273,9 +3332,9 @@ options NOquotelenmax;
data _null_;
file "./loading.sas";
put "proc printto";
put "log = '&dirForTest./loading.log0'";
put "; run;";
put "proc printto"
/ "log = '&dirForTest./loading.log0'"
/ "; run;";
put "filename packages '&packages.';" /;
@@ -3285,18 +3344,18 @@ data _null_;
put '%include packages(loadpackage.sas);' / ; /* for older versions when the SPFinit.sas did not exist */
/* load */
put '%loadpackage'"(&packageName.,";
put " path=&filesLocation.)" /;
put '%loadpackage'"(&packageName.,";
put " path=&filesLocation., lazyData=*)" /;
put '%loadpackage'"(&packageName.,"
/ " path=&filesLocation.)" /;
put '%loadpackage'"(&packageName.,"
/ " path=&filesLocation., lazyData=*)" /;
/* help */
put '%helpPackage'"(&packageName.,";
put " path=&filesLocation.)" /;
put '%helpPackage'"(&packageName.,*,";
put " path=&filesLocation.)" /;
put '%helpPackage'"(&packageName.,License,";
put " path=&filesLocation.)" /;
put '%helpPackage'"(&packageName.,"
/ " path=&filesLocation.)" /;
put '%helpPackage'"(&packageName.,*,"
/ " path=&filesLocation.)" /;
put '%helpPackage'"(&packageName.,License,"
/ " path=&filesLocation.)" /;
/* preview */
put '%previewPackage'"(&packageName.,";
@@ -3316,10 +3375,9 @@ data _null_;
when (upcase(type) in ("LAZYDATA")) /* the "DATA" type will pop-up during deletion */
do;
if 1 = FIRST.type then
put "data _null_; " ;
put " if not exist('" fileshortUP "') then " /
" put 'WARNING: Dataset " fileshortUP "does not exist!'; "
;
put "data _null_; "
/ " if not exist('" fileshortUP "') then "
/ " put 'WARNING: Dataset " fileshortUP "does not exist!'; " ;
if 1 = LAST.type then
put "run; ";
end;
@@ -3327,10 +3385,9 @@ data _null_;
when (upcase(type) =: "MACRO")
do;
if 1 = FIRST.type then
put "data _null_; " ;
put ' if not input(resolve(''%SYSMACEXIST(' fileshortUP ')''), best.) then ' /
" put 'WARNING: Macro " fileshortUP "does not exist!'; "
;
put "data _null_; "
/ ' if not input(resolve(''%SYSMACEXIST(' fileshortUP ')''), best.) then '
/ " put 'WARNING: Macro " fileshortUP "does not exist!'; " ;
if 1 = LAST.type then
put "run; ";
@@ -3348,19 +3405,23 @@ data _null_;
end;
/* unload */
put '%unloadPackage'"(&packageName.,";
put " path=&filesLocation.) " /;
put '%unloadPackage'"(&packageName.,"
/ " path=&filesLocation.) " /;
/* additional content */
put '%loadPackageAddCnt'"(&packageName.,";
put " path=&filesLocation.) " /;
put '%loadPackageAddCnt'"(&packageName.,"
/ " path=&filesLocation.) " /;
put "filename packages '&filesLocation.';" /
'%listPackages() ' /;
put "filename packages '&filesLocation.';"
/ '%listPackages() ' /;
/* check if work should be deleted after test is done */
delTestWork = input(symget('delTestWork'), ?? best32.);
if 0 = delTestWork then
put "options NOWORKTERM;"/;
put "proc printto";
put "; run;";
put "proc printto"
/ "; run;";
stop;
run;
@@ -3471,6 +3532,28 @@ data _null_;
file "./autoexec.sas";
/* check if work should be deleted after test is done */
delTestWork = input(symget('delTestWork'), ?? best32.);
if not(delTestWork in (0 1)) then
do;
putlog "WARNING: [&sysmacroname.] The `delTestWork` parameter is invalid.";
putlog "WARNING- [&sysmacroname.] Default value (1) is set.";
delTestWork = 1;
end;
if 0 = delTestWork then
do;
put "libname _ '&dirForTest.';" /
"data TESTWORK_&t.;" /
" length testName $ 128 testWork $ 2048;" /
" testNumber=&t.; testName='&&TEST_&t..';" /
" testWork = pathname('WORK');" /
"run;" /
"proc append base=_.TESTWORK data=TESTWORK_&t.; run;" /
"proc delete data=TESTWORK_&t.; run;" /
"libname _ clear;" ;
end;
put "proc printto";
put "log = '&dirForTest./&&TEST_&t...log0'";
put "; run;";
@@ -3487,15 +3570,6 @@ data _null_;
put '%loadpackage'"(&packageName.,";
put " path=&filesLocation., lazyData=*)" /;
/* check if work should be deleted after test is done */
delTestWork = input(symget('delTestWork'), ?? best32.);
if not(delTestWork in (0 1)) then
do;
putlog "WARNING: [&sysmacroname.] The `delTestWork` parameter is invalid.";
putlog "WARNING- [&sysmacroname.] Default value (1) is set.";
delTestWork = 1;
end;
if 0 = delTestWork then
put "options NOWORKTERM;"/;
@@ -3572,12 +3646,13 @@ options &notesSourceOptions.;
data test.tests_summary;
length testName $ 128;
do _N_ = 0 to &numberOfTests.;
testName = symget(cats("TEST_", _N_));
systask = coalesce(input(symget(cats("SASSTAT", _N_)), ?? best32.), -1);
sysrc = coalesce(input(symget(cats("TESTRC_", _N_)), ?? best32.), -1);
error = coalesce(input(symget(cats("TESTE_", _N_)), ?? best32.), -1);
warning = coalesce(input(symget(cats("TESTW_", _N_)), ?? best32.), -1);
do testNumber = 0 to &numberOfTests.;
testName = symget(cats("TEST_", testNumber));
systask = coalesce(input(symget(cats("SASSTAT", testNumber)), ?? best32.), -1);
sysrc = coalesce(input(symget(cats("TESTRC_", testNumber)), ?? best32.), -1);
error = coalesce(input(symget(cats("TESTE_", testNumber)), ?? best32.), -1);
warning = coalesce(input(symget(cats("TESTW_", testNumber)), ?? best32.), -1);
output;
end;
run;
@@ -3585,10 +3660,29 @@ title1 "Summary of tests.";
title2 "details can be found in:";
title3 "%sysfunc(pathname(TEST))";
footnote;
proc print data = test.tests_summary;
proc print data = test.tests_summary(drop=testNumber);
run;
title;
%if 0=&delTestWork. %then
%do;
data test.tests_summary;
merge
test.tests_summary
%if %sysfunc(EXIST(test.testwork)) %then
%do; test.testwork %end;
%else
%do; %PUT INFO: Cannot add work path location info.; %end;
;
by testNumber;
run;
%if %sysfunc(EXIST(test.testwork)) %then
%do;
proc delete data=test.testwork;
run;
%end;
%end;
/*%put _local_;*/
%put NOTE: Changing current folder to:;
@@ -3707,7 +3801,7 @@ data &filesWithCodes.markdown;
%end;
put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20250729`*"
/ "*SAS package generated by SAS Package Framework, version `20251017`*"
/ " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content";