Compare commits

...

25 Commits

Author SHA1 Message Date
Bart Jablonski
c667bc6b25 SAS Packages Framework, version 20241014
#SAS Packages Framework, version `20241014`

## Changes

---

The [%generatePackage()]{https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md#generatepackage} macro accepts two new code types:
- `DS2PCK` for Proc DS2 packages, and
- `DS2THR` for Proc DS2 threads.

Those two new types allow to add `PROC DS2` *threads* and *packages* to a SAS package.

---

The [%loadPackage()]{https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md#loadpackage} macro has new parameter:
- `DS2force` - when set to `1` an existing data set named the same as thread or package is overwritten by DS2 file.

While loading a package that contains `PRCO DS2` code, by default, if there already exist a SAS data set with the same name (which is not a DS2 thread or package file) a warning is issued in the log and the thread/package data set is not generated. To force overwrite, set the `DS2force=` parameter of the `%loadPackage()` macro to 1.

---

Minor updates and fixes:
- Proc `sql` "drop table" replaced with `fedsqsl`'s for data sets deletion.
- Proc `iml`, `fcmp`, and `proto` code blocks end with `quit;` statement.

---

[Documentation]{https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation} and [Hands-on-Workshops materials]{https://github.com/yabwon/HoW-SASPackages} updated.

---
2024-10-14 21:38:08 +02:00
Bart Jablonski
0a01f39662 update in README.md
update in README.md

- links to packages documentation updated
2024-10-01 07:25:20 +02:00
Bart Jablonski
45127a057e SAS Packages Framework, version 20240927
## SAS Packages Framework, version `20240927`

---

### Changes

- Aesthetic changes in log when running the `%installPackage()` macro, notes about successful/failed installation.
- New parameter `SFRCVN` added to the `%installPackage()` macro, `SFRCVN` provides a *name* for a macro variable to store value of the *success-failure return code* of the installation process. Return value has the following form: `<number of successes>.<number of failures>` The macro variable is created as a *global* macro variable.
- Documentation updated.

---
2024-09-27 11:25:33 +02:00
Bart Jablonski
3f950e11ce The BasePlus package [ver. 2.1.0]
## The BasePlus package [ver. 2.1.0]

### Changes:

Update to the
[`%rainCloudPlot()`](https://github.com/SASPAC/baseplus/blob/2.1.0/baseplus.md#raincloudplot-macro-17)
macro, new `whiskerScale=` parameter added.

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

---

SHA256 digest for BasePlus: `F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769`

---

### Example.

~~~~sas
%rainCloudPlot(
 sashelp.class
,sex
,height
,whiskerScale=0.5
)
~~~~
2024-09-09 13:17:27 +02:00
Bart Jablonski
96247523ba The BasePlus package [ver. 2.0.1]
## The BasePlus package [ver. 2.0.1]

This release is dedicated to all dyslexics in the world.

### 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:
- [`bpklength.`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#bpklength-format)
- [`bplength.`](https://github.com/SASPAC/baseplus/blob/2.0.0/baseplus.md#bplength-format)
- Bug fix in spelling (`lenght` vs `length`).

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

---

SHA256 digest for BasePlus: `F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609`

---

### 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', bpklength.);
  y = input('żółw', bplength.);
  put x= y=;
run;
~~~~

~~~~log
x=4 y=7
~~~~
2024-07-24 08:09:50 +02:00
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
Bart Jablonski
669a8e0a1d SAS Packages Framework, version 20231123
## SAS Packages Framework, version `20231123`

### Changes in SPF

- Minor update in log aesthetics for `%generatePackage()` macro.

---

### The macroArray package [ver. 1.2.3]

- Update in `q=` parameter for the `%array()` macro.
- Fix in data set existence for `ds=` parameter in the `%array()` macro.
- Documentation updated.

---

### Packages regenerated with the latest version of SPF:

- macroArray package [ver. 1.2.3]

SHA256 digests for packages:

- macroArray: `F*A0840B92EB9356EDB318DBE9B579A345C85ABF69E8D5F7C73C144C66F2F74FB4`
2023-11-23 21:50:17 +01:00
34 changed files with 6049 additions and 3602 deletions

View File

@@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2019 - 2023 Bartosz Jablonski Copyright (c) 2019 - 2024 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -16,7 +16,7 @@ Don't forget to **STAR** (:star:) the repository! :-)
### Current version: ### Current version:
**The latest version** of SPF is **`20231111`**. **The latest version** of SPF is **`20241014`**.
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). 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,10 @@ The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS
### Updates worth mentioning: ### Updates worth mentioning:
**Update**\[October 14th, 2024\]**:** `DS2PCK` and `DS2THR` **types for `PROC DS2` *threads* and *packages* added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241014 "PROC DS2"))**.
**Update**\[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**\[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"))**. **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"))**.
@@ -213,32 +217,32 @@ Packages:
- **SQLinDS** - **SQLinDS**
[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") [Documentation for SQLinDS](https://github.com/SASPAC/blob/main/sqlinds.md "Documentation for SQLinDS")
[SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC") [SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC")
- **DFA** (Dynamic Function Arrays) - **DFA** (Dynamic Function Arrays)
[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") [Documentation for DFA](https://github.com/SASPAC/blob/main/dfa.md "Documentation for DFA")
[DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC") [DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC")
- **macroArray** - **macroArray**
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") [Documentation for macroArray](https://github.com/SASPAC/blob/main/macroarray.md "Documentation for macroArray")
[MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC") [MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC")
- **BasePlus** - **BasePlus**
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") [Documentation for BasePlus](https://github.com/SASPAC/blob/main/baseplus.md "Documentation for BasePlus")
[BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC") [BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC")
- **GSM** (Generate Secure Macros) - **GSM** (Generate Secure Macros)
[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") [Documentation for GSM](https://github.com/SASPAC/blob/main/gsm.md "Documentation for GSM")
[GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC") [GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC")

View File

@@ -1,4 +1,4 @@
## The "Hello World" Package ## The "Hello World" Package
--- ---
@@ -40,7 +40,9 @@ If it was - then continue.
```sas ```sas
/*** HELP START ***//* /*** 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 ***/ *//*** HELP END ***/
value HelloWorldFormat value HelloWorldFormat
@@ -57,7 +59,11 @@ value HelloWorldFormat
into that file: into that file:
```sas ```sas
/*** HELP START ***//* /*** 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 ***/ *//*** HELP END ***/
%macro HelloWorldMacro(n); %macro HelloWorldMacro(n);
@@ -86,10 +92,12 @@ Encoding: UTF8
Required: "Base SAS Software" Required: "Base SAS Software"
DESCRIPTION START: DESCRIPTION START:
## My "Hello World" SAS package ## ### My "Hello World" SAS package ###
The "Hello World" is my first SAS package and The "Hello World" is my first SAS package and
for sure it will not be the last package one! for sure it will not be the last package one!
Using packages is a good idea!
DESCRIPTION END: DESCRIPTION END:
``` ```
@@ -107,13 +115,14 @@ DESCRIPTION END:
```sas ```sas
%generatePackage( %generatePackage(
filesLocation=<put/folder/from/the/step/three/here> filesLocation=<put/folder/from/the/step/three/here>
,markdownDoc=1
) )
``` ```
`Step 10.` See the information in the output window and in the log. `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. 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 */ when empty the "packages" value is used */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20231111. Run %extendPackagesFileref(HELP) for help info.' des = 'Macro to list directories pointed by "packages" fileref, version 20241014. Run %extendPackagesFileref(HELP) for help info.'
; ;
%if %QUPCASE(&packages.) = HELP %then %if %QUPCASE(&packages.) = HELP %then
@@ -22,14 +22,14 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20231111
%put ### This is short help information for the `extendPackagesFileref` macro #; %put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20231111` #; %put # Macro to list directories pointed by 'packages' fileref, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #; %put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #; %put # #;
%put # The `%nrstr(%%extendPackagesFileref())` macro lists directories pointed by #; %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 # #;
%put #### Parameters: #; %put #### Parameters: #;
%put # #; %put # #;

View File

@@ -1,4 +1,19 @@
/*+generatePackage+*/ /*+generatePackage+*/
/*** HELP START ***//*
Macro to generate SAS packages.
Version 20241014
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 ***/ /*** HELP START ***/
%macro generatePackage( %macro generatePackage(
@@ -21,9 +36,14 @@
,delTestWork=1 /* indicates if `WORK` directories generated by user tests ,delTestWork=1 /* indicates if `WORK` directories generated by user tests
should be deleted, i.e. the (NO)WORKTERM option is set, should be deleted, i.e. the (NO)WORKTERM option is set,
default value 1 means "delete tests work" */ 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 )/ secure minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to generate SAS packages, version 20231111. Run %generatePackage() for help info.' des = 'Macro to generate SAS packages, version 20241014. Run %generatePackage() for help info.'
; ;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do; %do;
@@ -38,7 +58,7 @@ des = 'Macro to generate SAS packages, version 20231111. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #; %put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to generate SAS packages, version `20231111` #; %put # Macro to generate SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -89,6 +109,17 @@ des = 'Macro to generate SAS packages, version 20231111. Run %generatePackage()
%put # The default value: `1` means "delete tests work". #; %put # The default value: `1` means "delete tests work". #;
%put # Available values are `0` and `1`. #; %put # Available values are `0` and `1`. #;
%put # #; %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 #################################################################################; %put #################################################################################;
%put ; %put ;
@@ -97,8 +128,11 @@ des = 'Macro to generate SAS packages, version 20231111. Run %generatePackage()
%end; %end;
%put --- generatePackage START ---; %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 zipReferrence = _%sysfunc(datetime(), hex6.)_;
%let zipReferrenceV = _%sysfunc(datetime(), hex6.)V;
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_; %let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
%let _DESCR_ = _%sysfunc(datetime(), hex6.)d; %let _DESCR_ = _%sysfunc(datetime(), hex6.)d;
%let _LIC_ = _%sysfunc(datetime(), hex6.)l; %let _LIC_ = _%sysfunc(datetime(), hex6.)l;
@@ -447,7 +481,7 @@ DESCRIPTION END:
| |
+-004_format [one file one format, +-004_format [one file one format,
| | option LIB= should be: work.&packageName.format | | option LIB= should be: work.&packageName.format
| | (literally with macrovariable name and "format" sufix)] | | (literally with macrovariable name and "format" suffix)]
| | | |
| +-efg.sas [a file with a code creating format EFG and informat EFG] | +-efg.sas [a file with a code creating format EFG and informat EFG]
| |
@@ -489,10 +523,22 @@ DESCRIPTION END:
| +-abc.sas [a file with a code creating CAS-L user defined function ABC, _without_ "Proc CAS" header] | +-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, +-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] | +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
| |
+-013_ds2pck [one file one PROC DS2 package]
| |
| +-abc.sas [a data set with a package ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a package LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-014_ds2thr [one file one PROC DS2 thread]
| |
| +-abc.sas [a data set with a thread ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a thread LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-<sequential number>_<type [in lower case]> +-<sequential number>_<type [in lower case]>
| |
+-00n_clean [if you need to clean something up after exec file execution, +-00n_clean [if you need to clean something up after exec file execution,
@@ -575,6 +621,7 @@ data &filesWithCodes.;
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'CASLUDF' 'LAZYDATA' 'TEST' 'CASLUDF'
'ADDCNT' 'KMFSNIP' 'ADDCNT' 'KMFSNIP'
'DS2PCK' 'DS2THR'
)) ))
then then
do; do;
@@ -600,6 +647,7 @@ data &filesWithCodes.;
put; put;
_abort_ + 1; _abort_ + 1;
end; end;
length fileshort $ 256;
fileshort = substr(file, 1, length(file) - 4); /* filename.sas -> filename */ fileshort = substr(file, 1, length(file) - 4); /* filename.sas -> filename */
if strip(reverse(file)) in: ('sas.') then output; /* ignore not ".sas" files */ if strip(reverse(file)) in: ('sas.') then output; /* ignore not ".sas" files */
@@ -652,6 +700,9 @@ run;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); %let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
options NOnotes NOsource; options NOnotes NOsource;
options mprint;
options notes source;
proc sort data = &filesWithCodes.; proc sort data = &filesWithCodes.;
by order type file; by order type file;
run; run;
@@ -758,7 +809,7 @@ run;
/* code inspired by Kurt Bremser's "Talking to Your Host" article */ /* code inspired by Kurt Bremser's "Talking to Your Host" article */
/* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */ /* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */
/* WUSS 2022 */ /* WUSS 2022 */
data &filesWithCodes.addCnt; data &filesWithCodes.addCnt;
run; run;
@@ -820,9 +871,12 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
%end; %end;
footnote1 "SAS Packages Framework, version 20231111"; footnote1 "SAS Packages Framework, version 20241014";
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
width=full
;
run; run;
title; title;
@@ -841,7 +895,7 @@ title;
title2 "Package additional content:"; title2 "Package additional content:";
proc print proc print
data=&filesWithCodes.addCnt(drop=root dir level) data=&filesWithCodes.addCnt(drop=root dir level)
label label width=full
; ;
run; run;
%end; %end;
@@ -1076,6 +1130,8 @@ data _null_;
isProto = 0; isProto = 0;
isIMLmodule = 0; isIMLmodule = 0;
isCASLudf = 0; isCASLudf = 0;
isDS2pck = 0;
isDS2thr = 0;
%if (%superq(packageRequired) ne ) %if (%superq(packageRequired) ne )
or (%superq(packageReqPackages) ne ) or (%superq(packageReqPackages) ne )
@@ -1315,7 +1371,7 @@ data _null_;
('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA' ('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA'
'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/ 'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP')) 'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP' 'DS2PCK' 'DS2THR'))
then then
do; do;
putlog 'WARNING: Type ' type 'is not yet supported.'; putlog 'WARNING: Type ' type 'is not yet supported.';
@@ -1326,8 +1382,11 @@ data _null_;
isFormat + (upcase(type)=:'FORMAT'); isFormat + (upcase(type)=:'FORMAT');
isProto + (upcase(type)=:'PROTO'); isProto + (upcase(type)=:'PROTO');
isIMLmodule + (upcase(type)=:'IMLMODULE'); isIMLmodule + (upcase(type)=:'IMLMODULE');
isDS2pck + (upcase(type)=:'DS2PCK');
isDS2thr + (upcase(type)=:'DS2THR');
/* HEADERS for IML, FCMP, and PROTO - start */
/* HEADERS for PROC IML, FCMP, and PROTO - start */
if 1 = isFunction and upcase(type)=:'FUNCTION' then if 1 = isFunction and upcase(type)=:'FUNCTION' then
do; do;
/* macro variable for test if cherry picking used FCMP */ /* macro variable for test if cherry picking used FCMP */
@@ -1385,7 +1444,7 @@ data _null_;
/* header, for IML modules */ /* header, for IML modules */
put "proc iml ; "; put "proc iml ; ";
end; end;
/* HEADERS for IML, FCMP, and PROTO - end */ /* HEADERS for PROC IML, FCMP, and PROTO - end */
put ' ' / put ' ' /
'%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */ '%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */
@@ -1396,6 +1455,8 @@ data _null_;
put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort
"exist. It will be overwritten by the macro from the &packageName. package, ));"; "exist. It will be overwritten by the macro from the &packageName. package, ));";
/* separate approach for EXEC */
if upcase(type)=:'EXEC' then if upcase(type)=:'EXEC' then
do; do;
/* User can suppress running the exec files */ /* User can suppress running the exec files */
@@ -1418,9 +1479,84 @@ data _null_;
/ ' )));' / ' )));'
; ;
end; end;
else /* separate approach for DS2 */
else if (upcase(type) in: ('DS2PCK' 'DS2THR')) then
do; do;
/* include the file with the code of the element */ if 1 = isDS2pck and upcase(type)=:'DS2PCK' then
do;
/* macro variable for test if cherry picking used DS2 package */
put 'data _null_; ';
put " call symputX('cherryPick_DS2PCK', 0, 'L'); ";
put 'run; ';
end;
if 1 = isDS2thr and upcase(type)=:'DS2THR' then
do;
/* macro variable for test if cherry picking used DS2 threads */
put 'data _null_; ';
put " call symputX('cherryPick_DS2THR', 0, 'L'); ";
put 'run; ';
end;
/* since DS2 packages and threads are stored in SAS data sets */
/* we have to check (before loading) if there is no "regular" */
/* data set (or view) with the same name to avoid overwriting */
if upcase(type) in: ('DS2PCK' 'DS2THR') then
do;
length DS2lib $ 8 DS2ds $ 32;
DS2lib = coalescec(scan(fileshort,-2,"."), "WORK");
DS2ds = scan(fileshort,-1,".");
put '%put %sysfunc(ifc(%sysfunc(exist(' fileshort +(-1) '))=1,'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/ ' data _null_;'
/ ' id = OPEN("' fileshort +(-1) '");'
/ ' if id then do;'
/ ' x = VARNUM(id, "SAS_CHECKSUM_") AND VARNUM(id, "SAS_ROWID_") AND (VARNUM(id, "SAS_TEXTTHREAD_") OR VARNUM(id, "SAS_TEXTPACKAGE_"));'
/ ' y = ("DATA"=ATTRC(id, "MTYPE"));'
/ ' if symexist("DS2force") then z = symgetn("DS2force"); else z = 0;'
/ ' if (x AND y) OR z then do;'
/ ' call execute("proc delete data=' fileshort +(-1) '; run;");'
/ " put 'NOTE# The " fileshort "will be overwritten by the PROC DS2 package/thread from the &packageName. package.';"
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("proc ds2;");'
/ ' call execute(''%include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'');'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("run; quit;");'
/ ' call execute("options nonotes; proc datasets lib=' DS2lib 'noprint;");'
/ " call execute('modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);');"
/ ' call execute("run; quit;");'
/ ' end;'
/ ' else put "WARNING: Data set ' fileshort 'exist and is not a PROC DS2 package/thread!"'
/ ' / "WARNING- PROC DS2 package/thread ' fileshort 'will not be generated..."; '
/ ' id = CLOSE(id);'
/ ' end;'
/ ' run;))),'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' proc ds2;'
/ ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' run; quit;'
/ ' options nonotes; proc datasets lib=' DS2lib 'noprint;'
/ " modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);"
/ ' run; quit;'
/ '))),'
/ '));'
/ " "
/ ;
end;
end;
else
do;
/* include the file with the code of the element, all other cases */
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'; put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
end; end;
@@ -1436,13 +1572,19 @@ data _null_;
if upcase(type)=:'FORMAT' then if upcase(type)=:'FORMAT' then
put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);'; put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);';
if upcase(type)=:'DS2PCK' then
put ' %let cherryPick_DS2PCK = %eval(&cherryPick_DS2PCK. + 1);';
if upcase(type)=:'DS2THR' then
put ' %let cherryPick_DS2THR = %eval(&cherryPick_DS2THR. + 1);';
put '%end; ' /; /* Cherry Pick test1 end */ put '%end; ' /; /* Cherry Pick test1 end */
/* FOOTERS for IML, FCMP, and PROTO - start */ /* FOOTERS for PROC IML, FCMP, and PROTO - start */
if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then
do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */ do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */
put "run; " / ; put "quit; " / ;
end; end;
if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */ if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */
do; do;
@@ -1453,7 +1595,7 @@ data _null_;
'%end; ' / '%end; ' /
"quit; " / ; "quit; " / ;
end; end;
/* FOOTERS for IML, FCMP, and PROTO - end */ /* FOOTERS for PROC IML, FCMP, and PROTO - end */
/* add the link to the functions dataset, only for the first occurrence */ /* add the link to the functions dataset, only for the first occurrence */
/*if 1 = isFunction and (upcase(type)=:'FUNCTION') then /*if 1 = isFunction and (upcase(type)=:'FUNCTION') then
@@ -1541,7 +1683,7 @@ data _null_;
%end; %end;
put +(-1) '`.;''' / put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20231111.;''' / ' !! '' %put with the SAS Packages Framework version 20241014.;''' /
' !! '' %put ****************************************************************************;''' / ' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ; ' !! '' %end;''' ;
@@ -1685,11 +1827,11 @@ data _null_;
''' %put This is help for the `' "&packageName.IML" '` macro; '' !!' / ''' %put This is help for the `' "&packageName.IML" '` macro; '' !!' /
''' %put Parameters (optional) are the following:; '' !!' / ''' %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 `1` (the default) runs `SHOW MODULES%str(;)`,; '' !!' /
''' %put %str( )when set to the value of `HELP` (upcase letters!) displays this help message.;'' !!' / ''' %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 %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,; '' !!' / ''' %put - `err` [technical] indicates message type in case of missing modules catalog,; '' !!' /
@@ -1706,7 +1848,7 @@ data _null_;
%end; %end;
put +(-1) '`.; '' !!' / put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20231111.; '' !! ' / ''' %put with the SAS Packages Framework version 20241014.; '' !! ' /
''' %put ****************************************************************************; '' !! ' / ''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' / ''' %end; '' !! ' /
@@ -1860,7 +2002,7 @@ data _null_;
/ ' putlog / @7 "Should you have any problem with finding the file consider moving";' / ' 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 "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 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 @7 '' %put *%sysfunc(fcopy(KMFin, KMFout))*(0=success)*;'';'
/ ' putlog / "0a"x / " ";' / ' putlog / "0a"x / " ";'
@@ -2097,7 +2239,7 @@ data _null_;
if not (upcase(type)=:'MACRO') then continue; 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- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;';
put ' %put NOTE- ;'; put ' %put NOTE- ;';
put ' ,"' fileshort upcase32. '"' /; put ' ,"' fileshort upcase64. '"' /;
end; end;
/**/ /**/
put ' )'; put ' )';
@@ -2115,7 +2257,7 @@ data _null_;
if not (upcase(type)=:'FORMAT') then continue; 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- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;';
put ' %put NOTE- ;'; put ' %put NOTE- ;';
put ' ,"' fileshort upcase32. '"' /; put ' ,"' fileshort upcase64. '"' /;
isFormat + 1; isFormat + 1;
end; end;
put ' )'; put ' )';
@@ -2221,15 +2363,33 @@ data _null_;
/* put 'remove module = ' fileshort ';'; */ /* put 'remove module = ' fileshort ';'; */
end; end;
/* delete datasets */ /* delete data sets */
put "proc sql noprint;"; put "proc fedsql noprint;";
EOF = 0; EOF = 0;
do until(EOF); do until(EOF);
set &filesWithCodes. end = EOF; set &filesWithCodes. end = EOF;
if not (upcase(type)=:'DATA') then continue; if not (upcase(type) in: ('DATA')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;';
put '%put NOTE- ;'; put '%put NOTE- ;';
put 'drop table ' fileshort ';' /; put 'drop table ' fileshort ' FORCE;' /;
end;
put "quit;" /;
/* delete PROC DS2 packages or threads */
put 'data _null_; call symputx("_DS2_2_del_",0,"L"); run;';
put "proc fedsql noprint;";
EOF = 0;
do until(EOF);
set &filesWithCodes. end = EOF;
if not (upcase(type) in: ('DS2PCK' 'DS2THR')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'
/ '%put NOTE- ;'
/ '%let _DS2_2_del_ = %sysfunc(open(' fileshort '));'
/ '%sysfunc(ifc(&_DS2_2_del_. AND %sysfunc(ATTRC(&_DS2_2_del_.,LABEL))='
/ '%str(' "Package: &packageName. ; Type: " type "; Name: " fileshort +(-1) '),drop table ' fileshort ' FORCE,)) ;'
/ '%let _DS2_2_del_ = %sysfunc(close(&_DS2_2_del_.));'
;
put ';' /;
end; end;
put "quit;" /; put "quit;" /;
@@ -2355,13 +2515,15 @@ data _null_;
set &filesWithCodes. end = EOFDS nobs = NOBS; set &filesWithCodes. end = EOFDS nobs = NOBS;
if upcase(type) in: ('TEST') then continue; /* exclude tests */ if upcase(type) in: ('TEST') then continue; /* exclude tests */
length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -2462,25 +2624,25 @@ data _null_;
put 'put @5 "' CUROBS +(-1) '." @10 "' type '" @21 "' fileshort '";'; put 'put @5 "' CUROBS +(-1) '." @10 "' type '" @21 "' fileshort '";';
end; end;
%if %bquote(&packageRequired.) ne %then %if %superq(packageRequired) ne %then
%do; %do;
length packageRequired $ 32767; length packageRequired $ 32767;
packageRequired = symget('packageRequired'); packageRequired = symget('packageRequired');
put ' length req $ 64; '; put ' length req $ 256; ';
put ' put ; put " Required SAS Components: "; '; put ' put ; put " Required SAS Components: "; ';
put ' do req = ' / packageRequired / ' ; '; put ' do req = ' / packageRequired / ' ; ';
put ' put @5 req; '; put ' put @3 "-" @5 req; ';
put ' end ; '; put ' end ; ';
%end; %end;
%if %bquote(&packageReqPackages.) ne %then %if %superq(packageReqPackages) ne %then
%do; %do;
length packageReqPackages $ 32767; length packageReqPackages $ 32767;
packageReqPackages = symget('packageReqPackages'); packageReqPackages = symget('packageReqPackages');
put ' length req $ 64; '; put ' length req $ 256; ';
put ' put ; put " Required SAS Packages: "; '; put ' put ; put " Required SAS Packages: "; ';
put ' do req = ' / packageReqPackages / ' ; '; put ' do req = ' / packageReqPackages / ' ; ';
put ' put @5 req; '; put ' put @3 "-" @5 req; ';
put ' end ; '; put ' end ; ';
%end; %end;
@@ -2492,7 +2654,9 @@ data _null_;
put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;"; put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;";
%end; %end;
put 'put "***"; put "* SAS package generated by generatePackage, version 20231111 *"; put "***";'; put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20241014`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /; put 'run; ' /;
@@ -2528,13 +2692,16 @@ data _null_;
set &filesWithCodes. end = EOFDS; set &filesWithCodes. end = EOFDS;
if upcase(type) in: ('TEST') then continue; /* exclude tests */ if upcase(type) in: ('TEST') then continue; /* exclude tests */
length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -2644,7 +2811,7 @@ data _null_;
/* copy code file into the zip */ /* copy code file into the zip */
call execute('data _null_;'); call execute('data _null_;');
call execute(' put ;'); call execute(' put ; length pathname $ 8192;');
call execute(' pathname = pathname("_SPFIN_");'); call execute(' pathname = pathname("_SPFIN_");');
call execute(' do until (ex OR Try>10) ;'); call execute(' do until (ex OR Try>10) ;');
@@ -2841,20 +3008,22 @@ filename &zipReferrence. clear;
set sashelp.vfunc(keep=fncname); set sashelp.vfunc(keep=fncname);
where fncname = "HASHING_FILE"; where fncname = "HASHING_FILE";
call execute(' call execute('
data the_SHA256_hash_id;' !! data work.the_SHA256_hash_id;' !!
/* F - file */ /* F - file */
" SHA256 = 'F*' !! HASHING_FILE('SHA256', pathname('&zipReferrence.','F'), 0); " !! " SHA256 = 'F*' !! HASHING_FILE('SHA256', pathname('&zipReferrence.','F'), 0); " !!
' TYPE="F"; ' !! ' TYPE="F"; ' !!
' put / @7 SHA256= / " "; output; ' !! ' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashF",SHA256,"L");' !!
/* C - content */ /* C - content */
" SHA256 = 'C*' !! HASHING_FILE('SHA256', '&zipReferrence.', 4); " !! " SHA256 = 'C*' !! HASHING_FILE('SHA256', '&zipReferrence.', 4); " !!
' TYPE="C"; ' !! ' TYPE="C"; ' !!
' put / @7 SHA256= / " "; output; ' !! ' put / @7 SHA256= / " "; output; ' !!
' call symputX("packageHashC",SHA256,"L");' !!
' label ' !! ' label ' !!
' SHA256 = "The SHA256 hash digest for package &packageName.:" ' !! ' SHA256 = "The SHA256 hash digest for package &packageName.:" ' !!
' TYPE= "Type of hash digest / F = file / C = content"; ' !! ' TYPE= "Type of hash digest / F = file / C = content"; ' !!
'run;'); '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; stop;
run; run;
options &notesSourceOptions.; options &notesSourceOptions.;
@@ -2863,7 +3032,7 @@ filename &zipReferrence. clear;
/*-+++++++++++++++++++++++-*/ /*-+++++++++++++++++++++++-*/
/* verify if there were errors while package content creation */ /* verify if there were errors while package content creation */
%if %bquote(&createPackageContentStatus.) ne 0 %then %if %superq(createPackageContentStatus) ne 0 %then
%do; %do;
%put ERROR- ** [&sysmacroname.] **; %put ERROR- ** [&sysmacroname.] **;
%put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **; %put ERROR: ** ERRORS IN PACKAGE CONTENT CREATION! **;
@@ -3418,6 +3587,290 @@ options &quotelenmax_tmp.;
/* if you do not want any test to be executed */ /* if you do not want any test to be executed */
%NOTESTING: %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 `20241014`*"
/ " " / "--------------------------------------------------------------------" / " ";
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; proc sql;
drop table &filesWithCodes.; drop table &filesWithCodes.;
@@ -3425,6 +3878,11 @@ proc sql;
%do; %do;
drop table &filesWithCodes.addCnt; drop table &filesWithCodes.addCnt;
%end; %end;
%if %sysfunc(exist(&filesWithCodes.markdown)) %then
%do;
drop table &filesWithCodes.markdown;
%end;
quit; quit;
/* turn on the original value of the note about quoted string length */ /* turn on the original value of the note about quoted string length */

View File

@@ -28,7 +28,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to get help about SAS package, version 20231111. Run %helpPackage() for help info.' des = 'Macro to get help about SAS package, version 20241014. Run %helpPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -43,7 +43,7 @@ des = 'Macro to get help about SAS package, version 20231111. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #; %put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get help about SAS packages, version `20231111` #; %put # Macro to get help about SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -120,14 +120,15 @@ des = 'Macro to get help about SAS package, version 20231111. Run %helpPackage()
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -170,7 +171,8 @@ des = 'Macro to get help about SAS package, version 20231111. Run %helpPackage()
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofhelpPackage: %ENDofhelpPackage:
%mend helpPackage; %mend helpPackage;
@@ -181,10 +183,3 @@ TODO:
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE] - 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+*/ /*+installPackage+*/
/* Macros to install SAS packages, version 20241014 */
/* 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 ***/ /*** HELP START ***/
%macro installPackage( %macro installPackage(
@@ -12,11 +18,12 @@
, URLoptions = /* options for the `sourcePath` URLs */ , URLoptions = /* options for the `sourcePath` URLs */
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, SFRCVN = /* name of a macro variable to store success-failure return code value */
) )
/secure /secure
minoperator minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to install SAS package, version 20231111. Run %%installPackage() for help info.' des = 'Macro to install SAS package, version 20241014. Run %%installPackage() for help info.'
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do; %do;
@@ -31,7 +38,7 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #; %put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;; %put #--------------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to install SAS packages, version `20231111` #; %put # Macro to install SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -75,7 +82,7 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%put # - `version=` Indicates which historical version of a package to install. #; %put # - `version=` Indicates which historical version of a package to install. #;
%put # Historical version are available only if `mirror=0` is set. #; %put # Historical version are available only if `mirror=0` is set. #;
%put # Default value is null which means "install the latest". #; %put # Default value is null which means "install the latest". #;
%put # When there are multiple packages to install version #; %put # When there are multiple packages to install version variable #;
%put # is scan sequentially. #; %put # is scan sequentially. #;
%put # #; %put # #;
%put # - `replace=` With default value of `1` it causes existing package file #; %put # - `replace=` With default value of `1` it causes existing package file #;
@@ -95,6 +102,11 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%put # directory in `<packageName>_AdditionalContent` folder. #; %put # directory in `<packageName>_AdditionalContent` folder. #;
%put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #; %put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #;
%put # #; %put # #;
%put # - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the #;
%put # *success-failure return code* of the installation process. Return value #;
%put # has the following form: `<number of successes>.<number of failures>` #;
%put # The macro variable is created as a *global* macro variable. #;
%put # #;
%put #--------------------------------------------------------------------------------------------#; %put #--------------------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -143,7 +155,7 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
@@ -152,8 +164,9 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
/* /*
Reference: Reference:
@@ -227,6 +240,10 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%put ; %put ;
%put INFO: Calling: &packagesNames.; %put INFO: Calling: &packagesNames.;
%Local PackagesInstalledSussess PackagesInstalledFail;
%Let PackagesInstalledSussess=;
%let PackagesInstalledFail=;
%do i = 1 %to %sysfunc(countw(&packagesNames., , S)); %do i = 1 %to %sysfunc(countw(&packagesNames., , S));
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%local packageName packageSubDir vers versA versB; %local packageName packageSubDir vers versA versB;
@@ -260,7 +277,9 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%do; %do;
%let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas;
%end; %end;
%if %superq(mirror) > 1 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
filename &in URL filename &in URL
"&SPFinitMirror." "&SPFinitMirror."
recfm=N lrecl=1; recfm=N lrecl=1;
@@ -280,6 +299,12 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%let packageSubDir = %lowcase(&packageName.)/raw/&vers./; %let packageSubDir = %lowcase(&packageName.)/raw/&vers./;
%end; %end;
%end; %end;
%else
%do;
%if %superq(mirror) > 0 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
%end;
filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip"
%if (%superq(URLuser) ne ) %then %if (%superq(URLuser) ne ) %then
%do; %do;
@@ -354,6 +379,21 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
filename &in clear; filename &in clear;
filename &out clear; filename &out clear;
%if 0 = &installationRC. %then
%do;
%if %superq(vers)= %then
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.;
%else
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.(&vers.);
%end;
%else
%do;
%if %superq(vers)= %then
%Let PackagesInstalledFail=&PackagesInstalledFail. &packageName.;
%else
%let PackagesInstalledFail=&PackagesInstalledFail. &packageName.(&vers.);
%end;
%if 1 = &loadAddCnt. %if 1 = &loadAddCnt.
AND 0 = &installationRC. AND 0 = &installationRC.
AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK)) AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK))
@@ -369,14 +409,60 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
%put *** %lowcase(&packageName.) end *******************************************; %put *** %lowcase(&packageName.) end *******************************************;
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%end; %end;
%local sucsCount sucsCountWords;
%let sucsCount=0;
%if NOT(%superq(PackagesInstalledSussess)=) %then
%do;
%put %str( );
%let sucsCount=%sysfunc(countw(%superq(PackagesInstalledSussess),%str( )));
%if 1=&sucsCount. %then
%put INFO: Package %superq(PackagesInstalledSussess) installed.;
%else %if 1<&sucsCount. %then
%do;
%let sucsCountWords=%sysfunc(abs(&sucsCount.),words.);
%put INFO: Successfully installed &sucsCountWords. packages:;
%put %str( )&PackagesInstalledSussess.;
%end;
%end;
%local failCount failCountWords;
%let failCount=0;
%if NOT(%superq(PackagesInstalledFail)=) %then
%do;
%put %str( );
%let failCount=%sysfunc(countw(%superq(PackagesInstalledFail),%str( )));
%if 1=&failCount. %then
%put WARNING: Failed to install %superq(PackagesInstalledFail) package.;
%else %if 1<&failCount. %then
%do;
%let failCountWords=%sysfunc(abs(&failCount.),words.);
%put WARNING: Failed to install &failCountWords. packages:;
%put WARNING- &PackagesInstalledFail.;
%end;
%end;
%put %str( );
%if NOT(%superq(SFRCVN)=) %then
%do;
data _null_;
length SFRCVN $ 32;
SFRCVN = compress(symget('SFRCVN'),"_","KAD");
value = "&sucsCount..&failCount.";
put 'INFO: Success-Failure-Return-Code macroVariable Name is: ' SFRCVN
/ ' with value: ' value
/ ;
call symputX(SFRCVN, value, "G");
run;
%end;
%packagesListError: %packagesListError:
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofinstallPackage: %ENDofinstallPackage:
%mend installPackage; %mend installPackage;
@@ -479,25 +565,4 @@ des = 'Macro to install SAS package, version 20231111. Run %%installPackage() fo
/*** HELP END ***/ /*** 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,29 @@
/*+listPackages+*/ /*+listPackages+*/
/*** HELP START ***//*
%macro listPackages()/secure PARMBUFF Macro to list SAS packages in packages folder.
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231111.'
Version 20241014
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 20241014.'
; ;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do; %do;
@@ -16,14 +38,14 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
%put ### This is short help information for the `listPackages` macro #; %put ### This is short help information for the `listPackages` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list available SAS packages, version `20231111` #; %put # Macro to list available SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
%put # data, etc.) wrapped up together and embedded inside the zip. #; %put # data, etc.) wrapped up together and embedded inside the zip. #;
%put # #; %put # #;
%put # The `%nrstr(%%listPackages())` macro lists packages available #; %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 # #;
%put #### Parameters: #; %put #### Parameters: #;
%put # #; %put # #;
@@ -162,19 +184,3 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
%mend listPackages; %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

@@ -30,11 +30,13 @@
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, suppressExec=0 /* indicates if loading of exec files , suppressExec=0 /* indicates if loading of exec files
should be suppressed, 1=suppress should be suppressed, 1=suppress */
, DS2force=0 /* indicates if PROC DS2 packages and threads
should be loaded if a data set exists, 0=do not load
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load SAS package, version 20231111. Run %loadPackage() for help info.' des = 'Macro to load SAS package, version 20241014. Run %loadPackage() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -50,7 +52,7 @@ minoperator
%put ### This is short help information for the `loadPackage` macro #; %put ### This is short help information for the `loadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* SAS packages, version `20231111` #; %put # Macro to *load* SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -110,6 +112,10 @@ minoperator
%put # should be suppressed, default value is `0`, #; %put # should be suppressed, default value is `0`, #;
%put # when set to `1` `exec` files are *not* loaded #; %put # when set to `1` `exec` files are *not* loaded #;
%put # #; %put # #;
%put # - `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages #;
%put # or threads should overwrite existing SAS data sets. #;
%put # Default value of `0` means "do not overwrite". #;
%put # #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -159,7 +165,7 @@ minoperator
%GOTO ENDofloadPackage; %GOTO ENDofloadPackage;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -167,8 +173,9 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -211,6 +218,11 @@ minoperator
%let suppressExec = 0; %let suppressExec = 0;
%end; %end;
%if %superq(DS2force) NE 1 %then
%do;
%let DS2force = 0;
%end;
filename &_PackageFileref_. &ZIP. filename &_PackageFileref_. &ZIP.
/* put location of package myPackageFile.zip here */ /* put location of package myPackageFile.zip here */
"&path./%lowcase(&packageName.).&zip." %unquote(&options.) "&path./%lowcase(&packageName.).&zip." %unquote(&options.)
@@ -278,7 +290,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackage: %ENDofloadPackage:
%mend loadPackage; %mend loadPackage;

View File

@@ -19,7 +19,7 @@
is provided in required version */ is provided in required version */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20231111. Run %loadPackageAddCnt() for help info.' des = 'Macro to load additional content for a SAS package, version 20241014. Run %loadPackageAddCnt() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -35,7 +35,7 @@ minoperator
%put ### This is short help information for the `loadPackageAddCnt` macro #; %put ### This is short help information for the `loadPackageAddCnt` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* additional content for a SAS package, version `20231111` #; %put # Macro to *load* additional content for a SAS package, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -100,7 +100,7 @@ minoperator
%GOTO ENDofloadPackageAddCnt; %GOTO ENDofloadPackageAddCnt;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp zip; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp zip;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -108,10 +108,11 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
%let zip = zip; %let zip = zip;
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -364,7 +365,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackageAddCnt: %ENDofloadPackageAddCnt:
%mend loadPackageAddCnt; %mend loadPackageAddCnt;

View File

@@ -11,7 +11,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20231111. Run %loadPackages() for help info.' des = 'Macro to load multiple SAS packages at one run, version 20241014. Run %loadPackages() for help info.'
parmbuff parmbuff
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
@@ -27,7 +27,7 @@ parmbuff
%put ### This is short help information for the `loadPackageS` macro #; %put ### This is short help information for the `loadPackageS` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro wrapper for the loadPackage macro, version `20231111` #; %put # Macro wrapper for the loadPackage macro, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -68,7 +68,7 @@ parmbuff
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; ); %put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
%put ; %put ;
%put %nrstr( %%installPackage(SQLinDS DFA) %%* install packages from the Internet; ); %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 #################################################################################; %put #################################################################################;
%put ; %put ;

View File

@@ -23,7 +23,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20231111. Run %previewPackage() for help info.' des = 'Macro to preview content of a SAS package, version 20241014. Run %previewPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20231111. Run %preview
%put ### This is short help information for the `previewPackage` macro #; %put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get previwe of a SAS packages, version `20231111` #; %put # Macro to get preview of a SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -106,13 +106,15 @@ des = 'Macro to preview content of a SAS package, version 20231111. Run %preview
%GOTO ENDofpreviewPackage; %GOTO ENDofpreviewPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; %let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -152,7 +154,8 @@ des = 'Macro to preview content of a SAS package, version 20231111. Run %preview
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofpreviewPackage: %ENDofpreviewPackage:
%mend previewPackage; %mend previewPackage;

View File

@@ -20,7 +20,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to unload SAS package, version 20231111. Run %unloadPackage() for help info.' des = 'Macro to unload SAS package, version 20241014. Run %unloadPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20231111. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #; %put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to unload SAS packages, version `20231111` #; %put # Macro to unload SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -102,14 +102,15 @@ des = 'Macro to unload SAS package, version 20231111. Run %unloadPackage() for h
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -149,7 +150,8 @@ des = 'Macro to unload SAS package, version 20231111. Run %unloadPackage() for h
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofunloadPackage: %ENDofunloadPackage:
%mend unloadPackage; %mend unloadPackage;

View File

@@ -13,7 +13,7 @@
hashing_file() function, SAS 9.4M6 */ hashing_file() function, SAS 9.4M6 */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20231111. Run %verifyPackage() for help info.' des = 'Macro to verify SAS package with the hash digest, version 20241014. Run %verifyPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20231111. Run %
%put ### This is short help information for the `verifyPackage` macro #; %put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to verify SAS package with it hash digest, version `20231111` #; %put # Macro to verify SAS package with it hash digest, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -83,7 +83,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20231111. Run %
%GOTO ENDofverifyPackage; %GOTO ENDofverifyPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -91,8 +91,9 @@ des = 'Macro to verify SAS package with the hash digest, version 20231111. Run %
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -176,7 +177,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20231111. Run %
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofverifyPackage: %ENDofverifyPackage:
%mend verifyPackage; %mend verifyPackage;

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. 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 **`20231111`**. In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20241014`**.
**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). **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> ## This is short help information for the `installPackage` macro <a name="installpackage"></a>
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
Macro to install SAS packages, version `20231111` Macro to install SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -102,7 +102,12 @@ After assigning the directory do not change them when using the SPF since it may
means "Yes". Content is extracted into the **packages** fileref means "Yes". Content is extracted into the **packages** fileref
directory in `<packageName>_AdditionalContent` folder. directory in `<packageName>_AdditionalContent` folder.
For other locations use `%loadPackageAddCnt()` macro. For other locations use `%loadPackageAddCnt()` macro.
- `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the
*success-failure return code* of the installation process. Return value
has the following form: `<number of successes>.<number of failures>`
The macro variable is created as a *global* macro variable.
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` to learn more. Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` to learn more.
@@ -149,7 +154,7 @@ filename packages "C:/SAS_PACKAGES";
## This is short help information for the `helpPackage` macro <a name="helppackage"></a> ## This is short help information for the `helpPackage` macro <a name="helppackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to get help about SAS packages, version `20231111` Macro to get help about SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -225,7 +230,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `loadPackage` macro <a name="loadpackage"></a> ## This is short help information for the `loadPackage` macro <a name="loadpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to *load* SAS packages, version `20231111` Macro to *load* SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -285,6 +290,10 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
should be suppressed, default value is `0`, should be suppressed, default value is `0`,
when set to `1` `exec` files are *not* loaded when set to `1` `exec` files are *not* loaded
- `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages
or threads should overwrite existing SAS data sets.
Default value of `0` means "do not overwrite".
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
@@ -377,7 +386,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> ## This is short help information for the `loadPackageS` macro <a name="loadpackages"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro wrapper for the loadPackage macro, version `20231111` Macro wrapper for the loadPackage macro, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -426,7 +435,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `unloadPackage` macro <a name="unloadpackage"></a> ## This is short help information for the `unloadPackage` macro <a name="unloadpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to unload SAS packages, version `20231111` Macro to unload SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -491,7 +500,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `listPackages` macro <a name="listpackages"></a> ## This is short help information for the `listPackages` macro <a name="listpackages"></a>
----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------
Macro to list available SAS packages, version `20231111` Macro to list available SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -532,7 +541,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `verifyPackage` macro <a name="verifypackage"></a> ## This is short help information for the `verifyPackage` macro <a name="verifypackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to verify SAS package with it hash digest, version `20231111` Macro to verify SAS package with it hash digest, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -586,7 +595,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> ## This is short help information for the `previewPackage` macro <a name="previewpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to get previwe of a SAS packages, version `20231111` Macro to get preview of a SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -653,7 +662,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `generatePackage` macro <a name="generatepackage"></a> ## This is short help information for the `generatePackage` macro <a name="generatepackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to generate SAS packages, version `20231111` Macro to generate SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -703,7 +712,18 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
should be deleted, i.e. the (NO)WORKTERM option is set. should be deleted, i.e. the (NO)WORKTERM option is set.
The default value: `1` means "delete tests work". The default value: `1` means "delete tests work".
Available values are `0` and `1`. 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 +799,7 @@ All files have to have `.sas` extension. Other files are ignored.
| |
+-004_format [one file one format, +-004_format [one file one format,
| | option LIB= should be: work.&packageName.format | | option LIB= should be: work.&packageName.format
| | (literally with macrovariable name and "format" sufix)] | | (literally with macrovariable name and "format" suffix)]
| | | |
| +-efg.sas [a file with a code creating format EFG and informat EFG] | +-efg.sas [a file with a code creating format EFG and informat EFG]
| |
@@ -821,7 +841,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] | +-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, +-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] | +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
| |
@@ -857,7 +877,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> ## This is short help information for the `extendPackagesFileref` macro <a name="extendpackagesfileref"></a>
----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------
Macro to list directories pointed by 'packages' fileref, version `20231111` Macro to list directories pointed by 'packages' fileref, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -897,7 +917,7 @@ filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory;
## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a> ## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to load *additional content* for a SAS package, version `20231111` Macro to load *additional content* for a SAS package, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,4 @@
Copyright (c) 2019 - 2023 Bartosz Jablonski Copyright (c) 2019 - 2024 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -24,7 +24,7 @@ run;
``` ```
SHA256 digest for SQLinDS: F*3C010734B76CA7459C4D35087C899121011CD4AA2932B56335FF11A805C8EF8D SHA256 digest for SQLinDS: F*3C010734B76CA7459C4D35087C899121011CD4AA2932B56335FF11A805C8EF8D
[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") [Documentation for SQLinDS](https://github.com/SASPAC/blob/main/sqlinds.md "Documentation for SQLinDS")
--- ---
@@ -57,11 +57,11 @@ run;
``` ```
SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168 SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168
[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") [Documentation for DFA](https://github.com/SASPAC/blob/main/dfa.md "Documentation for DFA")
--- ---
- **macroArray**\[1.2.1\], 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 ```sas
%array(ABC[17] (111:127), macarray=Y); %array(ABC[17] (111:127), macarray=Y);
@@ -80,13 +80,13 @@ SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045
which = 1:H:2 which = 1:H:2
); );
``` ```
SHA256 digest for macroArray: F*2A108D121D4DACAA8752E681301371F80F0500B2EE28A9E3B39678415BCBD6B2 SHA256 digest for macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") [Documentation for macroArray](https://github.com/SASPAC/blob/main/macroarray.md "Documentation for macroArray")
--- ---
- **BasePlus**\[1.35.1\] adds a bunch of functionalities I am missing in BASE SAS, such as: - **BasePlus**\[2.1.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
```sas ```sas
call arrMissToRight(myArray); call arrMissToRight(myArray);
call arrFillMiss(17, myArray); call arrFillMiss(17, myArray);
@@ -112,11 +112,15 @@ format x bool.;
%put %date() %time() %datetime(); %put %date() %time() %datetime();
%put %monthShift(2023,1,-5); %put %date(yymmddn10.) %time(time5.) %datetime(e8601dt.);
```
SHA256 digest for BasePlus: F*BCD89EDF856762EB8E441BC53933774483258453D1F7D74185F8A1861E414B0E
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") %put %monthShift(2023,1,-5);
%put #%expandDataSetsList(lib=sashelp,datasets=_all_)#;
```
SHA256 digest for BasePlus: F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769
[Documentation for BasePlus](https://github.com/SASPAC/blob/main/baseplus.md "Documentation for BasePlus")
--- ---
@@ -131,7 +135,7 @@ SHA256 digest for BasePlus: F*BCD89EDF856762EB8E441BC53933774483258453D1F7D74185
SHA256 digest for GSM: F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E SHA256 digest for GSM: F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E
[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") [Documentation for GSM](https://github.com/SASPAC/blob/main/gsm.md "Documentation for GSM")
--- ---

View File

@@ -1,3 +1,48 @@
/* 20240909 */
BasePlus: F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769
/* 20240724 */
BasePlus: F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609
/* 20240723 */
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
/* 20231114 */ /* 20231114 */
BasePlus: F*BCD89EDF856762EB8E441BC53933774483258453D1F7D74185F8A1861E414B0E BasePlus: F*BCD89EDF856762EB8E441BC53933774483258453D1F7D74185F8A1861E414B0E

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"). [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:* *How to use it:*

View File

@@ -19,9 +19,9 @@
--- ---
# The macroArray package [ver. 1.2.1] <a name="macroarray-package"></a> ############################################### # The macroArray package [ver. 1.2.6] <a name="macroarray-package"></a> ###############################################
The **macroArray** package implements a macro array facility: The **macroArray** package implements a macroarray facility:
- `%array()`, - `%array()`,
- `%do_over()`, - `%do_over()`,
- `%make_do_over()`, - `%make_do_over()`,
@@ -75,10 +75,10 @@ Package contains:
Required SAS Components: Required SAS Components:
*Base SAS Software* *Base SAS Software*
*SAS package generated by generatePackage, version 20231111* *SAS package generated by generatePackage, version 20231123*
The SHA256 hash digest for package macroArray: The SHA256 hash digest for package macroArray:
`F*2A108D121D4DACAA8752E681301371F80F0500B2EE28A9E3B39678415BCBD6B2` `F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790`
--- ---
# Content description ############################################################################################ # Content description ############################################################################################
@@ -244,7 +244,7 @@ The code of a macro was inspired by
The `%array()` macro version provided in the package The `%array()` macro version provided in the package
is designed to facilitate is designed to facilitate
the idea of macro array concept, i.e. *a list of the idea of macroarray concept, i.e. *a list of
macrovariables with common prefix and numerical suffixes*. macrovariables with common prefix and numerical suffixes*.
Usually such construction is then resolved by Usually such construction is then resolved by
double ampersand syntax, e.g. `&&perfix&i` or similar one. double ampersand syntax, e.g. `&&perfix&i` or similar one.
@@ -253,7 +253,7 @@ What is new/extension to the `%array()` macro concept are:
0. The syntax is closer to the data step one. 0. The syntax is closer to the data step one.
1. It is a pure macro code (it can be executed in any place 1. It is a pure macro code (it can be executed in any place
of 4GL code), this includes generating macro arrays out of 4GL code), this includes generating macroarrays out
of datasets. of datasets.
2. When a macroarrray is created it allows also to generate 2. When a macroarrray is created it allows also to generate
a new macro (named the same as the array name) and replace a new macro (named the same as the array name) and replace
@@ -346,8 +346,9 @@ The basic syntax is the following, the `<...>` means optional parameters:
3) macroarray "W" with UNIQUE(|) values of variable "weight" and <br> 3) macroarray "W" with UNIQUE(|) values of variable "weight" and <br>
4) macroarray "AGE" with UNIQUE(|) values of variable "age". 4) macroarray "AGE" with UNIQUE(|) values of variable "age".
* `q=` - *Optional*, indicates (when set to `1`) if the value be surrounded by quotes. * `q=` - *Optional*, indicates (when set to `1` or '2') if the value should be surrounded by quotes.
It uses `quote(cats(...))` combo under the hood. Default value is `0`. It uses `quote(cats(...))` combo under the hood. Default value is `0`.
Value `1` is for apostrophes, value `2` is for double quotes.
Ignored for `macarray=M`. Ignored for `macarray=M`.
@@ -1210,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, 1. `H` - *Required*, a hash table macro name and a declaration/definition,
e.g. `mcHashTable(HT)`. It names a macro which is generated by e.g. `mcHashTable(HT)`. It names a macro which is generated by
the `%mcHashTable()` macro. Provided name cannot be empty 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 2. `METHOD` - *Optional*, if empty (or DECLARE or DCL) then the code of
a macro hash table is compiled. a macro hash table is compiled.
@@ -1567,7 +1568,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
1. `H` - *Required*, a dictionary macro name and a declaration/definition, 1. `H` - *Required*, a dictionary macro name and a declaration/definition,
e.g. `mcDictionary(HT)`. It names a macro which is generated by e.g. `mcDictionary(HT)`. It names a macro which is generated by
the `%mcDictionary()` macro. Provided name cannot be empty 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 2. `METHOD` - *Optional*, if empty (or DECLARE or DCL) then the code of
a macro dictionary is compiled. a macro dictionary is compiled.
@@ -1867,7 +1868,7 @@ footnote;
The zipArrays() and QzipArrays() macros The zipArrays() and QzipArrays() macros
allow to use a function on elements of pair of allow to use a function on elements of pair of
macro arrays. macroarrays.
For two macroarrays the corresponding For two macroarrays the corresponding
elements are taken and the macro applies a function, provided by user, elements are taken and the macro applies a function, provided by user,
@@ -1978,7 +1979,7 @@ See examples in `%zipArrays()` help for the details.
The zipArrays() and QzipArrays() macros The zipArrays() and QzipArrays() macros
allow to use a function on elements of pair of allow to use a function on elements of pair of
macro arrays. macroarrays.
For two macroarrays the corresponding For two macroarrays the corresponding
elements are taken and the macro applies a function, provided by user, elements are taken and the macro applies a function, provided by user,
@@ -2177,7 +2178,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
## >>> `%sortMacroArray()` macro: <<< <a name="sortmacroarray-macro"></a> ####################### ## >>> `%sortMacroArray()` macro: <<< <a name="sortmacroarray-macro"></a> #######################
The sortMacroArray() macro The sortMacroArray() macro
allow to sort elements of a macro array. allow to sort elements of a macroarray.
The **limitation** is that sorted values are limited to 32767 bytes of length. The **limitation** is that sorted values are limited to 32767 bytes of length.

Binary file not shown.