Bio-Das-Lite-2.11000755001750000144 011560746107 13750 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/Makefile000444001750000144 120711560746103 15541 0ustar00rpettettusers000000000000all: build_pl ./Build build_pl: perl Build.PL --prefix=$(PREFIX) clean: build_pl ./Build clean [ ! -d _build ] || rm -rf _build [ ! -e rpmbuild ] || rm -rf rpmbuild [ ! -e Build ] || rm -f Build touch build.tap ; rm build.tap install: all ./Build install check: test: all ./Build test verbose=1 | tee "build.tap" manifest: Build.PL lib Makefile eg t README MANIFEST Changes find . -type f | grep -vE 'DS_Store|git|_build|META.yml|Build|cover_db|svn|blib|\~|\.old|CVS|Makefile|rpmbuild' | sed 's/^\.\///' | sort > MANIFEST echo "Makefile" >> MANIFEST echo "Build.PL" >> MANIFEST dist: all manifest ./Build dist Bio-Das-Lite-2.11/build.tap000444001750000144 1575311560746103 15741 0ustar00rpettettusers000000000000t/00-critic.t ............... skipped: Author test. Set $ENV{TEST_AUTHOR} to a true value to run. t/00-distribution.t ......... 1..9 ok 1 - Checking MANIFEST integrity ok 2 - use Bio::Das::Lite; ok 3 - Bio::Das::Lite defines a version ok 4 - POD test for blib/lib/Bio/Das/Lite.pm ok 5 - MANIFEST exists ok 6 - README exists ok 7 - Changes(.pod)? or ChangeLog(.pod)? exists ok 8 - Build.PL or Makefile.PL exists ok 9 - Pod Coverage ok ok t/00-pod.t .................. 1..1 ok 1 - POD test for blib/lib/Bio/Das/Lite.pm ok t/00-podcoverage.t .......... 1..1 ok 1 - Pod coverage on Bio::Das::Lite ok t/01-general.t .............. 1..7 ok 1 - The object isa Bio::Das::Lite ok 2 - get/set timeout ok 3 - get/set http_proxy ok 4 - plain http fetch ok 5 - feature-by-id returned a list ok 6 - feature-by=id returned one or no elements ok 7 - feature-by-id element was a hash ok t/02-statuscodes.t .......... 1..6 ok 1 - HTTP OK, X-DAS OK (code) ok 2 - HTTP OK, X-DAS OK (message) ok 3 - HTTP OK, X-DAS-Status error (code) ok 4 - HTTP OK, X-DAS-Status error (message) ok 5 - HTTP error, no X-DAS-Status (code) ok 6 - HTTP error, no X-DAS-Status (message) ok t/05-singledsn.t ............ 1..33 ok 1 - new with a single dsn returned something ok 2 - single service get gave an array ref ok 3 - single service get had length of one ok 4 - single service get returned the same dsn ok 5 - dsns call returned something (service http://das.sanger.ac.uk/das) ok 6 - dsns call gave a hash (service http://das.sanger.ac.uk/das) ok 7 - dsns call gave one key service http://das.sanger.ac.uk/das) ok 8 - dsns call returned OK status (service http://das.sanger.ac.uk/das status 200 OK) ok 9 - dsns call gave a arrayref value (service http://das.sanger.ac.uk/das) ok 10 - dsns call returned at least one source (service http://das.sanger.ac.uk/das) ok 11 - all sources parsed correctly into hashes (service http://das.sanger.ac.uk/das) ok 12 - new with a single dsn returned something ok 13 - single service get gave an array ref ok 14 - single service get had length of one ok 15 - single service get returned the same dsn ok 16 - dsns call returned something (service http://das.ensembl.org/das/dsn) ok 17 - dsns call gave a hash (service http://das.ensembl.org/das/dsn) ok 18 - dsns call gave one key service http://das.ensembl.org/das/dsn) ok 19 - dsns call returned OK status (service http://das.ensembl.org/das/dsn status 200 OK) ok 20 - dsns call gave a arrayref value (service http://das.ensembl.org/das/dsn) ok 21 - dsns call returned at least one source (service http://das.ensembl.org/das/dsn) ok 22 - all sources parsed correctly into hashes (service http://das.ensembl.org/das/dsn) ok 23 - new with a single dsn returned something ok 24 - single service get gave an array ref ok 25 - single service get had length of one ok 26 - single service get returned the same dsn ok 27 - dsns call returned something (service http://das.ensembl.org/das/dsn\#foo) ok 28 - dsns call gave a hash (service http://das.ensembl.org/das/dsn\#foo) ok 29 - dsns call gave one key service http://das.ensembl.org/das/dsn\#foo) ok 30 - dsns call returned OK status (service http://das.ensembl.org/das/dsn\#foo status 200 OK) ok 31 - dsns call gave a arrayref value (service http://das.ensembl.org/das/dsn\#foo) ok 32 - dsns call returned at least one source (service http://das.ensembl.org/das/dsn\#foo) ok 33 - all sources parsed correctly into hashes (service http://das.ensembl.org/das/dsn\#foo) ok t/06-singledsn-singleseg.t .. 1..13 ok 1 - entry_points returns a hash ok 2 - entry_points returns the same number of sources ok 3 - entry_points hash contains an array ok 4 - types returns a hash ok 5 - types returns the same number of sources ok 6 - types hash contains an array ok 7 - features returns a hash ok 8 - features returns the same number of sources ok 9 - features hash contains an array ok 10 - sequence returns a hash ok 11 - sequence returns the same number of sources ok 12 - sequence hash contains an array ok 13 - requesting 1Kb of sequence returns 1Kb ok t/07-singledsn-multiseg.t ... 1..10 ok 1 - features returns a hash ok 2 - features returns data to the tune of (number of sources * number of segments) ok 3 - features hash contains an array ok 4 - features returns some data ok 5 - features returns some data ok 6 - sequence returns a hash ok 7 - sequence returns data to the tune of (number of sources * number of segments) ok 8 - sequence hash contains an array ok 9 - sequence returns some data ok 10 - sequence returns some data ok t/10-multidsn.t ............. 1..11 ok 1 - new with a multi dsn returned something ok 2 - multi service get gave an array ref ok 3 - multi service get had length of one ok 4 - multi service get returned the same dsns in the same order ok 5 - dsns call returned something ok 6 - dsns call gave a hash ok 7 - dsns call gave one key ok 8 - dsns call returned OK status (status is 200 OK) ok 9 - dsns call gave a arrayref value for the one key ok 10 - dsns call returned at least one source ok 11 - all sources parsed correctly into hashes ok t/20-authentication.t ....... 1..3 ok 1 - http_proxy processed ok ok 2 - proxy_user processed ok ok 3 - proxy_pass processed ok ok t/21-proxy.t ................ skipped: Proxy testing requires POE and WWW::Curl::Simple t/40-dna.t .................. 1..1 ok 1 - is_deeply ok t/45-sequence.t ............. 1..1 ok 1 - is_deeply ok t/50-entry_points.t ......... 1..1 ok 1 - Correct number of segments returned ok t/60-features.t ............. 1..3 ok 1 - Whole-response-mode gave correct number of features returned ok 2 - bug from Nick Landridge 2011-05-05 ok 3 - bug from Nick Landridge 2011-05-05 ok t/60-features_chunked.t ..... 1..1 ok 1 - Chunked-response-mode gave number of features returned ok t/60-features_empty.t ....... 1..5 ok 1 - Empty segment gives a hash with seginfo rather than an empty array of features ok 2 - segment_id ok 3 - segment_version ok 4 - segment_start ok 5 - segment_stop ok t/61-features_group.t ....... 1..5 ok 1 - Corrent number of links returned ok 2 - Corrent number of notes returned ok 3 - Correct link href ok 4 - Correct link text ok 5 - Correct note text ok t/70-alignment.t ............ 1..4 ok 1 - Whole-response-mode gave correct number of features returned ok 2 - Got expected number of alignment objects ok 3 - Got expected number of alignment blocks ok 4 - Got cigar string ok t/80-structure.t ............ 1..9 ok 1 - Whole-response-mode gave correct structure ok 2 - Got the correct number of chains ok 3 - Got the correct number of groups for the chain ok 4 - Got the correct number of atoms for the first group ok 5 - Got the correct number of het ok 6 - Got the correct number of groups for the het ok 7 - Got the correct number of atoms for the first group ok 8 - Got connection data ok 9 - Got correct number of atoms in connection ok t/90-sources.t .............. 1..2 ok 1 - Whole-response-mode gave correct number of sources returned ok 2 - Got maintainers email ok All tests successful. Files=22, Tests=126, 5 wallclock secs ( 0.11 usr 0.06 sys + 3.51 cusr 0.56 csys = 4.24 CPU) Result: PASS Bio-Das-Lite-2.11/MANIFEST.SKIP000444001750000144 1511560746103 15733 0ustar00rpettettusers000000000000^MYMETA.yml$ Bio-Das-Lite-2.11/SIGNATURE000644001750000144 1141711560746107 15417 0ustar00rpettettusers000000000000This file contains message digests of all files listed in MANIFEST, signed via the Module::Signature module, version 0.67. To verify the content in this distribution, first make sure you have Module::Signature installed, then type: % cpansign -v It will check each file's integrity, as well as the signature's validity. If "==> Signature verified OK! <==" is not displayed, the distribution may already have been compromised, and you should not run its Makefile.PL or Build.PL. -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 SHA1 Bio-Das-Lite-2.11.tar.gz SHA1 35a92c14aeddba3a2eec662c27c8b68a74b572e3 Build.PL SHA1 b0afc2132ffbde00906fda894e54316dd5dcbcab Changes SHA1 d4f2d42e8ffbae1643b7867d72d091ac4def03a3 MANIFEST SHA1 30445378f588bb172f13558add0c32310fb97431 MANIFEST.SKIP SHA1 60a5075baa831f2e74a019cfc1e1f001e704ff2a META.yml SHA1 4c221f1014f3ff65139642b90e00c038133f7233 Makefile SHA1 fb0572452526121a14fdf1c7d4fde03b40e2f0b5 README SHA1 80d7fcbb94dcf9103a6494e4101d41c671af0aa9 build.tap SHA1 e97ee145ca4b0bba71e36f45279cdbc886b8f4ad eg/comparison SHA1 0e383524b2fe8a5c88c441e924439227f69530cf eg/empty_segment SHA1 9a36670573637cc07f752c28fea1df80c825492d eg/new_from_registry SHA1 9d021e0f8f97a301909e59847e6ee7c14c517935 eg/regtest SHA1 2b5cddc9bb424060c8bbf92f1596ee78a87d7d5f eg/stylesheet_test SHA1 bf05d4d43a89a8448c37b10d4e8b4abeb1a601bf eg/uniprot-test SHA1 341898af1a5fa6e617f11ca7a857ae217a6c3d3a lib/Bio/Das/Lite.pm SHA1 ac238b655644d7bca113006844d0e3555656c661 t/00-critic.t SHA1 4f35a0b06f28fb4c13347dc398e354afe048a987 t/00-distribution.t SHA1 8b6d86483f31129f7c64269838d44dfa46cb8bae t/00-pod.t SHA1 d27d6c01dee353ae57e633eb20679804432bbbfc t/00-podcoverage.t SHA1 14128b21a4e57ff9dfa874ba53427dd24147baee t/01-general.t SHA1 f0f12a3084c4899e140cc51bf3ebebb32388a9ec t/02-statuscodes.t SHA1 2a44b7bccf5eabbc8030372ef7f6c76ddc35f667 t/05-singledsn.t SHA1 571b87792008ad26d4006194fc69b8d5a596fcf9 t/06-singledsn-singleseg.t SHA1 d17fadc687f08f3dadf264bb447e695af810500e t/07-singledsn-multiseg.t SHA1 268b8af1294929eada5a2eeacc520b2bc742155e t/10-multidsn.t SHA1 41dc679648237ab3b8182fdf1824bee8a69bf57e t/20-authentication.t SHA1 0b90803d53dd26b893701fe4a4a63cde051c31f4 t/21-proxy.t SHA1 7bf952c248f21733d7de28412018bf941573da93 t/40-dna.t SHA1 6d7fa243c91c9b039f4e21be1a90c558c50162d6 t/45-sequence.t SHA1 224eb19d08279343ce9be726110acee195a9b447 t/50-entry_points.t SHA1 015ae2e9486c1770986d7aee7d0c9e868d3ff1c9 t/60-features.t SHA1 ee81eb3808e8886e33cbba11a702f8cc7c9033aa t/60-features_chunked.t SHA1 3bf6851c772fd2b375732d7ef55b9634caafa98f t/60-features_empty.t SHA1 959cf1bb336f6a79c94ddb4430fe578e04261c07 t/61-features_group.t SHA1 0a8a928c608b369af4bfa19098ad48e2e5d70ab7 t/70-alignment.t SHA1 b3b4c28b156d9251c97630f7cbcd096f1d2aa3d4 t/80-structure.t SHA1 78c0d25a1e7352c948bb4717a4660c093a47c0a7 t/90-sources.t SHA1 e029a59df52ab4eccfa23134766050d3cb98ec8d t/FileStub.pm SHA1 55b335e242af353bc1ca10f4c6546112251237a5 t/FileStubChunked.pm SHA1 e28cb4b2abce00f1be26e3f486863766e199e45c t/FileStubCompat.pm SHA1 b8ce1fb7c27e657c734bd93c7446b75659ce3428 t/data/alignment.xml SHA1 bcc696cc5f93712cf4dc53f4d482fb104f022542 t/data/dna.xml SHA1 48b1de5d21eef8ac2df0256e38ae1bbdc337970b t/data/entry_points-ensembl1834.xml SHA1 3b33ba4da52c32fe4c7aa5cb31c43076a65a3875 t/data/entry_points.xml SHA1 2d78e0b81b0f3134a9659da277d335aec5005779 t/data/feature-type-nl.xml SHA1 e25a2efe3429872e35227a143681e73c366b6736 t/data/features-empty.xml SHA1 c885de7b1b27a7ef87abe113a1532cf9844c4564 t/data/features-ensembl1834.xml SHA1 593765a2a243c2d63374422f3d9094983ef9cc4d t/data/features-group.xml SHA1 ddc8f9b21613a45940a38654ca8e7f93b3f971fa t/data/features.xml SHA1 ca5b4e2fe6c2d04db55702a1f755596f4f0a0a1d t/data/sequence-ensembl1834.xml SHA1 fd7f4c8cd09f86c71a2e33854a02c9a426a57ec2 t/data/sequence.xml SHA1 f4c02d7b9af1d019a4626e8676c7dc57e96662eb t/data/source.xml SHA1 4f44a6a90253e89e8fc12c211e7759cbb911b297 t/data/structure.xml SHA1 e186ead2aab9cf6628921a3c65d467f15f0f913b t/data/types-ensembl1834.xml -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAEBAgAGBQJNw8xDAAoJEPG6pZARLr4FzIwP/2z+CBE2mt6/t9cNddezzO+K lYtoydHYTtsdq6u6mEFCC2mJPp+Vp5fD39AII1d6zvHJ+NOuySbFiRyBv8T58GFz kfn2dSid2XrFD2ZfPeFDIjsohveqXkKBVljiMLpeDJmppQ2wlDCvxobMzWL9BHHJ ej22pz+dKlN+guVeQ3OMpBnBGiMU5kuupRD0ivm76W6EcjdOd6cuyxnRTZT7RoPH eFHK0auKeigo1QDjt2Aluh4UsH958tgq9iFmJNGw4VKmqlsmJvZdc2KFpoWs5G1G T1/DpJRyW8u/Y4rvYv1h6FxupBxb3wGuG2jC1wPP1K+7MFzDQE7N0hCIficPhHv8 Te1R+77fXI5VExBY1YzV/Iobyprw4Ag2keFzsR8YlX9M4x88st0LlF6FH2Y7L3hO z52tRLtm1VI7vLNaKHNKeA9SPVBIvnU47E28fMNQbHCh3LIfdExaONJ1GGuu7TM3 vieAsQX+ZTZgwCXTt/xXRNpeW6UB764Cye51lBi8FrSV3gJeNK/Xfmhqu/LhVAci 8V3CNfz/gMg+28u7MUiZhxWJGcE0uTE7fh9Y7HLX4ujhlhzwEQqp8iZdhKq7pQDI sTIz/livdh+uEph+JyPoD0h4iUAl08/TxAkaLmrNGNGcI/2TisrVBSWLR7lnaBDr qtFkGW1vdwz0iuLmolcv =RCeZ -----END PGP SIGNATURE----- Bio-Das-Lite-2.11/Bio-Das-Lite-2.11.tar.gz000444001750000144 13307511560746103 17771 0ustar00rpettettusers000000000000{[G>uߡ+ABGN1$9oТS4m}WGq2<#Y ܫ ̕W) W_ j J嫯* |J+*wFp0'8~4%cP/(^=Yxl%R|Ob82j6'ZQGfQ뵦?)he^o)y{r^qu&|٩z+ :)(y1[k4ɲo\<6Brq)ؕLcʔ;pN}=z\AS߲3i?,{Q+: g+SS0#>upP0TӮ驩viKEHk5]W*h_;)邫<ݎߑ*S3UT9pAfıAxY"veZ oWǪ1 #_DcHd<,\EaǡÏB xlwp {w ''Y\a ,dQ])/R(m 2$T3q^|T )qzѺ6ED#m"[Lu;#7s'a@ JilxxQ;T3 ےi? nlu9`ЫݏB'^+hvpP?e q 0wtk6T?ď` 9df7.vi_u*lɁ3W`NԎ0wa@ds^Ϲ|SYV{.00iRIH*11b’~DV67raIY⥚[a#J0K*EL'>4@P%Ũh"}\I>TAG~p,K= vNa,qR֑퐠<цCLUe-x֕F#|P@h[z$֑&Hg9@ˠ ㊛pj0lPyvd0IF\UB5e0P9;*(&'QWT/S{w}9UWfrrI_55$w1In%!DaOHv!b yjzf$*h'BH7)=b/%ԞҼDڌ?]ĖI!JN%JN%:d_J'ݮ{m%) nT7ki2e)EKt{k{ۋ5Oh!ֈ̷(<QkN#?_R'v EPN.4CY;΅0Q*>NnGIO2J q-3;_hD4\f* lNq]Μ`f`hóHE:%񰕟z7hTS|Z,-)L:,C*1 '_}oGjQꂪR<,%{of[?8H?c?^R_ceRںGC2m&IB2N!&_GZ*/>ۛ-9o)׻ml5#Lh5L 5&j}Ps)5Cf ;M9maΔ"gJY@{^*WҡD?CJ#Fx>JB,_[&aM8m1~ؽ,SvYk,%  ( はE'dNlCn˽(84rW\*W&XNk5~ޢ{Y)5S\忲ƂI:m&عSڥRx0m]5\!WI3CS֣hJK8-L}s /-..JhQ'38{6{xq3 \ᨐ +J<Tp)<龗bjloKi?i;w؁G D4s k55axjE|"!׻6b֡?N$ cvδ<=]i#~HnpeEFA>dg[#zJTsk٩Q0EC!Y]SP13KShޅe~Xz !cYSwג0>0Q`L4=44&(ֻnkNk;l W`NK`Y`Arf_|?gθ"l/,FVV{ebۂY3:RJ+bAAצX/vZ^QSl_nlDn l ՖeR/24FL1˱B~ioۦAZT쌿imBܨ`x{yvT74]Ⴑ%V[3ԡnʽA%z0 o٩ͩ1j-gX zeHqt1w6ފ`vؔNb\˪ ;XUoGP5YNzmv +d߼HWXK c_OG-?7Ns1.s=>櫤POM1NԞ ~D,Ps"c OZHŏMxwե? NA%ƧCߎij*y`&ڶa`$HN5W4$VPx |H;~vW?AFV+~uẋ)N7?^?qnGF6uErMݳ/5Ea"sZx3^AA*@4.Nd쉉>F'>a w;T0 Wv;CHsQW[A8ٷPDM|a[7 Q; T:2S,)8Bc310 I+oZ᱖¹ض{131-8& e#bC؇~<ۅFW# "'aAdz(16:*oqwnރ$bcuǦ|F[RGG=V̷tZ3 tb vo!>"`뢨g{`@b\2ޜf µR b}(SLOY1PX}wc@e0Y3OH y IW~]IcxӈN[Nk@*)pъIP' gIr& =kQ"Ov.-ԴÓڻ#q1#ؓE)!v#}̥k*ϱa*BQJSN,1~pP3{o"-d֤VQUjSo =βð4ءWfNela&\ }/@Ւcoّ5iqAdӲWiȞ#hVDFUg!qڐV$J: cN ڄj_L.$ ^|(V)Vfq~(*X?IK) %q55ۓu5nB  j \`v .s ),;;Ӈd`bc9$~sM汰"OГmHeQ~lW<Ɉ ,>hWdL^;*3.# 2W־`gO!\C=|Ooqb@!MLwO۱@*L!(>7С~Nܙ`62#'fNHSlNsy.\LBՅCp4| Ncn~M3],=ZxeI~F6D,Ц&׋@V-6D-nYYkJB G*'VUa`,9jKdHTv.XgL,uPD Ùc@NfO78(^5;ÏsNu.TfeB} ͅ0pM(Z/`*m4. cFȢQ#$rPg/3XI\cV+a f9cV12ȇskJqs." ffi}N=a!B,\Xօvq?HkT;Yuj ]HJkɣD^gUpr[2m}Q,H9!cIasNݏQ.F ᆾq_sNR1G}*e[؈v8 SZ&O2&a-=h$mhC̑\Y,N)OڧTl6[B D͹"ktй(dW?7qeU\X)/`Q"ܤ:u&1BVHإJ#XVKeMJd:W?)`]nn|_ c* GۜImYSTOj9E6VDvnM(d'@! .44w(rA<~r:_-iCPZl~crӝ",<y+d- *-މvwL,)rC%MBl`]V{TJq֬ܺOf_ؚ,FOpv P)FNj4oE/Cc-xASW98\jp{wgj=dhF< 58W70OmRh+>ue?*$ x?9;=)l0'2~St c=}0%ڤCM$$Zlx^ Dz^\a-xX-7ImY?9REWb/qDơc ,g}͚̂m}-;n#~,ƜUqt-hl 'z!A! hOt `xs˓SR)G`%3?{A)j}gS8llqw R.R&i 8B"*}C2i!>3+d}[,JyIQϧ@Yq#:AQgNȊgvz){q:J`{SIU 8\ca,y|X#qrGQ2=Ll)MpeK̔P.0wo9l4+ V`Xr-Ek S" Hj؄L_,Y(g⊘49Z6_ڣZWȉ ݘ3)ʽǙGtxe{Z2ES^G69'SؤLd R[ )%Nif")Vre]ΠqWL̾TVRGꯟlmYes3H3gg^Qs!_8KfXZ-ؿg"[5+Y`aN fxDDhbtO!N2IX=XJ~UEd0[;x`I+Rq)1Tn /Z\ thiۙwv)sg3|hE}|I*L~w5)&'d1N.HR(oT|hݯ0;& ףw~ftnB c]еO_!LxHKWox' /x Zw6m ၣڻo%TrYbig@lٽ1nL˜Nh3cŪq't֐Ũ[;O q {!dڌ&G g^Dij5]^ϦJvax}. F{TOD/z.FZI]g߳o 8_L߄ɔlh=rKfAc v:{ssjϙõ}-,=h7<2?͜+9U$QZz NjΛDAao9JnEE`(8t$Z=R'޻gvVe qA#F GQΨ!t!@7]S%Λ4H3gv@H_n (L&/%_T9?"_?8|A!"V*ڮ_o]v)BΆ$Q9+ ;RzJ|VWՕz@ (vEAdZU^ߞlNN;cp}e8@ ԃ7qj@S A`PL|]ć(.@4Tя2[:BȎi2%HG"w+_ ..\EnrmtEӽ]T3@3սx,W]0MۃG$p.h߅/{ڻ_Gw$rZ^h3 XI>S?qp'=si?qt/QB/GZH#~VIڻ߭;$BO;Yt96hSe>v?ap<ܻ8=ޣwajmc瞛d]\zkSvO?Ѯ-p<24;M/ɒbl&l '7-"M:>/ .u_s/7 . ]6cwh_m7viQVmِq GmL&~\y : sDWYuz:'[ЩXđgrwF+L8ӚYp&|}m);s$/h^?M\4+h K =:\]t[\jKZ-.Vq%cg*6oCcw:XwĈ7Qgy~&%(e A~1[P (M[\릐].Umτ?ΐ~9ʅc/GZ'Iڻ_8w#܄W.+߱;\xL_3ڹn瞌ߕ3+kL(yp!g< qb(:2z"bXhtpɾ"%c;Y7ad~3߀|aRz"vhG!E+m$ufz ~574Cx[Uo{whwHq1?Lj9fN<I>܄kĐ|p%υG F O @&~#^J=DNU3\4+u&{a/_OGtFK g$KҘڸr &IId(bs`~lel;=/ C nH8ԽLO4 ?Ng폨5ܱ; w;-8B8'`0ȽV+`RB6us1p /JQc+/)xs7 w{IPܕ44hȧ`nI7,I5{݅ !p[=xgќx6Ằ{ߥi[XRarQ/ˌ ܧ n6_UR,6iX?3I'AK2$;EL60N.M$gT$rk>wG^.NnbS<4CJw %9gjh9Ֆآc_' N/2q?6Qfh}Q 49vT8Rݶl&*s ?ND߫re 7,6.c,kwc=f];;]%#zFJ+FLMS~>`SBgW:S= Sq XyuaN,gxnڭ_4Y)0Y\pcfY ;g8/Wp?A+' @oP(;0q h͋|)gTjެ>NYJjmd{k oǎ\)_,au..\_%oo'DyKoĄ;?6VV6 )bPMcixak n%܄nbkkZ<f] '0+8_-xűcg{߿n쿖k{#M6<W?,ҽoy` V^߉,ϓ,)ahC+LݙvUf&_$YOo@W;׸FS_N}[qZ4-Cb.U8WM7E^`0''A`'xRw| OL@7ͿlIjucOx$CHEqwh#7B`k`RMuq9`hMu4 B$oK( qZG/ HъZf. #oEZ". Ӏ̧]*~smTE5ivg3H 2Yt&?81!Gg<&_Dӂ7% 86PXÇ`HÂ$/T$/ 6fؙ"dK$$4G$pr 1++gZ xvH9"|&=c!u-Now=D31,̿FxJz)M9WcXG?,,V?=|+TqqRX?"Y5>O>i8|ndpPbl6cx4Įa%QE#2"u/AsrUNB'.<٤%˺B: #Y%"}G"?bG,,\YZc875G*Bk5!GуѦ584 y: [v-G IhWG4ډRpcI=mل +'Pݔyj B<AKߋߪ|l[c"~j3Flrg|3V<,R(V,h1j^.Ѹy0׆/Vh ۢSHEDϲwRx}<"z,XZ(-dba-f#_h~b{o6ݢ~?駟`EBe $Ƅ39-쯬n#GxT$qpK){,Y[FWX ƈd#m1\^xi.p:Bk@ЊDbہ_Y%"a@N0OVPqPGڽ!x'3P`(6/܁m. /S NBb%j5j&,y3 @ )ӆ5a)-8W7S%.afT6a{kۆlɶ.G-gymwkQkEiy1ݞ0F;!}Twin rfܚe:ʫms)DPCOw_wB"Kڬ0촚ga[~o_ńf Ue͐r /Y=teƛW{]i˰*#MQ {]}֦ϰcLutΩ`©0pFw'fvWik"i3Llo5\fEi9TbG]?D8-{(xӱ8ԌDƓBipEǗ&nepmy$ CgZ Y6Szc-&;WUt<h#'jJjptdngdOpl7yFSMm!u|Nb86F{v jb`NtE ,HzI):n_=rF ;q;v(xe;!EYɟn W{0 aj~O?`kjNZߛS/t ቒE|z!Ѓ|eoe(Xa7HafE.aqoomB\L>9 7C`ܚ2jyt!ba~`{2f5xd%_nUFh<]ߑG]q?{tL̾9)&ܢsaPz`-l7ʋeq/vE3MO1 .E+Cjm0+Q) VwF" ̘W_$eŠ0J/BYxu53c*ٮ4G~2Fv(30(ChMG^KN^ui.[l {*ߋ xۏK /i>]{7V#:b`6ZD1B >z0;!vmGPTr Ftw^q9s7*瀂F݁CJ.'#o0nG{Xe[:MCK.n,ҎQ_̣i/T|EzERtx v"8<aT=s|M8?(!zY@iN cC6!ׄgwäfMԝm!s ,\aIen_pyt|rKɽ6X1S,gzd6  C @ u2gQ'e'ދ}( ѷ  GՋՂ+2,FT Sr!Y^u5@_;h{`jh=WR88Z !Qar,BY&6$@L1oӶ tQHEA6z"q0`Ev;Omyv:c|I:m5 "qv}:6הN|:o1QyJd0q3/K?rh>{B7Y[fkgcg\|N` użd|a >G="R Є٦ٌw?=֏10QSRïGo{r}w3Nlouvi$!,Z F@_؟yۉW.o@J=ͻ/p 7ٛx\G WM_[l[_n t1ʿp7"a䃺m n3ݖ٣8}`v $B>Z0)ady~wnZ(m iBa F̈́Wesꚿ8b=piQ ~0+V8/6d.2;X_s_~+6iZ̗ݳZJ|\+C籛~ȗ6NnәM?B{/yqG #!a`"ZI@PEűϋp y<:ICnV>-9G xՙ9=眻l[*"᎗8 IRkyhphIm~!cXBC/&94hCYȊ?~u }r7_]KM /Ő"M3{a=Z~ͭfnѿ?q^3cQtuԏ:4 k4 n n3Ƒk4оí6K 傡N`1<UIQ|q\U%L@;Uⶊ%4aꓶy6JP{ɵU̗mѴU$Lj+AeV)+B\[ˆCW1 DС)۶*J (C,4ɗK.E>!m@<;0LJˮD0Qgiki$_zTeDnSlM&zPy!_l_X &EG踭˸oF4Wk81OɦP,Uf燉3Iq \xJ> {? 1t%C+9 7s1[Qlb<]t/Y F`ӭ ۄBw]O9%_L@㿮77,iw?`ܾgGg>a:YS]E ̓ZyD@t;juS|+wB' /՘Mk*j$98IBHaKYSVNCC丢Wit üVK杗|`S0oo`"z;-'Ï/dGg[P^`7s1W(]܊S4"CWt#/ R^w<XΣN΅9c{c%}-5qh&ggkC\D_%eCa:U@;kI$^g7f]=DonA\b0S\DGkUK%@MtD9x3rtB}7)sA8} sز(<60^U+7Rɸ zF|74S&7àWjc{a+LalL׋*cO2ÛӰӽR)!y Es{A۸1=}X<-gOelX_m^,L q2sQK5s!U^3_תސvy!8;x!؃ւZ\-eSKL鿷5 @*Ά ITP.knǦ~z&aobϒR% bnhpiK&خA/^m\+j4n C)0&nK ,>U\aLAb: >2b wkE:irKWܓD_ DoW=Y(}GKg#RzǝRA+fٙǍ9qνG3Z OuFʄ^!K5L\@:nMbk0p#*OR(;I qZk`QhX/T : V&q aoglRNJ)LHš)2fO'Ryzġ{{#$jr9Sp(Y~nX[HW>ߧ$VU-v R{[g qϯka4Sw0I,>:ӀI8LHŢ)2fܒ!Rya 8PFaCEoqfy;TH? g8HGr|s%`X$F_Nѭ3Ilv!Y#5zե/Q w"'[xpJj PiHߧ"R:x%.C)ûIjޥ/kE]4'Ń["QJ5{[(KLKPcE R1x'+yiұ_GbN(2}9;\"D\>Uit}L.T8V(vKb `M齭u'XV{nIi~4([gxkT,b3vjnjq"''<5H2Y"w%I4 =-a]3AD E& bui⺦ރE+KX 'NHT<ͺ.M\ץ.~L*6pMZ_a$FT$j%R|,to)|˿Ytw^KTL\1`y.rŋ|䊦@*o_MtVTŋő);I&Pqi8`t=Y"w#wģ^ DcIHkne5ܺL"GnD.pF$ LG] w@ G 7.BD4$hJb.x#=5؆O+M[D5iۋw$BѯqڡŒ.N@*oйc?M>;~I很hU"ˉBKg+Z.#8]֏I]ٓ's@{_BNݓ%R|DB5HVc j%f=OYG@4A$Gb hLgXuP&Oʐ VQϋbwYCLGwo'[VLJo^1GTmv;mFoi@Jц|EvVJ Ig`|Èj n!_&dT +.B&{ 'KҘ I~8J!-{^˓oG9%(ӬBP.$VRvVt+L˶X0Q u}ݾ+M^]Hh6Y?1{&6R$- @$!RR[ZxA * 7%R1yT; | x 㗫@n~3@r_rC˸ʻznS@Js|S u}>/Or?ERɦҍE#ERx7&p{]ܐ1ĻQR~@*o'+yX -="xzLTi #+i] w@'A#5R$wD5馥 +/oJYىx}zN4V2V+`ң)ǻlj.Zm{ Vh[3S9Z&wtR&?{VN,M.@9!nH*l&yzHlTq%\F ČqQK&& bDBq-ԣMHT<Ѻ-<ĭYȿW'Y"w'f&K Ј cRiKݺw!$cӊv]C]XQAfG׶,U0RJWS ^&MHS,% HT\)OJx qIKlE=x{>aH܍P BX*NFnY~[6q{aѢnKd1GY݌=]Q0b[7uj+Yh3t Wa;N?۞}\:o臸3- |'oU78Baa{͸ڬ E)Rq@ÿSWl,(dYLv5lGD7%sE"mΗTeGTY,yGC?ĥ9^s_/$ W*QaLJ޻DPS?n'%[ytn[3qO~ma++߇.V%ʁ:$IS~;=]`Zj~N^!X`ea[XqGBqbwyp~1uVo7VAAn4U;kf#Zx3//^{Yo\ml7@`fQ N+- pgYzKLx o*K No}^/?uuvzvԏ_/#ܾR^\ތ~&{܇$WiփvoxP*,,Yxmo*wkzluu t! ?} /c?H@v5GT,ƒ+jϱ`Q$R i?)\ {k$^8ps`?hnx+ݨ5[. R5TAW^B$",u[z?ozu/M `CaWČ-"wq[>'2KwUkv]RtzkO0pqKzR:jK^ RY&C : 8Uq>@W5 hp.o~:mÑ,   x7utz! Y+8 #_t)|e f]_K$n^DCېa) sN,2|!V/  pp@˃vl #`U|XS9<$>dkYԔ`fxCˀ2RU6W(/4aն9t ~zcUR\XZ^!Ւݽ:.a`/t"2abۅjw?Y*lbPl="< O0raڂ ^8qzNp4Wœ0|1+%Y(eVl[2HV*B.aCkfk1r`J%s7ksIީ #0fc 2 NW<9Y# G"~蒍ْpʱmLp#km%mIQ{f& sXBi%=Kg=p?sGx^{ ylEĦ* ħċxbZnWKmEӾeUGZ6quؘCP]1ƃPqEh,+r1Nj;OHϋ~VPv^S]w??B{  8x̳Tq>K| (bc,)J"yZ^;eb ;;8*'.Nlj!Jiy)W. !!G~L7ZCp`]alUCT댶(^zQKkbf xjY"S} ]̺K(h0Ԋ ʴ<ν͖ ȣ'3ry^/T kNƵ ΧqM0hyþ _0iU;D#b,}LC KHGX'eZPNjKNev~?o>J`B2"?B,1zD/+l& .-sH!~n-chE\B?kATÏnT3MHH1!5Zy??T$[c3ѳ7tYDQgDpN*{Fa?@&ǀQIBl]X\8yj`v4Qfu{ 4!1iii?3)右<}['R0' <:q̰-%7AC7/2vρT Hw['lo}|4mTh X- m$׮K].vop~YʣE@I`ļ\&iS#(|.P\*W&] jJ߆"ʴ?7zA"+KhO˨xrdZV'A̍Uʴi?Oᶐ^0R-p[\Ο|e~9-p8XhVH!?<砝 ZY~<ڷS3"x NM ćr*mVskCtp uUi!NPG㠆Xr[cUEud?ﴚu_j48oXeU?M}?z3AX&n'Δ2 }Mt[ߎPoQ3EMڣn1>wNo nn~N%:=0ghymMAOwTW6%_-G",';A[Hdg65Lt2scB¼Sӿvг\7ӈ:|˘=8|b#g24ȤDȈVU;Oλ)ZnSF iTtAx7SOHUO&q ($ɫܚeUfN{6KqC'ʵ mDߠ~Sdf0D FcHDmmJr#`q+C&#؉#Q=+hU+t:?tsXf*7ԓ1v8;=CP,PҴ'cǪE,RjH Q9}uueR?{W3|Z2`6 ne9Wf;+3NcOoSgϚb29|;ZKr4_CHSPDs"zuA8Ӕ0 Dpu22X ,x9*qGgߪsckY4uތwu}5~Q`h;<o W{Zհe?"?N~_(p>)0Owȴ[Eż;&wɭ#t021?/ l)y.pw$Ɇ 5A=?ߐ9}i5mI;hs}Q8i [ ]u}@ #s/YZ'^[U>D4:xR?R W7q7ݯރ\E>u|ò<: ۶հ'.HȌGߢN C%WF͈}th k{B],܅6l3Sr2 T6p; K`W({9ZPEc"?oA}S>7FtU3j;f^a7q=|}?nw@G7;{iۍH3fyj91r T g^A+6Ճ Jsvf+Ar@&꧟~ZY@ cO[Dm=C{KDR~Ub!,:Zq5aOq9nhcbđ _.yd'xa&̷SʁvۯvZ::֋_e 3=¿?=ehů7:(_ル~wn ?SHl폋ί}͏ eFJ ⶐe7í!g/ ɴUs}4`j#9wCet]3,JBQjr_ }T1up}CjT-%:EΐڸB/ZFzT/KugWݣԇbJV@4L)eKWM*.Enjaǥ/!Hl>VBc ̼0[XQgcta[8Y?<܏olvuY p)C*^$7ɱsxp=~]7ab˜M3l#s#$xuIL r׻;_^mMf~W[m#\qR߾.x#l5NWn6[Xd,9a,̫lSO_Zw:aQ]D=yW]9x5ګTƞj7(xYR7H :n֘Q'%M$% kyˑB&^G =AO*cW {g@RcYA;s0|jy:,nػk% XbJ9pFqƊvcT7"J{#pMY8vX/ӷW ?~p98T ?4ED0/*4-jl*a焰)+S?TwcL# X|QϗP+*(\/18lμSE4>EXI xBg ײs6'l9ȣ=elPsdiMY[Mr_g)4KbH#4dgUzF%-)$j%&5n?I4]66pH>֋CaC`5Ҍ!ZtdC(5Mpm,(t\ؠs!{i[; Ğ,DhDׅ@Cj|DRʤ>Kbg}z}(] 4?yru2 oCmhQYJU~}gS?ej2g 'k]ՌٯuJTՔqL9fO(&:͚fTq|Y VŰ<:I4#]A`HމȄ wED+= :bk{$&*a)/V%jrI?+64d"_xv)i\<ʎ MpDC m :'G)/[fb V{fk#I|P l,dEPC@#vrO!c ="l#99H }NK v0cI(HDH$ci띢 M6 T ?ƁoU3'V QGk1[Ywq %}q`fp,ZD&.uӦLm'ΜvI-'`v2 :jyAK89E 6]t.hsծC m&p ywAjIS@jtwVF 0G >ט#zxjZ+e# s`~+=uC\0./bAD~JהJ߸>45ݦJjRqD`@`\b~RdU+,5!c<4E%&XUo\#X5cH#HY<4Db=fVS26 Í.Q0|gĻdgWTqG!do *5e#~Z>Q}ZpƩ$@M 2 ̈^ Mb35%OҼUzr62Ե$|\\3r΃"B6)S #K'.ӈ cH _$ gz!hs3L,U?4q~R27h]SC'&_wAIP_s|3!*|`|%J%>ixc nV'2k~Vy0[>5P&6zDcBTTO,j1nVD#F{))P@gBQu6nXPoaz@)NC\< F V6BQ˻#<Yn@0#?.&[S'I~.!ii33 H< ;4_l?=Gj\q# ŦaCFQ  &V(ErBE02k%9rI'A#6k0(UkV5lJ .ڤʚq?)cl_l!nyG~Ɂc23&Y40%yFߐQк52ōVwH?k 1Y[R|œ}Ů6f*)`@D8⭬왕uRuYlR~uȓ)Lln1fKLC*&r4~9xbcBET=y:f9T MyئF\BFQ#`ZM8O\ڠF)W X|Xӝiv`x'x,n ps3c P9'_?_eEU/xBN( Po3֪[T;;H)T T`g|U$ّ!P5@T`煥!k6vvw_o[>}jW뇸No_lh*>swMT"PN]EG#_xpg)KM,;sm{L_ HZ=R~4~{#զXNp>68z . s:P"@8$`ƁraӘ=,Sr-.=f"wz ^0{?"oڙ(czJB3'8mdȨy@ }kCjOgP%bέao,K'4y*8!^'379b B&l6g^J*RQh>'S-b6 եDLu#~ ٲ7Lx.0d9X696VHUOQk| 8ɑTuwO6ϰ['s%|z´,Q½&EwB7E|b8o EE5>'E [åǸӆ7|HhxrXB ﱊ2cL䷈ad4$ Ap}': [3s ]s^s{17϶Q Biѻ'Cge,}!k]{QFJP P=Zc! 89 %{}W' ҷ:(^,.ElW\aψkM1~dc]jq="OYЗ"p&I@VI6/av7@!̔F7_?oQB1%k3 ,6BYq/^2A  0H0>1!^@6bFv⟅17XTDgTVty [AM @Vu]PQp֌ m~:0פTc q*1đl6 ZAm7n!e~ڗO#$@]VB[.҈/7Jݢ X["k *&:^w]iGDLF4w!rUr4? v6)7ѠelMLL,aoFhpH5CXfRP*zqhWlbԅePɽ;p;B>^&8NIg1* ٖ)X`B9&-:M,@ȸO 0;Ɓ5v4Cq0dFi-4=B@Tūi ; uVyi<_󊀰Զ9ϸ &AߓDyMm8b59uVpwH1_`dcyٍ>W2d*1Oɋ+Nb!ܐ+lFnk2]bW$Rxq r."7YɐI\0S="΍+"']QSİsQ\ s`c0&WD^vG)H1YϚ'Yug6v4bW[DL历~ 85bwxyȋSɢfOCu܀[X8晞u"|SN\`?._g =})ͻhNZθxǸWSLS <5fҥoYdx0(Y-vo ~veS CL(?%ځjS͈%bb3mG&+ WMfԠ3UJX.g>L0-[3&ֳi I\2 .$a]HX똎u4s}&" onB4?o7)rd#-iIU>F^3-9@)r;SN9$L,])cR1AdV)V.*ؽ&Vu`frHͲyGrٍ"q2k?9؀k32|Ɖ˂FRޕiwuɠvCi/ ƑS ] gtm飚'Booݕ63 tKy VI ;`<\'GאjЍk2d/&0>HuhĂB!SkƳx'\ժډ$rkwEVA ҼiJS3B!!ڸ`37g1$ +5j߱Y/a:;/zPOI4KrSd`< z#xy%( vՐ?ܭq'46x>B_qZVdg.w"'-mc3g5׸%Ũ4lN);8ۘFa1P2r5. 0,Vϸ̭ f[ᚃlBCN% e3EMo-0DVd(Db 4*E1*;+rA":!,,yp\Jq bjKpM!5P6$$jD_^ݐB]S6 an摾3\QEn"ຒY'B51LDnub@] p=h4\ 9%lsjNB3i&=^HL#N7zQ be9y/!&=p4pO\ Cߌrt?oŤp9F]GWaF5;䘬kF&-cjvAY2^tq,Hֳ. s_k!PbD+FMͼj0~߁͏cռ@4HȤ,.GvLk 7Iq"6gۇmzu&pMA , X㰚nifFmmIiFr4rܭ[HHMcZXcB/d[ȠX15lҳ׫16Sإg,z<0XOc,;CDLԯsJx#E1g~1s_I-h2e riA%][ʋĽ3;B(l.sɝ 6G?oĦCX)abCVq M8թxY2(Cff -|B,Y/)fRְpj\9ߩ9||YܪS=7ůpL,6Zg ^i,)6uc0c̯c4I 3RMƎ`zomm.@f65JgբbT2l0u+GQRtnZ." ½G.4 iua2S{a&ʊ{o@:@dy\JFK:^>we̋Zyqnexy1_BlxIFVt[R.no9:urwˀJ>8qSCDp![{EPb`R" h|Ln 6I\T,[Ǽ'qag@+ a2 /"53.>GEouq d\,-gvEPÐ+\]fhY@9ьN2zȱx7ts8$iQCK#x^s>c(0E@GD pCEEyPJX5H/4[&4mi1L+e v;A%z1Ca>kJHK$lBcє&m<ѤcZ), ѥ~RGvג)'a?3X͛v#L 2:l/e<6N/DHa2Ms}z7r{ͦ % 7xӹ:d1XDp .c[Jdch:K3*8bV31QRq:`pX'],;nL\ĆiNp'0J j`uhKFnprYaʆ-Tg\Ɗ;oq9Bpⷙ=;r&'!M<79E-zc8>_¢OM^JfJx3HԢ /W%Fr&yWO=1/f%b )pM+PVL nu?ȢbqF^A7ur}uFbMCsc1f\L}빋\%艠"@5"I'wodrXԡo׻P6zPؚCyKfWOE87ɸU2w͸Gk,MaP0f3s۔YQcUUFں(Dp68&~HM7JG̈́GM-p)HF3^yn jq&T{gTHN"nd+p69Yǐx͈~wa@dw!)&К/%G93aAd>C8xgHzryNP 4y bhzn= Q-rSUACo|$X&n]oɡ;{'%r~J !pApc "XʠjjE[\MЛ.GtVpeN!F~@iqGЧB{4ڴln'?mh֭ jNi[VbiTV\+̻YY ̫Jqs'4O"7|}Wqj)f~`7͙7\.vm4k">CL*|PXdI I!u+u-5v*Y\E`:-h44kaGXR 0%ˋ.2+]kۿw!IAL[Z%=d!"]}pjϲݕc//ah4AҠ-Rm!\ .UʘX?v 2CЪhz95ߐ*Q jwibtqUwQ$0j;Y`̀W&J[$W3ܓDV%>`Bvo٬&墋 f1ϑGYU|[SX9{|/2H7Rr@1|n=u=h0RA9Wll8к2ccùUD'1ͮg?Ti9彩WHQ "My+NCl Ur(8+{gے8܍9~g%/^,dclW@ kU2) ՐXY( &.MfgA 6;lT!DV^VŐŧiBf`&=Q1_-#l~A2#7-oTg>j*rvvHkw&6>PSOjsko q6Φ6ϑM]yвo`FTfvz%pl5J`=XAxVLIܾ9zq'Mċ>2w[-9ʇؐXSiW5k3! B*@FBh83!؞퐄2 $$i؎_/86}';d z/@.0-SS?a$ kvJ̇{$ ILǑt=pnHnN̻ajg0GUmLg+oN>,PüTH -"TPQg8c)Q/DzT@chd \qk^YH=zz{ӓj{ck3qn<9`LǸ^0<ĬUdI*֢K$V,<+eI.!cM#`1E<> (lgmٳYs@Rpܓ #ߙՋ|:<%}ЫNe7FP3*Hc#1{yY<Bio-Das-Lite-2.11/MANIFEST000444001750000144 204411560746103 15232 0ustar00rpettettusers000000000000Bio-Das-Lite-2.11.tar.gz build.tap Changes eg/comparison eg/empty_segment eg/new_from_registry eg/regtest eg/stylesheet_test eg/uniprot-test lib/Bio/Das/Lite.pm MANIFEST MANIFEST.SKIP README t/00-critic.t t/00-distribution.t t/00-podcoverage.t t/00-pod.t t/01-general.t t/02-statuscodes.t t/05-singledsn.t t/06-singledsn-singleseg.t t/07-singledsn-multiseg.t t/10-multidsn.t t/20-authentication.t t/21-proxy.t t/40-dna.t t/45-sequence.t t/50-entry_points.t t/60-features_chunked.t t/60-features_empty.t t/60-features.t t/61-features_group.t t/70-alignment.t t/80-structure.t t/90-sources.t t/data/alignment.xml t/data/dna.xml t/data/entry_points-ensembl1834.xml t/data/entry_points.xml t/data/features-empty.xml t/data/features-ensembl1834.xml t/data/features-group.xml t/data/features.xml t/data/feature-type-nl.xml t/data/sequence-ensembl1834.xml t/data/sequence.xml t/data/source.xml t/data/structure.xml t/data/types-ensembl1834.xml t/FileStubChunked.pm t/FileStubCompat.pm t/FileStub.pm Makefile Build.PL META.yml SIGNATURE Added here by Module::Build Bio-Das-Lite-2.11/Build.PL000444001750000144 277611560746103 15411 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-11-02 09:54:35 +0000 (Tue, 02 Nov 2010) $ # Id: $Id: Build.PL 47 2010-11-02 09:54:35Z andyjenkinson $ # Source: $Source$ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/Build.PL $ # use strict; use warnings; use Module::Build; use lib qw(lib); my $builder = Module::Build->new( module_name => 'Bio::Das::Lite', dist_author => 'Roger Pettett ', dist_abstract => q[Bio::Das::Lite is an implementation of the BioDas protocol, http://biodas.org/], license => 'perl', requires => { 'WWW::Curl' => '4.07', 'HTTP::Response' => '1.49', 'English' => '1.01', 'Carp' => '1.02', 'Readonly' => '1.03', }, recommends => { }, build_requires => { 'Test::More' => '0.8', }, build_recommends => { 'Test::Distribution' => '2.00', 'Test::Perl::Critic' => '1.01', }, sign => 1, ); $builder->create_build_script(); print q( ****************************************************************************** ** Some of the tests for this module need internet access ** ** Also remember to set your http_proxy environment variable if you need to ** ****************************************************************************** ); Bio-Das-Lite-2.11/Changes000444001750000144 1276711560746103 15431 0ustar00rpettettusers000000000000Revision history for Perl extension Bio::Das::Lite. 2.11 feature.type.cvId parsing fix from Nick Langridge 2.10 DAS 1.6 spec, all patches from Andy 2.05 Probably the last release on the DAS 1.53 spec 2.04 Patches to catch out-of-date versions of libcurl. Refactored some routines to reduce complexity. 2.01 Bugfix for authenticating proxies. No longer appends ? to DAS request URIs without query params. Supports links with no descriptions. 2.00 Switched to WWW::Curl::Simple (from LWP::Parallel::UserAgent) 1.61 Minor: Fixed prereq (for CPANTS prereq_matches_use) 1.60 Latest LWP has broken support for "parse_head" function. Das::Lite attempts to correct for this by squirting an ersatz version into the symbol table under LWP::Protocol, where it used to be. A particularly ugly hack! 1.58 Added 'no_proxy' configurable parameter. Added 'max_hosts' configurable parameter. Supports the X-DAS-Status header. Supports score-based stylesheets (see DAS 1.53E spec). Fixes for perlcritic. Fixed issues of failings tests caused by retired DAS servers. 1.53 kwalitee updates (Test::Pod::Coverage & LICENSE in Makefile.PL) 1.50 added 'sequence' patch for alignments, patch from jt6 1.49 new 'maxbins' parameter for feature requests: In recent months more and more das sources appeared that provide very condensed value based data. Sometimes it is a feature per every 50 basepairs or even a feature per amino acid. It causes two major problems: 1 - amount of XML being transferred is huge 2 - Ensembl can only do simple merge of the features, i.e just pick max or min value - and in some cases das sources providers want to use a completely different dataset for a different size and resolution of the viewed region. To solve these problems we have introduced a new `maxbins` parameter to the `features` das request. Using this parameter Ensembl tells all das sources what is the width in pixels of the image used to display the features. Then the das sources smart enough to understand the parameter will merge the features themselves and for the rest Ensembl will do the work. 1.48 'dna' request support. Minor refactorings and cleanups for perl-critic 1.47 Reworked tests, a couple of fixes for structure handling 1.44 Package namespace changed to Bio::Das::Lite -compat tests added for compatibility with deprecated DasLite.pm Codebase cleaned up to make Perl::Critic happy Protein structure support, patch from rdf 'sources' request support, patch from rdf 1.41 Protein alignment support, patch from rdf 1.40 Cleanup for Perl::Critic purposes 1.39 Minor typographical tidying up, some more tests 1.38 Minor tweaks to http_proxy - support for http://user:pass@proxy.example.com:nnnn/ format http_proxy 1.33 Minor tweaks to proxy_* methods; Addition of configurable user_agent 1.32 Bugfixes: Cache cleaning for performing multiple queries using persistent objects Regex fixes for group notes and links Initial support for authenticating proxies (proxy_user, proxy_pass) 1.27 Switched over to CVS version to make things easier for me to track Minor revisions. Some more tests 0.15 Includes registry support. See 'new_from_registry', 'registry' and 'registry_sources' methods. 0.14 Fix for entry_points structure and a new test for it Added a new way to use the constructor: my $das = Bio::DasLite->new("http://server/das/source"); Added a convenience side-effect - give segment data in responses for segments without features in 0.13 Absolutely minor change to include LWP::P::UA max_req connection throttling Upgrade strongly recommended 0.12 Reworked all the tests. Tweaked basename regex to allow more flexibility in specifying services rather than dsns, i.e. 'dsn' => 'http://das.mysite.com/das' rather than 'dsn' => 'http://das.mysite.com/das/dsn' 0.11 Added a little extra debug, some extra eval traps, improved url processing and a couple of new WTSI extensions to the spec 0.10 Fixed dsns DAS request (source basename) 0.09 Fixed broken 'types' request 0.08 Added multi-link, multi-note, multi-group-link and multi-group-note support Added X-Forwarded-For HTTP header for IP-based ACLs Added passthrough for HTTP header data 0.07 Internal development version 0.06 Fixes for the regex/stack problems in 0.05. Added callback support for stylesheet and features calls 0.05 Stylesheet support. Seems to tickle some perl regex/stack bugs on certain platforms (x86 Linux, Alpha Tru64). It works fine on my G4. 0.04 Internal version. Added duplication of segment data across features in the 'features' call. 0.03 Allowed for calls (namely 'features') with an arrayref of segments, i.e. $das->features(["1:1,1000", "2:1,1000"]); Minor modifications following some benchmarking and profiling. Results are now cached (per Bio::DasLite instance) against query URL by default. 0.02 Following feedback, data structures returned by: dsn, basename, dsns, entry_points, types, features, sequence have now been homogenised across the board. Results are now always hashed against the query which was made, regardless of how many sources are configured. Also added a few more tests including feature-by-id 0.01 Fri Aug 19 16:38:05 2005 - original version; created by h2xs 1.23 with options -cfn Bio::DasLite Bio-Das-Lite-2.11/README000444001750000144 305311560746103 14762 0ustar00rpettettusers000000000000Bio::Das::Lite ============== Bio::Das::Lite is an implementation of the BioDas protocol, http://biodas.org/ for the retrieval of biological data from XML sources over HTTP. Bio::Das::Lite is designed as a lightweight and more forgiving alternative to the client/retrieval/parsing components of Bio::Das. Bio::Das::Lite itself is not a drop-in replacement for Bio::Das but it can be subclassed to do so. NOTE Results are returned hashed against the query URL which caused them. This means that sometimes you receive more results than you might expect (number of sources * number of segments) INSTALLATION To install this module type the following: perl Build.PL ./Build ./Build test ./Build install DEPENDENCIES This module requires these other modules and libraries: WWW::Curl HTTP::Response English Carp Readonly Please note that some elements of HTTP proxy support require that WWW::Curl has been built from a minimum version of the libcurl C library: authenticating proxies: 7.19.1 noproxy (proxy exclusion lists): 7.19.4 If you have an earlier version installed, you will not be able to use these features of Bio::Das::Lite. Regular proxy support should be unaffected. BUGS To report bugs please log them against rt.cpan.org. COPYRIGHT AND LICENCE Copyright (c) 2007 by Roger Pettett, Genome Research Ltd. http://www.sanger.ac.uk/ This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available. Bio-Das-Lite-2.11/META.yml000444001750000144 115611560746103 15355 0ustar00rpettettusers000000000000--- abstract: 'Bio::Das::Lite is an implementation of the BioDas protocol, http://biodas.org/' author: - 'Roger Pettett ' build_requires: Test::More: 0.8 configure_requires: Module::Build: 0.36 generated_by: 'Module::Build version 0.3603' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Bio-Das-Lite provides: Bio::Das::Lite: file: lib/Bio/Das/Lite.pm version: 2.11 requires: Carp: 1.02 English: 1.01 HTTP::Response: 1.49 Readonly: 1.03 WWW::Curl: 4.07 resources: license: http://dev.perl.org/licenses/ version: 2.11 Bio-Das-Lite-2.11/t000755001750000144 011560746103 14207 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/t/FileStubChunked.pm000444001750000144 144711560746103 17727 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: FileStubChunked.pm 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/FileStubChunked.pm,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/FileStubChunked.pm $ # package t::FileStubChunked; use strict; use warnings; use base qw(t::FileStub); our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; sub _fetch { my ($self, $url_ref, $headers) = @_; open my $fh, q(<), $self->{'filedata'}; while(my $xml = <$fh>) { for my $code_ref (values %{$url_ref}) { &{$code_ref}($xml); } } close $fh; return; } 1; Bio-Das-Lite-2.11/t/FileStubCompat.pm000444001750000144 203011560746103 17556 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: FileStubCompat.pm 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/FileStubCompat.pm,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/FileStubCompat.pm $ # package t::FileStubCompat; use base qw(Bio::DasLite); use strict; use warnings; use English qw(-no_match_vars); our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; sub new { my ($class, $ref) = @_; $ref ||= {}; my $self = $class->SUPER::new($ref); $self->{'filedata'} = $ref->{'filedata'}; return $self; } sub _fetch { my ($self, $url_ref, $headers) = @_; open my $fh, q(<), $self->{'filedata'} or die "Cannot open $self->{'filedata'}:[$ERRNO]\n"; local $RS = undef; my $xml = <$fh>; close $fh; for my $code_ref (values %{$url_ref}) { &{$code_ref}($xml); } return; } 1; Bio-Das-Lite-2.11/t/07-singledsn-multiseg.t000444001750000144 306511560746103 20576 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: 07-singledsn-multiseg.t 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/07-singledsn-multiseg.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/07-singledsn-multiseg.t $ # package singledsn_multiseg; use strict; use warnings; use Test::More tests => 10; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $src = [qw(http://www.ensembl.org/das/Homo_sapiens.NCBI36.reference)]; my $das = Bio::Das::Lite->new({ 'dsn' => $src, 'timeout' => 30, }); my $req = ['1:1,1000', '15:1,1000']; for my $call (qw(features sequence)) { my $res = $das->$call($req); is(ref($res), 'HASH', "$call returns a hash"); is(scalar keys %{$res}, (@{$src}*@{$req}), "$call returns data to the tune of (number of sources * number of segments)"); is(ref((values %{$res})[0]), 'ARRAY', "$call hash contains an array"); my $codes = $das->statuscodes(); for my $k (keys %{$res}) { my $code = (substr $codes->{$k}, 0, 3)||q(); if($code == 500) { diag("$call call failed due to server error"); pass('not failing on server error'); } elsif($code == 200) { ok(scalar @{$res->{$k}} > 0, "$call returns some data"); } else { fail("Unexpected response code: $code for $k"); } } } 1; Bio-Das-Lite-2.11/t/60-features_empty.t000444001750000144 221611560746103 20011 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 60-features_empty.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/60-features_empty.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/60-features_empty.t $ # package features_empty; use strict; use warnings; use Test::More tests => 5; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'http://foo/das/bar', 'filedata' => 't/data/features-empty.xml', }); my $features = $das->features(); my $results = (values %{$features})[0]; is(ref($results), 'HASH', 'Empty segment gives a hash with seginfo rather than an empty array of features'); is($results->{'segment_id'}, 10, 'segment_id'); is($results->{'segment_version'}, 18, 'segment_version'); is($results->{'segment_start'}, 1, 'segment_start'); is($results->{'segment_stop'}, 1000, 'segment_stop'); 1; Bio-Das-Lite-2.11/t/FileStub.pm000444001750000144 200211560746103 16411 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: FileStub.pm 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/FileStub.pm,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/FileStub.pm $ # package t::FileStub; use base qw(Bio::Das::Lite); use strict; use warnings; use English qw(-no_match_vars); our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; sub new { my ($class, $ref) = @_; $ref ||= {}; my $self = $class->SUPER::new($ref); $self->{'filedata'} = $ref->{'filedata'}; return $self; } sub _fetch { my ($self, $url_ref, $headers) = @_; open my $fh, q(<), $self->{'filedata'} or die "Cannot open $self->{'filedata'}:[$ERRNO]\n"; local $RS = undef; my $xml = <$fh>; close $fh; for my $code_ref (values %{$url_ref}) { &{$code_ref}($xml); } return; } 1; Bio-Das-Lite-2.11/t/80-structure.t000444001750000144 317411560746103 17023 0ustar00rpettettusers000000000000######### # Author: rdf # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 80-structure.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/80-structure.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/80-structure.t $ # package structure; use strict; use warnings; use Test::More tests => 9; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/structure.xml', }); my $structure = $das->structure(); my $results = (values %{$structure})[0]; #Total is(scalar @{$results}, 1, 'Whole-response-mode gave correct structure'); #Chains is(scalar @{$results->[0]->{chain}}, 1, 'Got the correct number of chains'); is(scalar @{$results->[0]->{chain}->[0]->{group}}, 3, 'Got the correct number of groups for the chain'); is(scalar @{$results->[0]->{chain}->[0]->{group}->[0]->{atom}}, 26,'Got the correct number of atoms for the first group'); #Het Stuff is(scalar @{$results->[0]->{het}}, 1, 'Got the correct number of het'); is(scalar @{$results->[0]->{het}->[0]->{group}}, 1, 'Got the correct number of groups for the het'); is(scalar @{$results->[0]->{het}->[0]->{group}->[0]->{atom}}, 1,'Got the correct number of atoms for the first group'); #Connection Stuff is(scalar @{$results->[0]->{connect}}, 1, 'Got connection data'); is(scalar @{$results->[0]->{connect}->[0]->{atomID}}, 2, 'Got correct number of atoms in connection'); 1; Bio-Das-Lite-2.11/t/60-features.t000444001750000144 233211560746103 16572 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 60-features.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/60-features.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/60-features.t $ # package features; use strict; use warnings; use Test::More tests => 3; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; { my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/features.xml', }); my $features = $das->features(); my $results = (values %{$features})[0]; is(scalar @{$results}, 102, 'Whole-response-mode gave correct number of features returned'); } { my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/feature-type-nl.xml', }); my $features = $das->features(); my $f = $features->{'foo/features'}->[0]; is($f->{type_id}, 'go-process-summary', 'bug from Nick Landridge 2011-05-05'); is($f->{type_cvId}, 'BS:01021', 'bug from Nick Landridge 2011-05-05'); } 1; Bio-Das-Lite-2.11/t/50-entry_points.t000444001750000144 153511560746103 17514 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 50-entry_points.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/50-entry_points.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/50-entry_points.t $ # package entry_points; use strict; use warnings; use Test::More tests => 1; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/entry_points.xml', }); my $ep = $das->entry_points(); my $results = (values %{$ep})[0]; is(scalar @{$results->[0]->{'segment'}}, 22, 'Correct number of segments returned'); 1; Bio-Das-Lite-2.11/t/70-alignment.t000444001750000144 230711560746103 16735 0ustar00rpettettusers000000000000######### # Author: rdf # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 70-alignment.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/70-alignment.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/70-alignment.t $ # package alignment; use strict; use warnings; use Test::More tests => 4; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/alignment.xml', }); my $alignment = $das->alignment(); my $results = (values %{$alignment})[0]; #Some simple test to see if the response is being parsed corretly. These are not complete. is(scalar @{$results}, 1, 'Whole-response-mode gave correct number of features returned'); is(scalar @{$results->[0]->{alignobject}}, 2, 'Got expected number of alignment objects'); is(scalar @{$results->[0]->{block}}, 1, 'Got expected number of alignment blocks'); is(scalar $results->[0]->{block}->[0]->{segment}->[0]->{cigar}, '515M', 'Got cigar string'); 1; Bio-Das-Lite-2.11/t/61-features_group.t000444001750000144 300011560746103 20000 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 61-features_group.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/61-features_group.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/61-features_group.t $ # package features_group; use strict; use warnings; use Test::More tests => 5; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/features-group.xml', }); my $features = $das->features(); my $results = (values %{$features})[0]; my %features = map { $_->{'feature_id'} => $_ } @{ $results }; my $first_feature = $features{'id'}; my $parent_id = $first_feature->{'parent'}->[0]->{'parent_id'}; my $first_feature_group_data = $features{$parent_id}; is(scalar @{$first_feature_group_data->{'link'}}, 2, 'Corrent number of links returned'); is(scalar @{$first_feature_group_data->{'note'}}, 2, 'Corrent number of notes returned'); is($first_feature_group_data->{'link'}->[1]->{'href'}, 'groupurl2', 'Correct link href'); is($first_feature_group_data->{'link'}->[1]->{'txt'}, ' group link text 2', 'Correct link text'); is($first_feature_group_data->{'note'}->[1], ' group note 2 text ', 'Correct note text'); 1; Bio-Das-Lite-2.11/t/20-authentication.t000444001750000144 163411560746103 17773 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: 20-authentication.t 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/20-authentication.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/20-authentication.t $ # package compat_multidsn; use strict; use warnings; use Test::More tests => 3; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = Bio::Das::Lite->new({ 'http_proxy' => 'https://foo:bar@webcache.example.com:3128/', }); is($das->http_proxy(), 'https://webcache.example.com:3128/', 'http_proxy processed ok'); is($das->proxy_user(), 'foo', 'proxy_user processed ok'); is($das->proxy_pass(), 'bar', 'proxy_pass processed ok'); 1; Bio-Das-Lite-2.11/t/01-general.t000444001750000144 333011560746103 16363 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-11-02 09:50:49 +0000 (Tue, 02 Nov 2010) $ $Author: andyjenkinson $ # Id: $Id: 01-general.t 45 2010-11-02 09:50:49Z andyjenkinson $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/01-general.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/01-general.t $ # package general; use strict; use warnings; use Test::More tests => 7; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 45 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; { my $das = Bio::Das::Lite->new(); isa_ok($das, 'Bio::Das::Lite'); } { my $rnd = 1+int rand 60; is(Bio::Das::Lite->new({'timeout' => $rnd})->timeout(), $rnd, 'get/set timeout'); my $proxy = 'http://webcache.localnet:3128/'; is(Bio::Das::Lite->new({'http_proxy' => $proxy})->http_proxy(), $proxy, 'get/set http_proxy'); } { ######### # test single http fetch (on a non-DAS page!) # my $str = q(); my $urls = { 'http://search.cpan.org/~rpettett/Bio-Das-Lite/' => sub { $str .= $_[0]; return; } }; my $das = Bio::Das::Lite->new(); $das->_fetch($urls); ok($str =~ m||smix, 'plain http fetch'); } { my $das = Bio::Das::Lite->new({ 'dsn' => 'http://www.ebi.ac.uk/das-srv/genomicdas/das/cytochip3_36', 'timeout' => 30, }); my $f_by_id = $das->features({'feature_id' => 'RP11-484P7'}); ok(ref($f_by_id) eq 'HASH', 'feature-by-id returned a list'); my $key = (keys %{$f_by_id})[0]; ok(scalar @{$f_by_id->{$key}||[]} <= 1, 'feature-by=id returned one or no elements'); ok(ref($f_by_id->{$key}->[0]) eq 'HASH', 'feature-by-id element was a hash'); } 1; Bio-Das-Lite-2.11/t/90-sources.t000444001750000144 174711560746103 16453 0ustar00rpettettusers000000000000######### # Author: rdf # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 90-sources.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/90-sources.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/90-sources.t $ # package sources; use strict; use warnings; use Test::More tests => 2; use English qw(-no_match_vars); use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/source.xml', }); my $features = $das->sources(); my $results = (values %{$features})[0]; is(scalar @{$results}, 1, q(Whole-response-mode gave correct number of sources returned)); is($results->[0]->{source}->[0]->{maintainer}->[0]->{maintainer_email}, 'dasmaster@example.com', q(Got maintainers email)); 1; Bio-Das-Lite-2.11/t/00-distribution.t000444001750000144 146611560746103 17474 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: 00-distribution.t 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/00-distribution.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/00-distribution.t $ # package distribution; use strict; use warnings; use Test::More; use English qw(-no_match_vars); our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; eval { require Test::Distribution; }; if($EVAL_ERROR) { plan skip_all => 'Test::Distribution not installed'; } else { Test::Distribution->import('not' => 'prereq'); # Having issues with Test::Dist seeing my PREREQ_PM :( } 1; Bio-Das-Lite-2.11/t/06-singledsn-singleseg.t000444001750000144 302311560746103 20716 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 06-singledsn-singleseg.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/06-singledsn-singleseg.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/06-singledsn-singleseg.t $ # package singledsn_singleseg; use Test::More tests => 13; use strict; use warnings; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $req = '10:1,1000'; my $das; for my $call (qw(entry_points types features sequence)) { $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => "t/data/${call}-ensembl1834.xml", }); my $res = $das->$call($req); ok(ref$res eq 'HASH', "$call returns a hash"); ok(scalar keys %{$res} == 1, "$call returns the same number of sources"); ok(ref((values %{$res})[0]) eq 'ARRAY', "$call hash contains an array"); ######### # check return codes # my $codes = $das->statuscodes(); my $code = 0; for my $u (keys %{$codes}) { if($u =~ /$call.*10:1,1000/mx) { $code = substr $codes->{$u}, 0, 3; last; } } } my $sequence = $das->sequence('1:1,1000'); my $key = (keys %{$sequence})[0]; my $seq = $sequence->{$key}->[0]->{'sequence'} || q(); $seq =~ s/\s+//smgx; is(length $seq, 1000, 'requesting 1Kb of sequence returns 1Kb'); 1; Bio-Das-Lite-2.11/t/02-statuscodes.t000444001750000144 233511560746103 17314 0ustar00rpettettusers000000000000######### # Author: Andy Jenkinson # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: 02-statuscodes.t 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/02-statuscodes.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/02-statuscodes.t $ # use strict; use warnings; use Test::More tests => 6; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my @test = ( ['http://www.ebi.ac.uk/das-srv/genomicdas/das/batman_WB', 200, 'OK', 'HTTP OK, X-DAS OK'], ['http://www.ebi.ac.uk/das-srv/genomicdas/das/BioDasLite', 401, 'Bad data source (data source unknown)', 'HTTP OK, X-DAS-Status error'], ['http://doesnotexist.com/das/BioDasLite', 404, 'Not Found', 'HTTP error, no X-DAS-Status'], ); my $das = Bio::Das::Lite->new(); for (@test) { $das->dsn($_->[0]); my $tmp = $das->stylesheet; $tmp = (keys %$tmp)[0]; my $status = $das->statuscodes($tmp); is (substr($status, 0, 3), $_->[1], $_->[3].' (code)'); is (substr($status, 4), $_->[2], $_->[3].' (message)'); } Bio-Das-Lite-2.11/t/00-podcoverage.t000444001750000144 24211560746103 17222 0ustar00rpettettusers000000000000use Test::More; eval "use Test::Pod::Coverage 1.00"; plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage" if($@); all_pod_coverage_ok(); Bio-Das-Lite-2.11/t/40-dna.t000444001750000144 370711560746103 15523 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 40-dna.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/40-dna.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/40-dna.t $ # package dna; use strict; use warnings; use Test::More tests => 1; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/dna.xml', }); my $result = $das->dna(); my $expected = { 'foo/dna' => [ { 'sequence_stop' => '2436345', 'sequence_start' => '2435345', 'dna' => 'atttcttggcgtaaataagagtctcaatgagactctcagaagaaaattgataaatattattaatgatataataataatcttgttgatccgttctatctccagacgattttcctagtctccagtcgattttgcgctgaaaatgggatatttaatggaattgtttttgtttttattaataaataggaataaatttacgaaaatcacaaaattttcaataaaaaacaccaaaaaaaagagaaaaaatgagaaaaatcgacgaaaatcggtataaaatcaaataaaaatagaaggaaaatattcagctcgtaaacccacacgtgcggcacggtttcgtgggcggggcgtctctgccgggaaaattttgcgtttaaaaactcacatataggcatccaatggattttcggattttaaaaattaatataaaatcagggaaatttttttaaattttttcacatcgatattcggtatcaggggcaaaattagagtcagaaacatatatttccccacaaactctactccccctttaaacaaagcaaagagcgatactcattgcctgtagcctctatattatgccttatgggaatgcatttgattgtttccgcatattgtttacaaccatttatacaacatgtgacgtagacgcactgggcggttgtaaaacctgacagaaagaattggtcccgtcatctactttctgattttttggaaaatatgtacaatgtcgtccagtattctattccttctcggcgatttggccaagttattcaaacacgtataaataaaaatcaataaagctaggaaaatattttcagccatcacaaagtttcgtcagccttgttatgtcaaccactttttatacaaattatataaccagaaatactattaaataagtatttgtatgaaacaatgaacactattataacattttcagaaaatgtagtatttaagcgaaggtagtgcacatcaaggccgtcaaacggaaaaatttttgcaagaatca', 'sequence_version' => '2.45', 'sequence_id' => 'XYZ123', 'dna_length' => '1000' } ] }; is_deeply($result, $expected, 'is_deeply'); 1; Bio-Das-Lite-2.11/t/00-critic.t000444001750000144 174011560746103 16225 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-03-24 19:29:46 +0000 (Wed, 24 Mar 2010) $ $Author: zerojinx $ # Id: $Id: 00-critic.t 19 2010-03-24 19:29:46Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/00-critic.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/00-critic.t $ # package critic; use strict; use warnings; use Test::More; use English qw(-no_match_vars); our $VERSION = do { my @r = (q$Revision: 19 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; if ( not $ENV{TEST_AUTHOR} ) { my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'; plan( skip_all => $msg ); } eval { require Test::Perl::Critic; }; if($EVAL_ERROR) { plan skip_all => 'Test::Perl::Critic not installed'; } else { Test::Perl::Critic->import( -severity => 1, -exclude => [qw(tidy ValuesAndExpressions::RequireConstantVersion)], ); all_critic_ok(); } 1; Bio-Das-Lite-2.11/t/05-singledsn.t000444001750000144 401411560746103 16740 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-09-22 17:47:07 +0100 (Wed, 22 Sep 2010) $ $Author: andyjenkinson $ # Id: $Id: 05-singledsn.t 43 2010-09-22 16:47:07Z andyjenkinson $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/05-singledsn.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/05-singledsn.t $ # package singledsn; use strict; use warnings; use Test::More tests => 33; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 43 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; $Bio::Das::Lite::DEBUG = 0; for my $service ('http://das.sanger.ac.uk/das', 'http://das.ensembl.org/das/dsn', 'http://das.ensembl.org/das/dsn#foo') { ######### # test single dsn from constructor # my $das = Bio::Das::Lite->new({'dsn' => $service, 'timeout' => 10}); ok(defined $das, 'new with a single dsn returned something'); ok(ref($das->dsn()) eq 'ARRAY', 'single service get gave an array ref'); ok(scalar (@{$das->dsn()}) == 1, 'single service get had length of one'); ok($das->dsn->[0] eq $service, 'single service get returned the same dsn'); my $dsns = $das->dsns(); ok(defined $dsns, "dsns call returned something (service $service)"); ok(ref($dsns) eq 'HASH', "dsns call gave a hash (service $service)"); my @keys = keys %{$dsns}; ok(scalar @keys == 1, "dsns call gave one key service $service)"); my $key = $keys[0]; my $code = $das->statuscodes($key); ok($code =~ /^200/, "dsns call returned OK status (service $service status $code)"); ok($dsns->{$key} && ref($dsns->{$key}) eq 'ARRAY', "dsns call gave a arrayref value (service $service)"); my @sources = @{$dsns->{$key} || []}; ok(scalar @sources > 0, "dsns call returned at least one source (service $service)"); my @broken = grep { ref($_) ne 'HASH' } @sources; ok(scalar @broken == 0, "all sources parsed correctly into hashes (service $service)"); } 1; Bio-Das-Lite-2.11/t/60-features_chunked.t000444001750000144 162111560746103 20273 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 60-features_chunked.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/60-features_chunked.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/60-features_chunked.t $ # package features_chunked; use strict; use warnings; use Test::More tests => 1; use t::FileStubChunked; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStubChunked->new({ 'dsn' => 'http://foo/das/bar', 'filedata' => 't/data/features.xml', }); my $features = $das->features(); my $results = (values %{$features})[0]; is(scalar @{$results}, 102, 'Chunked-response-mode gave number of features returned'); 1; Bio-Das-Lite-2.11/t/21-proxy.t000444001750000144 1261211560746103 16154 0ustar00rpettettusers000000000000use strict; use warnings; use Bio::Das::Lite; use Test::More; use English qw(-no_match_vars); BEGIN { eval { require POE; require WWW::Curl::Simple; POE->import(qw(Component::Server::TCP Filter::HTTPD)); require HTTP::Response; }; if ($EVAL_ERROR) { plan skip_all => 'Proxy testing requires POE and WWW::Curl::Simple'; } else { plan tests => 11; } } # We will only communicate with the local host on the loopback interface, we don't want interference from a proxy! delete $ENV{http_proxy}; my ($child_pid, $port) = &setup_server; if ($child_pid && $port) { pass("run test proxy server"); my $dsn = 'http://www.ensembl.org/das/Homo_sapiens.GRCh37.reference'; $ENV{http_proxy} = undef if $ENV{http_proxy}; my $dl = Bio::Das::Lite->new($dsn); $dl->features('1:1,2'); my $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); unlike($status, qr/PROXY/smx, 'direct connection'); SKIP: { if (! defined $Bio::Das::Lite::{CURLOPT_NOPROXY} ) { skip 'proxy support DISABLED as unsupported by your version of libcurl', 9; } $dl = Bio::Das::Lite->new({dsn => $dsn, http_proxy => "http://127.0.0.1:$port"}); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); is($status, '200 (OK) PROXY', 'basic proxy (constructor)'); $dl = Bio::Das::Lite->new($dsn); $dl->http_proxy("http://127.0.0.1:$port"); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); is($status, '200 (OK) PROXY', 'basic proxy (method)'); if (! defined $Bio::Das::Lite::{CURLOPT_PROXYUSERNAME} || !defined $Bio::Das::Lite::{CURLOPT_PROXYPASSWORD} ) { skip 'authenticating proxy support DISABLED as unsupported by your version of libcurl', 1; } $dl = Bio::Das::Lite->new($dsn); $dl->http_proxy("http://user:pass\@127.0.0.1:$port"); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); is($status, '200 (OK) PROXY user:pass', 'authenticated proxy (method)'); $ENV{http_proxy} = "http://127.0.0.1:$port"; $dl = Bio::Das::Lite->new($dsn); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); is($status, '200 (OK) PROXY', 'basic proxy (environment)'); if (! defined $Bio::Das::Lite::{CURLOPT_NOPROXY} ) { skip 'no_proxy support DISABLED as unsupported by your version of libcurl', 5; } $dl = Bio::Das::Lite->new({dsn=>$dsn,no_proxy=>'ensembl.org'}); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); unlike($status, qr/PROXY/smx, 'no-proxy (constructor) positive match'); $dl = Bio::Das::Lite->new($dsn); $dl->no_proxy('ensembl.org', 'another.com'); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); unlike($status, qr/PROXY/smx, 'no-proxy (method list) positive match'); $dl = Bio::Das::Lite->new($dsn); $dl->no_proxy('wibble.com', 'another.com'); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); is($status, '200 (OK) PROXY', 'no-proxy (method list) negative match'); $dl = Bio::Das::Lite->new($dsn); $dl->no_proxy(['ensembl.org', 'another.com']); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); unlike($status, qr/PROXY/smx, 'no-proxy (method listref) positive match'); $ENV{no_proxy} = 'ensembl.org, another.com'; $dl = Bio::Das::Lite->new($dsn); $dl->features('1:1,2'); $status = $dl->statuscodes("$dsn/features?segment=1:1,2"); unlike($status, qr/PROXY/smx, 'no-proxy (environment) positive match'); }; } else { fail("run test proxy server"); } kill_child(); sub kill_child { $child_pid && kill 9, $child_pid; } $SIG{INT} = \&kill_child; sub setup_server { # Set up a server and check it is listening. my $port; my $child_pid; my $agent = WWW::Curl::Simple->new(timeout=>1); for my $test_port (10000 .. 10010) { $child_pid = fork_server($test_port); my $resp; eval { $resp = $agent->get("http://127.0.0.1:$test_port"); }; if ($@) { warn "Error from test server on port $test_port - ".$@; } elsif (!$resp) { warn "No response from test server on port $test_port"; } elsif ($resp->status_line() =~ m/^200 \(OK\) PROXY/) { $port = $test_port; last; } else { warn "Unexpected status from test server on port $test_port - ".$resp->status_line; } kill 9, $child_pid; wait; undef $child_pid; } return ($child_pid, $port); } sub fork_server { if (my $child_pid = fork) { return $child_pid; } my $listen_port = shift; eval { # Child process runs a server # (similar to http://poe.perl.org/?POE_Cookbook/Web_Server) POE::Component::Server::TCP->new( Port => $listen_port, ClientFilter => 'POE::Filter::HTTPD', ClientInput => sub { my ($kernel, $heap, $req_or_resp) = @_[KERNEL, HEAP, ARG0]; # Errors appear as HTTP::Response objects (via filter) if ($req_or_resp->isa(q[HTTP::Request])) { my $auth = $req_or_resp->proxy_authorization_basic; $req_or_resp = HTTP::Response->new(200, $auth ? 'PROXY ' . $auth : 'PROXY'); # OK $req_or_resp->content('FAKE CONTENT'); } $heap->{client}->put($req_or_resp); $kernel->yield(q[shutdown]); } ); $poe_kernel->run(); }; } Bio-Das-Lite-2.11/t/00-pod.t000444001750000144 23411560746103 15507 0ustar00rpettettusers000000000000use strict; use warnings; use Test::More; eval "use Test::Pod 1.00"; plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; all_pod_files_ok(); Bio-Das-Lite-2.11/t/45-sequence.t000444001750000144 374211560746103 16575 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Id: $Id: 45-sequence.t 53 2011-05-06 10:18:40Z zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/45-sequence.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/45-sequence.t $ # package sequence; use strict; use warnings; use Test::More tests => 1; use t::FileStub; our $VERSION = do { my @r = (q$Revision: 53 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my $das = t::FileStub->new({ 'dsn' => 'foo', 'filedata' => 't/data/sequence.xml', }); my $result = $das->sequence(); my $expected = { 'foo/sequence' => [ { 'sequence_stop' => '2436345', 'sequence_start' => '2435345', 'sequence' => 'atttcttggcgtaaataagagtctcaatgagactctcagaagaaaattgataaatattattaatgatataataataatcttgttgatccgttctatctccagacgattttcctagtctccagtcgattttgcgctgaaaatgggatatttaatggaattgtttttgtttttattaataaataggaataaatttacgaaaatcacaaaattttcaataaaaaacaccaaaaaaaagagaaaaaatgagaaaaatcgacgaaaatcggtataaaatcaaataaaaatagaaggaaaatattcagctcgtaaacccacacgtgcggcacggtttcgtgggcggggcgtctctgccgggaaaattttgcgtttaaaaactcacatataggcatccaatggattttcggattttaaaaattaatataaaatcagggaaatttttttaaattttttcacatcgatattcggtatcaggggcaaaattagagtcagaaacatatatttccccacaaactctactccccctttaaacaaagcaaagagcgatactcattgcctgtagcctctatattatgccttatgggaatgcatttgattgtttccgcatattgtttacaaccatttatacaacatgtgacgtagacgcactgggcggttgtaaaacctgacagaaagaattggtcccgtcatctactttctgattttttggaaaatatgtacaatgtcgtccagtattctattccttctcggcgatttggccaagttattcaaacacgtataaataaaaatcaataaagctaggaaaatattttcagccatcacaaagtttcgtcagccttgttatgtcaaccactttttatacaaattatataaccagaaatactattaaataagtatttgtatgaaacaatgaacactattataacattttcagaaaatgtagtatttaagcgaaggtagtgcacatcaaggccgtcaaacggaaaaatttttgcaagaatca', 'sequence_version' => '2.45', 'sequence_id' => 'id' } ] }; is_deeply($result, $expected, 'is_deeply'); 1; Bio-Das-Lite-2.11/t/10-multidsn.t000444001750000144 342311560746103 16610 0ustar00rpettettusers000000000000######### # Author: rmp # Last Modified: $Date: 2010-09-22 17:47:07 +0100 (Wed, 22 Sep 2010) $ $Author: andyjenkinson $ # Id: $Id: 10-multidsn.t 43 2010-09-22 16:47:07Z andyjenkinson $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/t/10-multidsn.t,v $ # $HeadURL: https://bio-das-lite.svn.sourceforge.net/svnroot/bio-das-lite/trunk/t/10-multidsn.t $ # package multidsn; use strict; use warnings; use Test::More tests => 11; use Bio::Das::Lite; our $VERSION = do { my @r = (q$Revision: 43 $ =~ /\d+/mxg); sprintf '%d.'.'%03d' x $#r, @r }; my @services = qw(http://das.ensembl.org/das/dsn http://das.sanger.ac.uk); my $das = Bio::Das::Lite->new({'dsn' => \@services, 'timeout' => 10}); ok(defined $das, 'new with a multi dsn returned something'); ok(ref($das->dsn()) eq 'ARRAY', 'multi service get gave an array ref'); ok(scalar (@{$das->dsn()}) == 2, 'multi service get had length of one'); ok($das->dsn->[0] eq $services[0] && $das->dsn->[1] eq $services[1], 'multi service get returned the same dsns in the same order'); my $dsns = $das->dsns(); ok(defined $dsns, 'dsns call returned something'); ok(ref $dsns eq 'HASH', 'dsns call gave a hash'); my @keys = keys %{$dsns}; ok(scalar @keys == 1, 'dsns call gave one key'); my $key = $keys[0]; my $code = $das->statuscodes($key); ok($code =~ /^200/, "dsns call returned OK status (status is $code)"); ok(ref $dsns->{$key} eq 'ARRAY', 'dsns call gave a arrayref value for the one key'); my @sources = @{$dsns->{$key}}; ok(scalar @sources > 0, 'dsns call returned at least one source'); my @broken = grep { ref $_ ne 'HASH' } @sources; ok(scalar @broken == 0, 'all sources parsed correctly into hashes'); 1; Bio-Das-Lite-2.11/t/data000755001750000144 011560746103 15120 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/t/data/entry_points-ensembl1834.xml000444001750000144 306611560746103 22504 0ustar00rpettettusers000000000000 Bio-Das-Lite-2.11/t/data/feature-type-nl.xml000444001750000144 73311560746103 21003 0ustar00rpettettusers000000000000 biological_process Bio-Das-Lite-2.11/t/data/sequence-ensembl1834.xml000444001750000144 226411560746103 21556 0ustar00rpettettusers000000000000 nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Bio-Das-Lite-2.11/t/data/types-ensembl1834.xml000444001750000144 67311560746103 21074 0ustar00rpettettusers000000000000 Bio-Das-Lite-2.11/t/data/dna.xml000444001750000144 252011560746103 16540 0ustar00rpettettusers000000000000 atttcttggcgtaaataagagtctcaatgagactctcagaagaaaattgataaatattat taatgatataataataatcttgttgatccgttctatctccagacgattttcctagtctcc agtcgattttgcgctgaaaatgggatatttaatggaattgtttttgtttttattaataaa taggaataaatttacgaaaatcacaaaattttcaataaaaaacaccaaaaaaaagagaaa aaatgagaaaaatcgacgaaaatcggtataaaatcaaataaaaatagaaggaaaatattc agctcgtaaacccacacgtgcggcacggtttcgtgggcggggcgtctctgccgggaaaat tttgcgtttaaaaactcacatataggcatccaatggattttcggattttaaaaattaata taaaatcagggaaatttttttaaattttttcacatcgatattcggtatcaggggcaaaat tagagtcagaaacatatatttccccacaaactctactccccctttaaacaaagcaaagag cgatactcattgcctgtagcctctatattatgccttatgggaatgcatttgattgtttcc gcatattgtttacaaccatttatacaacatgtgacgtagacgcactgggcggttgtaaaa cctgacagaaagaattggtcccgtcatctactttctgattttttggaaaatatgtacaat gtcgtccagtattctattccttctcggcgatttggccaagttattcaaacacgtataaat aaaaatcaataaagctaggaaaatattttcagccatcacaaagtttcgtcagccttgtta tgtcaaccactttttatacaaattatataaccagaaatactattaaataagtatttgtat gaaacaatgaacactattataacattttcagaaaatgtagtatttaagcgaaggtagtgc acatcaaggccgtcaaacggaaaaatttttgcaagaatca Bio-Das-Lite-2.11/t/data/features-ensembl1834.xml000444001750000144 107611560746103 21564 0ustar00rpettettusers000000000000 karyotype ensembl 0 3000000 - 0 - Bio-Das-Lite-2.11/t/data/alignment.xml000444001750000144 271211560746103 17757 0ustar00rpettettusers000000000000 0-515 GENCODE reference protein "AP000295.6-002" from GENCODE Dataset v2.2 (Oct 2005) 0-515 515M Bio-Das-Lite-2.11/t/data/structure.xml000444001750000144 1055411560746103 20064 0ustar00rpettettusers000000000000 Bio-Das-Lite-2.11/t/data/source.xml000444001750000144 172711560746103 17306 0ustar00rpettettusers000000000000 PDBresnum,Protein Structure Bio-Das-Lite-2.11/t/data/features.xml000444001750000144 13120311560746103 17655 0ustar00rpettettusers000000000000 description description 0 0 - 0 - Sulfotransferase 1A1 (EC 2.8.2.1) (Aryl sulfotransferase 1) (Phenol sulfotransferase 1) (Phenol-sulfating phenol sulfotransferase 1) (P-PST 1) (Thermostable phenol sulfotransferase) (Ts-PST) (HAST1/HAST2) (ST1A3). http://www.ebi.uniprot.org/uniprot-srv/uniProtView.do?proteinAc=P50225 CHAIN UniProt 1 295 - 0 - Sulfotransferase 1A1/FTId=PRO_0000085127 STRAND UniProt 13 15 - 0 - TURN UniProt 16 17 - 0 - STRAND UniProt 18 20 - 0 - HELIX UniProt 22 31 - 0 - TURN UniProt 32 33 - 0 - VARIANT UniProt 37 37 - 0 - R -> Q/FTId=VAR_009302 http://ca.expasy.org/cgi-bin/get-sprot-variant.pl?VAR_009302 TURN UniProt 38 39 - 0 - STRAND UniProt 41 46 - 0 - TURN UniProt 47 48 - 0 - NP_BIND UniProt 48 53 - 0 - PAPS STRAND UniProt 49 50 - 0 - HELIX UniProt 51 62 - 0 - TURN UniProt 63 65 - 0 - HELIX UniProt 67 70 - 0 - MUTAGEN UniProt 70 70 - 0 - C -> S Increased sensitivity of enzyme activity to heat inactivation TURN UniProt 71 72 - 0 - STRAND UniProt 73 73 - 0 - HELIX UniProt 75 78 - 0 - STRAND UniProt 79 79 - 0 - STRAND UniProt 81 81 - 0 - TURN UniProt 82 83 - 0 - STRAND UniProt 86 86 - 0 - TURN UniProt 87 88 - 0 - STRAND UniProt 89 89 - 0 - CONFLICT UniProt 90 90 - 0 - P -> L (in Ref. 3) HELIX UniProt 92 97 - 0 - TURN UniProt 98 98 - 0 - STRAND UniProt 101 102 - 0 - STRAND UniProt 104 107 - 0 - ACT_SITE UniProt 108 108 - 0 - Proton acceptor TURN UniProt 111 113 - 0 - STRAND UniProt 114 114 - 0 - HELIX UniProt 116 120 - 0 - TURN UniProt 121 122 - 0 - STRAND UniProt 124 129 - 0 - NP_BIND UniProt 130 138 - 0 - PAPS HELIX UniProt 132 145 - 0 - STRAND UniProt 146 146 - 0 - TURN UniProt 147 148 - 0 - STRAND UniProt 149 149 - 0 - HELIX UniProt 155 164 - 0 - TURN UniProt 165 165 - 0 - STRAND UniProt 167 167 - 0 - TURN UniProt 168 169 - 0 - HELIX UniProt 172 182 - 0 - CONFLICT UniProt 181 181 - 0 - E -> G (in Ref. 5) TURN UniProt 183 185 - 0 - STRAND UniProt 186 186 - 0 - STRAND UniProt 188 192 - 0 - NP_BIND UniProt 193 229 - 0 - PAPS HELIX UniProt 193 198 - 0 - HELIX UniProt 200 211 - 0 - TURN UniProt 212 212 - 0 - VARIANT UniProt 213 213 - 0 - R -> H (in allele SULT1A1*2; common polymorphism; has a lower activity; dbSNP:1042028)/FTId=VAR_007425 http://ca.expasy.org/cgi-bin/get-sprot-variant.pl?VAR_007425 HELIX UniProt 217 226 - 0 - VARIANT UniProt 223 223 - 0 - M -> V (in dbSNP:1801030)/FTId=VAR_009303 http://ca.expasy.org/cgi-bin/get-sprot-variant.pl?VAR_009303 TURN UniProt 227 227 - 0 - STRAND UniProt 228 228 - 0 - HELIX UniProt 229 234 - 0 - VARIANT UniProt 235 235 - 0 - N -> T (in dbSNP:1059491)/FTId=VAR_014889 http://ca.expasy.org/cgi-bin/get-sprot-variant.pl?VAR_014889 TURN UniProt 236 238 - 0 - STRAND UniProt 239 239 - 0 - TURN UniProt 241 242 - 0 - STRAND UniProt 243 243 - 0 - TURN UniProt 245 247 - 0 - STRAND UniProt 248 248 - 0 - TURN UniProt 250 252 - 0 - STRAND UniProt 255 256 - 0 - NP_BIND UniProt 257 259 - 0 - PAPS STRAND UniProt 261 262 - 0 - HELIX UniProt 263 266 - 0 - TURN UniProt 267 267 - 0 - STRAND UniProt 268 268 - 0 - HELIX UniProt 270 283 - 0 - CONFLICT UniProt 282 282 - 0 - E -> K (in Ref. 4 and 8) TURN UniProt 284 286 - 0 - CONFLICT UniProt 290 290 - 0 - S -> T (in Ref. 4 and 8) STRAND UniProt 293 293 - 0 - ProDom ProDom 6 181 - 0 - Description: Sulfotransferase Status: True Positive http://prodes.toulouse.inra.fr/prodom/current/cgi-bin/request.pl?question=DBEN&query=PD001218 Pfam Pfam 38 288 - 0 - Description: Sulfotransfer_1 Status: True Positive http://www.sanger.ac.uk/cgi-bin/Pfam/getacc?PF00685 reference reference 0 0 - 0 - Zhu X., Veronese M.E., Sansom L.N., McManus M.E. (1993). "Molecular characterisation of a human aryl sulfotransferase cDNA.", Biochem. Biophys. Res. Commun. 192:671-676 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8484775 reference reference 0 0 - 0 - Zhu X., Veronese M.E., Bernard C.C., Sansom L.N., McManus M.E. (1993). "Identification of two human brain aryl sulfotransferase cDNAs.", Biochem. Biophys. Res. Commun. 195:120-127 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8363592 reference reference 0 0 - 0 - Hwang S.-R., Kohn A.B., Hook V.Y.H. (1995). "Molecular cloning of an isoform of phenol sulfotransferase from human brain hippocampus.", Biochem. Biophys. Res. Commun. 207:701-707 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=7864863 reference reference 0 0 - 0 - Wilborn T.W., Comer K.A., Dooley T.P., Reardon I.M., Heinrikson R.L., Falany C.N. (1993). "Sequence analysis and expression of the cDNA for the phenol-sulfating form of human liver phenol sulfotransferase.", Mol. Pharmacol. 43:70-77 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8423770 reference reference 0 0 - 0 - Jones A.L., Hagen M., Coughtrie M.W.H., Roberts R.C., Glatt H. (1995). "Human platelet phenolsulfotransferases: cDNA cloning, stable expression in V79 cells and identification of a novel allelic variant of the phenol-sulfating form.", Biochem. Biophys. Res. Commun. 208:855-862 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=7695643 reference reference 0 0 - 0 - Ozawa S., Nagata K., Shimada M., Ueda M., Tsuzuki T., Yamazoe Y., Kato R. (1995). "Primary structures and properties of two related forms of aryl sulfotransferases in human liver.", Pharmacogenetics 5:S135-S140 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=7581483 reference reference 0 0 - 0 - Yamazoe Y., Nagata K., Ozawa S., Kato R. (1994). "Structural similarity and diversity of sulfotransferases.", Chem. Biol. Interact. 92:107-117 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8033246 reference reference 0 0 - 0 - Bernier F., Soucy P., Luu-The V. (1996). "Human phenol sulfotransferase gene contains two alternative promoters: structure and expression of the gene.", DNA Cell Biol. 15:367-375 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8924211 reference reference 0 0 - 0 - Dooley T.P., Huang Z. (1996). "Genomic organization and DNA sequences of two human phenol sulfotransferase genes (STP1 and STP2) on the short arm of chromosome 16.", Biochem. Biophys. Res. Commun. 228:134-140 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8912648 reference reference 0 0 - 0 - Raftogianis R.B., Her C., Weinshilboum R.M. (1997). Submitted to database EMBL/GenBank/DDBJ databases reference reference 0 0 - 0 - Dajani R., Hood A.M., Coughtrie M.W. (1998). "A single amino acid, Glu146, governs the substrate specificity of a human dopamine sulfotransferase, SULT1A3.", Mol. Pharmacol. 54:942-948 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=9855620 reference reference 0 0 - 0 - Shichijo S., Itoh K. (2001). "Identification of immuno-peptidmics that are recognized by tumor-reactive CTL generated from TIL of colon cancer patients.", Submitted to database EMBL/GenBank/DDBJ databases reference reference 0 0 - 0 - Kalnine N., Chen X., Rolfs A., Halleck A., Hines L., Eisenstein S., Koundinya M., Raphael J., Moreira D., Kelley T., LaBaer J., Lin Y., Phelan M., Farmer A. (2003). "Cloning of human full-length CDSs in BD Creator(TM) system donor vector.", Submitted to database EMBL/GenBank/DDBJ databases reference reference 0 0 - 0 - Strausberg R.L., Feingold E.A., Grouse L.H., Derge J.G., Klausner R.D., Collins F.S., Wagner L., Shenmen C.M., Schuler G.D., Altschul S.F., Zeeberg B., Buetow K.H., Schaefer C.F., Bhat N.K., Hopkins R.F., Jordan H., Moore T., Max S.I., Wang J., Hsieh F., Diatchenko L., Marusina K., Farmer A.A., Rubin G.M., Hong L., Stapleton M., Soares M.B., Bonaldo M.F., Casavant T.L., Scheetz T.E., Brownstein M.J., Usdin T.B., Toshiyuki S., Carninci P., Prange C., Raha S.S., Loquellano N.A., Peters G.J., Abramson R.D., Mullahy S.J., Bosak S.A., McEwan P.J., McKernan K.J., Malek J.A., Gunaratne P.H., Richards S., Worley K.C., Hale S., Garcia A.M., Gay L.J., Hulyk S.W., Villalon D.K., Muzny D.M., Sodergren E.J., Lu X., Gibbs R.A., Fahey J., Helton E., Ketteman M., Madan A., Rodrigues S., Sanchez A., Whiting M., Madan A., Young A.C., Shevchenko Y., Bouffard G.G., Blakesley R.W., Touchman J.W., Green E.D., Dickson M.C., Rodriguez A.C., Grimwood J., Schmutz J., Myers R.M., Butterfield Y.S.N., Krzywinski M.I., Skalska U., Smailus D.E., Schnerch A., Schein J.E., Jones S.J.M., Marra M.A. (2002). "Generation and initial analysis of more than 15,000 full-length human and mouse cDNA sequences.", Proc. Natl. Acad. Sci. U.S.A. 99:16899-16903 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=12477932 reference reference 0 0 - 0 - Dooley T.P., Obermoeller R.D., Leiter E.H., Chapman H.D., Falany C.N., Deng Z., Siciliano M.J. (1993). "Mapping of the phenol sulfotransferase gene (STP) to human chromosome 16p12.1-p11.2 and to mouse chromosome 7.", Genomics 18:440-443 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8288252 reference reference 0 0 - 0 - Veronese M.E., Burgess W., Zhu X., McManus M.E. (1994). "Functional characterization of two human sulphotransferase cDNAs that encode monoamine- and phenol-sulphating forms of phenol sulphotransferase: substrate kinetics, thermal-stability and inhibitor-sensitivity studies.", Biochem. J. 302:497-502 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8093002 reference reference 0 0 - 0 - Falany C.N., Zhuang W., Falany J.L. (1994). "Characterization of expressed human phenol-sulfating phenol sulfotransferase: effect of mutating cys70 on activity and thermostability.", Chem. Biol. Interact. 92:57-66 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=8033270 reference reference 0 0 - 0 - Raftogianis R.B., Wood T.C., Otterness D.M., Van Loon J.A., Weinshilboum R.M. (1997). "Phenol sulfotransferase pharmacogenetics in humans: association of common SULT1A1 alleles with TS PST phenotype.", Biochem. Biophys. Res. Commun. 239:298-304 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=9345314 reference reference 0 0 - 0 - Engelke C.E., Meinl W., Boeing H., Glatt H. (2000). "Association between functional genetic polymorphisms of human sulfotransferases 1A1 and 1A2.", Pharmacogenetics 10:163-169 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=10762004 reference reference 0 0 - 0 - Gamage N.U., Duggleby R.G., Barnett A.C., Tresillian M., Latham C.F., Liyou N.E., McManus M.E., Martin J.L. (2003). "Structure of a human carcinogen-converting enzyme, SULT1A1. Structural and kinetic implications of substrate inhibition.", J. Biol. Chem. 278:7655-7662 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed&cmd=Retrieve&dopt=Citation&list_uids=12471039 Bio-Das-Lite-2.11/t/data/sequence.xml000444001750000144 247011560746103 17612 0ustar00rpettettusers000000000000 atttcttggcgtaaataagagtctcaatgagactctcagaagaaaattgataaatattat taatgatataataataatcttgttgatccgttctatctccagacgattttcctagtctcc agtcgattttgcgctgaaaatgggatatttaatggaattgtttttgtttttattaataaa taggaataaatttacgaaaatcacaaaattttcaataaaaaacaccaaaaaaaagagaaa aaatgagaaaaatcgacgaaaatcggtataaaatcaaataaaaatagaaggaaaatattc agctcgtaaacccacacgtgcggcacggtttcgtgggcggggcgtctctgccgggaaaat tttgcgtttaaaaactcacatataggcatccaatggattttcggattttaaaaattaata taaaatcagggaaatttttttaaattttttcacatcgatattcggtatcaggggcaaaat tagagtcagaaacatatatttccccacaaactctactccccctttaaacaaagcaaagag cgatactcattgcctgtagcctctatattatgccttatgggaatgcatttgattgtttcc gcatattgtttacaaccatttatacaacatgtgacgtagacgcactgggcggttgtaaaa cctgacagaaagaattggtcccgtcatctactttctgattttttggaaaatatgtacaat gtcgtccagtattctattccttctcggcgatttggccaagttattcaaacacgtataaat aaaaatcaataaagctaggaaaatattttcagccatcacaaagtttcgtcagccttgtta tgtcaaccactttttatacaaattatataaccagaaatactattaaataagtatttgtat gaaacaatgaacactattataacattttcagaaaatgtagtatttaagcgaaggtagtgc acatcaaggccgtcaaacggaaaaatttttgcaagaatca Bio-Das-Lite-2.11/t/data/entry_points.xml000444001750000144 263211560746103 20537 0ustar00rpettettusers000000000000 Bio-Das-Lite-2.11/t/data/features-group.xml000444001750000144 216211560746103 20750 0ustar00rpettettusers000000000000 type label method label start end [X.XX|-] [0|-|+] [0|1|2|-] note text link text target name type group note 1 text group link text 1 group note 2 text group link text 2 target name Bio-Das-Lite-2.11/t/data/features-empty.xml000444001750000144 43311560746103 20731 0ustar00rpettettusers000000000000 Bio-Das-Lite-2.11/eg000755001750000144 011560746103 14337 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/eg/regtest000555001750000144 122111560746103 16073 0ustar00rpettettusers000000000000#!/usr/bin/perl -wT use strict; use lib qw(lib ../lib); use Bio::Das::Lite; use Data::Dumper; $Bio::Das::Lite::DEBUG = 0; my $das = Bio::Das::Lite->new(); my $sources = $das->registry_sources(); my $count_all = scalar @{$das->registry_sources()}; my $count_stylesheet = scalar @{$das->registry_sources({ 'capability' => ['stylesheet'] })}; my $count_protein = scalar @{$das->registry_sources({ 'category' => ['Protein Sequence'] })};; print Dumper($das->registry_sources()); print STDERR qq( all = $count_all stylesheet = $count_stylesheet protein = $count_protein \n); Bio-Das-Lite-2.11/eg/stylesheet_test000555001750000144 73111560746103 17633 0ustar00rpettettusers000000000000#!/usr/local/bin/perl -wT use lib "lib"; use Bio::Das::Lite; use Data::Dumper; $Bio::Das::Lite::DEBUG = 0; print STDERR "VERSION=",$Bio::Das::Lite::VERSION, "\n"; my $das = Bio::Das::Lite->new({ 'dsn' => 'http://das.sanger.ac.uk/das', }); my $ref = $das->dsns(); my @all = map { "http://das.sanger.ac.uk/das/$_->{'source'}" } map { @{$ref->{$_}} } keys %{$ref}; $das->dsn(\@all); print Dumper($das->stylesheet()); #print Dumper($bdl->features("1:1,50000000")); Bio-Das-Lite-2.11/eg/comparison000555001750000144 161211560746103 16574 0ustar00rpettettusers000000000000#!/usr/local/bin/perl -wT ######### # This script needs to have Bio:Das and Bio::Das::Lite installed, or be started with: # perl -I/path/to/bio-das -I/path/to/bio-daslite # use strict; use Bio::Das; use Bio::Das::Lite; use Benchmark; use Data::Dumper; #$Bio::Das::Lite::DEBUG = 1; use vars qw($SOURCES); $SOURCES = [qw(http://servlet.sanger.ac.uk/das/ensembl1834 http://das.sanger.ac.uk/das/spectral35)]; ######### # Build some random segments # my @segments = (); for (my $chr=1;$chr<=20;$chr++) { my $rnd = int(rand(100000000)); push @segments, "$chr:$rnd,@{[$rnd+1000000]}"; } my $biodas = Bio::Das->new(); my $biodaslite = Bio::Das::Lite->new({'dsn' => $SOURCES, 'caching' => 0}); timethese( 5, { "Bio::Das" => sub { $biodas->features(-dsn => $SOURCES, -segment => \@segments); }, "Bio::Das::Lite" => sub { $biodaslite->features(\@segments); }, }, ); Bio-Das-Lite-2.11/eg/empty_segment000555001750000144 65311560746103 17266 0ustar00rpettettusers000000000000#!/usr/bin/perl -wT use strict; use lib qw(blib/lib lib ../blib/lib ../lib); use Bio::Das::Lite; use Data::Dumper; my $das = Bio::Das::Lite->new("http://www.ensembl.org/das/Homo_sapiens.GRCh37.reference"); $das->timeout(10); print Dumper($das->features([ { 'segment' => "21", 'category' => 'null', }, { 'segment' => 'Y', 'category' => 'null', } ])); Bio-Das-Lite-2.11/eg/new_from_registry000555001750000144 54611560746103 20153 0ustar00rpettettusers000000000000#!/usr/bin/perl -wT use strict; use lib qw(lib ../lib); use Bio::Das::Lite; my $bdl = Bio::Das::Lite->new_from_registry({ 'capability' => ['features'], 'category' => ['Protein Sequence'], }); print qq(Using Bio::Das::Lite v$Bio::Das::Lite::VERSION configured with registry DSN list:\n), join("\n", sort @{$bdl->dsn()}), "\n"; Bio-Das-Lite-2.11/eg/uniprot-test000555001750000144 147411560746103 17105 0ustar00rpettettusers000000000000#!/usr/local/bin/perl -wT use lib qw(./blib/lib ./lib ../blib/lib); use strict; use Bio::Das::Lite; use Data::Dumper; $Bio::Das::Lite::DEBUG = 0; my $bd = Bio::Das::Lite->new("http://www.ebi.ac.uk/das-srv/uniprot/das/uniprot"); #print Dumper($bd->features("P50225")); my $blks = []; my $res = $bd->features('P50225', sub { my ($a) = @_; my $rq_key = (keys %{$bd->{'data'}})[0]; push @{$blks}, $bd->{'data'}->{$rq_key}; # print STDERR "a=$a\n"; # print STDERR "CALLBACK a=".Dumper($a)."\n"; }, ); print "First block was: $blks->[0]\n"; print "Callback was called @{[scalar @$blks]} times\n"; my $key = (keys %$res)[0]; print "res=$res, key=$key, res->key = $res->{$key}\n"; if(ref($res->{$key}) eq "ARRAY") { print "Got @{[scalar @{$res->{$key}}]} sets back\n"; } else { print Dumper $res; } Bio-Das-Lite-2.11/lib000755001750000144 011560746103 14512 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/lib/Bio000755001750000144 011560746103 15223 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/lib/Bio/Das000755001750000144 011560746103 15732 5ustar00rpettettusers000000000000Bio-Das-Lite-2.11/lib/Bio/Das/Lite.pm000444001750000144 13560611560746103 17375 0ustar00rpettettusers000000000000######### # Author: rpettett@cpan.org # Maintainer: rpettett@cpan.org # Created: 2005-08-23 # Last Modified: $Date: 2011-05-06 11:18:40 +0100 (Fri, 06 May 2011) $ $Author: zerojinx $ # Source: $Source: /var/lib/cvsd/cvsroot/Bio-DasLite/Bio-DasLite/lib/Bio/Das/Lite.pm,v $ # Id: $Id: Lite.pm 53 2011-05-06 10:18:40Z zerojinx $ # $HeadURL $ # package Bio::Das::Lite; use strict; use warnings; use WWW::Curl::Multi; use WWW::Curl::Easy; # CURLOPT imports use HTTP::Response; use Carp; use English qw(-no_match_vars); use Readonly; our $DEBUG = 0; our $VERSION = '2.11'; Readonly::Scalar our $TIMEOUT => 5; Readonly::Scalar our $REG_TIMEOUT => 15; Readonly::Scalar our $LINKRE => qr{]*?>([^<]*)|]*?/>}smix; Readonly::Scalar our $NOTERE => qr{]*>([^<]*)}smix; Readonly::Scalar our $DAS_STATUS_TEXT => { 200 => '200 OK', 400 => '400 Bad command (command not recognized)', 401 => '401 Bad data source (data source unknown)', 402 => '402 Bad command arguments (arguments invalid)', 403 => '403 Bad reference object', 404 => '404 Requested object unknown', 405 => '405 Coordinate error', 500 => '500 Server error', 501 => '501 Unimplemented feature', }; ######### # $ATTR contains information about document structure - tags, attributes and subparts # This is split up by call to reduce the number of tag passes for each response # our %COMMON_STYLE_ATTRS = ( zindex => [], height => [], fgcolor => [], bgcolor => [], label => [], bump => [], ); our %SCORED_STYLE_ATTRS = ( min => [], max => [], steps => [], color1 => [], color2 => [], color3 => [], height => [], ); our $ATTR = { '_segment' => { 'segment' => [qw(id start stop version label)], }, # feature notes and links are special cases and taken care of elsewhere 'feature' => { 'feature' => [qw(id label)], 'method' => [qw(id cvId)], 'type' => [qw(id category reference subparts superparts cvId)], 'target' => [qw(id start stop)], 'start' => [], 'end' => [], 'orientation' => [], 'phase' => [], 'score' => [], 'parent' => { 'parent' => [qw(id)] }, 'part' => { 'part' => [qw(id)] }, }, 'sequence' => { 'sequence' => [qw(id start stop version label)], }, # NOTE: The dna command is deprecated: 'dna' => { 'sequence' => { 'sequence' => [qw(id start stop version)], 'dna' => [qw(length)], }, }, 'entry_points' => { 'entry_points' => [qw(href total start end)], 'segment' => { 'segment' => [qw(id start stop type orientation subparts version)], }, }, # NOTE: The dsn command is deprecated: 'dsn' => { 'dsn' => [], 'source' => [qw(id)], 'mapmaster' => [], 'description' => [], }, 'type' => { 'type' => [qw(id category cvId)], 'segment' => [qw(id start stop version label)], }, 'alignment' => { 'alignment' => [qw(name alignType max)], 'alignobject' => { 'alignobject' => [qw(objVersion intObjectId type dbSource dbVersion dbAccessionId dbCoordSys)], 'alignobjectdetail' => { 'alignobjectdetail' => [qw(dbSource property)], }, 'sequence' => [], }, 'score' => [qw(score)], 'block' => { 'block' => [qw(blockOrder)], 'segment' => { 'segment' => [qw(intObjectId start end orientation)], 'cigar' => [], }, }, }, 'structure' => { 'object' => [qw(dbAccessionId inObjectId objectVersion type dbSource dbVersion dbCoordSys)], 'chain' => { 'chain' => [qw(id SwissprotId model)], 'group' => { 'group' => [qw(name type groupID)], 'atom' => { 'atom' => [qw(atomID occupancy tempFactor altLoc atomName x y z)] }, }, }, 'het' => { 'group' => { 'group' => [qw(name type groupID)], 'atom' => { 'atom' => [qw(atomId occupancy tempFactor altLoc atomName x y z)] }, }, }, 'connect' => { 'connect' => [qw(atomSerial type)], 'atomID' => { 'atomID' => [qw(atomID)], }, }, }, 'sources' => { 'source' => { 'source' => [qw(uri title doc_href description)], 'maintainer' => { 'maintainer' => [qw(email)], }, 'version' => { 'version' => [qw(uri created)], 'coordinates' => { 'coordinates' => [qw(uri source authority taxid test_range version)], }, 'capability' => { 'capability' => [qw(type query_uri)], }, 'prop' => { 'prop' => [qw(name value)], }, }, }, }, 'stylesheet' => { 'stylesheet' => [qw(version)], 'category' => { 'category' => [qw(id)], 'type' => { 'type' => [qw(id)], 'glyph' => { 'glyph' => [qw(zoom)], 'arrow' => { 'parallel' => [], 'southwest' => [], 'northeast' => [], %COMMON_STYLE_ATTRS, }, 'anchored_arrow' => { 'parallel' => [], %COMMON_STYLE_ATTRS, }, 'box' => { 'linewidth' => [], 'pattern' => [], # WTSI extension %COMMON_STYLE_ATTRS, }, 'cross' => { %COMMON_STYLE_ATTRS, }, 'dot' => \%COMMON_STYLE_ATTRS, 'ex' => { %COMMON_STYLE_ATTRS, }, 'hidden' => {}, 'line' => { 'style' => [], %COMMON_STYLE_ATTRS, }, 'span' => { %COMMON_STYLE_ATTRS, }, 'text' => { 'font' => [], 'fontsize' => [], 'string' => [], #'style' => [], HANDLED SEPARATELY 'fgcolor' => [], 'bgcolor' => [], 'label' => [], 'bump' => [], }, 'primers' => \%COMMON_STYLE_ATTRS, 'toomany' => { 'linewidth' => [], %COMMON_STYLE_ATTRS, }, 'triangle' => { 'linewidth' => [], 'direction' => [], %COMMON_STYLE_ATTRS, }, 'gradient' => \%SCORED_STYLE_ATTRS, 'histogram' => \%SCORED_STYLE_ATTRS, 'lineplot' => \%SCORED_STYLE_ATTRS, }, }, }, }, }; ######### # $OPTS contains information about parameters to use for queries # our $OPTS = { 'feature' => [qw(segment type category categorize feature_id maxbins)], 'type' => [qw(segment)], 'sequence' => [qw(segment)], 'dna' => [qw(segment)], 'entry_points' => [qw(rows)], 'dsn' => [], 'sources' => [], 'stylesheet' => [], 'alignment' => [qw(query rows subject subjectcoordsys)], 'structure' => [qw(query)], }; sub new { my ($class, $ref) = @_; $ref ||= {}; my $self = { 'dsn' => [], 'timeout' => $TIMEOUT, 'data' => {}, 'caching' => 1, 'registry' => [qw(http://www.dasregistry.org/das)], '_registry_sources' => [], }; bless $self, $class; if($ref && ref $ref) { for my $arg (qw(dsn timeout caching callback registry user_agent http_proxy proxy_user proxy_pass no_proxy)) { if(exists $ref->{$arg} && $self->can($arg)) { $self->$arg($ref->{$arg}); } } } elsif($ref) { $self->dsn($ref); } return $self; } sub new_from_registry { my ($class, $ref) = @_; my $user_timeout = defined $ref->{timeout} ? 1 : 0; my $self = $class->new($ref); # If the user specifies a timeout, use it. # But if not, temporarily increase the timeout for the registry request. if (!$user_timeout) { $self->timeout($REG_TIMEOUT); } my $sources = $self->registry_sources($ref); # And reset it back to the "normal" non-registry timeout. if (!$user_timeout) { $self->timeout($TIMEOUT); } $self->dsn([map { $_->{'url'} } @{$sources}]); return $self; } # We implement this method because LWP does not parse user/password sub http_proxy { my ($self, $proxy) = @_; if($proxy) { $self->{'http_proxy'} = $proxy; } if(!$self->{'_checked_http_proxy_env'}) { $self->{'http_proxy'} ||= $ENV{'http_proxy'} || q(); $self->{'_checked_http_proxy_env'} = 1; } if($self->{'http_proxy'} =~ m{^(https?://)(\S+):(.*?)\@(.*?)$}smx) { ######### # http_proxy contains username & password - we'll set them up here: # $self->proxy_user($2); $self->proxy_pass($3); $self->{'http_proxy'} = "$1$4"; } return $self->{'http_proxy'}; } sub no_proxy { my ($self, @args) = @_; if (scalar @args) { if ($args[0] && ref $args[0] && ref $args[0] eq 'ARRAY') { $self->{'no_proxy'} = $args[0]; } else { $self->{'no_proxy'} = \@args; } } if(!$self->{'_checked_no_proxy_env'}) { $self->{'no_proxy'} ||= [split /\s*,\s*/smx, $ENV{'no_proxy'} || q()]; $self->{'_checked_no_proxy_env'} = 1; } return $self->{'no_proxy'} || []; } sub _get_set { my ($self, $key, $value) = @_; if(defined $value) { $self->{$key} = $value; } return $self->{$key}; } sub proxy_user { my ($self, $val) = @_; return $self->_get_set('proxy_user', $val); } sub proxy_pass { my ($self, $val) = @_; return $self->_get_set('proxy_pass', $val); } sub user_agent { my ($self, $val) = @_; return $self->_get_set('user_agent', $val) || "Bio::Das::Lite v$VERSION"; } sub timeout { my ($self, $val) = @_; return $self->_get_set('timeout', $val); } sub caching { my ($self, $val) = @_; return $self->_get_set('caching', $val); } sub max_hosts { my ($self, $val) = @_; carp 'WARNING: max_hosts method is decprecated and has no effect'; return $self->_get_set('_max_hosts', $val); } sub max_req { my ($self, $val) = @_; carp 'WARNING: max_req method is decprecated and has no effect'; return $self->_get_set('_max_req', $val); } sub callback { my ($self, $val) = @_; return $self->_get_set('callback', $val); } sub basename { my ($self, $dsn) = @_; $dsn ||= $self->dsn(); my @dsns = (ref $dsn)?@{$dsn}:$dsn; my @res = (); for my $service (@dsns) { $service =~ m{(https?://.*/das)/?}smx; if($1) { push @res, $1; } } return \@res; } sub dsn { my ($self, $dsn) = @_; if($dsn) { if(ref $dsn eq 'ARRAY') { $self->{'dsn'} = $dsn; } else { $self->{'dsn'} = [$dsn]; } } return $self->{'dsn'}; } sub dsns { my ($self, $query, $opts) = @_; $opts ||= {}; $opts->{'use_basename'} = 1; return $self->_generic_request($query, 'dsn', $opts); } sub entry_points { my ($self, $query, $opts) = @_; return $self->_generic_request($query, 'entry_points', $opts); } sub types { my ($self, $query, $opts) = @_; return $self->_generic_request($query, 'type(s)', $opts); } sub features { my ($self, $query, $callback, $opts) = @_; if(ref $callback eq 'HASH' && !defined $opts) { $opts = $callback; undef $callback; } if($callback) { $self->{'callback'} = $callback; } return $self->_generic_request($query, 'feature(s)', $opts); } sub sequence { my ($self, $query, $opts) = @_; return $self->_generic_request($query, 'sequence', $opts); } sub dna { my ($self, $query, $opts) = @_; return $self->_generic_request($query, 'dna', $opts); } sub alignment { my ($self, $opts) = @_; return $self->_generic_request($opts, 'alignment'); } sub structure { my ($self, $opts) = @_; return $self->_generic_request($opts, 'structure'); } sub sources { my ($self, $opts) = @_; return $self->_generic_request($opts, 'sources'); } sub stylesheet { my ($self, $callback, $opts) = @_; if(ref $callback eq 'HASH' && !defined $opts) { $opts = $callback; undef $callback; } if($callback) { $self->{'callback'} = $callback; } return $self->_generic_request(undef, 'stylesheet', $opts); } ######### # Private methods # ######### # Build the query URL; perform an HTTP fetch; drop into the recursive parser; apply any post-processing # sub _generic_request { my ($self, $query, $fname, $opts) = @_; $opts ||= {}; delete $self->{'currentsegs'}; my $results = {}; my $reqname = $fname; $reqname =~ s/(?:[(]|[)])//smxg; ($fname) = $fname =~ /^([[:lower:]_]+)/smx; my $ref = $self->build_requests({ query => $query, fname => $fname, reqname => $reqname, opts => $opts, results => $results }); $self->_fetch($ref, $opts->{'headers'}); $DEBUG and print {*STDERR} qq(Content retrieved\n); $self->postprocess($fname, $results); ######### # deal with caching # if($self->{'caching'}) { $DEBUG and print {*STDERR} qq(Performing cache handling\n); for my $s (keys %{$results}) { if($DEBUG && !$results->{$s}) { print {*STDERR} qq(CACHE HIT for $s\n); ## no critic (InputOutput::RequireCheckedSyscalls) } $results->{$s} ||= $self->{'_cache'}->{$s}; $self->{'_cache'}->{$s} ||= $results->{$s}; } } return $results; } sub build_queries { my ($self, $query, $fname) = @_; my @queries; if($query) { if(ref $query eq 'HASH') { ######### # If the query param was a hashref, stitch the parts together # push @queries, join q(;), map { "$_=$query->{$_}" } grep { $query->{$_} } @{$OPTS->{$fname}}; } elsif(ref $query eq 'ARRAY') { ######### # If the query param was an arrayref # if(ref $query->[-1] eq 'CODE') { ######### # ... and the last arg is a code-block, set up the callback for this run and remove the arg # $self->callback($query->[-1]); pop @{$query}; } if(ref $query->[0] eq 'HASH') { ######### # ... or if the first array arg is a hash, stitch the series of queries together # push @queries, map { ## no critic (ProhibitComplexMappings) my $q = $_; join q(;), map { "$_=$q->{$_}" } grep { $q->{$_} } @{$OPTS->{$fname}}; } @{$query}; } else { ######### # ... but otherwise assume it's a plain segment string # push @queries, map { "segment=$_"; } @{$query}; } } else { ######### # and if it wasn't a hashref or an arrayref, then assume it's a plain segment string # push @queries, "segment=$query"; } } else { ######### # Otherwise we've no idea what you're trying to do # push @queries, q(); } return \@queries; } sub _hack_fname { my ($self, $fname) = @_; ######### # Sucky hacks # if($fname eq 'structure') { $fname = 'dasstructure'; } elsif($fname eq 'dna') { $fname = 'sequence'; } return $fname; } sub build_requests { my ($self, $args) = @_; my $query = $args->{query}; my $fname = $args->{fname}; my $reqname = $args->{reqname}; my $opts = $args->{opts}; my $results = $args->{results}; my $queries = $self->build_queries($query, $fname); my $attr = $ATTR->{$fname}; my $dsn = $opts->{'use_basename'}?$self->basename():$self->dsn(); my @bn = @{$dsn}; my $ref = {}; for my $bn (@bn) { ######### # loop over dsn basenames # $bn =~ s/\/+$//smx; for my $request (map { $_ ? "$bn/$reqname?$_" : "$bn/$reqname" } @{$queries}) { ######### # and for each dsn, loop over the query request # if($self->{'caching'} && $self->{'_cache'}->{$request}) { ######### # the key has to be present, but the '0' callback will be ignored by _fetch # $results->{$request} = 0; next; } $results->{$request} = []; $ref->{$request} = sub { my $data = shift || q(); $self->{'data'}->{$request} .= $data; if(!$self->{'currentsegs'}->{$request}) { ######### # If we haven't yet found segment information for this request # Then look for some. This one is a non-destructive scan. # my $matches = $self->{'data'}->{$request} =~ m{(]*>)}smix; if($matches) { my $seginfo = []; $self->_parse_branch({ request => $request, seginfo => $seginfo, attr => $ATTR->{'_segment'}, blk => $1, addseginfo => 0, }); $self->{'currentsegs'}->{$request} = $seginfo->[0]; } } if($DEBUG) { print {*STDERR} qq(invoking _parse_branch for $fname\n) or croak $ERRNO; } ######### # Sucky hacks # if($fname eq 'dna') { $attr = $attr->{'sequence'}; } $fname = $self->_hack_fname($fname); my $pat = qr{(<$fname.*?/$fname>|<$fname[^>]+/>)}smix; while($self->{'data'}->{$request} =~ s/$pat//smx) { $self->_parse_branch({ request => $request, seginfo => $results->{$request}, attr => $attr, blk => $1, addseginfo => 1, }); } if($DEBUG) { print {*STDERR} qq(completed _parse_branch\n) or croak $ERRNO; } return; }; } } return $ref; } sub postprocess { my ($self, $fname, $results) = @_; $fname = $self->_hack_fname($fname); ######### # Add in useful segment information for empty segments # In theory there should only ever be one element in @{$self->{'seginfo'}} # as requests are parallelised by segment # for my $req (keys %{$results}) { if(!$results->{$req} || scalar @{$results->{$req}} == 0) { $results->{$req} = $self->{'currentsegs'}->{$req}; } } ######### # fix ups # if($fname eq 'entry_points') { $DEBUG and print {*STDERR} qq(Running postprocessing for entry_points\n); for my $s (keys %{$results}) { my $res = $results->{$s} || []; for my $r (@{$res}) { delete $r->{'segment_id'}; } } } elsif($fname eq 'sequence') { $DEBUG and print {*STDERR} qq(Running postprocessing for dna\n); for my $s (keys %{$results}) { my $res = $results->{$s} || []; for my $r (@{$res}) { if(exists $r->{'dna'}) { $r->{'dna'} =~ s/\s+//smgx; } elsif(exists $r->{'sequence'}) { $r->{'sequence'} =~ s/\s+//smgx; } } } } return; } ######### # Set up the parallel HTTP fetching # This uses our LWP::Parallel::UserAgent subclass which handles DAS statuses # sub _fetch { my ($self, $url_ref, $headers) = @_; $self->{'statuscodes'} = {}; $self->{'specversions'} = {}; if(!$headers) { $headers = {}; } if($ENV{HTTP_X_FORWARDED_FOR}) { $headers->{'X-Forwarded-For'} ||= $ENV{'HTTP_X_FORWARDED_FOR'}; } $headers->{'X-DAS-Version'} ||= '1.6'; # Convert header pairs to strings my @headers; for my $h (keys %{ $headers }) { push @headers, "$h: " . $headers->{$h}; } # We will now issue the actual requests. Due to insufficient support for error # handling and proxies, we can't use WWW::Curl::Simple. So we generate a # WWW::Curl::Easy object here, and register it with WWW::Curl::Multi. my $curlm = WWW::Curl::Multi->new(); my %reqs; my $i = 0; # First initiate the requests for my $url (keys %{$url_ref}) { if(ref $url_ref->{$url} ne 'CODE') { next; } $DEBUG and print {*STDERR} qq(Building WWW::Curl::Easy for $url [timeout=$self->{'timeout'}] via $url_ref->{$url}\n); $i++; my $curl = WWW::Curl::Easy->new(); $curl->setopt( CURLOPT_NOPROGRESS, 1 ); $curl->setopt( CURLOPT_FOLLOWLOCATION, 1 ); $curl->setopt( CURLOPT_USERAGENT, $self->user_agent ); $curl->setopt( CURLOPT_URL, $url ); if (scalar @headers) { $curl->setopt( CURLOPT_HTTPHEADER, \@headers ); } my ($body_ref, $head_ref); open my $fileb, q[>], \$body_ref or croak 'Error opening data handle'; ## no critic (RequireBriefOpen) $curl->setopt( CURLOPT_WRITEDATA, $fileb ); open my $fileh, q[>], \$head_ref or croak 'Error opening header handle'; ## no critic (RequireBriefOpen) $curl->setopt( CURLOPT_WRITEHEADER, $fileh ); # we set this so we have the ref later on $curl->setopt( CURLOPT_PRIVATE, $i ); $curl->setopt( CURLOPT_TIMEOUT, $self->timeout || $TIMEOUT ); #$curl->setopt( CURLOPT_CONNECTTIMEOUT, $self->connection_timeout || 2 ); $self->_fetch_proxy_setup($curl); $curlm->add_handle($curl); $reqs{$i} = { 'uri' => $url, 'easy' => $curl, 'head' => \$head_ref, 'body' => \$body_ref, }; } $DEBUG and print {*STDERR} qq(Requests submitted. Waiting for content\n); $self->_receive($url_ref, $curlm, \%reqs); return; } sub _fetch_proxy_setup { my ($self, $curl) = @_; if ( my $proxy = $self->http_proxy ) { if ( defined $Bio::Das::Lite::{CURLOPT_PROXY} ) { $curl->setopt( &CURLOPT_PROXY, $proxy ); ## no critic (ProhibitAmpersandSigils) } else { croak 'Trying to set a proxy, but your version of libcurl does not support this feature'; } } if ( my $proxy_user = $self->proxy_user ) { if ( defined $Bio::Das::Lite::{CURLOPT_PROXYUSERNAME} ) { $curl->setopt( &CURLOPT_PROXYUSERNAME, $proxy_user ); ## no critic (ProhibitAmpersandSigils) } else { croak 'Trying to set a proxy username, but your version of libcurl does not support this feature'; } } if ( my $proxy_pass = $self->proxy_pass ) { if ( defined $Bio::Das::Lite::{CURLOPT_PROXYPASSWORD} ) { $curl->setopt( &CURLOPT_PROXYPASSWORD, $proxy_pass ); ## no critic (ProhibitAmpersandSigils) } else { croak 'Trying to set a proxy password, but your version of libcurl does not support this feature'; } } my @no_proxy = @{ $self->no_proxy }; if ( scalar @no_proxy ) { if ( defined $Bio::Das::Lite::{CURLOPT_NOPROXY} ) { $curl->setopt( &CURLOPT_NOPROXY, join q(,), @no_proxy ); ## no critic (ProhibitAmpersandSigils) } else { croak 'Trying to set proxy exclusions, but your version of libcurl does not support this feature'; } } return; } sub _receive { my ($self, $url_ref, $curlm, $reqs) = @_; # Now check for results as they come back my $i = scalar keys %{ $reqs }; while ($i) { my $active_transfers = $curlm->perform; if ($active_transfers != $i) { while (my ($id,$retcode) = $curlm->info_read) { $id || next; $i--; my $req = $reqs->{$id}; my $uri = $req->{'uri'}; my $head = ${ $req->{'head'} } || q(); my $body = ${ $req->{'body'} } || q(); # We got a response from the server: if ($retcode == 0) { my $res = HTTP::Response->parse( $head . "\n" . $body ); my $msg; # Workaround for redirects, which result in multiple headers: while ($res->content =~ /^HTTP\/\d+\.\d+\s\d+/mxs) { # check for status line like "HTTP/1.1 200 OK" $res = HTTP::Response->parse( $res->content ); } $self->{specversions}->{$uri} = $res->header('X-DAS-Version'); # Prefer X-DAS-Status my ($das_status) = ($res->header('X-DAS-Status') || q()) =~ m/^(\d+)/smx; if ($das_status) { $msg = $self->{statuscodes}->{$uri} = $DAS_STATUS_TEXT->{$das_status}; # just in case we get a status we don't understand: $msg ||= $das_status . q( ) . ($res->message || 'Unknown status'); } # Fall back to HTTP status else { $msg = $res->status_line; # workaround for bug in HTTP::Response parse method: $msg =~ s/\r//gsmx; } $self->{statuscodes}->{$uri} = $msg; $url_ref->{$uri}->($res->content); # run the content handling code } # A connection error, timeout etc (NOT an HTTP status): else { $self->{statuscodes}->{$uri} = '500 ' . $req->{'easy'}->strerror($retcode); } delete($reqs->{$id}); # put out of scope to free memory } } } return; } sub statuscodes { my ($self, $url) = @_; $self->{'statuscodes'} ||= {}; return $url?$self->{'statuscodes'}->{$url}:$self->{'statuscodes'}; } sub specversions { my ($self, $url) = @_; $self->{'specversions'} ||= {}; return $url ? $self->{'specversions'}->{$url} : $self->{'specversions'}; } ######### # Using the $attr structure describing the structure of this branch, # recursively parse the XML blocks and build the corresponding response data structure # sub _parse_branch { my ($self, $args) = @_; my $dsn = $args->{request}; my $ar_ref = $args->{seginfo}; my $attr = $args->{attr}; my $blk = $args->{blk}; my $addseginfo = $args->{addseginfo}; my $depth = $args->{depth} || 0; my $ref = {}; my (@parts, @subparts); while(my ($k, $v) = each %{$attr}) { if(ref $v eq 'HASH') { push @subparts, $k; } else { push @parts, $k; } } ######### # recursive child-node handling, usually for s # for my $subpart (@subparts) { my $subpart_ref = []; my $pat = qr{(<$subpart[^>]*/>|<$subpart[^>]*?(?!/)>.*?/$subpart>)}smix; while($blk =~ s/$pat//smx) { $self->_parse_branch({ request => $dsn, seginfo => $subpart_ref, attr => $attr->{$subpart}, blk => $1, addseginfo => 0, depth => $depth+1, }); } if(scalar @{$subpart_ref}) { $ref->{$subpart} = $subpart_ref; } ######### # To-do: normalise group data across features here - mostly for 'group' tags in feature responses # i.e. merge links, use cached hashrefs (keyed on group id) describing groups to reduce the parsed tree footprint # NOTE: groups are now deprecated # } ######### # Attribute processing for tags in blocks # my $tmp; for my $tag (@parts) { my $opts = $attr->{$tag}||[]; for my $a (@{$opts}) { ($tmp) = $blk =~ m{<$tag[^>]*\s+$a="([^"]+?)"}smix; if(defined $tmp) { $ref->{"${tag}_$a"} = $tmp; } } ($tmp) = $blk =~ m{<$tag[^>]*>([^<]+)}smix; if(defined $tmp) { $tmp =~ s/^\s+$//smgx; if(length $tmp) { $ref->{$tag} = $tmp; } } if($tmp && $DEBUG) { print {*STDERR} q( )x($depth*2), qq( $tag = $tmp\n); ## no critic (InputOutput::RequireCheckedSyscalls) } } $self->_parse_twig($dsn, $blk, $ref, $addseginfo); push @{$ar_ref}, $ref; $DEBUG and print {*STDERR} q( )x($depth*2), qq(leaving _parse_branch\n); ######### # only perform callbacks if we're at recursion depth zero # if($depth == 0 && $self->{'callback'}) { $DEBUG and print {*STDERR} q( )x($depth*2), qq(executing callback at depth $depth\n); $ref->{'dsn'} = $dsn; my $callback = $self->{'callback'}; &{$callback}($ref); } return q(); } sub _parse_twig { my ($self, $dsn, $blk, $ref, $addseginfo) = @_; ######### # handle multiples of twig elements here # $blk =~ s/$LINKRE/{ $ref->{'link'} ||= []; push @{$ref->{'link'}}, { 'href' => $1 || $3, 'txt' => $2, }; q() }/smegix; $blk =~ s/$NOTERE/{ $ref->{'note'} ||= []; push @{$ref->{'note'}}, $1; q() }/smegix; if($addseginfo && $self->{'currentsegs'}->{$dsn}) { while(my ($k, $v) = each %{$self->{'currentsegs'}->{$dsn}}) { $ref->{$k} = $v; } } return; } sub registry { my ($self, @reg) = @_; if((scalar @reg == 1) && (ref $reg[0]) && (ref$reg[0] eq 'ARRAY')) { push @{$self->{'registry'}}, @{$reg[0]}; } else { push @{$self->{'registry'}}, @reg; } return $self->{'registry'}; } sub registry_sources { my ($self, $filters, $flush) = @_; $filters ||= {}; my $category = $filters->{'category'} || []; my $capability = $filters->{'capability'} || $filters->{'capabilities'} || []; if(!ref $category) { $category = [$category]; } if(!ref $capability) { $capability = [$capability]; } $flush and $self->{'_registry_sources'} = []; ######### # Populate the list of sources if this is the first call or we're flushing # if (scalar @{$self->{'_registry_sources'}} == 0) { $self->_fetch_registry_sources() or return []; } ######### # Jump out if there's no filtering to be done # if(!scalar keys %{$filters}) { return $self->{'_registry_sources'}; } my $sources = $self->{'_registry_sources'}; ######### # Apply capability filter # if((ref $capability eq 'ARRAY') && (scalar @{$capability})) { my $str = join q(|), @{$capability}; my $match = qr/$str/smx; $sources = [grep { $self->_filter_capability($_, $match) } @{$sources}]; } ######### # Apply coordinatesystem/category filter # if((ref $category eq 'ARRAY') && (scalar @{$category})) { $sources = [grep { $self->_filter_category($_, $category) } @{$sources}]; } return $sources; } sub _fetch_registry_sources { my $self = shift; my $reg_urls = $self->registry(); if (!scalar @{ $reg_urls }) { return; } my $old_dsns = $self->dsn(); my $old_statuses = $self->{'statuscodes'}; $self->dsn($reg_urls); ######### # Run the DAS sources command # my $sources_ref = $self->sources(); my $statuses = $self->{'statuscodes'}; $self->dsn($old_dsns); $self->{'statuscodes'} = $old_statuses; for my $url (keys %{ $sources_ref || {} }) { my $status = $statuses->{$url} || 'Unknown status'; if ($status !~ m/^200/mxs) { carp "Error fetching sources from '$url' : $status"; next; } my $ref = $sources_ref->{$url} || []; ######### # Some basic checks # (ref $ref eq 'ARRAY') || return; $ref = $ref->[0] || {}; (ref $ref eq 'HASH') || return; $ref = $ref->{'source'} || []; (ref $ref eq 'ARRAY') || return; ######### # The sources command has sources (really groups of sources) and # versions (really individual sources). For compatibility with the # old SOAP way of doing things, we must: # 1. throw away this source grouping semantic # 2. convert the hash format to the old style # for my $sourcegroup (@{ $ref }) { $self->_fetch_registry_sources_sourcegroup($sourcegroup); } } return 1; } sub _fetch_registry_sources_sourcegroup { my ($self, $sourcegroup) = @_; my $versions = $sourcegroup->{'version'} || []; (ref $versions eq 'ARRAY') || next; for my $source (@{ $versions }) { my $caps = $source->{'capability'} || []; my $dsn; my $object = { capabilities => [], coordinateSystem => [], description => $sourcegroup->{source_description}, id => $source->{version_uri}, }; ######### # Some sources have 'more info' URLs # if ( my $doc_href = $sourcegroup->{source_doc_href} ) { $object->{helperurl} = $doc_href; } ######### # Add the capabilties # for my $cap (@{ $caps }) { ######### # Extract the DAS URL from one of the capabilities # NOTE: in DAS 1 we assume all capability query URLs for one # source are the same. Anything else would need the data # model to be redesigned. # if (!$dsn) { $dsn = $cap->{'capability_query_uri'} || q(); ($dsn) = $dsn =~ m{(.+/das\d?/[^/]+)}mxs; $object->{'url'} = $dsn; } my $cap_type = $cap->{'capability_type'} || q(); ($cap_type) = $cap_type =~ m/das\d:(.+)/mxs; $cap_type || next; push @{ $object->{'capabilities'} }, $cap_type; } ######### # If none of the capabilities have query URLs, we can't query them! # $object->{'url'} || next; ######### # Add the coordinates # my $coords = $source->{'coordinates'} || []; for my $coord (@{ $coords }) { ######### # All coordinates have a name and category # my $coord_ob = { name => $coord->{coordinates_authority}, category => $coord->{coordinates_source}, }; ######### # Some coordinates have a version # if ( my $version = $coord->{'coordinates_version'} ) { $coord_ob->{'version'} = $version; } ######### # Some coordinates have a species (taxonomy ID and name) # if ( my $taxid = $coord->{'coordinates_taxid'} ) { $coord_ob->{'NCBITaxId'} = $taxid; my $desc = $coord->{'coordinates'}; my ($species) = $desc =~ m/([^,]+)$/mxs; $coord_ob->{'organismName'} = $species; } ######### # Add the coordinate system # push @{ $object->{'coordinateSystem'} }, $coord_ob; } ######### # Add the actual source object # push @{ $self->{'_registry_sources'} }, $object; } return 1; } sub _filter_capability { my ($self, $src, $match) = @_; for my $scap (@{$src->{'capabilities'}}) { if($scap =~ $match) { return 1; } } return 0; }; sub _filter_category { my ($self, $src, $match) = @_; for my $scoord (@{$src->{'coordinateSystem'}}) { for my $m (@{$match}) { if ($m =~ m/,/mxs) { # regex REQUIRES "authority,type", and handles optional version (with proper underscore handling) and species my ($auth, $ver, $cat, $org) = $m =~ m/^ (.+?) (?:_([^_,]+))? ,([^,]+) (?:,(.+))? /mxs; if (lc $cat eq lc $scoord->{'category'} && $auth eq $scoord->{'name'} && (!$ver || lc $ver eq lc $scoord->{'version'}) && (!$org || lc $org eq lc $scoord->{'organismName'})) { return 1; } } else { return 1 if(lc $scoord->{'category'} eq lc $m); } } } return 0; } 1; __END__ =head1 NAME Bio::Das::Lite - Perl extension for the DAS (HTTP+XML) Protocol (http://biodas.org/) =head1 VERSION See $Bio::Das::Lite::VERSION =head1 SYNOPSIS use Bio::Das::Lite; my $bdl = Bio::Das::Lite->new_from_registry({'category' => 'GRCh_37,Chromosome,Homo sapiens'}); my $results = $bdl->features('22'); =head1 SUBROUTINES/METHODS =head2 new : Constructor my $das = Bio::Das::Lite->new('http://das.ensembl.org/das/ensembl1834'); my $das = Bio::Das::Lite->new({ 'timeout' => 60, 'dsn' => 'http://user:pass@das.ensembl.org/das/ensembl1834', 'http_proxy' => 'http://user:pass@webcache.local.com:3128/', }); Options can be: dsn (optional scalar or array ref, URLs of DAS services) timeout (optional int, HTTP fetch timeout in seconds) http_proxy (optional scalar, web cache or proxy if not set in %ENV) no_proxy (optional list/ref, non-proxiable domains if not set in %ENV) caching (optional bool, primitive caching on/off) callback (optional code ref, callback for processed XML blocks) registry (optional array ref containing DAS registry service URLs defaults to 'http://das.sanger.ac.uk/registry/services/das') proxy_user (optional scalar, username for authenticating forward-proxy) proxy_pass (optional scalar, password for authenticating forward-proxy) user_agent (optional scalar, User-Agent HTTP request header value) =head2 new_from_registry : Constructor Similar to 'new' above but supports 'capability' and 'category' in the given hashref, using them to query the DAS registry and configuring the DSNs accordingly. my $das = Bio::Das::Lite->new_from_registry({ 'capability' => ['features'], 'category' => ['Protein Sequence'], }); Options are as above, plus capability OR capabilities (optional arrayref of capabilities) category (optional arrayref of categories) For a complete list of capabilities and categories, see: http://das.sanger.ac.uk/registry/ The category can optionally be a full coordinate system name, allowing further restriction by authority, version and species. For example: 'Protein Sequence' OR 'UniProt,Protein Sequence' OR 'GRCh_37,Chromosome,Homo sapiens' =head2 http_proxy : Get/Set http_proxy $das->http_proxy('http://user:pass@squid.myco.com:3128/'); =head2 proxy_user : Get/Set proxy username for authenticating forward-proxies This is only required if the username wasn't specified when setting http_proxy $das->proxy_user('myusername'); =head2 proxy_pass : Get/Set proxy password for authenticating forward-proxies This is only required if the password wasn't specified when setting http_proxy $das->proxy_pass('secretpassword'); =head2 no_proxy : Get/Set domains to not use proxy for $das->no_proxy('ebi.ac.uk', 'localhost'); OR $das->no_proxy( ['ebi.ac.uk', 'localhost'] ); Always returns an arrayref =head2 user_agent : Get/Set user-agent for request headers $das->user_agent('GroovyDAS/1.0'); =head2 timeout : Get/Set timeout $das->timeout(30); =head2 caching : Get/Set caching $das->caching(1); =head2 callback : Get/Set callback code ref $das->callback(sub { }); =head2 basename : Get base URL(s) of service $das->basename(optional $dsn); =head2 dsn : Get/Set DSN $das->dsn('http://das.ensembl.org/das/ensembl1834/'); # give dsn (scalar or arrayref) here if not specified in new() Or, if you want to add to the existing dsn list and you're feeling sneaky... push @{$das->dsn}, 'http://my.server/das/additionalsource'; =head2 dsns : Retrieve information about other sources served from this server. Note this call is 'dsns', as differentiated from 'dsn' which is the current configured source my $src_data = $das->dsns(); =head2 entry_points : Retrieve the list of entry_points for this source e.g. chromosomes and associated information (e.g. sequence length and version) my $entry_points = $das->entry_points(); =head2 Types of argument for 'types', 'features', 'sequence' calls: Segment Id: '1' Segment Id with range: '1:1,1000' Segment Id with range and type: { 'segment' => '1:1,1000', 'type' => 'exon', } Multiple Ids with ranges and types: [ { 'segment' => '1:1,1000', 'type' => 'exon', }, { 'segment' => '2:1,1000', 'type' => 'exon', }, ] See DAS specifications for other parameters =head2 types : Find out about different data types available from this source my $types = $das->types(); # takes optional args - see DAS specs Retrieve the types of data available for this source e.g. 32k_cloneset, karyotype, swissprot =head2 features : Retrieve features from a segment e.g. clones on a chromosome ######### # Different ways to fetch features - # my $feature_data1 = $das->features('1:1,100000'); my $feature_data2 = $das->features(['1:1,100000', '2:20435000,21435000']); my $feature_data3 = $das->features({ 'segment' => '1:1,1000', 'type' => 'karyotype', # optional args - see DAS Spec }); my $feature_data4 = $das->features([ {'segment' => '1:1,1000000','type' => 'karyotype',}, {'segment' => '2:1,1000000',}, {'group_id' => 'OTTHUMG00000036084',}, ]); ######### # Feature fetch with callback # my $callback = sub { my $struct = shift; print {*STDERR} Dumper($struct); }; # then: $das->callback($callback); $das->features('1:1,1000000'); # or: $das->features('1:1,1000000', $callback); # or: $das->features(['1:1,1000000', '2:1,1000000', '3:1,1000000'], $callback); # or: $das->features([{'group_id' => 'OTTHUMG00000036084'}, '2:1,1000000', '3:1,1000000'], $callback); =head2 alignment : Retrieve protein alignment data for a query. This can be a multiple sequence alignment or pairwise alignment. Note - this has not been tested for structural alignments as there is currently no Das source avialable. my $alignment = $das->alignment({query => 'Q01234'}); =head2 structure : Retrieve known structure (i.e. PDB) for a query my $structure = $das->structure({ query => 'pdb_id'}); =head2 sources : Retrieves the list of sources form the DAS registry, via a DAS call. my $sources = $das->source; =head2 sequence : Retrieve sequence data for a segment (probably dna or protein) my $sequence = $das->sequence('2:1,1000'); # segment:start,stop (e.g. chromosome 2, bases 1 to 1000) =head2 stylesheet : Retrieve stylesheet data my $style_data = $das->stylesheet(); my $style_data2 = $das->stylesheet($callback); =head2 statuscodes : Retrieve HTTP status codes for request URLs my $code = $das->statuscodes($url); my $code_hashref = $das->statuscodes(); =head2 specversions : Retrieve a server's DAS specification version for a request URL my $version = $das->specversions($url); # e.g. 1.53, 1.6, 1.6E my $version_hashref = $das->specversions(); =head2 max_hosts set number of running concurrent host connections THIS METHOD IS NOW DEPRECATED AND HAS NO EFFECT $das->max_hosts(7); print $das->max_hosts(); =head2 max_req set number of running concurrent requests per host THIS METHOD IS NOW DEPRECATED AND HAS NO EFFECT $das->max_req(5); print $das->max_req(); =head2 registry : Get/Set accessor for DAS-Registry service URLs $biodaslite->registry('http://www.dasregistry.org/das'); my $registry_arrayref = $biodaslite->registry(); =head2 registry_sources : Arrayref of dassource objects from the configured registry services my $sources_ref = $biodaslite->registry_sources(); my $sources_ref = $biodaslite->registry_sources({ 'capability' => ['features','stylesheet'], }); my $sources_ref = $biodaslite->registry_sources({ 'category' => ['Protein Sequence'], }); =head2 build_queries Constructs an arrayref of DAS requests including parameters for each call =head2 build_requests Constructs the WWW::Curl callbacks =head2 postprocess Applies processing to the result set, e.g. removal of whitespace from sequence responses. =head1 DESCRIPTION This module is an implementation of a client for the DAS protocol (XML over HTTP primarily for biological-data). =head1 DEPENDENCIES =over =item strict =item warnings =item WWW::Curl =item HTTP::Response =item Carp =item English =item Readonly =back =head1 DIAGNOSTICS Set $Bio::Das::Lite::DEBUG = 1; =head1 CONFIGURATION AND ENVIRONMENT =head1 INCOMPATIBILITIES =head1 BUGS AND LIMITATIONS The max_req and max_hosts methods are now deprecated and have no effect. =head1 SEE ALSO DAS Specifications at: http://biodas.org/documents/spec.html ProServer (A DAS Server implementation also by the author) at: http://www.sanger.ac.uk/proserver/ The venerable Bio::Das suite (CPAN and http://www.biodas.org/download/Bio::Das/). The DAS Registry at: http://das.sanger.ac.uk/registry/ =head1 AUTHOR Roger Pettett, Erpettett@cpan.orgE =head1 LICENSE AND COPYRIGHT Copyright (C) 2007 GRL, by Roger Pettett This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.4 or, at your option, any later version of Perl 5 you may have available. =cut