mls 0.11.3 → 0.12.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mls.rb +46 -46
  3. data/lib/mls/{property.rb → attribute.rb} +2 -2
  4. data/lib/mls/{properties → attributes}/array.rb +1 -1
  5. data/lib/mls/{properties → attributes}/boolean.rb +1 -1
  6. data/lib/mls/{properties → attributes}/datetime.rb +1 -1
  7. data/lib/mls/{properties → attributes}/decimal.rb +1 -1
  8. data/lib/mls/{properties → attributes}/fixnum.rb +1 -1
  9. data/lib/mls/{properties → attributes}/hash.rb +1 -1
  10. data/lib/mls/{properties → attributes}/string.rb +1 -1
  11. data/lib/mls/factories/listing.rb +3 -3
  12. data/lib/mls/model.rb +33 -33
  13. data/lib/mls/models/account.rb +55 -46
  14. data/lib/mls/models/address.rb +18 -117
  15. data/lib/mls/models/brokerage.rb +6 -6
  16. data/lib/mls/models/floorplan.rb +5 -5
  17. data/lib/mls/models/flyer.rb +5 -5
  18. data/lib/mls/models/listing.rb +80 -76
  19. data/lib/mls/models/pdf.rb +4 -4
  20. data/lib/mls/models/photo.rb +10 -10
  21. data/lib/mls/models/property.rb +113 -0
  22. data/lib/mls/models/region.rb +14 -14
  23. data/lib/mls/models/tour.rb +10 -10
  24. data/lib/mls/models/video.rb +7 -7
  25. data/lib/mls/parser.rb +1 -1
  26. data/lib/mls/resource.rb +15 -15
  27. data/lib/rdoc/generator/template/42floors/resources/css/github.css +1 -1
  28. data/lib/rdoc/generator/template/42floors/resources/js/highlight.pack.js +1 -1
  29. data/lib/rdoc/generator/template/42floors/resources/js/jquery-1.3.2.min.js +1 -1
  30. data/lib/rdoc/generator/template/42floors/resources/js/jquery-effect.js +6 -6
  31. data/mls.gemspec +1 -1
  32. data/test/test_helper.rb +1 -1
  33. data/test/units/models/test_address.rb +4 -4
  34. data/test/units/models/test_contact.rb +1 -1
  35. data/test/units/models/test_listing.rb +4 -4
  36. data/test/units/test_mls.rb +60 -60
  37. data/test/units/test_model.rb +3 -3
  38. data/test/units/test_property.rb +18 -18
  39. data/test/units/test_resource.rb +1 -1
  40. metadata +12 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e89e868d54e413d5c6fe5154f40365864f166707
4
- data.tar.gz: 16a800a009692818306743a61ea0c03d47938de3
3
+ metadata.gz: d7bf2fb1f45061601b3410b8d455f4237ca7a405
4
+ data.tar.gz: 159126570b0d6925baaa5593b5d911a9f01aba9e
5
5
  SHA512:
6
- metadata.gz: 38025736bee6bcb381e1ffa130448ccbfcdb1f99acbe6c33394e0446e0524bc06f8414645178a3c42f6a341a71ab2e1addacc35531c74fb15edb55bd15d86134
7
- data.tar.gz: 1c66cda57c20adc407595de56048b67db3b587558b03c7fb9c04c4fc36a2e4c891015af4f6e8d375fe72eba5a422b92b32b761d2149bd9544565755558123c5b
6
+ metadata.gz: 10ab6acf77fd576d34863564b5c6d55ee5439f53481473a06bcee79b55239abcca6637a7d1e1f2d3f5ce918d7237229f85a89ef7d7d8000f3ca454285e1fab04
7
+ data.tar.gz: afc56b84396934752bf50f3d1e6eaf809b7fd1e103588071ad29dec07bae40f2f7dad2cab06f4decbfada145da0b52a54b2a62d00fc9e77d9157a5d471551c46
data/lib/mls.rb CHANGED
@@ -25,7 +25,7 @@ class MLS
25
25
 
26
26
  attr_reader :url, :user_agent
27
27
  attr_writer :asset_host, :image_host, :agent_profile
