solvebio 1.6.1 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/.bumpversion.cfg +6 -0
  2. data/.gitignore +5 -4
  3. data/.travis.yml +1 -1
  4. data/Gemfile +3 -0
  5. data/README.md +34 -34
  6. data/Rakefile +1 -18
  7. data/bin/solvebio.rb +14 -16
  8. data/installer +64 -0
  9. data/lib/solvebio.rb +50 -11
  10. data/lib/solvebio/acccount.rb +4 -0
  11. data/lib/solvebio/annotation.rb +11 -0
  12. data/lib/solvebio/api_operations.rb +147 -0
  13. data/lib/solvebio/api_resource.rb +32 -0
  14. data/lib/solvebio/cli.rb +75 -0
  15. data/lib/solvebio/cli/auth.rb +106 -0
  16. data/lib/solvebio/cli/credentials.rb +54 -0
  17. data/lib/{cli → solvebio/cli}/irb.rb +0 -23
  18. data/lib/solvebio/cli/irbrc.rb +48 -0
  19. data/lib/solvebio/cli/tutorial.rb +12 -0
  20. data/lib/solvebio/client.rb +149 -0
  21. data/lib/solvebio/dataset.rb +60 -0
  22. data/lib/solvebio/dataset_field.rb +12 -0
  23. data/lib/solvebio/depository.rb +38 -0
  24. data/lib/solvebio/depository_version.rb +40 -0
  25. data/lib/solvebio/errors.rb +64 -0
  26. data/lib/solvebio/filter.rb +315 -0
  27. data/lib/solvebio/list_object.rb +73 -0
  28. data/lib/solvebio/locale.rb +43 -0
  29. data/lib/solvebio/query.rb +341 -0
  30. data/lib/solvebio/sample.rb +54 -0
  31. data/lib/solvebio/singleton_api_resource.rb +25 -0
  32. data/lib/solvebio/solve_object.rb +164 -0
  33. data/lib/solvebio/tabulate.rb +589 -0
  34. data/lib/solvebio/user.rb +4 -0
  35. data/lib/solvebio/util.rb +59 -0
  36. data/lib/solvebio/version.rb +3 -0
  37. data/solvebio.gemspec +10 -18
  38. data/test/helper.rb +6 -2
  39. data/test/solvebio/data/.gitignore +1 -0
  40. data/test/solvebio/data/.netrc +6 -0
  41. data/test/{data → solvebio/data}/netrc-save +0 -0
  42. data/test/solvebio/data/sample.vcf.gz +0 -0
  43. data/test/solvebio/data/test_creds +3 -0
  44. data/test/solvebio/test_annotation.rb +45 -0
  45. data/test/solvebio/test_client.rb +29 -0
  46. data/test/solvebio/test_conversion.rb +14 -0
  47. data/test/solvebio/test_credentials.rb +67 -0
  48. data/test/solvebio/test_dataset.rb +52 -0
  49. data/test/solvebio/test_depository.rb +24 -0
  50. data/test/solvebio/test_depositoryversion.rb +22 -0
  51. data/test/solvebio/test_error.rb +31 -0
  52. data/test/solvebio/test_filter.rb +86 -0
  53. data/test/solvebio/test_query.rb +282 -0
  54. data/test/solvebio/test_query_batch.rb +38 -0
  55. data/test/solvebio/test_query_init.rb +30 -0
  56. data/test/solvebio/test_query_tabulate.rb +73 -0
  57. data/test/solvebio/test_ratelimit.rb +31 -0
  58. data/test/solvebio/test_resource.rb +29 -0
  59. data/test/solvebio/test_sample_access.rb +60 -0
  60. data/test/solvebio/test_sample_download.rb +20 -0
  61. data/test/solvebio/test_tabulate.rb +129 -0
  62. data/test/solvebio/test_util.rb +39 -0
  63. metadata +100 -85
  64. data/Makefile +0 -17
  65. data/demo/README.md +0 -14
  66. data/demo/cheatsheet.rb +0 -31
  67. data/demo/dataset/facets.rb +0 -13
  68. data/demo/dataset/field.rb +0 -13
  69. data/demo/depository/README.md +0 -24
  70. data/demo/depository/all.rb +0 -13
  71. data/demo/depository/retrieve.rb +0 -13
  72. data/demo/depository/versions-all.rb +0 -13
  73. data/demo/query/query-filter.rb +0 -30
  74. data/demo/query/query.rb +0 -13
  75. data/demo/query/range-filter.rb +0 -18
  76. data/demo/test-api.rb +0 -98
  77. data/lib/cli/auth.rb +0 -122
  78. data/lib/cli/help.rb +0 -13
  79. data/lib/cli/irbrc.rb +0 -54
  80. data/lib/cli/options.rb +0 -75
  81. data/lib/client.rb +0 -154
  82. data/lib/credentials.rb +0 -67
  83. data/lib/errors.rb +0 -81
  84. data/lib/filter.rb +0 -312
  85. data/lib/locale.rb +0 -47
  86. data/lib/main.rb +0 -46
  87. data/lib/query.rb +0 -414
  88. data/lib/resource/annotation.rb +0 -23
  89. data/lib/resource/apiresource.rb +0 -241
  90. data/lib/resource/dataset.rb +0 -91
  91. data/lib/resource/datasetfield.rb +0 -37
  92. data/lib/resource/depository.rb +0 -50
  93. data/lib/resource/depositoryversion.rb +0 -69
  94. data/lib/resource/main.rb +0 -123
  95. data/lib/resource/sample.rb +0 -75
  96. data/lib/resource/solveobject.rb +0 -122
  97. data/lib/resource/user.rb +0 -5
  98. data/lib/tabulate.rb +0 -706
  99. data/lib/util.rb +0 -29
  100. data/test/Makefile +0 -9
  101. data/test/data/sample.vcf.gz +0 -0
  102. data/test/test-annotation.rb +0 -46
  103. data/test/test-auth.rb +0 -58
  104. data/test/test-client.rb +0 -27
  105. data/test/test-conversion.rb +0 -13
  106. data/test/test-dataset.rb +0 -42
  107. data/test/test-depository.rb +0 -35
  108. data/test/test-error.rb +0 -36
  109. data/test/test-filter.rb +0 -70
  110. data/test/test-netrc.rb +0 -52
  111. data/test/test-query-batch.rb +0 -40
  112. data/test/test-query-init.rb +0 -29
  113. data/test/test-query-paging.rb +0 -102
  114. data/test/test-query.rb +0 -71
  115. data/test/test-resource.rb +0 -40
  116. data/test/test-sample-access.rb +0 -59
  117. data/test/test-sample-download.rb +0 -20
  118. data/test/test-tabulate.rb +0 -131
  119. data/test/test-util.rb +0 -42
@@ -1,29 +0,0 @@
1
- $VERBOSE = true
2
- require 'test/unit'
3
- require_relative '../lib/query'
4
-
5
- class TestQuery < Test::Unit::TestCase
6
-
7
- def test_query_initialize
8
- [SolveBio::PagingQuery, SolveBio::Query].each do |klass|
9
- assert klass.new(5)
10
- assert klass.new('5')
11
- assert_raises TypeError do
12
- # dataset id should be an Fixnum
13
- klass.new(:limit => 10)
14
- end
15
- assert klass.new(5, :limit => 10)
16
- assert klass.new(5.0, :limit => 10.0)
17
- assert_raises RangeError do
18
- # limit should be > 0
19
- assert klass.new(5, :limit => -1)
20
- end
21
- assert_raises TypeError do
22
- # limit should be a Fixnum
23
- assert klass.new(5, :limit => 'a')
24
- end
25
- end
26
- end
27
-
28
-
29
- end
@@ -1,102 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'socket'
4
- require_relative 'helper'
5
- require_relative '../lib/resource/main'
6
-
7
- class TestQueryPaging < Test::Unit::TestCase
8
-
9
- def setup
10
- @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
11
- end
12
-
13
- def test_query
14
- results = @dataset.query(:paging=>true, :limit => 10)
15
- # When paging is on, results.size should return the number
16
- # of total number of results.
17
- assert_equal(results.size, results.total,
18
- 'results.size == results.total, paging=true')
19
- end
20
-
21
- # In paging queries, results.size should return the total number of
22
- # results that exist. Yes, this is the same as test_query, but
23
- # we reverse the order of access, to make sure "warmup" is called.
24
- def test_limit
25
- limit = 10
26
- results = @dataset.query(:paging=>true, :limit => limit)
27
- assert_equal(results.total, results.length,
28
- 'results.total == results.length, paging = true')
29
- end
30
-
31
- def test_paging
32
- limit = 100
33
- total = 4
34
- results = @dataset.query(:paging => true, :limit => limit).
35
- filter(:hgnc_id__in => [2396, 2404, 2409, 2411])
36
-
37
- assert_equal(total, results.total)
38
-
39
- # Make sure we can iterate over the entire result set
40
- i = 0
41
- results.each_with_index do |val, j|
42
- assert val, "Can retrieve filter item #{i}"
43
- i = j
44
- end
45
- assert_equal(i, total-1)
46
- end
47
-
48
- def test_range
49
- limit = 30
50
- results = @dataset.query(:paging => true, :limit => limit).
51
- filter(:hgnc_id__range => [10, 6000])[2..5]
52
- assert_equal(3, results.size)
53
-
54
- results = @dataset.query(:paging => true, :limit => limit).
55
- filter(:hgnc_id__range => [10, 6000])[0..7]
56
- assert_equal(7, results.size)
57
- end
58
-
59
- def test_paging_and_slice_equivalence
60
- idx0 = 3
61
- idx1 = 5
62
-
63
- query = proc{
64
- @dataset.query( :paging => true, :limit => 10).
65
- filter(:hgnc_id__range => [1000, 5000])[2..10]
66
- }
67
-
68
- results_slice = query.call()[idx0...idx1]
69
- results_paging = []
70
- query.call.each_with_index do |r, i|
71
- break if i == idx1
72
- results_paging << r if i >= idx0
73
- end
74
-
75
- assert_equal(results_slice.size, results_paging.size)
76
-
77
- results_paging.size.times do |i|
78
- id_a = results_paging[i][:hgnic_id]
79
- id_b = results_slice[i][:hgnc_id]
80
- assert_equal(id_a, id_b)
81
- end
82
- end
83
-
84
- def test_caching
85
- idx0 = 60
86
- idx1 = 81
87
-
88
- q = @dataset.query(:paging => true, :limit => 100)
89
- # q = self.dataset.query(paging=True, limit=100) \
90
- # .filter(omim_id__in=range(100000, 120000))
91
- results_slice = q[idx0..idx1]
92
- results_cached = q[idx0..idx1]
93
-
94
- assert_equal(results_slice.size, results_cached.size)
95
- results_slice.size-1.times do |i|
96
- id_a = results_slice[i]['reference_allele']
97
- id_b = results_cached[i]['reference_allele']
98
- assert_equal(id_b, id_a)
99
- end
100
- end
101
-
102
- end
@@ -1,71 +0,0 @@
1
- $VERBOSE = true
2
- require 'socket'
3
- require_relative 'helper'
4
- require_relative '../lib/resource/main'
5
-
6
- class TestQuery < Test::Unit::TestCase
7
- def setup
8
- @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
9
- end
10
-
11
- # When paging is off, results.length should return the number of
12
- # results retrieved.
13
- def test_limit
14
- @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
15
- limit = 10
16
- results = @dataset.query :paging=>false, :limit => limit
17
- assert_equal(limit, results.length,
18
- 'limit == results.size, paging = false')
19
-
20
-
21
- results.each_with_index do |val, i|
22
- assert results[i], "retrieving value at #{i}"
23
- end
24
-
25
- assert_raise IndexError do
26
- puts results[limit]
27
- end
28
- end
29
-
30
- # test Query when limit is specified and is GREATER THAN total available
31
- # results
32
- def test_limit_empty
33
- limit = 100
34
- results = @dataset.query(:paging=>false, :limit => limit).
35
- filter({:omim_ids => 999999})
36
- assert_equal(0, results.size)
37
-
38
- assert_raise IndexError do
39
- puts results[0]
40
- end
41
-
42
- results = @dataset.query(:paging=>false, :limit => limit).
43
- filter :omim_ids => 123631
44
- assert_equal(1, results.size)
45
- end
46
-
47
- # test Filtered Query in which limit is specified but is GREATER THAN
48
- # the number of total available results
49
- def test_limit_filter
50
- limit = 10
51
- num_filters = 2
52
-
53
- filters =
54
- SolveBio::Filter.new(:omim_ids => 123631) |
55
- SolveBio::Filter.new(:omim_ids => 123670)
56
-
57
- results = @dataset.query(:paging=>false, :limit => limit,
58
- :filters => filters)
59
-
60
- num_filters.times do |i|
61
- assert results[i]
62
- end
63
-
64
- assert_equal(num_filters, results.size)
65
-
66
- assert_raise IndexError do
67
- puts results[num_filters]
68
- end
69
- end
70
-
71
- end
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require_relative './helper'
4
- require_relative '../lib/resource/main'
5
-
6
- class TestResource < Test::Unit::TestCase
7
-
8
- # Do the class FULL_NAME_REGEX contants match what the think they
9
- # should?
10
- def test_full_name_regexp
11
- assert('HGNC/1.0.0-1/HGNC' =~
12
- SolveBio::Dataset::FULL_NAME_REGEX,
13
- 'Dataset regexp')
14
-
15
- end
16
-
17
- def test_SolveObject_inspect
18
- str = SolveBio::SolveObject.new.inspect
19
- assert(str =~ /^<SolveBio::SolveObject:[[:xdigit:]]+> JSON: {}/,
20
- 'empty SolveObject inspect')
21
- str = SolveBio::SolveObject.new(62).inspect
22
- assert(str =~ /^<SolveBio::SolveObject id=62:[[:xdigit:]]+> JSON: {"id":62}/,
23
- "SolveObject inspect with id #{str}")
24
-
25
- end
26
-
27
- def test_Dataset_from_response
28
- resp = {
29
- 'class_name' => 'Dataset',
30
- 'depository' => 'HGNC',
31
- 'depository_version' => 'HGNC/1.0.0-1',
32
- 'full_name' => 'HGNC/1.0.0-1/HGNC',
33
- 'name' => 'HGNC',
34
- 'title' => 'HGNC'
35
- }
36
- so = resp.to_solvebio
37
- assert_equal SolveBio::Dataset, so.class, 'Hash -> SolveObject'
38
- resp.keys.each {|k| assert_equal resp[k], so[k]}
39
- end
40
- end
@@ -1,59 +0,0 @@
1
- require_relative './helper'
2
-
3
- class TestSampleAccess < Test::Unit::TestCase
4
-
5
- def check_response(response, expect, msg)
6
- expect.each do |key, val|
7
- assert_equal(val, response[key], msg)
8
- end
9
- end
10
-
11
- def test_insert_delete
12
- if SolveBio::API_HOST == 'https://api.solvebio.com'
13
- skip "Testing only on local/dev environments"
14
- end
15
-
16
- all = SolveBio::Sample.all
17
- total = all.total
18
- vcf_url = 'http://downloads.solvebio.com/vcf/small_sample.vcf.gz'
19
- expect = {
20
- 'class_name' => 'Sample',
21
- 'annotations_count' => 0,
22
- 'description' => '',
23
- 'genome_build' => 'GRCh37',
24
- 'vcf_md5' => 'a03e39e96671a01208cffd234812556d',
25
- 'vcf_size' => 12124
26
- }
27
-
28
- response = SolveBio::Sample.create('GRCh37', :vcf_url => vcf_url)
29
- check_response(response, expect,
30
- 'create sample.vcf.gz from url')
31
- all = SolveBio::Sample.all
32
- assert_equal(all.total, total + 1, "After uploading an url")
33
- total = total + 1
34
-
35
- vcf_file = File.join(File.dirname(__FILE__), 'data/sample.vcf.gz')
36
- response = SolveBio::Sample.create('GRCh37', {:vcf_file => vcf_file})
37
- expect = {
38
- 'class_name' => 'Sample',
39
- 'annotations_count' => 0,
40
- 'description' => '',
41
- 'genome_build' => 'GRCh37',
42
- 'vcf_md5' => '83acd96171c72ab2bb35e9c52961afd9',
43
- 'vcf_size' => 592
44
- }
45
-
46
- check_response(response, expect,
47
- 'create sample.vcf.gz from a file')
48
-
49
- # assert_equal(all.total, total, "After uploading a file")
50
-
51
- # sample = SolveBio::Sample.retrieve(response.id)
52
- # delete_response = sample.delete
53
- # assert_equal(delete_response.deleted, true,
54
- # 'response.deleted should be true')
55
-
56
- # all = SolveBio::Sample.all
57
- # assert_equal(all.total, total, "After deleting a file")
58
- end
59
- end
@@ -1,20 +0,0 @@
1
- require 'fileutils'
2
- require_relative './helper'
3
-
4
- class TestSampleDownload < Test::Unit::TestCase
5
-
6
- def test_sample_download
7
- if SolveBio::API_HOST == 'https://api.solvebio.com'
8
- skip "Testing only on local/dev environments"
9
- end
10
-
11
- vcf_file = File.join(File.dirname(__FILE__), 'data/sample.vcf.gz')
12
- sample = SolveBio::Sample.create('GRCh37', {:vcf_file => vcf_file})
13
- response = sample.download()
14
- assert_equal(response['code'], 200,
15
- "Download sample file status ok")
16
- assert(File.exist?(response['filename']),
17
- "Download sample file on filesystem")
18
- FileUtils.rm response['filename']
19
- end
20
- end
@@ -1,131 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- require_relative '../lib/tabulate'
4
- $VERBOSE = true
5
- require 'test/unit'
6
-
7
- class TestTabulate < Test::Unit::TestCase
8
-
9
- include SolveBio::Tabulate
10
-
11
- def test_classify
12
-
13
- assert_equal true, '123.45'.number?
14
- assert_equal true, '123'.number?
15
- assert_equal false, 'spam'.number?
16
- assert_equal true, '123'.int?
17
- assert_equal false, '123.45'.int?
18
-
19
- assert_equal NilClass, _type(nil)
20
- assert_equal String, _type('foo')
21
- assert_equal Fixnum, _type('1')
22
- assert_equal Fixnum, _type(1)
23
- assert_equal Fixnum, _type('\x1b[31m42\x1b[0m')
24
- end
25
-
26
- def test_align
27
- assert_equal( 2, '123.45'.afterpoint)
28
- assert_equal(-1, '1001'.afterpoint)
29
- assert_equal(-1, 'eggs'.afterpoint)
30
- assert_equal( 2, '123e45'.afterpoint)
31
-
32
- assert_equal(" \u044f\u0439\u0446\u0430",
33
- "\u044f\u0439\u0446\u0430".padleft(6))
34
- assert_equal("\u044f\u0439\u0446\u0430 ",
35
- "\u044f\u0439\u0446\u0430".padright(6))
36
-
37
- assert_equal(" \u044f\u0439\u0446\u0430 ",
38
- "\u044f\u0439\u0446\u0430".padboth(6))
39
-
40
- assert_equal(" \u044f\u0439\u0446\u0430 ",
41
- "\u044f\u0439\u0446\u0430".padboth(7))
42
-
43
- assert_equal('abc', 'abc'.padright(2))
44
- assert_equal('abc', 'abc'.padleft(2))
45
- assert_equal('abc', 'abc'.padboth(2))
46
-
47
-
48
- assert_equal([' 12.345 ', '-1234.5 ', ' 1.23 ',
49
- ' 1234.5 ', ' 1e+234 ', ' 1.0e234'],
50
- align_column(
51
- ["12.345", "-1234.5", "1.23", "1234.5",
52
- "1e+234", "1.0e234"], "decimal"))
53
- end
54
-
55
- def test_column_type
56
- assert_equal(Fixnum, column_type(["1", "2"]))
57
- assert_equal(Float, column_type(["1", "2.3"]))
58
- assert_equal(String, column_type(["1", "2.3", "four"]))
59
- assert_equal(String,
60
- column_type(["four", '\u043f\u044f\u0442\u044c']))
61
- assert_equal(String, column_type([nil, "brux"]))
62
- assert_equal(Fixnum, column_type([1, 2, nil]))
63
- end
64
-
65
- def test_tabulate
66
- old_verbose = $VERBOSE
67
- $VERBOSE=nil
68
- SolveBio::Tabulate.const_set(:TTY_COLS, 80)
69
- $VERBOSE=old_verbose
70
- tsv = simple_separated_format("\t")
71
- expected = <<-EOS
72
- foo 1
73
- spam 23
74
- EOS
75
- assert_equal(expected.chomp, tabulate([["foo", 1], ["spam", 23]], [], tsv),
76
- 'simple separated format table')
77
- ####################################################################
78
- expected = <<-EOS
79
- | буква | цифра |
80
- |---------+---------|
81
- | аз | 2 |
82
- | буки | 4 |
83
- EOS
84
- hrow = ["\u0431\u0443\u043a\u0432\u0430", "\u0446\u0438\u0444\u0440\u0430"]
85
- tbl = [["\u0430\u0437", 2], ["\u0431\u0443\u043a\u0438", 4]]
86
- assert_equal(expected.chomp, SolveBio::Tabulate.tabulate(tbl, hrow),
87
- 'org mode with header and unicode')
88
-
89
- ###################################################################
90
- expected = <<-EOS
91
- | Fields | Data |
92
- |-----------------------+-----------------------------|
93
- | alternate_alleles | T |
94
- | clinical_origin | somatic |
95
- | clinical_significance | other |
96
- | gene_symbols | CPB1 |
97
- | hg18_chromosome | 3 |
98
- | hg19_chromosome | 3 |
99
- | hg19_start | 148562304 |
100
- | hg38_start | 148844517 |
101
- | hgvs | NC_000003.12:g.148844517C>T |
102
- | rcvaccession | RCV000060731 |
103
- | rcvaccession_version | 2 |
104
- | reference_allele | C |
105
- | rsid | rs150241322 |
106
- | type | SNV |
107
- EOS
108
-
109
- hash = {
110
- "alternate_alleles" => ["T"],
111
- "clinical_origin" => ["somatic"],
112
- "clinical_significance"=> "other",
113
- "gene_symbols" => ["CPB1"],
114
- "hg18_chromosome" => "3",
115
- "hg19_chromosome" => "3",
116
- "hg19_start" => 148562304,
117
- "hg38_start" => 148844517,
118
- "hgvs" => ["NC_000003.12:g.148844517C>T"],
119
- "rcvaccession" => "RCV000060731",
120
- "rcvaccession_version" => 2,
121
- "reference_allele" => "C",
122
- "rsid" => "rs150241322",
123
- "type" => "SNV"
124
- }
125
- assert_equal(expected.chomp, tabulate(hash.to_a,
126
- ['Fields', 'Data'],
127
- ['right', 'left']),
128
- 'mixed data with arrays; close to actual query output')
129
- end
130
-
131
- end