lita-wordnik 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 45d6698e12741ea0909d4ac63e004e7afefee110
4
- data.tar.gz: 5749ff7a995ab1d6ea1ade5e0ff6e5c0c394f010
3
+ metadata.gz: ce8bb942f982996203a905a3212e4ee5d162c39c
4
+ data.tar.gz: 20134edd81a00fde12234f006d47bb7568972a4f
5
5
  SHA512:
6
- metadata.gz: 386209f4b9fcf978aa6bb0b8333dd5a0c5a40e42760558defe33dc64e44731a449bd0ec157f0d0cd54340493f39e747a555bc32d08a5fbf1ae12f65834cb57a8
7
- data.tar.gz: 342f7d61a13339f3659051a5a258e9d95d1d28830e4e89fa2f9c34b73a89ab6d6d18a225a33d9232e346f441868af651f79bbfc06b6229a228a27459912d20ae
6
+ metadata.gz: 7df229ffa08cc6fd6eca44c445896614d20f68d466f9bd31c5ec323e4e2807e97086122f806ac890cef6a0ea043a8cf4c9e6e2f83241f8dd8cd17d409b98c8f9
7
+ data.tar.gz: dee4b9ebd3ce0a0567480d153d18dcbd2f73aa112dfb6d8512da9ceaffddf652a6badf3c0a7f58d1f33401645f95a3ed6f77621bc0fe7ef4a7486bb84fa1bb79
data/README.md CHANGED
@@ -35,6 +35,29 @@ To get the definition for a word:
35
35
  ```
36
36
  Lita: define WORD
37
37
  ```
38
+ To get synonyms for a word:
39
+
40
+ ```
41
+ Lita: synonyms WORD
42
+ ```
43
+
44
+ or
45
+
46
+ ```
47
+ Lita: words like WORD
48
+ ```
49
+
50
+ To get antonyms for a word:
51
+
52
+ ```
53
+ Lita: antonyms WORD
54
+ ```
55
+
56
+ or
57
+
58
+ ```
59
+ Lita: words unlike WORD
60
+ ```
38
61
 
39
62
  ## License
40
63
 
@@ -3,7 +3,7 @@ require "lita"
3
3
  module Lita
4
4
  module Handlers
5
5
  class Wordnik < Handler
6
- NO_DEFINITIONS = "Wordnik doesn't have any definitions for that."
6
+ NO_RESULTS = "Wordnik doesn't have any results for that."
7
7
 
8
8
  def self.default_config(config)
9
9
  config.api_key = nil
@@ -12,18 +12,37 @@ module Lita
12
12
  route(/define\s+(.+)/i, :define, command: true, help: {
13
13
  "define WORD" => "Get the definition for WORD."
14
14
  })
15
+ route(/^syn(?:onyms)?\s+(.*)$/i, :synonyms, command: true, help: {
16
+ "synonyms WORD" => "Get synonyms for WORD."
17
+ })
18
+ route(/^words\s*like\s+(.*)$/i, :synonyms, command: true, help: {
19
+ "words like WORD" => "Get synonyms for WORD."
20
+ })
21
+ route(/^ant(?:onyms)?\s+(.*)$/i, :antonyms, command: true, help: {
22
+ "antonyms WORD" => "Get antonyms for WORD."
23
+ })
24
+ route(/^words\s*unlike\s+(.*)$/i, :antonyms, command: true, help: {
25
+ "words unlike WORD" => "Get antonyms for WORD."
26
+ })
15
27
 
16
- def define(response)
17
- return unless validate(response)
18
- word = response.matches[0][0]
19
- definition = get_definition(word)
20
- response.reply(definition)
28
+ class << self
29
+ def define_wordnik_method(name, getter_name)
30
+ define_method(name) do |response|
31
+ return unless validate(response)
32
+ word = encode_word(response.matches[0][0])
33
+ result = send(getter_name, word)
34
+ response.reply(result)
35
+ end
36
+ end
21
37
  end
22
38
 
39
+ define_wordnik_method :define, :definition_for
40
+ define_wordnik_method :synonyms, :synonyms_for
41
+ define_wordnik_method :antonyms, :antonyms_for
42
+
23
43
  private
24
44
 
25
- def get_definition(word)
26
- word = encode_word(word)
45
+ def definition_for(word)
27
46
  url = "http://api.wordnik.com/v4/word.json/#{word}/definitions"
28
47
  Lita.logger.debug("Making Wordnik API request to #{url}.")
29
48
  process_response http.get(
@@ -36,6 +55,30 @@ module Lita
36
55
  )
37
56
  end
38
57
 
