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
@@ -0,0 +1,4 @@
1
+ module SolveBio
2
+ class User < SingletonAPIResource
3
+ end
4
+ end
@@ -0,0 +1,59 @@
1
+ module SolveBio
2
+ module Util
3
+ def self.object_classes
4
+ @object_classes ||= {
5
+ 'Depository' => Depository,
6
+ 'DepositoryVersion' => DepositoryVersion,
7
+ 'Dataset' => Dataset,
8
+ 'DatasetField' => DatasetField,
9
+ 'Sample' => Sample,
10
+ 'Annotation' => Annotation,
11
+ 'User' => User,
12
+ 'Account' => Account,
13
+ 'list' => ListObject
14
+ }
15
+ end
16
+
17
+ def self.to_solve_object(resp)
18
+ case resp
19
+ when Array
20
+ resp.map { |i| to_solve_object(i) }
21
+ when Hash
22
+ object_classes.fetch(resp[:class_name], SolveObject).construct_from(resp)
23
+ else
24
+ resp
25
+ end
26
+ end
27
+
28
+ def self.symbolize_names(object)
29
+ case object
30
+ when Hash
31
+ new_hash = {}
32
+ object.each do |key, value|
33
+ key = (key.to_sym rescue key) || key
34
+ new_hash[key] = symbolize_names(value)
35
+ end
36
+ new_hash
37
+ when Array
38
+ object.map { |value| symbolize_names(value) }
39
+ else
40
+ object
41
+ end
42
+ end
43
+
44
+ module_function
45
+ def pluralize(name)
46
+ if name.end_with?('y')
47
+ name = name[0..-2] + 'ie'
48
+ end
49
+ return name + "s"
50
+ end
51
+
52
+ def camelcase_to_underscore(name)
53
+ # Add underscore before internal uppercase letters.
54
+ # Using [[:upper:]] and [[:lower]] should help with Unicode.
55
+ s1 = name.gsub(/(.)([[:upper:]])([[:lower:]]+)/){"#{$1}_#{$2}#{$3}"}
56
+ return (s1.gsub(/([a-z0-9])([[:upper:]])/){"#{$1}_#{$2}"}).downcase
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ module SolveBio
2
+ VERSION = '1.7.0'
3
+ end
@@ -1,10 +1,8 @@
1
1
  ## -*- Ruby -*-
2
- ## This is the rakegem gemspec template. Make sure you read and understand
3
- ## all of the comments. Some sections require modification, and others can
4
- ## be deleted if you don't need them. Once you understand the contents of
5
- ## this file, feel free to delete any comments that begin with two hash marks.
6
- ## You can find comprehensive Gem::Specification documentation, at
7
- ## http://docs.rubygems.org/read/chapter/20
2
+ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
3
+
4
+ require 'solvebio/version'
5
+
8
6
  Gem::Specification.new do |s|
9
7
  s.specification_version = 2 if s.respond_to? :specification_version=
10
8
  # s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
@@ -14,28 +12,27 @@ Gem::Specification.new do |s|
14
12
  ## If your rubyforge_project name is different, then edit it and comment out
15
13
  ## the sub! line in the Rakefile
16
14
  s.name = 'solvebio'
17
- s.version = '1.6.1'
18
- s.date = '2014-11-05'
15
+ s.version = SolveBio::VERSION
19
16
 
20
17
  ## Make sure your summary is short. The description may be as long
21
18
  ## as you like.
22
- s.summary = "SolveBio Ruby bindings."
23
-
19
+ s.summary = "Ruby bindings for the SolveBio API"
24
20
  s.description = <<-EOD
25
21
  SolveBio is a platform for biomedical datasets. With SolveBio you can
26
22
  forget about parsing complex flat files and sifting through cryptic
27
23
  datasets. Just use the Ruby Client and API to explore massive
28
24
  datasets and automate just about any bioinformatics workflow.
29
25
 
30
- See https://www.solvebio.com/docs/api/ for more information.
26
+ See https://www.solvebio.com/ for more information.
31
27
  EOD
32
28
 
33
29
  ## List the primary authors. If there are a bunch of authors, it's probably
34
30
  ## better to set the email to an email list or something. If you don't have
35
31
  ## a custom homepage, consider using your GitHub URL or the like.
36
- s.authors = ['solvebio.com']
32
+ s.authors = ['SolveBio']
37
33
  s.email = 'contact@solvebio.com'
38
34
  s.homepage = 'https://www.solvebio.com'
35
+ s.license = 'MIT'
39
36
 
40
37
  ## This gets added to the $LOAD_PATH so that 'lib/NAME.rb' can be required as
41
38
  ## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
@@ -59,17 +56,12 @@ EOD
59
56
  s.add_dependency('rest_client', '>=1.8.1') # better URI handler
60
57
  s.add_dependency('addressable', '>=2.3.6') # better URI parsing
61
58
 
62
- # s.add_dependency('openssl', '>=1.1.0')
63
-
64
- # There is no way to specify optional dependencies.
65
- # s.add_optional_dependency 'launchy' # opens URL in web browser for help
66
- # s.add_optional_dependency 'bond' # better shell command completion
67
-
68
59
  ## List your development dependencies here. Development dependencies are
