linguin 1.1.0 → 2.0.0
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/.rubocop.yml +5 -1
- data/README.md +19 -9
- data/lib/linguin.rb +16 -6
- data/lib/linguin/{bulk_detection.rb → bulk_language_detection.rb} +3 -3
- data/lib/linguin/bulk_profanity_detection.rb +37 -0
- data/lib/linguin/client.rb +40 -15
- data/lib/linguin/{detection.rb → language_detection.rb} +3 -3
- data/lib/linguin/profanity_detection.rb +37 -0
- data/lib/linguin/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d1af43a17413610039ec33597126a4d33b6f783b57a2a77e16b612530818242
|
4
|
+
data.tar.gz: 5fc45e06d4a565b456069010c429f64c8b992fef7f6723ac90b9a7d78594099f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cb9fddd4dda04e5457db7a0cd190fba098ace5c356fcd6f0402099bcb5a3b20eeee197a2ee5d46b269d1eab389543381f93c931869114c475c9d64292f953d6
|
7
|
+
data.tar.gz: 3ccc21471b50b8e3dd31b7a1cf2f18e4d11eb49bab233113a8c0789b12169be5792c567cf9a6f3d82a5cc788d8aa3e4527cea52729d28d60f55837991e74cc80
|
data/.rubocop.yml
CHANGED
@@ -11,7 +11,7 @@ Layout/LineLength:
|
|
11
11
|
Layout/EmptyLineBetweenDefs:
|
12
12
|
AllowAdjacentOneLineDefs: true
|
13
13
|
Metrics/MethodLength:
|
14
|
-
Max:
|
14
|
+
Max: 16
|
15
15
|
Gemspec/DateAssignment: # (new in 1.10)
|
16
16
|
Enabled: true
|
17
17
|
Layout/SpaceBeforeBrackets: # (new in 1.7)
|
@@ -80,3 +80,7 @@ Style/MultilineInPatternThen: # (new in 1.16)
|
|
80
80
|
Enabled: true
|
81
81
|
Style/QuotedSymbols: # (new in 1.16)
|
82
82
|
Enabled: true
|
83
|
+
Layout/LineEndStringConcatenationIndentation: # (new in 1.18)
|
84
|
+
Enabled: true
|
85
|
+
Naming/InclusiveLanguage: # (new in 1.18)
|
86
|
+
Enabled: true
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/linguin)  [](https://github.com/testdouble/standard)
|
4
4
|
|
5
|
-
This is a Ruby wrapper for the [Linguin AI](https://linguin.ai) API (see [API docs](https://linguin.ai/api-docs/
|
5
|
+
This is a Ruby wrapper for the [Linguin AI](https://linguin.ai) API (see [API docs](https://linguin.ai/api-docs/v2)) providing Language and Profanity Detection as a Service.
|
6
6
|
|
7
7
|
Linguin AI is free for up to 100 detections per day. You can get your API key [here](https://linguin.ai).
|
8
8
|
|
@@ -31,21 +31,25 @@ require "linguin"
|
|
31
31
|
|
32
32
|
Linguin.api_key = "YOUR-API-KEY" # goto https://linguin.ai to get your key
|
33
33
|
|
34
|
-
response = Linguin.
|
34
|
+
response = Linguin.detect_language("test")
|
35
35
|
response.success? # => true
|
36
36
|
response.results # => [{ lang: "en", confidence: 0.97 }, ...]
|
37
|
+
|
38
|
+
response = Linguin.detect_profanity("you are a moron")
|
39
|
+
response.success? # => true
|
40
|
+
response.score # => 0.998
|
37
41
|
```
|
38
42
|
|
39
43
|
If something goes wrong (here: empty text):
|
40
44
|
|
41
45
|
```ruby
|
42
|
-
response = Linguin.
|
46
|
+
response = Linguin.detect_language("")
|
43
47
|
response.success? # => false
|
44
48
|
response.error
|
45
49
|
# => { code: 400, message: "The language of an empty text is more of a philosophical question." }
|
46
50
|
|
47
|
-
# if you prefer to handle exceptions instead you can use `#
|
48
|
-
response = Linguin.
|
51
|
+
# if you prefer to handle exceptions instead you can use `#detect_language!`:
|
52
|
+
response = Linguin.detect_language!("")
|
49
53
|
# => raises Linguin::InputError
|
50
54
|
```
|
51
55
|
|
@@ -54,19 +58,25 @@ See the list of all exceptions [here](https://github.com/LinguinAI/linguin-ruby/
|
|
54
58
|
### Bulk detection
|
55
59
|
|
56
60
|
To detect the language of multiple texts with one API call, you can pass them as an array. The results will be returned in the same order as the texts.
|
57
|
-
All texts have to not be empty. Using `
|
61
|
+
All texts have to not be empty. Using `detect_language!` will result in an exception as for single detections.
|
62
|
+
|
63
|
+
The same is true for profanity detection: calling `detect_profanity!` with empty texts will result in an exception as for single detections.
|
58
64
|
|
59
65
|
```ruby
|
60
|
-
response = Linguin.
|
66
|
+
response = Linguin.detect_language(["test", "bahnhof", "12341234"])
|
61
67
|
response.results
|
62
68
|
# => [ [{ lang: "en", confidence: 0.97 }, ...], [{ ... }], [] ]
|
63
69
|
|
64
|
-
response = Linguin.
|
70
|
+
response = Linguin.detect_profanity(["a test", "you are a moron"])
|
71
|
+
response.scores
|
72
|
+
# => [0.0124, 0.9981]
|
73
|
+
|
74
|
+
response = Linguin.detect_language(["test", ""])
|
65
75
|
response.success? # => false
|
66
76
|
response.error
|
67
77
|
# => { code: 400, message: "At least one of the texts provided was empty." }
|
68
78
|
|
69
|
-
Linguin.
|
79
|
+
Linguin.detect_language!(["test", ""])
|
70
80
|
# => raises Linguin::InputError
|
71
81
|
```
|
72
82
|
|
data/lib/linguin.rb
CHANGED
@@ -4,8 +4,10 @@ require_relative "linguin/version"
|
|
4
4
|
require_relative "linguin/exceptions"
|
5
5
|
require_relative "linguin/client"
|
6
6
|
require_relative "linguin/base_response"
|
7
|
-
require_relative "linguin/
|
8
|
-
require_relative "linguin/
|
7
|
+
require_relative "linguin/language_detection"
|
8
|
+
require_relative "linguin/profanity_detection"
|
9
|
+
require_relative "linguin/bulk_language_detection"
|
10
|
+
require_relative "linguin/bulk_profanity_detection"
|
9
11
|
require_relative "linguin/status"
|
10
12
|
require_relative "linguin/languages"
|
11
13
|
|
@@ -36,12 +38,20 @@ module Linguin
|
|
36
38
|
default_client.api_key = api_key
|
37
39
|
end
|
38
40
|
|
39
|
-
def
|
40
|
-
default_client.
|
41
|
+
def detect_language(text)
|
42
|
+
default_client.detect_language(text)
|
41
43
|
end
|
42
44
|
|
43
|
-
def
|
44
|
-
default_client.
|
45
|
+
def detect_language!(text)
|
46
|
+
default_client.detect_language!(text)
|
47
|
+
end
|
48
|
+
|
49
|
+
def detect_profanity(text)
|
50
|
+
default_client.detect_profanity(text)
|
51
|
+
end
|
52
|
+
|
53
|
+
def detect_profanity!(text)
|
54
|
+
default_client.detect_profanity!(text)
|
45
55
|
end
|
46
56
|
|
47
57
|
def status
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Linguin
|
4
|
-
# == Linguin::
|
5
|
-
# Returned by Linguin#
|
4
|
+
# == Linguin::BulkLanguageDetection
|
5
|
+
# Returned by Linguin#detect_language(!) when called with an array of strings.
|
6
6
|
#
|
7
7
|
# #success? - Bool - checks if detection results were found
|
8
8
|
# #error - Hash - contains `error` and `message` about what went wrong
|
9
9
|
# #results - Array - contains the detection results for each text, ordered by confidence descending
|
10
|
-
class
|
10
|
+
class BulkLanguageDetection < LanguageDetection; end
|
11
11
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Linguin
|
4
|
+
# == Linguin::BulkProfanityDetection
|
5
|
+
# Returned by Linguin#detect_profanity(!) when called with an array of strings.
|
6
|
+
#
|
7
|
+
# #success? - Bool - checks if detection results were found
|
8
|
+
# #error - Hash - contains `error` and `message` about what went wrong
|
9
|
+
# #results - Array - contains the profanity scores of each text in the same order
|
10
|
+
class BulkProfanityDetection < BaseResponse
|
11
|
+
attr_writer :success
|
12
|
+
attr_accessor :scores
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def error(code, message)
|
16
|
+
new do |detection|
|
17
|
+
detection.success = false
|
18
|
+
detection.error = {
|
19
|
+
code: code,
|
20
|
+
message: message
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def success(result)
|
26
|
+
new do |detection|
|
27
|
+
detection.success = true
|
28
|
+
detection.scores = result[:scores]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def success?
|
34
|
+
!!@success
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/linguin/client.rb
CHANGED
@@ -9,7 +9,7 @@ module Linguin
|
|
9
9
|
class Client
|
10
10
|
include HTTParty
|
11
11
|
|
12
|
-
base_uri "https://api.linguin.ai/
|
12
|
+
base_uri "https://api.linguin.ai/v2"
|
13
13
|
|
14
14
|
# we are parsing the JSON response in Linguin::BaseResponse
|
15
15
|
# in order to have symbolized keys
|
@@ -26,34 +26,41 @@ module Linguin
|
|
26
26
|
configure_api_key(key)
|
27
27
|
end
|
28
28
|
|
29
|
-
def
|
29
|
+
def detect_language(text)
|
30
30
|
ensure_api_key!
|
31
31
|
|
32
|
-
return
|
32
|
+
return bulk_detect_language(text) if text.is_a?(Array)
|
33
33
|
|
34
34
|
text = sanitize(text)
|
35
35
|
|
36
|
-
|
36
|
+
if text.empty?
|
37
|
+
return LanguageDetection.error(400,
|
38
|
+
"The language of an empty text is more of a philosophical question.")
|
39
|
+
end
|
37
40
|
|
38
|
-
httparty_response = self.class.post("/detect", headers: headers, body: { q: text })
|
39
|
-
|
41
|
+
httparty_response = self.class.post("/detect/language", headers: headers, body: { q: text })
|
42
|
+
LanguageDetection.from_httparty(response: httparty_response)
|
40
43
|
end
|
41
44
|
|
42
|
-
def
|
43
|
-
|
45
|
+
def detect_language!(text)
|
46
|
+
detect_language(text).raise_on_error!
|
44
47
|
end
|
45
48
|
|
46
|
-
def
|
47
|
-
|
49
|
+
def detect_profanity(text)
|
50
|
+
ensure_api_key!
|
51
|
+
|
52
|
+
return bulk_detect_profanity(text) if text.is_a?(Array)
|
53
|
+
|
54
|
+
text = text&.strip
|
48
55
|
|
49
|
-
return
|
56
|
+
return ProfanityDetection.error(400, "Can an empty text have profanity in it? I doubt it.") if text.to_s.empty?
|
50
57
|
|
51
|
-
httparty_response = self.class.post("/
|
52
|
-
|
58
|
+
httparty_response = self.class.post("/detect/profanity", headers: headers, body: { q: text })
|
59
|
+
ProfanityDetection.from_httparty(response: httparty_response)
|
53
60
|
end
|
54
61
|
|
55
|
-
def
|
56
|
-
|
62
|
+
def detect_profanity!(text)
|
63
|
+
detect_profanity(text).raise_on_error!
|
57
64
|
end
|
58
65
|
|
59
66
|
def status
|
@@ -69,6 +76,24 @@ module Linguin
|
|
69
76
|
|
70
77
|
private
|
71
78
|
|
79
|
+
def bulk_detect_language(texts)
|
80
|
+
texts = texts.map { |text| sanitize(text) }
|
81
|
+
|
82
|
+
return BulkLanguageDetection.error(400, "At least one of the texts provided was empty.") if texts.any?(&:empty?)
|
83
|
+
|
84
|
+
httparty_response = self.class.post("/bulk_detect/language", headers: headers, body: { q: texts })
|
85
|
+
BulkLanguageDetection.from_httparty(response: httparty_response)
|
86
|
+
end
|
87
|
+
|
88
|
+
def bulk_detect_profanity(texts)
|
89
|
+
texts.map! { |text| text.to_s.strip }
|
90
|
+
|
91
|
+
return BulkProfanityDetection.error(400, "At least one of the texts provided was empty.") if texts.any?(&:empty?)
|
92
|
+
|
93
|
+
httparty_response = self.class.post("/bulk_detect/profanity", headers: headers, body: { q: texts })
|
94
|
+
BulkProfanityDetection.from_httparty(response: httparty_response)
|
95
|
+
end
|
96
|
+
|
72
97
|
def configure_api_key(key)
|
73
98
|
@api_key = key
|
74
99
|
self.headers = { "Authorization" => "Bearer #{key}" }
|
@@ -1,13 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Linguin
|
4
|
-
# == Linguin::
|
5
|
-
# Returned by Linguin#
|
4
|
+
# == Linguin::LanguageDetection
|
5
|
+
# Returned by Linguin#detect_language(!).
|
6
6
|
#
|
7
7
|
# #success? - Bool - checks if detection results were found
|
8
8
|
# #error - Hash - contains `error` and `message` about what went wrong
|
9
9
|
# #results - Array - contains the detection results, ordered by confidence descending
|
10
|
-
class
|
10
|
+
class LanguageDetection < BaseResponse
|
11
11
|
attr_writer :success
|
12
12
|
attr_accessor :results
|
13
13
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Linguin
|
4
|
+
# == Linguin::ProfanityDetection
|
5
|
+
# Returned by Linguin#detect_profanity(!).
|
6
|
+
#
|
7
|
+
# #success? - Bool - checks if detection results were found
|
8
|
+
# #error - Hash - contains `error` and `message` about what went wrong
|
9
|
+
# #result - Float - profanity score 0.0..1.0
|
10
|
+
class ProfanityDetection < BaseResponse
|
11
|
+
attr_writer :success
|
12
|
+
attr_accessor :score
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def error(code, message)
|
16
|
+
new do |detection|
|
17
|
+
detection.success = false
|
18
|
+
detection.error = {
|
19
|
+
code: code,
|
20
|
+
message: message
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def success(result)
|
26
|
+
new do |detection|
|
27
|
+
detection.success = true
|
28
|
+
detection.score = result[:score]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def success?
|
34
|
+
!!@success
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/linguin/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: linguin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Schwenzien
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -129,11 +129,13 @@ files:
|
|
129
129
|
- bin/setup
|
130
130
|
- lib/linguin.rb
|
131
131
|
- lib/linguin/base_response.rb
|
132
|
-
- lib/linguin/
|
132
|
+
- lib/linguin/bulk_language_detection.rb
|
133
|
+
- lib/linguin/bulk_profanity_detection.rb
|
133
134
|
- lib/linguin/client.rb
|
134
|
-
- lib/linguin/detection.rb
|
135
135
|
- lib/linguin/exceptions.rb
|
136
|
+
- lib/linguin/language_detection.rb
|
136
137
|
- lib/linguin/languages.rb
|
138
|
+
- lib/linguin/profanity_detection.rb
|
137
139
|
- lib/linguin/status.rb
|
138
140
|
- lib/linguin/version.rb
|
139
141
|
- linguin.gemspec
|