gtfs 0.2.1 → 0.3.0

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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +13 -2
  3. data/Gemfile +11 -8
  4. data/Gemfile.lock +41 -29
  5. data/LICENSE +21 -0
  6. data/README.md +15 -17
  7. data/Rakefile +2 -0
  8. data/gtfs.gemspec +5 -2
  9. data/lib/gtfs.rb +1 -0
  10. data/lib/gtfs/agency.rb +3 -3
  11. data/lib/gtfs/calendar.rb +2 -2
  12. data/lib/gtfs/calendar_date.rb +2 -2
  13. data/lib/gtfs/fare_attribute.rb +3 -3
  14. data/lib/gtfs/fare_rule.rb +2 -2
  15. data/lib/gtfs/feed_info.rb +19 -0
  16. data/lib/gtfs/frequency.rb +2 -2
  17. data/lib/gtfs/model.rb +28 -9
  18. data/lib/gtfs/route.rb +2 -2
  19. data/lib/gtfs/shape.rb +2 -2
  20. data/lib/gtfs/source.rb +19 -11
  21. data/lib/gtfs/stop.rb +3 -3
  22. data/lib/gtfs/stop_time.rb +3 -3
  23. data/lib/gtfs/transfer.rb +2 -2
  24. data/lib/gtfs/trip.rb +3 -3
  25. data/lib/gtfs/url_source.rb +1 -1
  26. data/lib/gtfs/version.rb +1 -2
  27. data/spec/fixtures/cassettes/invalid_gtfs_uri.yml +58 -65
  28. data/spec/fixtures/cassettes/valid_gtfs_uri.yml +55 -122
  29. data/spec/gtfs/agency_spec.rb +2 -2
  30. data/spec/gtfs/calendar_date_spec.rb +1 -1
  31. data/spec/gtfs/calendar_spec.rb +1 -1
  32. data/spec/gtfs/fare_attribute_spec.rb +14 -0
  33. data/spec/gtfs/fare_rule_spec.rb +13 -0
  34. data/spec/gtfs/feed_info_spec.rb +14 -0
  35. data/spec/gtfs/frequency_spec.rb +14 -0
  36. data/spec/gtfs/route_spec.rb +1 -1
  37. data/spec/gtfs/shape_spec.rb +1 -1
  38. data/spec/gtfs/source_spec.rb +23 -11
  39. data/spec/gtfs/stop_spec.rb +1 -1
  40. data/spec/gtfs/stop_time_spec.rb +2 -2
  41. data/spec/gtfs/transfer_spec.rb +14 -0
  42. data/spec/gtfs/trip_spec.rb +2 -2
  43. data/spec/gtfs/url_source_spec.rb +4 -4
  44. data/spec/spec_helper.rb +7 -3
  45. data/spec/support/model_shared_examples.rb +46 -22
  46. metadata +46 -52
data/lib/gtfs/stop.rb CHANGED
@@ -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
@@ -3,15 +3,15 @@ module GTFS
3
3
  include GTFS::Model
4
4
 
5
5
  has_required_attrs :trip_id, :arrival_time, :departure_time, :stop_id, :stop_sequence
6
- has_optional_attrs :stop_headsign, :pickup_type, :drop_off_type, :shape_dist_traveled
6
+ has_optional_attrs :stop_headsign, :pickup_type, :drop_off_type, :shape_dist_traveled, :timepoint
7
7
  attr_accessor *attrs
8
8
 
9
9
  collection_name :stop_times
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
data/lib/gtfs/transfer.rb CHANGED
@@ -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
data/lib/gtfs/trip.rb CHANGED
@@ -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, :bikes_allowed
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
@@ -6,7 +6,7 @@ module GTFS
6
6
 
7
7
  def load_archive(source_url)
8
8
  Dir.mktmpdir do |tmp|
9
- file_name = File.join(tmp, "/gtfs_temp_#{Time.now}.zip")
9
+ file_name = File.join(tmp, "/gtfs_temp_#{Time.now.strftime('%Y%jT%H%M%S%z')}.zip")
10
10
  uri = URI.parse(source_url)
11
11
  response = Net::HTTP.get_response(uri)
12
12
  open(file_name, 'wb') do |file|
data/lib/gtfs/version.rb CHANGED
@@ -1,4 +1,3 @@
1
1
  module GTFS
2
- VERSION = '0.2.1'
2
+ VERSION = '0.3.0'
3
3
  end
4
-
@@ -1,70 +1,63 @@
1
1
  ---
