frizzle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +3 -0
  4. data/LICENSE +20 -0
  5. data/README.md +151 -0
  6. data/Rakefile +10 -0
  7. data/frizzle.gemspec +30 -0
  8. data/lib/frizzle.rb +43 -0
  9. data/lib/frizzle/agencies.rb +32 -0
  10. data/lib/frizzle/arrival_estimates.rb +41 -0
  11. data/lib/frizzle/base.rb +58 -0
  12. data/lib/frizzle/exceptions.rb +8 -0
  13. data/lib/frizzle/routes.rb +25 -0
  14. data/lib/frizzle/segments.rb +32 -0
  15. data/lib/frizzle/stops.rb +23 -0
  16. data/lib/frizzle/vehicles.rb +41 -0
  17. data/lib/frizzle/version.rb +3 -0
  18. data/spec/fixtures/dish_cassettes/agencies.yml +214 -0
  19. data/spec/fixtures/dish_cassettes/agencies_find_options.yml +50 -0
  20. data/spec/fixtures/dish_cassettes/agencies_geo_default_radius.yml +54 -0
  21. data/spec/fixtures/dish_cassettes/agencies_geo_rectangle.yml +59 -0
  22. data/spec/fixtures/dish_cassettes/agencies_id_geo.yml +45 -0
  23. data/spec/fixtures/dish_cassettes/agency_geo_radius.yml +54 -0
  24. data/spec/fixtures/dish_cassettes/agency_id.yml +49 -0
  25. data/spec/fixtures/dish_cassettes/arrival_estimates_agencies.yml +1353 -0
  26. data/spec/fixtures/dish_cassettes/arrival_estimates_agencies_routes.yml +45 -0
  27. data/spec/fixtures/dish_cassettes/arrival_estimates_agencies_routes_stops.yml +45 -0
  28. data/spec/fixtures/dish_cassettes/arrival_estimates_agencies_stops.yml +45 -0
  29. data/spec/fixtures/dish_cassettes/arrival_estimates_find_options.yml +1444 -0
  30. data/spec/fixtures/dish_cassettes/routes_agencies.yml +846 -0
  31. data/spec/fixtures/dish_cassettes/routes_agencies_geo.yml +336 -0
  32. data/spec/fixtures/dish_cassettes/routes_find_options.yml +846 -0
  33. data/spec/fixtures/dish_cassettes/segments_agency_and_geo_area.yml +48 -0
  34. data/spec/fixtures/dish_cassettes/segments_agency_and_route.yml +64 -0
  35. data/spec/fixtures/dish_cassettes/segments_agency_id.yml +245 -0
  36. data/spec/fixtures/dish_cassettes/segments_find_options.yml +242 -0
  37. data/spec/fixtures/dish_cassettes/stops_agency_id.yml +3841 -0
  38. data/spec/fixtures/dish_cassettes/stops_find_options.yml +3841 -0
  39. data/spec/fixtures/dish_cassettes/vehicles_agencies.yml +760 -0
  40. data/spec/fixtures/dish_cassettes/vehicles_agencies_geo_area.yml +45 -0
  41. data/spec/fixtures/dish_cassettes/vehicles_agencies_routes.yml +82 -0
  42. data/spec/fixtures/dish_cassettes/vehicles_agencies_routes_geo_area.yml +45 -0
  43. data/spec/fixtures/dish_cassettes/vehicles_find_options.yml +845 -0
  44. data/spec/lib/frizzle/agencies_spec.rb +169 -0
  45. data/spec/lib/frizzle/arrival_estimates_spec.rb +97 -0
  46. data/spec/lib/frizzle/base_spec.rb +105 -0
  47. data/spec/lib/frizzle/exceptions_spec.rb +0 -0
  48. data/spec/lib/frizzle/routes_spec.rb +85 -0
  49. data/spec/lib/frizzle/segments_spec.rb +91 -0
  50. data/spec/lib/frizzle/stops_spec.rb +63 -0
  51. data/spec/lib/frizzle/vehicles_spec.rb +99 -0
  52. data/spec/lib/frizzle/version_spec.rb +9 -0
  53. data/spec/spec_helper.rb +18 -0
  54. metadata +244 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5c7035aef1e6d6cfd06387fd23c123cd89cb8fa1
