eaternet 0.4.7 → 1.0.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 +4 -4
- data/eaternet.gemspec +1 -1
- data/lib/eaternet/agencies/snhd.rb +77 -98
- data/lib/eaternet/agencies/snhd_prototype.rb +103 -0
- data/lib/eaternet/version.rb +1 -1
- data/lib/eaternet.rb +0 -2
- data/test/eaternet/agencies/snhd_prototype_test.rb +128 -0
- data/test/eaternet/agencies/snhd_test.rb +28 -81
- metadata +8 -9
- data/lib/eaternet/agencies/snhd_lives.rb +0 -106
- data/test/eaternet/agencies/snhd_lives_test.rb +0 -75
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 4593dfcf3a89703992a04487b287240043dfd3d4
         | 
| 4 | 
            +
              data.tar.gz: 1b766e1829a7b3bb3c79ea2a67b628bd6a0a9c78
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 1b3f69b0b5b9ee069e413f9fa773e41be46fb2ec69d48e62b945d9a74441050e636cced72de54797fe79a4d9d39dce9fd5597f08c0d79e03ec05a75645181816
         | 
| 7 | 
            +
              data.tar.gz: 80e086a93cb536589a9756025b1712dee785a2914649707ad4f107566c74702fab75c4aff53c1801770ec6a3bb4450c8bd4435a565459bdbdde3059ee24f744f
         | 
    
        data/eaternet.gemspec
    CHANGED
    
    | @@ -29,7 +29,7 @@ Gem::Specification.new do |spec| | |
| 29 29 | 
             
              spec.add_development_dependency 'vcr'
         | 
| 30 30 | 
             
              spec.add_development_dependency 'webmock'
         | 
| 31 31 |  | 
| 32 | 
            -
              spec.add_runtime_dependency 'activemodel', ' | 
| 32 | 
            +
              spec.add_runtime_dependency 'activemodel', '>= 3.2.21'
         | 
| 33 33 | 
             
              spec.add_runtime_dependency 'rubyzip'
         | 
| 34 34 | 
             
              spec.add_runtime_dependency 'httparty'
         | 
| 35 35 | 
             
            end
         | 
| @@ -1,126 +1,105 @@ | |
| 1 | 
            -
            require ' | 
| 2 | 
            -
            require 'eaternet/ | 
| 3 | 
            -
            require 'eaternet/prototype'
         | 
| 1 | 
            +
            require 'date'
         | 
| 2 | 
            +
            require 'eaternet/loggable'
         | 
| 4 3 | 
             
            require 'eaternet/util'
         | 
| 4 | 
            +
            require 'eaternet/agencies/snhd_prototype'
         | 
| 5 5 |  | 
| 6 6 | 
             
            module Eaternet
         | 
| 7 7 | 
             
              module Agencies
         | 
| 8 | 
            -
                 | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
                #
         | 
| 15 | 
            -
                #   agency = Eaternet::Snhd.new
         | 
| 16 | 
            -
                #   agency.businesses
         | 
| 17 | 
            -
                #       .select { |biz| biz.city == 'Las Vegas' }
         | 
| 18 | 
            -
                #       .each { |biz| puts biz.name }
         | 
| 19 | 
            -
                #
         | 
| 20 | 
            -
                # The SNHD makes their restaurant inspection data available via a zip file
         | 
| 21 | 
            -
                # for download. The file contains several Mysql tables converted to CSV.
         | 
| 22 | 
            -
                # And so, this is an example for how to code adapters for other agencies
         | 
| 23 | 
            -
                # which publish their data in a similar way.
         | 
| 24 | 
            -
                #
         | 
| 25 | 
            -
                # This code downloads the latest zip file, extracts it, parses the csv,
         | 
| 26 | 
            -
                # and provides enumerators of Businesses, Inspections, Violations, and
         | 
| 27 | 
            -
                # ViolationKinds. (These are specified in the
         | 
| 28 | 
            -
                # Eaternet::Prototype module.)
         | 
| 29 | 
            -
                #
         | 
| 30 | 
            -
                # SNHD's CSV format seems to be non-standard, e.g. using the double-quote
         | 
| 31 | 
            -
                # character in fields without escaping it. We need to find out what their
         | 
| 32 | 
            -
                # quote character actually is. In the meantime, the files can be parsed by
         | 
| 33 | 
            -
                # setting the quote character to something else that doesn't appear in the
         | 
| 34 | 
            -
                # text, such as a pipe symbol.
         | 
| 35 | 
            -
                #
         | 
| 36 | 
            -
                # @see http://southernnevadahealthdistrict.org/restaurants/inspect-downloads.php
         | 
| 37 | 
            -
                #      The SNHD Developer information page
         | 
| 38 | 
            -
                # @see Eaternet::Prototype Framework module
         | 
| 39 | 
            -
                class Snhd
         | 
| 40 | 
            -
                  include Eaternet::Prototype::AbstractAdapter
         | 
| 8 | 
            +
                class Snhd < Eaternet::Lives_1_0::Adapter
         | 
| 9 | 
            +
                  include Eaternet::Loggable
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def initialize
         | 
| 12 | 
            +
                    @prototype = Eaternet::Agencies::SnhdPrototype.new
         | 
| 13 | 
            +
                  end
         | 
| 41 14 |  | 
| 42 | 
            -
                  # (see Eaternet::Prototype::AbstractAdapter#businesses)
         | 
| 43 15 | 
             
                  def businesses
         | 
| 44 | 
            -
                     | 
| 45 | 
            -
                       | 
| 46 | 
            -
                        orig_key: row['permit_number'],
         | 
| 47 | 
            -
                        name: row['restaurant_name'],
         | 
| 48 | 
            -
                        address: row['address'],
         | 
| 49 | 
            -
                        city: row['city_name'],
         | 
| 50 | 
            -
                        zipcode: row['zip_code']
         | 
| 51 | 
            -
                      )
         | 