2
- - !ruby/struct:VCR::HTTPInteraction
3
- request: !ruby/struct:VCR::Request
4
- method: :get
5
- uri: http://www.edschmalzle.com:80/gtfs.zip
6
- body: !!null
7
- headers: !!null
8
- response: !ruby/struct:VCR::Response
9
- status: !ruby/struct:VCR::ResponseStatus
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://example.org/gtfs.zip
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - example.org
18
+ response:
19
+ status:
10
20
  code: 404
11
21
  message: Not Found
12
22
  headers:
13
- date:
14
- - Wed, 18 Jan 2012 05:04:53 GMT
15
- server:
16
- - Apache
17
- vary:
18
- - Cookie,Accept-Encoding
19
- x-pingback:
20
- - http://www.edschmalzle.com/xmlrpc.php
21
- expires:
22
- - Wed, 11 Jan 1984 05:00:00 GMT
23
- cache-control:
24
- - no-cache, must-revalidate, max-age=0
25
- pragma:
26
- - no-cache
27
- last-modified:
28
- - Wed, 18 Jan 2012 05:04:54 GMT
29
- transfer-encoding:
30
- - chunked
31
- content-type:
23
+ Age:
24
+ - '164717'
25
+ Cache-Control:
26
+ - max-age=604800
27
+ Content-Type:
32
28
  - text/html; charset=UTF-8
