mls 0.14.0 → 1.0.0

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Rakefile +6 -6
  4. data/lib/mls.rb +73 -427
  5. data/lib/mls/account.rb +15 -0
  6. data/lib/mls/address.rb +4 -0
  7. data/lib/mls/agency.rb +6 -0
  8. data/lib/mls/brokerage.rb +7 -0
  9. data/lib/mls/coworking_space.rb +5 -0
  10. data/lib/mls/floorplan.rb +11 -0
  11. data/lib/mls/flyer.rb +11 -0
  12. data/lib/mls/lease.rb +2 -0
  13. data/lib/mls/listing.rb +135 -0
  14. data/lib/mls/locality.rb +6 -0
  15. data/lib/mls/photo.rb +18 -0
  16. data/lib/mls/property.rb +24 -0
  17. data/lib/mls/region.rb +13 -0
  18. data/lib/mls/sale.rb +2 -0
  19. data/lib/mls/space.rb +3 -0
  20. data/lib/mls/sublease.rb +2 -0
  21. data/lib/mls/use.rb +25 -0
  22. data/mls.gemspec +11 -15
  23. data/test/mls/attribute_test.rb +55 -0
  24. data/test/mls/resource_test.rb +31 -0
  25. data/test/mls_test.rb +27 -0
  26. data/test/test_helper.rb +26 -27
  27. metadata +43 -75
  28. data/lib/mls/attribute.rb +0 -44
  29. data/lib/mls/attributes/array.rb +0 -11
  30. data/lib/mls/attributes/boolean.rb +0 -9
  31. data/lib/mls/attributes/datetime.rb +0 -25
  32. data/lib/mls/attributes/decimal.rb +0 -21
  33. data/lib/mls/attributes/fixnum.rb +0 -16
  34. data/lib/mls/attributes/hash.rb +0 -15
  35. data/lib/mls/attributes/string.rb +0 -15
  36. data/lib/mls/errors.rb +0 -29
  37. data/lib/mls/factories/account.rb +0 -34
  38. data/lib/mls/factories/address.rb +0 -16
  39. data/lib/mls/factories/listing.rb +0 -29
  40. data/lib/mls/factories_helper.rb +0 -7
  41. data/lib/mls/model.rb +0 -125
  42. data/lib/mls/models/account.rb +0 -174
  43. data/lib/mls/models/address.rb +0 -58
  44. data/lib/mls/models/brokerage.rb +0 -31
  45. data/lib/mls/models/floorplan.rb +0 -45
  46. data/lib/mls/models/flyer.rb +0 -45
  47. data/lib/mls/models/listing.rb +0 -394
  48. data/lib/mls/models/pdf.rb +0 -15
  49. data/lib/mls/models/photo.rb +0 -40
  50. data/lib/mls/models/property.rb +0 -114
  51. data/lib/mls/models/region.rb +0 -56
  52. data/lib/mls/models/tour.rb +0 -54
  53. data/lib/mls/models/video.rb +0 -18
  54. data/lib/mls/parser.rb +0 -74
  55. data/lib/mls/resource.rb +0 -99
  56. data/lib/rdoc/generator/template/42floors/_context.rhtml +0 -209
  57. data/lib/rdoc/generator/template/42floors/_head.rhtml +0 -7
  58. data/lib/rdoc/generator/template/42floors/class.rhtml +0 -39
  59. data/lib/rdoc/generator/template/42floors/file.rhtml +0 -35
  60. data/lib/rdoc/generator/template/42floors/index.rhtml +0 -13
  61. data/lib/rdoc/generator/template/42floors/resources/apple-touch-icon.png +0 -0
  62. data/lib/rdoc/generator/template/42floors/resources/css/github.css +0 -129
  63. data/lib/rdoc/generator/template/42floors/resources/css/main.css +0 -339
  64. data/lib/rdoc/generator/template/42floors/resources/css/panel.css +0 -389
  65. data/lib/rdoc/generator/template/42floors/resources/css/reset.css +0 -48
  66. data/lib/rdoc/generator/template/42floors/resources/favicon.ico +0 -0
  67. data/lib/rdoc/generator/template/42floors/resources/i/arrows.png +0 -0
  68. data/lib/rdoc/generator/template/42floors/resources/i/results_bg.png +0 -0
  69. data/lib/rdoc/generator/template/42floors/resources/i/tree_bg.png +0 -0
  70. data/lib/rdoc/generator/template/42floors/resources/js/highlight.pack.js +0 -1
  71. data/lib/rdoc/generator/template/42floors/resources/js/jquery-1.3.2.min.js +0 -19
  72. data/lib/rdoc/generator/template/42floors/resources/js/jquery-effect.js +0 -593
  73. data/lib/rdoc/generator/template/42floors/resources/js/main.js +0 -20
  74. data/lib/rdoc/generator/template/42floors/resources/js/searchdoc.js +0 -442
  75. data/lib/rdoc/generator/template/42floors/resources/panel/index.html +0 -73
  76. data/lib/rdoc/generator/template/42floors/se_index.rhtml +0 -8
  77. data/test/units/properties/test_boolean.rb +0 -4
  78. data/test/units/test_errors.rb +0 -32
  79. data/test/units/test_mls.rb +0 -294
  80. data/test/units/test_property.rb +0 -35
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49407504285320c314076642711aa51cbcffb1ea
4
- data.tar.gz: 1f01d0b23a0b9e5d89744a3020615ff59c420a6f
3
+ metadata.gz: 02850148a3e96cfb9ed81d4acf27060f3f38d3b3
4
+ data.tar.gz: 63f702c4c5c63b7eb05fa6c7e50554cb1ed30e7d
5
5
  SHA512:
6
- metadata.gz: 96d45047e9069909a6e05f80fa8335188da8e81dd99e9c6d1aa0c7c898b1a84372aaac30320884f5b11233fec7d0f9f1b68fb34579bff6ae2be3bd6bb0faf0b1
7
- data.tar.gz: d3fc967552d7105a79cd845ce8024b91e0f78a903ad87d300c63831d8f28bc2497eb50445e0e61e251cef952f02a24595aa99d395f5b5e062d6ceb75f6c4817f
6
+ metadata.gz: e227236ccc27936b17ea7de888a28e7cbfc0298d6122d8c366042dad72f6b6fc56ab6f1cb5073e9737bda3e29760ed4c2e2d4ff96624f8b69651ec083c862db2
7
+ data.tar.gz: 9c0275c121db1a4c3d4b12d85c0f939d800d76077fc5d42454920632f650a7238ea9f1d55c4d8dce0e5bb1e93a418fc003aaf88eb1067f8bfda4493c83034f46
data/.gitignore CHANGED
@@ -8,3 +8,4 @@ coverage
8
8
  doc
9
9
  *#*
10
10
  *~
11
+ .DS_Store
data/Rakefile CHANGED
@@ -9,10 +9,9 @@ task :console do
9
9
  end
10
10
  task :c => :console
11
11
 
12
-
13
12
  Rake::TestTask.new do |t|
14
13
  t.libs << 'lib' << 'test'
15
- t.test_files = FileList['test/units/**/test*.rb']
14
+ t.test_files = FileList['test/**/*_test.rb']
16
15
  #t.warning = true
17
16
  #t.verbose = true
18
17
  end
@@ -24,14 +23,15 @@ Rake::RDocTask.new do |rd|
24
23
 
25
24
  rd.options << '-f' << 'sdoc' # explictly set shtml generator
26
25
  rd.options << '-T' << '42floors'
27
- rd.options << '-e' << 'UTF-8'
28
- rd.options << '-g'
29
- rd.options << '--include' << 'lib/rdoc'
26
+ rd.options << '-g' # Generate github links
30
27
 
31
28
  rd.rdoc_files.include('README.rdoc')
32
29
  rd.rdoc_files.include('lib/**/*.rb')
33
- rd.rdoc_files.exclude('lib/rdoc/**/*.rb')
34
30
  end
35
31
 
36
32
  desc "Run tests"
37
33
  task :default => :test
34
+
35
+ namespace :pages do
36
+ #TODO: https://github.com/defunkt/sdoc-helpers/blob/master/lib/sdoc_helpers/pages.rb
37
+ end
data/lib/mls.rb CHANGED
@@ -1,456 +1,102 @@
1
- require 'uri'
2
- require 'cgi'
3
- require 'logger'
4
- require 'net/https'
5
- require 'singleton'
6
- require 'yajl'
7
- require 'bigdecimal'
8
- require 'bigdecimal/util'
9
- require 'active_support'
10
- require 'active_support/core_ext'
11
- require 'date'
12
- require 'time'
1
+ require 'sunstone'
13
2
 
14
- class Decimal #:nodoc:
15
- end
16
-
17
- class Boolean #:nodoc:
18
- end
19
-
20
- # _MLS_ is a low-level API. It provides basic HTTP #get, #post, #put, and #delete
21
- # calls to the MLS. It can also provides basic error checking of responses.
22
- class MLS
23
- include Singleton
3
+ module MLS
24
4
 
25
5
  API_VERSION = '0.1.0'
26
6
 
27
- attr_reader :url, :user_agent
28
- attr_writer :asset_host, :image_host, :agent_profile
29
- attr_accessor :api_key, :cookie_jar, :logger, :branch, :server, :forwarded_for
30
-
31
- # Sets the API Token and Host of the MLS Server
32
- #
33
- # #!ruby
34
- # MLS.url = "https://mls.42floors.com/API_KEY"
35
- def url=(uri) # TODO: testme
36
- @url = URI.parse(uri)
37
- @api_key = CGI.unescape(@url.user)
38
- @host, @port = @url.host, @url.port
39
- @ssl = (url.scheme == 'https')
40
- end
41
-
42
- # Sets the user agent so that MLS can distinguish between multiple users
43
- # with the same auth
44
- def user_agent=(user_agent)
45
- @user_agent = user_agent
46
- end
47
-
48
- def logger # TODO: testme
49
- @logger ||= default_logger
50
- end
51
-
52
- # Returns the current connection to the MLS or if connection has been made
53
- # it returns a new connection
54
- def connection # TODO: testme
55
- return @connection if @connection
56
- @connection = Net::HTTP.new(@host, @port)
57
- @connection.use_ssl = @ssl
58
- @connection
59
- end
60
-
61
- # provides the asset host, if asset_host is set then it is returned,
62
- # otherwise it queries the MLS for this configuration.
63
- def asset_host # TODO: testme
64
- @asset_host ||= get('/asset_host').body
7
+ def request_headers
8
+ super
9
+ super.merge({
10
+ 'Api-Version' => API_VERSION
11
+ })
65
12
  end
66
13
 
67
- def image_host # TODO: testme
68
- raw_image_host % (rand(4))
14
+ def self.asset_host
15
+ MLS::Model.connection.server_config['asset_host']
69
16
  end
70
17
 
71
- def raw_image_host
72
- @image_host ||= get('/image_host').body
18
+ def self.image_host
19
+ MLS::Model.connection.server_config['image_host']
73
20
  end
21
+
22
+ end
74
23
 
75
- def agent_profile(id)
76
- @agent_profile = Yajl::Parser.new(:symbolize_keys => true)
77
- .parse(MLS.get("/agents/#{id}").body)
78
- end
79
-
80
- def headers # TODO: testme
81
- headers = {
82
- 'Content-Type' => 'application/json',
83
- 'User-Agent' => @user_agent,
84
- 'X-42Floors-API-Version' => API_VERSION,
85
- 'X-42Floors-API-Key' => api_key
86
- }
87
- headers['X-42Floors-Branch'] = branch if branch
88
- headers['X-42Floors-Server'] = server if server
89
- headers['X-Forwarded-For'] = forwarded_for if forwarded_for
90
- headers
91
- end
92
-
93
- def prepare_request(req) # TODO: testme
94
- headers.each { |k, v| req[k] = v }
95
- req['Cookie'] = cookie_jar[:api_session] if cookie_jar[:api_session]
96
- end
97
-
98
- # Gets to +url+ on the MLS Server. Automatically includes any headers returned
99
- # by the MLS#headers function.
100
- #
101
- # Paramaters::
102
- #
103
- # * +url+ - The +url+ on the server to Get to. To get to <tt>"/accounts"</tt>
104
- # pass <tt>"/accounts"</tt> as +url+
105
- # * +params+ - A Hash or Ruby Object that responds to #to_param. The result
106
- # of this method is appended on the URL as query params
107
- # * +valid_response_codes+ - An Array of HTTP response codes that should be
108
- # considered accepable and not raise exceptions. For example If you don't
109
- # want a MLS::Exception::NotFound to be raised when a GET request returns
110
- # a 404 pass in 404, and the response body will be returned if the status
111
- # code is a 404 as it does if the status code is in the 200..299 rage. Status
112
- # codes in the 200..299 range are *always* considred acceptable
113
- #
114
- # Return Value::
115
- #
116
- # Returns the return value of the <tt>&block</tt> if given, otherwise the response
117
- # object
118
- #
119
- # Examples:
120
- #
121
- # #!ruby
122
- # MLS.get('/example') # => #<Net::HTTP::Response>
123
- #
124
- # MLS.get('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
125
- #
126
- # MLS.get('/404') # => raises MLS::Exception::NotFound
127
- #
128
- # MLS.get('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
129
- #
130
- # MLS.get('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
131
- #
132
- # MLS.get('/404', nil, 404) # => #<Net::HTTP::Response>
133
- #
134
- # # this will still raise an exception if the response_code is not valid
135
- # # and the block will not be called
136
- # MLS.get('/act') do |response, response_code|
137
- # # ...
138
- # end
139
- def get(url, params={}, *valid_response_codes, &block)
140
- params ||= {}
141
-
142
- req = Net::HTTP::Get.new(url + '?' + params.to_param)
143
- prepare_request(req)
144
-
145
- response = connection.request(req)
146
- handle_response(response, valid_response_codes)
147
-
148
- response.body.force_encoding(Encoding::UTF_8)
149
- if block_given?
150
- yield(response, response.code.to_i)
151
- else
152
- response
153
- end
154
- end
155
-
156
- # Puts to +url+ on the MLS Server. Automatically includes any headers returned
157
- # by the MLS#headers function.
158
- #
159
- # Paramaters::
160
- #
161
- # * +url+ - The +url+ on the server to Put to. To put to <tt>"/accounts"</tt>
162
- # pass <tt>"/accounts"</tt> as +url+
163
- # * +body+ - A Ruby object which is converted into JSON and added in the request
164
- # Body.
165
- # * +valid_response_codes+ - An Array of HTTP response codes that should be
166
- # considered accepable and not raise exceptions. For example If you don't
167
- # want a MLS::Exception::NotFound to be raised when a PUT request returns
168
- # a 404 pass in 404, and the response body will be returned if the status
169
- # code is a 404 as it does if the status code is in the 200..299 rage. Status
170
- # codes in the 200..299 range are *always* considred acceptable
171
- #
172
- # Return Value::
173
- #
174
- # Returns the return value of the <tt>&block</tt> if given, otherwise the response
175
- # object
176
- #
177
- # Examples:
178
- #
179
- # #!ruby
180
- # MLS.put('/example') # => #<Net::HTTP::Response>
181
- #
182
- # MLS.put('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
183
- #
184
- # MLS.put('/404') # => raises MLS::Exception::NotFound
185
- #
186
- # MLS.put('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
187
- #
188
- # MLS.put('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
189
- #
190
- # MLS.put('/404', nil, 404) # => #<Net::HTTP::Response>
191
- #
192
- # # this will still raise an exception if the response_code is not valid
193
- # # and the block will not be called
194
- # MLS.put('/act') do |response, response_code|
195
- # # ...
196
- # end
197
- def put(url, body={}, *valid_response_codes, &block)
198
- body ||= {}
199
-
200
- req = Net::HTTP::Put.new(url)
201
- req.body = Yajl::Encoder.encode(body)
202
- prepare_request(req)
203
-
204
- response = connection.request(req)
205
- handle_response(response, valid_response_codes)
24
+ class MLS::Model < ActiveRecord::Base
25
+ self.abstract_class = true
26
+ end
206
27
 
