ngoto-bio 1.2.9.9001

Sign up to get free protection for your applications and to get access to all the features.
Files changed (424) hide show
  1. data/ChangeLog +2046 -0
  2. data/README.rdoc +223 -0
  3. data/README_DEV.rdoc +285 -0
  4. data/Rakefile +70 -0
  5. data/bin/bioruby +44 -0
  6. data/bin/br_biofetch.rb +47 -0
  7. data/bin/br_bioflat.rb +293 -0
  8. data/bin/br_biogetseq.rb +45 -0
  9. data/bin/br_pmfetch.rb +421 -0
  10. data/bioruby.gemspec +463 -0
  11. data/bioruby.gemspec.erb +79 -0
  12. data/doc/Changes-0.7.rd +369 -0
  13. data/doc/Changes-1.3.rdoc +195 -0
  14. data/doc/KEGG_API.rd +1843 -0
  15. data/doc/KEGG_API.rd.ja +1834 -0
  16. data/doc/Tutorial.rd +1296 -0
  17. data/doc/Tutorial.rd.ja +2640 -0
  18. data/etc/bioinformatics/seqdatabase.ini +210 -0
  19. data/extconf.rb +2 -0
  20. data/lib/bio/alignment.rb +2518 -0
  21. data/lib/bio/appl/bl2seq/report.rb +334 -0
  22. data/lib/bio/appl/blast/ddbj.rb +142 -0
  23. data/lib/bio/appl/blast/format0.rb +1438 -0
  24. data/lib/bio/appl/blast/format8.rb +83 -0
  25. data/lib/bio/appl/blast/genomenet.rb +263 -0
  26. data/lib/bio/appl/blast/ncbioptions.rb +220 -0
  27. data/lib/bio/appl/blast/remote.rb +105 -0
  28. data/lib/bio/appl/blast/report.rb +767 -0
  29. data/lib/bio/appl/blast/rexml.rb +144 -0
  30. data/lib/bio/appl/blast/rpsblast.rb +277 -0
  31. data/lib/bio/appl/blast/wublast.rb +671 -0
  32. data/lib/bio/appl/blast/xmlparser.rb +236 -0
  33. data/lib/bio/appl/blast.rb +505 -0
  34. data/lib/bio/appl/blat/report.rb +530 -0
  35. data/lib/bio/appl/clustalw/report.rb +152 -0
  36. data/lib/bio/appl/clustalw.rb +219 -0
  37. data/lib/bio/appl/emboss.rb +203 -0
  38. data/lib/bio/appl/fasta/format10.rb +325 -0
  39. data/lib/bio/appl/fasta.rb +235 -0
  40. data/lib/bio/appl/gcg/msf.rb +212 -0
  41. data/lib/bio/appl/gcg/seq.rb +195 -0
  42. data/lib/bio/appl/genscan/report.rb +552 -0
  43. data/lib/bio/appl/hmmer/report.rb +683 -0
  44. data/lib/bio/appl/hmmer.rb +126 -0
  45. data/lib/bio/appl/iprscan/report.rb +374 -0
  46. data/lib/bio/appl/mafft/report.rb +226 -0
  47. data/lib/bio/appl/mafft.rb +259 -0
  48. data/lib/bio/appl/muscle.rb +52 -0
  49. data/lib/bio/appl/paml/baseml/report.rb +32 -0
  50. data/lib/bio/appl/paml/baseml.rb +95 -0
  51. data/lib/bio/appl/paml/codeml/rates.rb +67 -0
  52. data/lib/bio/appl/paml/codeml/report.rb +67 -0
  53. data/lib/bio/appl/paml/codeml.rb +242 -0
  54. data/lib/bio/appl/paml/common.rb +348 -0
  55. data/lib/bio/appl/paml/common_report.rb +38 -0
  56. data/lib/bio/appl/paml/yn00/report.rb +32 -0
  57. data/lib/bio/appl/paml/yn00.rb +103 -0
  58. data/lib/bio/appl/phylip/alignment.rb +129 -0
  59. data/lib/bio/appl/phylip/distance_matrix.rb +96 -0
  60. data/lib/bio/appl/probcons.rb +41 -0
  61. data/lib/bio/appl/psort/report.rb +457 -0
  62. data/lib/bio/appl/psort.rb +548 -0
  63. data/lib/bio/appl/pts1.rb +263 -0
  64. data/lib/bio/appl/sim4/report.rb +485 -0
  65. data/lib/bio/appl/sim4.rb +124 -0
  66. data/lib/bio/appl/sosui/report.rb +151 -0
  67. data/lib/bio/appl/spidey/report.rb +593 -0
  68. data/lib/bio/appl/targetp/report.rb +267 -0
  69. data/lib/bio/appl/tcoffee.rb +55 -0
  70. data/lib/bio/appl/tmhmm/report.rb +231 -0
  71. data/lib/bio/command.rb +593 -0
  72. data/lib/bio/compat/features.rb +157 -0
  73. data/lib/bio/compat/references.rb +128 -0
  74. data/lib/bio/data/aa.rb +349 -0
  75. data/lib/bio/data/codontable.rb +722 -0
  76. data/lib/bio/data/na.rb +223 -0
  77. data/lib/bio/db/aaindex.rb +357 -0
  78. data/lib/bio/db/biosql/biosql_to_biosequence.rb +67 -0
  79. data/lib/bio/db/biosql/sequence.rb +508 -0
  80. data/lib/bio/db/embl/common.rb +352 -0
  81. data/lib/bio/db/embl/embl.rb +500 -0
  82. data/lib/bio/db/embl/embl_to_biosequence.rb +85 -0
  83. data/lib/bio/db/embl/format_embl.rb +190 -0
  84. data/lib/bio/db/embl/sptr.rb +1283 -0
  85. data/lib/bio/db/embl/swissprot.rb +42 -0
  86. data/lib/bio/db/embl/trembl.rb +41 -0
  87. data/lib/bio/db/embl/uniprot.rb +42 -0
  88. data/lib/bio/db/fantom.rb +597 -0
  89. data/lib/bio/db/fasta/defline.rb +532 -0
  90. data/lib/bio/db/fasta/fasta_to_biosequence.rb +63 -0
  91. data/lib/bio/db/fasta/format_fasta.rb +97 -0
  92. data/lib/bio/db/fasta.rb +410 -0
  93. data/lib/bio/db/genbank/common.rb +307 -0
  94. data/lib/bio/db/genbank/ddbj.rb +22 -0
  95. data/lib/bio/db/genbank/format_genbank.rb +187 -0
  96. data/lib/bio/db/genbank/genbank.rb +250 -0
  97. data/lib/bio/db/genbank/genbank_to_biosequence.rb +86 -0
  98. data/lib/bio/db/genbank/genpept.rb +60 -0
  99. data/lib/bio/db/genbank/refseq.rb +18 -0
  100. data/lib/bio/db/gff.rb +1846 -0
  101. data/lib/bio/db/go.rb +481 -0
  102. data/lib/bio/db/kegg/brite.rb +41 -0
  103. data/lib/bio/db/kegg/compound.rb +131 -0
  104. data/lib/bio/db/kegg/drug.rb +98 -0
  105. data/lib/bio/db/kegg/enzyme.rb +148 -0
  106. data/lib/bio/db/kegg/expression.rb +155 -0
  107. data/lib/bio/db/kegg/genes.rb +263 -0
  108. data/lib/bio/db/kegg/genome.rb +241 -0
  109. data/lib/bio/db/kegg/glycan.rb +166 -0
  110. data/lib/bio/db/kegg/keggtab.rb +357 -0
  111. data/lib/bio/db/kegg/kgml.rb +256 -0
  112. data/lib/bio/db/kegg/orthology.rb +136 -0
  113. data/lib/bio/db/kegg/reaction.rb +82 -0
  114. data/lib/bio/db/kegg/taxonomy.rb +331 -0
  115. data/lib/bio/db/lasergene.rb +209 -0
  116. data/lib/bio/db/litdb.rb +107 -0
  117. data/lib/bio/db/medline.rb +326 -0
  118. data/lib/bio/db/nbrf.rb +191 -0
  119. data/lib/bio/db/newick.rb +658 -0
  120. data/lib/bio/db/nexus.rb +1854 -0
  121. data/lib/bio/db/pdb/atom.rb +77 -0
  122. data/lib/bio/db/pdb/chain.rb +210 -0
  123. data/lib/bio/db/pdb/chemicalcomponent.rb +224 -0
  124. data/lib/bio/db/pdb/model.rb +148 -0
  125. data/lib/bio/db/pdb/pdb.rb +1911 -0
  126. data/lib/bio/db/pdb/residue.rb +176 -0
  127. data/lib/bio/db/pdb/utils.rb +399 -0
  128. data/lib/bio/db/pdb.rb +29 -0
  129. data/lib/bio/db/prosite.rb +597 -0
  130. data/lib/bio/db/rebase.rb +456 -0
  131. data/lib/bio/db/soft.rb +404 -0
  132. data/lib/bio/db/transfac.rb +375 -0
  133. data/lib/bio/db.rb +329 -0
  134. data/lib/bio/feature.rb +139 -0
  135. data/lib/bio/io/biosql/biodatabase.rb +64 -0
  136. data/lib/bio/io/biosql/bioentry.rb +29 -0
  137. data/lib/bio/io/biosql/bioentry_dbxref.rb +11 -0
  138. data/lib/bio/io/biosql/bioentry_path.rb +12 -0
  139. data/lib/bio/io/biosql/bioentry_qualifier_value.rb +10 -0
  140. data/lib/bio/io/biosql/bioentry_reference.rb +10 -0
  141. data/lib/bio/io/biosql/bioentry_relationship.rb +10 -0
  142. data/lib/bio/io/biosql/biosequence.rb +11 -0
  143. data/lib/bio/io/biosql/comment.rb +7 -0
  144. data/lib/bio/io/biosql/config/database.yml +20 -0
  145. data/lib/bio/io/biosql/dbxref.rb +13 -0
  146. data/lib/bio/io/biosql/dbxref_qualifier_value.rb +12 -0
  147. data/lib/bio/io/biosql/location.rb +32 -0
  148. data/lib/bio/io/biosql/location_qualifier_value.rb +11 -0
  149. data/lib/bio/io/biosql/ontology.rb +10 -0
  150. data/lib/bio/io/biosql/reference.rb +9 -0
  151. data/lib/bio/io/biosql/seqfeature.rb +32 -0
  152. data/lib/bio/io/biosql/seqfeature_dbxref.rb +11 -0
  153. data/lib/bio/io/biosql/seqfeature_path.rb +11 -0
  154. data/lib/bio/io/biosql/seqfeature_qualifier_value.rb +20 -0
  155. data/lib/bio/io/biosql/seqfeature_relationship.rb +11 -0
  156. data/lib/bio/io/biosql/taxon.rb +12 -0
  157. data/lib/bio/io/biosql/taxon_name.rb +9 -0
  158. data/lib/bio/io/biosql/term.rb +27 -0
  159. data/lib/bio/io/biosql/term_dbxref.rb +11 -0
  160. data/lib/bio/io/biosql/term_path.rb +12 -0
  161. data/lib/bio/io/biosql/term_relationship.rb +13 -0
  162. data/lib/bio/io/biosql/term_relationship_term.rb +11 -0
  163. data/lib/bio/io/biosql/term_synonym.rb +10 -0
  164. data/lib/bio/io/das.rb +461 -0
  165. data/lib/bio/io/dbget.rb +194 -0
  166. data/lib/bio/io/ddbjxml.rb +638 -0
  167. data/lib/bio/io/ebisoap.rb +158 -0
  168. data/lib/bio/io/ensembl.rb +229 -0
  169. data/lib/bio/io/fastacmd.rb +163 -0
  170. data/lib/bio/io/fetch.rb +195 -0
  171. data/lib/bio/io/flatfile/autodetection.rb +545 -0
  172. data/lib/bio/io/flatfile/bdb.rb +253 -0
  173. data/lib/bio/io/flatfile/buffer.rb +237 -0
  174. data/lib/bio/io/flatfile/index.rb +1381 -0
  175. data/lib/bio/io/flatfile/indexer.rb +805 -0
  176. data/lib/bio/io/flatfile/splitter.rb +297 -0
  177. data/lib/bio/io/flatfile.rb +473 -0
  178. data/lib/bio/io/higet.rb +73 -0
  179. data/lib/bio/io/hinv.rb +442 -0
  180. data/lib/bio/io/keggapi.rb +805 -0
  181. data/lib/bio/io/ncbirest.rb +733 -0
  182. data/lib/bio/io/ncbisoap.rb +155 -0
  183. data/lib/bio/io/pubmed.rb +307 -0
  184. data/lib/bio/io/registry.rb +292 -0
  185. data/lib/bio/io/soapwsdl.rb +119 -0
  186. data/lib/bio/io/sql.rb +186 -0
  187. data/lib/bio/location.rb +867 -0
  188. data/lib/bio/map.rb +410 -0
  189. data/lib/bio/pathway.rb +960 -0
  190. data/lib/bio/reference.rb +602 -0
  191. data/lib/bio/sequence/aa.rb +125 -0
  192. data/lib/bio/sequence/adapter.rb +108 -0
  193. data/lib/bio/sequence/common.rb +310 -0
  194. data/lib/bio/sequence/compat.rb +123 -0
  195. data/lib/bio/sequence/dblink.rb +54 -0
  196. data/lib/bio/sequence/format.rb +358 -0
  197. data/lib/bio/sequence/format_raw.rb +23 -0
  198. data/lib/bio/sequence/generic.rb +24 -0
  199. data/lib/bio/sequence/na.rb +491 -0
  200. data/lib/bio/sequence.rb +456 -0
  201. data/lib/bio/shell/core.rb +578 -0
  202. data/lib/bio/shell/demo.rb +146 -0
  203. data/lib/bio/shell/interface.rb +218 -0
  204. data/lib/bio/shell/irb.rb +95 -0
  205. data/lib/bio/shell/object.rb +71 -0
  206. data/lib/bio/shell/plugin/blast.rb +42 -0
  207. data/lib/bio/shell/plugin/codon.rb +218 -0
  208. data/lib/bio/shell/plugin/das.rb +58 -0
  209. data/lib/bio/shell/plugin/emboss.rb +23 -0
  210. data/lib/bio/shell/plugin/entry.rb +105 -0
  211. data/lib/bio/shell/plugin/flatfile.rb +101 -0
  212. data/lib/bio/shell/plugin/keggapi.rb +181 -0
  213. data/lib/bio/shell/plugin/midi.rb +430 -0
  214. data/lib/bio/shell/plugin/obda.rb +45 -0
  215. data/lib/bio/shell/plugin/psort.rb +56 -0
  216. data/lib/bio/shell/plugin/seq.rb +247 -0
  217. data/lib/bio/shell/plugin/soap.rb +87 -0
  218. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/bioruby_generator.rb +29 -0
  219. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_classes.rhtml +4 -0
  220. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_log.rhtml +27 -0
  221. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_methods.rhtml +11 -0
  222. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_modules.rhtml +4 -0
  223. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/_variables.rhtml +7 -0
  224. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-bg.gif +0 -0
  225. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-gem.png +0 -0
  226. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby-link.gif +0 -0
  227. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby.css +368 -0
  228. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby.rhtml +47 -0
  229. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby_controller.rb +144 -0
  230. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/bioruby_helper.rb +47 -0
  231. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/commands.rhtml +8 -0
  232. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/history.rhtml +10 -0
  233. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/index.rhtml +26 -0
  234. data/lib/bio/shell/rails/vendor/plugins/bioruby/generators/bioruby/templates/spinner.gif +0 -0
  235. data/lib/bio/shell/script.rb +25 -0
  236. data/lib/bio/shell/setup.rb +109 -0
  237. data/lib/bio/shell/web.rb +102 -0
  238. data/lib/bio/shell.rb +44 -0
  239. data/lib/bio/tree.rb +852 -0
  240. data/lib/bio/util/color_scheme/buried.rb +59 -0
  241. data/lib/bio/util/color_scheme/helix.rb +59 -0
  242. data/lib/bio/util/color_scheme/hydropathy.rb +64 -0
  243. data/lib/bio/util/color_scheme/nucleotide.rb +31 -0
  244. data/lib/bio/util/color_scheme/strand.rb +59 -0
  245. data/lib/bio/util/color_scheme/taylor.rb +50 -0
  246. data/lib/bio/util/color_scheme/turn.rb +59 -0
  247. data/lib/bio/util/color_scheme/zappo.rb +50 -0
  248. data/lib/bio/util/color_scheme.rb +191 -0
  249. data/lib/bio/util/contingency_table.rb +370 -0
  250. data/lib/bio/util/restriction_enzyme/analysis.rb +249 -0
  251. data/lib/bio/util/restriction_enzyme/analysis_basic.rb +217 -0
  252. data/lib/bio/util/restriction_enzyme/cut_symbol.rb +107 -0
  253. data/lib/bio/util/restriction_enzyme/double_stranded/aligned_strands.rb +130 -0
  254. data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb +103 -0
  255. data/lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair_in_enzyme_notation.rb +38 -0
  256. data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations.rb +76 -0
  257. data/lib/bio/util/restriction_enzyme/double_stranded/cut_locations_in_enzyme_notation.rb +107 -0
  258. data/lib/bio/util/restriction_enzyme/double_stranded.rb +321 -0
  259. data/lib/bio/util/restriction_enzyme/enzymes.yaml +7061 -0
  260. data/lib/bio/util/restriction_enzyme/range/cut_range.rb +24 -0
  261. data/lib/bio/util/restriction_enzyme/range/cut_ranges.rb +47 -0
  262. data/lib/bio/util/restriction_enzyme/range/horizontal_cut_range.rb +67 -0
  263. data/lib/bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb +242 -0
  264. data/lib/bio/util/restriction_enzyme/range/sequence_range/fragment.rb +51 -0
  265. data/lib/bio/util/restriction_enzyme/range/sequence_range/fragments.rb +41 -0
  266. data/lib/bio/util/restriction_enzyme/range/sequence_range.rb +257 -0
  267. data/lib/bio/util/restriction_enzyme/range/vertical_cut_range.rb +77 -0
  268. data/lib/bio/util/restriction_enzyme/single_strand/cut_locations_in_enzyme_notation.rb +135 -0
  269. data/lib/bio/util/restriction_enzyme/single_strand.rb +200 -0
  270. data/lib/bio/util/restriction_enzyme/single_strand_complement.rb +23 -0
  271. data/lib/bio/util/restriction_enzyme/string_formatting.rb +111 -0
  272. data/lib/bio/util/restriction_enzyme.rb +228 -0
  273. data/lib/bio/util/sirna.rb +288 -0
  274. data/lib/bio.rb +300 -0
  275. data/rdoc.zsh +8 -0
  276. data/sample/any2fasta.rb +59 -0
  277. data/sample/biofetch.rb +475 -0
  278. data/sample/color_scheme_na.rb +91 -0
  279. data/sample/dbget +37 -0
  280. data/sample/demo_sequence.rb +158 -0
  281. data/sample/enzymes.rb +78 -0
  282. data/sample/fasta2tab.rb +99 -0
  283. data/sample/fastagrep.rb +72 -0
  284. data/sample/fastasort.rb +54 -0
  285. data/sample/fsplit.rb +51 -0
  286. data/sample/gb2fasta.rb +30 -0
  287. data/sample/gb2tab.rb +325 -0
  288. data/sample/gbtab2mysql.rb +161 -0
  289. data/sample/genes2nuc.rb +33 -0
  290. data/sample/genes2pep.rb +33 -0
  291. data/sample/genes2tab.rb +81 -0
  292. data/sample/genome2rb.rb +29 -0
  293. data/sample/genome2tab.rb +76 -0
  294. data/sample/goslim.rb +303 -0
  295. data/sample/gt2fasta.rb +47 -0
  296. data/sample/na2aa.rb +34 -0
  297. data/sample/pmfetch.rb +42 -0
  298. data/sample/pmsearch.rb +42 -0
  299. data/sample/psortplot_html.rb +214 -0
  300. data/sample/ssearch2tab.rb +96 -0
  301. data/sample/tdiary.rb +158 -0
  302. data/sample/tfastx2tab.rb +100 -0
  303. data/sample/vs-genes.rb +212 -0
  304. data/setup.rb +1596 -0
  305. data/test/data/HMMER/hmmpfam.out +64 -0
  306. data/test/data/HMMER/hmmsearch.out +88 -0
  307. data/test/data/SOSUI/sample.report +11 -0
  308. data/test/data/TMHMM/sample.report +21 -0
  309. data/test/data/aaindex/DAYM780301 +30 -0
  310. data/test/data/aaindex/PRAM900102 +20 -0
  311. data/test/data/bl2seq/cd8a_cd8b_blastp.bl2seq +53 -0
  312. data/test/data/bl2seq/cd8a_p53_e-5blastp.bl2seq +37 -0
  313. data/test/data/blast/2.2.15.blastp.m7 +876 -0
  314. data/test/data/blast/b0002.faa +15 -0
  315. data/test/data/blast/b0002.faa.m0 +128 -0
  316. data/test/data/blast/b0002.faa.m7 +65 -0
  317. data/test/data/blast/b0002.faa.m8 +1 -0
  318. data/test/data/blast/blastp-multi.m7 +188 -0
  319. data/test/data/command/echoarg2.bat +1 -0
  320. data/test/data/embl/AB090716.embl +65 -0
  321. data/test/data/embl/AB090716.embl.rel89 +63 -0
  322. data/test/data/fasta/example1.txt +75 -0
  323. data/test/data/fasta/example2.txt +21 -0
  324. data/test/data/genscan/sample.report +63 -0
  325. data/test/data/iprscan/merged.raw +32 -0
  326. data/test/data/iprscan/merged.txt +74 -0
  327. data/test/data/paml/codeml/control_file.txt +30 -0
  328. data/test/data/paml/codeml/output.txt +78 -0
  329. data/test/data/paml/codeml/rates +217 -0
  330. data/test/data/prosite/prosite.dat +2233 -0
  331. data/test/data/refseq/nm_126355.entret +64 -0
  332. data/test/data/rpsblast/misc.rpsblast +193 -0
  333. data/test/data/soft/GDS100_partial.soft +92 -0
  334. data/test/data/soft/GSE3457_family_partial.soft +874 -0
  335. data/test/data/uniprot/p53_human.uniprot +1456 -0
  336. data/test/functional/bio/appl/test_pts1.rb +115 -0
  337. data/test/functional/bio/io/test_ensembl.rb +229 -0
  338. data/test/functional/bio/io/test_soapwsdl.rb +52 -0
  339. data/test/functional/bio/sequence/test_output_embl.rb +51 -0
  340. data/test/functional/bio/test_command.rb +301 -0
  341. data/test/runner.rb +23 -0
  342. data/test/unit/bio/appl/bl2seq/test_report.rb +134 -0
  343. data/test/unit/bio/appl/blast/test_ncbioptions.rb +112 -0
  344. data/test/unit/bio/appl/blast/test_report.rb +1135 -0
  345. data/test/unit/bio/appl/blast/test_rpsblast.rb +398 -0
  346. data/test/unit/bio/appl/genscan/test_report.rb +182 -0
  347. data/test/unit/bio/appl/hmmer/test_report.rb +342 -0
  348. data/test/unit/bio/appl/iprscan/test_report.rb +338 -0
  349. data/test/unit/bio/appl/mafft/test_report.rb +63 -0
  350. data/test/unit/bio/appl/paml/codeml/test_rates.rb +45 -0
  351. data/test/unit/bio/appl/paml/codeml/test_report.rb +45 -0
  352. data/test/unit/bio/appl/paml/test_codeml.rb +174 -0
  353. data/test/unit/bio/appl/sosui/test_report.rb +81 -0
  354. data/test/unit/bio/appl/targetp/test_report.rb +146 -0
  355. data/test/unit/bio/appl/test_blast.rb +277 -0
  356. data/test/unit/bio/appl/test_fasta.rb +130 -0
  357. data/test/unit/bio/appl/test_pts1.rb +77 -0
  358. data/test/unit/bio/appl/tmhmm/test_report.rb +126 -0
  359. data/test/unit/bio/data/test_aa.rb +90 -0
  360. data/test/unit/bio/data/test_codontable.rb +107 -0
  361. data/test/unit/bio/data/test_na.rb +80 -0
  362. data/test/unit/bio/db/embl/test_common.rb +117 -0
  363. data/test/unit/bio/db/embl/test_embl.rb +214 -0
  364. data/test/unit/bio/db/embl/test_embl_rel89.rb +219 -0
  365. data/test/unit/bio/db/embl/test_embl_to_bioseq.rb +203 -0
  366. data/test/unit/bio/db/embl/test_sptr.rb +1812 -0
  367. data/test/unit/bio/db/embl/test_uniprot.rb +31 -0
  368. data/test/unit/bio/db/kegg/test_genes.rb +45 -0
  369. data/test/unit/bio/db/pdb/test_pdb.rb +152 -0
  370. data/test/unit/bio/db/test_aaindex.rb +197 -0
  371. data/test/unit/bio/db/test_fasta.rb +250 -0
  372. data/test/unit/bio/db/test_gff.rb +1190 -0
  373. data/test/unit/bio/db/test_lasergene.rb +95 -0
  374. data/test/unit/bio/db/test_medline.rb +127 -0
  375. data/test/unit/bio/db/test_newick.rb +293 -0
  376. data/test/unit/bio/db/test_nexus.rb +364 -0
  377. data/test/unit/bio/db/test_prosite.rb +1437 -0
  378. data/test/unit/bio/db/test_rebase.rb +101 -0
  379. data/test/unit/bio/db/test_soft.rb +138 -0
  380. data/test/unit/bio/io/flatfile/test_autodetection.rb +375 -0
  381. data/test/unit/bio/io/flatfile/test_buffer.rb +251 -0
  382. data/test/unit/bio/io/flatfile/test_splitter.rb +369 -0
  383. data/test/unit/bio/io/test_ddbjxml.rb +80 -0
  384. data/test/unit/bio/io/test_ensembl.rb +109 -0
  385. data/test/unit/bio/io/test_fastacmd.rb +42 -0
  386. data/test/unit/bio/io/test_flatfile.rb +488 -0
  387. data/test/unit/bio/io/test_soapwsdl.rb +32 -0
  388. data/test/unit/bio/sequence/test_aa.rb +103 -0
  389. data/test/unit/bio/sequence/test_common.rb +373 -0
  390. data/test/unit/bio/sequence/test_compat.rb +69 -0
  391. data/test/unit/bio/sequence/test_dblink.rb +58 -0
  392. data/test/unit/bio/sequence/test_na.rb +330 -0
  393. data/test/unit/bio/shell/plugin/test_seq.rb +185 -0
  394. data/test/unit/bio/test_alignment.rb +1025 -0
  395. data/test/unit/bio/test_command.rb +349 -0
  396. data/test/unit/bio/test_db.rb +96 -0
  397. data/test/unit/bio/test_feature.rb +144 -0
  398. data/test/unit/bio/test_location.rb +599 -0
  399. data/test/unit/bio/test_map.rb +230 -0
  400. data/test/unit/bio/test_pathway.rb +499 -0
  401. data/test/unit/bio/test_reference.rb +252 -0
  402. data/test/unit/bio/test_sequence.rb +329 -0
  403. data/test/unit/bio/test_shell.rb +18 -0
  404. data/test/unit/bio/test_tree.rb +593 -0
  405. data/test/unit/bio/util/restriction_enzyme/analysis/test_calculated_cuts.rb +299 -0
  406. data/test/unit/bio/util/restriction_enzyme/analysis/test_cut_ranges.rb +103 -0
  407. data/test/unit/bio/util/restriction_enzyme/analysis/test_sequence_range.rb +240 -0
  408. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_aligned_strands.rb +101 -0
  409. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair.rb +75 -0
  410. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_location_pair_in_enzyme_notation.rb +73 -0
  411. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations.rb +53 -0
  412. data/test/unit/bio/util/restriction_enzyme/double_stranded/test_cut_locations_in_enzyme_notation.rb +104 -0
  413. data/test/unit/bio/util/restriction_enzyme/single_strand/test_cut_locations_in_enzyme_notation.rb +83 -0
  414. data/test/unit/bio/util/restriction_enzyme/test_analysis.rb +246 -0
  415. data/test/unit/bio/util/restriction_enzyme/test_cut_symbol.rb +44 -0
  416. data/test/unit/bio/util/restriction_enzyme/test_double_stranded.rb +115 -0
  417. data/test/unit/bio/util/restriction_enzyme/test_single_strand.rb +147 -0
  418. data/test/unit/bio/util/restriction_enzyme/test_single_strand_complement.rb +147 -0
  419. data/test/unit/bio/util/restriction_enzyme/test_string_formatting.rb +60 -0
  420. data/test/unit/bio/util/test_color_scheme.rb +33 -0
  421. data/test/unit/bio/util/test_contingency_table.rb +94 -0
  422. data/test/unit/bio/util/test_restriction_enzyme.rb +42 -0
  423. data/test/unit/bio/util/test_sirna.rb +245 -0
  424. metadata +484 -0
