mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2026-01-09 16:00:06 +00:00
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:
@@ -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 "elenmax_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) [ ]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user