query-nyc 0.0.1
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.
- data/.gitignore +3 -0
- data/Gemfile +7 -0
- data/Rakefile +2 -0
- data/lib/query-nyc.rb +151 -0
- data/lib/query-nyc/version.rb +5 -0
- data/query-nyc.gemspec +21 -0
- metadata +70 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
data/lib/query-nyc.rb
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
module Query
|
|
2
|
+
module Nyc
|
|
3
|
+
class << self; attr_accessor :address end
|
|
4
|
+
|
|
5
|
+
def self.fetch_uri(houseno, street, boro)
|
|
6
|
+
|
|
7
|
+
boro_option = name_to_number(boro)
|
|
8
|
+
|
|
9
|
+
uri = "http://a810-bisweb.nyc.gov/bisweb/PropertyProfileOverviewServlet?" + "boro=#{boro_option}" + "&houseno=#{houseno}" + "&street=#{CGI.escape(street)}"
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.building_at(houseno, street, boro)
|
|
14
|
+
require "nokogiri"
|
|
15
|
+
|
|
16
|
+
boro_option = name_to_number(boro)
|
|
17
|
+
|
|
18
|
+
uri = "http://a810-bisweb.nyc.gov/bisweb/PropertyProfileOverviewServlet?" + "boro=#{boro_option}" + "&houseno=#{houseno}" + "&street=#{CGI.escape(street)}"
|
|
19
|
+
|
|
20
|
+
@page = Nokogiri::HTML(open(uri))
|
|
21
|
+
|
|
22
|
+
retObj = {:landlords=>[],:building=>[]}
|
|
23
|
+
|
|
24
|
+
msg = @page.css(".errormsg").first.content rescue nil
|
|
25
|
+
if msg == nil
|
|
26
|
+
tax_block = @page.xpath("//table[3]/tr[2]/td[9]/text()").to_s.sub(/:/,'').to_i
|
|
27
|
+
tax_lot = @page.xpath("//table[3]/tr[3]/td[9]/text()").to_s.sub(/:/,'').to_i
|
|
28
|
+
|
|
29
|
+
violations_count = @page.xpath("//td//tr[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]//*[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]/text()").to_s
|
|
30
|
+
open_violations = @page.xpath("//td//tr[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]//*[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]/text()").to_s
|
|
31
|
+
violations_link = "http://a810-bisweb.nyc.gov/bisweb/" + @page.xpath("//tr[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]//b//a").attribute("href").to_s rescue ""
|
|
32
|
+
|
|
33
|
+
complaints_count = @page.xpath("//td//tr[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//*[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]/text()")[0].to_s
|
|
34
|
+
open_complaints = @page.xpath("//td//tr[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//*[(((count(preceding-sibling::*) + 1) = 3) and parent::*)]/text()").to_s
|
|
35
|
+
complaints_link = "http://a810-bisweb.nyc.gov/bisweb/" + @page.xpath("//tr[(((count(preceding-sibling::*) + 1) = 2) and parent::*)]//b//a").attribute("href").to_s rescue ""
|
|
36
|
+
|
|
37
|
+
landmark_status = @page.xpath('//tr[(((count(preceding-sibling::*) + 1) = 6) and parent::*)]//*[contains(concat( " ", @class, " " ), concat( " ", "content", " " )) and (((count(preceding-sibling::*) + 1) = 2) and parent::*)]/text()').to_s
|
|
38
|
+
|
|
39
|
+
@page = Nokogiri::HTML(open('http://api.blocksandlots.com/blankslate/json/data/743cd788-eb98-4fb6-af18-0811261ad168/records/search?apikey=cvq842zthjdvr25cq9p5s6db&Block='+tax_block.to_s+'&Lot='+tax_lot.to_s+'&rp=350&em=true&_=1289069608577'))
|
|
40
|
+
|
|
41
|
+
arr_of_landlords = retObj[:landlords]
|
|
42
|
+
arr_of_building = retObj[:building]
|
|
43
|
+
jdata = JSON.parse(@page.content)
|
|
44
|
+
owners_array = jdata["application"][0]["entity"][0]["record"]
|
|
45
|
+
owners_array.each do |owner|
|
|
46
|
+
ret = {}
|
|
47
|
+
skip = false
|
|
48
|
+
owner["field"].each { |f|
|
|
49
|
+
case f["fieldName"]
|
|
50
|
+
when "Owner Name"
|
|
51
|
+
if f["fieldValue"].strip.present?
|
|
52
|
+
ret[:owner] = f["fieldValue"].split(/\s+/).each{ |word| word.capitalize! }.join(' ')
|
|
53
|
+
else
|
|
54
|
+
skip = true
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
}
|
|
58
|
+
arr_of_landlords.push(ret) unless skip
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
r = {}
|
|
62
|
+
owners_array[0]["field"].each do |f|
|
|
63
|
+
case f["fieldName"]
|
|
64
|
+
when "Actual Land Value"; r[:land_value] = f["fieldValue"]
|
|
65
|
+
when "Actual Total Value"; r[:total_value] = f["fieldValue"]
|
|
66
|
+
when "Market Value"; r[:market_value] = f["fieldValue"]
|
|
67
|
+
when "Assessment Year"; r[:assessment_year] = f["fieldValue"]
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
arr_of_building.push(r)
|
|
71
|
+
|
|
72
|
+
arr_of_building[0][:tax_block] = tax_block
|
|
73
|
+
arr_of_building[0][:tax_lot] = tax_lot
|
|
74
|
+
arr_of_building[0][:violations_count] = violations_count
|
|
75
|
+
arr_of_building[0][:open_violations] = open_violations
|
|
76
|
+
arr_of_building[0][:violations_link] = violations_link
|
|
77
|
+
arr_of_building[0][:complaints_count] = complaints_count
|
|
78
|
+
arr_of_building[0][:open_complaints] = open_complaints
|
|
79
|
+
arr_of_building[0][:complaints_link] = complaints_link
|
|
80
|
+
arr_of_building[0][:landmark_status] = landmark_status.present?
|
|
81
|
+
end
|
|
82
|
+
# Returns a hash of landlords, and the building.
|
|
83
|
+
retObj
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def self.name_to_number(name)
|
|
87
|
+
|
|
88
|
+
case name
|
|
89
|
+
when "Manhattan"
|
|
90
|
+
1
|
|
91
|
+
when "The Bronx"
|
|
92
|
+
2
|
|
93
|
+
when "Brooklyn"
|
|
94
|
+
3
|
|
95
|
+
when "Queens"
|
|
96
|
+
4
|
|
97
|
+
when "Staten Island"
|
|
98
|
+
5
|
|
99
|
+
else
|
|
100
|
+
0
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self.check_existence_with_google(address)
|
|
105
|
+
base = "http://maps.googleapis.com/maps/api/geocode/json?address="
|
|
106
|
+
addr = "#{address},NY".gsub(/\s+/,'+')
|
|
107
|
+
uri = "#{base}#{addr}&sensor=false"
|
|
108
|
+
|
|
109
|
+
google = open(uri).read
|
|
110
|
+
json = JSON.parse(google)
|
|
111
|
+
|
|
112
|
+
partial_match = json["results"][0]["partial_match"] rescue false
|
|
113
|
+
approximate = json["results"][0]["geometry"]["location_type"] == "APPROXIMATE"
|
|
114
|
+
|
|
115
|
+
if (approximate.present? or partial_match.present?)
|
|
116
|
+
false
|
|
117
|
+
else
|
|
118
|
+
# Scoop the address here
|
|
119
|
+
self.address = json["results"][0]["formatted_address"] rescue ""
|
|
120
|
+
|
|
121
|
+
true
|
|
122
|
+
end
|
|
123
|
+
# Returns true or false
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def self.geocode(address)
|
|
127
|
+
require 'uri'
|
|
128
|
+
require 'rest-client'
|
|
129
|
+
|
|
130
|
+
j = ActiveSupport::JSON
|
|
131
|
+
base_url="http://maps.googleapis.com/maps/api/geocode/json?address="
|
|
132
|
+
url = "#{base_url}#{CGI.escape(address)}&sensor=false"
|
|
133
|
+
retObj = {:lat=>"",:lng=>""}
|
|
134
|
+
RestClient.get(url) do |response, request, result|
|
|
135
|
+
case response.code
|
|
136
|
+
when 200
|
|
137
|
+
res = j.decode(response)["results"][0]
|
|
138
|
+
loc = res["geometry"]["location"] rescue ""
|
|
139
|
+
addr = res["address_components"] rescue ""
|
|
140
|
+
|
|
141
|
+
retObj[:lat] = loc["lat"] rescue ""
|
|
142
|
+
retObj[:lng] = loc["lng"] rescue ""
|
|
143
|
+
retObj[:sublocality] = addr[2]["long_name"] rescue ""
|
|
144
|
+
else
|
|
145
|
+
"BAD RESPONSE"
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
retObj
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
data/query-nyc.gemspec
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
|
3
|
+
require "query-nyc/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |s|
|
|
6
|
+
s.name = "query-nyc"
|
|
7
|
+
s.version = Query::Nyc::VERSION
|
|
8
|
+
s.platform = Gem::Platform::RUBY
|
|
9
|
+
s.authors = ["Volkan Unsal"]
|
|
10
|
+
s.email = ["spocksplanet@gmail.com"]
|
|
11
|
+
s.homepage = ""
|
|
12
|
+
s.summary = %q{Algorithm for parsing the various data mines of NYC to fetch human readable data about landlords.}
|
|
13
|
+
s.description = %q{This gem started as part of Great Urban Hack. It looks up the records of NYC landlords from openly available public directories.}
|
|
14
|
+
|
|
15
|
+
s.rubyforge_project = "query-nyc"
|
|
16
|
+
|
|
17
|
+
s.files = `git ls-files`.split("\n")
|
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
20
|
+
s.require_paths = ["lib"]
|
|
21
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: query-nyc
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
prerelease: false
|
|
5
|
+
segments:
|
|
6
|
+
- 0
|
|
7
|
+
- 0
|
|
8
|
+
- 1
|
|
9
|
+
version: 0.0.1
|
|
10
|
+
platform: ruby
|
|
11
|
+
authors:
|
|
12
|
+
- Volkan Unsal
|
|
13
|
+
autorequire:
|
|
14
|
+
bindir: bin
|
|
15
|
+
cert_chain: []
|
|
16
|
+
|
|
17
|
+
date: 2011-01-27 00:00:00 -05:00
|
|
18
|
+
default_executable:
|
|
19
|
+
dependencies: []
|
|
20
|
+
|
|
21
|
+
description: This gem started as part of Great Urban Hack. It looks up the records of NYC landlords from openly available public directories.
|
|
22
|
+
email:
|
|
23
|
+
- spocksplanet@gmail.com
|
|
24
|
+
executables: []
|
|
25
|
+
|
|
26
|
+
extensions: []
|
|
27
|
+
|
|
28
|
+
extra_rdoc_files: []
|
|
29
|
+
|
|
30
|
+
files:
|
|
31
|
+
- .gitignore
|
|
32
|
+
- Gemfile
|
|
33
|
+
- Rakefile
|
|
34
|
+
- lib/query-nyc.rb
|
|
35
|
+
- lib/query-nyc/version.rb
|
|
36
|
+
- query-nyc.gemspec
|
|
37
|
+
has_rdoc: true
|
|
38
|
+
homepage: ""
|
|
39
|
+
licenses: []
|
|
40
|
+
|
|
41
|
+
post_install_message:
|
|
42
|
+
rdoc_options: []
|
|
43
|
+
|
|
44
|
+
require_paths:
|
|
45
|
+
- lib
|
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
47
|
+
none: false
|
|
48
|
+
requirements:
|
|
49
|
+
- - ">="
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
segments:
|
|
52
|
+
- 0
|
|
53
|
+
version: "0"
|
|
54
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
|
+
none: false
|
|
56
|
+
requirements:
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
segments:
|
|
60
|
+
- 0
|
|
61
|
+
version: "0"
|
|
62
|
+
requirements: []
|
|
63
|
+
|
|
64
|
+
rubyforge_project: query-nyc
|
|
65
|
+
rubygems_version: 1.3.7
|
|
66
|
+
signing_key:
|
|
67
|
+
specification_version: 3
|
|
68
|
+
summary: Algorithm for parsing the various data mines of NYC to fetch human readable data about landlords.
|
|
69
|
+
test_files: []
|
|
70
|
+
|