mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2026-01-15 18:40:06 +00:00
loading required packages is now available
loading required packages is now available sience each package has its own unique file reference by MD5(packageName).
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/*** HELP START ***/
|
||||
/*** HELP START ***/
|
||||
|
||||
/**############################################################################**/
|
||||
/* */
|
||||
@@ -52,7 +52,7 @@
|
||||
filesLocation=%sysfunc(pathname(work))/%lowcase(&packageName.)
|
||||
)/secure;
|
||||
/*** HELP END ***/
|
||||
%local zipReferrence filesWithCodes _DESCR_ _LIC_ _RC_;
|
||||
%local zipReferrence filesWithCodes _DESCR_ _LIC_ _RC_ _PackageFileref_;
|
||||
%let zipReferrence = _%sysfunc(datetime(), hex6.)_;
|
||||
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
|
||||
%let _DESCR_ = _%sysfunc(datetime(), hex6.)d;
|
||||
@@ -153,6 +153,12 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256;
|
||||
%abort;
|
||||
%end;
|
||||
|
||||
/* generate package fileref with MD5 to allow
|
||||
different file reference for each package
|
||||
while loading package with %loadPackage() macro
|
||||
*/
|
||||
%let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.);
|
||||
|
||||
/* test if version is a number */
|
||||
data _null_;
|
||||
version = input("&packageVersion.", ?? best32.);
|
||||
@@ -339,6 +345,7 @@ title2 "User: &SYSUSERID., datetime: %qsysfunc(datetime(), datetime21.), SAS ver
|
||||
title3 "Package's encoding: '&packageEncoding.', session's encoding: '&SYSENCODING.'.";
|
||||
title4 " ______________________________ ";
|
||||
title5 "List of files for package: &packageName. (version &packageVersion.), license: &packageLicense.";
|
||||
title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
|
||||
proc print data = &filesWithCodes.(drop=base);
|
||||
run;
|
||||
title;
|
||||
@@ -429,7 +436,7 @@ data _null_;
|
||||
|
||||
file &zipReferrence.(load.sas) lrecl=32767;
|
||||
|
||||
put 'filename package list;' /;
|
||||
put "filename &_PackageFileref_. list;" /;
|
||||
put ' %put NOTE- ;';
|
||||
put ' %put NOTE: ' @; put "Loading package &packageName., version &packageVersion., license &packageLicense.; ";
|
||||
put ' %put NOTE: ' @; put "*** &packageTitle. ***; ";
|
||||
@@ -441,7 +448,7 @@ data _null_;
|
||||
put ' %put NOTE- ;';
|
||||
put ' %put NOTE- *** START ***; ' /;
|
||||
|
||||
put '%include package(packagemetadata.sas) / nosource2;' /; /* <- copied also to loadPackage macro */
|
||||
put '%include ' " &_PackageFileref_.(packagemetadata.sas) / nosource2; " /; /* <- copied also to loadPackage macro */
|
||||
isFunction = 0;
|
||||
isFormat = 0;
|
||||
|
||||
@@ -517,10 +524,44 @@ data _null_;
|
||||
|
||||
%if %bquote(&packageReqPackages.) ne %then
|
||||
%do;
|
||||
put ' data _null_ ; ';
|
||||
put ' length req name $ 64 SYSloadedPackages $ 32767; ';
|
||||
|
||||
length packageReqPackages $ 32767;
|
||||
packageReqPackages = lowcase(symget('packageReqPackages'));
|
||||
/* try to load required packages */
|
||||
put 'data _null_ ; ';
|
||||
put ' length req name $ 64 SYSloadedPackages $ 32767; ';
|
||||
put ' if SYMEXIST("SYSloadedPackages") = 1 and SYMGLOBL("SYSloadedPackages") = 1 then ';
|
||||
put ' do; ';
|
||||
put ' do until(EOF); ';
|
||||
put ' set sashelp.vmacro(where=(scope="GLOBAL" and name="SYSLOADEDPACKAGES")) end=EOF; ';
|
||||
put ' substr(SYSloadedPackages, 1+offset, 200) = value; ';
|
||||
put ' end; ';
|
||||
put ' end; ';
|
||||
put ' SYSloadedPackages = lowcase(SYSloadedPackages); ';
|
||||
|
||||
put ' declare hash LP(); ';
|
||||
put ' LP.defineKey("name"); ';
|
||||
put ' LP.defineDone(); ';
|
||||
put ' do _N_ = 1 to countw(SYSloadedPackages); ';
|
||||
put ' name = scan(SYSloadedPackages, _N_); ';
|
||||
put ' _RC_ = LP.add(); ';
|
||||
put ' end; ';
|
||||
|
||||
put ' do req = ' / packageReqPackages / ' ; ';
|
||||
put ' name = lowcase(strip(scan(req, 1, " "))); ';
|
||||
put ' vers = lowcase(compress(scan(req,-1, " "), ".", "KD")); ';
|
||||
put ' if LP.check() ne 0 then ';
|
||||
put ' do; ';
|
||||
put ' put "NOTE: Trying to install required SAS package " req; ';
|
||||
put ' call execute(cats(''%nrstr(%loadPackage('', name, ", requiredVersion = ", vers, "))")); ';
|
||||
put ' end ; ';
|
||||
put ' end ; ';
|
||||
put ' stop; ';
|
||||
put 'run; ';
|
||||
|
||||
/* test if required packages are loaded */
|
||||
put 'data _null_ ; ';
|
||||
put ' length req name $ 64 SYSloadedPackages $ 32767; ';
|
||||
put ' if SYMEXIST("SYSloadedPackages") = 1 and SYMGLOBL("SYSloadedPackages") = 1 then ';
|
||||
put ' do; ';
|
||||
put ' do until(EOF); ';
|
||||
@@ -544,8 +585,8 @@ data _null_;
|
||||
put ' if LP.check() ne 0 then ';
|
||||
put ' do; ';
|
||||
put ' missingPackagr = 1; ';
|
||||
put ' put "ERROR: SAS package " req "is missing! " ; ';
|
||||
put ' put ''ERROR- Try %loadPackage('' name ", requiredVersion = " vers ") to load it." ;';
|
||||
put ' put "ERROR: SAS package " req "is missing! Download it and" ; ';
|
||||
put ' put ''ERROR- use %loadPackage('' name ", requiredVersion = " vers ") to load it." ;';
|
||||
put ' end ; ';
|
||||
put ' end ; ';
|
||||
put ' if missingPackagr then call symputX("packageRequiredErrors", 1, "L"); ';
|
||||
@@ -557,8 +598,8 @@ data _null_;
|
||||
put ' do req = ' / packageReqPackages / ' ; ';
|
||||
put ' name = lowcase(strip(scan(req, 1, " "))); ';
|
||||
put ' vers = lowcase(compress(scan(req,-1, " "), ".", "KD")); ';
|
||||
put ' put "ERROR: SAS package " req "is missing! " ; ';
|
||||
put ' put ''ERROR- Try %loadPackage('' name ", requiredVersion = " vers ") to load it." ; ';
|
||||
put ' put "ERROR: SAS package " req "is missing! Download it and" ; ';
|
||||
put ' put ''ERROR- use %loadPackage('' name ", requiredVersion = " vers ") to load it." ; ';
|
||||
put ' end ; ';
|
||||
put ' end; ';
|
||||
put ' stop; ';
|
||||
@@ -592,7 +633,7 @@ data _null_;
|
||||
put '%put NOTE- Executing the following code: ;';
|
||||
put '%put NOTE- *****************************;';
|
||||
put 'data _null_;';
|
||||
put ' infile package(_' folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put ' input;';
|
||||
put ' putlog "*> " _infile_;';
|
||||
put 'run;' /;
|
||||
@@ -600,7 +641,7 @@ data _null_;
|
||||
put '%put NOTE- ;';
|
||||
end;
|
||||
|
||||
put '%include package(_' folder +(-1) "." file +(-1) ') / nosource2;' /;
|
||||
put '%include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;' /;
|
||||
|
||||
isFunction + (upcase(type)=:'FUNCTION');
|
||||
isFormat + (upcase(type)=:'FORMAT');
|
||||
@@ -663,7 +704,7 @@ data _null_;
|
||||
|
||||
file &zipReferrence.(unload.sas);
|
||||
|
||||
put 'filename package list;' /;
|
||||
put "filename &_PackageFileref_. list;" /;
|
||||
put '%put NOTE: '"Unloading package &packageName., version &packageVersion., license &packageLicense.;";
|
||||
put '%put NOTE- *** START ***;' /;
|
||||
|
||||
@@ -677,14 +718,14 @@ data _null_;
|
||||
put '%put NOTE- Executing the following code: ;';
|
||||
put '%put NOTE- *****************************;';
|
||||
put 'data _null_;';
|
||||
put ' infile package(_' folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put ' input;';
|
||||
put ' putlog "*> " _infile_;';
|
||||
put 'run;' /;
|
||||
put '%put NOTE- *****************************;';
|
||||
put '%put NOTE- ;' /;
|
||||
|
||||
put '%include package(_' folder +(-1) "." file +(-1) ') / nosource2;' /;
|
||||
put '%include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;' /;
|
||||
end;
|
||||
|
||||
/* delete macros and formats */
|
||||
@@ -847,7 +888,7 @@ data _null_;
|
||||
file &zipReferrence.(help.sas);
|
||||
length strX $ 32767;
|
||||
|
||||
put 'filename package list;' /;
|
||||
put "filename &_PackageFileref_. list;" /;
|
||||
put ' %put NOTE- ;';
|
||||
put ' %put NOTE: '"Help for package &packageName., version &packageVersion., license &packageLicense.;";
|
||||
put ' %put NOTE: ' @; put "*** &packageTitle. ***; ";
|
||||
@@ -864,12 +905,12 @@ data _null_;
|
||||
put '%let notes_tmp = %sysfunc(getoption(notes)); ';
|
||||
put '%let source_tmp = %sysfunc(getoption(source)); ';
|
||||
put 'options ls = MAX ps = MAX nonotes nosource; ';
|
||||
put '%include package(packagemetadata.sas) / nosource2; ' /;
|
||||
put '%include' " &_PackageFileref_.(packagemetadata.sas) / nosource2; " /;
|
||||
|
||||
put 'data _null_; ';
|
||||
put ' if strip(symget("helpKeyword")) = " " then ';
|
||||
put ' do until (EOF); ';
|
||||
put ' infile package(description.sas) end = EOF; ';
|
||||
put " infile &_PackageFileref_.(description.sas) end = EOF; ";
|
||||
put ' input; ';
|
||||
put ' if upcase(strip(_infile_)) = "DESCRIPTION END:" then printer = 0; ';
|
||||
put ' if printer then put "*> " _infile_; ';
|
||||
@@ -882,7 +923,7 @@ data _null_;
|
||||
put 'data _null_; ';
|
||||
put ' if upcase(strip(symget("helpKeyword"))) = "LICENSE" then ';
|
||||
put ' do until (EOF); ';
|
||||
put ' infile package(license.sas) end = EOF; ';
|
||||
put " infile &_PackageFileref_.(license.sas) end = EOF; ";
|
||||
put ' input; ';
|
||||
put ' put "*> " _infile_; ';
|
||||
put ' end; ';
|
||||
@@ -937,7 +978,7 @@ data _null_;
|
||||
put ' memberX = cats("_",folder,".",file); ';
|
||||
/* inner datastep in call execute to read each embedded file */
|
||||
put ' call execute("data _null_; ");';
|
||||
put ' call execute("infile package(" || strip(memberX) || ") end = EOF; ");';
|
||||
put " call execute('infile &_PackageFileref_.(' || strip(memberX) || ') end = EOF; ');";
|
||||
put ' call execute(" printer = 0; ");';
|
||||
put ' call execute(" do until(EOF); ");';
|
||||
put ' call execute(" input; ");';
|
||||
|
||||
Reference in New Issue
Block a user