| 52 | 
            -
                    end
         | 
| 16 | 
            +
                    @prototype.businesses
         | 
| 17 | 
            +
                      .map { |proto| try_to_create_business(proto) }
         | 
| 53 18 | 
             
                  end
         | 
| 54 19 |  | 
| 55 | 
            -
                  # (see Eaternet::Prototype::AbstractAdapter#inspections)
         | 
| 56 20 | 
             
                  def inspections
         | 
| 57 | 
            -
                     | 
| 58 | 
            -
                       | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
                        score: row['inspection_grade'],
         | 
| 67 | 
            -
                        demerits: row['inspection_demerits'],
         | 
| 68 | 
            -
                        date: row['inspection_date'],
         | 
| 69 | 
            -
                        violations: violations
         | 
| 70 | 
            -
                      )
         | 
| 21 | 
            +
                    @prototype.inspections
         | 
| 22 | 
            +
                      .map { |proto| try_to_create_inspection(proto) }
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def try_to_create_business(proto)
         | 
| 26 | 
            +
                    business(proto)
         | 
| 27 | 
            +
                  rescue ArgumentError => e
         | 
| 28 | 
            +
                    logger.warn('SNHD LIVES adapter') do
         | 
| 29 | 
            +
                      "Could not create a LIVES Business from #{proto.inspect}: #{e}"
         | 
| 71 30 | 
             
                    end
         | 
| 31 | 
            +
                    nil
         | 
| 72 32 | 
             
                  end
         | 
| 73 33 |  | 
| 74 | 
            -
                   | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
                        inspection_id: row['inspection_id'],
         | 
| 80 | 
            -
                        violation_kind_id: row['inspection_violation']
         | 
| 81 | 
            -
                      )
         | 
| 34 | 
            +
                  def try_to_create_inspection(proto)
         | 
| 35 | 
            +
                    inspection(proto)
         | 
| 36 | 
            +
                  rescue ArgumentError => e
         | 
| 37 | 
            +
                    logger.warn('SNHD LIVES adapter') do
         | 
| 38 | 
            +
                      "Could not create a LIVES Inspection from #{proto.inspect}: #{e}"
         | 
| 82 39 | 
             
                    end
         | 
| 40 | 
            +
                    nil
         | 
| 83 41 | 
             
                  end
         | 
| 84 42 |  | 
| 85 | 
            -
                   | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
                       | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
                        description: row['violation_description']
         | 
| 94 | 
            -
                      )
         | 
| 43 | 
            +
                  def business(proto)
         | 
| 44 | 
            +
                    Eaternet::Lives_1_0::Business.new do |b|
         | 
| 45 | 
            +
                      b.business_id = proto.orig_key
         | 
| 46 | 
            +
                      b.name =    proto.name
         | 
| 47 | 
            +
                      b.address = proto.address
         | 
| 48 | 
            +
                      b.city =    proto.city
         | 
| 49 | 
            +
                      b.postal_code = proto.zipcode
         | 
| 50 | 
            +
                      b.state = 'NV'
         | 
| 95 51 | 
             
                    end
         | 
| 96 52 | 
             
                  end
         | 
| 97 53 |  | 
| 98 | 
            -
                   | 
| 54 | 
            +
                  def inspection(proto)
         | 
| 55 | 
            +
                    Eaternet::Lives_1_0::Inspection.new do |i|
         | 
| 56 | 
            +
                      i.business_id = proto.business_orig_key
         | 
| 57 | 
            +
                      i.score = proto.demerits.nil? ? nil : 100 - proto.demerits.to_i
         | 
| 58 | 
            +
                      i.date = Date.parse(proto.date)
         | 
| 59 | 
            +
                    end
         | 
| 60 | 
            +
                  end
         | 
| 99 61 |  | 
| 100 | 
            -
                  def  | 
| 101 | 
            -
                     | 
| 62 | 
            +
                  def violations
         | 
| 63 | 
            +
                    @violations ||= _violations
         | 
| 102 64 | 
             
                  end
         | 
| 103 65 |  | 
| 104 | 
            -
                  def  | 
| 105 | 
            -
                     | 
| 106 | 
            -
                       | 
| 107 | 
            -
                       | 
| 108 | 
            -
             | 
| 66 | 
            +
                  def feed_info
         | 
| 67 | 
            +
                    Eaternet::Lives_1_0::FeedInfo.new do |fi|
         | 
| 68 | 
            +
                      fi.feed_date = Date.today
         | 
| 69 | 
            +
                      fi.feed_version = '1.0'
         | 
| 70 | 
            +
                      fi.municipality_name = 'Southern Nevada'
         | 
| 71 | 
            +
                      fi.municipality_url = 'http://southernnevadahealthdistrict.org/restaurants/index.php'
         | 
| 72 | 
            +
                      fi.contact_email = 'environmentalhealth@snhdmail.org'
         | 
| 73 | 
            +
                    end
         | 
| 109 74 | 
             
                  end
         | 
| 110 75 |  | 
| 111 | 
            -
                  def  | 
| 112 | 
            -
                     | 
| 113 | 
            -
                    file.readline  # Skip the non-standard header line
         | 
| 114 | 
            -
                    CSV.new(
         | 
| 115 | 
            -
                      file,
         | 
| 116 | 
            -
                      headers: headers,
         | 
| 117 | 
            -
                      col_sep: SnhdConfig::COLUMN_SEPARATOR,
         | 
| 118 | 
            -
                      quote_char: SnhdConfig::QUOTE_CHARACTER
         | 
| 119 | 
            -
                    )
         | 
| 76 | 
            +
                  def legends
         | 
| 77 | 
            +
                    []
         | 
| 120 78 | 
             
                  end
         | 
| 121 79 |  | 
| 122 | 
            -
                  def  | 
| 123 | 
            -
                     | 
| 80 | 
            +
                  def _violations
         | 