207
- if block_given?
208
- yield(response, response.code.to_i)
209
- else
210
- response
28
+ module MLS::Slugger
29
+
30
+ extend ActiveSupport::Concern
31
+
32
+ module ClassMethods
33
+
34
+ def find(*args)
35
+ friendly = -> (arg) { arg.respond_to?(:to_i) && arg.to_i.to_s != arg.to_s }
36
+
37
+ if args.count == 1 && friendly.call(args.first)
38
+ find_by_slug!(args)
39
+ else
40
+ super
41
+ end
211
42
  end
212
- end
213
-
214
- # Posts to +url+ on the MLS Server. Automatically includes any headers returned
215
- # by the MLS#headers function.
216
- #
217
- # Paramaters::
218
- #
219
- # * +url+ - The +url+ on the server to Post to. To post to <tt>"/accounts"</tt>
220
- # pass <tt>"/accounts"</tt> as +url+
221
- # * +body+ - A Ruby object which is converted into JSON and added in the request
222
- # Body.
223
- # * +valid_response_codes+ - An Array of HTTP response codes that should be
224
- # considered accepable and not raise exceptions. For example If you don't
225
- # want a MLS::Exception::NotFound to be raised when a POST request returns
226
- # a 404 pass in 404, and the response body will be returned if the status
227
- # code is a 404 as it does if the status code is in the 200..299 rage. Status
228
- # codes in the 200..299 range are *always* considred acceptable
229
- #
230
- # Return Value::
231
- #
232
- # Returns the return value of the <tt>&block</tt> if given, otherwise the response
233
- # object
234
- #
235
- # Examples:
236
- #
237
- # #!ruby
238
- # MLS.post('/example') # => #<Net::HTTP::Response>
239
- #
240
- # MLS.post('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
241
- #
242
- # MLS.post('/404') # => raises MLS::Exception::NotFound
243
- #
244
- # MLS.post('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
245
- #
246
- # MLS.post('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
247
- #
248
- # MLS.post('/404', nil, 404) # => #<Net::HTTP::Response>
249
- #
250
- # # this will still raise an exception if the response_code is not valid
251
- # # and the block will not be called
252
- # MLS.post('/act') do |response, response_code|
253
- # # ...
254
- # end
255
- def post(url, body={}, *valid_response_codes, &block)
256
- body ||= {}
257
-
258
- req = Net::HTTP::Post.new(url)
259
- req.body = Yajl::Encoder.encode(body)
260
- prepare_request(req)
261
43
 
262
- response = connection.request(req)
263
- handle_response(response, valid_response_codes)
264
-
265
- if block_given?
266
- yield(response, response.code.to_i)
267
- else
268
- response
269
- end
270
44
  end
