gnfinder 0.10.1 → 0.15.5
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/.github/workflows/ruby.yml +41 -0
- data/CHANGELOG.md +27 -1
- data/README.md +26 -29
- data/Rakefile +1 -10
- data/gnfinder.gemspec +8 -6
- data/lib/gnfinder/client.rb +51 -34
- data/lib/gnfinder/version.rb +1 -1
- data/lib/gnfinder.rb +3 -2
- data/lib/hash.rb +170 -0
- metadata +62 -31
- data/lib/protob_pb.rb +0 -100
- data/lib/protob_services_pb.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbac598ce79e8e9db5ad0fd4f24b5004b2cf4f91d3f5fae0ece871b525d1f488
|
4
|
+
data.tar.gz: 36abaa471d385f27ae6bfa32f6f960bb7bc3a1b258b0b2a5402826e41d629d6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e6a3e825edfaa873e0d178a7323d7a9b6124292e940e504834b48d8127e18ae08298044458b15fc1125abf9b98afcd1faa292eadfb6edf64f80d6b3d89d43d7
|
7
|
+
data.tar.gz: 68e7871b2ce105ca751c63b391ca7477a33ce965c88d6ef87235635fd8aebbfba18e856c549d0e0a26d2a4228f0a0bf46ab8cce58892c677824273f6c1f9d259
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ${{ matrix.os }}
|
20
|
+
strategy:
|
21
|
+
matrix:
|
22
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
23
|
+
ruby: [2.6, 2.7, 3.0]
|
24
|
+
|
25
|
+
steps:
|
26
|
+
- uses: actions/checkout@v2
|
27
|
+
- name: Set up Ruby
|
28
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
29
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
30
|
+
# uses: ruby/setup-ruby@v1
|
31
|
+
uses: ruby/setup-ruby@fdcfbcf14ec9672f6f615cb9589a1bc5dd69d262
|
32
|
+
with:
|
33
|
+
ruby-version: ${{ matrix.ruby }}
|
34
|
+
- name: Install dependencies
|
35
|
+
run: bundle install
|
36
|
+
- name: Show environment
|
37
|
+
run: gem environment
|
38
|
+
- name: Run tests
|
39
|
+
run: bundle exec rake
|
40
|
+
- name: Checking install works
|
41
|
+
run: rake install
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
## Unreleased
|
4
4
|
|
5
|
+
## [v0.15.5]
|
6
|
+
|
7
|
+
- Add [#16]: Search names using URL.
|
8
|
+
|
9
|
+
## [v0.15.4]
|
10
|
+
|
11
|
+
- Add [#14]: Compatibility with gnfider v0.15.4, switching to REST API.
|
12
|
+
|
5
13
|
## [v0.2.0]
|
6
14
|
|
7
15
|
- Compatibility with gnfinder v0.7.0
|
@@ -29,10 +37,28 @@
|
|
29
37
|
|
30
38
|
This document follows [changelog guidelines]
|
31
39
|
|
40
|
+
[v0.15.4]: https://github.com/GlobalNamesArchitecture/gnfinder/compare/v0.1.0...v0.15.4
|
41
|
+
[v0.2.0]: https://github.com/GlobalNamesArchitecture/gnfinder/compare/v0.1.3...v0.2.0
|
42
|
+
[v0.1.3]: https://github.com/GlobalNamesArchitecture/gnfinder/compare/v0.1.2...v0.1.3
|
43
|
+
[v0.1.2]: https://github.com/GlobalNamesArchitecture/gnfinder/compare/v0.1.1...v0.1.2
|
32
44
|
[v0.1.1]: https://github.com/GlobalNamesArchitecture/gnfinder/compare/v0.1.0...v0.1.1
|
33
45
|
[v0.1.0]: https://github.com/GlobalNamesArchitecture/gnfinder/tree/v0.1.0
|
34
46
|
|
35
|
-
[#
|
47
|
+
[#20]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/20
|
48
|
+
[#19]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/19
|
49
|
+
[#18]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/18
|
50
|
+
[#17]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/17
|
51
|
+
[#16]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/16
|
52
|
+
[#15]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/15
|
53
|
+
[#14]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/14
|
54
|
+
[#13]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/13
|
55
|
+
[#12]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/12
|
56
|
+
[#11]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/11
|
57
|
+
[#10]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/10
|
58
|
+
[#9]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/9
|
59
|
+
[#8]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/8
|
60
|
+
[#7]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/7
|
61
|
+
[#6]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/6
|
36
62
|
[#5]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/5
|
37
63
|
[#4]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/4
|
38
64
|
[#3]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/3
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# gnfinder
|
2
2
|
|
3
|
-
Ruby gem to access functionality of [
|
3
|
+
Ruby gem to access functionality of [GNfinder] project written in Go. This gem
|
4
4
|
allows to perform fast and accurate scientific name finding in UTF-8 encoded
|
5
5
|
plain texts for Ruby-based projects.
|
6
6
|
|
7
|
-
- [
|
7
|
+
- [GNfinder](#gnfinder)
|
8
8
|
- [Requirements](#requirements)
|
9
9
|
- [Installation](#installation)
|
10
10
|
- [Usage](#usage)
|
@@ -19,12 +19,12 @@ plain texts for Ruby-based projects.
|
|
19
19
|
|
20
20
|
## Requirements
|
21
21
|
|
22
|
-
This gem uses
|
23
|
-
to run it in [
|
22
|
+
This gem uses REST API to access a running [GNfinder] server. You can find how
|
23
|
+
to run it in [GNfinder] README file.
|
24
24
|
|
25
25
|
## Installation
|
26
26
|
|
27
|
-
To use the gem from Ruby proect install it using Gemfile, or manually:
|
27
|
+
To use the gem from a Ruby proect install it using Gemfile, or manually:
|
28
28
|
|
29
29
|
```bash
|
30
30
|
gem install gnfinder
|
@@ -32,10 +32,10 @@ gem install gnfinder
|
|
32
32
|
|
33
33
|
## Usage
|
34
34
|
|
35
|
-
The purpose of this gem is to access [
|
35
|
+
The purpose of this gem is to access [GNfinder] functionality from Ruby
|
36
36
|
applications. If you need to find names using other languages, use the
|
37
37
|
[source code][client] of this gem for reference. For other usages read
|
38
|
-
the original Go-lang [
|
38
|
+
the original Go-lang [GNfinder] README file.
|
39
39
|
|
40
40
|
First you need to create a instance of a `gnfinder` client
|
41
41
|
|
@@ -63,7 +63,7 @@ gf = Gnfinder::Client.new(host = '0.0.0.0', port = 8000)
|
|
63
63
|
|
64
64
|
### Finding names in a text using default settings
|
65
65
|
|
66
|
-
You can find format of returning result in [
|
66
|
+
You can find format of returning result in [GNfinder API docs]
|
67
67
|
|
68
68
|
```ruby
|
69
69
|
txt = File.read('utf8-text-with-names.txt')
|
@@ -73,6 +73,18 @@ puts res.names[0].value
|
|
73
73
|
puts res.names[0].odds
|
74
74
|
```
|
75
75
|
|
76
|
+
### Finding names by a URL
|
77
|
+
|
78
|
+
If you need to find names in an HTML page, or a PDF document available on
|
79
|
+
Internet, use `find_url` method.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
url = 'https://en.wikipedia.org/wiki/Monochamus_galloprovincialis'
|
83
|
+
res = gf.find_url(url)
|
84
|
+
puts res.names[0].value
|
85
|
+
puts res.names[0].odds
|
86
|
+
```
|
87
|
+
|
76
88
|
Returned result will have the following methods for each name:
|
77
89
|
|
78
90
|
* value: name-string cleaned up for verification.
|
@@ -159,35 +171,20 @@ res = gf.find_names(txt, verification: true, sources: [1, 4, 179])
|
|
159
171
|
### Combination of parameters.
|
160
172
|
|
161
173
|
It is possible to combine parameters. However if a parameter makes no sense in
|
162
|
-
a particular context
|
174
|
+
a particular context it is silently ignored.
|
163
175
|
|
164
176
|
```ruby
|
165
177
|
# Runs Bayes' algorithms using English training set, runs verification and
|
166
178
|
# returns matched results for 3 data-sources if they are available.
|
167
|
-
res = gf.find_names(txt, language: eng, verification: true,
|
179
|
+
res = gf.find_names(txt, language: 'eng', verification: true,
|
168
180
|
sources: [1, 4, 179])
|
169
181
|
|
170
182
|
# Ignores `sources:` settings, because `with_verification` is not set to `true`
|
171
|
-
res = gf.find_names(txt, language: eng, sources: [1, 4, 179])
|
183
|
+
res = gf.find_names(txt, language: 'eng', sources: [1, 4, 179])
|
172
184
|
```
|
173
185
|
|
174
186
|
## Development
|
175
187
|
|
176
|
-
This gem uses gRPC to access [gnfinder] server. gRPC in turn depends on a
|
177
|
-
protobuf library. If you need to compile Ruby programs with protobuf you need
|
178
|
-
to install [Go] language and download [gnfinder] project.
|
179
|
-
|
180
|
-
```bash
|
181
|
-
go get github.com/gnames/gnfinder
|
182
|
-
```
|
183
|
-
Then you need to run bundle from the root of the project and generate
|
184
|
-
grpc files:
|
185
|
-
|
186
|
-
```bash
|
187
|
-
bundle
|
188
|
-
rake grpc
|
189
|
-
```
|
190
|
-
|
191
188
|
If you get an error, you might need to set a ``GOPATH`` environment variable.
|
192
189
|
|
193
190
|
After starting the server with default host and port (localhost:8778) you will
|
@@ -208,10 +205,10 @@ To run tests without rubocop
|
|
208
205
|
bundle exec rspec
|
209
206
|
```
|
210
207
|
|
211
|
-
[
|
208
|
+
[GNfinder]: https://github.com/gnames/gnfinder
|
212
209
|
[gnfinder recent release]: https://github.com/gnames/gnfinder/releases
|
213
210
|
[Go]: https://golang.org/doc/install
|
214
211
|
[client]: https://github.com/GlobalNamesArchitecture/gnfinder/blob/master/lib/gnfinder/client.rb
|
215
212
|
[data-source list]: http://index.globalnames.org/datasource
|
216
|
-
[
|
217
|
-
[
|
213
|
+
[tests]: https://github.com/GlobalNamesArchitecture/gnfinder/blob/master/spec/lib/client_spec.rb
|
214
|
+
[GNfinder API docs]: https://apidoc.globalnames.org/gnfinder
|
data/Rakefile
CHANGED
@@ -24,16 +24,7 @@ RSpec::Core::RakeTask.new(:rcov) do |spec|
|
|
24
24
|
spec.rcov = true
|
25
25
|
end
|
26
26
|
|
27
|
-
task :grpc do
|
28
|
-
cmd = 'grpc_tools_ruby_protoc ' \
|
29
|
-
'-I $GOPATH/src/github.com/gnames/gnfinder/protob ' \
|
30
|
-
'--ruby_out=lib --grpc_out=lib ' \
|
31
|
-
'$GOPATH/src/github.com/gnames/gnfinder/protob/protob.proto'
|
32
|
-
puts cmd
|
33
|
-
`#{cmd}`
|
34
|
-
end
|
35
|
-
|
36
27
|
require 'rubocop/rake_task'
|
37
28
|
RuboCop::RakeTask.new
|
38
29
|
|
39
|
-
task default: %i[rubocop
|
30
|
+
task default: %i[rubocop spec]
|
data/gnfinder.gemspec
CHANGED
@@ -20,12 +20,14 @@ Gem::Specification.new do |gem|
|
|
20
20
|
.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
21
|
|
22
22
|
gem.require_paths = ['lib']
|
23
|
-
gem.required_ruby_version = '
|
24
|
-
gem.add_dependency '
|
25
|
-
gem.
|
26
|
-
gem.add_development_dependency 'bundler', '~> 2.1'
|
23
|
+
gem.required_ruby_version = '>= 2.6', '< 4'
|
24
|
+
gem.add_dependency 'rest-client', '~> 2.1'
|
25
|
+
gem.add_development_dependency 'bundler', '~> 2.2'
|
27
26
|
gem.add_development_dependency 'byebug', '~> 11.1'
|
28
27
|
gem.add_development_dependency 'rake', '~> 13.0'
|
29
|
-
gem.add_development_dependency 'rspec', '~> 3.
|
30
|
-
gem.add_development_dependency 'rubocop', '~>
|
28
|
+
gem.add_development_dependency 'rspec', '~> 3.10'
|
29
|
+
gem.add_development_dependency 'rubocop', '~> 1.21'
|
30
|
+
gem.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
31
|
+
gem.add_development_dependency 'rubocop-rspec', '~> 2.4'
|
32
|
+
gem.add_development_dependency 'solargraph', '~> 0.43'
|
31
33
|
end
|
data/lib/gnfinder/client.rb
CHANGED
@@ -1,62 +1,79 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Gnfinder
|
4
|
-
GNFINDER_MIN_VERSION = 'v0.10.1'
|
5
|
-
|
6
4
|
# Gnfinder::Client connects to gnfinder server
|
7
5
|
class Client
|
8
|
-
def initialize(host = '
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
raise 'gRPC server of gnfinder should be at least ' \
|
15
|
-
' #{GNFINDER_MIN_VERSION}.\n Download latest version from ' \
|
16
|
-
'https://github.com/gnames/gnfinder/releases/latest.'
|
17
|
-
end
|
18
|
-
|
19
|
-
def good_gnfinder_version(version, min_version)
|
20
|
-
min_ver = min_version[1..].split('.').map(&:to_i)
|
21
|
-
ver = version[1..].split('.').map(&:to_i)
|
22
|
-
return true if ver[0] > min_ver[0] || ver[1] > min_ver[1]
|
23
|
-
|
24
|
-
return true if ver[2] >= min_ver[2]
|
25
|
-
|
26
|
-
false
|
6
|
+
def initialize(host = 'https://gnfinder.globalnames.org', port = '')
|
7
|
+
api_path = '/api/v1'
|
8
|
+
url = host + api_path
|
9
|
+
url = "#{host}:#{port}#{api_path}" if port.to_s != ''
|
10
|
+
@site = RestClient::Resource.new(url, read_timeout: 60)
|
11
|
+
@port = port
|
27
12
|
end
|
28
13
|
|
29
14
|
def gnfinder_version
|
30
|
-
@
|
15
|
+
resp = @site['/version'].get
|
16
|
+
ver = JSON.parse(resp.body, symbolize_names: true)
|
17
|
+
OpenStruct.new(ver)
|
31
18
|
end
|
32
19
|
|
33
20
|
def ping
|
34
|
-
@
|
21
|
+
@site['/ping'].get.body
|
22
|
+
end
|
23
|
+
|
24
|
+
def find_url(url, opts = {})
|
25
|
+
return to_open_struct({ "names": [] }) if url.to_s.strip == ''
|
26
|
+
|
27
|
+
params = { url: url }
|
28
|
+
find(params, opts)
|
35
29
|
end
|
36
30
|
|
37
|
-
# rubocop:disable all
|
38
31
|
def find_names(text, opts = {})
|
39
|
-
if text.to_s.strip == ''
|
40
|
-
return Protob::Output.new
|
41
|
-
end
|
32
|
+
return to_open_struct({ "names": [] }) if text.to_s.strip == ''
|
42
33
|
|
43
34
|
params = { text: text }
|
44
|
-
params
|
35
|
+
find(params, opts)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# rubocop:disable all
|
41
|
+
def find(params, opts = {})
|
42
|
+
params[:noBayes] = true if opts[:no_bayes]
|
43
|
+
params[:oddsDetails] = true if opts[:odds_details]
|
45
44
|
params[:language] = opts[:language] if opts[:language].to_s.strip != ''
|
46
|
-
|
47
|
-
|
45
|
+
|
46
|
+
if opts[:words_around] && opts[:words_around] > 0
|
47
|
+
params[:wordsAround] = opts[:words_around]
|
48
48
|
end
|
49
|
+
|
49
50
|
params[:verification] = true if opts[:verification]
|
51
|
+
|
50
52
|
if opts[:sources] && !opts[:sources].empty?
|
51
53
|
params[:sources] = opts[:sources]
|
52
54
|
end
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
+
res = @site['find'].post params.to_json, {content_type: :json, accept: :json}
|
57
|
+
output = JSON.parse(res.body)
|
58
|
+
res = output["metadata"]
|
59
|
+
res["names"] = output["names"] || []
|
60
|
+
res = res.deep_transform_keys(&:underscore)
|
61
|
+
if res["names"].nil?
|
62
|
+
res["names"] = []
|
56
63
|
end
|
57
|
-
|
58
|
-
@stub.find_names(Protob::Params.new(params))
|
64
|
+
to_open_struct(res)
|
59
65
|
end
|
60
66
|
# rubocop:enable all
|
67
|
+
|
68
|
+
def to_open_struct(obj)
|
69
|
+
case obj
|
70
|
+
when Hash
|
71
|
+
OpenStruct.new(obj.transform_values { |val| to_open_struct(val) })
|
72
|
+
when Array
|
73
|
+
obj.map { |o| to_open_struct(o) }
|
74
|
+
else # Assumed to be a primitive value
|
75
|
+
obj
|
76
|
+
end
|
77
|
+
end
|
61
78
|
end
|
62
79
|
end
|
data/lib/gnfinder/version.rb
CHANGED
data/lib/gnfinder.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'rest-client'
|
4
|
+
require 'json'
|
5
|
+
require_relative 'hash'
|
3
6
|
require_relative 'gnfinder/version'
|
4
|
-
require_relative 'protob_pb.rb'
|
5
|
-
require_relative 'protob_services_pb.rb'
|
6
7
|
require_relative 'gnfinder/client'
|
7
8
|
|
8
9
|
# Gnfinder is a namespace module for gndinfer gem.
|
data/lib/hash.rb
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Monkey patch for underscores.
|
4
|
+
class String
|
5
|
+
def underscore
|
6
|
+
gsub(/::/, '/')
|
7
|
+
.gsub(/([a-z\d])([A-Z])/) do
|
8
|
+
"#{Regexp.last_match(1)}_#{Regexp.last_match(2)}"
|
9
|
+
end
|
10
|
+
.downcase
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Hash monkey patches from ActiveSupport
|
15
|
+
class Hash
|
16
|
+
# Returns a new hash with all keys converted to strings.
|
17
|
+
#
|
18
|
+
# hash = { name: 'Rob', age: '28' }
|
19
|
+
#
|
20
|
+
# hash.stringify_keys
|
21
|
+
# # => {"name"=>"Rob", "age"=>"28"}
|
22
|
+
def stringify_keys
|
23
|
+
transform_keys(&:to_s)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Destructively converts all keys to strings. Same as
|
27
|
+
# +stringify_keys+, but modifies +self+.
|
28
|
+
def stringify_keys!
|
29
|
+
transform_keys!(&:to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns a new hash with all keys converted to symbols, as long as
|
33
|
+
# they respond to +to_sym+.
|
34
|
+
#
|
35
|
+
# hash = { 'name' => 'Rob', 'age' => '28' }
|
36
|
+
#
|
37
|
+
# hash.symbolize_keys
|
38
|
+
# # => {:name=>"Rob", :age=>"28"}
|
39
|
+
def symbolize_keys
|
40
|
+
transform_keys do |key|
|
41
|
+
key.to_sym
|
42
|
+
rescue StandardError
|
43
|
+
key
|
44
|
+
end
|
45
|
+
end
|
46
|
+
alias to_options symbolize_keys
|
47
|
+
|
48
|
+
# Destructively converts all keys to symbols, as long as they respond
|
49
|
+
# to +to_sym+. Same as +symbolize_keys+, but modifies +self+.
|
50
|
+
def symbolize_keys!
|
51
|
+
transform_keys! do |key|
|
52
|
+
key.to_sym
|
53
|
+
rescue StandardError
|
54
|
+
key
|
55
|
+
end
|
56
|
+
end
|
57
|
+
alias to_options! symbolize_keys!
|
58
|
+
|
59
|
+
# Validates all keys in a hash match <tt>*valid_keys</tt>, raising
|
60
|
+
# +ArgumentError+ on a mismatch.
|
61
|
+
#
|
62
|
+
# Note that keys are treated differently than HashWithIndifferentAccess,
|
63
|
+
# meaning that string and symbol keys will not match.
|
64
|
+
def assert_valid_keys(*valid_keys)
|
65
|
+
valid_keys.flatten!
|
66
|
+
each_key do |k|
|
67
|
+
unless valid_keys.include?(k)
|
68
|
+
raise ArgumentError, "Unknown key: #{k.inspect}. Valid keys are: #{valid_keys.map(&:inspect).join(', ')}"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns a new hash with all keys converted by the block operation.
|
74
|
+
# This includes the keys from the root hash and from all
|
75
|
+
# nested hashes and arrays.
|
76
|
+
#
|
77
|
+
# hash = { person: { name: 'Rob', age: '28' } }
|
78
|
+
#
|
79
|
+
# hash.deep_transform_keys{ |key| key.to_s.upcase }
|
80
|
+
# # => {"PERSON"=>{"NAME"=>"Rob", "AGE"=>"28"}}
|
81
|
+
def deep_transform_keys(&block)
|
82
|
+
_deep_transform_keys_in_object(self, &block)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Destructively converts all keys by using the block operation.
|
86
|
+
# This includes the keys from the root hash and from all
|
87
|
+
# nested hashes and arrays.
|
88
|
+
def deep_transform_keys!(&block)
|
89
|
+
_deep_transform_keys_in_object!(self, &block)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns a new hash with all keys converted to strings.
|
93
|
+
# This includes the keys from the root hash and from all
|
94
|
+
# nested hashes and arrays.
|
95
|
+
#
|
96
|
+
# hash = { person: { name: 'Rob', age: '28' } }
|
97
|
+
#
|
98
|
+
# hash.deep_stringify_keys
|
99
|
+
# # => {"person"=>{"name"=>"Rob", "age"=>"28"}}
|
100
|
+
def deep_stringify_keys
|
101
|
+
deep_transform_keys(&:to_s)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Destructively converts all keys to strings.
|
105
|
+
# This includes the keys from the root hash and from all
|
106
|
+
# nested hashes and arrays.
|
107
|
+
def deep_stringify_keys!
|
108
|
+
deep_transform_keys!(&:to_s)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Returns a new hash with all keys converted to symbols, as long as
|
112
|
+
# they respond to +to_sym+. This includes the keys from the root hash
|
113
|
+
# and from all nested hashes and arrays.
|
114
|
+
#
|
115
|
+
# hash = { 'person' => { 'name' => 'Rob', 'age' => '28' } }
|
116
|
+
#
|
117
|
+
# hash.deep_symbolize_keys
|
118
|
+
# # => {:person=>{:name=>"Rob", :age=>"28"}}
|
119
|
+
def deep_symbolize_keys
|
120
|
+
deep_transform_keys do |key|
|
121
|
+
key.to_sym
|
122
|
+
rescue StandardError
|
123
|
+
key
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Destructively converts all keys to symbols, as long as they respond
|
128
|
+
# to +to_sym+. This includes the keys from the root hash and from all
|
129
|
+
# nested hashes and arrays.
|
130
|
+
def deep_symbolize_keys!
|
131
|
+
deep_transform_keys! do |key|
|
132
|
+
key.to_sym
|
133
|
+
rescue StandardError
|
134
|
+
key
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
private
|
139
|
+
|
140
|
+
# Support methods for deep transforming nested hashes and arrays.
|
141
|
+
def _deep_transform_keys_in_object(object, &block)
|
142
|
+
case object
|
143
|
+
when Hash
|
144
|
+
object.each_with_object(self.class.new) do |(key, value), result|
|
145
|
+
result[yield(key)] = _deep_transform_keys_in_object(value, &block)
|
146
|
+
end
|
147
|
+
when Array
|
148
|
+
object.map { |e| _deep_transform_keys_in_object(e, &block) }
|
149
|
+
else
|
150
|
+
object
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
# rubocop:disable all
|
155
|
+
def _deep_transform_keys_in_object!(object, &block)
|
156
|
+
case object
|
157
|
+
when Hash
|
158
|
+
object.each_key do |key|
|
159
|
+
value = object.delete(key)
|
160
|
+
object[yield(key)] = _deep_transform_keys_in_object!(value, &block)
|
161
|
+
end
|
162
|
+
object
|
163
|
+
when Array
|
164
|
+
object.map! { |e| _deep_transform_keys_in_object!(e, &block) }
|
165
|
+
else
|
166
|
+
object
|
167
|
+
end
|
168
|
+
end
|
169
|
+
# rubocop:enable all
|
170
|
+
end
|
metadata
CHANGED
@@ -1,113 +1,141 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gnfinder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Mozzherin
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rest-client
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
34
|
-
type: :
|
33
|
+
version: '2.2'
|
34
|
+
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: byebug
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '11.1'
|
48
48
|
type: :development
|
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: '11.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '13.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '13.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.10'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '3.10'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
89
|
+
version: '1.21'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
96
|
+
version: '1.21'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name: rubocop
|
98
|
+
name: rubocop-rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 0.6.0
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 0.6.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop-rspec
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.4'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '2.4'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: solargraph
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.43'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.43'
|
111
139
|
description: |-
|
112
140
|
The gem searches for scientific names in texts using
|
113
141
|
gRPC server running gnfinder app written in Go language
|
@@ -116,6 +144,7 @@ executables: []
|
|
116
144
|
extensions: []
|
117
145
|
extra_rdoc_files: []
|
118
146
|
files:
|
147
|
+
- ".github/workflows/ruby.yml"
|
119
148
|
- ".gitignore"
|
120
149
|
- ".rspec"
|
121
150
|
- ".rubocop.yml"
|
@@ -128,29 +157,31 @@ files:
|
|
128
157
|
- lib/gnfinder.rb
|
129
158
|
- lib/gnfinder/client.rb
|
130
159
|
- lib/gnfinder/version.rb
|
131
|
-
- lib/
|
132
|
-
- lib/protob_services_pb.rb
|
160
|
+
- lib/hash.rb
|
133
161
|
homepage: http://github.com/GlobalNamesArchitecture/gnfinder
|
134
162
|
licenses:
|
135
163
|
- MIT
|
136
164
|
metadata: {}
|
137
|
-
post_install_message:
|
165
|
+
post_install_message:
|
138
166
|
rdoc_options: []
|
139
167
|
require_paths:
|
140
168
|
- lib
|
141
169
|
required_ruby_version: !ruby/object:Gem::Requirement
|
142
170
|
requirements:
|
143
|
-
- - "
|
171
|
+
- - ">="
|
144
172
|
- !ruby/object:Gem::Version
|
145
173
|
version: '2.6'
|
174
|
+
- - "<"
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '4'
|
146
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
178
|
requirements:
|
148
179
|
- - ">="
|
149
180
|
- !ruby/object:Gem::Version
|
150
181
|
version: '0'
|
151
182
|
requirements: []
|
152
|
-
rubygems_version: 3.
|
153
|
-
signing_key:
|
183
|
+
rubygems_version: 3.2.22
|
184
|
+
signing_key:
|
154
185
|
specification_version: 4
|
155
186
|
summary: Scientific names finder
|
156
187
|
test_files: []
|
data/lib/protob_pb.rb
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# source: protob.proto
|
3
|
-
|
4
|
-
require 'google/protobuf'
|
5
|
-
|
6
|
-
Google::Protobuf::DescriptorPool.generated_pool.build do
|
7
|
-
add_file("protob.proto", :syntax => :proto3) do
|
8
|
-
add_message "protob.Void" do
|
9
|
-
end
|
10
|
-
add_message "protob.Pong" do
|
11
|
-
optional :value, :string, 1
|
12
|
-
end
|
13
|
-
add_message "protob.Version" do
|
14
|
-
optional :version, :string, 1
|
15
|
-
optional :build, :string, 2
|
16
|
-
end
|
17
|
-
add_message "protob.Params" do
|
18
|
-
optional :text, :string, 1
|
19
|
-
optional :no_bayes, :bool, 3
|
20
|
-
optional :language, :string, 4
|
21
|
-
optional :detect_language, :bool, 5
|
22
|
-
optional :verification, :bool, 6
|
23
|
-
optional :tokens_around, :int32, 7
|
24
|
-
repeated :sources, :int32, 8
|
25
|
-
end
|
26
|
-
add_message "protob.Output" do
|
27
|
-
optional :date, :string, 1
|
28
|
-
optional :finder_version, :string, 2
|
29
|
-
optional :language, :string, 3
|
30
|
-
optional :language_detected, :string, 4
|
31
|
-
optional :detect_language, :bool, 5
|
32
|
-
optional :total_tokens, :int32, 6
|
33
|
-
optional :total_candidates, :int32, 7
|
34
|
-
optional :total_names, :int32, 8
|
35
|
-
repeated :names, :message, 9, "protob.NameString"
|
36
|
-
end
|
37
|
-
add_message "protob.NameString" do
|
38
|
-
optional :type, :string, 1
|
39
|
-
optional :verbatim, :string, 2
|
40
|
-
optional :name, :string, 3
|
41
|
-
optional :odds, :float, 4
|
42
|
-
optional :annot_nomen, :string, 5
|
43
|
-
optional :annot_nomen_type, :enum, 6, "protob.AnnotNomenType"
|
44
|
-
optional :offset_start, :int32, 7
|
45
|
-
optional :offset_end, :int32, 8
|
46
|
-
repeated :words_before, :string, 9
|
47
|
-
repeated :words_after, :string, 10
|
48
|
-
optional :verification, :message, 11, "protob.Verification"
|
49
|
-
end
|
50
|
-
add_message "protob.Verification" do
|
51
|
-
optional :best_result, :message, 1, "protob.ResultData"
|
52
|
-
repeated :preferred_results, :message, 2, "protob.ResultData"
|
53
|
-
optional :data_sources_num, :int32, 3
|
54
|
-
optional :data_source_quality, :string, 4
|
55
|
-
optional :retries, :int32, 5
|
56
|
-
optional :error, :string, 6
|
57
|
-
end
|
58
|
-
add_message "protob.ResultData" do
|
59
|
-
optional :data_source_id, :int32, 1
|
60
|
-
optional :data_source_title, :string, 2
|
61
|
-
optional :taxon_id, :string, 3
|
62
|
-
optional :matched_name, :string, 4
|
63
|
-
optional :matched_canonical, :string, 5
|
64
|
-
optional :current_name, :string, 6
|
65
|
-
optional :synonym, :bool, 7
|
66
|
-
optional :classification_path, :string, 8
|
67
|
-
optional :classification_rank, :string, 9
|
68
|
-
optional :classification_ids, :string, 10
|
69
|
-
optional :edit_distance, :int32, 11
|
70
|
-
optional :stem_edit_distance, :int32, 12
|
71
|
-
optional :match_type, :enum, 13, "protob.MatchType"
|
72
|
-
end
|
73
|
-
add_enum "protob.MatchType" do
|
74
|
-
value :NONE, 0
|
75
|
-
value :EXACT, 1
|
76
|
-
value :FUZZY, 2
|
77
|
-
value :PARTIAL_EXACT, 3
|
78
|
-
value :PARTIAL_FUZZY, 4
|
79
|
-
end
|
80
|
-
add_enum "protob.AnnotNomenType" do
|
81
|
-
value :NO_ANNOT, 0
|
82
|
-
value :SP_NOV, 1
|
83
|
-
value :COMB_NOV, 2
|
84
|
-
value :SUBSP_NOV, 3
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
module Protob
|
90
|
-
Void = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Void").msgclass
|
91
|
-
Pong = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Pong").msgclass
|
92
|
-
Version = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Version").msgclass
|
93
|
-
Params = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Params").msgclass
|
94
|
-
Output = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Output").msgclass
|
95
|
-
NameString = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.NameString").msgclass
|
96
|
-
Verification = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.Verification").msgclass
|
97
|
-
ResultData = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.ResultData").msgclass
|
98
|
-
MatchType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.MatchType").enummodule
|
99
|
-
AnnotNomenType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("protob.AnnotNomenType").enummodule
|
100
|
-
end
|
data/lib/protob_services_pb.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
-
# Source: protob.proto for package 'protob'
|
3
|
-
|
4
|
-
require 'grpc'
|
5
|
-
require 'protob_pb'
|
6
|
-
|
7
|
-
module Protob
|
8
|
-
module GNFinder
|
9
|
-
class Service
|
10
|
-
|
11
|
-
include GRPC::GenericService
|
12
|
-
|
13
|
-
self.marshal_class_method = :encode
|
14
|
-
self.unmarshal_class_method = :decode
|
15
|
-
self.service_name = 'protob.GNFinder'
|
16
|
-
|
17
|
-
rpc :Ping, Void, Pong
|
18
|
-
rpc :Ver, Void, Version
|
19
|
-
rpc :FindNames, Params, Output
|
20
|
-
end
|
21
|
-
|
22
|
-
Stub = Service.rpc_stub_class
|
23
|
-
end
|
24
|
-
end
|