| 81 | 
            +
                    violation_kinds = {}
         | 
| 82 | 
            +
                    @prototype.violation_kinds.each do |vk|
         | 
| 83 | 
            +
                      violation_kinds[vk.orig_key] = vk
         | 
| 84 | 
            +
                    end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                    result = []
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    @prototype.inspections.each do |proto_inspection|
         | 
| 89 | 
            +
                      proto_inspection.violations.each do |kind_id|
         | 
| 90 | 
            +
                        begin
         | 
| 91 | 
            +
                          result << Eaternet::Lives_1_0::Violation.new do |v|
         | 
| 92 | 
            +
                            v.business_id = proto_inspection.business_orig_key
         | 
| 93 | 
            +
                            v.date =        Date.parse(proto_inspection.date)
         | 
| 94 | 
            +
                            v.code =        violation_kinds[kind_id].code
         | 
| 95 | 
            +
                            v.description = violation_kinds[kind_id].description
         | 
| 96 | 
            +
                          end
         | 
| 97 | 
            +
                        rescue NoMethodError => e
         | 
| 98 | 
            +
                          logger.debug "Error creating violation kind #{kind_id} for inspection #{proto_inspection.orig_key}: #{e}"
         | 
| 99 | 
            +
                        end
         | 
| 100 | 
            +
                      end
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
                    result
         | 
| 124 103 | 
             
                  end
         | 
| 125 104 | 
             
                end
         | 
| 126 105 | 
             
              end
         | 
| @@ -0,0 +1,103 @@ | |
| 1 | 
            +
            require 'csv'
         | 
| 2 | 
            +
            require 'eaternet/agencies/snhd_config'
         | 
| 3 | 
            +
            require 'eaternet/prototype'
         | 
| 4 | 
            +
            require 'eaternet/util'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module Eaternet
         | 
| 7 | 
            +
              module Agencies
         | 
| 8 | 
            +
                # An adapter for the Southern Nevada Health District (Las Vegas).
         | 
| 9 | 
            +
                #
         | 
| 10 | 
            +
                # @note This is a work in progress.
         | 
| 11 | 
            +
                # @private
         | 
| 12 | 
            +
                # @see http://southernnevadahealthdistrict.org/restaurants/inspect-downloads.php
         | 
| 13 | 
            +
                #      The SNHD Developer information page
         | 
| 14 | 
            +
                # @see Eaternet::Prototype Framework module
         | 
| 15 | 
            +
                class SnhdPrototype
         | 
| 16 | 
            +
                  include Eaternet::Prototype::AbstractAdapter
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  # (see Eaternet::Prototype::AbstractAdapter#businesses)
         | 
| 19 | 
            +
                  def businesses
         | 
| 20 | 
            +
                    lazy_csv_map('restaurant_establishments.csv') do |row|
         | 
| 21 | 
            +
                      Eaternet::Prototype::BusinessData.new(
         | 
| 22 | 
            +
                        orig_key: row['permit_number'],
         | 
| 23 | 
            +
                        name: row['restaurant_name'],
         | 
| 24 | 
            +
                        address: row['address'],
         | 
| 25 | 
            +
                        city: row['city_name'],
         | 
| 26 | 
            +
                        zipcode: row['zip_code']
         | 
| 27 | 
            +
                      )
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  # (see Eaternet::Prototype::AbstractAdapter#inspections)
         | 
| 32 | 
            +
                  def inspections
         | 
| 33 | 
            +
                    lazy_csv_map('restaurant_inspections.csv') do |row|
         | 
| 34 | 
            +
                      if row['violations']
         | 
| 35 | 
            +
                        violations = row['violations'].split(',')
         | 
| 36 | 
            +
                      else
         | 
| 37 | 
            +
                        violations = []
         | 
| 38 | 
            +
                      end
         | 
| 39 | 
            +
                      Eaternet::Prototype::InspectionData.new(
         | 
| 40 | 
            +
                        orig_key: row['serial_number'],
         | 
| 41 | 
            +
                        business_orig_key: row['permit_number'],
         | 
| 42 | 
            +
                        score: row['inspection_grade'],
         | 
| 43 | 
            +
                        demerits: row['inspection_demerits'],
         | 
| 44 | 
            +
                        date: row['inspection_date'],
         | 
| 45 | 
            +
                        violations: violations
         | 
| 46 | 
            +
                      )
         | 
| 47 | 
            +
                    end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  # (see Eaternet::Prototype::AbstractAdapter#violations)
         | 
| 51 | 
            +
                  def violations
         | 
| 52 | 
            +
                    lazy_csv_map('restaurant_inspection_violations.csv') do |row|
         | 
| 53 | 
            +
                      Eaternet::Prototype::ViolationData.new(
         | 
| 54 | 
            +
                        orig_key: row['inspection_violation_id'],
         | 
| 55 | 
            +
                        inspection_id: row['inspection_id'],
         | 
| 56 | 
            +
                        violation_kind_id: row['inspection_violation']
         | 
| 57 | 
            +
                      )
         | 
| 58 | 
            +
                    end
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  # @return [Enumerable<ViolationKindData>]
         | 
| 62 | 
            +
                  # @todo Add to AbstractAdapter
         | 
| 63 | 
            +
                  def violation_kinds
         | 
| 64 | 
            +
                    lazy_csv_map('restaurant_violations.csv') do |row|
         | 
| 65 | 
            +
                      Eaternet::Prototype::ViolationKindData.new(
         | 
| 66 | 
            +
                        orig_key: row['violation_id'],
         | 
| 67 | 
            +
                        code: row['violation_code'],
         | 
| 68 | 
            +
                        demerits: row['violation_demerits'],
         | 
| 69 | 
            +
                        description: row['violation_description']
         | 
| 70 | 
            +
                      )
         | 
| 71 | 
            +
                    end
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  private
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  def lazy_csv_map(filename, &block)
         | 
