eaternet 1.0.4 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a05d4cd0cc0d3226970b904914b26df1f449698
4
- data.tar.gz: 8671f3df54ad1b83c57b48603a60ab5118a13540
3
+ metadata.gz: 2c5fc04785f93aff0b3300b78b1b66b4b1dca9e7
4
+ data.tar.gz: 6fc295109586d5d5e9a04376d692c1ffa172fd46
5
5
  SHA512:
6
- metadata.gz: 0a585fec3107eaa0e5006664f7426403b2cbb23933ef52607b9613acec8cc82a873058c3b57dcb8c550cf594a92440f4222453c2cad7a2b77e54d1f71b287b3c
7
- data.tar.gz: a8ae0719ef5b1028c641478ae72e4554cbb2a8528d1764a25622e42166344f03e1782fe8efbd9b98b3f6735e26b864de6aef4b3893fef283870745979310a81b
6
+ metadata.gz: 41310f9717ff94054e7bc171857bac46d218737a8c0429473958542b98a4dcbaff8b1f0535ca14aaf883a22e951f3718d4e61c879852a3c4398f738c07fdc394
7
+ data.tar.gz: 15d68d3206700ced17e5df1cf37a5f386cce7136d21f7ec8184c9f44a91cc14fd20676241cd95a086e5ca623c99bb579543024c38fe805574b891b9f73d44aa6
data/Guardfile CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## Uncomment to clear the screen before every task
8
8
  clearing :on
9
- guard :minitest do
9
+ guard :minitest, all_after_pass: true do
10
10
  watch(%r{^test/(.*)_test\.rb$})
11
11
  watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
12
12
  watch(%r{^test/test_helper\.rb$}) { 'test' }
data/README.md CHANGED
@@ -16,12 +16,13 @@ information daily on our website.
16
16
 
17
17
  ## Available Adapters
18
18
 
