solvebio 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/.gitignore +7 -0
  2. data/.travis.yml +13 -0
  3. data/Gemfile +4 -0
  4. data/Gemspec +3 -0
  5. data/LICENSE +21 -0
  6. data/Makefile +17 -0
  7. data/README.md +64 -0
  8. data/Rakefile +59 -0
  9. data/bin/solvebio.rb +36 -0
  10. data/demo/README.md +14 -0
  11. data/demo/dataset/facets.rb +13 -0
  12. data/demo/dataset/field.rb +13 -0
  13. data/demo/depository/README.md +24 -0
  14. data/demo/depository/all.rb +13 -0
  15. data/demo/depository/retrieve.rb +13 -0
  16. data/demo/depository/versions-all.rb +13 -0
  17. data/demo/query/query-filter.rb +30 -0
  18. data/demo/query/query.rb +13 -0
  19. data/demo/query/range-filter.rb +18 -0
  20. data/demo/test-api.rb +98 -0
  21. data/lib/apiresource.rb +130 -0
  22. data/lib/cli/auth.rb +122 -0
  23. data/lib/cli/help.rb +13 -0
  24. data/lib/cli/irb.rb +58 -0
  25. data/lib/cli/irbrc.rb +53 -0
  26. data/lib/cli/options.rb +75 -0
  27. data/lib/client.rb +152 -0
  28. data/lib/credentials.rb +67 -0
  29. data/lib/errors.rb +81 -0
  30. data/lib/filter.rb +312 -0
  31. data/lib/help.rb +46 -0
  32. data/lib/locale.rb +47 -0
  33. data/lib/main.rb +37 -0
  34. data/lib/query.rb +415 -0
  35. data/lib/resource.rb +414 -0
  36. data/lib/solvebio.rb +14 -0
  37. data/lib/solveobject.rb +101 -0
  38. data/lib/tabulate.rb +706 -0
  39. data/solvebio.gemspec +75 -0
  40. data/test/data/netrc-save +6 -0
  41. data/test/helper.rb +3 -0
  42. data/test/test-auth.rb +54 -0
  43. data/test/test-client.rb +27 -0
  44. data/test/test-error.rb +36 -0
  45. data/test/test-filter.rb +70 -0
  46. data/test/test-netrc.rb +42 -0
  47. data/test/test-query-batch.rb +60 -0
  48. data/test/test-query-init.rb +29 -0
  49. data/test/test-query-paging.rb +123 -0
  50. data/test/test-query.rb +88 -0
  51. data/test/test-resource.rb +47 -0
  52. data/test/test-solveobject.rb +27 -0
  53. data/test/test-tabulate.rb +127 -0
  54. metadata +158 -0
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ *~
2
+ .rvmrc
3
+ /Gemfile.lock
4
+ /pkg
5
+ /solvebio-*.gem
6
+ /test/data/.netrc
7
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ before_script:
3
+ - gem install netrc
4
+ - touch ~/.netrc
5
+ - chmod 0600 ~/.netrc
6
+ env:
7
+ - "COLUMNS=80"
8
+ script: rake
9
+ rvm:
10
+ - 1.9.3
11
+ - 2.0.0
12
+ - 2.1.1
13
+ - 2.1.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # A sample Gemfile
2
+ source "https://rubygems.org"
3
+
4
+ gem "netrc"
data/Gemspec ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Solve, Inc. (https://www.solvebio.com)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/Makefile ADDED
@@ -0,0 +1,17 @@
1
+ # I'll admit it -- I'm an absent-minded old-timer who has trouble
2
+ # learning new tricks.
3
+
4
+ .PHONY: test
5
+
6
+ RUBY ?= ruby
7
+ RAKE ?= rake
8
+
9
+ test: check
10
+
11
+ #: Default target; same as "make check"
12
+ all: check
13
+ true
14
+
15
+ #: Same as corresponding rake task
16
+ %:
17
+ $(RAKE) $@
data/README.md ADDED
@@ -0,0 +1,64 @@
1
+ [![Build Status](https://travis-ci.org/solvebio/solvebio-ruby.svg)](https://travis-ci.org/solvebio/solvebio-ruby)
2
+
3
+ # SolveBio Ruby Client
4
+
5
+
6
+ This packages provides a command-line interface (CLI) and Ruby API interface to SolveBio.
7
+
8
+ For more information about the SolveBio API, https://www.solvebio.com/docs/api/
9
+ For more information about SolveBio, see https://www.solvebio.com
10
+
11
+ # Installation
12
+
13
+ Right now we only support installing from git:
14
+
15
+ git clone https://github.com/solvebio/solvebio-ruby.git
16
+ cd solvebio-ruby
17
+ gem install netrc # install gem dependencies, may need sudo
18
+ rake test # or make test
19
+ sudo rake install # or make install
20
+
21
+ This also builds a *solvebio* gem which you can use elsewhere.
22
+
23
+ But note, you can also run right inside the git repository without installing anything. For example, running:
24
+
25
+ git clone https://github.com/solvebio/solvebio-ruby.git
26
+ solvebio-ruby/bin/solvebio.rb
27
+
28
+ will get you into a solvebio irb shell. Just about any Ruby file in the project can be run standalone, and when done so, it demos that Ruby code.
29
+
30
+ # Optional Gem dependencies
31
+
32
+ The following optional gems can make your shell experience better
33
+
34
+ * [bond](http://tagaholic.me/bond/)
35
+
36
+ Better command completion
37
+
38
+ * [launchy](https://github.com/copiousfreetime/launchy)
39
+
40
+ Opens help URLs in a web browser tab
41
+
42
+ * [rb18n-core](https://https://github.com/ai/r18n)
43
+
44
+ Localization for number formatting
45
+
46
+ # Demo code and Documentation
47
+
48
+ See the [demo folder](https://github.com/solvebio/solvebio-ruby/tree/dev/demo) for ready-to-run examples.
49
+
50
+ The online [SolveBio Python API documentation](https://www.solvebio.com/docs/api/?python) has additional examples. To use these with the Ruby client, change `import solvebio` to `require 'solvebio'` and change `solvebio.` to `SolveBio::` everywhere it occurs.
51
+
52
+ e.g., a Python example:
53
+
54
+ solvebio.Depository.retrieve("ClinVar").versions()
55
+
56
+ the same Python example ported to Ruby:
57
+
58
+ SolveBio::Depository.retrieve("ClinVar").versions()
59
+
60
+ As with any other Ruby method call, you can drop the final parenthesis if you like.
61
+
62
+ # To Do
63
+
64
+ This hasn't been extensively field tested yet.
data/Rakefile ADDED
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env rake
2
+ # -*- Ruby -*-
3
+
4
+ ROOT_DIR = File.dirname(__FILE__)
5
+ Gemspec_filename = 'solvebio.gemspec'
6
+
7
+ def gemspec
8
+ @gemspec ||= eval(File.read(Gemspec_filename), binding, Gemspec_filename)
9
+ end
10
+
11
+ require 'rubygems/package_task'
12
+
13
+ desc "Validate the gemspec"
14
+ task :gemspec do
15
+ gemspec.validate
16
+ end
17
+
18
+ desc "Build the gem"
19
+ task :package=>:gem
20
+ task :gem=>:gemspec do
21
+ Dir.chdir(ROOT_DIR) do
22
+ sh "gem build solvebio.gemspec"
23
+ FileUtils.mkdir_p 'pkg'
24
+ FileUtils.mv gemspec.file_name, 'pkg'
25
+ end
26
+ end
27
+
28
+ desc "Install the gem locally"
29
+ task :install => :gem do
30
+ Dir.chdir(ROOT_DIR) do
31
+ sh %{gem install --both pkg/#{gemspec.file_name}}
32
+ end
33
+ end
34
+
35
+ require 'rake/testtask'
36
+ desc "Test everything."
37
+ Rake::TestTask.new(:test) do |t|
38
+ t.libs << './lib'
39
+ t.test_files = FileList['test/test-*.rb']
40
+ t.verbose = true
41
+ end
42
+
43
+
44
+ require 'rbconfig'
45
+ RUBY_PATH = File.join(RbConfig::CONFIG['bindir'],
46
+ RbConfig::CONFIG['RUBY_INSTALL_NAME'])
47
+ desc "Run all of the demo files."
48
+ task :'run-demo' do
49
+ FileList['demo/*.rb']+FileList['demo/*/*.rb'].each do |ruby_file|
50
+ puts(('-' * 20) + ' ' + ruby_file + ' ' + ('-' * 20))
51
+ system(RUBY_PATH, ruby_file)
52
+ end
53
+ end
54
+
55
+ task :test => :lib
56
+
57
+ desc "same as test"
58
+ task :check => :test
59
+ task :default => :test
data/bin/solvebio.rb ADDED
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # SolveBio Ruby command-line program
5
+
6
+ require_relative '../lib/solvebio'
7
+ require_relative '../lib/cli/options'
8
+ require_relative '../lib/cli/irb'
9
+
10
+ DIR = File.dirname(__FILE__)
11
+ TEST_PROGRAM = File.join(DIR, %w(.. demo test-api.rb))
12
+
13
+ include SolveBio::CLIOptions
14
+ options, rest, parser = process_options(ARGV)
15
+
16
+ rest = ['shell'] if rest.empty?
17
+
18
+ include SolveBio::Auth
19
+
20
+ cmd = rest.shift
21
+ case cmd
22
+ when 'shell'
23
+ IRB::shell
24
+ when 'login'
25
+ login *rest
26
+ when 'logout'
27
+ logout
28
+ when 'whoami'
29
+ whoami
30
+ when 'test'
31
+ system(TEST_PROGRAM)
32
+ else
33
+ $stderr.puts "Unknown solvbio.rb command: #{cmd}"
34
+ $stderr.puts parser
35
+ exit 1
36
+ end
data/demo/README.md ADDED
@@ -0,0 +1,14 @@
1
+ # Intro
2
+
3
+ SolveBio aims to provide robust access to highly curated biological datasets. While our datasets do not conform to any proprietary formats, they are organized in a systematic way.
4
+
5
+ *Depositories* (data repositories) are simply versioned containers of datasets
6
+
7
+ A depository contains many versions, which in turn contain many datasets. Each dataset represents an independent “datastore”. Datasets store semi-structured data similar to typical “NoSQL” databases.
8
+
9
+ The [depository folder](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/depository) has examples involving retrieving, getting version information or listing depositories.
10
+
11
+ *Datasets* are access points to data. Dataset names are unique within versions of a depository. The
12
+ [dataset folder](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/dataset) has programs for retrieving properties of a dataset.
13
+
14
+ However, issuing queries on a dataset is probably what you will most want to do. The [query folder](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/query) contains examples of queries.
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::DatsetField.retrieve ... facets
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ fields = SolveBio::DatasetField.retrieve(691).facets
13
+ puts fields
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::DatsetField.retrieve
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ fields = SolveBio::DatasetField.retrieve(1)
13
+ puts fields
@@ -0,0 +1,24 @@
1
+ # Depositories
2
+
3
+ A *depository* (or data repository) is like a source code repository,
4
+ but for datasets. Depositories have one or more versions, which in
5
+ turn contain one or more datasets. Typically, depositories contain a
6
+ series of datasets that are compatible with each other (i.e. they come
7
+ from the same data source or project).
8
+
9
+ Right now, all depositories are curated by the SolveBio team.
10
+
11
+ * retrieve a depository
12
+
13
+ The [retrieve.rb](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/depository/retrieve.rb) Ruby program shows how to retrieve a single depository
14
+
15
+ * listing a depository
16
+
17
+ The [all.rb](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/depository/all.rb) Ruby program shows how to list all depositories
18
+
19
+ * list all versions of a depository
20
+
21
+ The [versions-all.rb](https://github.com/solvebio/solvebio-ruby/blob/dev/demo/depository/all.rb) Ruby program shows how to list all versions
22
+ of a depository
23
+
24
+ See also the [SolveBio Depository API](https://www.solvebio.com/docs/api/#depositories)
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Depository.all
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio::api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ depo = SolveBio::Depository.all
13
+ puts depo.to_s
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Depository.retrieve
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ depo = SolveBio::Depository.retrieve('ClinVar')
13
+ puts depo.to_s
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Depository.retrieve({DEPOSITORY_ID}).versions.all
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ depo = SolveBio::Depository.retrieve('ClinVar').versions.all
13
+ puts depo.to_s
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Query with simple equality tests, sometimes
3
+ # with "and" or "or"
4
+
5
+ require 'solvebio'
6
+
7
+ # SolveBio.api_key = 'set-me-correctly'
8
+ unless SolveBio.api_key
9
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
10
+ exit 1
11
+ end
12
+
13
+ ds = SolveBio::Dataset.retrieve('ClinVar/2.0.0-1/Variants')
14
+
15
+ results = ds.query.filter :hg19_start__in => [148562304, 148459988]
16
+
17
+ puts results.to_h # Show as a hash
18
+ puts '=' * 10
19
+ puts results # show in a more formatted way
20
+
21
+ # Here is the same thing but a little more inefficiently
22
+
23
+ filters2 =
24
+ SolveBio::Filter.new(:hg19_start => 148459988) |
25
+ SolveBio::Filter.new(:hg19_start => 148562304) |
26
+
27
+ results = ds.query(:filters => filters2)
28
+
29
+ puts '=' * 10
30
+ puts results
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Query
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ dataset = SolveBio::Dataset.retrieve('ClinVar/2.0.0-1/Variants')
13
+ puts dataset.query
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # Simple use of SolveBio::Query
3
+
4
+ require 'solvebio'
5
+
6
+ # SolveBio.api_key = 'set-me-correctly'
7
+ unless SolveBio.api_key
8
+ puts 'Please set SolveBio.api_key. Hint: solvebio.rb login'
9
+ exit 1
10
+ end
11
+
12
+ filters = SolveBio::RangeFilter.
13
+ new "hg38", "13", 32200000, 32500000
14
+
15
+ ds = SolveBio::Dataset.retrieve 'ClinVar/2.0.0-1/Variants'
16
+
17
+ results = ds.query(:filters => filters)
18
+ puts results
data/demo/test-api.rb ADDED
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env ruby
2
+ # Test SolveBio API
3
+ require_relative '../lib/solvebio'
4
+
5
+ DEPOSITORY = 'ClinVar'
6
+ DEPOSITORY_VERSION = "#{DEPOSITORY}/2.0.0-1"
7
+ DATASET = "#{DEPOSITORY_VERSION}/Variants"
8
+
9
+ # Custom Exception class for running basic tests
10
+ class TestFail < RuntimeError
11
+ end
12
+
13
+ DEBUG = ARGV.size > 1
14
+
15
+ # Function for running small tests with nice printing and checks
16
+ def run_and_verify(func, title='run a test', check_func_symbols)
17
+ puts "Trying to #{title}..."
18
+ response = func.call
19
+ check_func_symbols.each do |sym|
20
+ unless response.send(sym)
21
+ raise TestFail, "Failed on #{DATASET} using #{sym}"
22
+ end
23
+ end
24
+ puts "\x1b[32mOK!\x1b[39m\n"
25
+ return response
26
+ end
27
+
28
+ creds = SolveBio::Credentials.get_credentials
29
+ unless creds
30
+ puts 'You must be logged in as a SolveBio user ' +
31
+ 'in order to run the test suite!'
32
+ exit(1)
33
+ end
34
+
35
+ SolveBio::Client.client.api_key = creds[1]
36
+
37
+ begin
38
+ # depository things
39
+ load_depo = proc { SolveBio::DepositoryVersion.
40
+ retrieve(DEPOSITORY_VERSION) }
41
+ begin
42
+ dataset = run_and_verify(load_depo, 'load a depository version',
43
+ [:id, :to_s, :inspect, :instance_url])
44
+ rescue SolveBio::Error => exc
45
+ raise TestFail, "Loading #{DEPOSITORY_VERSION} failed! (#{exc})"
46
+ end
47
+
48
+ # depository things
49
+ load_depo = proc { SolveBio::Depository.retrieve(DEPOSITORY) }
50
+ begin
51
+ dataset = run_and_verify(load_depo, 'load a depository',
52
+ [:to_s, :versions, :versions_url,
53
+ :first, :max, :min])
54
+ rescue SolveBio::Error => exc
55
+ raise TestFail, "Loading #{DEPOSITORY} failed! (#{exc})"
56
+ end
57
+
58
+ # try loading a Dataset
59
+ load_dataset = proc { SolveBio::Dataset.retrieve(DATASET) }
60
+ begin
61
+ dataset = run_and_verify(load_dataset, 'load a dataset',
62
+ [:depository, :depository_version, :fields])
63
+ rescue SolveBio::Error => exc
64
+ raise TestFail, "Loading #{DATASET} failed! (#{exc})"
65
+ end
66
+
67
+ # try loading a DatasetField
68
+ load_dataset = proc { SolveBio::DatasetField.retrieve(1) }
69
+ begin
70
+ dataset = run_and_verify(load_dataset, 'load a dataset field',
71
+ [:facets, :instance_url])
72
+ rescue SolveBio::Error => exc
73
+ raise TestFail, "Loading DataSetField 1 failed! (#{exc})"
74
+ end
75
+
76
+ # run a basic query
77
+ query_dataset = proc {
78
+ dataset = SolveBio::Dataset.retrieve(DATASET)
79
+ dataset.query({:paging=>true, :limit => 10})
80
+ }
81
+ query = run_and_verify(query_dataset, 'run a basic query',
82
+ [:size, :inspect, :clone])
83
+
84
+ # # run a basic filter
85
+ # basic_filter = proc { query.filter(clinical_significance='Pathogenic') }
86
+ # run_and_verify(basic_filter, 'run a basic filter')
87
+
88
+ # # run a range filter
89
+ # range_filter = solvebio.RangeFilter(build="hg19",
90
+ # chromosome=1,
91
+ # start=100000,
92
+ # last=900000)
93
+ # run_and_verify(proc { query.filter(range_filter) },
94
+ # 'run a range filter')
95
+
96
+ rescue TestFail, exc
97
+ puts "\n\n\x1b[31mFAIL!\x1b[39m #{exc}"
98
+ end