33
- body: ! "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html
34
- xmlns=\"http://www.w3.org/1999/xhtml\" dir=\"ltr\" lang=\"en-US\">\r\n<head
35
- profile=\"http://gmpg.org/xfn/11\">\r\n<meta http-equiv=\"Content-Type\" content=\"text/html;
36
- charset=UTF-8\" />\r\n<title>Ed Schmalzle &raquo; Page not found</title>\r\n<link
37
- rel=\"stylesheet\" href=\"http://www.edschmalzle.com/wp-content/themes/shallowgrunge/shallowgrunge/style.css\"
38
- type=\"text/css\" media=\"screen\" />\r\n<link rel=\"alternate\" type=\"application/rss+xml\"
39
- title=\"Ed Schmalzle RSS Feed\" href=\"http://www.edschmalzle.com/feed/\" />\r\n<link
40
- rel=\"pingback\" href=\"http://www.edschmalzle.com/xmlrpc.php\" />\r\n<script
41
- type='text/javascript' src='http://www.edschmalzle.com/wp-includes/js/jquery/jquery.js?ver=1.7.1'></script>\n<script
42
- type='text/javascript' src='http://www.edschmalzle.com/wp-content/plugins/google-analyticator/external-tracking.min.js?ver=6.2'></script>\n<link
43
- rel=\"EditURI\" type=\"application/rsd+xml\" title=\"RSD\" href=\"http://www.edschmalzle.com/xmlrpc.php?rsd\"
44
- />\n<link rel=\"wlwmanifest\" type=\"application/wlwmanifest+xml\" href=\"http://www.edschmalzle.com/wp-includes/wlwmanifest.xml\"
45
- /> \n<meta name=\"generator\" content=\"WordPress 3.3.1\" />\n<!-- Google Analytics
46
- Tracking by Google Analyticator 6.2: http://ronaldheft.com/code/analyticator/
47
- -->\n<script type=\"text/javascript\">\n\tvar analyticsFileTypes = [''];\n\tvar
48
- analyticsEventTracking = 'enabled';\n</script>\n<script type=\"text/javascript\">\n\tvar
49
- _gaq = _gaq || [];\n\t_gaq.push(['_setAccount', 'UA-378745-4']);\n\t_gaq.push(['_trackPageview']);\n\t_gaq.push(['_trackPageLoadTime']);\n\n\t(function()
50
- {\n\t\tvar ga = document.createElement('script'); ga.type = 'text/javascript';
51
- ga.async = true;\n\t\tga.src = ('https:' == document.location.protocol ? 'https://ssl'
52
- : 'http://www') + '.google-analytics.com/ga.js';\n\t\tvar s = document.getElementsByTagName('script')[0];
53
- s.parentNode.insertBefore(ga, s);\n\t})();\n</script>\n</head>\r\n<body>\r\n<div
54
- id=\"wrapper\">\r\n<div id=\"wrapper2\">\r\n\r\n<div id=\"header\">\r\n\t<div
55
- id=\"logo\">\r\n\t\t<h1><a href=\"http://www.edschmalzle.com/\">Ed Schmalzle</a></h1>\r\n\t\t<p></p>\r\n\t</div>\r\n</div>\r\n<!--
56
- end #header -->\r\n<div id=\"menu\">\r\n\t<ul>\r\n\t\t<li class=\"page_item\"><a
57
- href=\"http://www.edschmalzle.com/\">Blog</a></li>\r\n\t\t<li class=\"page_item
58
- page-item-60\"><a href=\"http://www.edschmalzle.com/projects/\">Projects</a></li>\n<li
59
- class=\"page_item page-item-5\"><a href=\"http://www.edschmalzle.com/resume/\">Resume</a></li>\n<li
60
- class=\"page_item page-item-6\"><a href=\"http://www.edschmalzle.com/contact/\">Contact</a></li>\n<li
61
- class=\"page_item page-item-75\"><a href=\"http://www.edschmalzle.com/archives/\">Archives</a></li>\n\t\t<li
62
- class=\"page_item\"><a href=\"http://www.edschmalzle.com/feed/\">RSS</a></li>\r\n\t</ul>\r\n</div>\r\n<!--
63
- end #menu -->\r\n</div>\r\n<hr />\r\n\r\n<div id=\"page\">\r\n\t<div id=\"content\"
64
- class=\"narrowcolumn\">\r\n\r\n\t\t<h2 class=\"center\">Error 404 - Not Found</h2>\r\n\r\n\t</div>\r\n\r\n<div
65
- id=\"sidebar\">\r\n\t<ul>\r\n\t</ul>\r\n</div>\r\n<!-- end #sidebar -->\r\n\r\n<div
66
- style=\"clear: both;\">&nbsp;</div>\r\n</div>\r\n<!-- end #page -->\r\n<hr />\r\n</div>\r\n</div>\r\n<!--
67
- end #footer -->\r\n<div id=\"footer\">\r\n\t<div>\r\n\t\t<p>Copyright (c) 2008\r\n\t\t\tEd
68
- Schmalzle\t\t\tAll rights reserved. Design by <a href=\"http://www.freewpthemes.net/\">Free
69
- WordPress Themes</a> &nbsp;&bull;&nbsp;\r\n\t\t\tPowered by <a href=\"http://wordpress.org/\">WordPress</a></p>\r\n\t</div>\r\n</div>\r\n</body></html>"
70
- http_version: '1.1'
29
+ Date:
30
+ - Fri, 23 Oct 2020 23:02:49 GMT
31
+ Expires:
32
+ - Fri, 30 Oct 2020 23:02:49 GMT
33
+ Last-Modified:
34
+ - Thu, 22 Oct 2020 01:17:32 GMT
35
+ Server:
36
+ - ECS (oxr/837A)
37
+ Vary:
38
+ - Accept-Encoding
39
+ X-Cache:
40
+ - 404-HIT
41
+ Content-Length:
42
+ - '648'
43
+ body:
44
+ encoding: ASCII-8BIT
45
+ string: "<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n
46
+ \ <meta charset=\"utf-8\" />\n <meta http-equiv=\"Content-type\" content=\"text/html;
47
+ charset=utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width,
48
+ initial-scale=1\" />\n <style type=\"text/css\">\n body {\n background-color:
49
+ #f0f0f2;\n margin: 0;\n padding: 0;\n font-family: -apple-system,
50
+ system-ui, BlinkMacSystemFont, \"Segoe UI\", \"Open Sans\", \"Helvetica Neue\",
51
+ Helvetica, Arial, sans-serif;\n \n }\n div {\n width:
52
+ 600px;\n margin: 5em auto;\n padding: 2em;\n background-color:
53
+ #fdfdff;\n border-radius: 0.5em;\n box-shadow: 2px 3px 7px 2px
54
+ rgba(0,0,0,0.02);\n }\n a:link, a:visited {\n color: #38488f;\n
55
+ \ text-decoration: none;\n }\n @media (max-width: 700px) {\n div
56
+ {\n margin: 0 auto;\n width: auto;\n }\n }\n
57
+ \ </style> \n</head>\n\n<body>\n<div>\n <h1>Example Domain</h1>\n
58
+ \ <p>This domain is for use in illustrative examples in documents. You may
59
+ use this\n domain in literature without prior coordination or asking for
60
+ permission.</p>\n <p><a href=\"https://www.iana.org/domains/example\">More
61
+ information...</a></p>\n</div>\n</body>\n</html>\n"
62
+ recorded_at: Fri, 23 Oct 2020 23:02:49 GMT
63
+ recorded_with: VCR 6.0.0
@@ -1,127 +1,60 @@
1
1
  ---