28
- attr_accessor :api_key, :auth_key, :logger
28
+ attr_accessor :api_key, :auth_cookie, :logger
29
29
 
30
30
  # Sets the API Token and Host of the MLS Server
31
31
  #
@@ -36,12 +36,12 @@ class MLS
36
36
  @api_key = CGI.unescape(@url.user)
37
37
  @host, @port = @url.host, @url.port
38
38
  end
39
-
39
+
40
40
  # Sets the user agent so that MLS can distinguish between multiple users
41
41
  # with the same auth
42
42
  def user_agent=(user_agent)
43
43
  @user_agent = user_agent
44
- end
44
+ end
45
45
 
46
46
  def logger # TODO: testme
47
47
  @logger ||= default_logger
@@ -58,11 +58,11 @@ class MLS
58
58
  def asset_host # TODO: testme
59
59
  @asset_host ||= get('/asset_host').body
60
60
  end
61
-
61
+
62
62
  def image_host # TODO: testme
63
63
  raw_image_host % (rand(4))
64
64
  end
65
-
65
+
66
66
  def raw_image_host
67
67
  @image_host ||= get('/image_host').body
68
68
  end
@@ -73,20 +73,19 @@ class MLS
73
73
  end
74
74
 
75
75
  def headers # TODO: testme
