lothianbusestimetable 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6802c5354c2dbd6e9312f333ce0b7b9a2076cdb
4
- data.tar.gz: 73dfb063629361ca8a03157faf17748f52994ec9
3
+ metadata.gz: c4f7f7c0e1ed96b68f78ef7f9bddf81375b8ecd2
4
+ data.tar.gz: a6e0bdb8b9ca8f2c0599033de6d07c8937afa21b
5
5
  SHA512:
6
- metadata.gz: cb8b225f2d9ec7bd18fa726e2d25acc24b65eecb7f701fe7fb109672e51712faa3e3a196376a075103ce22b2ed26764a04d4093cc0c902113694f6823fce826a
7
- data.tar.gz: f803b70caef9250d09645059ef17087d6391eb19d9dcdfb4ddd453773c0548eea5b8e13c707003173f38f2c61f6f2055103aaae195cdd25ffe31a68847431413
6
+ metadata.gz: 942477a77c162efcca923b19bcd46d24c71ac60a9a5ba1309aafdae6b8b1c98dbbd66f2c2aa0caeb5ab02fcac30f079f9cffd23cdcde5e0de8ce674a7c7efb12
7
+ data.tar.gz: 1f530cbb5f9f553557794c7ee82a7adb1b37ed688e86c17298b20855524e9100515fad05ff8aeb3052036e4cb01486e4053e74ad8b6202d06290836e306d7230
checksums.yaml.gz.sig CHANGED
Binary file
@@ -37,59 +37,86 @@ class LothianBusesTimetable
37
37
 
38
38
  table = doc.root.element('//table')
39
39
 
40
- prev_col = ''
40
+ prev_col, prev_bus_stop = '', ''
41
41
  a0 = []
42
+
43
+ tablebreak = 0
42
44
 
43
45
  # get the destinations
44
46
  # inbound and outbound
45
47
  table.xpath('tr').each do |tr|
46
48
 
47
49
  # get the name
48
- a = tr.xpath('td//text()').map(&:unescape)
50
+ tds = tr.xpath('td')#.map(&:unescape)
49
51
 
50
- next unless a.any?
52
+ a = tds.flat_map {|x| r = x.xpath('.//text()').map(&:unescape); r.any? ? r : ''}
51
53
 
52
- col1 = a.shift.strip
54
+ next unless a.any?
53
55
 
54
- if col1 =~ /^Service (\w?\d+)/ and a0.empty?then
56
+ col1 = a.shift.strip.gsub(',','')
57
+
58
+ if col1 =~ /^Service (\w?\d+(?:\s*\/\s*\w?\d+)?)/ then
55
59
 
56
60
  a0 << {service: $1}
61
+ tablebreak = 0
57
62
 
58
- elsif prev_col =~ /^Service \w?\d+$/
59
-
63
+ elsif prev_col =~ /^Service \w?\d+(?:\s*\/\s*\w?\d+)?/
64
+
60
65
  a0.last.merge!(timetable: col1)
61
66
  a0 << {}
62
- #=begin
67
+
68
+ elsif col1.empty? and prev_col.empty? and a.length <= 1
69
+ a0 << {}
70
+ next
63
71
  elsif col1.empty? and a.length > 1
72
+
73
+ tablebreak += 1 if a0.last and a0.last.any?
64
74
  next
65
75
  elsif col1.empty? or a.length <= 1
66
76
 
67
- #next if a.length < 1
68
- if prev_col.empty? or prev_col.length <= 1 and a0.last and a0.last.any? then
77
+ tablebreak += 1 if a0.last and a0.last.any?
78
+ if (prev_col.empty? or prev_col.length <= 1) and a0.last and a0.last.any? then
79
+
80
+ if a0.last.keys.first == col1 and prev_col.empty? and a0.last.keys.length > 1 then
69
81
 
70
- a0 << {}
82
+ a0 << {}
83
+ end
71
84
 
72
85
  else
73
86
 
74
87
  prev_col = ''
75
88
  end
76
- #=end
89
+
77
90
  else
78
91
 
79
- if a.any? and a.length > 1 then
92
+ if a.any? and a.length > 2 and a0.last and col1.length < 40 then
93
+
94
+ if a0.last.keys.last == col1 and prev_col.empty? and a0.last.keys.length > 1 then
95
+
96
+ a0 << {}
97
+ end
80
98
 
81
99
  next if col1.empty?
82
100
  h = a0.last
83
-
101
+
102
+ tablebreak = 0 if h.empty?
84
103
  if h.has_key? col1 then