data/setup.rb ADDED
@@ -0,0 +1,1596 @@
1
+ #
2
+ # setup.rb
3
+ #
4
+ # Copyright (c) 2000-2006 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute/modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ #
10
+
11
+ unless Enumerable.method_defined?(:map) # Ruby 1.4.6
12
+ module Enumerable
13
+ alias map collect
14
+ end
15
+ end
16
+
17
+ unless File.respond_to?(:read) # Ruby 1.6
18
+ def File.read(fname)
19
+ open(fname) {|f|
20
+ return f.read
21
+ }
22
+ end
23
+ end
24
+
25
+ unless Errno.const_defined?(:ENOTEMPTY) # Windows?
26
+ module Errno
27
+ class ENOTEMPTY
28
+ # We do not raise this exception, implementation is not needed.
29
+ end
30
+ end
31
+ end
32
+
33
+ def File.binread(fname)
34
+ open(fname, 'rb') {|f|
35
+ return f.read
36
+ }
37
+ end
38
+
39
+ # for corrupted Windows' stat(2)
40
+ def File.dir?(path)
41
+ File.directory?((path[-1,1] == '/') ? path : path + '/')
42
+ end
43
+
44
+
45
+ class ConfigTable
46
+
47
+ include Enumerable
48
+
49
+ def initialize(rbconfig)
50
+ @rbconfig = rbconfig
51
+ @items = []
52
+ @table = {}
53
+ # options
54
+ @install_prefix = nil
55
+ @config_opt = nil
56
+ @verbose = true
57
+ @no_harm = false
58
+ end
59
+
60
+ attr_accessor :install_prefix
61
+ attr_accessor :config_opt
62
+
63
+ attr_writer :verbose
64
+
65
+ def verbose?
66
+ @verbose
67
+ end
68
+
69
+ attr_writer :no_harm
70
+
71
+ def no_harm?
72
+ @no_harm
73
+ end
74
+
75
+ def [](key)
76
+ lookup(key).resolve(self)
77
+ end
78
+
79
+ def []=(key, val)
80
+ lookup(key).set val
81
+ end
82
+
83
+ def names
84
+ @items.map {|i| i.name }
85
+ end
86
+
87
+ def each(&block)
88
+ @items.each(&block)
89
+ end
90
+
91
+ def key?(name)
92
+ @table.key?(name)
93
+ end
94
+
95
+ def lookup(name)
96
+ @table[name] or setup_rb_error "no such config item: #{name}"
97
+ end
98
+
99
+ def add(item)
100
+ @items.push item
101
+ @table[item.name] = item
102
+ end
103
+
104
+ def remove(name)
105
+ item = lookup(name)
106
+ @items.delete_if {|i| i.name == name }
107
+ @table.delete_if {|name, i| i.name == name }
108
+ item
109
+ end
110
+
111
+ def load_script(path, inst = nil)
112
+ if File.file?(path)
113
+ MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
114
+ end
115
+ end
116
+
117
+ def savefile
118
+ '.config'
119
+ end
120
+
121
+ def load_savefile
122
+ begin
123
+ File.foreach(savefile()) do |line|
124
+ k, v = *line.split(/=/, 2)
125
+ self[k] = v.strip
126
+ end
127
+ rescue Errno::ENOENT
128
+ setup_rb_error $!.message + "\n#{File.basename($0)} config first"
129
+ end
130
+ end
131
+
132
+ def save
133
+ @items.each {|i| i.value }
134
+ File.open(savefile(), 'w') {|f|
135
+ @items.each do |i|
136
+ f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
137
+ end
138
+ }
139
+ end
140
+
141
+ def load_standard_entries
142
+ standard_entries(@rbconfig).each do |ent|
143
+ add ent
144
+ end
145
+ end
146
+
147
+ def standard_entries(rbconfig)
148
+ c = rbconfig
149
+
150
+ rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
151
+
152
+ major = c['MAJOR'].to_i
153
+ minor = c['MINOR'].to_i
154
+ teeny = c['TEENY'].to_i
155
+ version = "#{major}.#{minor}"
156
+
157
+ # ruby ver. >= 1.4.4?
158
+ newpath_p = ((major >= 2) or
159
+ ((major == 1) and
160
+ ((minor >= 5) or
161
+ ((minor == 4) and (teeny >= 4)))))
162
+
163
+ if c['rubylibdir']
164
+ # V > 1.6.3
165
+ libruby = "#{c['prefix']}/lib/ruby"
166
+ librubyver = c['rubylibdir']
167
+ librubyverarch = c['archdir']
168
+ siteruby = c['sitedir']
169
+ siterubyver = c['sitelibdir']
170
+ siterubyverarch = c['sitearchdir']
171
+ elsif newpath_p
172
+ # 1.4.4 <= V <= 1.6.3
173
+ libruby = "#{c['prefix']}/lib/ruby"
174
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
175
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
176
+ siteruby = c['sitedir']
177
+ siterubyver = "$siteruby/#{version}"
178
+ siterubyverarch = "$siterubyver/#{c['arch']}"
179
+ else
180
+ # V < 1.4.4
181
+ libruby = "#{c['prefix']}/lib/ruby"
182
+ librubyver = "#{c['prefix']}/lib/ruby/#{version}"
183
+ librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
184
+ siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
185
+ siterubyver = siteruby
186
+ siterubyverarch = "$siterubyver/#{c['arch']}"
187
+ end
188
+ parameterize = lambda {|path|
189
+ path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
190
+ }
191
+
192
+ if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
193
+ makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
194
+ else
195
+ makeprog = 'make'
196
+ end
197
+
198
+ [
199
+ ExecItem.new('installdirs', 'std/site/home',
200
+ 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
201
+ {|val, table|
202
+ case val
203
+ when 'std'
204
+ table['rbdir'] = '$librubyver'
205
+ table['sodir'] = '$librubyverarch'
206
+ when 'site'
207
+ table['rbdir'] = '$siterubyver'
208
+ table['sodir'] = '$siterubyverarch'
209
+ when 'home'
210
+ setup_rb_error '$HOME was not set' unless ENV['HOME']
211
+ table['prefix'] = ENV['HOME']
212
+ table['rbdir'] = '$libdir/ruby'
213
+ table['sodir'] = '$libdir/ruby'
214
+ end
215
+ },
216
+ PathItem.new('prefix', 'path', c['prefix'],
217
+ 'path prefix of target environment'),
218
+ PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
219
+ 'the directory for commands'),
220
+ PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
221
+ 'the directory for libraries'),
222
+ PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
223
+ 'the directory for shared data'),
224
+ PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
225
+ 'the directory for man pages'),
226
+ PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
227
+ 'the directory for system configuration files'),
228
+ PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
229
+ 'the directory for local state data'),
230
+ PathItem.new('libruby', 'path', libruby,
231
+ 'the directory for ruby libraries'),
232
+ PathItem.new('librubyver', 'path', librubyver,
233
+ 'the directory for standard ruby libraries'),
234
+ PathItem.new('librubyverarch', 'path', librubyverarch,
235
+ 'the directory for standard ruby extensions'),
236
+ PathItem.new('siteruby', 'path', siteruby,
237
+ 'the directory for version-independent aux ruby libraries'),
238
+ PathItem.new('siterubyver', 'path', siterubyver,
239
+ 'the directory for aux ruby libraries'),
240
+ PathItem.new('siterubyverarch', 'path', siterubyverarch,
241
+ 'the directory for aux ruby binaries'),
242
+ PathItem.new('rbdir', 'path', '$siterubyver',
243
+ 'the directory for ruby scripts'),
244
+ PathItem.new('sodir', 'path', '$siterubyverarch',
245
+ 'the directory for ruby extentions'),
246
+ PathItem.new('rubypath', 'path', rubypath,
247
+ 'the path to set to #! line'),
248
+ ProgramItem.new('rubyprog', 'name', rubypath,
249
+ 'the ruby program using for installation'),
250
+ ProgramItem.new('makeprog', 'name', makeprog,
251
+ 'the make program to compile ruby extentions'),
252
+ SelectItem.new('shebang', 'all/ruby/never', 'ruby',
253
+ 'shebang line (#!) editing mode'),
254
+ BoolItem.new('without-ext', 'yes/no', 'no',
255
+ 'does not compile/install ruby extentions')
256
+ ]
257
+ end
258
+ private :standard_entries
259
+
260
+ def load_multipackage_entries
261
+ multipackage_entries().each do |ent|
262
+ add ent
263
+ end
264
+ end
265
+
266
+ def multipackage_entries
267
+ [
268
+ PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
269
+ 'package names that you want to install'),
270
+ PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
271
+ 'package names that you do not want to install')
272
+ ]
273
+ end
274
+ private :multipackage_entries
275
+
276
+ ALIASES = {
277
+ 'std-ruby' => 'librubyver',
278
+ 'stdruby' => 'librubyver',
279
+ 'rubylibdir' => 'librubyver',
280
+ 'archdir' => 'librubyverarch',
281
+ 'site-ruby-common' => 'siteruby', # For backward compatibility
282
+ 'site-ruby' => 'siterubyver', # For backward compatibility
283
+ 'bin-dir' => 'bindir',
284
+ 'bin-dir' => 'bindir',
285
+ 'rb-dir' => 'rbdir',
286
+ 'so-dir' => 'sodir',
287
+ 'data-dir' => 'datadir',
288
+ 'ruby-path' => 'rubypath',
289
+ 'ruby-prog' => 'rubyprog',
290
+ 'ruby' => 'rubyprog',
291
+ 'make-prog' => 'makeprog',
292
+ 'make' => 'makeprog'
293
+ }
294
+
295
+ def fixup
296
+ ALIASES.each do |ali, name|
297
+ @table[ali] = @table[name]
298
+ end
299
+ end
300
+
301
+ def options_re
302
+ /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
303
+ end
304
+
305
+ def parse_opt(opt)
306
+ m = options_re().match(opt) or setup_rb_error "config: unknown option #{opt}"
307
+ m.to_a[1,2]
308
+ end
309
+
310
+ def dllext
311
+ @rbconfig['DLEXT']
312
+ end
313
+
314
+ def value_config?(name)
315
+ lookup(name).value?
316
+ end
317
+
318
+ class Item
319
+ def initialize(name, template, default, desc)
320
+ @name = name.freeze
321
+ @template = template
322
+ @value = default
323
+ @default = default
324
+ @description = desc
325
+ end
326
+
327
+ attr_reader :name
328
+ attr_reader :description
329
+
330
+ attr_accessor :default
331
+ alias help_default default
332
+
333
+ def help_opt
334
+ "--#{@name}=#{@template}"
335
+ end
336
+
337
+ def value?
338
+ true
339
+ end
340
+
341
+ def value
342
+ @value
343
+ end
344
+
345
+ def resolve(table)
346
+ @value.gsub(%r<\$([^/]+)>) { table[$1] }
347
+ end
348
+
349
+ def set(val)
350
+ @value = check(val)
351
+ end
352
+
353
+ private
354
+
355
+ def check(val)
356
+ setup_rb_error "config: --#{name} requires argument" unless val
357
+ val
358
+ end
359
+ end
360
+
361
+ class BoolItem < Item
362
+ def config_type
363
+ 'bool'
364
+ end
365
+
366
+ def help_opt
367
+ "--#{@name}"
368
+ end
369
+
370
+ private
371
+
372
+ def check(val)
373
+ return 'yes' unless val
374
+ case val
375
+ when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
376
+ when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
377
+ else
378
+ setup_rb_error "config: --#{@name} accepts only yes/no for argument"
379
+ end
380
+ end
381
+ end
382
+
383
+ class PathItem < Item
384
+ def config_type
385
+ 'path'
386
+ end
387
+
388
+ private
389
+
390
+ def check(path)
391
+ setup_rb_error "config: --#{@name} requires argument" unless path
392
+ path[0,1] == '$' ? path : File.expand_path(path)
393
+ end
394
+ end
395
+
396
+ class ProgramItem < Item
397
+ def config_type
398
+ 'program'
399
+ end
400
+ end
401
+
402
+ class SelectItem < Item
403
+ def initialize(name, selection, default, desc)
404
+ super
405
+ @ok = selection.split('/')
406
+ end
407
+
408
+ def config_type
409
+ 'select'
410
+ end
411
+
412
+ private
413
+
414
+ def check(val)
415
+ unless @ok.include?(val.strip)
416
+ setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
417
+ end
418
+ val.strip
419
+ end
420
+ end
421
+
422
+ class ExecItem < Item
423
+ def initialize(name, selection, desc, &block)
424
+ super name, selection, nil, desc
425
+ @ok = selection.split('/')
426
+ @action = block
427
+ end
428
+
429
+ def config_type
430
+ 'exec'
431
+ end
432
+
433
+ def value?
434
+ false
435
+ end
436
+
437
+ def resolve(table)
438
+ setup_rb_error "$#{name()} wrongly used as option value"
439
+ end
440
+
441
+ undef set
442
+
443
+ def evaluate(val, table)
444
+ v = val.strip.downcase
445
+ unless @ok.include?(v)
446
+ setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
447
+ end
448
+ @action.call v, table
449
+ end
450
+ end
451
+
452
+ class PackageSelectionItem < Item
453
+ def initialize(name, template, default, help_default, desc)
454
+ super name, template, default, desc
455
+ @help_default = help_default
456
+ end
457
+
458
+ attr_reader :help_default
459
+
460
+ def config_type
461
+ 'package'
462
+ end
463
+
464
+ private
465
+
466
+ def check(val)
467
+ unless File.dir?("packages/#{val}")
468
+ setup_rb_error "config: no such package: #{val}"
469
+ end
470
+ val
471
+ end
472
+ end
473
+
474
+ class MetaConfigEnvironment
475
+ def initialize(config, installer)
476
+ @config = config
477
+ @installer = installer
478
+ end
479
+
480
+ def config_names
481
+ @config.names
482
+ end
483
+
484
+ def config?(name)
485
+ @config.key?(name)
486
+ end
487
+
488
+ def bool_config?(name)
489
+ @config.lookup(name).config_type == 'bool'
490
+ end
491
+
492
+ def path_config?(name)
493
+ @config.lookup(name).config_type == 'path'
494
+ end
495
+
496
+ def value_config?(name)
497
+ @config.lookup(name).config_type != 'exec'
498
+ end
499
+
500
+ def add_config(item)
501
+ @config.add item
502
+ end
503
+
504
+ def add_bool_config(name, default, desc)
505
+ @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
506
+ end
507
+
508
+ def add_path_config(name, default, desc)
509
+ @config.add PathItem.new(name, 'path', default, desc)
510
+ end
511
+
512
+ def set_config_default(name, default)
513
+ @config.lookup(name).default = default
514
+ end
515
+
516
+ def remove_config(name)
517
+ @config.remove(name)
518
+ end
519
+
520
+ # For only multipackage
521
+ def packages
522
+ raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
523
+ @installer.packages
524
+ end
525
+
526
+ # For only multipackage
527
+ def declare_packages(list)
528
+ raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
529
+ @installer.packages = list
530
+ end
531
+ end
532
+
533
+ end # class ConfigTable
534
+
535
+
536
+ # This module requires: #verbose?, #no_harm?
537
+ module FileOperations
538
+
539
+ def mkdir_p(dirname, prefix = nil)
540
+ dirname = prefix + File.expand_path(dirname) if prefix
541
+ $stderr.puts "mkdir -p #{dirname}" if verbose?
542
+ return if no_harm?
543
+
544
+ # Does not check '/', it's too abnormal.
545
+ dirs = File.expand_path(dirname).split(%r<(?=/)>)
546
+ if /\A[a-z]:\z/i =~ dirs[0]
547
+ disk = dirs.shift
548
+ dirs[0] = disk + dirs[0]
549
+ end
550
+ dirs.each_index do |idx|
551
+ path = dirs[0..idx].join('')
552
+ Dir.mkdir path unless File.dir?(path)
553
+ end
554
+ end
555
+
556
+ def rm_f(path)
557
+ $stderr.puts "rm -f #{path}" if verbose?
558
+ return if no_harm?
559
+ force_remove_file path
560
+ end
561
+
562
+ def rm_rf(path)
563
+ $stderr.puts "rm -rf #{path}" if verbose?
564
+ return if no_harm?
565
+ remove_tree path
566
+ end
567
+
568
+ def remove_tree(path)
569
+ if File.symlink?(path)
570
+ remove_file path
571
+ elsif File.dir?(path)
572
+ remove_tree0 path
573
+ else
574
+ force_remove_file path
575
+ end
576
+ end
577
+
578
+ def remove_tree0(path)
579
+ Dir.foreach(path) do |ent|
580
+ next if ent == '.'
581
+ next if ent == '..'
582
+ entpath = "#{path}/#{ent}"
583
+ if File.symlink?(entpath)
584
+ remove_file entpath
585
+ elsif File.dir?(entpath)
586
+ remove_tree0 entpath
587
+ else
588
+ force_remove_file entpath
589
+ end
590
+ end
591
+ begin
592
+ Dir.rmdir path
593
+ rescue Errno::ENOTEMPTY
594
+ # directory may not be empty
595
+ end
596
+ end
597
+
598
+ def move_file(src, dest)
599
+ force_remove_file dest
600
+ begin
601
+ File.rename src, dest
602
+ rescue
603
+ File.open(dest, 'wb') {|f|
604
+ f.write File.binread(src)
605
+ }
606
+ File.chmod File.stat(src).mode, dest
607
+ File.unlink src
608
+ end
609
+ end
610
+
611
+ def force_remove_file(path)
612
+ begin
613
+ remove_file path
614
+ rescue
615
+ end
616
+ end
617
+
618
+ def remove_file(path)
619
+ File.chmod 0777, path
620
+ File.unlink path
621
+ end
622
+
623
+ def install(from, dest, mode, prefix = nil)
624
+ $stderr.puts "install #{from} #{dest}" if verbose?
625
+ return if no_harm?
626
+
627
+ realdest = prefix ? prefix + File.expand_path(dest) : dest
628
+ realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
629
+ str = File.binread(from)
630
+ if diff?(str, realdest)
631
+ verbose_off {
632
+ rm_f realdest if File.exist?(realdest)
633
+ }
634
+ File.open(realdest, 'wb') {|f|
635
+ f.write str
636
+ }
637
+ File.chmod mode, realdest
638
+
639
+ File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
640
+ if prefix
641
+ f.puts realdest.sub(prefix, '')
642
+ else
643
+ f.puts realdest
644
+ end
645
+ }
646
+ end
647
+ end
648
+
649
+ def diff?(new_content, path)
650
+ return true unless File.exist?(path)
651
+ new_content != File.binread(path)
652
+ end
653
+
654
+ def command(*args)
655
+ $stderr.puts args.join(' ') if verbose?
656
+ system(*args) or raise RuntimeError,
657
+ "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
658
+ end
659
+
660
+ def ruby(*args)
661
+ command config('rubyprog'), *args
662
+ end
663
+
664
+ def make(task = nil)
665
+ command(*[config('makeprog'), task].compact)
666
+ end
667
+
668
+ def extdir?(dir)
669
+ File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
670
+ end
671
+
672
+ def files_of(dir)
673
+ Dir.open(dir) {|d|
674
+ return d.select {|ent| File.file?("#{dir}/#{ent}") }
675
+ }
676
+ end
677
+
678
+ DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
679
+
680
+ def directories_of(dir)
681
+ Dir.open(dir) {|d|
682
+ return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
683
+ }
684
+ end
685
+
686
+ end
687
+
688
+
689
+ # This module requires: #srcdir_root, #objdir_root, #relpath
690
+ module HookScriptAPI
691
+
692
+ def get_config(key)
693
+ @config[key]
694
+ end
695
+
696
+ alias config get_config
697
+
698
+ # obsolete: use metaconfig to change configuration
699
+ def set_config(key, val)
700
+ @config[key] = val
701
+ end
702
+
703
+ #
704
+ # srcdir/objdir (works only in the package directory)
705
+ #
706
+
707
+ def curr_srcdir
708
+ "#{srcdir_root()}/#{relpath()}"
709
+ end
710
+
711
+ def curr_objdir
712
+ "#{objdir_root()}/#{relpath()}"
713
+ end
714
+
715
+ def srcfile(path)
716
+ "#{curr_srcdir()}/#{path}"
717
+ end
718
+
719
+ def srcexist?(path)
720
+ File.exist?(srcfile(path))
721
+ end
722
+
723
+ def srcdirectory?(path)
724
+ File.dir?(srcfile(path))
725
+ end
726
+
727
+ def srcfile?(path)
728
+ File.file?(srcfile(path))
729
+ end
730
+
731
+ def srcentries(path = '.')
732
+ Dir.open("#{curr_srcdir()}/#{path}") {|d|
733
+ return d.to_a - %w(. ..)
734
+ }
735
+ end
736
+
737
+ def srcfiles(path = '.')
738
+ srcentries(path).select {|fname|
739
+ File.file?(File.join(curr_srcdir(), path, fname))
740
+ }
741
+ end
742
+
743
+ def srcdirectories(path = '.')
744
+ srcentries(path).select {|fname|
745
+ File.dir?(File.join(curr_srcdir(), path, fname))
746
+ }
747
+ end
748
+
749
+ end
750
+
751
+
752
+ class ToplevelInstaller
753
+
754
+ Version = '3.4.1'
755
+ Copyright = 'Copyright (c) 2000-2006 Minero Aoki'
756
+
757
+ TASKS = [
758
+ [ 'all', 'do config, setup, then install' ],
759
+ [ 'config', 'saves your configurations' ],
760
+ [ 'show', 'shows current configuration' ],
761
+ [ 'setup', 'compiles ruby extentions and others' ],
762
+ [ 'install', 'installs files' ],
763
+ [ 'test', 'run all tests in test/' ],
764
+ [ 'clean', "does `make clean' for each extention" ],
765
+ [ 'distclean',"does `make distclean' for each extention" ]
766
+ ]
767
+
768
+ def ToplevelInstaller.invoke
769
+ config = ConfigTable.new(load_rbconfig())
770
+ config.load_standard_entries
771
+ config.load_multipackage_entries if multipackage?
772
+ config.fixup
773
+ klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
774
+ klass.new(File.dirname($0), config).invoke
775
+ end
776
+
777
+ def ToplevelInstaller.multipackage?
778
+ File.dir?(File.dirname($0) + '/packages')
779
+ end
780
+
781
+ def ToplevelInstaller.load_rbconfig
782
+ if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
783
+ ARGV.delete(arg)
784
+ load File.expand_path(arg.split(/=/, 2)[1])
785
+ $".push 'rbconfig.rb'
786
+ else
787
+ require 'rbconfig'
788
+ end
789
+ ::Config::CONFIG
790
+ end
791
+
792
+ def initialize(ardir_root, config)
793
+ @ardir = File.expand_path(ardir_root)
794
+ @config = config
795
+ # cache
796
+ @valid_task_re = nil
797
+ end
798
+
799
+ def config(key)
800
+ @config[key]
801
+ end
802
+
803
+ def inspect
804
+ "#<#{self.class} #{__id__()}>"
805
+ end
806
+
807
+ def invoke
808
+ run_metaconfigs
809
+ case task = parsearg_global()
810
+ when nil, 'all'
811
+ parsearg_config
812
+ init_installers
813
+ exec_config
814
+ exec_setup
815
+ exec_install
816
+ else
817
+ case task
818
+ when 'config', 'test'
819
+ ;
820
+ when 'clean', 'distclean'
821
+ @config.load_savefile if File.exist?(@config.savefile)
822
+ else
823
+ @config.load_savefile
824
+ end
825
+ __send__ "parsearg_#{task}"
826
+ init_installers
827
+ __send__ "exec_#{task}"
828
+ end
829
+ end
830
+
831
+ def run_metaconfigs
832
+ @config.load_script "#{@ardir}/metaconfig"
833
+ end
834
+
835
+ def init_installers
836
+ @installer = Installer.new(@config, @ardir, File.expand_path('.'))
837
+ end
838
+
839
+ #
840
+ # Hook Script API bases
841
+ #
842
+
843
+ def srcdir_root
844
+ @ardir
845
+ end
846
+
847
+ def objdir_root
848
+ '.'
849
+ end
850
+
851
+ def relpath
852
+ '.'
853
+ end
854
+
855
+ #
856
+ # Option Parsing
857
+ #
858
+
859
+ def parsearg_global
860
+ while arg = ARGV.shift
861
+ case arg
862
+ when /\A\w+\z/
863
+ setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
864
+ return arg
865
+ when '-q', '--quiet'
866
+ @config.verbose = false
867
+ when '--verbose'
868
+ @config.verbose = true
869
+ when '--help'
870
+ print_usage $stdout
871
+ exit 0
872
+ when '--version'
873
+ puts "#{File.basename($0)} version #{Version}"
874
+ exit 0
875
+ when '--copyright'
876
+ puts Copyright
877
+ exit 0
878
+ else
879
+ setup_rb_error "unknown global option '#{arg}'"
880
+ end
881
+ end
882
+ nil
883
+ end
884
+
885
+ def valid_task?(t)
886
+ valid_task_re() =~ t
887
+ end
888
+
889
+ def valid_task_re
890
+ @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
891
+ end
892
+
893
+ def parsearg_no_options
894
+ unless ARGV.empty?
895
+ task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
896
+ setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
897
+ end
898
+ end
899
+
900
+ alias parsearg_show parsearg_no_options
901
+ alias parsearg_setup parsearg_no_options
902
+ alias parsearg_test parsearg_no_options
903
+ alias parsearg_clean parsearg_no_options
904
+ alias parsearg_distclean parsearg_no_options
905
+
906
+ def parsearg_config
907
+ evalopt = []
908
+ set = []
909
+ @config.config_opt = []
910
+ while i = ARGV.shift
911
+ if /\A--?\z/ =~ i
912
+ @config.config_opt = ARGV.dup
913
+ break
914
+ end
915
+ name, value = *@config.parse_opt(i)
916
+ if @config.value_config?(name)
917
+ @config[name] = value
918
+ else
919
+ evalopt.push [name, value]
920
+ end
921
+ set.push name
922
+ end
923
+ evalopt.each do |name, value|
924
+ @config.lookup(name).evaluate value, @config
925
+ end
926
+ # Check if configuration is valid
927
+ set.each do |n|
928
+ @config[n] if @config.value_config?(n)
929
+ end
930
+ end
931
+
932
+ def parsearg_install
933
+ @config.no_harm = false
934
+ @config.install_prefix = ''
935
+ while a = ARGV.shift
936
+ case a
937
+ when '--no-harm'
938
+ @config.no_harm = true
939
+ when /\A--prefix=/
940
+ path = a.split(/=/, 2)[1]
941
+ path = File.expand_path(path) unless path[0,1] == '/'
942
+ @config.install_prefix = path
943
+ else
944
+ setup_rb_error "install: unknown option #{a}"
945
+ end
946
+ end
947
+ end
948
+
949
+ def print_usage(out)
950
+ out.puts 'Typical Installation Procedure:'
951
+ out.puts " $ ruby #{File.basename $0} config"
952
+ out.puts " $ ruby #{File.basename $0} setup"
953
+ out.puts " # ruby #{File.basename $0} install (may require root privilege)"
954
+ out.puts
955
+ out.puts 'Detailed Usage:'
956
+ out.puts " ruby #{File.basename $0} <global option>"
957
+ out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
958
+
959
+ fmt = " %-24s %s\n"
960
+ out.puts
961
+ out.puts 'Global options:'
962
+ out.printf fmt, '-q,--quiet', 'suppress message outputs'
963
+ out.printf fmt, ' --verbose', 'output messages verbosely'
964
+ out.printf fmt, ' --help', 'print this message'
965
+ out.printf fmt, ' --version', 'print version and quit'
966
+ out.printf fmt, ' --copyright', 'print copyright and quit'
967
+ out.puts
968
+ out.puts 'Tasks:'
969
+ TASKS.each do |name, desc|
970
+ out.printf fmt, name, desc
971
+ end
972
+
973
+ fmt = " %-24s %s [%s]\n"
974
+ out.puts
975
+ out.puts 'Options for CONFIG or ALL:'
976
+ @config.each do |item|
977
+ out.printf fmt, item.help_opt, item.description, item.help_default
978
+ end
979
+ out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
980
+ out.puts
981
+ out.puts 'Options for INSTALL:'
982
+ out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
983
+ out.printf fmt, '--prefix=path', 'install path prefix', ''
984
+ out.puts
985
+ end
986
+
987
+ #
988
+ # Task Handlers
989
+ #
990
+
991
+ def exec_config
992
+ @installer.exec_config
993
+ @config.save # must be final
994
+ end
995
+
996
+ def exec_setup
997
+ @installer.exec_setup
998
+ end
999
+
1000
+ def exec_install
1001
+ @installer.exec_install
1002
+ end
1003
+
1004
+ def exec_test
1005
+ @installer.exec_test
1006
+ end
1007
+
1008
+ def exec_show
1009
+ @config.each do |i|
1010
+ printf "%-20s %s\n", i.name, i.value if i.value?
1011
+ end
1012
+ end
1013
+
1014
+ def exec_clean
1015
+ @installer.exec_clean
1016
+ end
1017
+
1018
+ def exec_distclean
1019
+ @installer.exec_distclean
1020
+ end
1021
+
1022
+ end # class ToplevelInstaller
1023
+
1024
+
1025
+ class ToplevelInstallerMulti < ToplevelInstaller
1026
+
1027
+ include FileOperations
1028
+
1029
+ def initialize(ardir_root, config)
1030
+ super
1031
+ @packages = directories_of("#{@ardir}/packages")
1032
+ raise 'no package exists' if @packages.empty?
1033
+ @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
1034
+ end
1035
+
1036
+ def run_metaconfigs
1037
+ @config.load_script "#{@ardir}/metaconfig", self
1038
+ @packages.each do |name|
1039
+ @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
1040
+ end
1041
+ end
1042
+
1043
+ attr_reader :packages
1044
+
1045
+ def packages=(list)
1046
+ raise 'package list is empty' if list.empty?
1047
+ list.each do |name|
1048
+ raise "directory packages/#{name} does not exist"\
1049
+ unless File.dir?("#{@ardir}/packages/#{name}")
1050
+ end
1051
+ @packages = list
1052
+ end
1053
+
1054
+ def init_installers
1055
+ @installers = {}
1056
+ @packages.each do |pack|
1057
+ @installers[pack] = Installer.new(@config,
1058
+ "#{@ardir}/packages/#{pack}",
1059
+ "packages/#{pack}")
1060
+ end
1061
+ with = extract_selection(config('with'))
1062
+ without = extract_selection(config('without'))
1063
+ @selected = @installers.keys.select {|name|
1064
+ (with.empty? or with.include?(name)) \
1065
+ and not without.include?(name)
1066
+ }
1067
+ end
1068
+
1069
+ def extract_selection(list)
1070
+ a = list.split(/,/)
1071
+ a.each do |name|
1072
+ setup_rb_error "no such package: #{name}" unless @installers.key?(name)
1073
+ end
1074
+ a
1075
+ end
1076
+
1077
+ def print_usage(f)
1078
+ super
1079
+ f.puts 'Inluded packages:'
1080
+ f.puts ' ' + @packages.sort.join(' ')
1081
+ f.puts
1082
+ end
1083
+
1084
+ #
1085
+ # Task Handlers
1086
+ #
1087
+
1088
+ def exec_config
1089
+ run_hook 'pre-config'
1090
+ each_selected_installers {|inst| inst.exec_config }
1091
+ run_hook 'post-config'
1092
+ @config.save # must be final
1093
+ end
1094
+
1095
+ def exec_setup
1096
+ run_hook 'pre-setup'
1097
+ each_selected_installers {|inst| inst.exec_setup }
1098
+ run_hook 'post-setup'
1099
+ end
1100
+
1101
+ def exec_install
1102
+ run_hook 'pre-install'
1103
+ each_selected_installers {|inst| inst.exec_install }
1104
+ run_hook 'post-install'
1105
+ end
1106
+
1107
+ def exec_test
1108
+ run_hook 'pre-test'
1109
+ each_selected_installers {|inst| inst.exec_test }
1110
+ run_hook 'post-test'
1111
+ end
1112
+
1113
+ def exec_clean
1114
+ rm_f @config.savefile
1115
+ run_hook 'pre-clean'
1116
+ each_selected_installers {|inst| inst.exec_clean }
1117
+ run_hook 'post-clean'
1118
+ end
1119
+
1120
+ def exec_distclean
1121
+ rm_f @config.savefile
1122
+ run_hook 'pre-distclean'
1123
+ each_selected_installers {|inst| inst.exec_distclean }
1124
+ run_hook 'post-distclean'
1125
+ end
1126
+
1127
+ #
1128
+ # lib
1129
+ #
1130
+
1131
+ def each_selected_installers
1132
+ Dir.mkdir 'packages' unless File.dir?('packages')
1133
+ @selected.each do |pack|
1134
+ $stderr.puts "Processing the package `#{pack}' ..." if verbose?
1135
+ Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
1136
+ Dir.chdir "packages/#{pack}"
1137
+ yield @installers[pack]
1138
+ Dir.chdir '../..'
1139
+ end
1140
+ end
1141
+
1142
+ def run_hook(id)
1143
+ @root_installer.run_hook id
1144
+ end
1145
+
1146
+ # module FileOperations requires this
1147
+ def verbose?
1148
+ @config.verbose?
1149
+ end
1150
+
1151
+ # module FileOperations requires this
1152
+ def no_harm?
1153
+ @config.no_harm?
1154
+ end
1155
+
1156
+ end # class ToplevelInstallerMulti
1157
+
1158
+
1159
+ class Installer
1160
+
1161
+ FILETYPES = %w( bin lib ext data conf man )
1162
+
1163
+ include FileOperations
1164
+ include HookScriptAPI
1165
+
1166
+ def initialize(config, srcroot, objroot)
1167
+ @config = config
1168
+ @srcdir = File.expand_path(srcroot)
1169
+ @objdir = File.expand_path(objroot)
1170
+ @currdir = '.'
1171
+ end
1172
+
1173
+ def inspect
1174
+ "#<#{self.class} #{File.basename(@srcdir)}>"
1175
+ end
1176
+
1177
+ def noop(rel)
1178
+ end
1179
+
1180
+ #
1181
+ # Hook Script API base methods
1182
+ #
1183
+
1184
+ def srcdir_root
1185
+ @srcdir
1186
+ end
1187
+
1188
+ def objdir_root
1189
+ @objdir
1190
+ end
1191
+
1192
+ def relpath
1193
+ @currdir
1194
+ end
1195
+
1196
+ #
1197
+ # Config Access
1198
+ #
1199
+
1200
+ # module FileOperations requires this
1201
+ def verbose?
1202
+ @config.verbose?
1203
+ end
1204
+
1205
+ # module FileOperations requires this
1206
+ def no_harm?
1207
+ @config.no_harm?
1208
+ end
1209
+
1210
+ def verbose_off
1211
+ begin
1212
+ save, @config.verbose = @config.verbose?, false
1213
+ yield
1214
+ ensure
1215
+ @config.verbose = save
1216
+ end
1217
+ end
1218
+
1219
+ #
1220
+ # TASK config
1221
+ #
1222
+
1223
+ def exec_config
1224
+ exec_task_traverse 'config'
1225
+ end
1226
+
1227
+ alias config_dir_bin noop
1228
+ alias config_dir_lib noop
1229
+
1230
+ def config_dir_ext(rel)
1231
+ extconf if extdir?(curr_srcdir())
1232
+ end
1233
+
1234
+ alias config_dir_data noop
1235
+ alias config_dir_conf noop
1236
+ alias config_dir_man noop
1237
+
1238
+ def extconf
1239
+ ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
1240
+ end
1241
+
1242
+ #
1243
+ # TASK setup
1244
+ #
1245
+
1246
+ def exec_setup
1247
+ exec_task_traverse 'setup'
1248
+ end
1249
+
1250
+ def setup_dir_bin(rel)
1251
+ files_of(curr_srcdir()).each do |fname|
1252
+ update_shebang_line "#{curr_srcdir()}/#{fname}"
1253
+ end
1254
+ end
1255
+
1256
+ alias setup_dir_lib noop
1257
+
1258
+ def setup_dir_ext(rel)
1259
+ make if extdir?(curr_srcdir())
1260
+ end
1261
+
1262
+ alias setup_dir_data noop
1263
+ alias setup_dir_conf noop
1264
+ alias setup_dir_man noop
1265
+
1266
+ def update_shebang_line(path)
1267
+ return if no_harm?
1268
+ return if config('shebang') == 'never'
1269
+ old = Shebang.load(path)
1270
+ if old
1271
+ $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
1272
+ new = new_shebang(old)
1273
+ return if new.to_s == old.to_s
1274
+ else
1275
+ return unless config('shebang') == 'all'
1276
+ new = Shebang.new(config('rubypath'))
1277
+ end
1278
+ $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
1279
+ open_atomic_writer(path) {|output|
1280
+ File.open(path, 'rb') {|f|
1281
+ f.gets if old # discard
1282
+ output.puts new.to_s
1283
+ output.print f.read
1284
+ }
1285
+ }
1286
+ end
1287
+
1288
+ def new_shebang(old)
1289
+ if /\Aruby/ =~ File.basename(old.cmd)
1290
+ Shebang.new(config('rubypath'), old.args)
1291
+ elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
1292
+ Shebang.new(config('rubypath'), old.args[1..-1])
1293
+ else
1294
+ return old unless config('shebang') == 'all'
1295
+ Shebang.new(config('rubypath'))
1296
+ end
1297
+ end
1298
+
1299
+ def open_atomic_writer(path, &block)
1300
+ tmpfile = File.basename(path) + '.tmp'
1301
+ begin
1302
+ File.open(tmpfile, 'wb', &block)
1303
+ File.rename tmpfile, File.basename(path)
1304
+ ensure
1305
+ File.unlink tmpfile if File.exist?(tmpfile)
1306
+ end
1307
+ end
1308
+
1309
+ class Shebang
1310
+ def Shebang.load(path)
1311
+ line = nil
1312
+ File.open(path) {|f|
1313
+ line = f.gets
1314
+ }
1315
+ return nil unless /\A#!/ =~ line
1316
+ parse(line)
1317
+ end
1318
+
1319
+ def Shebang.parse(line)
1320
+ cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
1321
+ new(cmd, args)
1322
+ end
1323
+
1324
+ def initialize(cmd, args = [])
1325
+ @cmd = cmd
1326
+ @args = args
1327
+ end
1328
+
1329
+ attr_reader :cmd
1330
+ attr_reader :args
1331
+
1332
+ def to_s
1333
+ "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
1334
+ end
1335
+ end
1336
+
1337
+ #
1338
+ # TASK install
1339
+ #
1340
+
1341
+ def exec_install
1342
+ rm_f 'InstalledFiles'
1343
+ exec_task_traverse 'install'
1344
+ end
1345
+
1346
+ def install_dir_bin(rel)
1347
+ install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755, strip_ext?
1348
+ end
1349
+
1350
+ def strip_ext?
1351
+ /mswin|mingw/ !~ RUBY_PLATFORM
1352
+ end
1353
+
1354
+ def install_dir_lib(rel)
1355
+ install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
1356
+ end
1357
+
1358
+ def install_dir_ext(rel)
1359
+ return unless extdir?(curr_srcdir())
1360
+ install_files rubyextentions('.'),
1361
+ "#{config('sodir')}/#{File.dirname(rel)}",
1362
+ 0555
1363
+ end
1364
+
1365
+ def install_dir_data(rel)
1366
+ install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644
1367
+ end
1368
+
1369
+ def install_dir_conf(rel)
1370
+ # FIXME: should not remove current config files
1371
+ # (rename previous file to .old/.org)
1372
+ install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
1373
+ end
1374
+
1375
+ def install_dir_man(rel)
1376
+ install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
1377
+ end
1378
+
1379
+ def install_files(list, dest, mode, stripext = false)
1380
+ mkdir_p dest, @config.install_prefix
1381
+ list.each do |fname|
1382
+ if stripext
1383
+ install fname, "#{dest}/#{File.basename(fname, '.*')}",
1384
+ mode, @config.install_prefix
1385
+ else
1386
+ install fname, dest, mode, @config.install_prefix
1387
+ end
1388
+ end
1389
+ end
1390
+
1391
+ def libfiles
1392
+ glob_reject(%w(*.y *.output), targetfiles())
1393
+ end
1394
+
1395
+ def rubyextentions(dir)
1396
+ ents = glob_select("*.#{@config.dllext}", targetfiles())
1397
+ if ents.empty?
1398
+ setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
1399
+ end
1400
+ ents
1401
+ end
1402
+
1403
+ def targetfiles
1404
+ mapdir(existfiles() - hookfiles())
1405
+ end
1406
+
1407
+ def mapdir(ents)
1408
+ ents.map {|ent|
1409
+ if File.exist?(ent)
1410
+ then ent # objdir
1411
+ else "#{curr_srcdir()}/#{ent}" # srcdir
1412
+ end
1413
+ }
1414
+ end
1415
+
1416
+ # picked up many entries from cvs-1.11.1/src/ignore.c
1417
+ JUNK_FILES = %w(
1418
+ core RCSLOG tags TAGS .make.state
1419
+ .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
1420
+ *~ *.old *.bak *.BAK *.orig *.rej _$* *$
1421
+
1422
+ *.org *.in .*
1423
+ )
1424
+
1425
+ def existfiles
1426
+ glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
1427
+ end
1428
+
1429
+ def hookfiles
1430
+ %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
1431
+ %w( config setup install clean distclean ).map {|t| sprintf(fmt, t) }
1432
+ }.flatten
1433
+ end
1434
+
1435
+ def glob_select(pat, ents)
1436
+ re = globs2re([pat])
1437
+ ents.select {|ent| re =~ ent }
1438
+ end
1439
+
1440
+ def glob_reject(pats, ents)
1441
+ re = globs2re(pats)
1442
+ ents.reject {|ent| re =~ ent }
1443
+ end
1444
+
1445
+ GLOB2REGEX = {
1446
+ '.' => '\.',
1447
+ '$' => '\$',
1448
+ '#' => '\#',
1449
+ '*' => '.*'
1450
+ }
1451
+
1452
+ def globs2re(pats)
1453
+ /\A(?:#{
1454
+ pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
1455
+ })\z/
1456
+ end
1457
+
1458
+ #
1459
+ # TASK test
1460
+ #
1461
+
1462
+ TESTDIR = 'test'
1463
+
1464
+ def exec_test
1465
+ unless File.directory?('test')
1466
+ $stderr.puts 'no test in this package' if verbose?
1467
+ return
1468
+ end
1469
+ $stderr.puts 'Running tests...' if verbose?
1470
+ begin
1471
+ require 'test/unit'
1472
+ rescue LoadError
1473
+ setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
1474
+ end
1475
+ runner = Test::Unit::AutoRunner.new(true)
1476
+ runner.to_run << TESTDIR
1477
+ runner.run
1478
+ end
1479
+
1480
+ #
1481
+ # TASK clean
1482
+ #
1483
+
1484
+ def exec_clean
1485
+ exec_task_traverse 'clean'
1486
+ rm_f @config.savefile
1487
+ rm_f 'InstalledFiles'
1488
+ end
1489
+
1490
+ alias clean_dir_bin noop
1491
+ alias clean_dir_lib noop
1492
+ alias clean_dir_data noop
1493
+ alias clean_dir_conf noop
1494
+ alias clean_dir_man noop
1495
+
1496
+ def clean_dir_ext(rel)
1497
+ return unless extdir?(curr_srcdir())
1498
+ make 'clean' if File.file?('Makefile')
1499
+ end
1500
+
1501
+ #
1502
+ # TASK distclean
1503
+ #
1504
+
1505
+ def exec_distclean
1506
+ exec_task_traverse 'distclean'
1507
+ rm_f @config.savefile
1508
+ rm_f 'InstalledFiles'
1509
+ end
1510
+
1511
+ alias distclean_dir_bin noop
1512
+ alias distclean_dir_lib noop
1513
+
1514
+ def distclean_dir_ext(rel)
1515
+ return unless extdir?(curr_srcdir())
1516
+ make 'distclean' if File.file?('Makefile')
1517
+ end
1518
+
1519
+ alias distclean_dir_data noop
1520
+ alias distclean_dir_conf noop
1521
+ alias distclean_dir_man noop
1522
+
1523
+ #
1524
+ # Traversing
1525
+ #
1526
+
1527
+ def exec_task_traverse(task)
1528
+ run_hook "pre-#{task}"
1529
+ FILETYPES.each do |type|
1530
+ if type == 'ext' and config('without-ext') == 'yes'
1531
+ $stderr.puts 'skipping ext/* by user option' if verbose?
1532
+ next
1533
+ end
1534
+ traverse task, type, "#{task}_dir_#{type}"
1535
+ end
1536
+ run_hook "post-#{task}"
1537
+ end
1538
+
1539
+ def traverse(task, rel, mid)
1540
+ dive_into(rel) {
1541
+ run_hook "pre-#{task}"
1542
+ __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
1543
+ directories_of(curr_srcdir()).each do |d|
1544
+ traverse task, "#{rel}/#{d}", mid
1545
+ end
1546
+ run_hook "post-#{task}"
1547
+ }
1548
+ end
1549
+
1550
+ def dive_into(rel)
1551
+ return unless File.dir?("#{@srcdir}/#{rel}")
1552
+
1553
+ dir = File.basename(rel)
1554
+ Dir.mkdir dir unless File.dir?(dir)
1555
+ prevdir = Dir.pwd
1556
+ Dir.chdir dir
1557
+ $stderr.puts '---> ' + rel if verbose?
1558
+ @currdir = rel
1559
+ yield
1560
+ Dir.chdir prevdir
1561
+ $stderr.puts '<--- ' + rel if verbose?
1562
+ @currdir = File.dirname(rel)
1563
+ end
1564
+
1565
+ def run_hook(id)
1566
+ path = [ "#{curr_srcdir()}/#{id}",
1567
+ "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
1568
+ return unless path
1569
+ $stderr.puts "invoking hook script #{path}" if verbose?
1570
+ begin
1571
+ instance_eval File.read(path), path, 1
1572
+ rescue
1573
+ raise if $DEBUG
1574
+ setup_rb_error "hook #{path} failed:\n" + $!.message
1575
+ end
1576
+ end
1577
+
1578
+ end # class Installer
1579
+
1580
+
1581
+ class SetupError < StandardError; end
1582
+
1583
+ def setup_rb_error(msg)
1584
+ raise SetupError, msg
1585
+ end
1586
+
1587
+ if $0 == __FILE__
1588
+ begin
1589
+ ToplevelInstaller.invoke
1590
+ rescue SetupError
1591
+ raise if $DEBUG
1592
+ $stderr.puts $!.message
1593
+ $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
1594
+ exit 1
1595
+ end
1596
+ end