eaternet 1.3.9 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e5d1cb4d7f2f6d148c9ca9d77df3a54f27649fab
4
- data.tar.gz: 0924a78eebff1ac3c671606b04039f2745f00210
3
+ metadata.gz: d4e1375032849d789bc66d07c270c9cbbd1359d2
4
+ data.tar.gz: 816728cbcb1c031b7ec8317696c4034e7a73498f
5
5
  SHA512:
6
- metadata.gz: 8335d54ab71a2b26f51ce163ecbafab2cf5d9bfe36d9f337cb5fdb6d1c9ab914c02d016b083f898cb8970e6c64d90c0ce42d1d7802522af369dbdbc0ea028157
7
- data.tar.gz: 74118d3daa2331ba2c5e9da671368e8f24c2718d32c7fcb2a43665fe889ce287aba8830e0d75e608750789a940bcfa21f8c80814ecd3cf4517fcb0fbbd00ed91
6
+ metadata.gz: 23952a31ca0a0aae9bc48ca4264dd0d80cc0929627b3fe857c45beb4727161ae8e2b0f59b01182d0cd8c8f25ec6b53f36e2e668731276a99beb58682e5453b39
7
+ data.tar.gz: 5e0e4721edabd70975f6c0ec9bde85e9a03929e7acf45289069e5a8487a483447b5e1ab52c085d389bb7ee21a7e2b604fe417468b8f62bdacca36919d112d11d
@@ -4,6 +4,7 @@ require 'eaternet/agencies/nyc'
4
4
  require 'eaternet/agencies/sf'
5
5
  require 'eaternet/agencies/snhd'
6
6
  require 'eaternet/agencies/austin'
7
+ require 'eaternet/agencies/lives2'
7
8
 
8
9
  module Eaternet
9
10
  # Make the actual adapters easily available
