From 4588d45658e15111d53839ead07ff9f0f9e81d1f Mon Sep 17 00:00:00 2001 From: Flavien Raynaud Date: Sat, 12 Sep 2015 20:40:38 +0200 Subject: [PATCH] do not raise exception when an optional source file is missing --- lib/gtfs/source.rb | 19 ++++++++++-------- .../valid_gtfs_missing_optional_files.zip | Bin 0 -> 4147 bytes spec/gtfs/source_spec.rb | 17 +++++++++++++++- 3 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 spec/fixtures/valid_gtfs_missing_optional_files.zip 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 0000000000000000000000000000000000000000..6fab8ea346d505931f55686be0d2cca7a3ee4799 GIT binary patch literal 4147 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 literal 0 HcmV?d00001 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