From b37391777063b764fe265935d2df36546ce7f1e2 Mon Sep 17 00:00:00 2001 From: yabwon Date: Sat, 10 Oct 2020 19:26:49 +0200 Subject: [PATCH] SAS Packages Framework, version 20201010 **SAS Packages Framework**, version 20201010: - Improvement in testing facility for the framework. - Change in SAS components testing, missing component issues a *warning* instead of *error*. - Documentation updated, `SPFinit.md` file added. - Minor bug fixes. Packages recompiled with new version of SAS Packages Framework: - `SQLinDS` (version 2.2) - `macroArray` (version 0.5) - `DFA` (version 0.2) - `BasePlus` (version 0.7) - documentation updated - new macro `%symdelGlobal()` added - `dynMacroArray` (version 0.2) --- README.md | 12 +- SPF/SPFinit.md | 446 ++++++++++++ SPF/SPFinit.sas | 1079 ++++++++++++++++-------------- packages/README.md | 10 +- packages/SHA256_for_packages.txt | 15 + packages/baseplus.md | 2 +- packages/baseplus.zip | Bin 43636 -> 43665 bytes packages/dfa.zip | Bin 28700 -> 28778 bytes packages/dynmacroarray.zip | Bin 11711 -> 11731 bytes packages/macroarray.md | 2 +- packages/macroarray.zip | Bin 28621 -> 28711 bytes packages/sqlinds.md | 2 +- packages/sqlinds.zip | Bin 11545 -> 11624 bytes 13 files changed, 1053 insertions(+), 515 deletions(-) create mode 100644 SPF/SPFinit.md diff --git a/README.md b/README.md index 5058ef5..731ce8f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20201001`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20201010`**. To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/master/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -71,13 +71,13 @@ Currently the following packages are available (see the `./packages` directory): set %SQL(select * from sashelp.class order by age); run; ``` -SHA256 digest for SQLinDS: B280D0B72DB77001ADAAE9C1612B67AD30C2C672371B27F1ACB12016C7A1363D +SHA256 digest for SQLinDS: D76B85EFF129678B45233FB397A2BDB8D23F234013BD821D55141CA18DD5589E [Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/sqlinds.md "Documentation for SQLinDS") - **DFA** (Dynamic Function Arrays)\[0.2\], contains set of macros and FCMP functions which implement: a dynamically allocated array, a stack, a fifo queue, an ordered stack, and a priority queue, run `%helpPackage(DFA,createDFArray)` to find examples. -SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713BB54DDA +SHA256 digest for DFA: 43AE8BB0FC7D2121AABDD8DB8AD2C3F226C7D2699CAACC171FCB72B75D9141FA - **macroArray**\[0.5\], implementation of an array concept in a macrolanguage, e.g. @@ -99,7 +99,7 @@ SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713 which = 1:H:2 ); ``` -SHA256 digest for macroArray: 53C248E1DE3268946C9CEC7E77BC222F652FBB006D9317BE36B86410DA31AE35 +SHA256 digest for macroArray: 085A0F3D544EAF01378BB6C6B4F429123F8BFEEFC76013D1B05DFADFEE3FA661 [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/macroarray.md "Documentation for macroArray") @@ -118,12 +118,12 @@ format x bool.; %put %getVars(sashelp.class, pattern = ght$, sep = +, varRange = _numeric_); ``` -SHA256 digest for BasePlus: 66E966489F4C183CA75FC32D3AF581FEC20FC9C5FF0C36E4DDC5A14BBDA82EAB +SHA256 digest for BasePlus: 54232DA5E253EB58E49A09DD0DF244F433B61983D921E27F2E4FFB1EA73A5C6D [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/baseplus.md "Documentation for BasePlus") - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) -SHA256 digest for dynMacroArray: 066186B94B2976167C797C6A6E6217E361E8DEB10F2AB81906E0A325E5243084 +SHA256 digest for dynMacroArray: 281D9493564A8185B858D9525AA7D9D5343E42414AAB1D8A00AE85AB80882661 ### ====== diff --git a/SPF/SPFinit.md b/SPF/SPFinit.md new file mode 100644 index 0000000..2a02355 --- /dev/null +++ b/SPF/SPFinit.md @@ -0,0 +1,446 @@ + +## This is short help information for the `installPackage` macro +-------------------------------------------------------------------------------------------- + + Macro to install SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and embedded inside the zip. + + The `%installPackage()` macro installs the package zip + in the packages folder. The process of installation is equivalent with + manual downloading the package zip file into the packages folder. + +-------------------------------------------------------------------------------------------- + +### Parameters: + + 1. `packagesNames` Space separated list of packages names _without_ + the zip extension, e.g. myPackage1 myPackage2, + Required and not null, default use case: + `%installPackage(myPackage1 myPackage2)`. + If empty displays this help information. + If the package name is *SPFinit* or *SASPackagesFramework* + then the framework itself is downloaded. + + - `sourcePath=` Location of the package, e.g. "www.some.web.page/" + Mind the "/" at the end of the path! + Current default location for packages is: + `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/packages/` + Current default location for the framework is: + `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/SPF/` + + - `replace=` With default value of `1` it causes existing package file + to be replaceed by new downloaded file. + +-------------------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` to learn more. + +### Example ################################################################################ + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +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; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## This is short help information for the `helpPackage` macro +------------------------------------------------------------------------------- + + Macro to get help about SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and provided with + a single `help.sas` file (also embedded inside the zip). + + The `%helpPackage()` macro prints in the SAS log help + information about the package provided by the developer. + +------------------------------------------------------------------------------- + +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%loadPackage(myPackage).` + If empty displays this help information. + + 2. `helpKeyword` *Optional.* A phrase to search in help, + - when empty prints description, + - "*" means prints all help, + - "license" prints the license. + + - `path=` *Optional.* Location of a package. By default it + looks for location of the **packages** fileref, i.e. + `%sysfunc(pathname(packages))` + + - `options=` *Optional.* Possible options for ZIP filename, + default value: `LOWCASE_MEMNAME` + + - `source2=` *Optional.* Option to print out details about + what is loaded, null by default. + + - `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 following form: + `%loadPackage(PiPackage, zip=disk, options=)` + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +## Example #################################################################### + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +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; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## This is short help information for the `loadPackage` macro +------------------------------------------------------------------------------- + + Macro to *load* SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and included by + a single `load.sas` file (also embedded inside the zip). + + The `%loadPackage()` macro loads package content, i.e. macros, + functions, formats, etc., from the zip into the SAS session. + +------------------------------------------------------------------------------- +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%loadPackage(myPackage).` + If empty displays this help information. + + - `path=` *Optional.* Location of a package. By default it + looks for location of the **packages** fileref, i.e. + `%sysfunc(pathname(packages))` + + - `options=` *Optional.* Possible options for ZIP filename, + default value: `LOWCASE_MEMNAME` + + - `source2=` *Optional.* Option to print out details about + what is loaded, null by default. + + - `requiredVersion=` *Optional.* Option to test if the loaded + package is provided in required version, + default value: `.` + + - `lazyData=` *Optional.* A list of names of lazy datasets to be + loaded. If not null datasets from the list are loaded + instead of the package. + An asterisk (*) means *load all lazy datasets*. + + - `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 following form: + `%loadPackage(PiPackage, zip=disk, options=)` + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +## Example #################################################################### + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +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; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## This is short help information for the `loadPackageS` macro +------------------------------------------------------------------------------- + + Macro wrapper for the loadPackage macro, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and embedded inside the zip. + + The `%loadPackageS()` allows to load multiple packages at one time, + *ONLY* from the *ZIP* with *DEFAULT OPTIONS*, into the SAS session. + +### Parameters: + + 1. `packagesNames` A comma separated list of packages names, + e.g. myPackage, myPackage1, myPackage2, myPackage3 + Required and not null, default use case: + `%loadPackageS(myPackage1, myPackage2, myPackage3)`. + Package version, in brackets behind a package name, can + be provided, example is the following: + `%loadPackageS(myPackage1(1.7), myPackage2(4.2))`. + If empty displays this help information. + + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +### Example ################################################################### + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; +%include packages(SPFinit.sas); %* enable the framework; + +%installPackage(SQLinDS DFA) %* install packages from the Internet; +%loadPackageS(SQLinDS, DFA) %* load packags content into the SAS session; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + + +## This is short help information for the `unloadPackage` macro +------------------------------------------------------------------------------- + + Macro to unload SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and provided with + a single `unload.sas` file (also embedded inside the zip). + + The `%unloadPackage()` macro clears the package content + from the SAS session. + +------------------------------------------------------------------------------- + +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%loadPackage(myPackage).` + If empty displays this help information. + + - `path=` *Optional.* Location of a package. By default it + looks for location of the **packages** fileref, i.e. + `%sysfunc(pathname(packages))` + + - `options=` *Optional.* Possible options for ZIP filename, + default value: `LOWCASE_MEMNAME` + + - `source2=` *Optional.* Option to print out details about + what is loaded, null by default. + + - `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 following form: + `%loadPackage(PiPackage, zip=disk, options=)` + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +### Example ################################################################### + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +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; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +## This is short help information for the `listPackages` macro +----------------------------------------------------------------------------------------- + + Macro to list available SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and embedded inside the zip. + + The `%listPackages()` macro lists packages available + in the packages folder. List is printed inthe SAS Log. + +### Parameters: + + NO PARAMETERS + + When used as: `%listPackages(HELP)` it displays this help information. + +----------------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +### Example ############################################################################# + + Enabling the SAS Package Framework + from the local directory and listing + available packages. + + Assume that the `SPFinit.sas` file + is located in the "C:/SAS_PACKAGES/" folder. + + Run the following code in your SAS session: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; +%include packages(SPFinit.sas); %* enable the framework; + +%listPackages() %* list available packages; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +### This is short help information for the `verifyPackage` macro +------------------------------------------------------------------------------- + + Macro to verify SAS package with it hash digest, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and embedded inside the zip. + + The `%verifyPackage()` macro generate package SHA256 hash + and compares it with the one provided by the user. + + + *Minimum SAS version required for the process is 9.4M6.* + +### Parameters: + + 1. `packageName` Name of a package, e.g. myPackage, + Required and not null, default use case: + `%loadPackage(myPackage)`. + If empty displays this help information. + + - `hash=` A value of the package `SHA256` hash. + Provided by the user. + + - `path=` Location of a package. By default it looks for + location of the "packages" fileref, i.e. + `%sysfunc(pathname(packages))` + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to learn more. + +### Example ################################################################### + + 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: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages; +%include packages(SPFinit.sas); %* enable the framework; + +%installPackage(SQLinDS) %* install the package from the Internet; +%verifPackage(SQLinDS, %* verify the package with provided hash; + hash=HDA478ANJ3HKHRY327FGE88HF89VH89HFFFV73GCV98RF390VB4) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +## This is short help information for the `generatePackage` macro +------------------------------------------------------------------------------- + + Macro to generate SAS packages, version `20201010` + + A SAS package is a zip file containing a group + of SAS codes (macros, functions, data steps generating + data, etc.) wrapped up together and embedded inside the zip. + + The `%generatePackage()` macro generates SAS packages. + It wraps-up the package content, i.e. macros, functions, formats, etc., + into the zip file and generate all metadata content required by other + macros from the SAS Packages Framework. + +------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` + to read about the details of package generation process. + +### Parameters: + + 1. `filesLocation=` Location of package files, example value: + `%sysfunc(pathname(work))/packagename`. + Default use case: + `%generatePackage(filesLocation=/path/to/packagename)` + If empty displays this help information. + + - `testPackage=` Indicator if tests should be executed. + Default value: `Y`, means "execute tests" + + - `packages=` Location of other packages for testing + if there are dependencies in loading the package. + +------------------------------------------------------------------------------- diff --git a/SPF/SPFinit.sas b/SPF/SPFinit.sas index 77afca9..7323717 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20201001. + Version 20201010. See examples below. A SAS package is a zip file containing a group of files @@ -81,7 +81,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20201001. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20201010. Run %loadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -92,77 +92,79 @@ des = 'Macro to load SAS package, version 20201001. Run %loadPackage() for help ; 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 20201001 #; - %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 # Parameters: #; - %put # #; - %put # 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 # 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 # options= Possible options for ZIP filename, #; - %put # default value: LOWCASE_MEMNAME #; - %put # #; - %put # source2= Option to print out details, null by default. #; - %put # #; - %put # requiredVersion= Option to test if the loaded package #; - %put # is provided in required version, #; - %put # default value: . #; - %put # #; - %put # lazyData= A list of names of lazy datasets to be loaded. #; - %put # If not null datasets from the list are loaded #; - %put # instead of the package. #; - %put # Asterisk (*) means "load all lazy datasets". #; - %put # #; - %put # zip=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/master/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 ; - %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 #################################################################################; + %put ### This is short help information for the `loadPackage` macro #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Macro to *load* SAS packages, version `20201010` #; + %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/master/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; @@ -248,7 +250,7 @@ des = 'Macro to load SAS package, version 20201001. Run %loadPackage() for help */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20201001. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20201010. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -259,68 +261,71 @@ des = 'Macro to unload SAS package, version 20201001. Run %unloadPackage() for h ; 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 20201001 #; - %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(%%unloadPackage()) macro clears the package content #; - %put # from the SAS session. #; - %put # #; - %put # Parameters: #; - %put # #; - %put # packageName 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= Location of a package. By default it looks for #; - %put # location of the "packages" fileref, i.e. #; - %put # %nrstr(%%sysfunc(pathname(packages))) #; - %put # #; - %put # options= Possible options for ZIP filename, #; - %put # default value: LOWCASE_MEMNAME #; - %put # #; - %put # source2= Option to print out details, null by default. #; - %put # #; - %put # zip=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 loadPackage in the following form: #; - %put # %nrstr(%%unloadPackage(PiPackage, zip=disk, options=)) #; - %put # #; - %put ###############################################################################; - %put # #; - %put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/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 ; - %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 #################################################################################; + %put ### This is short help information for the `unloadPackage` macro #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Macro to unload SAS packages, version `20201010` #; + %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(%%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 # - `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/master/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; @@ -383,7 +388,7 @@ des = 'Macro to unload SAS package, version 20201001. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20201001. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20201010. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -394,73 +399,76 @@ des = 'Macro to get help about SAS package, version 20201001. Run %helpPackage() ; 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 20201001 #; - %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(%%helpPackage()) macro prints in the SAS log help #; - %put # information about the package provided by the developer. #; - %put # #; - %put # Parameters: #; - %put # #; - %put # packageName 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 # helpKeyword Phrase to search in help, #; - %put # - when empty prints description, #; - %put # - "*" means prints all help, #; - %put # - "license" prints license. #; - %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 # options= Possible options for ZIP filename, #; - %put # default value: LOWCASE_MEMNAME #; - %put # #; - %put # source2= Option to print out details, null by default. #; - %put # #; - %put # zip=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 loadPackage in the following form: #; - %put # %nrstr(%%helpPackage(PiPackage, zip=disk, options=)) #; - %put # #; - %put ###############################################################################; - %put # #; - %put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/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 ; - %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 #################################################################################; + %put ### This is short help information for the `helpPackage` macro #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Macro to get help about SAS packages, version `20201010` #; + %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(%%loadPackage(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 prints 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(%%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/master/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; @@ -504,7 +512,7 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20201001 */ +/* Macros to install SAS packages, version 20201010 */ /* 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 @@ -520,7 +528,7 @@ TODO: /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20201001. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20201010. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -531,66 +539,67 @@ des = 'Macro to install SAS package, version 20201001. Run %%installPackage() fo ; 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 20201001 #; - %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(%%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 # Parameters: #; - %put # #; - %put # 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/master/packages/ #; - %put # Current default location for the framework is: #; - %put # https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/SPF/ #; - %put # #; - %put # replace= With default value of 1 it causes existing package file #; - %put # to be replaceed by new downloaded file. #; - %put # #; - %put #########################################################################################; - %put # #; - %put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/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 ; - %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 ##############################################################################################; + %put ### This is short help information for the `installPackage` macro #; + %put #--------------------------------------------------------------------------------------------#;; + %put # #; + %put # Macro to install SAS packages, version `20201010` #; + %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 #--------------------------------------------------------------------------------------------#; + %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/master/packages/` #; + %put # Current default location for the framework is: #; + %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/SPF/` #; + %put # #; + %put # - `replace=` With default value of `1` it causes existing package file #; + %put # to be replaceed by new downloaded file. #; + %put # #; + %put #--------------------------------------------------------------------------------------------#; + %put # #; + %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/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; @@ -827,7 +836,7 @@ des = 'Macro to install SAS package, version 20201001. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20201001 + Version 20201010 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -847,7 +856,7 @@ des = 'Macro to install SAS package, version 20201001. Run %%installPackage() fo %macro listPackages()/PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20201001.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20201010.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -858,46 +867,47 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE ; 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 20201001 #; - %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(%%listPackages()) macro lists packages available #; - %put # in the packages folder. List is printed inthe SAS Log. #; - %put # #; - %put # Parameters: 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/master/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 ; - %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 ###########################################################################################; + %put ### This is short help information for the `listPackages` macro #; + %put #-----------------------------------------------------------------------------------------#;; + %put # #; + %put # Macro to list available SAS packages, version `20201010` #; + %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/master/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; @@ -992,7 +1002,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20201001 + Version 20201010 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1015,51 +1025,54 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; dependencies in loading */ )/secure /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20201001. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20201010. Run %generatePackage() for help info.' +minoperator ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; %local options_tmp ; - %let options_tmp = ls=%sysfunc(getoption(ls))ps=%sysfunc(getoption(ps)) + %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 generatePackage macro #; - %put ###############################################################################; - %put # #; - %put # Macro to generate SAS packages, version 20201001 #; - %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(%%generatePackage()) macro generates SAS packages. #; - %put # It wraps-up the package content, i.e. macros, functions, formats, etc., #; - %put # into the zip file and generate all metadata content required by other #; - %put # macros from the SAS Packages Framework. #; - %put # #; - %put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #; - %put # to read about the details of package generation process. #; - %put # #; - %put # Parameters: #; - %put # #; - %put # filesLocation= Location of package files, example value: #; - %put # %nrstr(%%sysfunc(pathname(work))/packagename). #; - %put # Default use case: #; - %put # %nrstr(%%generatePackage(filesLocation=/path/to/packagename)) #; - %put # If empty displays this help information. #; - %put # #; - %put # testPackage= Indicator if tests should be executed. #; - %put # Default value: Y, means "execute tests" #; - %put # #; - %put # packages= Location of other packages for testing #; - %put # if there are dependencies in loading the package. #; - %put # #; - %put ###############################################################################; + %put #################################################################################; + %put ### This is short help information for the `generatePackage` macro #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Macro to generate SAS packages, version `20201010` #; + %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(%%generatePackage())` macro generates SAS packages. #; + %put # It wraps-up the package content, i.e. macros, functions, formats, etc., #; + %put # into the zip file and generate all metadata content required by other #; + %put # macros from the SAS Packages Framework. #; + %put # #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation` #; + %put # to read about the details of package generation process. #; + %put # #; + %put #### Parameters: #; + %put # #; + %put # 1. `filesLocation=` Location of package files, example value: #; + %put # `%nrstr(%%sysfunc(pathname(work))/packagename)`. #; + %put # Default use case: #; + %put # `%nrstr(%%generatePackage(filesLocation=/path/to/packagename))` #; + %put # If empty displays this help information. #; + %put # #; + %put # - `testPackage=` Indicator if tests should be executed. #; + %put # Default value: `Y`, means "execute tests" #; + %put # #; + %put # - `packages=` Location of other packages for testing #; + %put # if there are dependencies in loading the package. #; + %put # #; + %put #-------------------------------------------------------------------------------#; + %put #################################################################################; %put ; options &options_tmp.; %GOTO ENDofgeneratePackage; @@ -1072,13 +1085,13 @@ des = 'Macro to generate SAS packages, version 20201001. Run %generatePackage() %let _LIC_ = _%sysfunc(datetime(), hex6.)l; /* collect package metadata from the description.sas file */ -filename &_DESCR_. "&filesLocation./description.sas" lrecl = 256; +filename &_DESCR_. "&filesLocation./description.sas" lrecl = 1024; /* file contains licence */ -filename &_LIC_. "&filesLocation./license.sas" lrecl = 256; +filename &_LIC_. "&filesLocation./license.sas" lrecl = 1024; %if %sysfunc(fexist(&_DESCR_.)) %then %do; - %put NOTE: Creating package%str(%')s metadata; + %put NOTE: Creating package metadata; %local packageName /* name of the package, required */ packageVersion /* version of the package, required */ @@ -1122,7 +1135,7 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256; %then %do; %put ERROR: At least one of descriptors is missing!; - %put ERROR- They are required to create package.; + %put ERROR- They are required to create a package.; %put ERROR- &=packageName.; %put ERROR- &=packageTitle.; %put ERROR- &=packageVersion.; @@ -1131,15 +1144,17 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256; %put ERROR- &=packageEncoding.; %put ERROR- &=packageLicense.; %put ERROR- ; + %put ERROR- Aborting.; %abort; %end; /* test for package name */ %if %sysfunc(lengthn(&packageName.)) > 24 %then %do; %put ERROR: Package name is more than 24 characters long.; - %put ERROR- The name is used for functions%str(%') dataset name; - %put ERROR- and for formats%str(%') catalog name (with suffix).; - %put ERROR- The length is %sysfunc(lengthn(&packageName.)). Try something shorter.; + %put ERROR- The name is used for functions dataset name; + %put ERROR- and for formats catalog name (with suffix).; + %put ERROR: The length is %sysfunc(lengthn(&packageName.)). Try something shorter.; + %put ERROR- Aborting.; %abort; %end; %else %if %sysfunc(lengthn(&packageName.)) < 3 %then @@ -1151,10 +1166,22 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256; %if %qsysfunc(lengthn(%qsysfunc(compress(&packageName.,,KDF)))) NE %qsysfunc(lengthn(&packageName.)) %then %do; %put ERROR: Package name contains illegal symbols.; - %put ERROR- The name is used for functions%str(%') dataset name; - %put ERROR- and for formats%str(%') catalog name.; + %put ERROR- The name is used for functions dataset name; + %put ERROR- and for formats catalog name.; %put ERROR- Only English letters, underscore(_), and digits are allowed.; - %put ERROR- Try something else. Maybe: %qsysfunc(compress(&packageName.,,KDF)) will do?; + %put ERROR: Try something else. Maybe: %qsysfunc(compress(&packageName.,,KDF)) will do?; + %put ERROR- Aborting.; + %abort; + %end; + /* test first symbol in package name */ + %if %qsubstr(&packageName.,1,1) IN (1 2 3 4 5 6 7 8 9 0) %then + %do; + %put ERROR: Package name cannot start with a number.; + %put ERROR- The name is used for functions dataset name; + %put ERROR- and for formats catalog name.; + %put ERROR- Only English letters and underscore(_) are allowed as the first symbol.; + %put ERROR: Try something else which not start with a digit; + %put ERROR- Aborting.; %abort; %end; @@ -1162,7 +1189,8 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256; %else %do; %put ERROR: The description.sas file is missing!; - %put ERROR- The file is required to create package%str(%')s metadata; + %put ERROR- The file is required to create package metadata; + %put ERROR- Aborting.; %abort; %end; @@ -1180,6 +1208,7 @@ data _null_; put 'ERROR: Package version should be a positive NUMBER.'; put 'ERROR- Current value is: ' "&packageVersion."; put 'ERROR- Try something small, e.g. 0.1'; + put 'ERROR- Aborting.'; put; abort; end; @@ -1192,7 +1221,16 @@ filename &zipReferrence. ZIP "&filesLocation./%lowcase(&packageName.).zip"; %do; %put NOTE: Deleting file "&filesLocation./%lowcase(&packageName.).zip"; %let _RC_ = %sysfunc(fdelete(&zipReferrence.)); + %put NOTE: &=_RC_; %end; +%if %sysfunc(fexist(&zipReferrence.)) %then + %do; + %put ERROR: File "&filesLocation./%lowcase(&packageName.).zip" cannot be deleted.; + %put ERROR- Check if the file is not blocked by another process.; + %put ERROR- Aborting.; + %abort; + %end; + /*** HELP START ***/ /* @@ -1330,9 +1368,9 @@ data &filesWithCodes.; put 'ERROR: Folder should be named ONLY with low case letters.'; put 'ERROR- Current value is: ' folder; lowcase_name = lowcase(folder); - put 'ERROR- Try: ' lowcase_name; + put 'ERROR- Try to use: ' lowcase_name; put; - abort; + _abort_ + 1; end; order = scan(folder, 1, "_"); type = scan(folder,-1, "_"); @@ -1350,9 +1388,9 @@ data &filesWithCodes.; put 'ERROR: File with code should be named ONLY with low case letters.'; put 'ERROR- Current value is: ' file; lowcase_name = lowcase(file); - put 'ERROR- Try: ' lowcase_name; + put 'ERROR- Try to use: ' lowcase_name; put; - abort; + _abort_ + 1; end; fileshort = substr(file, 1, length(file) - 4); /* filename.sas -> filename */ output; @@ -1363,6 +1401,12 @@ data &filesWithCodes.; rc = dclose(folderid); rc = filename(folderRef); + + if _abort_ then + do; + put 'ERROR: Aborting due to previous errors.'; + abort; + end; stop; run; proc sort data = &filesWithCodes.; @@ -1372,9 +1416,9 @@ run; proc contents data = &filesWithCodes.; run; */ -title1 "Package's location is: &filesLocation."; +title1 "Package location is: &filesLocation."; title2 "User: &SYSUSERID., datetime: %qsysfunc(datetime(), datetime21.), SAS version: &SYSVLONG4."; -title3 "Package's encoding: '&packageEncoding.', session's encoding: '&SYSENCODING.'."; +title3 "Package encoding: '&packageEncoding.', session encoding: '&SYSENCODING.'."; title4 " ______________________________ "; title5 "List of files for package: &packageName. (version &packageVersion.), license: &packageLicense."; title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; @@ -1511,7 +1555,7 @@ data _null_; put ' %do; '; put ' %put ERROR: Required version is &requiredVersion.; '; put ' %put ERROR- Provided version is &packageVersion.; '; - put ' %ABORT; '; + put ' %GOTO WrongVersionOFPackage; /*%RETURN;*/ '; put ' %end; '; @@ -1523,6 +1567,8 @@ data _null_; put ' ; '; put ' %include &_PackageFileref_.(load.sas) / &source2.; '; put ' filename &_PackageFileref_. clear; '; + put ' %WrongVersionOFPackage: '; + put ' %mend ICEloadPackage; '; put " "; run; @@ -1605,13 +1651,15 @@ data _null_; put ' /* if checklist is not null rise error */ '; put ' if eof and R.num_items > 0 then '; put ' do %str(;) '; - put ' put "ERROR- ###########################################" %str(;) '; - put ' put "ERROR- The following SAS components are missing! " %str(;) '; - put ' call symputX("packageRequiredErrors", 1, "L") %str(;) '; - put ' do while(iR.next() = 0) %str(;) '; - put ' put "ERROR- " req %str(;) '; - put ' end %str(;) '; - put ' put "ERROR- ###########################################" %str(;) '; + put ' put "WARNING- ###########################################" %str(;) '; + put ' put "WARNING: The following SAS components are missing! " %str(;) '; + put ' call symputX("packageRequiredErrors", 0, "L") %str(;) '; + put ' do while(iR.next() = 0) %str(;) '; + put ' put "WARNING- " req %str(;) '; + put ' end %str(;) '; + put ' put "WARNING: The package may NOT WORK as expected " %str(;) '; + put ' put "WARNING: or even result with ERRORS! " %str(;) '; + put ' put "WARNING- ###########################################" %str(;) '; put ' put %str(;) '; put ' end %str(;) '; put ' run %str(;) '; @@ -1712,7 +1760,7 @@ data _null_; put ' do req = ' / packageReqPackages / ' ; '; put ' name = lowcase(strip(scan(req, 1, "("))); '; put ' vers = input(compress(scan(req,-1, "("), ".", "KD"), best32.); '; - put ' put "ERROR: SAS package " req "is missing! Download it and" ; '; + put ' put "ERROR: SAS package " req "is missing! Download/install it and" ; '; put ' put ''ERROR- use %loadPackage('' name ", requiredVersion = " vers ") to load it." ; '; put ' end ; '; put ' end; '; @@ -1728,7 +1776,7 @@ data _null_; put ' if symget("packageRequiredErrors") = "1" then '; put ' do; '; put ' put "ERROR: Loading package &packageName. will be aborted!";'; - put ' put "ERROR- Required SAS components are missing."; '; + put ' put "ERROR- Required components are missing."; '; put ' put "ERROR- *** STOP ***"; '; put ' ABORT; '; put ' end; '; @@ -2193,7 +2241,7 @@ data _null_; put ' do until (EOF); '; put " infile &_PackageFileref_.(description.sas) end = EOF; "; put ' input; '; - put ' if upcase(strip(_infile_)) =: "DESCRIPTION END:" then printer = 0; '; + put ' if upcase(strip(_infile_)) =: "DESCRIPTION END:" then printer = 0; '; put ' if printer then put @1 _infile_; '; put ' if upcase(strip(_infile_)) =: "DESCRIPTION START:" then printer = 1; '; put ' end; '; @@ -2232,7 +2280,7 @@ data _null_; put ' end ; '; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20201001 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20201010 *"; put "***";'; put 'run; ' /; @@ -2270,11 +2318,11 @@ data _null_; select; when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = fileshort; - when (upcase(type) = "MACRO") fileshort2 = cats('''%',fileshort,'()'''); - when (upcase(type) =:"FUNCTION") fileshort2 = cats("'",fileshort,"()'"); - when (upcase(type) =:"IMLMODULE") fileshort2 = cats("'",fileshort,"()'"); - when (upcase(type) =:"PROTO") fileshort2 = cats("'",fileshort,"()'"); - when (upcase(type) = "FORMAT") fileshort2 = cats("'$",fileshort,".'"); + when (upcase(type) = "MACRO" ) fileshort2 = cats('''%', fileshort, '()'''); + when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); + when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); + when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); + when (upcase(type) = "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); otherwise fileshort2 = fileshort; end; strX = catx('/', folder, order, type, file, fileshort, fileshort2); @@ -2335,6 +2383,13 @@ data _null_; run; /* create package content */ +%local notesSourceOptions; +%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); +options notes source; +%put NOTE-######################################################; +%put NOTE-# Creating package content. #; +%put NOTE-######################################################; +options nonotes nosource; data _null_; /* break if no data */ if NOBS = 0 then stop; @@ -2344,9 +2399,13 @@ data _null_; call execute(cat ('filename _SPFIN_ "', catx('/', base, folder, file), '";')); call execute(cats("filename _SPFOUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='_", folder, ".", file, "';") ); + /* copy code file into the zip */ call execute('data _null_;'); + call execute(' put ;'); + call execute(' pathname = pathname("_SPFIN_");'); call execute(' rc = fcopy("_SPFIN_", "_SPFOUT_");'); + call execute(' put "File " pathname "copied into the package with return code: " rc;'); call execute('run;'); /* test file content for help tags */ call execute('data _null_;'); @@ -2357,15 +2416,19 @@ data _null_; call execute(' if upcase(strip(_infile_)) = "/*** HELP END ***/" then test + (-1); '); call execute(' if (test not in (.,0,1)) or (EOF and test) then '); call execute(' do; '); - call execute(' put "ERR" "OR: unmatched or nested HELP tags!" _N_=; '); + call execute(' put "ERROR: Unmatched or nested HELP tags in ' !! catx('/', folder, file) !! '! Line: " _N_; '); + call execute(' put "ERROR- Aborting! "; '); call execute(' abort; '); call execute(' end; '); - call execute(' if (EOF and test=.) then put "WARN" "ING: no HELP tags in the file." ; '); + call execute(' if (EOF and test=.) then put "WARNING: No HELP tags in the file ' !! catx('/', folder, file) !! '." ; '); call execute('run;'); call execute('filename _SPFIN_ clear;'); call execute('filename _SPFOUT_ clear;'); run; +options notes source; +%put NOTE-######################################################; +options ¬esSourceOptions.; /* proc sql; drop table &filesWithCodes.; @@ -2385,13 +2448,11 @@ filename &zipReferrence. clear; where fncname = "HASHING_FILE"; call execute(' data the_SHA256_hash_id; - SHA256 = HASHING_FILE("SHA256", "&zipReferrence.", 4); - lable SHA256 = "The SHA256 hash digest for package &packageName.:"; - put SHA256=; - run; - proc print data = the_SHA256_hash_id noobs label; - run; - '); + SHA256 = HASHING_FILE("SHA256", "&zipReferrence.", 4); + lable SHA256 = "The SHA256 hash digest for package &packageName.:"; + put SHA256=; + run;'); + call execute('proc print data = the_SHA256_hash_id noobs label; run;'); stop; run; filename &zipReferrence. clear; @@ -2403,13 +2464,13 @@ filename &zipReferrence. clear; /* tests of package are executed by default */ %if %bquote(&testPackage.) ne Y %then %do; - %put WARNING: ** NO TESTING WILL BE EXECUTED **; + %put WARNING: ** NO TESTING WILL BE EXECUTED. **; %GOTO NOTESTING; %end; /* check if systask is available */ %if %sysfunc(GETOPTION(XCMD)) = NOXCMD %then %do; - %put WARNING: ** NO TESTING WILL BE EXECUTED DUE TO NOXCMD **; + %put WARNING: ** NO TESTING WILL BE EXECUTED DUE TO NOXCMD. **; %GOTO NOTESTING; %end; @@ -2463,7 +2524,7 @@ data _null_; if fileexist("&packages./SPFinit.sas") then put '%include packages(SPFinit.sas);' /; else if fileexist("&packages./loadpackage.sas") then - put '%include packages(loadpackage.sas);' /; /* for older versions when the SPFinit.sas did not exist */ + put '%include packages(loadpackage.sas);' / ; /* for older versions when the SPFinit.sas did not exist */ /* load */ put '%loadpackage'"(&packageName.,"; @@ -2510,26 +2571,35 @@ WAIT ; %let TESTRC_0 = &SYSRC.; %put *&=sasstat0.*&=TESTRC_0.*; +%local notesSourceOptions; +%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); +options NOnotes NOsource; data _null_; + if _N_ = 1 then + put "##########################################################################" / + "./loading.log" / + "##########################################################################" ; infile "./loading.log" dlm='0a0d'x end=EOF; input; if _INFILE_ =: 'WARNING:' then do; warning+1; - put _N_= _INFILE_; + put _N_= "**" _INFILE_; end; if _INFILE_ =: 'ERROR:' then do; error+1; - put _N_= _INFILE_; + put _N_= "$$" _INFILE_; end; if EOF then do; + put "##########################################################################" ; put (_ALL_) (=/); call symputX("TESTW_0", warning, "L"); call symputX("TESTE_0", error, "L"); end; run; +options ¬esSourceOptions.; /*-1-*/ @@ -2592,7 +2662,14 @@ WAIT ; %let TESTRC_&t = &SYSRC.; %put *sasstat&t.=&&sasstat&t.*TESTRC_&t=&&TESTRC_&t*; +%local notesSourceOptions; +%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); +options NOnotes NOsource; data _null_; + if _N_ = 1 then + put "##########################################################################" / + "./&&TEST_&t...log" / + "##########################################################################" ; infile "./&&TEST_&t...log" dlm='0a0d'x end=EOF; input; if _INFILE_ =: 'WARNING:' then @@ -2600,22 +2677,24 @@ data _null_; warning+1; /*length warningline $ 1024; warningline = catx(',', strip(warningline), _N_);*/ - put _N_= _INFILE_; + put _N_= "**" _INFILE_; end; if _INFILE_ =: 'ERROR:' then do; error+1; /*length errorline $ 1024; errorline = catx(',', strip(errorline), _N_);*/ - put _N_= _INFILE_; + put _N_= "$$" _INFILE_; end; if EOF then do; + put "##########################################################################" ; put (_ALL_) (=/); call symputX("TESTW_&t.", warning, "L"); call symputX("TESTE_&t.", error, "L"); end; run; +options ¬esSourceOptions.; %end; data test.tests_summary; @@ -2729,7 +2808,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20201001. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20201010. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -2741,55 +2820,54 @@ parmbuff ; 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 20201001 #; - %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(%%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 # 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/master/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 ; - %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 #################################################################################; + %put ### This is short help information for the `loadPackageS` macro #; + %put #-------------------------------------------------------------------------------#; + %put # #; + %put # Macro wrapper for the loadPackage macro, version `20201010` #; + %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/master/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; @@ -2830,7 +2908,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20201001. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20201010. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -2841,61 +2919,60 @@ des = 'Macro to verify SAS package with the hash digest, version 20201001. Run % ; 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 20201001 #; - %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(%%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 # 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 # 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 # hash= A value of the package SHA256 hash. #; - %put # Provided by the user. #; - %put # #; - %put ###############################################################################; - %put # #; - %put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/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 ; - %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( %%verifPackage%(SQLinDS, %%* verify the package with provided hash; ); - %put %nrstr( hash=HDA478ANJ3HKHRY327FGE88HF89VH89HFFFV73GCV98RF390VB4%) ); - %put ; - %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 `20201010` #; + %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/master/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( %%verifPackage%(SQLinDS, %%* verify the package with provided hash; ); + %put %nrstr( hash=HDA478ANJ3HKHRY327FGE88HF89VH89HFFFV73GCV98RF390VB4%) ); + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; + %put #################################################################################; %put ; options &options_tmp.; %GOTO ENDofverifyPackage; diff --git a/packages/README.md b/packages/README.md index d86a52a..eaa8489 100644 --- a/packages/README.md +++ b/packages/README.md @@ -18,7 +18,7 @@ data class; WH = weight + height; run; ``` -SHA256 digest for SQLinDS: B280D0B72DB77001ADAAE9C1612B67AD30C2C672371B27F1ACB12016C7A1363D +SHA256 digest for SQLinDS: D76B85EFF129678B45233FB397A2BDB8D23F234013BD821D55141CA18DD5589E [Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/sqlinds.md "Documentation for SQLinDS") @@ -51,7 +51,7 @@ data _null_; end; run; ``` -SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713BB54DDA +SHA256 digest for DFA: 43AE8BB0FC7D2121AABDD8DB8AD2C3F226C7D2699CAACC171FCB72B75D9141FA --- @@ -74,7 +74,7 @@ SHA256 digest for DFA: BB8768E977D62429368CFF2E5338A6553C35C998AEC09AF24088BA713 which = 1:H:2 ); ``` -SHA256 digest for macroArray: 53C248E1DE3268946C9CEC7E77BC222F652FBB006D9317BE36B86410DA31AE35 +SHA256 digest for macroArray: 085A0F3D544EAF01378BB6C6B4F429123F8BFEEFC76013D1B05DFADFEE3FA661 [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/macroarray.md "Documentation for macroArray") @@ -94,7 +94,7 @@ format x bool.; %put %getVars(sashelp.class, pattern = ght$, sep = +, varRange = _numeric_); ``` -SHA256 digest for BasePlus: 66E966489F4C183CA75FC32D3AF581FEC20FC9C5FF0C36E4DDC5A14BBDA82EAB +SHA256 digest for BasePlus: 54232DA5E253EB58E49A09DD0DF244F433B61983D921E27F2E4FFB1EA73A5C6D [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/master/packages/baseplus.md "Documentation for BasePlus") @@ -102,6 +102,6 @@ SHA256 digest for BasePlus: 66E966489F4C183CA75FC32D3AF581FEC20FC9C5FF0C36E4DDC5 - **dynMacroArray**\[0.2\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA) -SHA256 digest for dynMacroArray: 066186B94B2976167C797C6A6E6217E361E8DEB10F2AB81906E0A325E5243084 +SHA256 digest for dynMacroArray: 281D9493564A8185B858D9525AA7D9D5343E42414AAB1D8A00AE85AB80882661 --- diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 2ec79a7..4871ce9 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,18 @@ +/* 20201010 */ +SQLinDS: D76B85EFF129678B45233FB397A2BDB8D23F234013BD821D55141CA18DD5589E +DFA: 43AE8BB0FC7D2121AABDD8DB8AD2C3F226C7D2699CAACC171FCB72B75D9141FA +macroArray: 085A0F3D544EAF01378BB6C6B4F429123F8BFEEFC76013D1B05DFADFEE3FA661 +BasePlus: 54232DA5E253EB58E49A09DD0DF244F433B61983D921E27F2E4FFB1EA73A5C6D +dynMacroArray: 281D9493564A8185B858D9525AA7D9D5343E42414AAB1D8A00AE85AB80882661 + + +/* 20201007 */ +BasePlus: 884BAD527DE77A9AF4325053BF42B3B2FCD3DB1239B63D70B1198064095E1A6D +DFA: 57944FF5ABC7A9879C402412DA0C18C38206301930DC834BC7DD3E968E283D1E +dynMacroArray: 20B27D2CACCC17DE9AB70F7AA7105FF1B29397584538632CAE167A687ACD859A +macroArray: F2AF51F9271B4AF5366DCC4E6403407393F245561B98A89C0F1699A6BCA84772 +SQLinDS: AE2093A1D28F93FA665B4174FC38C0487C489D2B281FE398FF18CA738D841155 + /* 20201003 */ BasePlus: 66E966489F4C183CA75FC32D3AF581FEC20FC9C5FF0C36E4DDC5A14BBDA82EAB diff --git a/packages/baseplus.md b/packages/baseplus.md index fe94646..81c6916 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -186,7 +186,7 @@ Package contains: *SAS package generated by generatePackage, version 20201001* The SHA256 hash digest for package BasePlus: -`66E966489F4C183CA75FC32D3AF581FEC20FC9C5FF0C36E4DDC5A14BBDA82EAB` +`54232DA5E253EB58E49A09DD0DF244F433B61983D921E27F2E4FFB1EA73A5C6D` --- # Content description ############################################################################################ diff --git a/packages/baseplus.zip b/packages/baseplus.zip index 5c7ba5ea8685c249a0186fea7ee0f7f70af31b42..8f4aaf06062c411d9d6f0a8b39c2c8d6773ef77a 100644 GIT binary patch delta 5734 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 delta 5752 zcmZ`-XH=8j(hYkEI`@o5m2ljxgnu{zxk zW*o|$R$Ik>40se9iVC}>e>SBKJDV6uUE5rd4-ouJ5!oQKJh8g0<`YUJ3GJev&ZXdI zSGCKp1sIQk4zAEo+$Aj2c$ zKEhs}yUCFLk_V*|~ z3Gm>n-U+2}NjEWKQ{bs+y54Yq)*N@SaxoLN)@`!ZX|gKeWf~Lf$jR-N!&ylaF;M#W z@`z{P>A)+VeM0g{>4#~1^T%7P`^$>Q<&U?tGPC7#G)Qk5-EJ!k;RY&5y_w0gf42os z(i!nH=n|~Uc`Wj=rf+**Y`%Lu#He0@B9(hrx4r`*B+Mk;4;|+HY#=E@rC7x8VLSeq zDC=ka`<Y&s&IxCyR)bDx0&_co@Pa%I-fez2AfwWxhyQQ?dvh<}Kx} zf+7BdI0(mBh~u)<*p?sREeUdy#24NFq>*L@Tzn>s_U^}EjR zhi`?QF;n-ozwaL~Ns8AQyVl^eH^NQx^wzgKab?h5xc5HN@nFI>IaaPp|p@xA+I%7Kgii!@ONh4e0HYbQhOpl0ShYdgi zswI_-H6d*>{bc6IieaWb%MQo7R_h!_#rNqP1G2o1l%9e|cRW;Ug=rXAF0S)ZBFV-v zNH{rdYGoDVhe|<@#6eBauf+#ya@pf2plQwDI}1LJtYCv)BTW>+v(~eU>F<>^=t`7P z_$$af0Cu;I%-AEF=B99%!!b(5vcyop15lv}VAMZzezYgwn&Y;lFFD9&tl$x+6fN&? z^68mJ1&6zT!}WKlR)KSbTGL5O$VU#=3^?(NRyMwCW{31vt~+h};AE4+!|b4ZdgG_g z?KS6q@!HRtq*QxKL3`Z+WLEOOlwK-o+Owh(gte2(Ikg>(1^Q+011iZUpOUZ~eh6I_ z@K6ajOctzH^a%`_`t431h%OIMVQ%>*>_#v)^6^D>Z-`LzS*gha#yqNDrOqSPGaX(Z z{vzEh-Tm0sse7H^xdn>N3e4lx=iEKR|CO8ES1=8IZ_s<}%t@XUIjixB)cwI(w%L}i z%e~y1D=2-BU^3Y+E{R$g4T_KlvHBbPDjBF}aaUmC)6$UL>r0t;zffNxHS`PM$``oU zi56y~vc5jYoJhGCP1(HW#qJGbVb+CL%PkzpWWvAtsw{>xoxkwBVaj8_2p7qY8`S03 z5Y93&x{>Qu&Pdjn)S(Lv3woV75cZ|vgoEH_-Bw2^{T}AnziQ#!>nPudT)$Itx>GsU zCUa85n?~(l+kLkp#Ros{{yyXQ`-hljJdxuO0RZq7+Xheq5U=SZ;3I^MZboa)6!l

