From 2e47ab5e372fc710b02efae9c6a5366b71c1d365 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Sat, 7 Dec 2024 23:08:14 +0100 Subject: [PATCH] SAS Packages Framework, version 20241207 SAS Packages Framework, version 20241207 Changes: - New parameter `instDoc=` in the `%installPackage()` macro allows to download (if one is available) the `.md` documentation file for a package. --- README.md | 5 +- ...(a how to)- Paper 4725-2020 - extended.pdf | Bin 348977 -> 349333 bytes SPF/Macros/extendpackagesfileref.sas | 6 +- SPF/Macros/generatepackage.sas | 20 +- SPF/Macros/helppackage.sas | 4 +- SPF/Macros/installpackage.sas | 134 +- SPF/Macros/listpackages.sas | 6 +- SPF/Macros/loadpackage.sas | 4 +- SPF/Macros/loadpackageaddcnt.sas | 4 +- SPF/Macros/loadpackages.sas | 4 +- SPF/Macros/previewpackage.sas | 4 +- SPF/Macros/splitcodeforpackage.sas | 6 +- SPF/Macros/unloadpackage.sas | 4 +- SPF/Macros/verifypackage.sas | 4 +- SPF/SPFinit.md | 1318 +++++++++-------- SPF/SPFinit.sas | 202 ++- 16 files changed, 951 insertions(+), 774 deletions(-) diff --git a/README.md b/README.md index 8fd8e4a..694fea4 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Don't forget to **STAR** (:star:) the repository! :-) ### Current version: -**The latest version** of SPF is **`20241129`**. +**The latest version** of SPF is **`20241207`**. To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -51,7 +51,8 @@ Letter "D" indicates tutorial dedicated for developers and "U" materials for use 3) (D) Article and all required materials for ["My first SAS Package"](https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation/Paper_1079-2021) tutorial. -4) (DU) Materials from Hands-on-Workshop (4+ hours) tutorial: [Share your code with SAS Packages](https://github.com/yabwon/HoW-SASPackages). +4) (DU) Materials from Hands-on-Workshop (4+ hours) tutorial: [Share your code with SAS Packages](https://github.com/yabwon/HoW-SASPackages). + It is a "zero to hero" tutorial that explains all the "bells and whistles" of using, and all the "nuts and bolts" of developing SAS packages. --- diff --git a/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf b/SPF/Documentation/SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf index 73a75448c944a6a161e70bf0630cf9d6c2663dd4..337df7c17db720809d2d393234243f68e8d03032 100644 GIT binary patch delta 79794 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�U12ofq7_h1wnp?feRc9(i7RiM0k!s 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�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 folder. #; %put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #; %put # #; + %put # - `instDoc=` *Optional.* A package may be provided with a markdown file #; + %put # containing combined documentation of the package. The option #; + %put # indicates if the `.md` file should be also downloaded. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; %put # - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the #; %put # *success-failure return code* of the installation process. Return value #; %put # has the following form: `.` #; @@ -182,30 +189,39 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo call symputX("firstPackagesPath", pathname("packages"), "L"); run; + %let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt))); + %let instDoc = %sysevalf(NOT(0=%superq(instDoc))); + + %let replace = %sysevalf(1=%superq(replace)); + %if %superq(sourcePath)= %then %do; - %local SPFinitMirror; + %local SPFinitMirror SPFinitMirrorMD; /* the defaults are: */ - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; %if 0 = %superq(mirror) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://github.com/SASPAC/; /*usercontent*/ %goto mirrorEnd; %end; %if 1 = %superq(mirror) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; %goto mirrorEnd; %end; %if 2 = %superq(mirror) %then %do; - %let SPFinitMirror = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.sas; + %let SPFinitMirror = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.md; %let sourcePath = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/packages/; %goto mirrorEnd; %end; @@ -215,7 +231,8 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %else %do; %let mirror=-1; - %let SPFinitMirror = &sourcePath.SPFinit.sas; + %let SPFinitMirror = &sourcePath.SPFinit.sas; + %let SPFinitMirrorMD = &sourcePath.SPFinit.md; %end; %local i str; @@ -262,10 +279,13 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put ### &packageName.(&vers.) ###; %put *** %lowcase(&packageName.) start *****************************************; - %local in out _IOFileref_; + %local in out inMD outMD _IOFileref_; data _null_; call symputX("_IOFileref_", put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run; %let in = i&_IOFileref_.; %let out = o&_IOFileref_.; + %let inMD = j&_IOFileref_.; + %let outMD = u&_IOFileref_.; + /* %let in = i%sysfunc(md5(&packageName.),hex7.); */ /* %let out = o%sysfunc(md5(&packageName.),hex7.); */ @@ -275,17 +295,27 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo /* allows to install/download the framework file like any other package */ %if %superq(mirror) in (0 1) AND (%superq(vers) ne) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.md; %end; %if %superq(mirror) > 1 %then %put %str( )Mirror %superq(mirror) does not support versioning.; - filename &in URL + /* source code file */ + filename &in. URL "&SPFinitMirror." recfm=N lrecl=1; - filename &out + filename &out. "&firstPackagesPath./SPFinit.sas" recfm=N lrecl=1; + + /* documentation MD file */ + filename &inMD. URL + "&SPFinitMirrorMD." + recfm=N lrecl=1; + filename &outMD. + "&firstPackagesPath./SPFinit.md" + recfm=N lrecl=1; %end; %else %do; @@ -305,7 +335,8 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put %str( )Mirror %superq(mirror) does not support versioning.; %end; - filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" + /* zip */ + filename &in. URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" %if (%superq(URLuser) ne ) %then %do; user = "&URLuser." @@ -313,7 +344,17 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %end; &URLoptions. recfm=N lrecl=1; - filename &out "&firstPackagesPath./%lowcase(&packageName.).zip" recfm=N lrecl=1; + filename &out. "&firstPackagesPath./%lowcase(&packageName.).zip" recfm=N lrecl=1; + /* markdown */ + filename &inMD. URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).md" + %if (%superq(URLuser) ne ) %then + %do; + user = "&URLuser." + pass = "&URLuser." + %end; + &URLoptions. + recfm=N lrecl=1; + filename &outMD. "&firstPackagesPath./%lowcase(&packageName.).md" recfm=N lrecl=1; %end; /* filename in list; @@ -323,12 +364,21 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %local installationRC; %let installationRC=1; data _null_; - length filein 8 out_path in_path $ 4096; + length filein fileinMD 8 + out_path in_path out_pathMD in_pathMD rcTXT $ 4096 + out_ref in_ref out_refMD in_refMD $ 8 + ; out_path = pathname ("&out"); in_path = pathname ("&in" ); + out_pathMD = pathname ("&outMD"); + in_pathMD = pathname ("&inMD" ); + out_ref = symget ("out"); + in_ref = symget ("in" ); + out_refMD = symget ("outMD"); + in_refMD = symget ("inMD" ); + rcTXT=' '; - - filein = fopen( "&in", 'S', 1, 'B'); + filein = fopen(in_ref, 'S', 1, 'B'); if filein = 0 then put "ERROR: Source file:" / "ERROR- " in_path / @@ -348,21 +398,23 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo rc = FCLOSE(filein); put; - if FEXIST("&out") = 0 then + if FEXIST(out_ref) = 0 then do; put @2 "Installing the &packageName. package" / @2 "in the &firstPackagesPath. directory."; - rc = FCOPY("&in", "&out"); + rc = FCOPY(in_ref, out_ref); + rcTXT=sysmsg(); end; - else if FEXIST("&out") = 1 then + else if FEXIST(out_ref) = 1 then do; if symgetn("replace")=1 then do; put @2 "The following file will be replaced during " / @2 "installation of the &packageName. package: " / @5 out_path; - rc = FDELETE("&out"); - rc = FCOPY("&in", "&out"); + rc = FDELETE(out_ref); + rc = FCOPY(in_ref, out_ref); + rcTXT=sysmsg(); end; else do; @@ -371,13 +423,41 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo rc = 1; end; end; - - put @2 "Done with return code " rc= "(zero = success)"; + put @2 "Done with return code " rc= "(zero = success)" / rcTXT; call symputX("installationRC", rc, "L"); + + /* try to install documentation file */ + if 1=symgetn("instDoc") then + do; + fileinMD = fopen(in_refMD, 'S', 1, 'B'); + rcMD = FCLOSE(fileinMD); + + if fileinMD then + do; + if 0=FEXIST(out_refMD) then + do; + rcMD = FCOPY(in_refMD, out_refMD); + if rcMD=0 then + put @2 "Package documentation installed on request." ; /* / out_pathMD / in_pathMD; */ + end; + else if 1=FEXIST(out_refMD) and 1=symgetn("replace") then + do; + rcMD = FDELETE(out_refMD); + if rcMD=0 then + rcMD2 = FCOPY(in_refMD, out_refMD); + if rcMD=0 AND rcMD2=0 then + put @2 "Package documentation installed on demand." ; /* / out_pathMD / in_pathMD; */ + end; + end; + else + put @2 "Package documentation in markdown format not available." ; /* / out_pathMD / in_pathMD;*/ + end; run; - filename &in clear; - filename &out clear; + filename &in. clear; + filename &out. clear; + filename &inMD. clear; + filename &outMD. clear; %if 0 = &installationRC. %then %do; diff --git a/SPF/Macros/listpackages.sas b/SPF/Macros/listpackages.sas index 76685bd..94251a9 100644 --- a/SPF/Macros/listpackages.sas +++ b/SPF/Macros/listpackages.sas @@ -3,7 +3,7 @@ Macro to list SAS packages in packages folder. - Version 20241129 + Version 20241207 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -23,7 +23,7 @@ %macro listPackages() /secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241129.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241207.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE %put ### This is short help information for the `listPackages` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list available SAS packages, version `20241129` #; + %put # Macro to list available SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/loadpackage.sas b/SPF/Macros/loadpackage.sas index fd37a96..d7f872d 100644 --- a/SPF/Macros/loadpackage.sas +++ b/SPF/Macros/loadpackage.sas @@ -36,7 +36,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20241129. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20241207. Run %loadPackage() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -52,7 +52,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20241129` #; + %put # Macro to *load* SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/loadpackageaddcnt.sas b/SPF/Macros/loadpackageaddcnt.sas index cc63bf6..f0ee299 100644 --- a/SPF/Macros/loadpackageaddcnt.sas +++ b/SPF/Macros/loadpackageaddcnt.sas @@ -19,7 +19,7 @@ is provided in required version */ )/secure /*** HELP END ***/ -des = 'Macro to load additional content for a SAS package, version 20241129. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20241207. Run %loadPackageAddCnt() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -35,7 +35,7 @@ minoperator %put ### This is short help information for the `loadPackageAddCnt` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* additional content for a SAS package, version `20241129` #; + %put # Macro to *load* additional content for a SAS package, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/loadpackages.sas b/SPF/Macros/loadpackages.sas index 2054dfc..6e3b28d 100644 --- a/SPF/Macros/loadpackages.sas +++ b/SPF/Macros/loadpackages.sas @@ -11,7 +11,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20241129. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20241207. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -27,7 +27,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20241129` #; + %put # Macro wrapper for the loadPackage macro, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/previewpackage.sas b/SPF/Macros/previewpackage.sas index c0ef3cc..e3d06d2 100644 --- a/SPF/Macros/previewpackage.sas +++ b/SPF/Macros/previewpackage.sas @@ -23,7 +23,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20241129. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20241207. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20241129. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20241129` #; + %put # Macro to get preview of a SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/splitcodeforpackage.sas b/SPF/Macros/splitcodeforpackage.sas index 788dd9a..746bd6d 100644 --- a/SPF/Macros/splitcodeforpackage.sas +++ b/SPF/Macros/splitcodeforpackage.sas @@ -8,7 +8,7 @@ ,nobs=0 /* technical parameter */ ) /*** HELP START ***/ -/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20241129. Run %splitCodeForPackage() for help info.' +/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20241207. Run %splitCodeForPackage() for help info.' ; /*%macro _();%mend _;*/ %if (%superq(codeFile) = ) OR (%qupcase(&codeFile.) = HELP) %then @@ -25,7 +25,7 @@ %put #-------------------------------------------------------------------------------#; %put # #; %put # Utility macro to *split* single file with SAS package code into multiple #; - %put # files with separate snippets, version `20241129` #; + %put # files with separate snippets, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -402,7 +402,7 @@ options nomprint nosymbolgen nomlogic notes source ls=MAX ps=MAX msglevel=N ; */ if firstLine[j] then do; - put '/* File generated with help of SAS Packages Framework, version 20241129. */'; + put '/* File generated with help of SAS Packages Framework, version 20241207. */'; firstLine[j]=0; end; put _infile_; diff --git a/SPF/Macros/unloadpackage.sas b/SPF/Macros/unloadpackage.sas index ccff340..69a0b9b 100644 --- a/SPF/Macros/unloadpackage.sas +++ b/SPF/Macros/unloadpackage.sas @@ -20,7 +20,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20241129. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20241207. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20241129. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20241129` #; + %put # Macro to unload SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/verifypackage.sas b/SPF/Macros/verifypackage.sas index f3bd73e..4940d43 100644 --- a/SPF/Macros/verifypackage.sas +++ b/SPF/Macros/verifypackage.sas @@ -13,7 +13,7 @@ hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20241129. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20241207. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20241129. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20241129` #; + %put # Macro to verify SAS package with it hash digest, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/SPFinit.md b/SPF/SPFinit.md index db512d3..d9c293e 100644 --- a/SPF/SPFinit.md +++ b/SPF/SPFinit.md @@ -1,5 +1,11 @@ -- [SAS PAckages Framework help](#helpinfo) +--- + +# SAS Packages Framework, version `20241207` + +--- + +- [SAS Packages Framework help](#helpinfo) * [the `installPackage` macro](#installpackage) * [the `helpPackage` macro](#helppackage) * [the `loadPackage` macro](#loadpackage) @@ -14,115 +20,125 @@ * [the `splitCodeForPackage` macro](#splitcodeforpackage) * [Some more examples](#some-more-examples) ---- +-------------------------------------------------------------------------------------------- ## This is short SAS Packages Framework help information -A **SAS package** is an automatically generated, single, stand alone *zip* file containing organised and ordered code structures, created by the developer and extended with additional automatically generated "driving" files (i.e. description, metadata, load, unload, and help files). +A **SAS package** is an automatically generated, single, stand alone *zip* file containing organised and ordered code structures, created by the developer and extended with additional automatically generated "driving" files (i.e. description, metadata, load, unload, and help files). 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 **`20241129`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20241207`**. **To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). **The documentation and more advance reading** would be the [**`SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/SAS(r)%20packages%20-%20the%20way%20to%20share%20(a%20how%20to)-%20Paper%204725-2020%20-%20extended.pdf "SAS packages - the way to share") article (see the `./SPF/Documentation` directory). - *Note:* Filenames references `packages` and `package` are **reserved keywords.** The first one should be used to point local folder with packages and the framework. The second is used internally by macros. After assigning the directory do not change them when using the SPF since it may affect stability of the framework. + +## Tutorial on SAS Packages and SAS Packages Framework + +"From 0 to hero" tutorial explaining what are SAS Packages, and how to work with +them using the SPF can be found [**HERE**](https://github.com/yabwon/HoW-SASPackages). + -------------------------------------------------------------------------------------------- -## This is short help information for the `installPackage` macro +## This is short help information for the `installPackage` macro -------------------------------------------------------------------------------------------- - - Macro to install SAS packages, version `20241129` - - 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. - - In case the packages fileref is a multi-directory one the first directory - will be selected as a destination. - + + Macro to install SAS packages, version `20241207` + + 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. + + In case the packages fileref is a multi-directory one the first directory + will be selected as a destination. + -------------------------------------------------------------------------------------------- - -### 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://github.com/SASPAC/` - Current default location for the framework is: - `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` - - - `mirror=` Indicates which web location for packages installation is used. - Value `0` indicates: - `https://github.com/SASPAC/` - Value `1` indicates: - `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` - Value `2` indicates: - `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` - Default value is `0`. - - - `version=` Indicates which historical version of a package to install. - Historical version are available only if `mirror=0` is set. - Default value is null which means "install the latest". - When there are multiple packages to install version - is scan sequentially. - - - `replace=` With default value of `1` it causes existing package file - to be replaced by new downloaded file. - - - `URLuser=` A user name for the password protected URLs, no quotes needed. - - - `URLpass=` A password for the password protected URLs, no quotes needed. - - - `URLoptions=` Options for the `sourcePath` URLs filename. Consult the SAS - documentation for the further details. - - - `loadAddCnt=` *Optional.* A package zip may contain additional - content. The option indicates if it should be loaded - Default value of zero (`0`) means "No", one (`1`) - means "Yes". Content is extracted into the **packages** fileref - directory in `_AdditionalContent` folder. - For other locations use `%loadPackageAddCnt()` macro. - - - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the - *success-failure return code* of the installation process. Return value - has the following form: `.` - The macro variable is created as a *global* macro variable. - + +### 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://github.com/SASPAC/` + Current default location for the framework is: + `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` + + - `mirror=` Indicates which web location for packages installation is used. + Value `0` indicates: + `https://github.com/SASPAC/` + Value `1` indicates: + `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` + Value `2` indicates: + `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` + Default value is `0`. + + - `version=` Indicates which historical version of a package to install. + Historical version are available only if `mirror=0` is set. + Default value is null which means "install the latest". + When there are multiple packages to install version + is scan sequentially. + + - `replace=` With default value of `1` it causes existing package file + to be replaced by new downloaded file. + + - `URLuser=` A user name for the password protected URLs, no quotes needed. + + - `URLpass=` A password for the password protected URLs, no quotes needed. + + - `URLoptions=` Options for the `sourcePath` URLs filename. Consult the SAS + documentation for the further details. + + - `loadAddCnt=` *Optional.* A package zip may contain additional + content. The option indicates if it should be loaded + Default value of zero (`0`) means "No", one (`1`) + means "Yes". Content is extracted into the **packages** fileref + directory in `_AdditionalContent` folder. + For other locations use `%loadPackageAddCnt()` macro. + + - `instDoc=` *Optional.* A package may be provided with a markdown file + containing combined documentation of the package. The option + indicates if the `.md` file should be also downloaded. + Default value of zero (`0`) means "No", one (`1`) means "Yes". + + - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the + *success-failure return code* of the installation process. Return value + has the following form: `.` + The macro variable is created as a *global* macro variable. + -------------------------------------------------------------------------------------------- - + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -134,88 +150,88 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Example ################################################################################ - - Enabling the SAS Package Framework - from the local directory and installing & loading - the multiple packages 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: + + Enabling the SAS Package Framework + from the local directory and installing & loading + the multiple packages 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"; -%include packages(SPFinit.sas); +filename packages "C:/SAS_PACKAGES"; +%include packages(SPFinit.sas); %installPackage(baseplus(1.17) macroarray(1.0) dfa(0.5) GSM) %loadPackageS(GSM, baseplus(1.17), macroarray(1.0), dfa(0.5)) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## This is short help information for the `helpPackage` macro +## This is short help information for the `helpPackage` macro ------------------------------------------------------------------------------- - - Macro to get help about SAS packages, version `20241129` - - 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. - + + Macro to get help about SAS packages, version `20241207` + + 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: - `%helpPackage(myPackage).` - If empty displays this help information. - - 2. `helpKeyword` *Optional.* A phrase to search in help, - - when empty prints description, - - "*" means: print 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. `%helpPackage(PiPackage)`. - If the zip is not available use a folder. - Unpack data to "pipackage.disk" folder - and use helpPackage in the following form: - `%helpPackage(PiPackage, , zip=disk, options=)` - - - `packageContentDS=` *Optional.* Indicates if a data set with package - content should be generated in `WORK`, - with default value (`0`) the dataset is not produced, - if set to `1` then `WORK.packageName_content`. - + +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%helpPackage(myPackage).` + If empty displays this help information. + + 2. `helpKeyword` *Optional.* A phrase to search in help, + - when empty prints description, + - "*" means: print 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. `%helpPackage(PiPackage)`. + If the zip is not available use a folder. + Unpack data to "pipackage.disk" folder + and use helpPackage in the following form: + `%helpPackage(PiPackage, , zip=disk, options=)` + + - `packageContentDS=` *Optional.* Indicates if a data set with package + content should be generated in `WORK`, + with default value (`0`) the dataset is not produced, + if set to `1` then `WORK.packageName_content`. + ------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -228,88 +244,88 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; --- -## This is short help information for the `loadPackage` macro +## This is short help information for the `loadPackage` macro ------------------------------------------------------------------------------- - - Macro to *load* SAS packages, version `20241129` - - 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. - + + Macro to *load* SAS packages, version `20241207` + + 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 space separated 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=` *Optional.* 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=)` - - - `cherryPick=` *Optional.* A space separated list of selected elements - of the package to be loaded into the SAS session. - Default value of an asterisk (*) means: - "load all elements of the package". - - - `loadAddCnt=` *Optional.* A package zip may contain additional - content. The option indicates if it should be loaded - Default value of zero (`0`) means "No", one (`1`) - means "Yes". Content is extracted into the **Work** - directory in `_AdditionalContent` folder. - For other locations use `%loadPackageAddCnt()` macro. - - - `suppressExec=` *Optional.* Indicates if loading of `exec` type files - should be suppressed, default value is `0`, - when set to `1` `exec` files are *not* loaded - - - `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages - or threads should overwrite existing SAS data sets. - Default value of `0` means "do not overwrite". - +### 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 space separated 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=` *Optional.* 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=)` + + - `cherryPick=` *Optional.* A space separated list of selected elements + of the package to be loaded into the SAS session. + Default value of an asterisk (*) means: + "load all elements of the package". + + - `loadAddCnt=` *Optional.* A package zip may contain additional + content. The option indicates if it should be loaded + Default value of zero (`0`) means "No", one (`1`) + means "Yes". Content is extracted into the **Work** + directory in `_AdditionalContent` folder. + For other locations use `%loadPackageAddCnt()` macro. + + - `suppressExec=` *Optional.* Indicates if loading of `exec` type files + should be suppressed, default value is `0`, + when set to `1` `exec` files are *not* loaded + + - `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages + or threads should overwrite existing SAS data sets. + Default value of `0` means "do not overwrite". + ------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` + to learn more. + ## Example 1 ################################################################## - - 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: + + 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; @@ -321,15 +337,15 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ## Example 2 ################################################################## - - Enabling the SAS Package Framework - from the local directory and installing & cherry picking - elements of the BasePlus package. - - Assume that the `SPFinit.sas` file - is located in the "C:/SAS_PACKAGES/" folder. - - Run the following code in your SAS session: + + Enabling the SAS Package Framework + from the local directory and installing & cherry picking + elements of the BasePlus package. + + 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; @@ -340,37 +356,37 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## Utility macros generated during loading a package ########################### -If a package contains IML modules or CASL user defined functions additional -utility macros for IML Modules and CASL UDFs are generated when package is loaded. +If a package contains IML modules or CASL user defined functions additional +utility macros for IML Modules and CASL UDFs are generated when package is loaded. -Macros are generated with the following names: `%IML()` and `%CASLudf()`. +Macros are generated with the following names: `%IML()` and `%CASLudf()`. -Their purpose is to make loading of Modules or UDFs (with potentially multiple -dependencies) easy in Proc IML and Proc CAS. +Their purpose is to make loading of Modules or UDFs (with potentially multiple +dependencies) easy in Proc IML and Proc CAS. -Run them, accordingly, as the first line in the Proc IML or Proc CAS to access the package content. +Run them, accordingly, as the first line in the Proc IML or Proc CAS to access the package content. For Proc IML the use is as follows: ~~~~~~sas - proc IML; + proc IML; %IML() - + <... your code using IML modules from the package ...> quit; ~~~~~~ For Proc CAS the use is as follows: ~~~~~~sas - proc CAS; + proc CAS; %CASLudf() - + <... your code using CASL UDFs from the package ...> quit; ~~~~~~ -If a utility macro is generated appropriate note and a code snippet +If a utility macro is generated appropriate note and a code snippet is printed in the log of the package loading process. -In 99% cases macros are used with default parameters values but, -in case when deeper insight about macros parameters is needed, +In 99% cases macros are used with default parameters values but, +in case when deeper insight about macros parameters is needed, help info is printed in the log when the following code is run: ~~~~~~sas %IML(list=HELP) @@ -384,45 +400,45 @@ If created, those macros are automatically deleted when the `%unloadPackage()` m --- -## This is short help information for the `loadPackageS` macro +## This is short help information for the `loadPackageS` macro ------------------------------------------------------------------------------- - - Macro wrapper for the loadPackage macro, version `20241129` - - 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. - - + + Macro wrapper for the loadPackage macro, version `20241207` + + 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/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -433,60 +449,60 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; -## This is short help information for the `unloadPackage` macro +## This is short help information for the `unloadPackage` macro ------------------------------------------------------------------------------- - - Macro to unload SAS packages, version `20241129` - - 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. - + + Macro to unload SAS packages, version `20241207` + + 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: - `%unloadPackage(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. `%unloadPackage(PiPackage)`. - If the zip is not available use a folder. - Unpack data to "pipackage.disk" folder - and use unloadPackage in the following form: - `%unloadPackage(PiPackage, zip=disk, options=)` - + +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%unloadPackage(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. `%unloadPackage(PiPackage)`. + If the zip is not available use a folder. + Unpack data to "pipackage.disk" folder + and use unloadPackage in the following form: + `%unloadPackage(PiPackage, zip=disk, options=)` + ------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -498,39 +514,39 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## This is short help information for the `listPackages` macro +## This is short help information for the `listPackages` macro ----------------------------------------------------------------------------------------- - - Macro to list available SAS packages, version `20241129` - - 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. - + + Macro to list available SAS packages, version `20241207` + + 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/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -539,51 +555,51 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## This is short help information for the `verifyPackage` macro +## This is short help information for the `verifyPackage` macro ------------------------------------------------------------------------------- - - Macro to verify SAS package with it hash digest, version `20241129` - - 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. - Works with `zip` packages only. - - - *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))` - + + Macro to verify SAS package with it hash digest, version `20241207` + + 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. + Works with `zip` packages only. + + + *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/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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: + + 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; @@ -596,7 +612,7 @@ filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages; ## This is short help information for the `previewPackage` macro ------------------------------------------------------------------------------- - Macro to get preview of a SAS packages, version `20241129` + Macro to get preview of a SAS packages, version `20241207` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -660,82 +676,82 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; %previewPackage(SQLinDS) %* get content of the package; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -## This is short help information for the `generatePackage` macro +## This is short help information for the `generatePackage` macro ------------------------------------------------------------------------------- - - Macro to generate SAS packages, version `20241129` - - 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. - + + Macro to generate SAS packages, version `20241207` + + 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/main/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. + + Testing parameters: + + - `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. + Has to be a single directory, if more than one are + provided than only the first is used. + If path to location contains spaces it should be quoted! + + - `testResults=` Location where tests results should be stored, + if null (the default) then the session WORK is used. + + - `sasexe=` Location of a DIRECTORY where the SAS binary is located, + if null (the default) then the `!SASROOT` is used. + + - `sascfgFile=` Location of a FILE with testing session configuration + parameters, if null (the default) then no config file + is pointed during the SAS invocation, + if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. + + - `delTestWork=` Indicates if `WORK` directories generated by user tests + should be deleted, i.e. the (NO)WORKTERM option is set. + The default value: `1` means "delete tests work". + Available values are `0` and `1`. + + - `markdownDoc=` Indicates if a markdown file with documentation + be generated from help information blocks. + The default value: `0` means "do not generate the file". + Available values are `0` and `1`. + + - `easyArch=` When creating documentation file (`markdownDoc=1`) + indicates if a copy of the zip and markdown files + with the version number in the file name be created + The default value: `0` means "do not create files". + Available values are `0` and `1`. + + ------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/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. - - Testing parameters: - - - `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. - Has to be a single directory, if more than one are - provided than only the first is used. - If path to location contains spaces it should be quoted! - - - `testResults=` Location where tests results should be stored, - if null (the default) then the session WORK is used. - - - `sasexe=` Location of a DIRECTORY where the SAS binary is located, - if null (the default) then the `!SASROOT` is used. - - - `sascfgFile=` Location of a FILE with testing session configuration - parameters, if null (the default) then no config file - is pointed during the SAS invocation, - if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. - - - `delTestWork=` Indicates if `WORK` directories generated by user tests - should be deleted, i.e. the (NO)WORKTERM option is set. - The default value: `1` means "delete tests work". - Available values are `0` and `1`. - - - `markdownDoc=` Indicates if a markdown file with documentation - be generated from help information blocks. - The default value: `0` means "do not generate the file". - Available values are `0` and `1`. - - - `easyArch=` When creating documentation file (`markdownDoc=1`) - indicates if a copy of the zip and markdown files - with the version number in the file name be created - The default value: `0` means "do not create files". - Available values are `0` and `1`. - - -------------------------------------------------------------------------------- Locate all files with code in base folder, i.e. at `filesLocation` directory. - -Remember to prepare the `description.sas` file for you package. -The colon (:) is a field separator and is restricted -in lines of the header part. -The file should contain the following obligatory information: --------------------------------------------------------------------------------------------- +Remember to prepare the `description.sas` file for you package. +The colon (:) is a field separator and is restricted +in lines of the header part. +The file should contain the following obligatory information: + +-------------------------------------------------------------------------------------------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas /*>> **HEADER** <<*/ Type: Package @@ -747,7 +763,7 @@ Maintainer: Firstname Lastname (xxxxxx@yyyyy.com) License: MIT Encoding: UTF8 -Required: "Base SAS Software" :%*optional, COMMA separated, QUOTED list, names of required SAS products, values must be like from proc setinit;run; output *; +Required: "Base SAS Software" :%*optional, COMMA separated, QUOTED list, names of required SAS products, values must be like from "proc setinit" output *; ReqPackages: "macroArray (0.1)", "DFA (0.1)" :%*optional, COMMA separated, QUOTED list, names of required packages *; /*>> **DESCRIPTION** <<*/ @@ -765,7 +781,7 @@ Name of the `type` of folder and `files.sas` inside must be in the _low_ case le If order of loading is important, the sequential number can be used to order multiple types in the way you wish. -If folder name starts with `!` (e.g., `!ignore_me`) or *type* of the folder is "unknown" (e.g., not supported one) +If folder name starts with `!` (e.g., `!ignore_me`) or *type* of the folder is "unknown" (e.g., not supported one) the content of such folder is ignored during package generation process. The "tree structure" of the folder could be for example as follows: @@ -787,7 +803,7 @@ All files have to have `.sas` extension. Other files are ignored. | +-klm.sas [a file with a code creating macro KLM] | +-002_function [one file one function, - | | option OUTLIB= should be: work.&packageName.fcmp.package + | | option OUTLIB= should be: work.&packageName.fcmp.package | | option INLIB= should be: work.&packageName.fcmp | | (both literally with macrovariable name and "fcmp" sufix)] | | @@ -799,24 +815,24 @@ All files have to have `.sas` extension. Other files are ignored. | +-ijk.sas [a file with a code creating function EFG, _without_ "Proc FCMP" header] | +-004_format [one file one format, - | | option LIB= should be: work.&packageName.format + | | option LIB= should be: work.&packageName.format | | (literally with macrovariable name and "format" suffix)] | | | +-efg.sas [a file with a code creating format EFG and informat EFG] | +-005_data [one file one dataset] | | - | +-abc.efg.sas [a file with a code creating dataset EFG in library ABC] + | +-abc.efg.sas [a file with a code creating dataset EFG in library ABC] | - +-006_exec [so called "free code", content of the files will be printed + +-006_exec [so called "free code", content of the files will be printed | | to the log before execution] | | | +- | - +-007_format [if your codes depend each other you can order them in folders, + +-007_format [if your codes depend each other you can order them in folders, | | e.g. code from 003_... will be executed before 006_...] | | - | +-abc.sas [a file with a code creating format ABC, + | +-abc.sas [a file with a code creating format ABC, | used in the definition of the format EFG] +-008_function | | @@ -829,7 +845,7 @@ All files have to have `.sas` extension. Other files are ignored. | it will be created only if user request it by using: | %loadPackage(packagename, lazyData=klm) | multiple elements separated by space are allowed - | an asterisk(*) means "load all data"] + | an asterisk("*") means "load all data"] | +-010_imlmodule [one file one IML module, | | only plain code of the module, without "Proc IML" header] @@ -855,7 +871,7 @@ All files have to have `.sas` extension. Other files are ignored. | +-... | - +-998_addcnt [additional content for the package, can be only one!, content of this + +-998_addcnt [additional content for the package, can be only one!, content of this | | directory is copied "as is"] | | | +-arbitrary_file1 [an arbitrary file ] @@ -875,20 +891,20 @@ All files have to have `.sas` extension. Other files are ignored. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -------------------------------------------------------------------------------------------- -## This is short help information for the `extendPackagesFileref` macro +## This is short help information for the `extendPackagesFileref` macro ----------------------------------------------------------------------------------------- - Macro to list directories pointed by 'packages' fileref, version `20241129` - - 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 `%extendPackagesFileref()` macro lists directories pointed by - the packages fileref. It allows to add new dierctories to packages folder list. - -### Parameters: - + Macro to list directories pointed by 'packages' fileref, version `20241207` + + 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 `%extendPackagesFileref()` macro lists directories pointed by + the packages fileref. It allows to add new dierctories to packages folder list. + +### Parameters: + 1. `packages` *Optional.* A valid fileref name, when empty the "packages" is used When used as: `%extendPackagesFileref(HELP)` it displays this help information. @@ -899,158 +915,158 @@ All files have to have `.sas` extension. Other files are ignored. ### Example ################################################################### - Enabling the SAS Package Framework - from the local directory and adding - new directory. - - Assume that the `SPFinit.sas` file - is located in one of "C:/SAS_PK1" or "C:/SAS_PK2" folders. - - Run the following code in your SAS session: + Enabling the SAS Package Framework + from the local directory and adding + new directory. + + Assume that the `SPFinit.sas` file + is located in one of "C:/SAS_PK1" or "C:/SAS_PK2" folders. + + Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas filename packages ("C:/SAS_PK1" "C:/SAS_PK2"); %* setup a directory for packages; -%include packages(SPFinit.sas); %* enable the framework; +%include packages(SPFinit.sas); %* enable the framework; filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ----------------------------------------------------------------------------------------- -## This is short help information for the `loadPackageAddCnt` macro +## This is short help information for the `loadPackageAddCnt` macro ------------------------------------------------------------------------------- - - Macro to load *additional content* for a SAS package, version `20241129` - - 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 `%loadPackageAddCnt()` macro loads additional content - for a package (of course only if one is provided). - + + Macro to load *additional content* for a SAS package, version `20241207` + + 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 `%loadPackageAddCnt()` macro loads additional content + for a package (of course only if one is provided). + ------------------------------------------------------------------------------- -### Parameters: - - 1. `packageName` *Required.* Name of a package, e.g. myPackage, - Required and not null, default use case: - `%loadPackageAddCnt(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))` - - - `target=` *Optional.* Location where the directory with - additional content will be generated, - name of the directory created is set to - `_AdditionalContent`, the default - location is `%sysfunc(pathname(WORK))` - - - `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: `.` - - -------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` - to learn more. +### Parameters: + + 1. `packageName` *Required.* Name of a package, e.g. myPackage, + Required and not null, default use case: + `%loadPackageAddCnt(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))` + + - `target=` *Optional.* Location where the directory with + additional content will be generated, + name of the directory created is set to + `_AdditionalContent`, the default + location is `%sysfunc(pathname(WORK))` + + - `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: `.` + ------------------------------------------------------------------------------- - By *default* additional content is not deployed automatically e.g., - from security point of view, or production job doesn't need it to run, etc. + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` + to learn more. + +------------------------------------------------------------------------------- + + By *default* additional content is not deployed automatically e.g., + from security point of view, or production job doesn't need it to run, etc. But if there is a need for it there are three ways to get it: - - The first one ("by-the-book"), and also the recommended one. The additional - content is extracted during the automatic installation process using the - `\%installPackage()` macro. For this to work the `loadAddCnt=` parameter - has to be set to `1`. The additional content is extracted to the - `_AdditionalContent` directory into the same location where + - The first one ("by-the-book"), and also the recommended one. The additional + content is extracted during the automatic installation process using the + `\%installPackage()` macro. For this to work the `loadAddCnt=` parameter + has to be set to `1`. The additional content is extracted to the + `_AdditionalContent` directory into the same location where the package is installed i.e., inside `packages` fileref location. - - The second one ("by-the-work"), when the additional content is extracted - during the loading process with the `\%loadPackage()` macro. For this to - work also the `loadAddCnt=` parameter has to be set to `1`. The additional - content is extracted to the `_AdditionalContent` directory + - The second one ("by-the-work"), when the additional content is extracted + during the loading process with the `\%loadPackage()` macro. For this to + work also the `loadAddCnt=` parameter has to be set to `1`. The additional + content is extracted to the `_AdditionalContent` directory inside the `Work` library location. - - The third one ("by-the-user"), when the additional content is extracted - with dedicated `%loadPackageAddCnt()` macro. By default the additional - content is extracted to the `_AdditionalContent` directory - inside the `Work` library location too, but it can be altered by changing + - The third one ("by-the-user"), when the additional content is extracted + with dedicated `%loadPackageAddCnt()` macro. By default the additional + content is extracted to the `_AdditionalContent` directory + inside the `Work` library location too, but it can be altered by changing the `target=` parameter, which indicates the location. - If done "by-the-book", or "by-the-user" with `target=` parameter, the - additional content is not automatically deleted when SAS session ends, + If done "by-the-book", or "by-the-user" with `target=` parameter, the + additional content is not automatically deleted when SAS session ends, in this case the "additionals" have to be deleted manually by the User. - + ### Example 1 ################################################################## - - Enabling the SAS Package Framework - from the local directory and installing & loading additional content - for the SQLinDS package. - - Assume that the `SPFinit.sas` file - is located in the "C:/SAS_PACKAGES/" folder. - - Run the following code in your SAS session: + + Enabling the SAS Package Framework + from the local directory and installing & loading additional content + for the SQLinDS package. + + Assume that the `SPFinit.sas` file + is located in the "C:/SAS_PACKAGES/" folder. + + Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; -%include packages(SPFinit.sas); %* enable the framework; +%include packages(SPFinit.sas); %* enable the framework; -%installPackage(SQLinDS) %* install the package from the Internet; +%installPackage(SQLinDS) %* install the package from the Internet; %loadPackageAddCnt(SQLinDS) %* load additional content for the package; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ------------------------------------------------------------------------------------------ - -## This is short help information for the `splitCodeForPackage` macro +----------------------------------------------------------------------------------------- + +## This is short help information for the `splitCodeForPackage` macro ------------------------------------------------------------------------------- - - Utility macro to *split* single file with SAS package code into multiple - files with separate snippets, version `20241129` - - 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 `%splitCodeForPackage()` macro takes a file with SAS code - snippets surrounded by `/*##$##-code-block-start-##$## */` and - `/*##$##-code-block-end-##$## */` tags and split that file into - multiple files and directories according to a tag specification. - - The `` is a list of pairs of the form: `type(object)` that - indicates how the file should be split. See example 1 below for details. - + + Utility macro to *split* single file with SAS package code into multiple + files with separate snippets, version `20241207` + + 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 `%splitCodeForPackage()` macro takes a file with SAS code + snippets surrounded by `/*##$##-code-block-start-##$## */` and + `/*##$##-code-block-end-##$## */` tags and split that file into + multiple files and directories according to a tag specification. + + The `` is a list of pairs of the form: `type(object)` that + indicates how the file should be split. See example 1 below for details. + ------------------------------------------------------------------------------- -### Parameters: - - 1. `codeFile=` *Required.* Name of a file containing code - that will be split. Required and not null. - If empty displays this help information. - - - `packagePath=` *Required.* Location for package files after - splitting into separate files and directories. - If missing or not exist then `WORK` is uded. - - - `debug=` *Optional.* Turns on code printing for debugging. - - - `nobs=` *Optional.* Technical parameter with value `0`. - Do not change. - +### Parameters: + + 1. `codeFile=` *Required.* Name of a file containing code + that will be split. Required and not null. + If empty displays this help information. + + - `packagePath=` *Required.* Location for package files after + splitting into separate files and directories. + If missing or not exist then `WORK` is uded. + + - `debug=` *Optional.* Turns on code printing for debugging. + + - `nobs=` *Optional.* Technical parameter with value `0`. + Do not change. + ------------------------------------------------------------------------------- - - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` - to learn more. - + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` + to learn more. + ### Example 1 ################################################################## - - Assume that the `myPackageCode.sas` file - is located in the `C:/lazy/` folder and - contain the following code and tags: + + Assume that the `myPackageCode.sas` file + is located in the `C:/lazy/` folder and + contain the following code and tags: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas /*##$##-code-block-start-##$## 01_macro(abc) */ @@ -1074,9 +1090,9 @@ endfunc; quit; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - and we want results in `C:/split/` folder, we run the following: - + + and we want results in `C:/split/` folder, we run the following: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; %include packages(SPFinit.sas); %* enable the framework; @@ -1085,23 +1101,24 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; codeFile=C:/lazy/myPackageCode.sas ,packagePath=C:/split/ ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - - + + +------------------------------------------------------------------------------- +------------------------------------------------------------------------------- ------------------------------------------------------------------------------- ## Some more examples ############################################################# ### Example 1. ################################################################### -Enabling the SAS Package Framework +Enabling the SAS Package Framework and loading the SQLinDS package from the local directory. -Assume that the `SPFinit.sas` file and the SQLinDS -package (sqlinds.zip file) are located in +Assume that the `SPFinit.sas` file and the SQLinDS +package (sqlinds.zip file) are located in the "C:/SAS_PACKAGES/" folder. Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas - filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; + filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; %include packages(SPFinit.sas); %* enable the framework; %helpPackage(SQLinDS) %* get help about the package; @@ -1110,7 +1127,7 @@ Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Example 2. ################################################################### -Enabling the SAS Package Framework +Enabling the SAS Package Framework from the local directory and installing & loading the SQLinDS package from the Internet. @@ -1119,7 +1136,7 @@ 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; + 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; @@ -1129,14 +1146,14 @@ Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ### Example 3. ################################################################### -Enabling the SAS Package Framework -and installing & loading the SQLinDS package +Enabling the SAS Package Framework +and installing & loading the SQLinDS package from the Internet. Run the following code in your SAS session: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas filename packages "%sysfunc(pathname(work))"; %* setup WORK as a temporary directory for packages; - + filename spfinit url "https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPFinit.sas"; %include spfinit; %* enable the framework; @@ -1146,7 +1163,7 @@ Run the following code in your SAS session: %unloadPackage(SQLinDS) %* unload the package content from the SAS session; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -### Example 4. ################################################################### +### Example 4. ################################################################### Assume that the `SPFinit.sas` file and the SQLinDS package (`sqlinds.zip` file) are located in the "C:/SAS_PACKAGES/" folder. @@ -1158,17 +1175,17 @@ and run macros with the following options: ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas %loadPackage(packageName,zip=disk,options=) %helpPackage(packageName,,zip=disk,options=) %* mind the double comma!! ; - %unloadPackage(packageName,zip=disk,options=) + %unloadPackage(packageName,zip=disk,options=) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -### Example 5. ################################################################### +### Example 5. ################################################################### Enabling the SAS Package Framework from the local directory and installing the SQLinDS package from the Internet. -Assume that the `SPFinit.sas` file is located in +Assume that the `SPFinit.sas` file is located in the "C:/SAS_PACKAGES/" folder. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas - filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; + filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; %include packages(SPFinit.sas); %* enable the framework; %installPackage(SQLinDS); %* install package; @@ -1176,7 +1193,6 @@ the "C:/SAS_PACKAGES/" folder. %installPackage(SQLinDS,replace=0); %* prevent overwrite installed package; %installPackage(NotExistingPackage); %* handling with not existing package; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ------------------------------------------------------------------------------- diff --git a/SPF/SPFinit.sas b/SPF/SPFinit.sas index 187e633..b2d9de3 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20241129. + Version 20241207. See examples below. A SAS package is a zip file containing a group of files @@ -91,7 +91,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20241129. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20241207. Run %loadPackage() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -107,7 +107,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20241129` #; + %put # Macro to *load* SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -382,7 +382,7 @@ minoperator */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20241129. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20241207. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -397,7 +397,7 @@ des = 'Macro to unload SAS package, version 20241129. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20241129` #; + %put # Macro to unload SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -548,7 +548,7 @@ des = 'Macro to unload SAS package, version 20241129. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20241129. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20241207. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -563,7 +563,7 @@ des = 'Macro to get help about SAS package, version 20241129. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20241129` #; + %put # Macro to get help about SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -704,7 +704,7 @@ TODO: */ /*+installPackage+*/ -/* Macros to install SAS packages, version 20241129 */ +/* Macros to install SAS packages, version 20241207 */ /* 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 @@ -723,12 +723,14 @@ TODO: , URLoptions = /* options for the `sourcePath` URLs */ , loadAddCnt=0 /* should the additional content be loaded? default is 0 - means No, 1 means Yes */ +, instDoc=0 /* should the markdown file with documentation be installed? + default is 0 - means No, 1 means Yes */ , SFRCVN = /* name of a macro variable to store success-failure return code value */ ) /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20241129. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20241207. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -743,7 +745,7 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20241129` #; + %put # Macro to install SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -807,6 +809,11 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put # directory in `_AdditionalContent` folder. #; %put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #; %put # #; + %put # - `instDoc=` *Optional.* A package may be provided with a markdown file #; + %put # containing combined documentation of the package. The option #; + %put # indicates if the `.md` file should be also downloaded. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; %put # - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the #; %put # *success-failure return code* of the installation process. Return value #; %put # has the following form: `.` #; @@ -887,30 +894,39 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo call symputX("firstPackagesPath", pathname("packages"), "L"); run; + %let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt))); + %let instDoc = %sysevalf(NOT(0=%superq(instDoc))); + + %let replace = %sysevalf(1=%superq(replace)); + %if %superq(sourcePath)= %then %do; - %local SPFinitMirror; + %local SPFinitMirror SPFinitMirrorMD; /* the defaults are: */ - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; %if 0 = %superq(mirror) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://github.com/SASPAC/; /*usercontent*/ %goto mirrorEnd; %end; %if 1 = %superq(mirror) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.md; %let sourcePath = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/packages/; %goto mirrorEnd; %end; %if 2 = %superq(mirror) %then %do; - %let SPFinitMirror = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.sas; + %let SPFinitMirror = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/SPF/SPFinit.md; %let sourcePath = https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES/packages/; %goto mirrorEnd; %end; @@ -920,7 +936,8 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %else %do; %let mirror=-1; - %let SPFinitMirror = &sourcePath.SPFinit.sas; + %let SPFinitMirror = &sourcePath.SPFinit.sas; + %let SPFinitMirrorMD = &sourcePath.SPFinit.md; %end; %local i str; @@ -967,10 +984,13 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put ### &packageName.(&vers.) ###; %put *** %lowcase(&packageName.) start *****************************************; - %local in out _IOFileref_; + %local in out inMD outMD _IOFileref_; data _null_; call symputX("_IOFileref_", put(MD5("%lowcase(&packageName.)"), hex7. -L), "L"); run; %let in = i&_IOFileref_.; %let out = o&_IOFileref_.; + %let inMD = j&_IOFileref_.; + %let outMD = u&_IOFileref_.; + /* %let in = i%sysfunc(md5(&packageName.),hex7.); */ /* %let out = o%sysfunc(md5(&packageName.),hex7.); */ @@ -980,17 +1000,27 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo /* allows to install/download the framework file like any other package */ %if %superq(mirror) in (0 1) AND (%superq(vers) ne) %then %do; - %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; + %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; + %let SPFinitMirrorMD = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.md; %end; %if %superq(mirror) > 1 %then %put %str( )Mirror %superq(mirror) does not support versioning.; - filename &in URL + /* source code file */ + filename &in. URL "&SPFinitMirror." recfm=N lrecl=1; - filename &out + filename &out. "&firstPackagesPath./SPFinit.sas" recfm=N lrecl=1; + + /* documentation MD file */ + filename &inMD. URL + "&SPFinitMirrorMD." + recfm=N lrecl=1; + filename &outMD. + "&firstPackagesPath./SPFinit.md" + recfm=N lrecl=1; %end; %else %do; @@ -1010,7 +1040,8 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %put %str( )Mirror %superq(mirror) does not support versioning.; %end; - filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" + /* zip */ + filename &in. URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" %if (%superq(URLuser) ne ) %then %do; user = "&URLuser." @@ -1018,7 +1049,17 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %end; &URLoptions. recfm=N lrecl=1; - filename &out "&firstPackagesPath./%lowcase(&packageName.).zip" recfm=N lrecl=1; + filename &out. "&firstPackagesPath./%lowcase(&packageName.).zip" recfm=N lrecl=1; + /* markdown */ + filename &inMD. URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).md" + %if (%superq(URLuser) ne ) %then + %do; + user = "&URLuser." + pass = "&URLuser." + %end; + &URLoptions. + recfm=N lrecl=1; + filename &outMD. "&firstPackagesPath./%lowcase(&packageName.).md" recfm=N lrecl=1; %end; /* filename in list; @@ -1028,12 +1069,21 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %local installationRC; %let installationRC=1; data _null_; - length filein 8 out_path in_path $ 4096; + length filein fileinMD 8 + out_path in_path out_pathMD in_pathMD rcTXT $ 4096 + out_ref in_ref out_refMD in_refMD $ 8 + ; out_path = pathname ("&out"); in_path = pathname ("&in" ); + out_pathMD = pathname ("&outMD"); + in_pathMD = pathname ("&inMD" ); + out_ref = symget ("out"); + in_ref = symget ("in" ); + out_refMD = symget ("outMD"); + in_refMD = symget ("inMD" ); + rcTXT=' '; - - filein = fopen( "&in", 'S', 1, 'B'); + filein = fopen(in_ref, 'S', 1, 'B'); if filein = 0 then put "ERROR: Source file:" / "ERROR- " in_path / @@ -1053,21 +1103,23 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo rc = FCLOSE(filein); put; - if FEXIST("&out") = 0 then + if FEXIST(out_ref) = 0 then do; put @2 "Installing the &packageName. package" / @2 "in the &firstPackagesPath. directory."; - rc = FCOPY("&in", "&out"); + rc = FCOPY(in_ref, out_ref); + rcTXT=sysmsg(); end; - else if FEXIST("&out") = 1 then + else if FEXIST(out_ref) = 1 then do; if symgetn("replace")=1 then do; put @2 "The following file will be replaced during " / @2 "installation of the &packageName. package: " / @5 out_path; - rc = FDELETE("&out"); - rc = FCOPY("&in", "&out"); + rc = FDELETE(out_ref); + rc = FCOPY(in_ref, out_ref); + rcTXT=sysmsg(); end; else do; @@ -1076,13 +1128,41 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo rc = 1; end; end; - - put @2 "Done with return code " rc= "(zero = success)"; + put @2 "Done with return code " rc= "(zero = success)" / rcTXT; call symputX("installationRC", rc, "L"); + + /* try to install documentation file */ + if 1=symgetn("instDoc") then + do; + fileinMD = fopen(in_refMD, 'S', 1, 'B'); + rcMD = FCLOSE(fileinMD); + + if fileinMD then + do; + if 0=FEXIST(out_refMD) then + do; + rcMD = FCOPY(in_refMD, out_refMD); + if rcMD=0 then + put @2 "Package documentation installed on request." ; /* / out_pathMD / in_pathMD; */ + end; + else if 1=FEXIST(out_refMD) and 1=symgetn("replace") then + do; + rcMD = FDELETE(out_refMD); + if rcMD=0 then + rcMD2 = FCOPY(in_refMD, out_refMD); + if rcMD=0 AND rcMD2=0 then + put @2 "Package documentation installed on demand." ; /* / out_pathMD / in_pathMD; */ + end; + end; + else + put @2 "Package documentation in markdown format not available." ; /* / out_pathMD / in_pathMD;*/ + end; run; - filename &in clear; - filename &out clear; + filename &in. clear; + filename &out. clear; + filename &inMD. clear; + filename &outMD. clear; %if 0 = &installationRC. %then %do; @@ -1276,7 +1356,7 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo Macro to list SAS packages in packages folder. - Version 20241129 + Version 20241207 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1296,7 +1376,7 @@ des = 'Macro to install SAS package, version 20241129. Run %%installPackage() fo %macro listPackages() /secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241129.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241207.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -1311,7 +1391,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE %put ### This is short help information for the `listPackages` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list available SAS packages, version `20241129` #; + %put # Macro to list available SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1462,7 +1542,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; Macro to generate SAS packages. - Version 20241129 + Version 20241207 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1502,7 +1582,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; file name be created */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20241129. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20241207. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1517,7 +1597,7 @@ des = 'Macro to generate SAS packages, version 20241129. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20241129` #; + %put # Macro to generate SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1893,7 +1973,7 @@ Maintainer: Firstname Lastname (xxxxxx@yyyyy.com) License: MIT Encoding: UTF8 -Required: "Base SAS Software" :%*optional, COMMA separated, QUOTED list, names of required SAS products, values must be like from proc setinit;run; output *; +Required: "Base SAS Software" :%*optional, COMMA separated, QUOTED list, names of required SAS products, values must be like from "proc setinit" output *; ReqPackages: "macroArray (0.1)", "DFA (0.1)" :%*optional, COMMA separated, QUOTED list, names of required packages *; >> **DESCRIPTION** << @@ -1969,7 +2049,7 @@ DESCRIPTION END: | it will be created only if user request it by using: | %loadPackage(packagename, lazyData=klm) | multiple elements separated by space are allowed - | an asterisk(*) means "load all data"] + | an asterisk("*") means "load all data"] | +-010_imlmodule [one file one IML module, | | only plain code of the module, without "Proc IML" header] @@ -2330,7 +2410,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ %end; -footnote1 "SAS Packages Framework, version 20241129"; +footnote1 "SAS Packages Framework, version 20241207"; proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent) @@ -3155,7 +3235,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / - ' !! '' %put with the SAS Packages Framework version 20241129.;''' / + ' !! '' %put with the SAS Packages Framework version 20241207.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -3320,7 +3400,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / - ''' %put with the SAS Packages Framework version 20241129.; '' !! ' / + ''' %put with the SAS Packages Framework version 20241207.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -4127,7 +4207,7 @@ data _null_; %end; put 'put " " / @3 "--------------------------------------------------------------------" / " ";' - / 'put @3 "*SAS package generated by SAS Package Framework, version `20241129`*";' + / 'put @3 "*SAS package generated by SAS Package Framework, version `20241207`*";' / 'put " " / @3 "--------------------------------------------------------------------";'; put 'run; ' /; @@ -5165,7 +5245,7 @@ data &filesWithCodes.markdown; %end; put " " / "--------------------------------------------------------------------" / " " - / "*SAS package generated by SAS Package Framework, version `20241129`*" + / "*SAS package generated by SAS Package Framework, version `20241207`*" / " " / "--------------------------------------------------------------------" / " "; put "# The `&packageName.` package content"; @@ -5443,7 +5523,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20241129. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20241207. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -5459,7 +5539,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20241129` #; + %put # Macro wrapper for the loadPackage macro, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5556,7 +5636,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20241129. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20241207. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -5571,7 +5651,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20241129. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20241129` #; + %put # Macro to verify SAS package with it hash digest, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5751,7 +5831,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20241129. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20241129. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20241207. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -5766,7 +5846,7 @@ des = 'Macro to preview content of a SAS package, version 20241129. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20241129` #; + %put # Macro to get preview of a SAS packages, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5896,7 +5976,7 @@ des = 'Macro to preview content of a SAS package, version 20241129. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20241129. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20241207. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -5912,7 +5992,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20241129 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20241129` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5946,7 +6026,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20241129 %put # Run the following code in your SAS session: #; %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas; %put %nrstr( filename packages ("C:/SAS_PK1" "C:/SAS_PK2"); %%* setup a directory for packages; ); - %put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; ); + %put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; ); %put ; %put %nrstr( filename packages ("D:/NEW_DIR" %%extendPackagesFileref()); %%* add new directory; ); %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; @@ -6013,7 +6093,7 @@ filename packages list; is provided in required version */ )/secure /*** HELP END ***/ -des = 'Macro to load additional content for a SAS package, version 20241129. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20241207. Run %loadPackageAddCnt() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -6029,7 +6109,7 @@ minoperator %put ### This is short help information for the `loadPackageAddCnt` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* additional content for a SAS package, version `20241129` #; + %put # Macro to *load* additional content for a SAS package, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6387,7 +6467,7 @@ minoperator ,nobs=0 /* technical parameter */ ) /*** HELP START ***/ -/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20241129. Run %splitCodeForPackage() for help info.' +/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20241207. Run %splitCodeForPackage() for help info.' ; /*%macro _();%mend _;*/ %if (%superq(codeFile) = ) OR (%qupcase(&codeFile.) = HELP) %then @@ -6404,7 +6484,7 @@ minoperator %put #-------------------------------------------------------------------------------#; %put # #; %put # Utility macro to *split* single file with SAS package code into multiple #; - %put # files with separate snippets, version `20241129` #; + %put # files with separate snippets, version `20241207` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6781,7 +6861,7 @@ options nomprint nosymbolgen nomlogic notes source ls=MAX ps=MAX msglevel=N ; */ if firstLine[j] then do; - put '/* File generated with help of SAS Packages Framework, version 20241129. */'; + put '/* File generated with help of SAS Packages Framework, version 20241207. */'; firstLine[j]=0; end; put _infile_;