1
0
mirror of https://github.com/sasjs/core.git synced 2026-01-05 00:20:05 +00:00

Compare commits

...

18 Commits

Author SHA1 Message Date
Allan Bowe
3978ac5e05 Merge pull request #394 from sasjs/pngfix
fix: support png in streaming viya apps
2025-06-02 15:10:51 +01:00
github-actions
6b378749e5 chore: updating all.sas 2025-06-02 14:10:40 +00:00
allan
77c0e35c9d fix: support png in streaming viya apps 2025-06-02 15:10:11 +01:00
Allan Bowe
52d33ccafb Merge pull request #393 from sasjs/issue1403
feat: adding mp_replace option to mv_createfile
2025-06-02 12:17:55 +01:00
github-actions
10087dd6a6 chore: updating all.sas 2025-06-02 11:17:02 +00:00
allan
3bd2148ae9 fix: failing test 2025-06-02 12:16:36 +01:00
github-actions
60570b2e13 chore: updating all.sas 2025-05-30 18:15:58 +00:00
allan
6e033afb7b feat: adding mp_replace option to mv_createfile
Relates to https://github.com/sasjs/cli/issues/1403
2025-05-30 19:15:33 +01:00
allan
4f5fa414e1 fix: updating readme with new prefix
(also bumping the version for the previous commit)
2025-05-30 10:24:19 +01:00
Allan Bowe
4b142f1f45 Merge pull request #392 from sasjs/viya2025
chore: removing put statements
2025-05-30 10:14:12 +01:00
github-actions
3f73a565a6 chore: updating all.sas 2025-05-30 09:13:52 +00:00
allan
d3f1c8e960 chore: removing put statements 2025-05-30 10:13:30 +01:00
Allan Bowe
0d10441b89 Merge pull request #391 from sasjs/viyastream
fix: ensuring svg rendering from SAS drive
2025-05-30 09:59:02 +01:00
github-actions
85e1f56400 chore: updating all.sas 2025-05-30 08:58:30 +00:00
allan
c5ec21c7a0 fix: ensuring svg rendering from SAS drive
Also reducing put statements in the log
2025-05-30 09:58:06 +01:00
Allan Bowe
e049ab99a7 Merge pull request #390 from sasjs/svgfix
fix: streamlining viya deploys
2025-05-29 17:52:57 +01:00
github-actions
e9deab3885 chore: updating all.sas 2025-05-29 16:51:46 +00:00
allan
8d2f084316 fix: streamlining viya deploys 2025-05-29 17:51:23 +01:00
9 changed files with 209 additions and 95 deletions

View File

@@ -147,16 +147,17 @@ filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
- macro names must be lowercase - macro names must be lowercase
- one macro per file - one macro per file
- prefixes: - prefixes:
- _mcf_ for macro compiled functions (proc fcmp) - _mcf__: macro compiled functions (proc fcmp)
- _mddl_ for macros containing DDL (Data Definition Language) - _mddl__: macros containing DDL (Data Definition Language)
- _mf_ for macro functions (can be used in open code). - _mf__: macro functions (can be used in open code).
- _ml_ for macros that are used to compile LUA modules - _mfv__: macro functions that work only in Viya
- _mm_ for metadata macros (interface with the metadata server). - _ml__: macros that are used to compile LUA modules
- _mmx_ for macros that use metadata and are XCMD enabled (working on both windows and unix) - _mm__: metadata macros (interface with the metadata server).
- _mp_ for macro procedures (which generate sas code) - _mmx__: macros that use metadata and are XCMD enabled (working on both windows and unix)
- _ms_ for macro procedures that will only work with [@sasjs/server](https://github.com/sasjs/server) - _mp__: macro procedures (which generate sas code)
- _mv_ for macro procedures that will only work in Viya - _ms__: macro procedures that will only work with [@sasjs/server](https://github.com/sasjs/server)
- _mx_ for macros that work on Viya, SAS 9 EBI and SASjs Server - _mv__: macro procedures that will only work in Viya
- _mx__: macros that work on Viya, SAS 9 EBI and SASjs Server
- follow verb-noun convention - follow verb-noun convention
- unix style line endings (lf) - unix style line endings (lf)
- individual lines should be no more than 80 characters long - individual lines should be no more than 80 characters long

142
all.sas
View File

@@ -11828,7 +11828,8 @@ insert into &outds select distinct * from &append_ds;
LUA, you can also use this macro: mp_gsubfile.sas LUA, you can also use this macro: mp_gsubfile.sas
@param [in] infile The QUOTED path to the file on which to perform the @param [in] infile The QUOTED path to the file on which to perform the
substitution substitution. Note that you can extract the pathname from a fileref using
the pathname function, eg: `"%sysfunc(pathname(fref))"`;
@param [in] findvar= Macro variable NAME containing the string to search for @param [in] findvar= Macro variable NAME containing the string to search for
@param [in] replacevar= Macro variable NAME containing the replacement string @param [in] replacevar= Macro variable NAME containing the replacement string
@param [out] outfile= (0) Optional QUOTED path to the adjusted output file (to @param [out] outfile= (0) Optional QUOTED path to the adjusted output file (to
@@ -24172,13 +24173,13 @@ run;
/** /**
@file @file
@brief Returns the uri of a file or folder @brief Returns the uri of a file or folder
@details The automatic variable _FILESRVC_[fref]_URI is used after assigning @details The automatic variable `_FILESRVC_[fref]_URI` is used after assigning
a fileref using the filesrvc engine. a fileref using the filesrvc engine.
Usage: Usage:
%put %mfv_existfile(/Public/folder/file.txt); %put %mfv_getpathuri(/Public/folder/file.txt);
%put %mfv_existfile(/Public/folder); %put %mfv_getpathuri(/Public/folder);
@param [in] filepath The full path to the file on SAS drive @param [in] filepath The full path to the file on SAS drive
(eg /Public/myfile.txt) (eg /Public/myfile.txt)
@@ -24239,6 +24240,20 @@ run;
run; run;
%mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile) %mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile)
The macro also supports find & replace (used by the SASjs Streaming App
build program). This allows one string to be replaced by another at the
point at which the file is created. This is done by passing in the NAMES of
the macro variables containing the values to be swapped, eg:
filename fref temp;
data _null_;
file fref;
put 'whenever life gets you down, Mrs Brown..';
run;
%let f=Mrs Brown;
%let r=just remember that you're standing on a planet that's evolving;
%mv_createfile(path=/Public,name=life.md,inref=fref,fin,swap=f r)
@param [in] path= The parent (SAS Drive) folder in which to create the file @param [in] path= The parent (SAS Drive) folder in which to create the file
@param [in] name= The name of the file to be created @param [in] name= The name of the file to be created
@@ -24258,6 +24273,10 @@ run;
@li password @li password
@li authorization_code @li authorization_code
@li sas_services @li sas_services
@param [in] force= (YES) Will overwrite (delete / recreate) files by default.
Set to NO to abort if a file already exists in that location.
@param pin] swap= (0) Provide two macro variable NAMES that contain the values
to be swapped, eg swap=find replace (see also the example above)
@param [out] outds= (_null_) Output dataset with the uri of the new file @param [out] outds= (_null_) Output dataset with the uri of the new file
@param [in] mdebug= (0) Set to 1 to enable DEBUG messages @param [in] mdebug= (0) Set to 1 to enable DEBUG messages
@@ -24268,8 +24287,10 @@ run;
@li mf_getuniquename.sas @li mf_getuniquename.sas
@li mf_isblank.sas @li mf_isblank.sas
@li mf_mimetype.sas @li mf_mimetype.sas
@li mfv_getpathuri.sas
@li mp_abort.sas @li mp_abort.sas
@li mp_base64copy.sas @li mp_base64copy.sas
@li mp_replace.sas
@li mv_createfolder.sas @li mv_createfolder.sas
<h4> Related Macros</h4> <h4> Related Macros</h4>
@@ -24287,6 +24308,8 @@ run;
,grant_type=sas_services ,grant_type=sas_services
,mdebug=0 ,mdebug=0
,outds=_null_ ,outds=_null_
,force=YES
,swap=0
); );
%local dbg; %local dbg;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
@@ -24308,16 +24331,16 @@ run;
%mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password %mp_abort(iftrue=(&grant_type ne authorization_code and &grant_type ne password
and &grant_type ne sas_services and &grant_type ne sas_services
) )
,mac=&sysmacroname ,mac=MV_CREATEFILE
,msg=%str(Invalid value for grant_type: &grant_type) ,msg=%str(Invalid value for grant_type: &grant_type)
) )
%mp_abort(iftrue=(%mf_isblank(&path)=1 or %length(&path)=1) %mp_abort(iftrue=(%mf_isblank(&path)=1 or %length(&path)=1)
,mac=&sysmacroname ,mac=MV_CREATEFILE
,msg=%str(path value must be provided) ,msg=%str(path value must be provided)
) )
%mp_abort(iftrue=(%mf_isblank(&name)=1 or %length(&name)=1) %mp_abort(iftrue=(%mf_isblank(&name)=1 or %length(&name)=1)
,mac=&sysmacroname ,mac=MV_CREATEFILE
,msg=%str(name value with length >1 must be provided) ,msg=%str(name value with length >1 must be provided)
) )
@@ -24331,6 +24354,12 @@ run;
%end; %end;
%else %put %str(ERR)OR: invalid value for intype: &intype; %else %put %str(ERR)OR: invalid value for intype: &intype;
%if "&swap" ne "0" %then %do;
%mp_replace("%sysfunc(pathname(&fref))"
,findvar=%scan(&swap,1,%str( ))
,replacevar=%scan(&swap,2,%str( ))
)
%end;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
data _null_; data _null_;
@@ -24340,9 +24369,12 @@ run;
run; run;
%end; %end;
options noquotelenmax;
%local base_uri; /* location of rest apis */
%let base_uri=%mf_getplatform(VIYARESTAPI);
/* create folder if it does not already exist */ /* create folder if it does not already exist */
%local folderds parenturi; %local folderds self_uri;
%let folderds=%mf_getuniquename(prefix=folderds); %let folderds=%mf_getuniquename(prefix=folderds);
%mv_createfolder(path=&path %mv_createfolder(path=&path
,access_token_var=&access_token_var ,access_token_var=&access_token_var
@@ -24355,26 +24387,46 @@ data _null_;
call symputx('self_uri',self_uri,'l'); call symputx('self_uri',self_uri,'l');
run; run;
/* abort or delete if file already exists */
%let force=%upcase(&force);
%local fileuri ;
%let fileuri=%mfv_getpathuri(&path/&name);
%mp_abort(iftrue=(%mf_isblank(&fileuri)=0 and &force ne YES)
,mac=MV_CREATEFILE
,msg=%str(File &path/&name already exists and force=&force)
)
options noquotelenmax; %if %mf_isblank(&fileuri)=0 and &force=YES %then %do;
%local base_uri; /* location of rest apis */ proc http method="DELETE" url="&base_uri&fileuri" &oauth_bearer;
%let base_uri=%mf_getplatform(VIYARESTAPI); headers
%if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var"
%end;
"Accept"="*/*";
run;
%put &sysmacroname DELETE &base_uri&fileuri;
%if &SYS_PROCHTTP_STATUS_CODE ne 204 %then %do;
%put &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%end;
%local url mimetype; %local url mimetype ext;
%let url=&base_uri/files/files?parentFolderUri=&self_uri; %let url=&base_uri/files/files?parentFolderUri=&self_uri;
%let ext=%upcase(%scan(&name,-1,.));
/* fetch job info */ /* fetch job info */
%local fname1; %local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
proc http method='POST' out=&fname1 &oauth_bearer in=&fref proc http method='POST' out=&fname1 &oauth_bearer in=&fref
%if "&ctype" = "0" %then %do; %if "&ctype" = "0" %then %do;
%let mimetype=%mf_mimetype(%scan(&name,-1,.)); %let mimetype=%mf_mimetype(&ext);
ct="&mimetype" ct="&mimetype"
%end; %end;
%else %do; %else %do;
ct="&ctype" ct="&ctype"
%end; %end;
%if "&mimetype"="text/html" %then %do; %if "&ext"="HTML" or "&ext"="CSS" or "&ext"="JS" or "&ext"="PNG"
or "&ext"="SVG" %then %do;
url="&url%str(&)typeDefName=file"; url="&url%str(&)typeDefName=file";
%end; %end;
%else %do; %else %do;
@@ -24385,18 +24437,25 @@ proc http method='POST' out=&fname1 &oauth_bearer in=&fref
%if &grant_type=authorization_code %then %do; %if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var" "Authorization"="Bearer &&&access_token_var"
%end; %end;
"Content-Disposition"= "&contentdisp filename=""&name""; name=""&name"";"; "Content-Disposition"=
%if "&ext"="SVG" %then %do;
"filename=""&name"";"
%end;
%else %do;
"&contentdisp filename=""&name""; name=""&name"";"
%end;
;
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &mdebug=1 %then %put &sysmacroname POST &=url
%put &=SYS_PROCHTTP_STATUS_PHRASE; &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201) %mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
,mac=&sysmacroname ,mac=MV_CREATEFILE
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%local libref2; %local libref2;
%let libref2=%mf_getuniquelibref(); %let libref2=%mf_getuniquelibref();
libname &libref2 JSON fileref=&fname1; libname &libref2 JSON fileref=&fname1;
%put Grabbing the follow on link ; /* Grab the follow on link */
data &outds; data &outds;
set &libref2..links end=last; set &libref2..links end=last;
if rel='createChild' then do; if rel='createChild' then do;
@@ -24405,10 +24464,8 @@ data &outds;
end; end;
run; run;
%put &sysmacroname: File &name successfully created:;%put; %put &sysmacroname: &name created at %mfv_getpathuri(&path/&name);%put;
%put &base_uri%mfv_getpathuri(&path/&name);%put;
%put &base_uri/SASJobExecution?_file=&path/&name;%put; %put &base_uri/SASJobExecution?_file=&path/&name;%put;
%put &sysmacroname:;
%mend mv_createfile;/** %mend mv_createfile;/**
@file mv_createfolder.sas @file mv_createfolder.sas
@@ -24459,7 +24516,7 @@ run;
%else %let dbg=*; %else %let dbg=*;
%if %mfv_existfolder(&path)=1 %then %do; %if %mfv_existfolder(&path)=1 %then %do;
%put &sysmacroname: &path already exists; %&dbg.put &sysmacroname: &path already exists;
data &outds; data &outds;
self_uri="%mfv_getpathuri(&path)"; self_uri="%mfv_getpathuri(&path)";
output; output;
@@ -24576,8 +24633,9 @@ options noquotelenmax;
'Content-Type'='application/vnd.sas.content.folder+json' 'Content-Type'='application/vnd.sas.content.folder+json'
'Accept'='application/vnd.sas.content.folder+json'; 'Accept'='application/vnd.sas.content.folder+json';
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=SYS_PROCHTTP_STATUS_PHRASE; %put &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201) %mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
,mac=&sysmacroname ,mac=&sysmacroname
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
@@ -25084,7 +25142,7 @@ options noquotelenmax;
%let path=%substr(&path,1,%length(&path)-1); %let path=%substr(&path,1,%length(&path)-1);
/* ensure folder exists */ /* ensure folder exists */
%put &sysmacroname: Path &path being checked / created; %&dbg.put &sysmacroname: Path &path being checked / created;
%mv_createfolder(path=&path) %mv_createfolder(path=&path)
%local base_uri; /* location of rest apis */ %local base_uri; /* location of rest apis */
@@ -25917,13 +25975,8 @@ run;
libname &libref1 clear; libname &libref1 clear;
%end; %end;
%put &sysmacroname: Job &name successfully created in &path; %put &sysmacroname: Job &name created! Check it out:;
%put &sysmacroname:; %put &url/SASJobExecution?_PROGRAM=&path/&name;
%put &sysmacroname: Check it out here:;
%put &sysmacroname:;%put;
%put &url/SASJobExecution?_PROGRAM=&path/&name;%put;
%put &sysmacroname:;
%put &sysmacroname:;
%mend mv_createwebservice; %mend mv_createwebservice;
/** /**
@@ -26039,13 +26092,15 @@ proc http method='GET' out=&fname1a &oauth_bearer
headers "Authorization"="Bearer &&&access_token_var"; headers "Authorization"="Bearer &&&access_token_var";
%end; %end;
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=sysmacroname &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%local libref1a; %local libref1a;
%let libref1a=%mf_getuniquelibref(); %let libref1a=%mf_getuniquelibref();
libname &libref1a JSON fileref=&fname1a; libname &libref1a JSON fileref=&fname1a;
%local uri found; %local uri found;
%let found=0; %let found=0;
%put Getting object uri from &libref1a..items; /* %put Getting object uri from &libref1a..items; */
data _null_; data _null_;
length contenttype name $1000; length contenttype name $1000;
set &libref1a..items; set &libref1a..items;
@@ -26150,8 +26205,7 @@ libname &libref1a clear;
options noquotelenmax; options noquotelenmax;
%local base_uri; /* location of rest apis */ %local base_uri; /* location of rest apis */
%let base_uri=%mf_getplatform(VIYARESTAPI); %let base_uri=%mf_getplatform(VIYARESTAPI);
/* fetch the members of the folder to get the uri */
%put &sysmacroname: fetching details for &path ;
%local fname1; %local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname1 &oauth_bearer
@@ -26171,7 +26225,7 @@ run;
) )
%end; %end;
%put &sysmacroname: grab the follow on link ; /* grab the follow on link */
%local libref1; %local libref1;
%let libref1=%mf_getuniquelibref(); %let libref1=%mf_getuniquelibref();
libname &libref1 JSON fileref=&fname1; libname &libref1 JSON fileref=&fname1;
@@ -26189,13 +26243,15 @@ proc http method='GET' out=&fname1a &oauth_bearer
headers "Authorization"="Bearer &&&access_token_var"; headers "Authorization"="Bearer &&&access_token_var";
%end; %end;
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=sysmacroname &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%local libref1a; %local libref1a;
%let libref1a=%mf_getuniquelibref(); %let libref1a=%mf_getuniquelibref();
libname &libref1a JSON fileref=&fname1a; libname &libref1a JSON fileref=&fname1a;
%local uri found; %local uri found;
%let found=0; %let found=0;
%put Getting object uri from &libref1a..items; /* %put Getting object uri from &libref1a..items; */
data _null_; data _null_;
length contenttype name $1000; length contenttype name $1000;
set &libref1a..items; set &libref1a..items;
@@ -26221,7 +26277,7 @@ run;
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%end; %end;
%else %put &sysmacroname: &path/&name successfully deleted; %else %put &sysmacroname: &path/&name deleted;
/* clear refs */ /* clear refs */
filename &fname1 clear; filename &fname1 clear;
@@ -26230,8 +26286,8 @@ filename &fname1a clear;
libname &libref1a clear; libname &libref1a clear;
%mend mv_deletejes;/** %mend mv_deletejes;/**
@file mv_deleteviyafolder.sas @file
@brief Creates a viya folder if that folder does not already exist @brief Deletes a viya folder
@details If not running in Studo 5 +, will expect an oauth token in a global @details If not running in Studo 5 +, will expect an oauth token in a global
macro variable (default ACCESS_TOKEN). macro variable (default ACCESS_TOKEN).

View File

@@ -33,7 +33,8 @@
LUA, you can also use this macro: mp_gsubfile.sas LUA, you can also use this macro: mp_gsubfile.sas
@param [in] infile The QUOTED path to the file on which to perform the @param [in] infile The QUOTED path to the file on which to perform the
substitution substitution. Note that you can extract the pathname from a fileref using
the pathname function, eg: `"%sysfunc(pathname(fref))"`;
@param [in] findvar= Macro variable NAME containing the string to search for @param [in] findvar= Macro variable NAME containing the string to search for
@param [in] replacevar= Macro variable NAME containing the replacement string @param [in] replacevar= Macro variable NAME containing the replacement string
@param [out] outfile= (0) Optional QUOTED path to the adjusted output file (to @param [out] outfile= (0) Optional QUOTED path to the adjusted output file (to

View File

@@ -23,7 +23,7 @@ data _null_;
put 'hello testings'; put 'hello testings';
run; run;
%mp_assertscope(SNAPSHOT) %mp_assertscope(SNAPSHOT)
%mv_createfile(path=&mcTestAppLoc/temp, name=&file..txt,inref=somefile,mdebug=1) %mv_createfile(path=&mcTestAppLoc, name=&file..txt,inref=somefile,mdebug=1)
%mp_assertscope(COMPARE %mp_assertscope(COMPARE
,ignorelist=MCLIB0_JADP1LEN MCLIB0_JADP2LEN MCLIB0_JADPNUM ,ignorelist=MCLIB0_JADP1LEN MCLIB0_JADP2LEN MCLIB0_JADPNUM
MCLIB0_JADVLEN MCLIB2_JADP1LEN MCLIB0_JADVLEN MCLIB2_JADP1LEN
@@ -32,7 +32,7 @@ run;
) )
%mp_assert( %mp_assert(
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/&file..txt)=1), iftrue=(%mfv_existfile(&mcTestAppLoc/&file..txt)=1),
desc=Check if created file exists desc=Check if created file exists
) )
@@ -42,10 +42,10 @@ data _null_;
file f2; file f2;
put '<html><body><p>Hello world</p></body></html>'; put '<html><body><p>Hello world</p></body></html>';
run; run;
%mv_createfile(path=&mcTestAppLoc/temp, name=test.html,inref=f2,mdebug=1) %mv_createfile(path=&mcTestAppLoc, name=test.html,inref=f2,mdebug=1)
%mp_assert( %mp_assert(
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/test.html)=1), iftrue=(%mfv_existfile(&mcTestAppLoc/test.html)=1),
desc=Check if created file exists desc=Check if created file exists
) )
@@ -55,10 +55,10 @@ x=1;
run; run;
filename ds "%sysfunc(pathname(work))/temp.sas7bdat"; filename ds "%sysfunc(pathname(work))/temp.sas7bdat";
%mv_createfile(path=&mcTestAppLoc/temp, name=&file..sas7bdat,inref=ds,mdebug=1) %mv_createfile(path=&mcTestAppLoc, name=&file..sas7bdat,inref=ds,mdebug=1)
%mp_assert( %mp_assert(
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/&file..sas7bdat)=1), iftrue=(%mfv_existfile(&mcTestAppLoc/&file..sas7bdat)=1),
desc=Check if created dataset exists desc=Check if created dataset exists
) )
@@ -68,19 +68,44 @@ data _null_;
file f4; file f4;
put '%put hello FromSASStudioBailey; '; put '%put hello FromSASStudioBailey; ';
run; run;
%mv_createfile(path=&mcTestAppLoc/temp, name=test4.sas,inref=f4,mdebug=1) %mv_createfile(path=&mcTestAppLoc, name=test4.sas,inref=f4,mdebug=1)
%mp_assert( %mp_assert(
iftrue=(%mfv_existfile(&mcTestAppLoc/temp/test4.sas)=1), iftrue=(%mfv_existfile(&mcTestAppLoc/test4.sas)=1),
desc=Check if created sas program exists desc=Check if created sas program exists
) )
%put TEST 5 - reading from files service and writing back; %put TEST 5 - reading from files service and writing back;
filename sendfrom filesrvc folderpath="&mcTestAppLoc/temp" filename='test4.sas'; filename sendfrom filesrvc folderpath="&mcTestAppLoc" filename='test4.sas';
OPTIONS MERROR SYMBOLGEN MLOGIC MPRINT; OPTIONS MERROR SYMBOLGEN MLOGIC MPRINT;
%mv_createfile(path=&mcTestAppLoc/temp,name=test5.sas,inref=sendfrom,mdebug=1) ; %mv_createfile(path=&mcTestAppLoc,name=test5.sas,inref=sendfrom,mdebug=1) ;
%put TEST 6 - try the find and replace;
filename f6 temp;
data _null_;
file f6;
put '//Hello world!';
put 'let var=/some/path/name;';
run;
%let in=/some/path/name;
%let out=/final/destination;
%mv_createfile(path=&mcTestAppLoc, name=test6.js,inref=f6,mdebug=1,swap=in out)
filename getback filesrvc folderpath="&mcTestAppLoc" filename='test6.js';
%let test6=0;
data _null_;
infile getback;
input;
if _infile_="let var=&out;" then call symputx('test6',1);
putlog _infile_;
run;
%mp_assert(
iftrue=(&test6=1),
desc=Check if find & replace worked
)

View File

@@ -17,6 +17,20 @@
run; run;
%mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile) %mv_createfile(path=/Public/temp,name=newfile.txt,inref=myfile)
The macro also supports find & replace (used by the SASjs Streaming App
build program). This allows one string to be replaced by another at the
point at which the file is created. This is done by passing in the NAMES of
the macro variables containing the values to be swapped, eg:
filename fref temp;
data _null_;
file fref;
put 'whenever life gets you down, Mrs Brown..';
run;
%let f=Mrs Brown;
%let r=just remember that you're standing on a planet that's evolving;
%mv_createfile(path=/Public,name=life.md,inref=fref,fin,swap=f r)
@param [in] path= The parent (SAS Drive) folder in which to create the file @param [in] path= The parent (SAS Drive) folder in which to create the file
@param [in] name= The name of the file to be created @param [in] name= The name of the file to be created
@@ -38,6 +52,8 @@
@li sas_services @li sas_services
@param [in] force= (YES) Will overwrite (delete / recreate) files by default. @param [in] force= (YES) Will overwrite (delete / recreate) files by default.
Set to NO to abort if a file already exists in that location. Set to NO to abort if a file already exists in that location.
@param pin] swap= (0) Provide two macro variable NAMES that contain the values
to be swapped, eg swap=find replace (see also the example above)
@param [out] outds= (_null_) Output dataset with the uri of the new file @param [out] outds= (_null_) Output dataset with the uri of the new file
@param [in] mdebug= (0) Set to 1 to enable DEBUG messages @param [in] mdebug= (0) Set to 1 to enable DEBUG messages
@@ -51,6 +67,7 @@
@li mfv_getpathuri.sas @li mfv_getpathuri.sas
@li mp_abort.sas @li mp_abort.sas
@li mp_base64copy.sas @li mp_base64copy.sas
@li mp_replace.sas
@li mv_createfolder.sas @li mv_createfolder.sas
<h4> Related Macros</h4> <h4> Related Macros</h4>
@@ -69,6 +86,7 @@
,mdebug=0 ,mdebug=0
,outds=_null_ ,outds=_null_
,force=YES ,force=YES
,swap=0
); );
%local dbg; %local dbg;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
@@ -113,6 +131,12 @@
%end; %end;
%else %put %str(ERR)OR: invalid value for intype: &intype; %else %put %str(ERR)OR: invalid value for intype: &intype;
%if "&swap" ne "0" %then %do;
%mp_replace("%sysfunc(pathname(&fref))"
,findvar=%scan(&swap,1,%str( ))
,replacevar=%scan(&swap,2,%str( ))
)
%end;
%if &mdebug=1 %then %do; %if &mdebug=1 %then %do;
data _null_; data _null_;
@@ -157,26 +181,29 @@ run;
%end; %end;
"Accept"="*/*"; "Accept"="*/*";
run; run;
%put &sysmacroname DELETE &base_uri&fileuri %put &sysmacroname DELETE &base_uri&fileuri;
&=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE; %if &SYS_PROCHTTP_STATUS_CODE ne 204 %then %do;
%put &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%end; %end;
%local url mimetype; %local url mimetype ext;
%let url=&base_uri/files/files?parentFolderUri=&self_uri; %let url=&base_uri/files/files?parentFolderUri=&self_uri;
%let ext=%upcase(%scan(&name,-1,.));
/* fetch job info */ /* fetch job info */
%local fname1; %local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
proc http method='POST' out=&fname1 &oauth_bearer in=&fref proc http method='POST' out=&fname1 &oauth_bearer in=&fref
%if "&ctype" = "0" %then %do; %if "&ctype" = "0" %then %do;
%let mimetype=%mf_mimetype(%scan(&name,-1,.)); %let mimetype=%mf_mimetype(&ext);
ct="&mimetype" ct="&mimetype"
%end; %end;
%else %do; %else %do;
ct="&ctype" ct="&ctype"
%end; %end;
%if "&mimetype"="text/html" or "&mimetype"="text/css" %if "&ext"="HTML" or "&ext"="CSS" or "&ext"="JS" or "&ext"="PNG"
or "&mimetype"="text/javascript" %then %do; or "&ext"="SVG" %then %do;
url="&url%str(&)typeDefName=file"; url="&url%str(&)typeDefName=file";
%end; %end;
%else %do; %else %do;
@@ -187,9 +214,16 @@ proc http method='POST' out=&fname1 &oauth_bearer in=&fref
%if &grant_type=authorization_code %then %do; %if &grant_type=authorization_code %then %do;
"Authorization"="Bearer &&&access_token_var" "Authorization"="Bearer &&&access_token_var"
%end; %end;
"Content-Disposition"= "&contentdisp filename=""&name""; name=""&name"";"; "Content-Disposition"=
%if "&ext"="SVG" %then %do;
"filename=""&name"";"
%end;
%else %do;
"&contentdisp filename=""&name""; name=""&name"";"
%end;
;
run; run;
%put &sysmacroname POST &=url %if &mdebug=1 %then %put &sysmacroname POST &=url
&=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE; &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201) %mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
,mac=MV_CREATEFILE ,mac=MV_CREATEFILE
@@ -198,7 +232,7 @@ run;
%local libref2; %local libref2;
%let libref2=%mf_getuniquelibref(); %let libref2=%mf_getuniquelibref();
libname &libref2 JSON fileref=&fname1; libname &libref2 JSON fileref=&fname1;
%put Grabbing the follow on link ; /* Grab the follow on link */
data &outds; data &outds;
set &libref2..links end=last; set &libref2..links end=last;
if rel='createChild' then do; if rel='createChild' then do;
@@ -207,9 +241,7 @@ data &outds;
end; end;
run; run;
%put &sysmacroname: File &name successfully created:;%put; %put &sysmacroname: &name created at %mfv_getpathuri(&path/&name);%put;
%put &base_uri%mfv_getpathuri(&path/&name);%put;
%put &base_uri/SASJobExecution?_file=&path/&name;%put; %put &base_uri/SASJobExecution?_file=&path/&name;%put;
%put &sysmacroname:;
%mend mv_createfile; %mend mv_createfile;

View File

@@ -47,7 +47,7 @@
%else %let dbg=*; %else %let dbg=*;
%if %mfv_existfolder(&path)=1 %then %do; %if %mfv_existfolder(&path)=1 %then %do;
%put &sysmacroname: &path already exists; %&dbg.put &sysmacroname: &path already exists;
data &outds; data &outds;
self_uri="%mfv_getpathuri(&path)"; self_uri="%mfv_getpathuri(&path)";
output; output;
@@ -164,8 +164,9 @@ options noquotelenmax;
'Content-Type'='application/vnd.sas.content.folder+json' 'Content-Type'='application/vnd.sas.content.folder+json'
'Accept'='application/vnd.sas.content.folder+json'; 'Accept'='application/vnd.sas.content.folder+json';
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=SYS_PROCHTTP_STATUS_PHRASE; %put &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201) %mp_abort(iftrue=(&SYS_PROCHTTP_STATUS_CODE ne 201)
,mac=&sysmacroname ,mac=&sysmacroname
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)

View File

@@ -122,7 +122,7 @@ options noquotelenmax;
%let path=%substr(&path,1,%length(&path)-1); %let path=%substr(&path,1,%length(&path)-1);
/* ensure folder exists */ /* ensure folder exists */
%put &sysmacroname: Path &path being checked / created; %&dbg.put &sysmacroname: Path &path being checked / created;
%mv_createfolder(path=&path) %mv_createfolder(path=&path)
%local base_uri; /* location of rest apis */ %local base_uri; /* location of rest apis */
@@ -955,12 +955,7 @@ run;
libname &libref1 clear; libname &libref1 clear;
%end; %end;
%put &sysmacroname: Job &name successfully created in &path; %put &sysmacroname: Job &name created! Check it out:;
%put &sysmacroname:; %put &url/SASJobExecution?_PROGRAM=&path/&name;
%put &sysmacroname: Check it out here:;
%put &sysmacroname:;%put;
%put &url/SASJobExecution?_PROGRAM=&path/&name;%put;
%put &sysmacroname:;
%put &sysmacroname:;
%mend mv_createwebservice; %mend mv_createwebservice;

View File

@@ -111,13 +111,15 @@ proc http method='GET' out=&fname1a &oauth_bearer
headers "Authorization"="Bearer &&&access_token_var"; headers "Authorization"="Bearer &&&access_token_var";
%end; %end;
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=sysmacroname &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%local libref1a; %local libref1a;
%let libref1a=%mf_getuniquelibref(); %let libref1a=%mf_getuniquelibref();
libname &libref1a JSON fileref=&fname1a; libname &libref1a JSON fileref=&fname1a;
%local uri found; %local uri found;
%let found=0; %let found=0;
%put Getting object uri from &libref1a..items; /* %put Getting object uri from &libref1a..items; */
data _null_; data _null_;
length contenttype name $1000; length contenttype name $1000;
set &libref1a..items; set &libref1a..items;

View File

@@ -69,8 +69,7 @@
options noquotelenmax; options noquotelenmax;
%local base_uri; /* location of rest apis */ %local base_uri; /* location of rest apis */
%let base_uri=%mf_getplatform(VIYARESTAPI); %let base_uri=%mf_getplatform(VIYARESTAPI);
/* fetch the members of the folder to get the uri */
%put &sysmacroname: fetching details for &path ;
%local fname1; %local fname1;
%let fname1=%mf_getuniquefileref(); %let fname1=%mf_getuniquefileref();
proc http method='GET' out=&fname1 &oauth_bearer proc http method='GET' out=&fname1 &oauth_bearer
@@ -90,7 +89,7 @@ run;
) )
%end; %end;
%put &sysmacroname: grab the follow on link ; /* grab the follow on link */
%local libref1; %local libref1;
%let libref1=%mf_getuniquelibref(); %let libref1=%mf_getuniquelibref();
libname &libref1 JSON fileref=&fname1; libname &libref1 JSON fileref=&fname1;
@@ -108,13 +107,15 @@ proc http method='GET' out=&fname1a &oauth_bearer
headers "Authorization"="Bearer &&&access_token_var"; headers "Authorization"="Bearer &&&access_token_var";
%end; %end;
run; run;
%put &=SYS_PROCHTTP_STATUS_CODE; %if &SYS_PROCHTTP_STATUS_CODE ne 200 %then %do;
%put &=sysmacroname &=SYS_PROCHTTP_STATUS_CODE &=SYS_PROCHTTP_STATUS_PHRASE;
%end;
%local libref1a; %local libref1a;
%let libref1a=%mf_getuniquelibref(); %let libref1a=%mf_getuniquelibref();
libname &libref1a JSON fileref=&fname1a; libname &libref1a JSON fileref=&fname1a;
%local uri found; %local uri found;
%let found=0; %let found=0;
%put Getting object uri from &libref1a..items; /* %put Getting object uri from &libref1a..items; */
data _null_; data _null_;
length contenttype name $1000; length contenttype name $1000;
set &libref1a..items; set &libref1a..items;
@@ -140,7 +141,7 @@ run;
,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE) ,msg=%str(&SYS_PROCHTTP_STATUS_CODE &SYS_PROCHTTP_STATUS_PHRASE)
) )
%end; %end;
%else %put &sysmacroname: &path/&name successfully deleted; %else %put &sysmacroname: &path/&name deleted;
/* clear refs */ /* clear refs */
filename &fname1 clear; filename &fname1 clear;