reso 0.1.0.3 → 0.1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6c4e7768c1345003617a43651a279895680427e5
4
- data.tar.gz: 0610ee8faa3c460fdb532403bee2aba181f6c456
3
+ metadata.gz: 5e4cf4dfcb9e6c4b1ed0a73f10bc721b710762b7
4
+ data.tar.gz: c05035bf8cadb7a7044027357488f3e2ec65c709
5
5
  SHA512:
6
- metadata.gz: aca898fefac2e693151c6359b59d2964252407d83466d569931fd12667abfbf8f822ed6d8c7ec1dfc3a65f73bd96f952bfe7dba8b439ce03265e2c78b85f0f8d
7
- data.tar.gz: 4a6a666002c0a80157bd408e679517839f02e9f0f5cbc6b89eb75ddf17107900c484d3662186d978fa7ed41bf6241637b964bb91cd1e54f36bc0e9f2e147b71a
6
+ metadata.gz: c533cabc8a83c661b24d254bde866b56ba604107512e10217efbad93712753beb045348d7058ea3a3c833c8b893a490c32a69550ff253c048c2d00b6c0db5281
7
+ data.tar.gz: 9573993e629bb919d59776afc8ae4bdc75d1480cccf29c305154e4de4b57d6cbf621dbb85ba2a15a60a10970940c166fcdaf0775789d64fb952ff997fc94be03
data/app/models/import.rb CHANGED
@@ -9,6 +9,15 @@ class Import < ActiveRecord::Base
9
9
 
10
10
  before_save :set_import_format
11
11
 
12
+ def remove_listings_no_longer_present fresh_listing_keys
13
+ existing_listing_keys = self.listings.all.pluck(:listing_key)
14
+ stale_listing_keys = existing_listing_keys.delete_if{|key| fresh_listing_keys.include? key }
15
+ stale_listing_keys.each do |listing_key|
16
+ Listing.find_by(listing_key: listing_key).destroy
17
+ end
18
+ stale_listing_keys
19
+ end
20
+
12
21
  def set_import_format
13
22
  self.import_format = ImportFormat.find_by(name: 'reso') unless self.import_format.present?
14
23
  end
@@ -14,7 +14,7 @@ class QueuedListing < ActiveRecord::Base
14
14
  eager_load(:participants).
15
15
  eager_load(:photos).
16
16
  find_or_initialize_by(
17
- listing_key: mapper.unique_identifier(self)
17
+ listing_key: Mapper::unique_identifier(self)
18
18
  )
19
19
  if (listing.modification_timestamp != mapper.modification_timestamp(self, listing))
20
20
  Mapper::RESO_LISTING_ATTRIBUTES.each do |attribute|
@@ -32,16 +32,19 @@ namespace :reso do
32
32
  nil # Just in cases
33
33
  end
34
34
 
35
- def create_queued_listing doc, import
35
+ def create_queued_listing_and_return_listing_key doc, import
36
36
  begin
37
37
  doc.css(import.repeating_element).each do |o|
38
38
  listing_data = {}
39
39
  Hash.from_xml(o.to_xml)[import.repeating_element].each_pair{|key, value| listing_data[key] = value }
40
- QueuedListing.create(import: import, listing_data: listing_data)
40
+ queued_listing = QueuedListing.new(import: import, listing_data: listing_data)
41
+ queued_listing.save
42
+ return Mapper::unique_identifier(queued_listing)
41
43
  end
42
44
  rescue Exception => e
43
45
  puts e.inspect
44
46
  exit if Rails.env.development?
47
+ return nil
45
48
  end
46
49
  end
47
50
 
@@ -93,7 +96,7 @@ namespace :reso do
93
96
  import = Import.find_by(token: args.import_token)
94
97
 
95
98
  unless import.blank?
96
- l, count, stream = 0, 0, ''
99
+ l, count, incoming_listing_keys, stream = 0, 0, [], ''
97
100
  open_tag, close_tag = get_open_and_closing_tag_for import.repeating_element
98
101
 
99
102
  # Grab a file to work with
@@ -110,7 +113,7 @@ namespace :reso do
110
113
  while (from_here = stream.index(open_tag)) && (to_there = stream.index(close_tag))
111
114
  xml = stream[from_here..to_there + (close_tag.length-1)]
112
115
  doc = Nokogiri::XML([xml_header, xml].join).remove_namespaces!
113
- create_queued_listing doc, import
116
+ incoming_listing_keys << create_queued_listing_and_return_listing_key(doc, import)
114
117
  stream.gsub!(xml, '')
115
118
  if ((l += 1) % 1000).zero?
116
119
  puts "#{l}\t#{l/(Time.now - start)}" if Rails.env.development?
@@ -118,7 +121,10 @@ namespace :reso do
118
121
  GC.start if (l % 100).zero?
119
122
  end
120
123
  end