@@ -0,0 +1,93 @@
1
+ require 'csv'
2
+ require 'date'
3
+
4
+ require 'eaternet/lives_1_0/adapter'
5
+ require 'eaternet/lives_1_0/csv_parser'
6
+ require 'eaternet/loggable'
7
+ require 'eaternet/util'
8
+
9
+ module Eaternet
10
+ module Agencies
11
+ class Lives2 < Eaternet::Lives_1_0::Adapter
12
+ include Eaternet::Loggable
13
+ include Eaternet::Lives_1_0::CsvParser
14
+
15
+ def initialize(feed_url:, municipality_name:, municipality_url:, contact_email:)
16
+ @feed_url = feed_url
17
+ @municipality_name = municipality_name
18
+ @municipality_url = municipality_url
19
+ @contact_email = contact_email
20
+ end
21
+
22
+ def businesses
23
+ convert csv: 'businesses.csv', to_type: :business
24
+ end
25
+
26
+ def inspections
27
+ convert csv: 'inspections.csv', to_type: :inspection
28
+ end
29
+
30
+ def violations
31
+ convert csv: 'violations.csv', to_type: :violation
32
+ end
33
+
34
+ def feed_info
35
+ Eaternet::Lives_1_0::FeedInfo.new do |fi|
36
+ fi.feed_date = Date.today
37
+ fi.feed_version = '2.0'
38
+ fi.municipality_name = @municipality_name
39
+ fi.municipality_url = @municipality_url
40
+ fi.contact_email = @contact_email
41
+ end
42
+ end
43
+
44
+ def adapter_name
45
+ @municipality_name
46
+ end
47
+
48
+ def zip_file_url
49
+ @feed_url
50
+ end
51
+
52
+ private
53
+
54
+ def business(csv_row)
55
+ Eaternet::Lives_1_0::Business.new do |b|
56
+ csv_row.headers.each do |header|
57
+ b.send("#{header.downcase}=", csv_row[header])
58
+ end
59
+ end
60
+ end
61
+
62
+ def inspection(csv_row)
63
+ Eaternet::Lives_1_0::Inspection.new do |b|
64
+ csv_row.headers.each do |header|
65
+ b.send("#{header.downcase}=", csv_row[header])
66
+ b.date = Date.parse(csv_row['date'])
67
+ b.score = csv_row['score'].to_i
68
+ end
69
+ end
70
+ end
71
+
72
+ def violation(csv_row)
73
+ Eaternet::Lives_1_0::Violation.new do |b|
74
+ csv_row.headers.each do |header|
75
+ b.send("#{header.downcase}=", csv_row[header])
76
+ b.date = Date.parse(csv_row['date'])
77
+ b.description = fix(description: csv_row['description'])
78
+ end
79
+ end
80
+ end
81
+
82
+ def fix(description:)
83
+ # Remove bracketed violation facts, non-conforming to LIVES
84
+ return description unless description =~ /^([^\[]+)/
85
+ $1.strip
86
+ end
87
+
88
+ def csv_reader(path:)
89
+ CSV.new(open(path, encoding: 'ISO-8859-1'), headers: true)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Eaternet
3
- VERSION = '1.3.9'
3
+ VERSION = '1.4.0'
4
4
  end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+ require 'eaternet'
4
+
5
+ class Lives2Test < Minitest::Test
6
+ # Instantiating as an app developer would:
7
+ @@l2 = Eaternet::Lives2.new(
8
+ feed_url: 'https://extxfer.sfdph.org/food/SFBusinesses.zip',
9
+ municipality_name: 'San Francisco',
10
+ municipality_url: 'http://www.sfgov.org',
11
+ contact_email: 'richard.lee@sfdph.org'
12
+ )
13
+
14
+ #
15
+ # Businesses
16
+ #
17
+
18
+ def test_businesses_returns_an_enumerator_of_business
19
+ VCR.use_cassette(L2_CASSETTE) do
20
+ assert enumerable_of? Eaternet::Lives_1_0::Business, @@l2.businesses
21
+ end
22
+ end
23
+
24
+ def test_businesses_returns_lives_attributes
25
+ VCR.use_cassette(L2_CASSETTE) do
26
+ b = @@l2.businesses.first
27
+ assert_equal '10', b.business_id
28
+ assert_equal 'TIRAMISU KITCHEN', b.name
29
+ assert_equal '033 BELDEN PL', b.address
30
+ assert_equal 'San Francisco', b.city
31
+ assert_equal '94104', b.postal_code
32
+ assert_equal 'CA', b.state
33
+ assert_equal 37.791116, b.latitude
34
+ assert_equal -122.403816, b.longitude
35
+ assert_equal '+14154217044', b.phone_number
36
+ end
37
+ end
38
+
39
+ #
40
+ # Inspections
41
+ #
42
+
43
+ def test_inspections_returns_an_enumerable_of_inspection
44
+ VCR.use_cassette(L2_CASSETTE) do
45
+ assert enumerable_of? Eaternet::Lives_1_0::Inspection, @@l2.inspections
46
+ end
47
+ end
48
+
49
+ def test_inspections_returns_lives_attributes
50
+ VCR.use_cassette(L2_CASSETTE) do
51
+ chosen_inspection = @@l2.inspections
52
+ .select { |i| i.business_id == '19' && i.date == Date.new(2016, 5, 13) }
53
+ .first
54
+ raise "Couldn't find the chosen inspection" if chosen_inspection.nil?
55
+ assert_equal 94, chosen_inspection.score
56
+ end
57
+ end
58
+
59
+ #
60
+ # Violations
61
+ #
62
+
63
+ def test_violations_returns_an_enumerable_of_violation
64
+ VCR.use_cassette(L2_CASSETTE) do
65
+ assert enumerable_of? Eaternet::Lives_1_0::Violation, @@l2.violations
66
+ end
67
+ end
68
+
69
+ # TODO: Fix this test
70
+ # def test_violations_returns_lives_attributes
71
+ # VCR.use_cassette(L2_CASSETTE) do
72
+ # v = @@l2.violations.first
73
+ # assert_equal '10', v.business_id
74
+ # assert_equal Date.new(2014, 7, 29), v.date
75
+ # assert_equal nil, v.code
76
+ # assert_match /^Insufficient hot water or running water$/, v.description
77
+ # end
78
+ # end
79
+
80
+ #
81
+ # metadata
82
+ #
83
+
84
+ def test_implements_feed_info
85
+ assert_instance_of Eaternet::Lives_1_0::FeedInfo, @@l2.feed_info
86
+ end
87
+
88
+ #
89
+ # Other
90
+ #
91
+
92
+ # def test_handles_file_encoding
93
+ # refute_nil @@l2.businesses.to_a
94
+ # end
95
+ end
@@ -21,4 +21,5 @@ end
21
21
 
22
22
  SNHD_CASSETTE = 'snhd'
23
23
  SF_CASSETTE = 'sf'
24
+ L2_CASSETTE = 'lives2'
24
25
  ENV['RUBYZIP_NO_WARN_INVALID_DATE'] = '1'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eaternet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.9
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robb Shecter
@@ -254,6 +254,7 @@ files:
254
254
  - eaternet.gemspec
255
255
  - lib/eaternet.rb
256
256
  - lib/eaternet/agencies/austin.rb
257
+ - lib/eaternet/agencies/lives2.rb
257
258
  - lib/eaternet/agencies/multco.rb
258
259
  - lib/eaternet/agencies/multco_lib/misc.rb
259
260
  - lib/eaternet/agencies/nyc.rb
@@ -278,6 +279,7 @@ files:
278
279
  - lib/eaternet/version.rb
279
280
  - lib/ext/enumerator.rb
280
281
  - test/eaternet/agencies/austin_test.rb
282
+ - test/eaternet/agencies/lives2_test.rb
281
283
  - test/eaternet/agencies/multco_test.rb
282
284
  - test/eaternet/agencies/nyc_test.rb
283
285
  - test/eaternet/agencies/sf_test.rb
@@ -321,6 +323,7 @@ specification_version: 4
321
323
  summary: Regional adapters for restaurant health scores
322
324
  test_files:
323
325
  - test/eaternet/agencies/austin_test.rb
326
+ - test/eaternet/agencies/lives2_test.rb
324
327
  - test/eaternet/agencies/multco_test.rb
325
328
  - test/eaternet/agencies/nyc_test.rb
326
329
  - test/eaternet/agencies/sf_test.rb