| 77 | 
            +
                    csv_rows(filename).lazy.map { |row| block.call(row) }
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  def csv_rows(filename)
         | 
| 81 | 
            +
                    csv_reader(
         | 
| 82 | 
            +
                      path: File.join(zip_dir, filename),
         | 
| 83 | 
            +
                      headers: SnhdConfig::CSV_SCHEMA[filename]
         | 
| 84 | 
            +
                    )
         | 
| 85 | 
            +
                  end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  def csv_reader(path:, headers:)
         | 
| 88 | 
            +
                    file = open(path, encoding: 'utf-8')
         | 
| 89 | 
            +
                    file.readline  # Skip the non-standard header line
         | 
| 90 | 
            +
                    CSV.new(
         | 
| 91 | 
            +
                      file,
         | 
| 92 | 
            +
                      headers: headers,
         | 
| 93 | 
            +
                      col_sep: SnhdConfig::COLUMN_SEPARATOR,
         | 
| 94 | 
            +
                      quote_char: SnhdConfig::QUOTE_CHARACTER
         | 
| 95 | 
            +
                    )
         | 
| 96 | 
            +
                  end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                  def zip_dir
         | 
| 99 | 
            +
                    @zip_dir ||= Util.download_and_extract_zipfile(SnhdConfig::DOWNLOAD_URL)
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
                end
         | 
| 102 | 
            +
              end
         | 
| 103 | 
            +
            end
         | 
    
        data/lib/eaternet/version.rb
    CHANGED
    
    
    
        data/lib/eaternet.rb
    CHANGED
    
    | @@ -1,6 +1,5 @@ | |
| 1 1 | 
             
            require 'eaternet/agencies/nyc'
         | 
| 2 2 | 
             
            require 'eaternet/agencies/snhd'
         | 
| 3 | 
            -
            require 'eaternet/agencies/snhd_lives'
         | 
| 4 3 |  | 
| 5 4 | 
             
            module Eaternet
         | 
| 6 5 | 
             
              # Make the actual adapters easily available
         | 
| @@ -8,7 +7,6 @@ module Eaternet | |
| 8 7 | 
             
              #
         | 
| 9 8 | 
             
              # * `Eaternet::Nyc`
         | 
| 10 9 | 
             
              # * `Eaternet::Snhd`
         | 
| 11 | 
            -
              # * `Eaternet::SnhdLives`
         | 
| 12 10 | 
             
              include Eaternet::Agencies
         | 
| 13 11 | 
             
            end
         | 
| 14 12 |  | 
| @@ -0,0 +1,128 @@ | |
| 1 | 
            +
            require 'test_helper'
         | 
| 2 | 
            +
            require 'eaternet/agencies/snhd_prototype'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            class SnhdPrototypeAdapterTest < Minitest::Test
         | 
| 6 | 
            +
              @@snhd_prototype = Eaternet::Agencies::SnhdPrototype.new
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              #
         | 
| 9 | 
            +
              # Namespace and access
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              def test_global_namespace_not_polluted
         | 
| 13 | 
            +
                assert_raises(NameError) { SnhdPrototype }
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              #
         | 
| 17 | 
            +
              # #businesses
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              def test_businesses_returns_an_enumerator
         | 
| 21 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 22 | 
            +
                  assert_kind_of Enumerable, @@snhd_prototype.businesses
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def test_businesses_returns_business_data_objects
         | 
| 27 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 28 | 
            +
                  assert_kind_of Eaternet::Prototype::BusinessData, @@snhd_prototype.businesses.first
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def test_businesses_returns_correct_data
         | 
| 33 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 34 | 
            +
                  b = @@snhd_prototype.businesses.first
         | 
| 35 | 
            +
                  assert_equal 'PR0000002', b.orig_key
         | 
| 36 | 
            +
                  assert_equal "McDonald's #3549 D HOTEL", b.name
         | 
| 37 | 
            +
                  assert_equal '301 Fremont St', b.address
         | 
| 38 | 
            +
                  assert_equal 'Las Vegas', b.city
         | 
| 39 | 
            +
                  assert_equal '89101-5600', b.zipcode
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
              end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              #
         | 
| 44 | 
            +
              # #inspections
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              def test_inspections_returns_an_enumerable
         | 
| 48 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 49 | 
            +
                  assert_kind_of Enumerable, @@snhd_prototype.inspections
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              def test_inspections_returns_inspection_data_objects
         | 
| 54 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 55 | 
            +
                  assert_kind_of(
         | 
| 56 | 
            +
                    Eaternet::Prototype::InspectionData,
         | 
| 57 | 
            +
                    @@snhd_prototype.inspections.first
         | 
| 58 | 
            +
                  )
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              def test_inspections_returns_correct_data
         | 
| 63 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 64 | 
            +
                  i = @@snhd_prototype.inspections.first(6).last
         | 
| 65 | 
            +
                  assert_equal 'DA0001095', i.orig_key
         | 
| 66 | 
            +
                  assert_equal 'PR0000411', i.business_orig_key
         | 
| 67 | 
            +
                  assert_equal 'A', i.score
         | 
| 68 | 
            +
                  assert_equal '1994-04-15 00:00:00', i.date
         | 
| 69 | 
            +
                end
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              #
         | 
| 73 | 
            +
              # #violations
         | 
| 74 | 
            +
              #
         | 
| 75 | 
            +
             | 
| 76 | 
            +
              def test_violations_returns_an_enumerable
         | 
| 77 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 78 | 
            +
                  assert_kind_of Enumerable, @@snhd_prototype.violations
         | 
| 79 | 
            +
                end
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              def test_violations_returns_violation_data_objects
         | 
| 83 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 84 | 
            +
                  assert_kind_of Eaternet::Prototype::ViolationData, @@snhd_prototype.violations.first
         | 
| 85 | 
            +
                end
         | 
| 86 | 
            +
              end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
              def test_violations_returns_correct_data
         | 