85
- h[col1].concat a
104
+
105
+ if tablebreak == 0 then
106
+ col1 = col1 + ' [R]'
107
+ h[col1] = a
108
+ else
109
+ h[col1].concat a.take(19)
110
+ end
86
111
  else
87
- h[col1] = a
112
+ h[col1] = a.take(19)
88
113
  end
89
114
 
115
+
90
116
  else
91
117
 
92
- #a0.pop if a0.last.empty?
118
+ tablebreak += 1
119
+
93
120
  next
94
121
  end
95
122
  end
@@ -97,55 +124,17 @@ class LothianBusesTimetable
97
124
  prev_col = col1
98
125
 
99
126
  end
100
-
101
-
102
- master = {
103
- service: '',
104
- weekday: {desc: '', inbound: {}, outbound: {}},
105
- saturday: {desc: '', inbound: {}, outbound: {}},
106
- sunday: {desc: '', inbound: {}, outbound: {}}
107
- }
108
-
109
- h = a0.shift
110
-
111
- master[:service] = h[:service]
112
- master[:weekday][:desc] = h[:timetable]
113
-
114
- h = a0.shift
115
-
116
- master[:weekday][:inbound] = h
117
- h = a0.shift
118
-
119
- master[:weekday][:outbound] = h
120
-
121
- h = a0.shift
122
- h = a0.shift until h.any?
123
-
124
- master[:saturday][:desc] = h[:timetable]
125
- h = a0.shift
126
- master[:saturday][:inbound] = h
127
- h = a0.shift
128
- master[:saturday][:outbound] = h
129
-
130
- h = a0.shift
127
+ #puts 'a0: ' + a0.inspect
128
+
129
+ master = build_timetable(a0)
131
130
 
132
- if h and a0.any? then
133
-
134
- h = a0.shift until h.any?
135
- master[:sunday][:desc] = h[:timetable]
136
- h = a0.shift
137
- master[:sunday][:inbound] = h
138
- h = a0.shift
139
- master[:sunday][:outbound] = h
140
-
141
- end
142
-
131
+ #puts 'master: ' + master.inspect
143
132
 
144
133
  master.to_a[1..-1].each do |key, timetable|
145
134
 
146
135
  timetable.to_a[1..-1].each do |direction, printed_rows|
147
136
 
148
- next unless printed_rows
137
+ next unless printed_rows
149
138
 
150
139
  # find the interval gaps
151
140
 
@@ -164,6 +153,7 @@ class LothianBusesTimetable
164
153
  end
165
154
 
166
155
 
156
+
167
157
  # sanitise the times (where short hand times are
168
158
  # given i.e. minutes only)
169
159
 
@@ -210,7 +200,6 @@ class LothianBusesTimetable
210
200
 
211
201
  gap_times = gaps.zip(periods)
212
202
 
213
-
214
203
  intervaltimes = gap_times.map do |i, desc|
215
204
 
216
205
  intervals = []
@@ -222,6 +211,7 @@ class LothianBusesTimetable
222
211
  new_rows = every_hourlyset_interval printed_rows, i
223
212
  else
224
213
  interval = desc[/then (?:at least )?every (\d+) mins(?: until)?/,1]
214
+
225
215
  new_rows = every_interval printed_rows, i, interval
226
216
  end
227
217
 
@@ -271,11 +261,86 @@ class LothianBusesTimetable
271
261
 
272
262
  private
273
263
 
264
+ def build_timetable(a0)
265
+
266
+ master = {
267
+ service: '',
268
+ weekday: {desc: '', inbound: {}, outbound: {}},
269
+ saturday: {desc: '', inbound: {}, outbound: {}},
270
+ sunday: {desc: '', inbound: {}, outbound: {}}
271
+ }
272
+
273
+ h = a0.shift
274
+
275
+ master[:service] = h[:service]
276
+ h = a0.shift until h.any? #
277
+ master[:weekday][:desc] = h[:timetable]
278
+
279
+ #h = a0.shift
280
+ h = a0.shift until h.any? and not h[:service]
281
+
282
+ master[:weekday][:inbound] = h
283
+ h = a0.shift
284
+ a0.reject! {|x| x.empty?}
285
+
286
+
287
+ if a0.first and a0.first.any? then
288
+
289
+ #h = a0.shift
290
+ h = a0.shift until h.any?
291
+
292
+ master[:weekday][:outbound] = h unless h.has_key? :timetable
293
+
294
+ h = a0.shift unless h.has_key? :timetable
295
+
296
+
297
+ if h and a0.any? and h[:timetable] != 'Public Holiday Timetable' then
298
+
299
+ h = a0.shift until h.any?
300
+
301
+ master[:saturday][:desc] = h[:timetable]
302
+ h = a0.shift until h.any? and not h[:service]
303
+ master[:saturday][:inbound] = h
304
+ h = a0.shift
305
+
306
+ return master unless a0.any?
307
+ h = a0.shift until h.any?
308
+
309
+ master[:saturday][:outbound] = h unless h.has_key? :timetable
310
+
311
+
312
+ h = a0.shift until h.any?
313
+
314
+ if h and a0.any? then
315
+ h = a0.shift
316
+ h = a0.shift until h.any?
317
+ master[:sunday][:desc] = h[:timetable]
318
+ h = a0.shift
319
+ h = a0.shift until h.any?
320
+
321
+ master[:sunday][:inbound] = h
322
+ h = a0.shift until h.any?
323
+ master[:sunday][:outbound] = h
324
+
325
+ end
326
+ end
327
+ end
328
+
329
+ return master
330
+ end
331
+
274
332
  def every_hourlyset_interval(rows, i)
275
333
 
276
334
  rows.map do |k,v|
277
-
278
- i -= 19 if v.length < i # caters for special journey entries which happen at limited times of the day
335
+
336
+ # some limited bus stops don't apply
337
+ next unless v.detect {|x| x =~ /^\d{2} *$/}
338
+
339
+ # the next statement caters for special journey entries which happen at
340
+ # limited times of the day
341
+
342
+ i -= 19 if v.length < i
343
+
279
344
  start_i = i - 1
280
345
 
281
346
  start_i -= 1 while v[start_i] =~ /^(?:\d{2}|-|\||[A-Z]|) *$/
@@ -291,7 +356,7 @@ class LothianBusesTimetable
291
356
  prev_time = t1
292
357
 
293
358
  t2 = t1
294
- #j = v[i+1] =~ /^\d{4}/ ? i+1 : i+2
359
+
295
360
  j = i + 1
296
361
  j += 1 until v[j] =~ /^\d{4}/
297
362
 
@@ -321,15 +386,40 @@ class LothianBusesTimetable
321
386
  end
322
387
 
323
388
  def every_interval(rows, i, interval=60)
324
-
389
+ # todo 26-Aug-2017
390
+ # here we will add
325
391
  return unless interval
326
392
 
327
393
  rows.map do |k,v|
394
+
395
+ next unless v.is_a? Array
328
396
 
329
397
  times = []
330
398
 
331
- next unless v[i-1] && v[i-1] =~ /^\d{4}$/
399
+ next unless v[i-1]
400
+
401
+ if v[i-1] =~ /^\d{2} *$/ then
402
+
403
+ j = i - 1
404
+ j -= 1 until v[j] =~ /^\d{4}/
405
+
406
+ t0 = Time.strptime(v[j], "%H%M")
407
+ prev_time = t0
408
+
409
+ (j+1..i-1).each do |k|
410
+
411
+ s = "%02d%s" % [t0.hour, v[k]]
412
+ new_time = Time.strptime(s, "%H%M")
413
+ new_time += (60 * 60) if new_time < prev_time
414
+ prev_time = new_time
415
+
416
+ #times << new_time.strftime("%H%M")
417
+ v[k] = new_time.strftime("%H%M")
418
+
419
+ end
420
+ end
332
421
 
422
+ next unless v[i-1] =~ /^\d{4} *$/
333
423
  t = Time.strptime(v[i-1], "%H%M") #if v[i-1] =~ /^\d{4}$/
334
424
 
335
425
  while t + (60 * interval.to_i) < Time.strptime(v[i+1], "%H%M") do
@@ -337,7 +427,7 @@ class LothianBusesTimetable
337
427
  times << t.strftime("%H%M")
338
428
  end
339
429
 
340
- [k,times]
430
+ [k, times ]
341
431
  end.compact
342
432
  end
343
433
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lothianbusestimetable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -31,7 +31,7 @@ cert_chain:
31
31
  K7yWGJq+eGl34xrLaucvTbO8Ua3rHayCkBzgfx5LVcch22Axj8quw+YGsPnhuosr
32
32
  BHdCmx9eUF/TKg==
33
33
  -----END CERTIFICATE-----
34
- date: 2017-08-26 00:00:00.000000000 Z
34
+ date: 2017-08-29 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: nokorexi
metadata.gz.sig CHANGED
Binary file