19
- | Area | Agency | Ruby Class | Notes |
20
- |-------------------|--------------------------------------|------------|-----------|
21
- | Las Vegas | Southern Nevada Health District | [`Snhd`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/snhd.rb) | Needs refactoring and docs |
22
- | New York City | City of New York Health Deptartment | [`Nyc`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/nyc.rb) | [Dataset wiki page](https://github.com/eaternet/adapters/wiki/Agency:-New-York-City) |
19
+ | Area | Agency | Ruby Class | Notes |
20
+ |--------------------|--------------------------------------|------------|-----------|
21
+ | Austin, TX | City of Austin | `Austin` | [Development has started](https://github.com/eaternet/adapters-ruby/pull/43) |
22
+ | Las Vegas | Southern Nevada Health District | [`Snhd`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/snhd.rb) | Needs refactoring and docs |
23
+ | New York City | City of New York Health Department | [`Nyc`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/nyc.rb) | [Dataset wiki page](https://github.com/eaternet/adapters/wiki/Agency:-New-York-City) |
23
24
  | Portland, OR, USA | Multnomah Couty Environmental Health | [`Multco`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/multco.rb) | Deprecated. Needs to be updated to use the Accela API |
24
- | San Francisco | City of San Francisco | [`Sf`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/sf.rb) | Needs docs |
25
+ | San Francisco | City of San Francisco | [`Sf`](https://github.com/eaternet/adapters-ruby/blob/master/lib/eaternet/agencies/sf.rb) | Needs docs |
25
26
 
26
27
 
27
28
  ## Usage
data/lib/eaternet.rb CHANGED
@@ -2,16 +2,21 @@ require 'eaternet/agencies/multco'
2
2
  require 'eaternet/agencies/nyc'
3
3
  require 'eaternet/agencies/sf'
4
4
  require 'eaternet/agencies/snhd'
5
+ require 'eaternet/agencies/austin'
5
6
 
6
7
  module Eaternet
7
8
  # Make the actual adapters easily available
8
9
  # to the application-level as:
9
10
  #
11
+ # * `Eaternet::Austin` — Austin, TX
10
12
  # * `Eaternet::Nyc` – New York City
11
13
  # * `Eaternet::Sf` - San Francisco
12
14
  # * `Eaternet::Snhd` — Las Vegas area
13
15
  # * `Eaternet::Multco` — Portland area, Oregon, USA
14
16
  include Eaternet::Agencies
17
+
18
+ class UnsupportedError < StandardError
19
+ end
15
20
  end
16
21
 
17
22
  Zip.warn_invalid_date = false if ENV['RUBYZIP_NO_WARN_INVALID_DATE']
@@ -0,0 +1,105 @@
1
+ require 'eaternet/socrata'
2
+
3
+ module Eaternet
4
+ module Agencies
5
+
6
+ # @see https://data.austintexas.gov/dataset/Restaurant-Inspection-Scores/ecmv-9xxi
7
+ class Austin < Eaternet::Lives_1_0::Adapter
8
+ include Eaternet::Loggable
9
+ include Eaternet::Lives_1_0::CsvParser
10
+
11
+ # Create an Austin data-source, ready for querying.
12
+ #
13
+ # @example
14
+ # austin = Eaternet::Austin.new
15
+ #
16
+ # @param [String] csv_path for unit testing
17
+ def initialize(csv_path: nil)
18
+ @table_file = csv_path
19
+ end
20
+
21
+ # @example Print the number of restaurants in the city.
22
+ # puts austin.businesses.count
23
+ #
24
+ # @return [Enumerable<Business>]
25
+ def businesses
26
+ map_csv { |row| try_to_create(:business, from_csv_row: row) }
27
+ .uniq
28
+ .compact
29
+ end
30
+
31
+ def inspections
32
+ map_csv { |row| try_to_create(:inspection, from_csv_row: row) }
33
+ .compact
34
+ end
35
+
36
+ def violations
37
+ raise Eaternet::UnsupportedError.new(
38
+ 'The city of Austin does not publish violation data'
39
+ )
40
+ end
41
+
42
+ def legends
43
+ raise Eaternet::UnsupportedError.new(
44
+ 'The city of Austin does not assign letter grades'
45
+ )
46
+ end
47
+
48
+ def feed_info
49
+ Eaternet::Lives_1_0::FeedInfo.new do |fi|
50
+ fi.feed_date = Date.today
51
+ fi.feed_version = '1.0'
52
+ fi.municipality_name = 'Austin'
53
+ fi.municipality_url = 'http://www.austintexas.gov/department/health'
54
+ end
55
+ end
56
+
57
+
58
+
59
+ def inspection(row)
60
+ Eaternet::Lives_1_0::Inspection.new do |i|
61
+ i.business_id = row['Facility ID']
62
+ i.date = Date.strptime(row['Inspection Date'], '%m/%d/%Y')
63
+ i.score = row['Score'].to_i
64
+ end
65
+ end
66
+
67
+ def business(row)
68
+ Eaternet::Lives_1_0::Business.new do |b|
69
+ fail ArgumentError, 'No address found' if row['Address'].nil?
70
+
71
+ # Address is a multi-line, multi-value cell
72
+ address_lines = row['Address'].split("\n")
73
+ address = address_lines.first
74
+ city = address_lines[1].split(',').first
75
+
76
+ b.business_id = row['Facility ID']
77
+ b.name = row['Restaurant Name']
78
+ b.address = address
79
+ b.city = city
80
+ b.postal_code = row['Zip Code']
81
+ b.state = 'TX'
82
+ end
83
+ end
84
+
85
+
86
+
87
+ def table_file
88
+ @table_file ||= Austin.download_via_url
89
+ end
90
+
91
+ def self.download_via_url
92
+ Eaternet::Util.download_and_cache(source: csv_url, dest: Tempfile.new('austin'))
93
+ end
94
+
95
+ def self.csv_url
96
+ Eaternet::Socrata.csv_url domain: 'data.austintexas.gov', dataset: 'ecmv-9xxi'
97
+ end
98
+
99
+ def adapter_name
100
+ 'Austin'
101
+ end
102
+
103
+ end
104
+ end
105
+ end
@@ -192,12 +192,6 @@ module Eaternet
192
192
  end
193
193
  end
194
194
 
195
- def map_csv(&row_handler)
196
- CSV.new(File.open(table_file, encoding: 'utf-8'), headers: true)
197
- .lazy
198
- .map { |row| row_handler.call(row) }
199
- end
200
-
201
195
  def table_file
202
196
  @table_file ||= Nyc.download_via_url
203
197
  end
@@ -209,9 +203,7 @@ module Eaternet
209
203
  end
210
204
 
211
205
  def self.csv_url
212
- domain = 'data.cityofnewyork.us'
213
- dataset = 'xx67-kt59'
214
- "https://#{domain}/api/views/#{dataset}/rows.csv?accessType=DOWNLOAD"
206
+ Eaternet::Socrata.csv_url domain: 'data.cityofnewyork.us', dataset: 'xx67-kt59'
215
207
  end
216
208
 
217
209
  def adapter_name
@@ -11,7 +11,7 @@ module Eaternet
11
11
  # @required Yes
12
12
  # @return [Enumerable<Business>]
13
13
  def businesses
14
- fail 'Override this to return an Enumerable of Business'
14
+ fail 'Override Adapter#businesses to return an Enumerable of Business'
15
15
  end
16
16
 
17
17
  # @example Compute the average inspection score for SomeCity.
@@ -26,7 +26,7 @@ module Eaternet
26
26
  # @required Yes
27
27
  # @return [Enumerable<Inspection>]
28
28
  def inspections
29
- fail 'Override this to return an Enumerable of Inspection'
29
+ fail 'Override Adapter#inspections to return an Enumerable of Inspection'
30
30
  end
31
31
 
32
32
  # @required No
@@ -14,6 +14,12 @@ module Eaternet
14
14
  csv_map(csv) { |row| try_to_create to_type, from_csv_row: row }
15
15
  end
16
16
 
17
+ def map_csv(&row_handler)
18
+ CSV.new(File.open(table_file, encoding: 'utf-8'), headers: true)
19
+ .lazy
20
+ .map { |row| row_handler.call(row) }
21
+ end
22
+
17
23
  def csv_map(filename, &block)
18
24
  csv_rows(filename).lazy.map { |row| block.call(row) }
19
25
  end
@@ -0,0 +1,7 @@
1
+ module Eaternet
2
+ module Socrata
3
+ def self.csv_url(domain:, dataset:)
4
+ "https://#{domain}/api/views/#{dataset}/rows.csv?accessType=DOWNLOAD"
5
+ end
6
+ end
7
+ end
@@ -1,3 +1,3 @@
1
1
  module Eaternet
2
- VERSION = '1.0.4'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ require 'eaternet'
4
+ require 'eaternet/lives_1_0'
5
+
6
+ AUSTIN_CSV = 'test/fixtures/austin.csv'
7
+
8
+ class AustinAdapterTest < Minitest::Test
9
+ @@agency = Eaternet::Austin.new(csv_path: AUSTIN_CSV)
10
+
11
+ #
12
+ # Businesses
13
+ #
14
+
15
+ def test_businesses_returns_an_enumerator_of_business
16
+ assert enumerable_of? Eaternet::Lives_1_0::Business, @@agency.businesses
17
+ end
18
+
19
+ def test_businesses_returns_lives_attributes
20
+ b = @@agency.businesses.first
21
+ assert_equal '2801033', b.business_id
22
+ assert_equal '15th Street Cafe', b.name
23
+ assert_equal '303 W 15TH ST', b.address
24
+ assert_equal 'AUSTIN', b.city
25
+ assert_equal '78701', b.postal_code
26
+ assert_equal 'TX', b.state
27
+ end
28
+
29
+ def test_businesses_returns_correct_city
30
+ b = @@agency.businesses.to_a[2]
31
+ assert_equal 'BUDA', b.city
32
+ end
33
+
34
+ def test_businesses_returns_unique_rows
35
+ assert_equal 3, @@agency.businesses.to_a.size
36
+ end
37
+
38
+ #
39
+ # Inspections
40
+ #
41
+
42
+ def test_inspections_returns_an_enumerable_of_inspection
43
+ assert enumerable_of? Eaternet::Lives_1_0::Inspection, @@agency.inspections
44
+ end
45
+
46
+ def test_inspections_returns_correct_attributes
47
+ i = @@agency.inspections.first
48
+ assert_equal '2801033', i.business_id
49
+ assert_equal Date.new(2015, 5, 13), i.date
50
+ assert_equal 97, i.score
51
+ end
52
+
53
+ #
54
+ # Violations
55
+ #
56
+
57
+ def test_violations_raises_an_unsupported_error
58
+ assert_raises(Eaternet::UnsupportedError) { @@agency.violations }
59
+ end
60
+
61
+ def test_violations_raises_an_error_with_a_message
62
+ begin
63
+ @@agency.violations
64
+ rescue => e
65
+ assert_match /does not/, e.to_s
66
+ end
67
+ end
68
+
69
+
70
+ # #
71
+ # # metadata
72
+ # #
73
+ #
74
+ def test_implements_feed_info
75
+ assert_instance_of Eaternet::Lives_1_0::FeedInfo, @@agency.feed_info
76
+ end
77
+
78
+ def test_legends_raises_an_unsupported_error
79
+ assert_raises(Eaternet::UnsupportedError) { @@agency.legends }
80
+ end
81
+
82
+ end
@@ -0,0 +1,56 @@
1
+ Restaurant Name,Zip Code,Inspection Date,Score,Address,Facility ID,Process Description
2
+ 15th Street Cafe,78701,05/13/2015,97,"303 W 15TH ST
3
+ AUSTIN, TX 78701
4
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
5
+ 15th Street Cafe,78701,05/22/2013,91,"303 W 15TH ST
6
+ AUSTIN, TX 78701
7
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
8
+ 15th Street Cafe,78701,06/18/2014,97,"303 W 15TH ST
9
+ AUSTIN, TX 78701
10
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
11
+ 15th Street Cafe,78701,12/02/2014,93,"303 W 15TH ST
12
+ AUSTIN, TX 78701
13
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
14
+ 15th Street Cafe,78701,09/13/2012,93,"303 W 15TH ST
15
+ AUSTIN, TX 78701
16
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
17
+ 15th Street Cafe,78701,12/05/2013,97,"303 W 15TH ST
18
+ AUSTIN, TX 78701
19
+ (30.277553492000038, -97.74209889799994)",2801033,Routine Inspection
20
+ 1st Food Mart,78704,02/09/2015,94,"1410 S 1ST ST
21
+ AUSTIN, TX 78704
22
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
23
+ 1st Food Mart,78704,02/14/2013,97,"1410 S 1ST ST
24
+ AUSTIN, TX 78704
25
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
26
+ 1st Food Mart,78704,07/26/2012,97,"1410 S 1ST ST
27
+ AUSTIN, TX 78704
28
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
29
+ 1st Food Mart,78704,01/16/2014,90,"1410 S 1ST ST
30
+ AUSTIN, TX 78704
31
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
32
+ 1st Food Mart,78704,06/17/2013,100,"1410 S 1ST ST
33
+ AUSTIN, TX 78704
34
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
35
+ 1st Food Mart,78704,07/29/2014,90,"1410 S 1ST ST
36
+ AUSTIN, TX 78704
37
+ (30.25030317900007, -97.75485926699997)",10677646,Routine Inspection
38
+ Austin Recovery,78610,06/05/2015,100,"13207 WRIGHT ROAD
39
+ BUDA, TX 78610
40
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
41
+ Austin Recovery,78610,10/09/2014,95,"13207 WRIGHT ROAD
42
+ BUDA, TX 78610
43
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
44
+ Austin Recovery,78610,09/13/2013,96,"13207 WRIGHT ROAD
45
+ BUDA, TX 78610
46
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
47
+ Austin Recovery,78610,05/01/2014,97,"13207 WRIGHT ROAD
48
+ BUDA, TX 78610
49
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
50
+ Austin Recovery,78610,02/13/2015,100,"13207 WRIGHT ROAD
51
+ BUDA, TX 78610
52
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
53
+ Austin Recovery,78610,02/27/2013,92,"13207 WRIGHT ROAD
54
+ BUDA, TX 78610
55
+ (30.084734110000056, -97.75172505999996)",10774078,Routine Inspection
56
+
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: 1.0.4
4
+ version: 1.1.0
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-07-20 00:00:00.000000000 Z
11
+ date: 2015-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -239,6 +239,7 @@ files:
239
239
  - Rakefile
240
240
  - eaternet.gemspec
241
241
  - lib/eaternet.rb
242
+ - lib/eaternet/agencies/austin.rb
242
243
  - lib/eaternet/agencies/multco.rb
243
244
  - lib/eaternet/agencies/multco_lib/misc.rb
244
245
  - lib/eaternet/agencies/nyc.rb
@@ -257,10 +258,12 @@ files:
257
258
  - lib/eaternet/lives_1_0/violation.rb
258
259
  - lib/eaternet/loggable.rb
259
260
  - lib/eaternet/prototype.rb
261
+ - lib/eaternet/socrata.rb
260
262
  - lib/eaternet/util.rb
261
263
  - lib/eaternet/validated_object.rb
262
264
  - lib/eaternet/version.rb
263
265
  - lib/ext/enumerator.rb
266
+ - test/eaternet/agencies/austin_test.rb
264
267
  - test/eaternet/agencies/multco_test.rb
265
268
  - test/eaternet/agencies/nyc_test.rb
266
269
  - test/eaternet/agencies/sf_test.rb
@@ -274,6 +277,7 @@ files:
274
277
  - test/eaternet/loggable_test.rb
275
278
  - test/eaternet/util_test.rb
276
279
  - test/ext/enumerator_test.rb
280
+ - test/fixtures/austin.csv
277
281
  - test/fixtures/nyc.csv
278
282
  - test/script.rb
279
283
  - test/test_helper.rb
@@ -302,6 +306,7 @@ signing_key:
302
306
  specification_version: 4
303
307
  summary: Regional adapters for restaurant health scores
304
308
  test_files:
309
+ - test/eaternet/agencies/austin_test.rb
305
310
  - test/eaternet/agencies/multco_test.rb
306
311
  - test/eaternet/agencies/nyc_test.rb
307
312
  - test/eaternet/agencies/sf_test.rb
@@ -315,6 +320,7 @@ test_files:
315
320
  - test/eaternet/loggable_test.rb
316
321
  - test/eaternet/util_test.rb
317
322
  - test/ext/enumerator_test.rb
323
+ - test/fixtures/austin.csv
318
324
  - test/fixtures/nyc.csv
319
325
  - test/script.rb
320
326
  - test/test_helper.rb