gogokit 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/LICENSE.txt +19 -0
- data/README.md +18 -0
- data/Rakefile +12 -0
- data/gogokit.gemspec +27 -0
- data/lib/gogokit.rb +6 -0
- data/lib/gogokit/client.rb +171 -0
- data/lib/gogokit/client/category.rb +39 -0
- data/lib/gogokit/client/country.rb +38 -0
- data/lib/gogokit/client/currency.rb +38 -0
- data/lib/gogokit/client/event.rb +41 -0
- data/lib/gogokit/client/language.rb +38 -0
- data/lib/gogokit/client/listing.rb +41 -0
- data/lib/gogokit/client/metro_area.rb +39 -0
- data/lib/gogokit/client/oauth.rb +55 -0
- data/lib/gogokit/client/root.rb +24 -0
- data/lib/gogokit/client/search.rb +27 -0
- data/lib/gogokit/client/venue.rb +39 -0
- data/lib/gogokit/configuration.rb +40 -0
- data/lib/gogokit/connection.rb +34 -0
- data/lib/gogokit/default.rb +10 -0
- data/lib/gogokit/error.rb +12 -0
- data/lib/gogokit/middleware/raise_error.rb +27 -0
- data/lib/gogokit/money.rb +19 -0
- data/lib/gogokit/oauth_token.rb +21 -0
- data/lib/gogokit/paged_resource.rb +23 -0
- data/lib/gogokit/resource.rb +18 -0
- data/lib/gogokit/resource/category.rb +43 -0
- data/lib/gogokit/resource/country.rb +27 -0
- data/lib/gogokit/resource/currency.rb +27 -0
- data/lib/gogokit/resource/event.rb +54 -0
- data/lib/gogokit/resource/language.rb +27 -0
- data/lib/gogokit/resource/listing.rb +89 -0
- data/lib/gogokit/resource/listing_note.rb +17 -0
- data/lib/gogokit/resource/metro_area.rb +29 -0
- data/lib/gogokit/resource/root.rb +15 -0
- data/lib/gogokit/resource/search_result.rb +52 -0
- data/lib/gogokit/resource/ticket_type.rb +17 -0
- data/lib/gogokit/resource/venue.rb +49 -0
- data/lib/gogokit/seating.rb +19 -0
- data/lib/gogokit/utils.rb +18 -0
- data/lib/gogokit/version.rb +17 -0
- metadata +155 -0
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'gogokit/utils'
|
2
|
+
require 'gogokit/resource/listing'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
class Client
|
6
|
+
# {GogoKit::Client} methods for getting listings
|
7
|
+
module Listing
|
8
|
+
include GogoKit::Utils
|
9
|
+
|
10
|
+
# Retrieves a listing by ID
|
11
|
+
#
|
12
|
+
# @param [Integer] listing_id The ID of the listing to be retrieved
|
13
|
+
# @param [Hash] options Optional options
|
14
|
+
# @return [GogoKit::Listing] The requested listing
|
15
|
+
def get_listing(listing_id, options = {})
|
16
|
+
root = get_root
|
17
|
+
object_from_response(GogoKit::Listing,
|
18
|
+
GogoKit::ListingRepresenter,
|
19
|
+
:get,
|
20
|
+
"#{root.links['self'].href}/listings/" \
|
21
|
+
"#{listing_id}",
|
22
|
+
options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Retrieves all listings in a particular event
|
26
|
+
#
|
27
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#eventlistings
|
28
|
+
# @param [Hash] options Optional options
|
29
|
+
# @return [GogoKit::PagedResource] All listings in the specified event
|
30
|
+
def get_listings_by_event(event_id, options = {})
|
31
|
+
root = get_root
|
32
|
+
object_from_response(GogoKit::PagedResource,
|
33
|
+
GogoKit::ListingsRepresenter,
|
34
|
+
:get,
|
35
|
+
"#{root.links['self'].href}/events/" \
|
36
|
+
"#{event_id}/listings",
|
37
|
+
options)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'gogokit/utils'
|
2
|
+
require 'gogokit/resource/metro_area'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
class Client
|
6
|
+
# {GogoKit::Client} methods for getting metro areas
|
7
|
+
module MetroArea
|
8
|
+
include GogoKit::Utils
|
9
|
+
|
10
|
+
# Retrieves a metro area by ID
|
11
|
+
#
|
12
|
+
# @param [Integer] metro_area_id The ID of the metro area to be retrieved
|
13
|
+
# @param [Hash] options Optional options
|
14
|
+
# @return [GogoKit::MetroArea] The requested metro area
|
15
|
+
def get_metro_area(metro_area_id, options = {})
|
16
|
+
root = get_root
|
17
|
+
object_from_response(GogoKit::MetroArea,
|
18
|
+
GogoKit::MetroAreaRepresenter,
|
19
|
+
:get,
|
20
|
+
"#{root.links['self'].href}/metro_areas/" \
|
21
|
+
"#{metro_area_id}",
|
22
|
+
options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Retrieves all metro_areas
|
26
|
+
#
|
27
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#viagogometro_areas
|
28
|
+
# @param [Hash] options Optional options
|
29
|
+
# @return [GogoKit::PagedResource] All metro_areas
|
30
|
+
def get_metro_areas(options = {})
|
31
|
+
object_from_response(GogoKit::PagedResource,
|
32
|
+
GogoKit::MetroAreasRepresenter,
|
33
|
+
:get,
|
34
|
+
get_root.links['viagogo:metro_areas'].href,
|
35
|
+
options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'base64'
|
2
|
+
require 'gogokit/oauth_token'
|
3
|
+
require 'gogokit/utils'
|
4
|
+
|
5
|
+
module GogoKit
|
6
|
+
class Client
|
7
|
+
# OAuth authentication methods for {GogoKit::Client}
|
8
|
+
module OAuth
|
9
|
+
include GogoKit::Utils
|
10
|
+
|
11
|
+
# Get an OAuth access token
|
12
|
+
#
|
13
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#authentication
|
14
|
+
# @param [String] grant_type The grant type to use to get the token
|
15
|
+
# @param [Hash] options Token request information
|
16
|
+
# @return [GogoKit::OAuthToken] The OAuth token
|
17
|
+
def get_access_token(grant_type, options = {})
|
18
|
+
object_from_response(GogoKit::OAuthToken,
|
19
|
+
GogoKit::OAuthTokenRepresenter,
|
20
|
+
:post,
|
21
|
+
oauth_token_endpoint,
|
22
|
+
body: token_request_body(grant_type, options),
|
23
|
+
headers: token_request_headers)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get an OAuth access token for an application.
|
27
|
+
#
|
28
|
+
# @see
|
29
|
+
# http://viagogo.github.io/developer.viagogo.net/#client-credentials-grant
|
30
|
+
# @param [Hash] options Token request information
|
31
|
+
# @return [GogoKit::OAuthToken] The OAuth token
|
32
|
+
def get_client_access_token(options = {})
|
33
|
+
get_access_token('client_credentials', options)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def token_request_body(grant_type, options)
|
39
|
+
body = options || {}
|
40
|
+
body[:grant_type] = grant_type
|
41
|
+
body
|
42
|
+
end
|
43
|
+
|
44
|
+
def token_request_headers
|
45
|
+
credentials = "#{client_id}:#{client_secret}"
|
46
|
+
basic_header_value = Base64.encode64(credentials).gsub("\n", '')
|
47
|
+
{
|
48
|
+
content_type: 'application/x-www-form-urlencoded',
|
49
|
+
accept: 'application/json',
|
50
|
+
authorization: "Basic #{basic_header_value}"
|
51
|
+
}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'gogokit/utils'
|
2
|
+
require 'gogokit/resource/root'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
class Client
|
6
|
+
# {GogoKit::Client} methods for getting the root resource
|
7
|
+
module Root
|
8
|
+
include GogoKit::Utils
|
9
|
+
|
10
|
+
# Gets the root of the viagogo API service.
|
11
|
+
#
|
12
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#root-endpoint
|
13
|
+
# @param [Hash] options Optional options
|
14
|
+
# @return [GogoKit::Resource::Root] The root resource
|
15
|
+
def get_root(options = {})
|
16
|
+
object_from_response(GogoKit::Root,
|
17
|
+
GogoKit::RootRepresenter,
|
18
|
+
:get,
|
19
|
+
api_root_endpoint,
|
20
|
+
options)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'gogokit/utils'
|
2
|
+
require 'gogokit/resource/search_result'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
class Client
|
6
|
+
# {GogoKit::Client} methods for searching for viagogo entities
|
7
|
+
module Search
|
8
|
+
include GogoKit::Utils
|
9
|
+
|
10
|
+
# Search for entities that match a given query
|
11
|
+
#
|
12
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#viagogosearch
|
13
|
+
# @param [String] query The query text to be used to match entities
|
14
|
+
# @param [Hash] options Optional options
|
15
|
+
# @return [GogoKit::PagedResource] The results of the query
|
16
|
+
def search(query, options = {})
|
17
|
+
options[:params] ||= {}
|
18
|
+
options[:params] = options[:params].merge(query: query)
|
19
|
+
object_from_response(GogoKit::PagedResource,
|
20
|
+
GogoKit::SearchResultsRepresenter,
|
21
|
+
:get,
|
22
|
+
get_root.links['viagogo:search'].href,
|
23
|
+
options)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'gogokit/utils'
|
2
|
+
require 'gogokit/resource/venue'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
class Client
|
6
|
+
# {GogoKit::Client} methods for getting venues
|
7
|
+
module Venue
|
8
|
+
include GogoKit::Utils
|
9
|
+
|
10
|
+
# Retrieves a venue by ID
|
11
|
+
#
|
12
|
+
# @param [Integer] venue_id The ID of the venue to be retrieved
|
13
|
+
# @param [Hash] options Optional options
|
14
|
+
# @return [GogoKit::Venue] The requested venue
|
15
|
+
def get_venue(venue_id, options = {})
|
16
|
+
root = get_root
|
17
|
+
object_from_response(GogoKit::Venue,
|
18
|
+
GogoKit::VenueRepresenter,
|
19
|
+
:get,
|
20
|
+
"#{root.links['self'].href}/venues/" \
|
21
|
+
"#{venue_id}",
|
22
|
+
options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Retrieves all venues
|
26
|
+
#
|
27
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#viagogovenues
|
28
|
+
# @param [Hash] options Optional options
|
29
|
+
# @return [GogoKit::PagedResource] All venues
|
30
|
+
def get_venues(options = {})
|
31
|
+
object_from_response(GogoKit::PagedResource,
|
32
|
+
GogoKit::VenuesRepresenter,
|
33
|
+
:get,
|
34
|
+
get_root.links['viagogo:venues'].href,
|
35
|
+
options)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'gogokit/default'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
# Configuration options for {GogoKit::Client} or falls back to
|
6
|
+
# {GogoKit::Default}
|
7
|
+
module Configuration
|
8
|
+
attr_writer :api_root_endpoint,
|
9
|
+
:oauth_token_endpoint
|
10
|
+
|
11
|
+
# The endpoint for the API root resource
|
12
|
+
def api_root_endpoint
|
13
|
+
@api_root_endpoint || GogoKit::Default::API_ROOT_ENDPOINT
|
14
|
+
end
|
15
|
+
|
16
|
+
# The endpoint for obtaining OAuth access tokens
|
17
|
+
def oauth_token_endpoint
|
18
|
+
@oauth_token_endpoint || GogoKit::Default::OAUTH_TOKEN_ENDPOINT
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def endpoints
|
24
|
+
{
|
25
|
+
api_root_endpoint: api_root_endpoint,
|
26
|
+
oauth_token_endpoint: oauth_token_endpoint
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate_configuration!
|
31
|
+
endpoints.each do |endpoint, value|
|
32
|
+
next if !value.nil? && value =~ /\A#{URI.regexp}\z/
|
33
|
+
|
34
|
+
fail(ConfigurationError,
|
35
|
+
"Invalid #{endpoint} specified: " \
|
36
|
+
"#{value.inspect} must be a valid URL")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'gogokit/middleware/raise_error'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
# HTTP Connection methods for {GogoKit::Client}
|
6
|
+
module Connection
|
7
|
+
private
|
8
|
+
|
9
|
+
def connection_options # rubocop:disable Metrics/MethodLength
|
10
|
+
@connection_options ||= {
|
11
|
+
headers: {
|
12
|
+
accept: 'application/hal+json',
|
13
|
+
content_type: 'application/hal+json',
|
14
|
+
user_agent: user_agent
|
15
|
+
},
|
16
|
+
request: {
|
17
|
+
open_timeout: 5,
|
18
|
+
timeout: 10
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def connection
|
24
|
+
Faraday::Connection.new(nil, connection_options) do |builder|
|
25
|
+
builder.use Faraday::Request::UrlEncoded
|
26
|
+
|
27
|
+
# Handle error responses
|
28
|
+
builder.use GogoKit::Middleware::RaiseError
|
29
|
+
|
30
|
+
builder.adapter Faraday.default_adapter
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module GogoKit
|
2
|
+
# Default configuration options for {GogoKit::Client}
|
3
|
+
module Default
|
4
|
+
# Default API root endpoint
|
5
|
+
API_ROOT_ENDPOINT = 'https://api.viagogo.net/v2'.freeze
|
6
|
+
|
7
|
+
# Default OAuth token endpoint
|
8
|
+
OAUTH_TOKEN_ENDPOINT = 'https://www.viagogo.com/secure/oauth2/token'.freeze
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module GogoKit
|
2
|
+
# Custom error class for rescuing from all GogoKit errors
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
# Raised when {GogoKit::Client} is not configured correctly
|
6
|
+
class ConfigurationError < Error; end
|
7
|
+
|
8
|
+
# Raised for any error returned by the API
|
9
|
+
class ApiError < Error
|
10
|
+
attr_accessor :response
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'gogokit/error'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
module Middleware
|
6
|
+
class RaiseError < Faraday::Middleware
|
7
|
+
def initialize(app)
|
8
|
+
super app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(request_env)
|
12
|
+
@app.call(request_env).on_complete do |response_env|
|
13
|
+
if response_env[:status].to_i >= 400
|
14
|
+
api_error = GogoKit::ApiError.new
|
15
|
+
api_error.response = response_env
|
16
|
+
fail api_error, error_message(response_env)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def error_message(response_env)
|
22
|
+
"#{response_env[:method].to_s.upcase} #{response_env[:url]}:" \
|
23
|
+
" #{response_env[:status]}}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'representable/json'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
# Returned for monetary values, such as ticket prices, fees charged and tax
|
6
|
+
# amounts.
|
7
|
+
#
|
8
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#money
|
9
|
+
class Money < OpenStruct
|
10
|
+
end
|
11
|
+
|
12
|
+
module MoneyRepresenter
|
13
|
+
include Representable::JSON
|
14
|
+
|
15
|
+
property :amount
|
16
|
+
property :currency
|
17
|
+
property :display
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
require 'representable/json'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
# An OAuth access token that can be used to access the viagogo API
|
6
|
+
#
|
7
|
+
# @see http://viagogo.github.io/developer.viagogo.net/#authentication
|
8
|
+
class OAuthToken < OpenStruct
|
9
|
+
end
|
10
|
+
|
11
|
+
# A representer for {GogoKit::OAuthToken}
|
12
|
+
module OAuthTokenRepresenter
|
13
|
+
include Representable::JSON
|
14
|
+
|
15
|
+
property :access_token
|
16
|
+
property :token_type
|
17
|
+
property :expires_in
|
18
|
+
property :scope
|
19
|
+
property :refresh_token
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'roar/json'
|
2
|
+
require 'roar/json/hal'
|
3
|
+
require 'gogokit/resource'
|
4
|
+
|
5
|
+
module GogoKit
|
6
|
+
# Base class for pages of resources returned in API responses
|
7
|
+
class PagedResource < Resource
|
8
|
+
attr_accessor :page,
|
9
|
+
:page_size,
|
10
|
+
:total_items,
|
11
|
+
:items
|
12
|
+
end
|
13
|
+
|
14
|
+
# Representer for {GogoKit::PagedResource}s
|
15
|
+
module PagedResourceRepresenter
|
16
|
+
include Representable::JSON
|
17
|
+
include GogoKit::ResourceRepresenter
|
18
|
+
|
19
|
+
property :page
|
20
|
+
property :page_size
|
21
|
+
property :total_items
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'roar/json'
|
2
|
+
require 'roar/json/hal'
|
3
|
+
|
4
|
+
module GogoKit
|
5
|
+
# Base class for resources returned in API responses
|
6
|
+
class Resource
|
7
|
+
attr_accessor :links
|
8
|
+
end
|
9
|
+
|
10
|
+
# A base representer module for every {GogoKit::Resource}
|
11
|
+
module ResourceRepresenter
|
12
|
+
include Roar::Hypermedia
|
13
|
+
include Roar::JSON
|
14
|
+
include Roar::JSON::HAL
|
15
|
+
|
16
|
+
link(:self) { 'http://self' }
|
17
|
+
end
|
18
|
+
end
|