eaternet 0.3.10 → 0.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/Gemfile +1 -1
- data/Guardfile +1 -1
- data/lib/eaternet/agencies/nyc.rb +69 -16
- data/lib/eaternet/lives_1_0/adapter.rb +19 -0
- data/lib/eaternet/version.rb +1 -1
- data/test/eaternet/{nyc_adapter_test.rb → agencies/nyc_test.rb} +0 -0
- data/test/eaternet/{snhd_adapter_test.rb → agencies/snhd_test.rb} +0 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11257485cfdcbda82f42ae36c646ebfc9616203d
|
4
|
+
data.tar.gz: 9f3bbe15c16db1bc73527cbb25aa69c4421ea630
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9bd3634278276974dcecb89c48f1285ff652245dd968d8be8349b7063b853c8acfa6af8c5e7fcea6bb2703c50e4dcd3e2cf993784ff5eff92578f8f327de9e4c
|
7
|
+
data.tar.gz: 2484a3f65c718bd457b6ee56a6c40bb64aa4326950723ee59198c1b05f52f336bde72f3b1035c246638bb606483023c832a81573d5c0bb48e9ae47e4a47cbbf4
|
data/.yardopts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
--markup markdown --name-tag required:"Required"
|
1
|
+
--no-private --markup markdown --name-tag required:"Required"
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -13,37 +13,73 @@ require 'eaternet/loggable'
|
|
13
13
|
|
14
14
|
module Eaternet
|
15
15
|
module Agencies
|
16
|
-
# A
|
16
|
+
# A data source for New York City food service health inspections. It
|
17
|
+
# retrieves the latest info from the official source and makes it easy
|
18
|
+
# to work with.
|
17
19
|
#
|
18
|
-
#
|
20
|
+
# This library conforms to the
|
21
|
+
# [LIVES 1.0 standard](http://www.yelp.com/healthscores) developed by
|
22
|
+
# Yelp and the cities of San Francisco and New York.
|
23
|
+
#
|
24
|
+
# @example Print the names of all the restaurants in New York City
|
19
25
|
# nyc = Eaternet::Nyc.new
|
20
|
-
# nyc.businesses.
|
26
|
+
# puts nyc.businesses.map(&:name)
|
27
|
+
#
|
28
|
+
# @example Compute the average inspection score for NYC.
|
29
|
+
# # The library is optimized for memory use at the expense
|
30
|
+
# # of speed. E.g., each call to #inspections will iterate
|
31
|
+
# # through the raw CSV. So here, we first retrieve the
|
32
|
+
# # inspections into an array.
|
33
|
+
# inspections = nyc.inspections.to_a
|
34
|
+
# sum = inspections
|
35
|
+
# .map(&:score)
|
36
|
+
# .reduce(0, :+)
|
37
|
+
# count = inspections.count
|
38
|
+
#
|
39
|
+
# puts "Average inspection score: #{sum / count}"
|
21
40
|
#
|
22
|
-
# @
|
41
|
+
# @example See the Instance Method Details for more examples.
|
42
|
+
#
|
43
|
+
# @see https://data.cityofnewyork.us/Health/DOHMH-New-York-City-Restaurant-Inspection-Results/xx67-kt59 NYC health scores official data, hosted on Socrata
|
23
44
|
class Nyc < Eaternet::Lives_1_0::Adapter
|
24
45
|
include Eaternet::Lives_1_0
|
25
46
|
include Eaternet::Loggable
|
26
47
|
|
27
|
-
|
28
|
-
DATASET = 'xx67-kt59'
|
29
|
-
CSV_URL = "https://#{DOMAIN}/api/views/#{DATASET}/rows.csv?accessType=DOWNLOAD"
|
30
|
-
|
31
|
-
# Create an adapter for the NYC data.
|
48
|
+
# Create an NYC data-source, ready for querying.
|
32
49
|
#
|
33
50
|
# @example
|
34
51
|
# nyc = Eaternet::Nyc.new
|
35
52
|
#
|
36
|
-
# @param [String] csv_path
|
53
|
+
# @param [String] csv_path for unit testing
|
37
54
|
def initialize(csv_path: nil)
|
38
55
|
@table_file = csv_path
|
39
56
|
end
|
40
57
|
|
58
|
+
# @example Print the number of restaurants in New York.
|
59
|
+
# puts nyc.businesses.count
|
60
|
+
#
|
61
|
+
# @return [Enumerable<Business>]
|
41
62
|
def businesses
|
42
63
|
map_csv { |row| try_to_create_business(row) }
|
43
64
|
.compact
|
44
65
|
.unique
|
45
66
|
end
|
46
67
|
|
68
|
+
# @example Compute the average inspection score for NYC.
|
69
|
+
#
|
70
|
+
# # The library is optimized for memory use at the expense
|
71
|
+
# # of speed. E.g., each call to #inspections will iterate
|
72
|
+
# # through the raw CSV. So here, we first retrieve the
|
73
|
+
# # inspections into an array.
|
74
|
+
# inspections = nyc.inspections.to_a
|
75
|
+
# sum = inspections
|
76
|
+
# .map(&:score)
|
77
|
+
# .reduce(0, :+)
|
78
|
+
# count = inspections.count
|
79
|
+
#
|
80
|
+
# puts "Average inspection score: #{sum / count}"
|
81
|
+
#
|
82
|
+
# @return [Enumerable<Inspection>]
|
47
83
|
def inspections
|
48
84
|
cache = Set.new
|
49
85
|
map_csv do |row|
|
@@ -62,6 +98,11 @@ module Eaternet
|
|
62
98
|
end.compact
|
63
99
|
end
|
64
100
|
|
101
|
+
# @example Print the name & URL of NYC's health agency.
|
102
|
+
# puts nyc.feed_info.municipality_name
|
103
|
+
# puts nyc.feed_info.municipality_url
|
104
|
+
#
|
105
|
+
# @return [FeedInfo]
|
65
106
|
def feed_info
|
66
107
|
FeedInfo.new do |fi|
|
67
108
|
fi.feed_date = Date.today
|
@@ -94,7 +135,7 @@ module Eaternet
|
|
94
135
|
end
|
95
136
|
|
96
137
|
|
97
|
-
|
138
|
+
private
|
98
139
|
|
99
140
|
def try_to_create_business(row)
|
100
141
|
business(row)
|
@@ -114,6 +155,9 @@ module Eaternet
|
|
114
155
|
nil
|
115
156
|
end
|
116
157
|
|
158
|
+
public # To enable testing
|
159
|
+
|
160
|
+
# @private
|
117
161
|
def business(row)
|
118
162
|
address = "#{row['BUILDING']} #{row['STREET']}"
|
119
163
|
|
@@ -128,6 +172,8 @@ module Eaternet
|
|
128
172
|
end
|
129
173
|
end
|
130
174
|
|
175
|
+
private
|
176
|
+
|
131
177
|
def violation(row)
|
132
178
|
Violation.new do |v|
|
133
179
|
v.business_id = business_id(row)
|
@@ -157,10 +203,6 @@ module Eaternet
|
|
157
203
|
row['CAMIS']
|
158
204
|
end
|
159
205
|
|
160
|
-
def inspection_id(row)
|
161
|
-
[row['CAMIS'], row['INSPECTION DATE']].join('-')
|
162
|
-
end
|
163
|
-
|
164
206
|
def violation_kind_id(row)
|
165
207
|
row['VIOLATION CODE']
|
166
208
|
end
|
@@ -173,6 +215,10 @@ module Eaternet
|
|
173
215
|
inspection_id(row)
|
174
216
|
end
|
175
217
|
|
218
|
+
def inspection_id(row)
|
219
|
+
[row['CAMIS'], row['INSPECTION DATE']].join('-')
|
220
|
+
end
|
221
|
+
|
176
222
|
def transfat_inspection?(row)
|
177
223
|
if row['INSPECTION TYPE']
|
178
224
|
row['INSPECTION TYPE'].include?('Trans Fat')
|
@@ -204,8 +250,15 @@ module Eaternet
|
|
204
250
|
end
|
205
251
|
|
206
252
|
# Fastest method for downloading all data but may be non-standard
|
253
|
+
# for Socrata.
|
207
254
|
def self.download_via_url(a_file)
|
208
|
-
a_file.write(open(
|
255
|
+
a_file.write(open(csv_url).read)
|
256
|
+
end
|
257
|
+
|
258
|
+
def csv_url
|
259
|
+
domain = 'data.cityofnewyork.us'
|
260
|
+
dataset = 'xx67-kt59'
|
261
|
+
"https://#{domain}/api/views/#{dataset}/rows.csv?accessType=DOWNLOAD"
|
209
262
|
end
|
210
263
|
end
|
211
264
|
end
|
@@ -4,12 +4,25 @@ module Eaternet
|
|
4
4
|
# and optionally {#violations}, {#feed_info}, and {#legends} to
|
5
5
|
# implement a custom Lives 1.0 data source adapter.
|
6
6
|
class Adapter
|
7
|
+
# @example Print the number of restaurants in SomeCity.
|
8
|
+
# some_city = Eaternet::SomeCity.new
|
9
|
+
# puts some_city.businesses.count
|
10
|
+
#
|
7
11
|
# @required Yes
|
8
12
|
# @return [Enumerable<Business>]
|
9
13
|
def businesses
|
10
14
|
fail 'Override this to return an Enumerable of Business'
|
11
15
|
end
|
12
16
|
|
17
|
+
# @example Compute the average inspection score for SomeCity.
|
18
|
+
# some_city = Eaternet::SomeCity.new
|
19
|
+
# sum = some_city.inspections
|
20
|
+
# .map(&:score)
|
21
|
+
# .reduce(0, :+)
|
22
|
+
# count = some_city.inspections.count
|
23
|
+
#
|
24
|
+
# puts "Average inspection score: " + sum / count
|
25
|
+
#
|
13
26
|
# @required Yes
|
14
27
|
# @return [Enumerable<Inspection>]
|
15
28
|
def inspections
|
@@ -22,6 +35,12 @@ module Eaternet
|
|
22
35
|
fail 'Optionally override this to return an Enumerable of Violation'
|
23
36
|
end
|
24
37
|
|
38
|
+
# @example Retrieve the name & URL of SomeCity's health agency.
|
39
|
+
# some_city = Eaternet::SomeCity.new
|
40
|
+
# info = some_city.feed_info
|
41
|
+
# puts info.municipality_name
|
42
|
+
# puts info.municipality_url
|
43
|
+
#
|
25
44
|
# @required No
|
26
45
|
# @return [FeedInfo]
|
27
46
|
def feed_info
|
data/lib/eaternet/version.rb
CHANGED
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eaternet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robb Shecter
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -186,14 +186,14 @@ files:
|
|
186
186
|
- lib/eaternet/validated_object.rb
|
187
187
|
- lib/eaternet/version.rb
|
188
188
|
- lib/ext/lazy.rb
|
189
|
+
- test/eaternet/agencies/nyc_test.rb
|
190
|
+
- test/eaternet/agencies/snhd_test.rb
|
189
191
|
- test/eaternet/eaternet_test.rb
|
190
192
|
- test/eaternet/lives_1_0/business_test.rb
|
191
193
|
- test/eaternet/lives_1_0/feed_info_test.rb
|
192
194
|
- test/eaternet/lives_1_0/inspection_test.rb
|
193
195
|
- test/eaternet/lives_1_0/legend_test.rb
|
194
196
|
- test/eaternet/loggable_test.rb
|
195
|
-
- test/eaternet/nyc_adapter_test.rb
|
196
|
-
- test/eaternet/snhd_adapter_test.rb
|
197
197
|
- test/fixtures/morris-park-bake-shop.csv
|
198
198
|
- test/script.rb
|
199
199
|
- test/test_helper.rb
|
@@ -222,14 +222,14 @@ signing_key:
|
|
222
222
|
specification_version: 4
|
223
223
|
summary: Regional adapters for restaurant health scores
|
224
224
|
test_files:
|
225
|
+
- test/eaternet/agencies/nyc_test.rb
|
226
|
+
- test/eaternet/agencies/snhd_test.rb
|
225
227
|
- test/eaternet/eaternet_test.rb
|
226
228
|
- test/eaternet/lives_1_0/business_test.rb
|
227
229
|
- test/eaternet/lives_1_0/feed_info_test.rb
|
228
230
|
- test/eaternet/lives_1_0/inspection_test.rb
|
229
231
|
- test/eaternet/lives_1_0/legend_test.rb
|
230
232
|
- test/eaternet/loggable_test.rb
|
231
|
-
- test/eaternet/nyc_adapter_test.rb
|
232
|
-
- test/eaternet/snhd_adapter_test.rb
|
233
233
|
- test/fixtures/morris-park-bake-shop.csv
|
234
234
|
- test/script.rb
|
235
235
|
- test/test_helper.rb
|