mls 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/README.rdoc +54 -0
- data/Rakefile +20 -2
- data/lib/mls.rb +307 -78
- data/lib/mls/errors.rb +13 -4
- data/lib/mls/model.rb +36 -5
- data/lib/mls/models/account.rb +74 -66
- data/lib/mls/models/address.rb +87 -6
- data/lib/mls/models/area.rb +27 -0
- data/lib/mls/models/flyer.rb +41 -0
- data/lib/mls/models/listing.rb +180 -34
- data/lib/mls/models/photo.rb +25 -3
- data/lib/mls/models/tour_request.rb +18 -31
- data/lib/mls/parser.rb +5 -4
- data/lib/mls/properties/datetime.rb +5 -1
- data/lib/mls/properties/decimal.rb +3 -1
- data/lib/mls/properties/hash.rb +7 -0
- data/lib/mls/resource.rb +35 -5
- data/lib/rdoc/generator/template/42floors/_context.rhtml +209 -0
- data/lib/rdoc/generator/template/42floors/_head.rhtml +7 -0
- data/lib/rdoc/generator/template/42floors/class.rhtml +39 -0
- data/lib/rdoc/generator/template/42floors/file.rhtml +35 -0
- data/lib/rdoc/generator/template/42floors/index.rhtml +13 -0
- data/lib/rdoc/generator/template/42floors/resources/apple-touch-icon.png +0 -0
- data/lib/rdoc/generator/template/42floors/resources/css/github.css +129 -0
- data/lib/rdoc/generator/template/42floors/resources/css/main.css +339 -0
- data/lib/rdoc/generator/template/42floors/resources/css/panel.css +389 -0
- data/lib/rdoc/generator/template/42floors/resources/css/reset.css +48 -0
- data/lib/rdoc/generator/template/42floors/resources/favicon.ico +0 -0
- data/lib/rdoc/generator/template/42floors/resources/i/arrows.png +0 -0
- data/lib/rdoc/generator/template/42floors/resources/i/results_bg.png +0 -0
- data/lib/rdoc/generator/template/42floors/resources/i/tree_bg.png +0 -0
- data/lib/rdoc/generator/template/42floors/resources/js/highlight.pack.js +1 -0
- data/lib/rdoc/generator/template/42floors/resources/js/jquery-1.3.2.min.js +19 -0
- data/lib/rdoc/generator/template/42floors/resources/js/jquery-effect.js +593 -0
- data/lib/rdoc/generator/template/42floors/resources/js/main.js +20 -0
- data/lib/rdoc/generator/template/42floors/resources/js/searchdoc.js +442 -0
- data/lib/rdoc/generator/template/42floors/resources/panel/index.html +73 -0
- data/lib/rdoc/generator/template/42floors/se_index.rhtml +8 -0
- data/mls.gemspec +7 -4
- data/test/factories/account.rb +18 -0
- data/test/factories/address.rb +15 -0
- data/test/factories/listing.rb +30 -0
- data/test/factories/tour_request.rb +9 -0
- data/test/fixtures/flyer.pdf +68 -0
- data/test/test_helper.rb +44 -5
- data/test/units/models/test_account.rb +20 -43
- data/test/units/models/test_flyer.rb +22 -0
- data/test/units/models/test_listing.rb +119 -0
- data/test/units/models/test_photo.rb +136 -3
- data/test/units/models/test_tour_request.rb +25 -20
- data/test/units/test_errors.rb +12 -4
- data/test/units/test_mls.rb +263 -3
- data/test/units/test_resource.rb +1 -0
- metadata +78 -57
- data/lib/mls/models/user.rb +0 -7
- data/lib/mls/version.rb +0 -3
data/.gitignore
CHANGED
data/README.rdoc
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
= \MLS - 42Floors Multiple Listing Service
|
2
|
+
|
3
|
+
MLS provides an Ruby interface for interacting with Commercial Real Estate
|
4
|
+
Listings provided by 42Floors.com.
|
5
|
+
|
6
|
+
*home* - https://mls.42floors.com
|
7
|
+
|
8
|
+
*docs* - The best way to get this is to run `rake docs`. We plan to upload this
|
9
|
+
|
10
|
+
*bugs* - https://github.com/42floors/mls/issues
|
11
|
+
|
12
|
+
== System Requirements
|
13
|
+
|
14
|
+
== Installation
|
15
|
+
|
16
|
+
$ gem install mls
|
17
|
+
|
18
|
+
== Configuration
|
19
|
+
|
20
|
+
The Gem needs to be configured with your API key and URL to connect to the
|
21
|
+
42Floors MLS. For now, ask us to provide you with an API key.
|
22
|
+
|
23
|
+
#!ruby
|
24
|
+
require 'mls'
|
25
|
+
|
26
|
+
MLS.url = "https://{API_KEY}@mls.42floors.com"
|
27
|
+
|
28
|
+
You can also override the MLS asset host if you are connecting to the staging
|
29
|
+
environment and want the photos to load.
|
30
|
+
|
31
|
+
#!ruby
|
32
|
+
MLS.asset_host = "assets.42floors.com"
|
33
|
+
|
34
|
+
== Bugs
|
35
|
+
|
36
|
+
If you think you found a bug, file a ticket on the {issues
|
37
|
+
tracker}[https://github.com/42floors/mls/issues] on github.
|
38
|
+
|
39
|
+
To get your bug fixed as fast as possible please include a sample file that
|
40
|
+
illustrates the problem or link to a repository and include steps to reproduce
|
41
|
+
the issue. Here are some examples of good issues:
|
42
|
+
|
43
|
+
* https://github.com/rdoc/rdoc/issues/55
|
44
|
+
* https://github.com/rdoc/rdoc/issues/61
|
45
|
+
|
46
|
+
== License
|
47
|
+
|
48
|
+
#TODO
|
49
|
+
|
50
|
+
== Warranty
|
51
|
+
|
52
|
+
This software is provided "as is" and without any express or implied
|
53
|
+
warranties, including, without limitation, the implied warranties of
|
54
|
+
merchantability and fitness for a particular purpose.
|
data/Rakefile
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require 'rake/testtask'
|
3
|
+
require 'sdoc'
|
4
|
+
require 'rdoc/task'
|
3
5
|
|
4
6
|
task :console do
|
5
7
|
exec 'irb -I lib -r mls.rb'
|
@@ -10,8 +12,24 @@ task :c => :console
|
|
10
12
|
Rake::TestTask.new do |t|
|
11
13
|
t.libs << 'lib' << 'test'
|
12
14
|
t.test_files = FileList['test/units/**/test*.rb']
|
13
|
-
t.warning = true
|
14
|
-
t.verbose = true
|
15
|
+
#t.warning = true
|
16
|
+
#t.verbose = true
|
17
|
+
end
|
18
|
+
|
19
|
+
Rake::RDocTask.new do |rd|
|
20
|
+
rd.main = 'README.rdoc'
|
21
|
+
rd.title = 'MLS Documentation'
|
22
|
+
rd.rdoc_dir = 'doc'
|
23
|
+
|
24
|
+
rd.options << '-f' << 'sdoc' # explictly set shtml generator
|
25
|
+
rd.options << '-T' << '42floors'
|
26
|
+
rd.options << '-e' << 'UTF-8'
|
27
|
+
rd.options << '-g'
|
28
|
+
rd.options << '--include' << 'lib/rdoc'
|
29
|
+
|
30
|
+
rd.rdoc_files.include('README.rdoc')
|
31
|
+
rd.rdoc_files.include('lib/**/*.rb')
|
32
|
+
rd.rdoc_files.exclude('lib/rdoc/**/*.rb')
|
15
33
|
end
|
16
34
|
|
17
35
|
desc "Run tests"
|
data/lib/mls.rb
CHANGED
@@ -6,159 +6,385 @@ require 'singleton'
|
|
6
6
|
require 'yajl'
|
7
7
|
require 'bigdecimal'
|
8
8
|
require 'bigdecimal/util'
|
9
|
-
require 'active_support'
|
10
|
-
require 'active_resource'
|
9
|
+
require 'active_support/core_ext'
|
11
10
|
require 'date'
|
12
11
|
require 'time'
|
13
12
|
|
14
|
-
class
|
15
|
-
old_to_s = instance_method :to_s
|
16
|
-
|
17
|
-
define_method :to_s do |param='F'|
|
18
|
-
old_to_s.bind(self).(param)
|
19
|
-
end
|
13
|
+
class Decimal #:nodoc:
|
20
14
|
end
|
21
15
|
|
22
|
-
class
|
23
|
-
end
|
24
|
-
class Boolean
|
16
|
+
class Boolean #:nodoc:
|
25
17
|
end
|
26
18
|
|
19
|
+
# _MLS_ is a low-level API. It provides basic HTTP #get, #post, #put, and #delete
|
20
|
+
# calls to the MLS. It can also provides basic error checking of responses.
|
27
21
|
class MLS
|
28
22
|
include Singleton
|
29
23
|
|
30
24
|
API_VERSION = '0.1.0'
|
31
25
|
|
32
|
-
|
26
|
+
attr_reader :url
|
27
|
+
attr_writer :asset_host
|
28
|
+
attr_accessor :api_key, :auth_key, :logger
|
33
29
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
@
|
40
|
-
@
|
30
|
+
# Sets the API Token and Host of the MLS Server
|
31
|
+
#
|
32
|
+
# #!ruby
|
33
|
+
# MLS.url = "https://mls.42floors.com/API_KEY"
|
34
|
+
def url=(uri) # TODO: testme
|
35
|
+
@url = URI.parse(uri)
|
36
|
+
@api_key = CGI.unescape(@url.user)
|
37
|
+
@host, @port = @url.host, @url.port
|
41
38
|
end
|
42
39
|
|
43
|
-
def logger
|
40
|
+
def logger # TODO: testme
|
44
41
|
@logger ||= default_logger
|
45
42
|
end
|
46
43
|
|
47
|
-
|
44
|
+
# Returns the current connection to the MLS or if connection has been made
|
45
|
+
# it returns a new connection
|
46
|
+
def connection # TODO: testme
|
48
47
|
@connection ||= Net::HTTP.new(@host, @port)
|
49
48
|
end
|
50
49
|
|
51
|
-
|
50
|
+
# provides the asset host, if asset_host is set then it is returned,
|
51
|
+
# otherwise it queries the MLS for this configuration.
|
52
|
+
def asset_host # TODO: testme
|
52
53
|
@asset_host ||= get('/asset_host').body
|
53
54
|
end
|
54
55
|
|
55
|
-
def
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
56
|
+
def headers # TODO: testme
|
57
|
+
h = {
|
58
|
+
'Content-Type' => 'application/json',
|
59
|
+
'X-42Floors-API-Version' => API_VERSION,
|
60
|
+
'X-42Floors-API-Key' => api_key
|
61
|
+
}
|
62
|
+
h['X-42Floors-API-Auth-Key'] = auth_key if auth_key
|
63
|
+
h
|
60
64
|
end
|
61
65
|
|
62
|
-
def
|
63
|
-
req =
|
64
|
-
|
65
|
-
|
66
|
+
def add_headers(req) # TODO: testme
|
67
|
+
headers.each { |k, v| req[k] = v }
|
68
|
+
end
|
69
|
+
|
70
|
+
# Gets to +url+ on the MLS Server. Automatically includes any headers returned
|
71
|
+
# by the MLS#headers function.
|
72
|
+
#
|
73
|
+
# Paramaters::
|
74
|
+
#
|
75
|
+
# * +url+ - The +url+ on the server to Get to. This url will automatically
|
76
|
+
# be prefixed with <tt>"/api"</tt>. To get to <tt>"/api/accounts"</tt>
|
77
|
+
# pass <tt>"/accounts"</tt> as +url+
|
78
|
+
# * +params+ - A Hash or Ruby Object that responds to #to_param. The result
|
79
|
+
# of this method is appended on the URL as query params
|
80
|
+
# * +valid_response_codes+ - An Array of HTTP response codes that should be
|
81
|
+
# considered accepable and not raise exceptions. For example If you don't
|
82
|
+
# want a MLS::Exception::NotFound to be raised when a GET request returns
|
83
|
+
# a 404 pass in 404, and the response body will be returned if the status
|
84
|
+
# code is a 404 as it does if the status code is in the 200..299 rage. Status
|
85
|
+
# codes in the 200..299 range are *always* considred acceptable
|
86
|
+
#
|
87
|
+
# Return Value::
|
88
|
+
#
|
89
|
+
# Returns the return value of the <tt>&block</tt> if given, otherwise the response
|
90
|
+
# object
|
91
|
+
#
|
92
|
+
# Examples:
|
93
|
+
#
|
94
|
+
# #!ruby
|
95
|
+
# MLS.get('/example') # => #<Net::HTTP::Response>
|
96
|
+
#
|
97
|
+
# MLS.get('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
|
98
|
+
#
|
99
|
+
# MLS.get('/404') # => raises MLS::Exception::NotFound
|
100
|
+
#
|
101
|
+
# MLS.get('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
|
102
|
+
#
|
103
|
+
# MLS.get('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
|
104
|
+
#
|
105
|
+
# MLS.get('/404', nil, 404) # => #<Net::HTTP::Response>
|
106
|
+
#
|
107
|
+
# # this will still raise an exception if the response_code is not valid
|
108
|
+
# # and the block will not be called
|
109
|
+
# MLS.get('/act') do |response, response_code|
|
110
|
+
# # ...
|
111
|
+
# end
|
112
|
+
def get(url, params={}, *valid_response_codes, &block)
|
113
|
+
params ||= {}
|
66
114
|
|
115
|
+
req = Net::HTTP::Get.new("/api#{url}?" + params.to_param)
|
116
|
+
add_headers(req)
|
117
|
+
|
67
118
|
response = connection.request(req)
|
119
|
+
handle_response(response, valid_response_codes)
|
68
120
|
if block_given?
|
69
|
-
yield(response.code.to_i
|
121
|
+
yield(response, response.code.to_i)
|
70
122
|
else
|
71
|
-
|
123
|
+
response
|
72
124
|
end
|
73
125
|
end
|
74
|
-
|
75
|
-
|
76
|
-
|
126
|
+
|
127
|
+
# Puts to +url+ on the MLS Server. Automatically includes any headers returned
|
128
|
+
# by the MLS#headers function.
|
129
|
+
#
|
130
|
+
# Paramaters::
|
131
|
+
#
|
132
|
+
# * +url+ - The +url+ on the server to Put to. This url will automatically
|
133
|
+
# be prefixed with <tt>"/api"</tt>. To put to <tt>"/api/accounts"</tt>
|
134
|
+
# pass <tt>"/accounts"</tt> as +url+
|
135
|
+
# * +body+ - A Ruby object which is converted into JSON and added in the request
|
136
|
+
# Body.
|
137
|
+
# * +valid_response_codes+ - An Array of HTTP response codes that should be
|
138
|
+
# considered accepable and not raise exceptions. For example If you don't
|
139
|
+
# want a MLS::Exception::NotFound to be raised when a PUT request returns
|
140
|
+
# a 404 pass in 404, and the response body will be returned if the status
|
141
|
+
# code is a 404 as it does if the status code is in the 200..299 rage. Status
|
142
|
+
# codes in the 200..299 range are *always* considred acceptable
|
143
|
+
#
|
144
|
+
# Return Value::
|
145
|
+
#
|
146
|
+
# Returns the return value of the <tt>&block</tt> if given, otherwise the response
|
147
|
+
# object
|
148
|
+
#
|
149
|
+
# Examples:
|
150
|
+
#
|
151
|
+
# #!ruby
|
152
|
+
# MLS.put('/example') # => #<Net::HTTP::Response>
|
153
|
+
#
|
154
|
+
# MLS.put('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
|
155
|
+
#
|
156
|
+
# MLS.put('/404') # => raises MLS::Exception::NotFound
|
157
|
+
#
|
158
|
+
# MLS.put('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
|
159
|
+
#
|
160
|
+
# MLS.put('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
|
161
|
+
#
|
162
|
+
# MLS.put('/404', nil, 404) # => #<Net::HTTP::Response>
|
163
|
+
#
|
164
|
+
# # this will still raise an exception if the response_code is not valid
|
165
|
+
# # and the block will not be called
|
166
|
+
# MLS.put('/act') do |response, response_code|
|
167
|
+
# # ...
|
168
|
+
# end
|
169
|
+
def put(url, body={}, *valid_response_codes, &block)
|
170
|
+
body ||= {}
|
171
|
+
|
172
|
+
req = Net::HTTP::Put.new("/api#{url}")
|
77
173
|
req.body = Yajl::Encoder.encode(body)
|
78
174
|
add_headers(req)
|
79
175
|
|
80
176
|
response = connection.request(req)
|
177
|
+
handle_response(response, valid_response_codes)
|
178
|
+
|
81
179
|
if block_given?
|
82
|
-
yield(response.code.to_i
|
180
|
+
yield(response, response.code.to_i)
|
83
181
|
else
|
84
|
-
|
182
|
+
response
|
85
183
|
end
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
|
184
|
+
end
|
185
|
+
|
186
|
+
# Posts to +url+ on the MLS Server. Automatically includes any headers returned
|
187
|
+
# by the MLS#headers function.
|
188
|
+
#
|
189
|
+
# Paramaters::
|
190
|
+
#
|
191
|
+
# * +url+ - The +url+ on the server to Post to. This url will automatically
|
192
|
+
# be prefixed with <tt>"/api"</tt>. To post to <tt>"/api/accounts"</tt>
|
193
|
+
# pass <tt>"/accounts"</tt> as +url+
|
194
|
+
# * +body+ - A Ruby object which is converted into JSON and added in the request
|
195
|
+
# Body.
|
196
|
+
# * +valid_response_codes+ - An Array of HTTP response codes that should be
|
197
|
+
# considered accepable and not raise exceptions. For example If you don't
|
198
|
+
# want a MLS::Exception::NotFound to be raised when a POST request returns
|
199
|
+
# a 404 pass in 404, and the response body will be returned if the status
|
200
|
+
# code is a 404 as it does if the status code is in the 200..299 rage. Status
|
201
|
+
# codes in the 200..299 range are *always* considred acceptable
|
202
|
+
#
|
203
|
+
# Return Value::
|
204
|
+
#
|
205
|
+
# Returns the return value of the <tt>&block</tt> if given, otherwise the response
|
206
|
+
# object
|
207
|
+
#
|
208
|
+
# Examples:
|
209
|
+
#
|
210
|
+
# #!ruby
|
211
|
+
# MLS.post('/example') # => #<Net::HTTP::Response>
|
212
|
+
#
|
213
|
+
# MLS.post('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
|
214
|
+
#
|
215
|
+
# MLS.post('/404') # => raises MLS::Exception::NotFound
|
216
|
+
#
|
217
|
+
# MLS.post('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
|
218
|
+
#
|
219
|
+
# MLS.post('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
|
220
|
+
#
|
221
|
+
# MLS.post('/404', nil, 404) # => #<Net::HTTP::Response>
|
222
|
+
#
|
223
|
+
# # this will still raise an exception if the response_code is not valid
|
224
|
+
# # and the block will not be called
|
225
|
+
# MLS.post('/act') do |response, response_code|
|
226
|
+
# # ...
|
227
|
+
# end
|
228
|
+
def post(url, body={}, *valid_response_codes, &block)
|
229
|
+
body ||= {}
|
230
|
+
|
231
|
+
req = Net::HTTP::Post.new("/api#{url}")
|
90
232
|
req.body = Yajl::Encoder.encode(body)
|
91
233
|
add_headers(req)
|
92
234
|
|
93
235
|
response = connection.request(req)
|
236
|
+
handle_response(response, valid_response_codes)
|
237
|
+
|
94
238
|
if block_given?
|
95
|
-
yield(response.code.to_i
|
239
|
+
yield(response, response.code.to_i)
|
96
240
|
else
|
97
|
-
|
241
|
+
response
|
98
242
|
end
|
99
243
|
end
|
100
244
|
|
101
|
-
|
102
|
-
|
103
|
-
|
245
|
+
# Deletes to +url+ on the MLS Server. Automatically includes any headers returned
|
246
|
+
# by the MLS#headers function.
|
247
|
+
#
|
248
|
+
# Paramaters::
|
249
|
+
#
|
250
|
+
# * +url+ - The +url+ on the server to Post to. This url will automatically
|
251
|
+
# be prefixed with <tt>"/api"</tt>. To delete to <tt>"/api/accounts"</tt>
|
252
|
+
# pass <tt>"/accounts"</tt> as +url+
|
253
|
+
# * +body+ - A Ruby object which is converted into JSON and added in the request
|
254
|
+
# Body.
|
255
|
+
# * +valid_response_codes+ - An Array of HTTP response codes that should be
|
256
|
+
# considered accepable and not raise exceptions. For example If you don't
|
257
|
+
# want a MLS::Exception::NotFound to be raised when a POST request returns
|
258
|
+
# a 404 pass in 404, and the response body will be returned if the status
|
259
|
+
# code is a 404 as it does if the status code is in the 200..299 rage. Status
|
260
|
+
# codes in the 200..299 range are *always* considred acceptable
|
261
|
+
#
|
262
|
+
# Return Value::
|
263
|
+
#
|
264
|
+
# Returns the return value of the <tt>&block</tt> if given, otherwise the
|
265
|
+
# response object
|
266
|
+
#
|
267
|
+
# Examples:
|
268
|
+
#
|
269
|
+
# #!ruby
|
270
|
+
# MLS.delete('/example') # => #<Net::HTTP::Response>
|
271
|
+
#
|
272
|
+
# MLS.delete('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
|
273
|
+
#
|
274
|
+
# MLS.delete('/404') # => raises MLS::Exception::NotFound
|
275
|
+
#
|
276
|
+
# MLS.delete('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
|
277
|
+
#
|
278
|
+
# MLS.delete('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
|
279
|
+
#
|
280
|
+
# MLS.delete('/404', nil, 404) # => #<Net::HTTP::Response>
|
281
|
+
#
|
282
|
+
# # this will still raise an exception if the response_code is not valid
|
283
|
+
# # and the block will not be called
|
284
|
+
# MLS.delete('/act') do |response, response_code|
|
285
|
+
# # ...
|
286
|
+
# end
|
287
|
+
def delete(url, body={}, *valid_response_codes, &block)
|
288
|
+
body ||= {}
|
289
|
+
|
290
|
+
req = Net::HTTP::Delete.new("/api#{url}")
|
291
|
+
req.body = Yajl::Encoder.encode(body)
|
104
292
|
add_headers(req)
|
293
|
+
|
105
294
|
response = connection.request(req)
|
295
|
+
handle_response(response, valid_response_codes)
|
106
296
|
if block_given?
|
107
|
-
yield(response.code.to_i
|
297
|
+
yield(response, response.code.to_i)
|
108
298
|
else
|
109
|
-
|
299
|
+
response
|
110
300
|
end
|
111
|
-
|
112
|
-
response
|
113
301
|
end
|
114
302
|
|
115
|
-
|
303
|
+
# Raise an MLS::Exception based on the response_code, unless the response_code
|
304
|
+
# is include in the valid_response_codes Array
|
305
|
+
#
|
306
|
+
# Paramaters::
|
307
|
+
#
|
308
|
+
# * +response+ - The Net::HTTP::Response object
|
309
|
+
# * +valid_response_codes+ - An Array, Integer, or Range. If it's Array the
|
310
|
+
# Array can include both Integers or Ranges.
|
311
|
+
#
|
312
|
+
# Return Value::
|
313
|
+
#
|
314
|
+
# If an exception is not raised the +response+ is returned
|
315
|
+
#
|
316
|
+
# Examples:
|
317
|
+
#
|
318
|
+
# #!ruby
|
319
|
+
# MLS.handle_response(<Net::HTTP::Response @code=200>) # => <Net::HTTP::Response @code=200>
|
320
|
+
#
|
321
|
+
# MLS.handle_response(<Net::HTTP::Response @code=404>) # => raises MLS::Exception::NotFound
|
322
|
+
#
|
323
|
+
# MLS.handle_response(<Net::HTTP::Response @code=500>) # => raises MLS::Exception
|
324
|
+
#
|
325
|
+
# MLS.handle_response(<Net::HTTP::Response @code=404>, 404) # => <Net::HTTP::Response @code=404>
|
326
|
+
#
|
327
|
+
# MLS.handle_response(<Net::HTTP::Response @code=500>, 404, 500) # => <Net::HTTP::Response @code=500>
|
328
|
+
#
|
329
|
+
# MLS.handle_response(<Net::HTTP::Response @code=405>, 300, 400..499) # => <Net::HTTP::Response @code=405>
|
330
|
+
#
|
331
|
+
# MLS.handle_response(<Net::HTTP::Response @code=405>, [300, 400..499]) # => <Net::HTTP::Response @code=405>
|
332
|
+
def handle_response(response, *valid_response_codes)
|
116
333
|
if response['X-42Floors-API-Version-Deprecated']
|
117
334
|
logger.warn("DEPRECATION WARNING: API v#{API_VERSION} is being phased out")
|
118
335
|
end
|
119
336
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
super MLS::Exception, error_code
|
337
|
+
code = response.code.to_i
|
338
|
+
valid_response_codes.flatten!
|
339
|
+
valid_response_codes << (200..299)
|
340
|
+
|
341
|
+
if !valid_response_codes.detect{|i| i.is_a?(Range) ? i.include?(code) : i == code}
|
342
|
+
case code
|
343
|
+
when 400
|
344
|
+
raise MLS::Exception::BadRequest, response.body
|
345
|
+
when 401
|
346
|
+
raise MLS::Exception::Unauthorized, response.body
|
347
|
+
when 404, 410
|
348
|
+
raise MLS::Exception::NotFound
|
349
|
+
when 422
|
350
|
+
raise MLS::Exception::ApiVersionUnsupported, response.body
|
351
|
+
when 503
|
352
|
+
raise MLS::Exception::ServiceUnavailable, response.body
|
353
|
+
when 300..599
|
354
|
+
raise MLS::Exception, code
|
355
|
+
end
|
140
356
|
end
|
357
|
+
|
358
|
+
response
|
141
359
|
end
|
142
|
-
|
143
|
-
|
360
|
+
|
361
|
+
# Ping the MLS. If everything is configured and operating correctly <tt>"pong"</tt>
|
362
|
+
# will be returned. Otherwise and MLS::Exception should be thrown.
|
363
|
+
#
|
364
|
+
# #!ruby
|
365
|
+
# MLS.ping # => "pong"
|
366
|
+
#
|
367
|
+
# MLS.ping # raises MLS::Exception::ServiceUnavailable if a 503 is returned
|
368
|
+
def ping # TODO: testme
|
144
369
|
get('/ping').body
|
145
370
|
end
|
146
371
|
|
147
|
-
def auth_ping
|
372
|
+
def auth_ping # TODO: testme
|
148
373
|
post('/ping').body
|
149
374
|
end
|
150
375
|
|
151
|
-
def default_logger
|
376
|
+
def default_logger # TODO: testme
|
152
377
|
logger = Logger.new(STDOUT)
|
153
378
|
logger.level = Logger::INFO
|
154
379
|
logger
|
155
380
|
end
|
156
381
|
|
157
|
-
|
382
|
+
# Delegates all uncauge class method calls to the singleton
|
383
|
+
def self.method_missing(method, *args, &block) #:nodoc: # TODO: testme
|
158
384
|
instance.__send__(method, *args, &block)
|
159
385
|
end
|
160
386
|
|
161
|
-
def self.parse(json)
|
387
|
+
def self.parse(json) # TODO: testme
|
162
388
|
Yajl::Parser.new(:symbolize_keys => true).parse(json)
|
163
389
|
end
|
164
390
|
|
@@ -175,6 +401,7 @@ require 'mls/properties/boolean'
|
|
175
401
|
require 'mls/properties/decimal'
|
176
402
|
require 'mls/properties/datetime'
|
177
403
|
require 'mls/properties/string'
|
404
|
+
require 'mls/properties/hash'
|
178
405
|
|
179
406
|
# Models
|
180
407
|
require 'mls/model'
|
@@ -183,3 +410,5 @@ require 'mls/models/listing'
|
|
183
410
|
require 'mls/models/address'
|
184
411
|
require 'mls/models/photo'
|
185
412
|
require 'mls/models/tour_request'
|
413
|
+
require 'mls/models/flyer'
|
414
|
+
require 'mls/models/area'
|