taxa 0.1.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +0 -0
- data/.rubocop.yml +0 -0
- data/.ruby-version +1 -0
- data/.travis.yml +0 -0
- data/CHANGELOG.md +29 -1
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +0 -0
- data/Gemfile.lock +8 -6
- data/LICENSE.txt +0 -0
- data/README.md +15 -2
- data/Rakefile +0 -0
- data/lib/taxa.rb +3 -0
- data/lib/taxa/eol_classic/client.rb +65 -0
- data/lib/taxa/open_tree_of_life/client.rb +0 -1
- data/lib/taxa/open_tree_of_life/label_format_helper.rb +0 -0
- data/lib/taxa/open_tree_of_life/studies/base.rb +0 -0
- data/lib/taxa/open_tree_of_life/studies/find_studies.rb +0 -1
- data/lib/taxa/open_tree_of_life/studies/find_trees.rb +0 -1
- data/lib/taxa/open_tree_of_life/studies/properties.rb +0 -1
- data/lib/taxa/open_tree_of_life/studies/study.rb +0 -1
- data/lib/taxa/open_tree_of_life/studies/tree.rb +0 -1
- data/lib/taxa/open_tree_of_life/taxonomy/about.rb +0 -1
- data/lib/taxa/open_tree_of_life/taxonomy/base.rb +0 -0
- data/lib/taxa/open_tree_of_life/taxonomy/mrca.rb +2 -3
- data/lib/taxa/open_tree_of_life/taxonomy/subtree.rb +0 -1
- data/lib/taxa/open_tree_of_life/taxonomy/taxon_info.rb +0 -1
- data/lib/taxa/open_tree_of_life/tnrs/autocomplete_name.rb +0 -1
- data/lib/taxa/open_tree_of_life/tnrs/base.rb +0 -0
- data/lib/taxa/open_tree_of_life/tnrs/contexts.rb +0 -1
- data/lib/taxa/open_tree_of_life/tnrs/infer_context.rb +0 -1
- data/lib/taxa/open_tree_of_life/tnrs/match_names.rb +5 -6
- data/lib/taxa/open_tree_of_life/tree_of_life/about.rb +0 -1
- data/lib/taxa/open_tree_of_life/tree_of_life/base.rb +0 -0
- data/lib/taxa/open_tree_of_life/tree_of_life/induced_subtree.rb +0 -1
- data/lib/taxa/open_tree_of_life/tree_of_life/mrca.rb +0 -1
- data/lib/taxa/open_tree_of_life/tree_of_life/node_info.rb +0 -1
- data/lib/taxa/open_tree_of_life/tree_of_life/subtree.rb +0 -1
- data/lib/taxa/plants_of_the_world_online/client.rb +63 -0
- data/lib/taxa/utils.rb +14 -0
- data/lib/taxa/version.rb +1 -1
- data/taxa.gemspec +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c3d0340e64965b829135fd758847296d007e8293d5229fd2485fccb40abe0be
|
4
|
+
data.tar.gz: 9c053380d21709436c7bf9b4e0a9198eecdedab7e0e578b4c50b992dcb4bd76e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 99741a996cd69e5d57b2da6af6d0c4acf04a429db6258f6cdefbeb21d3b062aeba41a6537e7f5a3c6ff78d5941c533448b7263751ec134029bb9bad2538a29a3
|
7
|
+
data.tar.gz: 01d2cee9562d2f2845fc0866c3a8a68a279e548b5eb6f1913b41aa43110e8a13cc379b980e5ce524dc8165d5b18e7d003bd74cc09ad09425a5f466fdae8e3230
|
data/.gitignore
CHANGED
File without changes
|
data/.rubocop.yml
CHANGED
File without changes
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.2
|
data/.travis.yml
CHANGED
File without changes
|
data/CHANGELOG.md
CHANGED
@@ -1 +1,29 @@
|
|
1
|
-
|
1
|
+
# Taxa Changelog
|
2
|
+
|
3
|
+
## [0.1.0]
|
4
|
+
|
5
|
+
### Highlights
|
6
|
+
Support for Open Tree of Life API v3
|
7
|
+
https://github.com/OpenTreeOfLife/germinator/wiki/Open-Tree-of-Life-Web-APIs
|
8
|
+
|
9
|
+
## [0.2.0]
|
10
|
+
|
11
|
+
### Highlights
|
12
|
+
Support for the classic API for EOL
|
13
|
+
https://eol.org/docs/what-is-eol/classic-apis
|
14
|
+
|
15
|
+
## [0.2.1]
|
16
|
+
|
17
|
+
### Highlights
|
18
|
+
Update JSON gem to 2.5.x
|
19
|
+
|
20
|
+
## [0.3.0]
|
21
|
+
|
22
|
+
### Highlights
|
23
|
+
Support for Plants of the World Online
|
24
|
+
http://plantsoftheworldonline.org/
|
25
|
+
|
26
|
+
## [0.3.1]
|
27
|
+
|
28
|
+
### Highlights
|
29
|
+
Fixed a bug related to Plants of The World Online filter validation
|
data/CODE_OF_CONDUCT.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/Gemfile.lock
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
taxa (0.
|
4
|
+
taxa (0.3.0)
|
5
5
|
faraday (~> 1.1)
|
6
|
-
json (~>
|
6
|
+
json (~> 2.5)
|
7
7
|
|
8
8
|
GEM
|
9
9
|
remote: https://rubygems.org/
|
10
10
|
specs:
|
11
11
|
ast (2.4.1)
|
12
|
-
faraday (1.
|
12
|
+
faraday (1.3.0)
|
13
|
+
faraday-net_http (~> 1.0)
|
13
14
|
multipart-post (>= 1.2, < 3)
|
14
15
|
ruby2_keywords
|
15
|
-
|
16
|
+
faraday-net_http (1.0.1)
|
17
|
+
json (2.5.1)
|
16
18
|
minitest (5.14.2)
|
17
19
|
multipart-post (2.1.1)
|
18
20
|
parallel (1.20.1)
|
@@ -34,7 +36,7 @@ GEM
|
|
34
36
|
rubocop-ast (1.3.0)
|
35
37
|
parser (>= 2.7.1.5)
|
36
38
|
ruby-progressbar (1.10.1)
|
37
|
-
ruby2_keywords (0.0.
|
39
|
+
ruby2_keywords (0.0.4)
|
38
40
|
unicode-display_width (1.7.0)
|
39
41
|
|
40
42
|
PLATFORMS
|
@@ -47,4 +49,4 @@ DEPENDENCIES
|
|
47
49
|
taxa!
|
48
50
|
|
49
51
|
BUNDLED WITH
|
50
|
-
2.
|
52
|
+
2.2.3
|
data/LICENSE.txt
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Taxa
|
2
2
|
|
3
|
-
Taxa allows users to search multiple taxonomic data sources. Currently only Open Tree of Life
|
3
|
+
Taxa allows users to search multiple taxonomic data sources. Currently only Open Tree of Life and EOL classic APIs are implemented.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -19,8 +19,21 @@ Or install it yourself as:
|
|
19
19
|
$ gem install taxa
|
20
20
|
|
21
21
|
## Usage
|
22
|
+
```ruby
|
23
|
+
tol_client = Taxa::OpenTreeOfLife::Client.new
|
24
|
+
tol_client.tnrs.match_names('Cotyledon') # can be an array or a string
|
25
|
+
|
26
|
+
eol_client = Taxa::EOLClassic::Client.new
|
27
|
+
eol_client.hierarchy_entries(7834469)
|
28
|
+
|
29
|
+
powo_client = Taxa::PlantsOfTheWorldOnline::Client.new
|
30
|
+
powo_client.search('Crassula alata')
|
31
|
+
powo_client.search('Crassula', ['species_f', 'has_images'])
|
32
|
+
powo_client.search('family:Crassulaceae', ['species_f', 'has_images'])
|
33
|
+
```
|
22
34
|
|
23
|
-
|
35
|
+
For Plants of the World Online please see their official python library for available search terms:
|
36
|
+
https://github.com/RBGKew/pykew#available-search-terms-1
|
24
37
|
|
25
38
|
## Development
|
26
39
|
|
data/Rakefile
CHANGED
File without changes
|
data/lib/taxa.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'taxa/version'
|
4
|
+
require 'faraday'
|
4
5
|
require_relative './taxa/open_tree_of_life/client'
|
6
|
+
require_relative './taxa/eol_classic/client'
|
7
|
+
require_relative './taxa/plants_of_the_world_online/client'
|
5
8
|
|
6
9
|
module Taxa
|
7
10
|
# include OpenTreeOfLife
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Taxa
|
4
|
+
module EOLClassic
|
5
|
+
# API client for Open Tree of Life
|
6
|
+
class Client
|
7
|
+
attr_accessor :options
|
8
|
+
attr_reader :http_client
|
9
|
+
|
10
|
+
def initialize(**options)
|
11
|
+
@options = options
|
12
|
+
|
13
|
+
@http_client = options[:http_client] || Faraday.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def search(query, **parameters)
|
17
|
+
raise ArgumentError, 'query can not be nil' if query.nil?
|
18
|
+
|
19
|
+
url = 'https://eol.org/api/search/1.0.json'
|
20
|
+
response = @http_client.get(url, { q: query }.merge(parameters), { 'Accept' => 'application/json' })
|
21
|
+
parse_response(response)
|
22
|
+
end
|
23
|
+
|
24
|
+
def collections(id, **parameters)
|
25
|
+
raise ArgumentError, 'id can not be nil' if id.nil?
|
26
|
+
|
27
|
+
url = "https://eol.org/api/collections/1.0/#{id}.json"
|
28
|
+
response = @http_client.get(url, parameters, { 'Accept' => 'application/json' })
|
29
|
+
parse_response(response)
|
30
|
+
end
|
31
|
+
|
32
|
+
def pages(id, **parameters)
|
33
|
+
raise ArgumentError, 'id can not be nil' if id.nil?
|
34
|
+
|
35
|
+
url = "https://eol.org/api/pages/1.0/#{id}.json"
|
36
|
+
response = @http_client.get(url, parameters, { 'Accept' => 'application/json' })
|
37
|
+
parse_response(response)
|
38
|
+
end
|
39
|
+
|
40
|
+
def data_objects(id, **parameters)
|
41
|
+
raise ArgumentError, 'id can not be nil' if id.nil?
|
42
|
+
|
43
|
+
url = "https://eol.org/api/data_objects/1.0/#{id}.json"
|
44
|
+
response = @http_client.get(url, parameters, { 'Accept' => 'application/json' })
|
45
|
+
parse_response(response)
|
46
|
+
end
|
47
|
+
|
48
|
+
def hierarchy_entries(id, **parameters)
|
49
|
+
raise ArgumentError, 'id can not be nil' if id.nil?
|
50
|
+
|
51
|
+
url = "https://eol.org/api/hierarchy_entries/1.0/#{id}.json"
|
52
|
+
response = @http_client.get(url, parameters, { 'Accept' => 'application/json' })
|
53
|
+
parse_response(response)
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def parse_response(response)
|
59
|
+
JSON.parse(response.body)
|
60
|
+
rescue StandardError
|
61
|
+
nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'faraday'
|
4
3
|
require 'json'
|
5
4
|
|
6
5
|
module Taxa
|
@@ -10,10 +9,10 @@ module Taxa
|
|
10
9
|
module Mrca
|
11
10
|
def mrca(ott_ids)
|
12
11
|
raise ArgumentError, 'ott_ids required' if ott_ids.nil?
|
13
|
-
raise ArgumentError, 'ott_ids expected to be an array' unless ott_ids.is_a?(Array)
|
14
12
|
|
15
13
|
url = 'https://api.opentreeoflife.org/v3/taxonomy/mrca'
|
16
|
-
response = @http_client.post(url, JSON.generate({ ott_ids: ott_ids }),
|
14
|
+
response = @http_client.post(url, JSON.generate({ ott_ids: Array(ott_ids) }),
|
15
|
+
'Content-Type' => 'application/json')
|
17
16
|
JSON.parse(response.body)
|
18
17
|
end
|
19
18
|
end
|
File without changes
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'faraday'
|
4
3
|
require 'json'
|
5
4
|
|
6
5
|
module Taxa
|
@@ -8,20 +7,20 @@ module Taxa
|
|
8
7
|
class TNRS
|
9
8
|
# tnrs match_names api endpoint
|
10
9
|
module MatchNames
|
11
|
-
def match_names(**parameters)
|
12
|
-
names
|
13
|
-
raise ArgumentError if names.nil?
|
10
|
+
def match_names(names, **parameters)
|
11
|
+
raise ArgumentError, 'names is required' if names.nil?
|
14
12
|
|
15
13
|
context_name = parameters[:context_name]
|
16
14
|
do_approximate_matching = parameters[:do_approximate_matching] || false
|
17
15
|
include_suppressed = parameters[:include_suppressed]
|
18
16
|
|
19
17
|
payload = {
|
20
|
-
names: names,
|
18
|
+
names: Array(names),
|
21
19
|
context_name: context_name,
|
22
20
|
do_approximate_matching: do_approximate_matching,
|
23
21
|
include_suppressed: include_suppressed
|
24
|
-
}
|
22
|
+
}.compact
|
23
|
+
|
25
24
|
url = 'https://api.opentreeoflife.org/v3/tnrs/match_names'
|
26
25
|
response = @http_client.post(url, JSON.generate(payload), 'Content-Type' => 'application/json')
|
27
26
|
JSON.parse(response.body)
|
File without changes
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../utils'
|
4
|
+
module Taxa
|
5
|
+
module PlantsOfTheWorldOnline
|
6
|
+
# API client for Open Tree of Life
|
7
|
+
class Client
|
8
|
+
attr_accessor :options
|
9
|
+
attr_reader :http_client
|
10
|
+
|
11
|
+
POWO_URL = 'http://www.plantsoftheworldonline.org/api/2'
|
12
|
+
|
13
|
+
FILTERS = %w[accepted_names has_images families_f genus_f species_f infraspecific_f].freeze
|
14
|
+
|
15
|
+
def initialize(**options)
|
16
|
+
@options = options
|
17
|
+
@http_client = options[:http_client] || Faraday.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def search(query, options = {})
|
21
|
+
options.transform_keys!(&:to_sym)
|
22
|
+
|
23
|
+
page = options[:page] || 0
|
24
|
+
filters = Array.wrap(options[:filters])
|
25
|
+
validate_search_parameters(query, page, filters)
|
26
|
+
|
27
|
+
payload = { q: query, p: page }
|
28
|
+
payload.merge!({ f: filters.join(',') }) unless filters.empty?
|
29
|
+
response = @http_client.get("#{POWO_URL}/search", payload, { 'Accept' => 'application/json' })
|
30
|
+
parse_response(response)
|
31
|
+
end
|
32
|
+
|
33
|
+
def lookup(id, include = nil)
|
34
|
+
raise ArgumentError, 'id can not be nil' if id.nil?
|
35
|
+
|
36
|
+
include = Array.wrap(include)
|
37
|
+
payload = {}
|
38
|
+
payload.merge!({ fields: include.join(',') }) unless include.empty?
|
39
|
+
response = @http_client.get("#{POWO_URL}/taxon/#{id}", payload, { 'Accept' => 'application/json' })
|
40
|
+
parse_response(response)
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def validate_search_parameters(query, page, filters)
|
46
|
+
raise ArgumentError, 'query can not be nil' if query.nil?
|
47
|
+
|
48
|
+
if !filters.empty? && !filters.all? { |f| FILTERS.include? f }
|
49
|
+
raise ArgumentError,
|
50
|
+
"filter is invalid. It must be one of these: #{FILTERS.join(', ')} can not be nil"
|
51
|
+
end
|
52
|
+
|
53
|
+
raise ArgumentError, 'page must be an integer' unless page.is_a?(Integer)
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_response(response)
|
57
|
+
JSON.parse(response.body)
|
58
|
+
rescue StandardError
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/taxa/utils.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# https://stackoverflow.com/questions/18358717/ruby-elegantly-convert-variable-to-an-array-if-not-an-array-already
|
4
|
+
class Array
|
5
|
+
def self.wrap(object)
|
6
|
+
if object.nil?
|
7
|
+
[]
|
8
|
+
elsif object.respond_to?(:to_ary)
|
9
|
+
object.to_ary || [object]
|
10
|
+
else
|
11
|
+
[object]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/taxa/version.rb
CHANGED
data/taxa.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taxa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Sherman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.5'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.5'
|
55
55
|
description: Wrapper around a bunch of taxonomy databases.
|
56
56
|
email:
|
57
57
|
- shane.sherman@gmail.com
|
@@ -61,6 +61,7 @@ extra_rdoc_files: []
|
|
61
61
|
files:
|
62
62
|
- ".gitignore"
|
63
63
|
- ".rubocop.yml"
|
64
|
+
- ".ruby-version"
|
64
65
|
- ".travis.yml"
|
65
66
|
- CHANGELOG.md
|
66
67
|
- CODE_OF_CONDUCT.md
|
@@ -72,6 +73,7 @@ files:
|
|
72
73
|
- bin/console
|
73
74
|
- bin/setup
|
74
75
|
- lib/taxa.rb
|
76
|
+
- lib/taxa/eol_classic/client.rb
|
75
77
|
- lib/taxa/open_tree_of_life/client.rb
|
76
78
|
- lib/taxa/open_tree_of_life/label_format_helper.rb
|
77
79
|
- lib/taxa/open_tree_of_life/studies/base.rb
|
@@ -96,6 +98,8 @@ files:
|
|
96
98
|
- lib/taxa/open_tree_of_life/tree_of_life/mrca.rb
|
97
99
|
- lib/taxa/open_tree_of_life/tree_of_life/node_info.rb
|
98
100
|
- lib/taxa/open_tree_of_life/tree_of_life/subtree.rb
|
101
|
+
- lib/taxa/plants_of_the_world_online/client.rb
|
102
|
+
- lib/taxa/utils.rb
|
99
103
|
- lib/taxa/version.rb
|
100
104
|
- taxa.gemspec
|
101
105
|
homepage: https://github.com/ssherman/taxa
|