bio 2.0.3 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,359 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # test/unit/bio/db/embl/test_uniprotkb_P49144.rb - Unit tests for Bio::UniProtKB
4
+ #
5
+ # Copyright::: Copyright (C) 2022 BioRuby Project <staff@bioruby.org>
6
+ # License:: The Ruby License
7
+ # Contributor:: 2005 Mitsuteru Nakao <n@bioruby.org>
8
+ # 2022 Naohisa Goto <ng@bioruby.org>
9
+ #
10
+
11
+ # loading helper routine for testing bioruby
12
+ require 'pathname'
13
+ load Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 4,
14
+ 'bioruby_test_helper.rb')).cleanpath.to_s
15
+
16
+ # libraries needed for the tests
17
+ require 'test/unit'
18
+ require 'bio/db/embl/uniprotkb'
19
+
20
+ module Bio
21
+ class TestUniProtKB_P49144 < Test::Unit::TestCase
22
+
23
+ def setup
24
+ data = File.read(File.join(BioRubyTestDataPath,
25
+ 'uniprot', 'P49144.uniprot'))
26
+ @obj = Bio::UniProtKB.new(data)
27
+ end
28
+
29
+ def test_id_line
30
+ assert(@obj.id_line)
31
+ end
32
+
33
+ def test_id_line_entry_name
34
+ assert_equal('5HT1B_RABIT', @obj.id_line('ENTRY_NAME'))
35
+ end
36
+
37
+ def test_id_line_data_class
38
+ assert_equal('Reviewed', @obj.id_line('DATA_CLASS'))
39
+ end
40
+
41
+ #def test_id_line_molecule_type
42
+ # assert_equal('PRT', @obj.id_line('MOLECULE_TYPE'))
43
+ #end
44
+
45
+ def test_id_line_sequence_length
46
+ assert_equal(390, @obj.id_line('SEQUENCE_LENGTH'))
47
+ end
48
+
49
+ def test_entry
50
+ entry = '5HT1B_RABIT'
51
+ assert_equal(entry, @obj.entry)
52
+ assert_equal(entry, @obj.entry_name)
53
+ assert_equal(entry, @obj.entry_id)
54
+ end
55
+
56
+ #def test_molecule
57
+ # assert_equal('PRT', @obj.molecule)
58
+ # assert_equal('PRT', @obj.molecule_type)
59
+ #end
60
+
61
+ def test_sequence_length
62
+ seqlen = 390
63
+ assert_equal(seqlen, @obj.sequence_length)
64
+ assert_equal(seqlen, @obj.aalen)
65
+ end
66
+
67
+ def test_ac
68
+ acs = ["P49144"].freeze
69
+ assert_equal(acs, @obj.ac)
70
+ assert_equal(acs, @obj.accessions)
71
+ end
72
+
73
+ def test_accession
74
+ assert_equal('P49144', @obj.accession)
75
+ end
76
+
77
+ def test_dr
78
+ assert_equal(28, @obj.dr.size)
79
+ assert_equal(12, @obj.dr['GO'].size)
80
+ assert_equal([["IPR002147", "5HT1B_rcpt"],
81
+ ["IPR002231", "5HT_rcpt"],
82
+ ["IPR000276", "GPCR_Rhodpsn"],
83
+ ["IPR017452", "GPCR_Rhodpsn_7TM"]],
84
+ @obj.dr['InterPro'])
85
+ end
86
+
87
+ def test_dr_with_key
88
+ pfam = [{"Accession" => "PF00001",
89
+ "Version" => "7tm_1",
90
+ " " => "1",
91
+ "Molecular Type" => nil}
92
+ ].freeze
93
+ assert_equal(pfam, @obj.dr('Pfam'))
94
+ embl = [{"Accession" => "Z50163",
95
+ "Version" => "CAA90531.1",
96
+ " " => "-",
97
+ "Molecular Type" => "Genomic_DNA"},
98
+ {"Accession" => "X89731",
99
+ "Version" => "CAA61883.1",
100
+ " " => "-",
101
+ "Molecular Type" => "mRNA"},
102
+ {"Accession" => "U60826",
103
+ "Version" => "AAB58467.1",
104
+ " " => "-",
105
+ "Molecular Type" => "Genomic_DNA"}
106
+ ].freeze
107
+ assert_equal(embl, @obj.dr('EMBL'))
108
+ end
109
+
110
+ def test_dr_with_key_empty
111
+ assert_equal([], @obj.dr('NOT_A_DATABASE'))
112
+ end
113
+
114
+ def test_dt
115
+ assert(@obj.dt)
116
+ end
117
+
118
+ def test_dt_created
119
+ assert_equal('01-FEB-1996, integrated into UniProtKB/Swiss-Prot.',
120
+ @obj.dt('created'))
121
+ end
122
+
123
+ def test_dt_sequence
124
+ assert_equal('01-FEB-1996, sequence version 1.',
125
+ @obj.dt('sequence'))
126
+ end
127
+
128
+ def test_dt_annotation
129
+ assert_equal('22-FEB-2023, entry version 127.',
130
+ @obj.dt('annotation'))
131
+ end
132
+
133
+ def test_de
134
+ assert(@obj.de)
135
+ end
136
+
137
+ def test_protein_name
138
+ assert_equal("5-hydroxytryptamine receptor 1B",
139
+ @obj.protein_name)
140
+ end
141
+
142
+ def test_synonyms
143
+ ary = [
144
+ "5-HT-1B",
145
+ "5-HT1B",
146
+ "Serotonin 1D beta receptor",
147
+ "5-HT-1D-beta",
148
+ "Serotonin receptor 1B"
149
+ ].freeze
150
+ assert_equal(ary, @obj.synonyms)
151
+ end
152
+
153
+ def test_protein_name_after_calling_de
154
+ assert(@obj.de)
155
+ assert_equal("5-hydroxytryptamine receptor 1B",
156
+ @obj.protein_name)
157
+ end
158
+
159
+ def test_synonyms_after_calling_de
160
+ assert(@obj.de)
161
+ assert_equal(5, @obj.synonyms.size)
162
+ end
163
+
164
+ def test_gn
165
+ assert_equal([{:orfs=>[], :synonyms=>[], :name=>"HTR1B", :loci=>[]}],
166
+ @obj.gn)
167
+ end
168
+
169
+ def test_gn_uniprot_parser
170
+ assert_equal([{:orfs=>[], :loci=>[], :name=>"HTR1B", :synonyms=>[]}],
171
+ @obj.instance_eval("gn_uniprot_parser"))
172
+ end
173
+
174
+ def test_gn_old_parser
175
+ assert_equal([["Name=HTR1B;"]],
176
+ @obj.instance_eval("gn_old_parser"))
177
+ end
178
+
179
+ def test_gene_names
180
+ assert_equal(["HTR1B"], @obj.gene_names)
181
+ end
182
+
183
+ def test_gene_name
184
+ assert_equal('HTR1B', @obj.gene_name)
185
+ end
186
+
187
+ def test_os
188
+ assert(@obj.os)
189
+ end
190
+
191
+ def test_os_access
192
+ assert_equal("Oryctolagus cuniculus (Rabbit)", @obj.os(0))
193
+ end
194
+
195
+ def test_os_access2
196
+ assert_equal({"name"=>"(Rabbit)", "os"=>"Oryctolagus cuniculus"},
197
+ @obj.os[0])
198
+ end
199
+
200
+ def test_oc
201
+ assert_equal(["Eukaryota", "Metazoa", "Chordata", "Craniata",
202
+ "Vertebrata", "Euteleostomi", "Mammalia", "Eutheria",
203
+ "Euarchontoglires", "Glires", "Lagomorpha",
204
+ "Leporidae", "Oryctolagus"],
205
+ @obj.oc)
206
+ end
207
+
208
+ def test_ox
209
+ assert_equal({"NCBI_TaxID"=>["9986"]}, @obj.ox)
210
+ end
211
+
212
+ def test_ref # Bio::UniProtKB#ref
213
+ assert_equal(Array, @obj.ref.class)
214
+ end
215
+
216
+ def test_cc
217
+ assert_equal(Hash, @obj.cc.class)
218
+ end
219
+
220
+ def test_cc_database
221
+ assert_equal(nil, @obj.cc('DATABASE'))
222
+ end
223
+
224
+ def test_cc_alternative_products
225
+ assert_equal(nil, @obj.cc('ALTERNATIVE PRODUCTS'))
226
+ end
227
+
228
+ def test_cc_mass_spectrometry
229
+ assert_equal(nil, @obj.cc('MASS SPECTROMETRY'))
230
+ end
231
+
232
+
233
+ def test_kw
234
+ keywords = [ "Behavior", "Cell membrane", "Disulfide bond",
235
+ "G-protein coupled receptor", "Glycoprotein",
236
+ "Lipoprotein", "Membrane", "Palmitate",
237
+ "Phosphoprotein", "Receptor", "Reference proteome",
238
+ "Transducer", "Transmembrane", "Transmembrane helix" ]
239
+ assert_equal(keywords, @obj.kw)
240
+ end
241
+
242
+ def test_ft
243
+ assert(@obj.ft)
244
+ name = 'TOPO_DOM'
245
+ data = [{"From"=>1,
246
+ "To"=>49,
247
+ "diff"=>[],
248
+ "original"=>
249
+ ["TOPO_DOM",
250
+ "1",
251
+ "49",
252
+ [["note", "Extracellular"], ["evidence", "ECO:0000250"]]],
253
+ "note"=>"Extracellular",
254
+ "evidence"=>"ECO:0000250"},
255
+ {"From"=>76,
256
+ "To"=>84,
257
+ "diff"=>[],
258
+ "original"=>
259
+ ["TOPO_DOM",
260
+ "76",
261
+ "84",
262
+ [["note", "Cytoplasmic"], ["evidence", "ECO:0000250"]]],
263
+ "note"=>"Cytoplasmic",
264
+ "evidence"=>"ECO:0000250"},
265
+ {"From"=>111,
266
+ "To"=>123,
267
+ "diff"=>[],
268
+ "original"=>
269
+ ["TOPO_DOM",
270
+ "111",
271
+ "123",
272
+ [["note", "Extracellular"], ["evidence", "ECO:0000250"]]],
273
+ "note"=>"Extracellular",
274
+ "evidence"=>"ECO:0000250"},
275
+ {"From"=>146,
276
+ "To"=>165,
277
+ "diff"=>[],
278
+ "original"=>
279
+ ["TOPO_DOM",
280
+ "146",
281
+ "165",
282
+ [["note", "Cytoplasmic"], ["evidence", "ECO:0000250"]]],
283
+ "note"=>"Cytoplasmic",
284
+ "evidence"=>"ECO:0000250"},
285
+ {"From"=>188,
286
+ "To"=>205,
287
+ "diff"=>[],
288
+ "original"=>
289
+ ["TOPO_DOM",
290
+ "188",
291
+ "205",
292
+ [["note", "Extracellular"], ["evidence", "ECO:0000250"]]],
293
+ "note"=>"Extracellular",
294
+ "evidence"=>"ECO:0000250"},
295
+ {"From"=>229,
296
+ "To"=>315,
297
+ "diff"=>[],
298
+ "original"=>
299
+ ["TOPO_DOM",
300
+ "229",
301
+ "315",
302
+ [["note", "Cytoplasmic"], ["evidence", "ECO:0000250"]]],
303
+ "note"=>"Cytoplasmic",
304
+ "evidence"=>"ECO:0000250"},
305
+ {"From"=>337,
306
+ "To"=>349,
307
+ "diff"=>[],
308
+ "original"=>
309
+ ["TOPO_DOM",
310
+ "337",
311
+ "349",
312
+ [["note", "Extracellular"], ["evidence", "ECO:0000250"]]],
313
+ "note"=>"Extracellular",
314
+ "evidence"=>"ECO:0000250"},
315
+ {"From"=>372,
316
+ "To"=>390,
317
+ "diff"=>[],
318
+ "original"=>
319
+ ["TOPO_DOM",
320
+ "372",
321
+ "390",
322
+ [["note", "Cytoplasmic"], ["evidence", "ECO:0000250"]]],
323
+ "note"=>"Cytoplasmic",
324
+ "evidence"=>"ECO:0000250"}].freeze
325
+ assert_equal(data, @obj.ft[name])
326
+ end
327
+
328
+ def test_sq
329
+ assert_equal({"CRC64"=>"C22EBC077C6C897D", "aalen"=>390, "MW"=>43496},
330
+ @obj.sq)
331
+ end
332
+
333
+ def test_sq_crc64
334
+ assert_equal("C22EBC077C6C897D", @obj.sq('CRC64'))
335
+ end
336
+
337
+ def test_sq_mw
338
+ mw = 43496
339
+ assert_equal(mw, @obj.sq('mw'))
340
+ assert_equal(mw, @obj.sq('molecular'))
341
+ assert_equal(mw, @obj.sq('weight'))
342
+ end
343
+
344
+ def test_sq_len
345
+ length = 390
346
+ assert_equal(length, @obj.sq('len'))
347
+ assert_equal(length, @obj.sq('length'))
348
+ assert_equal(length, @obj.sq('AA'))
349
+ end
350
+
351
+ def test_seq
352
+ seq = "MEEPGAQCAPPLAAGSQIAVPQANLSAAHSHNCSAEGYIYQDSIALPWKVLLVLLLALFTLATTLSNAFVVATVYRTRKLHTPANYLIASLAVTDLLVSILVMPISTMYTVTGRWTLGQVVCDLWLSSDITCCTASIMHLCVIALDRYWAITDAVEYSAKRTPKRAAIMIRLVWVFSICISLPPFFWRQAKAEEEVSECLVNTDHVLYTVYSTVGAFYLPTLLLIALYGRIYVEARSRILKQTPNRTGKRLTRAQLITDSPGSTTSVTSINSRAPDVPSESGSPVYVNQVKVRVSDALLEKKKLMAARERKATKTLGIILGVFIVCWLPFFIISLVMPICKDACWFHQAIFDFFTWLGYVNSLINPIIYTMSNEDFKQAFHKLIRFKCTS"
353
+ assert_equal(seq, @obj.seq)
354
+ assert_equal(seq, @obj.aaseq)
355
+ end
356
+
357
+ end # class TestUniProtKB_P49144
358
+ end # module Bio
359
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bio
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - BioRuby project
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-05 00:00:00.000000000 Z
11
+ date: 2023-09-27 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: BioRuby is a library for bioinformatics (biology + information science).
14
14
  email: staff@bioruby.org