58
+ def synonyms_for(word)
59
+ url = "http://api.wordnik.com/v4/word.json/#{word}/relatedWords"
60
+ Lita.logger.debug("Making Wordnik API request to #{url}.")
61
+ process_response http.get(
62
+ url,
63
+ api_key: Lita.config.handlers.wordnik.api_key,
64
+ useCanonical: true,
65
+ relationshipTypes: "synonym",
66
+ limitPerRelationshipType: 5
67
+ )
68
+ end
69
+
70
+ def antonyms_for(word)
71
+ url = "http://api.wordnik.com/v4/word.json/#{word}/relatedWords"
72
+ Lita.logger.debug("Making Wordnik API request to #{url}.")
73
+ process_response http.get(
74
+ url,
75
+ api_key: Lita.config.handlers.wordnik.api_key,
76
+ useCanonical: true,
77
+ relationshipTypes: "antonym",
78
+ limitPerRelationshipType: 5
79
+ )
80
+ end
81
+
39
82
  def encode_word(word)
40
83
  begin
41
84
  URI.parse(word)
@@ -50,14 +93,21 @@ module Lita
50
93
  when 400
51
94
  "Wordnik didn't understand that word."
52
95
  when 404
53
- NO_DEFINITIONS
96
+ NO_RESULTS
54
97
  when 200
55
98
  data = MultiJson.load(response.body).first
56
99
 
57
100
  if data
58
- "#{data["word"]} (#{data["partOfSpeech"]}): #{data["text"]}"
101
+ case data["relationshipType"]
102
+ when "synonym"
103
+ "(synonyms): #{data["words"].join(', ')}"
104
+ when "antonym"
105
+ "(antonyms): #{data["words"].join(', ')}"
106
+ else
107
+ "#{data["word"]} (#{data["partOfSpeech"]}): #{data["text"]}"
108
+ end
59
109
  else
60
- NO_DEFINITIONS
110
+ NO_RESULTS
61
111
  end
62
112
  else
63
113
  Lita.logger.error("Wordnik request failed: #{response.inspect}")
data/lita-wordnik.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-wordnik"
3
- spec.version = "0.0.3"
3
+ spec.version = "0.1.0"
4
4
  spec.authors = ["Jimmy Cuadra"]
5
5
  spec.email = ["jimmy@jimmycuadra.com"]
6
6
  spec.description = %q{A Lita handler for dictionary functionality backed by Wordnik.}
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.add_development_dependency "bundler", "~> 1.3"
20
20
  spec.add_development_dependency "rake"
21
- spec.add_development_dependency "rspec", "~> 2.14"
21
+ spec.add_development_dependency "rspec", ">= 3.0.0"
22
22
  spec.add_development_dependency "simplecov"
23
23
  spec.add_development_dependency "coveralls"
24
24
  end
@@ -1,8 +1,28 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Lita::Handlers::Wordnik, lita_handler: true do
4
- let(:body) do
5
- <<-BODY.chomp
4
+ let(:response) { double("Faraday::Response", status: 200, body: body) }
5
+
6
+ it { routes_command("define computer").to(:define) }
7
+ it { routes_command("synonyms cold").to(:synonyms) }
8
+ it { routes_command("syn cold").to(:synonyms) }
9
+ it { routes_command("words like cold").to(:synonyms) }
10
+ it { routes_command("antonyms cold").to(:antonyms) }
11
+ it { routes_command("ant cold").to(:antonyms) }
12
+ it { routes_command("words unlike cold").to(:antonyms) }
13
+
14
+ it "sets the API key to nil by default" do
15
+ expect(Lita.config.handlers.wordnik.api_key).to be_nil
16
+ end
17
+
18
+ context "with Faraday stubbing" do
19
+ before do
20
+ allow_any_instance_of( Faraday::Connection).to receive(:get).and_return(response)
21
+ end
22
+
23
+ describe "#define" do
24
+ let(:body) do
25
+ <<-BODY.chomp
6
26
  [
7
27
  {
8
28
  "word": "computer",
@@ -13,67 +33,101 @@ assembles, stores, correlates, or otherwise processes information.",
13
33
  }
14
34
  ]
15
35
  BODY
16
- end
36
+ end
17
37
 
18
- let(:response) { double("Faraday::Response", status: 200, body: body) }
38
+ it "replies that the API key is required" do
39
+ send_command("define computer")
40
+ expect(replies.last).to include("API key required")
41
+ end
19
42
 
20
- before do
21
- allow_any_instance_of(
22
- Faraday::Connection
23
- ).to receive(:get).and_return(response)
24
- end
43
+ context "when the API key is set" do
44
+ before { Lita.config.handlers.wordnik.api_key = "abc123" }
25
45
 
26
- it { routes_command("define computer").to(:define) }
46
+ it "replies with the definition" do
47
+ send_command("define computer")
48
+ expect(replies.last).to include("computer (noun): A device that")
49
+ end
27
50
 
28
- it "sets the API key to nil by default" do
29
- expect(Lita.config.handlers.wordnik.api_key).to be_nil
30
- end
51
+ it "URL encodes words" do
52
+ word = "a phrase with a % sign in it"
53
+ expect(URI).to receive(:encode).with(word)
54
+ send_command("define #{word}")
55
+ end
31
56
 
32
- describe "#define" do
33
- it "replies that the API key is required" do
34
- send_command("define computer")
35
- expect(replies.last).to include("API key required")
36
- end
57
+ it "replies that Wordnik didn't understand the word on 400 status" do
58
+ allow(response).to receive(:status).and_return(400)
59
+ send_command("define computer")
60
+ expect(replies.last).to include("didn't understand")
61
+ end
37
62
 