69
60
  ## those that are only needed during development
70
61
  # s.add_development_dependency('DEVDEPNAME', [">= 1.1.0", "< 2.0.0"])
71
62
  s.add_development_dependency('rake')
72
63
  s.add_development_dependency('rdoc')
64
+ s.add_development_dependency('webmock')
73
65
  s.files = `git ls-files`.split($/)
74
66
 
75
67
  ## Test files will be grabbed from the file list. Make sure the path glob
@@ -1,10 +1,14 @@
1
+ require 'solvebio'
2
+ require 'solvebio/cli'
3
+
1
4
  require 'test/unit'
5
+ require 'webmock/test_unit'
6
+ require 'net/http'
7
+
2
8
  ENV['SOLVEBIO_API_HOST'] ||= 'https://api.solvebio.com'
3
- require_relative '../lib/main'
4
9
 
5
10
  TEST_DATASET_NAME = 'HGNC/1.0.0-1/HGNC'
6
11
 
7
-
8
12
  def local_api?
9
13
  ENV['SOLVEBIO_LOCAL_API']
10
14
  end
@@ -0,0 +1 @@
1
+ /.solvebio
@@ -0,0 +1,6 @@
1
+ machine foo.bar
2
+ login a@example.com
3
+ password secret
4
+ machine api.solvebio.com
5
+ login rocky@example.comabc
6
+ password shhhhabc
File without changes
@@ -0,0 +1,3 @@
1
+ machine api.solvebio.com
2
+ login testing@solvebio.com
3
+ password badcafebabe0feeddeadbeefeee111eee1110000
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class TestAnnotation < Test::Unit::TestCase
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.respond_to?(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
+ my_sample.delete
42
+ assert my_sample.deleted
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class TestClient < Test::Unit::TestCase
5
+ def test_get
6
+ client = Client.new(nil, 'http://google.com')
7
+ assert client, 'Should be able to create a client'
8
+
9
+ # Can we get something from google?
10
+ output = `curl --silent http://www.google.com`
11
+ if $?.success? and output
12
+ assert(client.request('get', 'http://www.google.com',
13
+ {:raw => true, :redirect => true}),
14
+ 'HTTP GET, google.com')
15
+ assert(client.request('get', 'https://www.google.com',
16
+ {:raw => true}),
17
+ 'HTTPS GET google.com')
18
+ assert(Client.request('get', 'http://www.google.com',
19
+ {:raw => true, :redirect => true}),
20
+ 'HTTP GET, google.com')
21
+ assert(Client.request('get', 'https://www.google.com',
22
+ {:raw => true}),
23
+ 'HTTPS GET google.com')
24
+ else
25
+ skip('Are you connected to the Internet? www.google.com is unavailable')
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class ConversionTest < Test::Unit::TestCase
5
+ def test_class_to_api_name
6
+ klass = SolveBio::Annotation
7
+ assert_equal('/v1/annotations', klass.url)
8
+ klass = SolveBio::DatasetField
9
+ assert_equal('/v1/dataset_fields', klass.url)
10
+ klass = SolveBio::Depository
11
+ assert_equal('/v1/depositories', klass.url)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ def silence_output(&block)
4
+ original_stdout = $stdout
5
+ $stdout = fake = StringIO.new
6
+ begin
7
+ yield
8
+ ensure
9
+ $stdout = original_stdout
10
+ end
11
+ fake.string
12
+ end
13
+
14
+ module SolveBio
15
+ class TestNetrc < Test::Unit::TestCase
16
+ include SolveBio::CLI::Credentials
17
+ include SolveBio::CLI::Auth
18
+
19
+ def setup
20
+ @home_path_save = ENV['HOME']
21
+ home_path = ENV['HOME'] = File.join(File.dirname(__FILE__), 'data')
22
+ credentials_file = netrc_path
23
+ FileUtils.cp(File.join(home_path, 'netrc-save'), credentials_file)
24
+ File.chmod(0600, credentials_file)
25
+ @old_warn_level = $VERBOSE
26
+ @old_api_host = SolveBio.api_host
27
+ $VERBOSE = nil
28
+ SolveBio.api_host = 'https://api.solvebio.com'
29
+ $VERBOSE = @old_warn_level
30
+ end
31
+
32
+ def teardown
33
+ ENV["HOME"] = @home_path_save
34
+ $VERBOSE = nil
35
+ SolveBio.api_host = @old_api_host
36
+ $VERBOSE = @old_warn_level
37
+ end
38
+
39
+ def test_netrc
40
+ assert(netrc_path,
41
+ "Should get a location for SolveBio's credentials")
42
+ end
43
+
44
+ def test_get_credentials
45
+ assert_equal ['rocky@example.com', 'shhhh'], get_credentials.to_a
46
+ end
47
+
48
+ def test_save_credentials
49
+ new_values = get_credentials.map{|x| x+"abc"}
50
+ save_credentials(*new_values)
51
+ assert_equal(new_values, get_credentials.to_a,
52
+ 'Should append "abc" to creds')
53
+ end
54
+
55
+ def test_delete_credentials
56
+ delete_credentials
57
+ assert_equal(nil, get_credentials,
58
+ 'Should be able to delete credentials')
59
+ pair = ['testagain@solvebio.com', 'b00b00']
60
+ save_credentials(*pair)
61
+ auths = get_credentials()
62
+ assert_equal(pair, auths,
63
+ "Should get newly set credentials for host #{SolveBio.api_host}")
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,52 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class TestDataset < Test::Unit::TestCase
5
+ def setup
6
+ @dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
7
+ end
8
+
9
+ def test_dataset_retrieval
10
+ assert(@dataset.id,
11
+ 'Should be able to get id in dataset')
12
+ assert(@dataset[:id],
13
+ 'Should be able to get id in dataset')
14
+
15
+ %w(class_name created_at data_url depository depository_id
16
+ depository_version depository_version_id description
17
+ fields_url full_name genome_builds is_genomic
18
+ name title updated_at url).each do |field|
19
+ assert(@dataset.respond_to?(field),
20
+ "Should find field #{field} in dataset #{@dataset.id}")
21
+ end
22
+ end
23
+
24
+ def test_dataset_fields
25
+ fields = @dataset.fields
26
+ dataset_field = fields[:data][0]
27
+ assert(dataset_field.id,
28
+ 'Should be able to get id in list of dataset fields')
29
+
30
+ dataset_field2 = SolveBio::DatasetField.retrieve(dataset_field.id)
31
+ assert_equal(dataset_field.id, dataset_field2.id,
32
+ "Retrieving SolveBio::DatasetField id " +
33
+ "#{dataset_field.id} found by all()")
34
+
35
+ %w(class_name created_at dataset dataset_id description facets_url
36
+ name updated_at url).each do |field|
37
+ assert(dataset_field.respond_to?(field),
38
+ "Should find field #{field} in fields #{dataset_field.id}")
39
+ end
40
+ end
41
+
42
+ def test_dataset_facets
43
+ fields = @dataset.fields
44
+ dataset_field = fields[:data][0]
45
+ facets = dataset_field.facets()
46
+
47
+ # We can get small or large numbers like 0 or 4902851621.0
48
+ assert(facets['total'] >= 0,
49
+ 'facets should have a numeric total field >= 0')
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,24 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class TestDepository < Test::Unit::TestCase
5
+ def test_depositories
6
+ depos = SolveBio::Depository.all
7
+
8
+ depo = depos.data[0]
9
+ assert(depo.id,
10
+ 'Should be able to get id in depository')
11
+
12
+ depo2 = SolveBio::Depository.retrieve(depo.id)
13
+ assert_equal(depo.id, depo2.id,
14
+ "Retrieving dataset id #{depo.id} found by all()")
15
+ %w(class_name created_at description external_resources
16
+ full_name id is_private is_restricted latest_version
17
+ latest_version_id name title updated_at url versions_count
18
+ versions_url).each do |field|
19
+ assert(depo.respond_to?(field),
20
+ "Should find field #{field} in depo #{depo.id}")
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ module SolveBio
4
+ class TestDepository < Test::Unit::TestCase
5
+ def test_depositoryversion
6
+ dvs = SolveBio::DepositoryVersion.all
7
+ dv = dvs.data[0]
8
+ assert(dv.respond_to?('id'),
9
+ 'Should be able to get id in depositoryversion')
10
+
11
+ dv2 = SolveBio::DepositoryVersion.retrieve(dv.id)
12
+ assert_equal(dv.id, dv2.id,
13
+ "Retrieving dataset id #{dv.id} found by all()")
14
+ %w(class_name created_at datasets_url depository depository_id
15
+ description full_name id latest name is_released released_at
16
+ title updated_at url).each do |field|
17
+ assert(dv.respond_to?(field),
18
+ "Should find field #{field} in depo version")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../../helper', __FILE__)
2
+
3
+ $errors = []
4
+
5
+ class FakeLogger
6
+ def debug(mess)
7
+ $errors << mess
8
+ end
9
+ end
10
+
11
+ module SolveBio
12
+ class TestError < Test::Unit::TestCase
13
+ def test_error
14
+ msg = "hi"
15
+ assert_equal msg, SolveBio::SolveError.new(nil, msg).to_s, "Error.to_s fn"
16
+ response = Net::HTTPUnauthorized.new('HTTP 1.1', '404', 'No creds')
17
+ old_logger = SolveBio.instance_variable_get('@logger')
18
+ logger = FakeLogger.new
19
+ SolveBio.instance_variable_set('@logger', logger)
20
+ old_verbose = $VERBOSE
21
+ $VERBOSE=false
22
+ SolveBio::SolveError.new(response)
23
+ $VERBOSE=old_verbose
24
+ assert_equal ["API Response (404): No content."], $errors
25
+ ensure
26
+ $VERBOSE = old_verbose if old_verbose
27
+ SolveBio.instance_variable_set('@logger', old_logger) if old_logger
28
+
29
+ end
30
+ end
31
+ end