mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2026-01-08 15:30:06 +00:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11c0b95d7e |
File diff suppressed because it is too large
Load Diff
105
SPF/Macros/extendpackagesfileref.sas
Normal file
105
SPF/Macros/extendpackagesfileref.sas
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/*+extendPackagesFileref+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro extendPackagesFileref(
|
||||||
|
packages /* A valid fileref name,
|
||||||
|
when empty the "packages" value is used */
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to list directories pointed by "packages" fileref, version 20220925. Run %extendPackagesFileref(HELP) for help info.'
|
||||||
|
;
|
||||||
|
|
||||||
|
%if %QUPCASE(&packages.) = HELP %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put ###########################################################################################;
|
||||||
|
%put ### This is short help information for the `extendPackagesFileref` macro #;
|
||||||
|
%put #-----------------------------------------------------------------------------------------#;;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to list directories pointed by 'packages' fileref, version `20220925` #;
|
||||||
|
%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(%%extendPackagesFileref())` macro lists directories pointed by #;
|
||||||
|
%put # the packages fileref. It allows to add new dierctories to packages folder list. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packages` *Optional.* A valid fileref name, when empty the "packages" is used. #;
|
||||||
|
%put # Use case: #;
|
||||||
|
%put # `%nrstr(%%extendPackagesFileref()).` #;
|
||||||
|
%put # #;
|
||||||
|
%put # When used as: `%nrstr(%%extendPackagesFileref(HELP))` it displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-----------------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ##############################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and adding #;
|
||||||
|
%put # new directory. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in one of "C:/SAS_PK1" or "C:/SAS_PK2" folders. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages ("C:/SAS_PK1" "C:/SAS_PK2"); %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( filename packages ("D:/NEW_DIR" %%extendPackagesFileref()); %%* add new directory; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put ###########################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDextendPackagesFileref;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if %superq(packages) = %then %let packages = packages;
|
||||||
|
%if %qsysfunc(pathname(&packages.)) ne %then
|
||||||
|
%do;
|
||||||
|
%if %qsubstr(%qsysfunc(pathname(&packages.)), 1, 1) = %str(%() %then
|
||||||
|
%do;
|
||||||
|
%local length;
|
||||||
|
%let length = %eval(%length(%qsysfunc(pathname(&packages.)))-2);
|
||||||
|
%unquote(%qsubstr(%qsysfunc(pathname(&packages.)), 2, &length.))
|
||||||
|
%end;
|
||||||
|
%else "%sysfunc(pathname(&packages.))";
|
||||||
|
%end;
|
||||||
|
%ENDextendPackagesFileref:
|
||||||
|
%mend extendPackagesFileref;
|
||||||
|
|
||||||
|
/* Examples:
|
||||||
|
|
||||||
|
filename packages "C:\";
|
||||||
|
%include packages(SPFinit.sas)
|
||||||
|
|
||||||
|
%extendPackagesFileref(HELP)
|
||||||
|
|
||||||
|
filename packages (%extendPackagesFileref() "D:\");
|
||||||
|
filename packages list;
|
||||||
|
|
||||||
|
filename packages clear;
|
||||||
|
|
||||||
|
filename packages "C:\";
|
||||||
|
filename packages ("D:\" %extendPackagesFileref());
|
||||||
|
filename packages list;
|
||||||
|
|
||||||
|
%put *%extendPackagesFileref()*;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**/
|
||||||
2439
SPF/Macros/generatepackage.sas
Normal file
2439
SPF/Macros/generatepackage.sas
Normal file
File diff suppressed because it is too large
Load Diff
178
SPF/Macros/helppackage.sas
Normal file
178
SPF/Macros/helppackage.sas
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
/*+helpPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro helpPackage(
|
||||||
|
packageName /* name of a package,
|
||||||
|
e.g. myPackageFile.zip,
|
||||||
|
required and not null */
|
||||||
|
, helpKeyword /* phrase to search in help,
|
||||||
|
when empty prints description
|
||||||
|
"*" means print all help
|
||||||
|
"license" prints license */
|
||||||
|
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||||
|
by default it looks for
|
||||||
|
location of "packages" fileref */
|
||||||
|
, options = %str(LOWCASE_MEMNAME) /* possible options for ZIP filename */
|
||||||
|
, source2 = /*source2*/ /* option to print out details,
|
||||||
|
null by default */
|
||||||
|
, zip = zip /* standard package is zip (lowcase),
|
||||||
|
e.g. %helpPackage(PiPackage,*)
|
||||||
|
if the zip is not available use a folder
|
||||||
|
unpack data to "pipackage.disk" folder
|
||||||
|
and use helpPackage in the form:
|
||||||
|
%helpPackage(PiPackage, *, zip=disk, options=)
|
||||||
|
*/
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to get help about SAS package, version 20220925. Run %helpPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `helpPackage` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to get help about SAS packages, version `20220925` #;
|
||||||
|
%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 provided with #;
|
||||||
|
%put # a single `help.sas` file (also embedded inside the zip). #;
|
||||||
|
%put # #;
|
||||||
|
%put # The `%nrstr(%%helpPackage())` macro prints in the SAS log help #;
|
||||||
|
%put # information about the package provided by the developer. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packageName` *Required.* Name of a package, e.g. myPackage, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%helpPackage(myPackage)).` #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # 2. `helpKeyword` *Optional.* A phrase to search in help, #;
|
||||||
|
%put # - when empty prints description, #;
|
||||||
|
%put # - "*" means: print all help, #;
|
||||||
|
%put # - "license" prints the license. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `path=` *Optional.* Location of a package. By default it #;
|
||||||
|
%put # looks for location of the **packages** fileref, i.e. #;
|
||||||
|
%put # `%nrstr(%%sysfunc(pathname(packages)))` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `options=` *Optional.* Possible options for ZIP filename, #;
|
||||||
|
%put # default value: `LOWCASE_MEMNAME` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `source2=` *Optional.* Option to print out details about #;
|
||||||
|
%put # what is loaded, null by default. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `zip=` Standard package is zip (lowcase), #;
|
||||||
|
%put # e.g. `%nrstr(%%helpPackage(PiPackage))`. #;
|
||||||
|
%put # If the zip is not available use a folder. #;
|
||||||
|
%put # Unpack data to "pipackage.disk" folder #;
|
||||||
|
%put # and use helpPackage in the following form: #;
|
||||||
|
%put # `%nrstr(%%helpPackage(PiPackage, ,zip=disk, options=))` #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||||
|
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||||
|
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofhelpPackage;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
/* local variables for options */
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp;
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
|
||||||
|
%local _PackageFileref_;
|
||||||
|
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
|
||||||
|
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
|
||||||
|
/* when the packages reference is multi-directory search for the first one containing the package */
|
||||||
|
data _null_;
|
||||||
|
exists = 0;
|
||||||
|
length packages $ 32767 p $ 4096;
|
||||||
|
packages = resolve(symget("path"));
|
||||||
|
if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */
|
||||||
|
do i = 1 to kcountw(packages, "()", "QS");
|
||||||
|
p = dequote(kscanx(packages, i, "()", "QS"));
|
||||||
|
exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip."));
|
||||||
|
if exists then leave;
|
||||||
|
end;
|
||||||
|
if exists then call symputx("path", p, "L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
/* put location of package myPackageFile.zip here */
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
;
|
||||||
|
%if %sysfunc(fexist(&_PackageFileref_.)) %then
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(packagemetadata.sas) / &source2.;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
ENCODING =
|
||||||
|
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||||
|
%else utf8 ;
|
||||||
|
;
|
||||||
|
%include &_PackageFileref_.(help.sas) / &source2.;
|
||||||
|
%end;
|
||||||
|
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp. msglevel = &msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofhelpPackage:
|
||||||
|
%mend helpPackage;
|
||||||
|
|
||||||
|
/*
|
||||||
|
TODO:
|
||||||
|
- macro for testing available packages in the packages folder [DONE] checkout: %listPackages()
|
||||||
|
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Macros to install SAS packages, version 20220925 */
|
||||||
|
/* 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
|
||||||
|
a single load.sas file (also embedded inside the zip).
|
||||||
|
*/
|
||||||
|
|
||||||
388
SPF/Macros/installpackage.sas
Normal file
388
SPF/Macros/installpackage.sas
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
/*+installPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro installPackage(
|
||||||
|
packagesNames /* space separated list of packages names, without the zip extension */
|
||||||
|
, sourcePath = /* location of the package, e.g. "www.some.page/", mind the "/" at the end */
|
||||||
|
, mirror = 1 /* indicates which location for package source should be used */
|
||||||
|
, replace = 1 /* 1 = replace if the package already exist, 0 = otherwise */
|
||||||
|
, URLuser = /* user name for the password protected URLs */
|
||||||
|
, URLpass = /* password for the password protected URLs */
|
||||||
|
, URLoptions = /* options for the `sourcePath` URLs */
|
||||||
|
)
|
||||||
|
/secure
|
||||||
|
minoperator
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to install SAS package, version 20220925. Run %%installPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put ##############################################################################################;
|
||||||
|
%put ### This is short help information for the `installPackage` macro #;
|
||||||
|
%put #--------------------------------------------------------------------------------------------#;;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to install SAS packages, version `20220925` #;
|
||||||
|
%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(%%installPackage())` macro installs the package zip #;
|
||||||
|
%put # in the packages folder. The process of installation is equivalent with #;
|
||||||
|
%put # manual downloading the package zip file into the packages folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # In case the packages fileref is a multi-directory one the first directory #;
|
||||||
|
%put # will be selected as a destination. #;
|
||||||
|
%put # #;
|
||||||
|
%put #--------------------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packagesNames` Space separated list of packages names _without_ #;
|
||||||
|
%put # the zip extension, e.g. myPackage1 myPackage2, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%installPackage(myPackage1 myPackage2))`. #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # If the package name is *SPFinit* or *SASPackagesFramework* #;
|
||||||
|
%put # then the framework itself is downloaded. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `sourcePath=` Location of the package, e.g. "www.some.web.page/" #;
|
||||||
|
%put # Mind the "/" at the end of the path! #;
|
||||||
|
%put # Current default location for packages is: #;
|
||||||
|
%put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/` #;
|
||||||
|
%put # Current default location for the framework is: #;
|
||||||
|
%put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `mirror=` Indicates which web location for packages installation is used. #;
|
||||||
|
%put # Value `1` indicates: #;
|
||||||
|
%put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` #;
|
||||||
|
%put # Value `2` indicates: #;
|
||||||
|
%put # `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` #;
|
||||||
|
%put # Default value is `1`. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `replace=` With default value of `1` it causes existing package file #;
|
||||||
|
%put # to be replaced by new downloaded file. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `URLuser=` A user name for the password protected URLs, no quotes needed. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `URLpass=` A password for the password protected URLs, no quotes needed. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `URLoptions=` Options for the `sourcePath` URLs filename. Consult the SAS #;
|
||||||
|
%put # documentation for the further details. #;
|
||||||
|
%put # #;
|
||||||
|
%put #--------------------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example #################################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||||
|
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||||
|
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put ##############################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofinstallPackage;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
/* local variables for options */
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp;
|
||||||
|
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let stimer_tmp = %sysfunc(getoption(stimer));
|
||||||
|
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Reference:
|
||||||
|
https://blogs.sas.com/content/sasdummy/2011/06/17/how-to-use-sas-data-step-to-copy-a-file-from-anywhere/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* in case the 'packages' fileref is multi-directory the first directory will be selected as a destination */
|
||||||
|
data _null_;
|
||||||
|
/* get the firstPackagesPath */
|
||||||
|
call symputX("firstPackagesPath", dequote(kscanx(pathname("packages"), 1, "()", "QS")) ,"L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
%if %superq(sourcePath)= %then
|
||||||
|
%do;
|
||||||
|
%local SPFinitMirror;
|
||||||
|
/* the defaults are: */
|
||||||
|
%let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas;
|
||||||
|
%let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/;
|
||||||
|
|
||||||
|
%if 1 = %superq(mirror) %then
|
||||||
|
%do;
|
||||||
|
%let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas;
|
||||||
|
%let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/;
|
||||||
|
%goto mirrorEnd;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if 2 = %superq(mirror) %then
|
||||||
|
%do;
|
||||||
|
%let SPFinitMirror = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.sas;
|
||||||
|
%let sourcePath = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/packages/;
|
||||||
|
%goto mirrorEnd;
|
||||||
|
%end;
|
||||||
|
%mirrorEnd:
|
||||||
|
%put INFO: Source path is &sourcePath.;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local i;
|
||||||
|
%do i = 1 %to %sysfunc(countw(&packagesNames., , S));
|
||||||
|
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
|
||||||
|
%local packageName;
|
||||||
|
%let packageName = %scan(&packagesNames., &i., , S);
|
||||||
|
|
||||||
|
%put ;
|
||||||
|
%put *** %lowcase(&packageName.) start *****************************************;
|
||||||
|
%local in out _IOFileref_;
|
||||||
|
data _null_; call symputX("_IOFileref_", put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
%let in = i&_IOFileref_.;
|
||||||
|
%let out = o&_IOFileref_.;
|
||||||
|
/* %let in = i%sysfunc(md5(&packageName.),hex7.); */
|
||||||
|
/* %let out = o%sysfunc(md5(&packageName.),hex7.); */
|
||||||
|
|
||||||
|
/*options MSGLEVEL=i;*/
|
||||||
|
%if %upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK) %then
|
||||||
|
%do;
|
||||||
|
/* allows to install/download the framework file like any other package */
|
||||||
|
filename &in URL
|
||||||
|
"&SPFinitMirror."
|
||||||
|
recfm=N lrecl=1;
|
||||||
|
filename &out
|
||||||
|
"&firstPackagesPath./SPFinit.sas"
|
||||||
|
recfm=N lrecl=1;
|
||||||
|
%end;
|
||||||
|
%else
|
||||||
|
%do;
|
||||||
|
filename &in URL "&sourcePath.%lowcase(&packageName.).zip"
|
||||||
|
%if (%superq(URLuser) ne ) %then
|
||||||
|
%do;
|
||||||
|
user = "&URLuser."
|
||||||
|
pass = "&URLuser."
|
||||||
|
%end;
|
||||||
|
&URLoptions.
|
||||||
|
recfm=N lrecl=1;
|
||||||
|
filename &out "&firstPackagesPath./%lowcase(&packageName.).zip" recfm=N lrecl=1;
|
||||||
|
%end;
|
||||||
|
/*
|
||||||
|
filename in list;
|
||||||
|
filename out list;
|
||||||
|
*/
|
||||||
|
/* copy the file byte-by-byte */
|
||||||
|
data _null_;
|
||||||
|
length filein 8 out_path in_path $ 4096;
|
||||||
|
out_path = pathname ("&out");
|
||||||
|
in_path = pathname ("&in" );
|
||||||
|
|
||||||
|
|
||||||
|
filein = fopen( "&in", 'S', 1, 'B');
|
||||||
|
if filein = 0 then
|
||||||
|
put "ERROR: Source file:" /
|
||||||
|
"ERROR- " in_path /
|
||||||
|
"ERROR- is unavailable!";
|
||||||
|
if filein > 0;
|
||||||
|
|
||||||
|
put @2 "Source information:";
|
||||||
|
infonum = FOPTNUM(filein);
|
||||||
|
length infoname $ 32 infoval $ 128;
|
||||||
|
do i=1 to coalesce(infonum, -1);
|
||||||
|
infoname = FOPTNAME(filein, i);
|
||||||
|
infoval = FINFO(filein, infoname);
|
||||||
|
put @4 infoname ":"
|
||||||
|
/ @6 infoval
|
||||||
|
;
|
||||||
|
end;
|
||||||
|
rc = FCLOSE(filein);
|
||||||
|
put;
|
||||||
|
|
||||||
|
if FEXIST("&out") = 0 then
|
||||||
|
do;
|
||||||
|
put @2 "Installing the &packageName. package"
|
||||||
|
/ @2 "in the &firstPackagesPath. directory.";
|
||||||
|
rc = FCOPY("&in", "&out");
|
||||||
|
end;
|
||||||
|
else if FEXIST("&out") = 1 then
|
||||||
|
do;
|
||||||
|
if symgetn("replace")=1 then
|
||||||
|
do;
|
||||||
|
put @2 "The following file will be replaced during "
|
||||||
|
/ @2 "instalation of the &packageName. package: "
|
||||||
|
/ @5 out_path;
|
||||||
|
rc = FDELETE("&out");
|
||||||
|
rc = FCOPY("&in", "&out");
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
do;
|
||||||
|
put @2 "The following file will NOT be replaced: "
|
||||||
|
/ @5 out_path;
|
||||||
|
rc = 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
put @2 "Done with return code " rc= "(zero = success)";
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &in clear;
|
||||||
|
filename &out clear;
|
||||||
|
%put *** %lowcase(&packageName.) end *******************************************;
|
||||||
|
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
|
||||||
|
%end;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp.
|
||||||
|
¬es_tmp. &source_tmp.
|
||||||
|
&stimer_tmp. &fullstimer_tmp.
|
||||||
|
msglevel=&msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofinstallPackage:
|
||||||
|
%mend installPackage;
|
||||||
|
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Filenames references "packages" and "package" are reserved keywords.
|
||||||
|
The first one should be used to point local folder with packages.
|
||||||
|
The second is used internally by macros.
|
||||||
|
Do not use them otherwise than:
|
||||||
|
filename packages "</the/folder/with/sas/packages>";
|
||||||
|
since it may affect stability of the framework.
|
||||||
|
**/
|
||||||
|
|
||||||
|
/* Example 1: Enabling the SAS Package Framework
|
||||||
|
and loading the SQLinDS package from the local directory.
|
||||||
|
|
||||||
|
Assume that the SPFinit.sas file and the SQLinDS
|
||||||
|
package (sqlinds.zip file) are located in
|
||||||
|
the "C:/SAS_PACKAGES/" folder.
|
||||||
|
|
||||||
|
Run the following code in your SAS session:
|
||||||
|
|
||||||
|
filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||||
|
%include packages(SPFinit.sas); %* enable the framework;
|
||||||
|
|
||||||
|
%helpPackage(SQLinDS) %* get help about the package;
|
||||||
|
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||||
|
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Example 2: Enabling the SAS Package Framework
|
||||||
|
from the local directory and installing & loading
|
||||||
|
the SQLinDS package from the Internet.
|
||||||
|
|
||||||
|
Assume that the SPFinit.sas file
|
||||||
|
is located in the "C:/SAS_PACKAGES/" folder.
|
||||||
|
|
||||||
|
Run the following code in your SAS session:
|
||||||
|
|
||||||
|
filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||||
|
%include packages(SPFinit.sas); %* enable the framework;
|
||||||
|
|
||||||
|
%installPackage(SQLinDS) %* install the package from the Internet;
|
||||||
|
%helpPackage(SQLinDS) %* get help about the package;
|
||||||
|
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||||
|
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Example 3: Enabling the SAS Package Framework
|
||||||
|
and installing & loading the SQLinDS package
|
||||||
|
from the Internet.
|
||||||
|
|
||||||
|
Run the following code in your SAS session:
|
||||||
|
|
||||||
|
filename packages "%sysfunc(pathname(work))"; %* setup WORK as a temporary directory for packages;
|
||||||
|
|
||||||
|
filename spfinit url "https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPFinit.sas";
|
||||||
|
%include spfinit; %* enable the framework;
|
||||||
|
|
||||||
|
%installPackage(SQLinDS) %* install the package from the Internet;
|
||||||
|
%helpPackage(SQLinDS) %* get help about the package;
|
||||||
|
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||||
|
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Example 4:
|
||||||
|
Assume that the SPFinit.sas file and the SQLinDS package (sqlinds.zip file)
|
||||||
|
are located in the "C:/SAS_PACKAGES/" folder.
|
||||||
|
|
||||||
|
In case when user SAS session does not support ZIP fileref
|
||||||
|
the following solution could be used.
|
||||||
|
|
||||||
|
Unzip the packagename.zip content into the packagename.disk folder
|
||||||
|
and run macros with the following options: ;
|
||||||
|
|
||||||
|
%loadPackage(packageName,zip=disk,options=)
|
||||||
|
%helpPackage(packageName,,zip=disk,options=) %* mind the double comma!! ;
|
||||||
|
%unloadPackage(packageName,zip=disk,options=)
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Example 5: Enabling the SAS Package Framework from the local directory
|
||||||
|
and installing the SQLinDS package from the Internet.
|
||||||
|
|
||||||
|
Assume that the SPFinit.sas file is located in
|
||||||
|
the "C:/SAS_PACKAGES/" folder.
|
||||||
|
|
||||||
|
filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||||
|
%include packages(SPFinit.sas); %* enable the framework;
|
||||||
|
|
||||||
|
%installPackage(SQLinDS); %* install package;
|
||||||
|
%installPackage(SQLinDS); %* overwrite already installed package;
|
||||||
|
%installPackage(SQLinDS,replace=0); %* prevent overwrite installed package;
|
||||||
|
|
||||||
|
|
||||||
|
%installPackage(NotExistingPackage); %* handling with not existing package;
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*** HELP END ***/
|
||||||
|
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
/* Macro to list SAS packages in packages folder.
|
||||||
|
|
||||||
|
Version 20220925
|
||||||
|
|
||||||
|
A SAS package is a zip file containing a group
|
||||||
|
of SAS codes (macros, functions, data steps generating
|
||||||
|
data, etc.) wrapped up together and %INCLUDEed by
|
||||||
|
a single load.sas file (also embedded inside the zip).
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Example 1: Set local packages directory, enable the framework,
|
||||||
|
and list packages in the local repository.
|
||||||
|
|
||||||
|
filename packages "C:\SAS_PACKAGES";
|
||||||
|
%include packages(SPFinit.sas);
|
||||||
|
%listPackages()
|
||||||
|
|
||||||
|
*/
|
||||||
|
/*** HELP END ***/
|
||||||
|
|
||||||
180
SPF/Macros/listpackages.sas
Normal file
180
SPF/Macros/listpackages.sas
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
/*+listPackages+*/
|
||||||
|
|
||||||
|
%macro listPackages()/secure PARMBUFF
|
||||||
|
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20220925.'
|
||||||
|
;
|
||||||
|
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put ###########################################################################################;
|
||||||
|
%put ### This is short help information for the `listPackages` macro #;
|
||||||
|
%put #-----------------------------------------------------------------------------------------#;;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to list available SAS packages, version `20220925` #;
|
||||||
|
%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(%%listPackages())` macro lists packages available #;
|
||||||
|
%put # in the packages folder. List is printed inthe SAS Log. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # NO PARAMETERS #;
|
||||||
|
%put # #;
|
||||||
|
%put # When used as: `%nrstr(%%listPackages(HELP))` it displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-----------------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ##############################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and listing #;
|
||||||
|
%put # available packages. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%listPackages() %%* list available packages; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put ###########################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDoflistPackages;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp filesWithCodes;
|
||||||
|
|
||||||
|
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
|
||||||
|
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
length baseAll $ 32767;
|
||||||
|
baseAll = pathname("packages");
|
||||||
|
|
||||||
|
if baseAll = " " then
|
||||||
|
do;
|
||||||
|
put "NOTE: The file reference PACKAGES is not assigned.";
|
||||||
|
stop;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if char(baseAll,1) ^= "(" then baseAll = quote(strip(baseAll)); /* for paths with spaces */
|
||||||
|
|
||||||
|
do k = 1 to kcountw(baseAll, "()", "QS"); drop k;
|
||||||
|
base = dequote(kscanx(baseAll, k, "()", "QS"));
|
||||||
|
|
||||||
|
length folder $ 64 file $ 1024 folderRef fileRef $ 8;
|
||||||
|
|
||||||
|
folderRef = "_%sysfunc(datetime(), hex6.)0";
|
||||||
|
|
||||||
|
rc=filename(folderRef, base);
|
||||||
|
folderid=dopen(folderRef);
|
||||||
|
|
||||||
|
putlog " ";
|
||||||
|
put "/*" 100*"+" ;
|
||||||
|
do i=1 to dnum(folderId); drop i;
|
||||||
|
|
||||||
|
if i = 1 then
|
||||||
|
do;
|
||||||
|
put " #";
|
||||||
|
put " # Listing packages for: " base;
|
||||||
|
put " #";
|
||||||
|
end;
|
||||||
|
|
||||||
|
folder = dread(folderId, i);
|
||||||
|
|
||||||
|
fileRef = "_%sysfunc(datetime(), hex6.)1";
|
||||||
|
rc = filename(fileRef, catx("/", base, folder));
|
||||||
|
fileId = dopen(fileRef);
|
||||||
|
|
||||||
|
EOF = 0;
|
||||||
|
if fileId = 0 and lowcase(kscanx(folder, -1, ".")) = 'zip' then
|
||||||
|
do;
|
||||||
|
file = catx('/',base, folder);
|
||||||
|
|
||||||
|
rc1 = filename("package", strip(file), 'zip', 'member="description.sas"');
|
||||||
|
rcE = fexist("package");
|
||||||
|
rc2 = filename("package", " ");
|
||||||
|
|
||||||
|
if rcE then /* if the description.sas exists in the zip then read it */
|
||||||
|
do;
|
||||||
|
putlog " * ";
|
||||||
|
length nn $ 96;
|
||||||
|
if (96-lengthn(file)) < 1 then
|
||||||
|
put " * " file;
|
||||||
|
else
|
||||||
|
do;
|
||||||
|
nn = repeat("*", (96-lengthn(file)));
|
||||||
|
put " * " file nn;
|
||||||
|
end;
|
||||||
|
|
||||||
|
infile _DUMMY_ ZIP FILEVAR=file member="description.sas" end=EOF;
|
||||||
|
|
||||||
|
do until(EOF);
|
||||||
|
input;
|
||||||
|
if strip(upcase(kscanx(_INFILE_,1,":"))) in ("PACKAGE" "TITLE" "VERSION" "AUTHOR" "MAINTAINER" "LICENSE") then
|
||||||
|
do;
|
||||||
|
_INFILE_ = kscanx(_INFILE_,1,":") !! ":" !! kscanx(_INFILE_,2,":");
|
||||||
|
putlog " * " _INFILE_;
|
||||||
|
end;
|
||||||
|
if strip(upcase(strip(_INFILE_))) =: "DESCRIPTION START:" then leave;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
rc = dclose(fileId);
|
||||||
|
rc = filename(fileRef);
|
||||||
|
end;
|
||||||
|
|
||||||
|
putlog " * ";
|
||||||
|
put 100*"+" "*/";
|
||||||
|
rc = dclose(folderid);
|
||||||
|
rc = filename(folderRef);
|
||||||
|
end;
|
||||||
|
|
||||||
|
stop;
|
||||||
|
run;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||||
|
|
||||||
|
%ENDoflistPackages:
|
||||||
|
%mend listPackages;
|
||||||
|
|
||||||
|
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
/* Macro to generate SAS packages.
|
||||||
|
|
||||||
|
Version 20220925
|
||||||
|
|
||||||
|
A SAS package is a zip file containing a group
|
||||||
|
of SAS codes (macros, functions, data steps generating
|
||||||
|
data, etc.) wrapped up together and %INCLUDEed by
|
||||||
|
a single load.sas file (also embedded inside the zip).
|
||||||
|
|
||||||
|
See examples below.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*** HELP END ***/
|
||||||
|
|
||||||
198
SPF/Macros/loadpackage.sas
Normal file
198
SPF/Macros/loadpackage.sas
Normal file
@@ -0,0 +1,198 @@
|
|||||||
|
/*+loadPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro loadPackage(
|
||||||
|
packageName /* name of a package,
|
||||||
|
e.g. myPackage,
|
||||||
|
required and not null */
|
||||||
|
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||||
|
by default it looks for
|
||||||
|
location of "packages" fileref */
|
||||||
|
, options = %str(LOWCASE_MEMNAME) /* possible options for ZIP filename */
|
||||||
|
, source2 = /*source2*/ /* option to print out details,
|
||||||
|
null by default */
|
||||||
|
, requiredVersion = . /* option to test if loaded package
|
||||||
|
is provided in required version */
|
||||||
|
, lazyData = /* a list of names of lazy datasets
|
||||||
|
to be loaded, if not null then
|
||||||
|
datasets from the list are loaded
|
||||||
|
instead of a package, asterisk
|
||||||
|
means "load all datasets" */
|
||||||
|
, zip = zip /* standard package is zip (lowcase),
|
||||||
|
e.g. %loadPackage(PiPackage)
|
||||||
|
if the zip is not available use a folder
|
||||||
|
unpack data to "pipackage.disk" folder
|
||||||
|
and use loadPackage in the form:
|
||||||
|
%loadPackage(PiPackage, zip=disk, options=)
|
||||||
|
*/
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to load SAS package, version 20220925. Run %loadPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `loadPackage` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to *load* SAS packages, version `20220925` #;
|
||||||
|
%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 included by #;
|
||||||
|
%put # a single `load.sas` file (also embedded inside the zip). #;
|
||||||
|
%put # #;
|
||||||
|
%put # The `%nrstr(%%loadPackage())` macro loads package content, i.e. macros, #;
|
||||||
|
%put # functions, formats, etc., from the zip into the SAS session. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packageName` *Required.* Name of a package, e.g. myPackage, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%loadPackage(myPackage)).` #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `path=` *Optional.* Location of a package. By default it #;
|
||||||
|
%put # looks for location of the **packages** fileref, i.e. #;
|
||||||
|
%put # `%nrstr(%%sysfunc(pathname(packages)))` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `options=` *Optional.* Possible options for ZIP filename, #;
|
||||||
|
%put # default value: `LOWCASE_MEMNAME` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `source2=` *Optional.* Option to print out details about #;
|
||||||
|
%put # what is loaded, null by default. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `requiredVersion=` *Optional.* Option to test if the loaded #;
|
||||||
|
%put # package is provided in required version, #;
|
||||||
|
%put # default value: `.` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `lazyData=` *Optional.* A list of names of lazy datasets to be #;
|
||||||
|
%put # loaded. If not null datasets from the list are loaded #;
|
||||||
|
%put # instead of the package. #;
|
||||||
|
%put # An asterisk (*) means *load all lazy datasets*. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `zip=` Standard package is zip (lowcase), #;
|
||||||
|
%put # e.g. `%nrstr(%%loadPackage(PiPackage))`. #;
|
||||||
|
%put # If the zip is not available use a folder. #;
|
||||||
|
%put # Unpack data to "pipackage.disk" folder #;
|
||||||
|
%put # and use loadPackage in the following form: #;
|
||||||
|
%put # `%nrstr(%%loadPackage(PiPackage, zip=disk, options=))` #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put ### Example #####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||||
|
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||||
|
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofloadPackage;
|
||||||
|
%end;
|
||||||
|
/* local variables for options */
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp;
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let stimer_tmp = %sysfunc(getoption(stimer));
|
||||||
|
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N;
|
||||||
|
|
||||||
|
%local _PackageFileref_;
|
||||||
|
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
|
||||||
|
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
|
||||||
|
/* when the packages reference is multi-directory search for the first one containing the package */
|
||||||
|
data _null_;
|
||||||
|
exists = 0;
|
||||||
|
length packages $ 32767 p $ 4096;
|
||||||
|
packages = resolve(symget("path"));
|
||||||
|
if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */
|
||||||
|
do i = 1 to kcountw(packages, "()", "QS");
|
||||||
|
p = dequote(kscanx(packages, i, "()", "QS"));
|
||||||
|
exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip."));
|
||||||
|
if exists then leave;
|
||||||
|
end;
|
||||||
|
if exists then call symputx("path", p, "L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
/* put location of package myPackageFile.zip here */
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
;
|
||||||
|
%if %sysfunc(fexist(&_PackageFileref_.)) %then
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(packagemetadata.sas) / &source2.;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
/* test if required version of package is "good enough" */
|
||||||
|
%if %sysevalf(&requiredVersion. > &packageVersion.) %then
|
||||||
|
%do;
|
||||||
|
%put ERROR: Package &packageName. will not be loaded!;
|
||||||
|
%put ERROR- Required version is &requiredVersion.;
|
||||||
|
%put ERROR- Provided version is &packageVersion.;
|
||||||
|
%put ERROR- Verify installed version of the package.;
|
||||||
|
%put ERROR- ;
|
||||||
|
%GOTO WrongVersionOFPackage; /*%RETURN;*/
|
||||||
|
%end;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
ENCODING =
|
||||||
|
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||||
|
%else utf8 ;
|
||||||
|
;
|
||||||
|
%if %bquote(&lazyData.) = %then
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(load.sas) / &source2.;
|
||||||
|
%end;
|
||||||
|
%else
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(lazydata.sas) / &source2.;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%end;
|
||||||
|
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
%WrongVersionOFPackage:
|
||||||
|
|
||||||
|
/* restore optionos */
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp.
|
||||||
|
¬es_tmp. &source_tmp.
|
||||||
|
&stimer_tmp. &fullstimer_tmp.
|
||||||
|
msglevel=&msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofloadPackage:
|
||||||
|
%mend loadPackage;
|
||||||
|
|
||||||
101
SPF/Macros/loadpackages.sas
Normal file
101
SPF/Macros/loadpackages.sas
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
/*+loadPackageS+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro loadPackageS(
|
||||||
|
packagesNames /* A comma separated list of packages names,
|
||||||
|
e.g. myPackage, myPackage1, myPackage2, myPackage3
|
||||||
|
required and not null.
|
||||||
|
Package version, in brackets behind a package name,
|
||||||
|
can be provided, e.g.
|
||||||
|
%loadPackageS(myPackage1(1.7), myPackage2(4.2))
|
||||||
|
*/
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to load multiple SAS packages at one run, version 20220925. Run %loadPackages() for help info.'
|
||||||
|
parmbuff
|
||||||
|
;
|
||||||
|
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `loadPackageS` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro wrapper for the loadPackage macro, version `20220925` #;
|
||||||
|
%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(%%loadPackageS())` allows to load multiple packages at one time, #;
|
||||||
|
%put # *ONLY* from the *ZIP* with *DEFAULT OPTIONS*, into the SAS session. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packagesNames` A comma separated list of packages names, #;
|
||||||
|
%put # e.g. myPackage, myPackage1, myPackage2, myPackage3 #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%loadPackageS(myPackage1, myPackage2, myPackage3))`. #;
|
||||||
|
%put # Package version, in brackets behind a package name, can #;
|
||||||
|
%put # be provided, example is the following: #;
|
||||||
|
%put # `%nrstr(%%loadPackageS(myPackage1(1.7), myPackage2(4.2)))`. #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS DFA) %%* install packages from the Internet; );
|
||||||
|
%put %nrstr( %%loadPackageS(SQLinDS, DFA) %%* load packags content into the SAS session; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofloadPackageS;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local lengthOfsyspbuff numberOfPackagesNames i packageElement packageName packageVersion;
|
||||||
|
|
||||||
|
%let lengthOfsyspbuff = %qsysfunc(length(&syspbuff.));
|
||||||
|
%let packagesNames = %qsysfunc(compress(%qsubstr(&syspbuff., 2, %eval(&lengthOfsyspbuff.-2)), %str((._,)), KDA));
|
||||||
|
%let numberOfPackagesNames = %qsysfunc(countw(&packagesNames., %str(,)));
|
||||||
|
|
||||||
|
%put NOTE: List of packages to be loaded contains &numberOfPackagesNames. element(s).;
|
||||||
|
%put NOTE- The list is: &packagesNames..;
|
||||||
|
%put NOTE- ;
|
||||||
|
|
||||||
|
%do i = 1 %to &numberOfPackagesNames.;
|
||||||
|
%let packageElement = %qscan(&packagesNames., &i., %str(,) );
|
||||||
|
%let packageName = %qscan(&packageElement., 1, %str(()));
|
||||||
|
%let packageVersion = %qscan(&packageElement., 2, %str(()));
|
||||||
|
%if %superq(packageVersion) = %then %let packageVersion = .;
|
||||||
|
|
||||||
|
%loadPackage(%unquote(&packageName.), requiredVersion=%unquote(&packageVersion.))
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%ENDofloadPackageS:
|
||||||
|
%mend loadPackageS;
|
||||||
|
|
||||||
|
|
||||||
159
SPF/Macros/previewpackage.sas
Normal file
159
SPF/Macros/previewpackage.sas
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
/*+previewPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro previewPackage(
|
||||||
|
packageName /* name of a package,
|
||||||
|
e.g. myPackageFile.zip,
|
||||||
|
required and not null */
|
||||||
|
, helpKeyword /* phrase to search for preview,
|
||||||
|
when empty prints description
|
||||||
|
"*" means prints all */
|
||||||
|
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||||
|
by default it looks for
|
||||||
|
location of "packages" fileref */
|
||||||
|
, options = %str(LOWCASE_MEMNAME) /* possible options for ZIP filename */
|
||||||
|
, source2 = /*source2*/ /* option to print out details,
|
||||||
|
null by default */
|
||||||
|
, zip = zip /* standard package is zip (lowcase),
|
||||||
|
e.g. %previewPackage(PiPackage,*)
|
||||||
|
if the zip is not available use a folder
|
||||||
|
unpack data to "pipackage.disk" folder
|
||||||
|
and use previewPackage in the form:
|
||||||
|
%previewPackage(PiPackage, *, zip=disk, options=)
|
||||||
|
*/
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to preview content of a SAS package, version 20220925. Run %previewPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `previewPackage` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to get previwe of a SAS packages, version `20220925` #;
|
||||||
|
%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 provided with #;
|
||||||
|
%put # a single `preview.sas` file (also embedded inside the zip). #;
|
||||||
|
%put # #;
|
||||||
|
%put # The `%nrstr(%%previewPackage())` macro prints, in the SAS log, content #;
|
||||||
|
%put # of a SAS package. Code of a package is printed out. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packageName` *Required.* Name of a package, e.g. myPackage, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%previewPackage(myPackage)).` #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # 2. `helpKeyword` *Optional.* A phrase to search in preview, #;
|
||||||
|
%put # - when empty prints description, #;
|
||||||
|
%put # - "*" means: print all preview. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `path=` *Optional.* Location of a package. By default it #;
|
||||||
|
%put # looks for location of the **packages** fileref, i.e. #;
|
||||||
|
%put # `%nrstr(%%sysfunc(pathname(packages)))` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `options=` *Optional.* Possible options for ZIP filename, #;
|
||||||
|
%put # default value: `LOWCASE_MEMNAME` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `source2=` *Optional.* Option to print out details about #;
|
||||||
|
%put # what is loaded, null by default. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `zip=` Standard package is zip (lowcase), #;
|
||||||
|
%put # e.g. `%nrstr(%%previewPackage(PiPackage))`. #;
|
||||||
|
%put # If the zip is not available use a folder. #;
|
||||||
|
%put # Unpack data to "pipackage.disk" folder #;
|
||||||
|
%put # and use previewPackage in the following form: #;
|
||||||
|
%put # `%nrstr(%%previewPackage(PiPackage, , zip=disk, options=))` #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%previewPackage(SQLinDS) %%* get content of the package; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofpreviewPackage;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp;
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
|
||||||
|
%local _PackageFileref_;
|
||||||
|
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
|
||||||
|
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
|
||||||
|
/* when the packages reference is multi-directory search for the first one containing the package */
|
||||||
|
data _null_;
|
||||||
|
exists = 0;
|
||||||
|
length packages $ 32767 p $ 4096;
|
||||||
|
packages = resolve(symget("path"));
|
||||||
|
if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */
|
||||||
|
do i = 1 to kcountw(packages, "()", "QS");
|
||||||
|
p = dequote(kscanx(packages, i, "()", "QS"));
|
||||||
|
exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip."));
|
||||||
|
if exists then leave;
|
||||||
|
end;
|
||||||
|
if exists then call symputx("path", p, "L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
/* put location of package myPackageFile.zip here */
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
;
|
||||||
|
%if %sysfunc(fexist(&_PackageFileref_.)) %then
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(packagemetadata.sas) / &source2.;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
ENCODING =
|
||||||
|
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||||
|
%else utf8 ;
|
||||||
|
;
|
||||||
|
%include &_PackageFileref_.(preview.sas) / &source2.;
|
||||||
|
%end;
|
||||||
|
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp. msglevel = &msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofpreviewPackage:
|
||||||
|
%mend previewPackage;
|
||||||
|
|
||||||
156
SPF/Macros/unloadpackage.sas
Normal file
156
SPF/Macros/unloadpackage.sas
Normal file
@@ -0,0 +1,156 @@
|
|||||||
|
/*+unloadPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro unloadPackage(
|
||||||
|
packageName /* name of a package,
|
||||||
|
e.g. myPackage,
|
||||||
|
required and not null */
|
||||||
|
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||||
|
by default it looks for
|
||||||
|
location of "packages" fileref */
|
||||||
|
, options = %str(LOWCASE_MEMNAME) /* possible options for ZIP filename */
|
||||||
|
, source2 = /*source2*/ /* option to print out details,
|
||||||
|
null by default */
|
||||||
|
, zip = zip /* standard package is zip (lowcase),
|
||||||
|
e.g. %unloadPackage(PiPackage)
|
||||||
|
if the zip is not available use a folder
|
||||||
|
unpack data to "pipackage.disk" folder
|
||||||
|
and use unloadPackage in the form:
|
||||||
|
%unloadPackage(PiPackage, zip=disk, options=)
|
||||||
|
*/
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to unload SAS package, version 20220925. Run %unloadPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `unloadPackage` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to unload SAS packages, version `20220925` #;
|
||||||
|
%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 provided with #;
|
||||||
|
%put # a single `unload.sas` file (also embedded inside the zip). #;
|
||||||
|
%put # #;
|
||||||
|
%put # The `%nrstr(%%unloadPackage())` macro clears the package content #;
|
||||||
|
%put # from the SAS session. #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packageName` *Required.* Name of a package, e.g. myPackage, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%unloadPackage(myPackage)).` #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `path=` *Optional.* Location of a package. By default it #;
|
||||||
|
%put # looks for location of the **packages** fileref, i.e. #;
|
||||||
|
%put # `%nrstr(%%sysfunc(pathname(packages)))` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `options=` *Optional.* Possible options for ZIP filename, #;
|
||||||
|
%put # default value: `LOWCASE_MEMNAME` #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `source2=` *Optional.* Option to print out details about #;
|
||||||
|
%put # what is loaded, null by default. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `zip=` Standard package is zip (lowcase), #;
|
||||||
|
%put # e.g. `%nrstr(%%unloadPackage(PiPackage))`. #;
|
||||||
|
%put # If the zip is not available use a folder. #;
|
||||||
|
%put # Unpack data to "pipackage.disk" folder #;
|
||||||
|
%put # and use unloadPackage in the following form: #;
|
||||||
|
%put # `%nrstr(%%unloadPackage(PiPackage, zip=disk, options=))` #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put ### Example #####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||||
|
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||||
|
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofunloadPackage;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
/* local variables for options */
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp;
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
|
||||||
|
%local _PackageFileref_;
|
||||||
|
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
|
||||||
|
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
|
||||||
|
/* when the packages reference is multi-directory search for the first one containing the package */
|
||||||
|
data _null_;
|
||||||
|
exists = 0;
|
||||||
|
length packages $ 32767 p $ 4096;
|
||||||
|
packages = resolve(symget("path"));
|
||||||
|
if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */
|
||||||
|
do i = 1 to kcountw(packages, "()", "QS");
|
||||||
|
p = dequote(kscanx(packages, i, "()", "QS"));
|
||||||
|
exists + fileexist(catx("/", p, "%lowcase(&packageName.).&zip."));
|
||||||
|
if exists then leave;
|
||||||
|
end;
|
||||||
|
if exists then call symputx("path", p, "L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
/* put location of package myPackageFile.zip here */
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
;
|
||||||
|
%if %sysfunc(fexist(&_PackageFileref_.)) %then
|
||||||
|
%do;
|
||||||
|
%include &_PackageFileref_.(packagemetadata.sas) / &source2.;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||||
|
filename &_PackageFileref_. &ZIP.
|
||||||
|
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||||
|
ENCODING =
|
||||||
|
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||||
|
%else utf8 ;
|
||||||
|
;
|
||||||
|
%include &_PackageFileref_.(unload.sas) / &source2.;
|
||||||
|
%end;
|
||||||
|
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp. msglevel = &msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofunloadPackage:
|
||||||
|
%mend unloadPackage;
|
||||||
|
|
||||||
176
SPF/Macros/verifypackage.sas
Normal file
176
SPF/Macros/verifypackage.sas
Normal file
@@ -0,0 +1,176 @@
|
|||||||
|
/*+verifyPackage+*/
|
||||||
|
/*** HELP START ***/
|
||||||
|
|
||||||
|
%macro verifyPackage(
|
||||||
|
packageName /* name of a package,
|
||||||
|
e.g. myPackage,
|
||||||
|
required and not null */
|
||||||
|
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||||
|
by default it looks for
|
||||||
|
location of "packages" fileref */
|
||||||
|
, hash = /* The SHA256 hash digest for
|
||||||
|
the package generated by
|
||||||
|
hashing_file() function, SAS 9.4M6 */
|
||||||
|
)/secure
|
||||||
|
/*** HELP END ***/
|
||||||
|
des = 'Macro to verify SAS package with the hash digest, version 20220925. Run %verifyPackage() for help info.'
|
||||||
|
;
|
||||||
|
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||||
|
%do;
|
||||||
|
%local options_tmp ;
|
||||||
|
%let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps))
|
||||||
|
%sysfunc(getoption(notes)) %sysfunc(getoption(source))
|
||||||
|
msglevel=%sysfunc(getoption(msglevel))
|
||||||
|
;
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX msglevel=N;
|
||||||
|
%put ;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ### This is short help information for the `verifyPackage` macro #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Macro to verify SAS package with it hash digest, version `20220925` #;
|
||||||
|
%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(%%verifyPackage())` macro generate package SHA256 hash #;
|
||||||
|
%put # and compares it with the one provided by the user. #;
|
||||||
|
%put # #;
|
||||||
|
%put # #;
|
||||||
|
%put # *Minimum SAS version required for the process is 9.4M6.* #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Parameters: #;
|
||||||
|
%put # #;
|
||||||
|
%put # 1. `packageName` Name of a package, e.g. myPackage, #;
|
||||||
|
%put # Required and not null, default use case: #;
|
||||||
|
%put # `%nrstr(%%loadPackage(myPackage))`. #;
|
||||||
|
%put # If empty displays this help information. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `hash=` A value of the package `SHA256` hash. #;
|
||||||
|
%put # Provided by the user. #;
|
||||||
|
%put # #;
|
||||||
|
%put # - `path=` Location of a package. By default it looks for #;
|
||||||
|
%put # location of the "packages" fileref, i.e. #;
|
||||||
|
%put # `%nrstr(%%sysfunc(pathname(packages)))` #;
|
||||||
|
%put # #;
|
||||||
|
%put #-------------------------------------------------------------------------------#;
|
||||||
|
%put # #;
|
||||||
|
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||||
|
%put # to learn more. #;
|
||||||
|
%put # #;
|
||||||
|
%put #### Example ####################################################################;
|
||||||
|
%put # #;
|
||||||
|
%put # Enabling the SAS Package Framework #;
|
||||||
|
%put # from the local directory and installing & loading #;
|
||||||
|
%put # the SQLinDS package from the Internet. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Assume that the `SPFinit.sas` file #;
|
||||||
|
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||||
|
%put # #;
|
||||||
|
%put # Run the following code in your SAS session: #;
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas;
|
||||||
|
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* set-up a directory for packages; );
|
||||||
|
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||||
|
%put ;
|
||||||
|
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||||
|
%put %nrstr( %%verifyPackage%(SQLinDS, %%* verify the package with provided hash; );
|
||||||
|
%put %nrstr( hash=HDA478ANJ3HKHRY327FGE88HF89VH89HFFFV73GCV98RF390VB4%) );
|
||||||
|
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
|
||||||
|
%put #################################################################################;
|
||||||
|
%put ;
|
||||||
|
options &options_tmp.;
|
||||||
|
%GOTO ENDofverifyPackage;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp;
|
||||||
|
%let ls_tmp = %sysfunc(getoption(ls));
|
||||||
|
%let ps_tmp = %sysfunc(getoption(ps));
|
||||||
|
%let notes_tmp = %sysfunc(getoption(notes));
|
||||||
|
%let source_tmp = %sysfunc(getoption(source));
|
||||||
|
%let stimer_tmp = %sysfunc(getoption(stimer));
|
||||||
|
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||||
|
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||||
|
|
||||||
|
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N;
|
||||||
|
|
||||||
|
%local _PackageFileref_;
|
||||||
|
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
|
||||||
|
data _null_; call symputX("_PackageFileref_", "P" !! put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run;
|
||||||
|
|
||||||
|
/* when the packages reference is multi-directory search for the first one containing the package */
|
||||||
|
data _null_;
|
||||||
|
exists = 0;
|
||||||
|
length packages $ 32767 p $ 4096;
|
||||||
|
packages = resolve(symget("path"));
|
||||||
|
if char(packages,1) ^= "(" then packages = quote(strip(packages)); /* for paths with spaces */
|
||||||
|
do i = 1 to kcountw(packages, "()", "QS");
|
||||||
|
p = dequote(kscanx(packages, i, "()", "QS"));
|
||||||
|
exists + fileexist(catx("/", p, "%lowcase(&packageName.).zip"));
|
||||||
|
if exists then leave;
|
||||||
|
end;
|
||||||
|
if exists then call symputx("path", p, "L");
|
||||||
|
run;
|
||||||
|
|
||||||
|
filename &_PackageFileref_.
|
||||||
|
/* put location of package myPackageFile.zip here */
|
||||||
|
"&path./%lowcase(&packageName.).zip"
|
||||||
|
;
|
||||||
|
%if %sysfunc(fexist(&_PackageFileref_.)) %then
|
||||||
|
%do;
|
||||||
|
/* create hash SHA256 id *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
|
||||||
|
%local HASHING_FILE_exist;
|
||||||
|
%let HASHING_FILE_exist = 0;
|
||||||
|
|
||||||
|
%if %sysfunc(exist(sashelp.vfunc, VIEW)) %then
|
||||||
|
%do;
|
||||||
|
data _null_;
|
||||||
|
set sashelp.vfunc(keep=fncname);
|
||||||
|
where fncname = "HASHING_FILE";
|
||||||
|
call symputX('HASHING_FILE_exist', 1, "L");
|
||||||
|
stop;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &HASHING_FILE_exist. = 1 %then
|
||||||
|
%do;
|
||||||
|
options notes;
|
||||||
|
filename &_PackageFileref_. list;
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
SHA256 = HASHING_FILE("SHA256", "&_PackageFileref_.", 4);
|
||||||
|
providedHash = "&hash.";
|
||||||
|
put "Provided Hash: " providedHash;
|
||||||
|
put "SHA256 digest: " SHA256;
|
||||||
|
put " ";
|
||||||
|
|
||||||
|
if SHA256 = providedHash then
|
||||||
|
do;
|
||||||
|
put "NOTE: Package verification SUCCESSFUL.";
|
||||||
|
put "NOTE- Generated hash is EQUAL to the provided one.";
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
do;
|
||||||
|
put "ERROR: Package verification FAILED!!";
|
||||||
|
put "ERROR- Generated hash is DIFFERENT than the provided one.";
|
||||||
|
put "ERROR- Confirm if the package is genuine.";
|
||||||
|
end;
|
||||||
|
run;
|
||||||
|
%let HASHING_FILE_exist = 0;
|
||||||
|
%end;
|
||||||
|
%else
|
||||||
|
%put WARNING: Verification impossible! Minimum SAS version required for the process is 9.4M6. ;
|
||||||
|
/*-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
|
||||||
|
%end;
|
||||||
|
%else %put ERROR:[&sysmacroname] File "&path./&packageName..zip" does not exist!;
|
||||||
|
filename &_PackageFileref_. clear;
|
||||||
|
|
||||||
|
options ls = &ls_tmp. ps = &ps_tmp.
|
||||||
|
¬es_tmp. &source_tmp.
|
||||||
|
&stimer_tmp. &fullstimer_tmp.
|
||||||
|
msglevel=&msglevel_tmp.;
|
||||||
|
|
||||||
|
%ENDofverifyPackage:
|
||||||
|
%mend verifyPackage;
|
||||||
|
/**/
|
||||||
|
|
||||||
Reference in New Issue
Block a user