glosbe-translate 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ea808d61d9cd3ef928234514027a064f0a16c98
4
+ data.tar.gz: cd753d4ebb5390f48fed82da7f15cc95a027c6f6
5
+ SHA512:
6
+ metadata.gz: 6349b8926cc07a70eef7d4e610626cbaf86bc28768a38ba4af5507102a3c11dae2c707528ebe1f924f4edc1b20695238d75de9498fda5dc788222ddc7b7e3336
7
+ data.tar.gz: a248b6197a945174998a7337cfa20294469b391e39d63e0e080cdfaaffe7d0aba0b6856eb56cf892e5d9e72ffad59440818621c00722f14cb4ba31969d999e4d
@@ -0,0 +1,27 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+ /.rspec_status
13
+ /Gemfile.lock
14
+
15
+ # Used by dotenv library to load environment variables.
16
+ .env
17
+
18
+ ## Documentation cache and generated files:
19
+ /.yardoc/
20
+ /_yardoc/
21
+ /doc/
22
+ /rdoc/
23
+
24
+ ## Environment normalization:
25
+ /.bundle/
26
+ /vendor/bundle
27
+ /lib/bundler/man/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.15.3
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2017 Kevin McPhillips
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,213 @@
1
+ # Glosbe translate
2
+
3
+ [![Build Status](https://travis-ci.org/kmcphillips/glosbe-translate.svg?branch=master)](https://travis-ci.org/kmcphillips/glosbe-translate)
4
+
5
+ Wrapper around the [Glosbe](https://glosbe.com) online multilingual dictionary. Translate and get definitions of words between languages.
6
+
7
+ See a [full list of supported languages](https://glosbe.com/all-languages).
8
+
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'glosbe-translate'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install glosbe-translate
25
+
26
+
27
+ ## Usage
28
+
29
+ ### Language codes
30
+
31
+ All translations and definitions take the [ISO-639]((http://en.wikipedia.org/wiki/List_of_ISO_639-3_codes)) languages codes as `to` and `from` in either the two or three character versions. Glosbe supports a [long list of languages](https://glosbe.com/all-languages).
32
+
33
+
34
+ ### Single lookups
35
+
36
+ Class methods on the language object that allow you to do a single lookup:
37
+
38
+ ```ruby
39
+ Glosbe::Language.translate("please", from: :en, to: :nl)
40
+ => "alstublieft"
41
+ ```
42
+
43
+ Fetch an array of definitions in the `from` language:
44
+ ```ruby
45
+ Glosbe::Language.define("pineapple", from: :en, to: :fr)
46
+ => ["fruit",
47
+ "Large sweet fleshy tropical fruit with a terminal tuft of stiff leaves.",
48
+ "plant"]
49
+ ```
50
+
51
+ Fetch an array of definitions in the `to` language:
52
+ ```ruby
53
+ Glosbe::Language.translated_define("pie", from: :en, to: :fr)
54
+ => ["Plat constitué de viandes, fruits ou autres nourriture cuits dans ou sur une pâte.",
55
+ "Plat, préparation à base de pâte aplatie au rouleau, et d’une garniture salée ou sucrée"]
56
+ ```
57
+
58
+ Any of the three above methods can also use the simpler key value pair of `from: :to` languages:
59
+
60
+ ```ruby
61
+ Glosbe::Language.translate("fromage", fr: :en)
62
+ => "cheese"
63
+ ```
64
+
65
+ ## Language object
66
+
67
+ Translations and definitions are done from a `Language` object:
68
+
69
+ ```ruby
70
+ language = Glosbe::Language.new(from: "eng", to: "nld")
71
+ ```
72
+
73
+ Symbols and strings are accepted, and the language code will be converted to match what is expected by the API.
74
+
75
+ The same three methods are available to translate and define a phrase using this object:
76
+
77
+ ```ruby
78
+ language.translate("please", from: :en, to: :nl)
79
+ => "alstublieft"
80
+ ```
81
+
82
+ ```ruby
83
+ language.define("pineapple", from: :en, to: :fr)
84
+ => ["fruit",
85
+ "Large sweet fleshy tropical fruit with a terminal tuft of stiff leaves.",
86
+ "plant"]
87
+ ```
88
+
89
+ ```ruby
90
+ language.translated_define("pie", from: :en, to: :fr)
91
+ => ["Plat constitué de viandes, fruits ou autres nourriture cuits dans ou sur une pâte.",
92
+ "Plat, préparation à base de pâte aplatie au rouleau, et d’une garniture salée ou sucrée"]
93
+ ```
94
+
95
+
96
+ ### Response object
97
+
98
+ Doing a lookup will return a `Response` object:
99
+
100
+ ```ruby
101
+ response = language.lookup("coffee")
102
+ ```
103
+
104
+ The response represents all the fields returned from the API in a very similar structure.
105
+
106
+ Was the HTTP a 200 OK?
107
+ ```
108
+ response.success?
109
+ => true
110
+ ```
111
+
112
+ Were any results returned?
113
+ ```
114
+ response.found?
115
+ => true
116
+ ```
117
+
118
+ Fields in the response are directly mapped for convenience:
119
+ ```ruby
120
+ response.from
121
+ => "en"
122
+ response.to
123
+ => "nl"
124
+ response.phrase
125
+ => "coffee"
126
+ ```
127
+
128
+ There can sometimes be messages returned from the server. This is particularly interesting for rate limiting warnings:
129
+ ```ruby
130
+ response.messages
131
+ => []
132
+ ```
133
+
134
+ Convenience methods extract the same three functions and return values repeated above:
135
+
136
+ ```ruby
137
+ response.translation
138
+ response.define
139
+ response.translated_define
140
+ ```
141
+
142
+ The raw results matching the structure of the API are available here.
143
+
144
+
145
+ ### Results
146
+
147
+ The list of all results is available from a response:
148
+
149
+ ```ruby
150
+ response.results
151
+ => [...]
152
+ ```
153
+
154
+ Each result object has the translated phrase if present;
155
+
156
+ ```ruby
157
+ result.phrase
158
+ => "koffie"
159
+ ```
160
+
161
+ The result then lists its authors:
162
+
163
+ ```ruby
164
+ result.authors
165
+ => [...]
166
+ ```
167
+
168
+ And its meanings:
169
+
170
+ ```ruby
171
+ result.meanings
172
+ => [...]
173
+ ```
174
+
175
+ Each meaning has language and text:
176
+
177
+ ```ruby
178
+ meaning.text
179
+ => "Een drank bekomen door infusie van de bonen van de koffieplant in heet water."
180
+ meaning.language
181
+ => "nl"
182
+ ```
183
+
184
+ None of these fields are guaranteed to exist. Though they will return a string or `nil` for value fields, and will always return an empty array for collection fields.
185
+
186
+
187
+ ## Logging
188
+
189
+ Logging is defaulted to `nil`, but can be passed any `Logger` object to debug network requests.
190
+
191
+ ```ruby
192
+ Glosbe.logger = Logger.new("glosbe.log")
193
+ Glosbe.logger = Rails.logger
194
+ ```
195
+
196
+
197
+ ## Development
198
+
199
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
200
+
201
+ To install this gem onto your local machine, run `bundle exec rake install`.
202
+
203
+
204
+ ## Contributing
205
+
206
+ Bug reports and pull requests are welcome on GitHub at https://github.com/kmcphillips/glosbe-translate.
207
+
208
+ Come talk to me about what you're working on. I'd love to review PRs if you find bugs or think of improvements.
209
+
210
+
211
+ ## License
212
+
213
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "glosbe/translate"
5
+
6
+ require "pry"
7
+
8
+ Pry.start
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "glosbe/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "glosbe-translate"
8
+ spec.version = Glosbe::VERSION
9
+ spec.authors = ["Kevin McPhillips"]
10
+ spec.email = ["github@kevinmcphillips.ca"]
11
+
12
+ spec.summary = %q{Use https://glosbe.com to translate and define words and phrases}
13
+ spec.description = %q{Wrapper around the JSON api on the Glosbe online multilingual dictionary. Return definitions and translations.}
14
+ spec.homepage = "https://github.com/kmcphillips/glosbe-translate"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency "httparty", "~> 0.15"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.15"
27
+ spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec", "~> 3.0"
29
+ spec.add_development_dependency "vcr", "~> 3.0"
30
+ spec.add_development_dependency "webmock", "~> 3.0"
31
+ spec.add_development_dependency "pry", "~> 0.10"
32
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ require "glosbe/version"
3
+
4
+ require "httparty"
5
+ require "cgi"
6
+ require "logger"
7
+
8
+ module Glosbe
9
+ extend self
10
+ attr_accessor :logger
11
+ self.logger = Logger.new(nil)
12
+ end
13
+
14
+ require "glosbe/http"
15
+ require "glosbe/language_code"
16
+ require "glosbe/language"
17
+ require "glosbe/author"
18
+ require "glosbe/meaning"
19
+ require "glosbe/result"
20
+ require "glosbe/response"
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::Author
3
+ attr_reader :id, :name, :source, :url
4
+
5
+ def initialize(data)
6
+ @id = data["id"]
7
+ @name = data["N"]
8
+ @source = data["U"]
9
+ @url = data["url"]
10
+ end
11
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::HTTP
3
+ attr_reader :body, :ok
4
+ alias_method :ok?, :ok
5
+
6
+ include HTTParty
7
+ base_uri "https://glosbe.com/gapi"
8
+ logger Glosbe.logger, :debug, :curl
9
+
10
+ def initialize(from:, to:, phrase:)
11
+ Glosbe.logger.debug("[Glosbe::HTTP] request from=#{from} to=#{to} phrase=#{phrase}")
12
+
13
+ response = self.class.get("/translate",
14
+ query: {
15
+ from: from,
16
+ dest: to,
17
+ phrase: phrase,
18
+ format: "json",
19
+ pretty: "true",
20
+ }
21
+ )
22
+
23
+ Glosbe.logger.debug("[Glosbe::HTTP] response code=#{response.code}")
24
+ Glosbe.logger.debug("[Glosbe::HTTP] response body=#{response.body}")
25
+
26
+ @ok = response.ok?
27
+ @body = response.ok? ? response.parsed_response : nil
28
+ end
29
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::Language
3
+ class << self
4
+ def translate(phrase, args)
5
+ from, to = extract_lanuages(args)
6
+ self.new(from: from, to: to).translate(phrase)
7
+ end
8
+
9
+ def define(phrase, args)
10
+ from, to = extract_lanuages(args)
11
+ self.new(from: from, to: to).define(phrase)
12
+ end
13
+
14
+ def translated_define(phrase, args)
15
+ from, to = extract_lanuages(args)
16
+ self.new(from: from, to: to).translated_define(phrase)
17
+ end
18
+
19
+ private
20
+
21
+ def extract_lanuages(args)
22
+ raise ArgumentError, "expected hash but received #{args.class}" unless args.is_a?(Hash)
23
+
24
+ if args.keys.sort == [:from, :to]
25
+ [args[:from], args[:to]]
26
+ elsif args.size == 1
27
+ args.first
28
+ else
29
+ raise ArgumentError, "languages must be specified as `from: :aaa, to: :bbb` or `aaa: :bbb`"
30
+ end
31
+ end
32
+ end
33
+
34
+ attr_reader :from, :to
35
+
36
+ def initialize(from:, to:)
37
+ @from = parse_language(from)
38
+ @to = parse_language(to)
39
+ end
40
+
41
+ def lookup(phrase)
42
+ http = Glosbe::HTTP.new(from: from, to: to, phrase: phrase)
43
+ Glosbe::Response.new(http.body, ok: http.ok?)
44
+ end
45
+
46
+ def translate(phrase)
47
+ lookup(phrase).translation
48
+ end
49
+
50
+ def define(phrase)
51
+ lookup(phrase).define
52
+ end
53
+
54
+ def translated_define(phrase)
55
+ lookup(phrase).translated_define
56
+ end
57
+
58
+ private
59
+
60
+ def parse_language(value)
61
+ value = value.to_s if value
62
+ raise ArgumentError, "Language must be a string or a symbol. Received `#{ value }`." unless value.is_a?(String)
63
+ raise ArgumentError, "Language must the 2 or 3 character ISO-639 code. Received `#{ value }`. "\
64
+ "http://en.wikipedia.org/wiki/List_of_ISO_639-3_codes https://glosbe.com/all-languages" unless (2..3).include?(value.length)
65
+ Glosbe::LanguageCode.normalize(value)
66
+ end
67
+ end
@@ -0,0 +1,216 @@
1
+ module Glosbe::LanguageCode
2
+ extend self
3
+
4
+ CODES = {
5
+ "aar"=>"aa",
6
+ "abk"=>"ab",
7
+ "afr"=>"af",
8
+ "aka"=>"ak",
9
+ "alb"=>"sq",
10
+ "sqi"=>"sq",
11
+ "amh"=>"am",
12
+ "ara"=>"ar",
13
+ "arg"=>"an",
14
+ "arm"=>"hy",
15
+ "hye"=>"hy",
16
+ "asm"=>"as",
17
+ "ava"=>"av",
18
+ "ave"=>"ae",
19
+ "aym"=>"ay",
20
+ "aze"=>"az",
21
+ "bak"=>"ba",
22
+ "bam"=>"bm",
23
+ "baq"=>"eu",
24
+ "eus"=>"eu",
25
+ "bel"=>"be",
26
+ "ben"=>"bn",
27
+ "bih"=>"bh",
28
+ "bis"=>"bi",
29
+ "tib"=>"bo",
30
+ "bod"=>"bo",
31
+ "bos"=>"bs",
32
+ "bre"=>"br",
33
+ "bul"=>"bg",
34
+ "bur"=>"my",
35
+ "mya"=>"my",
36
+ "cat"=>"ca",
37
+ "cze"=>"cs",
38
+ "ces"=>"cs",
39
+ "cha"=>"ch",
40
+ "che"=>"ce",
41
+ "chi"=>"zh",
42
+ "zho"=>"zh",
43
+ "chu"=>"cu",
44
+ "chv"=>"cv",
45
+ "cor"=>"kw",
46
+ "cos"=>"co",
47
+ "cre"=>"cr",
48
+ "wel"=>"cy",
49
+ "cym"=>"cy",
50
+ "dan"=>"da",
51
+ "ger"=>"de",
52
+ "deu"=>"de",
53
+ "div"=>"dv",
54
+ "dut"=>"nl",
55
+ "nld"=>"nl",
56
+ "dzo"=>"dz",
57
+ "gre"=>"el",
58
+ "ell"=>"el",
59
+ "eng"=>"en",
60
+ "epo"=>"eo",
61
+ "est"=>"et",
62
+ "ewe"=>"ee",
63
+ "fao"=>"fo",
64
+ "per"=>"fa",
65
+ "fas"=>"fa",
66
+ "fij"=>"fj",
67
+ "fin"=>"fi",
68
+ "fre"=>"fr",
69
+ "fra"=>"fr",
70
+ "fry"=>"fy",
71
+ "ful"=>"ff",
72
+ "geo"=>"ka",
73
+ "kat"=>"ka",
74
+ "gla"=>"gd",
75
+ "gle"=>"ga",
76
+ "glg"=>"gl",
77
+ "glv"=>"gv",
78
+ "grn"=>"gn",
79
+ "guj"=>"gu",
80
+ "hat"=>"ht",
81
+ "hau"=>"ha",
82
+ "heb"=>"he",
83
+ "her"=>"hz",
84
+ "hin"=>"hi",
85
+ "hmo"=>"ho",
86
+ "hrv"=>"hr",
87
+ "hun"=>"hu",
88
+ "ibo"=>"ig",
89
+ "ice"=>"is",
90
+ "isl"=>"is",
91
+ "ido"=>"io",
92
+ "iii"=>"ii",
93
+ "iku"=>"iu",
94
+ "ile"=>"ie",
95
+ "ina"=>"ia",
96
+ "ind"=>"id",
97
+ "ipk"=>"ik",
98
+ "ita"=>"it",
99
+ "jav"=>"jv",
100
+ "jpn"=>"ja",
101
+ "kal"=>"kl",
102
+ "kan"=>"kn",
103
+ "kas"=>"ks",
104
+ "kau"=>"kr",
105
+ "kaz"=>"kk",
106
+ "khm"=>"km",
107
+ "kik"=>"ki",
108
+ "kin"=>"rw",
109
+ "kir"=>"ky",
110
+ "kom"=>"kv",
111
+ "kon"=>"kg",
112
+ "kor"=>"ko",
113
+ "kua"=>"kj",
114
+ "kur"=>"ku",
115
+ "lao"=>"lo",
116
+ "lat"=>"la",
117
+ "lav"=>"lv",
118
+ "lim"=>"li",
119
+ "lin"=>"ln",
120
+ "lit"=>"lt",
121
+ "ltz"=>"lb",
122
+ "lub"=>"lu",
123
+ "lug"=>"lg",
124
+ "mac"=>"mk",
125
+ "mkd"=>"mk",
126
+ "mah"=>"mh",
127
+ "mal"=>"ml",
128
+ "mao"=>"mi",
129
+ "mri"=>"mi",
130
+ "mar"=>"mr",
131
+ "may"=>"ms",
132
+ "msa"=>"ms",
133
+ "mlg"=>"mg",
134
+ "mlt"=>"mt",
135
+ "mon"=>"mn",
136
+ "nau"=>"na",
137
+ "nav"=>"nv",
138
+ "nbl"=>"nr",
139
+ "nde"=>"nd",
140
+ "ndo"=>"ng",
141
+ "nep"=>"ne",
142
+ "nno"=>"nn",
143
+ "nob"=>"nb",
144
+ "nor"=>"no",
145
+ "nya"=>"ny",
146
+ "oci"=>"oc",
147
+ "oji"=>"oj",
148
+ "ori"=>"or",
149
+ "orm"=>"om",
150
+ "oss"=>"os",
151
+ "pan"=>"pa",
152
+ "pli"=>"pi",
153
+ "pol"=>"pl",
154
+ "por"=>"pt",
155
+ "pus"=>"ps",
156
+ "que"=>"qu",
157
+ "roh"=>"rm",
158
+ "rum"=>"ro",
159
+ "ron"=>"ro",
160
+ "run"=>"rn",
161
+ "rus"=>"ru",
162
+ "sag"=>"sg",
163
+ "san"=>"sa",
164
+ "sin"=>"si",
165
+ "slo"=>"sk",
166
+ "slk"=>"sk",
167
+ "slv"=>"sl",
168
+ "sme"=>"se",
169
+ "smo"=>"sm",
170
+ "sna"=>"sn",
171
+ "snd"=>"sd",
172
+ "som"=>"so",
173
+ "sot"=>"st",
174
+ "spa"=>"es",
175
+ "srd"=>"sc",
176
+ "srp"=>"sr",
177
+ "ssw"=>"ss",
178
+ "sun"=>"su",
179
+ "swa"=>"sw",
180
+ "swe"=>"sv",
181
+ "tah"=>"ty",
182
+ "tam"=>"ta",
183
+ "tat"=>"tt",
184
+ "tel"=>"te",
185
+ "tgk"=>"tg",
186
+ "tgl"=>"tl",
187
+ "tha"=>"th",
188
+ "tir"=>"ti",
189
+ "ton"=>"to",
190
+ "tsn"=>"tn",
191
+ "tso"=>"ts",
192
+ "tuk"=>"tk",
193
+ "tur"=>"tr",
194
+ "twi"=>"tw",
195
+ "uig"=>"ug",
196
+ "ukr"=>"uk",
197
+ "urd"=>"ur",
198
+ "uzb"=>"uz",
199
+ "ven"=>"ve",
200
+ "vie"=>"vi",
201
+ "vol"=>"vo",
202
+ "wln"=>"wa",
203
+ "wol"=>"wo",
204
+ "xho"=>"xh",
205
+ "yid"=>"yi",
206
+ "yor"=>"yo",
207
+ "zha"=>"za",
208
+ "zul"=>"zu",
209
+ }.freeze
210
+
211
+ def normalize(code)
212
+ return unless code
213
+ code = code.to_s
214
+ CODES[code] || code
215
+ end
216
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::Meaning
3
+ attr_reader :language, :text
4
+
5
+ def initialize(data)
6
+ @language = data["language"]
7
+ @text = data["text"] ? CGI.unescapeHTML(data["text"]) : nil
8
+ end
9
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::Response
3
+ attr_reader :ok, :body
4
+
5
+ def initialize(body, ok:)
6
+ @body = body
7
+ @ok = !!ok
8
+ end
9
+
10
+ alias_method :ok?, :ok
11
+
12
+ def from
13
+ body["from"]
14
+ end
15
+
16
+ def to
17
+ body["dest"]
18
+ end
19
+
20
+ def phrase
21
+ body["phrase"]
22
+ end
23
+
24
+ def messages
25
+ body["messages"] || []
26
+ end
27
+
28
+ def success?
29
+ ok? && body["result"] == "ok"
30
+ end
31
+
32
+ def found?
33
+ success? && results.any?
34
+ end
35
+
36
+ def results
37
+ @results ||= begin
38
+ if success? && body["tuc"].any?
39
+ body["tuc"].map { |data| Glosbe::Result.new(data, authors: authors) }
40
+ else
41
+ []
42
+ end
43
+ end
44
+ end
45
+
46
+ def authors
47
+ @authors ||= begin
48
+ if success?
49
+ body["authors"].map { |data| Glosbe::Author.new(data[1]) }
50
+ else
51
+ []
52
+ end
53
+ end
54
+ end
55
+
56
+ def translation
57
+ result = results.find { |result| result.phrase }
58
+ result.phrase if result
59
+ end
60
+
61
+ def define
62
+ @define ||= extract_definitions_for(from)
63
+ end
64
+
65
+ def translated_define
66
+ @translated_define ||= extract_definitions_for(to)
67
+ end
68
+
69
+ private
70
+
71
+ def extract_definitions_for(language)
72
+ results.map do |result|
73
+ result.meanings.map do |meaning|
74
+ meaning.text if meaning.language == language
75
+ end
76
+ end.flatten.compact
77
+ end
78
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ class Glosbe::Result
3
+ attr_reader :phrase, :language, :authors, :meanings
4
+
5
+ def initialize(data, authors: [])
6
+ if data["phrase"]
7
+ @phrase = data["phrase"]["text"]
8
+ @language = data["phrase"]["language"]
9
+ end
10
+ @authors = authors.select do |author|
11
+ data["authors"].include?(author.id)
12
+ end
13
+ @meanings = (data["meanings"] || []).map { |meaning| Glosbe::Meaning.new(meaning) }
14
+ end
15
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require "glosbe"
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module Glosbe
3
+ VERSION = "0.0.3"
4
+ end
metadata ADDED
@@ -0,0 +1,163 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: glosbe-translate
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Kevin McPhillips
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-09-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.15'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.15'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: vcr
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.10'
111
+ description: Wrapper around the JSON api on the Glosbe online multilingual dictionary.
112
+ Return definitions and translations.
113
+ email:
114
+ - github@kevinmcphillips.ca
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".travis.yml"
122
+ - Gemfile
123
+ - LICENSE
124
+ - README.md
125
+ - Rakefile
126
+ - bin/console
127
+ - bin/setup
128
+ - glosbe-translate.gemspec
129
+ - lib/glosbe.rb
130
+ - lib/glosbe/author.rb
131
+ - lib/glosbe/http.rb
132
+ - lib/glosbe/language.rb
133
+ - lib/glosbe/language_code.rb
134
+ - lib/glosbe/meaning.rb
135
+ - lib/glosbe/response.rb
136
+ - lib/glosbe/result.rb
137
+ - lib/glosbe/translate.rb
138
+ - lib/glosbe/version.rb
139
+ homepage: https://github.com/kmcphillips/glosbe-translate
140
+ licenses:
141
+ - MIT
142
+ metadata: {}
143
+ post_install_message:
144
+ rdoc_options: []
145
+ require_paths:
146
+ - lib
147
+ required_ruby_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ required_rubygems_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 2.5.1
160
+ signing_key:
161
+ specification_version: 4
162
+ summary: Use https://glosbe.com to translate and define words and phrases
163
+ test_files: []