121
- puts "#{l} - #{l/(Time.now - start)} listings/s" if Rails.env.development?
124
+ puts "Import speed: #{l/(Time.now - start)} listings/s" if Rails.env.development?
125
+ puts "Found #{l} new listings." if Rails.env.development?
126
+ stale_listing_keys = import.remove_listings_no_longer_present(incoming_listing_keys)
127
+ puts "Removed #{stale_listing_keys.count} old listings." if Rails.env.development?
122
128
  File.delete(filepath)
123
129
  end
124
130
  end
data/lib/mapper.rb CHANGED
@@ -225,5 +225,50 @@ module Mapper
225
225
  def self.view_types item_name
226
226
  fetch_enumeration 'ViewType', item_name
227
227
  end
228
+
229
+ def self.unique_identifier queued_listing
230
+ (result = Mapper::get_value(queued_listing, queued_listing.import.unique_identifier.split(' ')))
231
+ end
232
+
233
+ def self.get_boolean_value queued_listing, elements
234
+ (result = Mapper::get_value(queued_listing, elements)) ? result.to_s.to_bool : nil
235
+ end
236
+
237
+ def self.get_value queued_listing, elements
238
+ if elements.count.eql?(1)
239
+ get_simple_value(queued_listing, elements.first)
240
+ else
241
+ get_subvalue(queued_listing, elements.first, elements[1..-1])
242
+ end
243
+ end
244
+
245
+ def self.get_simple_value queued_listing, element
246
+ if (value = queued_listing.listing_data[element])
247
+ value.unwrap_attribute
248
+ end
249
+ end
250
+
251
+ def self.get_subvalue queued_listing, element, child_elements
252
+ if (value = get_simple_value(queued_listing, element))
253
+ if (subvalue = child_elements.inject(value){|v, e| v[e] ? v[e] : Hash.new })
254
+ subvalue.present? ? subvalue.unwrap_attribute : nil
255
+ end
256
+ end
257
+ end
258
+
259
+ def self.get_repeaters queued_listing, elements
260
+ if (value = Mapper::get_value(queued_listing, elements[0..-2]))
261
+ (result = value.drilldown(elements.last)) ? (result.is_a?(Array) ? result : [result]) : nil
262
+ else
263
+ return []
264
+ end
265
+ end
266
+
267
+ def self.get_enums queued_listing, elements
268
+ if (result = get_repeaters(queued_listing, elements))
269
+ enums = result.map{|name| Mapper.send(elements.last.tableize, name)}
270
+ end
271
+ enums ? enums.compact : nil
272
+ end
228
273
 
229
274
  end
data/lib/mapper/reso.rb CHANGED
@@ -6,7 +6,7 @@ module Mapper
6
6
  end
7
7
 
8
8
  def self.address queued_listing, listing
9
- if (result = get_value(queued_listing, %w(Address)))
9
+ if (result = Mapper::get_value(queued_listing, %w(Address)))
10
10
  listing.address ||= Address.new
11
11
  listing.address.assign_attributes({
12
12
  preference_order: result.drilldown('preference_order'),
@@ -23,7 +23,7 @@ module Mapper
23
23
  end
24
24
 
25
25
  def self.alternate_prices queued_listing, listing
26
- if (result = get_repeaters(queued_listing, %w(AlternatePrices AlternatePrice)))
26
+ if (result = Mapper::get_repeaters(queued_listing, %w(AlternatePrices AlternatePrice)))
27
27
  result.map{|item| listing.alternate_prices.find_or_initialize_by(
28
28
  list_price: item.drilldown('AlternateListPrice'),
29
29
  currency_code: item.drilldown('AlternateListPrice currencyCode'),
@@ -34,23 +34,23 @@ module Mapper
34
34
  end
35
35
 
36
36
  def self.appliances queued_listing, listing
37
- get_enums(queued_listing, %w(DetailedCharacteristics Appliances Appliance))
37
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics Appliances Appliance))
38
38
  end
39
39
 
40
40
  def self.architecture_style queued_listing, listing
41
- (result = get_value(queued_listing, %w(DetailedCharacteristics ArchitectureStyle))) ? Mapper::architecture_styles(result) : nil
41
+ (result = Mapper::get_value(queued_listing, %w(DetailedCharacteristics ArchitectureStyle))) ? Mapper::architecture_styles(result) : nil
42
42
  end
43
43
 
44
44
  def self.architecture_style_description queued_listing, listing
45
- get_value(queued_listing, %w(DetailedCharacteristics ArchitectureStyle otherDescription))
45
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics ArchitectureStyle otherDescription))
46
46
  end
47
47
 
48
48
  def self.bathrooms queued_listing, listing
49
- get_value(queued_listing, %w(Bathrooms))
49
+ Mapper::get_value(queued_listing, %w(Bathrooms))
50
50
  end
51
51
 
52
52
  def self.bedrooms queued_listing, listing
53
- get_value(queued_listing, %w(Bedrooms))
53
+ Mapper::get_value(queued_listing, %w(Bedrooms))
54
54
  end
55
55
 
56
56
  def self.brokerage queued_listing, listing
@@ -62,23 +62,23 @@ module Mapper
62
62
  end
63
63
 
64
64
  def self.building_unit_count queued_listing, listing
65
- get_value(queued_listing, %w(DetailedCharacteristics BuildingUnitCount))
65
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics BuildingUnitCount))
66
66
  end
67
67
 
68
68
  def self.condo_floor_num queued_listing, listing
69
- get_value(queued_listing, %w(DetailedCharacteristics CondoFloorNum))
69
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics CondoFloorNum))
70
70
  end
71
71
 
72
72
  def self.cooling_systems queued_listing, listing
73
- get_enums(queued_listing, %w(DetailedCharacteristics CoolingSystems CoolingSystem))
73
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics CoolingSystems CoolingSystem))
74
74
  end
75
75
 
76
76
  def self.county queued_listing, listing
77
- if (get_value(queued_listing, %w(Location County)))
77
+ if (Mapper::get_value(queued_listing, %w(Location County)))
78
78
  county = County.find_or_initialize_by(
79
- name: get_value(queued_listing, %w(Location County)),
80
- state_or_province: get_value(queued_listing, %w(Address StateOrProvince)),
81
- country: get_value(queued_listing, %w(Address Country))
79
+ name: Mapper::get_value(queued_listing, %w(Location County)),
80
+ state_or_province: Mapper::get_value(queued_listing, %w(Address StateOrProvince)),
81
+ country: Mapper::get_value(queued_listing, %w(Address Country))
82
82
  )
83
83
  else
84
84
  return nil
@@ -86,27 +86,27 @@ module Mapper
86
86
  end
87
87
 
88
88
  def self.currency_code queued_listing, listing
89
- get_value(queued_listing, %w(ListPrice currencyCode))
89
+ Mapper::get_value(queued_listing, %w(ListPrice currencyCode))
90
90
  end
91
91
 
92
92
  def self.directions queued_listing, listing
93
- get_value(queued_listing, %w(Location Directions))
93
+ Mapper::get_value(queued_listing, %w(Location Directions))
94
94
  end
95
95
 
96
96
  def self.disclaimer queued_listing, listing
97
- get_value(queued_listing, %w(Disclaimer))
97
+ Mapper::get_value(queued_listing, %w(Disclaimer))
98
98
  end
99
99
 
100
100
  def self.disclose_address queued_listing, listing
101
- get_boolean_value(queued_listing, %w(DiscloseAddress))
101
+ Mapper::get_boolean_value(queued_listing, %w(DiscloseAddress))
102
102
  end
103
103
 
104
104
  def self.elevation queued_listing, listing
105
- get_value(queued_listing, %w(Location Elevation))
105
+ Mapper::get_value(queued_listing, %w(Location Elevation))
106
106
  end
107
107
 
108
108
  def self.expenses queued_listing, listing
109
- if (result = get_repeaters(queued_listing, %w(Expenses Expense)))
109
+ if (result = Mapper::get_repeaters(queued_listing, %w(Expenses Expense)))
110
110
  result.map{|item| listing.expenses.find_or_initialize_by(
111
111
  expense_category: Mapper::expense_categories(item['ExpenseCategory']),
112
112
  currency_period: Mapper::expense_categories(item['ExpenseValue']['currencyPeriod']),
@@ -116,15 +116,15 @@ module Mapper
116
116
  end
117
117
 
118
118
  def self.exterior_types queued_listing, listing
119
- get_enums(queued_listing, %w(DetailedCharacteristics ExteriorTypes ExteriorType))
119
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics ExteriorTypes ExteriorType))
120
120
  end
121
121
 
122
122
  def self.floor_coverings queued_listing, listing
123
- get_enums(queued_listing, %w(DetailedCharacteristics FloorCoverings FloorCovering))
123
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics FloorCoverings FloorCovering))
124
124
  end
125
125
 
126
126
  def self.foreclosure_status queued_listing, listing
127
- (result = get_value(queued_listing, %w(ForeclosureStatus))) ? Mapper::foreclosure_statuses(result) : nil
127
+ (result = Mapper::get_value(queued_listing, %w(ForeclosureStatus))) ? Mapper::foreclosure_statuses(result) : nil
128
128
  end
129
129
 
130
130
  def self.franchise queued_listing, listing
@@ -132,199 +132,203 @@ module Mapper
132
132
  end
133
133
 
134
134
  def self.full_bathrooms queued_listing, listing
135
- get_value(queued_listing, %w(FullBathrooms))
135
+ Mapper::get_value(queued_listing, %w(FullBathrooms))
136
136
  end
137
137
 
138
138
  def self.geocode_options queued_listing, listing
139
- get_value(queued_listing, %w(Location GeocodeOptions))
139
+ Mapper::get_value(queued_listing, %w(Location GeocodeOptions))
140
140
  end
141
141
 
142
142
  def self.half_bathrooms queued_listing, listing
143
- get_value(queued_listing, %w(HalfBathrooms))
143
+ Mapper::get_value(queued_listing, %w(HalfBathrooms))
144
144
  end
145
145
 
146
146
  def self.has_attic queued_listing, listing
147
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasAttic))
147
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasAttic))
148
148
  end
149
149
 
150
150
  def self.has_barbecue_area queued_listing, listing
151
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasBarbecueArea))
151
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasBarbecueArea))
152
152
  end
153
153
 
154
154
  def self.has_basement queued_listing, listing
155
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasBasement))
155
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasBasement))
156
156
  end
157
157
 
158
158
  def self.has_ceiling_fan queued_listing, listing
159
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasCeilingFan))
159
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasCeilingFan))
160
160
  end
161
161
 
162
162
  def self.has_deck queued_listing, listing
163
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDeck))
163
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDeck))
164
164
  end
165
165
 
166
166
  def self.has_disabled_access queued_listing, listing
167
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDisabledAccess))
167
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDisabledAccess))
168
168
  end
169
169
 
170
170
  def self.has_dock queued_listing, listing
171
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDock))
171
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDock))
172
172
  end
173
173
 
174
174
  def self.has_doorman queued_listing, listing
175
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDoorman))
175
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDoorman))
176
176
  end
177
177
 
178
178
  def self.has_double_pane_windows queued_listing, listing
179
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDoublePaneWindows))
179
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasDoublePaneWindows))
180
180
  end
181
181
 
182
182
  def self.has_elevator queued_listing, listing
183
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasElevator))
183
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasElevator))
184
184
  end
185
185
 
186
186
  def self.has_fireplace queued_listing, listing
187
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasFireplace))
187
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasFireplace))
188
188
  end
189
189
 
190
190
  def self.has_garden queued_listing, listing
191
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGarden))
191
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGarden))
192
192
  end
193
193
 
194
194
  def self.has_gated_entry queued_listing, listing
195
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGatedEntry))
195
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGatedEntry))
196
196
  end
197
197
 
198
198
  def self.has_greenhouse queued_listing, listing
199
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGreenhouse))
199
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasGreenhouse))
200
200
  end
201
201
 
202
202
  def self.has_hot_tub_spa queued_listing, listing
203
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasHotTubSpa))
203
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasHotTubSpa))
204
204
  end
205
205
 
206
206
  def self.has_intercom queued_listing, listing
207
- get_boolean_value(queued_listing, %w(DetailedCharacteristics Intercom))
207
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics Intercom))
208
208
  end
209
209
 
210
210
  def self.has_jetted_bath_tub queued_listing, listing
211
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasJettedBathTub))
211
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasJettedBathTub))
212
212
  end
213
213
 
214
214
  def self.has_lawn queued_listing, listing
215
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasLawn))
215
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasLawn))
216
216
  end
217
217
 
218
218
  def self.has_mother_in_law queued_listing, listing
219
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasMotherInLaw))
219
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasMotherInLaw))
220
220
  end
221
221
 
222
222
  def self.has_patio queued_listing, listing
223
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPatio))
223
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPatio))
224
224
  end
225
225
 
226
226
  def self.has_pond queued_listing, listing
227
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPond))
227
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPond))
228
228
  end
229
229
 
230
230
  def self.has_pool queued_listing, listing
231
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPool))
231
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPool))
232
232
  end
233
233
 
234
234
  def self.has_porch queued_listing, listing
235
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPorch))
235
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasPorch))
236
236
  end
237
237
 
238
238
  def self.has_rv_parking queued_listing, listing
239
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasRVParking))
239
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasRVParking))
240
240
  end
241
241
 
242
242
  def self.has_sauna queued_listing, listing
243
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSauna))
243
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSauna))
244
244
  end
245
245
 
246
246
  def self.has_security_system queued_listing, listing
247
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSecuritySystem))
247
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSecuritySystem))
248
248
  end
249
249
 
250
250
  def self.has_skylight queued_listing, listing
251
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSkylight))
251
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSkylight))
252
252
  end
253
253
 
254
254
  def self.has_sports_court queued_listing, listing
255
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSportsCourt))
255
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSportsCourt))
256
256
  end
257
257
 
258
258
  def self.has_sprinkler_system queued_listing, listing
259
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSprinklerSystem))
259
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasSprinklerSystem))
260
260
  end
261
261
 
262
262
  def self.has_vaulted_ceiling queued_listing, listing
263
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasVaultedCeiling))
263
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasVaultedCeiling))
264
264
  end
