solvebio 1.7.2 → 1.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.bumpversion.cfg +1 -1
- data/.travis.yml +1 -0
- data/Rakefile +2 -1
- data/lib/solvebio/api_operations.rb +0 -17
- data/lib/solvebio/cli/tutorial.md +124 -0
- data/lib/solvebio/cli/tutorial.rb +26 -3
- data/lib/solvebio/client.rb +5 -0
- data/lib/solvebio/dataset.rb +3 -0
- data/lib/solvebio/depository.rb +8 -1
- data/lib/solvebio/depository_version.rb +2 -2
- data/lib/solvebio/list_object.rb +16 -1
- data/lib/solvebio/query.rb +4 -5
- data/lib/solvebio/tabulate.rb +16 -8
- data/lib/solvebio/version.rb +1 -1
- data/test/solvebio/test_query_tabulate.rb +1 -1
- data/test/solvebio/test_tabulate.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe11b480aa4ded4563e8615f5aff700e65d79d28
|
4
|
+
data.tar.gz: 951035287b583008e5351229aa3c46f7ab3e4d7d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2533fc844714b62149bf76086dc5945d77a0db209ddd9afbb029d530e31476133e0bb6d38dde2e174e5b7347054c8d92e51a5a7a9b7f8a9b5148789902a7b6f
|
7
|
+
data.tar.gz: 4f56c1719d719818b2cecbe90923832edf0831eb9bfb9acbcaf61289553b2b91e910d8cea2640b191ba93531d96e39ece7c64cf02a96e470473fae0a5652929b
|
data/.bumpversion.cfg
CHANGED
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
@@ -108,23 +108,6 @@ module SolveBio
|
|
108
108
|
def self.included base
|
109
109
|
base.extend ClassMethods
|
110
110
|
end
|
111
|
-
|
112
|
-
def to_s
|
113
|
-
if self.class.constants.member?(:TAB_FIELDS)
|
114
|
-
items = self.class.const_get(:TAB_FIELDS).map{
|
115
|
-
|name| [name, self[name]]
|
116
|
-
}
|
117
|
-
else
|
118
|
-
items = self
|
119
|
-
end
|
120
|
-
return Tabulate.tabulate(items, ['Fields', 'Data'],
|
121
|
-
['right', 'left'], true)
|
122
|
-
end
|
123
|
-
|
124
|
-
def size
|
125
|
-
self[:total]
|
126
|
-
end
|
127
|
-
alias :total :size
|
128
111
|
end
|
129
112
|
|
130
113
|
module Search
|
@@ -0,0 +1,124 @@
|
|
1
|
+
|
2
|
+
____ _ ____ _
|
3
|
+
/ ___| ___ | |_ _____| __ )(_) ___
|
4
|
+
\___ \ / _ \| \ \ / / _ \ _ \| |/ _ \
|
5
|
+
___) | (_) | |\ V / __/ |_) | | (_) |
|
6
|
+
|____/ \___/|_| \_/ \___|____/|_|\___/
|
7
|
+
For Ruby
|
8
|
+
|
9
|
+
|
10
|
+
# Welcome to the SolveBio Ruby Tutorial!
|
11
|
+
|
12
|
+
First, open the SolveBio Ruby shell by typing "solvebio.rb".
|
13
|
+
|
14
|
+
The SolveBio Ruby Shell is based on IRB. When you log in, it will automatically pick up your API key.
|
15
|
+
|
16
|
+
View this tutorial online: https://www.solvebio.com/docs/ruby-tutorial
|
17
|
+
|
18
|
+
|
19
|
+
## Navigate the Library
|
20
|
+
|
21
|
+
List all available depositories:
|
22
|
+
|
23
|
+
Depository.all
|
24
|
+
|
25
|
+
|
26
|
+
Depositories are versioned containers of datasets. There are many versions of each depository, and each version may have one or more datasets.
|
27
|
+
|
28
|
+
To list all datasets from all depositories:
|
29
|
+
|
30
|
+
Dataset.all
|
31
|
+
|
32
|
+
|
33
|
+
Pass "latest=true" to get all the latest versions of each dataset:
|
34
|
+
|
35
|
+
Dataset.all(:latest => true)
|
36
|
+
|
37
|
+
|
38
|
+
To retrieve a dataset by its full name ("ClinVar/3.0.0-2014-12-05/Variants"):
|
39
|
+
|
40
|
+
Dataset.retrieve('ClinVar/3.0.0-2014-12-05/Variants')
|
41
|
+
|
42
|
+
By leaving out the version (for example: "ClinVar/Variants"), you get a quick shortcut to the latest version of any dataset.
|
43
|
+
**Be careful here: you should always specify an exact version in your production code**.
|
44
|
+
|
45
|
+
|
46
|
+
## Query a Dataset
|
47
|
+
|
48
|
+
Every dataset in SolveBio can be queried the same way. You can build queries manually in the Ruby shell, or use our visual Workbench (https://www.solvebio.com/workbench).
|
49
|
+
|
50
|
+
In this example, we will query the latest Variants dataset from ClinVar.
|
51
|
+
|
52
|
+
dataset = Dataset.retrieve('ClinVar/Variants')
|
53
|
+
dataset.query
|
54
|
+
|
55
|
+
|
56
|
+
The "query()" function returns a Ruby enumerable so you can loop through all the results easily.
|
57
|
+
|
58
|
+
To examine a single result more closely, you may treat the query response as a list of dictionaries:
|
59
|
+
|
60
|
+
dataset.query[0]
|
61
|
+
|
62
|
+
|
63
|
+
You can also slice the result set like any other Ruby array:
|
64
|
+
|
65
|
+
dataset.query[0..100]
|
66
|
+
|
67
|
+
|
68
|
+
## Filter a Dataset
|
69
|
+
|
70
|
+
To narrow down your query, you can filter on any field. For example, to get all variants in ClinVar that are Pathogenic, you would filter on the `clinical_significance` field for "Pathogenic":
|
71
|
+
|
72
|
+
dataset.query.filter(:clinical_significance => 'Pathogenic')
|
73
|
+
|
74
|
+
|
75
|
+
By default, adding more filters will result in a boolean AND query (all filters must match):
|
76
|
+
|
77
|
+
dataset.query.filter(:clinical_significance => 'Pathogenic', :review_status => 'single')
|
78
|
+
|
79
|
+
|
80
|
+
Use the "Filter" class to do more advanced filtering. For example, combine a few filters using boolean OR:
|
81
|
+
|
82
|
+
filters = Filter(:clinical_significance => 'Pathogenic') | Filter(:clinical_significance => 'Benign')
|
83
|
+
dataset.query.filter(filters)
|
84
|
+
|
85
|
+
|
86
|
+
## Genomic Datasets
|
87
|
+
|
88
|
+
Some SolveBio datasets allow querying by genome build. We call these "genomic datasets". To find out if a dataset is genomic, and what genome builds are supported:
|
89
|
+
|
90
|
+
dataset.is_genomic
|
91
|
+
> true
|
92
|
+
dataset.genome_builds
|
93
|
+
> ['GRCh38', 'GRCh37']
|
94
|
+
|
95
|
+
|
96
|
+
By default, build 'GRCh37' will be selected if it is available. If not, the most recent build will be selected by default. To manually select a genome build when querying, specify the build as a query parameter:
|
97
|
+
|
98
|
+
dataset.query(:genome_build => 'GRCh38')
|
99
|
+
|
100
|
+
|
101
|
+
On genomic datasets, you may query by position (single nucleotide) or by range:
|
102
|
+
|
103
|
+
dataset.query(:genome_build => 'GRCh37').position('chr1', 976629)
|
104
|
+
> ...
|
105
|
+
dataset.query(:genome_build => 'GRCh37').range('chr1', 976629, 1000000)
|
106
|
+
> ...
|
107
|
+
|
108
|
+
|
109
|
+
Position and range queries return all results that overlap with the specified coordinate(s).
|
110
|
+
Add the parameter `exact=true` to request exact matches.
|
111
|
+
|
112
|
+
|
113
|
+
dataset.query(:genome_build => 'GRCh37').position('chr1', 883516, exact=true)
|
114
|
+
> ...
|
115
|
+
dataset.query(:genome_build => 'GRCh37').range('chr9', 136289550, 136289579, exact=true)
|
116
|
+
> ...
|
117
|
+
|
118
|
+
|
119
|
+
## Next Steps
|
120
|
+
|
121
|
+
To learn more about a dataset and its fields, use `dataset.help()`.
|
122
|
+
For more information on queries and filters, see the API reference: https://www.solvebio.com/docs/api?ruby
|
123
|
+
|
124
|
+
|
@@ -2,11 +2,34 @@ module SolveBio
|
|
2
2
|
module CLI
|
3
3
|
module Tutorial
|
4
4
|
def tutorial
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
tutorial_file = File.join(File.dirname(__FILE__), "tutorial.md")
|
6
|
+
less = which('less')
|
7
|
+
if less
|
8
|
+
exec less + ' ' + tutorial_file
|
9
|
+
else
|
10
|
+
puts File.read(tutorial_file)
|
11
|
+
puts
|
12
|
+
puts "#######################################################################"
|
13
|
+
puts
|
14
|
+
puts "Warning: 'less' command not found in $PATH."
|
15
|
+
puts "Read the tutorial online at https://www.solvebio.com/docs/ruby-tutorial"
|
16
|
+
puts
|
17
|
+
puts "#######################################################################"
|
18
|
+
puts
|
19
|
+
end
|
8
20
|
end
|
9
21
|
module_function :tutorial
|
22
|
+
|
23
|
+
def which(cmd)
|
24
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
25
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
26
|
+
exts.each { |ext|
|
27
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
28
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
29
|
+
}
|
30
|
+
end
|
31
|
+
return nil
|
32
|
+
end
|
10
33
|
end
|
11
34
|
end
|
12
35
|
end
|
data/lib/solvebio/client.rb
CHANGED
@@ -74,6 +74,11 @@ module SolveBio
|
|
74
74
|
headers = opts[:default_headers] ? @headers.merge(opts[:headers] || {}) : nil
|
75
75
|
authorization = api_key ? "Token #{api_key}" : nil
|
76
76
|
|
77
|
+
# In Rest-Client, GET params are parsed from headers[:params]
|
78
|
+
if opts[:params]
|
79
|
+
headers.merge!({:params => opts[:params]})
|
80
|
+
end
|
81
|
+
|
77
82
|
# By default, encode payload as JSON
|
78
83
|
if ['post', 'put', 'patch'].include?(method.downcase) and opts[:json]
|
79
84
|
opts[:payload] = opts[:payload].to_json
|
data/lib/solvebio/dataset.rb
CHANGED
data/lib/solvebio/depository.rb
CHANGED
@@ -11,8 +11,11 @@ module SolveBio
|
|
11
11
|
include SolveBio::APIOperations::Update
|
12
12
|
include SolveBio::APIOperations::Help
|
13
13
|
|
14
|
+
@@permanent_attributes = Set.new([:id, :latest_version])
|
15
|
+
|
14
16
|
# Fields that get shown by tabulate
|
15
|
-
|
17
|
+
LIST_FIELDS = [%w(full_name title description),
|
18
|
+
%w(Name Title Description)]
|
16
19
|
|
17
20
|
def versions(name=nil, params={})
|
18
21
|
# construct the depo version full name
|
@@ -34,5 +37,9 @@ module SolveBio
|
|
34
37
|
results
|
35
38
|
end
|
36
39
|
|
40
|
+
def latest_version
|
41
|
+
return versions(self[:latest_version].split('/')[-1])
|
42
|
+
end
|
43
|
+
|
37
44
|
end
|
38
45
|
end
|
@@ -6,8 +6,8 @@ module SolveBio
|
|
6
6
|
include SolveBio::APIOperations::Help
|
7
7
|
|
8
8
|
# Fields that get shown by tabulate
|
9
|
-
|
10
|
-
|
9
|
+
LIST_FIELDS = [%w(full_name title description),
|
10
|
+
%w(Name Title Description)]
|
11
11
|
|
12
12
|
def datasets_url(name=nil)
|
13
13
|
name ||= self['name']
|
data/lib/solvebio/list_object.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
module SolveBio
|
2
2
|
class ListObject < SolveObject
|
3
|
-
|
4
3
|
def [](k)
|
5
4
|
case k
|
6
5
|
when String, Symbol
|
@@ -45,10 +44,26 @@ module SolveBio
|
|
45
44
|
self.to_a[i]
|
46
45
|
end
|
47
46
|
|
47
|
+
def size
|
48
|
+
self[:total]
|
49
|
+
end
|
50
|
+
alias :total :size
|
51
|
+
|
48
52
|
def to_a
|
49
53
|
return Util.to_solve_object(self.data)
|
50
54
|
end
|
51
55
|
|
56
|
+
def to_s
|
57
|
+
if self.data[0] and self.data[0].class.constants.member?(:LIST_FIELDS)
|
58
|
+
# Tabulate the result list
|
59
|
+
fields, headers = self.data[0].class::LIST_FIELDS
|
60
|
+
items = self.data.map { |item| fields.map{ |field| item[field] } }
|
61
|
+
return "\n" + Tabulate.tabulate(items, headers)
|
62
|
+
end
|
63
|
+
super
|
64
|
+
end
|
65
|
+
alias :inspect :to_s
|
66
|
+
|
52
67
|
def each(*pass)
|
53
68
|
return self unless block_given?
|
54
69
|
i = 0
|
data/lib/solvebio/query.rb
CHANGED
@@ -41,16 +41,15 @@ module SolveBio
|
|
41
41
|
@filters = params[:filters].kind_of?(SolveBio::Filter) ? params[:filters].filters : (params[:filters] || [])
|
42
42
|
|
43
43
|
@response = nil
|
44
|
-
#
|
44
|
+
# limit defines the total number of results that will be returned
|
45
45
|
# from a query involving 1 or more pagination requests.
|
46
46
|
@limit = params[:limit] || INT_MAX
|
47
|
-
#
|
48
|
-
# page_offset may be changed periodically during sequential pagination requests.
|
47
|
+
# page_size/page_offset are the low level API limit and offset params.
|
49
48
|
@page_size = params[:page_size] || DEFAULT_PAGE_SIZE
|
50
|
-
#
|
49
|
+
# page_offset can only be set by execute()
|
51
50
|
# It always contains the current absolute offset contained in the buffer.
|
52
51
|
@page_offset = nil
|
53
|
-
#
|
52
|
+
# slice is set to tell the Query object that is being sliced and "def each" should not
|
54
53
|
# reset the page_offset to 0 before iterating.
|
55
54
|
@slice = nil
|
56
55
|
|
data/lib/solvebio/tabulate.rb
CHANGED
@@ -3,6 +3,11 @@ module SolveBio
|
|
3
3
|
TYPES = {NilClass => 0, Fixnum => 1, Float => 2, String => 4}
|
4
4
|
|
5
5
|
INVISIBILE_CODES = %r{\\x1b\[\d*m} # ANSI color codes
|
6
|
+
|
7
|
+
def self.tty_cols
|
8
|
+
cols = (ENV['COLUMNS'].to_i || 80 rescue 80)
|
9
|
+
return cols > 0 ? cols : 80
|
10
|
+
end
|
6
11
|
|
7
12
|
Line = Struct.new(:start, :hline, :sep, :last)
|
8
13
|
|
@@ -288,23 +293,21 @@ module SolveBio
|
|
288
293
|
return rows, headers
|
289
294
|
end
|
290
295
|
|
291
|
-
TTY_COLS = ENV['COLUMNS'].to_i || 80 rescue 80
|
292
296
|
# Return a string which represents a row of data cells.
|
293
297
|
def build_row(cells, padding, first, sep, last)
|
294
|
-
|
295
298
|
pad = ' ' * padding
|
296
299
|
padded_cells = cells.map{|cell| pad + cell + pad }
|
297
300
|
rendered_cells = (first + padded_cells.join(sep) + last).rstrip
|
298
301
|
|
299
302
|
# Enforce that we don't wrap lines by setting a max
|
300
303
|
# limit on row width which is equal to TTY_COLS (see printing)
|
301
|
-
if rendered_cells.size >
|
304
|
+
if rendered_cells.size > Tabulate.tty_cols
|
302
305
|
if not cells[-1].end_with?(' ') and not cells[-1].end_with?('-')
|
303
306
|
terminating_str = ' ... '
|
304
307
|
else
|
305
308
|
terminating_str = ''
|
306
309
|
end
|
307
|
-
prefix = rendered_cells[0..
|
310
|
+
prefix = rendered_cells[0..Tabulate.tty_cols - terminating_str.size - 2]
|
308
311
|
rendered_cells = "%s%s%s" % [prefix, terminating_str, last]
|
309
312
|
end
|
310
313
|
|
@@ -395,6 +398,7 @@ module SolveBio
|
|
395
398
|
end
|
396
399
|
end
|
397
400
|
end
|
401
|
+
|
398
402
|
return lines.join("\n")
|
399
403
|
end
|
400
404
|
|
@@ -426,8 +430,11 @@ module SolveBio
|
|
426
430
|
end
|
427
431
|
|
428
432
|
# format rows and columns, convert numeric values to strings
|
429
|
-
|
430
|
-
list_of_lists
|
433
|
+
if list_of_lists.size == 1
|
434
|
+
cols = [[list_of_lists[0][0]], [list_of_lists[0][1]]]
|
435
|
+
else
|
436
|
+
cols = list_of_lists[0].zip(*list_of_lists[1..-1])
|
437
|
+
end
|
431
438
|
|
432
439
|
coltypes = cols.map{|c| column_type(c)}
|
433
440
|
|
@@ -459,7 +466,7 @@ module SolveBio
|
|
459
466
|
else
|
460
467
|
# align headers and add headers
|
461
468
|
minwidths =
|
462
|
-
minwidths.zip(cols).map{|minw, c| [minw, c[0].send(width_fn)].max}
|
469
|
+
minwidths.zip(cols).map{|minw, c| [minw, c ? c[0].send(width_fn) : 0].max}
|
463
470
|
headers =
|
464
471
|
headers.zip(aligns, minwidths).map{|h, a, minw| align_header(h, a, minw)}
|
465
472
|
end
|
@@ -471,9 +478,10 @@ module SolveBio
|
|
471
478
|
# make sure values don't have newlines or tabs in them
|
472
479
|
rows.each do |r|
|
473
480
|
r.each_with_index do |c, i|
|
474
|
-
r[i] = c.gsub("\n", '').gsub("\t", '')
|
481
|
+
r[i] = c.gsub("\n", '').gsub("\t", '').gsub("\r", '')
|
475
482
|
end
|
476
483
|
end
|
484
|
+
|
477
485
|
return format_table(tablefmt, headers, rows, minwidths, aligns)
|
478
486
|
end
|
479
487
|
end
|
data/lib/solvebio/version.rb
CHANGED
@@ -16,7 +16,7 @@ module SolveBio
|
|
16
16
|
def test_query_tabulate
|
17
17
|
old_verbose = $VERBOSE
|
18
18
|
$VERBOSE=nil
|
19
|
-
|
19
|
+
ENV['COLUMNS'] = "66"
|
20
20
|
$VERBOSE=old_verbose
|
21
21
|
dataset = SolveBio::Dataset.retrieve(TEST_DATASET_NAME)
|
22
22
|
results = dataset.query().filter(:hgnc_id => 2396)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solvebio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SolveBio
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-12-
|
11
|
+
date: 2014-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: netrc
|
@@ -140,6 +140,7 @@ files:
|
|
140
140
|
- lib/solvebio/cli/credentials.rb
|
141
141
|
- lib/solvebio/cli/irb.rb
|
142
142
|
- lib/solvebio/cli/irbrc.rb
|
143
|
+
- lib/solvebio/cli/tutorial.md
|
143
144
|
- lib/solvebio/cli/tutorial.rb
|
144
145
|
- lib/solvebio/client.rb
|
145
146
|
- lib/solvebio/dataset.rb
|