mirror of
https://github.com/sasjs/core.git
synced 2026-01-11 02:50:06 +00:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ae5fbcf857 | ||
|
|
2579b4c929 | ||
|
|
90a831f59b | ||
|
|
9fb218f0be | ||
|
|
ccc9dfa4aa | ||
|
|
a37a72b7db | ||
|
|
c6dcf919e2 | ||
|
|
42541373af | ||
|
|
208c88f5a4 | ||
|
|
5605bc74df | ||
|
|
4bec574011 |
270
all.sas
270
all.sas
@@ -3005,6 +3005,124 @@ run;
|
|||||||
drop table &ds;
|
drop table &ds;
|
||||||
|
|
||||||
%mend mp_assertdsobs;/**
|
%mend mp_assertdsobs;/**
|
||||||
|
@file
|
||||||
|
@brief Used to capture scope leakage of macro variables
|
||||||
|
@details A common 'difficult to detect' bug in macros is where a nested
|
||||||
|
macro over-writes variables in a higher level macro.
|
||||||
|
|
||||||
|
This assertion takes a snapshot of the macro variables before and after
|
||||||
|
a macro invocation. This makes it easy to detect whether any macro
|
||||||
|
variables were modified or changed.
|
||||||
|
|
||||||
|
Currently, the macro only checks for global scope variables. In the future
|
||||||
|
it may be extended to work at multiple levels of nesting.
|
||||||
|
|
||||||
|
If you would like this feature, feel free to contribute / raise an issue /
|
||||||
|
engage the SASjs team directly.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
|
||||||
|
%let oops=I did it again;
|
||||||
|
|
||||||
|
%mp_assertscope(COMPARE,
|
||||||
|
desc=Checking macro variables against previous snapshot
|
||||||
|
)
|
||||||
|
|
||||||
|
@param [in] action (SNAPSHOT) The action to take. Valid values:
|
||||||
|
@li SNAPSHOT - take a copy of the current macro variables
|
||||||
|
@li COMPARE - compare the current macro variables against previous values
|
||||||
|
@param [in] scope= (GLOBAL) The scope of the variables to be checked. This
|
||||||
|
corresponds to the values in the SCOPE column in `sashelp.vmacro`.
|
||||||
|
@param [in] desc= (Testing variable scope) The user provided test description
|
||||||
|
@param [in,out] scopeds= (work.mp_assertscope) The dataset to contain the
|
||||||
|
scope snapshot
|
||||||
|
@param [out] outds= (work.test_results) The output dataset to contain the
|
||||||
|
results. If it does not exist, it will be created, with the following format:
|
||||||
|
|TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256|
|
||||||
|
|---|---|---|
|
||||||
|
|User Provided description|PASS|No out of scope variables created or modified|
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mp_assertcols.sas
|
||||||
|
@li mp_assertcolvals.sas
|
||||||
|
@li mp_assertdsobs.sas
|
||||||
|
@li mp_assertscope.test.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_assertscope(action,
|
||||||
|
desc=0,
|
||||||
|
scope=GLOBAL,
|
||||||
|
scopeds=work.mp_assertscope,
|
||||||
|
outds=work.test_results
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local ds test_result test_comments del add mod;
|
||||||
|
|
||||||
|
/* get current variables */
|
||||||
|
%if &action=SNAPSHOT %then %do;
|
||||||
|
proc sql;
|
||||||
|
create table &scopeds as
|
||||||
|
select name,offset,value
|
||||||
|
from dictionary.macros
|
||||||
|
where scope="&scope"
|
||||||
|
order by name,offset;
|
||||||
|
%end;
|
||||||
|
%else %if &action=COMPARE %then %do;
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table _data_ as
|
||||||
|
select name,offset,value
|
||||||
|
from dictionary.macros
|
||||||
|
where scope="&scope"
|
||||||
|
order by name,offset;
|
||||||
|
|
||||||
|
%let ds=&syslast;
|
||||||
|
|
||||||
|
proc compare base=&scopeds compare=&ds;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%if &sysinfo=0 %then %do;
|
||||||
|
%let test_result=PASS;
|
||||||
|
%let test_comments=&scope Variables Unmodified;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
proc sql noprint undo_policy=none;
|
||||||
|
select distinct name into: del separated by ' ' from &scopeds
|
||||||
|
where name not in (select name from &ds);
|
||||||
|
select distinct name into: add separated by ' ' from &ds
|
||||||
|
where name not in (select name from &scopeds);
|
||||||
|
select distinct a.name into: mod separated by ' '
|
||||||
|
from &scopeds a
|
||||||
|
inner join &ds b
|
||||||
|
on a.name=b.name
|
||||||
|
and a.offset=b.offset
|
||||||
|
where a.value ne b.value;
|
||||||
|
%let test_result=FAIL;
|
||||||
|
%let test_comments=%str(Mod:(&mod) Add:(&add) Del:(&del));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
|
||||||
|
data ;
|
||||||
|
length test_description $256 test_result $4 test_comments $256;
|
||||||
|
test_description=symget('desc');
|
||||||
|
test_comments=symget('test_comments');
|
||||||
|
test_result=symget('test_result');
|
||||||
|
run;
|
||||||
|
|
||||||
|
%let ds=&syslast;
|
||||||
|
proc append base=&outds data=&ds;
|
||||||
|
run;
|
||||||
|
proc sql;
|
||||||
|
drop table &ds;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mp_assertscope;/**
|
||||||
@file
|
@file
|
||||||
@brief Convert a file to/from base64 format
|
@brief Convert a file to/from base64 format
|
||||||
@details Creates a new version of a file either encoded or decoded using
|
@details Creates a new version of a file either encoded or decoded using
|
||||||
@@ -4055,18 +4173,23 @@ run;
|
|||||||
* The above transpose can mean that some updates create additional columns.
|
* The above transpose can mean that some updates create additional columns.
|
||||||
* This necessitates the occasional use of datastep over proc append.
|
* This necessitates the occasional use of datastep over proc append.
|
||||||
*/
|
*/
|
||||||
%local basevars appvars usedatastep;
|
%if %mf_existds(&outds) %then %do;
|
||||||
%let basevars=%mf_getvarlist(&outds);
|
%local basevars appvars newvars;
|
||||||
%let appvars=%mf_getvarlist(&out_ds);
|
%let basevars=%mf_getvarlist(&outds);
|
||||||
%let newvars=%length(%mf_wordsinstr1butnotstr2(Str1=&appvars,Str2=&basevars));
|
%let appvars=%mf_getvarlist(&out_ds);
|
||||||
|
%let newvars=%length(%mf_wordsinstr1butnotstr2(Str1=&appvars,Str2=&basevars));
|
||||||
%if %mf_existds(&outds) and &newvars>0 %then %do;
|
%if &newvars>0 %then %do;
|
||||||
data &outds;
|
data &outds;
|
||||||
set &outds &out_ds;
|
set &outds &out_ds;
|
||||||
run;
|
run;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
proc append base=&outds data=&out_ds force nowarn;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
proc append base=&outds data=&out_ds force nowarn;
|
proc append base=&outds data=&out_ds;
|
||||||
run;
|
run;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
@@ -4322,8 +4445,9 @@ create table datalines1 as
|
|||||||
/**
|
/**
|
||||||
Due to long decimals cannot use best. format
|
Due to long decimals cannot use best. format
|
||||||
So - use bestd. format and then use character functions to strip trailing
|
So - use bestd. format and then use character functions to strip trailing
|
||||||
zeros, if NOT an integer!!
|
zeros, if NOT an integer or missing!! Cannot use int() as it upsets
|
||||||
resolved code = ifc(int(VARIABLE)=VARIABLE
|
note2err when there are missings.
|
||||||
|
resolved code = ifc( mod(coalesce(VARIABLE,0),1)=0
|
||||||
,put(VARIABLE,best32.)
|
,put(VARIABLE,best32.)
|
||||||
,substrn(put(VARIABLE,bestd32.),1
|
,substrn(put(VARIABLE,bestd32.),1
|
||||||
,findc(put(VARIABLE,bestd32.),'0','TBK')));
|
,findc(put(VARIABLE,bestd32.),'0','TBK')));
|
||||||
@@ -4334,7 +4458,7 @@ data datalines_2;
|
|||||||
set datalines1 (where=(upcase(name) not in
|
set datalines1 (where=(upcase(name) not in
|
||||||
('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
|
('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
|
||||||
if type='num' then dataline=
|
if type='num' then dataline=
|
||||||
cats('ifc(int(',name,')=',name,'
|
cats('ifc(mod(coalesce(',name,',0),1)=0
|
||||||
,put(',name,',best32.-l)
|
,put(',name,',best32.-l)
|
||||||
,substrn(put(',name,',bestd32.-l),1
|
,substrn(put(',name,',bestd32.-l),1
|
||||||
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
||||||
@@ -4508,7 +4632,7 @@ data _null_;
|
|||||||
dsid=open("&ds.","i");
|
dsid=open("&ds.","i");
|
||||||
num=attrn(dsid,"nvars");
|
num=attrn(dsid,"nvars");
|
||||||
do i=1 to num;
|
do i=1 to num;
|
||||||
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
|
header = cats(coalescec(varlabel(dsid,i),varname(dsid,i)));
|
||||||
put header @;
|
put header @;
|
||||||
end;
|
end;
|
||||||
rc=close(dsid);
|
rc=close(dsid);
|
||||||
@@ -5013,7 +5137,7 @@ data &outds;
|
|||||||
output;
|
output;
|
||||||
end;
|
end;
|
||||||
if mod(SUBGROUP_ID,1) ne 0 then do;
|
if mod(SUBGROUP_ID,1) ne 0 then do;
|
||||||
REASON_CD='SUBGROUP_ID should be integer, not '!!left(subgroup_id);
|
REASON_CD='SUBGROUP_ID should be integer, not '!!cats(subgroup_id);
|
||||||
putlog REASON_CD= SUBGROUP_ID=;
|
putlog REASON_CD= SUBGROUP_ID=;
|
||||||
call symputx('reason_cd',reason_cd,'l');
|
call symputx('reason_cd',reason_cd,'l');
|
||||||
call symputx('nobs',_n_,'l');
|
call symputx('nobs',_n_,'l');
|
||||||
@@ -5031,7 +5155,7 @@ data &outds;
|
|||||||
if OPERATOR_NM not in
|
if OPERATOR_NM not in
|
||||||
('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS')
|
('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS')
|
||||||
then do;
|
then do;
|
||||||
REASON_CD='Invalid OPERATOR_NM: '!!left(OPERATOR_NM);
|
REASON_CD='Invalid OPERATOR_NM: '!!cats(OPERATOR_NM);
|
||||||
putlog REASON_CD= OPERATOR_NM=;
|
putlog REASON_CD= OPERATOR_NM=;
|
||||||
call symputx('reason_cd',reason_cd,'l');
|
call symputx('reason_cd',reason_cd,'l');
|
||||||
call symputx('nobs',_n_,'l');
|
call symputx('nobs',_n_,'l');
|
||||||
@@ -6197,7 +6321,7 @@ run;
|
|||||||
lab=" label="!!cats("'",tranwrd(label,"'","''"),"'");
|
lab=" label="!!cats("'",tranwrd(label,"'","''"),"'");
|
||||||
if notnull='yes' then notnul=' not null';
|
if notnull='yes' then notnul=' not null';
|
||||||
if type='char' then typ=cats('char(',length,')');
|
if type='char' then typ=cats('char(',length,')');
|
||||||
else if length ne 8 then typ='num length='!!left(length);
|
else if length ne 8 then typ='num length='!!cats(length);
|
||||||
else typ='num';
|
else typ='num';
|
||||||
put name typ fmt notnul lab;
|
put name typ fmt notnul lab;
|
||||||
run;
|
run;
|
||||||
@@ -7509,6 +7633,7 @@ filename &tempref clear;
|
|||||||
noautocorrect /* disallow misspelled procedure names */
|
noautocorrect /* disallow misspelled procedure names */
|
||||||
compress=CHAR /* default is none so ensure we have something! */
|
compress=CHAR /* default is none so ensure we have something! */
|
||||||
datastmtchk=ALLKEYWORDS /* protection from overwriting input datasets */
|
datastmtchk=ALLKEYWORDS /* protection from overwriting input datasets */
|
||||||
|
dsoptions=note2err /* undocumented - convert bad NOTEs to ERRs */
|
||||||
%str(err)orcheck=STRICT /* catch errs in libname/filename statements */
|
%str(err)orcheck=STRICT /* catch errs in libname/filename statements */
|
||||||
fmterr /* ensure err when a format cannot be found */
|
fmterr /* ensure err when a format cannot be found */
|
||||||
mergenoby=%str(ERR)OR /* throw err when a merge has no BY variables */
|
mergenoby=%str(ERR)OR /* throw err when a merge has no BY variables */
|
||||||
@@ -9983,7 +10108,7 @@ libname &lib clear;
|
|||||||
else do;
|
else do;
|
||||||
x+1;
|
x+1;
|
||||||
call symputx(name,quote(cats(value)),'l');
|
call symputx(name,quote(cats(value)),'l');
|
||||||
call symputx('pval'!!left(x),name,'l');
|
call symputx(cats('pval',x),name,'l');
|
||||||
call symputx('pcnt',x,'l');
|
call symputx('pcnt',x,'l');
|
||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
@@ -10529,9 +10654,11 @@ alter table &libds modify &var char(&len);
|
|||||||
%let tempcol=%mf_getuniquename();
|
%let tempcol=%mf_getuniquename();
|
||||||
|
|
||||||
%if &rule=ISINT %then %do;
|
%if &rule=ISINT %then %do;
|
||||||
&tempcol=input(&incol,?? best32.);
|
|
||||||
&outcol=0;
|
&outcol=0;
|
||||||
if not missing(&tempcol) then if mod(&incol,1)=0 then &outcol=1;
|
if not missing(&incol) then do;
|
||||||
|
&tempcol=input(&incol,?? best32.);
|
||||||
|
if not missing(&tempcol) then if mod(&tempcol,1)=0 then &outcol=1;
|
||||||
|
end;
|
||||||
drop &tempcol;
|
drop &tempcol;
|
||||||
%end;
|
%end;
|
||||||
%else %if &rule=ISNUM %then %do;
|
%else %if &rule=ISNUM %then %do;
|
||||||
@@ -13005,7 +13132,7 @@ data _null_;
|
|||||||
put ' set &tempds; ';
|
put ' set &tempds; ';
|
||||||
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
||||||
put ' i+1; ';
|
put ' i+1; ';
|
||||||
put ' call symputx(''wt''!!left(i),name,''l''); ';
|
put ' call symputx(cats(''wt'',i),name,''l''); ';
|
||||||
put ' call symputx(''wtcnt'',i,''l''); ';
|
put ' call symputx(''wtcnt'',i,''l''); ';
|
||||||
put ' data _null_; file &fref mod encoding=''utf-8''; ';
|
put ' data _null_; file &fref mod encoding=''utf-8''; ';
|
||||||
put ' put ",""WORK"":{"; ';
|
put ' put ",""WORK"":{"; ';
|
||||||
@@ -13049,6 +13176,7 @@ data _null_;
|
|||||||
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
||||||
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
||||||
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
||||||
|
put ' length memsize $32; ';
|
||||||
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
||||||
put ' memsize=quote(cats(memsize)); ';
|
put ' memsize=quote(cats(memsize)); ';
|
||||||
put ' put '',"MEMSIZE" : '' memsize; ';
|
put ' put '',"MEMSIZE" : '' memsize; ';
|
||||||
@@ -14780,7 +14908,7 @@ data _null_;
|
|||||||
set repos;
|
set repos;
|
||||||
where repositorytype in('CUSTOM','FOUNDATION');
|
where repositorytype in('CUSTOM','FOUNDATION');
|
||||||
keep id name ;
|
keep id name ;
|
||||||
call symputx('repo'!!left(_n_),name,'l');
|
call symputx(cats('repo',_n_),name,'l');
|
||||||
call symputx('repocnt',_n_,'l');
|
call symputx('repocnt',_n_,'l');
|
||||||
run;
|
run;
|
||||||
|
|
||||||
@@ -16510,7 +16638,7 @@ run;
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name,'l');
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i,'l');
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod encoding='utf-8';
|
data _null_; file &fref mod encoding='utf-8';
|
||||||
put ",""WORK"":{";
|
put ",""WORK"":{";
|
||||||
@@ -16554,6 +16682,7 @@ run;
|
|||||||
put ',"SYSVLONG" : ' sysvlong;
|
put ',"SYSVLONG" : ' sysvlong;
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
@@ -16812,7 +16941,7 @@ run;
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name,'l');
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i,'l');
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod encoding='utf-8' termstr=lf;
|
data _null_; file &fref mod encoding='utf-8' termstr=lf;
|
||||||
put ",""WORK"":{";
|
put ",""WORK"":{";
|
||||||
@@ -16863,6 +16992,7 @@ run;
|
|||||||
length autoexec $512;
|
length autoexec $512;
|
||||||
autoexec=quote(urlencode(trim(getoption('autoexec'))));
|
autoexec=quote(urlencode(trim(getoption('autoexec'))));
|
||||||
put ',"AUTOEXEC" : ' autoexec;
|
put ',"AUTOEXEC" : ' autoexec;
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
@@ -18200,8 +18330,8 @@ data _null_;
|
|||||||
put ' set &tempds; ';
|
put ' set &tempds; ';
|
||||||
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
||||||
put ' i+1; ';
|
put ' i+1; ';
|
||||||
put ' call symputx(''wt''!!left(i),name); ';
|
put ' call symputx(cats(''wt'',i),name,''l''); ';
|
||||||
put ' call symputx(''wtcnt'',i); ';
|
put ' call symputx(''wtcnt'',i,''l''); ';
|
||||||
put ' data _null_; file &fref mod; put ",""WORK"":{"; ';
|
put ' data _null_; file &fref mod; put ",""WORK"":{"; ';
|
||||||
put ' %do i=1 %to &wtcnt; ';
|
put ' %do i=1 %to &wtcnt; ';
|
||||||
put ' %let wt=&&wt&i; ';
|
put ' %let wt=&&wt&i; ';
|
||||||
@@ -18239,6 +18369,7 @@ data _null_;
|
|||||||
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
||||||
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
||||||
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
||||||
|
put ' length memsize $32; ';
|
||||||
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
||||||
put ' memsize=quote(cats(memsize)); ';
|
put ' memsize=quote(cats(memsize)); ';
|
||||||
put ' put '',"MEMSIZE" : '' memsize; ';
|
put ' put '',"MEMSIZE" : '' memsize; ';
|
||||||
@@ -20938,7 +21069,7 @@ data;run;%let jdswaitfor=&syslast;
|
|||||||
data _null_;
|
data _null_;
|
||||||
infile &jfref lrecl=32767;
|
infile &jfref lrecl=32767;
|
||||||
input;
|
input;
|
||||||
jparams='jparams'!!left(symget('jid'));
|
jparams=cats('jparams',symget('jid'));
|
||||||
call symputx(jparams,substr(_infile_,3,length(_infile_)-4));
|
call symputx(jparams,substr(_infile_,3,length(_infile_)-4));
|
||||||
run;
|
run;
|
||||||
%local jobuid&jid;
|
%local jobuid&jid;
|
||||||
@@ -22058,8 +22189,8 @@ filename &fref1 clear;
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name);
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i);
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod; put ",""WORK"":{";
|
data _null_; file &fref mod; put ",""WORK"":{";
|
||||||
%do i=1 %to &wtcnt;
|
%do i=1 %to &wtcnt;
|
||||||
%let wt=&&wt&i;
|
%let wt=&&wt&i;
|
||||||
@@ -22097,6 +22228,7 @@ filename &fref1 clear;
|
|||||||
put ',"SYSVLONG" : ' sysvlong;
|
put ',"SYSVLONG" : ' sysvlong;
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
@@ -22548,6 +22680,82 @@ run;
|
|||||||
|
|
||||||
%mend ml_json;
|
%mend ml_json;
|
||||||
/**
|
/**
|
||||||
|
@file
|
||||||
|
@brief Returns the length of a numeric value
|
||||||
|
@details
|
||||||
|
Returns the length, in bytes, of a numeric value. If the value is
|
||||||
|
missing, then 0 is returned.
|
||||||
|
|
||||||
|
The function itself takes the following (positional) parameters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|---|---|
|
||||||
|
| var | variable (or value) to be tested|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
ina=1;
|
||||||
|
inb=10000000;
|
||||||
|
inc=12345678;
|
||||||
|
ind=.;
|
||||||
|
outa=mcf_length(ina);
|
||||||
|
outb=mcf_length(inb);
|
||||||
|
outc=mcf_length(inc);
|
||||||
|
outd=mcf_length(ind);
|
||||||
|
put (out:)(=);
|
||||||
|
run;
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
> outa=3 outb=4 outc=5 outd=0
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mcf_length.test.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_length(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_length(var);
|
||||||
|
if missing(var) then len=0;
|
||||||
|
else if trunc(var,3)=var then len=3;
|
||||||
|
else if trunc(var,4)=var then len=4;
|
||||||
|
else if trunc(var,5)=var then len=5;
|
||||||
|
else if trunc(var,6)=var then len=6;
|
||||||
|
else if trunc(var,7)=var then len=7;
|
||||||
|
else len=8;
|
||||||
|
return(len);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_length;/**
|
||||||
@file
|
@file
|
||||||
@brief Provides a replacement for the stpsrv_header function
|
@brief Provides a replacement for the stpsrv_header function
|
||||||
@details The stpsrv_header is normally a built-in function, used to set the
|
@details The stpsrv_header is normally a built-in function, used to set the
|
||||||
@@ -22618,7 +22826,7 @@ run;
|
|||||||
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function stpsrv_header(name $, value $);
|
function stpsrv_header(name $, value $);
|
||||||
@@ -22696,7 +22904,7 @@ endsub;
|
|||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function mcf_string2file(filepath $, string $, mode $);
|
function mcf_string2file(filepath $, string $, mode $);
|
||||||
|
|||||||
119
base/mp_assertscope.sas
Normal file
119
base/mp_assertscope.sas
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Used to capture scope leakage of macro variables
|
||||||
|
@details A common 'difficult to detect' bug in macros is where a nested
|
||||||
|
macro over-writes variables in a higher level macro.
|
||||||
|
|
||||||
|
This assertion takes a snapshot of the macro variables before and after
|
||||||
|
a macro invocation. This makes it easy to detect whether any macro
|
||||||
|
variables were modified or changed.
|
||||||
|
|
||||||
|
Currently, the macro only checks for global scope variables. In the future
|
||||||
|
it may be extended to work at multiple levels of nesting.
|
||||||
|
|
||||||
|
If you would like this feature, feel free to contribute / raise an issue /
|
||||||
|
engage the SASjs team directly.
|
||||||
|
|
||||||
|
Example usage:
|
||||||
|
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
|
||||||
|
%let oops=I did it again;
|
||||||
|
|
||||||
|
%mp_assertscope(COMPARE,
|
||||||
|
desc=Checking macro variables against previous snapshot
|
||||||
|
)
|
||||||
|
|
||||||
|
@param [in] action (SNAPSHOT) The action to take. Valid values:
|
||||||
|
@li SNAPSHOT - take a copy of the current macro variables
|
||||||
|
@li COMPARE - compare the current macro variables against previous values
|
||||||
|
@param [in] scope= (GLOBAL) The scope of the variables to be checked. This
|
||||||
|
corresponds to the values in the SCOPE column in `sashelp.vmacro`.
|
||||||
|
@param [in] desc= (Testing variable scope) The user provided test description
|
||||||
|
@param [in,out] scopeds= (work.mp_assertscope) The dataset to contain the
|
||||||
|
scope snapshot
|
||||||
|
@param [out] outds= (work.test_results) The output dataset to contain the
|
||||||
|
results. If it does not exist, it will be created, with the following format:
|
||||||
|
|TEST_DESCRIPTION:$256|TEST_RESULT:$4|TEST_COMMENTS:$256|
|
||||||
|
|---|---|---|
|
||||||
|
|User Provided description|PASS|No out of scope variables created or modified|
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mp_assertcols.sas
|
||||||
|
@li mp_assertcolvals.sas
|
||||||
|
@li mp_assertdsobs.sas
|
||||||
|
@li mp_assertscope.test.sas
|
||||||
|
|
||||||
|
@version 9.2
|
||||||
|
@author Allan Bowe
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mp_assertscope(action,
|
||||||
|
desc=0,
|
||||||
|
scope=GLOBAL,
|
||||||
|
scopeds=work.mp_assertscope,
|
||||||
|
outds=work.test_results
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
%local ds test_result test_comments del add mod;
|
||||||
|
|
||||||
|
/* get current variables */
|
||||||
|
%if &action=SNAPSHOT %then %do;
|
||||||
|
proc sql;
|
||||||
|
create table &scopeds as
|
||||||
|
select name,offset,value
|
||||||
|
from dictionary.macros
|
||||||
|
where scope="&scope"
|
||||||
|
order by name,offset;
|
||||||
|
%end;
|
||||||
|
%else %if &action=COMPARE %then %do;
|
||||||
|
|
||||||
|
proc sql;
|
||||||
|
create table _data_ as
|
||||||
|
select name,offset,value
|
||||||
|
from dictionary.macros
|
||||||
|
where scope="&scope"
|
||||||
|
order by name,offset;
|
||||||
|
|
||||||
|
%let ds=&syslast;
|
||||||
|
|
||||||
|
proc compare base=&scopeds compare=&ds;
|
||||||
|
run;
|
||||||
|
|
||||||
|
%if &sysinfo=0 %then %do;
|
||||||
|
%let test_result=PASS;
|
||||||
|
%let test_comments=&scope Variables Unmodified;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
proc sql noprint undo_policy=none;
|
||||||
|
select distinct name into: del separated by ' ' from &scopeds
|
||||||
|
where name not in (select name from &ds);
|
||||||
|
select distinct name into: add separated by ' ' from &ds
|
||||||
|
where name not in (select name from &scopeds);
|
||||||
|
select distinct a.name into: mod separated by ' '
|
||||||
|
from &scopeds a
|
||||||
|
inner join &ds b
|
||||||
|
on a.name=b.name
|
||||||
|
and a.offset=b.offset
|
||||||
|
where a.value ne b.value;
|
||||||
|
%let test_result=FAIL;
|
||||||
|
%let test_comments=%str(Mod:(&mod) Add:(&add) Del:(&del));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
|
||||||
|
data ;
|
||||||
|
length test_description $256 test_result $4 test_comments $256;
|
||||||
|
test_description=symget('desc');
|
||||||
|
test_comments=symget('test_comments');
|
||||||
|
test_result=symget('test_result');
|
||||||
|
run;
|
||||||
|
|
||||||
|
%let ds=&syslast;
|
||||||
|
proc append base=&outds data=&ds;
|
||||||
|
run;
|
||||||
|
proc sql;
|
||||||
|
drop table &ds;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mp_assertscope;
|
||||||
@@ -198,18 +198,23 @@ run;
|
|||||||
* The above transpose can mean that some updates create additional columns.
|
* The above transpose can mean that some updates create additional columns.
|
||||||
* This necessitates the occasional use of datastep over proc append.
|
* This necessitates the occasional use of datastep over proc append.
|
||||||
*/
|
*/
|
||||||
%local basevars appvars usedatastep;
|
%if %mf_existds(&outds) %then %do;
|
||||||
%let basevars=%mf_getvarlist(&outds);
|
%local basevars appvars newvars;
|
||||||
%let appvars=%mf_getvarlist(&out_ds);
|
%let basevars=%mf_getvarlist(&outds);
|
||||||
%let newvars=%length(%mf_wordsinstr1butnotstr2(Str1=&appvars,Str2=&basevars));
|
%let appvars=%mf_getvarlist(&out_ds);
|
||||||
|
%let newvars=%length(%mf_wordsinstr1butnotstr2(Str1=&appvars,Str2=&basevars));
|
||||||
%if %mf_existds(&outds) and &newvars>0 %then %do;
|
%if &newvars>0 %then %do;
|
||||||
data &outds;
|
data &outds;
|
||||||
set &outds &out_ds;
|
set &outds &out_ds;
|
||||||
run;
|
run;
|
||||||
|
%end;
|
||||||
|
%else %do;
|
||||||
|
proc append base=&outds data=&out_ds force nowarn;
|
||||||
|
run;
|
||||||
|
%end;
|
||||||
%end;
|
%end;
|
||||||
%else %do;
|
%else %do;
|
||||||
proc append base=&outds data=&out_ds force nowarn;
|
proc append base=&outds data=&out_ds;
|
||||||
run;
|
run;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
|
|||||||
@@ -139,8 +139,9 @@ create table datalines1 as
|
|||||||
/**
|
/**
|
||||||
Due to long decimals cannot use best. format
|
Due to long decimals cannot use best. format
|
||||||
So - use bestd. format and then use character functions to strip trailing
|
So - use bestd. format and then use character functions to strip trailing
|
||||||
zeros, if NOT an integer!!
|
zeros, if NOT an integer or missing!! Cannot use int() as it upsets
|
||||||
resolved code = ifc(int(VARIABLE)=VARIABLE
|
note2err when there are missings.
|
||||||
|
resolved code = ifc( mod(coalesce(VARIABLE,0),1)=0
|
||||||
,put(VARIABLE,best32.)
|
,put(VARIABLE,best32.)
|
||||||
,substrn(put(VARIABLE,bestd32.),1
|
,substrn(put(VARIABLE,bestd32.),1
|
||||||
,findc(put(VARIABLE,bestd32.),'0','TBK')));
|
,findc(put(VARIABLE,bestd32.),'0','TBK')));
|
||||||
@@ -151,7 +152,7 @@ data datalines_2;
|
|||||||
set datalines1 (where=(upcase(name) not in
|
set datalines1 (where=(upcase(name) not in
|
||||||
('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
|
('PROCESSED_DTTM','VALID_FROM_DTTM','VALID_TO_DTTM')));
|
||||||
if type='num' then dataline=
|
if type='num' then dataline=
|
||||||
cats('ifc(int(',name,')=',name,'
|
cats('ifc(mod(coalesce(',name,',0),1)=0
|
||||||
,put(',name,',best32.-l)
|
,put(',name,',best32.-l)
|
||||||
,substrn(put(',name,',bestd32.-l),1
|
,substrn(put(',name,',bestd32.-l),1
|
||||||
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ data _null_;
|
|||||||
dsid=open("&ds.","i");
|
dsid=open("&ds.","i");
|
||||||
num=attrn(dsid,"nvars");
|
num=attrn(dsid,"nvars");
|
||||||
do i=1 to num;
|
do i=1 to num;
|
||||||
header = trim(left(coalescec(varlabel(dsid,i),varname(dsid,i))));
|
header = cats(coalescec(varlabel(dsid,i),varname(dsid,i)));
|
||||||
put header @;
|
put header @;
|
||||||
end;
|
end;
|
||||||
rc=close(dsid);
|
rc=close(dsid);
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ data &outds;
|
|||||||
output;
|
output;
|
||||||
end;
|
end;
|
||||||
if mod(SUBGROUP_ID,1) ne 0 then do;
|
if mod(SUBGROUP_ID,1) ne 0 then do;
|
||||||
REASON_CD='SUBGROUP_ID should be integer, not '!!left(subgroup_id);
|
REASON_CD='SUBGROUP_ID should be integer, not '!!cats(subgroup_id);
|
||||||
putlog REASON_CD= SUBGROUP_ID=;
|
putlog REASON_CD= SUBGROUP_ID=;
|
||||||
call symputx('reason_cd',reason_cd,'l');
|
call symputx('reason_cd',reason_cd,'l');
|
||||||
call symputx('nobs',_n_,'l');
|
call symputx('nobs',_n_,'l');
|
||||||
@@ -127,7 +127,7 @@ data &outds;
|
|||||||
if OPERATOR_NM not in
|
if OPERATOR_NM not in
|
||||||
('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS')
|
('=','>','<','<=','>=','BETWEEN','IN','NOT IN','NE','CONTAINS')
|
||||||
then do;
|
then do;
|
||||||
REASON_CD='Invalid OPERATOR_NM: '!!left(OPERATOR_NM);
|
REASON_CD='Invalid OPERATOR_NM: '!!cats(OPERATOR_NM);
|
||||||
putlog REASON_CD= OPERATOR_NM=;
|
putlog REASON_CD= OPERATOR_NM=;
|
||||||
call symputx('reason_cd',reason_cd,'l');
|
call symputx('reason_cd',reason_cd,'l');
|
||||||
call symputx('nobs',_n_,'l');
|
call symputx('nobs',_n_,'l');
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ run;
|
|||||||
lab=" label="!!cats("'",tranwrd(label,"'","''"),"'");
|
lab=" label="!!cats("'",tranwrd(label,"'","''"),"'");
|
||||||
if notnull='yes' then notnul=' not null';
|
if notnull='yes' then notnul=' not null';
|
||||||
if type='char' then typ=cats('char(',length,')');
|
if type='char' then typ=cats('char(',length,')');
|
||||||
else if length ne 8 then typ='num length='!!left(length);
|
else if length ne 8 then typ='num length='!!cats(length);
|
||||||
else typ='num';
|
else typ='num';
|
||||||
put name typ fmt notnul lab;
|
put name typ fmt notnul lab;
|
||||||
run;
|
run;
|
||||||
|
|||||||
@@ -51,6 +51,7 @@
|
|||||||
noautocorrect /* disallow misspelled procedure names */
|
noautocorrect /* disallow misspelled procedure names */
|
||||||
compress=CHAR /* default is none so ensure we have something! */
|
compress=CHAR /* default is none so ensure we have something! */
|
||||||
datastmtchk=ALLKEYWORDS /* protection from overwriting input datasets */
|
datastmtchk=ALLKEYWORDS /* protection from overwriting input datasets */
|
||||||
|
dsoptions=note2err /* undocumented - convert bad NOTEs to ERRs */
|
||||||
%str(err)orcheck=STRICT /* catch errs in libname/filename statements */
|
%str(err)orcheck=STRICT /* catch errs in libname/filename statements */
|
||||||
fmterr /* ensure err when a format cannot be found */
|
fmterr /* ensure err when a format cannot be found */
|
||||||
mergenoby=%str(ERR)OR /* throw err when a merge has no BY variables */
|
mergenoby=%str(ERR)OR /* throw err when a merge has no BY variables */
|
||||||
|
|||||||
@@ -76,7 +76,7 @@
|
|||||||
else do;
|
else do;
|
||||||
x+1;
|
x+1;
|
||||||
call symputx(name,quote(cats(value)),'l');
|
call symputx(name,quote(cats(value)),'l');
|
||||||
call symputx('pval'!!left(x),name,'l');
|
call symputx(cats('pval',x),name,'l');
|
||||||
call symputx('pcnt',x,'l');
|
call symputx('pcnt',x,'l');
|
||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
|
|||||||
@@ -48,9 +48,11 @@
|
|||||||
%let tempcol=%mf_getuniquename();
|
%let tempcol=%mf_getuniquename();
|
||||||
|
|
||||||
%if &rule=ISINT %then %do;
|
%if &rule=ISINT %then %do;
|
||||||
&tempcol=input(&incol,?? best32.);
|
|
||||||
&outcol=0;
|
&outcol=0;
|
||||||
if not missing(&tempcol) then if mod(&incol,1)=0 then &outcol=1;
|
if not missing(&incol) then do;
|
||||||
|
&tempcol=input(&incol,?? best32.);
|
||||||
|
if not missing(&tempcol) then if mod(&tempcol,1)=0 then &outcol=1;
|
||||||
|
end;
|
||||||
drop &tempcol;
|
drop &tempcol;
|
||||||
%end;
|
%end;
|
||||||
%else %if &rule=ISNUM %then %do;
|
%else %if &rule=ISNUM %then %do;
|
||||||
|
|||||||
77
fcmp/mcf_length.sas
Normal file
77
fcmp/mcf_length.sas
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Returns the length of a numeric value
|
||||||
|
@details
|
||||||
|
Returns the length, in bytes, of a numeric value. If the value is
|
||||||
|
missing, then 0 is returned.
|
||||||
|
|
||||||
|
The function itself takes the following (positional) parameters:
|
||||||
|
|
||||||
|
| PARAMETER | DESCRIPTION |
|
||||||
|
|---|---|
|
||||||
|
| var | variable (or value) to be tested|
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data _null_;
|
||||||
|
ina=1;
|
||||||
|
inb=10000000;
|
||||||
|
inc=12345678;
|
||||||
|
ind=.;
|
||||||
|
outa=mcf_length(ina);
|
||||||
|
outb=mcf_length(inb);
|
||||||
|
outc=mcf_length(inc);
|
||||||
|
outd=mcf_length(ind);
|
||||||
|
put (out:)(=);
|
||||||
|
run;
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
> outa=3 outb=4 outc=5 outd=0
|
||||||
|
|
||||||
|
@param [out] wrap= (NO) Choose YES to add the proc fcmp wrapper.
|
||||||
|
@param [out] insert_cmplib= (NO) Choose YES to insert the package into the
|
||||||
|
CMPLIB reference.
|
||||||
|
@param [out] lib= (work) The output library in which to create the catalog.
|
||||||
|
@param [out] cat= (sasjs) The output catalog in which to create the package.
|
||||||
|
@param [out] pkg= (utils) The output package in which to create the function.
|
||||||
|
Uses a 3 part format: libref.catalog.package
|
||||||
|
|
||||||
|
<h4> Related Macros </h4>
|
||||||
|
@li mcf_length.test.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro mcf_length(wrap=NO
|
||||||
|
,insert_cmplib=NO
|
||||||
|
,lib=WORK
|
||||||
|
,cat=SASJS
|
||||||
|
,pkg=UTILS
|
||||||
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
function mcf_length(var);
|
||||||
|
if missing(var) then len=0;
|
||||||
|
else if trunc(var,3)=var then len=3;
|
||||||
|
else if trunc(var,4)=var then len=4;
|
||||||
|
else if trunc(var,5)=var then len=5;
|
||||||
|
else if trunc(var,6)=var then len=6;
|
||||||
|
else if trunc(var,7)=var then len=7;
|
||||||
|
else len=8;
|
||||||
|
return(len);
|
||||||
|
endsub;
|
||||||
|
|
||||||
|
%if &wrap=YES %then %do;
|
||||||
|
quit;
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%if &insert_cmplib=YES %then %do;
|
||||||
|
options insert=(CMPLIB=(&lib..&cat));
|
||||||
|
%end;
|
||||||
|
|
||||||
|
%mend mcf_length;
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
%if %mf_existfunction(stpsrv_header)=1 %then %return;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function stpsrv_header(name $, value $);
|
function stpsrv_header(name $, value $);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
)/*/STORE SOURCE*/;
|
)/*/STORE SOURCE*/;
|
||||||
|
|
||||||
%if &wrap=YES %then %do;
|
%if &wrap=YES %then %do;
|
||||||
proc fcmp outcat=&lib..&cat..&pkg;
|
proc fcmp outlib=&lib..&cat..&pkg;
|
||||||
%end;
|
%end;
|
||||||
|
|
||||||
function mcf_string2file(filepath $, string $, mode $);
|
function mcf_string2file(filepath $, string $, mode $);
|
||||||
|
|||||||
@@ -383,7 +383,7 @@ data _null_;
|
|||||||
put ' set &tempds; ';
|
put ' set &tempds; ';
|
||||||
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
||||||
put ' i+1; ';
|
put ' i+1; ';
|
||||||
put ' call symputx(''wt''!!left(i),name,''l''); ';
|
put ' call symputx(cats(''wt'',i),name,''l''); ';
|
||||||
put ' call symputx(''wtcnt'',i,''l''); ';
|
put ' call symputx(''wtcnt'',i,''l''); ';
|
||||||
put ' data _null_; file &fref mod encoding=''utf-8''; ';
|
put ' data _null_; file &fref mod encoding=''utf-8''; ';
|
||||||
put ' put ",""WORK"":{"; ';
|
put ' put ",""WORK"":{"; ';
|
||||||
@@ -427,6 +427,7 @@ data _null_;
|
|||||||
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
||||||
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
||||||
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
||||||
|
put ' length memsize $32; ';
|
||||||
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
||||||
put ' memsize=quote(cats(memsize)); ';
|
put ' memsize=quote(cats(memsize)); ';
|
||||||
put ' put '',"MEMSIZE" : '' memsize; ';
|
put ' put '',"MEMSIZE" : '' memsize; ';
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ data _null_;
|
|||||||
set repos;
|
set repos;
|
||||||
where repositorytype in('CUSTOM','FOUNDATION');
|
where repositorytype in('CUSTOM','FOUNDATION');
|
||||||
keep id name ;
|
keep id name ;
|
||||||
call symputx('repo'!!left(_n_),name,'l');
|
call symputx(cats('repo',_n_),name,'l');
|
||||||
call symputx('repocnt',_n_,'l');
|
call symputx('repocnt',_n_,'l');
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
|||||||
@@ -122,7 +122,7 @@
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name,'l');
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i,'l');
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod encoding='utf-8';
|
data _null_; file &fref mod encoding='utf-8';
|
||||||
put ",""WORK"":{";
|
put ",""WORK"":{";
|
||||||
@@ -166,6 +166,7 @@
|
|||||||
put ',"SYSVLONG" : ' sysvlong;
|
put ',"SYSVLONG" : ' sysvlong;
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
|
|||||||
269
package-lock.json
generated
269
package-lock.json
generated
@@ -10,35 +10,55 @@
|
|||||||
"ts-loader": "^9.2.6"
|
"ts-loader": "^9.2.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sasjs/cli": "^3.4.1"
|
"@sasjs/cli": "3.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sasjs/adapter": {
|
"node_modules/@sasjs/adapter": {
|
||||||
"version": "3.3.1",
|
"version": "3.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-3.4.1.tgz",
|
||||||
"integrity": "sha512-rmdOG+sjmwGipq1AHczwEXNUlzRFV5efj89neVVJWQMZR6JBC1O6Dr9HjEyJHPKcnQ6z3vzH9rRA2PGi5lgMhA==",
|
"integrity": "sha512-FbsvYDaoJAuH8FMidXhX3Kh4Eb8qIcxy5iiCxHgcSRWM89W29W21WfCqCw0F28yFr+V5vZkvphwXMKFdOGGxlw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sasjs/utils": "^2.32.0",
|
"@sasjs/utils": "2.32.0",
|
||||||
"axios": "^0.21.4",
|
"axios": "0.25.0",
|
||||||
"axios-cookiejar-support": "^1.0.1",
|
"axios-cookiejar-support": "1.0.1",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "4.0.0",
|
||||||
"https": "^1.0.0",
|
"https": "1.0.0",
|
||||||
"tough-cookie": "^4.0.0"
|
"tough-cookie": "4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@sasjs/adapter/node_modules/@sasjs/utils": {
|
||||||
|
"version": "2.32.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.32.0.tgz",
|
||||||
|
"integrity": "sha512-xnvdEuI4PhTtulcdDEIMK7IxVj9bOMU1JTnxRuSEKWcsclY9P9Fw3cnMOOEgXCDffrOPn3f54DP7Wb1GXd+f8g==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@types/fs-extra": "^9.0.11",
|
||||||
|
"@types/prompts": "^2.0.13",
|
||||||
|
"chalk": "^4.1.1",
|
||||||
|
"cli-table": "^0.3.6",
|
||||||
|
"consola": "^2.15.0",
|
||||||
|
"csv-stringify": "^5.6.5",
|
||||||
|
"fs-extra": "^10.0.0",
|
||||||
|
"jwt-decode": "^3.1.2",
|
||||||
|
"prompts": "^2.4.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"valid-url": "^1.0.9"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sasjs/cli": {
|
"node_modules/@sasjs/cli": {
|
||||||
"version": "3.4.1",
|
"version": "3.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-3.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-3.6.0.tgz",
|
||||||
"integrity": "sha512-voc0/h8bkRAqrj7Pu1egYfCOSFLlLrrh9bXVLuGvSvWK81MezRZnWciTHlQGc9BgO2wU+LrQ0baIMd6u/HMB5Q==",
|
"integrity": "sha512-px5aFXNoTlML7g4TvP92q/uqWnHGbxnwEzy+4D+sJbXgpzLlCyyuUU7rbd/9sXT+/Pi7vjfHfBCv0JhoGYr6gw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sasjs/adapter": "3.3.1",
|
"@sasjs/adapter": "3.4.1",
|
||||||
"@sasjs/core": "^3.8.0",
|
"@sasjs/core": "3.10.0",
|
||||||
"@sasjs/lint": "1.11.2",
|
"@sasjs/lint": "1.11.2",
|
||||||
"@sasjs/utils": "2.34.1",
|
"@sasjs/utils": "2.35.0",
|
||||||
"chalk": "4.1.2",
|
"chalk": "4.1.2",
|
||||||
"csv-stringify": "5.6.5",
|
"csv-stringify": "5.6.5",
|
||||||
"dotenv": "10.0.0",
|
"dotenv": "10.0.0",
|
||||||
@@ -53,7 +73,7 @@
|
|||||||
"node-graphviz": "0.1.0",
|
"node-graphviz": "0.1.0",
|
||||||
"ora": "5.4.1",
|
"ora": "5.4.1",
|
||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"shelljs": "0.8.4",
|
"shelljs": "0.8.5",
|
||||||
"xml": "1.0.1",
|
"xml": "1.0.1",
|
||||||
"yargs": "17.2.1"
|
"yargs": "17.2.1"
|
||||||
},
|
},
|
||||||
@@ -61,10 +81,31 @@
|
|||||||
"sasjs": "build/index.js"
|
"sasjs": "build/index.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@sasjs/cli/node_modules/@sasjs/utils": {
|
||||||
|
"version": "2.35.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.35.0.tgz",
|
||||||
|
"integrity": "sha512-q9ZKV+TXqwiaj+0z5U7/00eBpp2QpjKfC9BKx7A6rQjBl10WtoWd5C9Em+RQULWVEdRbVS2XcnNsWelbKq/Zsw==",
|
||||||
|
"dev": true,
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@types/fs-extra": "^9.0.13",
|
||||||
|
"@types/prompts": "^2.0.13",
|
||||||
|
"chalk": "^4.1.1",
|
||||||
|
"cli-table": "^0.3.6",
|
||||||
|
"consola": "^2.15.0",
|
||||||
|
"csv-stringify": "^5.6.5",
|
||||||
|
"find": "0.3.0",
|
||||||
|
"fs-extra": "^10.0.0",
|
||||||
|
"jwt-decode": "^3.1.2",
|
||||||
|
"prompts": "^2.4.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"valid-url": "^1.0.9"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@sasjs/core": {
|
"node_modules/@sasjs/core": {
|
||||||
"version": "3.8.1",
|
"version": "3.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-3.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-3.10.0.tgz",
|
||||||
"integrity": "sha512-Yxak+WZwh8Z9IKcbi7aDDTRCcKlI6IUp7Ujavkec5pWMj3a2FSlLxu23lY2ERTBe7wMCGiaU7AseWlKcgd5joA==",
|
"integrity": "sha512-lgLxDYpIvwSrXFaUaTFCR0KXHQEc5QIOL4DU87TvBHEUUAWNQHzuVQWkavLtW5hbvLGnPXnyvspzoSzmBojXzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ts-loader": "^9.2.6"
|
"ts-loader": "^9.2.6"
|
||||||
@@ -138,9 +179,9 @@
|
|||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/fs-extra": {
|
"node_modules/@types/fs-extra": {
|
||||||
"version": "9.0.12",
|
"version": "9.0.13",
|
||||||
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
|
||||||
"integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==",
|
"integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
@@ -455,12 +496,12 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "0.21.4",
|
"version": "0.25.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
|
||||||
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
|
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.14.0"
|
"follow-redirects": "^1.14.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axios-cookiejar-support": {
|
"node_modules/axios-cookiejar-support": {
|
||||||
@@ -1057,9 +1098,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
"node_modules/follow-redirects": {
|
||||||
"version": "1.14.6",
|
"version": "1.14.7",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
|
||||||
"integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
|
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1341,9 +1382,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.4.0",
|
"version": "2.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
||||||
"integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
|
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has": "^1.0.3"
|
"has": "^1.0.3"
|
||||||
@@ -1893,13 +1934,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/resolve": {
|
"node_modules/resolve": {
|
||||||
"version": "1.20.0",
|
"version": "1.21.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
|
||||||
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
|
"integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-core-module": "^2.2.0",
|
"is-core-module": "^2.8.0",
|
||||||
"path-parse": "^1.0.6"
|
"path-parse": "^1.0.7",
|
||||||
|
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"resolve": "bin/resolve"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
@@ -2025,9 +2070,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/shelljs": {
|
"node_modules/shelljs": {
|
||||||
"version": "0.8.4",
|
"version": "0.8.5",
|
||||||
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
|
||||||
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"glob": "^7.0.0",
|
"glob": "^7.0.0",
|
||||||
@@ -2117,6 +2162,18 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/supports-preserve-symlinks-flag": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
|
"dev": true,
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/symbol-tree": {
|
"node_modules/symbol-tree": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
||||||
@@ -2587,29 +2644,50 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sasjs/adapter": {
|
"@sasjs/adapter": {
|
||||||
"version": "3.3.1",
|
"version": "3.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/adapter/-/adapter-3.4.1.tgz",
|
||||||
"integrity": "sha512-rmdOG+sjmwGipq1AHczwEXNUlzRFV5efj89neVVJWQMZR6JBC1O6Dr9HjEyJHPKcnQ6z3vzH9rRA2PGi5lgMhA==",
|
"integrity": "sha512-FbsvYDaoJAuH8FMidXhX3Kh4Eb8qIcxy5iiCxHgcSRWM89W29W21WfCqCw0F28yFr+V5vZkvphwXMKFdOGGxlw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@sasjs/utils": "^2.32.0",
|
"@sasjs/utils": "2.32.0",
|
||||||
"axios": "^0.21.4",
|
"axios": "0.25.0",
|
||||||
"axios-cookiejar-support": "^1.0.1",
|
"axios-cookiejar-support": "1.0.1",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "4.0.0",
|
||||||
"https": "^1.0.0",
|
"https": "1.0.0",
|
||||||
"tough-cookie": "^4.0.0"
|
"tough-cookie": "4.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@sasjs/utils": {
|
||||||
|
"version": "2.32.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.32.0.tgz",
|
||||||
|
"integrity": "sha512-xnvdEuI4PhTtulcdDEIMK7IxVj9bOMU1JTnxRuSEKWcsclY9P9Fw3cnMOOEgXCDffrOPn3f54DP7Wb1GXd+f8g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/fs-extra": "^9.0.11",
|
||||||
|
"@types/prompts": "^2.0.13",
|
||||||
|
"chalk": "^4.1.1",
|
||||||
|
"cli-table": "^0.3.6",
|
||||||
|
"consola": "^2.15.0",
|
||||||
|
"csv-stringify": "^5.6.5",
|
||||||
|
"fs-extra": "^10.0.0",
|
||||||
|
"jwt-decode": "^3.1.2",
|
||||||
|
"prompts": "^2.4.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"valid-url": "^1.0.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@sasjs/cli": {
|
"@sasjs/cli": {
|
||||||
"version": "3.4.1",
|
"version": "3.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-3.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/cli/-/cli-3.6.0.tgz",
|
||||||
"integrity": "sha512-voc0/h8bkRAqrj7Pu1egYfCOSFLlLrrh9bXVLuGvSvWK81MezRZnWciTHlQGc9BgO2wU+LrQ0baIMd6u/HMB5Q==",
|
"integrity": "sha512-px5aFXNoTlML7g4TvP92q/uqWnHGbxnwEzy+4D+sJbXgpzLlCyyuUU7rbd/9sXT+/Pi7vjfHfBCv0JhoGYr6gw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@sasjs/adapter": "3.3.1",
|
"@sasjs/adapter": "3.4.1",
|
||||||
"@sasjs/core": "^3.8.0",
|
"@sasjs/core": "3.10.0",
|
||||||
"@sasjs/lint": "1.11.2",
|
"@sasjs/lint": "1.11.2",
|
||||||
"@sasjs/utils": "2.34.1",
|
"@sasjs/utils": "2.35.0",
|
||||||
"chalk": "4.1.2",
|
"chalk": "4.1.2",
|
||||||
"csv-stringify": "5.6.5",
|
"csv-stringify": "5.6.5",
|
||||||
"dotenv": "10.0.0",
|
"dotenv": "10.0.0",
|
||||||
@@ -2624,15 +2702,37 @@
|
|||||||
"node-graphviz": "0.1.0",
|
"node-graphviz": "0.1.0",
|
||||||
"ora": "5.4.1",
|
"ora": "5.4.1",
|
||||||
"rimraf": "3.0.2",
|
"rimraf": "3.0.2",
|
||||||
"shelljs": "0.8.4",
|
"shelljs": "0.8.5",
|
||||||
"xml": "1.0.1",
|
"xml": "1.0.1",
|
||||||
"yargs": "17.2.1"
|
"yargs": "17.2.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@sasjs/utils": {
|
||||||
|
"version": "2.35.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@sasjs/utils/-/utils-2.35.0.tgz",
|
||||||
|
"integrity": "sha512-q9ZKV+TXqwiaj+0z5U7/00eBpp2QpjKfC9BKx7A6rQjBl10WtoWd5C9Em+RQULWVEdRbVS2XcnNsWelbKq/Zsw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@types/fs-extra": "^9.0.13",
|
||||||
|
"@types/prompts": "^2.0.13",
|
||||||
|
"chalk": "^4.1.1",
|
||||||
|
"cli-table": "^0.3.6",
|
||||||
|
"consola": "^2.15.0",
|
||||||
|
"csv-stringify": "^5.6.5",
|
||||||
|
"find": "0.3.0",
|
||||||
|
"fs-extra": "^10.0.0",
|
||||||
|
"jwt-decode": "^3.1.2",
|
||||||
|
"prompts": "^2.4.1",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"valid-url": "^1.0.9"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@sasjs/core": {
|
"@sasjs/core": {
|
||||||
"version": "3.8.1",
|
"version": "3.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-3.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/@sasjs/core/-/core-3.10.0.tgz",
|
||||||
"integrity": "sha512-Yxak+WZwh8Z9IKcbi7aDDTRCcKlI6IUp7Ujavkec5pWMj3a2FSlLxu23lY2ERTBe7wMCGiaU7AseWlKcgd5joA==",
|
"integrity": "sha512-lgLxDYpIvwSrXFaUaTFCR0KXHQEc5QIOL4DU87TvBHEUUAWNQHzuVQWkavLtW5hbvLGnPXnyvspzoSzmBojXzg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"ts-loader": "^9.2.6"
|
"ts-loader": "^9.2.6"
|
||||||
@@ -2702,9 +2802,9 @@
|
|||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"@types/fs-extra": {
|
"@types/fs-extra": {
|
||||||
"version": "9.0.12",
|
"version": "9.0.13",
|
||||||
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
|
||||||
"integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==",
|
"integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
@@ -2986,12 +3086,12 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "0.21.4",
|
"version": "0.25.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz",
|
||||||
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
|
"integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.14.0"
|
"follow-redirects": "^1.14.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"axios-cookiejar-support": {
|
"axios-cookiejar-support": {
|
||||||
@@ -3433,9 +3533,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"follow-redirects": {
|
"follow-redirects": {
|
||||||
"version": "1.14.6",
|
"version": "1.14.7",
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz",
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
|
||||||
"integrity": "sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==",
|
"integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"form-data": {
|
"form-data": {
|
||||||
@@ -3639,9 +3739,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"is-core-module": {
|
"is-core-module": {
|
||||||
"version": "2.4.0",
|
"version": "2.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
||||||
"integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
|
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"has": "^1.0.3"
|
"has": "^1.0.3"
|
||||||
@@ -4063,13 +4163,14 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"resolve": {
|
"resolve": {
|
||||||
"version": "1.20.0",
|
"version": "1.21.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
|
||||||
"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
|
"integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-core-module": "^2.2.0",
|
"is-core-module": "^2.8.0",
|
||||||
"path-parse": "^1.0.6"
|
"path-parse": "^1.0.7",
|
||||||
|
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resolve-dir": {
|
"resolve-dir": {
|
||||||
@@ -4150,9 +4251,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shelljs": {
|
"shelljs": {
|
||||||
"version": "0.8.4",
|
"version": "0.8.5",
|
||||||
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz",
|
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
|
||||||
"integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
|
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"glob": "^7.0.0",
|
"glob": "^7.0.0",
|
||||||
@@ -4224,6 +4325,12 @@
|
|||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"supports-preserve-symlinks-flag": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||||
|
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"symbol-tree": {
|
"symbol-tree": {
|
||||||
"version": "3.2.4",
|
"version": "3.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
|
||||||
|
|||||||
@@ -33,9 +33,6 @@
|
|||||||
"prepare": "git rev-parse --git-dir && git config core.hooksPath ./.git-hooks || true"
|
"prepare": "git rev-parse --git-dir && git config core.hooksPath ./.git-hooks || true"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@sasjs/cli": "^3.4.1"
|
"@sasjs/cli": "3.6.0"
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"ts-loader": "^9.2.6"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,7 +114,7 @@
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name,'l');
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i,'l');
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod encoding='utf-8' termstr=lf;
|
data _null_; file &fref mod encoding='utf-8' termstr=lf;
|
||||||
put ",""WORK"":{";
|
put ",""WORK"":{";
|
||||||
@@ -165,6 +165,7 @@
|
|||||||
length autoexec $512;
|
length autoexec $512;
|
||||||
autoexec=quote(urlencode(trim(getoption('autoexec'))));
|
autoexec=quote(urlencode(trim(getoption('autoexec'))));
|
||||||
put ',"AUTOEXEC" : ' autoexec;
|
put ',"AUTOEXEC" : ' autoexec;
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
|
|||||||
50
tests/crossplatform/mcf_length.test.sas
Normal file
50
tests/crossplatform/mcf_length.test.sas
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mcf_length.sas macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mcf_length.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%mcf_length(wrap=YES, insert_cmplib=YES)
|
||||||
|
|
||||||
|
data test;
|
||||||
|
call symputx('null',mcf_length(.));
|
||||||
|
call symputx('three',mcf_length(1));
|
||||||
|
call symputx('four',mcf_length(10000000));
|
||||||
|
call symputx('five',mcf_length(12345678));
|
||||||
|
call symputx('six',mcf_length(1234567890));
|
||||||
|
call symputx('seven',mcf_length(12345678901234));
|
||||||
|
call symputx('eight',mcf_length(12345678901234567));
|
||||||
|
run;
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&null)=%str(0)),
|
||||||
|
desc=Check if NULL returns 0
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&three)=%str(3)),
|
||||||
|
desc=Check for length 3
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&four)=%str(4)),
|
||||||
|
desc=Check for length 4
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&five)=%str(5)),
|
||||||
|
desc=Check for length 5
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&six)=%str(6)),
|
||||||
|
desc=Check for length 6
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&seven)=%str(7)),
|
||||||
|
desc=Check for length 3
|
||||||
|
)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(%str(&eight)=%str(8)),
|
||||||
|
desc=Check for length 8
|
||||||
|
)
|
||||||
15
tests/crossplatform/mp_assert.test.sas
Normal file
15
tests/crossplatform/mp_assert.test.sas
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_assert macro
|
||||||
|
@details This is quite "meta".. it's just testing itself
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mp_assert.sas
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(1=1),
|
||||||
|
desc=Checking result was created,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
80
tests/crossplatform/mp_assertscope.test.sas
Normal file
80
tests/crossplatform/mp_assertscope.test.sas
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
@file
|
||||||
|
@brief Testing mp_assertscope macro
|
||||||
|
|
||||||
|
<h4> SAS Macros </h4>
|
||||||
|
@li mf_getvalue.sas
|
||||||
|
@li mp_assert.sas
|
||||||
|
@li mp_assertscope.sas
|
||||||
|
|
||||||
|
|
||||||
|
**/
|
||||||
|
|
||||||
|
%macro dostuff(action);
|
||||||
|
%if &action=ADD %then %do;
|
||||||
|
%global NEWVAR1 NEWVAR2;
|
||||||
|
%end;
|
||||||
|
%else %if &action=DEL %then %do;
|
||||||
|
%symdel NEWVAR1 NEWVAR2;
|
||||||
|
%end;
|
||||||
|
%else %if &action=MOD %then %do;
|
||||||
|
%let NEWVAR1=Let us pray..;
|
||||||
|
%end;
|
||||||
|
%else %if &action=NOTHING %then %do;
|
||||||
|
%local a b c d e;
|
||||||
|
%end;
|
||||||
|
%mend dostuff;
|
||||||
|
|
||||||
|
|
||||||
|
/* check for adding variables */
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
%dostuff(ADD)
|
||||||
|
%mp_assertscope(COMPARE,outds=work.testing_the_tester1)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(
|
||||||
|
"%mf_getvalue(work.testing_the_tester1,test_comments)"
|
||||||
|
="Mod:() Add:(NEWVAR1 NEWVAR2) Del:()"
|
||||||
|
),
|
||||||
|
desc=Checking result when vars added,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
/* check for modifying variables */
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
%dostuff(MOD)
|
||||||
|
%mp_assertscope(COMPARE,outds=work.testing_the_tester2)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(
|
||||||
|
"%mf_getvalue(work.testing_the_tester2,test_comments)"
|
||||||
|
="Mod:(NEWVAR1) Add:() Del:()"
|
||||||
|
),
|
||||||
|
desc=Checking result when vars modified,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
/* check for deleting variables */
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
%dostuff(DEL)
|
||||||
|
%mp_assertscope(COMPARE,outds=work.testing_the_tester3)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(
|
||||||
|
"%mf_getvalue(work.testing_the_tester3,test_comments)"
|
||||||
|
="Mod:() Add:() Del:(NEWVAR1 NEWVAR2)"
|
||||||
|
),
|
||||||
|
desc=Checking result when vars deleted,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
|
|
||||||
|
/* check for doing nothing */
|
||||||
|
%mp_assertscope(SNAPSHOT)
|
||||||
|
%dostuff(NOTHING)
|
||||||
|
%mp_assertscope(COMPARE,outds=work.testing_the_tester4)
|
||||||
|
%mp_assert(
|
||||||
|
iftrue=(
|
||||||
|
"%mf_getvalue(work.testing_the_tester4,test_comments)"
|
||||||
|
="GLOBAL Variables Unmodified"
|
||||||
|
),
|
||||||
|
desc=Checking results when nothing created,
|
||||||
|
outds=work.test_results
|
||||||
|
)
|
||||||
@@ -112,6 +112,9 @@ datalines4;
|
|||||||
0
|
0
|
||||||
above are good
|
above are good
|
||||||
the rest are bad
|
the rest are bad
|
||||||
|
0.1
|
||||||
|
1.1
|
||||||
|
-0.001
|
||||||
%abort
|
%abort
|
||||||
1&somethingverybad.
|
1&somethingverybad.
|
||||||
&
|
&
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
<h4> SAS Macros </h4>
|
<h4> SAS Macros </h4>
|
||||||
@li mp_init.sas
|
@li mp_init.sas
|
||||||
|
@li mv_webout.sas
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|||||||
@@ -589,8 +589,8 @@ data _null_;
|
|||||||
put ' set &tempds; ';
|
put ' set &tempds; ';
|
||||||
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
put ' if not (upcase(name) =:"DATA"); /* ignore temp datasets */ ';
|
||||||
put ' i+1; ';
|
put ' i+1; ';
|
||||||
put ' call symputx(''wt''!!left(i),name); ';
|
put ' call symputx(cats(''wt'',i),name,''l''); ';
|
||||||
put ' call symputx(''wtcnt'',i); ';
|
put ' call symputx(''wtcnt'',i,''l''); ';
|
||||||
put ' data _null_; file &fref mod; put ",""WORK"":{"; ';
|
put ' data _null_; file &fref mod; put ",""WORK"":{"; ';
|
||||||
put ' %do i=1 %to &wtcnt; ';
|
put ' %do i=1 %to &wtcnt; ';
|
||||||
put ' %let wt=&&wt&i; ';
|
put ' %let wt=&&wt&i; ';
|
||||||
@@ -628,6 +628,7 @@ data _null_;
|
|||||||
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
put ' put '',"SYSVLONG" : '' sysvlong; ';
|
||||||
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
put ' put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" "; ';
|
||||||
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
put ' put '',"END_DTTM" : "'' "%sysfunc(datetime(),datetime20.3)" ''" ''; ';
|
||||||
|
put ' length memsize $32; ';
|
||||||
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
put ' memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)"; ';
|
||||||
put ' memsize=quote(cats(memsize)); ';
|
put ' memsize=quote(cats(memsize)); ';
|
||||||
put ' put '',"MEMSIZE" : '' memsize; ';
|
put ' put '',"MEMSIZE" : '' memsize; ';
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ data;run;%let jdswaitfor=&syslast;
|
|||||||
data _null_;
|
data _null_;
|
||||||
infile &jfref lrecl=32767;
|
infile &jfref lrecl=32767;
|
||||||
input;
|
input;
|
||||||
jparams='jparams'!!left(symget('jid'));
|
jparams=cats('jparams',symget('jid'));
|
||||||
call symputx(jparams,substr(_infile_,3,length(_infile_)-4));
|
call symputx(jparams,substr(_infile_,3,length(_infile_)-4));
|
||||||
run;
|
run;
|
||||||
%local jobuid&jid;
|
%local jobuid&jid;
|
||||||
|
|||||||
@@ -187,8 +187,8 @@
|
|||||||
set &tempds;
|
set &tempds;
|
||||||
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
if not (upcase(name) =:"DATA"); /* ignore temp datasets */
|
||||||
i+1;
|
i+1;
|
||||||
call symputx('wt'!!left(i),name);
|
call symputx(cats('wt',i),name,'l');
|
||||||
call symputx('wtcnt',i);
|
call symputx('wtcnt',i,'l');
|
||||||
data _null_; file &fref mod; put ",""WORK"":{";
|
data _null_; file &fref mod; put ",""WORK"":{";
|
||||||
%do i=1 %to &wtcnt;
|
%do i=1 %to &wtcnt;
|
||||||
%let wt=&&wt&i;
|
%let wt=&&wt&i;
|
||||||
@@ -226,6 +226,7 @@
|
|||||||
put ',"SYSVLONG" : ' sysvlong;
|
put ',"SYSVLONG" : ' sysvlong;
|
||||||
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
put ",""SYSWARNINGTEXT"" : ""&syswarningtext"" ";
|
||||||
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
put ',"END_DTTM" : "' "%sysfunc(datetime(),datetime20.3)" '" ';
|
||||||
|
length memsize $32;
|
||||||
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
memsize="%sysfunc(INPUTN(%sysfunc(getoption(memsize)), best.),sizekmg.)";
|
||||||
memsize=quote(cats(memsize));
|
memsize=quote(cats(memsize));
|
||||||
put ',"MEMSIZE" : ' memsize;
|
put ',"MEMSIZE" : ' memsize;
|
||||||
|
|||||||
Reference in New Issue
Block a user