265
265
 
266
266
  def self.has_wet_bar queued_listing, listing
267
- get_boolean_value(queued_listing, %w(DetailedCharacteristics HasWetBar))
267
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics HasWetBar))
268
268
  end
269
269
 
270
270
  def self.heating_fuels queued_listing, listing
271
- get_enums(queued_listing, %w(DetailedCharacteristics HeatingFuels HeatingFuel)).uniq
271
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics HeatingFuels HeatingFuel)).uniq
272
272
  end
273
273
 
274
274
  def self.heating_systems queued_listing, listing
275
- get_enums(queued_listing, %w(DetailedCharacteristics HeatingSystems HeatingSystem)).uniq
275
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics HeatingSystems HeatingSystem)).uniq
276
+ end
277
+
278
+ def self.import queued_listing, listing
279
+ queued_listing.import
276
280
  end
277
281
 
278
282
  def self.is_cable_ready queued_listing, listing
279
- get_boolean_value(queued_listing, %w(DetailedCharacteristics IsCableReady))
283
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics IsCableReady))
280
284
  end
281
285
 
282
286
  def self.is_new_construction queued_listing, listing
283
- get_boolean_value(queued_listing, %w(DetailedCharacteristics IsNewConstruction))
287
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics IsNewConstruction))
284
288
  end
285
289
 
286
290
  def self.is_waterfront queued_listing, listing
287
- get_boolean_value(queued_listing, %w(DetailedCharacteristics IsWaterfront))
291
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics IsWaterfront))
288
292
  end
289
293
 
290
294
  def self.is_wired queued_listing, listing
291
- get_boolean_value(queued_listing, %w(DetailedCharacteristics IsWired))
295
+ Mapper::get_boolean_value(queued_listing, %w(DetailedCharacteristics IsWired))
292
296
  end
293
297
 
294
298
  def self.latitude queued_listing, listing
295
- get_value(queued_listing, %w(Location Latitude))
299
+ Mapper::get_value(queued_listing, %w(Location Latitude))
296
300
  end
297
301
 
298
302
  def self.lead_routing_email queued_listing, listing
299
- get_value(queued_listing, %w(LeadRoutingEmail))
303
+ Mapper::get_value(queued_listing, %w(LeadRoutingEmail))
300
304
  end
301
305
 
302
306
  def self.legal_description queued_listing, listing
303
- get_value(queued_listing, %w(DetailedCharacteristics LegalDescription))
307
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics LegalDescription))
304
308
  end
305
309
 
306
310
  def self.list_price queued_listing, listing
307
- get_value(queued_listing, %w(ListPrice))
311
+ Mapper::get_value(queued_listing, %w(ListPrice))
308
312
  end
309
313
 
310
314
  def self.list_price_low queued_listing, listing
311
- get_value(queued_listing, %w(ListPriceLow))
315
+ Mapper::get_value(queued_listing, %w(ListPriceLow))
312
316
  end
313
317
 
314
318
  def self.listing_category queued_listing, listing
315
- (result = get_value(queued_listing, %w(ListingCategory))) ? Mapper::listing_categories(result) : nil
319
+ (result = Mapper::get_value(queued_listing, %w(ListingCategory))) ? Mapper::listing_categories(result) : nil
316
320
  end
317
321
 
318
322
  def self.listing_date queued_listing, listing
319
- (result = get_value(queued_listing, %w(ListingDate))) ? Chronic::parse(result).to_date : nil
323
+ (result = Mapper::get_value(queued_listing, %w(ListingDate))) ? Chronic::parse(result).to_date : nil
320
324
  end
321
325
 
322
326
  def self.listing_description queued_listing, listing
323
- get_value(queued_listing, %w(ListingDescription))
327
+ Mapper::get_value(queued_listing, %w(ListingDescription))
324
328
  end
325
329
 
326
330
  def self.listing_media queued_listing, listing, elements
327
- if (result = get_repeaters(queued_listing, elements))
331
+ if (result = Mapper::get_repeaters(queued_listing, elements))
328
332
  result.map do |item|
