From fe2bf84b2231ac17ffebfc416514a0128c33bbfa Mon Sep 17 00:00:00 2001 From: Seal <472678775@qq.com> Date: Thu, 28 Mar 2019 11:33:20 +0800 Subject: [PATCH 01/16] Set theme jekyll-theme-cayman --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000..c4192631 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file From 92748da52a994bcdf6f55db7e53dcfb94d9d2520 Mon Sep 17 00:00:00 2001 From: kezhenxu94 Date: Fri, 29 Mar 2019 10:07:19 +0800 Subject: [PATCH 02/16] Add acknowledgement to JetBrains --- README.md | 15 +++++++++++---- qq_qrcode.png | Bin 0 -> 37572 bytes 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 qq_qrcode.png diff --git a/README.md b/README.md index e0778b1b..62b89bbb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ # JsonToKotlinClass -Hi, welcome to visit me! I am a plugin for generating Kotlin `data class` from JSON string, in another word, a plugin that converts JSON string to Kotlin `data class` (Json to Kotlin) +Hi, Welcome! This is a plugin to generate Kotlin `data class` from JSON string, in another word, a plugin that converts JSON string to Kotlin `data class` (Json to Kotlin) ### Overview @@ -186,9 +186,16 @@ Open the `build.gradle` in IntelliJ, open "Gradle" tool window, expand the proje * [wuseal](https://github.com/wuseal) * [kezhenxu94](https://github.com/kezhenxu94) -### Contact Community -#### Join QQ Group: 341755074 +### Acknowledgement -# Stargazers over time +The development of this plugin is powerly driven by JetBrains. + +### Join the Community + +| QQ Group | +| -------- | +| ![QQ Group](qq_qrcode.png "Scan QR code with QQ/TIM to join the group chat") + +### Stargazers over time [![Stargazers over time](https://starcharts.herokuapp.com/wuseal/JsonToKotlinClass.svg)](https://starcharts.herokuapp.com/wuseal/JsonToKotlinClass) diff --git a/qq_qrcode.png b/qq_qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..61def80be2817ec4d03ad7669f6bd5821f777642 GIT binary patch literal 37572 zcmdqJ2UwHawk~W(MTkmM1R_!tP$G(mlw=DcU8&uQM~a{bh;$GTq<5qV zC>;W!6R9CUsDV)a8C`4ba`rm+oV)jJ|9W)E^O4LszcJ?=;~nK4{;Kz6>5j7=-?wic zoxI!~^?myeuz|lnjvfI|?jYumf`1MHz57WUq zPj7m|id#OiAAW!I>AwA^4;>AAFK5pn|0>d|xhsh0k<9>+BWu!TqrcDTP7}GcfQ$DF zXG6b*N(sBrj!a0NG<~p1qqY3&!EnA?mqX01M9OtC^Qcc$8FCfjupf0sy)GG@^7|$= zKK#*hq4efn_0fie1DSU1k{d%SZQ`5D!)E5@eET_lPfER%F~A-S+v}kn_1}82 z%c4iYZw%O(*}(6Q=F!vAgU7xPFWw99g=MH_X!1uXq~N+Cjsq??YA~J9H>)i`;|J_gWEDus8ej5HKlE)mTp|0y=-E$x64)y8R-ll$@ z@M-Lqy#Hk5?!DvAlKo@D)Hz1({`ywkZ6Hfc{@$|uy5Gk6Z#`*LW8{=S{l__Y=yU4V zp42^X5&gAikG1~S|AfQ(`T6x44pCp}A9oDyB6@^|MmM(O^X1EzUxt|G_Z8%^L)U`} zRJta7Aj(2(sITzOkoBFeW47XK^>kGqKf8z*4o)A(y7Mq1QvG(97_b!1>_+)~+}M(` z|2eNmrbHKu;&!H-6@^P^CEA_wi#Z$8kBu=t$zP(K`)tx&C_3X}xxN!k1szcIga_hN z-R+MPtzwqN8s(@QyErW=lHubS2*SP++CP5&0m(S7a4=&Su2s?|kVqD~vWiJ48G(Q^ zl|{~P!x4LI5(IRnqg1zJn78UwbQWn`L|@+jr%N~p7SI3B7w?Qo8a&28y|z|Ie!ISZ zc8H90&z<)VO(P84Sx%Pi&f~@gT}0+IVHm7=tXFHH@EVDVcvWmE!*6H)&y>UOqjx)+ zW|S0Z$ENbEu7!Vzb~i8XUfb=Qf@nyE3J@&jc0r?%*GZb+)Uz{bitXCZNn znVGp~RPF7A&z|yib(tkZuRC|! zAd6irnphC|b%_NRRu2Z}u zv#{%rN*XYM(ZaatN$L0%&Ya|xDsEh^X-*V-2nU@5FKsc|jud{EQsMR05ndnVG!lJ> zvi7YI>}S&LHluN7sGuJ8#Ubu(n3C`|O1N2dd@0aK9>QPWTppUJYfuCNU*>GzJgL>? zjyz4oUdO)eed4Pbt{+ye$V^L1d$)SJ&OC2rWyOHB=z~z|M6;&Pmc40Hyq3cqxbN>? zLr3h<)#lX@gj55@YqD-Pay^MVC{#coVSJ|ZeDpnLrE8V=P*oBqa`O`+W#`f{Jievn zvnJTv;7BOyk*WDi=*V9@tCo$uU$E{~kvpT73mz)s<+vtgk$sO?w~}sl#OHbqBqTOg z!_ZDC^LB1}YQ;}5byrqpZQn~GH}etF!QOuyi2iXq+MUjGX6;&4^X;nm(LZ+EMRZ8Y zd-VuzB??Bl-b3DK2%WdPlzkNSjGex?16uiP-D|RS_r#4|6p0I*O93h5|B)$X6h7;I ze;t-pzZ%)Sxw(0z=nhR+TGd-}CnmyNIv7&(ZI6@ULspr`?W3wPU&#MJmHiLw;qO4^ zcU|?nIc?^Ze|{-oEW$+^N1B?Nde^>TvCTOtt0Ar|Bw5o^-!?w3&vj0@F(O2u*{5G= zCl{rcN*;rBy9qZKp~KOUZKL66rwn@mGcOGdoxyD7?hBQAsaJEhSF6|E-+UN`Rt2$S z{?tsY#r&5?dl<1UmfZz%xzT(<0*If3nQdTTc)!fQswd{zwQGL%lWBW}?X8T&-6i7+ z)n4$mwEN&V>-_2PzZ73Gww19lDq$B3hiMd0>Y_-9t@1n*eeIFdc65kvfRCg zn>G$`@g`r>OaG~pf2q`0dN7SMTIek#r9!E50fKC#y{~LmVrINnR=Bzhy<(f=6!s{$d^F~AAusQYaV*m7I8`Xa7I;WWz z#x`_5sb;=W>m(un`~0L@XgJ=yAM%zeuUIpndx)|8no%bl{^S#vfcE(qep~R^?@NS} zr5z;bD7Pbk=xrE?8QliTDhGLNxhgZ1?&U>Fto1rcba&t4Q8{>HEoru@Z$TD%k5fd( z0eKx_OP7;d$BWZor|**NlKEidCD+KcGm`*KS&3RF&zMMbN&fnMyIt6Ve%EA!<#nmG zB&Vt_4(M=@Y+2KqbN?LxgfpJ}pZ}HT!eyo|_AUa`oLgd>qDO`5w6R!xkLb5LF*_9d zy(~%B$Cqd6XV;E9gWvE->ZPw-V^^_Yo6=`5siLPIHaY%+(eX`iNLIo*U_I_{LN4B* zU-?9@gT#Ore9(!;OoLPK9|ktT_&fwwE*_j|G1x3gDlU4~O&xy~La14D7R|m3G^~7h ziMK}-Ymov+zmdoL=!`A9lQ9r8M7qlIn8a+!2Xz@I8=H_6{=5*UT2B92zBF~i&FB6q zN;`?D%iW}8!-OzlH_8c`URcy!%C;9NNmzY1Y`uD&`o&0g`V0HT*$DcWBzB@MfKEqe z=>ZnKz#qK6xj7+gp1jRT^d{QNqy&HibLW7IXkQ(@tT?Wm9>AL}c7X6@G=Z5|X$b9- z+my!b;qU{{;(wV9q2%kgy914e_9 zPh5J#@G(F*gq`y#Bk?I0{9vYnzH?0-JMHe9KzAk2pBN4`CmHMIZ1_ax*X12c9Q9Wi zZ>`X2a?WjQWkI~XU~D>rRtkizI8;KDBiTcgkM7*l1aRz6rkJ<0lA3Y-piaI9!`csL ztt>Z$rpgVRErWJXfI$~&_>3`z3{uq$Q2_Imh7k1PqG4!ZnU=PWofu{?s0TuhPn<3G zMk!9nhL0cQf?~@jQ9I?EZ#{0ur3E*rZqho2vvTSf87a@ z+5iR}fvC68H}U$SFY^0=RkLF&#bC&7vw+CBM2gTAFz6aOOx;CPgmYC~jSBq;B@4ao zV9)=Xq7XhObBYRxEL!I0t>#E~@7@h+x_-MWG<TUBD7Yirv&l_L2Zf`R#gjr(ZHAkrWV_lk)<2A_{sMcD?d-hLkLD^Z+%-sb*8O?HK$ z36CA?28?BS;ifbz7TuMq?kkqdoP!n0ZpC)Q5SmL3+*aHfWf0T{!c~+SX{|pTPL?Vn`~!Y zEaEMP$En~n15~GbzpRO+0+k!dXCFvdD`tY`5c{Se<~kJlScOw_6^~2wnt*46xyEB- zU%6W}QCB#O+vW_mM3`&vNyTZ=VhJ(8!mFm%U&+CaKJcP?V2EUU;zetIne-KlaS!%x zVB%XMOB&X;1_K}ffvjMJb9R!IQ;s_8UD3%k1U6p!&42RJ_Qedmz|TH9aN-|>LIm7C zqFlmVbB6=xRZgx!at8X&&q8K(#_F1rctsRKWSss{rTrI!7xeAw$9@cxyYOnm^--4P zp1R7N@!nEv7#KL#gq^Sl?vJg`r|rpy$~rS>PsIV^qf5AEh?S7{X@i zeGr%ccu;$=BH50pl}&ifOk6KK`h77GuUK{b7b;s@KTA)=o7Q^jCF@yz&WeF9l*hhP z8yzGb5TEV1CvrXAWQfYDJyDZCn=+u0c28elf4^)~-jRPh_xG=p4khC+&e=`JxlZ(H+ctc^IT}PF*`GLZ;=Lw+ zVs$liz=}CV{n&t&%kZKg43?yqo1`OXXl{NCJd_WA-)Z)K!0H2d2>w4{mDvwVW{3VJ zP-TEVjQMZD1y)Lhsi&e|*Eh-?N*Y^2CI@G%#^)8w_XD3sLgJ;K$udc4H zgpgCdln6l`bsa_BT%RBC0k836W%Ejc3Zo1-f4Hri$&#l z|KV_}-hSR=%hE+zMFn3v9bbpsZa|JXCQ#lz%onM}>|Ds^jS0Ev{wW3GE?c)nMV^;4 zAVA}(Zks(%-aGDhz@e1w+M93pDZ=tk89ocR89JOwo5~aw(yn#L4k@0>dYEwoyEC7Y zD6zG2cAoX}lSNf}Z18J4e8}k|%UT?;*zX4I@sj;{hBP)M<3|_+Wi+$y3&$!)krMS0 zW*YK{w6ZAw2{X(iV>}% z)v66&6zEzDd0$&9_rxkkS}F^}v|m?Q1zE8r!p={nVwtTl%VI3c*!jv_T5A+L$j}H-~%6Ac%H_Ze^!=3s!g1=4*^0{`tqonHL({H zvJ6&~D-q4_b8{CntIU_X>Q7g#;Dk94LKuzDOy43cV{(O6t1I&RpGIw2G#TdM9#TFZ zt!Zx)9P`X=AIn91>|ZQNg(6(-&W$(^Uwv^r&e~!?_cC){e!j!~b{Dx1fByPUx^1yaOEnE7iJiL%kCM3^UmJkV=*jG2I^mpk?ga3pey;+?&?6 z(%MvV1UNDjiv6ZqMh~<0T|WfS<%{b4fqC5Zb8&K~$I5Nn#&YA~n1qVLr_Cw+tmjHf z!u&sZ7eHiPBJIpRJ{|VC6|`>L86A8QSwy2Xr>qo35G_{)PT>6tQME=w_hg8STuS`d zkNM-g(V1@J+o$0UPU7gbzPK|`GjAF>MwzeED_PZA8BX&~a(IuQ=T9Lg8djpW_tU=r zAr@_7ni8*%RN^Q7JRxKTz8a3=fK-b<)8c)tmT^;jcc?b+0!RPNr{b>BSK(nzcASB= zQbFJV>Qs>IalLmL1lA4(_VP{%IKR{WINsc?NUm)@{O)b`dzVMF#-)ArfeeZz?HE7 z#qqQA9N)%Ybi&z&)#_#GL&q{c8*kSMTz9iKINRHLB;jEuI5??7d72I0CAP4I0dZdg z8&oHwOcpekTfS@ke1YYiG-6nqPVDmXe{eq@Cll{9F#SG9lsT$|z5 zgxkC$xU|)20XnM025ki=EMfP?SG`h*Z(ixJjem7R?ABF!k~-G7X4;EgE#`uGTUuMq zgy$^1dCx-OAgrpiZ96ARG?d31N;GD-bl$unQ;zETsl;MlXD_$UDOTpQ2L^wpW%640 z*C10^E)E6+E3u6y?)Z>*Xk77Fn}HXxu8cxm(ZkCI2OknW*jNd5)fMiH3Ft+R?V&ZU zOOt)xPU@DtZo5Mlc0(5vY8Wm~spj0k?Z#R0-p%XBh=#;9UQnlx&+jOFo(PG@y`Nl&fZ!r4dg<@K~msNdi;w{ zsU}1$8+xq zCJl@q=OE!s-qyw||6y#lm(jvQEE6IZe}OdG<&u z`kj&+Ah>XlhJLILx_i}SzQ1$bHMHVdaMMUkgOu^kO$m+)o0Cv6;ULnpcbNuB4eRRk z32seiMoP1wo8LSrdT$;!j!K9>bENGp8f`WCYzY-G*Ue?d;agb#n1~9VsIQZb_L@n= z*e#9K7HXl3V{&^)8!+XGo}reqX^|Xu!7(k{vvqVyhfUk9bm%-W%Vg~0nYya+FJ*|_ z8w^05M7TLyoGonJDo(oFIY$`6i#{mVyHd~;1uLmq_*BRIP)hd?=M#Tyl^;|^NatN9Ls8z4!c5$Y=5O^V7$VFfqlG=pMX zIote^lM^%`T}$!>avxtBubUwdv^S=K_<>l4*YoPWiz~W48J#;kgb8#II)|^r$l4R_ z_D4U?+#x^xy%r#LpWABh*>^FI%spRoh2ZJhLpgnCo`Ym>{8ElKPn)LNsKOdTCRl zc#PybXj7hz*W#)6HlUwou_Wxyk3Br)I=|5L1anHDrp4ZE)n z*i@!M4@NU7w#RGNmo_Lgh294dvO9>O6koTR@j6VNVN*!aG}B0oUM*PVT(pia?VF>; zi~NO>UbD2NNVP9{%;FN8EHA#vC(n2F8g)~i1|JW>rnNq-n3qAy zy1u?TG`-J^y3k#L%Xm8}_ zO7VUfNn{JSwO73UtP{RE-N(Y#-FoBlgLBqReX?rxAhg#q>s3|gU}9oY-xw}&U!7GR zp_1 zYkj?ElpH)-bF+#>*JD9M##ORK6p923G`mHHpop771v+EmASC!JR){F{DC9aaw}~VyB%EyFw?U+{t{g+=cjMal37Ctc;LjNhy!=U%D`u2aeVU)k_6C!;@y()4?;nC8IBY4GSWI@mfoo?5?auZqzGJ z$S(fy@N&`4uq!g5v3_D}MPqCEEDX8c>#xL?7#3{5=~P8|Oaa4!S?kzcho05e)++B= zTN5fyRkCiJJC%vhnN|dW$hwu|@tOF0b<7(hp0LKoM%?apsbe6yF)$*gWd8nWgVmu) zn!3~vk(RLc9OCf6#VVoh_1#yZA*8B}N(dg0kKHZD^|^C-+*r7ILDRdWEgA$KG1E*E z_nYEg(9yGrJ{`2Jt|W#?%0I1kw>bdQdH8taMJF)jGwbjZOxs>{W*2RS9+-(kOcH^9 z_4eRMn|^>p?}msk)Bx)svhz@;TMX&17eo>G4=X;>6vAFdCc6z1z9HY}G=`48ZTeyi z+urIJ2e{hyWXis((}NR9vUly`j4WqDV=;B zl6!q`ptPZAnq|bh?y3!&zEz9uB&Z-kHDEVJ?u5B0y-c7A5Xq|MB9n}qZ?K~2s z7fAX3+rIo(M3 z!moXIL&h{k$E0rh!PeGR zhn2`HZvPeX(*9=Dm052(EC^18_%^Zzg{jL+DO+&b@@o{~LO{sDO2p@$4W)VZme=0* zN8hq5c7nbP`0+om*b3~md6+JIwY=-$hDmReN*g}m-nS=tUAuxIq9L!^r%%beqK*y? z*w^g7W-#)qBi`eMbhv87yWQLS&x)sPMS5NKK=>K6)d= zuOdTfAd>{bM)?C)vf5Q^EsRy0EsQ2Dw%%TL-65yZD@DW-cUkE2GjBznfD1!c-!@fO zdtMA#xSWGhOnbEt;pWKfy|H~*NwCnnApE<@tJcYrO?g@%8vaXG>Laf-K^W$gg*vUf z#+&^6@@cubxrVNI;PN5eT@C<$s$+}W*pmDP|@U^ge0-V9bq9ENKoPfsd(If>hd#1hHxXB?-QNi$j9 zgnKfTwxj2%da8&?+Xrm^$J@H$}6k7#9>s}9I`zV5I|;7in6>T)THhs_A@-bBXNHxDf1 znm;w=oUJL}pfe~5Bk}54sefxEv&a_fkILy2qo$)gp4(Ok1J^aKIl^Q?Lp|buEYzlFm^|+P=-pf0M?eRD z4Y^=*4wi@*)gDzC2m&^@5)0ACK0#-<=IK~YG~=(wJX#o}bBBW|YM zihYug1cB!(=TatG*4BVS!^4yh^A&?>aN~snKF}do*XE4Qwz44gt12Vwh}g)hnlsz+ zA$k|1{g=j^efsU2oA}dA1l&*_DflM-Xl8fZees-~r0?E2(^4=&9)sh1a_r22c&bK!=eiL65CoCo85-e$J{2roMwiVs*Y4;`Mxsf$9#5H3DkRaDZtLj^ptdTMFhTnz6IB$9_^4Zsyod!x)E!+XSR|+ z*t7seqawA@Ex5>EuV}McGgI2Y`aqCF%H{iC=m!BFCVN)p1RUgYUqw0;eXCc`#_QX7 zy)Y!$5kZNcqa>0@%@32+AH|-Yt5A9s)D$en<~S*4!BPz=|BMK&vYP(l`*Hg1v+c47 z$LR-i=^}&pb#-LfKM1D#^oN(+`{$1JahzdqY5Gdi@60l|3gz>0 z(9yn7-L_~mGt9sC$SF=Ss>i}5Qr0RsdChWh2!vzRhTl)PS$iA~tq}3CtrYRmSm`aC zhD-gBHGRFb{Ns2Pc}O^<{Xxh4Sb0XP*Zr1;uf`Y9UQ#blQ@x&-CZ7lLW=c$!h#2VT z+gyW0oLPBIPERa(;A?S)ejb4qPaup z#?23^xz3+$ zG~>gr+rDLH>#}FEpeO0;rHUvtzJ#DF*g)xtef?dQD(S(%65|SJN+2w6YhcrOyVKBg zsR<#9Q3!7+dImQ#9Gi;c8T#yc)W`3eh5j;*4efzGJ4p{KUyib^779&kznoJkw3^D! zGvqpa^={xT#+6&EEP-yT-w%6D^F-8gyN}%Nz0u zTuah3iREa?L+(zd2)KvQ35GzXcgT<9O{UDGVLWaBgKq}O?W6elSo!DGD09|!y@z_9 z+A{}f?k;sa13|2jd)oGl`t5d5^kkoX1!YU^TW(KhbfEpP*(o2t^-ZkB4Un!DrAAcf zGq40RVOHzhTkXaMI@Q@P3B^pgWQw0vP$>JkCRzq#ua!yp%ht0yx#AHeJi%;MTKOCdJ^n_I&c;)IbF%)!k;t?#?uSjaO8G-W|j6y$)E4!wJmJ3-s7G*Pe98|z#Z$?%!UYj%LILa6e&N&Xf* zc#o7bT;jQ?s&!a1Mg4Ym(H1EPMrm+HFQF3T2QLOw!|)^V%vrzBf(`DoxB&|9bHe+S z#RJGcB(W1;+t3o9ypKY~B%Tv_5a(hHQ!c~p?2c{_&wa5&GDE9TEO0ls6VmMP3#E@O z3RyFI=Wu%)#?>WlkgCP&=G4r?uKA5v?qeS=Jy)4K$hzH=g^uK~6>u^(KKy-Zj&kGL z8z+`N0OqIL1Pw~n8}_`~MP2Aj@;)OlyYCXxzO7FiY;Ql)2j~ec;i`W)LO@vp<-svf zS=WCnY?1t`{YW- z82IyDuT;_ACGmMRdHQ;cZq7tBJp`Xhlwp+cj&o&{IdjSAs_NG#rrz|qDq2e^)2U0v z?J8rVBcS!w;gLI!TE1fWFaG|NuW9XyJBBahV&FIFP0&0jJWL`k+^*9bu zxga}BDpDYIC#ri}#z1kxX55%i1~2GREHp??*1RJ+~7 zFNNM7!=YVx>q1`n{B>f~Jx32~gZ z_u_fM%bH6A(D+6~mDsZe1<%e?O{B-qUU4_S&J7gK!FOz+c&({n|DUPEW4|9uX}qWn zrEGp~bU$)?_E5aUt#)yuORFWqLj~eq`{S=ruGuN=OpfZdoYL=3^6pi z_T~xLGSP}~i-hRkB}R|o(V?VacP>fB(|tF(#!efO*8UBTxi~F^G#?u)Ism-t436a0 zD6T=;GgV~eD3*(_N&V-p#}MtL7E;hFsA{v9bpjdd?!TXHfFpkw#z2Qssv~xSg#Rph zz1kyYz)lFG)7T#EnUWG2tk%->lIwk+($daN)2n$sBa>f2H2I$lC%JZosX0Qnsj)E# zook%r3*}KcC%l$q!p411iMcLbe@$`kBjd?0pRIzpzGb5 zYp)b4d_E8*_Eu^|57>|$23m41BDNlKPw+_|?&MjPeR}aZ`X(uPE=oH+>U6!JlpS`3 z-s4J$r+c;Pnx%@fD0h=kLm?7{%nj?aP71uuS-zDg#kHUJb*9@q`M^5ebRH_=^PRHE zRVli?_UjRD%RL8}`RO8;g%*azUwWemXTV2JX|JNPJL|b}+s1|_2BC=s+a3OT!Fat9 znC4CkJ&l0(sT(QLi~WKq@A?!S#N#{O=(X|Yy9d08DQ6|NrcO@@xRlWq-enjSuX?(- z0}Ko~#k>Mu`FsUf{#zQgSY&*yX_f1dQFq7vim%JqzjN0jtFHzE6N~XvoGP(ReyWaP zd8)hhAy+T(*PL&yhvheuQ)7ZI1|QkOsmgoH8MfN4c~s&%*EWdIT0|AxXH((qK0E!4 z7wvmw3Bk+vNqJmc{Wrn}!)@xMQl3HM9(^eueb?09b_L&~bC_z1Y^#sRx~v3m8ef{wM1a?lt9U{H^Yf}pn{NDDR0X3|C-X@m8WaH~`R(@4wED*9Qq zu3nuE_`l*b4nMW?K}_SP>`0lUH)HJOM@Z9qP5>pw)D`O`G<2IrFJXOd4T(Oef5pzj z#?gweG2@J42O(K-1DBGnw~`k~?iIpnRpfUqg9t|uu-kwRy~v}7autfP!Kc|lP3%V6 zG1lc%y}^JD!Nmf@^3Oudtv0iNR;d)RPl*7FUA!>jLxpsnj?9y|xh9(KNwIhj%Tu{3 zxnl&__a|QGF_uSG`mcvcbDq=x7%2;nt?f}i3=+w`jTWxSI62jvoA&y7FZ?VH2KFAA z(qes>F48Bs4D@UL#gS542*;TQIid2t+oc5D?I7k2ykh&iI<16+nvBxpBX4uZ{Ai86 zD8aW*FdM8+8_b{Oe-Asy73+UhujNBna9F#^r^-kfkd)q5V4w7O4nXF+nCvGOr7toZ z4t7s^3>Mo_(>|lsmXHu4s~JVXE}T0ZOL)*HBL-Ir8%f|b`zot>6GUiJxD5k-KV#jt zy%vRd+8X+hsHJKNH}>@tOiQjXC4=ROfeXQhVnCe1p%i2Yv{b(~UNSK>GB}^$e@gZg z2-dune}4CX=3H~b-aXaqizP#zH;I?V>tu`YlGxCRMj{U*O#GQhw7@|*@; zPYh{|g?Fi+^ysqY16ttcR9JOam4D%23*V=jTwcd>T*j(_THIQ77f3IWt zzAjqjvK$3wV#qN0Cl8sE^)h2=eiR8kNpqG`?3ffV)odL3PZ8@)m`D+((n&upvvkp z­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 Date: Sat, 30 Mar 2019 02:56:12 +0700 Subject: [PATCH 03/16] refactored 'settings' to 'advanced' --- README.md | 2 +- ...ttingsAnnotationTab.kt => AdvancedAnnotationTab.kt} | 2 +- .../ui/{SettingsDialog.kt => AdvancedDialog.kt} | 10 +++++----- .../ui/{SettingsOtherTab.kt => AdvancedOtherTab.kt} | 2 +- .../{SettingsPropertyTab.kt => AdvancedPropertyTab.kt} | 2 +- .../kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt | 10 +++++----- 6 files changed, 14 insertions(+), 14 deletions(-) rename src/main/kotlin/wu/seal/jsontokotlin/ui/{SettingsAnnotationTab.kt => AdvancedAnnotationTab.kt} (99%) rename src/main/kotlin/wu/seal/jsontokotlin/ui/{SettingsDialog.kt => AdvancedDialog.kt} (82%) rename src/main/kotlin/wu/seal/jsontokotlin/ui/{SettingsOtherTab.kt => AdvancedOtherTab.kt} (99%) rename src/main/kotlin/wu/seal/jsontokotlin/ui/{SettingsPropertyTab.kt => AdvancedPropertyTab.kt} (98%) diff --git a/README.md b/README.md index 62b89bbb..e8c74593 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ This is a very cool tool for Kotlin developers, it can convert a JSON string to * Press `ALT + K` for Windows or `Option + K` for Mac or right click on package -> `New`->`Kotlin data clas file from JSON` and continue as guided. ### Advanced usage -Have a try with the settings dialog :stuck_out_tongue_winking_eye: +Have a try with the advanced dialog :stuck_out_tongue_winking_eye: ### Features * Generating Kotlin data class from any legal JSON string or any **URLs that returns a JSON string as response** or **local file that contains JSON string**, for more detail about supported source types, refer to [the documentation](https://github.com/wuseal/JsonToKotlinClass/blob/master/doc_for_json_sources.md) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsAnnotationTab.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedAnnotationTab.kt similarity index 99% rename from src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsAnnotationTab.kt rename to src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedAnnotationTab.kt index 3efbf2bd..962ab886 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsAnnotationTab.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedAnnotationTab.kt @@ -23,7 +23,7 @@ import javax.swing.border.EmptyBorder /** * JSON Converter Annotation Tab View */ -class SettingsAnnotationTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { +class AdvancedAnnotationTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { constructor(isDoubleBuffered: Boolean) : this(FlowLayout(), isDoubleBuffered) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsDialog.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedDialog.kt similarity index 82% rename from src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsDialog.kt rename to src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedDialog.kt index 604d06dc..245e31c6 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsDialog.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedDialog.kt @@ -12,11 +12,11 @@ import javax.swing.JPanel * Created by Seal.Wu on 2017/9/13. */ -class SettingsDialog(canBeParent: Boolean) : DialogWrapper(canBeParent) { +class AdvancedDialog(canBeParent: Boolean) : DialogWrapper(canBeParent) { init { init() - title = "Settings" + title = "Advanced" } @@ -45,16 +45,16 @@ class SettingsDialog(canBeParent: Boolean) : DialogWrapper(canBeParent) { return tabbedPane } - private fun createOtherSettingTab() = SettingsOtherTab(true) + private fun createOtherSettingTab() = AdvancedOtherTab(true) - private fun createAnnotationTab() = SettingsAnnotationTab(true) + private fun createAnnotationTab() = AdvancedAnnotationTab(true) private fun createExtensionTab() = ExtensionsTab(true) private fun createPropertyTab(): JPanel { - return SettingsPropertyTab(true) + return AdvancedPropertyTab(true) } diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsOtherTab.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedOtherTab.kt similarity index 99% rename from src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsOtherTab.kt rename to src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedOtherTab.kt index dc639162..1c7798f6 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsOtherTab.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedOtherTab.kt @@ -24,7 +24,7 @@ import javax.swing.border.EmptyBorder * others settings tab in config settings dialog * Created by Seal.Wu on 2018/2/6. */ -class SettingsOtherTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { +class AdvancedOtherTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { constructor(isDoubleBuffered: Boolean) : this(FlowLayout(), isDoubleBuffered) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsPropertyTab.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedPropertyTab.kt similarity index 98% rename from src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsPropertyTab.kt rename to src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedPropertyTab.kt index 1043a80a..a6408fdd 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/SettingsPropertyTab.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/AdvancedPropertyTab.kt @@ -15,7 +15,7 @@ import javax.swing.border.EmptyBorder * * Created by Seal.Wu on 2018/2/7. */ -class SettingsPropertyTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { +class AdvancedPropertyTab(layout: LayoutManager?, isDoubleBuffered: Boolean) : JPanel(layout, isDoubleBuffered) { constructor(isDoubleBuffered: Boolean) : this(FlowLayout(), isDoubleBuffered) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt index f2445eb5..67202e2a 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt @@ -100,11 +100,11 @@ class JsonInputDialog(classsName: String, private val project: Project) : Messag centerContainer.addComponentIntoVerticalBoxAlignmentLeft(classNameInputContainer) centerContainer.addComponentIntoVerticalBoxAlignmentLeft(jsonInputContainer) messagePanel.add(centerContainer, BorderLayout.CENTER) - val settingButton = JButton("Settings") - settingButton.horizontalAlignment = SwingConstants.CENTER - settingButton.addActionListener(object : AbstractAction() { + val advancedButton = JButton("Advanced") + advancedButton.horizontalAlignment = SwingConstants.CENTER + advancedButton.addActionListener(object : AbstractAction() { override fun actionPerformed(e: ActionEvent) { - SettingsDialog(false).show() + AdvancedDialog(false).show() } }) val formatButton = JButton("Format") @@ -118,7 +118,7 @@ class JsonInputDialog(classsName: String, private val project: Project) : Messag settingContainer.border = JBEmptyBorder(0, 5, 5, 7) val boxLayout = BoxLayout(settingContainer, BoxLayout.LINE_AXIS) settingContainer.layout = boxLayout - settingContainer.add(settingButton) + settingContainer.add(advancedButton) settingContainer.add(Box.createHorizontalGlue()) settingContainer.add(formatButton) messagePanel.add(settingContainer, BorderLayout.SOUTH) From 812497ee61d19262276852387566d907fc96dbdf Mon Sep 17 00:00:00 2001 From: codeteo Date: Sat, 30 Mar 2019 12:45:31 +0200 Subject: [PATCH 04/16] Fix typo in README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 62b89bbb..a325c4a9 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ Have a try with the settings dialog :stuck_out_tongue_winking_eye: * Generating kotlin data class property order by alphabetical * [Support customizing this plugin by `Extensions` module](https://github.com/wuseal/JsonToKotlinClass/blob/master/doc_for_extensions.md) -### Generate Example +### Generate Example This is the example JSON from json.org ```json @@ -174,8 +174,8 @@ Open the `build.gradle` in IntelliJ, open "Gradle" tool window, expand the proje * Thank [@wangzhenguang](https://github.com/wangzhenguang) for reminding me of the details of the problem * Thank [@kezhenxu94](https://github.com/kezhenxu94/) for introducing CI/CD to save me a lot of time :) * Thank [iqbalhood](https://github.com/iqbalhood) for contributing logo for this project -* Thank [akindone](https://github.com/akindone) for adding `order by alphabetical` featrue for `JsonToKotlinClass` -* Thank [rafalbednarczuk](https://github.com/rafalbednarczuk) for adding `make keyword property valid` featrue for `JsonToKotlinClass` +* Thank [akindone](https://github.com/akindone) for adding `order by alphabetical` feature for `JsonToKotlinClass` +* Thank [rafalbednarczuk](https://github.com/rafalbednarczuk) for adding `make keyword property valid` feature for `JsonToKotlinClass` ### Find it useful ? :heart: From 5e5acee83c5aa760443738de77f8abea767d5565 Mon Sep 17 00:00:00 2001 From: "Tom.Huang" Date: Tue, 2 Apr 2019 16:10:41 +0800 Subject: [PATCH 05/16] fix JsonArray.onlyHasOneSubArrayAndAllItemsAreObjectElementRecursive logic error --- src/main/kotlin/wu/seal/jsontokotlin/utils/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/utils/Extensions.kt b/src/main/kotlin/wu/seal/jsontokotlin/utils/Extensions.kt index 79bb5f9c..0e3a47d6 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/utils/Extensions.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/utils/Extensions.kt @@ -114,7 +114,7 @@ fun JsonArray.onlyHasOneSubArrayAndAllItemsAreObjectElementRecursive(): Boolean return false } - if (allItemAreObjectElement()) { + if (get(0).isJsonArray && get(0).asJsonArray.allItemAreObjectElement()) { return true } From 346f35b4691b3d92737b2c17bb714ed258a0ceec Mon Sep 17 00:00:00 2001 From: "Tom.Huang" Date: Tue, 2 Apr 2019 16:11:58 +0800 Subject: [PATCH 06/16] add local.properties to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f12eb559..d029d172 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,7 @@ !.gitignore !.travis.yml +local.properties + build/ out/ \ No newline at end of file From 7d4fb492f0d5f8660b7219af8852fa2d2ac3d626 Mon Sep 17 00:00:00 2001 From: "Tom.Huang" Date: Tue, 2 Apr 2019 18:25:57 +0800 Subject: [PATCH 07/16] add test --- .../jsontokotlin/utils/ExtensionsKtTest.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/test/kotlin/wu/seal/jsontokotlin/utils/ExtensionsKtTest.kt b/src/test/kotlin/wu/seal/jsontokotlin/utils/ExtensionsKtTest.kt index 5321dca6..2d00a1ce 100644 --- a/src/test/kotlin/wu/seal/jsontokotlin/utils/ExtensionsKtTest.kt +++ b/src/test/kotlin/wu/seal/jsontokotlin/utils/ExtensionsKtTest.kt @@ -137,5 +137,38 @@ class ExtensionsKtTest { jsonArray.onlyHasOneSubArrayAndAllItemsAreObjectElementRecursive().should.be.`false` } + + val subArrayString = """[ + [ + { + "id": 1, + "question": "This is test question?", + "answer": "Ok i understand.", + "created": "2019-03-28T15:37:06+05:30", + "created_by": 0, + "modified": "2019-03-28T15:37:06+05:30", + "modified_by": 0, + "active": 1, + "is_del": 0 + }, + { + "id": 2, + "question": "What is soulmate?", + "answer": "answer", + "created": "2019-03-28T15:41:52+05:30", + "created_by": 0, + "modified": "2019-03-28T15:41:52+05:30", + "modified_by": 0, + "active": 1, + "is_del": 0 + } + ] + ] + """.trimIndent() + gson.fromJson( + subArrayString, + JsonArray::class.java + ).onlyHasOneSubArrayAndAllItemsAreObjectElementRecursive().should.be.`true` + } } From 43f8568fe149dd3fc3eced0831f83970ea7e0ff2 Mon Sep 17 00:00:00 2001 From: "Tom.Huang" Date: Tue, 2 Apr 2019 19:00:20 +0800 Subject: [PATCH 08/16] add issue test --- .../jsontokotlin/regression/Issue121Test.kt | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt diff --git a/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt new file mode 100644 index 00000000..7dfb7f8b --- /dev/null +++ b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt @@ -0,0 +1,81 @@ +package wu.seal.jsontokotlin.regression + +import com.winterbe.expekt.should +import org.junit.Before +import org.junit.Test +import wu.seal.jsontokotlin.KotlinDataClassCodeMaker +import wu.seal.jsontokotlin.test.TestConfig + +class Issue121Test { + + private val json = """{"data": [ + [ + { + "id": 1, + "question": "This is test question?", + "answer": "Ok i understand.", + "created": "2019-03-28T15:37:06+05:30", + "created_by": 0, + "modified": "2019-03-28T15:37:06+05:30", + "modified_by": 0, + "active": 1, + "is_del": 0 + }, + { + "id": 2, + "question": "What is soulmate?", + "answer": "answer", + "created": "2019-03-28T15:41:52+05:30", + "created_by": 0, + "modified": "2019-03-28T15:41:52+05:30", + "modified_by": 0, + "active": 1, + "is_del": 0 + } + ] + ] +}""" + + private val expected = """data class Test( + @SerializedName("data") + val `data`: List> = listOf() +) { + data class Data( + @SerializedName("active") + val active: Int = 0, // 1 + @SerializedName("answer") + val answer: String = "", // answer + @SerializedName("created") + val created: String = "", // 2019-03-28T15:41:52+05:30 + @SerializedName("created_by") + val createdBy: Int = 0, // 0 + @SerializedName("id") + val id: Int = 0, // 2 + @SerializedName("is_del") + val isDel: Int = 0, // 0 + @SerializedName("modified") + val modified: String = "", // 2019-03-28T15:41:52+05:30 + @SerializedName("modified_by") + val modifiedBy: Int = 0, // 0 + @SerializedName("question") + val question: String = "" // What is soulmate? + ) +}""" + + /** + * init test environment before test + */ + @Before + fun setUp() { + TestConfig.setToTestInitState() + } + + /** + * test issue #121 of Github Project issue + */ + @Test + fun testIssue089() { + val result = KotlinDataClassCodeMaker("Test", json).makeKotlinDataClassCode() + result.trim().should.be.equal(expected) + } +} \ No newline at end of file From 1f16045b4aa3147eb8a412d202809eb40b72760c Mon Sep 17 00:00:00 2001 From: "Tom.Huang" Date: Wed, 3 Apr 2019 13:00:48 +0800 Subject: [PATCH 09/16] Rename test method name in Issue121Test --- src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt index 7dfb7f8b..db90562f 100644 --- a/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt +++ b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue121Test.kt @@ -74,7 +74,7 @@ class Issue121Test { * test issue #121 of Github Project issue */ @Test - fun testIssue089() { + fun testIssue121() { val result = KotlinDataClassCodeMaker("Test", json).makeKotlinDataClassCode() result.trim().should.be.equal(expected) } From e891146e6ee95292e2eb26a6ee18b82ae3f5bd8d Mon Sep 17 00:00:00 2001 From: Tom Huang Date: Wed, 10 Apr 2019 21:51:35 +0800 Subject: [PATCH 10/16] [Fix] disable gson html escaping to fix format error (#137) * disable html escaping to fix format error * fix typo --- .../seal/jsontokotlin/ui/JsonInputDialog.kt | 2 +- .../jsontokotlin/regression/Issue130Test.kt | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/test/kotlin/wu/seal/jsontokotlin/regression/Issue130Test.kt diff --git a/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt b/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt index 67202e2a..8267ec41 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/ui/JsonInputDialog.kt @@ -60,7 +60,7 @@ val myInputValidator = MyInputValidator() class JsonInputDialog(classsName: String, private val project: Project) : Messages.InputDialog(project, "Please input the class name and JSON String to generate Kotlin data class", "Generate Kotlin Data Class Code", IconLoader.getIcon("/icons/logo_96x96.png"), "", myInputValidator) { private lateinit var jsonContentEditor: Editor - private val prettyGson: Gson = GsonBuilder().setPrettyPrinting().serializeNulls().create() + private val prettyGson: Gson = GsonBuilder().setPrettyPrinting().serializeNulls().disableHtmlEscaping().create() init { setOKButtonText("Generate") diff --git a/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue130Test.kt b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue130Test.kt new file mode 100644 index 00000000..018466e1 --- /dev/null +++ b/src/test/kotlin/wu/seal/jsontokotlin/regression/Issue130Test.kt @@ -0,0 +1,34 @@ +package wu.seal.jsontokotlin.regression + +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import com.google.gson.JsonElement +import com.winterbe.expekt.should +import org.junit.Before +import org.junit.Test +import wu.seal.jsontokotlin.test.TestConfig + +class Issue130Test { + + private val expected = """{ + "a": "1->2" +}""" + + /** + * init test environment before test + */ + @Before + fun setUp() { + TestConfig.setToTestInitState() + } + + /** + * test issue #130 of Github Project issue + */ + @Test + fun testIssue130() { + val prettyGson: Gson = GsonBuilder().setPrettyPrinting().serializeNulls().disableHtmlEscaping().create() + val jsonElement = prettyGson.fromJson("""{ "a" : "1->2"}""", JsonElement::class.java) + prettyGson.toJson(jsonElement).should.be.equal(expected) + } +} \ No newline at end of file From eee852cf3f8e7ad375b02808ebf0e517d0ec19c5 Mon Sep 17 00:00:00 2001 From: Seal Date: Sun, 14 Apr 2019 13:54:02 +0800 Subject: [PATCH 11/16] add gradle.properties to git ignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d029d172..af511cf0 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ local.properties build/ -out/ \ No newline at end of file +out/ +/gradle.properties From 38f7c9628821831c328a51fe51dcb844a9746d52 Mon Sep 17 00:00:00 2001 From: Seal Date: Sun, 14 Apr 2019 15:15:06 +0800 Subject: [PATCH 12/16] add saveAndReadExceptionInfo unit test and saveAndReadActionInfo unit test --- .../jsontokotlin/feedback/PersistCacheTest.kt | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/test/kotlin/wu/seal/jsontokotlin/feedback/PersistCacheTest.kt b/src/test/kotlin/wu/seal/jsontokotlin/feedback/PersistCacheTest.kt index 91ff0266..22ca2978 100644 --- a/src/test/kotlin/wu/seal/jsontokotlin/feedback/PersistCacheTest.kt +++ b/src/test/kotlin/wu/seal/jsontokotlin/feedback/PersistCacheTest.kt @@ -1,7 +1,9 @@ package wu.seal.jsontokotlin.feedback import com.google.gson.Gson +import com.winterbe.expekt.should import org.junit.AfterClass +import org.junit.Before import org.junit.Test import wu.seal.jsontokotlin.test.TestConfig.isTestModel @@ -10,8 +12,10 @@ import wu.seal.jsontokotlin.test.TestConfig.isTestModel * Created by Seal.Wu on 2018/2/6. */ class PersistCacheTest { - val exceptionInfo = "Test exception" - @Test + + private val exceptionInfo = "Test exception" + + @Before fun before() { isTestModel = true } @@ -46,6 +50,31 @@ class PersistCacheTest { PersistCache.deleteAllActionInfo() } + @Test + fun testSaveActionInfoAndReadActionInfo() { + + val startActionJSONString = Gson().toJson(StartAction()) + + PersistCache.saveActionInfo(startActionJSONString) + + val readStartActionJSONString = PersistCache.readAllCachedActionInfo().dropLast(1) + + readStartActionJSONString.should.be.equal(startActionJSONString) + + } + + + @Test + fun testSaveExceptionInfoAndReadExceptionInfo() { + + PersistCache.saveExceptionInfo(exceptionInfo) + + val readExceptionInfo = PersistCache.readAllCachedExceptionInfo().dropLast(1) + + readExceptionInfo.should.be.equal(exceptionInfo) + + } + companion object { @AfterClass @JvmStatic From 1f54304acaf63439b780ce048fd92cbf58bfa13f Mon Sep 17 00:00:00 2001 From: Ibragimov Ruslan <493656+IRus@users.noreply.github.com> Date: Mon, 15 Apr 2019 07:38:41 +0300 Subject: [PATCH 13/16] Fix #139 Folder .jsontokotlin in $HOME (#141) Added additional class to provide cache directory. It used directly, because not approach for IoC presented here. --- .../jsontokotlin/feedback/CacheDirProvider.kt | 42 +++++++++++++++++++ .../jsontokotlin/feedback/PersistCache.kt | 7 ++-- 2 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/main/kotlin/wu/seal/jsontokotlin/feedback/CacheDirProvider.kt diff --git a/src/main/kotlin/wu/seal/jsontokotlin/feedback/CacheDirProvider.kt b/src/main/kotlin/wu/seal/jsontokotlin/feedback/CacheDirProvider.kt new file mode 100644 index 00000000..bdcbadbd --- /dev/null +++ b/src/main/kotlin/wu/seal/jsontokotlin/feedback/CacheDirProvider.kt @@ -0,0 +1,42 @@ +package wu.seal.jsontokotlin.feedback + +import wu.seal.jsontokotlin.utils.LogUtil +import java.lang.System.getProperty +import java.nio.file.Files +import java.nio.file.Path +import java.nio.file.Paths + +/** + * Provides directory to store plugin cache files. + * + * @author Ruslan Ibragimov + */ +interface CacheDirProvider { + fun get(): Path +} + +/** + * For some reason `XDG_CACHE_HOME` not available in System.getenv, + * so approach with checking is system cache folder exist used. + * + * @author Ruslan Ibragimov + */ +class DefaultCacheDirProvider : CacheDirProvider { + override fun get(): Path { + val home = Paths.get(getProperty(USER_HOME)) + val xdg = home.resolve(".cache") + val mac = home.resolve("Library").resolve("Caches") + + return when { + Files.exists(xdg) -> xdg + Files.exists(mac) -> mac + else -> home + }.also { + LogUtil.i("Cache directory is: $it") + } + } + + companion object { + const val USER_HOME = "user.home" + } +} diff --git a/src/main/kotlin/wu/seal/jsontokotlin/feedback/PersistCache.kt b/src/main/kotlin/wu/seal/jsontokotlin/feedback/PersistCache.kt index 188780aa..a450d46e 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/feedback/PersistCache.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/feedback/PersistCache.kt @@ -1,7 +1,7 @@ package wu.seal.jsontokotlin.feedback import java.io.File -import java.util.* +import java.util.Date /** * @@ -30,8 +30,7 @@ fun main(args: Array) { object PersistCache : IPersistCache { - private val usrHome = System.getProperty("user.home") - private val rootDir = "$usrHome/.jsontokotlin" + private val rootDir = "${DefaultCacheDirProvider().get()}/.jsontokotlin" private val exceptionDirPath = "$rootDir/exceptionLog" private val actionInfoPath = "$rootDir/actionInfo" @@ -86,4 +85,4 @@ object PersistCache : IPersistCache { actionDir.listFiles().forEach { it.delete() } } -} \ No newline at end of file +} From 3b1b25f67cfe0bcc3c90714ca86f68ca94fc3049 Mon Sep 17 00:00:00 2001 From: Humza Ahmad Date: Tue, 16 Apr 2019 00:46:53 -0400 Subject: [PATCH 14/16] Change Action tip #135 (#145) Changed "Convert Json Into Kotlin Class" to "Kotlin data classes from JSON" --- src/main/resources/META-INF/plugin.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index cf67086d..6865cf4c 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -66,7 +66,7 @@ @@ -88,4 +88,4 @@ - \ No newline at end of file + From 3a11e8ccfc44c19db96bf56eae7417478b92bfdf Mon Sep 17 00:00:00 2001 From: Karthik Date: Sun, 21 Apr 2019 20:24:58 +0530 Subject: [PATCH 15/16] Fix Issue #123 - File Already exists (#157) --- .../jsontokotlin/utils/KotlinDataClassFileGenerator.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/wu/seal/jsontokotlin/utils/KotlinDataClassFileGenerator.kt b/src/main/kotlin/wu/seal/jsontokotlin/utils/KotlinDataClassFileGenerator.kt index 9dd2f08b..cdcc11b9 100644 --- a/src/main/kotlin/wu/seal/jsontokotlin/utils/KotlinDataClassFileGenerator.kt +++ b/src/main/kotlin/wu/seal/jsontokotlin/utils/KotlinDataClassFileGenerator.kt @@ -249,10 +249,10 @@ class KotlinDataClassFileGenerator(private val interceptors: List, className: String): String { var newClassName = className - while (classesNames.contains(newClassName)) { + + var fileNamesInLowerCase = classesNames.map { it.toLowerCase() } + while (fileNamesInLowerCase.contains(newClassName.toLowerCase())) { newClassName += "X" } return newClassName From 3fb4298c4e76dd83181eacf24ff5cf4a4f01e52c Mon Sep 17 00:00:00 2001 From: kezhenxu94 Date: Mon, 22 Apr 2019 13:42:16 +0800 Subject: [PATCH 16/16] Update changelog --- src/main/resources/META-INF/plugin.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 6865cf4c..9c6a0eb7 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -47,9 +47,13 @@ Update User Interface
-
Optimize User Experience
-
Fix bugs
+
[feature] Support Json Schema
+
[bugfix] Json Format change the value of Json Content
+
[enhancement] Change `Settings` to `Advanced` in the popup dialog
+
[bugfix] File Already Exists
+
[bugfix] wu.seal.jsontokotlin.UnSupportJsonException: Unsupported Json String
+
[bugfix] Kotlin Data Class don't generated as expected
+
[Bugfix] Incorrect properties orders bug
]]>