rubillow 0.0.5 → 0.0.6

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.
@@ -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: