SAS Packages Framework, version 20250710

SAS Packages Framework, version 20250710

Changes:
- Framework's code cleanup: all uses of the autocall `%lowcase()` macro were removed or replaced by `%sysfunc(lowcase(...))` call.
- Formatting of the default MIT license text in the `%generatePackage()` macro was changed.
- The `sourcePath=` parameter in the `%installPackage()` macro now allows both quoted and un-quoted address.
- Documentation updated.
This commit is contained in:
Bart Jablonski
2025-07-10 13:56:45 +02:00
parent 628641a6cf
commit cc25b76144
17 changed files with 401 additions and 391 deletions

View File

@@ -3,7 +3,7 @@
Macro to generate SAS packages.
Version 20241207
Version 20250710
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -18,7 +18,7 @@
%macro generatePackage(
filesLocation /* location of package files
e.g. %sysfunc(pathname(work))/%lowcase(&packageName.) */
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" */
@@ -43,7 +43,7 @@
file name be created */
)/ secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20241207. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20250710. Run %generatePackage() for help info.'
;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do;
@@ -58,7 +58,7 @@ des = 'Macro to generate SAS packages, version 20241207. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20241207` #;
%put # Macro to generate SAS packages, version `20250710` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -375,8 +375,9 @@ options NOquotelenmax NOstimer NOfullstimer;
different file reference for each package
while loading package with %loadPackage() macro
*/
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
data _null_;
call symputX("_PackageFileref_", "P" !! put(MD5(lowcase("&packageName.")), hex7. -L), "L");
run;
/* test if version is a number */
data _null_;
@@ -397,17 +398,17 @@ data _null_;
run;
/* create or replace the ZIP file for package */
filename &zipReferrence. ZIP "&filesLocation./%lowcase(&packageName.).zip";
filename &zipReferrence. ZIP "&filesLocation./%sysfunc(lowcase(&packageName.)).zip";
%if %sysfunc(fexist(&zipReferrence.)) %then
%do;
%put NOTE: Deleting file "&filesLocation./%lowcase(&packageName.).zip";
%put NOTE: Deleting file "&filesLocation./%sysfunc(lowcase(&packageName.)).zip";
%let _RC_ = %sysfunc(fdelete(&zipReferrence.));
%put NOTE: &=_RC_;
%end;
%if %sysfunc(fexist(&zipReferrence.)) %then
%do;
%put ERROR: File "&filesLocation./%lowcase(&packageName.).zip" cannot be deleted.;
%put ERROR: File "&filesLocation./%sysfunc(lowcase(&packageName.)).zip" cannot be deleted.;
%put ERROR- Check if the file is not blocked by another process.;
%put ERROR- Aborting.;
%abort;
@@ -871,7 +872,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 20241207";
footnote1 "SAS Packages Framework, version 20250710";
proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
@@ -940,26 +941,26 @@ run;
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 "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;
@@ -1036,13 +1037,12 @@ data _null_;
put ' )/secure; ';
put ' %PUT ** NOTE: Package ' "&packageName." ' loaded in ICE mode **; ';
put ' %local _PackageFileref_; ';
put ' /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ ';
put ' data _null_; ';
put ' call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); ';
put ' run; ';
put ' data _null_; ';
put ' call symputX("_PackageFileref_", "P" !! put(MD5(lowcase("&packageName.")), hex7. -L), "L"); ';
put ' run; ';
put ' filename &_PackageFileref_. &ZIP. ';
put ' "&path./%lowcase(&packageName.).&zip." %unquote(&options.) ';
put ' "&path./%sysfunc(lowcase(&packageName.)).&zip." %unquote(&options.) ';
put ' ; ';
put ' %include &_PackageFileref_.(packagemetadata.sas) / &source2.; ';
put ' filename &_PackageFileref_. clear; ';
@@ -1079,7 +1079,7 @@ data _null_;
put ' %end; ';
put ' filename &_PackageFileref_. &ZIP. ';
put ' "&path./%lowcase(&packageName.).&zip." %unquote(&options.) ';
put ' "&path./%sysfunc(lowcase(&packageName.)).&zip." %unquote(&options.) ';
put ' ENCODING = ';
put ' %if %bquote(&packageEncoding.) NE %then &packageEncoding. ; ';
put ' %else utf8 ; ';
@@ -1403,21 +1403,21 @@ data _null_;
if 1 = isFunction and upcase(type)=:'FUNCTION' then
do;
/* macro variable for test if cherry picking used FCMP */
put 'data _null_; ';
put " call symputX('cherryPick_FCMP', exist('work.%lowcase(&packageName.fcmp)'), 'L'); ";
put 'run; ';
put 'data _null_; ';
put " call symputX('cherryPick_FCMP', exist('work.&packageName.fcmp'), 'L'); ";
put 'run; ';
end;
if 1 = FIRST.type and upcase(type)='FUNCTIONS' then
do;
/* header for multiple functions in one FCMP run */
put "proc fcmp outlib = work.%lowcase(&packageName.fcmp).package ; ";
put "proc fcmp outlib = work.&packageName.fcmp.package ; ";
end;
if 1 = isProto and upcase(type)='PROTO' then
do;
/* macro variable for test if cherry picking used PROTO */
put 'data _null_; ';
put " call symputX('cherryPick_PROTO', exist('work.%lowcase(&packageName.proto)'), 'L'); ";
put 'run; ';
put 'data _null_; ';
put " call symputX('cherryPick_PROTO', exist('work.&packageName.proto'), 'L'); ";
put 'run; ';
end;
if 1 = FIRST.type and upcase(type)='PROTO' then
do;
@@ -1426,20 +1426,20 @@ data _null_;
value of "package=" overwrites previously created content
*/
/* header for multiple functions in one PROTO run */
put "proc proto package = work.%lowcase(&packageName.proto).package" ProtoGrpNum /
put "proc proto package = work.&packageName.proto.package" ProtoGrpNum /
" LABEL='Proc Proto C functions for &packageName. package, part" ProtoGrpNum "' ; ";
end;
if 1 = isFormat and upcase(type)=:'FORMAT' then
do;
/* macro variable for test if cherry picking used FORMAT */
put 'data _null_; ';
put " call symputX('cherryPick_FORMAT', cexist('work.%lowcase(&packageName.format)'), 'L'); ";
put 'run; ';
put 'data _null_; ';
put " call symputX('cherryPick_FORMAT', cexist('work.&packageName.format'), 'L'); ";
put 'run; ';
end;
if 1 = FIRST.type and upcase(type)='FORMATS' then
do;
/* header, for FORMATS */
put "proc format lib = work.%lowcase(&packageName.format) ; ";
put "proc format lib = work.&packageName.format ; ";
end;
if 1 = isIMLmodule and upcase(type)='IMLMODULE' then
do;
@@ -1613,42 +1613,42 @@ data _null_;
/* add the link to the functions dataset, only for the first occurrence */
/*if 1 = isFunction and (upcase(type)=:'FUNCTION') then
do;
put "options APPEND=(cmplib = work.%lowcase(&packageName.fcmp));"/;
put "options APPEND=(cmplib = work.%sysfunc(lowcase(&packageName.fcmp)));"/;
end;*/
if 1 = FIRST.type and (upcase(type)=:'FUNCTION') then
do;
put '%sysfunc(ifc(0<' /
' %sysfunc(findw((%sysfunc(getoption(cmplib)))' /
" ,work.%lowcase(&packageName.fcmp),""'( )'"",RIO))" /
',,%str(options' " APPEND=(cmplib = work.%lowcase(&packageName.fcmp));)" /
" ,work.%sysfunc(lowcase(&packageName.fcmp)),""'( )'"",RIO))" /
',,%str(options' " APPEND=(cmplib = work.%sysfunc(lowcase(&packageName.fcmp)));)" /
'))' ;
end;
/* add the link to the proto functions dataset, only for the first occurrence */
/*if 1 = isProto and (upcase(type)=:'PROTO') then
do;
put "options APPEND=(cmplib = work.%lowcase(&packageName.proto));"/;
put "options APPEND=(cmplib = work.%sysfunc(lowcase(&packageName.proto)));"/;
end;*/
if 1 = FIRST.type and (upcase(type)=:'PROTO') then
do;
put '%sysfunc(ifc(0<' /
' %sysfunc(findw((%sysfunc(getoption(cmplib)))' /
" ,work.%lowcase(&packageName.proto),""'( )'"",RIO))" /
',,%str(options' " APPEND=(cmplib = work.%lowcase(&packageName.proto));)" /
" ,work.%sysfunc(lowcase(&packageName.proto)),""'( )'"",RIO))" /
',,%str(options' " APPEND=(cmplib = work.%sysfunc(lowcase(&packageName.proto)));)" /
'))' ;
end;
/* add the link to the formats catalog, only for the first occurrence */
/*if 1 = isFormat and (upcase(type)=:'FORMAT') then
do;
put "options INSERT=(fmtsearch = work.%lowcase(&packageName.format));"/;
put "options INSERT=(fmtsearch = work.%sysfunc(lowcase(&packageName.format)));"/;
end;*/
if 1 = FIRST.type and (upcase(type)=:'FORMAT') then
do;
put '%sysfunc(ifc(0<' /
' %sysfunc(findw((%sysfunc(getoption(fmtsearch)))' /
" ,work.%lowcase(&packageName.format),""'( )'"",RIO))" /
',,%str(options' " INSERT=(fmtsearch = work.%lowcase(&packageName.format));)" /
" ,work.%sysfunc(lowcase(&packageName.format)),""'( )'"",RIO))" /
',,%str(options' " INSERT=(fmtsearch = work.%sysfunc(lowcase(&packageName.format)));)" /
'))' ;
end;
@@ -1696,7 +1696,7 @@ data _null_;
%end;
put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20241207.;''' /
' !! '' %put with the SAS Packages Framework version 20250710.;''' /
' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ;
@@ -1716,7 +1716,7 @@ data _null_;
put ' !! '' %local tmp_NOTES;'' ';
put ' !! '' %let tmp_NOTES = %sysfunc(getoption(NOTES));'' ';
/* the PATH macrovariable will be resolved when the load.sas file is executed */
put ' !! " filename ' "&_PackageFileref_." ' &ZIP. ''&path./' "%lowcase(&packageName.)" '.&zip.'';"';
put ' !! " filename ' "&_PackageFileref_." ' &ZIP. ''&path./' "%sysfunc(lowcase(&packageName.))" '.&zip.'';"';
/* this loop lists includes for CASLUDFs in the macro definition */
do until(eof1); /* loopOverTypes1 - start */
@@ -1778,8 +1778,8 @@ data _null_;
do;
put '%if 0 = &cherryPick_FCMP. %then %do;';
put 'options cmplib = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(cmplib)))' /
',%str(' "work.%lowcase(&packageName.fcmp)" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(cmplib))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.fcmp))" '), %str() ))));';
put 'options cmplib = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(cmplib))' /
',%str(()) ))));';
@@ -1790,13 +1790,13 @@ data _null_;
do;
put '%if 0 = &cherryPick_PROTO. %then %do;';
put 'options cmplib = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(cmplib)))' /
',%str(' "work.%lowcase(&packageName.proto)" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(cmplib))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.proto))" '), %str() ))));';
put 'options cmplib = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(cmplib))' /
',%str(()) ))));';
/* proc delete is adde because "empty" PROTO creates dataset too */
put "proc delete data=work.%lowcase(&packageName.proto); run;";
put "proc delete data=work.&packageName.proto; run;";
put '%end;';
end;
@@ -1806,8 +1806,8 @@ data _null_;
do;
put '%if 0 = &cherryPick_FORMAT. %then %do;';
put 'options fmtsearch = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(fmtsearch)))' /
',%str(' "work.%lowcase(&packageName.)format" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(fmtsearch))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.))format" '), %str() ))));';
put 'options fmtsearch = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(fmtsearch))' /
', %str(()) ))));';
@@ -1861,14 +1861,14 @@ data _null_;
%end;
put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20241207.; '' !! ' /
''' %put with the SAS Packages Framework version 20250710.; '' !! ' /
''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' /
''' %local localSYSmacroName localPackageName i depListNm; '' !! ' /
''' %let localSYSmacroName = &sysmacroname.; '' !! ' /
''' %let localSYSmacroName = %LOWCASE(&localSYSmacroName.); '' !! ' /
''' %let localSYSmacroName = %sysfunc(lowcase(&localSYSmacroName.)); '' !! ' /
''' %let localPackageName = %substr(&localSYSmacroName.,1,%eval(%length(&localSYSmacroName.)-3));'' !!' /
''' %if %superq(depList) ne %then '' !!' /
@@ -1945,12 +1945,12 @@ data _null_;
isKMF + 1;
if 1=isKMF then
do;
put 'data _null_; '
/ ' call symputX("cherryPick_KMF", 0, "L"); '
/ 'run; '
/ "data work.%lowcase(&packageName.kmf); "
/ "length member $ 128; call missing(member); "
/ "if 0 then output; ";
put 'data _null_; '
/ ' call symputX("cherryPick_KMF", 0, "L"); '
/ 'run; '
/ "data work.&packageName.kmf; "
/ "length member $ 128; call missing(member); "
/ "if 0 then output; ";
end;
put ' '
@@ -1971,7 +1971,7 @@ data _null_;
put '%if &cherryPick_KMF. %then %do;';
put 'filename __KMFgen temp;'
/ 'data _null_;'
/ " set work.%lowcase(&packageName.kmf) nobs=nobs;"
/ " set work.&packageName.kmf nobs=nobs;"
/ ' call symputX("numberKMF",nobs,"L");'
/ ' file __KMFgen;'
@@ -2003,10 +2003,10 @@ data _null_;
;
put 'data _nulL_;'
/ ' file "%sysfunc(pathname(WORK))/%lowcase(&packageName..kmf)" termstr=NL lrecl=32767;'
/ ' file "%sysfunc(pathname(WORK))/%sysfunc(lowcase(&packageName..kmf))" termstr=NL lrecl=32767;'
/ ' putlog "INFO: The &packageName. package provides KMF-abbreviations."; '
/ ' putlog @7 "By default the file with abbreviations is located in:";'
/ ' putlog / @9 "%sysfunc(pathname(WORK))/%lowcase(&packageName..kmf)";'
/ ' putlog / @9 "%sysfunc(pathname(WORK))/%sysfunc(lowcase(&packageName..kmf))";'
/ ' putlog / @7 "To import code abbreviations to your SAS session:";'
/ ' putlog @7 "- in SAS DMS go to: Tools -> Keyboard Macros -> Macros... -> Import... ";'
/ ' putlog @7 "- in SAS EG go to: Program -> Manage Macros and Snippets -> Import... ";'
@@ -2014,8 +2014,8 @@ data _null_;
/ ' putlog / @7 "Should you have any problem with finding the file consider moving";'
/ ' putlog @7 "it to a location of your choice with the help of the following snippet:";'
/ ' putlog / @7 " filename KMFin " "''%sysfunc(pathname(WORK))/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog / @7 " filename KMFout " "''</directory/of/your/choice>/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog / @7 " filename KMFin " "''%sysfunc(pathname(WORK))/%sysfunc(lowcase(&packageName..kmf))''" " lrecl=1 recfm=n;";'
/ ' putlog / @7 " filename KMFout " "''</directory/of/your/choice>/%sysfunc(lowcase(&packageName..kmf))''" " lrecl=1 recfm=n;";'
/ ' putlog @7 '' %put *%sysfunc(fcopy(KMFin, KMFout))*(0=success)*;'';'
/ ' putlog / "0a"x / " ";'
@@ -2070,7 +2070,7 @@ data _null_;
/ 'filename __KMFgen clear;'
;
put '%end;';
put "proc delete data=work.%lowcase(&packageName.kmf); run;";
put "proc delete data=work.&packageName.kmf; run;";
put 'options &temp_noNotes_etc.;';
end;
put 'data _null_;';
@@ -2102,7 +2102,7 @@ data _null_;
put ' end; ';
put ' SYSloadedPackages = cats("#", translate(strip(SYSloadedPackages), "#", " "), "#"); ';
put " indexPCKG = INDEX(lowcase(SYSloadedPackages), '#%lowcase(&packageName.)('); ";
put " indexPCKG = INDEX(lowcase(SYSloadedPackages), '#%sysfunc(lowcase(&packageName.))('); ";
put " if indexPCKG = 0 then ";
put ' do; ';
put " SYSloadedPackages = catx('#', SYSloadedPackages, '&packageName.(&packageVersion.)'); ";
@@ -2298,11 +2298,11 @@ data _null_;
/* delete the link to the formats catalog */
if isFormat then
do;
put "proc delete data = work.%lowcase(&packageName.format)(mtype = catalog);";
put "proc delete data = work.&packageName.format(mtype = catalog);";
put 'run;';
put 'options fmtsearch = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(fmtsearch)))' /
',%str(' "work.%lowcase(&packageName.)format" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(fmtsearch))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.))format" '), %str() ))));';
put 'options fmtsearch = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(fmtsearch))' /
', %str(()) ))));';
@@ -2322,11 +2322,11 @@ data _null_;
/* delete the link to the proto functions dataset */
if isProto then
do;
put "proc delete data = work.%lowcase(&packageName.proto);";
put "proc delete data = work.&packageName.proto;";
put "run;" /;
put 'options cmplib = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(cmplib)))' /
',%str(' "work.%lowcase(&packageName.proto)" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(cmplib))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.proto))" '), %str() ))));';
put 'options cmplib = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(cmplib))' /
',%str(()) ))));';
@@ -2335,7 +2335,7 @@ data _null_;
/* delete functions */
put "proc fcmp outlib = work.%lowcase(&packageName.fcmp).package;";
put "proc fcmp outlib = work.&packageName.fcmp.package;";
isFunction = 0;
EOF = 0;
do until(EOF);
@@ -2352,8 +2352,8 @@ data _null_;
if isFunction then
do;
put 'options cmplib = (%unquote(%sysfunc(tranwrd(' /
'%lowcase(%sysfunc(getoption(cmplib)))' /
',%str(' "work.%lowcase(&packageName.fcmp)" '), %str() ))));';
'%sysfunc(lowcase(%sysfunc(getoption(cmplib))))' /
',%str(' "work.%sysfunc(lowcase(&packageName.fcmp))" '), %str() ))));';
put 'options cmplib = (%unquote(%sysfunc(compress(' /
'%sysfunc(getoption(cmplib))' /
',%str(()) ))));';
@@ -2445,7 +2445,7 @@ data _null_;
put ' end; ';
put ' SYSloadedPackages = cats("#", translate(strip(SYSloadedPackages), "#", " "), "#"); ';
put " if INDEX(lowcase(SYSloadedPackages), '#%lowcase(&packageName.(&packageVersion.))#') > 0 then ";
put " if INDEX(lowcase(SYSloadedPackages),'#%sysfunc(lowcase(&packageName.(&packageVersion.)))#')>0 then ";
put ' do; ';
put " SYSloadedPackages = tranwrd(SYSloadedPackages, '#&packageName.(&packageVersion.)#', '##'); ";
put ' SYSloadedPackages = compbl(translate(SYSloadedPackages, " ", "#")); ';
@@ -2663,12 +2663,12 @@ data _null_;
%if %superq(additionalContent) NE %then
%do;
put 'put ;' / 'put @3 ''Package contains additional content, run: %loadPackageAddCnt(' "&packageName." ') to load it'';';
put "put @3 'or look for the %lowcase(&packageName.)_AdditionalContent directory in the Packages fileref';";
put "put @3 'or look for the %sysfunc(lowcase(&packageName.))_AdditionalContent directory in the Packages fileref';";
put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;";
%end;
put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20241207`*";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20250710`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /;
@@ -2820,7 +2820,7 @@ data _null_;
if (upcase(type) not in: ('TEST' 'ADDCNT')); /* test files and additional content are not to be copied */
call execute(cat ('filename _SPFIN_ "', catx('/', base, folder, file), '";'));
call execute(cats("filename _SPFOUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='_", folder, ".", file, "';") );
call execute(cats("filename _SPFOUT_ ZIP '", base, "/%sysfunc(lowcase(&packageName.)).zip' member='_", folder, ".", file, "';") );
/* copy code file into the zip */
call execute('data _null_;');
@@ -2875,7 +2875,7 @@ data _null_;
"help "
;
/* test if "driving" files exist */
call execute(cats("filename _SPFOUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='", drivFile, ".sas';") );
call execute(cats("filename _SPFOUT_ ZIP '", base, "/%sysfunc(lowcase(&packageName.)).zip' member='", drivFile, ".sas';") );
call execute('data _null_;');
call execute(' pathname = pathname("_SPFIN_");');
call execute(' ex = fexist("_SPFOUT_");');
@@ -3012,7 +3012,7 @@ filename &zipReferrence. clear;
%put NOTE- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
%put NOTE-;
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).zip";
filename &zipReferrence. "&filesLocation./%sysfunc(lowcase(&packageName.)).zip";
filename &zipReferrence. list;
%local notesSourceOptions;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
@@ -3222,7 +3222,7 @@ run;
options DLCREATEDIR; /* turns-on creation of subdirectories by libname */
/* temporary location for tests results is WORK unless developer provide &testResults. */
%local testPackageTimesamp;
%let testPackageTimesamp = %lowcase(&packageName._%sysfunc(datetime(),b8601dt15.));
%let testPackageTimesamp = %sysfunc(lowcase(&packageName._%sysfunc(datetime(),b8601dt15.)));
%if %qsysfunc(fileexist(%bquote(&testResults.))) %then
%do;
libname TEST "&testResults./test_&testPackageTimesamp.";
@@ -3624,8 +3624,8 @@ options &quotelenmax_tmp.;
%sysfunc(getoption(notes)) %sysfunc(getoption(source)) msglevel=%sysfunc(getoption(msglevel));
options NOnotes NOsource msglevel=N;
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md";
filename &_PackageFileref_. ZIP "&filesLocation./%lowcase(&packageName.).zip";
filename &zipReferrence. "&filesLocation./%sysfunc(lowcase(&packageName.)).md";
filename &_PackageFileref_. ZIP "&filesLocation./%sysfunc(lowcase(&packageName.)).zip";
data &filesWithCodes.markdown;
/* break if no data */
@@ -3701,12 +3701,12 @@ data &filesWithCodes.markdown;
%do;
put " " / "---" / " ";
put 'Package contains additional content, run: `%loadPackageAddCnt(' "&packageName." ')` to load it'
/ "or look for the `%lowcase(&packageName.)_AdditionalContent` directory in the `packages` fileref"
/ "or look for the `%sysfunc(lowcase(&packageName.))_AdditionalContent` directory in the `packages` fileref"
/ "localization (only if additional content was deployed during the installation process).";
%end;
put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20241207`*"
/ "*SAS package generated by SAS Package Framework, version `20250710`*"
/ " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content";
@@ -3839,9 +3839,9 @@ options &MarkDownOptionsTmp.;
options NOnotes NOsource;
/* zip */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).zip" lrecl=1 recfm=n;
filename &zipReferrence. "&filesLocation./%sysfunc(lowcase(&packageName.)).zip" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.zip" lrecl=1 recfm=n;
filename &zipReferrenceV. "&filesLocation./%sysfunc(lowcase(&packageName.))_&packageVersion._.zip" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
@@ -3849,18 +3849,18 @@ options &MarkDownOptionsTmp.;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.zip file.";
put "ERROR: An error " rc "occurred during creation of %sysfunc(lowcase(&packageName.))_&packageVersion._.zip file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.zip file.";
else put "Creating %sysfunc(lowcase(&packageName.))_&packageVersion._.zip file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
/* md */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md" lrecl=1 recfm=n;
filename &zipReferrence. "&filesLocation./%sysfunc(lowcase(&packageName.)).md" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.md" lrecl=1 recfm=n;
filename &zipReferrenceV. "&filesLocation./%sysfunc(lowcase(&packageName.))_&packageVersion._.md" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
@@ -3868,10 +3868,10 @@ options &MarkDownOptionsTmp.;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.md file.";
put "ERROR: An error " rc "occurred during creation of %sysfunc(lowcase(&packageName.))_&packageVersion._.md file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.md file.";
else put "Creating %sysfunc(lowcase(&packageName.))_&packageVersion._.md file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
@@ -3941,7 +3941,7 @@ TODO: (in Polish)
- weryfikacja srodowiska [ ]
- dodac typ "ds2" [ ]
- dodac typ "ds2" [v]
- dodac mozliwosc szyfrowania pliku z pakietem (haslo do zip, sprawdzic istnienie funkcjonalnosci) [ ]