&sJhR+ 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 diff --git a/packages/dfa.zip b/packages/dfa.zip index e9f8ae023db626258438d731221033fb40c6f729..50b240f6f552f3b614e8424500be7062311407d1 100644 GIT binary patch delta 5121 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 diff --git a/packages/dynmacroarray.zip b/packages/dynmacroarray.zip index 9aa5b139d764136439c77ac72493c3842f10c29c..50c91232a76e92d211a96a96c29ec28f6acea576 100644 GIT binary patch delta 3941 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 F{sTl!!65(u diff --git a/packages/macroarray.md b/packages/macroarray.md index b0e7e21..29939d5 100644 --- a/packages/macroarray.md +++ b/packages/macroarray.md @@ -63,7 +63,7 @@ Required SAS Components: *SAS package generated by generatePackage, version 20200911* The SHA256 hash digest for package macroArray: -`53C248E1DE3268946C9CEC7E77BC222F652FBB006D9317BE36B86410DA31AE35` +`085A0F3D544EAF01378BB6C6B4F429123F8BFEEFC76013D1B05DFADFEE3FA661` --- # Content description ############################################################################################ diff --git a/packages/macroarray.zip b/packages/macroarray.zip index 811026d7537d16807edae6bf7df3595b6a73c738..f193365d88d7355e04a8c3b446e10933f8388d95 100644 GIT binary patch delta 7166 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 ONOR#q?{xYH>;C~Lsa~)E delta 7166 zcmZ`e1z1&0u$Sgahj8hX?pC_Hk&uw?Zm9zz-CP>!M!HLo1}W*dAV^3_gETz!fA9O= z|6!M+oo2s3@t@-7!L@aG~$_OZ(ME20Zk4Vix5J zbhW0K+BJwTcLhHMZ|tn`c`&S?1vPN5j{jH{clLqjApP=eLradWnUXW6C5)4fC>%uH zeUEh6c}CJ;AKprj6x@ydDm9cS1Vf2_ywk4vzPrc-WCM177yUT}9{}<%84ZjCc}!<& z+?Gc8oWY?><&>&Iid}Z9pIkMXDoqlOy$K=gN698g z+hbXtD}>DB9R5O}`T=uSKT}wk;CK-q@SFWT5>?Q#$iAI880wuFhI`M>kgT$St4mnH z7u^1}s++|`VRNcC6%n9H-7BhoL`ex47O`a*l(pzlM;709g_m4)G}Vg=CI#AO8~&^NaZS+^%L z*X!35z%ENIP1dDbSCcLMnaxI9Cb-A(b=*a}E3}4Wlo#?c-r=}jTjk9sAoUl15hO=S zS!~fl|1M$Ja|6YYY3eRSlM#4J`nH8wriEwXiyqtd2%0V*yK8CgbEn&5wgog@ITykk z3|*SZSgGH}8(zTK)?TTB7jJJLP;7GYXhaVh%o?pOK13mYK3H6)L$$oWx6H&sfAWEX zj^Dj=UyIA(KzR8V%ED1SO$QUvR)KCBCl;VTzolKyf&q#nr)pa@i$CbXv9}dFfDbk1rD~LT?&K6_e z%OPuZ?V<^_WQDZ{HQbuXxBExRig`tpA^EKaO%cyht~)M8jz&g(EvyA+XxKtvaodec zVNrO__EaRdzPG+=kXu~GSNFehc-Ecvo%_Qrd@niZej>D%tl>iI3AW8O-phUs8506Z zlT;N^Ej3itS{|mH#Bd9AS$Z1Z$j-cilN^vF-w$kY3CmmG+(bdzfa2G>}hXB0+*9q30^dafb2o#cYaI3HB_nb?%+N`=^12dOv z-df=ZQFq^PnbQM)N5yAIacILA65S9$-O7)|wRGYo4?NpuIQ*%xt1nB!#6Z-S$Wf!N z*#p^zgQMs66YhRdJ)?~`Glp!*ebk9bNI1x(!Gnlrt@3t1B-AdA*REr^t-tUQng+^~ zqV)AilXdMcX}P98oI9vg@@+?>RU#(iTI*!gN}-!NufkLU&}qiibDovur>HgpfkvOg zx_`!|%L+3_B5~qKu5w?X&7B=poudXLVPX$K2Wg*kcjo3UFL2cD;Ft*H?Iuj<1(N>pdw5JI&Qj-1@l2(J#4A z2=`?@=0o#{(WSm_|>Uj6k}FH9+l5jn8GiJK-CF3`o3T~-0O!mur|%Iw$m z)|+uhE#aUxMKoMlKsIwOK;2DYebuM&kgVd4;W1TbT=}I%jL>}Ug##Mk2uJ#>s>*|# z5oZw9uK?m8@#C;0ZdPt}b$VR?vnMwB=ke`_X6@$6gQKE&GYGd^xWz7(yM}CE;xp3= z>Q0WPP#^8sh4I<|^-G6phCzWB1Pj^ag0^-L*PnD~!)VeBqnxU<-`@30j%48D@fLV! zqQAHm?M6w7)_V=7&tOXp&9ZtHptatPsXKuDk)cdrEa?&p`y1cP?YZsIB;Covgn#S^b}m7 z5f}=v;a*fs$c)38KIn!iEKWeL%F0%GrO>r1^m+IT)+_SI8=4KhI z>Xcs5ingDpiEW~3cB*z>nMxN{@ET3gWXQWa&Z4mfC*a8JcT68R$t#2h?Is4#tSFHu z)@LlVH%S_L%=LVhQyG|E)bsAqpvhTtE=xFp#Guld*(wx_0n2=3d%7`w;Z}Skt`&JkWRqaMK*}mCYKWxN5+xeNf1lbuHKSm0nSC-Sa#pZfo5P!gOu(z@e!$Gc`)B9<^FPu?(*H z9+#bQq;B`>7#KW@+iZ#Z9&qCW?&_95*jOC=xTK`|;xonk!O>eEe?!G#^l{qRTyT%7 zp^?XUwKia@tltoIHe%Tna{A@6@L=a)eA{9I!;=|fh69l!dIp+tYKCokGac@_G!rsB z&``#RtFQCsOW7+5{^vP5S##32>rEHCcKdZJ)95r1JRt9@B5$lbniTD+n z;P6&1<3R8Hx++UgjhR~UtXHwbwy+Br|KCHNE zu?%U?1}=Jodo^y@Tm^uDGM%p_GLZv~I|~-eFK>i!Q&7c^!p7fbUc1-~56iSIu{O%K z8{nAk7b3B$U4`rG+gdw{vPEBhH%3E~dilPys<4H}`z$=}U_cq0?&N&7-#g{z=#vZw zUT=ji1uKd97rf?_VT`B^1I>*P`>W)!uDW;04M6kajiil}CO@@}6F{llw_(C0g_%l= z_ptA({5c$J2DA4{pTIwAh)5Z@Wx!61S^di1TH-|_ufKTic+K02n4OW=hC6p8fvKhMz zVxGA4(0-WDTMg*cYlyvFw%l!3420!etPp#sJ^WMcr&{?~dH8f-> z3(|QS1o&DT3O6XSyDO<(VSn8$MH3Bv+dVKk>vPxHxu9L0{G?VVx;93hEro0sqFdWl zrhb@v6cbvoc5@0+`Y54gUM3VHrymnFQ*!`M#XT+681{Hg^t_zNqA4vUIPGPd%3?m1 z7d{hZCqju`68pcbUjGtL9})Z~?DZ4-%_0ZQB76nx&T6YD+g|S3ZAiHk?(<6-XXU~x znyk!}JX~e2Ak{Biy%?BH=rfrYtR5W~5*#&%LrhU!I~?<9_T~E(v^`+2R;k78j5|)G z`xYC;CT}@Ac zQFSkXL0>PR$FczCGu902ySs(kY`ls>q^*Ov+yv@u`@L%0Z)!gXD1kY>Js12ud!gg@ zTZu-P@5b3dI(p!-XLYVXHu&lj+D(s-UtV`R{i^HdVr74`mqLa+jFttdr!1KVkFU|NM0 z5QohhG>YutIZmE)3lg4m6PIrXftDdu#Pp}^Y!ljE%@s`%+gk*ek%ZNp!psI?H%l$S z7GSm196~lPR65%Cn)`R`k>FDKTFNc$&c&v>O#Pd|rlQZwQ_UfY{`<_FuU`P5nl+JH ztMDQID-5=AO!SaO)E4^HpN>+bX-3LFgfAqC;{%7q7KXuR`19MiC`-JD#NFl!R=@fq z!$X;WPiY*c_E8NT9WxMSBDv{Z$Iw&6hhAta8oVYPC>q*g?8iTD(Zx($NireA{q8P+Cp|XFRlCjFfk_LDzN}TKKvbE)esS=(?~Yzd zLC9~s=M%l2{ajyEBWnh1>A%YH+rk8#NsBqwdS3`r*wal&l}I#4YT{&2YSPEQA#*fO z9CUcE9Po^2i=MAO(OBU${_>;l_k;Ysa`Tnws`jXw65QWhJ>O*{o?nAaJ>ZE-CA-Z7 zQ(53;MdlBqr~Nq*=%lkKfYhPx_}%y0&-8wKI=rN^bM+P83hRmnbOU+76}D=RcywCk zbeJ>@qdP**8OPYHYab@))>sa(lvr|j_DaD>gE5j=aYzJ?F&W0Gd#@`|$8bxTzhR*8 z_wN3%I$d$x%HcGT7yez5mQM7WNQEjlu7k5@MO_1pk(tp?097)r*WJOrW-yt>m zS*uj(7gIy-#?a9-0HZRZISm%~LyvJ}U>m%NQo9|!v&6m#$>3y&f2|)<%X@Xr&Da%z zfG(m5oAZ{hdXtA3Gf{Ca8Ia5?kwSbg8*$HC7dvCWq%-$3b|Of}r<9?CEpKl9U^%W} z!mFdTU$Cw6jY;sQ!q;1wrne(Et3oZmBCBs}>ZgZTwaLof0nK47lh40hIVnD{vwIa( zm^ENuLOnVjWD;1S1>!ox<2O(c7BjcN0o4SzojSxJTd_RV(8fL4pIj`o8GKS30(9T% z6!J+wII9HfN!?rc?rDj?ROT&B5iv-8E;Bz)@md{D3*+Aue_^&TIealw=GQxyam*BYv#v)`}KNaavH?H85S{WPZYdAu10obPy7Y~0&y9G zp8PyMRNe7;{dY!k9DqTlG^tudIsH{e9uw^u^PBOljIr0oSfUXOZpH5z>wiLymar&Z zBCE*;+WX&Gp`hD&4e}(D4mImME?*Nu1TFSUuB3_lSyZ!49igommFXc z|I#_H{ZojCD{x1w;PlJeT~iwJDl3!uVR7gdqJdd|+N3 z)g9WOI0}A+d$*$y-J9kD;l?x@Fc}qyCJJ*Q4;v11z&}BMCZI`}-8=Z6igg2u7$N_@ z51@_e`;d^vfeU?wC(pP#Eq3UgQ#YBnWqV3$-~v-9ki60*7<)PL)mZwPIU1ouzrfvf zNm#Uym3?lN(8wQl^Uh8yuX13g#ZzIYjwQ7|U1wx;LZ0}V=l8pFde~jVl^)8gtAVac z*|glTQN$wdTJ`*PGpyuTxSF?-dkt-AB|x}#%E+BXMxlj~Woq*qA$xKqQC+#yn?c&P z3iA*Xb9=)fniu+I*jia?JxtQu!Dp}+hK0Ld%l5vFRR}ti*(;I|U9rvizw>@C~L@#FgoCHt12;(@H znaK}1+e+bJl)^?YCdk^vY-#VmZvxgQTViCjMWrk!w&v@eGO40v+@Fk(tBSiPzxW|u z_IVr?=aOl1xN(W3TW?{^^YR($l*vE={!KvndNo#0=GEE!O>7wn=^k>WZu@kI^&DLwKXD*OfBFrG)H%BOu83mXd7Hh|?b$1Zwr(7!!#aZb8BiNBkWz4Om| zV15u#%n1>_?}*|cN0Qrn9~BmOE5m_hF*DIu%9kYcZeCiR0;|AoNI)u2F%bD=ix6we z5a9J58;rPK+GC^R05Y~L{T+h2u5ksze@#+H`XoQDH0QD>TXn&{o=@JTwJ$I@B;HD0 ziQsgqemLT%2>RKDJ+``aIIP)B1y<~;*y_8g};AZ*AhDBb!&YY zm;vCrVdzHOm1An0;5Ksd?GmBbY+)>>^^n|+Ki_$mrX?1RKPWuVSGFpvCl|Y2{msW- zg^Kffj@8arzbf~Ls5WugS6qJ)|Fh~Z)pfLw?AupD;yF`>vMWT|g#@OP%z)W)49YrMfXQOUdzy8xN!&waXG31>xaUU9Gk1oZ1_i&I}OO z{5Rw?%t`2N<*=Mx-?4*F-@FJD#Ktx!g%25IjT)qI8VbG<&QlLzX#{KBV>+}RiUa&B zV>^7FqFLZ-4W}Cg_6qVqU;~c5Yz|i~^}%#M<2S{R8iq=08PVhNNQ3Yf0;v6$xS$}s zfb!?29y_bpQ+``CdHlGNRLl5b|Hchm^7Q`z2C5n0zm#j;Numm5VUEmyQLqyU{DlgX&WZLfs_aApmk70SqWddP$4{3#5`lL?=G>2LeT zGM3OPCpxM>`*L|B;6C$Y1?;B<|JEsO4uW==lM<*YB0bH6KsZm2`jeq8?fzi@0T9nG AX#fBK diff --git a/packages/sqlinds.md b/packages/sqlinds.md index 2bea158..95cf652 100644 --- a/packages/sqlinds.md +++ b/packages/sqlinds.md @@ -49,7 +49,7 @@ Required SAS Components: *SAS package generated by generatePackage, version 20200911* The SHA256 hash digest for package SQLinDS: -`B280D0B72DB77001ADAAE9C1612B67AD30C2C672371B27F1ACB12016C7A1363D` +`D76B85EFF129678B45233FB397A2BDB8D23F234013BD821D55141CA18DD5589E` --- # Content description ############################################################################################ diff --git a/packages/sqlinds.zip b/packages/sqlinds.zip index a98f358c0d91e4a5f0a0cb5f70da4191d2b7afe3..4ab046c3f195423d4c924248854cb8f3a8fc2ce2 100644 GIT binary patch delta 4912 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 delta 4833 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