mls 0.14.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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