sandy 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in sandy.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Cameron Cundiff
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Sandy
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'sandy'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install sandy
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/lib/sandy/area.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Sandy
2
+ class Area
3
+ attr_reader :name, :region, :customers_affected, :latitude, :longitude
4
+
5
+ def initialize(customers_affected, location, options = {})
6
+ @name = location
7
+ @customers_affected = customers_affected
8
+ @region = options[:region]
9
+ @total_customers = options[:total_customers]
10
+ @latitude = options[:latitude]
11
+ @longitude = options[:longitude]
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,6 @@
1
+ require "sandy/providers/coned"
2
+
3
+ module Sandy
4
+ module Provider
5
+ end
6
+ end
@@ -0,0 +1,52 @@
1
+ require "sandy/area"
2
+ require "httparty"
3
+ require "json"
4
+
5
+ module Sandy::Provider
6
+ module ConEd
7
+ class Report
8
+ attr_reader :regions, :neighborhoods
9
+
10
+ def initialize
11
+ raw_report = JSON.parse(HTTParty.get(coned_url))
12
+ area_hash = raw_report.fetch("file_data")["curr_custs_aff"]["areas"].first["areas"]
13
+ @regions = regions_from_report(area_hash)
14
+ @neighborhoods = neighborhoods_from_report(area_hash)
15
+ end
16
+
17
+ private
18
+
19
+ def regions_from_report(areas)
20
+ areas.collect do |area|
21
+ Sandy::Area.new(area.fetch("custs_out"), area.fetch("area_name"),
22
+ { latitude: area["latitude"],
23
+ longitude: area["longitude"],
24
+ total_customers: area["total_custs"] })
25
+
26
+ end
27
+ end
28
+
29
+ def neighborhoods_from_report(areas)
30
+ neighborhoods = []
31
+ areas.each do |area|
32
+ area["areas"].each do |sub_area|
33
+ neighborhoods << Sandy::Area.new(sub_area.fetch("custs_out"), sub_area.fetch("area_name"),
34
+ { region: area["area_name"],
35
+ total_customers: sub_area["total_custs"],
36
+ latitude: sub_area["latitude"],
37
+ longitude: sub_area["longitude"] })
38
+ end
39
+ end
40
+ neighborhoods
41
+ end
42
+
43
+ def coned_url
44
+ base_uri = "http://apps.coned.com"
45
+ directory_url = "#{base_uri}/stormcenter_external/stormcenter_externaldata/data/interval_generation_data/metadata.xml"
46
+ response = HTTParty.get(directory_url, format: :xml)
47
+ directory = response.parsed_response.fetch("root").fetch("directory")
48
+ "#{base_uri}/stormcenter_external/stormcenter_externaldata/data/interval_generation_data/#{directory}/report.js"
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,6 @@
1
+ require "sandy/providers/coned/report"
2
+
3
+ module Sandy::Provider
4
+ module ConEd
5
+ end
6
+ end
@@ -0,0 +1,3 @@
1
+ module Sandy
2
+ VERSION = "0.0.1"
3
+ end
data/lib/sandy.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "sandy/version"
2
+ require "sandy/provider"
3
+
4
+ module Sandy
5
+ end
data/sandy.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'sandy/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "sandy"
8
+ gem.version = Sandy::VERSION
9
+ gem.authors = ["Cameron Cundiff"]
10
+ gem.email = ["ckundo@gmail.com"]
11
+ gem.description = %q{Present a simple API to consume power outage data for the Greater New York area.}
12
+ gem.summary = %q{Power outage data for ConEd in NYC}
13
+ gem.homepage = "http://www.github.com/ckundo/sandy"
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency("httparty", "~> 0.9.0")
21
+ gem.add_development_dependency("rake")
22
+ gem.add_development_dependency("rspec", "~> 2.11.0")
23
+ gem.add_development_dependency("webmock", "~> 1.8.11")
24
+ gem.add_development_dependency("vcr", "~> 2.3.0")
25
+ end
data/spec/area_spec.rb ADDED
@@ -0,0 +1,33 @@
1
+ require "spec_helper"
2
+
3
+ describe Sandy::Area do
4
+ let(:customers_affected) { 100 }
5
+ let(:options) { {} }
6
+
7
+ describe "#customers_affected" do
8
+ subject { Sandy::Area.new(customers_affected, nil).customers_affected }
9
+ it { should == customers_affected }
10
+ end
11
+
12
+ context "with an area name" do
13
+ let(:area_name) { "Battery Park" }
14
+ describe "#name" do
15
+ subject { Sandy::Area.new(customers_affected, area_name).name }
16
+ it { should == area_name }
17
+ end
18
+ end
19
+
20
+ context "with a region name" do
21
+ describe "#parent_region" do
22
+ subject { Sandy::Area.new(customers_affected, nil, { region: "Manhattan" }).region }
23
+ it { should == "Manhattan" }
24
+ end
25
+ end
26
+
27
+ context "with lat/lng" do
28
+ subject { Sandy::Area.new(customers_affected, nil, { latitude: 70.5, longitude: -115.5 }) }
29
+ its(:latitude) { should == 70.5 }
30
+ its(:longitude) { should == -115.5 }
31
+ end
32
+ end
33
+
@@ -0,0 +1,194 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://apps.coned.com/stormcenter_external/stormcenter_externaldata/data/interval_generation_data/metadata.xml
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Content-Length:
16
+ - '101'
17
+ Content-Type:
18
+ - text/xml
19
+ Last-Modified:
20
+ - Fri, 02 Nov 2012 18:21:13 GMT
21
+ Accept-Ranges:
22
+ - bytes
23
+ Etag:
24
+ - W/"579c21d726b9cd1:2319c"
25
+ Server:
26
+ - Microsoft-IIS/6.0
27
+ X-Powered-By:
28
+ - ASP.NET
29
+ Date:
30
+ - Fri, 02 Nov 2012 18:26:47 GMT
31
+ body:
32
+ encoding: US-ASCII
33
+ string: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<root>\r\n<directory>2012_11_02_14_00_27</directory>\r\n</root>\r\n"
34
+ http_version:
35
+ recorded_at: Fri, 02 Nov 2012 18:26:47 GMT
36
+ - request:
37
+ method: get
38
+ uri: http://apps.coned.com/stormcenter_external/stormcenter_externaldata/data/interval_generation_data/2012_11_02_14_00_27/report.js
39
+ body:
40
+ encoding: US-ASCII
41
+ string: ''
42
+ headers: {}
43
+ response:
44
+ status:
45
+ code: 200
46
+ message: OK
47
+ headers:
48
+ Content-Length:
49
+ - '16734'
50
+ Content-Type:
51
+ - application/x-javascript
52
+ Last-Modified:
53
+ - Fri, 02 Nov 2012 18:21:11 GMT
54
+ Accept-Ranges:
55
+ - bytes
56
+ Etag:
57
+ - ! '"d6b85bd626b9cd1:2319c"'
58
+ Server:
59
+ - Microsoft-IIS/6.0
60
+ X-Powered-By:
61
+ - ASP.NET
62
+ Date:
63
+ - Fri, 02 Nov 2012 18:26:47 GMT
64
+ body:
65
+ encoding: US-ASCII
66
+ string: ! '{"file_title":"report","file_data":{"curr_custs_aff":{"areas":[{"area_name":"CONED","areas":[{"area_name":"Bronx","areas":[{"area_name":"Central
67
+ Bronx","custs_out":26,"total_custs":44452,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.82,"longitude":-73.86},{"area_name":"Fordham","custs_out":239,"total_custs":114772,"etr":"Nov
68
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.86,"longitude":-73.9},{"area_name":"Northeast
69
+ Bronx","custs_out":14012,"total_custs":79942,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.87,"longitude":-73.82},{"area_name":"Riverdale","custs_out":4029,"total_custs":34772,"etr":"Nov
70
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.89,"longitude":-73.9},{"area_name":"Southeast
71
+ Bronx","custs_out":6966,"total_custs":89736,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.83,"longitude":-73.82},{"area_name":"West
72
+ Bronx","custs_out":56,"total_custs":62352,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.82,"longitude":-73.91}],"custs_out":30535,"total_custs":426026,"etr":"Nov
73
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.86,"longitude":-73.86},{"area_name":"Brooklyn","areas":[{"area_name":"Bay
74
+ Ridge","custs_out":261,"total_custs":93430,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.62,"longitude":-74.0},{"area_name":"Borough
75
+ Hall","custs_out":3673,"total_custs":52631,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.67,"longitude":-73.97},{"area_name":"Brighton
76
+ Beach","custs_out":869,"total_custs":27831,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.45,"longitude":-73.96},{"area_name":"Crown
77
+ Heights","custs_out":445,"total_custs":84214,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.62,"longitude":-73.91},{"area_name":"Flatbush","custs_out":13435,"total_custs":135665,"etr":"Nov
78
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.6,"longitude":-73.93},{"area_name":"Ocean
79
+ Parkway","custs_out":2934,"total_custs":117965,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.6,"longitude":-73.97},{"area_name":"Park
80
+ Slope","custs_out":1647,"total_custs":114131,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.63,"longitude":-73.98},{"area_name":"Prospect
81
+ Park","custs_out":5,"total_custs":32124,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.66,"longitude":-73.98},{"area_name":"Ridgewood","custs_out":228,"total_custs":89163,"etr":"Nov
82
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.69,"longitude":-73.91},{"area_name":"Sheepshead
83
+ Bay","custs_out":7505,"total_custs":63947,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.59,"longitude":-73.92},{"area_name":"Williamsburg","custs_out":273,"total_custs":94606,"etr":"Nov
84
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.69,"longitude":-73.96}],"custs_out":35635,"total_custs":1026426,"etr":"Nov
85
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.66,"longitude":-73.91},{"area_name":"Manhattan","areas":[{"area_name":"Battery
86
+ Park City","custs_out":1,"total_custs":5042,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Beekman","custs_out":1,"total_custs":9259,"etr":"Nov
87
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.75,"longitude":-73.96},{"area_name":"Bowling
88
+ Green","custs_out":2514,"total_custs":2587,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Canal","custs_out":8479,"total_custs":8505,"etr":"Nov
89
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Central
90
+ Park","custs_out":1,"total_custs":78552,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.78,"longitude":-73.96},{"area_name":"Chelsea","custs_out":27396,"total_custs":27526,"etr":"Nov
91
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.98},{"area_name":"City
92
+ Hall","custs_out":8805,"total_custs":8770,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Columbus
93
+ Circle","custs_out":0,"total_custs":19820,"etr":"Nov 03, 23:59 PM","etrmillis":-5},{"area_name":"Cooper
94
+ Square","custs_out":66650,"total_custs":67237,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.98},{"area_name":"Cortlandt","custs_out":206,"total_custs":2010,"etr":"Nov
95
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Empire","custs_out":15,"total_custs":3605,"etr":"Nov
96
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.98},{"area_name":"Fashion","custs_out":44,"total_custs":6342,"etr":"Nov
97
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.99},{"area_name":"Freedom","custs_out":0,"total_custs":1,"etr":"Nov
98
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Fulton","custs_out":4001,"total_custs":3966,"etr":"Nov
99
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Grand
100
+ Central","custs_out":1,"total_custs":4871,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.97},{"area_name":"Greeley
101
+ Square","custs_out":3092,"total_custs":3053,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.97},{"area_name":"Greenwich","custs_out":10109,"total_custs":10166,"etr":"Nov
102
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.72,"longitude":-73.99},{"area_name":"Harlem","custs_out":4,"total_custs":57399,"etr":"Nov
103
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.81,"longitude":-73.93},{"area_name":"Herald
104
+ Square","custs_out":2,"total_custs":1368,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.97},{"area_name":"Hudson","custs_out":1,"total_custs":8288,"etr":"Nov
105
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.76,"longitude":-73.99},{"area_name":"Hunter","custs_out":0,"total_custs":2219,"etr":"Nov
106
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Kips Bay","custs_out":21086,"total_custs":21628,"etr":"Nov
107
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.74,"longitude":-73.97},{"area_name":"Lenox
108
+ Hill","custs_out":0,"total_custs":44042,"etr":"Nov 03, 23:59 PM","etrmillis":-5},{"area_name":"Lincoln
109
+ Square","custs_out":0,"total_custs":23019,"etr":"Nov 03, 23:59 PM","etrmillis":-5},{"area_name":"Madison
110
+ Square","custs_out":30189,"total_custs":30652,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.73,"longitude":-73.97},{"area_name":"Park
111
+ Place","custs_out":4901,"total_custs":4905,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.99},{"area_name":"Pennsylvania","custs_out":13,"total_custs":12366,"etr":"Nov
112
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.75,"longitude":-73.97},{"area_name":"Plaza","custs_out":0,"total_custs":6368,"etr":"Nov
113
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Randalls Island","custs_out":0,"total_custs":9,"etr":"Nov
114
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Rockefeller Center","custs_out":0,"total_custs":833,"etr":"Nov
115
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Roosevelt","custs_out":8,"total_custs":8877,"etr":"Nov
116
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.75,"longitude":-73.94},{"area_name":"Sheridan
117
+ Square","custs_out":38229,"total_custs":36661,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.73,"longitude":-73.99},{"area_name":"Sutton","custs_out":0,"total_custs":10423,"etr":"Nov
118
+ 03, 23:59 PM","etrmillis":-5},{"area_name":"Times Square","custs_out":86,"total_custs":2560,"etr":"Nov
119
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.75,"longitude":-73.96},{"area_name":"Triboro","custs_out":7,"total_custs":37140,"etr":"Nov
120
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.81,"longitude":-73.93},{"area_name":"Turtle
121
+ Bay","custs_out":0,"total_custs":827,"etr":"Nov 03, 23:59 PM","etrmillis":-5},{"area_name":"Washington
122
+ Heights","custs_out":2,"total_custs":69829,"etr":"Nov 03, 23:59 PM","etrmillis":-5,"latitude":40.85,"longitude":-73.92},{"area_name":"Yorkville","custs_out":385,"total_custs":80474,"etr":"Nov
123
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.78,"longitude":-73.95}],"custs_out":226231,"total_custs":721199,"etr":"Nov
124
+ 03, 23:59 PM","etrmillis":-5,"latitude":40.76,"longitude":-73.97},{"area_name":"Queens","areas":[{"area_name":"Borden","custs_out":0,"total_custs":12267,"etr":"Nov
125
+ 11, 23:59 PM","etrmillis":-5},{"area_name":"Flushing","custs_out":14421,"total_custs":119742,"etr":"Nov
126
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.75,"longitude":-73.8},{"area_name":"Jackson
127
+ Heights","custs_out":335,"total_custs":71263,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.76,"longitude":-73.9},{"area_name":"Jamaica","custs_out":38104,"total_custs":147658,"etr":"Nov
128
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.69,"longitude":-73.78},{"area_name":"Long
129
+ Island City","custs_out":707,"total_custs":73785,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.77,"longitude":-73.91},{"area_name":"Maspeth","custs_out":2100,"total_custs":107094,"etr":"Nov
130
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.89},{"area_name":"Rego
131
+ Park","custs_out":8948,"total_custs":70828,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.73,"longitude":-73.84},{"area_name":"Richmond
132
+ Hill","custs_out":21312,"total_custs":120719,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.68,"longitude":-73.86},{"area_name":"Sunnyside","custs_out":0,"total_custs":24571,"etr":"Nov
133
+ 11, 23:59 PM","etrmillis":-5}],"custs_out":87095,"total_custs":627208,"etr":"Nov
134
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.71,"longitude":-73.86},{"area_name":"Staten
135
+ Island","areas":[{"area_name":"Fox Hills","custs_out":24467,"total_custs":59350,"etr":"Nov
136
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.58,"longitude":-74.09},{"area_name":"Fresh
137
+ Kills","custs_out":14804,"total_custs":38152,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.6,"longitude":-74.17},{"area_name":"Wainwright","custs_out":5819,"total_custs":24613,"etr":"Nov
138
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.54,"longitude":-74.16},{"area_name":"Willowbrook","custs_out":3013,"total_custs":23936,"etr":"Nov
139
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.58,"longitude":-74.13},{"area_name":"Woodrow","custs_out":7211,"total_custs":28151,"etr":"Nov
140
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.52,"longitude":-74.22}],"custs_out":55943,"total_custs":174202,"etr":"Nov
141
+ 11, 23:59 PM","etrmillis":-5,"latitude":40.57,"longitude":-74.17},{"area_name":"Westchester","areas":[{"area_name":"Ardsley
142
+ Village","custs_out":1537,"total_custs":1786,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.0,"longitude":-73.83},{"area_name":"Bedford
143
+ town","custs_out":810,"total_custs":1018,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.2,"longitude":-73.7},{"area_name":"Briarcliff
144
+ Manor village","custs_out":1858,"total_custs":2964,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.13,"longitude":-73.82},{"area_name":"Briarcliff
145
+ Ossining","custs_out":0,"total_custs":0,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.17,"longitude":-73.83},{"area_name":"Bronxville
146
+ village","custs_out":846,"total_custs":2529,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.94,"longitude":-73.8},{"area_name":"Buchanan
147
+ village","custs_out":5,"total_custs":1010,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.25,"longitude":-73.93},{"area_name":"Cortlandt
148
+ town","custs_out":4165,"total_custs":12295,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.25,"longitude":-73.89},{"area_name":"Croton-on-Hudson
149
+ village","custs_out":988,"total_custs":3629,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.19,"longitude":-73.87},{"area_name":"Dobbs
150
+ Ferry village","custs_out":1581,"total_custs":4153,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.0,"longitude":-73.83},{"area_name":"Eastchester
151
+ town","custs_out":3468,"total_custs":7900,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.95,"longitude":-73.79},{"area_name":"Elmsford
152
+ village","custs_out":235,"total_custs":2104,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.04,"longitude":-73.79},{"area_name":"Greenburgh
153
+ town","custs_out":8962,"total_custs":18736,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.04,"longitude":-73.79},{"area_name":"Harrison
154
+ village","custs_out":3465,"total_custs":9470,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.01,"longitude":-73.68},{"area_name":"Hastings-on-Hudson
155
+ village","custs_out":963,"total_custs":3436,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.98,"longitude":-73.85},{"area_name":"Irvington
156
+ village","custs_out":1498,"total_custs":2632,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.02,"longitude":-73.83},{"area_name":"Larchmont
157
+ village","custs_out":1639,"total_custs":1983,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.91,"longitude":-73.72},{"area_name":"Mamaroneck
158
+ town","custs_out":3217,"total_custs":5259,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.94,"longitude":-73.72},{"area_name":"Mamaroneck
159
+ village","custs_out":2785,"total_custs":8704,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.94,"longitude":-73.72},{"area_name":"Mount
160
+ Kisco (Town of Bedford)","custs_out":0,"total_custs":0,"etr":"Nov 11, 23:59
161
+ PM","etrmillis":-5,"latitude":41.2,"longitude":-73.7},{"area_name":"Mount
162
+ Kisco (Town of New Castle)","custs_out":0,"total_custs":0,"etr":"Nov 11, 23:59
163
+ PM","etrmillis":-5,"latitude":41.18,"longitude":-73.76},{"area_name":"Mount
164
+ Kisco village","custs_out":668,"total_custs":5075,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.19,"longitude":-73.71},{"area_name":"Mount
165
+ Pleasant town","custs_out":4053,"total_custs":8783,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.1,"longitude":-73.78},{"area_name":"Mount
166
+ Vernon city","custs_out":6878,"total_custs":29297,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.9,"longitude":-73.8},{"area_name":"New
167
+ Castle town","custs_out":5280,"total_custs":6574,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.18,"longitude":-73.76},{"area_name":"New
168
+ Rochelle city","custs_out":12385,"total_custs":28958,"etr":"Nov 11, 23:59
169
+ PM","etrmillis":-5,"latitude":40.92,"longitude":-73.75},{"area_name":"North
170
+ Castle town","custs_out":3715,"total_custs":4894,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.18,"longitude":-73.77},{"area_name":"North
171
+ Pelham","custs_out":636,"total_custs":2071,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.89,"longitude":-73.78},{"area_name":"Ossining
172
+ town","custs_out":637,"total_custs":2307,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.15,"longitude":-73.84},{"area_name":"Ossining
173
+ village","custs_out":2867,"total_custs":8980,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.15,"longitude":-73.84},{"area_name":"Peekskill
174
+ city","custs_out":453,"total_custs":10239,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.28,"longitude":-73.83},{"area_name":"Pelham
175
+ Manor village","custs_out":1582,"total_custs":2051,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.89,"longitude":-73.78},{"area_name":"Pelham
176
+ village","custs_out":358,"total_custs":760,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.89,"longitude":-73.78},{"area_name":"Pleasantville
177
+ village","custs_out":1191,"total_custs":3338,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.13,"longitude":-73.76},{"area_name":"Port
178
+ Chester village","custs_out":5678,"total_custs":10254,"etr":"Nov 11, 23:59
179
+ PM","etrmillis":-5,"latitude":40.99,"longitude":-73.63},{"area_name":"Rye
180
+ Brook village","custs_out":2952,"total_custs":3720,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.02,"longitude":-73.66},{"area_name":"Rye
181
+ city","custs_out":4540,"total_custs":6070,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.99,"longitude":-73.66},{"area_name":"Rye
182
+ town","custs_out":0,"total_custs":0,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.96,"longitude":-73.65},{"area_name":"Scarsdale
183
+ village","custs_out":4506,"total_custs":6025,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.98,"longitude":-73.75},{"area_name":"Sleepy
184
+ Hollow","custs_out":1007,"total_custs":3515,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.08,"longitude":-73.84},{"area_name":"Somers
185
+ town","custs_out":0,"total_custs":0,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.1,"longitude":-73.78},{"area_name":"Tarrytown
186
+ village","custs_out":1849,"total_custs":5217,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.05,"longitude":-73.84},{"area_name":"Tuckahoe
187
+ village","custs_out":202,"total_custs":2867,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.94,"longitude":-73.8},{"area_name":"White
188
+ Plains city","custs_out":8821,"total_custs":23854,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.02,"longitude":-73.73},{"area_name":"Yonkers
189
+ city","custs_out":15573,"total_custs":75568,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":40.94,"longitude":-73.85},{"area_name":"Yorktown
190
+ town","custs_out":3966,"total_custs":8173,"etr":"Nov 11, 23:59 PM","etrmillis":-5,"latitude":41.26,"longitude":-73.79}],"custs_out":128665,"total_custs":348198,"etr":"Nov
191
+ 11, 23:59 PM","etrmillis":-5,"latitude":41.01,"longitude":-73.78}],"custs_out":0,"total_custs":0,"etr":"","etrmillis":-9}]}}}'
192
+ http_version:
193
+ recorded_at: Fri, 02 Nov 2012 18:26:48 GMT
194
+ recorded_with: VCR 2.3.0