From b47b1fb53658c25f218f7666aeae10ba0f0fa354 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Wed, 29 May 2024 16:34:37 +0200 Subject: [PATCH 1/2] SAS Packages Framework, version `20240529` SAS Packages Framework, version `20240529` Changes: - aesthetic changes in log when running `%generatePackage()` macro, - reshaped format of an automatic documentation header, - and little bug fix for automatic documentation generation (for excluding file from documentation the `IN` operator should be used instead `IN:`). --- BasePlus, version `1.39.0` Changes: - new parameter `DSout=` added in `%downloadFilesTo()` macro, - file SHA256: `F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687` for this version. --- SPF/Macros/extendpackagesfileref.sas | 4 +- SPF/Macros/generatepackage.sas | 32 ++++++----- SPF/Macros/helppackage.sas | 4 +- 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 | 24 ++++----- SPF/SPFinit.sas | 78 ++++++++++++++------------- packages/README.md | 4 +- packages/SHA256_for_packages.txt | 3 ++ packages/baseplus.md | 44 +++++++++------ packages/baseplus.zip | Bin 303426 -> 303966 bytes 17 files changed, 125 insertions(+), 104 deletions(-) diff --git a/SPF/Macros/extendpackagesfileref.sas b/SPF/Macros/extendpackagesfileref.sas index 00d2886..d7aa4f4 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 20240423. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20240529. 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 20240423 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20240423` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20240529` #; %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 6988cf2..f7adbdb 100644 --- a/SPF/Macros/generatepackage.sas +++ b/SPF/Macros/generatepackage.sas @@ -3,7 +3,7 @@ Macro to generate SAS packages. - Version 20240415 + Version 20240529 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -43,7 +43,7 @@ file name be created */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20240423. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20240529. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -58,7 +58,7 @@ des = 'Macro to generate SAS packages, version 20240423. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20240423` #; + %put # Macro to generate SAS packages, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -634,6 +634,7 @@ data &filesWithCodes.; put; _abort_ + 1; end; + length fileshort $ 256; fileshort = substr(file, 1, length(file) - 4); /* filename.sas -> filename */ if strip(reverse(file)) in: ('sas.') then output; /* ignore not ".sas" files */ @@ -854,7 +855,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 20240423"; +footnote1 "SAS Packages Framework, version 20240529"; proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); run; @@ -1575,7 +1576,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / - ' !! '' %put with the SAS Packages Framework version 20240423.;''' / + ' !! '' %put with the SAS Packages Framework version 20240529.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -1740,7 +1741,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / - ''' %put with the SAS Packages Framework version 20240423.; '' !! ' / + ''' %put with the SAS Packages Framework version 20240529.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -2131,7 +2132,7 @@ data _null_; if not (upcase(type)=:'MACRO') then continue; put ' %put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put ' %put NOTE- ;'; - put ' ,"' fileshort upcase32. '"' /; + put ' ,"' fileshort upcase64. '"' /; end; /**/ put ' )'; @@ -2149,7 +2150,7 @@ data _null_; if not (upcase(type)=:'FORMAT') then continue; put ' %put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put ' %put NOTE- ;'; - put ' ,"' fileshort upcase32. '"' /; + put ' ,"' fileshort upcase64. '"' /; isFormat + 1; end; put ' )'; @@ -2389,6 +2390,7 @@ data _null_; set &filesWithCodes. end = EOFDS nobs = NOBS; if upcase(type) in: ('TEST') then continue; /* exclude tests */ + length fileshort2 $ 256; select; when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); @@ -2527,7 +2529,7 @@ data _null_; %end; put 'put " " / @3 "--------------------------------------------------------------------" / " ";' - / 'put @3 "*SAS package generated by SAS Package Framework, version `20240423`*";' + / 'put @3 "*SAS package generated by SAS Package Framework, version `20240529`*";' / 'put " " / @3 "--------------------------------------------------------------------";'; put 'run; ' /; @@ -2564,6 +2566,7 @@ data _null_; set &filesWithCodes. end = EOFDS; if upcase(type) in: ('TEST') then continue; /* exclude tests */ + length fileshort2 $ 256; select; when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); @@ -3504,11 +3507,11 @@ data &filesWithCodes.markdown; packageHashC=symget("packageHashC"); drop package:; - put " " / "---" / " " + put " " / 64*"-" / " " + / ' *' packageTitle +(-1)'* ' + / " " / 64*"-" / " " / "### Version information:" / " " - / ' *' packageTitle +(-1)'* ' - / " " / "- Package: &packageName." / "- Version: &packageVersion." / "- Generated: " packageGenerated @@ -3563,7 +3566,7 @@ data &filesWithCodes.markdown; %end; put " " / "--------------------------------------------------------------------" / " " - / "*SAS package generated by SAS Package Framework, version `20240423`*" + / "*SAS package generated by SAS Package Framework, version `20240529`*" / " " / "--------------------------------------------------------------------" / " "; put "# The `&packageName.` package content"; @@ -3586,7 +3589,7 @@ data &filesWithCodes.markdown; _FILEVARPATH_=catx("/",base,folder,file); infile _dummy_ FILEVAR=_FILEVARPATH_; input; - if strip(_infile_) IN: ( + if strip(_infile_) IN ( '/*##DoNotUse4Documentation##*/' '/*##ExcludeFromDocumentation##*/' '/*##ExcludeFromMarkdownDoc##*/' @@ -3596,6 +3599,7 @@ data &filesWithCodes.markdown; type2=type; length link $ 256; link=catx("-",compress(fileshort,,"KAD"),type,CUROBS); + length fileshort $ 256; select; when (upcase(type) =: "MACRO" ) fileshort2 = cats('`%', fileshort, "()`"); when (upcase(type) =: "FORMAT" ) do; fileshort2 = cats("`$", fileshort, ".`"); type2='format/informat'; end; diff --git a/SPF/Macros/helppackage.sas b/SPF/Macros/helppackage.sas index 514c209..ea51530 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 20240423. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20240529. 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 20240423. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20240423` #; + %put # Macro to get help about SAS packages, version `20240529` #; %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 d2dc1c6..ff83680 100644 --- a/SPF/Macros/installpackage.sas +++ b/SPF/Macros/installpackage.sas @@ -1,5 +1,5 @@ /*+installPackage+*/ -/* Macros to install SAS packages, version 20240415 */ +/* Macros to install SAS packages, version 20240529 */ /* 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 @@ -22,7 +22,7 @@ /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20240423. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20240529. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -37,7 +37,7 @@ des = 'Macro to install SAS package, version 20240423. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20240423` #; + %put # Macro to install SAS packages, version `20240529` #; %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 9e6106d..fa27c0b 100644 --- a/SPF/Macros/listpackages.sas +++ b/SPF/Macros/listpackages.sas @@ -3,7 +3,7 @@ Macro to list SAS packages in packages folder. - Version 20240415 + Version 20240529 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -22,7 +22,7 @@ %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240423.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240529.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -37,7 +37,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 `20240423` #; + %put # Macro to list available SAS packages, version `20240529` #; %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 1f8789c..9dd3709 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 20240423. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20240529. 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 `20240423` #; + %put # Macro to *load* SAS packages, version `20240529` #; %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 68d6f0e..a4800ad 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 20240423. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20240529. 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 `20240423` #; + %put # Macro to *load* additional content for a SAS package, version `20240529` #; %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 2be9ebe..5b80538 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 20240423. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20240529. 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 `20240423` #; + %put # Macro wrapper for the loadPackage macro, version `20240529` #; %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 2f03ed6..117c15a 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 20240423. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20240529. 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 20240423. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20240423` #; + %put # Macro to get preview of a SAS packages, version `20240529` #; %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 9bbab92..55318ad 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 20240423. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20240529. 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 20240423. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20240423` #; + %put # Macro to unload SAS packages, version `20240529` #; %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 13c02cd..e10249b 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 20240423. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20240529. 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 20240423. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20240423` #; + %put # Macro to verify SAS package with it hash digest, version `20240529` #; %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 2dfe2fe..d29618a 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 **`20240423`**. +In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20240529`**. **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 `20240423` + Macro to install SAS packages, version `20240529` 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 `20240423` + Macro to get help about SAS packages, version `20240529` 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 `20240423` + Macro to *load* SAS packages, version `20240529` 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 `20240423` + Macro wrapper for the loadPackage macro, version `20240529` 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 `20240423` + Macro to unload SAS packages, version `20240529` 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 `20240423` + Macro to list available SAS packages, version `20240529` 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 `20240423` + Macro to verify SAS package with it hash digest, version `20240529` 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 preview of a SAS packages, version `20240423` + Macro to get preview of a SAS packages, version `20240529` 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 `20240423` + Macro to generate SAS packages, version `20240529` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -868,7 +868,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 `20240423` + Macro to list directories pointed by 'packages' fileref, version `20240529` A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -908,7 +908,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 `20240423` + Macro to load *additional content* for a SAS package, version `20240529` 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 7a517a1..8f8c767 100644 --- a/SPF/SPFinit.sas +++ b/SPF/SPFinit.sas @@ -42,7 +42,7 @@ - to unload, or - to generate SAS packages. - Version 20240423. + Version 20240529. 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 20240423. Run %loadPackage() for help info.' +des = 'Macro to load SAS package, version 20240529. 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 `20240423` #; + %put # Macro to *load* SAS packages, version `20240529` #; %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 20240423. Run %unloadPackage() for help info.' +des = 'Macro to unload SAS package, version 20240529. 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 20240423. Run %unloadPackage() for h %put ### This is short help information for the `unloadPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to unload SAS packages, version `20240423` #; + %put # Macro to unload SAS packages, version `20240529` #; %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 20240423. Run %unloadPackage() for h */ )/secure /*** HELP END ***/ -des = 'Macro to get help about SAS package, version 20240423. Run %helpPackage() for help info.' +des = 'Macro to get help about SAS package, version 20240529. 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 20240423. Run %helpPackage() %put ### This is short help information for the `helpPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get help about SAS packages, version `20240423` #; + %put # Macro to get help about SAS packages, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -678,7 +678,7 @@ TODO: */ /*+installPackage+*/ -/* Macros to install SAS packages, version 20240415 */ +/* Macros to install SAS packages, version 20240529 */ /* 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 @@ -701,7 +701,7 @@ TODO: /secure minoperator /*** HELP END ***/ -des = 'Macro to install SAS package, version 20240423. Run %%installPackage() for help info.' +des = 'Macro to install SAS package, version 20240529. Run %%installPackage() for help info.' ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %do; @@ -716,7 +716,7 @@ des = 'Macro to install SAS package, version 20240423. Run %%installPackage() fo %put ### This is short help information for the `installPackage` macro #; %put #--------------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to install SAS packages, version `20240423` #; + %put # Macro to install SAS packages, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1170,7 +1170,7 @@ des = 'Macro to install SAS package, version 20240423. Run %%installPackage() fo Macro to list SAS packages in packages folder. - Version 20240415 + Version 20240529 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1189,7 +1189,7 @@ des = 'Macro to install SAS package, version 20240423. Run %%installPackage() fo %macro listPackages()/secure PARMBUFF -des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240423.' +des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240529.' ; %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %do; @@ -1204,7 +1204,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 `20240423` #; + %put # Macro to list available SAS packages, version `20240529` #; %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 20240415 + Version 20240529 A SAS package is a zip file containing a group of SAS codes (macros, functions, data steps generating @@ -1395,7 +1395,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; file name be created */ )/ secure minoperator /*** HELP END ***/ -des = 'Macro to generate SAS packages, version 20240423. Run %generatePackage() for help info.' +des = 'Macro to generate SAS packages, version 20240529. Run %generatePackage() for help info.' ; %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %do; @@ -1410,7 +1410,7 @@ des = 'Macro to generate SAS packages, version 20240423. Run %generatePackage() %put ### This is short help information for the `generatePackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to generate SAS packages, version `20240423` #; + %put # Macro to generate SAS packages, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -1986,6 +1986,7 @@ data &filesWithCodes.; put; _abort_ + 1; end; + length fileshort $ 256; fileshort = substr(file, 1, length(file) - 4); /* filename.sas -> filename */ if strip(reverse(file)) in: ('sas.') then output; /* ignore not ".sas" files */ @@ -2206,7 +2207,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 20240423"; +footnote1 "SAS Packages Framework, version 20240529"; proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); run; @@ -2927,7 +2928,7 @@ data _null_; %end; put +(-1) '`.;''' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / - ' !! '' %put with the SAS Packages Framework version 20240423.;''' / + ' !! '' %put with the SAS Packages Framework version 20240529.;''' / ' !! '' %put ****************************************************************************;''' / ' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %end;''' ; @@ -3092,7 +3093,7 @@ data _null_; %end; put +(-1) '`.; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / - ''' %put with the SAS Packages Framework version 20240423.; '' !! ' / + ''' %put with the SAS Packages Framework version 20240529.; '' !! ' / ''' %put ****************************************************************************; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' / ''' %end; '' !! ' / @@ -3483,7 +3484,7 @@ data _null_; if not (upcase(type)=:'MACRO') then continue; put ' %put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put ' %put NOTE- ;'; - put ' ,"' fileshort upcase32. '"' /; + put ' ,"' fileshort upcase64. '"' /; end; /**/ put ' )'; @@ -3501,7 +3502,7 @@ data _null_; if not (upcase(type)=:'FORMAT') then continue; put ' %put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put ' %put NOTE- ;'; - put ' ,"' fileshort upcase32. '"' /; + put ' ,"' fileshort upcase64. '"' /; isFormat + 1; end; put ' )'; @@ -3741,6 +3742,7 @@ data _null_; set &filesWithCodes. end = EOFDS nobs = NOBS; if upcase(type) in: ('TEST') then continue; /* exclude tests */ + length fileshort2 $ 256; select; when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); @@ -3879,7 +3881,7 @@ data _null_; %end; put 'put " " / @3 "--------------------------------------------------------------------" / " ";' - / 'put @3 "*SAS package generated by SAS Package Framework, version `20240423`*";' + / 'put @3 "*SAS package generated by SAS Package Framework, version `20240529`*";' / 'put " " / @3 "--------------------------------------------------------------------";'; put 'run; ' /; @@ -3916,6 +3918,7 @@ data _null_; set &filesWithCodes. end = EOFDS; if upcase(type) in: ('TEST') then continue; /* exclude tests */ + length fileshort2 $ 256; select; when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); @@ -4856,11 +4859,11 @@ data &filesWithCodes.markdown; packageHashC=symget("packageHashC"); drop package:; - put " " / "---" / " " + put " " / 64*"-" / " " + / ' *' packageTitle +(-1)'* ' + / " " / 64*"-" / " " / "### Version information:" / " " - / ' *' packageTitle +(-1)'* ' - / " " / "- Package: &packageName." / "- Version: &packageVersion." / "- Generated: " packageGenerated @@ -4915,7 +4918,7 @@ data &filesWithCodes.markdown; %end; put " " / "--------------------------------------------------------------------" / " " - / "*SAS package generated by SAS Package Framework, version `20240423`*" + / "*SAS package generated by SAS Package Framework, version `20240529`*" / " " / "--------------------------------------------------------------------" / " "; put "# The `&packageName.` package content"; @@ -4938,7 +4941,7 @@ data &filesWithCodes.markdown; _FILEVARPATH_=catx("/",base,folder,file); infile _dummy_ FILEVAR=_FILEVARPATH_; input; - if strip(_infile_) IN: ( + if strip(_infile_) IN ( '/*##DoNotUse4Documentation##*/' '/*##ExcludeFromDocumentation##*/' '/*##ExcludeFromMarkdownDoc##*/' @@ -4948,6 +4951,7 @@ data &filesWithCodes.markdown; type2=type; length link $ 256; link=catx("-",compress(fileshort,,"KAD"),type,CUROBS); + length fileshort $ 256; select; when (upcase(type) =: "MACRO" ) fileshort2 = cats('`%', fileshort, "()`"); when (upcase(type) =: "FORMAT" ) do; fileshort2 = cats("`$", fileshort, ".`"); type2='format/informat'; end; @@ -5191,7 +5195,7 @@ TODO: (in Polish) */ )/secure /*** HELP END ***/ -des = 'Macro to load multiple SAS packages at one run, version 20240423. Run %loadPackages() for help info.' +des = 'Macro to load multiple SAS packages at one run, version 20240529. Run %loadPackages() for help info.' parmbuff ; %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then @@ -5207,7 +5211,7 @@ parmbuff %put ### This is short help information for the `loadPackageS` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro wrapper for the loadPackage macro, version `20240423` #; + %put # Macro wrapper for the loadPackage macro, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5304,7 +5308,7 @@ parmbuff hashing_file() function, SAS 9.4M6 */ )/secure /*** HELP END ***/ -des = 'Macro to verify SAS package with the hash digest, version 20240423. Run %verifyPackage() for help info.' +des = 'Macro to verify SAS package with the hash digest, version 20240529. Run %verifyPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -5319,7 +5323,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240423. Run % %put ### This is short help information for the `verifyPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to verify SAS package with it hash digest, version `20240423` #; + %put # Macro to verify SAS package with it hash digest, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5498,7 +5502,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240423. Run % */ )/secure /*** HELP END ***/ -des = 'Macro to preview content of a SAS package, version 20240423. Run %previewPackage() for help info.' +des = 'Macro to preview content of a SAS package, version 20240529. Run %previewPackage() for help info.' ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %do; @@ -5513,7 +5517,7 @@ des = 'Macro to preview content of a SAS package, version 20240423. Run %preview %put ### This is short help information for the `previewPackage` macro #; %put #-------------------------------------------------------------------------------#; %put # #; - %put # Macro to get preview of a SAS packages, version `20240423` #; + %put # Macro to get preview of a SAS packages, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5640,7 +5644,7 @@ des = 'Macro to preview content of a SAS package, version 20240423. Run %preview when empty the "packages" value is used */ )/secure /*** HELP END ***/ -des = 'Macro to list directories pointed by "packages" fileref, version 20240423. Run %extendPackagesFileref(HELP) for help info.' +des = 'Macro to list directories pointed by "packages" fileref, version 20240529. Run %extendPackagesFileref(HELP) for help info.' ; %if %QUPCASE(&packages.) = HELP %then @@ -5656,7 +5660,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20240423 %put ### This is short help information for the `extendPackagesFileref` macro #; %put #-----------------------------------------------------------------------------------------#;; %put # #; - %put # Macro to list directories pointed by 'packages' fileref, version `20240423` #; + %put # Macro to list directories pointed by 'packages' fileref, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; @@ -5757,7 +5761,7 @@ filename packages list; is provided in required version */ )/secure /*** HELP END ***/ -des = 'Macro to load additional content for a SAS package, version 20240423. Run %loadPackageAddCnt() for help info.' +des = 'Macro to load additional content for a SAS package, version 20240529. Run %loadPackageAddCnt() for help info.' minoperator ; %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then @@ -5773,7 +5777,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 `20240423` #; + %put # Macro to *load* additional content for a SAS package, version `20240529` #; %put # #; %put # A SAS package is a zip file containing a group #; %put # of SAS codes (macros, functions, data steps generating #; diff --git a/packages/README.md b/packages/README.md index 7dd5609..a356f0d 100644 --- a/packages/README.md +++ b/packages/README.md @@ -86,7 +86,7 @@ SHA256 digest for macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220 --- -- **BasePlus**\[1.38.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: +- **BasePlus**\[1.39.0\] adds a bunch of functionalities I am missing in BASE SAS, such as: ```sas call arrMissToRight(myArray); call arrFillMiss(17, myArray); @@ -116,7 +116,7 @@ format x bool.; %put %monthShift(2023,1,-5); ``` -SHA256 digest for BasePlus: F*209FB8198270DEAB6151CE31391A352A065B4EE2689F40433FA9550A7F4AAC18 +SHA256 digest for BasePlus: F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687 [Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") diff --git a/packages/SHA256_for_packages.txt b/packages/SHA256_for_packages.txt index 6fbad83..79d92cb 100644 --- a/packages/SHA256_for_packages.txt +++ b/packages/SHA256_for_packages.txt @@ -1,3 +1,6 @@ +/* 20240529 */ +BasePlus: F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687 + /* 20240312 */ BasePlus: F*209FB8198270DEAB6151CE31391A352A065B4EE2689F40433FA9550A7F4AAC18 diff --git a/packages/baseplus.md b/packages/baseplus.md index f558165..0773a41 100644 --- a/packages/baseplus.md +++ b/packages/baseplus.md @@ -1,28 +1,30 @@ # Documentation for the `BasePlus` package. ---- +---------------------------------------------------------------- + + *The BASE SAS plus a bunch of functionalities I am missing in BASE SAS* + +---------------------------------------------------------------- ### Version information: - *The BASE SAS plus a bunch of functionalities I am missing in BASE SAS* - - Package: BasePlus -- Version: 1.38.0 -- Generated: 2024-03-12T14:26:19 +- Version: 1.39.0 +- Generated: 2024-05-29T16:15:54 - Author(s): Bartosz Jablonski (yabwon@gmail.com), Quentin McMullen (qmcmullen@gmail.com) - Maintainer(s): Bartosz Jablonski (yabwon@gmail.com) - License: MIT -- File SHA256: `F*209FB8198270DEAB6151CE31391A352A065B4EE2689F40433FA9550A7F4AAC18` for this version -- Content SHA256: `C*14C505C4EF488A8BE2404A692D55C8B81FC5A6075D8A35F8B6767B34ACF5E48E` for this version +- File SHA256: `F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687` for this version +- Content SHA256: `C*2396916BBB5BC1FA832FB85EDAF14173D528A6C823BA0BACB84FC9E99A8CFC1B` for this version --- -# The `BasePlus` package, version: `1.38.0`; +# The `BasePlus` package, version: `1.39.0`; --- -# The BasePlus package [ver. 1.38.0] ############################################### +# The BasePlus package [ver. 1.39.0] ############################################### The **BasePlus** package implements useful functions and functionalities I miss in the BASE SAS. @@ -382,7 +384,7 @@ localization (only if additional content was deployed during the installation pr -------------------------------------------------------------------- -*SAS package generated by SAS Package Framework, version `20231210`* +*SAS package generated by SAS Package Framework, version `20240529`* -------------------------------------------------------------------- @@ -835,7 +837,8 @@ The basic syntax is the following, the `<...>` means optional parameters: in long format, `1` = yes, `0` = no. * `fileExt=` - *Optional*, if not missing then indicates - file extension to filter out results. + a list of space-separated file extensions + to filter out results. * `maxDepth=0` - *Optional*, if not zero then indicates maximum depth of search in the root path. @@ -5427,11 +5430,13 @@ Macro can be executed in two possible ways: run; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -2) by create a dataset with a list of links and use of `DS=` and `DSvar=` parameters. +2) by create a dataset with a list of links and use of `DS=`, `DSvar=`, + and `DSout=` parameters: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas %downloadFilesTo( , DS= , DSvar= + , DSout= ) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -5449,6 +5454,7 @@ The basic syntax is the following, the `<...>` means optional parameters: target <,DS=> <,DSvar=link> + <,DSout=scan(link,-1,"/\")> <,inDev=URL> <,outDev=DISK> <,inOptions=> @@ -5467,6 +5473,10 @@ The basic syntax is the following, the `<...>` means optional parameters: *. `DSvar= ` - *Optional*, name of variable in data set with list of files to download. +*. `DSout=` - *Optional*, name of variable in data set + with list of names for to downloaded files. + Default value is: `scan(link,-1,"/\")` it is + an expression to cut last part of the link. *. `inDev=` - *Optional*, type of device used by the `filename()` function to access incoming files. @@ -5490,8 +5500,8 @@ The basic syntax is the following, the `<...>` means optional parameters: ### EXAMPLES AND USECASES: #################################################### -**EXAMPLE 1.** Download data from web with diect list and then copy between directories: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +**EXAMPLE 1.** Download data from web with direct list and then copy between directories: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas resetline; %downloadFilesTo(~/directoryA) datalines4; @@ -5506,11 +5516,11 @@ datalines4; ~/directoryA/WUSS-2023-Paper-189.zip ;;;; run; -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **EXAMPLE 2.** Download data from web using data set with list: -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas resetline; data listOfFiles; infile cards; @@ -5522,7 +5532,7 @@ https://www.lexjansen.com/wuss/2023/WUSS-2023-Paper-109.pdf run; %downloadFilesTo(R:\directoryC, DS=listOfFiles, DSvar=files) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- diff --git a/packages/baseplus.zip b/packages/baseplus.zip index 94d570b19d216c10f2f9dfb920cabee71ca70eed..e56736ffdc1795b7654165361a7ebafae1a8d64e 100644 GIT binary patch delta 21062 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 From 55b7b507cf5750c954ab3cb3bc703332eac736f7 Mon Sep 17 00:00:00 2001 From: Bart Jablonski Date: Wed, 29 May 2024 16:38:34 +0200 Subject: [PATCH 2/2] SAS Packages Framework, version `20240529` SAS Packages Framework, version `20240529` Changes: - aesthetic changes in log when running `%generatePackage()` macro, - reshaped format of an automatic documentation header, - and little bug fix for automatic documentation generation (for excluding file from documentation the `IN` operator should be used instead `IN:`). --- BasePlus, version `1.39.0` Changes: - new parameter `DSout=` added in `%downloadFilesTo()` macro, - file SHA256: `F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687` for this version. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 42aea76..3bbc963 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 **`20240423`**. +**The latest version** of SPF is **`20240529`**. 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).