2
- - !ruby/struct:VCR::HTTPInteraction
3
- request: !ruby/struct:VCR::Request
4
- method: :get
5
- uri: http://dl.dropbox.com:80/u/416235/work/valid_gtfs.zip
6
- body: !!null
7
- headers: !!null
8
- response: !ruby/struct:VCR::Response
9
- status: !ruby/struct:VCR::ResponseStatus
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://developers.google.com/transit/gtfs/examples/sample-feed.zip
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - developers.google.com
18
+ response:
19
+ status:
10
20
  code: 200
11
21
  message: OK
12
22
  headers:
13
- server:
14
- - nginx/1.0.14
15
- date:
16
- - Fri, 13 Apr 2012 21:52:30 GMT
17
- content-type:
23
+ Content-Type:
18
24
  - application/zip
19
- connection:
20
- - keep-alive
21
- content-length:
22
- - '4147'
23
- x-robots-tag:
24
- - noindex,nofollow
25
- accept-ranges:
26
- - bytes
27
- etag:
28
- - 1380046134n
29
- pragma:
30
- - public
31
- cache-control:
32
- - max-age=0
33
- body: !binary |-
34
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- /Xj65d+/8V9/f/r+9W/69hKG/vzj+eXHL99//c/TMPDt+fvv499/e/rz6/D1
49
- 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
- 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
- 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
- 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
- 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
- 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
- bWUnW19aqGTTyNYa7W/K0oRIEQX3quyd7o5YqTGQ2Z1yRslpq5w7shqDET3B
56
- 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
- 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
- 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
- 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
- pd3hRTEHSAVRky45BZ7wQklf3uDrvusixZwKwiZLRlFRFcUF5cnIGGRsl4IG
61
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- iVyIpbqa/ZtuFH4OnBlEZkGNUo2M9QpjgAOweWyQ0L1WWg5iVyH2oga5Y3AU
94
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Jj2LP1rZqE3Pg6aP8mD21PSxsEAIBnxmDByfeKYBNjKAOc2kjlXWJTN2GOs9
104
- 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
- 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
- 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
- T5idiE91eAsAAQT1AQAABBQAAACVz8ELgjAUx/F70P+wP+Ad9pybduxg1CGD
108
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- CABjbThA5oyiaTUAAAA8AAAAEgAYAAAAAAABAAAApIFuAQAAY2FsZW5kYXJf
116
- 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
- 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
- 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
- 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
- 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
- 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
- AAAEFAAAAFBLAQIeAxQAAAAIAMmMjUDuZdn4nAEAAJgDAAAJABgAAAAAAAEA
123
- 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
- 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
- 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
126
- AJENAAAAAA==
127
- http_version: '1.1'
25
+ Last-Modified:
26
+ - Wed, 11 Jan 2012 14:31:33 GMT
27
+ Content-Disposition:
28
+ - attachment; filename="sample-feed.zip"
29
+ Cache-Control:
30
+ - no-cache, must-revalidate
31
+ Expires:
32
+ - '0'
33
+ Pragma:
34
+ - no-cache
35
+ Strict-Transport-Security:
36
+ - max-age=31536000; includeSubdomains
37
+ X-Frame-Options:
38
+ - SAMEORIGIN
39
+ X-Xss-Protection:
40
+ - '0'
41
+ X-Content-Type-Options:
42
+ - nosniff
43
+ X-Cloud-Trace-Context:
44
+ - 9d9cd729a1af3deba482f46f3a68c263
45
+ Date:
46
+ - Fri, 23 Oct 2020 23:02:49 GMT
47
+ Server:
48
+ - Google Frontend
49
+ Content-Length:
50
+ - '3217'
51
+ Alt-Svc:
52
+ - h3-Q050=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-T050=":443";
53
+ ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443";
54
+ ma=2592000; v="46,43"
55
+ body:
56
+ encoding: ASCII-8BIT
57
+ string: !binary |-
58
+ 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
59
+ recorded_at: Fri, 23 Oct 2020 23:02:49 GMT
60
+ recorded_with: VCR 6.0.0
@@ -2,12 +2,12 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe GTFS::Agency do
4
4
  describe 'Agency.parse_agencies' do
5
- let(:header_line) {"agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone\n"}
5
+ let(:header_line) {"agency_id,agency_name,agency_url,agency_timezone,agency_lang,agency_phone,agency_email\n"}
6
6
  let(:invalid_header_line) {"agency_id,agency_url,agency_timezone,agency_lang,agency_phone\n"}
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