From e8dad52c365df302d574acd8efd43e8017c8c787 Mon Sep 17 00:00:00 2001 From: Danylo Negriienko Date: Fri, 19 Jun 2020 08:45:38 +0300 Subject: [PATCH] Initial commit --- .gitignore | 32 +++++ .iex.exs | 1 + CHANGELOG.md | 13 ++ README.md | 87 +++++++++++++ assets/microsoft_translator.png | Bin 0 -> 23765 bytes assets/microsoft_translator.svg | 15 +++ assets/microsoft_translator@2x.png | Bin 0 -> 57905 bytes config/config.exs.example | 6 + lib/microsoft_translator.ex | 66 ++++++++++ lib/microsoft_translator/auth/api_key.ex | 12 ++ lib/microsoft_translator/auth/auth.ex | 10 ++ lib/microsoft_translator/client.ex | 150 +++++++++++++++++++++++ mix.exs | 64 ++++++++++ mix.lock | 28 +++++ test/test_helper.exs | 1 + test/yandex_translate_test.exs | 3 + 16 files changed, 488 insertions(+) create mode 100755 .gitignore create mode 100644 .iex.exs create mode 100755 CHANGELOG.md create mode 100755 README.md create mode 100644 assets/microsoft_translator.png create mode 100644 assets/microsoft_translator.svg create mode 100644 assets/microsoft_translator@2x.png create mode 100755 config/config.exs.example create mode 100755 lib/microsoft_translator.ex create mode 100644 lib/microsoft_translator/auth/api_key.ex create mode 100644 lib/microsoft_translator/auth/auth.ex create mode 100644 lib/microsoft_translator/client.ex create mode 100755 mix.exs create mode 100644 mix.lock create mode 100755 test/test_helper.exs create mode 100755 test/yandex_translate_test.exs diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..4c4868b --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ +# The directory Mix will write compiled artifacts to. +/_build/ + +# The dialyzer directory. +/.elixir_ls/ + +# VSCode Artifacts +/.vscode/ + + +# If you run "mix test --cover", coverage assets end up here. +/cover/ + +# The directory Mix downloads your dependencies sources to. +/deps/ + +# Where 3rd-party dependencies like ExDoc output generated docs. +/doc/ + +# Ignore .fetch files in case you like to edit your project deps locally. +/.fetch + +# If the VM crashes, it generates a dump, let's ignore it too. +erl_crash.dump + +# Also ignore archive artifacts (built via "mix archive.build"). +*.ez + +# Ignore package tarball (built via "mix hex.build"). +microsoft_translator-*.tar + +/config/config.exs \ No newline at end of file diff --git a/.iex.exs b/.iex.exs new file mode 100644 index 0000000..789f27e --- /dev/null +++ b/.iex.exs @@ -0,0 +1 @@ +alias MicrosoftTranslator.Client diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100755 index 0000000..6747917 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) +and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [0.1.0] - 2019-06-17 +### Added +- initial version + +### Modified +- code refactoring +- tests diff --git a/README.md b/README.md new file mode 100755 index 0000000..18d4058 --- /dev/null +++ b/README.md @@ -0,0 +1,87 @@ + + +# Microsoft Translator + +A simple Elixir interface to Microsoft Translator translation API in Azure. The Translator is a cloud-based machine translation service. The core service is the Translator, which powers a number of Microsoft products and services, and is used by thousands of businesses worldwide in their applications and workflows, which allows their content to reach a global audience. + +## Installation + +If [available in Hex](https://hex.pm/docs/publish), the package can be installed +by adding `microsoft_translator` to your list of dependencies in `mix.exs`: + +```elixir +def deps do + [ + {:microsoft_translator, "~> 0.1.0"} + ] +end +``` + +## Get access to API + +### Creating a account in the Microsoft Azure + +To perform operations in Microsoft Azure via the API, you need to: +- [Sign in](https://ms.portal.azure.com/) to the Azure portal. +- Create a subscription for Translator. Create a resource in the **Search the Marketplace search box**, enter **Translator** and then select it. +- Select **Create** to define details for the subscription. +- From the **Pricing tier** list, select the pricing tier that best fits your needs. +- Select **Create** to finish creating the subscription. + +### Getting a Authentication key + +When you sign up for Translator, you get a personalized access key unique to your subscription. This key is required on each call to the Translator. + +1. Retrieve your authentication key by first selecting the appropriate subscription. +1. Select **Keys** in the **Resource Management** section of your subscription's details. +1. Copy either of the keys listed for your subscription. + +```elixir +config :microsoft_translator, + api_key: "KEY_1 or KEY_2" + endpoint: "ENDPOINT" +``` + +## Usage + +### Supported languages + +Request for getting list of supported languages is #languages. + +```elixir + MicrosoftTranslator.languages() +``` + +### Language detection + +Request for detecting language of text is #detect. + +```elixir + MicrosoftTranslator.detect("Hello") +``` + +### Translation + +Request for translating text is #translate. + +```elixir + MicrosoftTranslator.translate("Hello", "uk") +``` + +## Contributing + +Bug reports and pull requests are welcome on at https://gl.negrienko.com/negrienko/microsoft_translator. + +## License + +The hex is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT). + +## Disclaimer + +Use this package at your own peril and risk. + +## Documentation + +Documentation generated with [ExDoc](https://github.com/elixir-lang/ex_doc) +and published on [HexDocs](https://hexdocs.pm). Once published, the docs can +be found at [https://hexdocs.pm/microsoft_translator](https://hexdocs.pm/microsoft_translator). diff --git a/assets/microsoft_translator.png b/assets/microsoft_translator.png new file mode 100644 index 0000000000000000000000000000000000000000..d7800d643679cad3a91aa1c19e3a6e80a36b658f GIT binary patch literal 23765 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 F{{WbcJ|X}B literal 0 HcmV?d00001 diff --git a/assets/microsoft_translator.svg b/assets/microsoft_translator.svg new file mode 100644 index 0000000..e634626 --- /dev/null +++ b/assets/microsoft_translator.svg @@ -0,0 +1,15 @@ + + + + microsoft_translator + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/assets/microsoft_translator@2x.png b/assets/microsoft_translator@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..cde64ff847c607a46dca3cbeb5cbdc5ffca238c8 GIT binary patch literal 57905 zcmeEu^+S_w`~EgYi3q5GA~6YRPyqp{0ZNxr(%mU3JuI+D0qGP(q)U1V(j^U}l#m!L z4cqsc@AJIx=Y9Wx?@!MU;x=~QSKMbD=W(1DFSIliDbFyRfj}UX%1U?cLm+VQ5)L6F z0snJT3AnhXLBbNF)&6ue^q{~!=p2JG)o z;E)WW|GXyra+9{569Pd(l<&yuJc44UNK-B@oE~fm8vkM-Wn5copocEMY~WzXe!;Q@}?AN}(vmbh(B}+|9eKAU)VfxF|L*qGIU%C6E6n&o! zTe~KqzF&R~@l&a(seWnuzNpj<$sI|T`JcZWpFW1b$PlRi`y-Ri{>sY8cQH6M5(53d zKf=kPAhXE-`4EYQLeE3a!4t2s{?}c|5J(ux>c4LQE+vI4LBy!7lfwV+h=d7{Ln8ib zFv2j5)ClM-GRlGVf2YU}5hMBE*|{T8a1@bj?u-9f4q?)l{+aZDw(y^w{x946$2|Vq zVg50Xf6U{bIQ>5fYpOuzl*DX%;O*P z_@}V_A6noa3gN%u=0Cj0|D~P&VVM3KT>XEf#gL!jy<(q|f48er>1W$h5<)j}k~n6r zk<{luWZ!HeN@^=)G5G>3#;DFJvfHpx+qQU;yIc?Z_U@{$s`neaI!pOK9K+QM2q<+K zYJl;t$4gd?9y6^Wy)ss3B~cpb$+;WO$2)Dr;dzdo$XU*O{i7VWK(X{^X~941pQHn1 zpwEee)L#h%u9o2n%LpDWABUg{{NMt*6nbtfOS{bS78$XO^*r55tBhr9N zl`)#j7CXbgY0IlL4|YP@6lzZchEoQ%dHj66zkkU=ODxhoHnGt)bxB+Mll8gI zXON<@%(ZC$Hs=iP(0U*4w6qgUkWDT}*FE{$cbWGZ8eC?x-+YUHipCOEpZhe?*cN<8 zmJlJyK10Y+DAK4EwtsClN&;r(zu3}Hx>pq%E#<))$!q)j1=ek+sDU(qY%B*&n!X;R zl6xgQfNu;6Rytb=NY&!IS-&&}>kNcj?b#qLbK-UUiA+JiGm8eJudqAxQZ2?*1Lm z&vReT&5MAeMBbH`U5~zqy+XJ{1~H5sVu)(h|F;=85#NuUXpbr~2;Qjra_Sq{EByVv zz>EDur|EE1WT>4!SOh8zj4Ih;t^LRH2&<}xD;!@ZHm~qbm#0G6=RcqVlhfir!jQUR zAI|>0NBt$JcxH%*h{#Ph^?S{6*4%_&pd10k{jpho;qMiMp27_MA$%BP*1FD*WE6ik z4FV<(zizK{`LA7@JinBfAmEpn&%voH7NT{5f``D{xA1`d*Sj&I`0qWS zyEH9@`6YF$QQ|!04Q7)Z%q+tM@Zx)9_hkMuLU&X1JE0M9^oq;-`=9d$4j(}X)&HQeVV*ljWP>p960aHP$!v_V5q zr2MupEn&8KV7Bh9aeB{m5JLRQ)AfEyj1m>vN=8cMe=KL^jQujSq%-A2f2|tAl9Bjhb({J~RVtKbRTN}XbQ?wWRLT_N))4!huZ&-|1e1Poeobh9Wh16bcsjR3XDjBWb=$_1^b1&8oK_ zKaj@#v3L7aaQ(>PmJ2+P_QM)f%QsJ-Wl$66^X-wcXakJv&nEw%xirL~t!@?nkOGzT zK#PW8cOtNq8x;zX8?3YC$gNN#$jZiE*IaEEuc%tQB!~XXmC?xkKi8H5bNs{!Me{>S z+amuM2?N26UZ3%n%bQjBirTi{V9_?D zL5gssSoBs#?PYEk4o)@>k8M}Y`8B8G$?4z1-BOzq(wKd3mMYGy zAUDk;4D+Ror7Xq8F1GR!KP}!{U<*xwZnY^F?Shz%MNY{=u3&8T_m;O8d$bpRlP-2R zsaA_tF?9WL!?zSm%8=`jjBWY5_hTlM^bE`V*p=hO537pTD!%Lm&DZqaJf2R=!2D`= z^0YLo`?Qxc(|c=Px0D=u21d3-a3M~*A$X`QandSOs}6e1a`0*MD{RLD=aymjx&ej@a6`=Dzf@Wu*-=l)mwQAiu_H*a-y6oYkyH@AM#jk7Q| zNjg3Ky*{Q<6yjfsEjXOy;rnB&T3r1yO{qzSA|piTw1I2MMZZAoU^D4o^K@Jb@Z5H; zdp~;mX|F+D3$x4G7d^Vz5ENnImn6QdQF$yhbBJweTwm?e*j^*|FEdDpxfHs$NJsQ% z!)M)c(jI7CfM=aAnS+cKoGE?l6uHLf!sF8?tMBMtR$cRarrLe? z-2}J&8g{W|6D}jt7?%mz-WBQO;XSt*NyT_f(DckAE=7j#*}rVf$Z}0HVkvUi2l%w11fh+>jRu%cy)D$O26# z_Nm@pIo*8B==ZB`(8gM}s!znu_mA^~ypeqaG9b(@k@*9e(4@e3M{nD{0sfrzpoX)a?k9zEBpd+ba)@bOmm9lduqSb0A7G)pU* zZm>Lx*VYUdD(*0k1*OgP57e^u{>?D?~(q23?wf#88VzyTqRK8Jnv6*8Pf=>dM0t@85xMWG<&Nv{VN;2vw=35M@Rb4C;c)LGxu_M6Ax1+Q0J)>tB*A@vO z6Q-lqLKR?$z=!Yeez^#sLigu;PGQ7YWgW@R-M0M%nCH*KU779#56=zJZ!A#Evk>QE z<5D4EM)A+FYU}BohvQ$w#v^sPB&5U#G%zC*mTvqd9jNN~jVRH0*MypaS7JEFhmQ!* zQI6I80%UcGm@dYC;B^K?6okwlp5NpNGo6NMv1}AvIFnN@epvB@h_2G3D)b1mcp41F z7~rpa>f*;T4;P;{WvemuU-bydDUjY%{88Gx%|<1zp7SZoaN3|od;0nl?MB!0Fi$;N zmAK1KPz1<^pf(OQ7CHw37|9Dn_ZZCzy*`QAIrw~!z=j;_Vh-Y62YjTlb;36Y}IEZZ}>hr@t!6bH#DZ1 z@EN>LNYhIo20dn$U17Nf{LkX$HJ68Si0Nv`(A^5WMbpVzM|3C@e>B|+Mma(ulM+?7 zygcLZtJ?kw>#LeKHn?$QYU?v!&L)k?u1f_xt*^CC9!sttzs!$cW$*Z4V<)9Rg5yt>q5k4;TX>c$R#SxlA953u=n9mWQz zw0+X~C3T+MJb;AJt@S}kq*!?aQNrYT(wEJz_pvYVytX4xs@)RlE^7(!tz|KVovCmbRM21^zB~Qd z;bXmjvvuNt%tk-$qcDOS&*l>{&7+l$R%-h<1WdcMWdc9Xp7DM)s5oNHI$qo$%~m7j ziSbI>0gD8mOuKsK`i(PV(|qNwsRDwgqW4<&d*5tfK1KWq32z`$kgR)_Oz;x|Q4uK= zAdA)xz0(b5Nwj@adx6%IcK3C2tw`0&i3PS=J4KBXENzI!$?)@zgqNveWv{xAzeI0i zbuY9q)Bh_^YyfwEWY-Z-ZBJPB$eHaR_<2Oe58#hI8lpt=r@Jq=Ja)eatqSNJPn@$n z=s(Q1{^BCkl6G*9`U9<)i*t4R!>!p-1(m!{Lm-L#DKjeM&=Fr^T$#ZDO7)PC3l~_3 z98t(_n4v55gV7csQrb^{MZ8TJadImgMlO-?^sxf}M&?5rAa6;YJBo86Vd$Eu!P)C%?EZA9 z+_P@C1`AJ@W15Fjg~yF9N*{)_wMS~Q@E9z2qb79D9y&LnPD}m!#@V_*K@~f=*(93( zgxde4=|^1PhVp8+o}tWONv#n34?SkdL-MAdU1O~CI7EJz7Iz(ab%(1R?sbcDDn*{V z+_;{c`b^&3eU$I8T09MJ5s_J<5p+31>H8Ttbw6KJvh22rXW)lq3E*avFGTn$qfxD( zCfS*g-6a%lAVd`4qXjoys@IY=84)Z~4|S|NMa_IVHRSl+YnShCZ$(DN^G09`_iiO< zk)m3!q5wy-1f^cuymv@V9`%yq-gSqU60ivpsIywITCp(!=q$7ZEVd8yaJ(s8JlyU$ z-Jaj4e;xmWSUk-wnX;BY%E^`Dpyx3A+nz@acI#Q0b!7kl_y9`;=Q$k zXcL>b`=8q+Rj4EtP4(}@7f#)aA3Ia#3yQjb_4Of8Fj;^ix+VY{muQnaF0nhh(fNs1 z!im0ZL44SFx9POvsz-Lswi~HOHiB9()PYE%^D#?Llth}@HJJd58lBM=CrxL1kiIt+ zGs+y($7bmF*c;nZK4aR7%050Re$~Bg;^UWU<2_nABO(p~SeOe?AsLcL9jegh@QO&N zR#Puix0hpaU_e>QaozsHIC1i72)5(+yOhWL)~mM84{0@N&XI2r{VAx_krhr`t&Z3p zotR%zC!wFF8}n+4H^u+um+uaHwwmp1eSkLGYdAgCs>7D|?F(X@ z&O?ADlQjYN*lc@8_go8&%VVk_@LM6GPd=FJw6OYZz7a{&o$2lOiB0sItBkEVX?>Uo^{(Yxv?PG(r@+qIwKF3w#y2+9E>qnL8iYxZG5=_arMwxHF z5vA3t9JP}NqmlFPBdZiNR-81KTt2yct=bD(^K?1AU}Coy`6s}qBCpgOh~w5GdS6yj zYq3Sy<+5T93u1?c@+9;rdoET~o8a1BFomW*MpDDmQtC_vf}Abp znWqs$3AeB5Wwf8vx#lIQc_nV`7~I^6WqMIWa{Pz>3x5J(v;9V>PN>~NGa{hs_qu6$W-E&ebTMIJ~{qK;CSzBsV3g6iZN`3ytx*)58 z;ZJR4`j83pP`BhmuDHBDM4wySPZIBt@%Bo1Qjmx_T}Uuv5(xS1&Zm9Cr1Rr0H8GYC z+GiqkuSmSsjk-WHHHf-DX13zV(T!KnsGxTA1kC#wBtLetv?G z@;d(PId3KVM^C^*e5!&nfXLBmFwDgu$NV8ft-WdNr+X*gJuvxCdibErm9P915W=ug z#zD=aM2u-~@KVD&TQnIZgwjEaz@im?qoo{)eD((d{-DkvMT-4Y;$^%@Hi$$~K8uXS zKi7G%_zY={dnn}lId!C4qa!}tGA|(D7%){+YR{Bq(SOLlo-a^H+wbmZe6Ul@r0e-U z&WI&GrkfXJE)a$A{_8>Y6Cq5?oasZwC@yYL_90LYb1iqS(sPLrSr$zQRmjwYA1Su76#d{Bn7BDXr#a*V$k{te{<&ini}d41pNOaus?BP`6Qb zC0yu!(G)ahdErUAGk2UguWx6H?z8B&tlheA=g_JIi1t_j6bwr=Ik?_4Pj~4cc0?-8 z$rs1$NUj}QtG=kO&Q*$c6%e0)+Ei&0zvkwD+}wD3do>s@crx(PQHa)X$0V~{4G1g= ze3vJ8`@>R4ZVDA1;w_K89O;+I-A|@A+OsIXsWWU^d?voldzr{wQF*5=XpHsYP?ScP zaQ+)*_y{hw(cH1P-Ogt*)o*boT}jT|CbQebge%$ShRM&X?)9>eP$Zc!ewCfNCnJXJ zGbeScEM)2xE5EB6+O(sZ^LR&(9#pTd=7V->KiAim4qvFMZy8#CqUn2=*_+oQfcETi zJV$KLP`oyYR}}ZD#GPr(g;z)4rq^%ol=t-H?W%|ir3Pphdujo%xIQQu)A6ltz7{$qMU*I|ohfa?n()sQ>9-~1Vf zonfoP92hpv)4dk_VCoNiw6T3F+artbBkj$t>}>A~8J*Upa6gxdwuyzf%&S4AQlEIV z?bH-vmgW}{+gfrjPwY&EC^;+Tw@Q#AeerJUXYa>iI`71el}D~dtkI7T#hV0BMX;G) zAgZ#9T@(MKpq&Tm4&vT6mOfPPj5`IA7kXH`0V`0i#^wETc}q|45{oB zSEHF`_L*b5M3m&Us6K0xSnaDx|7~Q)4SjZ}fODUn=kH^7-oBRHnBa#fQc3;Bg%n5D z2rSa254QTelEhXO^fU#$62(f-kA<8egc!i~KfBT?4>Q8$iUQfgeKfixmAt1VLm% zHdJmf^`Lk$2e0Wl(gpApmB6oWnXtXKCMNT4>EMIOo6A5qa#(a^-M_%Ha&ggjkB)}& z+j}Dj(9G_*c5Dq!_1?0y0|!sK?11_=(W|$;mPg;kM(RqxT`rBKfWjw%$~tS>?eI_u zeu)Ud9(vY7sFSx~L59UOS|&L*_}KW%q`?hEztqIesGkw2)aN(rp6zD_6khzjC2G0# zLE@Yu-^`A`Nx*TNKdv{Rr*jX`?=+xReS7=>}poEr8-=P{5o02M|Uy(%a|Vgi<&E}oVZs#7lXlU>}yc*P{`WMYQv&q z1;w}CuNH35ey!;TRVMNxABcbi!wO1*Xyjn`COHV1fj21SURBX2bh%AGV56#URH(uV zP|3yRv%yw~D}F=VmsjvZP^K0QOkQSv<6AiDxtJCy+?Y_UspL4=Ex|9ruX|n9oys^b zwAcbl+bFZ7B3!pc;cXoq0Tdx3UW}^|s(Ky2j*mXZ_f&iU^FyKq!KMZ)m$Sen=}J7q z^>sI5=h>O`uS>czCu_5shondgd%ih2m`QIR`FVz;GK+!isVcJTEJR=z(jNnPTm1P4l)^h24rY=Rg7(c7=2)&^6KPp)18Sn+&*Sj=Y?B;Dy5M;OzSMxi0ZFTU; z>4y&%i!n?wbl=ayy(p~TFCU0k6?DJhhU8IUKjiK+?&DW+b;@hhWZ9?){KKzYs>#%w zvKeFS5H7Mu93`10YDKs%RzIIFw#BzPd_cT70}Z%qDF4vL=Q95kp0}G{uUvn9h}wSz zsD$UhG~Kzzghc{jXW^F`-(AbPTUCdb7aCP4Iufe8!^(=5Hlc4<8Qt>ij>{>FhoeDu zv25GPByg9(XMj}K)<;(^2$y3=cNm60PRz*Vo6_M+kgn32HvOXe0sag%#fmU&g}DE~ zzumjs;qjo@m{yT#3a|S#R0T1c0?^4XIgKaH?6WGqJ=edfsTyIIa54c8YfhT*dpblv2)w{BwsA|a4ZXQ4VXPF z-;eG)_euMn30nYf!TavlIZdO+>ViVWY<+tTht)24kDZ#s?xN8=D+ve8h|V3^tI!Mt znGO_63P8HpC9fn#W+;8p$Wu;3f5V%7Y7*W**eK>f^MF6kU3F^r2gtrl5dJIh{xl8W z9`#sLrkgnl;$MJHVrr+wd-w)+l6N%uf;9)^lHf+Vd#qnwM9sIW2I%|QGLf6Ta?fFFMm zOywDqZdo*rwk!=lSydV(ip{MtYGABdUm6nrYudNLn_+8p~1o%Fq zdfzX5Kr;&^AwHmQl%=C%r9K;)TkAxUO+0jS8n%Dx7B_iN9l5m4;$~kJiR6V3XnV0k zjuz~yvSk6pOK6V{s1KlA!4i-(+ld^le&4B z=k{=$MbYZk8&m>pnfrusXF&V7%J%Fsd&oiSC2>phu=aNp6RWDHz-^3SzaeD$k`8aI zV6UOG57626>&Ll9%k;q_`nNU&A}w9?0KB3k@H749KjfIOpQz~7S84q|P3!T5_ybxJ z*L&Nb#wC)XC+`gzBFY?kznAAL|>gmc%S-}7e0TBFPuG^G4{1wRm zEzd-vuAH7GJ1qy22|d{5)9i;zkLHq+V|T$e|QqE`R=sbZdoOAxaY6l+~0>S+ueMaQH$rs~LAUT;cpby4LEV^`ukGqxd6!Rbp zlV;Wq(E!1X+8lx=(Ry%^rlk6LiZ@`qwME4Z}y#@l5SV;->MyUH++R`hrfeew}!sa_KaXo65QMRQETGy zi=t}*aJJu0;D7X$8x#PQbXx~Pp(e0ycm^+X@Q`h~_+is5Rm#b+MUOOfcr`jhz+h{d z7(*3}2K2}F{KDMA)CLPpqQdn%>e<|Yhl~YbDm`PI61H{ToDub?V`b76#C+qECD>ut zB;{>hr9xmVJfRn!|LWqMN#pA?leqD5*MK~<7B+WWk&q~=8EaRZgm_YGJ#rd8N~oV= zVZX1q#)MJP^b4ZZAV*g7x|C}jc-oL7E#}mQ-U9V9fbur)A%@iseS2G&J({;pZLA|1 zS@ye&zVf(FjJbMreh}Ekh>ogE zXqLm&#PvuJNWYx7cU$ysI%${oSSvlv2{`_3uA4UTkzPr|@k*k|>`8|d+Z@s4PNz!# z2ivER-O%jEWb8^PIP&rAI6usk{5lCrKc=>NhX93$ii^LSC_4gLCXDR&deqgK+ePWd zHyf(0-|xh(QZr6J5{SYG+zs|wye{tMK~=LExwFtvStmI|dgTrzbe3YX>E5Q55(Oju zEFEf-1tJq1oCwDKxGDM;gp2c`Kc>nTj?FHy+eNHi+gsryhRP5tT%2!D*{H#r_^cE$Ba~1c?NV%0;U~Ekiky`%o`aNBXCeX^GhN`G2LuoO=Eor$x z*T$;;0~rKtqnJCUIC&ZOIaUY(%}(k)GZt{Nak8ytfE%=$&mwT-zI#gjqnnwzqMe_N zayv}SE?>LMeS#gOzv}oDg$HqDb0$TKbv7Sx<&Qe^ZLO}n+Uv~U?~5x_sdfEGeuh>y zBMoWjVN|p7L3+CZkV9dghWyjF>7Yz77j-w(6^%=XyrgN!FPW22P&wsfTMogX@bj!l zp6ge!*ozrlsx`(cY1&;0FwMCfA=0ucsb+=r1kRHub$DNp?2ce)7bLc zb@B-R&{<#^Cv(qtP0k% zu&~|ExUi-h3av?YXJ8f=ONihTMlgll_GndRBQ(0);_OWqxr{WxnfW8??;`98x2Xsh zF`nVYpJWnv(H~R>AObd?sZdpq!DwFL8)X?y=ROULv$K0~UTpNNqxc7>_!JzvuB_4B zE$ic#U>YQv6ijLpnrMQc)(rjGpu06GiP@8#Ej38*1RWsKc$C!EFg=1Mq0kn zDpy^#toc-%+Wn4sVEW$8jbp{|wL>{jId1|KN#^G4kjO^Z94xYU>^`f$Oexpcn~XiO zr^pO#y^oT?TMzt}F|qI6f^EqR?_8h`H_0ftOh5Z3Ik)q>{OxZzn?^8LD5x5!!>`{{ zhBMHQ8C7cX^gKDQ7Al&s@iu0A#au7VkPUcdIj2_whm5pJZ~CMVJAc+?vI=8_gp>hb z`Lj|UKB$g&d+NrDLK%Vp?kF$+jXK;E^$-*h167N62mL#;=_8`8YZ;s+w4y?0Nm8+Kg){B!2wi`|vzV(q)~>a*Ka*HZ3#_71b+OM(eZ z-!WZ1W&FVH5oiSJ%wr@i5MWSDvW?lxjVk21XkzUE<%ASr@g30(We4I0=;O>pKBCHO49a@epyxdG$=1+efNk4taE z7(gP;xWQ98yxbCPGQWEzubq3pC(dP2@g}hRpPcUBhtfRoHEi!q7-XK*-!IC~fAN|b z|KjrKd~6R#S+}J0_;_+9)T3UH&b2G1cei&iH5(vvKkeR_Ha z^ulaNBl_9vGi;lFP!iZly)t!z+EOxSxm)Tr&PgFfy&D|n)bdKHaiEIe=y2;};Wrb~ zPP=D#P0O-&MsT`B!o!0_d|Z_CaL+oVMtn<9NPqRhJuH(>i*WF^%S6SE5I2Pv4W~c9 zkFWl$W~%~xNF$+V>RDncg4&GGsxdm+S4g!KL#qr+*)FKr#!Z+6uO|gvrFIOxA?3+x zf+J08vUBzliG2r&G!eda)2F#WwK|~2 zp$a5TY2ZMcG|47csRcpv8iKk0mNWSf{Q%rO;xlAlu)xA`I=g4h$x+f*{Zk5r`2X`(1qek~TvaPCimjqUPjq82u zy`)DQuh!U5sC}3}?%VH17iSu%9ieot&#c-v!JY6nzefnl7lk-JM1*97iQcYID?pPs z?=0j4Hw^I1l6#?new|IT%WfBzd?ysxW*j!44=H;RGcE{?d`P|1B6y`2B^nzQ)^`NZfIu za!j)9ufokcaq*8hqJn4R6YCmpOAhUu2Q27@NI)g=3B{Vr`8*?-r=KHpE`vJ z#-19+Put$75+~X{L!mzP#b_e_PEc`S%@mhC0l5$9_<p9kVaY7P@4 z-&aU}#wSoM$Mf&)T_JSi5fn%ng&}It{&)#qVvwa()c?gR05?OaJwNo_L~dM~;ThoY z2sFFfq?qpQ$)a;BEUQ%r#?8>)#F7?w zdD?FAB6@tiO`~%e3{yJ)TDTg~3#t?f0MulmO8*eX(1Xv5l_H z8b-$;W7W{2^}T(bBe8%VvlN}XLiXW;IW^Mz>Q<$k@?yfVycr9>%+XJT*?w0qwbD~` zW!vvKML`DM4&{@lTLUsm)ew7zlfKs34mvNq8;?();3R9dTYx-n3)h;fr+sJuB%i}3 zp|Jc#QRfe+@yItSt6MfD> zCX8?gg~CFkr^2mG@>hnu)Nh#~Vf!wEJ_sFto6yT0_&IfsH2u5}pHzAedIGk4WJ0(A zKO!{~EGc@>lYP|APO|Wt^9DvCLl>;f@LO8~P5)JMMP>nRsu3zUlgE#OXH1t?(--4W zuP@^KsLZ^kT)*>kQkqAViZR3TJH8x<&J8TrlHdcpM)DrMe%Vf7`NHt?>IP+{VnxSW z9&>wosDM7^tMge6IyOdRk2tAchpaU?2^z^EDhSlmM1SjKiD1MsPjRr_ORsLV7l(DA zXnO;bIrxgG*?H~m!z*y_<||bdh-*IJKT;)1kv&%p4JtKpH%F6?@yU)uK!&(E%?`yK z_yopMst;cs>BCl}m4dHN=}|LF#nKLlMy>Bvh~JRU_J)F`p1n@o;EC~pk}EL3H|?ck z&B1qKj~9MA7}pRemyCqfhYBI0;rn2`1Tdb-R>m!|iU%1FI&^dBL{WnN0_MMLsyuTd zSEA<*tHu$qV6rh+yv)H*a~Yonj5PKUe^YXe0!he*h~G)-?tRxHRwu6fPEx8;tBYd+ zT_SOcwuL(lw?nQsKzak+O%bicTRo5und;WH0E*5t`#K8YL+p^Zkx=*Tc7cJu z*Vl{RJ5N{Yn;KVeTpcD5iQ>!C;^&_l;frL7(kuG<2c6iiLap-1xBw5H!H3Wx4UIno z{}F~%#kB4laz@2Qv*H_q%Th!#16FUfRMTuK&vrkYny>y9x#!@vHS?yS5C0rgk)I`O z31U?kwnPr}axajh3L@77!i}!pIIl!z$X$ZSOg967+jfi%w`ck4?`U&)dw+-xdnHO$_aU5%jSpv6JqVw-b%Dn>JfU#;FG5+eRlk>0=$AXq*= z`s4mBXjE$J1IWk6ayBW16H;CW4uS6oNmcFpYfU3oZJ|W*p^)Ik>$!F>scsm#yho+Z zou=!nMstN=W35)!HeuakE{vGtuL{6Do^eoAVN9~aC8}qH=3*T*)p9P%Qg?= zYu8N5v(+??ck4cqlAOdZ6K4cvbkye7DuKwNIH!6qW1pBXgOz;he>4?Bqs{=jwbY=E za)VFEEs4jZn@Z>m?8W&KraFA!vc=6>JJ+m_vmL=M2_YET<6ioBRlYoP+Tq*hA(y$2 zVnVB82S5kwKD)H33!#1Q&MLlIvk${16X=t#uf7{7q2IeScX$gpAXy7R8ubxs3`MDg zS_*Xv6Nf$^KDRn$YCCgVoy2EEs6p?Oi}|TJ#Yxj(SbIXN4}}*S*2}%B3yiV9ymU-Ts8m;wgaI|%-rqV8v9Syp}gQf%}d6YrY&@5E*3Zt9FuV_8AS8;eYh2m-Iq zH!Cb!PpAv0$Bw?2onVFiPFuM>2Eu!Tu@ONCM02f8hy1U|GoMRa6M={098HxYegpp(n(_LJd`!|ix zld+rDQsN(0YU1;IH^jvAbD;cqIL4yFr$K$sddE#)BgzNLw1wY&kFmir3EAjT)Siq+ zo|0JKaDQPY#TF}h!-mzX!dFuJi1B*k)75Tf=?)Sh3 zzPgv!lX(%)M_SK^_Z2ueE8`Re7VS+%H@6G!9nXvmq(=D?Zad?Cmh9b>%Ljc z3r#g2;<+w2-PMMf>qIh&%Nn@lwAmKNO4*X25OEk>rJ9~I_dR_Zi7FycrJV;2a)^g} z*vo)~UV_eY=j~iMUQP&mDW&Y>6lR}?n9W2VE;iyRdWKwOdE<1C=gZpY+J`myVtA