@@ -26,7 +26,8 @@ extra_rdoc_files:
26
26
  - doc/RELEASE_NOTES-1.4.3.rdoc
27
27
  - doc/RELEASE_NOTES-1.5.0.rdoc
28
28
  files:
29
- - ".travis.yml"
29
+ - ".github/workflows/ruby.yml"
30
+ - ".gitignore"
30
31
  - BSDL
31
32
  - COPYING
32
33
  - COPYING.ja
@@ -60,14 +61,6 @@ files:
60
61
  - doc/Tutorial.rd.ja.html
61
62
  - doc/bioruby.css
62
63
  - etc/bioinformatics/seqdatabase.ini
63
- - gemfiles/Gemfile.travis-jruby1.8
64
- - gemfiles/Gemfile.travis-jruby1.9
65
- - gemfiles/Gemfile.travis-rbx
66
- - gemfiles/Gemfile.travis-ruby1.8
67
- - gemfiles/Gemfile.travis-ruby1.9
68
- - gemfiles/Gemfile.windows
69
- - gemfiles/modify-Gemfile.rb
70
- - gemfiles/prepare-gemspec.rb
71
64
  - lib/bio.rb
72
65
  - lib/bio/alignment.rb
73
66
  - lib/bio/appl/bl2seq/report.rb
@@ -465,6 +458,9 @@ files:
465
458
  - test/data/sim4/simple2-A4.sim4
466
459
  - test/data/soft/GDS100_partial.soft
467
460
  - test/data/soft/GSE3457_family_partial.soft
461
+ - test/data/uniprot/P03589.uniprot
462
+ - test/data/uniprot/P28907.uniprot
463
+ - test/data/uniprot/P49144.uniprot
468
464
  - test/data/uniprot/p53_human.uniprot
469
465
  - test/functional/bio/sequence/test_output_embl.rb
470
466
  - test/functional/bio/test_command.rb
@@ -509,6 +505,9 @@ files:
509
505
  - test/unit/bio/db/embl/test_embl_to_bioseq.rb
510
506
  - test/unit/bio/db/embl/test_uniprot.rb
511
507
  - test/unit/bio/db/embl/test_uniprotkb.rb
508
+ - test/unit/bio/db/embl/test_uniprotkb_P03589.rb
509
+ - test/unit/bio/db/embl/test_uniprotkb_P28907.rb
510
+ - test/unit/bio/db/embl/test_uniprotkb_P49144.rb
512
511
  - test/unit/bio/db/embl/test_uniprotkb_new_part.rb
513
512
  - test/unit/bio/db/fasta/test_defline.rb
514
513
  - test/unit/bio/db/fasta/test_defline_misc.rb
@@ -594,7 +593,7 @@ homepage: http://bioruby.org/
594
593
  licenses:
595
594
  - Ruby
596
595
  metadata: {}
597
- post_install_message:
596
+ post_install_message:
598
597
  rdoc_options:
599
598
  - "--main"
600
599
  - README.rdoc
@@ -617,8 +616,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
617
616
  - !ruby/object:Gem::Version
618
617
  version: '0'
619
618
  requirements: []
620
- rubygems_version: 3.1.6
621
- signing_key:
619
+ rubygems_version: 3.4.10
620
+ signing_key:
622
621
  specification_version: 4
623
622
  summary: Bioinformatics library
624
623
  test_files: []
data/.travis.yml DELETED
@@ -1,71 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.6
4
- - 2.5
5
- - 2.4
6
- - 2.3.8
7
- - 2.2.10
8
- env:
9
- - TESTOPTS=-v
10
- gemfile:
11
- - Gemfile
12
- before_install:
13
- - mkdir /tmp/bioruby
14
- - ruby gemfiles/modify-Gemfile.rb
15
- - ruby gemfiles/prepare-gemspec.rb
16
- matrix:
17
- include:
18
- - rvm: 2.0.0
19
- gemfile: gemfiles/Gemfile.travis-ruby1.9
20
- env: TESTOPTS=-v
21
- - rvm: 2.1.10
22
- gemfile: gemfiles/Gemfile.travis-ruby1.9
23
- env: TESTOPTS=-v
24
- - rvm: truffleruby
25
- gemfile: gemfiles/Gemfile.travis-jruby1.9
26
- env: TESTOPTS=-v
27
- - rvm: rbx-3.29
28
- gemfile: gemfiles/Gemfile.travis-rbx
29
- env: TESTOPTS=-v
30
- - rvm: jruby
31
- gemfile: gemfiles/Gemfile.travis-jruby1.9
32
- env: TMPDIR=/tmp/bioruby TESTOPTS=-v
33
- - rvm: 2.5
34
- gemfile: Gemfile
35
- env: BIORUBY_RAKE_DEFAULT_TASK=gem-test TESTOPTS=-v
36
- - rvm: jruby
37
- gemfile: gemfiles/Gemfile.travis-jruby1.9
38
- env: TMPDIR=/tmp/bioruby BIORUBY_RAKE_DEFAULT_TASK=gem-test TESTOPTS=-v
39
- allow_failures:
40
- - rvm: 1.8.7
41
- gemfile: gemfiles/Gemfile.travis-ruby1.8
42
- env: TESTOPTS=-v
43
- - rvm: 1.9.3
44
- gemfile: gemfiles/Gemfile.travis-ruby1.9
45
- env: TESTOPTS=-v
46
- - rvm: truffleruby
47
- gemfile: gemfiles/Gemfile.travis-jruby1.9
48
- env: TESTOPTS=-v
49
- - rvm: rbx-3.29
50
- gemfile: gemfiles/Gemfile.travis-rbx
51
- env: TESTOPTS=-v
52
- - rvm: jruby
53
- gemfile: gemfiles/Gemfile.travis-jruby1.9
54
- env: TMPDIR=/tmp/bioruby TESTOPTS=-v
55
- - rvm: jruby
56
- gemfile: gemfiles/Gemfile.travis-jruby1.9
57
- env: TMPDIR=/tmp/bioruby BIORUBY_RAKE_DEFAULT_TASK=gem-test TESTOPTS=-v
58
-
59
- # uncomment this line if your project needs to run something other than `rake`:
60
- # script: bundle exec rspec spec
61
-
62
- #before_install:
63
- # - sudo apt-get update
64
- # - sudo apt-get install libxml2-dev libexpat1-dev
65
-
66
- # block build for the branches
67
- branches:
68
- except:
69
- - biohackathon2008
70
- - bioruby-1.4.3
71
-
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake", "~>10.4"
4
- # rdoc 4.3.0 requires Ruby >= 1.9.3
5
- gem "rdoc", "~>4.2.0"
6
-
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake"
4
- gem "rdoc"
5
-
@@ -1,10 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake"
4
- gem "rdoc"
5
-
6
- platforms :rbx do
7
- gem 'racc'
8
- gem 'rubysl', '~> 2.0'
9
- gem 'psych'
10
- end
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake", "~>10.4"
4
- # rdoc 4.3.0 requires Ruby >= 1.9.3
5
- gem "rdoc", "~>4.2.0"
6
-
@@ -1,5 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake"
4
- gem "rdoc"
5
-
@@ -1,6 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gem "rake"
4
- gem "rdoc"
5
- gem "test-unit"
6
-
@@ -1,28 +0,0 @@
1
- #
2
-
3
- require 'pathname'
4
-
5
- envname_default_task = 'BIORUBY_RAKE_DEFAULT_TASK'
6
-
7
- gem_dir = Pathname.new(File.join(File.dirname(__FILE__), '..')).realpath
8
-
9
- case t = ENV[envname_default_task]
10
- when 'gem-test'
11
- # do nothing
12
- else
13
- $stderr.print "#{$0}: skipped: ENV[#{envname_default_task}]=#{t.inspect}\n"
14
- exit(0)
15
- end
16
-
17
- target = ENV['BUNDLE_GEMFILE']
18
- unless target then
19
- $stderr.puts("Error: env BUNDLE_GEMFILE is not set.")
20
- end
21
-
22
- File.open(target, 'a') do |w|
23
- $stderr.puts "Add a line to #{target}"
24
- $stderr.puts "gem 'bio', :path => '#{gem_dir}'"
25
- w.puts ""
26
- w.puts "gem 'bio', :path => '#{gem_dir}'"
27
- end
28
-
@@ -1,29 +0,0 @@
1
- #
2
-
3
- require 'pathname'
4
- require 'fileutils'
5
-
6
- envname_default_task = 'BIORUBY_RAKE_DEFAULT_TASK'
7
-
8
- gem_dir = Pathname.new(File.join(File.dirname(__FILE__), '..')).realpath
9
-
10
- case t = ENV[envname_default_task]
11
- when 'gem-test'
12
- # do nothing
13
- else
14
- $stderr.print "#{$0}: skipped: ENV[#{envname_default_task}]=#{t.inspect}\n"
15
- exit(0)
16
- end
17
-
18
- # update bundler to avoid Bundler's bug fixed in the latest version
19
- $stderr.puts "gem update bundler"
20
- system("gem update bundler")
21
-
22
- $stderr.puts "cd #{gem_dir}"
23
- Dir.chdir(gem_dir)
24
-
25
- args = [ 'bioruby.gemspec', '.gemspec' ]
26
-
27
- $stderr.puts(['cp', *args].join(" "))
28
- FileUtils.cp(*args)
29
-