38
- context "when the API key is set" do
39
- before { Lita.config.handlers.wordnik.api_key = "abc123" }
63
+ it "replies that Wordnik has no definitions on 404 status" do
64
+ allow(response).to receive(:status).and_return(404)
65
+ send_command("define computer")
66
+ expect(replies.last).to include("doesn't have any results")
67
+ end
40
68
 
41
- it "replies with the definition" do
42
- send_command("define computer")
43
- expect(replies.last).to include("computer (noun): A device that")
44
- end
69
+ it "logs an error and replies that the request completely failed" do
70
+ allow(response).to receive(:status).and_return(500)
71
+ send_command("define computer")
72
+ expect(replies.last).to include("request failed")
73
+ end
45
74
 
46
- it "URL encodes words" do
47
- word = "a phrase with a % sign in it"
48
- expect(URI).to receive(:encode).with(word)
49
- send_command("define #{word}")
75
+ context "when the response has no definitions" do
76
+ let(:body) { "[]" }
77
+
78
+ it "replies that Wordnik has no definitions" do
79
+ send_command("define whiskey stone")
80
+ expect(replies.last).to include("doesn't have any results")
81
+ end
82
+ end
50
83
  end
84
+ end
51
85
 
52
- it "replies that Wordnik didn't understand the word on 400 status" do
53
- allow(response).to receive(:status).and_return(400)
54
- send_command("define computer")
55
- expect(replies.last).to include("didn't understand")
86
+ describe "#synonyms" do
87
+ let(:body) do
88
+ <<-BODY.chomp
89
+ [
90
+ {
91
+ "words": [
92
+ "stoical",
93
+ "frigid",
94
+ "unconcerned",
95
+ "bleak",
96
+ "indifferent"
97
+ ],
98
+ "relationshipType": "synonym"
99
+ }
100
+ ]
101
+ BODY
56
102
  end
57
103
 
58
- it "replies that Wordnik has no definitions on 404 status" do
59
- allow(response).to receive(:status).and_return(404)
60
- send_command("define computer")
61
- expect(replies.last).to include("doesn't have any definitions")
104
+ before { Lita.config.handlers.wordnik.api_key = "abc123" }
105
+
106
+ it "replies with synonyms" do
107
+ send_command("synonyms cold")
108
+ expect(replies.last).to include("(synonyms): stoical, frigid, unconcerned, bleak, indifferent")
62
109
  end
110
+ end
63
111
 
64
- it "logs an error and replies that the request completely failed" do
65
- allow(response).to receive(:status).and_return(500)
66
- send_command("define computer")
67
- expect(replies.last).to include("request failed")
112
+ describe "#antonyms" do
113
+ let(:body) do
114
+ <<-BODY.chomp
115
+ [
116
+ {
117
+ "words": [
118
+ "hot"
119
+ ],
120
+ "relationshipType": "antonym"
121
+ }
122
+ ]
123
+ BODY
68
124
  end
69
125
 
70
- context "when the response has no definitions" do
71
- let(:body) { "[]" }
126
+ before { Lita.config.handlers.wordnik.api_key = "abc123" }
72
127
 
73
- it "replies that Wordnik has no definitions" do
74
- send_command("define whiskey stone")
75
- expect(replies.last).to include("doesn't have any definitions")
76
- end
128
+ it "replies with antonyms" do
129
+ send_command("antonyms cold")
130
+ expect(replies.last).to include("(antonyms): hot")
77
131
  end
78
132
  end
79
133
  end
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lita-wordnik
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jimmy Cuadra
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-20 00:00:00.000000000 Z
11
+ date: 2014-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
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
26
  version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1.3'
34
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
40
  version: '1.3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
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
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '2.14'
61
+ version: 3.0.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: '2.14'
68
+ version: 3.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
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
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: coveralls
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
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
96
  version: '0'
97
97
  description: A Lita handler for dictionary functionality backed by Wordnik.
@@ -101,8 +101,8 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
- - .gitignore
105
- - .travis.yml
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
106
  - Gemfile
107
107
  - LICENSE
108
108
  - README.md
@@ -123,17 +123,17 @@ require_paths:
123
123
  - lib
124
124
  required_ruby_version: !ruby/object:Gem::Requirement
125
125
  requirements:
126
- - - '>='
126
+ - - ">="
127
127
  - !ruby/object:Gem::Version
128
128
  version: '0'
129
129
  required_rubygems_version: !ruby/object:Gem::Requirement
130
130
  requirements:
131
- - - '>='
131
+ - - ">="
132
132
  - !ruby/object:Gem::Version
133
133
  version: '0'
134
134
  requirements: []
135
135
  rubyforge_project:
136
- rubygems_version: 2.1.11
136
+ rubygems_version: 2.2.2
137
137
  signing_key:
138
138
  specification_version: 4
139
139
  summary: A Lita handler for dictionary functionality backed by Wordnik.