From e3b86f115711998762ae42dcc99c1f50e4c3357d Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Thu, 21 Sep 2023 21:19:34 +0200 Subject: [PATCH 1/5] The macroArray package [ver. 1.1.1] The macroArray package [ver. 1.1.1] Changes: - bug fixes. - code optimization. The SHA256 hash digest for package `macroArray`: `F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50` --- packages/README.md | 4 ++-- packages/SHA256_for_packages.txt | 3 +++ packages/macroarray.md | 6 +++--- packages/macroarray.zip | Bin 51814 -> 52051 bytes 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/README.md b/packages/README.md index 5469745..14557ce 100644 --- a/packages/README.md +++ b/packages/README.md @@ -61,7 +61,7 @@ SHA256 digest for DFA: F*09EA5201360922A91A9EEE72F4567792E9CFDFB591BA33419E2BF2B --- -- **macroArray**\[1.1.0\], implementation of an array concept in a macro language, e.g. +- **macroArray**\[1.1.1\], implementation of an array concept in a macro language, e.g. ```sas %array(ABC[17] (111:127), macarray=Y); @@ -80,7 +80,7 @@ SHA256 digest for DFA: F*09EA5201360922A91A9EEE72F4567792E9CFDFB591BA33419E2BF2B which = 1:H:2 ); ``` -SHA256 digest for macroArray: F*6A22A01868F4203862B3685F543D723C7DB8E9AB3C1A6357D2BFA030971B0D3C +SHA256 digest for macroArray: F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50 [Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 851f758..8a1a77c 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20230921 */ +macroArray: F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50 + /* 20230919 */ BasePlus: F*B91771D45C781B6806DBB44A3B491A0784D7698B9F3BBBE1A86EE5594834315F diff --git a/packages/macroarray.md b/packages/macroarray.md index fdeb46d..ca8b22d 100644 --- a/packages/macroarray.md +++ b/packages/macroarray.md @@ -19,7 +19,7 @@ --- -# The macroArray package [ver. 1.0.6] ############################################### +# The macroArray package [ver. 1.1.1] ############################################### The **macroArray** package implements a macro array facility: - `%array()`, @@ -75,10 +75,10 @@ Package contains: Required SAS Components: *Base SAS Software* -*SAS package generated by generatePackage, version 20230905* +*SAS package generated by generatePackage, version 20230904* The SHA256 hash digest for package macroArray: -`F*4FAAEE7DF2854EA31933AE017A89C1615C7291A66A07CCE345041EB0D587ED4E` +`F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50` --- # Content description ############################################################################################ diff --git a/packages/macroarray.zip b/packages/macroarray.zip index 411c831f9af6d0d2ede276746f281b6e17a0bff6..6bb2437b9e537f9c4344ad6d9b739a2822208c93 100644 GIT binary patch delta 17186 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

N{o{+#Lz#-(4}9`UEZn^~SQ@+!f+btq(5_ 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 delta 16966 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 G_kRFe>)0y* From 3111b6667ecfbb045844cd62318ee2ac3e63157a Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Tue, 26 Sep 2023 13:16:36 +0200 Subject: [PATCH 2/5] Update README.md Don't forget to **STAR** (:star:) the repository! --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ccbb2ef..e81c983 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ The *purpose of a package* is to be a simple, and easy to access, code sharing m In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. +Don't forget to **STAR** (:star:) the repository! :-) --- ### Current version: From 266a1fe1a7da3f99b6e9bdfa0b96396efad648a7 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Tue, 26 Sep 2023 13:16:52 +0200 Subject: [PATCH 3/5] Update README.md Don't forget to **STAR** (:star:) the repository! --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e81c983..00b1ef9 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ The *purpose of a package* is to be a simple, and easy to access, code sharing m In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. Don't forget to **STAR** (:star:) the repository! :-) + --- ### Current version: From 4069f066aab8757bc7bb0a9cca7d1e7b048d245c Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Tue, 26 Sep 2023 13:19:26 +0200 Subject: [PATCH 4/5] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 00b1ef9..05f320c 100644 --- a/README.md +++ b/README.md @@ -148,9 +148,9 @@ The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS ### Updates worth mentioning: -**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**\[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**\[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**\[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**\[November 21st, 2022\]**:** `%loadPackage()` **macro allows Cherry Picking of content (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221121 "Cherry Picking"))**. @@ -176,7 +176,7 @@ This is a list of locations where the SAS Packages Framework is used: If you want to share that you are using the SPF let me know and I'll update the list. -If you find the SPF useful **share info** about it or **give it a [star](https://github.com/yabwon/SAS_PACKAGES/stargazers)** so more people will know. +If you find the SPF useful **share info** about it or **give it a [star (:star:)](https://github.com/yabwon/SAS_PACKAGES/stargazers)** so more people will know. --- From af94d49a79a6af40d9fc99a120940619742aa5ab Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Mon, 9 Oct 2023 18:04:52 +0200 Subject: [PATCH 5/5] SAS Packages Framework version 20231009 SAS Packages Framework version 20231009 Bug fix in `%generatePackage()` macro. Documentation updated. --- README.md | 2 +- SPF/Macros/extendpackagesfileref.sas | 4 +- SPF/Macros/generatepackage.sas | 32 ++++++++--- SPF/Macros/helppackage.sas | 6 +-- SPF/Macros/installpackage.sas | 6 +-- SPF/Macros/listpackages.sas | 6 +-- SPF/Macros/loadpackage.sas | 4 +- SPF/Macros/loadpackageaddcnt.sas | 4 +- SPF/Macros/loadpackages.sas | 4 +- SPF/Macros/previewpackage.sas | 4 +- SPF/Macros/unloadpackage.sas | 4 +- SPF/Macros/verifypackage.sas | 4 +- SPF/SPFinit.md | 57 ++++++++++---------- SPF/SPFinit.sas | 80 +++++++++++++++++----------- 14 files changed, 127 insertions(+), 90 deletions(-) diff --git a/README.md b/README.md index 05f320c..849099a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Don't forget to **STAR** (:star:) the repository! :-) ### Current version: -**The latest version** of SPF is **`20230904`**. +**The latest version** of SPF is **`20231009`**. To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). diff --git a/SPF/Macros/extendpackagesfileref.sas b/SPF/Macros/extendpackagesfileref.sas index 86d1ba3..7b52e02 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 20230904. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20231009. 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 20230904 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20230904` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20231009` #; %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 071e9b0..8428697 100644 --- a/SPF/Macros/generatepackage.sas +++ b/SPF/Macros/generatepackage.sas @@ -23,7 +23,7 @@ default value 1 means "delete tests work" */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20231009. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20230904` #; + %put # Macro to generate SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -71,6 +71,7 @@ des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() %put # if there are dependencies in loading the package. #; %put # Has to be a single directory, if more than one are #; %put # provided than only the first is used. #; + %put # If path to location contains spaces it should be quoted! #; %put # #; %put # - `testResults=` Location where tests results should be stored, #; %put # if null (the default) then the session WORK is used. #; @@ -809,6 +810,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ %end; +footnote1 "SAS Packages Framework, version 20231009"; proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); run; @@ -835,6 +837,7 @@ title; %end; title; +footnote; options ¬esSourceOptions.; @@ -1521,7 +1524,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / - ' !! '' %put with the SAS Packages Framework version 20230904.;''' / + ' !! '' %put with the SAS Packages Framework version 20231009.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -1694,7 +1697,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / - ''' %put with the SAS Packages Framework version 20230904.; '' !! ' / + ''' %put with the SAS Packages Framework version 20231009.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -2310,7 +2313,7 @@ data _null_; put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;"; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20230904 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20231009 *"; put "***";'; put 'run; ' /; @@ -2703,7 +2706,20 @@ filename &zipReferrence. clear; %put NOTE-; /* in case the packages macrovariable is multi-directory the first directory will be selected */ data _null_; - call symputX("packages", dequote(kscanx(resolve(symget("packages")), 1, "()", "QS")) ,"L"); + length packages $ 32767; + packages = resolve(symget("packages")); + + /* check if path contains quotes */ + quotes = lengthn(compress(packages,"""'","K")); + + /* issue error for unmatched quotes */ + if mod(quotes,2) then + put "ERROR: Unbalanced quotes in the PACKAGES= parameter." / "ERROR- " PACKAGES= ; + + if quotes > 0 then + call symputX("packages", dequote(kscanx(packages, 1, "()", "QS")) ,"L"); + else + call symputX("packages", packages ,"L"); run; /* check if systask is available */ @@ -2719,7 +2735,9 @@ run; put 'NOTE-'; n=6; - put @n "filename packages '&packages.';" /; + length packages $ 32767; + packages = quote(dequote(strip(symget('packages')))); + put @n "filename packages " packages ";" /; if fileexist("&packages./SPFinit.sas") then put @n '%include packages(SPFinit.sas);' /; diff --git a/SPF/Macros/helppackage.sas b/SPF/Macros/helppackage.sas index 2401ed3..71f84e2 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 20230904. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20231009. Run %helpPackage() 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 20230904. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20230904` #; + %put # Macro to get help about SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -181,7 +181,7 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20230904 */ +/* Macros to install SAS packages, version 20231009 */ /* 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 diff --git a/SPF/Macros/installpackage.sas b/SPF/Macros/installpackage.sas index 174a3a1..9563530 100644 --- a/SPF/Macros/installpackage.sas +++ b/SPF/Macros/installpackage.sas @@ -16,7 +16,7 @@ /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20230904. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20231009. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -31,7 +31,7 @@ des = 'Macro to install SAS package, version 20230904. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20230904` #; + %put # Macro to install SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -483,7 +483,7 @@ des = 'Macro to install SAS package, version 20230904. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20230904 + Version 20231009 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/Macros/listpackages.sas b/SPF/Macros/listpackages.sas index baa75cc..72069f2 100644 --- a/SPF/Macros/listpackages.sas +++ b/SPF/Macros/listpackages.sas @@ -1,7 +1,7 @@ /*+listPackages+*/ %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20230904.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231009.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -16,7 +16,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 `20230904` #; + %put # Macro to list available SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -166,7 +166,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20230904 + Version 20231009 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating diff --git a/SPF/Macros/loadpackage.sas b/SPF/Macros/loadpackage.sas index ab34892..04e2f00 100644 --- a/SPF/Macros/loadpackage.sas +++ b/SPF/Macros/loadpackage.sas @@ -34,7 +34,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20230904. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20231009. Run %loadPackage() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -50,7 +50,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20230904` #; + %put # Macro to *load* SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/loadpackageaddcnt.sas b/SPF/Macros/loadpackageaddcnt.sas index 2bb0bbc..ba17ebb 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 20230904. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20231009. Run %loadPackageAddCnt() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -35,7 +35,7 @@ minoperator %put ### This is short help information for the `loadPackageAddCnt` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* additional content for a SAS package, version `20230904` #; + %put # Macro to *load* additional content for a SAS package, version `20231009` #; %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 9d25c03..fdafd23 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 20230904. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20231009. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -27,7 +27,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20230904` #; + %put # Macro wrapper for the loadPackage macro, version `20231009` #; %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 21e8d54..c2993b9 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 20230904. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20231009. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20230904. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get previwe of a SAS packages, version `20230904` #; + %put # Macro to get previwe of a SAS packages, version `20231009` #; %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 3e904e6..5a06ea5 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 20230904. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20231009. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20230904. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20230904` #; + %put # Macro to unload SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/SPF/Macros/verifypackage.sas b/SPF/Macros/verifypackage.sas index c851a1b..5688795 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 20230904. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20231009. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230904. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20230904` #; + %put # Macro to verify SAS package with it hash digest, version `20231009` #; %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 b466c4f..d119a5b 100644 --- a/SPF/SPFinit.md +++ b/SPF/SPFinit.md @@ -22,7 +22,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 **`20230905`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20231009`**. **To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). @@ -40,7 +40,7 @@ After assigning the directory do not change them when using the SPF since it may ## This is short help information for the `installPackage` macro -------------------------------------------------------------------------------------------- - Macro to install SAS packages, version `20230905` + Macro to install SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -149,7 +149,7 @@ filename packages "C:/SAS_PACKAGES"; ## This is short help information for the `helpPackage` macro ------------------------------------------------------------------------------- - Macro to get help about SAS packages, version `20230905` + Macro to get help about SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -225,7 +225,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 `20230905` + Macro to *load* SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -377,7 +377,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 `20230905` + Macro wrapper for the loadPackage macro, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -426,7 +426,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ## This is short help information for the `unloadPackage` macro ------------------------------------------------------------------------------- - Macro to unload SAS packages, version `20230905` + Macro to unload SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -491,7 +491,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 `20230905` + Macro to list available SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -532,7 +532,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 `20230905` + Macro to verify SAS package with it hash digest, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -586,7 +586,7 @@ filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages; ## This is short help information for the `previewPackage` macro ------------------------------------------------------------------------------- - Macro to get previwe of a SAS packages, version `20230905` + Macro to get previwe of a SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -653,7 +653,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 `20230905` + Macro to generate SAS packages, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -666,7 +666,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; ------------------------------------------------------------------------------- - Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` + Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` to read about the details of package generation process. ### Parameters: @@ -685,23 +685,24 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages; - `packages=` Location of other packages for testing if there are dependencies in loading the package. Has to be a single directory, if more than one are - provided than only the first is used. + provided than only the first is used. + If path to location contains spaces it should be quoted! -- `testResults=` Location where tests results should be stored, - if null (the default) then the session WORK is used. + - `testResults=` Location where tests results should be stored, + if null (the default) then the session WORK is used. -- `sasexe=` Location of a DIRECTORY where the SAS binary is located, - if null (the default) then the `!SASROOT` is used. - -- `sascfgFile=` Location of a FILE with testing session configuration - parameters, if null (the default) then no config file - is pointed during the SAS invocation, - if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. - -- `delTestWork=` Indicates if `WORK` directories generated by user tests - should be deleted, i.e. the (NO)WORKTERM option is set. - The default value: `1` means "delete tests work". - Available values are `0` and `1`. + - `sasexe=` Location of a DIRECTORY where the SAS binary is located, + if null (the default) then the `!SASROOT` is used. + + - `sascfgFile=` Location of a FILE with testing session configuration + parameters, if null (the default) then no config file + is pointed during the SAS invocation, + if set to `DEF` then the `!SASROOT/sasv9.cfg` is used. + + - `delTestWork=` Indicates if `WORK` directories generated by user tests + should be deleted, i.e. the (NO)WORKTERM option is set. + The default value: `1` means "delete tests work". + Available values are `0` and `1`. ------------------------------------------------------------------------------- @@ -846,7 +847,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 `20230905` + Macro to list directories pointed by 'packages' fileref, version `20231009` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -886,7 +887,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 `20230905` + Macro to load *additional content* for a SAS package, version `20231009` 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 9a99ee9..a7d8eba 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20230904. + Version 20231009. See examples below. A SAS package is a zip file containing a group of files @@ -89,7 +89,7 @@ */ )/secure /*** HELP END ***/ -des = 'Macro to load SAS package, version 20230904. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20231009. Run %loadPackage() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -105,7 +105,7 @@ minoperator %put ### This is short help information for the `loadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to *load* SAS packages, version `20230904` #; + %put # Macro to *load* SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -360,7 +360,7 @@ minoperator */ )/secure /*** HELP END ***/ -des = 'Macro to unload SAS package, version 20230904. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20231009. Run %unloadPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -375,7 +375,7 @@ des = 'Macro to unload SAS package, version 20230904. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20230904` #; + %put # Macro to unload SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -524,7 +524,7 @@ des = 'Macro to unload SAS package, version 20230904. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20230904. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20231009. Run %helpPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -539,7 +539,7 @@ des = 'Macro to get help about SAS package, version 20230904. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20230904` #; + %put # Macro to get help about SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -677,7 +677,7 @@ TODO: - add MD5(&packageName.) value hash instead "package" word in filenames [DONE] */ -/* Macros to install SAS packages, version 20230904 */ +/* Macros to install SAS packages, version 20231009 */ /* 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 @@ -702,7 +702,7 @@ TODO: /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20230904. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20231009. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -717,7 +717,7 @@ des = 'Macro to install SAS package, version 20230904. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20230904` #; + %put # Macro to install SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1169,7 +1169,7 @@ des = 'Macro to install SAS package, version 20230904. Run %%installPackage() fo /* Macro to list SAS packages in packages folder. - Version 20230904 + Version 20231009 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1190,7 +1190,7 @@ des = 'Macro to install SAS package, version 20230904. Run %%installPackage() fo /*+listPackages+*/ %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20230904.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231009.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -1205,7 +1205,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 `20230904` #; + %put # Macro to list available SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1355,7 +1355,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; /* Macro to generate SAS packages. - Version 20230904 + Version 20231009 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1392,7 +1392,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; default value 1 means "delete tests work" */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20231009. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1407,7 +1407,7 @@ des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20230904` #; + %put # Macro to generate SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1440,6 +1440,7 @@ des = 'Macro to generate SAS packages, version 20230904. Run %generatePackage() %put # if there are dependencies in loading the package. #; %put # Has to be a single directory, if more than one are #; %put # provided than only the first is used. #; + %put # If path to location contains spaces it should be quoted! #; %put # #; %put # - `testResults=` Location where tests results should be stored, #; %put # if null (the default) then the session WORK is used. #; @@ -2178,6 +2179,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_."; title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ %end; +footnote1 "SAS Packages Framework, version 20231009"; proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); run; @@ -2204,6 +2206,7 @@ title; %end; title; +footnote; options ¬esSourceOptions.; @@ -2890,7 +2893,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / - ' !! '' %put with the SAS Packages Framework version 20230904.;''' / + ' !! '' %put with the SAS Packages Framework version 20231009.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -3063,7 +3066,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / - ''' %put with the SAS Packages Framework version 20230904.; '' !! ' / + ''' %put with the SAS Packages Framework version 20231009.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -3679,7 +3682,7 @@ data _null_; put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;"; %end; - put 'put "***"; put "* SAS package generated by generatePackage, version 20230904 *"; put "***";'; + put 'put "***"; put "* SAS package generated by generatePackage, version 20231009 *"; put "***";'; put 'run; ' /; @@ -4072,7 +4075,20 @@ filename &zipReferrence. clear; %put NOTE-; /* in case the packages macrovariable is multi-directory the first directory will be selected */ data _null_; - call symputX("packages", dequote(kscanx(resolve(symget("packages")), 1, "()", "QS")) ,"L"); + length packages $ 32767; + packages = resolve(symget("packages")); + + /* check if path contains quotes */ + quotes = lengthn(compress(packages,"""'","K")); + + /* issue error for unmatched quotes */ + if mod(quotes,2) then + put "ERROR: Unbalanced quotes in the PACKAGES= parameter." / "ERROR- " PACKAGES= ; + + if quotes > 0 then + call symputX("packages", dequote(kscanx(packages, 1, "()", "QS")) ,"L"); + else + call symputX("packages", packages ,"L"); run; /* check if systask is available */ @@ -4088,7 +4104,9 @@ run; put 'NOTE-'; n=6; - put @n "filename packages '&packages.';" /; + length packages $ 32767; + packages = quote(dequote(strip(symget('packages')))); + put @n "filename packages " packages ";" /; if fileexist("&packages./SPFinit.sas") then put @n '%include packages(SPFinit.sas);' /; @@ -4685,7 +4703,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20230904. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20231009. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -4701,7 +4719,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20230904` #; + %put # Macro wrapper for the loadPackage macro, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -4798,7 +4816,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20230904. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20231009. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -4813,7 +4831,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230904. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20230904` #; + %put # Macro to verify SAS package with it hash digest, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -4992,7 +5010,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230904. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20230904. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20231009. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -5007,7 +5025,7 @@ des = 'Macro to preview content of a SAS package, version 20230904. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get previwe of a SAS packages, version `20230904` #; + %put # Macro to get previwe of a SAS packages, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5134,7 +5152,7 @@ des = 'Macro to preview content of a SAS package, version 20230904. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20230904. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20231009. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -5150,7 +5168,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20230904 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20230904` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5251,7 +5269,7 @@ filename packages list; is provided in required version */ )/secure /*** HELP END ***/ -des = 'Macro to load additional content for a SAS package, version 20230904. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20231009. Run %loadPackageAddCnt() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -5267,7 +5285,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 `20230904` #; + %put # Macro to *load* additional content for a SAS package, version `20231009` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #;