one_bus_away 0.0.2 → 0.0.4
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 +4 -4
- data/.gitignore +3 -0
- data/.rspec +1 -0
- data/Guardfile +2 -39
- data/README.md +17 -9
- data/Rakefile +8 -1
- data/bin/one_bus_away +49 -0
- data/lib/one_bus_away.rb +47 -58
- data/lib/one_bus_away/client.rb +75 -0
- data/lib/one_bus_away/utilities.rb +25 -0
- data/lib/one_bus_away/version.rb +3 -1
- data/one_bus_away.gemspec +29 -16
- data/spec/client_spec.rb +210 -0
- data/spec/one_bus_away_spec.rb +118 -21
- data/spec/spec_helper.rb +12 -77
- data/spec/utilities_spec.rb +25 -0
- data/spec/vcr/one_bus_away/current-time.yml +36 -0
- data/spec/version_spec.rb +9 -0
- metadata +158 -23
- data/bin/one-bus-away +0 -40
- data/lib/utilities.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d2d9bd435b8006453f7f7b435523828fdddf382
|
4
|
+
data.tar.gz: d4297a3e713d857573a3f1b4f15f0a923f8e2493
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 98e4044599cef53cdce3d783db2eeba736d7e18a6b0acf2c352d7a4342997b3041cf2e5841523d630b192b86169fd92cbccb53cc86cc79f9ec9fba19d0fe8dd1
|
7
|
+
data.tar.gz: 433adecd694466dd9519b1e09d330465a86739d46168700cd27b55890e1177dd8c58e14b8930c0fea9f75b72256ab67175547116350da64f93d1003dd7a5af00
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/Guardfile
CHANGED
@@ -1,43 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
## Uncomment and set this to only include directories you want to watch
|
5
|
-
# directories %w(app lib config test spec features)
|
6
|
-
|
7
|
-
## Uncomment to clear the screen before every task
|
8
|
-
# clearing :on
|
9
|
-
|
10
|
-
## Guard internally checks for changes in the Guardfile and exits.
|
11
|
-
## If you want Guard to automatically start up again, run guard in a
|
12
|
-
## shell loop, e.g.:
|
13
|
-
##
|
14
|
-
## $ while bundle exec guard; do echo "Restarting Guard..."; done
|
15
|
-
##
|
16
|
-
## Note: if you are using the `directories` clause above and you are not
|
17
|
-
## watching the project directory ('.'), then you will want to move
|
18
|
-
## the Guardfile to a watched dir and symlink it back, e.g.
|
19
|
-
#
|
20
|
-
# $ mkdir config
|
21
|
-
# $ mv Guardfile config/
|
22
|
-
# $ ln -s config/Guardfile .
|
23
|
-
#
|
24
|
-
# and, you'll have to watch "config/Guardfile" instead of "Guardfile"
|
25
|
-
|
26
|
-
# Note: The cmd option is now required due to the increasing number of ways
|
27
|
-
# rspec may be run, below are examples of the most common uses.
|
28
|
-
# * bundler: 'bundle exec rspec'
|
29
|
-
# * bundler binstubs: 'bin/rspec'
|
30
|
-
# * spring: 'bin/rspec' (This will use spring if running and you have
|
31
|
-
# installed the spring binstubs per the docs)
|
32
|
-
# * zeus: 'zeus rspec' (requires the server to be started separately)
|
33
|
-
# * 'just' rspec: 'rspec'
|
34
|
-
|
35
|
-
guard :rspec, cmd: "bundle exec rspec" do
|
36
|
-
require "guard/rspec/dsl"
|
1
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
2
|
+
require 'guard/rspec/dsl'
|
37
3
|
dsl = Guard::RSpec::Dsl.new(self)
|
38
4
|
|
39
|
-
# Feel free to open issues for suggestions and improvements
|
40
|
-
|
41
5
|
# RSpec files
|
42
6
|
rspec = dsl.rspec
|
43
7
|
watch(rspec.spec_helper) { rspec.spec_dir }
|
@@ -51,5 +15,4 @@ guard :rspec, cmd: "bundle exec rspec" do
|
|
51
15
|
# Application Files
|
52
16
|
watch(%r{^lib/(.+)\.rb})
|
53
17
|
watch(%r{^bin/})
|
54
|
-
|
55
18
|
end
|
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# OneBusAway
|
2
2
|
|
3
|
-
This little 'gem' is for easily querying the next
|
3
|
+
This little 'gem' is for easily querying the next available bus at a given stop.
|
4
|
+
|
5
|
+
## Pre-reqs
|
6
|
+
|
7
|
+
Please have the ruby development packaged installed.
|
4
8
|
|
5
9
|
## Installation
|
6
10
|
|
@@ -11,28 +15,32 @@ gem 'one_bus_away'
|
|
11
15
|
```
|
12
16
|
|
13
17
|
And then execute:
|
14
|
-
|
18
|
+
```
|
15
19
|
$ bundle
|
16
|
-
|
20
|
+
```
|
17
21
|
Or install it yourself as:
|
18
|
-
|
22
|
+
```
|
19
23
|
$ gem install one_bus_away
|
20
|
-
|
24
|
+
```
|
25
|
+
|
21
26
|
Then you will need to create the file ~/.one_bus_away which contains just your API key which can be requested here: http://pugetsound.onebusaway.org/p/OneBusAwayApiService.action
|
22
27
|
|
28
|
+
```
|
23
29
|
$ cat ~/.one_bus_away
|
24
30
|
6xxxxxf7-6ec4-45adsf22-bf33-sdfsdfs
|
25
|
-
|
31
|
+
```
|
26
32
|
|
27
33
|
## Usage
|
28
34
|
|
29
35
|
|
30
|
-
one-bus-away arrivals-and-departures-for-stop [stop]
|
36
|
+
one-bus-away arrivals-and-departures-for-stop [stop]
|
31
37
|
|
32
|
-
|
38
|
+
```
|
39
|
+
$ one-bus-away arrivals-and-departures-for-stop 13721
|
33
40
|
The D Line arrives in 4 minutes
|
34
41
|
The D Line arrives in 19 minutes
|
35
|
-
|
42
|
+
```
|
43
|
+
|
36
44
|
## Contributing
|
37
45
|
|
38
46
|
1. Fork it ( https://github.com/ellisandy/one-bus-away-cli/fork )
|
data/Rakefile
CHANGED
data/bin/one_bus_away
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'commander/import'
|
5
|
+
require_relative '../lib/one_bus_away'
|
6
|
+
|
7
|
+
program :version, '0.0.1'
|
8
|
+
program :description, 'Simple querying of One Bus Away'
|
9
|
+
|
10
|
+
if File.exist? ENV['HOME'] + '/.one_bus_away'
|
11
|
+
@one_bus_away = OneBusAway.new
|
12
|
+
else
|
13
|
+
fail 'please install your one-bus-away API key into ~/.one_bus_away'
|
14
|
+
end
|
15
|
+
|
16
|
+
command 'current-time' do |c|
|
17
|
+
c.syntax = 'one-bus-away current-time'
|
18
|
+
c.summary = 'Get the current system time from One Bus Away'
|
19
|
+
c.description = 'Makes the current_time API call against the One Bus Away'\
|
20
|
+
' API. Simple, Straightforward, Unneeded'
|
21
|
+
c.example '', 'one-bus-away current-time'
|
22
|
+
c.action do
|
23
|
+
@one_bus_away.current_time
|
24
|
+
p @one_bus_away.data.entry.time
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
command 'arrivals-and-departures-for-stop' do |c|
|
29
|
+
c.syntax = 'one-bus-away arrivals-and-departures-for-stop
|
30
|
+
[stop] [route] [arrival time from now]'
|
31
|
+
c.summary = 'Next Arrival Time for a specific Stop'
|
32
|
+
c.description = 'By default, you can get the next available arrival time.'
|
33
|
+
c.example 'description', 'one-bus-away arrivals-and-departures-for-stop' \
|
34
|
+
' [stop] [route] [arrival time from now]'
|
35
|
+
c.action do |args|
|
36
|
+
@one_bus_away.arrivals_and_departures_for_stop(
|
37
|
+
args[0]
|
38
|
+
)
|
39
|
+
|
40
|
+
busses = @one_bus_away.filter_by_route
|
41
|
+
if busses.empty?
|
42
|
+
puts 'No buses in that time constrain'
|
43
|
+
else
|
44
|
+
busses.each do |bus|
|
45
|
+
puts "The #{bus.keys.first} arrives in #{bus.values.first} minutes"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/one_bus_away.rb
CHANGED
@@ -1,74 +1,63 @@
|
|
1
|
-
require_relative
|
2
|
-
|
3
|
-
|
4
|
-
require '
|
1
|
+
require_relative 'one_bus_away/version'
|
2
|
+
require_relative 'one_bus_away/utilities'
|
3
|
+
require_relative 'one_bus_away/client'
|
4
|
+
require 'geocoder'
|
5
5
|
|
6
|
+
# Main class
|
7
|
+
# defines the way to interact with everything
|
6
8
|
class OneBusAway
|
7
|
-
|
8
|
-
|
9
|
+
attr_accessor :api_method, :parameters
|
10
|
+
attr_reader :client, :data, :http_response
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
@
|
12
|
+
def initialize(options = {})
|
13
|
+
@api_method = options[:api_method]
|
14
|
+
@parameters = options[:parameters]
|
13
15
|
end
|
14
16
|
|
15
|
-
|
17
|
+
# Returns the current time from the One Bus Away System
|
16
18
|
def current_time
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
19
|
+
@client = OneBusAway::Client.new(
|
20
|
+
api_method: ['current-time']
|
21
|
+
)
|
22
|
+
call_api
|
21
23
|
end
|
22
24
|
|
23
|
-
#
|
24
|
-
def arrivals_and_departures_for_stop(stop
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
outputs = []
|
31
|
-
|
32
|
-
arrivalsAndDepartures.each do |bus|
|
33
|
-
if bus["routeShortName"] == route
|
34
|
-
outputs.sort
|
35
|
-
outputs.push(Utilities.convert_time(bus["scheduledDepartureTime"].to_s))
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
return outputs
|
40
|
-
else
|
41
|
-
fail "Either your route or stop is invalid."
|
42
|
-
end
|
43
|
-
|
25
|
+
# get arrivales and departunes for a stop with one arguement
|
26
|
+
def arrivals_and_departures_for_stop(stop)
|
27
|
+
@client = OneBusAway::Client.new(
|
28
|
+
api_method: ['arrivals-and-departures-for-stop', "1_#{stop}"]
|
29
|
+
)
|
30
|
+
call_api
|
31
|
+
end
|
44
32
|
|
33
|
+
# Assigns the http data to the @data instance variable
|
34
|
+
def assign_data
|
35
|
+
@data = client.http_response.data
|
45
36
|
end
|
46
|
-
|
47
|
-
#
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
json["data"]["list"].include? "1_#{stop_number}"
|
54
|
-
else
|
55
|
-
fail "OneBusAway API HTTP response error #{json['code']}"
|
56
|
-
end
|
37
|
+
|
38
|
+
# Short hand for building the URL, calling the API, and assigning the data
|
39
|
+
# to @data
|
40
|
+
def call_api
|
41
|
+
@client.build_url
|
42
|
+
@client.get
|
43
|
+
assign_data
|
57
44
|
end
|
58
45
|
|
59
|
-
#
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
array = []
|
66
|
-
json["data"]["list"].map { |x| array.push x["shortName"] }
|
67
|
-
|
68
|
-
array.include? route_name.to_s
|
69
|
-
else
|
70
|
-
fail "OneBusAway API HTTP response error #{json['code']}"
|
46
|
+
# filter the route by a specific route
|
47
|
+
def filter_by_route
|
48
|
+
array = []
|
49
|
+
data.entry.arrivalsAndDepartures.each do |bus|
|
50
|
+
time = OneBusAway::Utilities.convert_time bus.scheduledDepartureTime
|
51
|
+
array << { bus.routeShortName => time }
|
71
52
|
end
|
53
|
+
array
|
72
54
|
end
|
73
55
|
|
56
|
+
# Uses the google API to git the long and lat of a given location
|
57
|
+
def get_location(loc)
|
58
|
+
geo = Geocoder.search("#{loc} seattle")
|
59
|
+
lat = geo[0].latitude
|
60
|
+
lon = geo[0].longitude
|
61
|
+
[lon, lat]
|
62
|
+
end
|
74
63
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'recursive-open-struct'
|
3
|
+
|
4
|
+
class OneBusAway
|
5
|
+
# Class for establishing a connection to one bus away
|
6
|
+
class Client
|
7
|
+
attr_accessor :api_method, :api_key, :parameters
|
8
|
+
attr_reader :base_url, :url, :http_response
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
@api_method = options[:api_method]
|
12
|
+
@api_key = options[:api_key] || apply_local_api_key
|
13
|
+
@parameters = options[:parameters]
|
14
|
+
@base_url = 'api.pugetsound.onebusaway.org'
|
15
|
+
end
|
16
|
+
|
17
|
+
# Verifies that @api_method and @api_key are set
|
18
|
+
def valid?
|
19
|
+
if api_method && api_key
|
20
|
+
true
|
21
|
+
else
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Provided that @url is set, HTTP get @url
|
27
|
+
def get
|
28
|
+
if @url
|
29
|
+
response = RestClient.get(@url)
|
30
|
+
json = JSON.parse(response)
|
31
|
+
@http_response = RecursiveOpenStruct.new(
|
32
|
+
json, recurse_over_arrays: true
|
33
|
+
)
|
34
|
+
else
|
35
|
+
fail 'url is not properly built'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Builds a valid url, then sets this string to @url
|
40
|
+
def build_url
|
41
|
+
@url = URI::HTTP.build(
|
42
|
+
host: @base_url,
|
43
|
+
path: build_path,
|
44
|
+
query: build_query
|
45
|
+
).to_s if valid?
|
46
|
+
end
|
47
|
+
|
48
|
+
# Builds the path for utilization in #build_url
|
49
|
+
def build_path
|
50
|
+
path = %w(api where)
|
51
|
+
path.concat api_method
|
52
|
+
path = path.join('/')
|
53
|
+
@path = "/#{path}.json"
|
54
|
+
end
|
55
|
+
|
56
|
+
# Build query for utilization in #build_url
|
57
|
+
def build_query
|
58
|
+
query = { key: @api_key }
|
59
|
+
query.merge! @parameters if @parameters
|
60
|
+
query.map { |k, v| "#{k}=#{v}" }.join('&')
|
61
|
+
end
|
62
|
+
|
63
|
+
# Applies ~/.one_bus_away to @api if the file exists
|
64
|
+
# otherwise, it fails.
|
65
|
+
def apply_local_api_key
|
66
|
+
if File.exist? ENV['HOME'] + '/.one_bus_away'
|
67
|
+
file = File.read(ENV['HOME'] + '/.one_bus_away')
|
68
|
+
@api_key = file.chomp
|
69
|
+
else
|
70
|
+
fail 'no API key provided. Please ensure you have your api key'\
|
71
|
+
'installed in here: ~/.one_bus_away'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'active_support'
|
3
|
+
require 'action_view'
|
4
|
+
|
5
|
+
include ActionView::Helpers::DateHelper
|
6
|
+
|
7
|
+
class OneBusAway
|
8
|
+
# Useful cross class methods for sting modifications
|
9
|
+
class Utilities
|
10
|
+
# Converts time into a consumable format
|
11
|
+
def self.convert_time(time)
|
12
|
+
obj = OneBusAway::Utilities.new
|
13
|
+
stripped_time = obj.strip_time(time)
|
14
|
+
converted_date = DateTime.strptime(stripped_time, '%s')
|
15
|
+
distance_of_time_in_words_to_now(converted_date.to_time)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Removes the last three characters from a string
|
19
|
+
def strip_time(time)
|
20
|
+
time = time.to_s
|
21
|
+
n = time.size
|
22
|
+
time[0..n - 4]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/one_bus_away/version.rb
CHANGED
data/one_bus_away.gemspec
CHANGED
@@ -4,26 +4,39 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'one_bus_away/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'one_bus_away'
|
8
8
|
spec.version = OneBusAway::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.summary =
|
12
|
-
spec.description =
|
13
|
-
|
14
|
-
|
9
|
+
spec.authors = ['Jack Ellis']
|
10
|
+
spec.email = ['jack@mnmlst.cc']
|
11
|
+
spec.summary = 'Simple Gem to query One Bus Away API'
|
12
|
+
spec.description = 'This is a simple gem to query bus stops,'\
|
13
|
+
'delay times, and additional features. This'\
|
14
|
+
'does require that you apply for an API key'\
|
15
|
+
'from One Bus Away --'\
|
16
|
+
'http://pugetsound.onebusaway.org/p/OneBusAwayApiService.action'
|
17
|
+
spec.homepage = 'https://github.com/ellisandy/one-bus-away-cli'
|
18
|
+
spec.license = 'MIT'
|
15
19
|
|
16
20
|
spec.files = `git ls-files -z`.split("\x0")
|
17
21
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
22
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
23
|
+
spec.require_paths = ['lib']
|
20
24
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
27
|
-
spec.
|
28
|
-
spec.
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.2'
|
28
|
+
spec.add_development_dependency 'rspec-mocks', '~> 3.2'
|
29
|
+
spec.add_development_dependency 'webmock', '~> 1.22'
|
30
|
+
spec.add_development_dependency 'vcr', '~> 2.9'
|
31
|
+
spec.add_development_dependency 'contracts', '~> 0.12'
|
32
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.5'
|
33
|
+
spec.add_development_dependency 'terminal-notifier-guard', '~> 1.6'
|
34
|
+
spec.add_development_dependency 'fuubar', '~> 2.0'
|
35
|
+
spec.add_development_dependency 'simplecov', '~> 0.10'
|
36
|
+
spec.add_dependency 'commander', '~> 4.3'
|
37
|
+
spec.add_dependency 'rest-client', '~> 1.8'
|
38
|
+
spec.add_dependency 'recursive-open-struct', '~> 0.6'
|
39
|
+
spec.add_dependency 'activesupport', '~> 4.2'
|
40
|
+
spec.add_dependency 'actionview', '~> 4.2'
|
41
|
+
spec.add_dependency 'geocoder', '~> 1.2'
|
29
42
|
end
|