linguo 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format d
data/.travis.yml ADDED
@@ -0,0 +1 @@
1
+ rvm: 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in linguo.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2012 Nihad Abbasov / NARKOZ
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
18
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24
+ POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+ # Linguo
2
+
3
+ Linguo detects the language of a given text using [Free Language Detection API](http://detectlanguage.com).
4
+
5
+ [![Build Status](https://secure.travis-ci.org/NARKOZ/linguo.png)](http://travis-ci.org/NARKOZ/linguo)
6
+
7
+ ## Installation
8
+
9
+ Install it from rubygems:
10
+
11
+ ```sh
12
+ gem install linguo
13
+ ```
14
+
15
+ If you're using Rails, add to your Gemfile:
16
+
17
+ ```ruby
18
+ gem 'linguo'
19
+ # gem 'linguo', :git => 'git://github.com/NARKOZ/linguo.git'
20
+ ```
21
+
22
+ and run:
23
+
24
+ ```sh
25
+ bundle
26
+ ```
27
+
28
+ You can run `rails g linguo:config` to generate an initializer and set up API key at `config/initializers/linguo.rb`.
29
+
30
+ ## Usage examples
31
+
32
+ You can use demo API key (`demo`) to test out any examples below.
33
+
34
+ There are a few ways to set an API key. You can set default API key globally in `Linguo::Config.api_key`:
35
+
36
+ ```ruby
37
+ Linguo.api_key = "your_api_key"
38
+ ```
39
+
40
+ or set the environment variable `'LINGUO_API_KEY'` and Linguo will use it.
41
+
42
+ You can also pass it directly:
43
+
44
+ ```ruby
45
+ Linguo.detect("your text to detect", "your_api_key")
46
+ ```
47
+
48
+ Identify text language and get confidence scores using the `detect` method:
49
+
50
+ ```ruby
51
+ Linguo.detect("こんにちは")
52
+ ```
53
+
54
+ Get a list of languages with confidence greater than 0.3:
55
+
56
+ ```ruby
57
+ Linguo.detect("こんにちは").detections.map {|x| x['language'] if x['confidence'] > 0.3}.compact
58
+ ```
59
+
60
+ Linguo adds `lang` method to `String` class:
61
+
62
+ ```ruby
63
+ "こんにちは".lang
64
+ ```
65
+
66
+ It will return an array containing detected languages.
67
+
68
+ For more information, refer to [documentation](http://rubydoc.info/gems/linguo/frames).
69
+
70
+ ## License
71
+
72
+ Released under the BSD 2-clause license. See LICENSE.txt for details.
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rspec/core/rake_task'
5
+ RSpec::Core::RakeTask.new(:spec) do |spec|
6
+ spec.pattern = FileList['spec/**/*_spec.rb']
7
+ end
8
+
9
+ task :default => :spec
data/lib/linguo.rb ADDED
@@ -0,0 +1,29 @@
1
+ require 'linguo/version'
2
+ require 'linguo/config'
3
+ require 'linguo/detect'
4
+ require 'linguo/errors'
5
+ require 'linguo/core_ext/string'
6
+ require 'net/http'
7
+ require 'json'
8
+
9
+ module Linguo
10
+ # Sets API key obtained from detectlanguage.com.
11
+ #
12
+ # @see Linguo::Config
13
+ def self.api_key=(val)
14
+ Config.api_key = val
15
+ end
16
+
17
+ # Creates a new instance of Linguo::Detect.
18
+ #
19
+ # Note that api_key is optional and isn't required once you set
20
+ # <tt>Linguo::Config.api_key</tt> or <tt>ENV['LINGUO_API_KEY']</tt>.
21
+ #
22
+ # @param [String] text The text required to detect.
23
+ # @param [String] api_key The API key obtained from detectlanguage.com.
24
+ # @return [Linguo::Detect]
25
+ def self.detect(text, api_key=nil)
26
+ api_key = api_key || Linguo::Config.api_key || ENV['LINGUO_API_KEY']
27
+ Detect.new(text, api_key)
28
+ end
29
+ end
@@ -0,0 +1,16 @@
1
+ module Linguo
2
+ # Defines methods to set API key.
3
+ module Config
4
+ def self.api_key=(val)
5
+ @@api_key = val
6
+ end
7
+
8
+ def self.api_key
9
+ begin
10
+ @@api_key
11
+ rescue NameError
12
+ raise Linguo::Errors::MissingApiKey, "No API key has been set!"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ class String
2
+ # Retrieves all the languages detected for the current string
3
+ # sorted by confidence.
4
+ #
5
+ # Requires <tt>Linguo::Config.api_key</tt> or <tt>ENV['LINGUO_API_KEY']</tt>
6
+ # to be set up.
7
+ #
8
+ # @example
9
+ # "simple text".lang # => ["en", "fr"]
10
+ # @return [Array]
11
+ def lang
12
+ l ||= Linguo.detect(self, Linguo::Config.api_key)
13
+ l.detections.map {|x| x['language']}
14
+ rescue => e
15
+ raise Linguo::Errors::LinguoError, e.message
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module Linguo
2
+ class Detect
3
+ # The URL to the API endpoint.
4
+ API_URL = 'http://ws.detectlanguage.com/0.2/detect'
5
+
6
+ # An array of detections.
7
+ attr_reader :detections
8
+
9
+ # Initializes a new Detect object and parses the API response.
10
+ #
11
+ # @param [String] text The text required to detect.
12
+ # @param [String] api_key The API key obtained from detectlanguage.com.
13
+ # @return [Linguo::Detect]
14
+ def initialize(text, api_key)
15
+ raise Errors::MissingApiKey, "No API key provided." unless api_key
16
+
17
+ uri = URI API_URL
18
+ req = Net::HTTP::Post.new(uri.path)
19
+ req.set_form_data('q' => text, 'key' => api_key)
20
+ res = Net::HTTP.start(uri.hostname, uri.port) {|http| http.request(req)}
21
+
22
+ if res.code.to_i == 200
23
+ data = JSON.parse(res.body)
24
+ raise Errors::ApiError, data['error']['message'] if data['error']
25
+ raise Errors::UnexpectedApiException if data['data'].nil?
26
+ @detections = data['data']['detections']
27
+ else
28
+ raise Errors::ApiConnectionError, "#{response.code} #{response.message}"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ module Linguo
2
+ module Errors
3
+ # Custom error class for rescuing from all Linguo errors.
4
+ class LinguoError < StandardError; end
5
+
6
+ # Raised when Linguo API key is missed.
7
+ class MissingApiKey < LinguoError; end
8
+
9
+ # Raised when API endpoint returns error.
10
+ class ApiError < LinguoError; end
11
+
12
+ # Raised when API endpoint doesn't return the HTTP status code 200.
13
+ class ApiConnectionError < LinguoError; end
14
+
15
+ # Raised when API endpoint returns unexpected response.
16
+ class UnexpectedApiException < LinguoError; end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module Linguo
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,11 @@
1
+ module Linguo
2
+ class ConfigGenerator < Rails::Generators::Base
3
+ desc "Creates a configuration file at config/initializers/linguo.rb"
4
+
5
+ # Creates a configuration file at <tt>config/initializers/linguo.rb</tt>
6
+ # when running <tt>rails g linguo:config</tt>.
7
+ def create_linguo_file
8
+ create_file 'config/initializers/linguo.rb', "Linguo.api_key = ENV['LINGUO_API_KEY']"
9
+ end
10
+ end
11
+ end
data/linguo.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/linguo/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Nihad Abbasov", "Laurynas Butkus"]
6
+ gem.email = ["mail@narkoz.me", "laurynas.butkus@gmail.com"]
7
+ gem.description = %q{Language detection library for Ruby}
8
+ gem.summary = %q{Linguo detects the language of a given piece of text}
9
+ gem.homepage = "https://github.com/narkoz/linguo"
10
+
11
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
12
+ gem.files = `git ls-files`.split("\n")
13
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
14
+ gem.name = "linguo"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Linguo::VERSION
17
+
18
+ gem.add_runtime_dependency 'json'
19
+
20
+ gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'rspec'
22
+ gem.add_development_dependency 'webmock'
23
+ end
@@ -0,0 +1 @@
1
+ {"data":{"detections":[{"isReliable":false,"confidence":0.6,"language":"ja"},{"isReliable":false,"confidence":0.01,"language":"zh"}]}}
@@ -0,0 +1 @@
1
+ {"error":{"code":1,"message":"Invalid API key"}}
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Linguo::Config do
4
+ describe ".api_key" do
5
+ it "should raise an error when api_key is not set" do
6
+ expect { Linguo::Config.api_key }.
7
+ to raise_error Linguo::Errors::MissingApiKey
8
+ end
9
+
10
+ it "should return an API key when api_key is set" do
11
+ Linguo::Config.api_key = 'valid_api_key'
12
+ Linguo::Config.api_key.should == 'valid_api_key'
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe String do
5
+ describe "#lang" do
6
+ before do
7
+ stub_request(:post, "http://ws.detectlanguage.com/0.2/detect").
8
+ with(:body => {"q"=>"こんにちは", "key"=>"valid_api_key"}).
9
+ to_return(:body => load_fixture("response"))
10
+ end
11
+
12
+ it "should return an array of detected languages" do
13
+ 'こんにちは'.lang.should == ["ja", "zh"]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Linguo::Detect do
5
+ describe "#detections" do
6
+ context "with valid API key passed" do
7
+ before do
8
+ stub_request(:post, "http://ws.detectlanguage.com/0.2/detect").
9
+ with(:body => {"q"=>"こんにちは", "key"=>"valid_api_key"}).
10
+ to_return(:body => load_fixture("response"))
11
+ @linguo = Linguo.detect('こんにちは', 'valid_api_key')
12
+ end
13
+
14
+ it "should request the correct resource" do
15
+ a_request(:post, Linguo::Detect::API_URL).should have_been_made
16
+ end
17
+
18
+ it "should return the list of detections" do
19
+ @linguo.detections.should be_an Array
20
+ @linguo.detections.first.should be_a Hash
21
+ @linguo.detections.first['language'].should == "ja"
22
+ end
23
+ end
24
+
25
+ context "with invalid API key passed" do
26
+ before do
27
+ stub_request(:post, "http://ws.detectlanguage.com/0.2/detect").
28
+ with(:body => {"q"=>"こんにちは", "key"=>""}).
29
+ to_return(:body => load_fixture("wrong_api_key"))
30
+ end
31
+
32
+ it "should raise an API error" do
33
+ expect { Linguo.detect('こんにちは', '') }.
34
+ to raise_error Linguo::Errors::ApiError, "Invalid API key"
35
+ a_request(:post, Linguo::Detect::API_URL).should have_been_made
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ require 'spec_helper'
2
+
3
+ describe Linguo do
4
+ it { Linguo.should respond_to :detect }
5
+ it { Linguo.should respond_to :api_key= }
6
+ end
@@ -0,0 +1,7 @@
1
+ require 'rspec'
2
+ require 'linguo'
3
+ require 'webmock/rspec'
4
+
5
+ def load_fixture(name)
6
+ File.new(File.dirname(__FILE__) + "/fixtures/#{name}.json")
7
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: linguo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Nihad Abbasov
9
+ - Laurynas Butkus
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2012-03-14 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ requirement: &2157232700 !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: *2157232700
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: &2157232260 !ruby/object:Gem::Requirement
29
+ none: false
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: *2157232260
37
+ - !ruby/object:Gem::Dependency
38
+ name: rspec
39
+ requirement: &2157231840 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :development
46
+ prerelease: false
47
+ version_requirements: *2157231840
48
+ - !ruby/object:Gem::Dependency
49
+ name: webmock
50
+ requirement: &2157231360 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: *2157231360
59
+ description: Language detection library for Ruby
60
+ email:
61
+ - mail@narkoz.me
62
+ - laurynas.butkus@gmail.com
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - .gitignore
68
+ - .rspec
69
+ - .travis.yml
70
+ - Gemfile
71
+ - LICENSE.txt
72
+ - README.md
73
+ - Rakefile
74
+ - lib/linguo.rb
75
+ - lib/linguo/config.rb
76
+ - lib/linguo/core_ext/string.rb
77
+ - lib/linguo/detect.rb
78
+ - lib/linguo/errors.rb
79
+ - lib/linguo/version.rb
80
+ - lib/rails/generators/linguo/config_generator.rb
81
+ - linguo.gemspec
82
+ - spec/fixtures/response.json
83
+ - spec/fixtures/wrong_api_key.json
84
+ - spec/linguo/config_spec.rb
85
+ - spec/linguo/core_ext_spec.rb
86
+ - spec/linguo/detect_spec.rb
87
+ - spec/linguo_spec.rb
88
+ - spec/spec_helper.rb
89
+ homepage: https://github.com/narkoz/linguo
90
+ licenses: []
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ segments:
102
+ - 0
103
+ hash: -3651711047218935527
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ segments:
111
+ - 0
112
+ hash: -3651711047218935527
113
+ requirements: []
114
+ rubyforge_project:
115
+ rubygems_version: 1.8.17
116
+ signing_key:
117
+ specification_version: 3
118
+ summary: Linguo detects the language of a given piece of text
119
+ test_files:
120
+ - spec/fixtures/response.json
121
+ - spec/fixtures/wrong_api_key.json
122
+ - spec/linguo/config_spec.rb
123
+ - spec/linguo/core_ext_spec.rb
124
+ - spec/linguo/detect_spec.rb
125
+ - spec/linguo_spec.rb
126
+ - spec/spec_helper.rb