gtfs-reader 0.2.9 → 0.2.11

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8334bda2725737d0161d5ec5494a7e32718289f6
4
- data.tar.gz: 25172bccca7b0e90f462358a6ce4075208b53142
3
+ metadata.gz: 6b7400f376dbef697ba8dbce21afce315c971d43
4
+ data.tar.gz: cd299fb45520ec614be5386a3fc2e66a057cb2e2
5
5
  SHA512:
6
- metadata.gz: 116149373c94c48366bb1c4689be781248a352f5b42ba7657b43c79eeff1efd140bd42bff3a6d3a0416af9e7b39e972326bb1a4b4ee1da972d6ef387b52ae016
7
- data.tar.gz: 82c4917f3878cd3c52689c1da7d22017a567091aa29efa61f9f4b1ead162fbbbc20f3d54ebe0ead0d2ba7e03d1d82cd124add70fdc419a69b962dfb748357378
6
+ metadata.gz: 9fdba13c8c3933340a6770941f42117944f68ac701bc90591cc4fb053d75f6a2efe2361fc8ef71d58ee442a48cb4889ad6131a2334a77418243d3cb4d10ac1e8
7
+ data.tar.gz: c42a6814a3eda9a3bef8fb364783bf60abca9d4cd0671ebc5cd3da92b29f54ff2fbbab60b296888d537eed8b5b6848c5b1304827b41b938d08345bbcea808271
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # GTFS Reader
2
2
 
3
3
  ```ruby
4
- gem 'gtfs-reader'
4
+ gem 'gtfs_reader'
5
5
  ```
6
6
 
7
7
  GTFS Reader is a gem designed to help process the contents of a "[GTFS
@@ -26,10 +26,10 @@ require 'gtfs_reader'
26
26
 
27
27
  GtfsReader.config do
28
28
  return_hashes true
29
-
29
+ # verbose true #uncomment for verbose output
30
30
  sources do
31
31
  sample do
32
- url 'http://localhost/sample-feed.zip'
32
+ url 'http://localhost/sample-feed.zip' # you can also use a filepath here
33
33
  before { |etag| puts "Processing source with tag #{etag}..." }
34
34
  handlers do
35
35
  agency {|row| puts "Read Agency: #{row[:agency_name]}" }
@@ -55,3 +55,42 @@ Read Route: Stagecoach - Airport Shuttle
55
55
  Read Route: City
56
56
  Read Route: Airport - Amargosa Valley
