diff --git a/lib/gtfs/source.rb b/lib/gtfs/source.rb index a2c7818..648f913 100644 --- a/lib/gtfs/source.rb +++ b/lib/gtfs/source.rb @@ -1,5 +1,6 @@ require 'tmpdir' require 'fileutils' +require 'stringio' require 'zip' module GTFS @@ -57,14 +58,14 @@ def entries Dir.entries(@tmp_dir) end - def raise_if_missing_source(filename) - file_missing = !entries.include?(filename) - raise InvalidSourceException.new("Missing required source file: #{filename}") if file_missing + def raise_if_required_source(entity) + raise InvalidSourceException.new("Missing required source file: #{entity.filename}") if entity.required_file? end ENTITIES.each do |entity| define_method entity.name.to_sym do - parse_file entity.filename do |f| + parse_entity entity do |f| + files[entity.filename] ||= f entity.send("parse_#{entity.name}".to_sym, f.read, options) end end @@ -78,10 +79,12 @@ def files @files ||= {} end - def parse_file(filename) - raise_if_missing_source filename - open File.join(@tmp_dir, '/', filename), 'r:bom|utf-8' do |f| - files[filename] ||= yield f + def parse_entity(entity) + if entries.include?(entity.filename) + yield open(File.join(@tmp_dir, entity.filename), 'r:bom|utf-8') + else + raise_if_required_source entity + yield StringIO.new end end end diff --git a/spec/fixtures/valid_gtfs_missing_optional_files.zip b/spec/fixtures/valid_gtfs_missing_optional_files.zip new file mode 100644 index 0000000..6fab8ea Binary files /dev/null and b/spec/fixtures/valid_gtfs_missing_optional_files.zip differ diff --git a/spec/gtfs/source_spec.rb b/spec/gtfs/source_spec.rb index 934b03f..e467d42 100644 --- a/spec/gtfs/source_spec.rb +++ b/spec/gtfs/source_spec.rb @@ -5,10 +5,14 @@ File.expand_path(File.dirname(__FILE__) + '/../fixtures/valid_gtfs.zip') end - let(:source_missing_required_files) do + let(:source_missing_required_files) do File.expand_path(File.dirname(__FILE__) + '/../fixtures/missing_files.zip') end + let (:valid_local_source_missing_optional_files) do + File.expand_path(File.dirname(__FILE__) + '/../fixtures/valid_gtfs_missing_optional_files.zip') + end + describe '#build' do let(:opts) {{}} let(:data_source) {valid_local_source} @@ -78,4 +82,15 @@ describe '#stop_times' do end + + describe '#transfers' do + subject {source.transfers} + + context 'when the source is missing transfers' do + let(:source) { GTFS::Source.build valid_local_source_missing_optional_files } + + it {should_not raise_exception GTFS::InvalidSourceException} + it {should be_empty} + end + end end