rubillow 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ ## 0.0.6 / 2013-04-10
2
+
3
+ * Fix case where Zillow returns multiple results for an address -- assume first address for result
4
+ * Fix RentZestimate bug when valueChange doesn't have a duration.
5
+ * Fix common scenarios where xml nodes are not present
6
+
1
7
  ## 0.0.5 / 2013-01-12
2
8
 
3
9
  * Include RentZestimate if available
@@ -22,4 +28,4 @@
22
28
  ## 0.0.1 / 2011-08-27
23
29
 
24
30
  * Covers all Zillow API endpoints
25
- * Code documentation
31
+ * Code documentation
@@ -1,34 +1,50 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rubillow (0.0.5)
5
- nokogiri (~> 1.5.0)
4
+ rubillow (0.0.6)
5
+ nokogiri (~> 1.5)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- bluecloth (2.1.0)
11
- diff-lcs (1.1.2)
12
- nokogiri (1.5.6)
13
- rake (0.9.2)
14
- rcov (0.9.10)
15
- rspec (2.6.0)
16
- rspec-core (~> 2.6.0)
17
- rspec-expectations (~> 2.6.0)
18
- rspec-mocks (~> 2.6.0)
19
- rspec-core (2.6.4)
20
- rspec-expectations (2.6.0)
21
- diff-lcs (~> 1.1.2)
22
- rspec-mocks (2.6.0)
23
- yard (0.7.2)
10
+ bluecloth (2.2.0)
11
+ colorize (0.5.8)
12
+ coveralls (0.6.0)
13
+ colorize
14
+ multi_json (~> 1.3)
15
+ rest-client
16
+ simplecov (>= 0.7)
17
+ thor
18
+ diff-lcs (1.2.1)
19
+ mime-types (1.21)
20
+ multi_json (1.6.1)
21
+ nokogiri (1.5.9)
22
+ rake (10.0.3)
23
+ rest-client (1.6.7)
24
+ mime-types (>= 1.16)
25
+ rspec (2.13.0)
26
+ rspec-core (~> 2.13.0)
27
+ rspec-expectations (~> 2.13.0)
28
+ rspec-mocks (~> 2.13.0)
29
+ rspec-core (2.13.0)
30
+ rspec-expectations (2.13.0)
31
+ diff-lcs (>= 1.1.3, < 2.0)
32
+ rspec-mocks (2.13.0)
33
+ simplecov (0.7.1)
34
+ multi_json (~> 1.0)
35
+ simplecov-html (~> 0.7.1)
36
+ simplecov-html (0.7.1)
37
+ thor (0.17.0)
38
+ yard (0.8.5.2)
24
39
 
25
40
  PLATFORMS
26
41
  ruby
27
42
 
28
43
  DEPENDENCIES
29
- bluecloth (>= 2.1.0)
30
- rake (~> 0.9.2)
31
- rcov (~> 0.9.10)
32
- rspec (~> 2.6)
44
+ bluecloth (~> 2.2)
45
+ coveralls (~> 0.6)
46
+ rake (~> 10.0)
47
+ rspec (~> 2.12)
33
48
  rubillow!
