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,13 +0,0 @@
1
- module SolveBio
2
- # Shell help
3
- def help
4
- puts <<-HELP
5
- Constants SAMPLE_DEPO, SAMPLE_DEPO_VERSION, and SAMPLE_DATASET are
6
- available for and example depository, depository_versions or dataset.
7
-
8
- By setting environment variable SOLVEBIO_IRBRC, you can add your own
9
- custom irb profile.
10
- HELP
11
- end
12
- module_function :help
13
- end
@@ -1,54 +0,0 @@
1
- # -*- ruby -*-
2
- # irbrc profile for SolveBio
3
- IRB.conf[:PROMPT_MODE] = :SIMPLE
4
- IRB.conf[:PROMPT][:SIMPLE] = {
5
- :PROMPT_C => '[SolveBio] In ?: ', # Prompt when continuing a statement
6
- :PROMPT_I => '[SolveBio] In : ', # Normal prompt
7
- :PROMPT_N => '[SolveBio] In +: ', # Prompt when indenting code
8
- :PROMPT_S => '[SolveBio] In %l: ', # Prompt when continuing a string
9
- :RETURN => "[SolveBio] Out : %s\n"
10
- }
11
-
12
- require_relative '../solvebio'
13
- require_relative '../resource/apiresource'
14
- include SolveBio::Auth
15
-
16
- # Set some demo names that can be used.
17
- SAMPLE_DEPO = 'ClinVar'
18
- SAMPLE_DEPO_VERSION = "#{SAMPLE_DEPO}/2.0.0-1"
19
- SAMPLE_DATASET = "#{SAMPLE_DEPO_VERSION}/Variants"
20
-
21
- have_completion = nil
22
- begin
23
- require 'bond' and require 'bond/completion'
24
- have_completion = 'bond'
25
- rescue LoadError
26
- begin
27
- have_completion = require 'irb/completion'
28
- rescue LoadError
29
- have_completion = false
30
- end
31
- end
32
- 'irb/completion'
33
- 'bond' 'bond/completion'
34
-
35
- puts <<-INTRO
36
- You are in a SolveBio Interactive Ruby (irb) session...
37
- Type SolveBio::help for help on SolveBio.
38
- INTRO
39
-
40
- unless have_completion
41
- if have_completion != 'bond'
42
- puts "You might get better completion using the 'bond' gem"
43
- end
44
- end
45
-
46
- # Report whether we are logged in.
47
- include SolveBio::Credentials
48
- creds = get_credentials()
49
- if creds
50
- puts "You are logged in as #{creds[0]}"
51
- else
52
- puts 'You are not logged in yet. Login using "login [email]"'
53
-
54
- end
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
- # SolveBio Ruby command-line option processing
5
-
6
- require 'optparse'
7
- require_relative '../client'
8
-
9
- module SolveBio::CLIOptions
10
-
11
- PROGRAM = 'solvebio.rb'
12
-
13
- def show_version
14
- "#{PROGRAM}, version #{SolveBio::VERSION}"
15
- end
16
-
17
- # Main parser for the SolveBio command line client
18
- def setup_options(options, stdout=$stdout, stderr=$stderr)
19
-
20
- OptionParser.new do |opts|
21
- opts.banner = "Usage: solvebio.rb [options] <command> [<args>]"
22
- opts.on_tail('-v', '--version',
23
- 'print the version') do
24
- options[:version] = true
25
- stdout.puts "#{PROGRAM}, version #{SolveBio::VERSION}"
26
- exit 0
27
- end
28
-
29
- opts.on('--api-host NAME', String,
30
- 'Override the default SolveBio API host') do
31
- |api_host|
32
- options[:api_host] = api_host
33
- end
34
-
35
- opts.on('--api-key STRING', String,
36
- 'Manually provide a SolveBio API key') do
37
- |api_key|
38
- options[:api_key] = api_key
39
- end
40
-
41
- opts.on('-h', '--help', 'Display this screen') do
42
- puts opts
43
- puts <<-EOH
44
-
45
- SolveBio Commands:
46
- login [email] Login and save credentials. Use email if provided.
47
- logout Logout and delete saved credentials
48
- whoami Show your SolveBio email address
49
- shell Open a SolveBio IRB shell
50
- test Make sure the SolveBio API is working correctly
51
- EOH
52
- exit
53
- end
54
- end
55
- end
56
-
57
- end
58
-
59
- def process_options(argv)
60
- options = {}
61
- args = setup_options(options)
62
- rest = args.parse argv
63
-
64
- SolveBio::Client.client.api_host = options[:api_host] if
65
- options[:api_host]
66
- SolveBio::Client.client.api_key = options[:api_key] if
67
- options[:api_key]
68
- return options, rest, args
69
- end
70
-
71
- if __FILE__ == $0
72
- include SolveBio::CLIOptions
73
- options, rest, parser = process_options(ARGV)
74
- p options, rest, parser
75
- end
@@ -1,154 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- require 'openssl'
4
- require 'rest_client'
5
- require 'json'
6
- require 'addressable/uri'
7
- require_relative 'credentials'
8
- require_relative 'errors'
9
-
10
- # A requests-based HTTP client for SolveBio API resources
11
- class SolveBio::Client
12
-
13
- attr_reader :headers, :api_host
14
- attr_accessor :api_key
15
-
16
- # Add our own kind of Authorization tokens. This has to be
17
- # done this way, late, because the rest-client gem looks for
18
- # .netrc and will set basic authentication if it finds a match.
19
- RestClient.add_before_execution_proc do | req, args |
20
- if args[:authorization]
21
- req.instance_variable_get('@header')['authorization'] = [args[:authorization]]
22
- end
23
- end
24
-
25
- def initialize(api_key=nil, api_host=nil)
26
- @api_key = api_key || SolveBio::api_key
27
- SolveBio::api_key ||= api_key
28
- @api_host = api_host || SolveBio::API_HOST
29
-
30
- # Mirroring comments from:
31
- # http://ruby-doc.org/stdlib-2.1.2/libdoc/net/http/rdoc/Net/HTTP.html
32
- # gzip compression is used in preference to deflate
33
- # compression, which is used in preference to no compression.
34
- @headers = {
35
- :content_type => :json,
36
- :accept => :json,
37
- 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
38
- 'User-Agent' => 'SolveBio Ruby Client %s [%s/%s]' % [
39
- SolveBio::VERSION,
40
- SolveBio::RUBY_IMPLEMENTATION,
41
- SolveBio::RUBY_VERSION
42
- ]
43
- }
44
- end
45
-
46
- DEFAULT_REQUEST_OPTS = {
47
- :raw => false,
48
- :default_headers => true
49
- }
50
-
51
- # Issues an HTTP GET across the wire via the Ruby 'rest-client'
52
- # library. See *request()* for information on opts.
53
- def get(url, opts={})
54
- request('get', url, opts)
55
- end
56
-
57
- # Issues an HTTP POST across the wire via the Ruby 'rest-client'
58
- # library. See *request* for information on opts.
59
- def post(url, data, opts={})
60
- opts[:payload] =
61
- if opts.member?(:no_json)
62
- data
63
- else
64
- data.to_json
65
- end
66
- request('post', url, opts)
67
- end
68
-
69
- # Issues an HTTP Request across the wire via the Ruby 'rest-client'
70
- # library.
71
- def request(method, url, opts={})
72
-
73
- opts = DEFAULT_REQUEST_OPTS.merge(opts)
74
-
75
- # Expand URL with API host if none was given
76
- api_host = @api_host or SolveBio::API_HOST
77
-
78
- if not api_host
79
- raise SolveBio::Error.new('No SolveBio API host is set')
80
- elsif not url.start_with?(api_host)
81
- url = Addressable::URI.join(api_host, url).to_s
82
- end
83
-
84
- # Handle some default options and add authorization header
85
- if opts[:default_headers] and @api_key
86
- headers = @headers.merge(opts[:headers]||{})
87
- authorization = "Token #{@api_key}"
88
- else
89
- headers = nil
90
- authorization = nil
91
- end
92
-
93
- SolveBio::logger.debug('API %s Request: %s' % [method.upcase, url])
94
-
95
- response = nil
96
- RestClient::Request.
97
- execute(:method => method,
98
- :url => url,
99
- :headers => headers,
100
- :authorization => authorization,
101
- :timeout => opts[:timeout] || 80,
102
- :payload => opts[:payload]) do
103
- |resp, request, result, &block|
104
- response = resp
105
- if response.code < 200 or response.code >= 400
106
- self.handle_api_error(result)
107
- end
108
- end
109
-
110
- response = JSON.parse(response) unless opts[:raw]
111
- response
112
- end
113
-
114
- def self.handle_request_error(e)
115
- # FIXME: go over this. It is still a rough translation
116
- # from the python.
117
- err = e.inspect
118
- if e.kind_of?(requests.exceptions.RequestException)
119
- msg = SolveBio::Error::Default_message
120
- else
121
- msg = "Unexpected error communicating with SolveBio.\n" +
122
- "It looks like there's probably a configuration " +
123
- 'issue locally.\nIf this problem persists, let us ' +
124
- 'know at contact@solvebio.com.'
125
- end
126
- msg = msg + "\n\n(Network error: #{err}"
127
- raise SolveBio::Error.new(nil, msg)
128
- end
129
-
130
- # SolveBio's API error handler returns a SolveBio::Error. The
131
- # *response* parameter is a (subclass) of Net::HTTPResponse.
132
- def handle_api_error(response)
133
- SolveBio::logger.info("API Error: #{response.msg}") unless
134
- [400, 401, 403, 404].member?(response.code.to_i)
135
- raise SolveBio::Error.new(response)
136
- end
137
-
138
- def self.client
139
- @@client ||= SolveBio::Client.new()
140
- end
141
-
142
- def self.get(*args)
143
- client.get(*args)
144
- end
145
-
146
- def self.post(*args)
147
- client.post(*args)
148
- end
149
-
150
- def self.request(*args)
151
- client.request(*args)
152
- end
153
-
154
- end
@@ -1,67 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- # Deals with reading netrc credentials
4
- require_relative 'main'
5
- require 'netrc'
6
- require 'addressable/uri'
7
-
8
- #
9
- # Raised if the credentials are not found.
10
- #
11
- class CredentialsError < RuntimeError
12
- end
13
-
14
- module SolveBio::Credentials
15
-
16
- module_function
17
-
18
- # SolveBio API host -- just the hostname
19
- def api_host
20
- Addressable::URI.parse(SolveBio::API_HOST).host
21
- end
22
-
23
- def netrc_path
24
- path =
25
- if ENV['NETRC_PATH']
26
- File.join(ENV['NETRC_PATH'], ".netrc")
27
- else
28
- Netrc.default_path
29
- end
30
- if not File.exist?(path)
31
- raise IOError, "netrc file #{path} not found"
32
- end
33
- path
34
- end
35
-
36
- #
37
- # Returns the tuple user / password given a path for the .netrc file.
38
- # Raises CredentialsError if no valid netrc file is found.
39
- #
40
- def get_credentials
41
- n = Netrc.read(netrc_path)
42
- return n[api_host]
43
- rescue Netrc::Error => e
44
- raise CredentialsError, "Could not read .netrc file: #{e}"
45
- end
46
- module_function :get_credentials
47
-
48
- def delete_credentials
49
- n = Netrc.read(netrc_path)
50
- n.delete(api_host)
51
- n.save
52
- end
53
-
54
- def save_credentials(email, api_key)
55
- n = Netrc.read(netrc_path)
56
- # Overwrites any existing credentials
57
- n[api_host] = email, api_key
58
- n.save
59
- end
60
- end
61
-
62
- # Demo code
63
- if __FILE__ == $0
64
- include SolveBio::Credentials
65
- puts "authentication: #{netrc_path}"
66
- puts "creds", get_credentials
67
- end
@@ -1,81 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
- require_relative 'main'
4
-
5
- class SolveBio::Error < RuntimeError
6
- Default_message =
7
- 'Unexpected error communicating with SolveBio. ' +
8
- 'If this problem persists, let us know at ' +
9
- 'contact@solvebio.com.'
10
-
11
- attr_reader :json_body
12
- attr_reader :status_code
13
- attr_reader :message
14
- attr_reader :field_errors
15
-
16
- def initialize( response=nil, message=nil)
17
- @json_body = nil
18
- @status_code = nil
19
- @message = message or Default_message
20
- @field_errors = []
21
-
22
- if response
23
- @status_code = response.code.to_i
24
- @message = response.message
25
- begin
26
- @json_body = JSON.parse(response.body)
27
- rescue
28
- @message = '404 Not Found.' if @status_code == 404
29
- SolveBio.logger.debug(
30
- "API Response (%d): No content." % @status_code)
31
- else
32
- SolveBio.logger.debug(
33
- "API Response (#{@status_code}): #{@json_body}")
34
-
35
- if [400, 401, 403, 404].member?(@status_code)
36
- @message = 'Bad request.'
37
-
38
- if @json_body.member?('detail')
39
- @message = '%s' % @json_body['detail']
40
- end
41
-
42
- if @json_body.member?('non_field_errors')
43
- @message = '%s.' % \
44
- @json_body['non_field_errors'].join(', ')
45
- end
46
-
47
- @json_body.each do |k, v|
48
- unless ['detail', 'non_field_errors'].member?(k)
49
- v = v.join(', ') if v.kind_of?(Array)
50
- @field_errors << ('%s (%s)' % [k, v])
51
- end
52
- end
53
-
54
- unless @field_errors.empty?
55
- @message += (' The following fields were missing ' +
56
- 'or invalid: %s' %
57
- @field_errors.join(', '))
58
- end
59
- end
60
- end
61
- end
62
- self
63
- end
64
-
65
- def to_s
66
- @message
67
- end
68
- end
69
-
70
- # Demo code
71
- if __FILE__ == $0
72
- puts SolveBio::Error.new
73
- puts SolveBio::Error.new(nil, 'Hi there').inspect
74
- puts SolveBio::Error.new(nil, 'Hi there').to_s
75
- puts SolveBio::Error.new(nil, ['Hello, ', 'again.']).inspect
76
-
77
- require 'net/http'
78
- response = Net::HTTPUnauthorized.new('HTTP 1.1', '404', 'No creds')
79
- puts SolveBio::Error.new(response).to_s
80
-
81
- end