From 9d02fc12595a695ab5d96ecb45c0521ce20fff0a Mon Sep 17 00:00:00 2001 From: Erik Michaels-Ober Date: Wed, 22 Jun 2011 15:43:42 -0700 Subject: [PATCH] Implement Gems::Client#dependencies --- gems.gemspec | 3 ++- lib/gems/client.rb | 10 ++++++++++ lib/gems/connection.rb | 9 +++++---- lib/gems/request.rb | 8 ++++---- spec/fixtures/dependencies.json | Bin 25535 -> 18574 bytes spec/gems/client_spec.rb | 14 +++++++++++++- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/gems.gemspec b/gems.gemspec index 4054190..4e9bdcb 100644 --- a/gems.gemspec +++ b/gems.gemspec @@ -10,9 +10,10 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'webmock', '~> 1.6' gem.add_development_dependency 'yard', '~> 0.7' gem.add_runtime_dependency 'faraday', '~> 0.6.1' - gem.add_runtime_dependency 'faraday_middleware', '~> 0.6.3' + gem.add_runtime_dependency 'faraday_middleware', '~> 0.6.5' gem.add_runtime_dependency 'hashie', '~> 1.0.0' gem.add_runtime_dependency 'multi_json', '~> 1.0.3' + gem.add_runtime_dependency 'multi_xml', '~> 0.2.2' gem.authors = ["Erik Michaels-Ober"] gem.email = ['sferik@gmail.com'] diff --git a/lib/gems/client.rb b/lib/gems/client.rb index 90ac0f6..f9d7690 100644 --- a/lib/gems/client.rb +++ b/lib/gems/client.rb @@ -50,5 +50,15 @@ def versions(gem, options={}) def downloads(gem, version, options={}) get("/api/v1/versions/#{gem}-#{version}/downloads.json", options) end + + # Returns an array of hashes for all versions of given gems + # + # @param gems [Array] A list of gem names + # @return [Array] + # @example + # Gems.dependencies 'rails', 'thor' + def dependencies(*gems) + get("/api/v1/dependencies", {:gems => gems.join(',')}, :marshal) + end end end diff --git a/lib/gems/connection.rb b/lib/gems/connection.rb index 130aa42..df9573a 100644 --- a/lib/gems/connection.rb +++ b/lib/gems/connection.rb @@ -4,9 +4,8 @@ module Gems module Connection private - def connection + def connection(format=:json) options = { - :headers => {'Accept' => 'application/json'}, :ssl => {:verify => false}, :url => 'https://rubygems.org', } @@ -15,8 +14,10 @@ def connection connection.use Faraday::Request::UrlEncoded connection.use Faraday::Response::RaiseError connection.use Faraday::Response::Mashify - connection.use Faraday::Response::ParseJson - connection.adapter(Faraday.default_adapter) + connection.use Faraday::Response::ParseXml if :xml == format + connection.use Faraday::Response::ParseJson if :json == format + connection.use Faraday::Response::ParseMarshal if :marshal == format + connection.adapter Faraday.default_adapter end end end diff --git a/lib/gems/request.rb b/lib/gems/request.rb index 9d20e91..fab0b52 100644 --- a/lib/gems/request.rb +++ b/lib/gems/request.rb @@ -1,13 +1,13 @@ module Gems module Request - def get(path, options={}) - request(:get, path, options) + def get(path, options={}, format=:json) + request(:get, path, options, format) end private - def request(method, path, options) - response = connection.send(method) do |request| + def request(method, path, options, format) + response = connection(format).send(method) do |request| request.url(path, options) end response.body diff --git a/spec/fixtures/dependencies.json b/spec/fixtures/dependencies.json index 1d784950896631e29cc14dfe9b0dc5ab98ef8c92..5d67781e168bdfbdcd2316385ac556699be35999 100644 GIT binary patch literal 18574 zcmb_k+fH0Z7R^I631IBlqj|UZfFrtTFxYZ_#7}^G6e~8M1~M8&N`8Izr7pX6tzGTY zJ+Hm0>a4XdtLoIj{_*EefB$*#{^;)c+s%4&a(FhKPFL@bAHH5c{ri6N?c`wdeDmM; z2Y1)s)+dLX>n~p)-@pF6epugqUfVtr(+)b zL<3Gg?4E(X)tRL^6H@9mG$sC4m?>C<<@JbhZxW4_} z{`^LldVGF(xZgY#Bf}O$&A%zLe3RUnP3ey5uVFjVW3Il}|>=afA zDNJZqsDc;!=5T=(rq#zeEOSvGGT14s%OZsd6@^F3>1iFYZozTg#h~;B{ zZ_{KEN7F(Fo9o}#C&#~je0w@wPG>nUnkGnm>s}@{mKNxQIB-yT%RINuOI_H;!7b|q zTT~Rv4t|N!vQ=H$kS{Ykzf&{dRrxtZkpZk4^RrWuk(?(^+FmZ77U$ppH&Dp)Vuj0A;a(odMNoVUDP(Y>QTPjaJe{^~)=$^FX?(+H=CVYm zvV*~Z}8fPzW zkp((6$saQ46*;(7Mc@<7yDG= zMVGr&BnD^V8c)TAV4&?|CqtIB~^nS-1MR3d>x-%jLO&LY@~ZG?lp9jY+D7{WoQz`GV zKvant^or12pQk+6Ds%IkI*W=zag5z=MN*{7y-o2#19(*if_d`yJZ8L8k`Ym%@0Bn~ zqxZ_v0EK#f6=cLl)&AZRw}_)?q2RspbXx6OU9vz_T^aOwNOh3mR+0m49312XTeMc! zZud1Qzx{2L0lX>$wTcX2)tH~1l8jUp+fPNudXJ57vdcSDDYf(n^sZ$fsDtMK9pL>c zuT*uwCTZUChdTO}NsnM4$VZt|{L9P%I(R(Jhwd%f?Wf3+N8Qd}7$lq}1-U^Pu{`YW zZ2~OfC|U@0`ypRtU41WUija)&I2*uHHb1wF4d4hH1o3?-&z~MP>+j`E?O*0}yd7w{ zJE-OFK&Qc>NQdljuvoso>ig26;PH1M27;4t&-|qs+ z{dUwmmEob}G9OE3IF!ubNV0yLcvWqC>(-=S5XrS0!PKjD4ML>R%W>4BUarSGn`qXy zV*N~~wSlW$!|R(t1Hu~{Za@Ysoz(qhe94#r97Thm1|)-{2cfKld}(}_0eOl79bYrP z<*NYVt4P52Y=V1#$d|@rz6x}F&G?qD0*J37A>VoNJ&WS20N`8l;rTLv`7(m|9-U4L zIvhm>@h|-|u>Y)Y9@m>czUUv1olfU+o^P9yN`gO&fJ6Jjj<=K-X?#yv4&{Ziy5eeD zoJ-Fs=kT}@aK4B+^NHAnnK{GP@dbT2XN{OMPth;~&LnDPoG&VeVtx{5<yckYmM*^AriSWFD` zq_sRzq^X@k(%$acNQcLxkTg6Xad|L+NJlkI{S=b+-jPWk@*h?~>o}mb+5*tG0}V~X zE8X>Q$Xqbrv0ECxw!E6nol#hw7m*%zZrUBMH71OB{UI;&UIb8j*TUmwUXPTVHVQ12>Nd z=n1e7zcwBspyyUdfNGxzpv@$HJm(TUKI%NJm-z9sS}#(sK}PEJ1dJcgMGIRm+?8Yo z1wfwU4c@=3=UqP9mCgpc60fDC)$xi~ikYB{4LFK$=$Q${xrprI%uDSMXXrpf&cS)5zkt#nL^n{1tmIg>17~PkL(b)J;A;b)v6l7L zs*5wv*nxBST>zd7xogW!zvqm-ZYdX*&W4k3?8KRjXr|X0>uNcJGovum-w|isxlo+# zo}Rs~_{Q8<_XS}msl2c@@Z$pGX`z7>0&|DGjZ zTWCB5pzA79 zcS-a3>cI^7Lw{nEelz1+z6v0|iXguF3BYd32T#A2-I@{5bw{lN!?(c+2eg;W9hsE^sVeVEgCuCG!6RamaH! literal 25535 zcmc(n-EP}P5QXpi6oRh{LXv-C1xQ{b$c2AY)M#uOvYnzR+Gp<$DVsCroF$ohsN8xF zcex+W%#m2+wJd5%l_s1ukMcz zSNB`{!`0olr|vJe+sEz0?e^j3Zu|7)7prD@^40n* zZSAGcMQd%J7X6rSf~%Y7yWPWm8KLW-D*C?NZ=ZHA`nD_#5AB#?!dza2NP^?O1UwcIK$a+oovH@%xS?F0 zX}KLpE7j{$-}!4r}Q4g}~vXcoYVLb>ju zHRN$uhuxSX;VVQETo+KUOHo@Oarlb92%zeRR)>d9Kqs)2;QG)NFB zkRVZR>~2bdJU?>yo{xnu2oyXaiQx+Zga*w5SW!q=Eyv@A?>QTaT_;2m9QVbp6MYdt z)enX5p(6$I?8vS=8*?296g(k`t^)x=gJ$8nqCi;d=CoNQB)Zp3?YH}fz6UCUR`d%9 z)gBF{6~QVf*2^h17Mw$Gz>HR_K z9O!Yn`l506xH;3m-QC+GQK_J=>NCF9D3tMjDkQlib_3X(gWT<6yRq0b>k(Ua0|!jX zm_nwlSrH;oA!DXOB(WZJ81j}@FW>J^<(#hT0cuhZi^nAz1{WG62zd@h7%v#@1y+j^ z)~i(}UH@ZXqzdQ=P0Vs`K4Cnth>}f%mGH{0#tGi6#fY;zCPAbF%?ySF zNDYU}Q6^y=B#1bmnQ@SSa5%*{jy`ASo+})3_A0EGc`0G}4mS4@nZG}X4gMBp*@*rk z!fJmyXT!ZgK!(mRXZMZi3$*JX3=50E>Nj~Dw&2aZvE`dIPxk;sa#hj?j^MS710B4^D?yn1etB<)Rh4~*o3 zXN*YPnM22{H;EyEW<+v{0|+Fpi)ly-$DEw1k+}O&E}n!b|r4sbDD%^6l;yG{svPCc?gNLnJ`o{ zfuvS!&MoyzBr}@i1EvB-0uMRH%_UwhkU$3sNXqtLzPO>M9Fagd;Ot5!A|#dxhg}jB zA-&dIQa(GG6A3&+MnVFgO3HQ>C+v?1OB%FHIEKV2CLt+lcRnOEB}76qih)y7g`1DL zh-|WEMOdn>$~MLI5tv-qK2{`?v-0=ZDo)rubHyn{{O+0~r!aw%C76(cm^j5mCP~YA zRfRXh3wmSXYNTKiQi1e|Wy9gv30uO6OpY)2MFAx#Oy+`p`n)qzeD$WniCin<5XFJ~z zcoS!nRx5sRHi5jHP4FttMjlga%4fNAdF=u-aL5Ct>R~(OfpAPQbv`rY0XiR`*|@ln zPbb9Q#MvaB$y1IVdp5yIayEg-gxPc@Dk(?fi5S#ByJ0_NE0E>TtIu1V;5GBL&9pN0 zZfq5&yf&qkryC+3M(YEA?r)EJ>>ENEk0vH0_`GjV2BJPvu)TcD&1a5y96dgNTB^VNYd)3a*0d! z8VNCjTmtO^2`S#6OOn2Q;%&XT#C>|Ckq|RL0`12@Vr6c&bqUo_tT>@ScFY12Y9}ON zU1>c~E(v9NN_w@NKO+(-7>tAjfCSnF5>i0m{0}5E7GY6PV#T4gC!|+u7f7fk5fTS& znoDLZ!r{bH<&wegAWANxc7cRy5+QNW07+@#rP?~{I~kQ;t@E(7>FK$K#-8#32NLBParn_DdvOlG!cImP)N_$drEd z(Txp)hy$)?93&tdPB9I~Y^juv&@otqAmVU&(9FX)NI*E8VhRr1d8O=hIao$Eb)|Xe z7*RAM4!RyT{?G;BD9d;b7TZV8goC!I=nf(9?x1GGAq3!#pcuzd7GY;)tvt%(`S;zv zQ^{Y3e!9DV{8oN=Z-(8 zR#&CAWp!0fL36rl|5ZJ!tMZ@ASzVP-&g!a!N>*2C7PSMfw7W{PX!}`m7OOOi+Ua5v zE33k3U8PNMWj_~@gT4HNR9;tUF=*d& fixture("downloads.json")) end @@ -52,4 +52,16 @@ downloads["2011-11-01"].should == 0 end end + + describe "#dependencies" do + before do + stub_get("/api/v1/dependencies?gems=rails,thor").to_return(:body => fixture("dependencies.json")) + end + + it "should return an array of hashes for all versions of given gems" do + dependencies = @client.dependencies 'rails', 'thor' + a_get("/api/v1/dependencies?gems=rails,thor").should have_been_made + dependencies.first.number.should == "3.0.9" + end + end end