271
-
272
- # Deletes to +url+ on the MLS Server. Automatically includes any headers returned
273
- # by the MLS#headers function.
274
- #
275
- # Paramaters::
276
- #
277
- # * +url+ - The +url+ on the server to Post to. To delete to <tt>"/accounts"</tt>
278
- # pass <tt>"/accounts"</tt> as +url+
279
- # * +body+ - A Ruby object which is converted into JSON and added in the request
280
- # Body.
281
- # * +valid_response_codes+ - An Array of HTTP response codes that should be
282
- # considered accepable and not raise exceptions. For example If you don't
283
- # want a MLS::Exception::NotFound to be raised when a POST request returns
284
- # a 404 pass in 404, and the response body will be returned if the status
285
- # code is a 404 as it does if the status code is in the 200..299 rage. Status
286
- # codes in the 200..299 range are *always* considred acceptable
287
- #
288
- # Return Value::
289
- #
290
- # Returns the return value of the <tt>&block</tt> if given, otherwise the
291
- # response object
292
- #
293
- # Examples:
294
- #
295
- # #!ruby
296
- # MLS.delete('/example') # => #<Net::HTTP::Response>
297
- #
298
- # MLS.delete('/example', {:body => 'stuff'}) # => #<Net::HTTP::Response>
299
- #
300
- # MLS.delete('/404') # => raises MLS::Exception::NotFound
301
- #
302
- # MLS.delete('/404', nil, 404, 450..499) # => #<Net::HTTP::Response>
303
- #
304
- # MLS.delete('/404', nil, [404, 450..499]) # => #<Net::HTTP::Response>
305
- #
306
- # MLS.delete('/404', nil, 404) # => #<Net::HTTP::Response>
307
- #
308
- # # this will still raise an exception if the response_code is not valid
309
- # # and the block will not be called
310
- # MLS.delete('/act') do |response, response_code|
311
- # # ...
312
- # end
313
- def delete(url, body={}, *valid_response_codes, &block)
314
- body ||= {}
315
-
316
- req = Net::HTTP::Delete.new(url)
317
- req.body = Yajl::Encoder.encode(body)
318
- prepare_request(req)
319
-
320
- response = connection.request(req)
321
- handle_response(response, valid_response_codes)
322
- if block_given?
323
- yield(response, response.code.to_i)
324
- else
325
- response
326
- end
45
+
46
+ def to_param
47
+ slug
327
48
  end
328
49
 
329
- # Raise an MLS::Exception based on the response_code, unless the response_code
330
- # is include in the valid_response_codes Array
331
- #
332
- # Paramaters::
333
- #
334
- # * +response+ - The Net::HTTP::Response object
335
- # * +valid_response_codes+ - An Array, Integer, or Range. If it's Array the
336
- # Array can include both Integers or Ranges.
337
- #
338
- # Return Value::
339
- #
340
- # If an exception is not raised the +response+ is returned
341
- #
342
- # Examples:
343
- #
344
- # #!ruby
345
- # MLS.handle_response(<Net::HTTP::Response @code=200>) # => <Net::HTTP::Response @code=200>
346
- #
347
- # MLS.handle_response(<Net::HTTP::Response @code=404>) # => raises MLS::Exception::NotFound
348
- #
349
- # MLS.handle_response(<Net::HTTP::Response @code=500>) # => raises MLS::Exception
350
- #
351
- # MLS.handle_response(<Net::HTTP::Response @code=404>, 404) # => <Net::HTTP::Response @code=404>
352
- #
353
- # MLS.handle_response(<Net::HTTP::Response @code=500>, 404, 500) # => <Net::HTTP::Response @code=500>
354
- #
355
- # MLS.handle_response(<Net::HTTP::Response @code=405>, 300, 400..499) # => <Net::HTTP::Response @code=405>
356
- #
357
- # MLS.handle_response(<Net::HTTP::Response @code=405>, [300, 400..499]) # => <Net::HTTP::Response @code=405>
358
- def handle_response(response, *valid_response_codes)
359
- if response['X-42Floors-API-Version-Deprecated']
360
- logger.warn("DEPRECATION WARNING: API v#{API_VERSION} is being phased out")
361
- end
362
-
363
- code = response.code.to_i
364
- valid_response_codes.flatten!
365
- valid_response_codes << (200..299)
366
-
367
- if !valid_response_codes.detect{|i| i.is_a?(Range) ? i.include?(code) : i == code}
368
- case code
369
- when 400
370
- raise MLS::Exception::BadRequest, response.body
371
- when 401
372
- raise MLS::Exception::Unauthorized, response.body
373
- when 404
374
- raise MLS::Exception::NotFound
375
- when 410
376
- raise MLS::Exception::Gone
377
- when 422
378
- raise MLS::Exception::ApiVersionUnsupported, response.body
379
- when 503
380
- raise MLS::Exception::ServiceUnavailable, response.body
381
- when 301
382
- raise MLS::Exception::MovedPermanently, response.body
383
- when 300..599
384
- raise MLS::Exception, code
385
- end
386
- end
50
+ end
387
51
 
