solvebio 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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