4
+ data.tar.gz: e4bb1013ea4dc5e8abcb1a0b7fff2460326e4746
5
+ SHA512:
6
+ metadata.gz: 35467cf9d3843705c3daecf22e006a5c004d0db1e659d7ac36a2c93ec31e1a1166409e408136a530094c1555a1e852c3b3066e171b89c02b1febf6758ba986c9
7
+ data.tar.gz: 75b45a6e7737b4afeef4c19c22f0759fc40eaca1ee68ae000743b9e23463e1aac2b73d85689c559577ebef8f36f84d441760a59a05288f4582b5e5e0abe01586
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2013 Tyler Pearson
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,151 @@
1
+ # Frizzle: A Ruby wrapper for the TransLoc API
2
+
3
+ Frizzle is a Ruby wrapper for the [TransLoc Public API](http://api.transloc.com/doc/).
4
+
5
+ Supports all the TransLoc v1.2 API methods. You can either use the whole API wrapper through `Frizzle` or use parts of it i.e. `Frizzle::Agencies.all` if you solely want to work with a particular resource.
6
+
7
+ For more information on the TransLoc API, visit [http://api.transloc.com/doc/](http://api.transloc.com/doc/).
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'frizzle', :git => "git://github.com/tylerpearson/frizzle.git"
15
+ ```
16
+
17
+ Or install it yourself as:
18
+
19
+ ```ruby
20
+ gem install "frizzle", :git => "git://github.com/tylerpearson/frizzle.git"
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ To start using the gem, you can either perform direct calls on `Frizzle`
26
+
27
+ ```ruby
28
+ Frizzle.agencies.all
29
+ ```
30
+
31
+ or through the corresponding class and class methods
32
+
33
+ ```ruby
34
+ Frizzle::Agencies.all
35
+ ```
36
+
37
+ The TransLoc API does not require an API key.
38
+
39
+ For methods that allow limiting the results with a geographical area filter, there are two form options: *rectangle form* and *point and radius form*.
40
+
41
+ To limit with *rectangle form*, pass two arrays ([lat, lng]) for the two geo area arguments. It would look like:
42
+ ```ruby
43
+ Frizzle.agencies.find_by_geo_area([35.80176,-78.64347], [35.78061,-78.68218])
44
+ ```
45
+
46
+ To limit with *point and radius*, pass an array ([lat, lng]) to the first argument. The second argument is optional and can be used to pass a radius in meters of a circle around the point. If this is not filled out, it will default to 100.
47
+
48
+ ```ruby
49
+ Frizzle.agencies.find_by_geo_area([35.80176,-78.64347])
50
+ Frizzle.agencies.find_by_geo_area([35.80176,-78.64347], 70)
51
+ ```
52
+
53
+ ### Agencies
54
+
55
+ Agencies can be accessed through `Frizzle.agencies` or `Frizzle::Agencies`. This API call can be requested every 10 seconds from the same IP address.
56
+
57
+ *Examples:*
58
+ ```ruby
59
+ Frizzle::Agencies.all
60
+ Frizzle.agencies.all
61
+ Frizzle.agencies.find_by_id(168)
62
+ Frizzle.agencies.find_by_id([168,24])
63
+ Frizzle.agencies.find_by_geo_area([35.80176,-78.64347], 75.5)
64
+ Frizzle.agencies.find_by_geo_area([35.80176,-78.64347])
65
+ Frizzle.agencies.find_by_id_and_geo_area("168", [35.80176,-78.64347])
66
+ Frizzle.agencies.find_by_id_and_geo_area("168", [35.80176,-78.64347], 120)
67
+ Frizzle.agencies.find({:agencies => "12", :geo_area => "35.80176,-78.64347|100"})
68
+ ```
69
+
70
+ ### Segments
71
+
72
+ Segments can be accessed through `Frizzle.segments` or `Frizzle::Segments`. This API call can be requested every 10 seconds from the same IP address.
73
+
74
+ *Examples:*
75
+ ```ruby
76
+ Frizzle::Segments.find_by_agencies(24)
77
+ Frizzle.segments.find_by_agencies(24)
78
+ Frizzle.segments.find_by_agencies(24)
79
+ Frizzle.segments.find_by_agencies([24,22])
80
+ Frizzle.segments.find_by_agencies_and_routes(24, [4000078, 4000383])
81
+ Frizzle.segments.find_by_agencies_and_geo_area(24, [35.98974,-78.90292])
82
+ Frizzle.segments.find_by_agencies_and_geo_area(24, [35.98974,-78.90292], 100)
83
+ Frizzle.segments.find({:agencies => "24"}
84
+ ```
85
+
86
+ ### Routes
87
+
88
+ Routes can be accessed through `Frizzle.routes` or `Frizzle::Routes`. This API call can be requested every 10 seconds from the same IP address.
89
+
90
+ *Examples:*
91
+ ```ruby
92
+ Frizzle::Routes.find_by_agencies("24")
93
+ Frizzle.routes.find_by_agencies("24")
94
+ Frizzle.routes.find_by_agencies([24, 132])
95
+ Frizzle.routes.find_by_agencies_and_geo_area(24, [35.98974,-78.90292])
96
+ Frizzle::Routes.find({:agencies => "24"})
97
+ ```
98
+
99
+ ### Stops
100
+
101
+ Stops can be accessed through `Frizzle.stops` or `Frizzle::Stops`. This API call can be requested every 10 seconds from the same IP address.
102
+
103
+ *Examples:*
104
+
105
+ ```ruby
106
+ Frizzle::Stops.find_by_agencies(24)
107
+ Frizzle.stops.find_by_agencies(24)
108
+ Frizzle.stops.find_by_agencies_and_geo_area(24, [35.98974,-78.90292])
109
+ Frizzle::Stops.find({:agencies => "24"})
110
+ ```
111
+
112
+ ### Vehicles
113
+
114
+ Vehicles can be accessed through `Frizzle.vehicles` or `Frizzle::Vehicles`. This API call can be requested every 1 second from the same IP address.
115
+
116
+ *Examples:*
117
+ ```ruby
118
+ Frizzle::Vehicles.find_by_agencies("24")
119
+ Frizzle.vehicles.find_by_agencies("24")
120
+ Frizzle.vehicles.find_by_agencies_and_routes("24", ["4003034","4003038"])
121
+ Frizzle.vehicles.find_by_agencies_and_routes_geo_area(24, ["4003034","4003038"], [35.98974,-78.90292])
122
+ Frizzle::Vehicles.find({:agencies => "24"})
123
+ ```
124
+
125
+ ### Arrival Estimates
126
+
127
+ Arrival estimates can be accessed through `Frizzle.arrival_estimates` or `Frizzle::ArrivalEstimates`. This API call can be requested every 1 second from the same IP address.
128
+
129
+ *Examples:*
130
+ ```ruby
131
+ Frizzle::ArrivalEstimates.find_by_agencies("24")
132
+ Frizzle.arrival_estimates.find_by_agencies("24")
133
+ Frizzle.arrival_estimates.find_by_agencies_and_routes("24", ["4003034","4003038"])
134
+ Frizzle.arrival_estimates.find_by_agencies_and_stops("24", "1029")
135
+ Frizzle.arrival_estimates.find_by_agencies_and_routes_and_stops("24", ["4003034","4003038"], "1029")
136
+ Frizzle::ArrivalEstimates.find({:agencies => "24"})
137
+ ```
138
+
139
+ ## Contributing
140
+
141
+ This is my first Ruby gem, so any issues or pull requests with suggested improvements is appreciated.
142
+
143
+ 1. Fork it
144
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
145
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
146
+ 4. Push to the branch (`git push origin my-new-feature`)
147
+ 5. Create new Pull Request
148
+
149
+ ## License
150
+
151
+ Copyright (c) 2013 Tyler Pearson. See LICENSE for details.
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = FileList['spec/lib/frizzle/*_spec.rb']
6
+ t.verbose = true
7
+ end
8
+
9
+ task :default => :test
10
+
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'frizzle/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "frizzle"
8
+ spec.version = Frizzle::VERSION
9
+ spec.authors = ["Tyler Pearson"]
10
+ spec.email = ["ty.pearson@gmail.com"]
11
+ spec.description = %q{A wrapper for the TransLoc API}
12
+ spec.summary = %q{A wrapper for the TransLoc API}
13
+ spec.homepage = "https://github.com/tylerpearson/frizzle"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "webmock"
24
+ spec.add_development_dependency "vcr"
25
+ spec.add_development_dependency "turn"
26
+ spec.add_development_dependency "minitest"
27
+
28
+ spec.add_runtime_dependency "httparty"
29
+ spec.add_runtime_dependency "hashie"
30
+ end
@@ -0,0 +1,43 @@
1
+ require "httparty"
2
+ require 'singleton'
3
+ require 'hashie'
4
+
5
+ Hash.send :include, Hashie::Extensions::DeepMerge
6
+
7
+ require_relative 'frizzle/version'
8
+ require_relative 'frizzle/exceptions'
9
+ require_relative 'frizzle/base'
10
+ require_relative 'frizzle/agencies'
11
+ require_relative 'frizzle/segments'
12
+ require_relative 'frizzle/routes'
13
+ require_relative 'frizzle/stops'
14
+ require_relative 'frizzle/vehicles'
15
+ require_relative 'frizzle/arrival_estimates'
16
+
17
+ module Frizzle
18
+
19
+ def self.agencies
20
+ Frizzle::Agencies
21
+ end
22
+
23
+ def self.segments
24
+ Frizzle::Segments
25
+ end
26
+
27
+ def self.routes
28
+ Frizzle::Routes
29
+ end
30
+
31
+ def self.stops
32
+ Frizzle::Stops
33
+ end
34
+
35
+ def self.vehicles
36
+ Frizzle::Vehicles
37
+ end
38
+
39
+ def self.arrival_estimates
40
+ Frizzle::ArrivalEstimates
41
+ end
42
+
43
+ end
@@ -0,0 +1,32 @@
1
+ module Frizzle
2
+ class Agencies < Base
3
+
4
+ def self.all
5
+ fetch("/agencies.json")
6
+ end
7
+
8
+ def self.find(options={})
9
+ fetch("/agencies.json",
10
+ :query => options )
11
+ end
12
+
13
+ def self.find_by_id(agencies)
14
+ fetch("/agencies.json",
15
+ :query => { :agencies => formatted_list(agencies) })
16
+ end
17
+
18
+ def self.find_by_geo_area(geo_area_first, geo_area_second=Frizzle::Base::DEFAULT_GEO_RADIUS)
19
+ fetch("/agencies.json",
20
+ :query => { :geo_area => formatted_geo_area(geo_area_first, geo_area_second) })
21
+ end
22
+
23
+ def self.find_by_id_and_geo_area(agencies, geo_area_first, geo_area_second=Frizzle::Base::DEFAULT_GEO_RADIUS)
24
+ fetch("/agencies.json",
25
+ :query => {
26
+ :agencies => formatted_list(agencies),
27
+ :geo_area => formatted_geo_area(geo_area_first, geo_area_second)
28
+ })
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,41 @@
1
+ module Frizzle
2
+ class ArrivalEstimates < Base
3
+
4
+ def self.find(options={})
5
+ fetch("/arrival-estimates.json",
6
+ :query => options )
7
+ end
8
+
9
+ # 168,275
10
+ def self.find_by_agencies(agencies)
11
+ fetch("/arrival-estimates.json",
12
+ :query => { :agencies => formatted_list(agencies) })
13
+ end
14
+
15
+ def self.find_by_agencies_and_routes(agencies, routes)
16
+ fetch("/arrival-estimates.json",
17
+ :query => {
18
+ :agencies => formatted_list(agencies),
19
+ :routes => formatted_list(routes)
20
+ })
21
+ end
22
+
23
+ def self.find_by_agencies_and_stops(agencies, stops)
24
+ fetch("/arrival-estimates.json",
25
+ :query => {
26
+ :agencies => formatted_list(agencies),
27
+ :stops => formatted_list(stops)
28
+ })
29
+ end
30
+
31
+ def self.find_by_agencies_and_routes_and_stops(agencies, routes, stops)
32
+ fetch("/arrival-estimates.json",
33
+ :query => {
34
+ :agencies => formatted_list(agencies),
35
+ :routes => formatted_list(routes),
36
+ :stops => formatted_list(stops)
37
+ })
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,58 @@
1
+ module Frizzle
2
+ class Base
3
+ include Singleton
4
+ include HTTParty
5
+
6
+ API_VERSION = "1.2".freeze
7
+ DEFAULT_GEO_RADIUS = 100
8
+
9
+ base_uri "http://api.transloc.com/#{API_VERSION}"
10
+
11
+ def self.init_settings(options={})
12
+ {
13
+ :headers => {
14
+ "User-Agent" => "frizzle-ruby-#{Frizzle::VERSION}",
15
+ "Content-Type" => "application/json",
16
+ "Accept" => "application/json"
17
+ }
18
+ }.deep_merge(options)
19
+ end
20
+
21
+ def self.fetch(url, options = {})
22
+ options = self.init_settings(options)
23
+ response = get(url, options)
24
+ if response.success?
25
+ data = response.parsed_response['data']
26
+ elsif response.code == 403
27
+ raise "TransLoc API limit: #{response.response}"
28
+ else
29
+ raise TransLocAPIError.new, "#{response}"
30
+ end
31
+ end
32
+
33
+ def self.is_numeric?(obj)
34
+ obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
35
+ end
36
+
37
+ def self.formatted_list(list)
38
+ if list.instance_of? Array
39
+ list = list.join(',')
40
+ end
41
+ list.to_s
42
+ end
43
+
44
+ # Rectangle form: http://api.transloc.com/1.2/agencies.json?geo_area=35.80176,-78.64347|35.78061,-78.68218
45
+ # Point and radius form: http://api.transloc.com/1.2/agencies.json?geo_area=35.80176,-78.64347|75.5
46
+ def self.formatted_geo_area(first_geo, second_geo=DEFAULT_GEO_RADIUS)
47
+ if first_geo.instance_of?(Array) && second_geo.instance_of?(Array)
48
+ coordinates = "#{first_geo.join(',')}|#{second_geo.join(',')}"
49
+ elsif first_geo.instance_of?(Array) && is_numeric?(second_geo)
50
+ coordinates = "#{first_geo.join(',')}|#{second_geo}"
51
+ else
52
+ raise(ArgumentError, "Geo arguments do not match the required format")
53
+ end
54
+ "#{coordinates}"
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,8 @@
1
+ module Frizzle
2
+
3
+ class Error < RuntimeError; end
4
+
5
+ # Exception that is raised when Transloc responds with an error
6
+ class TransLocAPIError < Error; end
7
+
8
+ end
@@ -0,0 +1,25 @@
1
+ module Frizzle
2
+ class Routes < Base
3
+
4
+ def self.find(options={})
5
+ fetch("/routes.json",
6
+ :query => options )
7
+ end
8
+
9
+ # 168,275
10
+ def self.find_by_agencies(agencies)
11
+ fetch("/routes.json",
12
+ :query => { :agencies => formatted_list(agencies) })
13
+ end
14
+
15
+ # 168 35.80176,-78.64347|75.5
16
+ def self.find_by_agencies_and_geo_area(agencies, geo_area_first, geo_area_second=Frizzle::Base::DEFAULT_GEO_RADIUS)
17
+ fetch("/routes.json",
18
+ :query => {
19
+ :agencies => formatted_list(agencies),
20
+ :geo_area => formatted_geo_area(geo_area_first, geo_area_second)
21
+ })
22
+ end
23
+
24
+ end
25
+ end