34
- yard (>= 0.6.8)
49
+ simplecov (~> 0.7)
50
+ yard (~> 0.8)
data/README.md CHANGED
@@ -61,8 +61,11 @@ You should find the documentation for your version of Rubillow on [Rubygems](htt
61
61
 
62
62
  # Build & Dependency Status
63
63
 
64
+ [![Gem Version](https://badge.fury.io/rb/rubillow.png)](http://badge.fury.io/rb/rubillow)
64
65
  [![Build Status](https://travis-ci.org/synewaves/rubillow.png?branch=master)](https://travis-ci.org/synewaves/rubillow)
65
66
  [![Dependency Status](https://gemnasium.com/synewaves/rubillow.png?travis)](https://gemnasium.com/synewaves/rubillow)
67
+ [![Code Climate](https://codeclimate.com/github/synewaves/rubillow.png)](https://codeclimate.com/github/synewaves/rubillow)
68
+ [![Coverage Status](https://coveralls.io/repos/synewaves/rubillow/badge.png?branch=master)](https://coveralls.io/r/synewaves/rubillow)
66
69
 
67
70
  # License
68
71
 
data/Rakefile CHANGED
@@ -1,6 +1,5 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
- # require 'rcov/rcovtask'
4
3
  require "yard"
5
4
 
6
5
  desc "Run specs"
@@ -9,29 +8,11 @@ RSpec::Core::RakeTask.new do |t|
9
8
  end
10
9
 
11
10
  desc "Run specs with coverage"
12
- RSpec::Core::RakeTask.new("spec_rcov") do |t|
13
- t.pattern = "spec/**/*_spec.rb"
14
- t.rcov = true
15
- t.rcov_opts = %w{--exclude spec,gems}
16
- t.rcov_opts << %[-o "coverage"]
11
+ task :coverage do
12
+ ENV['COVERAGE'] = 'true'
13
+ Rake::Task["spec"].execute
17
14
  end
18
15
 
19
- # RSpec::Rake::SpecTask.new("rcov_spec") do |t|
20
- # t.spec_files = FileList['spec/**/*_spec.rb']
21
- # t.spec_opts = ['--color']
22
- # t.rcov = true
23
- # t.rcov_opts = ['--exclude', '^spec,/gems/']
24
- # end
25
-
26
- # desc 'Performs code coverage.'
27
- # Rcov::RcovTask.new do |t|
28
- # t.test_files = FileList['spec/*_spec.rb']
29
- # t.verbose = true
30
- # end
31
-
32
- # desc "Clean files generated by rake tasks"
33
- # task :clobber => [:clobber_rcov]
34
-
35
16
  YARD::Rake::YardocTask.new do |t|
36
17
  end
37
18
 
@@ -0,0 +1,15 @@
1
+ # Helper methods for parsing XML.
2
+ module XmlParsingHelper
3
+ # @param path [String] Xpath query to find the node in XML.
4
+ # @param attribute [Symbol] Attribute on the node to call and return as the value.
5
+ # @param xml [Nokogiri::XML] A nokogiri parser object to call #xpath.
6
+ # @param nil_value (optional) A value to return if the attribute on the node
7
+ # is nil or if the node is not present.
8
+ #
9
+ # @return [String] Value from an attribute of an xpath node, if present.
10
+ # If the node is not present, return nil or nil_value if specified.
11
+ def xpath_if_present(path, attribute, xml, nil_value = nil)
12
+ text = xml.xpath(path).first.send(attribute) unless xml.xpath(path).empty?
13
+ text ||= nil_value
14
+ end
15
+ end
@@ -1,10 +1,13 @@
1
1
  require "nokogiri"
2
+ require "rubillow/helpers/xml_parsing_helper"
2
3
 
3
4
  module Rubillow
4
5
  # Sub module for returned and parsed web service data
5
6
  module Models
6
7
  # Base class for data models
7
8
  class Base
9
+ include XmlParsingHelper
10
+
8
11
  # @return [String] the raw XML content from the service
9
12
  attr_accessor :xml
10
13
 
@@ -82,4 +85,4 @@ require "rubillow/models/demographics"
82
85
  require "rubillow/models/demographic_value"
83
86
  require "rubillow/models/region_children"
84
87
  require "rubillow/models/region_chart"
85
- require "rubillow/models/region"
88
+ require "rubillow/models/region"
@@ -24,12 +24,12 @@ module Rubillow
24
24
  address = xml.xpath('//address')
25
25
  if !address.empty?
26
26
  @address = {
27
- :street => address.xpath('//street').text,
28
- :city => address.xpath('//city').text,
29
- :state => address.xpath('//state').text,
30
- :zipcode => address.xpath('//zipcode').text,
31
- :latitude => address.xpath('//latitude').text,
32
- :longitude => address.xpath('//longitude').text,
27
+ :street => address.xpath('//street').first.text,
28
+ :city => address.xpath('//city').first.text,
29
+ :state => address.xpath('//state').first.text,
30
+ :zipcode => address.xpath('//zipcode').first.text,
31
+ :latitude => address.xpath('//latitude').first.text,
32
+ :longitude => address.xpath('//longitude').first.text,
33
33
  }
34
34
  end
35
35
  end
@@ -25,9 +25,9 @@ module Rubillow
25
25
 
26
26
  return if !success?
27
27
 
28
- @height = @parser.xpath('//request/height').text.to_i
29
- @width = @parser.xpath('//request/width').text.to_i
30
- @url = @parser.xpath('//response/url').text
28
+ @height = @parser.xpath('//request/height').first.text.to_i
29
+ @width = @parser.xpath('//request/width').first.text.to_i
30
+ @url = @parser.xpath('//response/url').first.text
31
31
  end
32
32
  end
33
33
  end
@@ -3,6 +3,7 @@ module Rubillow
3
3
  # Get a property's information with deeper data.
4
4
  class DeepSearchResult < SearchResult
5
5
  include PropertyBasics
6
+ include XmlParsingHelper
6
7
 
7
8
  # @return [String] FIPS county code. See {http://www.itl.nist.gov/fipspubs/fip6-4.htm}.
8
9
  attr_accessor :fips_county
@@ -31,16 +32,15 @@ module Rubillow
31
32
  return if !success?
32
33
 
33
34
  extract_property_basics(@parser)
34
-
35
- @fips_county = @parser.xpath('//FIPScounty').text
36
- @tax_assessment_year = @parser.xpath('//taxAssessmentYear').text
37
- @tax_assessment = @parser.xpath('//taxAssessment').text
38
- @year_built = @parser.xpath('//yearBuilt').text
39
- if tmp = @parser.xpath('//lastSoldDate').text and tmp.strip.length > 0
35
+ @fips_county = xpath_if_present('//FIPScounty', :text, @parser, "")
36
+ @tax_assessment_year = xpath_if_present('//taxAssessmentYear', :text, @parser)
37
+ @tax_assessment = xpath_if_present('//taxAssessment', :text, @parser)
38
+ @year_built = xpath_if_present('//yearBuilt', :text, @parser)
39
+ if tmp = xpath_if_present('//lastSoldDate', :text, @parser) and tmp.strip.length > 0
40
40
  @last_sold_date = Date.strptime(tmp, "%m/%d/%Y")
41
41
  end
42
- @last_sold_price = @parser.xpath('//lastSoldPrice').text
42
+ @last_sold_price = xpath_if_present('//lastSoldPrice', :text, @parser)
43
43
  end
44
44
  end
45
45
  end
46
- end
46
+ end
@@ -24,13 +24,13 @@ module Rubillow
24
24
 
25
25
  # @private
26
26
  def extract_property_basics(xml)
27
- @use_code = xml.xpath('//useCode').text
28
- @lot_size_square_feet = xml.xpath('//lotSizeSqFt').text
29
- @finished_square_feet = xml.xpath('//finishedSqFt').text
30
- @bathrooms = xml.xpath('//bathrooms').text
31
- @bedrooms = xml.xpath('//bedrooms').text
32
- @total_rooms = xml.xpath('//totalRooms').text
27
+ @use_code = xpath_if_present('//useCode', :text, xml, "")
28
+ @lot_size_square_feet = xpath_if_present('//lotSizeSqFt', :text, xml, "")
29
+ @finished_square_feet = xpath_if_present('//finishedSqFt', :text, xml, "")
30
+ @bathrooms = xpath_if_present('//bathrooms', :text, xml, "")
31
+ @bedrooms = xpath_if_present('//bedrooms', :text, xml, "")
32
+ @total_rooms = xpath_if_present('//totalRooms', :text, xml, "")
33
33
  end
34
34
  end
35
35
  end
36
- end
36
+ end
@@ -31,7 +31,7 @@ module Rubillow
31
31
 
32
32
  return if !success?
33
33
 
34
- @id = @parser.xpath('//id').text
34
+ @id = @parser.xpath('//id').first.text
35
35
  @state = @parser.xpath('//state').text
36
36
  @city = @parser.xpath('//city').text
37
37
  @neighborhood = @parser.xpath('//neighborhood').text
@@ -62,15 +62,15 @@ module Rubillow
62
62
  extract_images(@parser)
63
63
 
64
64
  @page_views = {
65
- :current_month => @parser.xpath('//pageViewCount/currentMonth').text,
66
- :total => @parser.xpath('//pageViewCount/total').text
65
+ :current_month => @parser.xpath('//pageViewCount/currentMonth').first.text,
66
+ :total => @parser.xpath('//pageViewCount/total').first.text
67
67
  }
68
- @price = @parser.xpath('//price').text
69
- @neighborhood = @parser.xpath('//neighborhood').text
70
- @school_district = @parser.xpath('//schoolDistrict').text
71
- @elementary_school = @parser.xpath('//elementarySchool').text
72
- @middle_school = @parser.xpath('//middleSchool').text
73
- @home_description = @parser.xpath('//homeDescription').text
68
+ @price = @parser.xpath('//price').first.text
69
+ @neighborhood = @parser.xpath('//neighborhood').first.text
70
+ @school_district = @parser.xpath('//schoolDistrict').first.text
71
+ @elementary_school = @parser.xpath('//elementarySchool').first.text
72
+ @middle_school = @parser.xpath('//middleSchool').first.text
73
+ @home_description = @parser.xpath('//homeDescription').first.text
74
74
 
75
75
  @posting = {}
76
76
  @parser.xpath('//posting').children.each do |elm|
@@ -55,23 +55,22 @@ module Rubillow
55
55
  extract_links(xml)
56
56
  extract_address(xml)
57
57
 
58
- @price = xml.xpath('//zestimate/amount').text
59
- @last_updated = Date.strptime(xml.xpath('//zestimate/last-updated').text, "%m/%d/%Y")
58
+ @price = xml.xpath('//zestimate/amount').first.text
59
+ @last_updated = Date.strptime(xml.xpath('//zestimate/last-updated').first.text, "%m/%d/%Y")
60
60
  @valuation_range = {
61
- :low => xml.xpath('//zestimate/valuationRange/low').text,
62
- :high => xml.xpath('//zestimate/valuationRange/high').text,
61
+ :low => xml.xpath('//zestimate/valuationRange/low').first.text,
62
+ :high => xml.xpath('//zestimate/valuationRange/high').first.text,
63
63
  }
64
- @change = xml.xpath('//zestimate/valueChange').text
65
-
64
+ @change = xml.xpath('//zestimate/valueChange').first.text
66
65
  if xml.xpath('//rentzestimate/amount').text.length > 0
67
66
  @rent_zestimate = {
68
- :price => xml.xpath('//rentzestimate/amount').text,
69
- :last_updated => xml.xpath('//rentzestimate/last-updated').text,
70
- :value_change => xml.xpath('//rentzestimate/valueChange').text,
71
- :value_duration => xml.xpath('//rentzestimate/valueChange').attr('duration').value,
67
+ :price => xml.xpath('//rentzestimate/amount').first.text,
68
+ :last_updated => xml.xpath('//rentzestimate/last-updated').first.text,
69
+ :value_change => xml.xpath('//rentzestimate/valueChange').first.text,
70
+ :value_duration => xml.xpath('//rentzestimate').first.xpath("//valueChange").first.attr("duration").chomp,
72
71
  :valuation_range => {
73
- :low => xml.xpath('//rentzestimate/valuationRange/low').text,
74
- :high => xml.xpath('//rentzestimate/valuationRange/high').text
72
+ :low => xml.xpath('//rentzestimate/valuationRange/low').first.text,
73
+ :high => xml.xpath('//rentzestimate/valuationRange/high').first.text
75
74
  },
76
75
  :percentile => xml.xpath('//rentzestimate/percentile').text
77
76
  }
@@ -82,7 +81,7 @@ module Rubillow
82
81
  if tmp = xml.xpath('//zestimate/valueChange').attr('duration')
83
82
  @change_duration = tmp.value
84
83
  end
85
- @percentile = xml.xpath('//zestimate/percentile').text
84
+ @percentile = xml.xpath('//zestimate/percentile').first.text
86
85
 
87
86
  if xml.at_xpath('//localRealEstate/region')
88
87
  @region = xml.xpath('//localRealEstate/region').attribute('name').value
@@ -90,12 +89,12 @@ module Rubillow
90
89
  @region_type = xml.xpath('//localRealEstate/region').attribute('type').value
91
90
 
92
91
  @local_real_estate = {
93
- :overview => xml.xpath('//localRealEstate/region/links/overview').text,
94
- :for_sale_by_owner => xml.xpath('//localRealEstate/region/links/forSaleByOwner').text,
95
- :for_sale => xml.xpath('//localRealEstate/region/links/forSale').text,
92
+ :overview => xml.xpath('//localRealEstate/region/links/overview').first.text,
93
+ :for_sale_by_owner => xml.xpath('//localRealEstate/region/links/forSaleByOwner').first.text,
94
+ :for_sale => xml.xpath('//localRealEstate/region/links/forSale').first.text,
96
95
  }
97
96
  end
98
97
  end
99
98
  end
100
99
  end
101
- end
100
+ end
@@ -18,7 +18,7 @@ module Rubillow
18
18
  selector = '//zpid'
19
19
  end
20
20
 
21
- @zpid = xml.xpath(selector).text
21
+ @zpid = xml.xpath(selector).first.text
22
22
  end
23
23
  end
24
24
  end
@@ -1,4 +1,4 @@
1
1
  module Rubillow
2
2
  # @private
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
@@ -10,6 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.homepage = "https://github.com/synewaves/rubillow"
11
11
  s.summary = "Ruby library to access the Zillow API"
12
12
  s.description = "Ruby library to access the Zillow API"
13
+ s.license = "MIT"
13
14
 
14
15
  s.rubyforge_project = "rubillow"
15
16
 
@@ -18,11 +19,12 @@ Gem::Specification.new do |s|
18
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
20
  s.require_paths = ["lib"]
20
21
 
21
- s.add_development_dependency "rake", "~> 0.9.2"
22
- s.add_development_dependency "rspec", "~> 2.6"
23
- s.add_development_dependency "yard", ">= 0.6.8"
24
- s.add_development_dependency "bluecloth", ">= 2.1.0"
25
- s.add_development_dependency "rcov", "~> 0.9.10"
26
-
27
- s.add_runtime_dependency "nokogiri", "~> 1.5.0"
22
+ s.add_dependency "nokogiri", "~> 1.5"
23
+
24
+ s.add_development_dependency "rake", "~> 10.0"
25
+ s.add_development_dependency "rspec", "~> 2.12"
26
+ s.add_development_dependency "yard", "~> 0.8"
27
+ s.add_development_dependency "bluecloth", "~> 2.2"
28
+ s.add_development_dependency "simplecov", "~> 0.7"
29
+ s.add_development_dependency "coveralls", "~> 0.6"
28
30
  end
@@ -44,4 +44,53 @@ describe Rubillow::Models::DeepSearchResult do
44
44
  data.last_sold_price.should == "1025000"
45
45
  data.use_code.should == "SingleFamily"
46
46
  end
47
- end
47
+
48
+ it "populates the data" do
49
+ data = Rubillow::Models::DeepSearchResult.new(get_xml('get_deep_search_results_duplicated.xml'))
50
+
51
+ data.zpid.should == '66109976'
52
+ data.links.count.should == 4
53
+ data.links[:homedetails].should == "http://www.zillow.com/homedetails/3651-Louisiana-St-APT-205-San-Diego-CA-92104/2126762315_zpid/"
54
+ data.links[:graphsanddata].should == "http://www.zillow.com/homedetails/3651-Louisiana-St-APT-205-San-Diego-CA-92104/66109976_zpid/#charts-and-data"
55
+ data.links[:mapthishome].should == "http://www.zillow.com/homes/2126762315_zpid/"
56
+ data.links[:comparables].should == "http://www.zillow.com/homes/comps/2126762315_zpid/"
57
+ data.address[:street].should == "3651 Louisiana St APT 205"
58
+ data.address[:city].should == "San Diego"
59
+ data.address[:state].should == "CA"
60
+ data.address[:zipcode].should == "92104"
61
+ data.address[:latitude].should == "32.744895"
62
+ data.address[:longitude].should == "-117.139743"
63
+ data.price.should == "249461"
64
+ data.percentile.should == "0"
65
+ data.last_updated.strftime("%m/%d/%Y").should == "04/02/2013"
66
+ data.valuation_range[:low].should == "219526"
67
+ data.valuation_range[:high].should == "271912"
68
+ data.change.should == "20262"
69
+ data.change_duration.should == "30"
70
+ data.local_real_estate.count.should == 3
71
+ data.local_real_estate[:overview].should == "http://www.zillow.com/local-info/CA-San-Diego/North-Park/r_274717/"
72
+ data.local_real_estate[:for_sale_by_owner].should == "http://www.zillow.com/north-park-san-diego-ca/fsbo/"
73
+ data.local_real_estate[:for_sale].should == "http://www.zillow.com/north-park-san-diego-ca/"
74
+ data.region.should == "North Park"
75
+ data.region_type.should == "neighborhood"
76
+ data.region_id.should == "274717"
77
+ data.fips_county.should == "6073"
78
+ data.tax_assessment_year.should == "2012"
79
+ data.tax_assessment.should == "180539.0"
80
+ data.year_built.should == "1985"
81
+ data.lot_size_square_feet.should == ""
82
+ data.finished_square_feet.should == "800"
83
+ data.bathrooms.should == "2.0"
84
+ data.bedrooms.should == "2"
85
+ data.total_rooms.should == ""
86
+ data.last_sold_date.strftime("%m/%d/%Y").should == "06/10/2011"
87
+ data.last_sold_price.should == "186000"
88
+ data.use_code.should == "Condominium"
89
+ end
90
+
91
+ it "doesn't raise an error when data is missing" do
92
+ lambda {
93
+ Rubillow::Models::DeepSearchResult.new(get_xml("get_deep_search_results_missing_data.xml"))
94
+ }.should_not raise_error
95
+ end
96
+ end
@@ -97,4 +97,12 @@ describe Rubillow::Models::SearchResult do
97
97
  data.local_real_estate.should == nil
98
98
  data.region.should == nil
99
99
  end
100
+
101
+ it "populates the results from GetZestimate with missing valueDuration data" do
102
+ data = Rubillow::Models::SearchResult.new(get_xml('get_zestimate_missing_value_duration.xml'))
103
+
104
+ data.zpid.should == '29366758'
105
+ data.rent_zestimate.should be_a Hash
106
+ data.rent_zestimate[:value_duration].should be == '30'
107
+ end
100
108
  end
@@ -1,3 +1,12 @@
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start
9
+
1
10
  require File.expand_path("../../lib/rubillow", __FILE__)
2
11
  require 'rspec'
3
12
 
@@ -0,0 +1,123 @@
1
+ <SearchResults:searchresults xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SearchResults="http://www.zillow.com/static/xsd/SearchResults.xsd" xsi:schemaLocation="http://www.zillow.com/static/xsd/SearchResults.xsd http://www.zillowstatic.com/vstatic/aef8ddf0c58c6e153fc4285eac934229/static/xsd/SearchResults.xsd">
2
+ <request>
3
+ <address>3651 louisiana st 205 san diego ca</address>
4
+ <citystatezip>92104</citystatezip>
5
+ </request>
6
+ <message>
7
+ <text>Request successfully processed</text>
8
+ <code>0</code>
9
+ </message>
10
+ <response>
11
+ <results>
12
+ <result>
13
+ <zpid>66109976</zpid>
14
+ <links>
15
+ <homedetails>http://www.zillow.com/homedetails/3651-Louisiana-St-APT-205-San-Diego-CA-92104/66109976_zpid/</homedetails>
16
+ <graphsanddata>http://www.zillow.com/homedetails/3651-Louisiana-St-APT-205-San-Diego-CA-92104/66109976_zpid/#charts-and-data</graphsanddata>
17
+ <mapthishome>http://www.zillow.com/homes/66109976_zpid/</mapthishome>
18
+ <comparables>http://www.zillow.com/homes/comps/66109976_zpid/</comparables>
19
+ </links>
20
+ <address>
21
+ <street>3651 Louisiana St APT 205</street>
22
+ <zipcode>92104</zipcode>
23
+ <city>San Diego</city>
24
+ <state>CA</state>
25
+ <latitude>32.744895</latitude>
26
+ <longitude>-117.139743</longitude>
27
+ </address>
28
+ <FIPScounty>6073</FIPScounty>
29
+ <useCode>Condominium</useCode>
30
+ <taxAssessmentYear>2012</taxAssessmentYear>
31
+ <taxAssessment>180539.0</taxAssessment>
32
+ <yearBuilt>1985</yearBuilt>
33
+ <finishedSqFt>800</finishedSqFt>
34
+ <bathrooms>2.0</bathrooms>
35
+ <bedrooms>2</bedrooms>
36
+ <lastSoldDate>06/10/2011</lastSoldDate>
37
+ <lastSoldPrice currency="USD">186000</lastSoldPrice>
38
+ <zestimate>
39
+ <amount currency="USD">249461</amount>
40
+ <last-updated>04/02/2013</last-updated>
41
+ <oneWeekChange deprecated="true"/>
42
+ <valueChange duration="30" currency="USD">20262</valueChange>
43
+ <valuationRange>
44
+ <low currency="USD">219526</low>
45
+ <high currency="USD">271912</high>
46
+ </valuationRange>
47
+ <percentile>0</percentile>
48
+ </zestimate>
49
+ <rentzestimate>
50
+ <amount currency="USD">1483</amount>
51
+ <last-updated>04/01/2013</last-updated>
52
+ <oneWeekChange deprecated="true"/>
53
+ <valueChange/>
54
+ <valuationRange>
55
+ <low currency="USD">1201</low>
56
+ <high currency="USD">1883</high>
57
+ </valuationRange>
58
+ </rentzestimate>
59
+ <localRealEstate>
60
+ <region id="274717" type="neighborhood" name="North Park">
61
+ <links>
62
+ <overview>http://www.zillow.com/local-info/CA-San-Diego/North-Park/r_274717/</overview>
63
+ <forSaleByOwner>http://www.zillow.com/north-park-san-diego-ca/fsbo/</forSaleByOwner>
64
+ <forSale>http://www.zillow.com/north-park-san-diego-ca/</forSale>
65
+ </links>
66
+ </region>
67
+ </localRealEstate>
68
+ </result>
69
+ <result>
70
+ <zpid>2126762315</zpid>
71
+ <links>
72
+ <homedetails>http://www.zillow.com/homedetails/3651-Louisiana-St-APT-205-San-Diego-CA-92104/2126762315_zpid/</homedetails>
73
+ <mapthishome>http://www.zillow.com/homes/2126762315_zpid/</mapthishome>
74
+ <comparables>http://www.zillow.com/homes/comps/2126762315_zpid/</comparables>
75
+ </links>
76
+ <address>
77
+ <street>3651 Louisiana St APT 205</street>
78
+ <zipcode>92104</zipcode>
79
+ <city>San Diego</city>
80
+ <state>CA</state>
81
+ <latitude>32.7447</latitude>
82
+ <longitude>-117.13995</longitude>
83
+ </address>
84
+ <FIPScounty>6073</FIPScounty>
85
+ <useCode>Condominium</useCode>
86
+ <yearBuilt>1985</yearBuilt>
87
+ <finishedSqFt>800</finishedSqFt>
88
+ <bathrooms>1.5</bathrooms>
89
+ <bedrooms>2</bedrooms>
90
+ <zestimate>
91
+ <amount currency="USD">246695</amount>
92
+ <last-updated>04/02/2013</last-updated>
93
+ <oneWeekChange deprecated="true"/>
94
+ <valueChange duration="30" currency="USD">19294</valueChange>
95
+ <valuationRange>
96
+ <low currency="USD">214625</low>
97
+ <high currency="USD">288633</high>
98
+ </valuationRange>
99
+ <percentile>0</percentile>
100
+ </zestimate>
101
+ <rentzestimate>
102
+ <amount currency="USD">1343</amount>
103
+ <last-updated>04/01/2013</last-updated>
104
+ <oneWeekChange deprecated="true"/>
105
+ <valueChange/>
106
+ <valuationRange>
107
+ <low currency="USD">1222</low>
108
+ <high currency="USD">1800</high>
109
+ </valuationRange>
110
+ </rentzestimate>
111
+ <localRealEstate>
112
+ <region id="274717" type="neighborhood" name="North Park">
113
+ <links>
114
+ <overview>http://www.zillow.com/local-info/CA-San-Diego/North-Park/r_274717/</overview>
115
+ <forSaleByOwner>http://www.zillow.com/north-park-san-diego-ca/fsbo/</forSaleByOwner>
116
+ <forSale>http://www.zillow.com/north-park-san-diego-ca/</forSale>
117
+ </links>
118
+ </region>
119
+ </localRealEstate>
120
+ </result>
121
+ </results>
122
+ </response>
123
+ </SearchResults:searchresults>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <SearchResults:searchresults xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.zillow.com/static/xsd/SearchResults.xsd http://www.zillowstatic.com/vstatic/ff767ff8bf412f0cf22b5c412ec1cc5a/static/xsd/SearchResults.xsd" xmlns:SearchResults="http://www.zillow.com/static/xsd/SearchResults.xsd">
3
+ <request>
4
+ <address>23366-Torrey-St</address>
5
+ <citystatezip>Armada MI 48005</citystatezip>
6
+ </request>
7
+ <message>
8
+ <text>Request successfully processed</text>
9
+ <code>0</code>
10
+ </message>
11
+ <response>
12
+ <results>
13
+ <result>
14
+ <zpid>83624854</zpid>
15
+ <links>
16
+ <homedetails>http://www.zillow.com/homedetails/23366-Torrey-St-Armada-MI-48005/83624854_zpid/</homedetails>
17
+ <graphsanddata>http://www.zillow.com/homedetails/23366-Torrey-St-Armada-MI-48005/83624854_zpid/#charts-and-data</graphsanddata>
18
+ <mapthishome>http://www.zillow.com/homes/83624854_zpid/</mapthishome>
19
+ <comparables>http://www.zillow.com/homes/comps/83624854_zpid/</comparables>
20
+ </links>
21
+ <address>
22
+ <street>23366 Torrey St</street>
23
+ <zipcode>48005</zipcode>
24
+ <city>Armada</city>
25
+ <state>MI</state>
26
+ <latitude>42.842281</latitude>
27
+ <longitude>-82.88019</longitude>
28
+ </address>
29
+ <FIPScounty>26099</FIPScounty>
30
+ <useCode>SingleFamily</useCode>
31
+ <taxAssessmentYear>2011</taxAssessmentYear>
32
+ <taxAssessment>100376.0</taxAssessment>
33
+ <lotSizeSqFt>14810</lotSizeSqFt>
34
+ <zestimate>
35
+ <amount currency="USD">89301</amount>
36
+ <last-updated>04/09/2013</last-updated>
37
+ <oneWeekChange deprecated="true"></oneWeekChange>
38
+ <valueChange duration="30" currency="USD">-1566</valueChange>
39
+ <valuationRange>
40
+ <low currency="USD">74120</low>
41
+ <high currency="USD">108947</high>
42
+ </valuationRange>
43
+ <percentile>0</percentile>
44
+ </zestimate>
45
+ <localRealEstate>
46
+ <region id="50765" type="city" name="Armada">
47
+ <links>
48
+ <overview>http://www.zillow.com/local-info/MI-Armada/r_50765/</overview>
49
+ <forSaleByOwner>http://www.zillow.com/armada-mi/fsbo/</forSaleByOwner>
50
+ <forSale>http://www.zillow.com/armada-mi/</forSale>
51
+ </links>
52
+ </region>
53
+ </localRealEstate>
54
+ </result>
55
+ </results>
56
+ </response>
57
+ </SearchResults:searchresults>
58
+ <!-- H:003 T:32ms S:983 R:Wed Apr 10 13:55:59 PDT 2013 B:3.0.189437.20130408124808855-comp_rel_b.189437.20130408124954685-comp_rel_b -->
@@ -0,0 +1,64 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Zestimate:zestimate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Zestimate="http://www.zillow.com/static/xsd/Zestimate.xsd" xsi:schemaLocation="http://www.zillow.com/static/xsd/Zestimate.xsd http://www.zillowstatic.com/vstatic/ff767ff8bf412f0cf22b5c412ec1cc5a/static/xsd/Zestimate.xsd">
3
+ <request>
4
+ <zpid>29366758</zpid>
5
+ </request>
6
+ <message>
7
+ <text>Request successfully processed</text>
8
+ <code>0</code>
9
+ </message>
10
+ <response>
11
+ <zpid>29366758</zpid>
12
+ <links>
13
+ <homedetails>http://www.zillow.com/homedetails/7500-Blue-Beach-Cv-Austin-TX-78759/29366758_zpid/</homedetails>
14
+ <graphsanddata>http://www.zillow.com/homedetails/7500-Blue-Beach-Cv-Austin-TX-78759/29366758_zpid/#charts-and-data</graphsanddata>
15
+ <mapthishome>http://www.zillow.com/homes/29366758_zpid/</mapthishome>
16
+ <comparables>http://www.zillow.com/homes/comps/29366758_zpid/</comparables>
17
+ </links>
18
+ <address>
19
+ <street>7500 Blue Beach Cv</street>
20
+ <zipcode>78759</zipcode>
21
+ <city>Austin</city>
22
+ <state>TX</state>
23
+ <latitude>30.414619</latitude>
24
+ <longitude>-97.777438</longitude>
25
+ </address>
26
+ <zestimate>
27
+ <amount currency="USD">382942</amount>
28
+ <last-updated>04/09/2013</last-updated>
29
+ <oneWeekChange deprecated="true"></oneWeekChange>
30
+ <valueChange duration="30" currency="USD">4774</valueChange>
31
+ <valuationRange>
32
+ <low currency="USD">329330</low>
33
+ <high currency="USD">436554</high>
34
+ </valuationRange>
35
+ <percentile>73</percentile>
36
+ </zestimate>
37
+ <rentzestimate>
38
+ <amount currency="USD">2505</amount>
39
+ <last-updated>04/01/2013</last-updated>
40
+ <oneWeekChange deprecated="true"></oneWeekChange>
41
+ <valueChange></valueChange>
42
+ <valuationRange>
43
+ <low currency="USD">1979</low>
44
+ <high currency="USD">3056</high>
45
+ </valuationRange>
46
+ </rentzestimate>
47
+ <localRealEstate>
48
+ <region id="10221" type="city" name="Austin">
49
+ <links>
50
+ <overview>http://www.zillow.com/local-info/TX-Austin/r_10221/</overview>
51
+ <forSaleByOwner>http://www.zillow.com/austin-tx/fsbo/</forSaleByOwner>
52
+ <forSale>http://www.zillow.com/austin-tx/</forSale>
53
+ </links>
54
+ </region>
55
+ </localRealEstate>
56
+ <regions>
57
+ <zipcode-id>92668</zipcode-id>
58
+ <city-id>10221</city-id>
59
+ <county-id>1440</county-id>
60
+ <state-id>54</state-id>
61
+ </regions>
62
+ </response>
63
+ </Zestimate:zestimate>
64
+ <!-- H:003 T:6ms S:1133 R:Wed Apr 10 10:53:47 PDT 2013 B:3.0.189437.20130408124808855-comp_rel_b.189437.20130408124954685-comp_rel_b -->
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubillow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-12 00:00:00.000000000 Z
12
+ date: 2013-04-10 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.5'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.5'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: rake
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -18,7 +34,7 @@ dependencies:
18
34
  requirements:
19
35
  - - ~>
20
36
  - !ruby/object:Gem::Version
21
- version: 0.9.2
37
+ version: '10.0'
22
38
  type: :development
23
39
  prerelease: false
24
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +42,7 @@ dependencies:
26
42
  requirements:
27
43
  - - ~>
28
44
  - !ruby/object:Gem::Version
29
- version: 0.9.2
45
+ version: '10.0'
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: rspec
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -34,7 +50,7 @@ dependencies:
34
50
  requirements:
35
51
  - - ~>
36
52
  - !ruby/object:Gem::Version
37
- version: '2.6'
53
+ version: '2.12'
38
54
  type: :development
39
55
  prerelease: false
40
56
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,47 +58,47 @@ dependencies:
42
58
  requirements:
43
59
  - - ~>
44
60
  - !ruby/object:Gem::Version
45
- version: '2.6'
61
+ version: '2.12'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: yard
48
64
  requirement: !ruby/object:Gem::Requirement
49
65
  none: false
50
66
  requirements:
51
- - - ! '>='
67
+ - - ~>
52
68
  - !ruby/object:Gem::Version
53
- version: 0.6.8
69
+ version: '0.8'
54
70
  type: :development
55
71
  prerelease: false
56
72
  version_requirements: !ruby/object:Gem::Requirement
57
73
  none: false
58
74
  requirements:
59
- - - ! '>='
75
+ - - ~>
60
76
  - !ruby/object:Gem::Version
61
- version: 0.6.8
77
+ version: '0.8'
62
78
  - !ruby/object:Gem::Dependency
63
79
  name: bluecloth
64
80
  requirement: !ruby/object:Gem::Requirement
65
81
  none: false
66
82
  requirements:
67
- - - ! '>='
83
+ - - ~>
68
84
  - !ruby/object:Gem::Version
69
- version: 2.1.0
85
+ version: '2.2'
70
86
  type: :development
71
87
  prerelease: false
72
88
  version_requirements: !ruby/object:Gem::Requirement
73
89
  none: false
74
90
  requirements:
75
- - - ! '>='
91
+ - - ~>
76
92
  - !ruby/object:Gem::Version
77
- version: 2.1.0
93
+ version: '2.2'
78
94
  - !ruby/object:Gem::Dependency
79
- name: rcov
95
+ name: simplecov
80
96
  requirement: !ruby/object:Gem::Requirement
81
97
  none: false
82
98
  requirements:
83
99
  - - ~>
84
100
  - !ruby/object:Gem::Version
85
- version: 0.9.10
101
+ version: '0.7'
86
102
  type: :development
87
103
  prerelease: false
88
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -90,23 +106,23 @@ dependencies:
90
106
  requirements:
91
107
  - - ~>
92
108
  - !ruby/object:Gem::Version
93
- version: 0.9.10
109
+ version: '0.7'
94
110
  - !ruby/object:Gem::Dependency
95
- name: nokogiri
111
+ name: coveralls
96
112
  requirement: !ruby/object:Gem::Requirement
97
113
  none: false
98
114
  requirements:
99
115
  - - ~>
100
116
  - !ruby/object:Gem::Version
101
- version: 1.5.0
102
- type: :runtime
117
+ version: '0.6'
118
+ type: :development
103
119
  prerelease: false
104
120
  version_requirements: !ruby/object:Gem::Requirement
105
121
  none: false
106
122
  requirements:
107
123
  - - ~>
108
124
  - !ruby/object:Gem::Version
109
- version: 1.5.0
125
+ version: '0.6'
110
126
  description: Ruby library to access the Zillow API
111
127
  email:
112
128
  - rubillow@matthewvince.com
@@ -126,6 +142,7 @@ files:
126
142
  - Rakefile
127
143
  - lib/rubillow.rb
128
144
  - lib/rubillow/configuration.rb
145
+ - lib/rubillow/helpers/xml_parsing_helper.rb
129
146
  - lib/rubillow/home_valuation.rb
130
147
  - lib/rubillow/models.rb
131
148
  - lib/rubillow/models/addressable.rb
@@ -186,6 +203,8 @@ files:
186
203
  - spec/xml/get_comps.xml
187
204
  - spec/xml/get_deep_comps.xml
188
205
  - spec/xml/get_deep_search_results.xml
206
+ - spec/xml/get_deep_search_results_duplicated.xml
207
+ - spec/xml/get_deep_search_results_missing_data.xml
189
208
  - spec/xml/get_demographics.xml
190
209
  - spec/xml/get_monthly_payments.xml
191
210
  - spec/xml/get_rate_summary.xml
@@ -196,9 +215,11 @@ files:
196
215
  - spec/xml/get_updated_property_details.xml
197
216
  - spec/xml/get_zestimate.xml
198
217
  - spec/xml/get_zestimate_missing_region.xml
218
+ - spec/xml/get_zestimate_missing_value_duration.xml
199
219
  - spec/xml/near_limit.xml
200
220
  homepage: https://github.com/synewaves/rubillow
201
- licenses: []
221
+ licenses:
222
+ - MIT
202
223
  post_install_message:
203
224
  rdoc_options: []
204
225
  require_paths:
@@ -209,12 +230,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
209
230
  - - ! '>='
210
231
  - !ruby/object:Gem::Version
211
232
  version: '0'
233
+ segments:
234
+ - 0
235
+ hash: -2902501168936957997
212
236
  required_rubygems_version: !ruby/object:Gem::Requirement
213
237
  none: false
214
238
  requirements:
215
239
  - - ! '>='
216
240
  - !ruby/object:Gem::Version
217
241
  version: '0'
242
+ segments:
243
+ - 0
244
+ hash: -2902501168936957997
218
245
  requirements: []
219
246
  rubyforge_project: rubillow
220
247
  rubygems_version: 1.8.23
@@ -251,6 +278,8 @@ test_files:
251
278
  - spec/xml/get_comps.xml
252
279
  - spec/xml/get_deep_comps.xml
253
280
  - spec/xml/get_deep_search_results.xml
281
+ - spec/xml/get_deep_search_results_duplicated.xml
282
+ - spec/xml/get_deep_search_results_missing_data.xml
254
283
  - spec/xml/get_demographics.xml
255
284
  - spec/xml/get_monthly_payments.xml
256
285
  - spec/xml/get_rate_summary.xml
@@ -261,5 +290,6 @@ test_files:
261
290
  - spec/xml/get_updated_property_details.xml
262
291
  - spec/xml/get_zestimate.xml
263
292
  - spec/xml/get_zestimate_missing_region.xml
293
+ - spec/xml/get_zestimate_missing_value_duration.xml
264
294
  - spec/xml/near_limit.xml
265
295
  has_rdoc: