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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b945abca3968eede077e541acb662ff00ef8ecb9aaeb156874727b651413422d
4
- data.tar.gz: 9609255c90b14a0f56fed299734a3cbee9035c1a4a63c90c35ba3e0440067b72
3
+ metadata.gz: fbac598ce79e8e9db5ad0fd4f24b5004b2cf4f91d3f5fae0ece871b525d1f488
4
+ data.tar.gz: 36abaa471d385f27ae6bfa32f6f960bb7bc3a1b258b0b2a5402826e41d629d6f
5
5
  SHA512:
6
- metadata.gz: 6b60a9a647c1f1684fd7ad179b889b99b265bfd5d694fa156092bd40455cad9f306e3c367eeb86d5690f5c74faf31b47811fa1cb2c437eb55682b5f00f27555a
7
- data.tar.gz: 9b9e3a6e47b016ed26cd044e4e76b81e2c2d9d8181f337e9487fa8a71133306f1f51677ffc589c27fb853e0e85a70cba09be95937eda06f342c4d89a3bc4216b
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
- [#6]: https://github.com/GlobalNamesArchitecture/gnfinder/issues/5
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 [gnfinder] project written in Go. This gem
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
- - [gnfinder](#gnfinder)
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 gRPC to access a running [gnfinder] server. You can find how
23
- to run it in [gnfinder] README file.
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 [gnfinder] functionality out of Ruby
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 [gnfinder] README file.
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 [proto file] or in [tests]
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. It is silently ignored.
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
- [gnfinder]: https://github.com/gnames/gnfinder
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
- [proto file]: https://github.com/GlobalNamesArchitecture/gnfinder/blob/master/lib/protob_pb.rb
217
- [tests]: https://github.com/GlobalNamesArchitecture/gnfinder/blob/master/spec/lib/client_spec.rb
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 grpc spec]
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 = '~> 2.6'
24
- gem.add_dependency 'grpc', '~> 1.28'
25
- gem.add_dependency 'grpc-tools', '~> 1.28'
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.9'
30
- gem.add_development_dependency 'rubocop', '~> 0.82'
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
@@ -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 = '0.0.0.0', port = '8778')
9
- @stub = Protob::GNFinder::Stub.new("#{host}:#{port}",
10
- :this_channel_is_insecure)
11
- return if good_gnfinder_version(gnfinder_version.version,
12
- GNFINDER_MIN_VERSION)
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
- @stub.ver(Protob::Void.new)
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
- @stub.ping(Protob::Void.new).value
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[:no_bayes] = true if opts[:no_bayes]
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
- if opts[:detect_language]
47
- params[:detect_language] = opts[:detect_language]
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
- if opts[:tokens_around] && opts[:tokens_around] > 0
55
- params[:tokens_around] = opts[:tokens_around]
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
@@ -3,7 +3,7 @@
3
3
  # Gnfinder is a namespace module for gndinfer gem.
4
4
  module Gnfinder
5
5
  # Version corresponds to the minimal supported version of Go gnfinder
6
- VERSION = '0.10.1'
6
+ VERSION = '0.15.5'
7
7
 
8
8
  def self.version
9
9
  VERSION
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.10.1
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: 2020-04-25 00:00:00.000000000 Z
11
+ date: 2021-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: grpc
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.28'
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.28'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: grpc-tools
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.28'
34
- type: :runtime
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: '1.28'
40
+ version: '2.2'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: byebug
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '2.1'
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: '2.1'
54
+ version: '11.1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: byebug
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '11.1'
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: '11.1'
68
+ version: '13.0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '13.0'
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: '13.0'
82
+ version: '3.10'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec
84
+ name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '3.9'
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: '3.9'
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: '0.82'
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: '0.82'
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/protob_pb.rb
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.0.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
@@ -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