57
57
  ```
58
+
59
+ ## Custom Feed Format
60
+
61
+ By default, this gem parses files in the format specified by the [GTFS Feed
62
+ Spec](https://developers.google.com/transit/gtfs/reference). You can see this
63
+ `FeedDefinition` in [config/defaults/gtfs_feed_definition.rb](https://github.com/sangster/gtfs_reader/blob/develop/lib/gtfs_reader/config/defaults/gtfs_feed_definition.rb).
64
+ However, in many cases these feeds are created by people who aren't
65
+ technically-proficient and may not exactly conform to the spec. In the event
66
+ that you want to parse a file with a different format, you can do so in the
67
+ `GtfsReader.config` block:
68
+
69
+ ```ruby
70
+ GtfsReader.config do
71
+ sources do
72
+ sample do
73
+ feed_definition do
74
+ file :drivers, required: true do # for my_file.txt
75
+ col :licence_number, required: true, unique: true
76
+
77
+ # If the sex column contains "1", the symbol :male will be returned,
78
+ # otherwise :female will be returned
79
+ col :sex, &output_map( :unspecified, female: ?1, male: ?2 )
80
+
81
+ # This will allow you to create a custom parser. Within the given
82
+ # block you can reference other columns in the current row by name.
83
+ col :name do |name|
84
+ case name
85
+ when :female then "Ms. #{name}"
86
+ when :male then "Mr. #{name}"
87
+ else name
88
+ end
89
+ end
90
+ end
91
+ end
92
+ # ...
93
+ end
94
+ end
95
+ end
96
+ ```
data/Rakefile CHANGED
@@ -17,9 +17,9 @@ rescue Bundler::BundlerError => e
17
17
  end
18
18
 
19
19
  Jeweler::Tasks.new do |gem|
20
- gem.name = 'gtfs-reader'
20
+ gem.name = 'gtfs_reader'
21
21
  gem.version = GtfsReader::Version.to_s
22
- gem.homepage = 'http://github.com/sangster/gtfs-reader'
22
+ gem.homepage = 'http://github.com/sangster/gtfs_reader'
23
23
  gem.license = 'GPL 3'
24
24
  gem.summary = 'Read General Transit Feed Specification zip files'
25
25
  gem.description = <<-EOF.strip.gsub /\s+/, ' '
@@ -10,20 +10,13 @@ module GtfsReader
10
10
  #@param name [String] the name of the column
11
11
  #@option opts [Boolean] :required (false) If this column is required to
12
12
  # appear in the given file
13
- #@option opts [String] :alias an alternative name for this column. Many
14
- # column names are needlessly prefixed with their filename:
15
- # +Stop.stop_name+ could be aliased to +Stop.name+ for example.
16
13
  #@option opts [Boolean] :unique (false) if values in this column need to be
17
14
  # unique among all rows in the file.
18
15
  def initialize(name, opts={}, &parser)
19
16
  @name = name
20
17
  @parser = block_given? ? parser : IDENTITY_PARSER
21
18
 
22
- @opts = {
23
- required: false,
24
- unique: false,
25
- alias: nil
26
- }.merge (opts || {})
19
+ @opts = { required: false, unique: false }.merge ( opts || {} )
27
20
  end
28
21
 
29
22
  def parser(&block)
@@ -42,11 +35,6 @@ module GtfsReader
42
35
  @opts[:unique]
43
36
  end
44
37
 
45
- #@return [String,nil] this column's name's alias, if there is one
46
- def alias
47
- @opts[:alias]
48
- end
49
-
50
38
  #@return [Boolean]
51
39
  def parser?
52
40
  parser != IDENTITY_PARSER
@@ -1,34 +1,35 @@
1
1
  require_relative '../feed_definition'
2
2
 
3
+ # This default config file creates a [FeedDefinition] that matches the one
4
+ # specified by Google. You can use this definition in most cases. A custom
5
+ # definition will only be required if you need to parse a feed that differs in
6
+ # some critical way (Remember that these feeds are not always created by
7
+ # technically-proficient people).
8
+ # See https://developers.google.com/transit/gtfs/reference
3
9
  module GtfsReader
4
10
  module Config
5
11
  module Defaults
6
12
  FEED_DEFINITION = FeedDefinition.new.tap do |feed|
7
13
  feed.instance_exec do
8
14
  file :agency, required: true do
9
- prefix :agency do
10
- col :name, required: true
11
- col :url, required: true
12
- col :timezone, required: true
13
- col :id, unique: true
14
- col :lang
15
- col :phone
16
- col :fare_url
17
- end
15
+ col :agency_name, required: true
16
+ col :agency_url, required: true
17
+ col :agency_timezone, required: true
18
+ col :agency_id, unique: true
19
+ col :agency_lang
20
+ col :agency_phone
21
+ col :agency_fare_url
18
22
  end
19
23
 
20
24
  file :stops, required: true do
21
- prefix :stop do
22
- col :id, required: true, unique: true
23
- col :code
24
- col :name, required: true
25
- col :desc
26
- col :lat, required: true
27
- col :lon, required: true
28
- col :url
29
- col :timezone
30
- end
31
-
25
+ col :stop_id, required: true, unique: true
26
+ col :stop_code
27
+ col :stop_name, required: true
28
+ col :stop_desc
29
+ col :stop_lat, required: true
30
+ col :stop_lon, required: true
31
+ col :stop_url
32
+ col :stop_timezone
32
33
  col :zone_id
33
34
  col :location_type, &output_map( :stop, station: ?1 )
34
35
  col :parent_station
@@ -51,59 +52,47 @@ module GtfsReader
51
52
  end
52
53
 
53
54
  file :routes, required: true do
54
- prefix :route do
55
- col :id, required: true, unique: true
56
- col :short_name, required: true
57
- col :long_name, required: true
58
- col :desc
59
- col :type, required: true,
55
+ col :route_id, required: true, unique: true
56
+ col :route_short_name, required: true
57
+ col :route_long_name, required: true
58
+ col :route_desc
59
+ col :route_type, required: true,
60
60
  &output_map( :unknown,
61
- tram: ?0,
62
- subway: ?1,
63
- rail: ?2,
64
- bus: ?3,
65
- ferry: ?4,
66
- cable_car: ?5,
67
- gondola: ?6,
68
- funicular: ?7 )
69
- col :url
70
- col :color
71
- col :text_color
72
- end
73
-
61
+ tram: ?0,
62
+ subway: ?1,
63
+ rail: ?2,
64
+ bus: ?3,
65
+ ferry: ?4,
66
+ cable_car: ?5,
67
+ gondola: ?6,
68
+ funicular: ?7 )
69
+ col :route_url
70
+ col :route_color
71
+ col :route_text_color
74
72
  col :agency_id
75
73
  end
76
74
 
77
75
  file :trips, required: true do
78
- prefix :trip do
79
- col :id, required: true, unique: true
80
- col :headsign
81
- col :short_name
82
- col :long_name
83
- end
84
-
76
+ col :trip_id, required: true, unique: true
77
+ col :trip_headsign
78
+ col :trip_short_name
79
+ col :trip_long_name
85
80
  col :route_id, required: true
86
81
  col :service_id, required: true
87
- col :direction_id,
88
- &output_map( primary: ?0, opposite: ?1 )
82
+ col :direction_id, &output_map( primary: ?0, opposite: ?1 )
89
83
  col :block_id
90
84
  col :shape_id
91
- col :wheelchair_accessible,
92
- &output_map( :unknown, yes: ?1, no: ?2 )
93
- col :bikes_allowed,
94
- &output_map( :unknown, yes: ?1, no: ?2 )
85
+ col :wheelchair_accessible, &output_map( :unknown, yes: ?1, no: ?2 )
86
+ col :bikes_allowed, &output_map( :unknown, yes: ?1, no: ?2 )
95
87
  end
96
88
 
97
89
  file :stop_times, required: true do
98
90
  col :trip_id, required: true
99
91
  col :arrival_time, required: true
100
92
  col :departure_time, required: true
101
-
102
- prefix :stop do
103
- col :id, required: true
104
- col :sequence, required: true
105
- col :headsign
106
- end
93
+ col :stop_id, required: true
94
+ col :stop_sequence, required: true
95
+ col :stop_headsign
107
96
 
108
97
  col :pickup_type,
109
98
  &output_map( :regular,
@@ -122,15 +111,13 @@ module GtfsReader
122
111
 
123
112
  file :calendar, required: true do
124
113
  col :service_id, required: true, unique: true
125
-
126
- col :monday, required: true, &output_map( yes: ?1, no: ?0 )
127
- col :tuesday, required: true, &output_map( yes: ?1, no: ?0 )
128
- col :wednesday, required: true, &output_map( yes: ?1, no: ?0 )
129
- col :thursday, required: true, &output_map( yes: ?1, no: ?0 )
130
- col :friday, required: true, &output_map( yes: ?1, no: ?0 )
131
- col :saturday, required: true, &output_map( yes: ?1, no: ?0 )
132
- col :sunday, required: true, &output_map( yes: ?1, no: ?0 )
133
-
114
+ col :monday, required: true, &output_map( yes: ?1, no: ?0 )
115
+ col :tuesday, required: true, &output_map( yes: ?1, no: ?0 )
116
+ col :wednesday, required: true, &output_map( yes: ?1, no: ?0 )
117
+ col :thursday, required: true, &output_map( yes: ?1, no: ?0 )
118
+ col :friday, required: true, &output_map( yes: ?1, no: ?0 )
119
+ col :saturday, required: true, &output_map( yes: ?1, no: ?0 )
120
+ col :sunday, required: true, &output_map( yes: ?1, no: ?0 )
134
121
  col :start_date
135
122
  col :end_date
136
123
  end
@@ -162,13 +149,11 @@ module GtfsReader
162
149
  end
163
150
 
164
151
  file :shapes do
165
- prefix :shape do
166
- col :id, required: true
167
- col :pt_lat, required: true
168
- col :pt_lon, required: true
169
- col :pt_sequence, required: true
170
- col :dist_traveled
171
- end
152
+ col :shape_id, required: true
153
+ col :shape_pt_lat, required: true
154
+ col :shape_pt_lon, required: true
155
+ col :shape_pt_sequence, required: true
156
+ col :shape_dist_traveled
172
157
  end
173
158
 
174
159
  file :frequencies do
@@ -176,8 +161,7 @@ module GtfsReader
176
161
  col :start_time, required: true
177
162
  col :end_time, required: true
178
163
  col :headway_secs, required: true
179
- col :exact_times,
180
- &output_map( :inexact, exact: 1 )
164
+ col :exact_times, &output_map( :inexact, exact: 1 )
181
165
  end
182
166
 
183
167
  file :transfers do
@@ -192,14 +176,12 @@ module GtfsReader
192
176
  end
193
177
 
194
178
  file :feed_info do
195
- prefix :scope do
196
- col :publisher_name, required: true
197
- col :publisher_url, required: true
198
- col :lang, required: true
199
- col :start_date
200
- col :end_date
201
- col :version
202
- end
179
+ col :feed_publisher_name, required: true
180
+ col :feed_publisher_url, required: true
181
+ col :feed_lang, required: true
182
+ col :feed_start_date
183
+ col :feed_end_date
184
+ col :feed_version
203
185
  end
204
186
  end
205
187
  end
@@ -1,5 +1,4 @@
1
1
  require_relative 'column'
2
- require_relative 'prefixed_column_setter'
3
2
 
4
3
  module GtfsReader
5
4
  module Config
@@ -13,7 +12,6 @@ module GtfsReader
13
12
  def initialize(name, opts={})
14
13
  @name, @columns = name, {}
15
14
  @opts = { required: false }.merge (opts || {})
16
- @aliases = {}
17
15
  end
18
16
 
19
17
  #@return [Boolean] If this file is required to be in the feed.
@@ -62,27 +60,12 @@ module GtfsReader
62
60
  #@yieldreturn Any kind of object.
63
61
  #@return [Column] The newly created column.
64
62
  def col(name, *args, &block)
65
- name = @aliases[name] if @aliases.key? name
66
-
67
63
  if @columns.key? name
68
64
  @columns[name].parser &block if block_given?
69
65
  return @columns[name]
70
66
  end
71
67
 
72
- (@columns[name] = Column.new name, args.first, &block).tap do |col|
73
- @aliases[col.alias] = name if col.alias
74
- end
75
- end
76
-
77
- # Starts a new block within which any defined columns will have the given
78
- # +sym+ prefixed to its name (joined with an underscore). Also, the
79
- # defined name given within the block will be aliased to the column.
80
- #@param sym the prefix to prefixed to each column within the block
81
- #
82
- #@example Create a column +route_name+ with the alias +name+
83
- # prefix( :route ) { name }
84
- def prefix(sym, &blk)
85
- PrefixedColumnSetter.new(self, sym.to_s).instance_exec &blk
68
+ @columns[name] = Column.new name, args.first, &block
86
69
  end
87
70
 
88
71
  # Creates an input-output proc to convert column values from one form to
@@ -42,12 +42,13 @@ module GtfsReader
42
42
  def update_verbosely(name)
43
43
  source = config.sources[name]
44
44
  raise UnknownSourceError, "No source named '#{name}'" if source.nil?
45
+
45
46
  updater = SourceUpdater.new name, source
46
47
  begin
47
48
  updater.instance_exec do
48
49
  Log.info { "Updating #{name.to_s.green}".underline }
49
50
  before_callbacks
50
- read
51
+ download_source
51
52
  check_files
52
53
  check_columns
53
54
  process_files
@@ -37,6 +37,7 @@ module GtfsReader
37
37
  logger.level
38
38
  end
39
39
 
40
+ # Silence the logger for the duration of the given block
40
41
  def quiet
41
42
  old_logger = @logger
42
43
  begin
@@ -1,12 +1,15 @@
1
+ require 'active_support/core_ext/object/try'
2
+ require 'csv'
1
3
  require 'net/http'
2
4
  require 'open-uri'
3
- require 'zip/filesystem'
4
- require 'csv'
5
5
  require 'uri'
6
+ require 'zip/filesystem'
6
7
 
7
8
  require_relative 'file_reader'
8
9
 
9
10
  module GtfsReader
11
+ # Downloads remote Feed files, checks that they are valid, and passes each
12
+ # file in the feed to the handlers in the given [Source].
10
13
  class SourceUpdater
11
14
  #@param name [String] an arbitrary string describing this source
12
15
  #@param source [Source]
@@ -15,54 +18,49 @@ module GtfsReader
15
18
  @temp_files = {}
16
19
  end
17
20
 
21
+ # Call the "before" callback set on this source
18
22
  def before_callbacks
19
- @source.before.call fetch_data_set_identifier if @source.before
23
+ if @source.before
24
+ @source.before.call fetch_data_set_identifier
25
+ end
20
26
  end
21
27
 
22
28
  # Download the data from the remote server
23
- def read
29
+ def download_source
24
30
  Log.debug { " Reading #{@source.url.green}" }
25
- extract_zip_to_tempfiles
26
- Log.debug { "Finished reading #{@source.url.green}" }
27
- end
31
+ zip = Tempfile.new 'gtfs'
32
+ zip.binmode
33
+ zip << open(@source.url).read
34
+ zip.rewind
28
35
 
29
- def extract_zip_to_tempfiles
30
- file = Tempfile.new 'gtfs'
31
- file.binmode
32
- file << open(@source.url).read
33
- file.rewind
36
+ extract_to_tempfiles zip
34
37
 
35
- Zip::File.open(file).each do |entry|
36
- temp = Tempfile.new "gtfs_file_#{entry.name}"
37
- temp << entry.get_input_stream.read
38
- temp.close
39
- @temp_files[entry.name] = temp
40
- end
41
-
42
- file.close
38
+ Log.debug { "Finished reading #{@source.url.green}" }
39
+ rescue Exception => e
40
+ Log.error e.message
41
+ raise e
42
+ ensure
43
+ zip.try :close
43
44
  end
44
45
 
45
46
  def close
46
47
  @temp_files.values.each &:close
47
48
  end
48
49
 
50
+ # Parse the filenames in the feed and check which required and optional
51
+ # files are present.
52
+ #@raise [RequiredFilenamesMissing] if the feed is missing a file which is
53
+ # marked as "required" in the [FeedDefinition]
49
54
  def check_files
50
55
  @found_files = []
51
56
  check_required_files
52
57
  check_optional_files
53
- end
54
-
55
- def check_required_files
56
- Log.info { 'required files'.magenta }
57
- files = @source.feed_definition.required_files
58
- missing = check_missing_files files, :green, :red
59
- raise RequiredFilenamesMissing, missing unless missing.empty?
60
- end
61
-
62
- def check_optional_files
63
- Log.info { 'optional files'.cyan }
64
- files = @source.feed_definition.optional_files
65
- check_missing_files files, :cyan, :light_yellow
58
+ # Add feed files of zip to the list of files to be processed
59
+ @source.feed_definition.files.each do |req|
60
+ if filenames.include? req.filename
61
+ @found_files << req
62
+ end
63
+ end
66
64
  end
67
65
 
68
66
  # Check that every file has its required columns
@@ -86,7 +84,16 @@ module GtfsReader
86
84
 
87
85
  private
88
86
 
89
- # Checks for the given list of expected filenames in the zip file
87
+ def extract_to_tempfiles(zip)
88
+ Zip::File.open(zip).each do |entry|
89
+ temp = Tempfile.new "gtfs_file_#{entry.name}"
90
+ temp << entry.get_input_stream.read
91
+ temp.close
92
+ @temp_files[entry.name] = temp
93
+ end
94
+ end
95
+
96
+ # Check for the given list of expected filenames in the zip file
90
97
  def check_missing_files(expected, found_color, missing_color)
91
98
  check = '✔'.colorize found_color
92
99
  cross = '✘'.colorize missing_color
@@ -95,7 +102,6 @@ module GtfsReader
95
102
  filename = req.filename
96
103
  if filenames.include? filename
97
104
  Log.info { "#{filename.rjust filename_width} [#{check}]" }
98
- @found_files << req
99
105
  nil
100
106
  else
101
107
  Log.info { "#{filename.rjust filename_width} [#{cross}]" }
@@ -104,6 +110,8 @@ module GtfsReader
104
110
  end.compact
105
111
  end
106
112
 
113
+ #@return <FixNum> the maximum string-width of the filenames, so they can be
114
+ # aligned when printed on the console.
107
115
  def filename_width
108
116
  @filename_width ||= @source.feed_definition.files.max do |a, b|
109
117
  a.filename.length <=> b.filename.length
@@ -114,31 +122,45 @@ module GtfsReader
114
122
  @temp_files.keys
115
123
  end
116
124
 
117
- # Performs a HEAD request against the source's URL, in an attempt to
118
- # return a unique identifier for the remote data set. It will choose a
119
- # header from the result in the given order of preference:
125
+ # Perform a HEAD request against the source's URL, looking for a unique
126
+ # identifier for the remote data set. It will choose a header from the
127
+ # result in the given order of preference:
120
128
  # - ETag
121
129
  # - Last-Modified
122
130
  # - Content-Length (may result in different data sets being considered
123
131
  # the same if they happen to have the same size)
124
132
  # - The current date/time (this will always result in a fresh download)
125
133
  def fetch_data_set_identifier
126
- uri = URI @source.url
127
- Net::HTTP.start(uri.host) do |http|
128
- head_request = http.request_head uri.path
129
- if head_request.key? 'etag'
130
- head_request['etag']
131
- else
132
- Log.warn "No ETag supplied with: #{uri.path}"
133
-
134
- if head_request.key? 'last-modified'
135
- head_request['last-modified']
136
- elsif head_request.key? 'content-length'
137
- head_request['content-length']
134
+ if @source.url =~ /\A#{URI::regexp}\z/
135
+ uri = URI @source.url
136
+ Net::HTTP.start(uri.host) do |http|
137
+ head_request = http.request_head uri.path
138
+ if head_request.key? 'etag'
139
+ head_request['etag']
138
140
  else
139
- Time.now.to_s
141
+ Log.warn "No ETag supplied with: #{uri.path}"
142
+ fetch_http_fallback_identifier head_request
140
143
  end
141
144
  end
145
+ else # it's not a url, it may be a file => last modified
146
+ begin
147
+ File.mtime @source.url
148
+ rescue StandardError => e
149
+ Log.error e
150
+ raise e
151
+ end
152
+ end
153
+ end
154
+
155
+ # Find a "next best" ID when the HEAD request does not return an "ETag"
156
+ # header.
157
+ def fetch_http_fallback_identifier(head_request)
158
+ if head_request.key? 'last-modified'
159
+ head_request['last-modified']
160
+ elsif head_request.key? 'content-length'
161
+ head_request['content-length']
162
+ else
163
+ Time.now.to_s
142
164
  end
143
165
  end
144
166
 
@@ -153,5 +175,20 @@ module GtfsReader
153
175
  @source.handlers.handle_file file.name, reader
154
176
  end
155
177
  end
178
+
179
+ #@raise [RequiredFilenamesMissing] if a file is missing a header which is
180
+ # marked as "required" in the [FeedDefinition]
181
+ def check_required_files
182
+ Log.info { 'required files'.magenta }
183
+ files = @source.feed_definition.required_files
184
+ missing = check_missing_files files, :green, :red
185
+ raise RequiredFilenamesMissing, missing unless missing.empty?
186
+ end
187
+
188
+ def check_optional_files
189
+ Log.info { 'optional files'.cyan }
190
+ files = @source.feed_definition.optional_files
191
+ check_missing_files files, :cyan, :light_yellow
192
+ end
156
193
  end
157
194
  end
@@ -3,9 +3,9 @@ module GtfsReader
3
3
  # {Bumper} class which will modify this file to increase the version
4
4
  module Version
5
5
  # The following four lines are generated, so don't mess with them.
6
- MAJOR = 0
7
- MINOR = 2
8
- PATCH = 8
6
+ MAJOR = 1
7
+ MINOR = 0
8
+ PATCH = 0
9
9
  BUILD = nil
10
10
 
11
11
  #@return [String] the current version in the form of +1.2.3.build+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gtfs-reader
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Sangster
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-05 00:00:00.000000000 Z
11
+ date: 2014-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: log4r
@@ -136,9 +136,7 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '4.2'
139
- description: 'Reads and parses zip files conforming to Google''s GTFS spec. Such files
140
- can take up quite a bit of memory when inflated, so this gem prefers to read them
141
- as a stream of rows. GTFS Spec: https://developers.google.com/transit/gtfs'
139
+ description: Renamed to gtfs_reader. See https://rubygems.org/gems/gtfs_reader
142
140
  email: jon@ertt.ca
143
141
  executables: []
144
142
  extensions: []
@@ -155,7 +153,6 @@ files:
155
153
  - lib/gtfs_reader/config/defaults/gtfs_feed_definition.rb
156
154
  - lib/gtfs_reader/config/feed_definition.rb
157
155
  - lib/gtfs_reader/config/file_definition.rb
158
- - lib/gtfs_reader/config/prefixed_column_setter.rb
159
156
  - lib/gtfs_reader/config/source.rb
160
157
  - lib/gtfs_reader/config/sources.rb
161
158
  - lib/gtfs_reader/configuration.rb
@@ -171,7 +168,12 @@ homepage: http://github.com/sangster/gtfs-reader
171
168
  licenses:
172
169
  - GPL 3
173
170
  metadata: {}
174
- post_install_message:
171
+ post_install_message: |
172
+ ! The 'gtfs-reader' gem has been deprecated and has been replaced by
173
+ ! 'gtfs_reader' to follow rubygem.org's naming convention.
174
+ ! See: https://rubygems.org/gems/gtfs_reader
175
+ ! And: https://github.com/sangster/gtfs_reader
176
+ ! And: http://guides.rubygems.org/name-your-gem
175
177
  rdoc_options: []
176
178
  require_paths:
177
179
  - lib
@@ -1,26 +0,0 @@
1
- module GtfsReader
2
- module Config
3
- class PrefixedColumnSetter
4
- def initialize(definition, prefix)
5
- @definition, @prefix = definition, prefix.to_sym
6
- end
7
-
8
- def col(name_alias, *args, &blk)
9
- name = "#{@prefix}_#{name_alias}"
10
- opts =
11
- case args.first
12
- when ::Hash then args.first
13
- else {}
14
- end
15
- opts[:alias] = name_alias
16
- args[0] = opts
17
-
18
- @definition.col name.to_sym, *args, &blk
19
- end
20
-
21
- def output_map(*args, &block)
22
- @definition.output_map *args, &block
23
- end
24
- end
25
- end
26
- end