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
- module SolveBio
2
-
3
- module_function
4
- def pluralize(name)
5
- if name.end_with?('y')
6
- name = name[0..-2] + 'ie'
7
- end
8
- return name + "s"
9
- end
10
-
11
- # Add underscore before internal uppercase letters. Also, lowercase
12
- # all letters.
13
- def camelcase_to_underscore(name)
14
- # Using [[:upper:]] and [[:lower]] should help with Unicode.
15
- s1 = name.gsub(/(.)([[:upper:]])([[:lower:]]+)/){"#{$1}_#{$2}#{$3}"}
16
- return (s1.gsub(/([a-z0-9])([[:upper:]])/){"#{$1}_#{$2}"}).downcase
17
- end
18
- end
19
-
20
- # Demo code
21
- if __FILE__ == $0
22
- include SolveBio
23
- %w(abc abcDef abc01Def aBcDef a1B2C3 ?Foo Dataset).each do |word|
24
- puts word + " -> " + camelcase_to_underscore(word)
25
- end
26
- ['depository', 'dataset'].each do |word|
27
- puts word + " -> " + pluralize(word)
28
- end
29
- end
@@ -1,9 +0,0 @@
1
- # Whatever it is you want to do other run demos, it should be forwarded to the
2
- # to top-level directory
3
- .PHONY: all
4
-
5
- #: the default target - same as running "check"
6
- all: check
7
-
8
- %:
9
- $(MAKE) -C .. $@
Binary file
@@ -1,46 +0,0 @@
1
- require_relative './helper'
2
-
3
- class TestAnnotation < 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_annotation
12
- if SolveBio::API_HOST == 'https://api.solvebio.com'
13
- skip "Annotation testing only on local/dev environments"
14
- end
15
-
16
- vcf_file = File.join(File.dirname(__FILE__), "data/sample.vcf.gz")
17
- my_sample = SolveBio::Sample
18
- .create('GRCh37', :vcf_file => vcf_file)
19
- assert(my_sample)
20
-
21
- sample_id = my_sample['id']
22
- expect = {
23
- 'class_name' => 'Annotation',
24
- 'error_message' => '',
25
- 'sample_id' => sample_id
26
- }
27
-
28
- response = SolveBio::Annotation.create(:sample_id => sample_id)
29
- check_response(response, expect,
30
- "'Annotation.create(:sample_id=>{#sample_id}")
31
-
32
- ['status', 'user_id', 'created_at', 'updated_at'].each do |field|
33
- assert(response.member?(field) ,
34
- "response has field #{field}")
35
- end
36
-
37
- all = SolveBio::Annotation.all()
38
- assert(all.total > 1,
39
- "Annotation.all() returns more than one value")
40
-
41
- response = my_sample.annotate
42
- # FIXME: test annotate() more.
43
-
44
- my_sample.delete
45
- end
46
- end
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'test/unit'
4
- require 'rbconfig'
5
- require_relative '../lib/credentials'
6
-
7
- class TestAuth < Test::Unit::TestCase
8
-
9
- include SolveBio::Credentials
10
-
11
- def run_it(cmd)
12
- output = `#{cmd}`
13
- assert_equal 0, $?.to_i, "Should be able to run #{cmd}"
14
- output.chomp
15
- end
16
-
17
- def setup
18
- ruby=RbConfig.ruby
19
- @auth_prog = File.join(File.dirname(__FILE__),
20
- '..', 'lib', 'cli', 'auth.rb')
21
- @logout_cmd = "#{ruby} #{@auth_prog} logout"
22
- @@whoami_cmd = "#{ruby} #{@auth_prog} whoami"
23
-
24
- # Save who I was so we can compare at the end
25
- @i_was = run_it @@whoami_cmd
26
-
27
- begin
28
- @@creds = get_credentials
29
- rescue CredentialsError
30
- @@creds = nil
31
- end
32
- end
33
-
34
- def teardown
35
- # Restore creds to what they were when we started
36
- save_credentials(*@@creds) if @@creds
37
- netrc_path = SolveBio::Credentials.netrc_path
38
- n = Netrc.read(netrc_path)
39
- if n[SolveBio::API_HOST]
40
- i_am = run_it @@whoami_cmd
41
- assert_equal(@i_was, i_am,
42
- 'get_credential and save_creditentials be idempotent')
43
- end
44
- end
45
-
46
- # Integration test of logout
47
- def test_logout
48
- # Dunno if we are logged in or out - log out
49
- output = run_it @logout_cmd
50
- # We should be logged out. Try again, and check message.
51
- output = run_it @logout_cmd
52
- assert_equal 'You are not logged-in.', output
53
- # We should be logged out. Try to get status
54
- output = run_it @@whoami_cmd
55
- assert_equal 'You are not logged-in.', output
56
- end
57
-
58
- end
@@ -1,27 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'test/unit'
4
- require 'fileutils'
5
- require_relative '../lib/client'
6
-
7
- class TestClient < Test::Unit::TestCase
8
-
9
- def test_get
10
- client = SolveBio::Client.new(nil, 'http://google.com')
11
- assert client, 'Should be able to create a client'
12
-
13
- # Can we get something from google?
14
- output = `curl --silent http://www.google.com`
15
- if $?.success? and output
16
- assert(client.request('get', 'http://www.google.com',
17
- {:raw => true, :redirect => true}),
18
- 'HTTP GET, google.com')
19
- assert(client.request('get', 'https://www.google.com',
20
- {:raw => true}),
21
- 'HTTPS GET google.com')
22
- else
23
- skip('Are you connected to the Internet? www.google.com is unavailable')
24
- end
25
- end
26
-
27
- end
@@ -1,13 +0,0 @@
1
- require 'test/unit'
2
- require_relative '../lib/resource/apiresource'
3
-
4
- class ConversionTest < Test::Unit::TestCase
5
- def test_class_to_api_name
6
- ar = SolveBio::APIResource
7
- [%w(Annotation annotations),
8
- %w(DataField data_fields),
9
- %w(Depository depositories)].each do |class_name, expect|
10
- assert_equal(expect, ar.class_to_api_name(class_name))
11
- end
12
- end
13
- end
@@ -1,42 +0,0 @@
1
- # Test Dataset, DatasetField, and Facets
2
- require_relative './helper'
3
- require_relative '../lib/resource/main'
4
-
5
- class TestDataset < Test::Unit::TestCase
6
- def setup
7
- @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
8
- end
9
-
10
- def test_dataset
11
- assert(@dataset.member?('id'),
12
- 'Should be able to get id in dataset')
13
-
14
- %w(class_name created_at data_url depository depository_id
15
- depository_version depository_version_id description
16
- fields_url full_name name title updated_at url).each do |field|
17
- assert(@dataset.member?(field),
18
- "Should find field #{field} in dataset #{@dataset.id}")
19
- end
20
-
21
- fields = @dataset.fields()
22
- dataset_field = fields[:data][0]
23
- assert(dataset_field.member?('id'),
24
- 'Should be able to get id in list of dataset fields')
25
-
26
- dataset_field2 = SolveBio::DatasetField.retrieve(dataset_field.id)
27
- assert_equal(dataset_field, dataset_field2,
28
- "Retrieving SolveBio::DatasetField id " +
29
- "#{dataset_field[:id]} found by all()")
30
-
31
- %w(class_name created_at dataset dataset_id description facets_url
32
- name updated_at url).each do |field|
33
- assert(dataset_field.member?(field),
34
- "Should find field #{field} in fields #{dataset_field.id}")
35
- end
36
- facets = dataset_field.facets()
37
-
38
- # We can get small or large numbers like 0 or 4902851621.0
39
- assert(facets['total'] >= 0,
40
- 'facets should have a numeric total field >= 0')
41
- end
42
- end
@@ -1,35 +0,0 @@
1
- # Test Depository, DepositoryVersions
2
-
3
- require_relative './helper'
4
- class TestDepository < Test::Unit::TestCase
5
-
6
- def test_depositories
7
- depos = SolveBio::Depository.all()
8
-
9
- depo = depos[:data][0]
10
- assert(depo.member?('id'),
11
- 'Should be able to get id in depository')
12
-
13
- depo2 = SolveBio::Depository.retrieve(depo.id)
14
- assert_equal(depo, depo2,
15
- "Retrieving dataset id #{depo.id} found by all()")
16
-
17
- %w(class_name created_at description external_resources
18
- full_name id is_private is_restricted latest_version
19
- latest_version_id name title updated_at url versions_count
20
- versions_url).each do |field|
21
- assert(depo.member?(field),
22
- "Should find field #{field} in depo #{depo.id}")
23
- end
24
-
25
- depo_version_id = depo.versions()[:data][0].id
26
- depo_version = SolveBio::DepositoryVersion.retrieve(depo_version_id)
27
-
28
- %w(class_name created_at datasets_url depository depository_id
29
- description full_name id latest name released released_at
30
- title updated_at url).each do |field|
31
- assert(depo_version.member?(field),
32
- "Should find field #{field} in depo version")
33
- end
34
- end
35
- end
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'test/unit'
4
- require 'net/http'
5
- require_relative '../lib/errors'
6
-
7
- # require 'trepanning'
8
-
9
- $errors = []
10
-
11
- class FakeLogger
12
- def debug(mess)
13
- $errors << mess
14
- end
15
- end
16
-
17
- class TestError < Test::Unit::TestCase
18
-
19
- def test_error
20
- msg = "hi"
21
- assert_equal msg, SolveBio::Error.new(nil, msg).to_s, "Error.to_s fn"
22
- response = Net::HTTPUnauthorized.new('HTTP 1.1', '404', 'No creds')
23
- old_logger = SolveBio.instance_variable_get('@logger')
24
- logger = FakeLogger.new
25
- SolveBio.instance_variable_set('@logger', logger)
26
- old_verbose = $VERBOSE
27
- $VERBOSE=false
28
- SolveBio::Error.new(response)
29
- $VERBOSE=old_verbose
30
- assert_equal ["API Response (404): No content."], $errors
31
- ensure
32
- $VERBOSE = old_verbose if old_verbose
33
- SolveBio.instance_variable_set('@logger', old_logger) if old_logger
34
-
35
- end
36
- end
@@ -1,70 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'test/unit'
4
- require_relative '../lib/filter'
5
-
6
- class TestFilter < Test::Unit::TestCase
7
-
8
- def test_filter_errors
9
- assert_raises TypeError do
10
- SolveBio::Filter.new(:style__gtt => 5)
11
- end
12
- assert_raises TypeError do
13
- SolveBio::Filter.new(:style__between => 'a')
14
- end
15
- assert_raises TypeError do
16
- SolveBio::Filter.new(:style__between => [5,10,15])
17
- end
18
- assert_raises IndexError do
19
- SolveBio::Filter.new(:style__range => [10,5])
20
- end
21
- end
22
-
23
- def test_filter
24
- f = SolveBio::Filter.new
25
- assert_equal('<SolveBio::Filter []>', f.inspect, 'empty filter')
26
- assert_equal('<SolveBio::Filter []>',
27
- (~f).inspect, '"not" of empty filter')
28
- f2 = SolveBio::Filter.new({:style => 'Mexican', :price => 'Free'})
29
- assert_equal('<SolveBio::Filter [{:and=>[[:price, "Free"], [:style, "Mexican"]]}]>',
30
- f2.inspect, 'Hash to tuple sorting'
31
- )
32
- assert_equal('<SolveBio::Filter [{:not=>{:and=>[[:price, "Free"], [:style, "Mexican"]]}}]>',
33
- (~f2).inspect, '~ of a non-nil filter')
34
- assert_equal('<SolveBio::Filter [{:and=>[[:price, "Free"], [:style, "Mexican"]]}]>',
35
- (~~f2).inspect, '~~ has no effect')
36
-
37
- filters3 =
38
- SolveBio::Filter.new(:omim_id => 144650) |
39
- SolveBio::Filter.new(:omim_id => 144600) |
40
- SolveBio::Filter.new(:omim_id => 145300)
41
-
42
- assert_equal('<SolveBio::Filter [{:or=>[[:omim_id, 144650], [:omim_id, 144600], [:omim_id, 145300]]}]>',
43
- filters3.inspect,
44
- 'combining more than one of a connector (|)')
45
-
46
- assert_equal('<SolveBio::Filter [[:style__between, [5, 10]]]>',
47
- SolveBio::Filter.new(:style__between => (5...11)).inspect)
48
- assert_equal('<SolveBio::Filter [[:style__between, [5, 10]]]>',
49
- SolveBio::Filter.new(:style__between => (5..10)).inspect)
50
-
51
- end
52
-
53
- def test_range_filter
54
- assert_equal('<RangeFilter [{:and=>[["hg38_start__range", ' +
55
- '[32200000, 32500000]], ' +
56
- '["hg38_end__range", [32200000, 32500000]], ' +
57
- '["hg38_chromosome", "13"]]}]>',
58
- SolveBio::RangeFilter.
59
- new("hg38", "13", 32200000, 32500000).inspect)
60
- end
61
-
62
- def test_process_filters
63
- # FIXME: add more and put in a loop.
64
- filters = [[:omid, nil]]
65
- expect = filters
66
- assert_equal(expect.inspect,
67
- SolveBio::Filter.process_filters(filters).inspect)
68
- end
69
-
70
- end
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $VERBOSE = true
3
- require 'test/unit'
4
- require 'fileutils'
5
- require_relative '../lib/credentials'
6
-
7
- # Does .netrc reading and manipulation work?
8
- class TestNetrc < Test::Unit::TestCase
9
-
10
-
11
- def setup
12
- @netrc_path_save = ENV["NETRC_PATH"]
13
- path = ENV['NETRC_PATH'] = File.join(File.dirname(__FILE__), 'data')
14
- FileUtils.cp(File.join(path, 'netrc-save'), File.join(path, '.netrc'))
15
- File.chmod(0600, "#{path}/.netrc")
16
- @old_warn_level = $VERBOSE
17
- @old_api_host = SolveBio::API_HOST
18
- $VERBOSE = nil
19
- SolveBio.const_set(:API_HOST, 'https://api.solvebio.com')
20
- $VERBOSE = @old_warn_level
21
- end
22
-
23
- def teardown
24
- ENV["NETRC_PATH"] = @netrc_path_save
25
- $VERBOSE = nil
26
- SolveBio.const_set(:API_HOST, @old_api_host)
27
- $VERBOSE = @old_warn_level
28
- end
29
-
30
- include SolveBio::Credentials
31
-
32
- def test_netrc
33
- assert netrc_path, 'Should get a location for .netrc'
34
- end
35
-
36
- def test_get_credentials
37
- assert_equal ['rocky@example.com', 'shhhh'], get_credentials.to_a
38
- end
39
-
40
- def test_save_credentials
41
- new_values = get_credentials.map{|x| x+"abc"}
42
- save_credentials(*new_values)
43
- assert_equal(new_values, get_credentials.to_a,
44
- 'Should append "abc" to creds')
45
- end
46
-
47
- def test_delete_credentials
48
- delete_credentials
49
- assert_equal nil, get_credentials, 'Should be able to delete credentials'
50
- end
51
-
52
- end
@@ -1,40 +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 TestQueryBatch < Test::Unit::TestCase
8
- def setup
9
- @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
10
- end
11
-
12
- def test_invalid_batch_query
13
- assert_raise SolveBio::Error do
14
- SolveBio::BatchQuery
15
- .new([
16
- @dataset.query(:limit => 1, :fields => [:bogus_field]),
17
- @dataset.query(:limit => 10).filter(:bogus_id__gt => 100000)
18
- ]).execute
19
- end
20
-
21
- results = SolveBio::BatchQuery
22
- .new([
23
- @dataset.query(:limit => 10).filter(:hgnc_id__lt => 100),
24
- @dataset.query(:limit => 10).filter(:hgnc_id__gt => 100)
25
- ]).execute
26
- assert_equal(2, results.length)
27
-
28
- end
29
-
30
- def test_batch_query
31
- queries = [
32
- @dataset.query(:limit => 1),
33
- @dataset.query(:limit => 10).filter(:hgnc_id__gt => 100)
34
- ]
35
- results = SolveBio::BatchQuery.new(queries).execute
36
- assert_equal(2, results.size)
37
- assert_equal(1, results[0]['results'].length)
38
- assert_equal(10, results[1]['results'].size)
39
- end
40
- end