SAS Packages Framework, ver. 20221022

**SAS Packages Framework**, ver. `20221022`

In the `%generatePackage()` macro additional quality checks for files of EXEC and CLEAN types were added.
Each EXEC file should have a CLEAN file counterpart and vice versa.
- If the number of EXECs and CLEANs differs but both are positive macro issues a Warning.
- If EXECs are positive but CLEANs are zero (or other way around) macro issues an Error!

Documentation updated.
This commit is contained in:
Bartosz Jablonski
2022-10-22 22:13:50 +02:00
parent 1968330049
commit 67bd3abd58
14 changed files with 201 additions and 61 deletions

View File

@@ -23,7 +23,7 @@
default value 1 means "delete tests work" */
)/secure minoperator
/*** HELP END ***/
des = 'Macro to generate SAS packages, version 20221002. Run %generatePackage() for help info.'
des = 'Macro to generate SAS packages, version 20221022. Run %generatePackage() for help info.'
;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do;
@@ -38,7 +38,7 @@ des = 'Macro to generate SAS packages, version 20221002. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#;
%put # #;
%put # Macro to generate SAS packages, version `20221002` #;
%put # Macro to generate SAS packages, version `20221022` #;
%put # #;
%put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #;
@@ -572,6 +572,76 @@ options NOnotes NOsource;
proc sort data = &filesWithCodes.;
by order type file;
run;
/* quality check for EXEC and CLEAN types */
data _null_;
set &filesWithCodes. (where=(upcase(type) in ('EXEC' 'CLEAN'))) end=EOF;
if _N_ = 1 then
do;
declare hash EXEC(); /* store EXECs */
EXEC.defineKey('file');
EXEC.defineData('ne');
EXEC.defineDone();
declare hash CLEAN(); /* store CLEANs */
CLEAN.defineKey('file');
CLEAN.defineData('nc');
CLEAN.defineDone();
declare hash F(ordered:"A");
F.defineKey('file');
F.defineData('file');
F.defineDone();
declare hiter IF("F");
end;
F.replace();
if upcase(type) = 'EXEC' then
do;
e + 1;
if EXEC.find() then EXEC.add(key:file,data:1);
else EXEC.replace(key:file,data:ne+1);
end;
if upcase(type) = 'CLEAN' then
do;
c + 1;
if CLEAN.find() then CLEAN.add(key:file,data:1);
else CLEAN.replace(key:file,data:nc+1);
end;
if EOF then
do;
/* if number of EXECs and CLEANs differs but both are positive issue a Warning */
if (0 < e < c) or (0 < c < e) or not(EXEC.NUM_ITEMS = CLEAN.NUM_ITEMS = F.NUM_ITEMS) then
do;
put "WARNING: Number of EXEC type and CLEAN type files differs!" /
"WARNING- Each EXEC file should have CLEAN file counterpart and vice versa." /
'WARNING- Please create appropriate files and make your package a "role model".' /
'WARNING- ' /
'WARNING- The list of differences:';
do while(IF.next()=0);
ne = 0;
nc = 0;
df = EXEC.find();
df = CLEAN.find();
df = abs(ne - nc);
put "WARNING- File " file char36. "EXEC: " ne 3. +1 "CLEAN: " nc 3. +1 "diff: " df 3.;
end;
put "WARNING- ";
end;
/* if EXECs are positive but CLEANs are zero (or other way around) issue an Error */
if (0 = e < c) or (0 = c < e) then
do;
put "ERROR: There are " e "EXECs files and " c "CLEANs files!" /
"ERROR- Each EXEC file should have CLEAN file counterpart and vice versa." /
'ERROR- Please create appropriate files and make your package a "role model".' /
'ERROR: Aborting package generation!' ;
abort;
end;
end;
run;
/*
proc contents data = &filesWithCodes.;
run;
@@ -1605,7 +1675,7 @@ data _null_;
put ' end ; ';
%end;
put 'put "***"; put "* SAS package generated by generatePackage, version 20221002 *"; put "***";';
put 'put "***"; put "* SAS package generated by generatePackage, version 20221022 *"; put "***";';
put 'run; ' /;