| 89 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 90 | 
            +
                  v = @@snhd_prototype.violations.first
         | 
| 91 | 
            +
                  assert_equal '1488', v.orig_key
         | 
| 92 | 
            +
                  assert_equal '537', v.inspection_id
         | 
| 93 | 
            +
                  assert_equal '64', v.violation_kind_id
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
              #
         | 
| 98 | 
            +
              # #violation_kinds
         | 
| 99 | 
            +
              #
         | 
| 100 | 
            +
             | 
| 101 | 
            +
              def test_violation_kinds_returns_an_enumerable
         | 
| 102 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 103 | 
            +
                  assert_kind_of Enumerable, @@snhd_prototype.violation_kinds
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
              end
         | 
| 106 | 
            +
             | 
| 107 | 
            +
              def test_violation_kinds_returns_violation_kind_data_objects
         | 
| 108 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 109 | 
            +
                  assert_kind_of(
         | 
| 110 | 
            +
                    Eaternet::Prototype::ViolationKindData,
         | 
| 111 | 
            +
                    @@snhd_prototype.violation_kinds.first
         | 
| 112 | 
            +
                  )
         | 
| 113 | 
            +
                end
         | 
| 114 | 
            +
              end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
              def test_violation_kinds_returns_correct_data
         | 
| 117 | 
            +
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 118 | 
            +
                  v = @@snhd_prototype.violation_kinds.first
         | 
| 119 | 
            +
                  assert_equal '1', v.orig_key
         | 
| 120 | 
            +
                  assert_equal '1', v.code
         | 
| 121 | 
            +
                  assert_equal '6', v.demerits
         | 
| 122 | 
            +
                  assert_equal(
         | 
| 123 | 
            +
                    'Food not obtained from approved sources and/or improperly identified.',
         | 
| 124 | 
            +
                    v.description
         | 
| 125 | 
            +
                  )
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
              end
         | 
| 128 | 
            +
            end
         | 
| @@ -1,130 +1,77 @@ | |
| 1 1 | 
             
            require 'test_helper'
         | 
| 2 2 | 
             
            require 'eaternet'
         | 
| 3 3 |  | 
| 4 | 
            -
            #  | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
            class SnhdAdapterTest < Minitest::Test
         | 
| 4 | 
            +
            # @todo Create proper integration vs. unit tests.
         | 
| 5 | 
            +
            class SnhdTest < Minitest::Test
         | 
| 6 | 
            +
              # Instantiating as an app developer would:
         | 
| 8 7 | 
             
              @@snhd = Eaternet::Snhd.new
         | 
| 9 8 |  | 
| 10 9 | 
             
              #
         | 
| 11 | 
            -
              #  | 
| 12 | 
            -
              #
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              def test_global_namespace_not_polluted
         | 
| 15 | 
            -
                assert_raises(NameError) { Snhd }
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              #
         | 
| 19 | 
            -
              # #businesses
         | 
| 10 | 
            +
              # Businesses
         | 
| 20 11 | 
             
              #
         | 
| 21 12 |  | 
| 22 | 
            -
              def  | 
| 13 | 
            +
              def test_businesses_returns_an_enumerator_of_business
         | 
| 23 14 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 24 | 
            -
                   | 
| 15 | 
            +
                  assert enumerable_of? Eaternet::Lives_1_0::Business, @@snhd.businesses
         | 
| 25 16 | 
             
                end
         | 
| 26 17 | 
             
              end
         | 
| 27 18 |  | 
| 28 | 
            -
              def  | 
| 29 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 30 | 
            -
                  assert_kind_of Eaternet::Prototype::BusinessData, @@snhd.businesses.first
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
              def test_businesses_returns_correct_data
         | 
| 19 | 
            +
              def test_businesses_returns_lives_attributes
         | 
| 35 20 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 36 21 | 
             
                  b = @@snhd.businesses.first
         | 
| 37 | 
            -
                  assert_equal 'PR0000002', b. | 
| 22 | 
            +
                  assert_equal 'PR0000002', b.business_id
         | 
| 38 23 | 
             
                  assert_equal "McDonald's #3549 D HOTEL", b.name
         | 
| 39 24 | 
             
                  assert_equal '301 Fremont St', b.address
         | 
| 40 25 | 
             
                  assert_equal 'Las Vegas', b.city
         | 
| 41 | 
            -
                  assert_equal '89101-5600', b. | 
| 26 | 
            +
                  assert_equal '89101-5600', b.postal_code
         | 
| 27 | 
            +
                  assert_equal 'NV', b.state
         | 
| 42 28 | 
             
                end
         | 
| 43 29 | 
             
              end
         | 
| 44 30 |  | 
| 45 31 | 
             
              #
         | 
| 46 | 
            -
              #  | 
| 32 | 
            +
              # Inspections
         | 
| 47 33 | 
             
              #
         | 
| 48 34 |  | 
| 49 | 
            -
              def  | 
| 50 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 51 | 
            -
                  assert_kind_of Enumerable, @@snhd.inspections
         | 
| 52 | 
            -
                end
         | 
| 53 | 
            -
              end
         | 
| 54 | 
            -
             | 
| 55 | 
            -
              def test_inspections_returns_inspection_data_objects
         | 
| 35 | 
            +
              def test_inspections_returns_an_enumerable_of_inspection
         | 
| 56 36 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 57 | 
            -
                   | 
| 58 | 
            -
                    Eaternet::Prototype::InspectionData,
         | 
| 59 | 
            -
                    @@snhd.inspections.first
         | 
| 60 | 
            -
                  )
         | 
| 37 | 
            +
                  assert enumerable_of? Eaternet::Lives_1_0::Inspection, @@snhd.inspections
         | 
| 61 38 | 
             
                end
         | 
| 62 39 | 
             
              end
         | 
| 63 40 |  | 
| 64 | 
            -
              def  | 
| 41 | 
            +
              def test_inspections_returns_lives_attributes
         | 
