mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2026-01-10 16:30:06 +00:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7fd4dd9774 | ||
|
|
f41d73cd90 | ||
|
|
863d6cb251 | ||
|
|
790816e229 | ||
|
|
88ace7321b | ||
|
|
f4ac0f1fe3 | ||
|
|
eb5cd6975c | ||
|
|
b975f75ff3 | ||
|
|
bb22a3e274 | ||
|
|
f981751c28 | ||
|
|
2f110adf1f | ||
|
|
5b1f8a3aae | ||
|
|
ef6473ad35 | ||
|
|
e30261410e | ||
|
|
3ede4541fd | ||
|
|
387898e01a | ||
|
|
e801f99e1c | ||
|
|
850e003ea9 |
18
README.md
18
README.md
@@ -6,13 +6,15 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file
|
||||
|
||||
The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process.
|
||||
|
||||
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is `20200730`.
|
||||
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is `20200807`.
|
||||
|
||||
Read the **`SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf`** to learn more (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/master/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory).
|
||||
|
||||
The documentation and more advance reading would be the [**`SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf`**](https://github.com/yabwon/SAS_PACKAGES/blob/master/SPF/Documentation/SAS(r)%20packages%20-%20the%20way%20to%20share%20(a%20how%20to)-%20Paper%204725-2020%20-%20extended.pdf "SAS packages - the way to share") article (see the `./SPF/Documentation` directory).
|
||||
|
||||
**General overview video:**
|
||||
- SAS Global Forum 2020 V.E.: `https://www.youtube.com/watch?v=qCkb-bx0Dv8&t=0s`
|
||||
- Sasensei Internationa Dojo: `https://www.youtube.com/watch?v=BFhdUBQgjYQ&t=0s`
|
||||
- [SAS Global Forum 2020 V.E.](https://www.youtube.com/watch?v=qCkb-bx0Dv8&t=0s "SGF2020")
|
||||
- [Sasensei Internationa Dojo](https://www.youtube.com/watch?v=BFhdUBQgjYQ&t=0s "SID no. 1")
|
||||
|
||||
### The User:
|
||||
To use a package:
|
||||
@@ -45,12 +47,12 @@ filename SPFinit url "https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/mast
|
||||
%loadPackage(packageName) /* load the package content into the SAS session */
|
||||
```
|
||||
|
||||
**Workshop video for the User**\[May 6th, 2020\]**: `https://youtu.be/qX_-HJ76g8Y`** [a bit outdated but gives the idea how it works]
|
||||
[**Workshop video for the User**](https://youtu.be/qX_-HJ76g8Y)\[May 6th, 2020\] [a bit outdated but gives the idea how it works]
|
||||
|
||||
### The Developer:
|
||||
To create your own package:
|
||||
- Read the **`SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf`** to learn more details.
|
||||
- Download and use the `SPFinit.sas` file (the SAS Packages Framework) file (user part of the framework required for *testing* is there too).
|
||||
- Read the [**`SAS(r) packages - the way to share (a how to)- Paper 4725-2020 - extended.pdf`**](https://github.com/yabwon/SAS_PACKAGES/blob/master/SPF/Documentation/SAS(r)%20packages%20-%20the%20way%20to%20share%20(a%20how%20to)-%20Paper%204725-2020%20-%20extended.pdf "SAS packages - the way to share") to learn more details.
|
||||
- Download and use the `SPFinit.sas` file (the SAS Packages Framework), the part of the framework required for *testing* is there too.
|
||||
|
||||
#### If you have any questions, suggestions, or ideas do not hesitate to contact me!
|
||||
|
||||
@@ -86,7 +88,7 @@ run;
|
||||
%end;
|
||||
```
|
||||
|
||||
- **BasePlus**\[0.5\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
- **BasePlus**\[0.52\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
```
|
||||
call arrMissToRight(myArray);
|
||||
call arrFillMiss(17, myArray);
|
||||
|
||||
BIN
SPF/Documentation/Getting_Started_with_SAS_Packages.pdf
Normal file
BIN
SPF/Documentation/Getting_Started_with_SAS_Packages.pdf
Normal file
Binary file not shown.
Binary file not shown.
417
SPF/SPFinit.sas
417
SPF/SPFinit.sas
@@ -42,11 +42,11 @@
|
||||
- to unload, or
|
||||
- to generate SAS packages.
|
||||
|
||||
Version 20200730.
|
||||
Version 20200807.
|
||||
See examples below.
|
||||
|
||||
A SAS package is a zip file containing a group of files
|
||||
with SAS code (macros, functions, datasteps generating
|
||||
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).
|
||||
*/
|
||||
@@ -62,7 +62,7 @@
|
||||
, path = %sysfunc(pathname(packages)) /* location of a package,
|
||||
by default it looks for
|
||||
location of "packages" fileref */
|
||||
, options = %str(LOWCASE_MEMNAME) /* posible options for ZIP filename */
|
||||
, options = %str(LOWCASE_MEMNAME) /* possible options for ZIP filename */
|
||||
, source2 = /*source2*/ /* option to print out details,
|
||||
null by default */
|
||||
, requiredVersion = . /* option to test if loaded package
|
||||
@@ -74,14 +74,14 @@
|
||||
means "load all datasets" */
|
||||
, zip = zip /* standard package is zip (lowcase),
|
||||
e.g. %loadPackage(PiPackage)
|
||||
if the zip is not avaliable use a folder
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use loadPackage in the form:
|
||||
%loadPackage(PiPackage, zip=disk, options=)
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help info.'
|
||||
des = 'Macro to load SAS package, version 20200807. Run %loadPackage() for help info.'
|
||||
;
|
||||
%if %superq(packageName) = %then
|
||||
%do;
|
||||
@@ -90,13 +90,16 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
%put # This is short help information for the loadPackage macro #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Macro to load SAS packages, version 20200730 #;
|
||||
%put # Macro to load SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, datasteps generating #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%loadPackage()) macro loads package content, i.e. macros, #;
|
||||
%put # functions, formats, etc., from the zip into the SAS session. #;
|
||||
%put # #;
|
||||
%put # Parameters: #;
|
||||
%put # #;
|
||||
%put # packageName Name of a package, e.g. myPackage, #;
|
||||
@@ -108,7 +111,7 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
%put # location of the "packages" fileref, i.e. #;
|
||||
%put # %nrstr(%%sysfunc(pathname(packages))) #;
|
||||
%put # #;
|
||||
%put # options= Posible options for ZIP filename, #;
|
||||
%put # options= Possible options for ZIP filename, #;
|
||||
%put # default value: LOWCASE_MEMNAME #;
|
||||
%put # #;
|
||||
%put # source2= Option to print out details, null by default. #;
|
||||
@@ -120,27 +123,51 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
%put # lazyData= A list of names of lazy datasets to be loaded. #;
|
||||
%put # If not null datasets from the list are loaded #;
|
||||
%put # instead of the package. #;
|
||||
%put # Asterisk (*) means "load all datasets". #;
|
||||
%put # Asterisk (*) means "load all lazy datasets". #;
|
||||
%put # #;
|
||||
%put # zip=zip Standard package is zip (lowcase), #;
|
||||
%put # e.g. %nrstr(%%loadPackage(PiPackage)). #;
|
||||
%put # If the zip is not avaliable use a folder. #;
|
||||
%put # If the zip is not available use a folder. #;
|
||||
%put # Unpack data to "pipackage.disk" folder #;
|
||||
%put # and use loadPackage in the following form: #;
|
||||
%put # %nrstr(%%loadPackage(PiPackage, zip=disk, options=)) #;
|
||||
%put # #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to learn more. #;
|
||||
%put # #;
|
||||
%put # Example #####################################################################;
|
||||
%put # #;
|
||||
%put # Enabling the SAS Package Framework #;
|
||||
%put # from the local directory and installing & loading #;
|
||||
%put # the SQLinDS package from the Internet. #;
|
||||
%put # #;
|
||||
%put # Assume that the SPFinit.sas file #;
|
||||
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||
%put # #;
|
||||
%put # Run the following code in your SAS session: #;
|
||||
%put ;
|
||||
%GOTO ENDloadPackage;
|
||||
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||
%put ;
|
||||
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||
%put ;
|
||||
%put ###############################################################################;
|
||||
%put ;
|
||||
%RETURN;
|
||||
%end;
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp fullstimer_tmp stimer_tmp msglevel_tmp;
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let source_tmp = %sysfunc(getoption(source));
|
||||
%let stimer_tmp = %sysfunc(getoption(stimer));
|
||||
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N;
|
||||
%local _PackageFileref_;
|
||||
%let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.);
|
||||
@@ -164,7 +191,7 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
|
||||
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
filename &_PackageFileref_. &ZIP.
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
ENCODING =
|
||||
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||
%else utf8 ;
|
||||
@@ -185,9 +212,6 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
¬es_tmp. &source_tmp.
|
||||
&stimer_tmp. &fullstimer_tmp.
|
||||
msglevel=&msglevel_tmp.;
|
||||
|
||||
/* jump here after running %loadPackage() - only help is displayed */
|
||||
%ENDloadPackage:
|
||||
%mend loadPackage;
|
||||
|
||||
/*** HELP START ***/
|
||||
@@ -204,14 +228,14 @@ des = 'Macro to load SAS package, version 20200730. Run %loadPackage() for help
|
||||
null by default */
|
||||
, zip = zip /* standard package is zip (lowcase),
|
||||
e.g. %unloadPackage(PiPackage)
|
||||
if the zip is not avaliable use a folder
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use unloadPackage in the form:
|
||||
%unloadPackage(PiPackage, zip=disk, options=)
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for help info.'
|
||||
des = 'Macro to unload SAS package, version 20200807. Run %unloadPackage() for help info.'
|
||||
;
|
||||
%if %superq(packageName) = %then
|
||||
%do;
|
||||
@@ -220,13 +244,16 @@ des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for h
|
||||
%put # This is short help information for the unloadPackage macro #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Macro to unload SAS packages, version 20200730 #;
|
||||
%put # Macro to unload SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, datasteps generating #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%unloadPackage()) macro clears the package content #;
|
||||
%put # from the SAS session. #;
|
||||
%put # #;
|
||||
%put # Parameters: #;
|
||||
%put # #;
|
||||
%put # packageName Name of a package, e.g. myPackage, #;
|
||||
@@ -238,28 +265,52 @@ des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for h
|
||||
%put # location of the "packages" fileref, i.e. #;
|
||||
%put # %nrstr(%%sysfunc(pathname(packages))) #;
|
||||
%put # #;
|
||||
%put # options= Posible options for ZIP filename, #;
|
||||
%put # options= Possible options for ZIP filename, #;
|
||||
%put # default value: LOWCASE_MEMNAME #;
|
||||
%put # #;
|
||||
%put # source2= Option to print out details, null by default. #;
|
||||
%put # #;
|
||||
%put # zip=zip Standard package is zip (lowcase), #;
|
||||
%put # e.g. %nrstr(%%unloadPackage(PiPackage)). #;
|
||||
%put # If the zip is not avaliable use a folder. #;
|
||||
%put # If the zip is not available use a folder. #;
|
||||
%put # Unpack data to "pipackage.disk" folder #;
|
||||
%put # and use loadPackage in the following form: #;
|
||||
%put # %nrstr(%%unloadPackage(PiPackage, zip=disk, options=)) #;
|
||||
%put # #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to learn more. #;
|
||||
%put # #;
|
||||
%put # Example #####################################################################;
|
||||
%put # #;
|
||||
%put # Enabling the SAS Package Framework #;
|
||||
%put # from the local directory and installing & loading #;
|
||||
%put # the SQLinDS package from the Internet. #;
|
||||
%put # #;
|
||||
%put # Assume that the SPFinit.sas file #;
|
||||
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||
%put # #;
|
||||
%put # Run the following code in your SAS session: #;
|
||||
%put ;
|
||||
%GOTO ENDunloadPackage;
|
||||
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||
%put ;
|
||||
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||
%put ;
|
||||
%put ###############################################################################;
|
||||
%put ;
|
||||
%RETURN;
|
||||
%end;
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp;
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%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;
|
||||
%local _PackageFileref_;
|
||||
%let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.);
|
||||
@@ -274,7 +325,7 @@ des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for h
|
||||
filename &_PackageFileref_. clear;
|
||||
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
filename &_PackageFileref_. &ZIP.
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
ENCODING =
|
||||
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||
%else utf8 ;
|
||||
@@ -284,8 +335,6 @@ des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for h
|
||||
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist;
|
||||
filename &_PackageFileref_. clear;
|
||||
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp. msglevel = &msglevel_tmp.;
|
||||
/* jump here after running %unloadPackage() - only help is displayed */
|
||||
%ENDunloadPackage:
|
||||
%mend unloadPackage;
|
||||
|
||||
/*** HELP START ***/
|
||||
@@ -306,14 +355,14 @@ des = 'Macro to unload SAS package, version 20200730. Run %unloadPackage() for h
|
||||
null by default */
|
||||
, zip = zip /* standard package is zip (lowcase),
|
||||
e.g. %helpPackage(PiPackage,*)
|
||||
if the zip is not avaliable use a folder
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use helpPackage in the form:
|
||||
%helpPackage(PiPackage, *, zip=disk, options=)
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to get help about SAS package, version 20200730. Run %helpPackage() for help info.'
|
||||
des = 'Macro to get help about SAS package, version 20200807. Run %helpPackage() for help info.'
|
||||
;
|
||||
%if %superq(packageName) = %then
|
||||
%do;
|
||||
@@ -322,13 +371,16 @@ des = 'Macro to get help about SAS package, version 20200730. Run %helpPackage()
|
||||
%put # This is short help information for the helpPackage macro #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Macro to get help about SAS packages, version 20200730 #;
|
||||
%put # Macro to get help about SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, datasteps generating #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%helpPackage()) macro prints in the SAS log help #;
|
||||
%put # information about the package provided by the developer. #;
|
||||
%put # #;
|
||||
%put # Parameters: #;
|
||||
%put # #;
|
||||
%put # packageName Name of a package, e.g. myPackage, #;
|
||||
@@ -345,28 +397,52 @@ des = 'Macro to get help about SAS package, version 20200730. Run %helpPackage()
|
||||
%put # location of the "packages" fileref, i.e. #;
|
||||
%put # %nrstr(%%sysfunc(pathname(packages))) #;
|
||||
%put # #;
|
||||
%put # options= Posible options for ZIP filename, #;
|
||||
%put # options= Possible options for ZIP filename, #;
|
||||
%put # default value: LOWCASE_MEMNAME #;
|
||||
%put # #;
|
||||
%put # source2= Option to print out details, null by default. #;
|
||||
%put # #;
|
||||
%put # zip=zip Standard package is zip (lowcase), #;
|
||||
%put # e.g. %nrstr(%%helpPackage(PiPackage)). #;
|
||||
%put # If the zip is not avaliable use a folder. #;
|
||||
%put # If the zip is not available use a folder. #;
|
||||
%put # Unpack data to "pipackage.disk" folder #;
|
||||
%put # and use loadPackage in the following form: #;
|
||||
%put # %nrstr(%%helpPackage(PiPackage, zip=disk, options=)) #;
|
||||
%put # #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to learn more. #;
|
||||
%put # #;
|
||||
%put # Example #####################################################################;
|
||||
%put # #;
|
||||
%put # Enabling the SAS Package Framework #;
|
||||
%put # from the local directory and installing & loading #;
|
||||
%put # the SQLinDS package from the Internet. #;
|
||||
%put # #;
|
||||
%put # Assume that the SPFinit.sas file #;
|
||||
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||
%put # #;
|
||||
%put # Run the following code in your SAS session: #;
|
||||
%put ;
|
||||
%GOTO ENDhelpPackage;
|
||||
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||
%put ;
|
||||
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||
%put ;
|
||||
%put ###############################################################################;
|
||||
%put ;
|
||||
%RETURN;
|
||||
%end;
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp;
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%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;
|
||||
%local _PackageFileref_;
|
||||
%let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.);
|
||||
@@ -381,7 +457,7 @@ des = 'Macro to get help about SAS package, version 20200730. Run %helpPackage()
|
||||
filename &_PackageFileref_. clear;
|
||||
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
filename &_PackageFileref_. &ZIP.
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
ENCODING =
|
||||
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||
%else utf8 ;
|
||||
@@ -391,8 +467,6 @@ des = 'Macro to get help about SAS package, version 20200730. Run %helpPackage()
|
||||
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist;
|
||||
filename &_PackageFileref_. clear;
|
||||
options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp. msglevel = &msglevel_tmp.;
|
||||
/* jump here after running %helpPackage() - only help is displayed */
|
||||
%ENDhelpPackage:
|
||||
%mend helpPackage;
|
||||
|
||||
/*
|
||||
@@ -401,9 +475,9 @@ TODO:
|
||||
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
|
||||
*/
|
||||
|
||||
/* Macros to install SAS packages, version 20200603 */
|
||||
/* Macros to install SAS packages, version 20200807 */
|
||||
/* A SAS package is a zip file containing a group of files
|
||||
with SAS code (macros, functions, datasteps generating
|
||||
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).
|
||||
*/
|
||||
@@ -416,7 +490,7 @@ TODO:
|
||||
)
|
||||
/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to install SAS package, version 20200730. Run %%installPackage() for help info.'
|
||||
des = 'Macro to install SAS package, version 20200807. Run %%installPackage() for help info.'
|
||||
;
|
||||
%if %superq(packageName) = %then
|
||||
%do;
|
||||
@@ -425,13 +499,17 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
%put # This is short help information for the installPackage macro #;
|
||||
%put ########################################################################################;
|
||||
%put # #;
|
||||
%put # Macro to install SAS packages, version 20200730 #;
|
||||
%put # Macro to install SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, datasteps generating #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%installPackage()) macro installs the package zip #;
|
||||
%put # in the packages folder. The process of installation is equivalent with #;
|
||||
%put # manual downloading the package zip file into the packages folder. #;
|
||||
%put # #;
|
||||
%put # Parameters: #;
|
||||
%put # #;
|
||||
%put # packageName Name of a package, e.g. myPackage, #;
|
||||
@@ -442,23 +520,47 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
%put # sourcePath= Location of the package, e.g. "www.some.web.page/" #;
|
||||
%put # Mind the "/" at the end of the path! #;
|
||||
%put # Current default location: #;
|
||||
%put # https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/packages/ #;
|
||||
%put # https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/master/packages/ #;
|
||||
%put # #;
|
||||
%put # replace= With default value of 1 it causes existing package file #;
|
||||
%put # to be replaceed by new downloaded file. #;
|
||||
%put # #;
|
||||
%put ########################################################################################;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to learn more. #;
|
||||
%put # #;
|
||||
%put # Example ##############################################################################;
|
||||
%put # #;
|
||||
%put # Enabling the SAS Package Framework #;
|
||||
%put # from the local directory and installing & loading #;
|
||||
%put # the SQLinDS package from the Internet. #;
|
||||
%put # #;
|
||||
%put # Assume that the SPFinit.sas file #;
|
||||
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||
%put # #;
|
||||
%put # Run the following code in your SAS session: #;
|
||||
%put ;
|
||||
%GOTO ENDinstallPackage;
|
||||
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||
%put ;
|
||||
%put %nrstr( %%installPackage(SQLinDS) %%* install the package from the Internet; );
|
||||
%put %nrstr( %%helpPackage(SQLinDS) %%* get help about the package; );
|
||||
%put %nrstr( %%loadPackage(SQLinDS) %%* load the package content into the SAS session; );
|
||||
%put %nrstr( %%unloadPackage(SQLinDS) %%* unload the package content from the SAS session; );
|
||||
%put ;
|
||||
%put ########################################################################################;
|
||||
%put ;
|
||||
%RETURN;
|
||||
%end;
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp fullstimer_tmp stimer_tmp msglevel_tmp;
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let source_tmp = %sysfunc(getoption(source));
|
||||
%let stimer_tmp = %sysfunc(getoption(stimer));
|
||||
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||
%let fullstimer_tmp = %sysfunc(getoption(fullstimer));
|
||||
%let msglevel_tmp = %sysfunc(getoption(msglevel));
|
||||
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N;
|
||||
|
||||
%local in out;
|
||||
@@ -466,7 +568,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
%let out = o%sysfunc(md5(&packageName.),hex7.);
|
||||
|
||||
/*options MSGLEVEL=i;*/
|
||||
|
||||
|
||||
/*
|
||||
Reference:
|
||||
https://blogs.sas.com/content/sasdummy/2011/06/17/how-to-use-sas-data-step-to-copy-a-file-from-anywhere/
|
||||
@@ -493,7 +595,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
if filein = 0 then
|
||||
put "ERROR: Source file:" /
|
||||
"ERROR- " in_path /
|
||||
"ERROR- is unavaliable!";
|
||||
"ERROR- is unavailable!";
|
||||
if filein > 0;
|
||||
|
||||
put @2 "Source information:";
|
||||
@@ -543,8 +645,6 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
¬es_tmp. &source_tmp.
|
||||
&stimer_tmp. &fullstimer_tmp.
|
||||
msglevel=&msglevel_tmp.;
|
||||
/* jump here after running %installPackage() - only help is displayed */
|
||||
%ENDinstallPackage:
|
||||
%mend installPackage;
|
||||
|
||||
/*** HELP START ***/
|
||||
@@ -558,7 +658,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
since it may affect stability of the framework.
|
||||
**/
|
||||
|
||||
/* Example 1: Enabeling the SAS Package Framework
|
||||
/* Example 1: Enabling the SAS Package Framework
|
||||
and loading the SQLinDS package from the local directory.
|
||||
|
||||
Assume that the SPFinit.sas file and the SQLinDS
|
||||
@@ -571,11 +671,11 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
%include packages(SPFinit.sas); %* enable the framework;
|
||||
|
||||
%helpPackage(SQLinDS) %* get help about the package;
|
||||
%loadpackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||
*/
|
||||
|
||||
/* Example 2: Enabeling the SAS Package Framework
|
||||
/* Example 2: Enabling the SAS Package Framework
|
||||
from the local directory and installing & loading
|
||||
the SQLinDS package from the Internet.
|
||||
|
||||
@@ -589,11 +689,11 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
|
||||
%installPackage(SQLinDS) %* install the package from the Internet;
|
||||
%helpPackage(SQLinDS) %* get help about the package;
|
||||
%loadpackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||
*/
|
||||
|
||||
/* Example 3: Enabeling the SAS Package Framework
|
||||
/* Example 3: Enabling the SAS Package Framework
|
||||
and installing & loading the SQLinDS package
|
||||
from the Internet.
|
||||
|
||||
@@ -606,7 +706,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
|
||||
%installPackage(SQLinDS) %* install the package from the Internet;
|
||||
%helpPackage(SQLinDS) %* get help about the package;
|
||||
%loadpackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%loadPackage(SQLinDS) %* load the package content into the SAS session;
|
||||
%unloadPackage(SQLinDS) %* unload the package content from the SAS session;
|
||||
*/
|
||||
|
||||
@@ -626,7 +726,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
|
||||
*/
|
||||
|
||||
/* Example 5: Enabeling the SAS Package Framework from the local directory
|
||||
/* Example 5: Enabling the SAS Package Framework from the local directory
|
||||
and installing the SQLinDS package from the Internet.
|
||||
|
||||
Assume that the SPFinit.sas file is located in
|
||||
@@ -636,8 +736,8 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
%include packages(SPFinit.sas); %* enable the framework;
|
||||
|
||||
%installPackage(SQLinDS); %* install package;
|
||||
%installPackage(SQLinDS); %* overwrite already instaled package;
|
||||
%installPackage(SQLinDS,replace=0); %* prevent overwrite instaled package;
|
||||
%installPackage(SQLinDS); %* overwrite already installed package;
|
||||
%installPackage(SQLinDS,replace=0); %* prevent overwrite installed package;
|
||||
|
||||
|
||||
%installPackage(NotExistingPackage); %* handling with not existing package;
|
||||
@@ -646,7 +746,7 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
|
||||
/*** HELP END ***/
|
||||
|
||||
/* optional - obsolite - deprecated;
|
||||
/* optional - obsolete - deprecated;
|
||||
|
||||
libname packages "C:/SAS_PACKAGES/";
|
||||
%include "%sysfunc(pathname(packages))/loadpackage.sas";
|
||||
@@ -662,10 +762,10 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
|
||||
/* Macro to list SAS packages in packages folder.
|
||||
|
||||
Version 20200730
|
||||
Version 20200807
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, datasteps generating
|
||||
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).
|
||||
*/
|
||||
@@ -681,18 +781,63 @@ des = 'Macro to install SAS package, version 20200730. Run %%installPackage() fo
|
||||
/*** HELP END ***/
|
||||
|
||||
|
||||
%macro listPackages()/
|
||||
des = 'Macro to list SAS package from `package` fileref, version 20200730.'
|
||||
%macro listPackages()/PARMBUFF
|
||||
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20200807.'
|
||||
;
|
||||
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
|
||||
%do;
|
||||
%put ;
|
||||
%put ########################################################################################;
|
||||
%put # This is short help information for the listPackages macro #;
|
||||
%put ########################################################################################;
|
||||
%put # #;
|
||||
%put # Macro to list available SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%listPackages()) macro lists packages available #;
|
||||
%put # in the packages folder. List is printed inthe SAS Log. #;
|
||||
%put # #;
|
||||
%put # Parameters: NO PARAMETERS #;
|
||||
%put # #;
|
||||
%put # When used as: %nrstr(%%listPackages(HELP)) it displays this help information. #;
|
||||
%put # #;
|
||||
%put ########################################################################################;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to learn more. #;
|
||||
%put # #;
|
||||
%put # Example ##############################################################################;
|
||||
%put # #;
|
||||
%put # Enabling the SAS Package Framework #;
|
||||
%put # from the local directory and listing #;
|
||||
%put # available packages. #;
|
||||
%put # #;
|
||||
%put # Assume that the SPFinit.sas file #;
|
||||
%put # is located in the "C:/SAS_PACKAGES/" folder. #;
|
||||
%put # #;
|
||||
%put # Run the following code in your SAS session: #;
|
||||
%put ;
|
||||
%put %nrstr( filename packages "C:/SAS_PACKAGES"; %%* setup a directory for packages; );
|
||||
%put %nrstr( %%include packages(SPFinit.sas); %%* enable the framework; );
|
||||
%put ;
|
||||
%put %nrstr( %%listPackages() %%* list available packages; );
|
||||
%put ;
|
||||
%put ########################################################################################;
|
||||
%put ;
|
||||
%RETURN;
|
||||
%end;
|
||||
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp;
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp filesWithCodes;
|
||||
%let filesWithCodes = WORK._%sysfunc(datetime(), hex16.)_;
|
||||
|
||||
%local ls_tmp ps_tmp notes_tmp source_tmp;
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let source_tmp = %sysfunc(getoption(source));
|
||||
%let ls_tmp = %sysfunc(getoption(ls));
|
||||
%let ps_tmp = %sysfunc(getoption(ps));
|
||||
%let notes_tmp = %sysfunc(getoption(notes));
|
||||
%let source_tmp = %sysfunc(getoption(source));
|
||||
options NOnotes NOsource ls=MAX ps=MAX;
|
||||
|
||||
data _null_;
|
||||
@@ -700,7 +845,7 @@ data _null_;
|
||||
|
||||
if base = " " then
|
||||
do;
|
||||
put "NOTE: The filereference PACKAGES is not assigned.";
|
||||
put "NOTE: The file reference PACKAGES is not assigned.";
|
||||
stop;
|
||||
end;
|
||||
|
||||
@@ -758,15 +903,14 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
%mend listPackages;
|
||||
|
||||
|
||||
/*** HELP START ***/
|
||||
/*** HELP START ***/
|
||||
|
||||
/* Macros to generate SAS packages.
|
||||
|
||||
Version 20200730
|
||||
/* Macro to generate SAS packages.
|
||||
|
||||
Version 20200807
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, datasteps generating
|
||||
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).
|
||||
|
||||
@@ -786,7 +930,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
dependencies in loading */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to generate SAS packages, version 20200730. Run %generatePackage() for help info.'
|
||||
des = 'Macro to generate SAS packages, version 20200807. Run %generatePackage() for help info.'
|
||||
;
|
||||
%if %superq(filesLocation) = %then
|
||||
%do;
|
||||
@@ -795,13 +939,21 @@ des = 'Macro to generate SAS packages, version 20200730. Run %generatePackage()
|
||||
%put # This is short help information for the generatePackage macro #;
|
||||
%put ###############################################################################;
|
||||
%put # #;
|
||||
%put # Macro to generate SAS packages, version 20200730 #;
|
||||
%put # Macro to generate SAS packages, version 20200807 #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, datasteps generating #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
%put # data, etc.) wrapped up together and included by #;
|
||||
%put # a single load.sas file (also embedded inside the zip). #;
|
||||
%put # #;
|
||||
%put # The %nrstr(%%generatePackage()) macro generates SAS packages. #;
|
||||
%put # It wraps-up the package content, i.e. macros, functions, formats, etc., #;
|
||||
%put # into the zip file and generate all metadata content required by other #;
|
||||
%put # macros from the SAS Packages Framework. #;
|
||||
%put # #;
|
||||
%put # Visit: https://github.com/yabwon/SAS_PACKAGES/tree/master/SPF/Documentation #;
|
||||
%put # to read about the details of package generation process. #;
|
||||
%put # #;
|
||||
%put # Parameters: #;
|
||||
%put # #;
|
||||
%put # filesLocation= Location of package files, example value: #;
|
||||
@@ -818,7 +970,7 @@ des = 'Macro to generate SAS packages, version 20200730. Run %generatePackage()
|
||||
%put # #;
|
||||
%put ###############################################################################;
|
||||
%put ;
|
||||
%GOTO ENDgeneratePackage;
|
||||
%RETURN;
|
||||
%end;
|
||||
|
||||
%local zipReferrence filesWithCodes _DESCR_ _LIC_ _RC_ _PackageFileref_;
|
||||
@@ -894,7 +1046,7 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256;
|
||||
%do;
|
||||
%put ERROR: Package name is more than 24 characters long.;
|
||||
%put ERROR- The name is used for functions%str(%') dataset name;
|
||||
%put ERROR- and for formats%str(%') cataloge name (with suffix).;
|
||||
%put ERROR- and for formats%str(%') catalog name (with suffix).;
|
||||
%put ERROR- The length is %sysfunc(lengthn(&packageName.)). Try something shorter.;
|
||||
%abort;
|
||||
%end;
|
||||
@@ -908,7 +1060,7 @@ filename &_LIC_. "&filesLocation./license.sas" lrecl = 256;
|
||||
%do;
|
||||
%put ERROR: Package name contains illegal symbols.;
|
||||
%put ERROR- The name is used for functions%str(%') dataset name;
|
||||
%put ERROR- and for formats%str(%') cataloge name.;
|
||||
%put ERROR- and for formats%str(%') catalog name.;
|
||||
%put ERROR- Only English letters, underscore(_), and digits are allowed.;
|
||||
%put ERROR- Try something else. Maybe: %qsysfunc(compress(&packageName.,,KDF)) will do?;
|
||||
%abort;
|
||||
@@ -962,13 +1114,13 @@ filename &zipReferrence. ZIP "&filesLocation./%lowcase(&packageName.).zip";
|
||||
--------------------------------------------------------------------------------------------
|
||||
>> **HEADER** <<
|
||||
Type: Package
|
||||
Package: ShortPackageName
|
||||
Title: A title/brief info for log note about your packages
|
||||
Version: X.Y
|
||||
Author: Firstname1 Lastname1 (xxxxxx1@yyyyy.com), Firstname2 Lastname2 (xxxxxx2@yyyyy.com)
|
||||
Package: ShortPackageName
|
||||
Title: A title/brief info for log note about your packages
|
||||
Version: X.Y
|
||||
Author: Firstname1 Lastname1 (xxxxxx1@yyyyy.com), Firstname2 Lastname2 (xxxxxx2@yyyyy.com)
|
||||
Maintainer: Firstname Lastname (xxxxxx@yyyyy.com)
|
||||
License: MIT
|
||||
Encoding: UTF8
|
||||
Encoding: UTF8
|
||||
|
||||
Required: "Base SAS Software" :%*optional, COMMA separated, QUOTED list, names of required SAS products, values must be like from proc setinit;run; output *;
|
||||
ReqPackages: "macroArray (0.1)", "DFA (0.1)" :%*optional, COMMA separated, QUOTED list, names of required packages *;
|
||||
@@ -1071,7 +1223,7 @@ DESCRIPTION END:
|
||||
/* collect the data */
|
||||
data &filesWithCodes.;
|
||||
base = "&filesLocation.";
|
||||
length folder file lowcase_name $ 256 folderRef fileRef $ 8;
|
||||
length folder file lowcase_name $ 256 folderRef fileRef $ 8;
|
||||
drop lowcase_name;
|
||||
|
||||
folderRef = "_%sysfunc(datetime(), hex6.)0";
|
||||
@@ -1135,7 +1287,7 @@ title4 " ______________________________ ";
|
||||
title5 "List of files for package: &packageName. (version &packageVersion.), license: &packageLicense.";
|
||||
title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
|
||||
%if (%bquote(&packageRequired.) ne )
|
||||
or (%bquote(&packageReqPackages.) ne )
|
||||
or (%bquote(&packageReqPackages.) ne )
|
||||
%then
|
||||
%do;
|
||||
title7 "Required SAS licences: %qsysfunc(compress(%bquote(&packageRequired.), %str(%'%")))" ; /* ' */
|
||||
@@ -1208,11 +1360,11 @@ data _null_;
|
||||
put ' data _null_; '; /* simple "%local" returns error while loading package */
|
||||
put ' call symputX("packageName", " ", "L");';
|
||||
put ' call symputX("packageVersion", " ", "L");';
|
||||
put ' call symputX("packageTitle", " ", "L");';
|
||||
put ' call symputX("packageTitle", " ", "L");';
|
||||
put ' call symputX("packageAuthor", " ", "L");';
|
||||
put ' call symputX("packageMaintainer", " ", "L");';
|
||||
put ' call symputX("packageEncoding", " ", "L");';
|
||||
put ' call symputX("packageLicense", " ", "L");';
|
||||
put ' call symputX("packageEncoding", " ", "L");';
|
||||
put ' call symputX("packageLicense", " ", "L");';
|
||||
put ' run; ';
|
||||
|
||||
put ' %let packageName =' "&packageName.;";
|
||||
@@ -1228,7 +1380,7 @@ data _null_;
|
||||
run;
|
||||
|
||||
/* emergency ICEloadPackage macro to load package when loadPackage()
|
||||
is unavaliable for some reasons, example of use:
|
||||
is unavailable for some reasons, example of use:
|
||||
1) point to a zip file,
|
||||
2) include iceloadpackage.sas
|
||||
3) point to package folder,
|
||||
@@ -1922,7 +2074,7 @@ data _null_;
|
||||
put ' end ; ';
|
||||
%end;
|
||||
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20200730 *"; put "***";';
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20200807 *"; put "***";';
|
||||
|
||||
put 'run; ' /;
|
||||
|
||||
@@ -1985,17 +2137,17 @@ data _null_;
|
||||
put ' set WORK._last_ end = EOFDS nobs = NOBS; ';
|
||||
put ' length memberX $ 1024; ';
|
||||
put ' memberX = cats("_",folder,".",file); ';
|
||||
/* inner datastep in call execute to read each embedded file */
|
||||
/* inner data step in call execute to read each embedded file */
|
||||
put ' call execute("data _null_; ");';
|
||||
put " call execute('infile &_PackageFileref_.(' || strip(memberX) || ') end = EOF; ');";
|
||||
put ' call execute(" printer = 0; ");';
|
||||
put ' call execute(" do until(EOF); ");';
|
||||
put ' call execute(" input; ");';
|
||||
put ' call execute(" if upcase(strip(_infile_)) ';
|
||||
put ' = cat(""/"",""*** "",""HELP END"","" ***"",""/"") then printer = 0; ");'; /* it looks like that because of comments */
|
||||
put ' = ''/*** HELP END ***/'' then printer = 0; ");';
|
||||
put ' call execute(" if printer then put ""*> "" _infile_; ");';
|
||||
put ' call execute(" if upcase(strip(_infile_)) ';
|
||||
put ' = cat(""/"",""*** "",""HELP START"","" ***"",""/"") then printer = 1; ");'; /* it looks like that because of comments */
|
||||
put ' = ''/*** HELP START ***/'' then printer = 1; ");';
|
||||
put ' call execute(" end; ");';
|
||||
put ' call execute(" put ""*> "" / ""*> ""; ");';
|
||||
put ' call execute(" stop; ");';
|
||||
@@ -2030,19 +2182,19 @@ data _null_;
|
||||
set &filesWithCodes. nobs = NOBS;
|
||||
if (upcase(type) not in: ('TEST')); /* test files are not to be copied */
|
||||
|
||||
call execute(cat ('filename _IN_ "', catx('/', base, folder, file), '";'));
|
||||
call execute(cats("filename _OUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='_", folder, ".", file, "';") );
|
||||
call execute(cat ('filename _SPFIN_ "', catx('/', base, folder, file), '";'));
|
||||
call execute(cats("filename _SPFOUT_ ZIP '", base, "/%lowcase(&packageName.).zip' member='_", folder, ".", file, "';") );
|
||||
/* copy code file into the zip */
|
||||
call execute('data _null_;');
|
||||
call execute(' rc = fcopy("_IN_", "_OUT_");');
|
||||
call execute(' rc = fcopy("_SPFIN_", "_SPFOUT_");');
|
||||
call execute('run;');
|
||||
/* test file content for help tags */
|
||||
call execute('data _null_;');
|
||||
call execute(' retain test .;');
|
||||
call execute(' infile _IN_ lrecl=32767 dlm="0a0d"x end=EOF;');
|
||||
call execute(' infile _SPFIN_ lrecl=32767 dlm="0a0d"x end=EOF;');
|
||||
call execute(' input;');
|
||||
call execute(' if upcase(strip(_infile_)) = cat("/","*** ","HELP START"," ***","/") then test + (+1); ');
|
||||
call execute(' if upcase(strip(_infile_)) = cat("/","*** ","HELP END", " ***","/") then test + (-1); ');
|
||||
call execute(' if upcase(strip(_infile_)) = "/*** HELP START ***/" then test + (+1); ');
|
||||
call execute(' if upcase(strip(_infile_)) = "/*** HELP END ***/" then test + (-1); ');
|
||||
call execute(' if (test not in (.,0,1)) or (EOF and test) then ');
|
||||
call execute(' do; ');
|
||||
call execute(' put "ERR" "OR: unmatching or nested HELP tags!" _N_=; ');
|
||||
@@ -2051,14 +2203,16 @@ data _null_;
|
||||
call execute(' if (EOF and test=.) then put "WARN" "ING: no HELP tags in the file." ; ');
|
||||
call execute('run;');
|
||||
|
||||
call execute('filename _IN_ clear;');
|
||||
call execute('filename _OUT_ clear;');
|
||||
call execute('filename _SPFIN_ clear;');
|
||||
call execute('filename _SPFOUT_ clear;');
|
||||
run;
|
||||
/*
|
||||
proc sql;
|
||||
drop table &filesWithCodes.;
|
||||
quit;
|
||||
*/
|
||||
filename &_DESCR_. clear;
|
||||
filename &_LIC_. clear;
|
||||
filename &zipReferrence. clear;
|
||||
|
||||
/* tests of package are executed by default */
|
||||
@@ -2076,6 +2230,7 @@ filename &zipReferrence. clear;
|
||||
|
||||
|
||||
/* locate sas binaries */
|
||||
%local SASROOT SASEXE SASWORK;
|
||||
filename sasroot "!SASROOT";
|
||||
%let SASROOT=%sysfunc(PATHNAME(sasroot));
|
||||
filename sasroot;
|
||||
@@ -2099,15 +2254,19 @@ filename currdir list;
|
||||
|
||||
/* if your package uses any other packages this points to their location */
|
||||
/* test if packages fileref exists and if do then use it */
|
||||
/* if no one is provided the filesLocation is used as a repalacement */
|
||||
/* if no one is provided the filesLocation is used as a replacement */
|
||||
%if %bquote(&packages.)= %then %let packages=%sysfunc(pathname(packages));
|
||||
%if %bquote(&packages.)= %then %let packages=&filesLocation.;
|
||||
filename packages "&packages.";
|
||||
filename packages list;
|
||||
%put NOTE- ;
|
||||
%put NOTE: The following location path for packages will be used during the testing:;
|
||||
%put *&packages.*;
|
||||
/* filename packages "&packages."; */
|
||||
/* filename packages list;*/
|
||||
|
||||
/* replace current dir with the temporary one for tests */
|
||||
%put *NOTE: changing current folder to:*;
|
||||
%put *%sysfunc(DLGCDIR(&dirForTest.))*;
|
||||
%put NOTE- ;
|
||||
%put NOTE: changing current folder to:;
|
||||
%put *%sysfunc(DLGCDIR(&dirForTest.))*;
|
||||
|
||||
/* the first test is for loading package, testing help and unloading */
|
||||
/*-1-*/
|
||||
@@ -2198,6 +2357,9 @@ data _null_;
|
||||
|
||||
call symputX(cats("TEST_", test), fileshort, "L");
|
||||
call symputX("numberOfTests", test, "L");
|
||||
|
||||
_RC_ = filename(cats("_TIN_",test));
|
||||
_RC_ = filename(cats("_TOUT_",test));
|
||||
run;
|
||||
|
||||
/* each test is executed with autoexec loading the package */
|
||||
@@ -2284,7 +2446,7 @@ title;
|
||||
|
||||
%put *NOTE: changing current folder to:*;
|
||||
%put *%sysfunc(DLGCDIR(%sysfunc(pathname(currdir))))*;
|
||||
|
||||
filename CURRDIR clear;
|
||||
|
||||
/* if you do not want any test to be executed */
|
||||
%NOTESTING:
|
||||
@@ -2293,9 +2455,6 @@ proc sql;
|
||||
drop table &filesWithCodes.;
|
||||
quit;
|
||||
|
||||
|
||||
/* jump here after running %generatePackage() - only help is displayed */
|
||||
%ENDgeneratePackage:
|
||||
%mend generatePackage;
|
||||
|
||||
|
||||
@@ -2341,7 +2500,7 @@ TODO: (in Polish)
|
||||
|
||||
/*** HELP START ***/
|
||||
|
||||
/* Example 1: Enabeling the SAS Package Framework
|
||||
/* Example 1: Enabling the SAS Package Framework
|
||||
and generating the SQLinDS package from the local directory.
|
||||
|
||||
Assume that the SPFinit.sas file and the SQLinDS
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
## SAS Packages:
|
||||
To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/master/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory).
|
||||
|
||||
## Available packages:
|
||||
Currently the following packages are available:
|
||||
|
||||
@@ -57,7 +60,7 @@ run;
|
||||
%end;
|
||||
```
|
||||
|
||||
- **BasePlus**\[0.5\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
- **BasePlus**\[0.52\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
```
|
||||
call arrMissToRight(myArray);
|
||||
call arrFillMiss(17, myArray);
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user