gtfs 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e6e202d40048ac060db1447f2e6f94c9202af70a
4
+ data.tar.gz: fc6e8e422d530776b6678e0f076aedf49e0d93a5
5
+ SHA512:
6
+ metadata.gz: f5fbc2249a9a049c462a4d71f94b301c9531c61f06f39ad8061fa49a03533ef8babd0fda2be26d3b19f6996a6436024a0f0a227fd5db4a16c1f00abcf937465d
7
+ data.tar.gz: 2645241ee7194a697fec1bf6166ecd96ea10ec972651d914f5660ccb79fadd446348ba89b5ad1d80cb719ff3eb5cbeb54cafa1cbab5eb00b240ff2a7ebec574d
data/Gemfile CHANGED
@@ -4,7 +4,6 @@ gem 'rake'
4
4
  gem 'rspec'
5
5
  gem 'multi_json', '1.0.4'
6
6
  gem 'simplecov', :require => false
7
- gem 'rubyzip'
7
+ gem 'rubyzip', '< 1.0.0'
8
8
  gem 'vcr'
9
9
  gem 'fakeweb'
10
- gem 'debugger'
@@ -1,14 +1,6 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- columnize (0.3.6)
5
- debugger (1.2.2)
6
- columnize (>= 0.3.1)
7
- debugger-linecache (~> 1.1.1)
8
- debugger-ruby_core_source (~> 1.1.5)
9
- debugger-linecache (1.1.2)
10
- debugger-ruby_core_source (>= 1.1.1)
11
- debugger-ruby_core_source (1.1.5)
12
4
  diff-lcs (1.1.3)
13
5
  fakeweb (1.3.0)
14
6
  multi_json (1.0.4)
@@ -32,11 +24,10 @@ PLATFORMS
32
24
  ruby
33
25
 
34
26
  DEPENDENCIES
35
- debugger
36
27
  fakeweb
37
28
  multi_json (= 1.0.4)
38
29
  rake
39
30
  rspec
40
- rubyzip
31
+ rubyzip (< 1.0.0)
41
32
  simplecov
42
33
  vcr
