From 8b5b1d18dc75f251ef2978f0ee4d0d15ff027fbc Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Wed, 3 Jun 2026 00:46:45 +0200 Subject: [PATCH] SAS Packages Framework, version `20260602` SAS Packages Framework, version `20260602` Changes: - New macro: `%requestPackage()`; - Error fix for `githubRepo=` selection in the `%installPackage()` macro; - check for already loaded packages added to the `%loadPackage()` macro to avoid unnecessary re-loading; - update in `CMPLIB` cleaning for the `%unloadPacjkage()` macro. --- README.md | 34 +- ...(a how to)- Paper 4725-2020 - extended.pdf | Bin 356626 -> 359140 bytes SPF/Macros/bundlePackages.sas | 4 +- SPF/Macros/extendpackagesfileref.sas | 4 +- SPF/Macros/generatepackage.sas | 14 +- SPF/Macros/helppackage.sas | 4 +- SPF/Macros/installpackage.sas | 36 +- SPF/Macros/ispackagesfilerefok.sas | 4 +- SPF/Macros/listpackages.sas | 6 +- SPF/Macros/loadpackage.sas | 95 ++- SPF/Macros/loadpackageaddcnt.sas | 4 +- SPF/Macros/loadpackages.sas | 4 +- SPF/Macros/previewpackage.sas | 4 +- SPF/Macros/relocatepackage.sas | 4 +- SPF/Macros/requestPackage.sas | 455 ++++++++++++ SPF/Macros/saspackagesframeworknotes.sas | 4 +- SPF/Macros/spfinit_intrnl_forcev7dsname.sas | 7 +- SPF/Macros/spfint_gnpckg_arch.sas | 2 +- SPF/Macros/spfint_gnpckg_markdown.sas | 4 +- SPF/Macros/spfint_gnpckg_tests.sas | 2 +- SPF/Macros/splitcodeforpackage.sas | 6 +- SPF/Macros/unbundlePackages.sas | 4 +- SPF/Macros/unloadpackage.sas | 7 +- SPF/Macros/verifypackage.sas | 4 +- SPF/SPFinit.md | 205 +++++- SPF/SPFinit.sas | 678 +++++++++++++++--- 26 files changed, 1386 insertions(+), 209 deletions(-) create mode 100644 SPF/Macros/requestPackage.sas diff --git a/README.md b/README.md index 2a8c06a..3194fbc 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Don't forget to give the repository a **STAR** and become [stargazer](https://gi ### Current version: -**The latest version** of the **SAS Packages Framework** is **`20260515**. +**The latest version** of the **SAS Packages Framework** is **`20260602**. --- @@ -197,35 +197,37 @@ The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS --- ### Updates worth mentioning: -**Update**\[April 9th, 2026\]**:**Packages can be installed from private repositories. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20260409 "bundling macros"))**. +**Update**\[June 2nd, 2026\]**:** `%requestPackage()` utility macros is available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20260602 "Request Package")). -**Update**\[December 31st, 2025\]**:** `%bundlePackages()` and `%unbundlePackages()` **macros are available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20251231 "bundling macros"))**. +**Update**\[April 9th, 2026\]**:** Packages can be installed from private repositories. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20260409 "Private Repos")). -**Update**\[December 28th, 2025\]**:** `buildLocation=` and `archLocation=` **parameters added to** `%generatePackage()` **macro, they allow to redirect results of the packages generation process. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20251228 "redirect results with buildLocation="))**. +**Update**\[December 31st, 2025\]**:** `%bundlePackages()` and `%unbundlePackages()` macros are available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20251231 "Bundling Packages")). -**Update**\[December 21st, 2025\]**:** `%relocatePackage()`, `%SasPackagesFrameworkNotes()`, and `%isPackagesFilerefOK()` **utility macros are available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241221 "relocatePackage, SasPackagesFrameworkNotes, and isPackagesFilerefOK macros"))**. +**Update**\[December 28th, 2025\]**:** `buildLocation=` and `archLocation=` parameters added to `%generatePackage()` macro, they allow to redirect results of the packages generation process. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20251228 "Redirect Results")). -**Update**\[October 27th, 2024\]**:** `%splitCodeForPackage()` **utility macro is available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241027 "splitCodeForPackage"))**. +**Update**\[December 21st, 2025\]**:** `%relocatePackage()`, `%SasPackagesFrameworkNotes()`, and `%isPackagesFilerefOK()` utility macros are available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241221 "relocatePackage, SasPackagesFrameworkNotes, and isPackagesFilerefOK macros")). -**Update**\[October 14th, 2024\]**:** `DS2PCK` and `DS2THR` **types for `PROC DS2` *threads* and *packages* added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241014 "PROC DS2"))**. +**Update**\[October 27th, 2024\]**:** `%splitCodeForPackage()` utility macro is available. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241027 "splitCodeForPackage")). -**Update**\[December 10th, 2023\]**:** `markdownDoc=` **parameter added to** `%generatePackage()` **macro, it allows to generate markdown file with documentation. Content is taken from the help information notes and the description. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231210 "markdown documentation"))**. +**Update**\[October 14th, 2024\]**:** `DS2PCK` and `DS2THR` types for `PROC DS2` *threads* and *packages* added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241014 "PROC DS2")). -**Update**\[November 11th, 2023\]**:** `KMFSNIP` **type for *key macro abbreviations* snippets added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231111 "KMF-abbreviations"))**. +**Update**\[December 10th, 2023\]**:** `markdownDoc=` parameter added to `%generatePackage()` macro, it allows to generate markdown file with documentation. Content is taken from the help information notes and the description. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231210 "Markdown Documentation")). -**Update**\[February 7th, 2023\]**:** `ADDCNT` **type for *additional content* feature and ** `%loadPackageAddCnt()` **macro added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20230207 "Additional Content"))**. +**Update**\[November 11th, 2023\]**:** `KMFSNIP` type for *key macro abbreviations* snippets added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231111 "KMF-abbreviations")). -**Update**\[December 12th, 2022\]**:** `CASLUDF` **type for CASL user defined functions added to the framework. Utility macros for for loading content in proc IML and proc CAS added. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221212 "New Type and Utility macros"))**. +**Update**\[February 7th, 2023\]**:** `ADDCNT` type for *additional content* feature and `%loadPackageAddCnt()` macro added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20230207 "Additional Content")). -**Update**\[November 21st, 2022\]**:** `%loadPackage()` **macro allows Cherry Picking of content (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221121 "Cherry Picking"))**. +**Update**\[December 12th, 2022\]**:** `CASLUDF` type for CASL user defined functions added to the framework. Utility macros for for loading content in proc IML and proc CAS added. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221212 "New Type and Utility macros")). -**Update**\[September 30th, 2022\]**:** **New dedicated repository:** *SASPAC - the SAS Packages Archive* **is available as new location for packages storage**. Location of SASPAC is: [`https://github.com/SASPAC`](https://github.com/SASPAC) +**Update**\[November 21st, 2022\]**:** `%loadPackage()` macro allows Cherry Picking of content (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221121 "Cherry Picking")). -**Update**\[November 11th, 2021\]**:** `%extendPackagesFileref()` **macro is available**. +**Update**\[September 30th, 2022\]**:** New dedicated repository: *SASPAC - the SAS Packages Archive* is available as new location for packages storage. Location of SASPAC is: [`https://github.com/SASPAC`](https://github.com/SASPAC) -**Update**\[October 15th, 2020\]**:** `%previewPackage()` **macro is available**. +**Update**\[November 11th, 2021\]**:** `%extendPackagesFileref()` macro is available. -**Update**\[September 11th, 2020\]**:** ` %loadPackageS()` and `%verifyPackage()` **macros are available**. +**Update**\[October 15th, 2020\]**:** `%previewPackage()` macro is available. + +**Update**\[September 11th, 2020\]**:** ` %loadPackageS()` and `%verifyPackage()` macros are available. **Update**\[July 30th, 2020\]**:** All components of SAS Packages Framework are now in one file `SPFinit.sas` (located in the `./SPF` directory). Documentation moved to `./SPF/Documentation` directory. Packages zip files moved to `./packages` directory. 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 4e64c2ace3bbcc0f94b3bffcddbed9fa9efb318c..41db0459241282e55e0d33759b042bbbb8cca1ad 100644 GIT binary patch delta 107700 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 diff --git a/SPF/Macros/bundlePackages.sas b/SPF/Macros/bundlePackages.sas index 748359b..8ba7f52 100644 --- a/SPF/Macros/bundlePackages.sas +++ b/SPF/Macros/bundlePackages.sas @@ -8,7 +8,7 @@ ,packagesRef=packages ,ods= /* data set for report file */ )/ -des='Macro to create a bundle of SAS packages, version 20260515. Run %bundlePackages(HELP) for help info.' +des='Macro to create a bundle of SAS packages, version 20260602. Run %bundlePackages(HELP) for help info.' secure minoperator ; @@ -25,7 +25,7 @@ secure minoperator %put ### This is short help information for the `bundlePackages` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *create bundles* of SAS packages, version `20260515` #; + %put # Macro to *create bundles* of SAS packages, version `20260602` #; %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/extendpackagesfileref.sas b/SPF/Macros/extendpackagesfileref.sas index 364ad68..f8576a8 100644 --- a/SPF/Macros/extendpackagesfileref.sas +++ b/SPF/Macros/extendpackagesfileref.sas @@ -6,7 +6,7 @@ when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20260515. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20260602. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -22,7 +22,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20260515 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20260515` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20260602` #; %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/generatepackage.sas b/SPF/Macros/generatepackage.sas index 9545feb..3906897 100644 --- a/SPF/Macros/generatepackage.sas +++ b/SPF/Macros/generatepackage.sas @@ -3,7 +3,7 @@ Macro to generate SAS packages. - Version 20260515 + Version 20260602 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -53,7 +53,7 @@ when empty takes buildLocation */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20260515. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20260602. Run %generatePackage(HELP) for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -68,7 +68,7 @@ des = 'Macro to generate SAS packages, version 20260515. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #------------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20260515` #; + %put # Macro to generate SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -950,7 +950,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; title&_titleNumber_. "Package ZIP file location is: &buildLocation."; %end; -footnote1 "SAS Packages Framework, version 20260515"; +footnote1 "SAS Packages Framework, version 20260602"; proc print data = &filesWithCodes.(drop=base build folderRef fileRef rc folderid _abort_ fileId additionalContent) @@ -1775,7 +1775,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' - / ' !! '' %put with the SAS Packages Framework version 20260515.;''' + / ' !! '' %put with the SAS Packages Framework version 20260602.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -1939,7 +1939,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !! ' / - ''' %put with the SAS Packages Framework version 20260515.; '' !! ' / + ''' %put with the SAS Packages Framework version 20260602.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -2811,7 +2811,7 @@ data _null_; %end; put 'put " " / @3 "---------------------------------------------------------------------" / " ";' - / 'put @3 "*SAS package generated by SAS Package Framework, version `20260515`*";' + / 'put @3 "*SAS package generated by SAS Package Framework, version `20260602`*";' / "put @3 '*under `&sysscp.`(`&sysscpl.`) operating system,*';" / "put @3 '*using SAS release: `&sysvlong4.`.*';" / 'put " " / @3 "---------------------------------------------------------------------";'; diff --git a/SPF/Macros/helppackage.sas b/SPF/Macros/helppackage.sas index 95f6b46..0695c48 100644 --- a/SPF/Macros/helppackage.sas +++ b/SPF/Macros/helppackage.sas @@ -28,7 +28,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20260515. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20260602. Run %helpPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -43,7 +43,7 @@ des = 'Macro to get help about SAS package, version 20260515. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20260515` #; + %put # Macro to get help about SAS packages, version `20260602` #; %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/installpackage.sas b/SPF/Macros/installpackage.sas index 0e1faba..e68d5d7 100644 --- a/SPF/Macros/installpackage.sas +++ b/SPF/Macros/installpackage.sas @@ -1,5 +1,5 @@ /*+installPackage+*/ -/* Macros to install SAS packages, version 20260515 */ +/* Macros to install SAS packages, version 20260602 */ /* A SAS package is a zip file containing a group of files with SAS code (macros, functions, data steps generating data, etc.) wrapped up together and %INCLUDEed by @@ -23,14 +23,14 @@ default is 0 - means No, 1 means Yes */ , SFRCVN = /* name of a macro variable to store success-failure return code value */ , github = /* name of a user or an organization in GitHub, all characters except [A-z0-9_.-] are compressed */ -, githubRepo = %sysfunc(lowcase(&packageName.)) /* repo name to be used, by default it is the package name, but can be altered */ +, githubRepo = /* repo name to be used, by default it is the package name, but can be altered */ , githubToken = /* user's github fine-grained personal access token */ , githubTokenDebug = 0 /* debug values: 0,1,2,3 */ ) /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20260515. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20260602. Run %installPackage(HELP) for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -45,7 +45,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20260515` #; + %put # Macro to install SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -220,11 +220,13 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo /* in case the 'packages' fileref is multi-directory the first directory will be selected as a destination */ data _null_; - if "(" =: pathname("packages") then - /* get the firstPackagesPath */ - call symputX("firstPackagesPath", dequote(kscanx(pathname("packages"), 1, "()", "QS")), "L"); + length p $ 32767; + p = pathname("packages"); + if "(" =: p then + /* get the firstPackagesPath */ + call symputX("firstPackagesPath", dequote(kscanx(p, 1, "()", "QS")), "L"); else - call symputX("firstPackagesPath", pathname("packages"), "L"); + call symputX("firstPackagesPath", p, "L"); run; %let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt))); @@ -336,6 +338,9 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %Let PackagesInstalledSussess=; %let PackagesInstalledFail=; + + + %do i = 1 %to %sysfunc(countw(&packagesNames., , S)); /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ %local packageName packageSubDir vers versA versB; @@ -353,6 +358,11 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %end; %put ### &packageName.(&vers.) ###; + /* if repo name is empty then use package name */ + %local githubRepoLocal; + %if %sysevalf(%superq(githubRepo)=,boolean) %then %let githubRepoLocal=%sysfunc(lowcase(&packageName.)); + %else %let githubRepoLocal=%superq(githubRepo); + %put *** %sysfunc(lowcase(&packageName.)) start *****************************************; %local in out inMD outMD bckp_ref bckplabel _IOFileref_; data _null_; call symputX("_IOFileref_", put(MD5(lowcase("&packageName.")), hex7. -L), "L"); run; @@ -399,12 +409,12 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %do; %if %superq(mirror) IN (0 3 4) %then /* SASPAC or PharmaForest or an arbitrary GitHub repo */ %do; - %let packageSubDir = &githubRepo./raw/main/; + %let packageSubDir = &githubRepoLocal./raw/main/; %if %superq(vers) ne %then %do; /*%let packageSubDir = %sysfunc(lowcase(&packageName.))/main/hist/&version./;*/ - %let packageSubDir = &githubRepo./raw/&vers./; + %let packageSubDir = &githubRepoLocal./raw/&vers./; %end; %end; %else @@ -633,7 +643,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %if ¬RunHTTP.=0 %then %do; %put %str( )URL called by PROC HTTP is:; - %put %str( )"https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref."; + %put %str( )"https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref."; %put %str( )Headers:; %put %str( )Accept=application/vnd.github.raw+json; %put %str( )X-GitHub-Api-Version=2026-03-10; @@ -648,7 +658,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo method="GET" out=&out. URL= - "https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref." + "https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref." CLEAR_CACHE ; headers @@ -693,7 +703,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo method="GET" out=&outMD. URL= - "https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).md?ref=&ref." + "https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).md?ref=&ref." CLEAR_CACHE ; headers diff --git a/SPF/Macros/ispackagesfilerefok.sas b/SPF/Macros/ispackagesfilerefok.sas index 7a5a893..dd22272 100644 --- a/SPF/Macros/ispackagesfilerefok.sas +++ b/SPF/Macros/ispackagesfilerefok.sas @@ -4,7 +4,7 @@ vERRb /* indicates if macro should be verbose and report errors */ ) / minoperator PARMBUFF -des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFilerefOK(HELP) for help, version 20260515.' +des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFilerefOK(HELP) for help, version 20260602.' ; /*** HELP END ***/ %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then @@ -20,7 +20,7 @@ des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFile %put ### This is short help information for the `isPackagesFilerefOK` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to check if the `packages` fileref is "correct", version `20260515` #; + %put # Macro to check if the `packages` fileref is "correct", version `20260602` #; %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/listpackages.sas b/SPF/Macros/listpackages.sas index f5d8857..fd06133 100644 --- a/SPF/Macros/listpackages.sas +++ b/SPF/Macros/listpackages.sas @@ -3,7 +3,7 @@ Macro to list SAS packages in packages folder. - Version 20260515 + Version 20260602 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -25,7 +25,7 @@ listDataSet /* Name of a data set to save results */ , quiet = 0 /* Indicate if results should be printed in log */ )/secure parmbuff -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20260515.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20260602.' ; %if (%QUPCASE(&listDataSet.) = HELP) %then %do; @@ -40,7 +40,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 `20260515` #; + %put # Macro to list available SAS packages, version `20260602` #; %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 7cb6f84..3d60fc3 100644 --- a/SPF/Macros/loadpackage.sas +++ b/SPF/Macros/loadpackage.sas @@ -34,9 +34,10 @@ , DS2force=0 /* indicates if PROC DS2 packages and threads should be loaded if a data set exists, 0=do not load */ +, force=0 /* force loading even if given version is already loaded */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20260515. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20260602. Run %loadPackage(HELP) for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -52,7 +53,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20260515` #; + %put # Macro to *load* SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -116,6 +117,10 @@ minoperator %put # or threads should overwrite existing SAS data sets. #; %put # Default value of `0` means "do not overwrite". #; %put # #; + %put # - `force=` *Optional.* Forces re-loading of a package, even if #; + %put # the given version is already loaded. #; + %put # Default value of `0` means "do not re-load". #; + %put # #; %put #-------------------------------------------------------------------------------#; %put # #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; @@ -197,7 +202,7 @@ minoperator if exists then leave; end; if exists then call symputx("path", p, "L"); - /*run;*/ /* moved to line 272 */ + /*run;*/ /* moved to line 276 */ /* convert cherryPick to lower case if needed */ %if NOT (%str(*) = %superq(cherryPick)) %then @@ -206,28 +211,20 @@ minoperator call symputX("cherryPick",lowcase(compbl(compress(symget("cherryPick"),". _","KDA"))),"L"); /*run;*/ %end; + run; /* empty list is equivalent to "*" */ - %if %superq(cherryPick)= %then + %if %sysevalf(%superq(cherryPick)=,boolean) %then %do; %let cherryPick=*; %end; - %if %superq(loadAddCnt) NE 1 %then - %do; - %let loadAddCnt = 0; - %end; - - %if %superq(suppressExec) NE 1 %then - %do; - %let suppressExec = 0; - %end; - - %if %superq(DS2force) NE 1 %then - %do; - %let DS2force = 0; - %end; + /* default is 0, anything else is 1 */ + %let loadAddCnt =%sysevalf(NOT(%superq(loadAddCnt)=0),boolean); + %let suppressExec =%sysevalf(NOT(%superq(suppressExec)=0),boolean); + %let DS2force =%sysevalf(NOT(%superq(DS2force)=0),boolean); + %let force =%sysevalf(NOT(%superq(force)=0),boolean); filename &_PackageFileref_. &ZIP. /* put location of package myPackageFile.zip here */ @@ -237,8 +234,10 @@ minoperator %do; %include &_PackageFileref_.(packagemetadata.sas) / &source2.; filename &_PackageFileref_. clear; + /**/ /* test if required version of package is "good enough" */ + %local rV pV rV0 pV0 rVsign; %let pV0 = %sysfunc(compress(&packageVersion.,.,kd)); %let pV = %sysevalf((%scan(&pV0.,1,.,M)+0)*1e8 @@ -257,8 +256,33 @@ minoperator %let rV = %sysevalf((%scan(&rV0.,1,.,M)+0)*1e8 + (%scan(&rV0.,2,.,M)+0)*1e4 + (%scan(&rV0.,3,.,M)+0)*1e0); + + /* check if the package is already loaded */ + /* conditions 1) cherrypick=* 2) sysloadedpackages exists and is global, */ - %if NOT %sysevalf(&rV. &rVsign. &pV.) %then + %local aleradyLoaded pLV pLV0; /* flag for already laded package check */ + %let aleradyLoaded = 0; + %if 0=&force. AND %SYMEXIST(sysloadedpackages) AND (%superq(cherrypick)=%str(*)) %then + %do; + %if %SYMGLOBL(sysloadedpackages) %then + %do; + %local findInLoaded; + %let findInLoaded = %qsysfunc(FIND(%superq(sysloadedpackages), %str(&packageName.%(), IT)); /* )-clocing */ + + %if &findInLoaded. %then + %let pLV0 = %scan(%substr(%superq(sysloadedpackages),&findInLoaded.),2,()); + %else + %let pLV0 = .; + %let pLV = %sysevalf((%scan(&pLV0.,1,.,M)+0)*1e8 + + (%scan(&pLV0.,2,.,M)+0)*1e4 + + (%scan(&pLV0.,3,.,M)+0)*1e0); + + /* if package name was found and version is ok set aleradyLoaded flag to 1 */ + %let aleradyLoaded=%sysevalf(&findInLoaded. AND (&rV. &rVsign. &pLV.),boolean); + %end; + %end; + + %if (NOT &aleradyLoaded.) AND (NOT %sysevalf(&rV. &rVsign. &pV.)) %then %do; %put ERROR: Package &packageName. will not be loaded!; %put ERROR- Required version is &rV0.; @@ -276,19 +300,30 @@ minoperator %if %bquote(&packageEncoding.) NE %then &packageEncoding. ; %else utf8 ; ; - %if %superq(lazyData) = %then + %if %sysevalf(%superq(lazyData)=,boolean) %then %do; - %local tempLoad_minoperator temp_noNotes_etc /* for hiding notes */ ; - %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); - options minoperator; /* MinOperator option is required for cherryPicking to work */ - %include &_PackageFileref_.(load.sas) / &source2.; - options &tempLoad_minoperator.; - %if 1 = &loadAddCnt. %then + %if NOT &aleradyLoaded. %then %do; - %put; %put - Additional content loading - Start -; - %loadPackageAddCnt(&packageName., - path=&path.) - %put - Additional content loading - End -; + %local tempLoad_minoperator temp_noNotes_etc /* for hiding notes */ ; + %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); + options minoperator; /* MinOperator option is required for cherryPicking to work */ + %include &_PackageFileref_.(load.sas) / &source2.; + options &tempLoad_minoperator.; + %if 1 = &loadAddCnt. %then + %do; + %put; %put - Additional content loading - Start -; + %loadPackageAddCnt(&packageName., + path=&path.) + %put - Additional content loading - End -; + %end; + %end; + %else + %do; + %put NOTE- %str( ); + %put NOTE: It looks like the &packageName.(&pLV0.) package already loaded! Nothing to do.; + %put NOTE- To force reloading use the force=1; + /* if package is already loaded with req version. */ + %put NOTE- %str( ); %end; %end; %else diff --git a/SPF/Macros/loadpackageaddcnt.sas b/SPF/Macros/loadpackageaddcnt.sas index f659551..ae36c13 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 20260515. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20260602. Run %loadPackageAddCnt(HELP) 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 `20260515` #; + %put # Macro to *load* additional content for a SAS package, version `20260602` #; %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 1ccf954..0fec740 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 20260515. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20260602. Run %loadPackages(HELP) 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 `20260515` #; + %put # Macro wrapper for the loadPackage macro, version `20260602` #; %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 9c4a583..c07c407 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 20260515. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20260602. Run %previewPackage(HELP) 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 20260515. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20260515` #; + %put # Macro to get preview of a SAS packages, version `20260602` #; %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/relocatepackage.sas b/SPF/Macros/relocatepackage.sas index 0966ab8..d88c516 100644 --- a/SPF/Macros/relocatepackage.sas +++ b/SPF/Macros/relocatepackage.sas @@ -15,7 +15,7 @@ ,psMAX=MAX /* pageSise in case executed inside DoSubL() */ ,ods= /* a data set for results, e.g., work.relocatePackageReport */ ) -/ des = 'Utility macro that locally Copies or Moves Packages, version 20260515. Run %relocatePackage() for help info.' +/ des = 'Utility macro that locally Copies or Moves Packages, version 20260602. Run %relocatePackage(HELP) for help info.' secure minoperator ; @@ -33,7 +33,7 @@ %put ### This is short help information for the `relocatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *locally copy or move* (relocate) SAS packages, version `20260515` #; + %put # Macro to *locally copy or move* (relocate) SAS packages, version `20260602` #; %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/requestPackage.sas b/SPF/Macros/requestPackage.sas new file mode 100644 index 0000000..fee60d0 --- /dev/null +++ b/SPF/Macros/requestPackage.sas @@ -0,0 +1,455 @@ +/*+requestPackage+*/ +%macro requestPackage( + packageName +,requiredVersion= +/* technical parameters passed to installPackage macro */ +, sourcePath = /* location of the package, e.g. "www.some.page/", mind the "/" at the end */ +, mirror = 0 /* indicates which location for package source should be used */ +, replace = 1 /* 1 = replace if the package already exist, 0 = otherwise */ +, backup = 0 /* 1 = before replacing make a copy if the package already exist, 0 = do nothing */ +, URLuser = /* user name for the password protected URLs */ +, URLpass = /* password for the password protected URLs */ +, 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 */ + +, github = /* name of a user or an organization in GitHub, all characters except [A-z0-9_.-] are compressed */ +, githubRepo = /* repo name to be used, by default it is the package name, but can be altered */ +, githubToken = /* user's github fine-grained personal access token */ +, githubTokenDebug = 0 /* debug values: 0,1,2,3 */ + +, loadPackage=1 /* should the packages be installed after installing */ +, force=0 /* force reloading even if already loaded */ +, ignoreDepVer=0 /* should dependencies version be ignore so that only the latest could be installed */ +, successDS= /* technical */ +) +/secure +des = 'Macro to request SAS package installation and loading, version 20260602. Run %requestPackage(HELP) for help info.'; + +%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then + %do; + %local options_tmp ; + %let options_tmp = ls=%sysfunc(getoption(ls)) ps=%sysfunc(getoption(ps)) + %sysfunc(getoption(notes)) %sysfunc(getoption(source)) + msglevel=%sysfunc(getoption(msglevel)) + ; + options NOnotes NOsource ls=MAX ps=MAX msglevel=N; + %put ; + %put ##############################################################################################; + %put ### This is short help information for the `requestPackage` macro #; + %put #--------------------------------------------------------------------------------------------#;; + %put # #; + %put # Macro to request (install and load) SAS packages, version `20260602` #; + %put # #; + %put # A SAS package is a zip file containing a group #; + %put # of SAS codes (macros, functions, data steps generating #; + %put # data, etc.) wrapped up together and embedded inside the zip. #; + %put # #; + %put # The `%nrstr(%%requestPackage())` macro installs and loads the package zip #; + %put # in the packages folder. The process takes care of installing or loading #; + %put # dependencies too. #; + %put # #; + %put # In case the packages fileref is a multi-directory one the first directory #; + %put # will be selected as a destination. #; + %put # #; + %put #--------------------------------------------------------------------------------------------#; + %put # #; + %put #### Parameters: #; + %put # #; + %put # 1. `packageName ` Name of a package _without_ the zip extension, e.g., myPackage1. #; + %put # Required and not null, default use case: #; + %put # `%nrstr(%%requestPackage(myPackage1))`. #; + %put # If empty displays this help information. #; + %put # #; + %put # **Installation options:** #; + %put # #; + %put # - `requiredVersion=` *Optional.* Indicates which package version we want #; + %put # to be requested, default value: `.` means "the latest". #; + %put # #; + %put # - `sourcePath=` Location of the package, e.g. "www.some.web.page/" #; + %put # Mind the "/" at the end of the path! #; + %put # Current default location for packages is: #; + %put # `https://github.com/SASPAC/` #; + %put # Current default location for the framework is: #; + %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` #; + %put # #; + %put # - `mirror=` Indicates which web location for packages installation is used. #; + %put # Value `0` or `SASPAC` indicates: #; + %put # `https://github.com/SASPAC/` #; + %put # Value `1` indicates: #; + %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` #; + %put # Value `2` indicates: #; + %put # `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` #; + %put # Value `3` or `PharmaForest` indicates: #; + %put # `https://github.com/PharmaForest/` #; + %put # Default value is `0`. #; + %put # #; + %put # - `version=` Indicates which historical version of a package to install. #; + %put # Historical version are currently available only if `mirror=0` is set. #; + %put # Default value is null which means "install the latest". #; + %put # When there are multiple packages to install the `version` variable #; + %put # is scan sequentially. #; + %put # #; + %put # - `replace=` When set to `1` and a package file exists, it forces the package #; + %put # file replacement by the new downloaded file. #; + %put # It is a binary indicator ('0' or '1'). Default value is `1`. #; + %put # #; + %put # - `backup=` When set to `1` and a package file exists, it creates a backup copy #; + %put # of the package file. The backup copy is created with a suffix of the #; + %put # following format: `_BCKP_yyyymmddJJMMSS`. #; + %put # If `replace=0` then `backup` is set to `0`. #; + %put # It is a binary indicator ('0' or '1'). Default value is `0`. #; + %put # #; + %put # - `URLuser=` A user name for the password protected URLs, no quotes needed. #; + %put # #; + %put # - `URLpass=` A password for the password protected URLs, no quotes needed. #; + %put # #; + %put # - `URLoptions=` Options for the `sourcePath` URLs filename. Consult the SAS #; + %put # documentation for the further details. #; + %put # #; + %put # - `loadAddCnt=` *Optional.* A package zip may contain additional #; + %put # content. The option indicates if it should be loaded #; + %put # Default value of zero (`0`) means "No", one (`1`) #; + %put # means "Yes". Content is extracted into the **packages** fileref #; + %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 # - `github=` *Optional.* A name of a user or an organization in GitHub. #; + %put # Allows an easy set of the search path for packages available on GitHub: #; + %put # `https://github.com///raw/.../` #; + %put # All characters except `[A-z0-9_.-]` are compressed. #; + %put # #; + %put # - `githubRepo=` *Optional.* A name of a repository in GitHub. #; + %put # Allows an easy set of the search path for packages available on GitHub: #; + %put # `https://github.com///raw/.../` #; + %put # By default lowercase name of installed package is used. #; + %put # #; + %put # - `githubToken=` *Optional.* A fine-grained personal access token for GitHub. #; + %put # When the value is non-missing it triggers GitHub API access to #; + %put # private repositories. Of course the token used has to be configured #; + %put # properly for the access. #; + %put # Read GitHub documentation to learn how to create and setup your token: #; + %put # `https://docs.github.com/en/authentication/ #; + %put # keeping-your-account-and-data-secure/ #; + %put # managing-your-personal-access-tokens #; + %put # #creating-a-fine-grained-personal-access-token` #; + %put # (lines break added for easier reading) #; + %put # Public repos do not need authentication. #; + %put # [NOTE!] This feature is experimental in this release. #; + %put # #; + %put # **Loading options:** #; + %put # #; + %put # - `loadPackage=` *Optional.* Indicates if requested package should be loaded too #; + %put # or only installed. Dependencies are only installed. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put # - `force=` *Optional.* Indicates if requested package should be reloaded #; + %put # even if it was already loaded to the session. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put # - `ignoreDepVer=` *Optional.* Indicates if packages versions in dependencies list #; + %put # should be ignored and the latest available version be used. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put #--------------------------------------------------------------------------------------------#; + %put # #; + %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; + %put # to learn more. #; + %put # Tutorials available at: `https://github.com/yabwon/HoW-SASPackages` #; + %put # #; + %put #### Example #################################################################################; + %put # #; + %put # Enabling the SAS Package Framework #; + %put # from the local directory and requesting (installing & loading) #; + %put # the bpUTiL package from the Internet. #; + %put # #; + %put # Assume that the `SPFinit.sas` file #; + %put # is located in the "C:/SAS_PACKAGES/" folder. #; + %put # #; + %put # Run the following code in your SAS session: #; + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas; + %put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; ); + %put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; ); + %put ; + %put %nrstr( %%requestPackage(bpUTiL) %%* install and load the package from the Internet; ); + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; + %put #### Example #################################################################################; + %put # #; + %put # Enabling the SAS Package Framework #; + %put # from the local directory and installing & loading #; + %put # a package with a particular version from the Internet. #; + %put # #; + %put # Assume that the `SPFinit.sas` file #; + %put # is located in the "C:/SAS_PACKAGES/" folder. #; + %put # #; + %put # Run the following code in your SAS session: #; + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas; + %put %nrstr( filename packages "C:/SAS_PACKAGES"; ); + %put %nrstr( %%include packages(SPFinit.sas); ); + %put ; + %put %nrstr( %%requestPackage(LibnameZIP, requiredVersion=0.1.0) ); + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; + %put ##############################################################################################; + %put ; + options &options_tmp.; + %GOTO ENDofrequestPackage; + %end; + +%local _rname_ _alreadyLoaded_ options_tmp ; +%let _rname_ = _requestPckg_%sysfunc(sleep(1,0.042),best1.)%sysfunc(datetime(),hex16.)_; + +%let options_tmp = ls=%sysfunc(getoption(ls)) ps=%sysfunc(getoption(ps)) +%sysfunc(getoption(notes)) %sysfunc(getoption(source)) +msglevel=%sysfunc(getoption(msglevel)) +; +options NOnotes NOsource ls=MAX ps=MAX msglevel=N; +options source source2; +%let loadPackage = %sysevalf((1=%superq(loadPackage)),boolean); +%let replace = %sysevalf(1=%superq(replace),boolean); + +%let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt)),boolean); +%let instDoc = %sysevalf(NOT(0=%superq(instDoc)),boolean); +%let backup = %sysevalf(NOT(0=%superq(backup)),boolean); +%let force = %sysevalf(NOT(0=%superq(force)),boolean); + +%let ignoreDepVer = %sysevalf(NOT(0=%superq(ignoreDepVer)),boolean); + +data _null_; + /* standardize input data */ + length packageName $ 24 requiredVersion $ 24 sysloadedpackages $ 32767 vers verR $ 24 versN verRN 8; + packageName = scan(lowcase(symget('packageName')),1, " "); + sysloadedpackages = lowcase(symget('sysloadedpackages')); + requiredVersion = compress(symget('requiredVersion'),".","kd"); + + put "INFO: Requesting package " packageName @; + if requiredVersion NE " " then put "version " requiredVersion @; + put; + + /* check if required version is already installed */ + f = FIND(sysloadedpackages, cats(packageName,"("), "t"); + if f then + do; + vers = scan(substr(sysloadedpackages,f),2,"()"); + verR = requiredVersion; + + array V verR vers ; + array VN verRN versN; + do over V; + VN = coalesce(input(scan(V,1,".","M"),?? best.),0)*1e8 + + coalesce(input(scan(V,2,".","M"),?? best.),0)*1e4 + + coalesce(input(scan(V,3,".","M"),?? best.),0)*1e0; + end; + + /*put (_ALL_) (=/);*/ + if (. <= verRN <= versN) then + do; + put / "INFO: It looks like the " packageName "package is already loaded. Enjoy!"; + call symputX('_alreadyLoaded_', 1, "L"); + end; + else + put / "INFO: Searching for package file with requested version."; + end; + + call symputX('packageName', packageName, "L"); + call symputX('requiredVersion', requiredVersion, "L"); + _error_=0; +stop; +run; + + +%if NOT &_alreadyLoaded_.0 %then +%do; +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +/* get list of packages */ +%listPackages(work.&_rname_.,quiet=1) + +/* check if minimum required version is available */ +data work.&_rname_.; + set work.&_rname_.; + where tagNumber=3 + and PackageZIP=lowcase("&packageName..zip") + ; + + length vers verR $ 24 versN verRN 8; + vers = value; + verR = symget("requiredVersion"); + array V verR vers ; + array VN verRN versN; + do over V; + VN = coalesce(input(scan(V,1,".","M"),?? best.),0)*1e8 + + coalesce(input(scan(V,2,".","M"),?? best.),0)*1e4 + + coalesce(input(scan(V,3,".","M"),?? best.),0)*1e0; + end; + + /*put (_ALL_) (=/);*/ + if (.<= verRN <= versN) then output; /* output data only if proper version does not exist */ + stop; + keep base PackageZIP; +run; + +/* set global macro variable for installPackage macro*/ +%global &_rname_.; +%let &_rname_.=1.0; + +/* if package file does not exist or does not have required version then install package */ +data _null_; + /*put nobs=;*/ + length callValue $ 32767; + callValue= + '%nrstr(%installPackage(&packageName.' + !!',SFRCVN=&_rname_.' + !!',version=&requiredVersion.' + /* installPackages macro parameters*/ + !!',sourcePath = &sourcePath.' + !!',mirror = &mirror.' + !!',replace = &replace.' + !!',backup = &backup.' + !!',URLuser = &URLuser.' + !!',URLpass = &URLpass.' + !!',URLoptions = &URLoptions.' + !!',loadAddCnt = &loadAddCnt.' + !!',instDoc = &instDoc.' + !!',github = &github.' + !!',githubRepo = &githubRepo.' + !!',githubToken = &githubToken.' + !!',githubTokenDebug = &githubTokenDebug.' + !!"))" + ; + if NOT nobs then + do; + /*put "1) " callValue=;*/ + call execute(callValue); + end; + stop; + set work.&_rname_. nobs=nobs; +run; + +/* collect package installation status for upcoming checks */ +%if %sysevalf(%superq(successDS)=,boolean) %then + %do; + %let successDS=work.&_rname_.; /* the name can be reused now */ + data &successDS.; + length packageName $ 24 status 8; + packageName = symget('packageName'); + status = &&&_rname_.; + run; + %end; +%else + %do; + data work.&_rname_.; /* this one is used in the recursive call so it is different name */ + length packageName $ 24 status 8; + packageName = symget('packageName'); + status = &&&_rname_.; + proc append base=&successDS. data=work.&_rname_.; + run; + %end; + +/* after successful installation search for dependencies */ +data _null_; +_E_=&&&_rname_.; +if NOT (1.0=_E_) then stop; + +set sashelp.vextfl; +where fileref = "PACKAGES"; + +filevar=cats(xpath,"/&packageName..zip"); + +if fileexist(filevar); /* find the first package file, since it can be on lower level location */ +_END_=0; +_cut_=1; +infile _dummy_ ZIP filevar=filevar member="description.sas"; + +do while(_E_); + /* run requestPackage(packageName,requiredVersion=) recursively for dependencies */ + input; + if upcase(_infile_) =: "REQPACKAGES:" then + do; + putlog "INFO: Requesting dependencies..."; + do until(NOT _cut_); + _cut_+1; + length rv $ 64 r v $ 24; + rv = dequote(strip(scan(_infile_,_cut_,":,"))); + if rv =" " then _cut_=0; + else + do; + r = scan(rv,1,"()"); + v = scan(rv,2,"()"); + if 1=&ignoreDepVer. then v=""; /* ignore requested version and get the lates */ + length callValue $ 32767; + callValue = + '%nrstr(%requestPackage(' !! strip(r) + !!',requiredVersion=' !! strip(v) + !!',loadPackage=0' + !!',successDS=&successDS.' + !!',ignoreDepVer=&ignoreDepVer.' + /* installPackages macro parameters*/ + !!',sourcePath = &sourcePath.' + !!',mirror = &mirror.' + !!',replace = &replace.' + !!',backup = &backup.' + !!',URLuser = &URLuser.' + !!',URLpass = &URLpass.' + !!',URLoptions = &URLoptions.' + !!',loadAddCnt = &loadAddCnt.' + !!',instDoc = &instDoc.' + !!',github = &github.' + !!',githubRepo = &githubRepo.' + !!',githubToken = &githubToken.' + !!',githubTokenDebug = &githubTokenDebug.' + !!'))' + ; + /*put "2) " callValue=;*/ + call execute(strip(callValue)); + end; + end; + end; + + if upcase(_infile_) in: ("REQPACKAGES:", "DESCRIPTION START:", "DESCRIPTION END:") then _E_=0; +end; +/*put _ALL_;*/ +/*stop;*/ +run; + +/* execute loading if requested */ +%if &loadPackage. %then + %do; + /* + proc print data=&successDS.; + run; + */ + + /* check for installation errors */ + data _null_; + set &successDS.; + where status < 1; + call symputX('loadPackage',0,"L"); + put "ERROR: Installation of " &packageName. "package failed!"; + run; + /*************/ + %if ((1.0=&&&_rname_.) AND &loadPackage.) %then + %do; + options notes; + %loadPackage(&packageName.,requiredVersion=&requiredVersion.,force=&force.) + options nonotes; + %end; + /**************/ + %end; + +/* clean up */ +%symdel &_rname_. / nowarn; +proc delete data=work.&_rname_.; +run; +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +%end; +options &options_tmp.; +%ENDofrequestPackage: +%mend requestPackage; + +/* end of SPFinit.sas file */ diff --git a/SPF/Macros/saspackagesframeworknotes.sas b/SPF/Macros/saspackagesframeworknotes.sas index 3d76f66..8ac59fe 100644 --- a/SPF/Macros/saspackagesframeworknotes.sas +++ b/SPF/Macros/saspackagesframeworknotes.sas @@ -5,7 +5,7 @@ SPFmacroName /* space separated list of names */ / minoperator secure -des = 'Macro to provide help notes about SAS Packages Framework macros, version 20260515. Run %SasPackagesFrameworkNotes(HELP) for help info.' +des = 'Macro to provide help notes about SAS Packages Framework macros, version 20260602. Run %SasPackagesFrameworkNotes(HELP) for help info.' ; %local list N i element; %let list= @@ -51,7 +51,7 @@ SasPackagesFrameworkNotes %put ### This is short help information for the `SasPackagesFrameworkNotes` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro prints help notes for SAS Packages Framework macros, version `20260515` #; + %put # Macro prints help notes for SAS Packages Framework macros, version `20260602` #; %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/spfinit_intrnl_forcev7dsname.sas b/SPF/Macros/spfinit_intrnl_forcev7dsname.sas index feb1300..6fb1add 100644 --- a/SPF/Macros/spfinit_intrnl_forcev7dsname.sas +++ b/SPF/Macros/spfinit_intrnl_forcev7dsname.sas @@ -2,7 +2,7 @@ %macro SPFinit_intrnl_forceV7DSname( mcParam /* name of a macro parameter holding user provided data set name */ )/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside selected SPF macros. Macro generates 4GL code that forces V7 compatybility for user provided data set names. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside selected SPF macros. Macro generates 4GL code that forces V7 compatybility for user provided data set names. Version 20260602.'; /* The macro can be called only inside a data step. */ /**************************************************************************** ### Parameters: @@ -20,7 +20,7 @@ des='SAS Packages Framework internal macro. Executable only inside selected SPF data set name, the second to last chunk is SCANned for libname (if empty then "work" is used). First character of LIB and DS variables is checked, if it is a digit, then underscore is added. - At the end the LIB and DS are concatenated and casted to upper + At the end the LIB and DS are concatenated and upper cased. case letters. Examples: @@ -91,4 +91,5 @@ des='SAS Packages Framework internal macro. Executable only inside selected SPF %end; %mend SPFinit_intrnl_forceV7DSname; -/* end of SPFinit.sas file */ + + diff --git a/SPF/Macros/spfint_gnpckg_arch.sas b/SPF/Macros/spfint_gnpckg_arch.sas index 95e9c55..472cf76 100644 --- a/SPF/Macros/spfint_gnpckg_arch.sas +++ b/SPF/Macros/spfint_gnpckg_arch.sas @@ -1,6 +1,6 @@ /*+SPFint_gnPckg_arch+*/ %macro SPFint_gnPckg_arch()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the archive version generation part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the archive version generation part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; diff --git a/SPF/Macros/spfint_gnpckg_markdown.sas b/SPF/Macros/spfint_gnpckg_markdown.sas index 52ebbf5..ce357ef 100644 --- a/SPF/Macros/spfint_gnpckg_markdown.sas +++ b/SPF/Macros/spfint_gnpckg_markdown.sas @@ -1,6 +1,6 @@ /*+SPFint_gnPckg_markdown+*/ %macro SPFint_gnPckg_markdown()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the markdown documentation part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the markdown documentation part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; @@ -112,7 +112,7 @@ data &filesWithCodes.markdown; %end; put " " / "---------------------------------------------------------------------" / " " - / "*SAS package generated by SAS Package Framework, version `20260515`,*" + / "*SAS package generated by SAS Package Framework, version `20260602`,*" / "*under `&sysscp.`(`&sysscpl.`) operating system,*" / "*using SAS release: `&sysvlong4.`.*" / " " / "---------------------------------------------------------------------" / " "; diff --git a/SPF/Macros/spfint_gnpckg_tests.sas b/SPF/Macros/spfint_gnpckg_tests.sas index 85e0361..078925d 100644 --- a/SPF/Macros/spfint_gnpckg_tests.sas +++ b/SPF/Macros/spfint_gnpckg_tests.sas @@ -1,6 +1,6 @@ /*+SPFint_gnPckg_tests+*/ %macro SPFint_gnPckg_tests()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the test part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the test part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; diff --git a/SPF/Macros/splitcodeforpackage.sas b/SPF/Macros/splitcodeforpackage.sas index 88e79bc..6bc745e 100644 --- a/SPF/Macros/splitcodeforpackage.sas +++ b/SPF/Macros/splitcodeforpackage.sas @@ -8,7 +8,7 @@ ,nobs=0 /* technical parameter */ ) /*** HELP END ***/ -/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20260515. Run %splitCodeForPackage() for help info.' +/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20260602. Run %splitCodeForPackage(HELP) for help info.' ; %if (%superq(codeFile) = ) OR (%qupcase(&codeFile.) = HELP) %then %do; @@ -24,7 +24,7 @@ %put #-------------------------------------------------------------------------------#; %put # #; %put # Utility macro to *split* single file with SAS package code into multiple #; - %put # files with separate snippets, version `20260515` #; + %put # files with separate snippets, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -400,7 +400,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 20260515. */'; + put '/* File generated with help of SAS Packages Framework, version 20260602. */'; firstLine[j]=0; end; put _infile_; diff --git a/SPF/Macros/unbundlePackages.sas b/SPF/Macros/unbundlePackages.sas index 3dfedcc..de96209 100644 --- a/SPF/Macros/unbundlePackages.sas +++ b/SPF/Macros/unbundlePackages.sas @@ -10,7 +10,7 @@ ,verify=0 ,quiet=0 )/ -des='Macro to extract a bundle of SAS packages, version 20260515. Run %unbundlePackages(HELP) for help info.' +des='Macro to extract a bundle of SAS packages, version 20260602. Run %unbundlePackages(HELP) for help info.' secure minoperator ; @@ -28,7 +28,7 @@ minoperator %put ### This is short help information for the `unbundlePackages` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *extract* SAS packages from a bundle, version `20260515` #; + %put # Macro to *extract* SAS packages from a bundle, version `20260602` #; %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/unloadpackage.sas b/SPF/Macros/unloadpackage.sas index 385a4e9..4c8bd0c 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 20260515. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20260602. Run %unloadPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20260515` #; + %put # Macro to unload SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -150,6 +150,9 @@ des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for h %else utf8 ; ; %include &_PackageFileref_.(unload.sas) / &source2.; + + /* clear possible unwanted multiple spaces or set to _null_ when missing */ + options CMPLIB=%sysfunc(coalescec(%sysfunc(compbl(%sysfunc(getoption(CMPLIB)))),_null_)); %end; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; filename &_PackageFileref_. clear; diff --git a/SPF/Macros/verifypackage.sas b/SPF/Macros/verifypackage.sas index a1192b1..9940028 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 20260515. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20260602. Run %verifyPackage(HELP) 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 20260515. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20260515` #; + %put # Macro to verify SAS package with it hash digest, version `20260602` #; %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 4a0d0c4..bba447c 100644 --- a/SPF/SPFinit.md +++ b/SPF/SPFinit.md @@ -1,7 +1,7 @@ --- -# SAS Packages Framework, version `20260515` +# SAS Packages Framework, version `20260602` --- @@ -17,6 +17,7 @@ * [the `generatePackage` macro](#generatepackage) * [the `extendPackagesFileref` macro](#extendpackagesfileref) * [the `loadPackageAddCnt` macro](#loadpackageaddcnt) + * [the `requestPackage` macro](#requestpackage) * [the `splitCodeForPackage` macro](#splitcodeforpackage) * [the `relocatePackage` macro](#relocatepackage) * [the `isPackagesFilerefOK` macro](#ispackagesfilerefok) @@ -34,7 +35,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. -In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20260515`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20260602`**. **To get started with SAS Packages** try this [**`Introduction to SAS Packages`**](https://youtube.com/playlist?list=PLeMzGEImIT5eV13IGXQIgWmTFCJt_cLZG&si=ElQm0_ifq76mvUbq "Introduction to SAS Packages video series") video series or [**`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). @@ -57,7 +58,7 @@ them using the SPF can be found [**HERE**](https://github.com/yabwon/HoW-SASPack ## This is short help information for the `installPackage` macro -------------------------------------------------------------------------------------------- - Macro to install SAS packages, version `20260515` + Macro to install SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -210,7 +211,7 @@ filename packages "C:/SAS_PACKAGES"; ## This is short help information for the `helpPackage` macro ------------------------------------------------------------------------------- - Macro to get help about SAS packages, version `20260515` + Macro to get help about SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -288,7 +289,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `loadPackage` macro ------------------------------------------------------------------------------- - Macro to *load* SAS packages, version `20260515` + Macro to *load* SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -446,7 +447,7 @@ If created, those macros are automatically deleted when the `%unloadPackage()` m ## This is short help information for the `loadPackageS` macro ------------------------------------------------------------------------------- - Macro wrapper for the loadPackage macro, version `20260515` + Macro wrapper for the loadPackage macro, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -492,12 +493,13 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; %loadPackageS(SQLinDS, DFA) %* load packages content into the SAS session; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------------------------------------------------------------------- ## This is short help information for the `unloadPackage` macro ------------------------------------------------------------------------------- - Macro to unload SAS packages, version `20260515` + Macro to unload SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -564,7 +566,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `listPackages` macro ----------------------------------------------------------------------------------------- - Macro to list available SAS packages, version `20260515` + Macro to list available SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -613,7 +615,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `verifyPackage` macro ------------------------------------------------------------------------------- - Macro to verify SAS package with it hash digest, version `20260515` + Macro to verify SAS package with it hash digest, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -669,7 +671,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 `20260515` + Macro to get preview of a SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -738,7 +740,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `generatePackage` macro ------------------------------------------------------------------------------- - Macro to generate SAS packages, version `20260515` + Macro to generate SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -971,7 +973,7 @@ All files have to have `.sas` extension. Other files are ignored. ## This is short help information for the `extendPackagesFileref` macro ----------------------------------------------------------------------------------------- - Macro to list directories pointed by 'packages' fileref, version `20260515` + Macro to list directories pointed by 'packages' fileref, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1013,7 +1015,7 @@ filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory; ## This is short help information for the `loadPackageAddCnt` macro ------------------------------------------------------------------------------- - Macro to load *additional content* for a SAS package, version `20260515` + Macro to load *additional content* for a SAS package, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1103,11 +1105,176 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ----------------------------------------------------------------------------------------- + + +## This is short help information for the `requestPackage` macro + +-------------------------------------------------------------------------------------------- + + Macro to request (install and load) SAS packages, version `20260602` + + 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 `%requestPackage()` macro installs and loads the package zip + in the packages folder. The process takes care of installing or loading + dependencies too. + + In case the packages fileref is a multi-directory one the first directory + will be selected as a destination. + +-------------------------------------------------------------------------------------------- + +### Parameters: + + 1. `packageName ` Name of a package _without_ the zip extension, e.g., myPackage1. + Required and not null, default use case: + `%requestPackage(myPackage1)`. + If empty displays this help information. + + **Installation options:** + + - `requiredVersion=` *Optional.* Indicates which package version we want + to be requested, default value: `.` means "the latest". + + - `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` or `SASPAC` 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` + Value `3` or `PharmaForest` indicates: + `https://github.com/PharmaForest/` + Default value is `0`. + + - `version=` Indicates which historical version of a package to install. + Historical version are currently available only if `mirror=0` is set. + Default value is null which means "install the latest". + When there are multiple packages to install the `version` variable + is scan sequentially. + + - `replace=` When set to `1` and a package file exists, it forces the package + file replacement by the new downloaded file. + It is a binary indicator ('0' or '1'). Default value is `1`. + + - `backup=` When set to `1` and a package file exists, it creates a backup copy + of the package file. The backup copy is created with a suffix of the + following format: `_BCKP_yyyymmddJJMMSS`. + If `replace=0` then `backup` is set to `0`. + It is a binary indicator ('0' or '1'). Default value is `0`. + + - `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". + + - `github=` *Optional.* A name of a user or an organization in GitHub. + Allows an easy set of the search path for packages available on GitHub: + `https://github.com///raw/.../` + All characters except `[A-z0-9_.-]` are compressed. + + - `githubRepo=` *Optional.* A name of a repository in GitHub. + Allows an easy set of the search path for packages available on GitHub: + `https://github.com///raw/.../` + By default lowercase name of installed package is used. + + - `githubToken=` *Optional.* A fine-grained personal access token for GitHub. + When the value is non-missing it triggers GitHub API access to + private repositories. Of course the token used has to be configured + properly for the access. + Read GitHub documentation to learn how to create and setup your token: + `https://docs.github.com/en/authentication/ + keeping-your-account-and-data-secure/ + managing-your-personal-access-tokens + #creating-a-fine-grained-personal-access-token` + (lines break added for easier reading) + Public repos do not need authentication. + [NOTE!] This feature is experimental in this release. + + **Loading options:** + + - `loadPackage=` *Optional.* Indicates if requested package should be loaded too + or only installed. Dependencies are only installed. + Default value of zero (`0`) means "No", one (`1`) means "Yes". + + - `force=` *Optional.* Indicates if requested package should be reloaded + even if it was already loaded to the session. + Default value of zero (`0`) means "No", one (`1`) means "Yes". + + - `ignoreDepVer=` *Optional.* Indicates if packages versions in dependencies list + should be ignored and the latest available version be used. + Default value of zero (`0`) means "No", one (`1`) means "Yes". + +-------------------------------------------------------------------------------------------- + + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` + to learn more. + Tutorials available at: `https://github.com/yabwon/HoW-SASPackages` + +### Example ################################################################################ + + Enabling the SAS Package Framework + from the local directory and requesting (installing & loading) + the bpUTiL 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; + + %requestPackage(bpUTiL) %* install and load the package from the Internet; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +### Example ################################################################################# + + Enabling the SAS Package Framework + from the local directory and installing & loading + a package with a particular version 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); + + %requestPackage(LibnameZIP, requiredVersion=0.1.0) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +----------------------------------------------------------------------------------------- + + ## 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 `20260515` + files with separate snippets, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1188,7 +1355,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `relocatePackage` macro ------------------------------------------------------------------------------- - Macro to *locally copy or move* (relocate) SAS packages, version `20260515` + Macro to *locally copy or move* (relocate) SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1300,7 +1467,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `isPackagesFilerefOK` macro ----------------------------------------------------------------------------------------- - Macro to check if the `packages` fileref is "correct", version `20260515` + Macro to check if the `packages` fileref is "correct", version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1351,7 +1518,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `SasPackagesFrameworkNotes` macro ------------------------------------------------------------------------------- - Macro prints help notes for SAS Packages Framework macros, version `20260515` + Macro prints help notes for SAS Packages Framework macros, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1401,7 +1568,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `bundlePackages` macro ------------------------------------------------------------------------------- - Macro to *create bundles* of SAS packages, version `20260515` + Macro to *create bundles* of SAS packages, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1470,7 +1637,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `unbundlePackages` macro ------------------------------------------------------------------------------- - Macro to *extract* SAS packages from a bundle, version `20260515` + Macro to *extract* SAS packages from a bundle, version `20260602` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/SPFinit.sas b/SPF/SPFinit.sas index cd12720..58670ee 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -43,7 +43,7 @@ - to unload, or - to generate SAS packages. - SAS Packages Framework, version 20260515. + SAS Packages Framework, version 20260602. See examples below. A SAS package is a zip file containing a group of files @@ -99,9 +99,10 @@ Contributors: , DS2force=0 /* indicates if PROC DS2 packages and threads should be loaded if a data set exists, 0=do not load */ +, force=0 /* force loading even if given version is already loaded */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20260515. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20260602. Run %loadPackage(HELP) for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -117,7 +118,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20260515` #; + %put # Macro to *load* SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -181,6 +182,10 @@ minoperator %put # or threads should overwrite existing SAS data sets. #; %put # Default value of `0` means "do not overwrite". #; %put # #; + %put # - `force=` *Optional.* Forces re-loading of a package, even if #; + %put # the given version is already loaded. #; + %put # Default value of `0` means "do not re-load". #; + %put # #; %put #-------------------------------------------------------------------------------#; %put # #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; @@ -262,7 +267,7 @@ minoperator if exists then leave; end; if exists then call symputx("path", p, "L"); - /*run;*/ /* moved to line 272 */ + /*run;*/ /* moved to line 276 */ /* convert cherryPick to lower case if needed */ %if NOT (%str(*) = %superq(cherryPick)) %then @@ -271,28 +276,20 @@ minoperator call symputX("cherryPick",lowcase(compbl(compress(symget("cherryPick"),". _","KDA"))),"L"); /*run;*/ %end; + run; /* empty list is equivalent to "*" */ - %if %superq(cherryPick)= %then + %if %sysevalf(%superq(cherryPick)=,boolean) %then %do; %let cherryPick=*; %end; - %if %superq(loadAddCnt) NE 1 %then - %do; - %let loadAddCnt = 0; - %end; - - %if %superq(suppressExec) NE 1 %then - %do; - %let suppressExec = 0; - %end; - - %if %superq(DS2force) NE 1 %then - %do; - %let DS2force = 0; - %end; + /* default is 0, anything else is 1 */ + %let loadAddCnt =%sysevalf(NOT(%superq(loadAddCnt)=0),boolean); + %let suppressExec =%sysevalf(NOT(%superq(suppressExec)=0),boolean); + %let DS2force =%sysevalf(NOT(%superq(DS2force)=0),boolean); + %let force =%sysevalf(NOT(%superq(force)=0),boolean); filename &_PackageFileref_. &ZIP. /* put location of package myPackageFile.zip here */ @@ -302,8 +299,10 @@ minoperator %do; %include &_PackageFileref_.(packagemetadata.sas) / &source2.; filename &_PackageFileref_. clear; + /**/ /* test if required version of package is "good enough" */ + %local rV pV rV0 pV0 rVsign; %let pV0 = %sysfunc(compress(&packageVersion.,.,kd)); %let pV = %sysevalf((%scan(&pV0.,1,.,M)+0)*1e8 @@ -322,8 +321,33 @@ minoperator %let rV = %sysevalf((%scan(&rV0.,1,.,M)+0)*1e8 + (%scan(&rV0.,2,.,M)+0)*1e4 + (%scan(&rV0.,3,.,M)+0)*1e0); + + /* check if the package is already loaded */ + /* conditions 1) cherrypick=* 2) sysloadedpackages exists and is global, */ - %if NOT %sysevalf(&rV. &rVsign. &pV.) %then + %local aleradyLoaded pLV pLV0; /* flag for already laded package check */ + %let aleradyLoaded = 0; + %if 0=&force. AND %SYMEXIST(sysloadedpackages) AND (%superq(cherrypick)=%str(*)) %then + %do; + %if %SYMGLOBL(sysloadedpackages) %then + %do; + %local findInLoaded; + %let findInLoaded = %qsysfunc(FIND(%superq(sysloadedpackages), %str(&packageName.%(), IT)); /* )-clocing */ + + %if &findInLoaded. %then + %let pLV0 = %scan(%substr(%superq(sysloadedpackages),&findInLoaded.),2,()); + %else + %let pLV0 = .; + %let pLV = %sysevalf((%scan(&pLV0.,1,.,M)+0)*1e8 + + (%scan(&pLV0.,2,.,M)+0)*1e4 + + (%scan(&pLV0.,3,.,M)+0)*1e0); + + /* if package name was found and version is ok set aleradyLoaded flag to 1 */ + %let aleradyLoaded=%sysevalf(&findInLoaded. AND (&rV. &rVsign. &pLV.),boolean); + %end; + %end; + + %if (NOT &aleradyLoaded.) AND (NOT %sysevalf(&rV. &rVsign. &pV.)) %then %do; %put ERROR: Package &packageName. will not be loaded!; %put ERROR- Required version is &rV0.; @@ -341,19 +365,30 @@ minoperator %if %bquote(&packageEncoding.) NE %then &packageEncoding. ; %else utf8 ; ; - %if %superq(lazyData) = %then + %if %sysevalf(%superq(lazyData)=,boolean) %then %do; - %local tempLoad_minoperator temp_noNotes_etc /* for hiding notes */ ; - %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); - options minoperator; /* MinOperator option is required for cherryPicking to work */ - %include &_PackageFileref_.(load.sas) / &source2.; - options &tempLoad_minoperator.; - %if 1 = &loadAddCnt. %then + %if NOT &aleradyLoaded. %then %do; - %put; %put - Additional content loading - Start -; - %loadPackageAddCnt(&packageName., - path=&path.) - %put - Additional content loading - End -; + %local tempLoad_minoperator temp_noNotes_etc /* for hiding notes */ ; + %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); + options minoperator; /* MinOperator option is required for cherryPicking to work */ + %include &_PackageFileref_.(load.sas) / &source2.; + options &tempLoad_minoperator.; + %if 1 = &loadAddCnt. %then + %do; + %put; %put - Additional content loading - Start -; + %loadPackageAddCnt(&packageName., + path=&path.) + %put - Additional content loading - End -; + %end; + %end; + %else + %do; + %put NOTE- %str( ); + %put NOTE: It looks like the &packageName.(&pLV0.) package already loaded! Nothing to do.; + %put NOTE- To force reloading use the force=1; + /* if package is already loaded with req version. */ + %put NOTE- %str( ); %end; %end; %else @@ -398,7 +433,7 @@ minoperator */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20260602. Run %unloadPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -413,7 +448,7 @@ des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20260515` #; + %put # Macro to unload SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -528,6 +563,9 @@ des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for h %else utf8 ; ; %include &_PackageFileref_.(unload.sas) / &source2.; + + /* clear possible unwanted multiple spaces or set to _null_ when missing */ + options CMPLIB=%sysfunc(coalescec(%sysfunc(compbl(%sysfunc(getoption(CMPLIB)))),_null_)); %end; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; filename &_PackageFileref_. clear; @@ -568,7 +606,7 @@ des = 'Macro to unload SAS package, version 20260515. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20260515. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20260602. Run %helpPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -583,7 +621,7 @@ des = 'Macro to get help about SAS package, version 20260515. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20260515` #; + %put # Macro to get help about SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -728,7 +766,7 @@ TODO: */ /*+installPackage+*/ -/* Macros to install SAS packages, version 20260515 */ +/* Macros to install SAS packages, version 20260602 */ /* 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 @@ -752,14 +790,14 @@ TODO: default is 0 - means No, 1 means Yes */ , SFRCVN = /* name of a macro variable to store success-failure return code value */ , github = /* name of a user or an organization in GitHub, all characters except [A-z0-9_.-] are compressed */ -, githubRepo = %sysfunc(lowcase(&packageName.)) /* repo name to be used, by default it is the package name, but can be altered */ +, githubRepo = /* repo name to be used, by default it is the package name, but can be altered */ , githubToken = /* user's github fine-grained personal access token */ , githubTokenDebug = 0 /* debug values: 0,1,2,3 */ ) /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20260515. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20260602. Run %installPackage(HELP) for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -774,7 +812,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20260515` #; + %put # Macro to install SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -949,11 +987,13 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo /* in case the 'packages' fileref is multi-directory the first directory will be selected as a destination */ data _null_; - if "(" =: pathname("packages") then - /* get the firstPackagesPath */ - call symputX("firstPackagesPath", dequote(kscanx(pathname("packages"), 1, "()", "QS")), "L"); + length p $ 32767; + p = pathname("packages"); + if "(" =: p then + /* get the firstPackagesPath */ + call symputX("firstPackagesPath", dequote(kscanx(p, 1, "()", "QS")), "L"); else - call symputX("firstPackagesPath", pathname("packages"), "L"); + call symputX("firstPackagesPath", p, "L"); run; %let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt))); @@ -1065,6 +1105,9 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %Let PackagesInstalledSussess=; %let PackagesInstalledFail=; + + + %do i = 1 %to %sysfunc(countw(&packagesNames., , S)); /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ %local packageName packageSubDir vers versA versB; @@ -1082,6 +1125,11 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %end; %put ### &packageName.(&vers.) ###; + /* if repo name is empty then use package name */ + %local githubRepoLocal; + %if %sysevalf(%superq(githubRepo)=,boolean) %then %let githubRepoLocal=%sysfunc(lowcase(&packageName.)); + %else %let githubRepoLocal=%superq(githubRepo); + %put *** %sysfunc(lowcase(&packageName.)) start *****************************************; %local in out inMD outMD bckp_ref bckplabel _IOFileref_; data _null_; call symputX("_IOFileref_", put(MD5(lowcase("&packageName.")), hex7. -L), "L"); run; @@ -1128,12 +1176,12 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %do; %if %superq(mirror) IN (0 3 4) %then /* SASPAC or PharmaForest or an arbitrary GitHub repo */ %do; - %let packageSubDir = &githubRepo./raw/main/; + %let packageSubDir = &githubRepoLocal./raw/main/; %if %superq(vers) ne %then %do; /*%let packageSubDir = %sysfunc(lowcase(&packageName.))/main/hist/&version./;*/ - %let packageSubDir = &githubRepo./raw/&vers./; + %let packageSubDir = &githubRepoLocal./raw/&vers./; %end; %end; %else @@ -1362,7 +1410,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo %if ¬RunHTTP.=0 %then %do; %put %str( )URL called by PROC HTTP is:; - %put %str( )"https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref."; + %put %str( )"https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref."; %put %str( )Headers:; %put %str( )Accept=application/vnd.github.raw+json; %put %str( )X-GitHub-Api-Version=2026-03-10; @@ -1377,7 +1425,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo method="GET" out=&out. URL= - "https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref." + "https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).zip?ref=&ref." CLEAR_CACHE ; headers @@ -1422,7 +1470,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo method="GET" out=&outMD. URL= - "https://api.github.com/repos/&github./&githubRepo./contents/%sysfunc(lowcase(&packageName.)).md?ref=&ref." + "https://api.github.com/repos/&github./&githubRepoLocal./contents/%sysfunc(lowcase(&packageName.)).md?ref=&ref." CLEAR_CACHE ; headers @@ -1644,7 +1692,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo Macro to list SAS packages in packages folder. - Version 20260515 + Version 20260602 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1666,7 +1714,7 @@ des = 'Macro to install SAS package, version 20260515. Run %%installPackage() fo listDataSet /* Name of a data set to save results */ , quiet = 0 /* Indicate if results should be printed in log */ )/secure parmbuff -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20260515.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20260602.' ; %if (%QUPCASE(&listDataSet.) = HELP) %then %do; @@ -1681,7 +1729,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 `20260515` #; + %put # Macro to list available SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1910,7 +1958,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; Macro to generate SAS packages. - Version 20260515 + Version 20260602 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1960,7 +2008,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; when empty takes buildLocation */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20260515. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20260602. Run %generatePackage(HELP) for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1975,7 +2023,7 @@ des = 'Macro to generate SAS packages, version 20260515. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #------------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20260515` #; + %put # Macro to generate SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -2857,7 +2905,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; title&_titleNumber_. "Package ZIP file location is: &buildLocation."; %end; -footnote1 "SAS Packages Framework, version 20260515"; +footnote1 "SAS Packages Framework, version 20260602"; proc print data = &filesWithCodes.(drop=base build folderRef fileRef rc folderid _abort_ fileId additionalContent) @@ -3682,7 +3730,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' - / ' !! '' %put with the SAS Packages Framework version 20260515.;''' + / ' !! '' %put with the SAS Packages Framework version 20260602.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -3846,7 +3894,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !! ' / - ''' %put with the SAS Packages Framework version 20260515.; '' !! ' / + ''' %put with the SAS Packages Framework version 20260602.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -4718,7 +4766,7 @@ data _null_; %end; put 'put " " / @3 "---------------------------------------------------------------------" / " ";' - / 'put @3 "*SAS package generated by SAS Package Framework, version `20260515`*";' + / 'put @3 "*SAS package generated by SAS Package Framework, version `20260602`*";' / "put @3 '*under `&sysscp.`(`&sysscpl.`) operating system,*';" / "put @3 '*using SAS release: `&sysvlong4.`.*';" / 'put " " / @3 "---------------------------------------------------------------------";'; @@ -5157,7 +5205,7 @@ options &qlenmax_fstimer_tmp.; /*+SPFint_gnPckg_tests+*/ %macro SPFint_gnPckg_tests()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the test part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the test part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; @@ -5839,7 +5887,7 @@ options "elenmax_tmp.; /*+SPFint_gnPckg_markdown+*/ %macro SPFint_gnPckg_markdown()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the markdown documentation part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the markdown documentation part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; @@ -5951,7 +5999,7 @@ data &filesWithCodes.markdown; %end; put " " / "---------------------------------------------------------------------" / " " - / "*SAS package generated by SAS Package Framework, version `20260515`,*" + / "*SAS package generated by SAS Package Framework, version `20260602`,*" / "*under `&sysscp.`(`&sysscpl.`) operating system,*" / "*using SAS release: `&sysvlong4.`.*" / " " / "---------------------------------------------------------------------" / " "; @@ -6092,7 +6140,7 @@ options &MarkDownOptionsTmp.; /*+SPFint_gnPckg_arch+*/ %macro SPFint_gnPckg_arch()/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the archive version generation part of the process. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside the %generatePackage() macro. The macro encapsulates the archive version generation part of the process. Version 20260602.'; /* macro picks up all macrovariables from external scope, so from the %generatePackage() macro */ %if %sysmexecname(%sysmexecdepth-1) in (GENERATEPACKAGE) %then %do; @@ -6259,7 +6307,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20260515. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20260602. Run %loadPackages(HELP) for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -6275,7 +6323,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20260515` #; + %put # Macro wrapper for the loadPackage macro, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6373,7 +6421,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20260515. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20260602. Run %verifyPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -6388,7 +6436,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20260515. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20260515` #; + %put # Macro to verify SAS package with it hash digest, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6604,7 +6652,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20260515. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20260515. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20260602. Run %previewPackage(HELP) for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -6619,7 +6667,7 @@ des = 'Macro to preview content of a SAS package, version 20260515. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20260515` #; + %put # Macro to get preview of a SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6753,7 +6801,7 @@ des = 'Macro to preview content of a SAS package, version 20260515. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20260515. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20260602. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -6769,7 +6817,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20260515 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20260515` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -6871,7 +6919,7 @@ filename packages list; is provided in required version */ )/secure /*** HELP END ***/ -des = 'Macro to load additional content for a SAS package, version 20260515. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20260602. Run %loadPackageAddCnt(HELP) for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -6887,7 +6935,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 `20260515` #; + %put # Macro to *load* additional content for a SAS package, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -7258,7 +7306,7 @@ minoperator ,nobs=0 /* technical parameter */ ) /*** HELP END ***/ -/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20260515. Run %splitCodeForPackage() for help info.' +/ des = 'Utility macro to split "one big" code into multiple files for a SAS package, version 20260602. Run %splitCodeForPackage(HELP) for help info.' ; %if (%superq(codeFile) = ) OR (%qupcase(&codeFile.) = HELP) %then %do; @@ -7274,7 +7322,7 @@ minoperator %put #-------------------------------------------------------------------------------#; %put # #; %put # Utility macro to *split* single file with SAS package code into multiple #; - %put # files with separate snippets, version `20260515` #; + %put # files with separate snippets, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -7650,7 +7698,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 20260515. */'; + put '/* File generated with help of SAS Packages Framework, version 20260602. */'; firstLine[j]=0; end; put _infile_; @@ -7683,7 +7731,7 @@ options &options_tmp2.; ,psMAX=MAX /* pageSise in case executed inside DoSubL() */ ,ods= /* a data set for results, e.g., work.relocatePackageReport */ ) -/ des = 'Utility macro that locally Copies or Moves Packages, version 20260515. Run %relocatePackage() for help info.' +/ des = 'Utility macro that locally Copies or Moves Packages, version 20260602. Run %relocatePackage(HELP) for help info.' secure minoperator ; @@ -7701,7 +7749,7 @@ options &options_tmp2.; %put ### This is short help information for the `relocatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *locally copy or move* (relocate) SAS packages, version `20260515` #; + %put # Macro to *locally copy or move* (relocate) SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -8366,7 +8414,7 @@ filename PACKAGES ("R:\testPackages2" "R:\testPackages1"); vERRb /* indicates if macro should be verbose and report errors */ ) / minoperator PARMBUFF -des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFilerefOK(HELP) for help, version 20260515.' +des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFilerefOK(HELP) for help, version 20260602.' ; /*** HELP END ***/ %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then @@ -8382,7 +8430,7 @@ des = 'Macro to check if the PACKAGES fileref is "correct", type %isPackagesFile %put ### This is short help information for the `isPackagesFilerefOK` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to check if the `packages` fileref is "correct", version `20260515` #; + %put # Macro to check if the `packages` fileref is "correct", version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -8516,7 +8564,7 @@ SPFmacroName /* space separated list of names */ / minoperator secure -des = 'Macro to provide help notes about SAS Packages Framework macros, version 20260515. Run %SasPackagesFrameworkNotes(HELP) for help info.' +des = 'Macro to provide help notes about SAS Packages Framework macros, version 20260602. Run %SasPackagesFrameworkNotes(HELP) for help info.' ; %local list N i element; %let list= @@ -8562,7 +8610,7 @@ SasPackagesFrameworkNotes %put ### This is short help information for the `SasPackagesFrameworkNotes` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro prints help notes for SAS Packages Framework macros, version `20260515` #; + %put # Macro prints help notes for SAS Packages Framework macros, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -8685,7 +8733,7 @@ options mlogic symbolgen; ,packagesRef=packages ,ods= /* data set for report file */ )/ -des='Macro to create a bundle of SAS packages, version 20260515. Run %bundlePackages(HELP) for help info.' +des='Macro to create a bundle of SAS packages, version 20260602. Run %bundlePackages(HELP) for help info.' secure minoperator ; @@ -8702,7 +8750,7 @@ secure minoperator %put ### This is short help information for the `bundlePackages` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *create bundles* of SAS packages, version `20260515` #; + %put # Macro to *create bundles* of SAS packages, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -9196,7 +9244,7 @@ filename p2 "R:/dontexist"; ,verify=0 ,quiet=0 )/ -des='Macro to extract a bundle of SAS packages, version 20260515. Run %unbundlePackages(HELP) for help info.' +des='Macro to extract a bundle of SAS packages, version 20260602. Run %unbundlePackages(HELP) for help info.' secure minoperator ; @@ -9214,7 +9262,7 @@ minoperator %put ### This is short help information for the `unbundlePackages` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *extract* SAS packages from a bundle, version `20260515` #; + %put # Macro to *extract* SAS packages from a bundle, version `20260602` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -9650,7 +9698,7 @@ libname _ "R:\check5"; %macro SPFinit_intrnl_forceV7DSname( mcParam /* name of a macro parameter holding user provided data set name */ )/secure minoperator -des='SAS Packages Framework internal macro. Executable only inside selected SPF macros. Macro generates 4GL code that forces V7 compatybility for user provided data set names. Version 20260515.'; +des='SAS Packages Framework internal macro. Executable only inside selected SPF macros. Macro generates 4GL code that forces V7 compatybility for user provided data set names. Version 20260602.'; /* The macro can be called only inside a data step. */ /**************************************************************************** ### Parameters: @@ -9668,7 +9716,7 @@ des='SAS Packages Framework internal macro. Executable only inside selected SPF data set name, the second to last chunk is SCANned for libname (if empty then "work" is used). First character of LIB and DS variables is checked, if it is a digit, then underscore is added. - At the end the LIB and DS are concatenated and casted to upper + At the end the LIB and DS are concatenated and upper cased. case letters. Examples: @@ -9739,4 +9787,460 @@ des='SAS Packages Framework internal macro. Executable only inside selected SPF %end; %mend SPFinit_intrnl_forceV7DSname; + + +/*+requestPackage+*/ +%macro requestPackage( + packageName +,requiredVersion= +/* technical parameters passed to installPackage macro */ +, sourcePath = /* location of the package, e.g. "www.some.page/", mind the "/" at the end */ +, mirror = 0 /* indicates which location for package source should be used */ +, replace = 1 /* 1 = replace if the package already exist, 0 = otherwise */ +, backup = 0 /* 1 = before replacing make a copy if the package already exist, 0 = do nothing */ +, URLuser = /* user name for the password protected URLs */ +, URLpass = /* password for the password protected URLs */ +, 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 */ + +, github = /* name of a user or an organization in GitHub, all characters except [A-z0-9_.-] are compressed */ +, githubRepo = /* repo name to be used, by default it is the package name, but can be altered */ +, githubToken = /* user's github fine-grained personal access token */ +, githubTokenDebug = 0 /* debug values: 0,1,2,3 */ + +, loadPackage=1 /* should the packages be installed after installing */ +, force=0 /* force reloading even if already loaded */ +, ignoreDepVer=0 /* should dependencies version be ignore so that only the latest could be installed */ +, successDS= /* technical */ +) +/secure +des = 'Macro to request SAS package installation and loading, version 20260602. Run %requestPackage(HELP) for help info.'; + +%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then + %do; + %local options_tmp ; + %let options_tmp = ls=%sysfunc(getoption(ls)) ps=%sysfunc(getoption(ps)) + %sysfunc(getoption(notes)) %sysfunc(getoption(source)) + msglevel=%sysfunc(getoption(msglevel)) + ; + options NOnotes NOsource ls=MAX ps=MAX msglevel=N; + %put ; + %put ##############################################################################################; + %put ### This is short help information for the `requestPackage` macro #; + %put #--------------------------------------------------------------------------------------------#;; + %put # #; + %put # Macro to request (install and load) SAS packages, version `20260602` #; + %put # #; + %put # A SAS package is a zip file containing a group #; + %put # of SAS codes (macros, functions, data steps generating #; + %put # data, etc.) wrapped up together and embedded inside the zip. #; + %put # #; + %put # The `%nrstr(%%requestPackage())` macro installs and loads the package zip #; + %put # in the packages folder. The process takes care of installing or loading #; + %put # dependencies too. #; + %put # #; + %put # In case the packages fileref is a multi-directory one the first directory #; + %put # will be selected as a destination. #; + %put # #; + %put #--------------------------------------------------------------------------------------------#; + %put # #; + %put #### Parameters: #; + %put # #; + %put # 1. `packageName ` Name of a package _without_ the zip extension, e.g., myPackage1. #; + %put # Required and not null, default use case: #; + %put # `%nrstr(%%requestPackage(myPackage1))`. #; + %put # If empty displays this help information. #; + %put # #; + %put # **Installation options:** #; + %put # #; + %put # - `requiredVersion=` *Optional.* Indicates which package version we want #; + %put # to be requested, default value: `.` means "the latest". #; + %put # #; + %put # - `sourcePath=` Location of the package, e.g. "www.some.web.page/" #; + %put # Mind the "/" at the end of the path! #; + %put # Current default location for packages is: #; + %put # `https://github.com/SASPAC/` #; + %put # Current default location for the framework is: #; + %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/` #; + %put # #; + %put # - `mirror=` Indicates which web location for packages installation is used. #; + %put # Value `0` or `SASPAC` indicates: #; + %put # `https://github.com/SASPAC/` #; + %put # Value `1` indicates: #; + %put # `https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main` #; + %put # Value `2` indicates: #; + %put # `https://pages.mini.pw.edu.pl/~jablonskib/SASpublic/SAS_PACKAGES` #; + %put # Value `3` or `PharmaForest` indicates: #; + %put # `https://github.com/PharmaForest/` #; + %put # Default value is `0`. #; + %put # #; + %put # - `version=` Indicates which historical version of a package to install. #; + %put # Historical version are currently available only if `mirror=0` is set. #; + %put # Default value is null which means "install the latest". #; + %put # When there are multiple packages to install the `version` variable #; + %put # is scan sequentially. #; + %put # #; + %put # - `replace=` When set to `1` and a package file exists, it forces the package #; + %put # file replacement by the new downloaded file. #; + %put # It is a binary indicator ('0' or '1'). Default value is `1`. #; + %put # #; + %put # - `backup=` When set to `1` and a package file exists, it creates a backup copy #; + %put # of the package file. The backup copy is created with a suffix of the #; + %put # following format: `_BCKP_yyyymmddJJMMSS`. #; + %put # If `replace=0` then `backup` is set to `0`. #; + %put # It is a binary indicator ('0' or '1'). Default value is `0`. #; + %put # #; + %put # - `URLuser=` A user name for the password protected URLs, no quotes needed. #; + %put # #; + %put # - `URLpass=` A password for the password protected URLs, no quotes needed. #; + %put # #; + %put # - `URLoptions=` Options for the `sourcePath` URLs filename. Consult the SAS #; + %put # documentation for the further details. #; + %put # #; + %put # - `loadAddCnt=` *Optional.* A package zip may contain additional #; + %put # content. The option indicates if it should be loaded #; + %put # Default value of zero (`0`) means "No", one (`1`) #; + %put # means "Yes". Content is extracted into the **packages** fileref #; + %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 # - `github=` *Optional.* A name of a user or an organization in GitHub. #; + %put # Allows an easy set of the search path for packages available on GitHub: #; + %put # `https://github.com///raw/.../` #; + %put # All characters except `[A-z0-9_.-]` are compressed. #; + %put # #; + %put # - `githubRepo=` *Optional.* A name of a repository in GitHub. #; + %put # Allows an easy set of the search path for packages available on GitHub: #; + %put # `https://github.com///raw/.../` #; + %put # By default lowercase name of installed package is used. #; + %put # #; + %put # - `githubToken=` *Optional.* A fine-grained personal access token for GitHub. #; + %put # When the value is non-missing it triggers GitHub API access to #; + %put # private repositories. Of course the token used has to be configured #; + %put # properly for the access. #; + %put # Read GitHub documentation to learn how to create and setup your token: #; + %put # `https://docs.github.com/en/authentication/ #; + %put # keeping-your-account-and-data-secure/ #; + %put # managing-your-personal-access-tokens #; + %put # #creating-a-fine-grained-personal-access-token` #; + %put # (lines break added for easier reading) #; + %put # Public repos do not need authentication. #; + %put # [NOTE!] This feature is experimental in this release. #; + %put # #; + %put # **Loading options:** #; + %put # #; + %put # - `loadPackage=` *Optional.* Indicates if requested package should be loaded too #; + %put # or only installed. Dependencies are only installed. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put # - `force=` *Optional.* Indicates if requested package should be reloaded #; + %put # even if it was already loaded to the session. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put # - `ignoreDepVer=` *Optional.* Indicates if packages versions in dependencies list #; + %put # should be ignored and the latest available version be used. #; + %put # Default value of zero (`0`) means "No", one (`1`) means "Yes". #; + %put # #; + %put #--------------------------------------------------------------------------------------------#; + %put # #; + %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; + %put # to learn more. #; + %put # Tutorials available at: `https://github.com/yabwon/HoW-SASPackages` #; + %put # #; + %put #### Example #################################################################################; + %put # #; + %put # Enabling the SAS Package Framework #; + %put # from the local directory and requesting (installing & loading) #; + %put # the bpUTiL package from the Internet. #; + %put # #; + %put # Assume that the `SPFinit.sas` file #; + %put # is located in the "C:/SAS_PACKAGES/" folder. #; + %put # #; + %put # Run the following code in your SAS session: #; + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas; + %put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; ); + %put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; ); + %put ; + %put %nrstr( %%requestPackage(bpUTiL) %%* install and load the package from the Internet; ); + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; + %put #### Example #################################################################################; + %put # #; + %put # Enabling the SAS Package Framework #; + %put # from the local directory and installing & loading #; + %put # a package with a particular version from the Internet. #; + %put # #; + %put # Assume that the `SPFinit.sas` file #; + %put # is located in the "C:/SAS_PACKAGES/" folder. #; + %put # #; + %put # Run the following code in your SAS session: #; + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas; + %put %nrstr( filename packages "C:/SAS_PACKAGES"; ); + %put %nrstr( %%include packages(SPFinit.sas); ); + %put ; + %put %nrstr( %%requestPackage(LibnameZIP, requiredVersion=0.1.0) ); + %put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; + %put ##############################################################################################; + %put ; + options &options_tmp.; + %GOTO ENDofrequestPackage; + %end; + +%local _rname_ _alreadyLoaded_ options_tmp ; +%let _rname_ = _requestPckg_%sysfunc(sleep(1,0.042),best1.)%sysfunc(datetime(),hex16.)_; + +%let options_tmp = ls=%sysfunc(getoption(ls)) ps=%sysfunc(getoption(ps)) +%sysfunc(getoption(notes)) %sysfunc(getoption(source)) +msglevel=%sysfunc(getoption(msglevel)) +; +options NOnotes NOsource ls=MAX ps=MAX msglevel=N; +options source source2; +%let loadPackage = %sysevalf((1=%superq(loadPackage)),boolean); +%let replace = %sysevalf(1=%superq(replace),boolean); + +%let loadAddCnt = %sysevalf(NOT(0=%superq(loadAddCnt)),boolean); +%let instDoc = %sysevalf(NOT(0=%superq(instDoc)),boolean); +%let backup = %sysevalf(NOT(0=%superq(backup)),boolean); +%let force = %sysevalf(NOT(0=%superq(force)),boolean); + +%let ignoreDepVer = %sysevalf(NOT(0=%superq(ignoreDepVer)),boolean); + +data _null_; + /* standardize input data */ + length packageName $ 24 requiredVersion $ 24 sysloadedpackages $ 32767 vers verR $ 24 versN verRN 8; + packageName = scan(lowcase(symget('packageName')),1, " "); + sysloadedpackages = lowcase(symget('sysloadedpackages')); + requiredVersion = compress(symget('requiredVersion'),".","kd"); + + put "INFO: Requesting package " packageName @; + if requiredVersion NE " " then put "version " requiredVersion @; + put; + + /* check if required version is already installed */ + f = FIND(sysloadedpackages, cats(packageName,"("), "t"); + if f then + do; + vers = scan(substr(sysloadedpackages,f),2,"()"); + verR = requiredVersion; + + array V verR vers ; + array VN verRN versN; + do over V; + VN = coalesce(input(scan(V,1,".","M"),?? best.),0)*1e8 + + coalesce(input(scan(V,2,".","M"),?? best.),0)*1e4 + + coalesce(input(scan(V,3,".","M"),?? best.),0)*1e0; + end; + + /*put (_ALL_) (=/);*/ + if (. <= verRN <= versN) then + do; + put / "INFO: It looks like the " packageName "package is already loaded. Enjoy!"; + call symputX('_alreadyLoaded_', 1, "L"); + end; + else + put / "INFO: Searching for package file with requested version."; + end; + + call symputX('packageName', packageName, "L"); + call symputX('requiredVersion', requiredVersion, "L"); + _error_=0; +stop; +run; + + +%if NOT &_alreadyLoaded_.0 %then +%do; +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +/* get list of packages */ +%listPackages(work.&_rname_.,quiet=1) + +/* check if minimum required version is available */ +data work.&_rname_.; + set work.&_rname_.; + where tagNumber=3 + and PackageZIP=lowcase("&packageName..zip") + ; + + length vers verR $ 24 versN verRN 8; + vers = value; + verR = symget("requiredVersion"); + array V verR vers ; + array VN verRN versN; + do over V; + VN = coalesce(input(scan(V,1,".","M"),?? best.),0)*1e8 + + coalesce(input(scan(V,2,".","M"),?? best.),0)*1e4 + + coalesce(input(scan(V,3,".","M"),?? best.),0)*1e0; + end; + + /*put (_ALL_) (=/);*/ + if (.<= verRN <= versN) then output; /* output data only if proper version does not exist */ + stop; + keep base PackageZIP; +run; + +/* set global macro variable for installPackage macro*/ +%global &_rname_.; +%let &_rname_.=1.0; + +/* if package file does not exist or does not have required version then install package */ +data _null_; + /*put nobs=;*/ + length callValue $ 32767; + callValue= + '%nrstr(%installPackage(&packageName.' + !!',SFRCVN=&_rname_.' + !!',version=&requiredVersion.' + /* installPackages macro parameters*/ + !!',sourcePath = &sourcePath.' + !!',mirror = &mirror.' + !!',replace = &replace.' + !!',backup = &backup.' + !!',URLuser = &URLuser.' + !!',URLpass = &URLpass.' + !!',URLoptions = &URLoptions.' + !!',loadAddCnt = &loadAddCnt.' + !!',instDoc = &instDoc.' + !!',github = &github.' + !!',githubRepo = &githubRepo.' + !!',githubToken = &githubToken.' + !!',githubTokenDebug = &githubTokenDebug.' + !!"))" + ; + if NOT nobs then + do; + /*put "1) " callValue=;*/ + call execute(callValue); + end; + stop; + set work.&_rname_. nobs=nobs; +run; + +/* collect package installation status for upcoming checks */ +%if %sysevalf(%superq(successDS)=,boolean) %then + %do; + %let successDS=work.&_rname_.; /* the name can be reused now */ + data &successDS.; + length packageName $ 24 status 8; + packageName = symget('packageName'); + status = &&&_rname_.; + run; + %end; +%else + %do; + data work.&_rname_.; /* this one is used in the recursive call so it is different name */ + length packageName $ 24 status 8; + packageName = symget('packageName'); + status = &&&_rname_.; + proc append base=&successDS. data=work.&_rname_.; + run; + %end; + +/* after successful installation search for dependencies */ +data _null_; +_E_=&&&_rname_.; +if NOT (1.0=_E_) then stop; + +set sashelp.vextfl; +where fileref = "PACKAGES"; + +filevar=cats(xpath,"/&packageName..zip"); + +if fileexist(filevar); /* find the first package file, since it can be on lower level location */ +_END_=0; +_cut_=1; +infile _dummy_ ZIP filevar=filevar member="description.sas"; + +do while(_E_); + /* run requestPackage(packageName,requiredVersion=) recursively for dependencies */ + input; + if upcase(_infile_) =: "REQPACKAGES:" then + do; + putlog "INFO: Requesting dependencies..."; + do until(NOT _cut_); + _cut_+1; + length rv $ 64 r v $ 24; + rv = dequote(strip(scan(_infile_,_cut_,":,"))); + if rv =" " then _cut_=0; + else + do; + r = scan(rv,1,"()"); + v = scan(rv,2,"()"); + if 1=&ignoreDepVer. then v=""; /* ignore requested version and get the lates */ + length callValue $ 32767; + callValue = + '%nrstr(%requestPackage(' !! strip(r) + !!',requiredVersion=' !! strip(v) + !!',loadPackage=0' + !!',successDS=&successDS.' + !!',ignoreDepVer=&ignoreDepVer.' + /* installPackages macro parameters*/ + !!',sourcePath = &sourcePath.' + !!',mirror = &mirror.' + !!',replace = &replace.' + !!',backup = &backup.' + !!',URLuser = &URLuser.' + !!',URLpass = &URLpass.' + !!',URLoptions = &URLoptions.' + !!',loadAddCnt = &loadAddCnt.' + !!',instDoc = &instDoc.' + !!',github = &github.' + !!',githubRepo = &githubRepo.' + !!',githubToken = &githubToken.' + !!',githubTokenDebug = &githubTokenDebug.' + !!'))' + ; + /*put "2) " callValue=;*/ + call execute(strip(callValue)); + end; + end; + end; + + if upcase(_infile_) in: ("REQPACKAGES:", "DESCRIPTION START:", "DESCRIPTION END:") then _E_=0; +end; +/*put _ALL_;*/ +/*stop;*/ +run; + +/* execute loading if requested */ +%if &loadPackage. %then + %do; + /* + proc print data=&successDS.; + run; + */ + + /* check for installation errors */ + data _null_; + set &successDS.; + where status < 1; + call symputX('loadPackage',0,"L"); + put "ERROR: Installation of " &packageName. "package failed!"; + run; + /*************/ + %if ((1.0=&&&_rname_.) AND &loadPackage.) %then + %do; + options notes; + %loadPackage(&packageName.,requiredVersion=&requiredVersion.,force=&force.) + options nonotes; + %end; + /**************/ + %end; + +/* clean up */ +%symdel &_rname_. / nowarn; +proc delete data=work.&_rname_.; +run; +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ +%end; +options &options_tmp.; +%ENDofrequestPackage: +%mend requestPackage; + /* end of SPFinit.sas file */