lib/csvlint/schema.rb in csvlint-0.1.4 vs lib/csvlint/schema.rb in csvlint-0.2.0
- old
+ new
@@ -12,22 +12,60 @@
@title = title
@description = description
reset
end
- def validate_header(header)
+ class << self
+
+ 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
+
+ def from_csvw_metadata(uri, json)
+ return Csvlint::Csvw::TableGroup.from_json(uri, json)
+ end
+
+ def load_from_json(uri)
+ 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 => e
+ raise e
+ rescue => e
+ STDERR.puts e.class
+ STDERR.puts e.message
+ STDERR.puts e.backtrace
+ return Schema.new(nil, [], "malformed", "malformed")
+ end
+ end
+
+ end
+
+ 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
- def validate_row(values, row=nil, all_errors=[])
+ 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
@@ -44,30 +82,9 @@
@errors += fields[i].errors
@warnings += fields[i].warnings
end
return valid?
- end
-
- def Schema.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
-
- # Difference in functionality between from_json_table and load_from_json_table
- # needs to be specified
-
- def Schema.load_from_json_table(uri)
- begin
- json = JSON.parse( open(uri).read )
- return Schema.from_json_table(uri,json)
- rescue
- return Schema.new(nil, [], "malformed", "malformed")
- end
end
end
end