388
- cookie_jar[:api_session] = response['Set-Cookie'] if response['Set-Cookie']
389
- cookie_jar[:api_session_id] = response['X-42Floors-API-Session-Id'] if response['X-42Floors-API-Session-Id']
390
-
391
- response
392
- end
52
+ module MLS::Avatar
393
53
 
394
- # Ping the MLS. If everything is configured and operating correctly <tt>"pong"</tt>
395
- # will be returned. Otherwise and MLS::Exception should be thrown.
396
- #
397
- # #!ruby
398
- # MLS.ping # => "pong"
399
- #
400
- # MLS.ping # raises MLS::Exception::ServiceUnavailable if a 503 is returned
401
- def ping # TODO: testme
402
- get('/ping').body
403
- end
54
+ extend ActiveSupport::Concern
404
55
 
405
- def auth_ping # TODO: testme
406
- post('/ping').body
56
+ included do
57
+ belongs_to :avatar, :class_name => 'Photo'
407
58
  end
408
59
 
409
- def default_logger # TODO: testme
410
- logger = Logger.new(STDOUT)
411
- logger.level = Logger::INFO
412
- logger
413
- end
60
+ def avatar_url(options={})
61
+ options.reverse_merge!({
62
+ :style => nil,
63
+ :protocol => "http",
64
+ :bg => nil,
65
+ :format => "jpg"
66
+ });
414
67
 
415
- # Delegates all uncauge class method calls to the singleton
416
- def self.method_missing(method, *args, &block) #:nodoc: # TODO: testme
417
- instance.__send__(method, *args, &block)
418
- end
68
+ url_params = {s: options[:style], bg: options[:bg]}.select{ |k, v| v }
69
+ result = "#{options[:protocol]}://#{MLS.image_host}/#{avatar_digest}.#{options[:format]}"
70
+ result += "?#{url_params.to_param}" if url_params.size > 1
419
71
 
420
- def self.parse(json) # TODO: testme
421
- Yajl::Parser.new(:symbolize_keys => true).parse(json)
72
+ result
422
73
  end
423
74
 
424
75
  end
425
76
 
426
- require 'mls/errors'
427
- require 'mls/resource'
428
- require 'mls/parser'
429
-
430
- # Attributes
431
- require 'mls/attribute'
432
- require 'mls/attributes/fixnum'
433
- require 'mls/attributes/boolean'
434
- require 'mls/attributes/decimal'
435
- require 'mls/attributes/datetime'
436
- require 'mls/attributes/string'
437
- require 'mls/attributes/hash'
438
- require 'mls/attributes/array'
77
+ require 'mls/photo'
78
+ require 'mls/account'
79
+ require 'mls/brokerage'
80
+ require 'mls/property'
81
+ require 'mls/region'
82
+ require 'mls/listing'
83
+ require 'mls/lease'
84
+ require 'mls/sublease'
85
+ require 'mls/space'
86
+ require 'mls/sale'
87
+ require 'mls/coworking_space'
88
+ require 'mls/address'
89
+ require 'mls/locality'
90
+ require 'mls/flyer'
91
+ require 'mls/agency'
92
+ require 'mls/floorplan'
93
+ require 'mls/use'
439
94
 
440
95
  # Models
441
- require 'mls/model'
442
- require 'mls/models/account'
443
- require 'mls/models/listing'
444
- require 'mls/models/address'
445
- require 'mls/models/property'
446
- require 'mls/models/photo'
447
- require 'mls/models/video'
448
- require 'mls/models/pdf'
449
- require 'mls/models/tour'
450
- require 'mls/models/flyer'
451
- require 'mls/models/floorplan'
452
- require 'mls/models/region'
453
- require 'mls/models/brokerage'
454
-
455
- #factories
456
- require 'mls/factories_helper'
96
+ # # Helpers
97
+ # class MLS
98
+ #
99
+ # def current_account
100
+ # end
101
+ #
102
+ # end