76
- h = {
76
+ {
77
77
  'Content-Type' => 'application/json',
78
78
  'User-Agent' => @user_agent,
79
79
  'X-42Floors-API-Version' => API_VERSION,
80
80
  'X-42Floors-API-Key' => api_key
81
81
  }
82
- h['X-42Floors-API-Auth-Key'] = auth_key if auth_key
83
- h
84
82
  end
85
-
86
- def add_headers(req) # TODO: testme
83
+
84
+ def prepare_request(req) # TODO: testme
87
85
  headers.each { |k, v| req[k] = v }
86
+ req['Cookie'] = auth_cookie if auth_cookie
88
87
  end
89
-
88
+
90
89
  # Gets to +url+ on the MLS Server. Automatically includes any headers returned
91
90
  # by the MLS#headers function.
92
91
  #
@@ -95,7 +94,7 @@ class MLS
95
94
  # * +url+ - The +url+ on the server to Get to. This url will automatically
96
95
  # be prefixed with <tt>"/api"</tt>. To get to <tt>"/api/accounts"</tt>
97
96
  # pass <tt>"/accounts"</tt> as +url+
98
- # * +params+ - A Hash or Ruby Object that responds to #to_param. The result
97
+ # * +params+ - A Hash or Ruby Object that responds to #to_param. The result
99
98
  # of this method is appended on the URL as query params
100
99
  # * +valid_response_codes+ - An Array of HTTP response codes that should be
101
100
  # considered accepable and not raise exceptions. For example If you don't
@@ -131,13 +130,13 @@ class MLS
131
130
  # end
132
131
  def get(url, params={}, *valid_response_codes, &block)
133
132
  params ||= {}
134
-
133
+
135
134
  req = Net::HTTP::Get.new("/api#{url}?" + params.to_param)
136
- add_headers(req)
135
+ prepare_request(req)
137
136
 
138
137
  response = connection.request(req)
139
138
  handle_response(response, valid_response_codes)
140
-
139
+
141
140
  response.body.force_encoding(Encoding::UTF_8)
142
141
  if block_given?
143
142
  yield(response, response.code.to_i)
@@ -145,7 +144,7 @@ class MLS
145
144
  response
146
145
  end
147
146
  end
148
-
147
+
149
148
  # Puts to +url+ on the MLS Server. Automatically includes any headers returned
150
149
  # by the MLS#headers function.
151
150
  #
@@ -190,11 +189,11 @@ class MLS
190
189
  # end
191
190
  def put(url, body={}, *valid_response_codes, &block)
192
191
  body ||= {}
193
-
192
+
194
193
  req = Net::HTTP::Put.new("/api#{url}")
195
194
  req.body = Yajl::Encoder.encode(body)
196
- add_headers(req)
197
-
195
+ prepare_request(req)
196
+
198
197
  response = connection.request(req)
199
198
  handle_response(response, valid_response_codes)
200
199
 
@@ -203,8 +202,8 @@ class MLS
203
202
  else
204
203
  response
205
204
  end
206
- end
207
-
205
+ end
206
+
208
207
  # Posts to +url+ on the MLS Server. Automatically includes any headers returned
209
208
  # by the MLS#headers function.
210
209
  #
@@ -249,11 +248,11 @@ class MLS
249
248
  # end
250
249
  def post(url, body={}, *valid_response_codes, &block)
251
250
  body ||= {}
252
-
251
+
253
252
  req = Net::HTTP::Post.new("/api#{url}")
254
253
  req.body = Yajl::Encoder.encode(body)
255
- add_headers(req)
256
-
254
+ prepare_request(req)
255
+
257
256
  response = connection.request(req)
258
257
  handle_response(response, valid_response_codes)
259
258
 
@@ -308,11 +307,11 @@ class MLS
308
307
  # end
309
308
  def delete(url, body={}, *valid_response_codes, &block)
310
309
  body ||= {}
311
-
310
+
312
311
  req = Net::HTTP::Delete.new("/api#{url}")
313
312
  req.body = Yajl::Encoder.encode(body)
314
- add_headers(req)
315
-
313
+ prepare_request(req)
314
+
316
315
  response = connection.request(req)
317
316
  handle_response(response, valid_response_codes)
318
317
  if block_given?
@@ -339,13 +338,13 @@ class MLS
339
338
  #
340
339
  # #!ruby
341
340
  # MLS.handle_response(<Net::HTTP::Response @code=200>) # => <Net::HTTP::Response @code=200>
342
- #
341
+ #
343
342
  # MLS.handle_response(<Net::HTTP::Response @code=404>) # => raises MLS::Exception::NotFound
344
- #
343
+ #
345
344
  # MLS.handle_response(<Net::HTTP::Response @code=500>) # => raises MLS::Exception
346
- #
345
+ #
347
346
  # MLS.handle_response(<Net::HTTP::Response @code=404>, 404) # => <Net::HTTP::Response @code=404>
348
- #
347
+ #
349
348
  # MLS.handle_response(<Net::HTTP::Response @code=500>, 404, 500) # => <Net::HTTP::Response @code=500>
350
349
  #
351
350
  # MLS.handle_response(<Net::HTTP::Response @code=405>, 300, 400..499) # => <Net::HTTP::Response @code=405>
@@ -355,11 +354,11 @@ class MLS
355
354
  if response['X-42Floors-API-Version-Deprecated']
356
355
  logger.warn("DEPRECATION WARNING: API v#{API_VERSION} is being phased out")
357
356
  end
358
-
357
+
359
358
  code = response.code.to_i
360
359
  valid_response_codes.flatten!
361
360
  valid_response_codes << (200..299)
362
-
361
+
363
362
  if !valid_response_codes.detect{|i| i.is_a?(Range) ? i.include?(code) : i == code}
364
363
  case code
365
364
  when 400
@@ -376,16 +375,16 @@ class MLS
376
375
  raise MLS::Exception, code
377
376
  end
378
377
  end
379
-
378
+
380
379
  response
381
380
  end
382
-
381
+
383
382
  # Ping the MLS. If everything is configured and operating correctly <tt>"pong"</tt>
384
383
  # will be returned. Otherwise and MLS::Exception should be thrown.
385
384
  #
386
385
  # #!ruby
387
386
  # MLS.ping # => "pong"
388
- #
387
+ #
389
388
  # MLS.ping # raises MLS::Exception::ServiceUnavailable if a 503 is returned
390
389
  def ping # TODO: testme
391
390
  get('/ping').body
@@ -405,7 +404,7 @@ class MLS
405
404
  def self.method_missing(method, *args, &block) #:nodoc: # TODO: testme
406
405
  instance.__send__(method, *args, &block)
407
406
  end
408
-
407
+
409
408
  def self.parse(json) # TODO: testme
410
409
  Yajl::Parser.new(:symbolize_keys => true).parse(json)
411
410
  end
@@ -416,21 +415,22 @@ require 'mls/errors'
416
415
  require 'mls/resource'
417
416
  require 'mls/parser'
418
417
 
419
- # Properties
420
- require 'mls/property'
421
- require 'mls/properties/fixnum'
422
- require 'mls/properties/boolean'
423
- require 'mls/properties/decimal'
424
- require 'mls/properties/datetime'
425
- require 'mls/properties/string'
426
- require 'mls/properties/hash'
427
- require 'mls/properties/array'
418
+ # Attributes
419
+ require 'mls/attribute'
420
+ require 'mls/attributes/fixnum'
421
+ require 'mls/attributes/boolean'
422
+ require 'mls/attributes/decimal'
423
+ require 'mls/attributes/datetime'
424
+ require 'mls/attributes/string'
425
+ require 'mls/attributes/hash'
426
+ require 'mls/attributes/array'
428
427
 
429
428
  # Models
430
429
  require 'mls/model'
431
430
  require 'mls/models/account'
432
431
  require 'mls/models/listing'
433
432
  require 'mls/models/address'
433
+ require 'mls/models/property'
434
434
  require 'mls/models/photo'
435
435
  require 'mls/models/video'
436
436
  require 'mls/models/pdf'
@@ -1,4 +1,4 @@
1
- class MLS::Property
1
+ class MLS::Attribute
2
2
  DEFAULT_OPTIONS = { :serialize => :always }
3
3
 
4
4
  attr_reader :model, :name, :instance_variable_name, :options, :default
@@ -23,7 +23,7 @@ class MLS::Property
23
23
  end
24
24
 
25
25
  def self.determine_class(type)
26
- return type if type < MLS::Property
26
+ return type if type < MLS::Attribute
27
27
  find_class(::ActiveSupport::Inflector.demodulize(type))
28
28
  end
29
29
 
@@ -1,4 +1,4 @@
1
- class MLS::Property::Array < MLS::Property
1
+ class MLS::Attribute::Array < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  value
@@ -1,4 +1,4 @@
1
- class MLS::Property::Boolean < MLS::Property
1
+ class MLS::Attribute::Boolean < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  value
@@ -1,4 +1,4 @@
1
- class MLS::Property::DateTime < MLS::Property
1
+ class MLS::Attribute::DateTime < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  if value.is_a?(::String)
@@ -1,4 +1,4 @@
1
- class MLS::Property::Decimal < MLS::Property
1
+ class MLS::Attribute::Decimal < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  if value.nil?
@@ -1,4 +1,4 @@
1
- class MLS::Property::Fixnum < ::MLS::Property
1
+ class MLS::Attribute::Fixnum < ::MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  if value.nil?
@@ -1,4 +1,4 @@
1
- class MLS::Property::Hash < MLS::Property
1
+ class MLS::Attribute::Hash < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  if value.is_a?(Hash)
@@ -1,4 +1,4 @@
1
- class MLS::Property::String < MLS::Property
1
+ class MLS::Attribute::String < MLS::Attribute
2
2
 
3
3
  def load(value) # from_json
4
4
  if value.nil?
@@ -1,11 +1,11 @@
1
1
  FactoryGirl.define do
2
2
  factory :listing, :class => MLS::Listing do
3
3
  before(:create) { |l|
4
- MLS_GEM_CACHE['auth_key'] = MLS.auth_key
5
- MLS.auth_key = l.account.auth_key
4
+ MLS_GEM_CACHE['auth_cookie'] = MLS.auth_cookie
5
+ MLS.auth_cookie = l.account.auth_cookie
6
6
  }
7
7
  after(:create) { |l|
8
- MLS.auth_key = MLS_GEM_CACHE['auth_key']
8
+ MLS.auth_cookie = MLS_GEM_CACHE['auth_cookie']
9
9
  }
10
10
 
11
11
  association :account
data/lib/mls/model.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module MLS::Model
2
2
 
3
3
  def self.extended(model) #:nodoc:
4
- model.instance_variable_set(:@properties, {})
4
+ model.instance_variable_set(:@attributes, {})
5
5
  model.instance_variable_set(:@associations, {})
6
6
  end
7
7
 
@@ -24,34 +24,34 @@ module MLS::Model
24
24
  model
25
25
  end
26
26
 
27
- # Properties ===================================================================================================
27
+ # Attributes ===================================================================================================
28
28
 
29
- def property(name, type, options = {})
30
- klass = MLS::Property.determine_class(type)
29
+ def attribute(name, type, options = {})
30
+ klass = MLS::Attribute.determine_class(type)
31
31
  raise NotImplementedError, "#{type} is not supported" unless klass
32
32
 
33
- property = klass.new(name, options)
34
- @properties[property.name] = property
35
- @properties_excluded_from_comparison = []
33
+ attribute = klass.new(name, options)
34
+ @attributes[attribute.name] = attribute
35
+ @attributes_excluded_from_comparison = []
36
36
 
37
- create_reader_for(property)
38
- create_writer_for(property)
37
+ create_reader_for(attribute)
38
+ create_writer_for(attribute)
39
39
  end
40
40
 
41
- def exclude_from_comparison(*properties)
42
- @properties_excluded_from_comparison |= properties
41
+ def exclude_from_comparison(*attributes)
42
+ @attributes_excluded_from_comparison |= attributes
43
43
  end
44
44
 
45
- def properties_excluded_from_comparison
46
- @properties_excluded_from_comparison
45
+ def attributes_excluded_from_comparison
46
+ @attributes_excluded_from_comparison
47
47
  end
48
48
 
49
- def properties
50
- @properties
49
+ def attributes
50
+ @attributes
51
51
  end
52
52
 
53
- def property_module
54
- @property_module ||= begin
53
+ def attribute_module
54
+ @attribute_module ||= begin
55
55
  mod = Module.new
56
56
  class_eval do
57
57
  include mod
@@ -60,23 +60,23 @@ module MLS::Model
60
60
  end
61
61
  end
62
62
 
63
- def create_reader_for(property)
64
- reader_name = property.name.to_s
63
+ def create_reader_for(attribute)
64
+ reader_name = attribute.name.to_s
65
65
  boolean_reader_name = "#{reader_name}?"
66
- reader_visibility = property.reader_visibility
67
- instance_variable_name = property.instance_variable_name
66
+ reader_visibility = attribute.reader_visibility
67
+ instance_variable_name = attribute.instance_variable_name
68
68
 
69
- property_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
69
+ attribute_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
70
70
  #{reader_visibility}
71
71
  def #{reader_name}
72
72
  return #{instance_variable_name} if defined?(#{instance_variable_name})
73
- property = properties[:#{reader_name}]
74
- #{instance_variable_name} = property ? property.default : nil
73
+ attribute = attributes[:#{reader_name}]
74
+ #{instance_variable_name} = attribute ? attribute.default : nil
75
75
  end
76
76
  RUBY
77
77
 
78
- if property.kind_of?(MLS::Property::Boolean)
79
- property_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
78
+ if attribute.kind_of?(MLS::Attribute::Boolean)
79
+ attribute_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
80
80
  #{reader_visibility}
81
81
  def #{boolean_reader_name}
82
82
  #{reader_name}
@@ -85,17 +85,17 @@ module MLS::Model
85
85
  end
86
86
  end
87
87
 
88
- def create_writer_for(property)
89
- name = property.name
88
+ def create_writer_for(attribute)
89
+ name = attribute.name
90
90
  writer_name = "#{name}="
91
- writer_visibility = property.writer_visibility
92
- instance_variable_name = property.instance_variable_name
91
+ writer_visibility = attribute.writer_visibility
92
+ instance_variable_name = attribute.instance_variable_name
93
93
 
94
- property_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
94
+ attribute_module.module_eval <<-RUBY, __FILE__, __LINE__ + 1
95
95
  #{writer_visibility}
96
96
  def #{writer_name}(value)
97
- property = self.class.properties[:#{name}]
98
- #{instance_variable_name} = property.load(value)
97
+ attribute = self.class.attributes[:#{name}]
98
+ #{instance_variable_name} = attribute.load(value)
99
99
  end
100
100
  RUBY
101
101
  end