329
333
  listing.send(elements.last.tableize).find_or_initialize_by(
330
334
  media_url: item.drilldown('MediaURL'),
@@ -339,68 +343,68 @@ module Mapper
339
343
 
340
344
  # TODO: Make ListingProvider and SourceProviderCategory Provider and ProviderCategory
341
345
  def self.listing_provider queued_listing, listing
342
- if get_value(queued_listing, %w(ProviderName)).present?
346
+ if Mapper::get_value(queued_listing, %w(ProviderName)).present?
343
347
  result = ListingProvider.find_or_initialize_by(
344
- name: get_value(queued_listing, %w(ProviderName)),
345
- url: get_value(queued_listing, %w(ProviderURL)),
346
- source_provider_category: Mapper::source_provider_categories(get_value(queued_listing, %w(ProviderCategory)))
348
+ name: Mapper::get_value(queued_listing, %w(ProviderName)),
349
+ url: Mapper::get_value(queued_listing, %w(ProviderURL)),
350
+ source_provider_category: Mapper::source_provider_categories(Mapper::get_value(queued_listing, %w(ProviderCategory)))
347
351
  )
348
352
  end
349
353
  end
350
354
 
351
355
  def self.listing_status queued_listing, listing
352
- (result = get_value(queued_listing, %w(ListingStatus))) ? Mapper::listing_statuses(result) : nil
356
+ (result = Mapper::get_value(queued_listing, %w(ListingStatus))) ? Mapper::listing_statuses(result) : nil
353
357
  end
354
358
 
355
359
  def self.listing_title queued_listing, listing
356
- get_value(queued_listing, %w(ListingTitle))
360
+ Mapper::get_value(queued_listing, %w(ListingTitle))
357
361
  end
358
362
 
359
363
  def self.listing_url queued_listing, listing
360
- get_value(queued_listing, %w(ListingURL))
364
+ Mapper::get_value(queued_listing, %w(ListingURL))
361
365
  end
362
366
 
363
367
  def self.living_area queued_listing, listing
364
- get_value(queued_listing, %w(LivingArea))
368
+ Mapper::get_value(queued_listing, %w(LivingArea))
365
369
  end
366
370
 
367
371
  def self.living_area_unit queued_listing, listing
368
- get_value(queued_listing, %w(LivingArea areaUnits))
372
+ Mapper::get_value(queued_listing, %w(LivingArea areaUnits))
369
373
  end
370
374
 
371
375
  def self.longitude queued_listing, listing
372
- get_value(queued_listing, %w(Location Longitude))
376
+ Mapper::get_value(queued_listing, %w(Location Longitude))
373
377
  end
374
378
 
375
379
  def self.lot_size queued_listing, listing
376
- get_value(queued_listing, %w(LotSize))
380
+ Mapper::get_value(queued_listing, %w(LotSize))
377
381
  end
378
382
 
379
383
  def self.mls_number queued_listing, listing
380
- get_value(queued_listing, %w(MlsNumber))
384
+ Mapper::get_value(queued_listing, %w(MlsNumber))
381
385
  end
382
386
 
383
387
  def self.modification_timestamp queued_listing, listing
384
388
  # TODO: Change from string to datetime
385
- get_value(queued_listing, %w(ModificationTimestamp))
389
+ Mapper::get_value(queued_listing, %w(ModificationTimestamp))
386
390
  end
387
391
 
388
392
  def self.multiple_listing_service queued_listing, listing
389
- if (get_value(queued_listing, %w(MlsId)) || get_value(queued_listing, %w(MlsName)))
393
+ if (Mapper::get_value(queued_listing, %w(MlsId)) || Mapper::get_value(queued_listing, %w(MlsName)))
390
394
  MultipleListingService.find_or_initialize_by(
391
- mls_id: get_value(queued_listing, %w(MlsId)),
392
- mls_name: get_value(queued_listing, %w(MlsName))
395
+ mls_id: Mapper::get_value(queued_listing, %w(MlsId)),
396
+ mls_name: Mapper::get_value(queued_listing, %w(MlsName))
393
397
  )
394
398
  end
395
399
  end
396
400
 
397
401
  def self.neighborhoods queued_listing, listing
398
- if (result = get_value(queued_listing, %w(Location Neighborhoods Neighborhood)))
402
+ if (result = Mapper::get_value(queued_listing, %w(Location Neighborhoods Neighborhood)))
399
403
  places = result.map do |item|
400
404
  place = Neighborhood.find_or_initialize_by(
401
- city: get_value(queued_listing, %w(Address City)),
405
+ city: Mapper::get_value(queued_listing, %w(Address City)),
402
406
  name: item.drilldown('Name'),
403
- state_or_province: get_value(queued_listing, %w(Address StateOrProvince))
407
+ state_or_province: Mapper::get_value(queued_listing, %w(Address StateOrProvince))
404
408
  )
405
409
  place.description = item.drilldown('Description')
406
410
  place
@@ -410,15 +414,15 @@ module Mapper
410
414
  end
411
415
 
412
416
  def self.num_floors queued_listing, listing
413
- get_value(queued_listing, %w(DetailedCharacteristics NumFloors))
417
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics NumFloors))
414
418
  end
415
419
 
416
420
  def self.num_parking_spaces queued_listing, listing
417
- get_value(queued_listing, %w(DetailedCharacteristics NumParkingSpaces))
421
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics NumParkingSpaces))
418
422
  end
419
423
 
420
424
  def self.office queued_listing, listing
421
- if (result = get_value(queued_listing, %w(Offices Office)))
425
+ if (result = Mapper::get_value(queued_listing, %w(Offices Office)))
422
426
  office = Office.find_or_initialize_by(
423
427
  office_identifier: result.drilldown('OfficeId'),
424
428
  name: result.drilldown('Name')
@@ -448,12 +452,12 @@ module Mapper
448
452
  end
449
453
 
450
454
  def self.one_quarter_bathrooms queued_listing, listing
451
- get_value(queued_listing, %w(OneQuarterBathrooms))
455
+ Mapper::get_value(queued_listing, %w(OneQuarterBathrooms))
452
456
  end
453
457
 
454
458
  # TODO: Figure out how to provide time zone for StartTime and EndTime
455
459
  def self.open_houses queued_listing, listing
456
- if (result = get_repeaters(queued_listing, %w(OpenHouses OpenHouse)))
460
+ if (result = Mapper::get_repeaters(queued_listing, %w(OpenHouses OpenHouse)))
457
461
  result.map do |open_house|
458
462
  oh = listing.open_houses.find_or_initialize_by(
459
463
  showing_date: Chronic::parse(open_house['Date']).to_date,
@@ -467,12 +471,12 @@ module Mapper
467
471
  end
468
472
 
469
473
  def self.parcel_id queued_listing, listing
470
- get_value(queued_listing, %w(Location ParcelId))
474
+ Mapper::get_value(queued_listing, %w(Location ParcelId))
471
475
  end
472
476
 
473
477
  # TODO: Change participant_identifier to participant_id
474
478
  def self.participants queued_listing, listing
475
- if (result = get_repeaters(queued_listing, %w(ListingParticipants Participant)))
479
+ if (result = Mapper::get_repeaters(queued_listing, %w(ListingParticipants Participant)))
476
480
  result.map do |item|
477
481
  participant = Participant.find_or_initialize_by(
478
482
  first_name: item['FirstName'],
@@ -494,7 +498,7 @@ module Mapper
494
498
  end
495
499
 
496
500
  def self.permit_address_on_internet queued_listing, listing
497
- get_boolean_value(queued_listing, %w(MarketingInformation PermitAddressOnInternet'))
501
+ Mapper::get_boolean_value(queued_listing, %w(MarketingInformation PermitAddressOnInternet'))
498
502
  end
499
503
 
500
504
  def self.photos queued_listing, listing
@@ -502,38 +506,38 @@ module Mapper
502
506
  end
503
507
 
504
508
  def self.property_sub_type queued_listing, listing
505
- (result = get_value(queued_listing, %w(PropertySubType))) ? Mapper::property_sub_types(result) : nil
509
+ (result = Mapper::get_value(queued_listing, %w(PropertySubType))) ? Mapper::property_sub_types(result) : nil
506
510
  end
507
511
 
508
512
  def self.property_sub_type_description queued_listing, listing
509
- get_value(queued_listing, %w(PropertySubType otherDescription))
513
+ Mapper::get_value(queued_listing, %w(PropertySubType otherDescription))
510
514
  end
511
515
 
512
516
  def self.property_type queued_listing, listing
513
- (result = get_value(queued_listing, %w(PropertyType))) ? Mapper::property_types(result) : nil
517
+ (result = Mapper::get_value(queued_listing, %w(PropertyType))) ? Mapper::property_types(result) : nil
514
518
  end
515
519
 
516
520
  def self.property_type_description queued_listing, listing
517
- get_value(queued_listing, %w(PropertyType otherDescription))
521
+ Mapper::get_value(queued_listing, %w(PropertyType otherDescription))
518
522
  end
519
523
 
520
524
  def self.roof_types queued_listing, listing
521
- get_enums(queued_listing, %w(DetailedCharacteristics RoofTypes RoofType))
525
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics RoofTypes RoofType))
522
526
  end
523
527
 
524
528
  def self.room_count queued_listing, listing
525
- get_value(queued_listing, %w(DetailedCharacteristics RoomCount))
529
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics RoomCount))
526
530
  end
527
531
 
528
532
  def self.rooms queued_listing, listing
529
- if (result = get_value(queued_listing, %w(DetailedCharacteristics Rooms Room)))
533
+ if (result = Mapper::get_value(queued_listing, %w(DetailedCharacteristics Rooms Room)))
530
534
  rooms = Array(result).map{|room_category| Room.new(listing: listing, room_category: Mapper::room_categories(room_category))}
531
535
  end
532
536
  rooms ? rooms : []
533
537
  end
534
538
 
535
539
  def self.taxes queued_listing, listing
536
- if (result = get_repeaters(queued_listing, %w(Taxes Tax)))
540
+ if (result = Mapper::get_repeaters(queued_listing, %w(Taxes Tax)))
537
541
  result.map{|item| Tax.find_or_initialize_by(
538
542
  year: item['Year'],
539
543
  amount: item['Amount'],
@@ -543,7 +547,7 @@ module Mapper
543
547
  end
544
548
 
545
549
  def self.three_quarter_bathrooms queued_listing, listing
546
- get_value(queued_listing, %w(ThreeQuarterBathrooms))
550
+ Mapper::get_value(queued_listing, %w(ThreeQuarterBathrooms))
547
551
  end
548
552
 
549
553
  def self.videos queued_listing, listing
@@ -551,7 +555,7 @@ module Mapper
551
555
  end
552
556
 
553
557
  def self.view_types queued_listing, listing
554
- get_enums(queued_listing, %w(DetailedCharacteristics ViewTypes ViewType))
558
+ Mapper::get_enums(queued_listing, %w(DetailedCharacteristics ViewTypes ViewType))
555
559
  end
556
560
 
557
561
  def self.virtual_tours queued_listing, listing
@@ -559,29 +563,29 @@ module Mapper
559
563
  end
560
564
 
561
565
  def self.vow_address_display queued_listing, listing
562
- get_boolean_value(queued_listing, %w(MarketingInformation VOWAutomatedValuationDisplay'))
566
+ Mapper::get_boolean_value(queued_listing, %w(MarketingInformation VOWAutomatedValuationDisplay'))
563
567
  end
564
568
 
565
569
  def self.vow_automated_valuation_display queued_listing, listing
566
- get_boolean_value(queued_listing, %w(MarketingInformation VOWAddressDisplay'))
570
+ Mapper::get_boolean_value(queued_listing, %w(MarketingInformation VOWAddressDisplay'))
567
571
  end
568
572
 
569
573
  def self.vow_consumer_comment queued_listing, listing
570
- get_boolean_value(queued_listing, %w(MarketingInformation VOWConsumerComment'))
574
+ Mapper::get_boolean_value(queued_listing, %w(MarketingInformation VOWConsumerComment'))
571
575
  end
572
576
 
573
577
  def self.year_built queued_listing, listing
574
- get_value(queued_listing, %w(YearBuilt))
578
+ Mapper::get_value(queued_listing, %w(YearBuilt))
575
579
  end
576
580
 
577
581
  def self.year_updated queued_listing, listing
578
- get_value(queued_listing, %w(DetailedCharacteristics YearUpdated))
582
+ Mapper::get_value(queued_listing, %w(DetailedCharacteristics YearUpdated))
579
583
  end
580
584
 
581
585
  # Utilities
582
586
 
583
587
  def self.get_reso_business queued_listing, business_type
584
- if (result = get_value(queued_listing, [business_type]))
588
+ if (result = Mapper::get_value(queued_listing, [business_type]))
585
589
  business = business_type.constantize.find_or_initialize_by(
586
590
  name: result.drilldown('Name'),
587
591
  phone: result.drilldown('Phone')
@@ -606,50 +610,5 @@ module Mapper
606
610
  end
607
611
  end
608
612
 
609
- def self.unique_identifier queued_listing
610
- (result = get_value(queued_listing, queued_listing.import.unique_identifier.split(' ')))
611
- end
612
-
613
- def self.get_boolean_value queued_listing, elements
614
- (result = get_value(queued_listing, elements)) ? result.to_s.to_bool : nil
615
- end
616
-
617
- def self.get_repeaters queued_listing, elements
618
- if (value = get_value(queued_listing, elements[0..-2]))
619
- (result = value.drilldown(elements.last)) ? (result.is_a?(Array) ? result : [result]) : nil
620
- else
621
- return []
622
- end
623
- end
624
-
625
- def self.get_enums queued_listing, elements
626
- if (result = get_repeaters(queued_listing, elements))
627
- enums = result.map{|name| Mapper.send(elements.last.tableize)[name]}
628
- end
629
- enums ? enums.compact : nil
630
- end
631
-
632
- def self.get_value queued_listing, elements
633
- if elements.count.eql?(1)
634
- get_simple_value(queued_listing, elements.first)
635
- else
636
- get_subvalue(queued_listing, elements.first, elements[1..-1])
637
- end
638
- end
639
-
640
- def self.get_simple_value queued_listing, element
641
- if (value = queued_listing.listing_data[element])
642
- value.unwrap_attribute
643
- end
644
- end
645
-
646
- def self.get_subvalue queued_listing, element, child_elements
647
- if (value = get_simple_value(queued_listing, element))
648
- if (subvalue = child_elements.inject(value){|v, e| v[e] ? v[e] : Hash.new })
649
- subvalue.present? ? subvalue.unwrap_attribute : nil
650
- end
651
- end
652
- end
653
-
654
613
  end
655
614
  end
data/lib/reso/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Reso
2
- VERSION = "0.1.0.3"
2
+ VERSION = "0.1.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reso
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.3
4
+ version: 0.1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Edlund
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-22 00:00:00.000000000 Z
11
+ date: 2015-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake