Compare commits

...

19 Commits

Author SHA1 Message Date
Bart Jablonski
425f7b389c The BasePlus package [ver. 2.0.0]
## The BasePlus package [ver. 2.0.0]

### Changes:

New macros:
- [`%expandDataSetsList()`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#expanddatasetslist-macro) allowing to expand data set lists of the form: `a1-a3`, `b_:`, mixed, and `_all_`;
- [`%unifyVarsCaseSize()`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#unifyvarscasesize-macro) allowing to convert all variables in a list of datasets to all-low-case or all-upcase letters.

Both macros are result of recent discussions at `SAS-L` and `communities.sas.com`.

New format/informats:
- [`bpklenght.`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#bpklenght-format)
- [`bplenght.`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#bplenght-format)

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*0730DD793516E5C193842126A7EC9D339ADADD19F0F40B071F938CABDE4E66AD`

---

### Example 1. New macros.

~~~~sas
data a1 a2 a3 b_x b_y b_z;
  set sashelp.class(obs=1);
run;

%put #%expandDataSetsList(lib=work,datasets=a1-a3 b_:)#;

proc print data=a1;
proc print data=b_x;
run;

%unifyVarsCaseSize(work,a1-a3 b_:)

proc print data=a1;
proc print data=b_x;
run;
~~~~

### Example 2. New formats/informats:

~~~~sas
data _null_;
  x = input('żółw', bpklenght.);
  y = input('żółw', bplenght.);
  put x= y=;
run;
~~~~

~~~~log
x=4 y=7
~~~~
2024-07-23 22:14:24 +02:00
Bart Jablonski
56748bc44b The BasePlus package [ver. 1.43.0]
## The BasePlus package [ver. 1.43.0]

### Changes:

Update to [`%getVars()`](https://github.com/SASPAC/baseplus/blob/1.41.0/baseplus.md#getvars-macro-8) and [`%qgetVars()`](https://github.com/SASPAC/baseplus/blob/1.41.0/baseplus.md#qgetvars-macro-15) macros.

New parameter `ignoreCases=` added. It is an *optional* parameter.
It indicates if variables names search should be case insensitive.
With default value `1`, the search *is* case insensitive.

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*68BB953CD732EB43119A3339656670292317FE1C3B764EC57484C7D5C9DF23EB`

---
2024-07-22 09:04:57 +02:00
Bart Jablonski
96fa16078c The BasePlus package [ver. 1.42.1]
## The BasePlus package [ver. 1.42.1]

### Changes:

Update to the
[`%rainCloudPlot()`](https://github.com/SASPAC/baseplus/blob/1.42.1/baseplus.md#raincloudplot-macro-17)
macro, input parameters checks added.

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*2129F372D72A34A4FB1F368A581EA33D64AD4D8F3707213D5B9553F3C3122003`

---
2024-07-19 10:29:28 +02:00
Bart Jablonski
dc7f8cee19 SAS Packages Framework, version 20240711
SAS Packages Framework, version `20240711`

Changes (minor):
- aesthetic change in automatic documentation generation.

---
2024-07-11 14:57:29 +02:00
Bart Jablonski
9b76f52b78 The BasePlus package [ver. 1.42.0]
## The BasePlus package [ver. 1.42.0]

### Changes:

New macro
[`%GenerateOneLiners()`](https://github.com/SASPAC/baseplus/blob/1.42.0/baseplus.md#generateoneliners-macro)
allowing to generate "one liner" functions of the form:

~~~~sas
%macro FUNCTION()/parmbuff;
%sysfunc(FUNCTION&syspbuff)
%mend FUNCTION;
~~~~

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*6012D1475AE22A4445C032D8EAE092BE515D8CD2AE390CC087F5987ACB8BCB13`

---

### Example

~~~~sas
%GenerateOneLiners(
  listOfFunctions=SUM MEAN MEDIAN VAR
, prefix=_)

%put
  %_SUM(1,2,3,4,5,6)
  %_MEAN(1,2,3,4,5,6)
  %_MEDIAN(1,2,3,4,5,6)
  %_VAR(1,2,3,4,5,6)
;
~~~~
2024-07-10 23:06:20 +02:00
Bart Jablonski
c40c0bd9dc The BasePlus package [ver. 1.41.0]
## The BasePlus package [ver. 1.41.0]

### Changes:

Update to the
[`%rainCloudPlot()`](https://github.com/SASPAC/baseplus/blob/1.41.0/baseplus.md#raincloudplot-macro-17)
macro, new parameter:
 - `meanShiftLine=`
 - `meanShiftStep=`
 - `meanShiftColors=`
 - `xaxisValues=`
 - `xaxisValuesDisplay=`
 - `xaxisValuesFormat=`
 - `xaxisValuesRotate=`
 - `xaxisOther=`
 - `reuseN=`

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*6760DDF382E7CA9A1291F028FA7F2BACB68A3D31CEA3A85104E13EA08645AEF1`

---
2024-06-09 18:50:18 +02:00
Bart Jablonski
ba2ca42015 The BasePlus package [ver. 1.40.0]
## The BasePlus package [ver. 1.40.0]

### Changes:

Update to the
[`%rainCloudPlot()`](https://github.com/SASPAC/baseplus/blob/1.40.0/baseplus.md#raincloudplot-macro-17)
macro, new parameter:
- `boxPlotLineSize=`
- `boxPlotFill=`
- `xBothAxis=`
- `minRange=`
- `maxRange=`

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*BD0333B92D7CB639A136CD4994DE0C63F8396E449E45BC714D71D2E15318F42D`

---
2024-06-06 22:16:22 +02:00
Bart Jablonski
55b7b507cf 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.
2024-05-29 16:38:34 +02:00
Bart Jablonski
b47b1fb536 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.
2024-05-29 16:34:37 +02:00
Bart Jablonski
73f0ba2d4c SAS Packages Framework, version 20240423
SAS Packages Framework, version 20240423

A minor aesthetic update in a log note about KMF snippets added to `%generatePackage()` macro. Does not change any functionality, just make it look nicer.
2024-04-23 11:32:52 +02:00
Bart Jablonski
c38cb1e70d SAS Packages Framework, version 20240415
SAS Packages Framework, version 20240415

Features:

- In the `%generatePackage()` macro, when `markdownDoc=` parameters is used, packages files can be "excluded" from being used to produce documentation markdown file.

- Documentation updated.
2024-04-15 19:31:06 +02:00
Bart Jablonski
0a738cc639 The BasePlus package [ver. 1.38.0]
The BasePlus package [ver. 1.38.0]

Update to the `%rainCloudPlot()` macro, new parameter for "vertical" plots added.

Documentation updated and "cleaned".

---

SHA256 digest for BasePlus: `F*209FB8198270DEAB6151CE31391A352A065B4EE2689F40433FA9550A7F4AAC18`

---
2024-03-12 14:42:23 +01:00
Bart Jablonski
3cf49b5221 The BasePlus package [ver. 1.37.0]
## The BasePlus package [ver. 1.37.0]

Changes:

- Update to the %rainCloudPlot() macro.
- New macro %iffunc() added.
- Documentation updated.

---

SHA256 digest for BasePlus: F*8155BFE82F7833E4B0DA24D81DBDFC58463906D6032B1F0161772DADE84BE790

---
2024-03-10 08:30:04 +01:00
Bart Jablonski
8638902ec3 The BasePlus package [ver. 1.37.0]
## The BasePlus package [ver. 1.37.0]

Changes:

- Update to the %rainCloudPlot() macro.
- New macro %iffunc() added.
- Documentation updated.

---

SHA256 digest for BasePlus: F*8155BFE82F7833E4B0DA24D81DBDFC58463906D6032B1F0161772DADE84BE790

---
2024-03-09 13:53:32 +01:00
Bart Jablonski
7aca779d60 The BasePlus package [ver. 1.36.0]
The BasePlus package [ver. 1.36.0]

- small functional update for: %today(), %date(), %time(), and %datetime() macros.
- documentation update.
2024-01-12 10:57:51 +01:00
Bart Jablonski
ca3a001f65 SAS Packages Framework, version 20231210
SAS Packages Framework, version 20231210

Changes:

- Two new parameters added for the `%generatePackage()` macro.
  The parameters are:
    - `markdownDoc=` - Indicates if a markdown file with documentation be generated from help information blocks.
    - `easyArch=` - When creating documentation file (`markdownDoc=1`) it indicates if a copy of the zip and markdown files with the version number in the file name be created.

- The `HelloWorldPackage.md` example updated.

- Documentation updated.
2023-12-12 11:32:10 +01:00
Bart Jablonski
fa2d53eaf8 Update gsm.md
The link to the article updated:
https://www.lexjansen.com/wuss/2023/WUSS-2023-Paper-189.pdf
2023-12-03 11:58:22 +01:00
Bart Jablonski
bd81f5d36e The macroArray package [ver. 1.2.6]
The macroArray package [ver. 1.2.6]

Changes:
- Minor update in `%mcDictionary()` and `%mcHashTable()` macros. Restrictions for object names check updated.
- Documentation updated.

SHA256 digest for the latest version macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790
2023-12-01 12:50:39 +01:00
Bart Jablonski
96c8234a58 The macroArray package [ver. 1.2.5]
## The `macroArray` package [ver. 1.2.5]

---

### Changes:

- Bug fix in the `%concatArrays()` macro.
- Spelling fix in log message of the `%make_do_over()` macro.

---

SHA256 hash digest: `F*FFF2C3D854F9B5677F561BA2EB6FAA2CCC652D81F6AF9473ADF0A4CE977E43F0`
2023-11-29 17:00:43 +01:00
32 changed files with 5442 additions and 3487 deletions

View File

@@ -16,7 +16,7 @@ Don't forget to **STAR** (:star:) the repository! :-)
### Current version:
**The latest version** of SPF is **`20231123`**.
**The latest version** of SPF is **`20240711`**.
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).
@@ -163,6 +163,8 @@ The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS
### Updates worth mentioning:
**Update**\[December 10th, 2023\]**:** `markdownDoc=` **parameter added to** `%generatePackage()` **macro, which allows to generate markdown file with documentation. Content is taken from the help information notes and the description. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231210 "markdown documentation"))**.
**Update**\[November 11th, 2023\]**:** `KMFSNIP` **type for *key macro abbreviations* snippets added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231111 "KMF-abbreviations"))**.
**Update**\[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"))**.

View File

@@ -1,4 +1,4 @@
## The "Hello World" Package
---
@@ -40,7 +40,9 @@ If it was - then continue.
```sas
/*** HELP START ***//*
This is a help info for the HelloWorldFormat. format
This is a help info for the `HelloWorldFormat.` format.
Category *other* is marked with exclamation mark (`!`).
*//*** HELP END ***/
value HelloWorldFormat
@@ -57,7 +59,11 @@ value HelloWorldFormat
into that file:
```sas
/*** HELP START ***//*
This is a help info for the helloWorldMacro() macro
This is a help info for the `%helloWorldMacro()` macro.
Macro has the following parameter(s):
- `n` - *Required*, provides number of loop iterations.
*//*** HELP END ***/
%macro HelloWorldMacro(n);
@@ -86,10 +92,12 @@ Encoding: UTF8
Required: "Base SAS Software"
DESCRIPTION START:
## My "Hello World" SAS package ##
### My "Hello World" SAS package ###
The "Hello World" is my first SAS package and
for sure it will not be the last package one!
Using packages is a good idea!
DESCRIPTION END:
```
@@ -107,13 +115,14 @@ DESCRIPTION END:
```sas
%generatePackage(
filesLocation=<put/folder/from/the/step/three/here>
,markdownDoc=1
)
```
`Step 10.` See the information in the output window and in the log.
The `WARNING:[License] No license.sas file provided, default (MIT) licence file will be generated.` can be ignored.
`Step 11.` Check the directory from the `Step 3.` and look for the `helloworld.zip` package file.
`Step 11.` Check the directory from the `Step 3.` and look for the `helloworld.zip` package file and `helloworld.md` documentation file.
---

View File

@@ -6,7 +6,7 @@
when empty the "packages" value is used */
)/secure
/*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20231123. Run %extendPackagesFileref(HELP) for help info.'
des = 'Macro to list directories pointed by "packages" fileref, version 20240711. Run %extendPackagesFileref(HELP) for help info.'
;
%if %QUPCASE(&packages.) = HELP %then
@@ -22,14 +22,14 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20231123
%put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20231123` #;
%put # Macro to list directories pointed by 'packages' fileref, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%extendPackagesFileref())` macro lists directories pointed by #;
%put # the packages fileref. It allows to add new dierctories to packages folder list. #;
%put # the packages fileref. It allows to add new directories to packages folder list. #;
%put # #;
%put #### Parameters: #;
%put # #;

View File

@@ -1,4 +1,19 @@
/*+generatePackage+*/
/*** HELP START ***//*
Macro to generate SAS packages.
Version 20240711
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
a single load.sas file (also embedded inside the zip).
See examples below.
*//*** HELP END ***/
/*** HELP START ***/
%macro generatePackage(
@@ -21,9 +36,14 @@
,delTestWork=1 /* indicates if `WORK` directories generated by user tests
should be deleted, i.e. the (NO)WORKTERM option is set,
default value 1 means "delete tests work" */
,markdownDoc=0 /* indicates if a markdown file with documentation
be generated from help info blocks */
,easyArch=0 /* when creating documentation file indicates if a copy of
the zip and markdown files with the version number in the
file name be created */
)/ secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage() for help info.'
;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do;
@@ -38,7 +58,7 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20231123` #;
%put # Macro to generate SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -89,6 +109,17 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%put # The default value: `1` means "delete tests work". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `markdownDoc=` Indicates if a markdown file with documentation #;
%put # be generated from help information blocks. #;
%put # The default value: `0` means "do not generate the file". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `easyArch=` When creating documentation file (`markdownDoc=1`) #;
%put # indicates if a copy of the zip and markdown files #;
%put # with the version number in the file name be created #;
%put # The default value: `0` means "do not create files". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put #-------------------------------------------------------------------------------#;
%put #################################################################################;
%put ;
@@ -97,8 +128,11 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%end;
%put --- generatePackage START ---;
%local zipReferrence filesWithCodes _DESCR_ _LIC_ _DUMMY_ _RC_ _PackageFileref_ additionalContent;
%local zipReferrence zipReferrenceV filesWithCodes _DESCR_ _LIC_ _DUMMY_ _RC_ _PackageFileref_ additionalContent
packageHashF packageHashC
;
%let zipReferrence = _%sysfunc(datetime(), hex6.)_;
%let zipReferrenceV = _%sysfunc(datetime(), hex6.)V;
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
%let _DESCR_ = _%sysfunc(datetime(), hex6.)d;
%let _LIC_ = _%sysfunc(datetime(), hex6.)l;
@@ -447,7 +481,7 @@ DESCRIPTION END:
|
+-004_format [one file one format,
| | option LIB= should be: work.&packageName.format
| | (literally with macrovariable name and "format" sufix)]
| | (literally with macrovariable name and "format" suffix)]
| |
| +-efg.sas [a file with a code creating format EFG and informat EFG]
|
@@ -489,7 +523,7 @@ DESCRIPTION END:
| +-abc.sas [a file with a code creating CAS-L user defined function ABC, _without_ "Proc CAS" header]
|
+-012_kmfsnip [one file one KMF-abbreviation snippet,
| | code snipped propper tagging]
| | code snipped proper tagging]
| |
| +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
|
@@ -600,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 */
@@ -820,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 20231123";
footnote1 "SAS Packages Framework, version 20240711";
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent);
run;
@@ -1541,7 +1576,7 @@ data _null_;
%end;
put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20231123.;''' /
' !! '' %put with the SAS Packages Framework version 20240711.;''' /
' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ;
@@ -1685,11 +1720,11 @@ data _null_;
''' %put This is help for the `' "&packageName.IML" '` macro; '' !!' /
''' %put Parameters (optional) are the following:; '' !!' /
''' %put - `list` indicates if the list of loaded moduls should be displayed,; '' !!' /
''' %put - `list` indicates if the list of loaded modules should be displayed,; '' !!' /
''' %put %str( )when set to the value of `1` (the default) runs `SHOW MODULES%str(;)`,; '' !!' /
''' %put %str( )when set to the value of `HELP` (upcase letters!) displays this help message.;'' !!' /
''' %put - `resetIMLstorage` indicates if to reset default moduls storage,; '' !!' /
''' %put - `resetIMLstorage` indicates if to reset default modules storage,; '' !!' /
''' %put %str( )when set to `1` (the default) runs `RESET STORAGE = WORK.IMLSTOR%str(;)`.; '' !!' /
''' %put - `err` [technical] indicates message type in case of missing modules catalog,; '' !!' /
@@ -1706,7 +1741,7 @@ data _null_;
%end;
put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20231123.; '' !! ' /
''' %put with the SAS Packages Framework version 20240711.; '' !! ' /
''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' /
@@ -1860,7 +1895,7 @@ data _null_;
/ ' putlog / @7 "Should you have any problem with finding the file consider moving";'
/ ' putlog @7 "it to a location of your choice with the help of the following snippet:";'
/ ' putlog / @7 " filename KMFin " "''%sysfunc(pathname(WORK))/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog @7 " filename KMFout ""</directory/of/your/choice>/testpackageclean.kmf"" lrecl=1 recfm=n;";'
/ ' putlog / @7 " filename KMFout " "''</directory/of/your/choice>/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog @7 '' %put *%sysfunc(fcopy(KMFin, KMFout))*(0=success)*;'';'
/ ' putlog / "0a"x / " ";'
@@ -2097,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 ' )';
@@ -2115,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 ' )';
@@ -2355,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, "()'");
@@ -2462,25 +2498,25 @@ data _null_;
put 'put @5 "' CUROBS +(-1) '." @10 "' type '" @21 "' fileshort '";';
end;
%if %bquote(&packageRequired.) ne %then
%if %superq(packageRequired) ne %then
%do;
length packageRequired $ 32767;
packageRequired = symget('packageRequired');
put ' length req $ 64; ';
put ' length req $ 256; ';
put ' put ; put " Required SAS Components: "; ';
put ' do req = ' / packageRequired / ' ; ';
put ' put @5 req; ';
put ' put @3 "-" @5 req; ';
put ' end ; ';
%end;
%if %bquote(&packageReqPackages.) ne %then
%if %superq(packageReqPackages) ne %then
%do;
length packageReqPackages $ 32767;
packageReqPackages = symget('packageReqPackages');
put ' length req $ 64; ';
put ' length req $ 256; ';
put ' put ; put " Required SAS Packages: "; ';
put ' do req = ' / packageReqPackages / ' ; ';
put ' put @5 req; ';
put ' put @3 "-" @5 req; ';
put ' end ; ';
%end;
@@ -2492,7 +2528,9 @@ 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 20231123 *"; put "***";';
put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20240711`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /;
@@ -2528,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, "()'");
@@ -2535,6 +2574,7 @@ data _null_;
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" );
otherwise fileshort2 = fileshort;
end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -2841,20 +2881,22 @@ filename &zipReferrence. clear;
set sashelp.vfunc(keep=fncname);
where fncname = "HASHING_FILE";
call execute('
data the_SHA256_hash_id;' !!
data work.the_SHA256_hash_id;' !!
/* F - file */
" SHA256 = 'F*' !! HASHING_FILE('SHA256', pathname('&zipReferrence.','F'), 0); " !!
' TYPE="F"; ' !!
' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashF",SHA256,"L");' !!
/* C - content */
" SHA256 = 'C*' !! HASHING_FILE('SHA256', '&zipReferrence.', 4); " !!
' TYPE="C"; ' !!
' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashC",SHA256,"L");' !!
' label ' !!
' SHA256 = "The SHA256 hash digest for package &packageName.:" ' !!
' TYPE= "Type of hash digest / F = file / C = content"; ' !!
'run;');
call execute('proc print data = the_SHA256_hash_id noobs label split="/"; run;');
call execute('proc print data = work.the_SHA256_hash_id noobs label split="/"; run;');
stop;
run;
options &notesSourceOptions.;
@@ -2863,7 +2905,7 @@ filename &zipReferrence. clear;
/*-+++++++++++++++++++++++-*/
/* verify if there were errors while package content creation */
%if %bquote(&createPackageContentStatus.) ne 0 %then
%if %superq(createPackageContentStatus) ne 0 %then
%do;
%put ERROR- ** [&sysmacroname.] **;
%put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **;
@@ -3418,6 +3460,290 @@ options &quotelenmax_tmp.;
/* if you do not want any test to be executed */
%NOTESTING:
/* generate MarkDown documentation file */
/* check param value */
%if %superq(markdownDoc) NE 1 %then %let markdownDoc=0;
/* if true then execute */
%if %superq(markdownDoc)=1 %then
%do;
%if %superq(createPackageContentStatus) NE 0 %then
%do;
%put ERROR- ** [&sysmacroname.] **;
%put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **;
%put ERROR- ** NO MARKDOWN DOCUMMENTATION WILL BE GENERATED. **;
%GOTO NOmarkdownDoc;
%end;
/*= generate MarkDown documentation START =================================================================================*/
%put NOTE-;
%put NOTE: Preparing markdown documentation file.;
%put NOTE- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
%put NOTE-;
%local MarkDownOptionsTmp;
%let MarkDownOptionsTmp =
%sysfunc(getoption(notes)) %sysfunc(getoption(source)) msglevel=%sysfunc(getoption(msglevel));
options NOnotes NOsource msglevel=N;
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md";
filename &_PackageFileref_. ZIP "&filesLocation./%lowcase(&packageName.).zip";
data &filesWithCodes.markdown;
/* break if no data */
if NOBS = 0 then stop;
file &zipReferrence. encoding = &packageEncoding.;
put "# Documentation for the `&packageName.` package.";
length packageLicense packageGenerated $ 64
packageTitle packageAuthor packageMaintainer $ 4096
packageHashF packageHashC $ 128
;
packageLicense=symget("packageLicense");
packageTitle=symget("packageTitle");
packageGenerated=symget("packageGenerated");
packageAuthor=symget("packageAuthor");
packageMaintainer=symget("packageMaintainer");
packageHashF=symget("packageHashF");
packageHashC=symget("packageHashC");
drop package:;
put " " / 64*"-" / " "
/ ' *' packageTitle +(-1)'* '
/ " " / 64*"-" / " "
/ "### Version information:"
/ " "
/ "- Package: &packageName."
/ "- Version: &packageVersion."
/ "- Generated: " packageGenerated
/ "- Author(s): " packageAuthor
/ "- Maintainer(s): " packageMaintainer
/ "- License: " packageLicense
/ "- File SHA256: `" packageHashF +(-1) "` for this version"
/ "- Content SHA256: `" packageHashC +(-1) "` for this version"
/ " " / "---" / " ";
put "# The `&packageName.` package, version: `&packageVersion.`;"
/ " " / "---" / " ";
do until (EOF);
infile &_PackageFileref_.(description.sas) end = EOF;
input;
if upcase(strip(_infile_)) =: "DESCRIPTION END:" then printer = 0;
if printer then put _infile_;
if upcase(strip(_infile_)) =: "DESCRIPTION START:" then printer = 1;
end;
put " " / "---" / " ";
%if %superq(packageRequired) ne %then
%do;
put " " / "---" / " ";
length req $ 256;
put "Required SAS Components: ";
do req = &packageRequired. ;
put @3 "-" @5 req;
end ;
%end;
%if %superq(packageReqPackages) ne %then
%do;
put " " / "---" / " ";
length req2 $ 256;
put "Required SAS Packages: ";
do req2 = &packageReqPackages.;
put @3 "-" @5 req2;
end ;
%end;
put " " / "---" / " ";
%if %superq(additionalContent) NE %then
%do;
put " " / "---" / " ";
put 'Package contains additional content, run: `%loadPackageAddCnt(' "&packageName." ')` to load it'
/ "or look for the `%lowcase(&packageName.)_AdditionalContent` directory in the `packages` fileref"
/ "localization (only if additional content was deployed during the installation process).";
%end;
put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20240711`*"
/ " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content";
put "The `&packageName.` package consists of the following content:" / " ";
EOFDS = 0;
do until(EOFDS);
/* content is created during package creation */
set &filesWithCodes. end = EOFDS nobs = NOBS curobs = CUROBS;
if upcase(type) in: ('TEST') then continue; /* exclude tests */
/*
To exclude file from being added to the documentation
insert the "excluding" text(see below) as a comment
in the FIRST line of the file.
Do not add spaces.
For each file the first line is read in and checked.
*/
length _FILEVARPATH_ $ 4096;
_FILEVARPATH_=catx("/",base,folder,file);
infile _dummy_ FILEVAR=_FILEVARPATH_;
input;
if strip(_infile_) IN (
'/*##DoNotUse4Documentation##*/'
'/*##ExcludeFromDocumentation##*/'
'/*##ExcludeFromMarkdownDoc##*/'
)
then continue; /* exclude file from documentation */
type2=type;
length link $ 256;
link=catx("-",compress(fileshort,,"KAD"),type,CUROBS);
length fileshort $ 256;
select;
when (upcase(type) =: "MACRO" ) do; fileshort2 = cats('`%', fileshort, "()`"); type2='macro'; end;
when (upcase(type) =: "FORMAT" ) do; fileshort2 = cats("`$", fileshort, ".`"); type2='format/informat'; end;
when (upcase(type) =: "FUNCTION" ) do; fileshort2 = cats("`", fileshort, "()`"); type2='function'; end;
when (upcase(type) =: "IMLMODULE") fileshort2 = cats("`", fileshort, "()`");
when (upcase(type) =: "PROTO" ) fileshort2 = cats("`", fileshort, "()`");
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("`", fileshort, "()`");
otherwise fileshort2 = cats("`", fileshort, "`");
end;
contentObs + 1;
put @1 contentObs +(-1) '. [' fileshort2 type2'](#' link ')';
output;
end;
put " " / " ";
contentObs+1;
put @1 contentObs +(-1) '. [License note](#license)';
put " " / "---" / " ";
putlog "Doc. note with general information ready.";
stop;
run;
/* loop through content and print info to the MD file */
data _null_;
if 0 = NOBS then stop;
do until(EOFDS);
set &filesWithCodes.markdown end = EOFDS nobs = NOBS curobs=CUROBS;
length memberX $ 1024;
memberX = cats("_",folder,".",file);
/* inner data step in call execute to read each embedded file */
call execute("data _null_; ");
call execute(" file &zipReferrence. encoding = &packageEncoding. MOD; ");
call execute(' put ''## ' !! catx(" ",fileshort2,type2) !! ' <a name="' !! strip(link) !! '"></a> ######'';');
call execute(' infile &_PackageFileref_.(' || strip(memberX) || ') end = EOF; ');
call execute(" printer = 0; ");
call execute(" do until(EOF); ");
call execute(" input; length _endhelpline_ _starthelpline_ $ 32767; ");
call execute(" _endhelpline_ = upcase(reverse(strip(_infile_))); ");
call execute(" if 18 <= lengthn(_endhelpline_) AND _endhelpline_
=: '/*** DNE PLEH ***/' then printer = 0; "); /* ends with HELP END */
call execute(" if printer then put _infile_; ");
call execute(" _starthelpline_ = upcase(strip(_infile_)); ");
call execute(" if 20 <= lengthn(_starthelpline_) AND _starthelpline_
=: '/*** HELP START ***/' then printer = 1 ; "); /* starts with HELP START */
call execute(" end; ");
call execute(' put " " / "---" / " "; ');
call execute(' putlog ''Doc. note ' !! cats(CUROBS) !! ' for ' !! catx(" ",fileshort2,type2) !! ' ready.'';');
call execute(" stop; ");
call execute("run; ");
end;
stop;
run;
/* license info */
data _null_;
file &zipReferrence. encoding = &packageEncoding. MOD;
putlog "Doc. note with license ready.";
put " " / "---" / " "
/ '# License <a name="license"></a> ######' / " "
;
do until (EOF_L);
infile &_PackageFileref_.(license.sas) end = EOF_L;
input;
put _infile_;
end;
put " " / "---" / " ";
stop;
run;
options &MarkDownOptionsTmp.;
%put NOTE: Markdown file generated.;
filename &zipReferrence. list;
%put NOTE- ;
options NOnotes NOsource msglevel=N;
filename &zipReferrence. clear;
filename &_PackageFileref_. clear;
options &MarkDownOptionsTmp.;
/* to make archiving easier a copy of the package zip file
with the version in the name is created */
%if %superq(easyArch) NE 1 %then %let easyArch=0;
%if %superq(easyArch) = 1 %then
%do;
%put NOTE-;
%put NOTE: Creating files with version in the name.;
%put NOTE- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
%put NOTE-;
%local notesSourceOptions;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
options NOnotes NOsource;
/* zip */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).zip" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.zip" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
length rctxt $ 32767;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.zip file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.zip file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
/* md */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.md" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
length rctxt $ 32767;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.md file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.md file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
options &notesSourceOptions.;
%end;
/*= generate MarkDown documentation END =================================================================================*/
%NOmarkdownDoc:
%end;
/* clean temporary files */
proc sql;
drop table &filesWithCodes.;
@@ -3425,6 +3751,11 @@ proc sql;
%do;
drop table &filesWithCodes.addCnt;
%end;
%if %sysfunc(exist(&filesWithCodes.markdown)) %then
%do;
drop table &filesWithCodes.markdown;
%end;
quit;
/* turn on the original value of the note about quoted string length */

View File

@@ -28,7 +28,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to get help about SAS package, version 20231123. Run %helpPackage() for help info.'
des = 'Macro to get help about SAS package, version 20240711. 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 20231123. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get help about SAS packages, version `20231123` #;
%put # Macro to get help about SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -181,10 +181,3 @@ TODO:
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
*/
/* Macros to install SAS packages, version 20231111 */
/* 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
a single load.sas file (also embedded inside the zip).
*/

View File

@@ -1,4 +1,10 @@
/*+installPackage+*/
/* Macros to install SAS packages, version 20240711 */
/* 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
a single load.sas file (also embedded inside the zip).
*/
/*** HELP START ***/
%macro installPackage(
@@ -16,7 +22,7 @@
/secure
minoperator
/*** HELP END ***/
des = 'Macro to install SAS package, version 20231123. Run %%installPackage() for help info.'
des = 'Macro to install SAS package, version 20240711. Run %%installPackage() for help info.'
;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do;
@@ -31,7 +37,7 @@ des = 'Macro to install SAS package, version 20231123. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to install SAS packages, version `20231123` #;
%put # Macro to install SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -479,25 +485,4 @@ des = 'Macro to install SAS package, version 20231123. Run %%installPackage() fo
/*** HELP END ***/
/*** HELP START ***/
/* Macro to list SAS packages in packages folder.
Version 20231111
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
a single load.sas file (also embedded inside the zip).
*/
/*
* Example 1: Set local packages directory, enable the framework,
and list packages in the local repository.
filename packages "C:\SAS_PACKAGES";
%include packages(SPFinit.sas);
%listPackages()
*/
/*** HELP END ***/

View File

@@ -1,7 +1,28 @@
/*+listPackages+*/
/*** HELP START ***//*
Macro to list SAS packages in packages folder.
Version 20240711
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
a single load.sas file (also embedded inside the zip).
* Example 1: Set local packages directory, enable the framework,
and list packages in the local repository.
filename packages "C:\SAS_PACKAGES";
%include packages(SPFinit.sas);
%listPackages()
*//*** HELP END ***/
%macro listPackages()/secure PARMBUFF
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231123.'
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240711.'
;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do;
@@ -16,14 +37,14 @@ 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 `20231123` #;
%put # Macro to list available SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%listPackages())` macro lists packages available #;
%put # in the packages folder. List is printed inthe SAS Log. #;
%put # in the packages folder. List is printed in the SAS Log. #;
%put # #;
%put #### Parameters: #;
%put # #;
@@ -162,19 +183,3 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
%mend listPackages;
/*** HELP START ***/
/* Macro to generate SAS packages.
Version 20231111
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
a single load.sas file (also embedded inside the zip).
See examples below.
*/
/*** HELP END ***/

View File

@@ -34,7 +34,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to load SAS package, version 20231123. Run %loadPackage() for help info.'
des = 'Macro to load SAS package, version 20240711. 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 `20231123` #;
%put # Macro to *load* SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -19,7 +19,7 @@
is provided in required version */
)/secure
/*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20231123. Run %loadPackageAddCnt() for help info.'
des = 'Macro to load additional content for a SAS package, version 20240711. 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 `20231123` #;
%put # Macro to *load* additional content for a SAS package, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -11,7 +11,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20231123. Run %loadPackages() for help info.'
des = 'Macro to load multiple SAS packages at one run, version 20240711. 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 `20231123` #;
%put # Macro wrapper for the loadPackage macro, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -68,7 +68,7 @@ parmbuff
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
%put ;
%put %nrstr( %%installPackage(SQLinDS DFA) %%* install packages from the Internet; );
%put %nrstr( %%loadPackageS(SQLinDS, DFA) %%* load packags content into the SAS session; );
%put %nrstr( %%loadPackageS(SQLinDS, DFA) %%* load packages content into the SAS session; );
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
%put #################################################################################;
%put ;

View File

@@ -23,7 +23,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20231123. Run %previewPackage() for help info.'
des = 'Macro to preview content of a SAS package, version 20240711. 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 20231123. Run %preview
%put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get previwe of a SAS packages, version `20231123` #;
%put # Macro to get preview of a SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -20,7 +20,7 @@
*/
)/secure
/*** HELP END ***/
des = 'Macro to unload SAS package, version 20231123. Run %unloadPackage() for help info.'
des = 'Macro to unload SAS package, version 20240711. 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 20231123. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to unload SAS packages, version `20231123` #;
%put # Macro to unload SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -13,7 +13,7 @@
hashing_file() function, SAS 9.4M6 */
)/secure
/*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20231123. Run %verifyPackage() for help info.'
des = 'Macro to verify SAS package with the hash digest, version 20240711. 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 20231123. Run %
%put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to verify SAS package with it hash digest, version `20231123` #;
%put # Macro to verify SAS package with it hash digest, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -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 **`20231123`**.
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20240711`**.
**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 <a name="installpackage"></a>
--------------------------------------------------------------------------------------------
Macro to install SAS packages, version `20231123`
Macro to install SAS packages, version `20240711`
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 <a name="helppackage"></a>
-------------------------------------------------------------------------------
Macro to get help about SAS packages, version `20231123`
Macro to get help about SAS packages, version `20240711`
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 <a name="loadpackage"></a>
-------------------------------------------------------------------------------
Macro to *load* SAS packages, version `20231123`
Macro to *load* SAS packages, version `20240711`
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 <a name="loadpackages"></a>
-------------------------------------------------------------------------------
Macro wrapper for the loadPackage macro, version `20231123`
Macro wrapper for the loadPackage macro, version `20240711`
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 <a name="unloadpackage"></a>
-------------------------------------------------------------------------------
Macro to unload SAS packages, version `20231123`
Macro to unload SAS packages, version `20240711`
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 <a name="listpackages"></a>
-----------------------------------------------------------------------------------------
Macro to list available SAS packages, version `20231123`
Macro to list available SAS packages, version `20240711`
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 <a name="verifypackage"></a>
-------------------------------------------------------------------------------
Macro to verify SAS package with it hash digest, version `20231123`
Macro to verify SAS package with it hash digest, version `20240711`
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 <a name="previewpackage"></a>
-------------------------------------------------------------------------------
Macro to get previwe of a SAS packages, version `20231123`
Macro to get preview of a SAS packages, version `20240711`
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 <a name="generatepackage"></a>
-------------------------------------------------------------------------------
Macro to generate SAS packages, version `20231123`
Macro to generate SAS packages, version `20240711`
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -703,7 +703,18 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
should be deleted, i.e. the (NO)WORKTERM option is set.
The default value: `1` means "delete tests work".
Available values are `0` and `1`.
- `markdownDoc=` Indicates if a markdown file with documentation
be generated from help information blocks.
The default value: `0` means "do not generate the file".
Available values are `0` and `1`.
- `easyArch=` When creating documentation file (`markdownDoc=1`)
indicates if a copy of the zip and markdown files
with the version number in the file name be created
The default value: `0` means "do not create files".
Available values are `0` and `1`.
-------------------------------------------------------------------------------
@@ -779,7 +790,7 @@ All files have to have `.sas` extension. Other files are ignored.
|
+-004_format [one file one format,
| | option LIB= should be: work.&packageName.format
| | (literally with macrovariable name and "format" sufix)]
| | (literally with macrovariable name and "format" suffix)]
| |
| +-efg.sas [a file with a code creating format EFG and informat EFG]
|
@@ -821,7 +832,7 @@ All files have to have `.sas` extension. Other files are ignored.
| +-abc.sas [a file with a code creating CAS-L user defined function ABC, _without_ "Proc CAS" header]
|
+-012_kmfsnip [one file one KMF-abbreviation snippet,
| | code snipped propper tagging]
| | code snipped proper tagging]
| |
| +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
|
@@ -857,7 +868,7 @@ All files have to have `.sas` extension. Other files are ignored.
## This is short help information for the `extendPackagesFileref` macro <a name="extendpackagesfileref"></a>
-----------------------------------------------------------------------------------------
Macro to list directories pointed by 'packages' fileref, version `20231123`
Macro to list directories pointed by 'packages' fileref, version `20240711`
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -897,7 +908,7 @@ filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory;
## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a>
-------------------------------------------------------------------------------
Macro to load *additional content* for a SAS package, version `20231123`
Macro to load *additional content* for a SAS package, version `20240711`
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating

View File

@@ -12,7 +12,7 @@
/* */
/* Here is the official version: */
/*
Copyright (c) 2019 - 2023 Bartosz Jablonski (yabwon@gmail.com)
Copyright (c) 2019 - 2024 Bartosz Jablonski (yabwon@gmail.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -42,7 +42,7 @@
- to unload, or
- to generate SAS packages.
Version 20231111.
Version 20240711.
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 20231123. Run %loadPackage() for help info.'
des = 'Macro to load SAS package, version 20240711. 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 `20231123` #;
%put # Macro to *load* SAS packages, version `20240711` #;
%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 20231123. Run %unloadPackage() for help info.'
des = 'Macro to unload SAS package, version 20240711. 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 20231123. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to unload SAS packages, version `20231123` #;
%put # Macro to unload SAS packages, version `20240711` #;
%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 20231123. Run %unloadPackage() for h
*/
)/secure
/*** HELP END ***/
des = 'Macro to get help about SAS package, version 20231123. Run %helpPackage() for help info.'
des = 'Macro to get help about SAS package, version 20240711. 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 20231123. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get help about SAS packages, version `20231123` #;
%put # Macro to get help about SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -677,14 +677,13 @@ TODO:
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
*/
/* Macros to install SAS packages, version 20231111 */
/*+installPackage+*/
/* Macros to install SAS packages, version 20240711 */
/* 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
a single load.sas file (also embedded inside the zip).
*/
/*+installPackage+*/
/*** HELP START ***/
%macro installPackage(
@@ -702,7 +701,7 @@ TODO:
/secure
minoperator
/*** HELP END ***/
des = 'Macro to install SAS package, version 20231123. Run %%installPackage() for help info.'
des = 'Macro to install SAS package, version 20240711. Run %%installPackage() for help info.'
;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do;
@@ -717,7 +716,7 @@ des = 'Macro to install SAS package, version 20231123. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to install SAS packages, version `20231123` #;
%put # Macro to install SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -1165,18 +1164,20 @@ des = 'Macro to install SAS package, version 20231123. Run %%installPackage() fo
/*** HELP END ***/
/*** HELP START ***/
/* Macro to list SAS packages in packages folder.
/*+listPackages+*/
/*** HELP START ***//*
Version 20231111
Macro to list SAS packages in packages folder.
Version 20240711
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by
a single load.sas file (also embedded inside the zip).
*/
/*
* Example 1: Set local packages directory, enable the framework,
and list packages in the local repository.
@@ -1184,13 +1185,11 @@ des = 'Macro to install SAS package, version 20231123. Run %%installPackage() fo
%include packages(SPFinit.sas);
%listPackages()
*/
/*** HELP END ***/
*//*** HELP END ***/
/*+listPackages+*/
%macro listPackages()/secure PARMBUFF
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231123.'
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240711.'
;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do;
@@ -1205,14 +1204,14 @@ 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 `20231123` #;
%put # Macro to list available SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%listPackages())` macro lists packages available #;
%put # in the packages folder. List is printed inthe SAS Log. #;
%put # in the packages folder. List is printed in the SAS Log. #;
%put # #;
%put #### Parameters: #;
%put # #;
@@ -1351,11 +1350,12 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
%mend listPackages;
/*** HELP START ***/
/*+generatePackage+*/
/*** HELP START ***//*
/* Macro to generate SAS packages.
Macro to generate SAS packages.
Version 20231111
Version 20240711
A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating
@@ -1363,11 +1363,9 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
a single load.sas file (also embedded inside the zip).
See examples below.
*/
*//*** HELP END ***/
/*** HELP END ***/
/*+generatePackage+*/
/*** HELP START ***/
%macro generatePackage(
@@ -1390,9 +1388,14 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
,delTestWork=1 /* indicates if `WORK` directories generated by user tests
should be deleted, i.e. the (NO)WORKTERM option is set,
default value 1 means "delete tests work" */
,markdownDoc=0 /* indicates if a markdown file with documentation
be generated from help info blocks */
,easyArch=0 /* when creating documentation file indicates if a copy of
the zip and markdown files with the version number in the
file name be created */
)/ secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage() for help info.'
;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do;
@@ -1407,7 +1410,7 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20231123` #;
%put # Macro to generate SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -1458,6 +1461,17 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%put # The default value: `1` means "delete tests work". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `markdownDoc=` Indicates if a markdown file with documentation #;
%put # be generated from help information blocks. #;
%put # The default value: `0` means "do not generate the file". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put # - `easyArch=` When creating documentation file (`markdownDoc=1`) #;
%put # indicates if a copy of the zip and markdown files #;
%put # with the version number in the file name be created #;
%put # The default value: `0` means "do not create files". #;
%put # Available values are `0` and `1`. #;
%put # #;
%put #-------------------------------------------------------------------------------#;
%put #################################################################################;
%put ;
@@ -1466,8 +1480,11 @@ des = 'Macro to generate SAS packages, version 20231123. Run %generatePackage()
%end;
%put --- generatePackage START ---;
%local zipReferrence filesWithCodes _DESCR_ _LIC_ _DUMMY_ _RC_ _PackageFileref_ additionalContent;
%local zipReferrence zipReferrenceV filesWithCodes _DESCR_ _LIC_ _DUMMY_ _RC_ _PackageFileref_ additionalContent
packageHashF packageHashC
;
%let zipReferrence = _%sysfunc(datetime(), hex6.)_;
%let zipReferrenceV = _%sysfunc(datetime(), hex6.)V;
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
%let _DESCR_ = _%sysfunc(datetime(), hex6.)d;
%let _LIC_ = _%sysfunc(datetime(), hex6.)l;
@@ -1816,7 +1833,7 @@ DESCRIPTION END:
|
+-004_format [one file one format,
| | option LIB= should be: work.&packageName.format
| | (literally with macrovariable name and "format" sufix)]
| | (literally with macrovariable name and "format" suffix)]
| |
| +-efg.sas [a file with a code creating format EFG and informat EFG]
|
@@ -1858,7 +1875,7 @@ DESCRIPTION END:
| +-abc.sas [a file with a code creating CAS-L user defined function ABC, _without_ "Proc CAS" header]
|
+-012_kmfsnip [one file one KMF-abbreviation snippet,
| | code snipped propper tagging]
| | code snipped proper tagging]
| |
| +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
|
@@ -1969,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 */
@@ -2189,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 20231123";
footnote1 "SAS Packages Framework, version 20240711";
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent);
run;
@@ -2910,7 +2928,7 @@ data _null_;
%end;
put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20231123.;''' /
' !! '' %put with the SAS Packages Framework version 20240711.;''' /
' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ;
@@ -3054,11 +3072,11 @@ data _null_;
''' %put This is help for the `' "&packageName.IML" '` macro; '' !!' /
''' %put Parameters (optional) are the following:; '' !!' /
''' %put - `list` indicates if the list of loaded moduls should be displayed,; '' !!' /
''' %put - `list` indicates if the list of loaded modules should be displayed,; '' !!' /
''' %put %str( )when set to the value of `1` (the default) runs `SHOW MODULES%str(;)`,; '' !!' /
''' %put %str( )when set to the value of `HELP` (upcase letters!) displays this help message.;'' !!' /
''' %put - `resetIMLstorage` indicates if to reset default moduls storage,; '' !!' /
''' %put - `resetIMLstorage` indicates if to reset default modules storage,; '' !!' /
''' %put %str( )when set to `1` (the default) runs `RESET STORAGE = WORK.IMLSTOR%str(;)`.; '' !!' /
''' %put - `err` [technical] indicates message type in case of missing modules catalog,; '' !!' /
@@ -3075,7 +3093,7 @@ data _null_;
%end;
put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20231123.; '' !! ' /
''' %put with the SAS Packages Framework version 20240711.; '' !! ' /
''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' /
@@ -3229,7 +3247,7 @@ data _null_;
/ ' putlog / @7 "Should you have any problem with finding the file consider moving";'
/ ' putlog @7 "it to a location of your choice with the help of the following snippet:";'
/ ' putlog / @7 " filename KMFin " "''%sysfunc(pathname(WORK))/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog @7 " filename KMFout ""</directory/of/your/choice>/testpackageclean.kmf"" lrecl=1 recfm=n;";'
/ ' putlog / @7 " filename KMFout " "''</directory/of/your/choice>/%lowcase(&packageName..kmf)''" " lrecl=1 recfm=n;";'
/ ' putlog @7 '' %put *%sysfunc(fcopy(KMFin, KMFout))*(0=success)*;'';'
/ ' putlog / "0a"x / " ";'
@@ -3466,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 ' )';
@@ -3484,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 ' )';
@@ -3724,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, "()'");
@@ -3831,25 +3850,25 @@ data _null_;
put 'put @5 "' CUROBS +(-1) '." @10 "' type '" @21 "' fileshort '";';
end;
%if %bquote(&packageRequired.) ne %then
%if %superq(packageRequired) ne %then
%do;
length packageRequired $ 32767;
packageRequired = symget('packageRequired');
put ' length req $ 64; ';
put ' length req $ 256; ';
put ' put ; put " Required SAS Components: "; ';
put ' do req = ' / packageRequired / ' ; ';
put ' put @5 req; ';
put ' put @3 "-" @5 req; ';
put ' end ; ';
%end;
%if %bquote(&packageReqPackages.) ne %then
%if %superq(packageReqPackages) ne %then
%do;
length packageReqPackages $ 32767;
packageReqPackages = symget('packageReqPackages');
put ' length req $ 64; ';
put ' length req $ 256; ';
put ' put ; put " Required SAS Packages: "; ';
put ' do req = ' / packageReqPackages / ' ; ';
put ' put @5 req; ';
put ' put @3 "-" @5 req; ';
put ' end ; ';
%end;
@@ -3861,7 +3880,9 @@ 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 20231123 *"; put "***";';
put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20240711`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /;
@@ -3897,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, "()'");
@@ -3904,6 +3926,7 @@ data _null_;
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" );
otherwise fileshort2 = fileshort;
end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -4210,20 +4233,22 @@ filename &zipReferrence. clear;
set sashelp.vfunc(keep=fncname);
where fncname = "HASHING_FILE";
call execute('
data the_SHA256_hash_id;' !!
data work.the_SHA256_hash_id;' !!
/* F - file */
" SHA256 = 'F*' !! HASHING_FILE('SHA256', pathname('&zipReferrence.','F'), 0); " !!
' TYPE="F"; ' !!
' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashF",SHA256,"L");' !!
/* C - content */
" SHA256 = 'C*' !! HASHING_FILE('SHA256', '&zipReferrence.', 4); " !!
' TYPE="C"; ' !!
' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashC",SHA256,"L");' !!
' label ' !!
' SHA256 = "The SHA256 hash digest for package &packageName.:" ' !!
' TYPE= "Type of hash digest / F = file / C = content"; ' !!
'run;');
call execute('proc print data = the_SHA256_hash_id noobs label split="/"; run;');
call execute('proc print data = work.the_SHA256_hash_id noobs label split="/"; run;');
stop;
run;
options &notesSourceOptions.;
@@ -4232,7 +4257,7 @@ filename &zipReferrence. clear;
/*-+++++++++++++++++++++++-*/
/* verify if there were errors while package content creation */
%if %bquote(&createPackageContentStatus.) ne 0 %then
%if %superq(createPackageContentStatus) ne 0 %then
%do;
%put ERROR- ** [&sysmacroname.] **;
%put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **;
@@ -4787,6 +4812,290 @@ options &quotelenmax_tmp.;
/* if you do not want any test to be executed */
%NOTESTING:
/* generate MarkDown documentation file */
/* check param value */
%if %superq(markdownDoc) NE 1 %then %let markdownDoc=0;
/* if true then execute */
%if %superq(markdownDoc)=1 %then
%do;
%if %superq(createPackageContentStatus) NE 0 %then
%do;
%put ERROR- ** [&sysmacroname.] **;
%put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **;
%put ERROR- ** NO MARKDOWN DOCUMMENTATION WILL BE GENERATED. **;
%GOTO NOmarkdownDoc;
%end;
/*= generate MarkDown documentation START =================================================================================*/
%put NOTE-;
%put NOTE: Preparing markdown documentation file.;
%put NOTE- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
%put NOTE-;
%local MarkDownOptionsTmp;
%let MarkDownOptionsTmp =
%sysfunc(getoption(notes)) %sysfunc(getoption(source)) msglevel=%sysfunc(getoption(msglevel));
options NOnotes NOsource msglevel=N;
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md";
filename &_PackageFileref_. ZIP "&filesLocation./%lowcase(&packageName.).zip";
data &filesWithCodes.markdown;
/* break if no data */
if NOBS = 0 then stop;
file &zipReferrence. encoding = &packageEncoding.;
put "# Documentation for the `&packageName.` package.";
length packageLicense packageGenerated $ 64
packageTitle packageAuthor packageMaintainer $ 4096
packageHashF packageHashC $ 128
;
packageLicense=symget("packageLicense");
packageTitle=symget("packageTitle");
packageGenerated=symget("packageGenerated");
packageAuthor=symget("packageAuthor");
packageMaintainer=symget("packageMaintainer");
packageHashF=symget("packageHashF");
packageHashC=symget("packageHashC");
drop package:;
put " " / 64*"-" / " "
/ ' *' packageTitle +(-1)'* '
/ " " / 64*"-" / " "
/ "### Version information:"
/ " "
/ "- Package: &packageName."
/ "- Version: &packageVersion."
/ "- Generated: " packageGenerated
/ "- Author(s): " packageAuthor
/ "- Maintainer(s): " packageMaintainer
/ "- License: " packageLicense
/ "- File SHA256: `" packageHashF +(-1) "` for this version"
/ "- Content SHA256: `" packageHashC +(-1) "` for this version"
/ " " / "---" / " ";
put "# The `&packageName.` package, version: `&packageVersion.`;"
/ " " / "---" / " ";
do until (EOF);
infile &_PackageFileref_.(description.sas) end = EOF;
input;
if upcase(strip(_infile_)) =: "DESCRIPTION END:" then printer = 0;
if printer then put _infile_;
if upcase(strip(_infile_)) =: "DESCRIPTION START:" then printer = 1;
end;
put " " / "---" / " ";
%if %superq(packageRequired) ne %then
%do;
put " " / "---" / " ";
length req $ 256;
put "Required SAS Components: ";
do req = &packageRequired. ;
put @3 "-" @5 req;
end ;
%end;
%if %superq(packageReqPackages) ne %then
%do;
put " " / "---" / " ";
length req2 $ 256;
put "Required SAS Packages: ";
do req2 = &packageReqPackages.;
put @3 "-" @5 req2;
end ;
%end;
put " " / "---" / " ";
%if %superq(additionalContent) NE %then
%do;
put " " / "---" / " ";
put 'Package contains additional content, run: `%loadPackageAddCnt(' "&packageName." ')` to load it'
/ "or look for the `%lowcase(&packageName.)_AdditionalContent` directory in the `packages` fileref"
/ "localization (only if additional content was deployed during the installation process).";
%end;
put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20240711`*"
/ " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content";
put "The `&packageName.` package consists of the following content:" / " ";
EOFDS = 0;
do until(EOFDS);
/* content is created during package creation */
set &filesWithCodes. end = EOFDS nobs = NOBS curobs = CUROBS;
if upcase(type) in: ('TEST') then continue; /* exclude tests */
/*
To exclude file from being added to the documentation
insert the "excluding" text(see below) as a comment
in the FIRST line of the file.
Do not add spaces.
For each file the first line is read in and checked.
*/
length _FILEVARPATH_ $ 4096;
_FILEVARPATH_=catx("/",base,folder,file);
infile _dummy_ FILEVAR=_FILEVARPATH_;
input;
if strip(_infile_) IN (
'/*##DoNotUse4Documentation##*/'
'/*##ExcludeFromDocumentation##*/'
'/*##ExcludeFromMarkdownDoc##*/'
)
then continue; /* exclude file from documentation */
type2=type;
length link $ 256;
link=catx("-",compress(fileshort,,"KAD"),type,CUROBS);
length fileshort $ 256;
select;
when (upcase(type) =: "MACRO" ) do; fileshort2 = cats('`%', fileshort, "()`"); type2='macro'; end;
when (upcase(type) =: "FORMAT" ) do; fileshort2 = cats("`$", fileshort, ".`"); type2='format/informat'; end;
when (upcase(type) =: "FUNCTION" ) do; fileshort2 = cats("`", fileshort, "()`"); type2='function'; end;
when (upcase(type) =: "IMLMODULE") fileshort2 = cats("`", fileshort, "()`");
when (upcase(type) =: "PROTO" ) fileshort2 = cats("`", fileshort, "()`");
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("`", fileshort, "()`");
otherwise fileshort2 = cats("`", fileshort, "`");
end;
contentObs + 1;
put @1 contentObs +(-1) '. [' fileshort2 type2'](#' link ')';
output;
end;
put " " / " ";
contentObs+1;
put @1 contentObs +(-1) '. [License note](#license)';
put " " / "---" / " ";
putlog "Doc. note with general information ready.";
stop;
run;
/* loop through content and print info to the MD file */
data _null_;
if 0 = NOBS then stop;
do until(EOFDS);
set &filesWithCodes.markdown end = EOFDS nobs = NOBS curobs=CUROBS;
length memberX $ 1024;
memberX = cats("_",folder,".",file);
/* inner data step in call execute to read each embedded file */
call execute("data _null_; ");
call execute(" file &zipReferrence. encoding = &packageEncoding. MOD; ");
call execute(' put ''## ' !! catx(" ",fileshort2,type2) !! ' <a name="' !! strip(link) !! '"></a> ######'';');
call execute(' infile &_PackageFileref_.(' || strip(memberX) || ') end = EOF; ');
call execute(" printer = 0; ");
call execute(" do until(EOF); ");
call execute(" input; length _endhelpline_ _starthelpline_ $ 32767; ");
call execute(" _endhelpline_ = upcase(reverse(strip(_infile_))); ");
call execute(" if 18 <= lengthn(_endhelpline_) AND _endhelpline_
=: '/*** DNE PLEH ***/' then printer = 0; "); /* ends with HELP END */
call execute(" if printer then put _infile_; ");
call execute(" _starthelpline_ = upcase(strip(_infile_)); ");
call execute(" if 20 <= lengthn(_starthelpline_) AND _starthelpline_
=: '/*** HELP START ***/' then printer = 1 ; "); /* starts with HELP START */
call execute(" end; ");
call execute(' put " " / "---" / " "; ');
call execute(' putlog ''Doc. note ' !! cats(CUROBS) !! ' for ' !! catx(" ",fileshort2,type2) !! ' ready.'';');
call execute(" stop; ");
call execute("run; ");
end;
stop;
run;
/* license info */
data _null_;
file &zipReferrence. encoding = &packageEncoding. MOD;
putlog "Doc. note with license ready.";
put " " / "---" / " "
/ '# License <a name="license"></a> ######' / " "
;
do until (EOF_L);
infile &_PackageFileref_.(license.sas) end = EOF_L;
input;
put _infile_;
end;
put " " / "---" / " ";
stop;
run;
options &MarkDownOptionsTmp.;
%put NOTE: Markdown file generated.;
filename &zipReferrence. list;
%put NOTE- ;
options NOnotes NOsource msglevel=N;
filename &zipReferrence. clear;
filename &_PackageFileref_. clear;
options &MarkDownOptionsTmp.;
/* to make archiving easier a copy of the package zip file
with the version in the name is created */
%if %superq(easyArch) NE 1 %then %let easyArch=0;
%if %superq(easyArch) = 1 %then
%do;
%put NOTE-;
%put NOTE: Creating files with version in the name.;
%put NOTE- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^;
%put NOTE-;
%local notesSourceOptions;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
options NOnotes NOsource;
/* zip */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).zip" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.zip" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
length rctxt $ 32767;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.zip file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.zip file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
/* md */
filename &zipReferrence. "&filesLocation./%lowcase(&packageName.).md" lrecl=1 recfm=n;
filename &zipReferrence. list;
filename &zipReferrenceV. "&filesLocation./%lowcase(&packageName.)_&packageVersion._.md" lrecl=1 recfm=n;
filename &zipReferrenceV. list;
data _null_;
rc = fcopy("&zipReferrence.", "&zipReferrenceV.");
length rctxt $ 32767;
rctxt = sysmsg();
if rc then
do;
put "ERROR: An error " rc "occurred during creation of %lowcase(&packageName.)_&packageVersion._.md file.";
put rctxt;
end;
else put "Creating %lowcase(&packageName.)_&packageVersion._.md file.";
run;
filename &zipReferrence. clear;
filename &zipReferrenceV. clear;
options &notesSourceOptions.;
%end;
/*= generate MarkDown documentation END =================================================================================*/
%NOmarkdownDoc:
%end;
/* clean temporary files */
proc sql;
drop table &filesWithCodes.;
@@ -4794,6 +5103,11 @@ proc sql;
%do;
drop table &filesWithCodes.addCnt;
%end;
%if %sysfunc(exist(&filesWithCodes.markdown)) %then
%do;
drop table &filesWithCodes.markdown;
%end;
quit;
/* turn on the original value of the note about quoted string length */
@@ -4882,7 +5196,7 @@ TODO: (in Polish)
*/
)/secure
/*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20231123. Run %loadPackages() for help info.'
des = 'Macro to load multiple SAS packages at one run, version 20240711. Run %loadPackages() for help info.'
parmbuff
;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
@@ -4898,7 +5212,7 @@ parmbuff
%put ### This is short help information for the `loadPackageS` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro wrapper for the loadPackage macro, version `20231123` #;
%put # Macro wrapper for the loadPackage macro, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -4939,7 +5253,7 @@ parmbuff
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
%put ;
%put %nrstr( %%installPackage(SQLinDS DFA) %%* install packages from the Internet; );
%put %nrstr( %%loadPackageS(SQLinDS, DFA) %%* load packags content into the SAS session; );
%put %nrstr( %%loadPackageS(SQLinDS, DFA) %%* load packages content into the SAS session; );
%put ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~;
%put #################################################################################;
%put ;
@@ -4995,7 +5309,7 @@ parmbuff
hashing_file() function, SAS 9.4M6 */
)/secure
/*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20231123. Run %verifyPackage() for help info.'
des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %verifyPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -5010,7 +5324,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20231123. Run %
%put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to verify SAS package with it hash digest, version `20231123` #;
%put # Macro to verify SAS package with it hash digest, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -5189,7 +5503,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20231123. Run %
*/
)/secure
/*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20231123. Run %previewPackage() for help info.'
des = 'Macro to preview content of a SAS package, version 20240711. Run %previewPackage() for help info.'
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do;
@@ -5204,7 +5518,7 @@ des = 'Macro to preview content of a SAS package, version 20231123. Run %preview
%put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to get previwe of a SAS packages, version `20231123` #;
%put # Macro to get preview of a SAS packages, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -5331,7 +5645,7 @@ des = 'Macro to preview content of a SAS package, version 20231123. Run %preview
when empty the "packages" value is used */
)/secure
/*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20231123. Run %extendPackagesFileref(HELP) for help info.'
des = 'Macro to list directories pointed by "packages" fileref, version 20240711. Run %extendPackagesFileref(HELP) for help info.'
;
%if %QUPCASE(&packages.) = HELP %then
@@ -5347,14 +5661,14 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20231123
%put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;;
%put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20231123` #;
%put # Macro to list directories pointed by 'packages' fileref, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #;
%put # The `%nrstr(%%extendPackagesFileref())` macro lists directories pointed by #;
%put # the packages fileref. It allows to add new dierctories to packages folder list. #;
%put # the packages fileref. It allows to add new directories to packages folder list. #;
%put # #;
%put #### Parameters: #;
%put # #;
@@ -5448,7 +5762,7 @@ filename packages list;
is provided in required version */
)/secure
/*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20231123. Run %loadPackageAddCnt() for help info.'
des = 'Macro to load additional content for a SAS package, version 20240711. Run %loadPackageAddCnt() for help info.'
minoperator
;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -5464,7 +5778,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 `20231123` #;
%put # Macro to *load* additional content for a SAS package, version `20240711` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -61,7 +61,7 @@ SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045
---
- **macroArray**\[1.2.3\], implementation of an array concept in a macro language, e.g.
- **macroArray**\[1.2.6\], implementation of an array concept in a macro language, e.g.
```sas
%array(ABC[17] (111:127), macarray=Y);
@@ -80,13 +80,13 @@ SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045
which = 1:H:2
);
```
SHA256 digest for macroArray: F*A0840B92EB9356EDB318DBE9B579A345C85ABF69E8D5F7C73C144C66F2F74FB4
SHA256 digest for macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray")
---
- **BasePlus**\[1.35.1\] adds a bunch of functionalities I am missing in BASE SAS, such as:
- **BasePlus**\[2.0.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
```sas
call arrMissToRight(myArray);
call arrFillMiss(17, myArray);
@@ -112,9 +112,13 @@ format x bool.;
%put %date() %time() %datetime();
%put %date(yymmddn10.) %time(time5.) %datetime(e8601dt.);
%put %monthShift(2023,1,-5);
%put #%expandDataSetsList(lib=sashelp,datasets=_all_)#;
```
SHA256 digest for BasePlus: F*BCD89EDF856762EB8E441BC53933774483258453D1F7D74185F8A1861E414B0E
SHA256 digest for BasePlus: F*0730DD793516E5C193842126A7EC9D339ADADD19F0F40B071F938CABDE4E66AD
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus")

View File

@@ -1,3 +1,39 @@
/* 20240722 */
BasePlus: F*0730DD793516E5C193842126A7EC9D339ADADD19F0F40B071F938CABDE4E66AD
/* 20240722 */
BasePlus: F*68BB953CD732EB43119A3339656670292317FE1C3B764EC57484C7D5C9DF23EB
/* 20240719 */
BasePlus: F*2129F372D72A34A4FB1F368A581EA33D64AD4D8F3707213D5B9553F3C3122003
/* 20240710 */
BasePlus: F*6012D1475AE22A4445C032D8EAE092BE515D8CD2AE390CC087F5987ACB8BCB13
/* 20240609 */
BasePlus: F*6760DDF382E7CA9A1291F028FA7F2BACB68A3D31CEA3A85104E13EA08645AEF1
/* 20240606 */
BasePlus: F*BD0333B92D7CB639A136CD4994DE0C63F8396E449E45BC714D71D2E15318F42D
/* 20240529 */
BasePlus: F*3C3A2050E3FF46E1FC0F936634A66FC3F294A3531EFE0A7DC9CE74F2EF17C687
/* 20240312 */
BasePlus: F*209FB8198270DEAB6151CE31391A352A065B4EE2689F40433FA9550A7F4AAC18
/* 20240309 */
BasePlus: F*8155BFE82F7833E4B0DA24D81DBDFC58463906D6032B1F0161772DADE84BE790
/* 20240112 */
BasePlus: F*B9F1B3243FD3956F0B68652C21EA1EBC19F3EB0931774A57FECE1F02A9448108
/* 20231201 */
macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790
/* 20231129 */
macroArray: F*FFF2C3D854F9B5677F561BA2EB6FAA2CCC652D81F6AF9473ADF0A4CE977E43F0
/* 20231123 */
macroArray: F*A0840B92EB9356EDB318DBE9B579A345C85ABF69E8D5F7C73C144C66F2F74FB4

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -44,7 +44,7 @@ See examples for more details.
[Recording of presentation with "how it works" description (in Polish)](https://www.youtube.com/watch?v=LtaWPe2sgRY&t=1s "YouTube").
[The WUSS 2023 Conference article describing the idea](https://www.wuss.org/wuss-2023-conference-proceedings/ "Article about the idea GSM")
[The WUSS 2023 Conference article describing the idea](https://www.lexjansen.com/wuss/2023/WUSS-2023-Paper-189.pdf "Article about the idea GSM")
*How to use it:*

View File

@@ -19,7 +19,7 @@
---
# The macroArray package [ver. 1.2.3] <a name="macroarray-package"></a> ###############################################
# The macroArray package [ver. 1.2.6] <a name="macroarray-package"></a> ###############################################
The **macroArray** package implements a macroarray facility:
- `%array()`,
@@ -78,7 +78,7 @@ Required SAS Components:
*SAS package generated by generatePackage, version 20231123*
The SHA256 hash digest for package macroArray:
`F*A0840B92EB9356EDB318DBE9B579A345C85ABF69E8D5F7C73C144C66F2F74FB4`
`F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790`
---
# Content description ############################################################################################
@@ -1211,7 +1211,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
1. `H` - *Required*, a hash table macro name and a declaration/definition,
e.g. `mcHashTable(HT)`. It names a macro which is generated by
the `%mcHashTable()` macro. Provided name cannot be empty
or an underscore (`_`). No longer than *16* characters.
or an underscore (`_`). No longer than *10* characters.
2. `METHOD` - *Optional*, if empty (or DECLARE or DCL) then the code of
a macro hash table is compiled.
@@ -1568,7 +1568,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
1. `H` - *Required*, a dictionary macro name and a declaration/definition,
e.g. `mcDictionary(HT)`. It names a macro which is generated by
the `%mcDictionary()` macro. Provided name cannot be empty
or an underscore (`_`). No longer than *16* characters.
or an underscore (`_`). No longer than *13* characters.
2. `METHOD` - *Optional*, if empty (or DECLARE or DCL) then the code of
a macro dictionary is compiled.

Binary file not shown.