| 65 42 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 66 43 | 
             
                  i = @@snhd.inspections.first(6).last
         | 
| 67 | 
            -
                  assert_equal ' | 
| 68 | 
            -
                  assert_equal  | 
| 69 | 
            -
                  assert_equal  | 
| 70 | 
            -
                  assert_equal '1994-04-15 00:00:00', i.date
         | 
| 44 | 
            +
                  assert_equal 'PR0000411', i.business_id
         | 
| 45 | 
            +
                  assert_equal Date.new(1994, 04, 15), i.date
         | 
| 46 | 
            +
                  assert_equal 96, i.score
         | 
| 71 47 | 
             
                end
         | 
| 72 48 | 
             
              end
         | 
| 73 49 |  | 
| 74 50 | 
             
              #
         | 
| 75 | 
            -
              #  | 
| 51 | 
            +
              # Violations
         | 
| 76 52 | 
             
              #
         | 
| 77 53 |  | 
| 78 | 
            -
              def  | 
| 54 | 
            +
              def test_violations_returns_an_enumerable_of_violation
         | 
| 79 55 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 80 | 
            -
                   | 
| 56 | 
            +
                  assert enumerable_of? Eaternet::Lives_1_0::Violation, @@snhd.violations
         | 
| 81 57 | 
             
                end
         | 
| 82 58 | 
             
              end
         | 
| 83 59 |  | 
| 84 | 
            -
              def  | 
| 85 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 86 | 
            -
                  assert_kind_of Eaternet::Prototype::ViolationData, @@snhd.violations.first
         | 
| 87 | 
            -
                end
         | 
| 88 | 
            -
              end
         | 
| 89 | 
            -
             | 
| 90 | 
            -
              def test_violations_returns_correct_data
         | 
| 60 | 
            +
              def test_violations_returns_lives_attributes
         | 
| 91 61 | 
             
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 92 62 | 
             
                  v = @@snhd.violations.first
         | 
| 93 | 
            -
                  assert_equal ' | 
| 94 | 
            -
                  assert_equal  | 
| 95 | 
            -
                  assert_equal ' | 
| 63 | 
            +
                  assert_equal 'PR0000411', v.business_id
         | 
| 64 | 
            +
                  assert_equal Date.new(1994, 4, 13), v.date
         | 
| 65 | 
            +
                  assert_equal '8', v.code
         | 
| 66 | 
            +
                  assert_match /hazardous salads/, v.description
         | 
| 96 67 | 
             
                end
         | 
| 97 68 | 
             
              end
         | 
| 98 69 |  | 
| 99 70 | 
             
              #
         | 
| 100 | 
            -
              #  | 
| 71 | 
            +
              # metadata
         | 
| 101 72 | 
             
              #
         | 
| 102 73 |  | 
| 103 | 
            -
              def  | 
| 104 | 
            -
                 | 
| 105 | 
            -
                  assert_kind_of Enumerable, @@snhd.violation_kinds
         | 
| 106 | 
            -
                end
         | 
| 107 | 
            -
              end
         | 
| 108 | 
            -
             | 
| 109 | 
            -
              def test_violation_kinds_returns_violation_kind_data_objects
         | 
| 110 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 111 | 
            -
                  assert_kind_of(
         | 
| 112 | 
            -
                    Eaternet::Prototype::ViolationKindData,
         | 
| 113 | 
            -
                    @@snhd.violation_kinds.first
         | 
| 114 | 
            -
                  )
         | 
| 115 | 
            -
                end
         | 
| 116 | 
            -
              end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
              def test_violation_kinds_returns_correct_data
         | 
| 119 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 120 | 
            -
                  v = @@snhd.violation_kinds.first
         | 
| 121 | 
            -
                  assert_equal '1', v.orig_key
         | 
| 122 | 
            -
                  assert_equal '1', v.code
         | 
| 123 | 
            -
                  assert_equal '6', v.demerits
         | 
| 124 | 
            -
                  assert_equal(
         | 
| 125 | 
            -
                    'Food not obtained from approved sources and/or improperly identified.',
         | 
| 126 | 
            -
                    v.description
         | 
| 127 | 
            -
                  )
         | 
| 128 | 
            -
                end
         | 
| 74 | 
            +
              def test_implements_feed_info
         | 
| 75 | 
            +
                assert_instance_of Eaternet::Lives_1_0::FeedInfo, @@snhd.feed_info
         | 
| 129 76 | 
             
              end
         | 
| 130 77 | 
             
            end
         | 
    
        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: 0. | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Robb Shecter
         | 
| @@ -140,16 +140,16 @@ dependencies: | |
| 140 140 | 
             
              name: activemodel
         | 
| 141 141 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 142 | 
             
                requirements:
         | 
| 143 | 
            -
                - - " | 
| 143 | 
            +
                - - ">="
         | 
| 144 144 | 
             
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version:  | 
| 145 | 
            +
                    version: 3.2.21
         | 
| 146 146 | 
             
              type: :runtime
         | 
| 147 147 | 
             
              prerelease: false
         | 
| 148 148 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 149 | 
             
                requirements:
         | 
| 150 | 
            -
                - - " | 
| 150 | 
            +
                - - ">="
         | 
| 151 151 | 
             
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version:  | 
| 152 | 
            +
                    version: 3.2.21
         | 
| 153 153 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 154 154 | 
             
              name: rubyzip
         | 
| 155 155 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -200,7 +200,7 @@ files: | |
| 200 200 | 
             
            - lib/eaternet/agencies/nyc.rb
         | 
| 201 201 | 
             
            - lib/eaternet/agencies/snhd.rb
         | 
| 202 202 | 
             
            - lib/eaternet/agencies/snhd_config.rb
         | 
| 203 | 
            -
            - lib/eaternet/agencies/ | 
| 203 | 
            +
            - lib/eaternet/agencies/snhd_prototype.rb
         | 
