wordnik 0.3.8 → 0.3.9

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.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wordnik (0.3.8)
4
+ wordnik (0.3.9)
5
5
  activemodel (>= 3.0.3)
6
6
  addressable (>= 2.2.4)
7
7
  htmlentities (>= 4.2.4)
@@ -8,9 +8,7 @@ require 'wordnik/configuration'
8
8
  require 'wordnik/version'
9
9
 
10
10
  module Wordnik
11
-
12
- API_VERSION = "4.01.61"
13
-
11
+
14
12
  class << self
15
13
 
16
14
  # A Wordnik configuration object. Must act like a hash and return sensible
@@ -61,12 +59,17 @@ module Wordnik
61
59
 
62
60
  def authenticate
63
61
  return if Wordnik.authenticated?
62
+
63
+ if Wordnik.configuration.username.blank? || Wordnik.configuration.password.blank?
64
+ raise ConfigurationError, "Username and password are required to authenticate."
65
+ end
66
+
64
67
  response_body = Wordnik.account.get_authenticate(Wordnik.configuration.username, :password => Wordnik.configuration.password)
65
68
  if response_body.is_a?(Hash) && response_body['userId'].present? && response_body['token'].present?
66
69
  Wordnik.configuration.user_id = response_body['userId']
67
70
  Wordnik.configuration.auth_token = response_body['token']
68
71
  else
69
- raise response.inspect
72
+ raise ApiServerError, response_body.to_s
70
73
  end
71
74
  end
72
75
 
@@ -89,4 +92,10 @@ module Wordnik
89
92
 
90
93
  end
91
94
 
95
+ end
96
+
97
+ class ConfigurationError < StandardError
98
+ end
99
+
100
+ class ApiServerError < StandardError
92
101
  end
@@ -6,9 +6,7 @@ module Wordnik
6
6
  include ActiveModel::Conversion
7
7
  extend ActiveModel::Naming
8
8
 
9
- attr_accessor :name, :description, :required, :param_type, :default_value, :allowable_values
10
-
11
- validates_presence_of :name, :description, :required, :param_type, :default_value, :allowable_values
9
+ attr_accessor :name, :description, :required, :param_type, :default_value, :allowable_values, :param_access, :internal_description, :wrapper_name
12
10
 
13
11
  def initialize(attributes = {})
14
12
  attributes.each do |name, value|
@@ -10,23 +10,26 @@ module Wordnik
10
10
  include ActiveModel::Conversion
11
11
  extend ActiveModel::Naming
12
12
 
13
- attr_accessor :host, :port, :path, :format, :params, :body, :http_method, :headers
13
+ attr_accessor :host, :path, :format, :params, :body, :http_method, :headers
14
14
 
15
15
  validates_presence_of :host, :path, :format, :http_method
16
16
 
17
+ # All requests must have an HTTP method and a path
18
+ # Optionals parameters are :params, :headers, :body, :format, :host
19
+ #
17
20
  def initialize(http_method, path, attributes={})
18
21
  attributes[:format] ||= "json"
19
22
  attributes[:host] ||= Wordnik.configuration.base_uri
20
23
  attributes[:params] ||= {}
21
24
 
22
- # Set default headers, but allow them to be overridden
25
+ # Set default headers
23
26
  default_headers = {
24
27
  'User-Agent' => "Wordnik Ruby Gem #{Wordnik::VERSION}",
25
28
  'Content-Type' => "application/#{attributes[:format].downcase}",
26
29
  :api_key => Wordnik.configuration.api_key
27
30
  }
28
31
 
29
- # If a nil/blank api_key was passed in, remove it from the headers, even if the override is nil/blank
32
+ # If a nil/blank api_key was passed in, remove it from the headers, even if the override value is nil/blank
30
33
  if attributes[:headers].present? && attributes[:headers].has_key?(:api_key)
31
34
  default_headers.delete(:api_key)
32
35
  end
@@ -38,7 +41,13 @@ module Wordnik
38
41
  attributes[:headers].delete(:api_key) if attributes[:headers].present?
39
42
  end
