class Csvlint::Schema

Attributes

description[R]
fields[R]
title[R]
uri[R]

Public Class Methods

from_csvw_metadata(uri, json) click to toggle source
# File lib/csvlint/schema.rb, line 28
def from_csvw_metadata(uri, json)
  return Csvlint::Csvw::TableGroup.from_json(uri, json)
end
from_json_table(uri, json) click to toggle source
# File lib/csvlint/schema.rb, line 19
def from_json_table(uri, json)
  fields = []
  json["fields"].each do |field_desc|
    fields << Csvlint::Field.new( field_desc["name"] , field_desc["constraints"],
      field_desc["title"], field_desc["description"] )
  end if json["fields"]
  return Schema.new( uri , fields, json["title"], json["description"] )
end
load_from_json(uri, output_errors = true) click to toggle source
# File lib/csvlint/schema.rb, line 32
def load_from_json(uri, output_errors = true)
  begin
    json = JSON.parse( open(uri).read )
    if json["@context"]
      uri = "file:#{File.expand_path(uri)}" unless uri.to_s =~ /^http(s)?/
      return Schema.from_csvw_metadata(uri,json)
    else
      return Schema.from_json_table(uri,json)
    end
  rescue Csvlint::Csvw::MetadataError => e
    raise e
  rescue OpenURI::HTTPError, Errno::ENOENT => e
    raise e
  rescue => e
    if output_errors === true
      STDERR.puts e.class
      STDERR.puts e.message
      STDERR.puts e.backtrace
    end
    return Schema.new(nil, [], "malformed", "malformed")
  end
end
new(uri, fields=[], title=nil, description=nil) click to toggle source
# File lib/csvlint/schema.rb, line 9
def initialize(uri, fields=[], title=nil, description=nil)
  @uri = uri
  @fields = fields
  @title = title
  @description = description
  reset
end

Public Instance Methods

validate_header(header, source_url=nil) click to toggle source
# File lib/csvlint/schema.rb, line 57
def validate_header(header, source_url=nil)
  reset

  found_header = header.to_csv(:row_sep => '')
  expected_header = @fields.map{ |f| f.name }.to_csv(:row_sep => '')
  if found_header != expected_header
    build_warnings(:malformed_header, :schema, 1, nil, found_header, "expectedHeader" => expected_header)
  end
  return valid?
end
validate_row(values, row=nil, all_errors=[], source_url=nil) click to toggle source
# File lib/csvlint/schema.rb, line 68
def validate_row(values, row=nil, all_errors=[], source_url=nil)
  reset
  if values.length < fields.length
    fields[values.size..-1].each_with_index do |field, i|
      build_warnings(:missing_column, :schema, row, values.size+i+1)
    end
  end
  if values.length > fields.length
    values[fields.size..-1].each_with_index do |data_column, i|
      build_warnings(:extra_column, :schema, row, fields.size+i+1)
    end
  end

  fields.each_with_index do |field,i|
    value = values[i] || ""
    result = field.validate_column(value, row, i+1, all_errors)
    @errors += fields[i].errors
    @warnings += fields[i].warnings
  end

  return valid?
end