From 58102f6e598ed0c7496ef9e63ca81bb2b03d5b48 Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 10:45:56 +0200 Subject: [PATCH 1/9] Implement get_info --- R/compression.R | 20 ++++++++------------ R/sysdata.rda | Bin 2236 -> 2244 bytes R/utils.R | 43 +++++++++++++++++++++++++++++++------------ data-raw/single.json | 2 +- 4 files changed, 40 insertions(+), 25 deletions(-) diff --git a/R/compression.R b/R/compression.R index f0691f6..3570042 100644 --- a/R/compression.R +++ b/R/compression.R @@ -1,18 +1,14 @@ find_compress <- function(f) { if (grepl("zip$", f)) { - file <- sub("\\.zip$", "", f) - compress <- "zip" - } else if (grepl("tar\\.gz$", f)) { - file <- sub("\\.tar\\.gz$", "", f) - compress <- "tar" - } else if (grepl("tar$", f)) { - file <- sub("\\.tar$", "", f) - compress <- "tar" - } else { - file <- f - compress <- NA_character_ + return(list(file = sub("\\.zip$", "", f), compress = "zip")) + } + if (grepl("tar\\.gz$", f)) { + return(list(file = sub("\\.tar\\.gz$", "", f), compress = "tar")) + } + if (grepl("tar$", f)) { + return(list(file = sub("\\.tar$", "", f), compress = "tar")) } - return(list(file = file, compress = compress)) + return(list(file = f, compress = NA_character_)) } compress_out <- function(cfile, filename, type = c("zip", "tar", "gzip", "bzip2", "xz")) { diff --git a/R/sysdata.rda b/R/sysdata.rda index 32dc042681c27cbf09456657a3bd165b22c642b5..b932bbaefa268186504cd5b70f13f7a9f20d1b9a 100644 GIT binary patch delta 2236 zcmV;t2t)V05yTM=LRx4!F+o`-Q(3it1^JNnA%_-?mN$O+(0004yXaE3cG&BLAM9HR_nl(>Q z^)w!!00000003wJ00Abbl-fz=s685+O-79|8UO*KKm$ND0000Yik_78)i$S~)OwFX zG=JKf8%N1O(9i$?00E##pn#fbpdix{ZA_-fPf0hSPt`V2wLDP74XNn|>Vq{O zs#vN!^mHPEqd~bOft?B~ZUI5zS0XRk1V}wNzdAAJ^?og)Er57G*~oxgg%z9_Nd$l; zVI%+?uWC&{Ew2k6HI`+MkEPTZOVf4nW>Z{T%#tc8-x)CgxXDpl(CeOC4YVO z%&KiRpX_SE%VK~Hin8cHWmt?OuU@>H2$`v_yshClg}S&YQ4~T4PIg9$0EY-Y)`$^oZ!V1VjHl|WZGRU9`K|%_m zs0hfQpv6=KMnWtg0>Tmt2rN(_vPiNhC_q&d77;*16l?_+kN}o8b2N~GhLT5hM+bek zaX}r?pri51OTfwMG}#Uo99n5-f>n~fqwSD z40zTp0gsj#B7m0?U$qj;{X-2c)6bZVQiUj)p-~o5q9~?acqq9c5Hf4xIuXaP zR)&O7RIp$y@>mu%47A^*nKnEPYR-y`RFrcZ5RDBP6yQLhDhm+Uq^`t9qKTE*E8vX3y?SK764&JK#hfz}8%0EqUe|gDctTDQcyI9OT|}K);g^0ZGhKYZe1#w*qTUgZjg5D`mvk>`JV*(# zb{-)p$c@f!AR9s@cE@D%!ZFAmTw#d9@uQ@kU$;Fe5^25=9wizcZ+{mx2--}dsPUd% zBS#K$zDwnjs8%zxsSwYU4O@U}8g0#06<1rtRBJ_wF^NviWkp6KS+>Ykl2Aip2_dv7 zE3p_6698ZF`F92ZfVMD#plF?9tUm9N_s{jOS_+~JkUOl32@n!35$YAo4CwZR(dD!B z94Fc%dPaYClKYe($bS%nV6sva5(;Sy37}#jo=d@ew4uR8Ht>)&jR^wwZd20{SP30S zbWz&-Lw&8C4VZ176E3sajQgrJxNhNeDuY=z$u$xZ3I{AN^Mk!IEfWKAlL5^^%@T;+TN7{-QNCowimebNo1aHgGOy_;~?FN1-TZ)-54P@JW`uwslt zg1ok5B%w6m6y{5^aUd7NNXilNNti(K#xj36b7fT_3$n*+RLMz8!;N34S!lO!>FS;bSaM=rpcsdV}#?Vg36LZ zi%DI3p@%m?g@l)D#K8ohG!l$(Q~2c8BcW*~wJoqUA6oaof;=UExMdYC*Jb@o1T^%} zdTLVCszoR?ZfbADtv;Whr?q>?atl4pR*EX(QR$080GQDnw5l!vIk+Ag39C#q9R=dBlRSRF@FH13sn~C83200>?%@ z&O1UWtCp2AeM*Heu3%143CqPq3LxrnX`o z-Xjj!(9FMrUM zO+l=cI%^v&d2dUcj51lgSx_DNaa39@A?oHhv>}6eyyktzBeUJ*`;qAvWHYSIv5Z6{ zFp!u=SV$D&Y9$=@NDLR9ER+_|ngJ>hQ(IEnph_eLIKl&p&={bO1!~{VjSz$586?dn z_PVVsp%ezVf$2TmiIImQH+DxQVI^_cXhq0(YKJJxIuB967bRMWr;h_7?a}>D{x0N- KaG@b;{tNQU`^3Hg delta 2228 zcmV;l2ut_G5xfx&LRx4!F+o`-Q&}3{pgWNcB7ghn=XPKnH1A+@unh{VB_dPFGGz5V zMw?S7sp@SsMwtL;8USR_G|{6&YG?owMNEv+pQ$}3qtzyjFpQdL27nEtL}4-pgF`?z zh(yT9nKe&P^)w!!XaEL)02%-WfBN9vQ6 zNA_b^69qt2AD@P(9%S9y#7pTdq#^D4(p*E9Yr7Q{(C6_IeD}S3! zr}`SSa^9c=Vz9mt8D2ve?%lgK@+OK|W_IzMLhW2sOB6x_nTs}n9kbrkxIk^)CNi|C zS?`S`DcVE?1aNEMEFxo?*8u@VQaETiB#iRReg2D?HNDCy3B7%ekQ9)r81VKi?QE31PV9s_VAgQF0@~qQ8@HNgr>wk6a7Rr}#sF(#d-cvDx!A!C?SuICw)gr#JVKVDQY!? zuAX2SLKRBixas2%)9x!US}ej~>>V)~btsZ4ybqU&(|p`7>k%-Nihsj~iGYb3I*Rlj zEER)jt5%5vvO$Zlj6qGAYEY#sW5ifCQpFg=t*a%1qY<)hG8QsQ5ZQuAZHfx)#soyX z7d(Dl*?3?rrVv#P6R=hX?D?Mg{mbn^TtSiteX&6z0!6|wiYoQ=dV+L!A?Py>5gJJs z_atP+JFw%sFf5e{5`PM43<;cIA%vE~;h0gPif&&ZYMIgnySWccMPMX!;nGKM?F{`~ z*ma?}cuzMn`(A7k6&HIB^2TiDM`;DQ3>hHs2A`lku!ECGsHe=~JN~P(d9UaXMufJ3 zmSt$})JTpekr6_KVN@W(EI|YzLOn>liWrF;*-|{>C3@IziGNLt_=VzJwX6}~3gwPe z!rgVDt-LCeT!%|Kz8{J1VAIh!PN+mvl~{P86!D@VLRJt#H57<35K0sC8RC#wfD0IH zuzoaoWC#9543{6+f+8Xp_+%xKc<*0@z#oUq;13CcK~F$s)s@JAiF22g@flMBz=D=} z1dpV+2fgdEd`r0fo=j+TKba_LhNBThyK7YcMi!5B z*ZF$AXN@*BJ?W*q76|knF%kgME|dt&>W5JihPQmyqF}S8=+sNWjmHTV+_;}qE@?8T zQ4pb;rEH|gv`c(aG1EqcoWHa3eP#SwiehAD6bbrf384mhD6&O~oUrWt~= zp|+Kw_kXidiO~BEd;wSkNS=;P%_yi|UFPONFj>&=EdiXJSC@@T)QG4NfZ#DOy&MX( z+q^;}8_{{FB}RCGF_0kG-2w*G8-z5(b=S!>Tr{YS>4Sh!BCD|GYdOkFe zO4agY2=yc3P-=V6R}$JD?V9vP)(t);r7^#zqklNmRx4*z&@f?yln8}-)Lm^SOhX@TRgNWwJOm> z96XIp_?5@w^7VRGxQ7_HGL1E-zHB+CPWm##A5b)di>%+U@8}o%Zb6Mh3RmxsUTQYhbxaDMKyZT zrgf>Q1(E`ih)!NApj8K3i%l1F9L~gCT3p1n@`tex(-g)*8%jQP>9r!oI+=FQ|q z*DGyYsh4F|`(lG~U^0y2M@8uDKzR+0@_z_`#z8POq+X8y*_7qLt!0OFNksYynk3lV zmo-Ze7AzEnlv6R)0>&+qbSgQ8w2WCc*r`asBSQM7M3xNJnqvmWnm}hx`LQF9`q*}D z;7Nv5a3cXsi*@AaXfzB-U<*BAL-JY})Gd`^#*R}U1))IU8b@du^ZAm^s5cU&W`CAi z^W{sxMj5T>7IX)8oRyagNPV2<%uqpddS)FW`LW>F^Fydjio-Ki5s+ZU3_HStXktdK z$db&UFxR1M@<>V|I6*3qQtK^f$}Lz>jg>=W#24xq<>{-fy@gYrC8(NChPv)8sTBt3 zf%PAsjWRIfM=xx1SQnkA3NJ&BTOH_(Lr}zY0x43h66szmUVI-@{x0N-aG@YIzd&}D CzT9&F diff --git a/R/utils.R b/R/utils.R index 416a70e..b7b105a 100644 --- a/R/utils.R +++ b/R/utils.R @@ -9,24 +9,43 @@ #' get_ext("https://github.com/ropensci/readODS/raw/v2.1/starwars.ods") #' @export get_ext <- function(file) { - if (!is.character(file)) { - stop("'file' is not a string") + get_info(file)$ext +} + +get_info <- function(file) { + .check_file(file, single_only = TRUE) + if (tolower(file) == "clipboard") { + return(.query_format_by_ext(ext = "clipboard", file = "clipboard")) } if (!grepl("^http.*://", file)) { - fmt <- tools::file_ext(file) - } else if (grepl("^http.*://", file)) { + ext <- tolower(tools::file_ext(file)) + } else { parsed <- strsplit(strsplit(file, "?", fixed = TRUE)[[1]][1], "/", fixed = TRUE)[[1]] - file <- parsed[length(parsed)] - fmt <- tools::file_ext(file) - get_type(fmt) + url_file <- parsed[length(parsed)] + ext <- tolower(tools::file_ext(url_file)) } - if (file == "clipboard") { - return("clipboard") - } else if (fmt == "") { + if (ext == "") { stop("'file' has no extension", call. = FALSE) - } else { - return(tolower(fmt)) } + return(.query_format_by_ext(ext = ext, file = file)) +} + +.query_format_by_ext <- function(ext, file) { + unique_rio_formats <- unique(rio_formats[,c(-8)]) + if (file == "clipboard") { + output <- as.list(unique_rio_formats[unique_rio_formats$format == "clipboard",]) + output$file <- file + output$ext <- "clipboard" ## for backward compatibility with <= 0.5.30 + return(output) + } + ## TODO google sheets + matched_formats <- unique_rio_formats[unique_rio_formats$input == ext, ] + if (nrow(matched_formats) == 0) { + return(list(ext = ext, format = NA, format_name = NA, import_function = NA, export_function = NA, file = file)) + } + output <- as.list(matched_formats) + output$file <- file + return(output) } get_type <- function(fmt) { diff --git a/data-raw/single.json b/data-raw/single.json index 8254e7c..b58a884 100644 --- a/data-raw/single.json +++ b/data-raw/single.json @@ -270,7 +270,7 @@ "note": "" }, { - "input": "csv", + "input": "googlesheets", "format": "csv", "ext": "", "type": "import", From 44b993bf34b4b595fbd058d8d19c2dc6d7cd5a9f Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 11:04:39 +0200 Subject: [PATCH 2/9] fix data --- R/sysdata.rda | Bin 2244 -> 2248 bytes data-raw/single.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index b932bbaefa268186504cd5b70f13f7a9f20d1b9a..04a078805499d41bda0d777028436ff04b4c297c 100644 GIT binary patch delta 2245 zcmV;$2s-z~5y%k^LRx4!F+o`-Q(1V`QdN--9e>sJ@$NXI;LY~;H0ygc?_tq)&?M`- zaFj_;D9N=mQKn3ur>ONkA*O&DXlbAs00w~Cng9fmNuy+*r1a3znq&ji41o18Luvp3 z8Zi%02c!`)X{M%)Q`9|82dDr5000008UO$QNvM=$r>Cf+^-n47Q`CBysiSHD0}ucJ zG=Bg903uSFhEb!^GCfVHqtx1(4Ak`*8Zv0a(0YbLA&I6zra(xbfSD($f-yAE)X2zB zNP3x1)icyI(@4`m+MbYps54RerG-)c)bu4nqfp||pcY~(*McDAVo*i=K@uBzzrKw4 z?tZJHEr2k8tfB#n5mxBPLO@_-2na@+9)H^XQJz{jIAcDK&+gO2qURAx%tLx6aiEy2 zy%PKsM;fYB6I6YbQc@;Ns8p-#0iG7zs4<@jV^o){W&^s0)dj^Q8nS|@DI#RTn}-AM zPDMx0h`M2uIVin_;@SOs7CXxlq1FPIrDh=spI&!WCc3uAQ^YW7xzMu?MZeQ6Qh$Vt z)MVDdYN1Rb$f2B^CPoZ#actCQsf!u$(16OZ7)M^cd)o+^DXzWt@SH;3 z92BUEAp@s7BSip1gdXce2iw#$t1?xDBT)*6kpTfZSHe*;BUimZfTGD1X>^iCiKkXP zSvsg2f@)hVPH;(B0-`ZQMYBbj2!CP%2nf>iqOlRKq`;XeSU4Egj2zOn*7Ouc`YH(l z1=lL4i*}7(#}~{OC3k61!uvdEpr34=ymoVSjkh(oZkjo|K6+ z-v|#9jSn}AnuKj8QB-)(E|H^$IbS96$y6&D+0=+<$_A~#H4QfAs*0(Uh~mi|?Q*~pH<2DCIXLCzWc z;p~JQnneXa12N+IEyeNOxIH-qs0?!|M}~q#a6HJ0C0%Q(LVwZ)LK3gXhK0c)gQJQ= zvO^k8CdicOU(7BN+fuz8;Z(53m|4S88r7LoHO6?^)9&;=Y#Mnd3DF3Oa-#nvBAyhY z6q2lh38j3Tlw%oH#*I`VL?pUtNJ7q3 zE(9@9eiWRFa*W!s!A1&X=OPmhdBmKJ{cD`BfMXcY%Y<|zr0V+yb)KSHsTbF7BXOJ; z3W3?zK_xLBB(iwT(TGs5md)gpPP78N$)^6q12E?~f`30Gqx9|WEHUo#;2xB9hmc47 zK@FaTO+w`+k;fZ#+>RrtW});Y0K~VidtkoEM+)N>;5_uxFNshEg6W_}oMf1jdkdBxH#vsT(}T)IoLg?$(}BEa^pvY;6_8f+G1- z3=+x}P=8XmOuSJ-J$z``jSM$}qJg%RRtMhA1_tNoIC6zx4I+6s{Tb0fy7n5`1i@rO zxUdFs^xRxEF62c(j0XWC8bgw270`q(^oEA;#!2G@M52^#kb$8Fu?;aDRdLN0jVe*G zFmMV&Dyq&-F)3cO&YK%U$?v8?D;IkpN2MO>1AjxGFa8XsTe%y zK7S56C_F=14E&tSCqxj>@gb?!cr+KJk6&Z~EO{hUh@M%70HR_+P38j^ui4e}2?b!O zE+LNtE`}E+nS}`gzKiy_@q|-XEb3(Xl@ki)1mzH%yp%wq4yP8HE!=WC(P?3865-k& zv_91oK^lr*GVQS<%l{D=cE@{r%!_TZ#ecPxV^(`2gIZuRmT)6=$m>9PjV|H{fX4*D z;Yhh2FP|B<@}-U*5hWAOOvxsTiP2Kf7AzEn(M;b|3mCUG3XVp!yG=@yEUtp`G}oxJ z94X&MA_^&_2KskRi5y?vv#(ZEm}5p%UMZ1otXrB4gA!MQ->4}&Yz!zCnlIu;(|-^J zfk&e!t% delta 2241 zcmV;y2tN175yTM=LRx4!F+o`-Q(3it1^JN<9e>n#?~W+=GbdqAw`_)z0Fcln5>v`D zZA{c@lP9U_Jx@q!paz;6Xa+z5pf;v}0hH9HPt7UmPf6-z00001kZ1q^Xf!kdphU^0 znwm9FQ1vt(pa1{>0001J0003dsFd1C=BPayn@vWIF&Y2?qd)^dGynhqB8r}r^wl<} zpnueQk3uxsnj1||QKzWUpwQ3&0004?NT7h4X`mp}5^YST$WKW(p-fIhUh+xxmp;$Q({+X$iBwV8=svCq6287y8hJTc? zl#(TV^~|bmHlOTj!OLQR4T`epKxJ5rBd=b(n+TbyuDq?`IEA{nDNz(c2TpcIiU5ZQ zJ=Ta1x2R`UWUB~9q7@G!0s?fegra0duX=$2MUp7e=_HL4PONycbx=11)V5fh;F7Qf zL}G}GW{WZq!~_r#rRPOrBV9>>GJjIAa51eIIi;*FH~~i@DhU9B?7|AjLN=ySNixWw z3PC~&qNoVSprFN61V%zEAOgY?3kWPwAhJlZC@4Tx6c!OcL=w%w{bxo(V(O8%1gk>>NMF7793h>XM$CdzN77=EvlqsWz&Ek85Ywkd4Dx+aYxMB z%}(N;=L~q(Edh^~7$Sg|5?{3v%z6fY^8G^%Ez{4KjZ%dunW0e@QKBfOU3e(DArLZa z;yMw>uvUhIP*kvBEb>?uH4L=hq?tB64QkGcj8v3!91x8S85H0^pehRx*rcw+Mxu$8 z*yR*hnPE@C2m@C#tUf;9v40x{$AI52Y5nG5qNL#>0LyfTH%*|D>Geuz%C3eST^TIL69$aCF!ttY|o?o{;DH3VE5Pu#e8Xj*KH3-^F zqNwqnT_Z;ha=uIDlBiZQv#Aizlnq;eY8q|LRTWoT#8hiViZO{!&1FSKBU!e{RgzFc zVhJI%C@ZlT5fcDk@%eWK0f4qJf}m)fVyr&zk@wH_uUZPC43ImliU|-BEfMM!%M9rD zgwf@*^c*MJBYH-Ec7Kxllpx3ugJ7~!6cP$)3<;oOA)ZUYe6*p#MKMcc#Cm|S3AGNgCvBu4|th@nC-q7Y#gAc7E~9+X@~41Yw9Thct@C3506M5l>= zFt|%~OBy-CsbP9yXAMYek3yzvY4bCu;pTeSH1kdqq7fA3Mn4oHo)n@KlB|LWsH8#! zm721eHk2$t3m`P?BbuE00lt-&Gf$xeL_{v=kd`3v+`kJzKM#?dIt*zAK7hYf?nDGj zn7FHey)Y{XDSu^By z;2F7J1sExloQO<0=Mr)<>s;l00~p4JTqiL$OnuS~qj093W4)Vj*Dr&ClW%J6<=to$1gnz^k+2&N#F99@- zvA12w2|U285n{ZwOCzHZl>XoN&sIRNG1(%LJCTOgP$$afY1&Am4l4NKOD zs1bnRBtqz8m*Te&g==&!G6j~W7$PMKDBU3gQVn7nVmhkZG+H#NM#RCuDF~{oId+Ll z8seQcHiw(zOoCP}=0J~1J`@J0u=VgRFxtzboqroK8k`MUF~g{%ICLqG9j3{oXJdrp zsDjFpLyJjWd!dInL4|~uYsA3>pfnPUa8vl?)+3>5CbccFH6L2{z=Av_f4F58F4txK zOawIa(0Xc8)T%`&G;V5d#H~J`pQp8Z$Z`uk<4tMqh(rhuF+l{HA0r2{T(A!bK#II| z5q}pd7-{*?)ayIi3~3|T*#JuX(ketx9K!%nF(9WIfW_?g^?AgCuvC{2zXLv|7bT&E z2?EDPJZ#ssV%m&3ff(JFsWwcG-DA3 z8fgKQJEp{rPw!dR$DJk@qdGB)WLv8i_Jc6QmM~dr3QpSt3I)YRK16OY09X`;fq$fS z0hce(mQ6vdl{#x1EO~EBoQyJAyjf5k`f*fREg|aWIJ6;ydA#O*#v`-c<@=H87i2T6 z&9RI`BruSeMp#G`;%X%v_DBpDoh+0V(3$}%5K~)H+Mr4#1~|e4iqIIKjsMSJ diff --git a/data-raw/single.json b/data-raw/single.json index b58a884..d4e0992 100644 --- a/data-raw/single.json +++ b/data-raw/single.json @@ -571,8 +571,8 @@ }, { "input": "por", - "format": "spss", - "ext": "spss", + "format": "por", + "ext": "por", "type": "import", "format_name": "SPSS Portable", "import_function": "haven::read_por", From 0b5c9bd8fb92ffc47fdd2f4cd6e6ff2bb7496ada Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 14:54:48 +0200 Subject: [PATCH 3/9] Implement get_info and cleaning up import and export --- NAMESPACE | 1 + R/export.R | 18 ++--- R/import.R | 15 ++-- R/remote_to_local.R | 4 +- R/sysdata.rda | Bin 2248 -> 2176 bytes R/utils.R | 135 +++++++++-------------------------- data-raw/single.json | 18 ++--- man/get_ext.Rd | 23 ------ man/get_info.Rd | 38 ++++++++++ tests/testthat/test_errors.R | 6 +- tests/testthat/test_guess.R | 16 ++--- 11 files changed, 111 insertions(+), 163 deletions(-) delete mode 100644 man/get_ext.Rd create mode 100644 man/get_info.Rd diff --git a/NAMESPACE b/NAMESPACE index e0b176c..d114525 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -84,6 +84,7 @@ export(export_list) export(factorize) export(gather_attrs) export(get_ext) +export(get_info) export(import) export(import_list) export(install_formats) diff --git a/R/export.R b/R/export.R index 10d73f4..17acddc 100644 --- a/R/export.R +++ b/R/export.R @@ -83,7 +83,7 @@ export <- function(x, file, format, ...) { if (missing(file) && missing(format)) { stop("Must specify 'file' and/or 'format'") } else if (!missing(file) && !missing(format)) { - fmt <- tolower(format) + format <- tolower(format) cfile <- file f <- find_compress(file) file <- f$file @@ -93,30 +93,30 @@ export <- function(x, file, format, ...) { f <- find_compress(file) file <- f$file compress <- f$compress - fmt <- get_ext(file) + format <- get_ext(file) } else if (!missing(format)) { - fmt <- get_type(format) - file <- paste0(as.character(substitute(x)), ".", fmt) + format <- .standardize_format(format) + file <- paste0(as.character(substitute(x)), ".", format) compress <- NA_character_ } - fmt <- get_type(fmt) + format <- .standardize_format(format) outfile <- file data_name <- as.character(substitute(x)) if (!is.data.frame(x) & !is.matrix(x)) { - if (!fmt %in% c("xlsx", "html", "rdata", "rds", "json")) { + if (!format %in% c("xlsx", "html", "rdata", "rds", "json")) { stop("'x' is not a data.frame or matrix") } } else if (is.matrix(x)) { x <- as.data.frame(x) } .create_directory_if_not_exists(file = file) ## fix 347 - if (fmt %in% c("gz", "gzip")) { - fmt <- tools::file_ext(tools::file_path_sans_ext(file, compression = FALSE)) + if (format %in% c("gz", "gzip")) { + format <- tools::file_ext(tools::file_path_sans_ext(file, compression = FALSE)) file <- gzfile(file, "w") on.exit(close(file)) } - class(file) <- c(paste0("rio_", fmt), class(file)) + class(file) <- c(paste0("rio_", format), class(file)) .export(file = file, x = x, ...) if (!is.na(compress)) { cfile <- compress_out(cfile = cfile, filename = file, type = compress) diff --git a/R/import.R b/R/import.R index a92af3c..d41f41c 100644 --- a/R/import.R +++ b/R/import.R @@ -110,20 +110,17 @@ import <- function(file, format, setclass, which, ...) { file <- parse_tar(file, which = which) } if (missing(format)) { - fmt <- get_ext(file) - if (fmt %in% c("gz", "gzip")) { - fmt <- tools::file_ext(tools::file_path_sans_ext(file, compression = FALSE)) + format <- get_info(file)$format + if (format %in% c("gz", "gzip")) { + format <- get_info(tools::file_path_sans_ext(file, compression = FALSE))$format file <- gzfile(file) - } else { - fmt <- get_type(fmt) } } else { - fmt <- get_type(format) + ## format such as "|" + format <- .standardize_format(format) } - args_list <- list(...) - - class(file) <- c(paste0("rio_", fmt), class(file)) + class(file) <- c(paste0("rio_", format), class(file)) if (missing(which)) { x <- .import(file = file, ...) } else { diff --git a/R/remote_to_local.R b/R/remote_to_local.R index 7cc7730..58c27bc 100644 --- a/R/remote_to_local.R +++ b/R/remote_to_local.R @@ -14,7 +14,7 @@ remote_to_local <- function(file, format) { } else { # handle google sheets urls if (grepl("docs\\.google\\.com/spreadsheets", file)) { - fmt <- get_type(format) + fmt <- .standardize_format(format) if (fmt %in% c("csv", "tsv", "xlsx", "ods")) { file <- convert_google_url(file, export_as = fmt) fmt <- fmt @@ -23,7 +23,7 @@ remote_to_local <- function(file, format) { fmt <- "csv" } } else { - fmt <- get_type(format) + fmt <- .standardize_format(format) } } # save file locally diff --git a/R/sysdata.rda b/R/sysdata.rda index 04a078805499d41bda0d777028436ff04b4c297c..8490b44be06424de85a40c642007e3de3053c1d7 100644 GIT binary patch literal 2176 zcmV-`2!HoNT4*^jL0KkKSr*gWd;ki=|G@wM|L5&*u$Vvh{qVp4|MWlr00CeLUwejl zxVf$1=1qg5v;oqGT4u%)QYq=Fr>TaZdYU|uv_Ju)K+pq5fB~VkGyoEbG-Sj~Lr7&Y z8Xk~n0K@;^5yf zNR+~kAXr$uagjxQEy6mp1*=g#3sbcei>YBkQ7}!T6FyVKkD~cY8!CezlA7Pb%!ZX^ z&mKEySw@>r z`!eCrVE{HOOX3G+9FoXDs! zQoG+8NK>?k2nmpD;3h}MF9{|NeeOn1g4RRhbs~gRM3&^u+i_qewbd#R8{}C z$@kez=4dlbLsIuC%55WXJoY#u_oa$eI{^DMi<=#7T_y`MY^tUgYmWS@E3GArE9A1& zpc|-(=|mfkB4Xlv(qpx;CSj^kRG9%`7E?%~n02aIxd>60pNCp;wM2+xN(ZH?2$-6d zkW^*P!Ff44i)oo5o#dQR%4msH(Y&by6$OEEY$mV5O2VoZ+~*`*nRq+mgaHLLEG<~* zQ1Y;$Ux1lGkho1E)1PJ4aY*kmRBbh3o_>#WR}_*3@-^p_5*s`j7;a|?wJwN zP2vZz3!{UJO5#v!+cI7l)?~OnD`9@ucD@ zvS#OO2b6@WFR~$|(RA6=Ks@9Mp?Q}GQ7sshJs&OAByD6Bhs^TfB9wF$P)=M%<5Zi)CVpy)+U`8_Fv(xq5U>XMI z(1lRZOGRjXp3~J&oq3R1AY{Scbds3}SOkATUb1CgfS`6={LKf}2P~5Ri#IDKmXfNJ z7D@^j3TKQ7oMsTe3}DAMT1$14 z=A%1>Gk-Y zrVTk|WgMMRAyRc>=!qwiwH1@JgcMRph9VLoo-=+)1*ibEhaIEq4%v&`gNa1n7?TJx ztnCnxbZSiz0MW!^4CQEm?$~3`jm&`)mF@NJB3v}A4&9S18S zBf6;`HOPYN&f7!h+d$jj(X`+nBiLUApw?28B7x6I6q%EZ<}J?KXl9VaBRU-Oq2mC0`%)>iLerwyCse+6xjo!{Zo-G>|_$@N3NjG^`31Dj6R(_Sw}tdzpqx9 z-PBfcXsj4F=Ha0)V1(FF1(qa-E~T}yQHI>@6B56`JPD9C;AAj(Bk$hSBfw@Tvzs8! ze9P&A7cp<7WmX>}F2~fsLr*nF$6}s)6=`77P4ljBO|E{%;fSpWU&=(y-nE-hS*t>% zW1xfAK1dE?p%!)6NL-1AZq&+Jd)f?1BhTc3OCDL4DIIhSfTUqcyhcHz&*=60>y%mwG^4vK(UKrgKTw`GE!w5Vy?MBO0x}ABu@5d7}{)U zqy|Lr(TN(rD^A@xL73K6h*Tuqn0Z*NkPB!-PKxs;u^>nTgBYkCfiAnM zg_#2=*I!7gL2ket!e&_wgf2ih?~}-(dUkaTI3f#ss9(}9n_eDoo^6KJUoR-B5g0R2 zP?};!eM)BXfrl1TPh7;LBZLyED(z(U5jjA|D1pgvh8PVC0lS|PhFUz)FX}Nxb{x0N-aG@YAr?~j| CE90a9 literal 2248 zcmV;(2sigaT4*^jL0KkKS$Ne_RR9bc|G@wM|L5&*u$Vvh{q(>8|MWlr00CeLzGv0- z@$NXI;LY~;H0ygc?_tq)&?M`-aFj_;D9N=mQKn3ur>ONkA*O&DXlbAs00w~Cng9fm zNuy+*r1a3znq&ji41o18Luvp38Zi%02c!`)X{M%)Q`9|82dDr5000008UO$QNvM=$ zr>Cf+^-n47Q`CBysiSHD0}ucJGynhqB2t=$QKQl_Jx!^j)Y_U1)b$w}GHArmdWJ(G ziKaoOKuDl~nJ1}&F*MNB$jDDfdYMnvGt@NGNYg;to{)a1Gg11bg;D<0^d&;0P~y;_ z7Gf&bf*|B#P(}Pf5*vBHzKrWzc}i zu^2~Qy?fgTnJKQl_VAoS-5eCCiXj81J0nE^LxdjdLLK!Bpj6lrvlMv13ZJXt!Z8-i+EEKYDqSOTIkL`AbjnFwM62nf>iqOlRKq`;Xe zSU4Egj2zOn*7Ouc`YH(l1=lL4i*}7 z(#}~{OC3kG}U|5SOq)|?8m?*g+5I42yIuWa2tqjPZsbIiaWUwr18}#GOOq(7C zwP!^}DoQzy2u6mDmv z=BkRTt??E&OB7=gy^EGAF&mx6LfItlIi z9|Q59*t?Kb5M+VfWKc+ek!XyK%E_E_f0d_BO*p0EryhnyAC_E0?AOJAg4IM zoTlO&WY!s(6m?Nf=KzLbX+sXhvvGux2r}wu!eIQTS2G(Uh~mi|?Q z*~pH<2DCIXLCzWc;p~JQnneXa12N+IEyeNOxIH-qs0?!|M}~q#a6HJ0C0%Q(Led37 z60gUGg~1_%ql!baLmEvc$du_{%q|k!QoS7ERItXFS;JBq)tOT@#(3G&?({uu8hIxP z(FlriqW>f!o)n@KlB|LWsH8!JI!``QxsnJV0t_0E8>o)Gpg56myGfjaA|e-bNJ|iT zZeNw4AD6(&9R=wHK9I+w8<7GS>zWzwIHCr?sg2kS9)YwA-4zj3k1DYM%}A7E8CAxO zR3Stpx@ky4&QvZ0F;IRKoQiUc+Ofe#3S{RZ6ApRAoQ?f!oUedm7|_dvbR(qd`v!HM zqFSjJ*KQ+moEHj#+1EiOF&-qcc+Js>P_LHF=>?uX|v=$VUp}7T`Se(=Ulo1%m0I zMxH?DB5=#vGSO%-avdEcwlp~5VQtHa`a+$`DFnulb|hqpC#f4e#?(P|^X}H3Q7q|2 zh-_^Y!-69DQw$Qy6;M*ROuSJ-J$z``jSM$}qJg%RRtMhA1_tNoIC6zx4I+6s{Tb0f zy7n5`1i@rOxUdFs^xRxEF62c(j0XWC8bgw270`q(^oEA;#!2G@M52^#kb$8Fu?;aD zRdLN0jVe*GFmMV&Dyq&-F)3cO&YK%U$?v8?D;IkpN2MO>14Gz%a4kXY)5DQDZ=Ab1 zpwq?5*w=~#GiIdiID;l+E|$g%ERr5AOX<=a8#!2DlTMhMV3Z9BOm@?68z@fW(=eM& z$`*}>1qvr7b;#>Ld5tdO z2!O`~z~M-_9xtC6w(_Np9uXxI&P>TBi;2-v&=xEdh0#pkR0|llH42VKw7X48lPs=+ z@-)||vm7bkMj{F+qz3wTO^F;|-m|Y(RG4E%R9-2OZme6H41*F^g5RhqJ8TRn7Md^O zM$-@lfk Date: Fri, 8 Sep 2023 15:14:48 +0200 Subject: [PATCH 4/9] Reduce export's cyclomatic complexity --- R/export.R | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/R/export.R b/R/export.R index 17acddc..33c6ffc 100644 --- a/R/export.R +++ b/R/export.R @@ -82,37 +82,37 @@ export <- function(x, file, format, ...) { .check_file(file, single_only = TRUE) if (missing(file) && missing(format)) { stop("Must specify 'file' and/or 'format'") - } else if (!missing(file) && !missing(format)) { + } + if (!missing(file) && !missing(format)) { format <- tolower(format) cfile <- file f <- find_compress(file) file <- f$file compress <- f$compress - } else if (!missing(file) && missing(format)) { + } + if (!missing(file) && missing(format)) { cfile <- file f <- find_compress(file) file <- f$file compress <- f$compress format <- get_ext(file) - } else if (!missing(format)) { + } + if (!missing(format) && missing(file)) { format <- .standardize_format(format) file <- paste0(as.character(substitute(x)), ".", format) compress <- NA_character_ } format <- .standardize_format(format) outfile <- file - - data_name <- as.character(substitute(x)) - if (!is.data.frame(x) & !is.matrix(x)) { - if (!format %in% c("xlsx", "html", "rdata", "rds", "json")) { - stop("'x' is not a data.frame or matrix") - } - } else if (is.matrix(x)) { + if (is.matrix(x)) { x <- as.data.frame(x) } + if (!is.data.frame(x) && !format %in% c("xlsx", "html", "rdata", "rds", "json", "qs")) { + stop("'x' is not a data.frame or matrix", call. = FALSE) + } .create_directory_if_not_exists(file = file) ## fix 347 if (format %in% c("gz", "gzip")) { - format <- tools::file_ext(tools::file_path_sans_ext(file, compression = FALSE)) + format <- get_info(tools::file_path_sans_ext(file, compression = FALSE))$format file <- gzfile(file, "w") on.exit(close(file)) } From 1bd7c71157dfb9a6c8a104f473e9dc770e2250f8 Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 15:21:55 +0200 Subject: [PATCH 5/9] zap get_ext --- R/export.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/export.R b/R/export.R index 33c6ffc..d4b691d 100644 --- a/R/export.R +++ b/R/export.R @@ -95,7 +95,7 @@ export <- function(x, file, format, ...) { f <- find_compress(file) file <- f$file compress <- f$compress - format <- get_ext(file) + format <- get_info(file)$input ## this line is slight confusing } if (!missing(format) && missing(file)) { format <- .standardize_format(format) From 988d5b37fd517c43665f3229907655f4208ae74c Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 15:52:02 +0200 Subject: [PATCH 6/9] Single source --- R/extensions.R | 58 ++++++++++++++++--------------------------- R/import_list.R | 10 ++++---- R/remote_to_local.R | 30 +++++++++++----------- R/sysdata.rda | Bin 2176 -> 2204 bytes R/utils.R | 2 +- data-raw/single.json | 14 +++++------ 6 files changed, 49 insertions(+), 65 deletions(-) diff --git a/R/extensions.R b/R/extensions.R index 723de69..2a40369 100644 --- a/R/extensions.R +++ b/R/extensions.R @@ -18,31 +18,19 @@ ## @rdname extensions .import.default <- function(file, ...) { - x <- gettext("%s format not supported. Consider using the '%s()' function") - xA <- gettext("Import support for the %s format is exported by the %s package. Run 'library(%s)' then try again.") - fmt <- tools::file_ext(file) - out <- switch(fmt, - bean = sprintf(xA, fmt, "ledger", "ledger"), - beancount = sprintf(xA, fmt, "ledger", "ledger"), - bib = sprintf(x, fmt, "bib2df::bib2df"), - bmp = sprintf(x, fmt, "bmp::read.bmp"), - doc = sprintf(x, fmt, "docxtractr::docx_extract_all_tbls"), - docx = sprintf(x, fmt, "docxtractr::docx_extract_all_tbls"), - gexf = sprintf(x, fmt, "rgexf::read.gexf"), - gnumeric = sprintf(x, fmt, "gnumeric::read.gnumeric.sheet"), - hledger = sprintf(xA, fmt, "ledger", "ledger"), - jpeg = sprintf(x, fmt, "jpeg::readJPEG"), - jpg = sprintf(x, fmt, "jpeg::readJPEG"), - ledger = sprintf(xA, fmt, "ledger", "ledger"), - npy = sprintf(x, fmt, "RcppCNPy::npyLoad"), - pdf = sprintf(x, fmt, "tabulizer::extract_tables"), - png = sprintf(x, fmt, "png::readPNG"), - sdmx = sprintf(x, fmt, "sdmx::readSDMX"), - sss = sprintf(x, fmt, "sss::read.sss"), - tiff = sprintf(x, fmt, "tiff::readTIFF"), - gettext("Format not supported") - ) - stop(out, call. = FALSE) + fileinfo <- get_info(file) + if (is.na(fileinfo$type) || is.na(fileinfo$import_function) || fileinfo$import_function == "") { + stop("Format not supported", call. = FALSE) + } + if (fileinfo$type == "known") { + stop(sprintf(gettext("%s format not supported. Consider using the '%s()' function"), + fileinfo$format, fileinfo$import_function), call. = FALSE) + } + if (fileinfo$type == "enhance") { + pkg <- stringi::stri_extract_first(fileinfo$import_function, regex = "[a-zA-Z0-9\\.]+") + stop(sprintf(gettext("Import support for the %s format is exported by the %s package. Run 'library(%s)' then try again."), + fileinfo$format, pkg, pkg), call. = FALSE) + } } ## @rdname extensions @@ -52,16 +40,12 @@ ## @rdname extensions .export.default <- function(file, x, ...) { - x <- gettext("%s format not supported. Consider using the '%s()' function") - fmt <- tools::file_ext(file) - out <- switch(fmt, - gexf = sprintf(x, fmt, "rgexf::write.gexf"), - jpg = sprintf(x, fmt, "jpeg::writeJPEG"), - npy = sprintf(x, fmt, "RcppCNPy::npySave"), - png = sprintf(x, fmt, "png::writePNG"), - tiff = sprintf(x, fmt, "tiff::writeTIFF"), - xpt = sprintf(x, fmt, "SASxport::write.xport"), - gettext("Format not supported") - ) - stop(out, call. = FALSE) + fileinfo <- get_info(file) + if (is.na(fileinfo$type) || is.na(fileinfo$export_function) || fileinfo$export_function == "") { + stop("Format not supported", call. = FALSE) + } + if (fileinfo$type == "known") { + stop(sprintf(gettext("%s format not supported. Consider using the '%s()' function"), + fileinfo$format, fileinfo$export_function), call. = FALSE) + } } diff --git a/R/import_list.R b/R/import_list.R index e42ed80..81a6243 100644 --- a/R/import_list.R +++ b/R/import_list.R @@ -107,17 +107,17 @@ function(file, if (grepl("^http.*://", file)) { file <- remote_to_local(file) } - if (get_ext(file) == "rdata") { + if (get_info(file)$format == "rdata") { e <- new.env() load(file, envir = e) return(as.list(e)) } - if (!get_ext(file) %in% c("html", "xlsx", "xls", "zip")) { + if (!get_info(file)$format %in% c("html", "xlsx", "xls", "zip")) { which <- 1 whichnames <- NULL } ## getting list of `whichnames` - if (get_ext(file) == "html") { + if (get_info(file)$format == "html") { .check_pkg_availability("xml2") tables <- xml2::xml_find_all(xml2::read_html(unclass(file)), ".//table") if (missing(which)) { @@ -128,7 +128,7 @@ function(file, FUN.VALUE = character(1)) names(which) <- whichnames } - if (get_ext(file) %in% c("xls","xlsx")) { + if (get_info(file)$format %in% c("xls","xlsx")) { ##.check_pkg_availability("readxl") whichnames <- readxl::excel_sheets(path = file) if (missing(which)) { @@ -140,7 +140,7 @@ function(file, whichnames <- whichnames[which] } } - if (get_ext(file) %in% c("zip")) { + if (get_info(file)$format %in% c("zip")) { if (missing(which)) { whichnames <- utils::unzip(file, list = TRUE)[, "Name"] which <- seq_along(whichnames) diff --git a/R/remote_to_local.R b/R/remote_to_local.R index 58c27bc..3b145a9 100644 --- a/R/remote_to_local.R +++ b/R/remote_to_local.R @@ -3,38 +3,38 @@ remote_to_local <- function(file, format) { # handle google sheets urls if (grepl("docs\\.google\\.com/spreadsheets", file)) { file <- convert_google_url(file, export_as = "csv") - fmt <- "csv" + format <- "csv" } else { # try to extract format from URL - fmt <- try(get_ext(file), silent = TRUE) - if (inherits(fmt, "try-error")) { - fmt <- "TMP" + format <- try(get_info(file)$format, silent = TRUE) + if (inherits(format, "try-error")) { + format <- "TMP" } } } else { # handle google sheets urls if (grepl("docs\\.google\\.com/spreadsheets", file)) { - fmt <- .standardize_format(format) - if (fmt %in% c("csv", "tsv", "xlsx", "ods")) { - file <- convert_google_url(file, export_as = fmt) - fmt <- fmt + format <- .standardize_format(format) + if (format %in% c("csv", "tsv", "xlsx", "ods")) { + file <- convert_google_url(file, export_as = format) + format <- format } else { file <- convert_google_url(file, export_as = "csv") - fmt <- "csv" + format <- "csv" } } else { - fmt <- .standardize_format(format) + format <- .standardize_format(format) } } # save file locally - temp_file <- tempfile(fileext = paste0(".", fmt)) + temp_file <- tempfile(fileext = paste0(".", format)) u <- curl::curl_fetch_memory(file) writeBin(object = u$content, con = temp_file) - if (fmt == "TMP") { + if (format == "TMP") { # try to extract format from curl's final URL - fmt <- try(get_ext(u$url), silent = TRUE) - if (inherits(fmt, "try-error")) { + format <- try(get_info(u$url)$format, silent = TRUE) + if (inherits(format, "try-error")) { # try to extract format from headers h1 <- curl::parse_headers(u$headers) # check `Content-Disposition` header @@ -59,7 +59,7 @@ remote_to_local <- function(file, format) { # ## PARSE MIME TYPE # } } else { - f <- sub("TMP$", fmt, temp_file) + f <- sub("TMP$", format, temp_file) file.copy(from = temp_file, to = f) unlink(temp_file) temp_file <- f diff --git a/R/sysdata.rda b/R/sysdata.rda index 8490b44be06424de85a40c642007e3de3053c1d7..b575fe3e13d77a8ee4bb112610c2e32a36bb9e04 100644 GIT binary patch literal 2204 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 CE90a9 diff --git a/R/utils.R b/R/utils.R index eb9aac0..45a53ad 100644 --- a/R/utils.R +++ b/R/utils.R @@ -55,7 +55,7 @@ get_ext <- function(file) { ## TODO google sheets matched_formats <- unique_rio_formats[unique_rio_formats$input == input, ] if (nrow(matched_formats) == 0) { - return(list(input = input, format = NA, format_name = NA, import_function = NA, export_function = NA, file = file)) + return(list(input = input, format = NA, type = NA, format_name = NA, import_function = NA, export_function = NA, file = file)) } output <- as.list(matched_formats) output$file <- file diff --git a/data-raw/single.json b/data-raw/single.json index 50c3973..135632f 100644 --- a/data-raw/single.json +++ b/data-raw/single.json @@ -257,7 +257,7 @@ "type": "known", "format_name": "Graph Exchange XML Format", "import_function": "rgexf::read.gexf", - "export_function": "", + "export_function": "rgexf::write.gexf", "note": "" }, { @@ -293,7 +293,7 @@ "type": "known", "format_name": "JPEG images", "import_function": "jpeg::readJPEG", - "export_function": "", + "export_function": "jpeg::writeJPEG", "note": "" }, { @@ -302,7 +302,7 @@ "type": "known", "format_name": "JPEG images", "import_function": "jpeg::readJPEG", - "export_function": "", + "export_function": "jpeg::writeJPEG", "note": "" }, { @@ -374,7 +374,7 @@ "type": "known", "format_name": "PNG images", "import_function": "png::readPNG", - "export_function": "", + "export_function": "png::writePNG", "note": "" }, { @@ -383,7 +383,7 @@ "type": "known", "format_name": "Pickled Numpy arrays", "import_function": "RcppCNPy::npyLoad", - "export_function": "", + "export_function": "RcppCNPy::npySave", "note": "" }, { @@ -626,7 +626,7 @@ "type": "known", "format_name": "TIFF images", "import_function": "tiff::readTIFF", - "export_function": "", + "export_function": "tiff::writeTIFF", "note": "" }, { @@ -635,7 +635,7 @@ "type": "known", "format_name": "TIFF images", "import_function": "tiff::readTIFF", - "export_function": "", + "export_function": "tiff::writeTIFF", "note": "" }, { From 411b8900629017be1bc10b6053b8ebcebe9cb34d Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 16:06:22 +0200 Subject: [PATCH 7/9] Rebuild README --- README.md | 87 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index 0f89675..88d9a77 100644 --- a/README.md +++ b/README.md @@ -130,49 +130,50 @@ install_formats() The full list of supported formats is below: -| Name | Extensions / “format” | Import Package | Export Package | Type | Note | -| :---------------------------------- | :--------------------------- | :------------- | :------------- | :------ | :---------------------- | -| Archive files (handled by tar) | bzip2 / xz / gz / gzip / tar | utils | utils | Default | | -| Zip files | zip | utils | utils | Default | | -| CSVY (CSV + YAML metadata header) | csvy | data.table | data.table | Default | | -| Comma-separated data | csv | data.table | data.table | Default | | -| Comma-separated data (European) | csv2 | data.table | data.table | Default | | -| Data Interchange Format | dif | utils | | Default | | -| Epiinfo | epiinfo / rec | foreign | | Default | | -| Excel | excel / xlsx | readxl | openxlsx | Default | | -| Excel (Legacy) | xls | readxl | | Default | | -| Fixed-width format data | fwf | utils | utils | Default | | -| Fortran data | fortran | utils | | Default | No recognized extension | -| Google Sheets | csv | data.table | | Default | As comma-separated data | -| Minitab | minitab / mtp | foreign | | Default | | -| Pipe-separated data | psv | data.table | data.table | Default | | -| R syntax | r | base | base | Default | | -| SAS | sas / sas7bdat | haven | haven | Default | Export is deprecated | -| SAS XPORT | xport / xpt | haven | haven | Default | | -| SPSS | sav / spss | haven | haven | Default | | -| SPSS (compressed) | zsav | haven | haven | Default | | -| SPSS Portable | por | haven | | Default | | -| Saved R objects | rda / rdata | base | base | Default | | -| Serialized R objects | rds | base | base | Default | | -| Stata | dta / stata | haven | haven | Default | | -| Systat | syd / systat | foreign | | Default | | -| Tab-separated data | tsv / txt | data.table | data.table | Default | | -| Text Representations of R Objects | dump | base | base | Default | | -| Weka Attribute-Relation File Format | arff / weka | foreign | foreign | Default | | -| XBASE database files | dbf | foreign | foreign | Default | | -| Apache Arrow (Parquet) | parquet | arrow | arrow | Suggest | | -| Clipboard | clipboard | clipr | clipr | Suggest | default is tsv | -| EViews | eviews / wf1 | hexView | | Suggest | | -| Fast Storage | fst | fst | fst | Suggest | | -| Feather R/Python interchange format | feather | arrow | arrow | Suggest | | -| Graphpad Prism | pzfx | pzfx | pzfx | Suggest | | -| HTML Tables | htm / html | xml2 | xml2 | Suggest | | -| JSON | json | jsonlite | jsonlite | Suggest | | -| Matlab | mat / matlab | rmatio | rmatio | Suggest | | -| OpenDocument Spreadsheet | ods | readODS | readODS | Suggest | | -| Serialized R objects (Quick) | qs | qs | qs | Suggest | | -| Shallow XML documents | xml | xml2 | xml2 | Suggest | | -| YAML | yaml / yml | yaml | yaml | Suggest | | +| Name | Extensions / “format” | Import Package | Export Package | Type | Note | +| :---------------------------------- | :-------------------- | :------------- | :------------- | :------ | :---------------------- | +| Archive files (handled by tar) | bzip2 / xz / tar | utils | utils | Default | | +| Gzip files | gz / gzip | base | base | Default | | +| Zip files | zip | utils | utils | Default | | +| CSVY (CSV + YAML metadata header) | csvy | data.table | data.table | Default | | +| Comma-separated data | csv | data.table | data.table | Default | | +| Comma-separated data (European) | csv2 | data.table | data.table | Default | | +| Data Interchange Format | dif | utils | | Default | | +| Epiinfo | epiinfo / rec | foreign | | Default | | +| Excel | excel / xlsx | readxl | openxlsx | Default | | +| Excel (Legacy) | xls | readxl | | Default | | +| Fixed-width format data | fwf | utils | utils | Default | | +| Fortran data | fortran | utils | | Default | No recognized extension | +| Google Sheets | googlesheets | data.table | | Default | As comma-separated data | +| Minitab | minitab / mtp | foreign | | Default | | +| Pipe-separated data | psv | data.table | data.table | Default | | +| R syntax | r | base | base | Default | | +| SAS | sas / sas7bdat | haven | haven | Default | Export is deprecated | +| SAS XPORT | xport / xpt | haven | haven | Default | | +| SPSS | sav / spss | haven | haven | Default | | +| SPSS (compressed) | zsav | haven | haven | Default | | +| SPSS Portable | por | haven | | Default | | +| Saved R objects | rda / rdata | base | base | Default | | +| Serialized R objects | rds | base | base | Default | | +| Stata | dta / stata | haven | haven | Default | | +| Systat | syd / systat | foreign | | Default | | +| Tab-separated data | / tsv / txt | data.table | data.table | Default | | +| Text Representations of R Objects | dump | base | base | Default | | +| Weka Attribute-Relation File Format | arff / weka | foreign | foreign | Default | | +| XBASE database files | dbf | foreign | foreign | Default | | +| Apache Arrow (Parquet) | parquet | arrow | arrow | Suggest | | +| Clipboard | clipboard | clipr | clipr | Suggest | default is tsv | +| EViews | eviews / wf1 | hexView | | Suggest | | +| Fast Storage | fst | fst | fst | Suggest | | +| Feather R/Python interchange format | feather | arrow | arrow | Suggest | | +| Graphpad Prism | pzfx | pzfx | pzfx | Suggest | | +| HTML Tables | htm / html | xml2 | xml2 | Suggest | | +| JSON | json | jsonlite | jsonlite | Suggest | | +| Matlab | mat / matlab | rmatio | rmatio | Suggest | | +| OpenDocument Spreadsheet | ods | readODS | readODS | Suggest | | +| Serialized R objects (Quick) | qs | qs | qs | Suggest | | +| Shallow XML documents | xml | xml2 | xml2 | Suggest | | +| YAML | yaml / yml | yaml | yaml | Suggest | | Additionally, any format that is not supported by **rio** but that has a known R implementation will produce an informative error message From 74714f5019f2999538a14587d6592e92132b5433 Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 16:08:32 +0200 Subject: [PATCH 8/9] Update NEWS.md [no ci] --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index bf2d2b5..1447dae 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,7 @@ * Add support for `qs` #275 h/t David Schoch * Use `arrow` to import / export `feather` #340 * `export_list` can write multiple data frames to a single archive file (e.g. zip, tar) or a directory #346 h/t David Schoch +* `get_info` is added #350 * Bug fixes - ... is correctly passed for exporting ODS and feather #318 - POTENTIALLY BREAKING: JSON are exported in UTF-8 by default; solved encoding issues on @@ -20,6 +21,7 @@ - remove all @importFrom #325 h/t David Schoch - rearrange "Package Philosophy" as a Vignette #320 - Create a single source of truth about all import and export functions #313 + - Clarify all concepts: now there is only `format` #351 * New authors - David Schoch @schochastics From 8536d8c3fe99324fa1bd167b590719c7c16f0c14 Mon Sep 17 00:00:00 2001 From: chainsawriot Date: Fri, 8 Sep 2023 16:11:27 +0200 Subject: [PATCH 9/9] add tests for #350 [no ci] --- tests/testthat/test_import_list.R | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/testthat/test_import_list.R b/tests/testthat/test_import_list.R index a520a64..e7a55f0 100644 --- a/tests/testthat/test_import_list.R +++ b/tests/testthat/test_import_list.R @@ -27,6 +27,17 @@ test_that("Import multiple HTML tables in import_list()", { expect_true(identical(names(dat[[2]]), names(iris))) }) +test_that("Import multiple HTML tables in import_list() but with htm #350", { + temphtm <- tempfile(fileext = ".htm") + file.copy("../testdata/twotables.html", temphtm) + dat <- import_list(temphtm) + expect_true(identical(dim(dat[[1]]), dim(mtcars))) + expect_true(identical(names(dat[[1]]), names(mtcars))) + expect_true(identical(dim(dat[[2]]), dim(iris))) + expect_true(identical(names(dat[[2]]), names(iris))) +}) + + test_that("import_list() preserves 'which' names when specified", { export(list(a = mtcars, b = iris), "foo.xlsx") expect_true(identical(names(import_list("foo.xlsx")), c("a", "b")))