6e 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 anpORE*^JN8uO%ShPwl4WjRGa>r~ePVV$8Gv literal 0 HcmV?d00001 diff --git a/config/config.exs.example b/config/config.exs.example new file mode 100755 index 0000000..0219574 --- /dev/null +++ b/config/config.exs.example @@ -0,0 +1,6 @@ +# use Mix.Config + +# config :microsoft_translator, +# api_key: "API_KEY" +# region: "REGION" +# endpoint: "ENDPOINT" diff --git a/lib/microsoft_translator.ex b/lib/microsoft_translator.ex new file mode 100755 index 0000000..b61eb5d --- /dev/null +++ b/lib/microsoft_translator.ex @@ -0,0 +1,66 @@ +defmodule MicrosoftTranslator do + @moduledoc """ + Basic functions for requests to Yandex Translate API on Yandex Cloud + """ + + alias MicrosoftTranslator.Client + + @doc """ + Retrieves the list of supported languages. + + Return a map with language code (use it for translations) and native language name + + ```elixir + %{ + languages: [ + %{code: "af", "name":"Afrikaans","nativeName":"Afrikaans"}, + %{code: "ar", "name":"Arabic","nativeName":"العربية"}, + %{code: "bg", "name":"Bulgarian","nativeName":"Български"}, + %{code: "bn", "name":"Bangla","nativeName":"বাংলা"}, + %{code: "bs", "name":"Bosnian","nativeName":"bosanski (latinica)"} + ... + ] + } + ``` + """ + def languages(), do: Client.call(:languages, %{}) + + @doc """ + Detect the language of the text + + Get text as a string param and return a map with language code + + ```elixir + MicrosoftTranslator.detect("Криївка") + # Response + %{languageCode: "uk"} + ``` + + Or get a map with :text and :languageCodeHints (for specify the most likely languages). + > In some languages, one and the same word has the same spelling. For example, the English word “hand” is also written as “hand” in German, Swedish, and Dutch. If the text you transmit contains words like this, Translate may detect the source language incorrectly. + + To avoid mistakes, you can use the languageCodeHints field to specify which languages should be given priority when determining the language of the text + + ```elixir + MicrosoftTranslator.detect(%{text: "Капелюх"}) + # Response + %{languageCode: "uk"} + ``` + """ + def detect(params) when is_map(params), do: Client.call(:detect, params) + def detect(text) when is_binary(text), do: Client.call(:detect, %{text: text}) + + def translate(params) when is_map(params), do: Client.call(:translate, params) + + def translate(text, to) when is_binary(text) and is_binary(to), + do: Client.call(:translate, %{text: text, to: to}) + + def translate(text, to, from) + when is_binary(text) and is_binary(to) and is_binary(from), + do: + Client.call(:translate, %{ + text: text, + to: to, + from: from + }) +end diff --git a/lib/microsoft_translator/auth/api_key.ex b/lib/microsoft_translator/auth/api_key.ex new file mode 100644 index 0000000..ef48680 --- /dev/null +++ b/lib/microsoft_translator/auth/api_key.ex @@ -0,0 +1,12 @@ +defmodule MicrosoftTranslator.Auth.ApiKey do + def get_auth_headers(%{api_key: api_key, region: region}) do + [ + {"Ocp-Apim-Subscription-Key", api_key}, + {"Ocp-Apim-Subscription-Region", region} + ] + end + + def get_auth_headers(%{api_key: api_key}) do + [{"Ocp-Apim-Subscription-Key", api_key}] + end +end diff --git a/lib/microsoft_translator/auth/auth.ex b/lib/microsoft_translator/auth/auth.ex new file mode 100644 index 0000000..9bdd8fc --- /dev/null +++ b/lib/microsoft_translator/auth/auth.ex @@ -0,0 +1,10 @@ +defmodule MicrosoftTranslator.Auth do + alias MicrosoftTranslator.Auth.{ApiKey} + + defp get_config(), do: Application.get_all_env(:microsoft_translator) |> Map.new() + + def authorization_headers(config \\ get_config()) + + def authorization_headers(%{api_key: _} = params), + do: ApiKey.get_auth_headers(params) +end diff --git a/lib/microsoft_translator/client.ex b/lib/microsoft_translator/client.ex new file mode 100644 index 0000000..06d6d19 --- /dev/null +++ b/lib/microsoft_translator/client.ex @@ -0,0 +1,150 @@ +defmodule MicrosoftTranslator.Client do + @empty_state %{data: [], done: false} + @base_host "api.cognitive.microsofttranslator.com" + @base_path "/" + @api_methods %{ + languages: %{ + method: "GET", + path: "languages" + }, + detect: %{ + method: "POST", + path: "detect" + }, + translate: %{ + method: "POST", + path: "translate" + } + } + @api_default_params %{ + "api-version" => "3.0" + } + @availaible_api_methods Map.keys(@api_methods) + @default_headers [{"Content-Type", "application/json"}] + + alias MicrosoftTranslator.Auth + + def call(api_method \\ :languages, args \\ %{}) + when api_method in @availaible_api_methods and is_map(args) do + body = generate_body(api_method, args) + headers = generate_headers() + params = generate_params(api_method, args) + + api_method + |> fetch(headers, body, params) + |> parse(api_method) + end + + defp generate_headers(headers \\ []) + + defp generate_headers(header) when is_tuple(header), + do: generate_headers([header]) + + defp generate_headers(headers) when is_list(headers), + do: @default_headers ++ Auth.authorization_headers() ++ headers + + defp generate_params(:translate, params) do + params + |> Map.take([:to, :from]) + |> params_to_string() + end + + defp generate_params(api_method, _params) when api_method in [:detect, :languages], + do: params_to_string(%{}) + + defp params_to_string(params_map) do + params_map + |> Map.merge(@api_default_params) + |> Enum.reduce("", fn {key, value}, acc -> acc <> "&" <> "#{key}" <> "=" <> "#{value}" end) + |> String.replace_leading("&", "?") + end + + defp generate_body(method, params), do: transform_body(method, params) |> Jason.encode!() + + defp transform_body(:languages, _), do: %{} + + defp transform_body(method, params) when method in [:detect, :translate], + do: [%{text: Map.fetch!(params, :text)}] + + defp transform_body(_, params), do: params + + defp parse({:ok, %{data: body}}, api_method) do + Jason.decode!(body, keys: :atoms) + |> transform_response(api_method) + end + + defp transform_response(response, :detect) do + result = + response + |> List.first() + |> Map.fetch(:language) + + case result do + {:ok, language} -> %{languageCode: language} + end + end + + defp transform_response(response, :translate) do + result = + response + |> List.first() + |> Map.take([:translations]) + end + + defp transform_response(response, :languages) do + %{dictionary: dictionary} = response + + dictionary + |> Enum.map(fn {key, %{name: name, nativeName: native, dir: dir}} -> + %{code: "#{key}", name: name, nativeName: native, dir: dir} + end) + end + + def fetch(api_method, headers, body, params) do + method = @api_methods[api_method].method + path = @base_path <> @api_methods[api_method].path <> params + + with {:ok, conn} <- Mint.HTTP.connect(:https, @base_host, 443), + {:ok, conn, _ref} <- Mint.HTTP.request(conn, method, path, headers, body) do + handle_response(conn, @empty_state) + end + end + + defp handle_response(conn, state) do + receive do + message -> + case Mint.HTTP.stream(conn, message) do + {:ok, conn, responses} -> + case Enum.reduce(responses, state, &handle_res/2) do + # Loop ends here + %{done: true} = state -> {:ok, state} + %{done: false} = state -> handle_response(conn, state) + end + + {:error, _, reason, _} -> + {:error, reason} + + :unknown -> + exit({:unexpected, message}) + end + end + end + + defp handle_res({:status, _, status}, state), + do: Map.put(state, :status, status) + + defp handle_res({:headers, _, headers}, state), + do: Map.put(state, :headers, headers) + + defp handle_res({:data, _, data}, state), + do: Map.update!(state, :data, fn acc -> [data | acc] end) + + defp handle_res({:done, _}, state) do + Map.update!(state, :data, fn acc -> + acc + |> Enum.reverse() + |> Enum.join("") + end) + |> Map.put(:done, true) + end +end diff --git a/mix.exs b/mix.exs new file mode 100755 index 0000000..7b8c6aa --- /dev/null +++ b/mix.exs @@ -0,0 +1,64 @@ +defmodule MicrosoftTranslator.MixProject do + use Mix.Project + + @name "MicrosoftTranslator" + @version "0.4.0" + # @repo_url "https://github.com/negrienko/microsoft_translator" + @repo_url "https://gl.negrienko.com/negrienko/microsoft_translator" + @homepage_url "https://negrienko.com/all/microsoft-translator/" + @author_url "https://negrienko.com/" + @description """ + Translate word and phrases using the Microsoft Translator API. See README.md for information. + """ + + def project do + [ + app: :microsoft_translator, + version: @version, + elixir: "~> 1.9", + build_embedded: Mix.env() == :prod, + start_permanent: Mix.env() == :prod, + package: package(), + deps: deps(), + # Docs + name: @name, + description: @description, + source_url: @repo_url, + homepage_url: @homepage_url, + docs: [ + logo: "assets/microsoft_translator.svg", + main: @name, + source_ref: @version, + source_url: @repo_url + ] + ] + end + + def application do + [extra_applications: applications(Mix.env())] + end + + defp applications(:dev), do: applications(:all) ++ [:remix] + defp applications(_all), do: [:logger, :jose] + + defp deps do + [ + {:joken, "~> 2.2.0"}, + {:jose, "~> 1.10.1"}, + {:jason, "~> 1.2.0"}, + {:mint, "~> 1.1.0"}, + {:castore, "~> 0.1.6"}, + {:ex_spec, "~> 2.0.1", only: :test}, + {:ex_doc, "~> 0.21.3", only: :dev}, + {:remix, "~> 0.0.2", only: :dev} + ] + end + + defp package do + [ + maintainers: ["Danylo Negriienko"], + licenses: ["MIT"], + links: %{"git" => @repo_url, "author" => @author_url, "homepage" => @homepage_url} + ] + end +end diff --git a/mix.lock b/mix.lock new file mode 100644 index 0000000..7423e65 --- /dev/null +++ b/mix.lock @@ -0,0 +1,28 @@ +%{ + "base64url": {:hex, :base64url, "0.0.1", "36a90125f5948e3afd7be97662a1504b934dd5dac78451ca6e9abf85a10286be", [:rebar], [], "hexpm"}, + "castore": {:hex, :castore, "0.1.6", "2da0dccb3eacb67841d11790598ff03cd5caee861e01fad61dce1376b5da28e6", [:mix], [], "hexpm", "f874c510b720d31dd6334e9ae5c859a06a3c9e67dfe1a195c512e57588556d3f"}, + "certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, + "ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "0db1ee8d1547ab4877c5b5dffc6604ef9454e189928d5ba8967d4a58a801f161"}, + "ex_spec": {:hex, :ex_spec, "2.0.1", "8bdbd6fa85995fbf836ed799571d44be6f9ebbcace075209fd0ad06372c111cf", [:mix], [], "hexpm", "b44fe5054497411a58341ece5bf7756c219d9d6c1303b5ac467f557a0a4c31ac"}, + "hackney": {:hex, :hackney, "1.15.1", "9f8f471c844b8ce395f7b6d8398139e26ddca9ebc171a8b91342ee15a19963f4", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"}, + "httpoison": {:hex, :httpoison, "1.5.1", "0f55b5b673b03c5c327dac7015a67cb571b99b631acc0bc1b0b98dcd6b9f2104", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm"}, + "idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"}, + "jason": {:hex, :jason, "1.2.0", "10043418c42d2493d0ee212d3fddd25d7ffe484380afad769a0a38795938e448", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "116747dbe057794c3a3e4e143b7c8390b29f634e16c78a7f59ba75bfa6852e7f"}, + "joken": {:hex, :joken, "2.2.0", "2daa1b12be05184aff7b5ace1d43ca1f81345962285fff3f88db74927c954d3a", [:mix], [{:jose, "~> 1.9", [hex: :jose, repo: "hexpm", optional: false]}], "hexpm", "b4f92e30388206f869dd25d1af628a1d99d7586e5cf0672f64d4df84c4d2f5e9"}, + "jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"}, + "makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49736fe5b66a08d8575bf5321d716bac5da20c8e6b97714fec2bcd6febcfa1f8"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"}, + "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm"}, + "mint": {:hex, :mint, "1.1.0", "1fd0189edd9e3ffdbd7fcd8bc3835902b987a63ec6c4fd1aa8c2a56e2165f252", [:mix], [{:castore, "~> 0.1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bfd316c3789340b682d5679a8116bcf2112e332447bdc20c1d62909ee45f48d"}, + "mojito": {:hex, :mojito, "0.3.0", "806cd3c1832333a9ee784e7ea2799863fbe4de55ecb4623a8f4ef870c2844cc6", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: false]}, {:mint, "~> 0.2.1", [hex: :mint, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}], "hexpm"}, + "nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"}, + "ojson": {:hex, :ojson, "1.0.0", "fd28614eadaec00a15cdb2f53f29d8717a812a508ddb80d202f2f2e2aaeabbcc", [:mix, :rebar3], [], "hexpm"}, + "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"}, + "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"}, + "remix": {:hex, :remix, "0.0.2", "f06115659d8ede8d725fae1708920ef73353a1b39efe6a232d2a38b1f2902109", [:mix], [], "hexpm", "5f5555646ed4fca83fab8620735150aa0bc408c5a17a70d28cfa7086bc6f497c"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"}, + "unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"}, +} diff --git a/test/test_helper.exs b/test/test_helper.exs new file mode 100755 index 0000000..869559e --- /dev/null +++ b/test/test_helper.exs @@ -0,0 +1 @@ +ExUnit.start() diff --git a/test/yandex_translate_test.exs b/test/yandex_translate_test.exs new file mode 100755 index 0000000..a657416 --- /dev/null +++ b/test/yandex_translate_test.exs @@ -0,0 +1,3 @@ +defmodule YandexTranslatorTest do + use ExUnit.Case +end