| 204 204 | 
             
            - lib/eaternet/lives_1_0.rb
         | 
| 205 205 | 
             
            - lib/eaternet/lives_1_0/adapter.rb
         | 
| 206 206 | 
             
            - lib/eaternet/lives_1_0/business.rb
         | 
| @@ -216,7 +216,7 @@ files: | |
| 216 216 | 
             
            - lib/eaternet/version.rb
         | 
| 217 217 | 
             
            - lib/ext/enumerator.rb
         | 
| 218 218 | 
             
            - test/eaternet/agencies/nyc_test.rb
         | 
| 219 | 
            -
            - test/eaternet/agencies/ | 
| 219 | 
            +
            - test/eaternet/agencies/snhd_prototype_test.rb
         | 
| 220 220 | 
             
            - test/eaternet/agencies/snhd_test.rb
         | 
| 221 221 | 
             
            - test/eaternet/eaternet_test.rb
         | 
| 222 222 | 
             
            - test/eaternet/lives_1_0/business_test.rb
         | 
| @@ -255,7 +255,7 @@ specification_version: 4 | |
| 255 255 | 
             
            summary: Regional adapters for restaurant health scores
         | 
| 256 256 | 
             
            test_files:
         | 
| 257 257 | 
             
            - test/eaternet/agencies/nyc_test.rb
         | 
| 258 | 
            -
            - test/eaternet/agencies/ | 
| 258 | 
            +
            - test/eaternet/agencies/snhd_prototype_test.rb
         | 
| 259 259 | 
             
            - test/eaternet/agencies/snhd_test.rb
         | 
| 260 260 | 
             
            - test/eaternet/eaternet_test.rb
         | 
| 261 261 | 
             
            - test/eaternet/lives_1_0/business_test.rb
         | 
| @@ -268,4 +268,3 @@ test_files: | |
| 268 268 | 
             
            - test/fixtures/morris-park-bake-shop.csv
         | 
| 269 269 | 
             
            - test/script.rb
         | 
| 270 270 | 
             
            - test/test_helper.rb
         | 
| 271 | 
            -
            has_rdoc: 
         | 
| @@ -1,106 +0,0 @@ | |
| 1 | 
            -
            require 'date'
         | 
| 2 | 
            -
            require 'eaternet/loggable'
         | 
| 3 | 
            -
            require 'eaternet/util'
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            module Eaternet
         | 
| 6 | 
            -
              module Agencies
         | 
| 7 | 
            -
                class SnhdLives < Eaternet::Lives_1_0::Adapter
         | 
| 8 | 
            -
                  include Eaternet::Lives_1_0
         | 
| 9 | 
            -
                  include Eaternet::Loggable
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def initialize
         | 
| 12 | 
            -
                    @prototype = Eaternet::Agencies::Snhd.new
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def businesses
         | 
| 16 | 
            -
                    @prototype.businesses
         | 
| 17 | 
            -
                      .map { |proto| try_to_create_business(proto) }
         | 
| 18 | 
            -
                  end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  def inspections
         | 
| 21 | 
            -
                    @prototype.inspections
         | 
| 22 | 
            -
                      .map { |proto| try_to_create_inspection(proto) }
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def try_to_create_business(proto)
         | 
| 26 | 
            -
                    business(proto)
         | 
| 27 | 
            -
                  rescue ArgumentError => e
         | 
| 28 | 
            -
                    logger.warn('SNHD LIVES adapter') do
         | 
| 29 | 
            -
                      "Could not create a LIVES Business from #{proto.inspect}: #{e}"
         | 
| 30 | 
            -
                    end
         | 
| 31 | 
            -
                    nil
         | 
| 32 | 
            -
                  end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  def try_to_create_inspection(proto)
         | 
| 35 | 
            -
                    inspection(proto)
         | 
| 36 | 
            -
                  rescue ArgumentError => e
         | 
| 37 | 
            -
                    logger.warn('SNHD LIVES adapter') do
         | 
| 38 | 
            -
                      "Could not create a LIVES Inspection from #{proto.inspect}: #{e}"
         | 
| 39 | 
            -
                    end
         | 
| 40 | 
            -
                    nil
         | 
| 41 | 
            -
                  end
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  def business(proto)
         | 
| 44 | 
            -
                    Business.new do |b|
         | 
| 45 | 
            -
                      b.business_id = proto.orig_key
         | 
| 46 | 
            -
                      b.name =    proto.name
         | 
| 47 | 
            -
                      b.address = proto.address
         | 
| 48 | 
            -
                      b.city =    proto.city
         | 
| 49 | 
            -
                      b.postal_code = proto.zipcode
         | 
| 50 | 
            -
                      b.state = 'NV'
         | 
| 51 | 
            -
                    end
         | 
| 52 | 
            -
                  end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
                  def inspection(proto)
         | 
| 55 | 
            -
                    Inspection.new do |i|
         | 
| 56 | 
            -
                      i.business_id = proto.business_orig_key
         | 
| 57 | 
            -
                      i.score = proto.demerits.nil? ? nil : 100 - proto.demerits.to_i
         | 
| 58 | 
            -
                      i.date = Date.parse(proto.date)
         | 
| 59 | 
            -
                    end
         | 
| 60 | 
            -
                  end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
                  def violations
         | 
| 63 | 
            -
                    @violations ||= _violations
         | 
| 64 | 
            -
                  end
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                  def feed_info
         | 
| 67 | 
            -
                    FeedInfo.new do |fi|
         | 
| 68 | 
            -
                      fi.feed_date = Date.today
         | 
| 69 | 
            -
                      fi.feed_version = '1.0'
         | 
| 70 | 
            -
                      fi.municipality_name = 'Southern Nevada'
         | 
| 71 | 
            -
                      fi.municipality_url = 'http://southernnevadahealthdistrict.org/restaurants/index.php'
         | 