data/README.md CHANGED
@@ -6,8 +6,12 @@ A Ruby wrapper for the [General Transit Feed Specification](https://developers.g
6
6
 
7
7
  Initialize a new GTFS source:
8
8
 
9
+ # Defaults to strict checking of required columns
9
10
  source = GTFS::Source.build(<URI or Path to GTFS zip file>)
10
-
11
+
12
+ # Relax the column checks, useful for sources that don't conform to standard
13
+ source = GTFS::Source.build(<URI or Path to GTFS zip file>, {strict: false})
14
+
11
15
  Accessing GTFS data from the source:
12
16
 
13
17
  source.agencies
@@ -22,6 +26,12 @@ Accessing GTFS data from the source:
22
26
  source.shapes
23
27
  source.frequencies
24
28
  source.transfers
29
+
30
+ Alternatively:
31
+
32
+ source.each_agency {|agency| puts agency}
33
+ ...
34
+ source.each_transfer {|transfer| puts transfer}
25
35
 
26
36
  ### License
27
37
 
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
17
17
 
18
18
  gem.add_dependency 'rake'
19
19
  gem.add_dependency 'multi_json'
20
- gem.add_dependency 'rubyzip'
20
+ gem.add_dependency 'rubyzip', '< 1.0.0'
21
21
 
22
22
  gem.add_development_dependency 'rspec', ['>= 2.0.0']
23
23
  gem.add_development_dependency 'simplecov'
@@ -12,8 +12,8 @@ module GTFS
12
12
  required_file true
13
13
  uses_filename 'agency.txt'
14
14
 
15
- def self.parse_agencies(data)
16
- return parse_models(data)
15
+ def self.parse_agencies(data, options={})
16
+ return parse_models(data, options)
17
17
  end
18
18
  end
19
19
  end
@@ -9,8 +9,8 @@ module GTFS
9
9
  required_file true
10
10
  uses_filename 'calendar.txt'
11
11
 
12
- def self.parse_calendars(data)
13
- return parse_models(data)
12
+ def self.parse_calendars(data, options={})
13
+ return parse_models(data, options)
14
14
  end
15
15
  end
16
16
  end
@@ -9,8 +9,8 @@ module GTFS
9
9
  required_file true
10
10
  uses_filename 'calendar_dates.txt'
11
11
 
12
- def self.parse_calendar_dates(data)
13
- return parse_models(data)
12
+ def self.parse_calendar_dates(data, options={})
13
+ return parse_models(data, options)
14
14
  end
15
15
  end
16
16
  end
@@ -2,16 +2,16 @@ module GTFS
2
2
  class FareAttribute
3
3
  include GTFS::Model
4
4
 
5
- has_required_attrs :fare_id, :price, :currency_type, :payment_method, :transfers
6
- has_optional_attrs :transfer_duration
5
+ has_required_attrs :fare_id, :price, :currency_type, :payment_method
6
+ has_optional_attrs :transfer_duration, :transfers
7
7
  attr_accessor *attrs
8
8
 
9
9
  collection_name :fare_attributes
10
10
  required_file false
11
11
  uses_filename 'fare_attributes.txt'
12
12
 
13
- def self.parse_fare_attributes(data)
14
- return parse_models(data)
13
+ def self.parse_fare_attributes(data, options={})
14
+ return parse_models(data, options)
15
15
  end
16
16
  end
17
17
  end
@@ -10,8 +10,8 @@ module GTFS
10
10
  required_file false
11
11
  uses_filename 'fare_rules.txt'
12
12
 
13
- def self.parse_fare_rules(data)
14
- return parse_models(data)
13
+ def self.parse_fare_rules(data, options={})
14
+ return parse_models(data, options)
15
15
  end
16
16
  end
17
17
  end
@@ -10,8 +10,8 @@ module GTFS
10
10
  required_file false
11
11
  uses_filename 'frequencies.txt'
12
12
 
13
- def self.parse_frequencies(data)
14
- return parse_models(data)
13
+ def self.parse_frequencies(data, options={})
14
+ return parse_models(data, options)
15
15
  end
16
16
  end
17
17
  end
@@ -64,23 +64,42 @@ module GTFS
64
64
 
65
65
  def collection_name(collection_name)
66
66
  self.define_singleton_method(:name) {collection_name}
67
+
68
+ self.define_singleton_method(:singular_name) {
69
+ self.to_s.split('::').last.
70
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
71
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
72
+ tr("-", "_").downcase
73
+ }
67
74
  end
68
-
69
- def uses_filename(filename)
75
+
76
+ def uses_filename(filename)
70
77
  self.define_singleton_method(:filename) {filename}
71
78
  end
72
79
 
73
- def parse_models(data)
80
+ def each(filename)
81
+ CSV.foreach(filename, :headers => true) do |row|
82
+ yield parse_model(row.to_hash)
83
+ end
84
+ end
85
+
86
+ def parse_model(attr_hash, options={})
87
+ unprefixed_attr_hash = {}
88
+
89
+ attr_hash.each do |key, val|
90
+ unprefixed_attr_hash[key.gsub(/^#{prefix}/, '')] = val
91
+ end
92
+
93
+ model = self.new(unprefixed_attr_hash)
94
+ end
95
+
96
+ def parse_models(data, options={})
74
97
  return [] if data.nil? || data.empty?
75
98
 
76
99
  models = []
77
100
  CSV.parse(data, :headers => true) do |row|
78
- attr_hash = {}
79
- row.to_hash.each do |key, val|
80
- attr_hash[key.gsub(/^#{prefix}/, '')] = val
81
- end
82
- model = self.new(attr_hash)
83
- models << model if model.valid?
101
+ model = parse_model(row.to_hash, options)
102
+ models << model if options[:strict] == false || model.valid?
84
103
  end
85
104
  models
86
105
  end
@@ -12,8 +12,8 @@ module GTFS
12
12
  required_file true
13
13
  uses_filename 'routes.txt'
14
14
 
15
- def self.parse_routes(data)
16
- return parse_models(data)
15
+ def self.parse_routes(data, options={})
16
+ return parse_models(data, options)
17
17
  end
18
18
  end
19
19
  end
@@ -12,8 +12,8 @@ module GTFS
12
12
 
13
13
  column_prefix :shape_
14
14
 
15
- def self.parse_shapes(data)
16
- return parse_models(data)
15
+ def self.parse_shapes(data, options={})
16
+ return parse_models(data, options)
17
17
  end
18
18
  end
19
19
  end
@@ -5,7 +5,7 @@ require 'zip/zip'
5
5
  module GTFS
6
6
  class Source
7
7
 
8
- ENTITIES = [GTFS::Agency, GTFS::Stop, GTFS::Route, GTFS::Trip, GTFS::StopTime,
8
+ ENTITIES = [GTFS::Agency, GTFS::Stop, GTFS::Route, GTFS::Trip, GTFS::StopTime,
9
9
  GTFS::Calendar, GTFS::CalendarDate, GTFS::Shape, GTFS::FareAttribute,
10
10
  GTFS::FareRule, GTFS::Frequency, GTFS::Transfer]
11
11
 
@@ -13,9 +13,11 @@ module GTFS
13
13
  OPTIONAL_SOURCE_FILES = ENTITIES.reject(&:required_file?).map(&:filename)
14
14
  SOURCE_FILES = ENTITIES.map(&:filename)
15
15
 
16
- attr_accessor :source, :archive
16
+ DEFAULT_OPTIONS = {strict: true}
17
17
 
18
- def initialize(source)
18
+ attr_accessor :source, :archive, :options
19
+
20
+ def initialize(source, opts={})
19
21
  raise 'Source cannot be nil' if source.nil?
20
22
 
21
23
  @tmp_dir = Dir.mktmpdir
@@ -23,6 +25,8 @@ module GTFS
23
25
 
24
26
  @source = source
25
27
  load_archive(@source)
28
+
29
+ @options = DEFAULT_OPTIONS.merge(opts)
26
30
  end
27
31
 
28
32
  def self.finalize(directory)
@@ -41,11 +45,11 @@ module GTFS
41
45
  raise 'Cannot directly instantiate base GTFS::Source'
42
46
  end
43
47
 
44
- def self.build(data_root)
48
+ def self.build(data_root, opts={})
45
49
  if File.exists?(data_root)
46
- LocalSource.new(data_root)
50
+ src = LocalSource.new(data_root, opts)
47
51
  else
48
- URLSource.new(data_root)
52
+ src = URLSource.new(data_root, opts)
49
53
  end
50
54
  end
51
55
 
@@ -61,9 +65,13 @@ module GTFS
61
65
  ENTITIES.each do |entity|
62
66
  define_method entity.name.to_sym do
63
67
  parse_file entity.filename do |f|
64
- entity.send("parse_#{entity.name}".to_sym, f.read)
68
+ entity.send("parse_#{entity.name}".to_sym, f.read, options)
65
69
  end
66
70
  end
71
+
72
+ define_method "each_#{entity.singular_name}".to_sym do |&block|
73
+ entity.each(File.join(@tmp_dir, entity.filename)) { |model| block.call model }
74
+ end
67
75
  end
68
76
 
69
77
  def files
@@ -72,7 +80,7 @@ module GTFS
72
80
 
73
81
  def parse_file(filename)
74
82
  raise_if_missing_source filename
75
- open File.join(@tmp_dir, '/', filename) do |f|
83
+ open File.join(@tmp_dir, '/', filename), 'r:bom|utf-8' do |f|
76
84
  files[filename] ||= yield f
77
85
  end
78
86
  end
@@ -3,7 +3,7 @@ module GTFS
3
3
  include GTFS::Model
4
4
 
5
5
  has_required_attrs :id, :name, :lat, :lon
6
- has_optional_attrs :code, :desc, :zone_id, :url, :location_type, :parent_station, :timezone
6
+ has_optional_attrs :code, :desc, :zone_id, :url, :location_type, :parent_station, :timezone, :wheelchair_boarding
7
7
  column_prefix :stop_
8
8
  attr_accessor *attrs
9
9
 
@@ -14,8 +14,8 @@ module GTFS
14
14
  LOCATION_TYPE_STOP = 0
15
15
  LOCATION_TYPE_STATION = 1
16
16
 
17
- def self.parse_stops(data)
18
- return parse_models(data)
17
+ def self.parse_stops(data, options={})
18
+ return parse_models(data, options)
19
19
  end
20
20
  end
21
21
  end
@@ -10,8 +10,8 @@ module GTFS
10
10
  required_file true
11
11
  uses_filename 'stop_times.txt'
12
12
 
13
- def self.parse_stop_times(data)
14
- return parse_models(data)
13
+ def self.parse_stop_times(data, options={})
14
+ return parse_models(data, options)
15
15
  end
16
16
  end
17
17
  end
@@ -12,8 +12,8 @@ module GTFS
12
12
  required_file false
13
13
  uses_filename 'transfers.txt'
14
14
 
15
- def self.parse_transfers(data)
16
- return parse_models(data)
15
+ def self.parse_transfers(data, options={})
16
+ return parse_models(data, options)
17
17
  end
18
18
  end
19
19
  end
@@ -3,7 +3,7 @@ module GTFS
3
3
  include GTFS::Model
4
4
 
5
5
  has_required_attrs :route_id, :service_id, :id
6
- has_optional_attrs :headsign, :short_name, :direction_id, :block_id, :shape_id
6
+ has_optional_attrs :headsign, :short_name, :direction_id, :block_id, :shape_id, :wheelchair_accessible
7
7
  attr_accessor *attrs
8
8
 
9
9
  column_prefix :trip_
@@ -12,8 +12,8 @@ module GTFS
12
12
  required_file true
13
13
  uses_filename 'trips.txt'
14
14
 
15
- def self.parse_trips(data)
16
- return parse_models(data)
15
+ def self.parse_trips(data, options={})
16
+ return parse_models(data, options)
17
17
  end
18
18
  end
19
19
  end
@@ -1,4 +1,4 @@
1
1
  module GTFS
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
4
4
 
@@ -7,7 +7,7 @@ describe GTFS::Agency do
7
7
  let(:valid_line) {"1,Maryland Transit Administration,http://www.mta.maryland.gov,America/New_York,en,410-539-5000\n"}
8
8
  let(:invalid_line) {"1,,http://www.mta.maryland.gov,America/New_York,en,410-539-5000\n"}
9
9
 
10
- subject {GTFS::Agency.parse_agencies(source_text)}
10
+ subject {GTFS::Agency.parse_agencies(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -7,7 +7,7 @@ describe GTFS::CalendarDate do
7
7
  let(:valid_line) {"3,20110905,1\n"}
8
8
  let(:invalid_line) {"3,,1\n"}
9
9
 
10
- subject {GTFS::CalendarDate.parse_calendar_dates(source_text)}
10
+ subject {GTFS::CalendarDate.parse_calendar_dates(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -7,7 +7,7 @@ describe GTFS::Calendar do
7
7
  let(:valid_line) {"1,1,1,1,1,1,0,0,20110828,20120204\n"}
8
8
  let(:invalid_line) {"1,,1,,1,,0,,,20120204\n"}
9
9
 
10
- subject {GTFS::Calendar.parse_calendars(source_text)}
10
+ subject {GTFS::Calendar.parse_calendars(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe GTFS::FareAttribute do
4
+ describe '.parse_fare_attributes' do
5
+ let(:header_line) {"fare_id,price,currency_type,payment_method,transfers,transfer_duration\n"}
6
+ let(:invalid_header_line) {",,currency_type,,,transfer_duration\n"}
7
+ let(:valid_line) {"1,1.23,USD,0, ,5000\n"}
8
+ let(:invalid_line) {"1,,,0, ,5000\n"}
9
+
10
+ subject {GTFS::FareAttribute.parse_fare_attributes(source_text, opts)}
11
+
12
+ include_examples 'models'
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe GTFS::FareRule do
4
+ describe '.parse_fare_rules' do
5
+ let(:header_line) {"fare_id,route_id,origin_id,destination_id,contains_id\n"}
6
+ let(:invalid_header_line) {",route_id,origin_id,destination_id,contains_id\n"}
7
+ let(:valid_line) {"1,2,TWS,,\n"}
8
+ let(:invalid_line) {",2,TWS,,\n"}
9
+ subject {GTFS::FareRule.parse_fare_rules(source_text, opts)}
10
+
11
+ include_examples 'models'
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe GTFS::Frequency do
4
+ describe '#parse_frequncies' do
5
+ let(:header_line) {"trip_id,start_time,end_time,headway_secs\n"}
6
+ let(:invalid_header_line) {",,end_time,headway_secs\n"}
7
+ let(:valid_line) {"AWE1,05:30:00,06:30:00,300\n"}
8
+ let(:invalid_line) {",,06:30:00,300\n"}
9
+
10
+ subject {GTFS::Frequency.parse_frequencies(source_text, opts)}
11
+
12
+ include_examples 'models'
13
+ end
14
+ end
@@ -7,7 +7,7 @@ describe GTFS::Route do
7
7
  let(:valid_line) {"4679,1,001,SINAI - FORT McHENRY,,3,,0000FF,FFFFFF\n"}
8
8
  let(:invalid_line) {",1,,,,3,,,FFFFFF\n"}
9
9
 
10
- subject {GTFS::Route.parse_routes(source_text)}
10
+ subject {GTFS::Route.parse_routes(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -7,7 +7,7 @@ describe GTFS::Shape do
7
7
  let(:valid_line) {"59135,39.354286,-76.662453,19,0.8136\n"}
8
8
  let(:invalid_line) {",39.354286,,,0.8136\n"}
9
9
 
10
- subject {GTFS::Shape.parse_shapes(source_text)}
10
+ subject {GTFS::Shape.parse_shapes(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -10,29 +10,36 @@ describe GTFS::Source do
10
10
  end
11
11
 
12
12
  describe '#build' do
13
- subject {GTFS::Source.build(data_source)}
14
-
15
- before do
16
- GTFS::URLSource.stub(:new).and_return('URLSource')
17
- GTFS::LocalSource.stub(:new).and_return('LocalSource')
18
- end
13
+ let(:opts) {{}}
14
+ let(:data_source) {valid_local_source}
15
+ subject {GTFS::Source.build(data_source, opts)}
19
16
 
20
17
  context 'with a url as a data root' do
21
- let(:data_source) {'http://www.edschmalzle.com/gtfs.zip'}
18
+ use_vcr_cassette('valid_gtfs_uri')
19
+ let(:data_source) {'http://dl.dropbox.com/u/416235/work/valid_gtfs.zip'}
22
20
 
23
- it {should == 'URLSource'}
21
+ it {should be_instance_of GTFS::URLSource}
22
+ its(:options) {should == GTFS::Source::DEFAULT_OPTIONS}
24
23
  end
25
24
 
26
25
  context 'with a file path as a data root' do
27
26
  let(:data_source) {valid_local_source}
28
27
 
29
- it {should == 'LocalSource'}
28
+ it {should be_instance_of GTFS::LocalSource}
29
+ its(:options) {should == GTFS::Source::DEFAULT_OPTIONS}
30
30
  end
31
31
 
32
32
  context 'with a file object as a data root' do
33
33
  let(:data_source) {File.open(valid_local_source)}
34
34
 
35
- it {should == 'LocalSource'}
35
+ it {should be_instance_of GTFS::LocalSource}
36
+ its(:options) {should == GTFS::Source::DEFAULT_OPTIONS}
37
+ end
38
+
39
+ context 'with options to disable strict checks' do
40
+ let(:opts) {{strict: false}}
41
+
42
+ its(:options) {should == {strict: false}}
36
43
  end
37
44
  end
38
45
 
@@ -51,7 +58,6 @@ describe GTFS::Source do
51
58
  it {should_not be_empty}
52
59
  its(:first) {should be_an_instance_of(GTFS::Agency)}
53
60
  end
54
-
55
61
  end
56
62
 
57
63
  describe '#stops' do
@@ -7,7 +7,7 @@ describe GTFS::Stop do
7
7
  let(:valid_line) {"3,C093,LANIER & SINAI HOSPITAL,39.351145,-76.663113,,,,\n"}
8
8
  let(:invalid_line) {"3,,,,-76.663113,,,,\n"}
9
9
 
10
- subject {GTFS::Stop.parse_stops(source_text)}
10
+ subject {GTFS::Stop.parse_stops(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -7,7 +7,7 @@ describe GTFS::StopTime do
7
7
  let(:valid_line) {"982385,4:34:00,4:34:00,277,1,,0,0,\n"}
8
8
  let(:invalid_line) {",,4:34:00,,1,,,0,\n"}
9
9
 
10
- subject {GTFS::StopTime.parse_stop_times(source_text)}
10
+ subject {GTFS::StopTime.parse_stop_times(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe GTFS::Transfer do
4
+ describe '#parse_transfers' do
5
+ let(:header_line) {"from_stop_id,to_stop_id,transfer_type,min_transfer_time\n"}
6
+ let(:invalid_header_line) {",toxxtop_id,transfer_type,min_transfer_time\n"}
7
+ let(:valid_line) {"S6,S7,2,300\n"}
8
+ let(:invalid_line) {",S7,2,300\n"}
9
+
10
+ subject {GTFS::Transfer.parse_transfers(source_text, opts)}
11
+
12
+ include_examples 'models'
13
+ end
14
+ end
@@ -7,7 +7,7 @@ describe GTFS::Trip do
7
7
  let(:valid_line) {"4679,1,982394,1 FT McHENRY,0,189021,59135\n"}
8
8
  let(:invalid_line) {",1,,1 FT McHENRY,,189021,\n"}
9
9
 
10
- subject {GTFS::Trip.parse_trips(source_text)}
10
+ subject {GTFS::Trip.parse_trips(source_text, opts)}
11
11
 
12
12
  include_examples 'models'
13
13
  end
@@ -5,7 +5,7 @@ describe GTFS::URLSource do
5
5
  let(:source_path) {'http://dl.dropbox.com/u/416235/work/valid_gtfs.zip'}
6
6
  it 'should create a new source successfully' do
7
7
  VCR.use_cassette('valid_gtfs_uri') do
8
- lambda {GTFS::URLSource.new(source_path)}.should_not raise_error(GTFS::InvalidSourceException)
8
+ lambda {GTFS::URLSource.new(source_path, {})}.should_not raise_error(GTFS::InvalidSourceException)
9
9
  end
10
10
  end
11
11
  end
@@ -14,7 +14,7 @@ describe GTFS::URLSource do
14
14
  let(:source_path) {'http://www.edschmalzle.com/gtfs.zip'}
15
15
  it 'should raise an exception' do
16
16
  VCR.use_cassette('invalid_gtfs_uri') do
17
- lambda {GTFS::URLSource.new(source_path)}.should raise_error(GTFS::InvalidSourceException)
17
+ lambda {GTFS::URLSource.new(source_path, {})}.should raise_error(GTFS::InvalidSourceException)
18
18
  end
19
19
  end
20
20
  end
@@ -12,7 +12,7 @@ require 'gtfs'
12
12
  require File.expand_path(File.dirname(__FILE__) + '/support/model_shared_examples')
13
13
 
14
14
  RSpec.configure do |config|
15
- # Configure you some RSpec
15
+ config.extend VCR::RSpec::Macros
16
16
  end
17
17
 
18
18
  VCR.config do |c|
@@ -1,31 +1,55 @@
1
1
  shared_examples 'models' do |collection_class|
2
- context 'with a nil source' do
3
- let(:source_text) {nil}
4
- it {should == []}
5
- end
6
2
 
7
- context 'with an empty source' do
8
- let(:source_text) {''}
9
- it {should == []}
10
- end
3
+ context 'with default options' do
4
+ let(:opts) {{}}
11
5
 
12
- context 'with a source w/ only headers' do
13
- let(:source_text) {header_line}
14
- it {should == []}
15
- end
6
+ context 'with a nil source' do
7
+ let(:source_text) {nil}
8
+ it {should == []}
9
+ end
16
10
 
17
- context 'with a valid row of data' do
18
- let(:source_text) {header_line + valid_line}
19
- its(:size) {should == 1}
20
- end
11
+ context 'with an empty source' do
12
+ let(:source_text) {''}
13
+ it {should == []}
14
+ end
15
+
16
+ context 'with a source w/ only headers' do
17
+ let(:source_text) {header_line}
18
+ it {should == []}
19
+ end
21
20
 
22
- context 'with multiple valid rows of data' do
23
- let(:source_text) {header_line + valid_line + valid_line}
24
- its(:size) {should == 2}
21
+ context 'with a valid row of data' do
22
+ let(:source_text) {header_line + valid_line}
23
+ its(:size) {should == 1}
24
+ end
25
+
26
+ context 'with multiple valid rows of data' do
27
+ let(:source_text) {header_line + valid_line + valid_line}
28
+ its(:size) {should == 2}
29
+ end
30
+
31
+ context 'with 1 invalid and 1 valid row of data' do
32
+ let(:source_text) {header_line + valid_line + invalid_line}
33
+ its(:size) {should == 1}
34
+ end
35
+
36
+ context 'with an invalid line' do
37
+ let(:source_text) {header_line + invalid_line}
38
+ its(:size) {should == 0}
39
+ end
25
40
  end
26
41
 
27
- context 'with 1 invalid and 1 valid row of data' do
28
- let(:source_text) {header_line + valid_line + invalid_line}
29
- its(:size) {should == 1}
42
+ context 'with options set to turn off strict checking' do
43
+ let(:opts) {{strict: false}}
44
+
45
+ context 'with an invalid line' do
46
+ let(:source_text) {header_line + invalid_line}
47
+ its(:size) {should == 1}
48
+ end
49
+
50
+ context 'with 1 invalid and 1 valid row of data' do
51
+ let(:source_text) {header_line + valid_line + invalid_line}
52
+ its(:size) {should == 2}
53
+ end
30
54
  end
31
55
  end
metadata CHANGED
@@ -1,145 +1,128 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gtfs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
5
- prerelease:
4
+ version: 0.2.2
6
5
  platform: ruby
7
6
  authors:
8
7
  - nerdEd
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-12-17 00:00:00.000000000 Z
11
+ date: 2014-01-05 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rake
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: multi_json
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rubyzip
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - <
52
46
  - !ruby/object:Gem::Version
53
- version: '0'
47
+ version: 1.0.0
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - <
60
53
  - !ruby/object:Gem::Version
61
- version: '0'
54
+ version: 1.0.0
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: rspec
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: 2.0.0
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: 2.0.0
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: simplecov
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: ruby-debug19
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: vcr
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: fakeweb
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
- description: ! "gtfs reads GTFS data from a google-compliant Zip bundle \n and
125
+ description: "gtfs reads GTFS data from a google-compliant Zip bundle \n and
143
126
  returns an object representing the CSV data inside"
144
127
  email:
145
128
  - ed@nerded.net
@@ -180,39 +163,42 @@ files:
180
163
  - spec/gtfs/agency_spec.rb
181
164
  - spec/gtfs/calendar_date_spec.rb
182
165
  - spec/gtfs/calendar_spec.rb
166
+ - spec/gtfs/fare_attribute_spec.rb
167
+ - spec/gtfs/fare_rule_spec.rb
168
+ - spec/gtfs/frequency_spec.rb
183
169
  - spec/gtfs/local_source_spec.rb
184
170
  - spec/gtfs/route_spec.rb
185
171
  - spec/gtfs/shape_spec.rb
186
172
  - spec/gtfs/source_spec.rb
187
173
  - spec/gtfs/stop_spec.rb
188
174
  - spec/gtfs/stop_time_spec.rb
175
+ - spec/gtfs/transfer_spec.rb
189
176
  - spec/gtfs/trip_spec.rb
190
177
  - spec/gtfs/url_source_spec.rb
191
178
  - spec/spec_helper.rb
192
179
  - spec/support/model_shared_examples.rb
193
180
  homepage: https://github.com/nerdEd/gtfs
194
181
  licenses: []
182
+ metadata: {}
195
183
  post_install_message:
196
184
  rdoc_options: []
197
185
  require_paths:
198
186
  - lib
199
187
  required_ruby_version: !ruby/object:Gem::Requirement
200
- none: false
201
188
  requirements:
202
- - - ! '>='
189
+ - - '>='
203
190
  - !ruby/object:Gem::Version
204
191
  version: '0'
205
192
  required_rubygems_version: !ruby/object:Gem::Requirement
206
- none: false
207
193
  requirements:
208
- - - ! '>='
194
+ - - '>='
209
195
  - !ruby/object:Gem::Version
210
196
  version: '0'
211
197
  requirements: []
212
198
  rubyforge_project:
213
- rubygems_version: 1.8.24
199
+ rubygems_version: 2.1.10
214
200
  signing_key:
215
- specification_version: 3
201
+ specification_version: 4
216
202
  summary: Load and read GTFS data from zip bundles
217
203
  test_files:
218
204
  - spec/fixtures/cassettes/invalid_gtfs_uri.yml
@@ -222,12 +208,16 @@ test_files:
222
208
  - spec/gtfs/agency_spec.rb
223
209
  - spec/gtfs/calendar_date_spec.rb
224
210
  - spec/gtfs/calendar_spec.rb
211
+ - spec/gtfs/fare_attribute_spec.rb
212
+ - spec/gtfs/fare_rule_spec.rb
213
+ - spec/gtfs/frequency_spec.rb
225
214
  - spec/gtfs/local_source_spec.rb
226
215
  - spec/gtfs/route_spec.rb
227
216
  - spec/gtfs/shape_spec.rb
228
217
  - spec/gtfs/source_spec.rb
229
218
  - spec/gtfs/stop_spec.rb
230
219
  - spec/gtfs/stop_time_spec.rb
220
+ - spec/gtfs/transfer_spec.rb
231
221
  - spec/gtfs/trip_spec.rb
232
222
  - spec/gtfs/url_source_spec.rb
233
223
  - spec/spec_helper.rb