wordnik 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -22
- data/Gemfile +4 -0
- data/Gemfile.lock +51 -0
- data/README.md +82 -0
- data/Rakefile +23 -47
- data/api_docs/account.json +1 -0
- data/api_docs/corpus.json +1 -0
- data/api_docs/document.json +1 -0
- data/api_docs/partners.json +1 -0
- data/api_docs/system.json +1 -0
- data/api_docs/tag.json +1 -0
- data/api_docs/user.json +1 -0
- data/api_docs/users.json +1 -0
- data/api_docs/word.json +1 -0
- data/api_docs/wordList.json +1 -0
- data/api_docs/wordLists.json +1 -0
- data/api_docs/wordoftheday.json +1 -0
- data/api_docs/words.json +1 -0
- data/lib/wordnik.rb +57 -84
- data/lib/wordnik/configuration.rb +24 -0
- data/lib/wordnik/endpoint.rb +33 -0
- data/lib/wordnik/monkey_patches.rb +26 -0
- data/lib/wordnik/operation.rb +45 -0
- data/lib/wordnik/operation_parameter.rb +39 -0
- data/lib/wordnik/request.rb +168 -0
- data/lib/wordnik/resource.rb +101 -0
- data/lib/wordnik/response.rb +74 -0
- data/lib/wordnik/version.rb +3 -0
- data/spec/endpoint_spec.rb +26 -0
- data/spec/operation_parameter_spec.rb +26 -0
- data/spec/operation_spec.rb +37 -0
- data/spec/request_spec.rb +157 -0
- data/spec/resource_spec.rb +31 -0
- data/spec/response_spec.rb +49 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +25 -0
- data/spec/wordnik_spec.rb +76 -0
- data/wordnik.gemspec +25 -51
- metadata +146 -43
- data/.document +0 -5
- data/CHANGELOG +0 -8
- data/LICENSE +0 -12
- data/README.rdoc +0 -23
- data/VERSION +0 -1
- data/test/helper.rb +0 -10
- data/test/test_wordnik.rb +0 -89
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
wordnik (0.3.0)
|
5
|
+
activemodel (= 3.0.3)
|
6
|
+
addressable (= 2.2.4)
|
7
|
+
htmlentities (= 4.2.4)
|
8
|
+
json (= 1.4.6)
|
9
|
+
nokogiri (= 1.4.4)
|
10
|
+
typhoeus (= 0.2.1)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: http://rubygems.org/
|
14
|
+
specs:
|
15
|
+
activemodel (3.0.3)
|
16
|
+
activesupport (= 3.0.3)
|
17
|
+
builder (~> 2.1.2)
|
18
|
+
i18n (~> 0.4)
|
19
|
+
activesupport (3.0.3)
|
20
|
+
addressable (2.2.4)
|
21
|
+
builder (2.1.2)
|
22
|
+
crack (0.1.8)
|
23
|
+
diff-lcs (1.1.2)
|
24
|
+
htmlentities (4.2.4)
|
25
|
+
i18n (0.5.0)
|
26
|
+
json (1.4.6)
|
27
|
+
mime-types (1.16)
|
28
|
+
nokogiri (1.4.4)
|
29
|
+
rspec (2.4.0)
|
30
|
+
rspec-core (~> 2.4.0)
|
31
|
+
rspec-expectations (~> 2.4.0)
|
32
|
+
rspec-mocks (~> 2.4.0)
|
33
|
+
rspec-core (2.4.0)
|
34
|
+
rspec-expectations (2.4.0)
|
35
|
+
diff-lcs (~> 1.1.2)
|
36
|
+
rspec-mocks (2.4.0)
|
37
|
+
typhoeus (0.2.1)
|
38
|
+
mime-types
|
39
|
+
vcr (1.5.1)
|
40
|
+
webmock (1.6.2)
|
41
|
+
addressable (>= 2.2.2)
|
42
|
+
crack (>= 0.1.7)
|
43
|
+
|
44
|
+
PLATFORMS
|
45
|
+
ruby
|
46
|
+
|
47
|
+
DEPENDENCIES
|
48
|
+
rspec (= 2.4.0)
|
49
|
+
vcr (= 1.5.1)
|
50
|
+
webmock (= 1.6.2)
|
51
|
+
wordnik!
|
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
wordnik rubygem
|
2
|
+
===============
|
3
|
+
|
4
|
+
This is the official Wordnik rubygem. It fully wraps Wordnik's v4 API. Refer to
|
5
|
+
[developer.wordnik.com/docs](http://developer.wordnik.com/docs) to play around
|
6
|
+
in the live API sandbox. All the methods you see there are implemented in this
|
7
|
+
ruby gem.
|
8
|
+
|
9
|
+
Installation.
|
10
|
+
------------
|
11
|
+
|
12
|
+
### Rails 3.x
|
13
|
+
|
14
|
+
Add the wordnik gem to your Gemfile.rb:
|
15
|
+
|
16
|
+
gem 'wordnik'
|
17
|
+
|
18
|
+
Then from your project's RAILS_ROOT, run:
|
19
|
+
|
20
|
+
bundle install
|
21
|
+
|
22
|
+
Create config/initializers/wordnik.rb and drop this in:
|
23
|
+
|
24
|
+
Wordnik.configure do |config|
|
25
|
+
config.api_key = '12345abcde'
|
26
|
+
config.response_format = :json # defaults to json, but xml is also supported
|
27
|
+
end
|
28
|
+
|
29
|
+
### Rails 2.x
|
30
|
+
|
31
|
+
Add the wordnik gem to your app. In config/environment.rb:
|
32
|
+
|
33
|
+
config.gem 'hoptoad_notifier'
|
34
|
+
|
35
|
+
Then from your project's RAILS_ROOT, run:
|
36
|
+
|
37
|
+
rake gems:install
|
38
|
+
rake gems:unpack GEM=wordnik
|
39
|
+
|
40
|
+
Create config/initializers/wordnik.rb and drop this in:
|
41
|
+
|
42
|
+
Wordnik.configure do |config|
|
43
|
+
config.api_key = '12345abcde'
|
44
|
+
config.response_format = :json # defaults to json, but xml is also supported
|
45
|
+
end
|
46
|
+
|
47
|
+
### Sinatra/Padrino/Other
|
48
|
+
|
49
|
+
gem install wordnik
|
50
|
+
|
51
|
+
Put this somewhere in your app's initialization process:
|
52
|
+
|
53
|
+
Wordnik.configure do |config|
|
54
|
+
config.api_key = '12345abcde'
|
55
|
+
config.response_format = :json # defaults to json, but xml is also supported
|
56
|
+
end
|
57
|
+
|
58
|
+
Specs
|
59
|
+
-----
|
60
|
+
|
61
|
+
The wordnik gem uses rspec 2. To run the test suite, you have to pass in your API
|
62
|
+
key as an environment variable, like so:
|
63
|
+
|
64
|
+
KEY=12345 rake spec
|
65
|
+
|
66
|
+
Contributing
|
67
|
+
------------
|
68
|
+
|
69
|
+
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
70
|
+
* Check out the [issue tracker](http://github.com/wordnik/wordnik-ruby/issues) to make sure someone already hasn't requested it and/or contributed it
|
71
|
+
* Fork the project
|
72
|
+
* Start a feature/bugfix branch
|
73
|
+
* Commit and push until you are happy with your contribution
|
74
|
+
* Make sure to add tests for the feature/bugfix. This is important so we don't break it in a future version unintentionally.
|
75
|
+
|
76
|
+
Props
|
77
|
+
-----
|
78
|
+
|
79
|
+
* Thanks to [Jason Adams](http://twitter.com/#!/ealdent) for graciously turning
|
80
|
+
over the [wordnik gem name](https://rubygems.org/gems/wordnik).
|
81
|
+
* HTTP requests are made using [Typhoeus](https://github.com/dbalatero/typhoeus),
|
82
|
+
a modern code version of the mythical beast with 100 serpent heads.
|
data/Rakefile
CHANGED
@@ -1,54 +1,30 @@
|
|
1
|
-
require '
|
2
|
-
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "wordnik"
|
8
|
-
gem.summary = %Q{Ruby interface to the Wordnik API}
|
9
|
-
gem.description = %Q{Ruby interface to the Wordnik API. Details at http://docs.wordnik.com/api/methods.}
|
10
|
-
gem.email = "jasonmadams@gmail.com"
|
11
|
-
gem.homepage = "http://github.com/ealdent/wordnik"
|
12
|
-
gem.authors = ["Jason Adams"]
|
13
|
-
gem.add_dependency "httparty", ">= 0.4.5"
|
14
|
-
gem.add_development_dependency "shoulda", ">= 0"
|
15
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
-
end
|
17
|
-
Jeweler::GemcutterTasks.new
|
18
|
-
rescue LoadError
|
19
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
20
|
-
end
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
require 'wordnik'
|
21
6
|
|
22
|
-
|
23
|
-
Rake::TestTask.new(:test) do |test|
|
24
|
-
test.libs << 'lib' << 'test'
|
25
|
-
test.pattern = 'test/**/test_*.rb'
|
26
|
-
test.verbose = true
|
27
|
-
end
|
7
|
+
RSpec::Core::RakeTask.new('spec')
|
28
8
|
|
29
|
-
|
30
|
-
|
31
|
-
Rcov::RcovTask.new do |test|
|
32
|
-
test.libs << 'test'
|
33
|
-
test.pattern = 'test/**/test_*.rb'
|
34
|
-
test.verbose = true
|
35
|
-
end
|
36
|
-
rescue LoadError
|
37
|
-
task :rcov do
|
38
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
39
|
-
end
|
40
|
-
end
|
9
|
+
# If you want to make this the default task
|
10
|
+
task :default => :spec
|
41
11
|
|
42
|
-
task :test => :check_dependencies
|
43
12
|
|
44
|
-
|
13
|
+
desc 'Download the API docs to disk'
|
14
|
+
task :fetch_api_docs do
|
15
|
+
|
16
|
+
Wordnik.configure
|
17
|
+
|
18
|
+
Wordnik.resource_names.each do |resource_name|
|
45
19
|
|
46
|
-
|
47
|
-
|
48
|
-
|
20
|
+
# Roll in API key
|
21
|
+
headers = {}
|
22
|
+
# headers[:api_key] = params[:api_key] if params[:api_key].present?
|
49
23
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
24
|
+
request = Wordnik::Request.new(:get, "#{resource_name}.json", :headers => headers)
|
25
|
+
filename = "api_docs/#{resource_name}.json"
|
26
|
+
File.open(filename, 'w') {|f| f.write(request.response.raw.body) }
|
27
|
+
puts filename
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"endPoints":[{"path":"/account.{format}/authenticate/{username}","description":"","operations":[{"parameters":[{"name":"username","description":"A confirmed Wordnik username","required":true,"paramType":"path"},{"name":"password","description":"The user's password","required":true,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"AuthenticationToken","errorResponses":[{"reason":"Account not available.","code":403},{"reason":"User not found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Authenticates a User","open":false,"httpMethod":"GET"}]},{"path":"/account.{format}/apiTokenStatus","description":"","operations":[{"parameters":[{"name":"api_key","description":"Wordnik authentication token","required":true,"paramType":"header"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"ApiTokenStatus","errorResponses":[{"reason":"No token supplied.","code":400},{"reason":"No API account with supplied token.","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns usage statistics for the API account.","open":true,"httpMethod":"GET"}]},{"path":"/account.{format}/authenticate/{username}","description":"","operations":[{"parameters":[{"name":"username","description":"A confirmed Wordnik username","required":true,"paramType":"path"},{"description":"The user's password","required":true,"paramType":"body"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"AuthenticationToken","errorResponses":[{"reason":"Account not available.","code":403},{"reason":"User not found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Authenticates a user","open":false,"httpMethod":"POST"}]},{"path":"/account.{format}/user","description":"","operations":[{"parameters":[{"name":"auth_token","description":"The auth token of the logged-in user, obtained by calling /account.{format}/authenticate/{username} (described above)","required":true,"paramType":"header"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"User","errorResponses":[{"reason":"Not logged in.","code":403},{"reason":"User not found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns the logged-in User","open":false,"notes":"Requires a valid auth_token to be set.","httpMethod":"GET"}]},{"path":"/account.{format}/wordLists","description":"","operations":[{"parameters":[{"name":"auth_token","description":"auth_token of logged-in user","required":true,"paramType":"header"},{"name":"skip","description":"Results to skip","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordList[]","errorResponses":[{"reason":"Not authenticated.","code":403},{"reason":"User account not found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Fetches WordList objects for the logged-in user.","open":false,"httpMethod":"GET"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
data/api_docs/tag.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
data/api_docs/user.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
data/api_docs/users.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
data/api_docs/word.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"endPoints":[{"path":"/word.{format}/{word}","description":"","operations":[{"parameters":[{"name":"word","description":"String value of WordObject to return","required":true,"paramType":"path"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"includeSuggestions","description":"Return suggestions (for correct spelling, case variants, etc.)","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Word","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Given a word as a string, returns the WordObject that represents it","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/examples","description":"","operations":[{"parameters":[{"name":"word","description":"Word to return examples for","required":true,"paramType":"path"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"includeDuplicates","description":"Show duplicate examples from different sources","required":false,"paramType":"query"},{"name":"contentProvider","description":"Return results from a specific ContentProvider","required":false,"paramType":"query"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"skip","description":"Results to skip","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"ExampleSearchResults","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Returns examples for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/definitions","description":"","operations":[{"parameters":[{"name":"word","description":"Word to return definitions for","required":true,"paramType":"path"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"partOfSpeech","description":"CSV list of part-of-speech types","required":false,"paramType":"query"},{"name":"includeRelated","description":"Return related words with definitions","required":false,"paramType":"query"},{"name":"sourceDictionaries","description":"Gets from dictionaries in the supplied order of precedence","required":false,"allowableValues":"ahd, century, wiktionary, webster, wordnet","paramType":"query"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"includeTags","description":"Return a closed set of XML tags in response","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Definition[]","errorResponses":[{"reason":"Invalid word supplied.","code":400},{"reason":"No definitions found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Return definitions for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/frequency","description":"","operations":[{"parameters":[{"name":"word","description":"Word to return","required":true,"paramType":"path"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"startYear","description":"Starting Year","required":false,"paramType":"query"},{"name":"endYear","description":"Ending Year","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"FrequencySummary","errorResponses":[{"reason":"Invalid word supplied.","code":400},{"reason":"No results.","code":404}],"occurs":"1","condition":"any"},{"valueType":"FrequencySummaryWithErrorBars","errorResponses":[{"reason":"Invalid word supplied.","code":400},{"reason":"No results.","code":404}],"occurs":"1","condition":"errorBars=true"}],"summary":"Returns word usage over time","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/topExample","description":"","operations":[{"parameters":[{"name":"word","description":"Word to fetch examples for","required":true,"paramType":"path"},{"name":"contentProvider","description":"Return results from a specific ContentProvider","required":false,"paramType":"query"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Example","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Returns a top example for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/related","description":"","operations":[{"parameters":[{"name":"word","description":"Word for which to return related words","required":true,"paramType":"path"},{"name":"partOfSpeech","description":"CSV list of part-of-speech types","required":false,"paramType":"query"},{"name":"sourceDictionary","description":"Get data from a single dictionary. Valid options are ahd, century, wiktionary, webster, and wordnet.","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"type","description":"Relationship type","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Related[]","errorResponses":[{"reason":"Invalid word supplied.","code":400},{"reason":"No definitions found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Return related words (thesaurus data) for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/phrases","description":"","operations":[{"parameters":[{"name":"word","description":"Word to fetch phrases for","required":true,"paramType":"path"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"wlmi","description":"Minimum WLMI for the phrase","required":false,"paramType":"query"},{"name":"useCanonical","description":"If true will try to return the correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Bigram[]","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Fetches bi-gram phrases for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/hyphenation","description":"","operations":[{"parameters":[{"name":"word","description":"Word to get syllables for","required":true,"paramType":"path"},{"name":"useCanonical","description":"If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"sourceDictionary","description":"Get from a single dictionary. Valid options: ahd, century, wiktionary, webster, and wordnet.","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Syllable[]","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Returns syllable information for a word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/pronunciations","description":"","operations":[{"parameters":[{"name":"word","description":"Word to get pronunciations for","required":true,"paramType":"path"},{"name":"useCanonical","description":"If true will try to return a correct word root ('cats' -> 'cat'). If false returns exactly what was requested.","required":false,"paramType":"query"},{"name":"sourceDictionary","description":"Get from a single dictionary. Valid options: ahd, century, wiktionary, webster, and wordnet.","required":false,"paramType":"query"},{"name":"typeFormat","description":"Text pronunciation type","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"TextPron[]","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Returns text pronunciations for a given word","open":false,"httpMethod":"GET"}]},{"path":"/word.{format}/{word}/audio","description":"","operations":[{"parameters":[{"name":"word","description":"Word to get audio for.","required":true,"paramType":"path"},{"name":"useCanonical","description":"Use the canonical form of the word.","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"AudioPron[]","errorResponses":[{"reason":"Invalid word supplied.","code":400}],"occurs":"1","condition":"any"}],"summary":"Fetches audio metadata for a word.","open":false,"notes":"The metadata includes a time-expiring fileUrl which allows reading the audio file directly from the API. Currently only audio pronunciations from the American Heritage Dictionary in mp3 format are supported.","httpMethod":"GET"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"endPoints":[{"path":"/wordList.{format}/{wordListId}","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to fetch","required":true,"paramType":"path"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordList","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to access WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Fetches a WordList by ID","open":false,"httpMethod":"GET"}]},{"path":"/wordList.{format}/{wordListId}/deleteWords","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to use","required":true,"paramType":"path"},{"description":"Words to remove from WordList","required":false,"paramType":"body"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"void","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to modify WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Removes words from a WordList","open":false,"httpMethod":"POST"}]},{"path":"/wordList.{format}/{wordListId}/words","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to use","required":true,"paramType":"path"},{"name":"sortBy","description":"Field to sort by","required":false,"allowableValues":"createDate,alpha","paramType":"query"},{"name":"sortOrder","description":"Direction to sort","required":false,"allowableValues":"asc,desc","paramType":"query"},{"name":"skip","description":"Results to skip","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordListWord[]","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to access WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Fetches words in a WordList","open":false,"httpMethod":"GET"}]},{"path":"/wordList.{format}/{wordListId}/words","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to user","required":true,"paramType":"path"},{"description":"Words to add to WordList","required":false,"paramType":"body"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"void","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to access WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Adds words to a WordList","open":false,"httpMethod":"POST"}]},{"path":"/wordList.{format}/{wordListId}","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to update","required":true,"paramType":"path"},{"description":"Updated WordList","required":false,"paramType":"body"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"void","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to update WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Updates an existing WordList","open":false,"httpMethod":"PUT"}]},{"path":"/wordList.{format}/{wordListId}","description":"","operations":[{"parameters":[{"name":"wordListId","description":"ID of WordList to delete","required":true,"paramType":"path"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"void","errorResponses":[{"reason":"Invalid ID supplied","code":400},{"reason":"Not Authorized to delete WordList","code":403},{"reason":"WordList not found","code":404}],"occurs":"1","condition":"any"}],"summary":"Deletes an existing WordList","open":false,"httpMethod":"DELETE"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"endPoints":[{"path":"/wordLists","description":"","operations":[{"parameters":[{"description":"WordList to create","required":false,"paramType":"body"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordList","errorResponses":[{"reason":"Invalid WordList supplied or mandatory fields are missing.","code":400},{"reason":"Not authenticated.","code":403},{"reason":"WordList owner not found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Creates a WordList.","open":false,"httpMethod":"POST"}]},{"path":"/wordLists","description":"","operations":[{"parameters":[{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Documentation","errorResponses":[{"reason":"No data available","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns information about API parameters","open":true,"httpMethod":"GET"}]}]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"message": "invalid resource", "type": "error"}
|
data/api_docs/words.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"endPoints":[{"path":"/words.{format}/randomWord","description":"","operations":[{"parameters":[{"name":"hasDictionaryDef","defaultValue":"true","description":"Only return words with dictionary definitions","required":false,"paramType":"query"},{"name":"includePartOfSpeech","description":"CSV part-of-speech values to include","required":false,"paramType":"query"},{"name":"excludePartOfSpeech","description":"CSV part-of-speech values to exclude","required":false,"paramType":"query"},{"name":"minCorpusCount","description":"Minimum corpus frequency for terms","required":false,"paramType":"query"},{"name":"maxCorpusCount","description":"Maximum corpus frequency for terms","required":false,"paramType":"query"},{"name":"minDictionaryCount","description":"Minimum dictionary count","required":false,"paramType":"query"},{"name":"maxDictionaryCount","description":"Maximum dictionary count","required":false,"paramType":"query"},{"name":"minLength","description":"Minimum word length","required":false,"paramType":"query"},{"name":"maxLength","description":"Maximum word length","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"Word","errorResponses":[{"reason":"No word found.","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns a single random WordObject, in the format specified by the URL","open":false,"httpMethod":"GET"}]},{"path":"/words.{format}/randomWords","description":"","operations":[{"parameters":[{"name":"hasDictionaryDef","description":"Only return words with dictionary definitions","required":false,"paramType":"query"},{"name":"includePartOfSpeech","description":"CSV part-of-speech values to include","required":false,"paramType":"query"},{"name":"excludePartOfSpeech","description":"CSV part-of-speech values to exclude","required":false,"paramType":"query"},{"name":"minCorpusCount","description":"Minimum corpus frequency for terms (integer)","required":false,"paramType":"query"},{"name":"maxCorpusCount","description":"Maximum corpus frequency for terms (integer)","required":false,"paramType":"query"},{"name":"minDictionaryCount","description":"Minimum dictionary count (integer)","required":false,"paramType":"query"},{"name":"maxDictionaryCount","description":"Maximum dictionary count (integer)","required":false,"paramType":"query"},{"name":"minLength","description":"Minimum word length (characters)","required":false,"paramType":"query"},{"name":"maxLength","description":"Maximum word length (characters)","required":false,"paramType":"query"},{"name":"sortBy","description":"Attribute to sort by","required":false,"allowableValues":"alpha,count","paramType":"query"},{"name":"sortOrder","description":"Sort direction","required":false,"allowableValues":"asc,desc","paramType":"query"},{"name":"skip","description":"Results to skip (integer)","required":false,"paramType":"query"},{"name":"limit","description":"Maximum number of results to return (integer)","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordFrequency[]","errorResponses":[{"reason":"Invalid term supplied.","code":400},{"reason":"No results.","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns an array of random WordObjects, in the format specified by the URL","open":false,"httpMethod":"GET"}]},{"path":"/words.{format}/search","description":"","operations":[{"parameters":[{"name":"query","description":"Search term","required":true,"paramType":"query"},{"name":"caseSensitive","defaultValue":"true","description":"Search case sensitive","required":false,"allowableValues":"true | false","paramType":"query"},{"name":"includePartOfSpeech","description":"Only include these comma-delimited parts of speech","required":false,"paramType":"query"},{"name":"excludePartOfSpeech","description":"Exclude these comma-delimited parts of speech","required":false,"paramType":"query"},{"name":"minCorpusCount","defaultValue":"5","description":"Minimum corpus frequency for terms","required":false,"allowableValues":"non-negative integer","paramType":"query"},{"name":"maxCorpusCount","description":"Maximum corpus frequency for terms","required":false,"allowableValues":"non-negative integer","paramType":"query"},{"name":"minDictionaryCount","defaultValue":"1","description":"Minimum number of dictionary entries","required":false,"allowableValues":"non-negative integer","paramType":"query"},{"name":"maxDictionaryCount","description":"Maximum dictionary count","required":false,"allowableValues":"non-negative integer","paramType":"query"},{"name":"minLength","defaultValue":"1","description":"Minimum word length","required":false,"allowableValues":"0 to 1024","paramType":"query"},{"name":"maxLength","description":"Maximum word length","required":false,"allowableValues":"0 to 1024","paramType":"query"},{"name":"skip","defaultValue":"0","description":"Results to skip","required":false,"allowableValues":"0 to 1000","paramType":"query"},{"name":"limit","defaultValue":"10","description":"Maximum number of results to return","required":false,"allowableValues":"1 to 1000","paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordFrequency[]","errorResponses":[{"reason":"Invalid term supplied.","code":400},{"reason":"No results.","code":404}],"occurs":"1","condition":"any"}],"summary":"Searches words.","open":false,"httpMethod":"GET"}]},{"path":"/words.{format}/wordOfTheDay","description":"","operations":[{"parameters":[{"name":"date","description":"Fetches by date in yyyy-MM-dd","required":false,"paramType":"query"},{"name":"category","description":"Filters response by category","required":false,"paramType":"query"},{"name":"creator","description":"Filters response by username","required":false,"paramType":"query"},{"name":"format","defaultValue":"json","description":"API response format","required":true,"allowableValues":"json,xml","paramType":"path"}],"response":[{"valueType":"WordOfTheDay","errorResponses":[{"reason":"No data available","code":404}],"occurs":"1","condition":"any"}],"summary":"Returns a specific WordOfTheDay","open":true,"httpMethod":"GET"}]}]}
|
data/lib/wordnik.rb
CHANGED
@@ -1,90 +1,63 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
require 'wordnik/monkey_patches'
|
2
|
+
require 'wordnik/endpoint'
|
3
|
+
require 'wordnik/operation'
|
4
|
+
require 'wordnik/operation_parameter'
|
5
|
+
require 'wordnik/request'
|
6
|
+
require 'wordnik/resource'
|
7
|
+
require 'wordnik/response'
|
8
|
+
require 'wordnik/configuration'
|
9
|
+
|
10
|
+
module Wordnik
|
11
|
+
|
12
|
+
API_VERSION = "4.01.61"
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# A Wordnik configuration object. Must act like a hash and return sensible
|
17
|
+
# values for all Wordnik configuration options. See Wordnik::Configuration.
|
18
|
+
attr_accessor :configuration
|
19
|
+
|
20
|
+
attr_accessor :resources
|
21
|
+
|
22
|
+
# Call this method to modify defaults in your initializers.
|
23
|
+
#
|
24
|
+
# @example
|
25
|
+
# Wordnik.configure do |config|
|
26
|
+
# config.api_key = '1234567890abcdef'
|
27
|
+
# config.response_format = :json
|
28
|
+
# end
|
29
|
+
def configure
|
30
|
+
self.configuration ||= Configuration.new
|
31
|
+
yield(configuration) if block_given?
|
32
|
+
self.build_resources
|
17
33
|
end
|
18
|
-
end
|
19
|
-
|
20
|
-
def api_key=(api_key)
|
21
|
-
@api_key = api_key.to_s.dup
|
22
|
-
self.class.default_params :api_key => @api_key
|
23
|
-
@api_key
|
24
|
-
end
|
25
34
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
# Iterate over each disk-cached JSON resource documentation file
|
36
|
+
#
|
37
|
+
def build_resources
|
38
|
+
self.resources = {}
|
39
|
+
self.resource_names.map do |resource_name|
|
40
|
+
name = resource_name.underscore.to_sym # 'fooBar' => :foo_bar
|
41
|
+
filename = "api_docs/#{resource_name}.json"
|
42
|
+
resource = Resource.new(
|
43
|
+
:name => name,
|
44
|
+
:raw_data => JSON.parse(File.read(filename))
|
45
|
+
)
|
46
|
+
self.resources[name] = resource
|
47
|
+
end
|
34
48
|
end
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
def examples(word)
|
43
|
-
do_request("word.json/#{word.downcase}/examples")
|
44
|
-
end
|
45
|
-
|
46
|
-
def autocomplete(word_fragment, count = 100)
|
47
|
-
do_request("suggest.json/#{word_fragment.downcase}", :count => count)
|
48
|
-
end
|
49
|
-
|
50
|
-
def word_of_the_day
|
51
|
-
do_request("wordoftheday.json")
|
52
|
-
end
|
53
|
-
|
54
|
-
def random(has_definition = true)
|
55
|
-
do_request("words.json/randomWord", :hasDictionaryDef => has_definition)
|
56
|
-
end
|
57
|
-
|
58
|
-
def punctuation(word)
|
59
|
-
do_request("word.json/#{word.downcase}/punctuationFactor")
|
60
|
-
end
|
61
|
-
|
62
|
-
protected
|
63
|
-
|
64
|
-
def do_request(request, options = {})
|
65
|
-
handle_result(self.class.get("/#{request}", sanitize_options(options)))
|
66
|
-
end
|
67
|
-
|
68
|
-
def handle_result(result)
|
69
|
-
if result.is_a?(String)
|
70
|
-
raise 'Error in result.'
|
71
|
-
elsif result.is_a?(Hash) && result.key?('type') && result['type'] == 'error'
|
72
|
-
raise "Error in result: #{result['message']}"
|
73
|
-
else
|
74
|
-
result
|
49
|
+
|
50
|
+
# The names of all the resources.
|
51
|
+
# This is used by Wordnik.build_resources and the rake task that fetches remote API docs
|
52
|
+
#
|
53
|
+
def resource_names
|
54
|
+
%w(account corpus document partners system tag user users word words wordList wordLists wordoftheday)
|
75
55
|
end
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
options = {}
|
80
|
-
|
81
|
-
options[:count] = opts[:count].to_i if opts.key?(:count)
|
82
|
-
options[:hasDictionaryDef] = !!opts[:hasDictionaryDef] if opts.key?(:hasDictionaryDef)
|
83
|
-
|
84
|
-
if opts.key?(:partOfSpeech)
|
85
|
-
options[:partOfSpeech] = opts[:partOfSpeech].to_a.reject { |pos| !PARTS_OF_SPEECH.include?(pos.to_sym) }.join(',')
|
56
|
+
|
57
|
+
def word
|
58
|
+
Wordnik.resources[:word]
|
86
59
|
end
|
87
|
-
|
88
|
-
{ :query => options }
|
60
|
+
|
89
61
|
end
|
90
|
-
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Wordnik
|
2
|
+
|
3
|
+
class Configuration
|
4
|
+
|
5
|
+
# Wordnik API key
|
6
|
+
attr_accessor :api_key
|
7
|
+
|
8
|
+
# TODO: Steal all the auth stuff from the old gem!
|
9
|
+
# attr_accessor :auth_token
|
10
|
+
|
11
|
+
# Response format can be :json (default) or :xml
|
12
|
+
attr_accessor :response_format
|
13
|
+
|
14
|
+
# The URL of the API server
|
15
|
+
attr_accessor :base_uri
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@response_format = :json
|
19
|
+
@base_uri = 'api.wordnik.com/v4'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|