40
43
 
44
+ # Merge argument headers into defaults
41
45
  attributes[:headers] = default_headers.merge(attributes[:headers] || {})
46
+
47
+ # Stick in the auth token if there is one
48
+ if Wordnik.authenticated?
49
+ attributes[:headers].merge!({:auth_token => Wordnik.configuration.auth_token})
50
+ end
42
51
 
43
52
  self.http_method = http_method.to_sym
44
53
  self.path = path
@@ -50,8 +59,7 @@ module Wordnik
50
59
  # Construct a base URL
51
60
  def url
52
61
  u = Addressable::URI.new
53
- u.host = self.host.sub(/\/$/, '')
54
- u.port = self.port if self.port.present?
62
+ u.host = self.host.sub(/\/$/, '') # Remove trailing slash
55
63
  u.path = self.interpreted_path
56
64
  u.scheme = "http" # For some reason this must be set _after_ host, otherwise Addressable gets upset
57
65
  u.to_s
@@ -76,10 +84,17 @@ module Wordnik
76
84
  URI.encode(p)
77
85
  end
78
86
 
79
- def interpreted_body
80
- return unless self.body.present?
81
- return self.body.to_json if self.body.is_a?(Hash)
82
- self.body
87
+ # Massage the request body into a state of readiness
88
+ # If body is a hash, camelize all keys then convert to a json string
89
+ #
90
+ def body=(value)
91
+ if value.is_a?(Hash)
92
+ value = value.inject({}) do |memo, (k,v)|
93
+ memo[k.to_s.camelize(:lower).to_sym] = v
94
+ memo
95
+ end
96
+ end
97
+ @body = value
83
98
  end
84
99
 
85
100
  # Iterate over all params,
@@ -132,21 +147,21 @@ module Wordnik
132
147
  when :post
133
148
  Typhoeus::Request.post(
134
149
  self.url_with_query_string,
135
- :body => self.interpreted_body,
150
+ :body => self.body.to_json,
136
151
  :headers => self.headers.stringify_keys
137
152
  )
138
153
 
139
154
  when :put
140
155
  Typhoeus::Request.put(
141
156
  self.url_with_query_string,
142
- :body => self.interpreted_body,
157
+ :body => self.body.to_json,
143
158
  :headers => self.headers.stringify_keys
144
159
  )
145
160
 
146
161
  when :delete
147
162
  Typhoeus::Request.delete(
148
163
  self.url_with_query_string,
149
- :body => self.interpreted_body,
164
+ :body => self.body.to_json,
150
165
  :headers => self.headers.stringify_keys
151
166
  )
152
167
  end
@@ -1,3 +1,3 @@
1
1
  module Wordnik
2
- VERSION = "0.3.8"
2
+ VERSION = "0.3.9"
3
3
  end
@@ -13,12 +13,13 @@ describe Wordnik::OperationParameter do
13
13
  describe "initialization" do
14
14
 
15
15
  it "successfully initializes" do
16
- @operation_parameter.respond_to?(:name).should == true
17
- @operation_parameter.respond_to?(:description).should == true
18
- @operation_parameter.respond_to?(:required).should == true
19
- @operation_parameter.respond_to?(:param_type).should == true
20
- @operation_parameter.respond_to?(:default_value).should == true
21
- @operation_parameter.respond_to?(:allowable_values).should == true
16
+ @operation_parameter.should respond_to(:name)
17
+ @operation_parameter.should respond_to(:description)
18
+ @operation_parameter.should respond_to(:required)
19
+ @operation_parameter.should respond_to(:param_type)
20
+ @operation_parameter.should respond_to(:default_value)
21
+ @operation_parameter.should respond_to(:allowable_values)
22
+ @operation_parameter.should respond_to(:param_access)
22
23
  end
23
24
 
24
25
  end
@@ -19,6 +19,11 @@ describe Wordnik::Request do
19
19
  it "gets default host from Wordnik.configuration" do
20
20
  @request.host.should == Wordnik.configuration.base_uri
21
21
  end
22
+
23
+ it "allows params to be nil" do
24
+ @request = Wordnik::Request.new(@default_http_method, @default_path, :params => nil)
25
+ @request.query_string.should == ""
26
+ end
22
27
 
23
28
  end
24
29
 
@@ -59,6 +64,20 @@ describe Wordnik::Request do
59
64
  end
60
65
 
61
66
  end
67
+
68
+ describe "body" do
69
+
70
+ it "camelCases parameters" do
71
+ @request = Wordnik::Request.new(@default_http_method, @default_path, @default_params.merge({
72
+ :body => {
73
+ :bad_dog => 'bud',
74
+ :goodDog => "dud"
75
+ }
76
+ }))
77
+ @request.body.keys.should == [:badDog, :goodDog]
78
+ end
79
+
80
+ end
62
81
 
63
82
  describe "path" do
64
83
 
@@ -43,3 +43,7 @@ def configure_wordnik
43
43
  end
44
44
 
45
45
  configure_wordnik
46
+
47
+ # A random string to tack onto stuff to ensure we're not seeing
48
+ # data from a previous test run
49
+ RAND = ("a".."z").to_a.sample(4).join
@@ -5,6 +5,9 @@ describe Wordnik do
5
5
  before(:each) do
6
6
  configure_wordnik
7
7
  end
8
+
9
+ after(:each) do
10
+ end
8
11
 
9
12
  context "initialization" do
10
13
 
@@ -49,10 +52,21 @@ describe Wordnik do
49
52
  config.password = 'wrong!'
50
53
  config.base_uri = "beta.wordnik.com/v4"
51
54
  end
55
+ lambda { Wordnik.authenticate }.should raise_error(ApiServerError)
52
56
  Wordnik.authenticated?.should == false
53
57
  end
54
58
 
55
- it "fails if username and/or password are absent"
59
+ it "fails if username and/or password are absent" do
60
+ Wordnik.de_authenticate
61
+ Wordnik.configure do |config|
62
+ config.api_key = CREDENTIALS[:api_key]
63
+ config.username = nil
64
+ config.password = nil
65
+ config.base_uri = "beta.wordnik.com/v4"
66
+ end
67
+ lambda { Wordnik.authenticate }.should raise_error(ConfigurationError, /username and password are required/i)
68
+ Wordnik.authenticated?.should == false
69
+ end
56
70
 
57
71
  end
58
72
 
@@ -90,15 +104,36 @@ describe Wordnik do
90
104
  @request.query_string.should == "?limit=10&skip=2"
91
105
  end
92
106
 
107
+ it "puts key-value arguments in the request body instead of the query params"
108
+
93
109
  end
94
110
 
95
111
  context "wordlists" do
96
112
 
113
+ before do
114
+ configure_wordnik
115
+ Wordnik.authenticate
116
+ end
117
+
97
118
  it "creates a wordlist" do
98
-
119
+ body = {
120
+ :name=> "Wordnik Ruby Test List #{RAND}",
121
+ :description => 'This is created by the test suite.',
122
+ :type => 'PUBLIC',
123
+ :user_id => Wordnik.configuration.user_id
124
+ }
125
+ request = Wordnik::Request.new(:post, "wordLists", :body => body)
126
+ request.response.body.should be_a_kind_of(Hash)
127
+ request.response.body.should have_key('permalink')
99
128
  end
100
129
 
101
- it "adds words"
130
+ it "finds the new wordlist" do
131
+ lists = Wordnik.account.get_word_lists
132
+ permalinks = lists.map { |list| list['permalink'] }
133
+ permalinks.should include("wordnik-ruby-test-list-#{RAND}")
134
+ end
135
+
136
+ it "finds the new wordlist and adds words to it"
102
137
 
103
138
  it "updates words"
104
139
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: wordnik
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.3.8
5
+ version: 0.3.9
6
6
  platform: ruby
7
7
  authors:
8
8
  - Zeke Sikelianos
@@ -11,7 +11,7 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-03-15 00:00:00 -07:00
14
+ date: 2011-03-18 00:00:00 -07:00
15
15
  default_executable:
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency