siriproxy-nextbus 0.0.1
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/config.example.nextbus.yml +25 -0
- data/lib/siriproxy-nextbus.rb +131 -0
- data/siriproxy-nextbus.gemspec +25 -0
- metadata +62 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
port: 443
|
2
|
+
log_level: 1
|
3
|
+
plugins:
|
4
|
+
# NOTE: run bundle after changing plugin configurations to update required gems
|
5
|
+
|
6
|
+
- name: 'NextBus'
|
7
|
+
path: './plugins/siriproxy-nextbus'
|
8
|
+
|
9
|
+
|
10
|
+
next_bus:
|
11
|
+
location: 'chapel-hill'
|
12
|
+
|
13
|
+
routes:
|
14
|
+
- route: 'NS'
|
15
|
+
stop: 'mannunch'
|
16
|
+
direction: 'N'
|
17
|
+
listeners: ["bus","/when.*next.*northbound.*(tennis|n s|ns|and S).*bus/i","/when.*next.*northboud.*(and|10).*sbus/i", "/when.*next.*(n s|ns).*bus.*(return|home)/i" ]
|
18
|
+
response: "The next NS bus returns in %s minutes"
|
19
|
+
|
20
|
+
|
21
|
+
- route: 'NS'
|
22
|
+
stop: 'airpwest_s'
|
23
|
+
direction: 'S'
|
24
|
+
listeners: ["/when.*next.*(tennis|n s|ns|and S).*bus/i", "/when.*next.*(10|and).*sbus/i"]
|
25
|
+
response: "The next NS bus leaves in %s minutes"
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'cora'
|
2
|
+
require 'siri_objects'
|
3
|
+
require 'nokogiri'
|
4
|
+
require 'open-uri'
|
5
|
+
|
6
|
+
#######
|
7
|
+
# Queries Chapel Hill's next bus service
|
8
|
+
######
|
9
|
+
|
10
|
+
class SiriProxy::Plugin::NextBus < SiriProxy::Plugin
|
11
|
+
|
12
|
+
|
13
|
+
#redundant: this is defined in my custom plungin manage siriproxypm-clientcachestae
|
14
|
+
def get_app_config(*args)
|
15
|
+
result = $APP_CONFIG
|
16
|
+
if args != nil \
|
17
|
+
&& (first_arg = args.shift) != nil
|
18
|
+
eval "result = result.#{first_arg}"
|
19
|
+
args.each do |arg|
|
20
|
+
if arg == nil \
|
21
|
+
|| result == nil \
|
22
|
+
|| !result.respond_to?('has_key?')\
|
23
|
+
|| !result.has_key?(arg)
|
24
|
+
result = nil
|
25
|
+
break
|
26
|
+
end
|
27
|
+
result = result[arg]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
return result
|
31
|
+
end
|
32
|
+
|
33
|
+
#redundant: this is defined in my custom plungin manage siriproxypm-clientcachestate
|
34
|
+
def ensure_regexp(regexp)
|
35
|
+
if regexp != nil
|
36
|
+
regexp.is_a?(String)
|
37
|
+
if regexp[0] == '/'
|
38
|
+
#try to make it into a regexp
|
39
|
+
regexp = eval regexp
|
40
|
+
elsif
|
41
|
+
regexp = Regexp.new("^\s*#{regexp}",true);
|
42
|
+
end
|
43
|
+
end
|
44
|
+
if regexp == nil || !regexp.is_a?(Regexp)
|
45
|
+
regexp = nil
|
46
|
+
end
|
47
|
+
return regexp
|
48
|
+
end
|
49
|
+
|
50
|
+
def add_listeners(regexps,options= {},&block)
|
51
|
+
if regexps == nil
|
52
|
+
return
|
53
|
+
end
|
54
|
+
if !regexps.respond_to?('each')
|
55
|
+
#may be a scalar value
|
56
|
+
regexps = [regexps]
|
57
|
+
end
|
58
|
+
regexps.each do |regexp|
|
59
|
+
if (regexp = ensure_regexp(regexp)) == nil \
|
60
|
+
|| !regexp.is_a?(Regexp)
|
61
|
+
next
|
62
|
+
end
|
63
|
+
listeners[regexp] = {:block => block, within_state: ([options[:within_state]].flatten)}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def initialize(config)
|
68
|
+
location = get_app_config("next_bus","location")
|
69
|
+
if location == nil || !location.is_a?(String)
|
70
|
+
return
|
71
|
+
end
|
72
|
+
buses = get_app_config("next_bus","routes")
|
73
|
+
if buses != nil \
|
74
|
+
&& buses.respond_to?('each')
|
75
|
+
buses.each do |bus_data|
|
76
|
+
if bus_data == nil \
|
77
|
+
|| !bus_data.respond_to?('has_key?')
|
78
|
+
next
|
79
|
+
end
|
80
|
+
route = bus_data["route"]
|
81
|
+
response = bus_data["response"]
|
82
|
+
stop = bus_data["stop"]
|
83
|
+
direction = bus_data["direction"]
|
84
|
+
listeners = bus_data["listeners"]
|
85
|
+
if route == nil || stop == nil || direction == nil || listeners == nil
|
86
|
+
next
|
87
|
+
end
|
88
|
+
add_listeners(listeners) {show_next_bus(route,direction,stop,response)}
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
def show_next_bus(route,direction,stop,response)
|
96
|
+
say "Let me check"
|
97
|
+
minutes = get_next_bus(route,direction,stop)
|
98
|
+
if minutes == nil || !minutes.is_a?(String)
|
99
|
+
say "Sorry. I could not find the next bus information"
|
100
|
+
else
|
101
|
+
if response == nil || !response.is_a?(String)
|
102
|
+
reponse = "The next #{route} bus is in %s minutes"
|
103
|
+
end
|
104
|
+
response = sprintf(response,minutes.strip)
|
105
|
+
say response
|
106
|
+
end
|
107
|
+
request_completed
|
108
|
+
end
|
109
|
+
|
110
|
+
def get_next_bus(route,direction,stop)
|
111
|
+
url = "http://www.nextbus.com/predictor/fancyBookmarkablePredictionLayer.shtml?a=chapel-hill&r=#{route}&d=#{direction}&s=#{stop}"
|
112
|
+
path = "//td[@class='predictionNumberForFirstPred']"
|
113
|
+
return scrape_url(url,path)
|
114
|
+
end
|
115
|
+
|
116
|
+
def scrape_url(url,path)
|
117
|
+
log "Scraping #{url}"
|
118
|
+
result = false
|
119
|
+
doc = Nokogiri::HTML(open(url))
|
120
|
+
doc.xpath(path).each do |node|
|
121
|
+
result = node.content
|
122
|
+
break
|
123
|
+
end
|
124
|
+
log "Scraped #{result}"
|
125
|
+
return result
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "siriproxy-nextbus"
|
6
|
+
s.version = "0.0.1"
|
7
|
+
s.authors = ["litlfred"]
|
8
|
+
s.email = [""]
|
9
|
+
s.homepage = ""
|
10
|
+
s.summary = %q{Get Next Bus Information for Chapel Hill}
|
11
|
+
s.description = %q{Queries against http://www.nextbus.com to get the next bus}
|
12
|
+
|
13
|
+
s.rubyforge_project = "siriproxy-nextbus"
|
14
|
+
|
15
|
+
s.files = `git ls-files 2> /dev/null`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/* 2> /dev/null`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/* 2> /dev/null`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
# specify any dependencies here; for hello:
|
21
|
+
# s.add_development_dependency "rspec"
|
22
|
+
s.add_dependency "nokogiri"
|
23
|
+
end
|
24
|
+
|
25
|
+
|
metadata
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: siriproxy-nextbus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- litlfred
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: &77413630 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *77413630
|
25
|
+
description: Queries against http://www.nextbus.com to get the next bus
|
26
|
+
email:
|
27
|
+
- ''
|
28
|
+
executables: []
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- .gitignore
|
33
|
+
- Gemfile
|
34
|
+
- Rakefile
|
35
|
+
- config.example.nextbus.yml
|
36
|
+
- lib/siriproxy-nextbus.rb
|
37
|
+
- siriproxy-nextbus.gemspec
|
38
|
+
homepage: ''
|
39
|
+
licenses: []
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options: []
|
42
|
+
require_paths:
|
43
|
+
- lib
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
+
none: false
|
46
|
+
requirements:
|
47
|
+
- - ! '>='
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
requirements: []
|
57
|
+
rubyforge_project: siriproxy-nextbus
|
58
|
+
rubygems_version: 1.8.10
|
59
|
+
signing_key:
|
60
|
+
specification_version: 3
|
61
|
+
summary: Get Next Bus Information for Chapel Hill
|
62
|
+
test_files: []
|