Skip to content
This repository has been archived by the owner on Nov 28, 2024. It is now read-only.

Commit

Permalink
Invalid schema fix #186
Browse files Browse the repository at this point in the history
Fix of error where uploading an invalid .json schema  (empty or
corrupted) from local filestore did not trigger an invalid JSON warning.
  • Loading branch information
bcouston committed Jul 8, 2015
1 parent 1ade457 commit 8df5d53
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 33 deletions.
8 changes: 5 additions & 3 deletions app/controllers/package_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,12 @@ def create
redirect_to root_path and return if io.nil?

if params[:format] == "json"
byebug
@package = Package.create
@package.delay.create_package(io, @schema_url, @schema)
@package.delay.create_package(io, @schema_url, @schema_file_field, @schema)
else
package = Package.create
package.create_package(io, @schema_url, @schema)
package.create_package(io, @schema_url, @schema_file_field, @schema)

if package.validations.count == 1
redirect_to validation_path(package.validations.first)
Expand Down Expand Up @@ -96,11 +97,12 @@ def load_schema
end
# Get schema URL from parameters
@schema_url = params[:schema_url]
@schema_file_field = params[:schema_data]
end

def check_for_package
sources = params[:urls].presence || params[:files].presence
Package.create_package( sources, params[:schema_url], @schema )
Package.create_package( sources, params[:schema_url], params[:schema_file], @schema )
end

def read_files(data)
Expand Down
46 changes: 23 additions & 23 deletions app/models/package.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ class LocalDataset < DataKitten::Dataset
def origin
:local
end

def publishing_format
:datapackage
end
Expand All @@ -31,34 +31,34 @@ def parse_package(dataset, validations)
return attributes
end

def create_package(sources, schema_url = nil, schema = nil)
return nil if sources.count == 0
def create_package(sources, schema_url = nil, schema_file_field = nil, schema = nil)
return nil if sources.count == 0

if sources.first.class == Hash
sources.map! { |io|
sources.map! { |io|
{
:body => Mongoid::GridFs.get(io[:csv_id]).data,
:csv_id => io[:csv_id],
:filename => io[:filename]
}
}
}
end

if sources.count == 1 && possible_package?(sources.first)
dataset = create_dataset(sources.first)
return create_datapackage(dataset) unless dataset.nil?
end
end

update_attributes({ type: set_type(sources) })

sources.each do |source|
validations << Validation.create_validation(source, schema_url, schema)
validations << Validation.create_validation(source, schema_url, schema_file_field, schema)
end

save
self
end

def create_dataset(source)
if source.respond_to?(:body)
dataset = LocalDataset.new(access_url: source.string_io)
Expand All @@ -68,37 +68,37 @@ def create_dataset(source)
return nil unless [:ckan, :datapackage].include? dataset.publishing_format
dataset
end
def create_datapackage(dataset)

def create_datapackage(dataset)
validations = create_validations(dataset)

return nil if validations.count == 0

update_attributes( parse_package(dataset, validations) )
save
self
end

def create_validations(dataset)
validations = []
dataset.distributions.each do |distribution|
if can_validate?(distribution)
validations << Validation.create_validation(distribution.access_url, nil, create_schema(distribution) )
validations << Validation.create_validation(distribution.access_url, nil, nil, create_schema(distribution) )
end
end
validations
end

def possible_package?(source)
source.class == String || local_package?( source )
end

def local_package?(source)
source.respond_to?(:string_io) && source.filename =~ /datapackage\.json/
end
end

def set_type(sources)
return "files" if sources.first.respond_to?(:tempfile)
return "files" if sources.first.respond_to?(:tempfile)
return "urls" if sources.first.class == String
end

Expand All @@ -109,7 +109,7 @@ def can_validate?(distribution)

def create_schema(distribution)
unless distribution.schema.nil?
schema = Csvlint::Schema.from_json_table(nil, distribution.schema)
schema = Csvlint::Schema.from_json_table(nil, distribution.schema)
end
return schema
end
Expand Down
14 changes: 7 additions & 7 deletions app/models/validation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class Validation

belongs_to :package

def self.validate(io, schema_url = nil, schema = nil, dialect = nil)
def self.validate(io, schema_url = nil, schema_file_field = nil, schema = nil, dialect = nil)
if io.respond_to?(:tempfile)
filename = io.original_filename
csv = File.new(io.tempfile)
Expand All @@ -27,7 +27,7 @@ def self.validate(io, schema_url = nil, schema = nil, dialect = nil)
end
# Validate
validator = Csvlint::Validator.new( io, dialect, schema && schema.fields.empty? ? nil : schema )
check_schema(validator, schema) unless schema_url.blank?
check_schema(validator, schema) unless (schema_url.blank? && schema_file_field.blank?)
check_dialect(validator, dialect) unless dialect.blank?
state = "valid"
state = "warnings" unless validator.warnings.empty?
Expand Down Expand Up @@ -100,24 +100,24 @@ def self.standard_dialect
}
end

def self.create_validation(io, schema_url = nil, schema = nil)
def self.create_validation(io, schema_url = nil, schema_file_field = nil, schema = nil)
if io.class == String
validation = Validation.find_or_initialize_by(url: io)
else
validation = Validation.create
end
validation.validate(io, schema_url, schema)
validation.validate(io, schema_url, schema_file_field, schema)
validation
end

def validate(io, schema_url = nil, schema = nil)
validation = Validation.validate(io, schema_url, schema)
def validate(io, schema_url = nil, schema_file_field = nil, schema = nil)
validation = Validation.validate(io, schema_url, schema_file_field, schema)
self.update_attributes(validation)
end

def update_validation(dialect = nil)
loaded_schema = schema ? Csvlint::Schema.load_from_json_table(schema.url) : nil
validation = Validation.validate(self.url || self.csv, schema.try(:url), loaded_schema, dialect)
validation = Validation.validate(self.url || self.csv, schema.try(:url), nil, loaded_schema, dialect)
self.update_attributes(validation)
self
end
Expand Down

0 comments on commit 8df5d53

Please sign in to comment.