| 72 | 
            -
                      fi.contact_email = 'environmentalhealth@snhdmail.org'
         | 
| 73 | 
            -
                    end
         | 
| 74 | 
            -
                  end
         | 
| 75 | 
            -
             | 
| 76 | 
            -
                  def legends
         | 
| 77 | 
            -
                    []
         | 
| 78 | 
            -
                  end
         | 
| 79 | 
            -
             | 
| 80 | 
            -
                  def _violations
         | 
| 81 | 
            -
                    violation_kinds = {}
         | 
| 82 | 
            -
                    @prototype.violation_kinds.each do |vk|
         | 
| 83 | 
            -
                      violation_kinds[vk.orig_key] = vk
         | 
| 84 | 
            -
                    end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                    result = []
         | 
| 87 | 
            -
             | 
| 88 | 
            -
                    @prototype.inspections.each do |proto_inspection|
         | 
| 89 | 
            -
                      proto_inspection.violations.each do |kind_id|
         | 
| 90 | 
            -
                        begin
         | 
| 91 | 
            -
                          result << Violation.new do |v|
         | 
| 92 | 
            -
                            v.business_id = proto_inspection.business_orig_key
         | 
| 93 | 
            -
                            v.date =        Date.parse(proto_inspection.date)
         | 
| 94 | 
            -
                            v.code =        violation_kinds[kind_id].code
         | 
| 95 | 
            -
                            v.description = violation_kinds[kind_id].description
         | 
| 96 | 
            -
                          end
         | 
| 97 | 
            -
                        rescue NoMethodError => e
         | 
| 98 | 
            -
                          logger.debug "Error creating violation kind #{kind_id} for inspection #{proto_inspection.orig_key}: #{e}"
         | 
| 99 | 
            -
                        end
         | 
| 100 | 
            -
                      end
         | 
| 101 | 
            -
                    end
         | 
| 102 | 
            -
                    result
         | 
| 103 | 
            -
                  end
         | 
| 104 | 
            -
                end
         | 
| 105 | 
            -
              end
         | 
| 106 | 
            -
            end
         | 
| @@ -1,75 +0,0 @@ | |
| 1 | 
            -
            require 'test_helper'
         | 
| 2 | 
            -
            require 'eaternet'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            class SnhdLivesTest < Minitest::Test
         | 
| 5 | 
            -
              @@snhd = Eaternet::SnhdLives.new
         | 
| 6 | 
            -
             | 
| 7 | 
            -
              #
         | 
| 8 | 
            -
              # Businesses
         | 
| 9 | 
            -
              #
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              def test_businesses_returns_an_enumerator_of_business
         | 
| 12 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 13 | 
            -
                  assert enumerable_of? Eaternet::Lives_1_0::Business, @@snhd.businesses
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              def test_businesses_returns_lives_attributes
         | 
| 18 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 19 | 
            -
                  b = @@snhd.businesses.first
         | 
| 20 | 
            -
                  assert_equal 'PR0000002', b.business_id
         | 
| 21 | 
            -
                  assert_equal "McDonald's #3549 D HOTEL", b.name
         | 
| 22 | 
            -
                  assert_equal '301 Fremont St', b.address
         | 
| 23 | 
            -
                  assert_equal 'Las Vegas', b.city
         | 
| 24 | 
            -
                  assert_equal '89101-5600', b.postal_code
         | 
| 25 | 
            -
                  assert_equal 'NV', b.state
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              #
         | 
| 30 | 
            -
              # Inspections
         | 
| 31 | 
            -
              #
         | 
| 32 | 
            -
             | 
| 33 | 
            -
              def test_inspections_returns_an_enumerable_of_inspection
         | 
| 34 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 35 | 
            -
                  assert enumerable_of? Eaternet::Lives_1_0::Inspection, @@snhd.inspections
         | 
| 36 | 
            -
                end
         | 
| 37 | 
            -
              end
         | 
| 38 | 
            -
             | 
| 39 | 
            -
              def test_inspections_returns_lives_attributes
         | 
| 40 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 41 | 
            -
                  i = @@snhd.inspections.first(6).last
         | 
| 42 | 
            -
                  assert_equal 'PR0000411', i.business_id
         | 
| 43 | 
            -
                  assert_equal Date.new(1994, 04, 15), i.date
         | 
| 44 | 
            -
                  assert_equal 96, i.score
         | 
| 45 | 
            -
                end
         | 
| 46 | 
            -
              end
         | 
| 47 | 
            -
             | 
| 48 | 
            -
              #
         | 
| 49 | 
            -
              # Violations
         | 
| 50 | 
            -
              #
         | 
| 51 | 
            -
             | 
| 52 | 
            -
              def test_violations_returns_an_enumerable_of_violation
         | 
| 53 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 54 | 
            -
                  assert enumerable_of? Eaternet::Lives_1_0::Violation, @@snhd.violations
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              def test_violations_returns_lives_attributes
         | 
| 59 | 
            -
                VCR.use_cassette(SNHD_CASSETTE) do
         | 
| 60 | 
            -
                  v = @@snhd.violations.first
         | 
| 61 | 
            -
                  assert_equal 'PR0000411', v.business_id
         | 
| 62 | 
            -
                  assert_equal Date.new(1994, 4, 13), v.date
         | 
| 63 | 
            -
                  assert_equal '8', v.code
         | 
| 64 | 
            -
                  assert_match /hazardous salads/, v.description
         | 
| 65 | 
            -
                end
         | 
| 66 | 
            -
              end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              #
         | 
| 69 | 
            -
              # metadata
         | 
| 70 | 
            -
              #
         | 
| 71 | 
            -
             | 
| 72 | 
            -
              def test_implements_feed_info
         | 
| 73 | 
            -
                assert_instance_of Eaternet::Lives_1_0::FeedInfo, @@snhd.feed_info
         | 
| 74 | 
            -
              end
         | 
| 75 | 
            -
            end
         |