SAS Packages Framework, version 20241102

SAS Packages Framework, version 20241102

Changes:

In the `%loadPackage()`, the `%ICEloadPackage()`, and the `%loadPackageAddCnt()` macros version of a package can be provided with a comparison condition.

If the required version is provided with a comparison operator, e.g., `<=`, `=`, or `>`, then the operator is used to compare `required` and `provided` versions.

The following example:
```sas
%loadPackage(myPackage
  ,requiredVersion=1.2.2=
)
```
will force to load the package only if the required version is exactly equal to the provided one.

Comparison is done in form "`req. comparison prov.`".

Documentation and HoW-materials updated.
This commit is contained in:
Bart Jablonski
2024-11-02 22:18:23 +01:00
parent 7a7f674acf
commit 4b640e8ce1
16 changed files with 229 additions and 161 deletions

View File

@@ -6,7 +6,7 @@
when empty the "packages" value is used */
)/secure
/*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20241027. Run %extendPackagesFileref(HELP) for help info.'
des = 'Macro to list directories pointed by "packages" fileref, version 20241102. Run %extendPackagesFileref(HELP) for help info.'
;
%if %QUPCASE(&packages.) = HELP %then
@@ -22,7 +22,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20241027
%put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20241027` #;
%put # Macro to list directories pointed by 'packages' fileref, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -3,7 +3,7 @@
Macro to generate SAS packages.
Version 20241027
Version 20241102
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -43,7 +43,7 @@
file name be created */
)/ secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20241027. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20241102. 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 20241027. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20241027` #;
%put # Macro to generate SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -871,7 +871,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 20241027";
footnote1 "SAS Packages Framework, version 20241102";
proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
@@ -1048,22 +1048,35 @@ data _null_;
put ' filename &_PackageFileref_. clear; ';
/* test if required version of package is "good enough" */
put ' %local rV pV; ';
put ' %let pV = %sysfunc(compress(&packageVersion.,.,kd)); ';
put ' %let pV = %sysevalf((%scan(&pV.,1,.,M)+0)*1e8 ';
put ' + (%scan(&pV.,2,.,M)+0)*1e4 ';
put ' + (%scan(&pV.,3,.,M)+0)*1e0); ';
put ' %let rV = %sysfunc(compress(&requiredVersion.,.,kd)); ';
put ' %let rV = %sysevalf((%scan(&rV.,1,.,M)+0)*1e8 ';
put ' + (%scan(&rV.,2,.,M)+0)*1e4 ';
put ' + (%scan(&rV.,3,.,M)+0)*1e0); ';
put ' %if %sysevalf(&requiredVersion. > &packageVersion.) %then ';
put ' %do; ';
put ' %put ERROR: Required version is &requiredVersion.; ';
put ' %put ERROR- Provided version is &packageVersion.; ';
put ' %GOTO WrongVersionOFPackage; /*%RETURN;*/ ';
put ' %local rV pV rV0 pV0 rVsign; ';
put ' %let pV0 = %sysfunc(compress(&packageVersion.,.,kd)); ';
put ' %let pV = %sysevalf((%scan(&pV0.,1,.,M)+0)*1e8 ';
put ' + (%scan(&pV0.,2,.,M)+0)*1e4 ';
put ' + (%scan(&pV0.,3,.,M)+0)*1e0); ';
put ' ';
put ' %let rV0 = %sysfunc(compress(&requiredVersion.,.,kd)); ';
put ' %let rVsign = %sysfunc(compress(&requiredVersion.,<=>,k)); ';
put ' %if %superq(rVsign)= %then %let rVsign=<=; ';
put ' %else %if NOT (%superq(rVsign) IN (%str(=) %str(<=) %str(=<) %str(=>) %str(>=) %str(<) %str(>))) %then ';
put ' %do; ';
put ' %put WARNING: Illegal operatopr "%superq(rVsign)"! Default(<=) will be used.; ';
put ' %put WARNING- Supported operators are: %str(= <= =< => >= < >); ';
put ' %let rVsign=<=; ';
put ' %end; ';
put ' %let rV = %sysevalf((%scan(&rV0.,1,.,M)+0)*1e8 ';
put ' + (%scan(&rV0.,2,.,M)+0)*1e4 ';
put ' + (%scan(&rV0.,3,.,M)+0)*1e0); ';
put ' ';
put ' %if NOT %sysevalf(&rV. &rVsign. &pV.) %then ';
put ' %do; ';
put ' %put ERROR: Package &packageName. will not be loaded!; ';
put ' %put ERROR- Required version is &rV0.; ';
put ' %put ERROR- Provided version is &pV0.; ';
put ' %put ERROR- Condition %bquote((&rV0. &rVsign. &pV0.)) evaluates to %sysevalf(&rV. &rVsign. &pV.); ';
put ' %put ERROR- Verify installed version of the package.; ';
put ' %put ERROR- ; ';
put ' %GOTO WrongVersionOFPackage; /*%RETURN;*/ ';
put ' %end; ';
put ' filename &_PackageFileref_. &ZIP. ';
put ' "&path./%lowcase(&packageName.).&zip." %unquote(&options.) ';
@@ -1683,7 +1696,7 @@ data _null_;
%end;
put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20241027.;''' /
' !! '' %put with the SAS Packages Framework version 20241102.;''' /
' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ;
@@ -1848,7 +1861,7 @@ data _null_;
%end;
put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20241027.; '' !! ' /
''' %put with the SAS Packages Framework version 20241102.; '' !! ' /
''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' /
@@ -2655,7 +2668,7 @@ data _null_;
%end;
put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20241027`*";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20241102`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /;
@@ -3693,7 +3706,7 @@ data &filesWithCodes.markdown;
%end;
put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20241027`*"
/ "*SAS package generated by SAS Package Framework, version `20241102`*"
/ " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content";

View File

@@ -28,7 +28,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to get help about SAS package, version 20241027. Run %helpPackage() for help info.'
des = 'Macro to get help about SAS package, version 20241102. Run %helpPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -43,7 +43,7 @@ des = 'Macro to get help about SAS package, version 20241027. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get help about SAS packages, version `20241027` #;
%put # Macro to get help about SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -1,5 +1,5 @@
/*+installPackage+*/
/* Macros to install SAS packages, version 20241027 */
/* Macros to install SAS packages, version 20241102 */
/* A SAS package is a zip file containing a group of files
with SAS code (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
@@ -23,7 +23,7 @@
/secure
minoperator
/*** HELP END ***/
des = 'Macro to install SAS package, version 20241027. Run %%installPackage() for help info.'
des = 'Macro to install SAS package, version 20241102. Run %%installPackage() for help info.'
;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do;
@@ -38,7 +38,7 @@ des = 'Macro to install SAS package, version 20241027. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to install SAS packages, version `20241027` #;
%put # Macro to install SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -3,7 +3,7 @@
Macro to list SAS packages in packages folder.
Version 20241027
Version 20241102
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -23,7 +23,7 @@
%macro listPackages()
/secure PARMBUFF
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241027.'
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241102.'
;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do;
@@ -38,7 +38,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
%put ### This is short help information for the `listPackages` macro #;
%put #-----------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to list available SAS packages, version `20241027` #;
%put # Macro to list available SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -36,7 +36,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to load SAS package, version 20241027. Run %loadPackage() for help info.'
des = 'Macro to load SAS package, version 20241102. Run %loadPackage() for help info.'
minoperator
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -52,7 +52,7 @@ minoperator
%put ### This is short help information for the `loadPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to *load* SAS packages, version `20241027` #;
%put # Macro to *load* SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -233,21 +233,31 @@ minoperator
filename &_PackageFileref_. clear;
/* test if required version of package is "good enough" */
%local rV pV;
%let pV = %sysfunc(compress(&packageVersion.,.,kd));
%let pV = %sysevalf((%scan(&pV.,1,.,M)+0)*1e8
+ (%scan(&pV.,2,.,M)+0)*1e4
+ (%scan(&pV.,3,.,M)+0)*1e0);
%let rV = %sysfunc(compress(&requiredVersion.,.,kd));
%let rV = %sysevalf((%scan(&rV.,1,.,M)+0)*1e8
+ (%scan(&rV.,2,.,M)+0)*1e4
+ (%scan(&rV.,3,.,M)+0)*1e0);
%local rV pV rV0 pV0 rVsign;
%let pV0 = %sysfunc(compress(&packageVersion.,.,kd));
%let pV = %sysevalf((%scan(&pV0.,1,.,M)+0)*1e8
+ (%scan(&pV0.,2,.,M)+0)*1e4
+ (%scan(&pV0.,3,.,M)+0)*1e0);
%let rV0 = %sysfunc(compress(&requiredVersion.,.,kd));
%let rVsign = %sysfunc(compress(&requiredVersion.,<=>,k));
%if %superq(rVsign)= %then %let rVsign=<=;
%else %if NOT (%superq(rVsign) IN (%str(=) %str(<=) %str(=<) %str(=>) %str(>=) %str(<) %str(>))) %then
%do;
%put WARNING: Illegal operatopr "%superq(rVsign)"! Default(<=) will be used.;
%put WARNING- Supported operators are: %str(= <= =< => >= < >);
%let rVsign=<=;
%end;
%let rV = %sysevalf((%scan(&rV0.,1,.,M)+0)*1e8
+ (%scan(&rV0.,2,.,M)+0)*1e4
+ (%scan(&rV0.,3,.,M)+0)*1e0);
%if %sysevalf(&rV. > &pV.) %then
%if NOT %sysevalf(&rV. &rVsign. &pV.) %then
%do;
%put ERROR: Package &packageName. will not be loaded!;
%put ERROR- Required version is &requiredVersion.;
%put ERROR- Provided version is &packageVersion.;
%put ERROR- Required version is &rV0.;
%put ERROR- Provided version is &pV0.;
%put ERROR- Condition %bquote((&rV0. &rVsign. &pV0.)) evaluates to %sysevalf(&rV. &rVsign. &pV.);
%put ERROR- Verify installed version of the package.;
%put ERROR- ;
%GOTO WrongVersionOFPackage; /*%RETURN;*/

View File

@@ -19,7 +19,7 @@
is provided in required version */
)/secure
/*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20241027. Run %loadPackageAddCnt() for help info.'
des = 'Macro to load additional content for a SAS package, version 20241102. Run %loadPackageAddCnt() for help info.'
minoperator
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -35,7 +35,7 @@ minoperator
%put ### This is short help information for the `loadPackageAddCnt` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to *load* additional content for a SAS package, version `20241027` #;
%put # Macro to *load* additional content for a SAS package, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -157,22 +157,33 @@ minoperator
%include &_PackageFileref_.(packagemetadata.sas) / &source2.;
filename &_PackageFileref_. clear;
/* test if required version of package is "good enough" */
%local rV pV;
%let pV = %sysfunc(compress(&packageVersion.,.,kd));
%let pV = %sysevalf((%scan(&pV.,1,.,M)+0)*1e8
+ (%scan(&pV.,2,.,M)+0)*1e4
+ (%scan(&pV.,3,.,M)+0)*1e0);
%let rV = %sysfunc(compress(&requiredVersion.,.,kd));
%let rV = %sysevalf((%scan(&rV.,1,.,M)+0)*1e8
+ (%scan(&rV.,2,.,M)+0)*1e4
+ (%scan(&rV.,3,.,M)+0)*1e0);
%local rV pV rV0 pV0 rVsign;
%let pV0 = %sysfunc(compress(&packageVersion.,.,kd));
%let pV = %sysevalf((%scan(&pV0.,1,.,M)+0)*1e8
+ (%scan(&pV0.,2,.,M)+0)*1e4
+ (%scan(&pV0.,3,.,M)+0)*1e0);
%let rV0 = %sysfunc(compress(&requiredVersion.,.,kd));
%let rVsign = %sysfunc(compress(&requiredVersion.,<=>,k));
%if %superq(rVsign)= %then %let rVsign=<=;
%else %if NOT (%superq(rVsign) IN (%str(=) %str(<=) %str(=<) %str(=>) %str(>=) %str(<) %str(>))) %then
%do;
%put WARNING: Illegal operatopr "%superq(rVsign)"! Default(<=) will be used.;
%put WARNING- Supported operators are: %str(= <= =< => >= < >);
%let rVsign=<=;
%end;
%let rV = %sysevalf((%scan(&rV0.,1,.,M)+0)*1e8
+ (%scan(&rV0.,2,.,M)+0)*1e4
+ (%scan(&rV0.,3,.,M)+0)*1e0);
%if %sysevalf(&rV. > &pV.) %then
%if NOT %sysevalf(&rV. &rVsign. &pV.) %then
%do;
%put ERROR: Additional content for package &packageName. will not be loaded!;
%put ERROR- Required version is &requiredVersion.;
%put ERROR- Provided version is &packageVersion.;
%put ERROR- Required version is &rV0.;
%put ERROR- Provided version is &pV0.;
%put ERROR- Condition %bquote((&rV0. &rVsign. &pV0.)) evaluates to %sysevalf(&rV. &rVsign. &pV.);
%put ERROR- Verify installed version of the package.;
%put ERROR- ;
%GOTO WrongVersionOFPackageAddCnt; /*%RETURN;*/

View File

@@ -11,7 +11,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20241027. Run %loadPackages() for help info.'
des = 'Macro to load multiple SAS packages at one run, version 20241102. Run %loadPackages() for help info.'
parmbuff
;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
@@ -27,7 +27,7 @@ parmbuff
%put ### This is short help information for the `loadPackageS` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro wrapper for the loadPackage macro, version `20241027` #;
%put # Macro wrapper for the loadPackage macro, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -79,7 +79,7 @@ parmbuff
%local lengthOfsyspbuff numberOfPackagesNames i packageElement packageName packageVersion str;
%let lengthOfsyspbuff = %qsysfunc(length(&syspbuff.));
%let packagesNames = %qsysfunc(compress(%qsubstr(&syspbuff., 2, %eval(&lengthOfsyspbuff.-2)), {[(. _,)]}, KDA));
%let packagesNames = %qsysfunc(compress(%qsubstr(&syspbuff., 2, %eval(&lengthOfsyspbuff.-2)), {[(. <=>_,)]}, KDA));
%let str = %qsysfunc(translate(%superq(packagesNames),[[ ]],{(,)}));
%let str = %qsysfunc(transtrn(%superq(str),],%str(] )));

View File

@@ -23,7 +23,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20241027. Run %previewPackage() for help info.'
des = 'Macro to preview content of a SAS package, version 20241102. Run %previewPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20241027. Run %preview
%put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get preview of a SAS packages, version `20241027` #;
%put # Macro to get preview of a SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -8,7 +8,7 @@
,nobs=0 /* technical parameter */
)
/*** HELP START ***/
/ des = 'Macro to split single code into multiple files for a SAS package, version 20241027. Run %splitCodeForPackage() for help info.'
/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20241102. Run %splitCodeForPackage() for help info.'
;
/*%macro _();%mend _;*/
%if (%superq(codeFile) = ) OR (%qupcase(&codeFile.) = HELP) %then
@@ -25,7 +25,7 @@
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Utility macro to *split* single file with SAS package code into multiple #;
%put # files with separate snippets, version `20241027` #;
%put # files with separate snippets, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -402,7 +402,7 @@ options nomprint nosymbolgen nomlogic notes source ls=MAX ps=MAX msglevel=N ;
*/
if firstLine[j] then
do;
put '/* File generated with help of SAS Packages Framework, version 20241027. */';
put '/* File generated with help of SAS Packages Framework, version 20241102. */';
firstLine[j]=0;
end;
put _infile_;

View File

@@ -20,7 +20,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to unload SAS package, version 20241027. Run %unloadPackage() for help info.'
des = 'Macro to unload SAS package, version 20241102. Run %unloadPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20241027. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to unload SAS packages, version `20241027` #;
%put # Macro to unload SAS packages, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -13,7 +13,7 @@
hashing_file() function, SAS 9.4M6 */
)/secure
/*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20241027. Run %verifyPackage() for help info.'
des = 'Macro to verify SAS package with the hash digest, version 20241102. Run %verifyPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20241027. Run %
%put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to verify SAS package with it hash digest, version `20241027` #;
%put # Macro to verify SAS package with it hash digest, version `20241102` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;