ticket_network 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,43 @@
1
+ require 'active_support/core_ext'
2
+ require 'patron'
3
+ require 'sax-machine'
4
+
5
+ module TicketNetwork
6
+ ROOT = 'tnwebservices.ticketnetwork.com/TNWebService/v3.1'.freeze
7
+ CATALOG = "http://#{ROOT}/TNWebServiceStringInputs.asmx".freeze
8
+ CHECKOUT = "https://#{ROOT}/TNCheckoutWebServiceStringInputs.asmx".freeze
9
+
10
+ Error = Class.new(StandardError)
11
+ AuthorizationError = Class.new(Error)
12
+ ParameterError = Class.new(Error)
13
+ NetworkError = Class.new(Error)
14
+
15
+ mattr_accessor :client_id
16
+
17
+ autoload :Base, 'ticket_network/base'
18
+ autoload :FormatHelper, 'ticket_network/format_helper'
19
+ autoload :ParseHelper, 'ticket_network/parse_helper'
20
+
21
+ module Catalog
22
+ autoload :Base, 'ticket_network/catalog/base'
23
+ autoload :Category, 'ticket_network/catalog/category'
24
+ autoload :Configuration, 'ticket_network/catalog/configuration'
25
+ autoload :Event, 'ticket_network/catalog/event'
26
+ autoload :Performance, 'ticket_network/catalog/performance'
27
+ autoload :Performer, 'ticket_network/catalog/performer'
28
+ autoload :PerformerRank, 'ticket_network/catalog/performer_rank'
29
+ autoload :Ticket, 'ticket_network/catalog/ticket'
30
+ autoload :Venue, 'ticket_network/catalog/venue'
31
+ end
32
+
33
+ module Checkout
34
+ autoload :Address, 'ticket_network/checkout/address'
35
+ autoload :AddressType, 'ticket_network/checkout/address_type'
36
+ autoload :Base, 'ticket_network/checkout/base'
37
+ autoload :CreditCard, 'ticket_network/checkout/credit_card'
38
+ autoload :Customer, 'ticket_network/checkout/customer'
39
+ autoload :Order, 'ticket_network/checkout/order'
40
+ autoload :PhoneNumber, 'ticket_network/checkout/phone_number'
41
+ autoload :PhoneNumberType, 'ticket_network/checkout/phone_number_type'
42
+ end
43
+ end
@@ -0,0 +1,158 @@
1
+ module TicketNetwork
2
+ class Base
3
+ class Action
4
+ attr_reader :name, :operation, :method, :service, :parser, :parameters
5
+
6
+ def initialize(operation, options={}, &block)
7
+ @name = options[:as] || operation
8
+ @operation = (operation || options[:as]).to_s.camelcase.sub(/Id/, 'ID')
9
+ @method = options[:method]
10
+ @service = options[:service]
11
+ @parser = options[:parser]
12
+ @parameters = {}
13
+
14
+ options[:defaults].each { |defaults| instance_eval(&defaults) }
15
+ instance_eval(&block) if block_given?
16
+ end
17
+
18
+ # Adds a parameter that the web service accepts.
19
+ def parameter(name, options={})
20
+ @parameters[name] = options
21
+ end
22
+
23
+ def execute(*args)
24
+ parameters = args.first || {}
25
+ Request.new(self, parameters).perform
26
+ end
27
+ end
28
+
29
+ class Request
30
+ include TicketNetwork::FormatHelper
31
+
32
+ def initialize(action, parameters)
33
+ @action = action
34
+ @parameters = HashWithIndifferentAccess.new(parameters)
35
+ end
36
+
37
+ # Executes the call to the web service.
38
+ def perform
39
+ uri = URI.parse(url)
40
+
41
+ session = Patron::Session.new
42
+ session.timeout = 60
43
+ session.base_url = "#{uri.scheme}://#{uri.host}:#{uri.port}/"
44
+
45
+ retries = 5
46
+
47
+ begin
48
+ response = case @action.method
49
+ when :get
50
+ session.get([uri.path, uri.query].compact.join('?'))
51
+ when :post
52
+ session.post(uri.path, uri.query)
53
+ end
54
+ rescue Patron::PartialFileError, Patron::ConnectionFailed, Patron::HostResolutionError, Patron::TimeoutError
55
+ if (retries -= 1) > 0
56
+ retry
57
+ else
58
+ puts $!.inspect
59
+ raise #NetworkError.new($!.to_s)
60
+ end
61
+ end
62
+
63
+ case body = response.body
64
+ when /^Authorization error: IP ([\d\.]+)/
65
+ raise AuthorizationError, "Unauthorized IP (#{$1})"
66
+ when /must be SSL/
67
+ raise AuthorizationError, 'SSL Required'
68
+ when /^Missing parameter: (.*)\./
69
+ raise ParameterError, "Missing #{$1}"
70
+ when /^Parameter error: (.*): (.*)\./
71
+ raise ParameterError, "Invalid #{$1} (#{$2})"
72
+ when /\A(?!<\?xml)/
73
+ raise Error, body.split(/\./).first
74
+ else
75
+ @action.parser.parse(body) if body
76
+ end
77
+ end
78
+
79
+ def endpoint(service)
80
+ case service
81
+ when :checkout then CHECKOUT
82
+ when :catalog then CATALOG
83
+ else raise Error.new("Unknown endpoint for service #{service}")
84
+ end
85
+ end
86
+ private :endpoint
87
+
88
+ # Builds the base URL from the endpoint and operation. If the method is
89
+ # GET, the query values are appended.
90
+ def url
91
+ base_url = "#{endpoint(@action.service)}/#{@action.operation}"
92
+ base_url << "?#{query}" if @action.method == :get
93
+ base_url
94
+ end
95
+ private :url
96
+
97
+ # Builds the query string from the specified parameter values.
98
+ def query
99
+ @action.parameters.collect do |key, options|
100
+ value = @parameters[options[:as] || key]
101
+ value ||= options[:default] if options.include?(:default)
102
+
103
+ "#{format_query_key(key)}=#{format_query_value(value)}"
104
+ end.join('&')
105
+ end
106
+ private :query
107
+ end
108
+
109
+ class << self
110
+ # Sets or returns the service.
111
+ def service(service=nil)
112
+ unless service
113
+ read_inheritable_attribute(:service)
114
+ else
115
+ write_inheritable_attribute(:service, service)
116
+ end
117
+ end
118
+
119
+ # Sets or returns action defaults.
120
+ def defaults(&block)
121
+ unless block
122
+ read_inheritable_attribute(:defaults)
123
+ else
124
+ write_inheritable_array(:defaults, [block])
125
+ end
126
+ end
127
+
128
+ # Creates a new GET operation.
129
+ def get(operation, options={}, &block)
130
+ action(operation, options.merge(:method => :get), &block)
131
+ end
132
+
133
+ # Creates a new POST operation.
134
+ def post(operation, options={}, &block)
135
+ action(operation, options.merge(:method => :post), &block)
136
+ end
137
+
138
+ # Creates a new operation.
139
+ def action(operation, options={}, &block)
140
+ options[:service] ||= service
141
+ options[:defaults] ||= defaults
142
+ options[:parser] ||= self::Parser
143
+ action = Action.new(operation, options, &block)
144
+
145
+ self.singleton_class.class_eval do
146
+ define_method(action.name) do |*args|
147
+ action.execute(*args)
148
+ end
149
+ end
150
+ end
151
+ private :action
152
+ end
153
+
154
+ defaults do
155
+ parameter :website_config_id, :default => TicketNetwork.client_id
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,7 @@
1
+ module TicketNetwork::Catalog
2
+ class Base < TicketNetwork::Base
3
+ service :catalog
4
+ end
5
+
6
+ ParseHelper = TicketNetwork::ParseHelper
7
+ end
@@ -0,0 +1,38 @@
1
+ module TicketNetwork::Catalog
2
+ class Category < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Category
7
+ include ParseHelper
8
+
9
+ element :child_category_description, :as => :child_name
10
+ element :child_category_id, :as => :child_id
11
+ element :grandchild_category_description, :as => :grandchild_name
12
+ element :grandchild_category_id, :as => :grandchild_id
13
+ element :parent_category_description, :as => :parent_name
14
+ element :parent_category_id, :as => :parent_id
15
+ end
16
+
17
+ elements :category, :as => :categories, :class => Category
18
+ end
19
+
20
+ get :get_categories_master_list, :as => :fetch
21
+
22
+ class << self
23
+ def all(parameters={})
24
+ fetch(parameters).categories
25
+ end
26
+
27
+ def sanitize_name(name)
28
+ name = name.titleize
29
+ name.strip!
30
+ name.gsub!(/Div I A/, 'Div I-A')
31
+ name.gsub!(/Div I-Aa/, 'Div I-AA')
32
+ name.gsub!(/ And /, ' and ')
33
+ name
34
+ end
35
+ private :sanitize_name
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,45 @@
1
+ module TicketNetwork::Catalog
2
+ class Configuration < Base
3
+ MAP_ROOT = 'http://maps.seatics.com/'.freeze
4
+
5
+ class Parser
6
+ include ParseHelper
7
+
8
+ class Configuration
9
+ include ParseHelper
10
+
11
+ element :capacity
12
+ element :id
13
+ element :map_site
14
+ element :map_url
15
+ element :type_description, :as => :name
16
+ element :type_id, :as => :id
17
+ element :venue_id
18
+ end
19
+
20
+ elements :venue_configuration, :as => :venue_configurations, :class => Configuration
21
+ end
22
+
23
+ get :get_venue_configurations, :as => :fetch do
24
+ parameter :venue_id
25
+ end
26
+
27
+ class << self
28
+ def all(parameters={})
29
+ fetch(parameters).venue_configurations
30
+ end
31
+
32
+ def map_url(venue_configuration)
33
+ unless venue_configuration.map_url.blank?
34
+ map_site = venue_configuration.map_site || MAP_ROOT
35
+ map_url = "#{map_site}/#{URI.escape(venue_configuration.map_url)}"
36
+ map_url.gsub!('[', '%5B')
37
+ map_url.gsub!(']', '%5D')
38
+ uri = URI.parse(map_url)
39
+ uri.path.gsub!(/\/\//, '/')
40
+ uri.to_s
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,63 @@
1
+ module TicketNetwork::Catalog
2
+ class Event < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Event
7
+ include ParseHelper
8
+
9
+ element :child_category_id
10
+ element :city
11
+ element :clicks
12
+ element :date
13
+ element :display_date
14
+ element :grandchild_category_id
15
+ element :id
16
+ element :is_womens_event
17
+ element :map_url
18
+ element :name
19
+ element :parent_category_id
20
+ element :state_province
21
+ element :state_province_id
22
+ element :venue
23
+ element :venue_configuration_id
24
+ element :venue_id
25
+ end
26
+
27
+ elements :event, :as => :events, :class => Event
28
+ end
29
+
30
+ get :get_events, :as => :fetch do
31
+ parameter :begin_date
32
+ parameter :child_category_id
33
+ parameter :city_zip, :as => :locality_postal_code
34
+ parameter :end_date
35
+ parameter :event_date
36
+ parameter :event_id
37
+ parameter :event_name
38
+ parameter :grandchild_category_id
39
+ parameter :high_price
40
+ parameter :low_price
41
+ parameter :modification_date
42
+ parameter :near_zip, :as => :near_postal_code
43
+ parameter :no_performers
44
+ parameter :number_of_events, :as => :limit, :default => 100_000
45
+ parameter :only_mine
46
+ parameter :order_by_clause, :as => :order
47
+ parameter :parent_category_id
48
+ parameter :performer_id
49
+ parameter :performer_name
50
+ parameter :state_id
51
+ parameter :state_prov_desc, :as => :region
52
+ parameter :venue_id
53
+ parameter :venue_name
54
+ parameter :where_clause, :as => :where
55
+ end
56
+
57
+ class << self
58
+ def all(parameters={})
59
+ fetch(parameters).events
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,25 @@
1
+ module TicketNetwork::Catalog
2
+ class Performance < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Performer
7
+ include ParseHelper
8
+
9
+ element :event_id
10
+ element :performer_id, :as => :id
11
+ element :performer_name, :as => :name
12
+ end
13
+
14
+ elements :event_performer, :as => :performers, :class => Performer
15
+ end
16
+
17
+ get :get_event_performers, :as => :fetch
18
+
19
+ class << self
20
+ def all(parameters={})
21
+ fetch(parameters).performers
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module TicketNetwork::Catalog
2
+ class Performer < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Performer
7
+ include ParseHelper
8
+
9
+ element :id
10
+ element :description, :as => :name
11
+ element :home_venue_id, :as => :venue_id
12
+ end
13
+
14
+ elements :performer, :as => :performers, :class => Performer
15
+ end
16
+
17
+ get :get_performer_by_category, :as => :fetch do
18
+ parameter :parent_category_id
19
+ parameter :child_category_id
20
+ parameter :grandchild_category_id
21
+ parameter :has_event, :default => false
22
+ end
23
+
24
+ class << self
25
+ def all(parameters={})
26
+ fetch(parameters).performers
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,29 @@
1
+ module TicketNetwork::Catalog
2
+ class PerformerRank < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class PerformerRank
7
+ include ParseHelper
8
+
9
+ element :id, :as => :performer_id
10
+ element :percent
11
+ end
12
+
13
+ elements :performer_percent, :as => :ranks, :class => PerformerRank
14
+ end
15
+
16
+ get :get_high_sales_performers, :as => :fetch do
17
+ parameter :child_category_id
18
+ parameter :grandchild_category_id
19
+ parameter :num_returned, :default => 50_000
20
+ parameter :parent_category_id
21
+ end
22
+
23
+ class << self
24
+ def all(parameters={})
25
+ fetch(parameters).ranks
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,97 @@
1
+ module TicketNetwork::Catalog
2
+ class Ticket < Base
3
+ PARKING_REGEX = /park/i.freeze
4
+
5
+ class Parser
6
+ include ParseHelper
7
+
8
+ class Ticket
9
+ class Split
10
+ include ParseHelper
11
+
12
+ elements :int, :as => :ints
13
+ end
14
+
15
+ include ParseHelper
16
+
17
+ element :actual_price
18
+ element :event_id
19
+ element :face_price
20
+ element :high_seat
21
+ element :id
22
+ element :is_mine
23
+ element :low_seat
24
+ element :marked
25
+ element :notes
26
+ element :parent_category_id
27
+ element :rating
28
+ element :rating_description
29
+ element :retail_price
30
+ element :row
31
+ element :section
32
+ element :ticket_quantity
33
+ element :wholesale_price
34
+
35
+ elements :valid_splits, :as => :splits, :class => Split
36
+ end
37
+
38
+ elements :ticket_group, :as => :tickets, :class => Ticket
39
+ end
40
+
41
+ get :get_tickets, :as => :fetch do
42
+ parameter :event_id
43
+ parameter :high_price
44
+ parameter :low_price
45
+ parameter :number_of_records, :as => :limit
46
+ parameter :order_by_clause, :as => :order
47
+ parameter :requested_tix_split, :as => :requested_split
48
+ parameter :ticket_group_id, :as => :ticket_id
49
+ parameter :where_clause, :as => :where
50
+ end
51
+
52
+ class << self
53
+ def all(parameters={})
54
+ fetch(parameters).tickets
55
+ end
56
+
57
+ def raw(parameters={})
58
+ all(parameters).collect do |ticket|
59
+ parking = parking?(ticket)
60
+
61
+ {
62
+ :ticket_network_id => ticket.id.to_i,
63
+ :price => ticket.actual_price.to_f,
64
+ :quantity => ticket.ticket_quantity.to_i,
65
+ :section => ticket.section.to_s.gsub(/\//, ' / '),
66
+ :row => ticket.row,
67
+ :notes => ticket.notes,
68
+ :splits => find_splits(ticket),
69
+ :general_admission => false,
70
+ :is_mine => ticket.is_mine == 'true',
71
+ :parking_pass => !!parking,
72
+ :lot => parking ? find_lot(ticket) : nil
73
+ }
74
+ end
75
+ end
76
+
77
+ def parking?(ticket)
78
+ ticket.section =~ PARKING_REGEX || ticket.row =~ PARKING_REGEX
79
+ end
80
+ private :parking?
81
+
82
+ def find_splits(ticket)
83
+ ticket.splits.first.ints.collect(&:to_i).sort
84
+ end
85
+ private :find_splits
86
+
87
+ def find_lot(parking_pass)
88
+ if !parking_pass.section.blank? && parking_pass.section !~ PARKING_REGEX
89
+ parking_pass.section
90
+ elsif !parking_pass.row.blank? && parking_pass.row !~ PARKING_REGEX
91
+ parking_pass.row
92
+ end
93
+ end
94
+ private :find_lot
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,43 @@
1
+ module TicketNetwork::Catalog
2
+ class Venue < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Venue
7
+ include ParseHelper
8
+
9
+ element :box_office_phone
10
+ element :capacity
11
+ element :child_rules
12
+ element :city, :as => :locality
13
+ element :country, :as => :country_name
14
+ element :directions
15
+ element :id
16
+ element :name
17
+ element :notes
18
+ element :number_of_configurations
19
+ element :parking
20
+ element :public_transportation
21
+ element :rules
22
+ element :state_province, :as => :region
23
+ element :street1, :as => :street_address
24
+ element :street2, :as => :extended_address
25
+ element :url
26
+ element :will_call
27
+ element :zip_code, :as => :postal_code
28
+ end
29
+
30
+ elements :venue, :as => :venues, :class => Venue
31
+ end
32
+
33
+ get :get_venue, :as => :fetch do
34
+ parameter :venue_id
35
+ end
36
+
37
+ class << self
38
+ def all(parameters={})
39
+ fetch(parameters).venues
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,53 @@
1
+ module TicketNetwork::Checkout
2
+ class Address < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class Address
7
+ include ParseHelper
8
+
9
+ element :city, :as => :locality
10
+ element :contact_name, :as => :name
11
+ element :country_description, :as => :country
12
+ element :country_id
13
+ element :id
14
+ element :state_province, :as => :region
15
+ element :street1, :as => :street_address
16
+ element :street2, :as => :extended_address
17
+ element :type_description, :as => :type
18
+ element :type_id
19
+ element :zip_code, :as => :postal_code
20
+ end
21
+
22
+ elements :address, :as => :addresses, :class => Address
23
+ end
24
+
25
+ get :get_address, :as => :fetch do
26
+ parameter :address_id, :as => :id
27
+ parameter :customer_id
28
+ parameter :address_type_id, :as => :type_id
29
+ end
30
+
31
+ post :write_address, :as => :store, :parser => Parser::Address do
32
+ parameter :address_type_id, :as => :type_id
33
+ parameter :city, :as => :locality
34
+ parameter :contact_name, :as => :name
35
+ parameter :country
36
+ parameter :country_id
37
+ parameter :customer_id
38
+ parameter :state_prov_abbr, :as => :region
39
+ parameter :street1, :as => :street_address
40
+ parameter :street2, :as => :extended_address
41
+ parameter :zip_code, :as => :postal_code
42
+ end
43
+
44
+ class << self
45
+ def all(parameters={})
46
+ fetch(parameters).addresses
47
+ end
48
+
49
+ alias_method :create, :store
50
+ alias_method :update, :store
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,24 @@
1
+ module TicketNetwork::Checkout
2
+ class AddressType < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class AddressType
7
+ include ParseHelper
8
+
9
+ element :id
10
+ element :description, :as => :name
11
+ end
12
+
13
+ elements :address_type, :as => :address_types, :class => AddressType
14
+ end
15
+
16
+ get :get_address_types, :as => :fetch
17
+
18
+ class << self
19
+ def all(parameters={})
20
+ fetch(parameters).address_types
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,7 @@
1
+ module TicketNetwork::Checkout
2
+ class Base < TicketNetwork::Base
3
+ service :checkout
4
+ end
5
+
6
+ ParseHelper = TicketNetwork::ParseHelper
7
+ end
@@ -0,0 +1,46 @@
1
+ module TicketNetwork::Checkout
2
+ class CreditCard < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class CreditCard
7
+ include ParseHelper
8
+
9
+ element :expires_month, :as => :expiration_month
10
+ element :expires_year, :as => :expiration_year
11
+ element :id
12
+ element :masked_number
13
+ element :name_displayed, :as => :name
14
+ element :type_description
15
+ element :type_id
16
+ end
17
+
18
+ elements :credit_card, :as => :credit_cards
19
+ end
20
+
21
+ get :get_credit_card, :as => :fetch do
22
+ parameter :credit_card_id
23
+ parameter :credit_card_type_id
24
+ parameter :customer_id
25
+ end
26
+
27
+ post :write_credit_card, :as => :store, :parser => Parser::CreditCard do
28
+ parameter :billing_address_id, :as => :address_id
29
+ parameter :billing_phone_id, :as => :phone_number_id
30
+ parameter :customer_id
31
+ parameter :expires_month, :as => :expiration_month
32
+ parameter :expires_year, :as => :expiration_year
33
+ parameter :name_displayed, :as => :name
34
+ parameter :number
35
+ end
36
+
37
+ class << self
38
+ def all(parameters={})
39
+ fetch(parameters).credit_cards
40
+ end
41
+
42
+ alias_method :create, :store
43
+ alias_method :update, :store
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ module TicketNetwork::Checkout
2
+ class Customer < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ element :email
7
+ element :first_name, :as => :given_name
8
+ element :id
9
+ element :last_name, :as => :family_name
10
+ element :notes
11
+ element :password
12
+ element :pin
13
+ end
14
+
15
+ get :get_customer_by_id, :as => :fetch do
16
+ parameter :customer_id
17
+ end
18
+
19
+ post :write_customer, :as => :store do
20
+ parameter :customer_id, :as => :ticket_network_id
21
+ parameter :first_name, :as => :given_name
22
+ parameter :last_name, :as => :family_name
23
+ parameter :email
24
+ parameter :password
25
+ parameter :notes
26
+ end
27
+
28
+ class << self
29
+ def find(customer_id)
30
+ fetch(:customer_id => :customer_id)
31
+ end
32
+
33
+ alias_method :create, :store
34
+ alias_method :update, :store
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ module TicketNetwork::Checkout
2
+ class Order < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ element :confirmation_email_text
7
+ element :request_id, :as => :id
8
+ element :sale_total, :as => :total
9
+ end
10
+
11
+ post :create_request, :as => :store do
12
+ parameter :customer_id
13
+ parameter :credit_card_id
14
+ parameter :billing_address_id
15
+ parameter :credit_card_security_code, :as => :security_code
16
+ parameter :ticket_group_id, :as => :ticket_id
17
+ parameter :ticket_quantity, :as => :quantity
18
+ parameter :shipping_method_id
19
+ parameter :special_instructions, :as => :notes
20
+ parameter :promo_code
21
+ parameter :accept_alternate, :as => :alternate_acceptable
22
+ parameter :referral_source_id
23
+ parameter :referral_source_details
24
+ parameter :ppcsrc
25
+ parameter :override_price
26
+ parameter :customer_ip_address
27
+ end
28
+
29
+ class << self
30
+ alias_method :create, :store
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,41 @@
1
+ module TicketNetwork::Checkout
2
+ class PhoneNumber < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class PhoneNumber
7
+ include ParseHelper
8
+
9
+ element :display_order, :as => :order
10
+ element :id
11
+ element :number
12
+ element :type_description
13
+ element :type_id
14
+ end
15
+
16
+ elements :phone, :as => :phone_numbers, :class => PhoneNumber
17
+ end
18
+
19
+ get :get_phone, :as => :fetch do
20
+ parameter :customer_id
21
+ parameter :phone_id, :as => :id
22
+ parameter :phone_type_id, :as => :type_id
23
+ end
24
+
25
+ post :write_phone, :as => :store, :parser => Parser::PhoneNumber do
26
+ parameter :customer_id
27
+ parameter :display_order, :as => :order, :default => 0
28
+ parameter :phone_number, :as => :number
29
+ parameter :phone_type_id, :as => :type_id
30
+ end
31
+
32
+ class << self
33
+ def all(parameters={})
34
+ fetch(parameters).phone_numbers
35
+ end
36
+
37
+ alias_method :create, :store
38
+ alias_method :update, :store
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,25 @@
1
+ module TicketNetwork::Checkout
2
+ class PhoneNumberType < Base
3
+ class Parser
4
+ include ParseHelper
5
+
6
+ class PhoneNumberType
7
+ include ParseHelper
8
+
9
+ element :id
10
+ element :description, :as => :name
11
+ end
12
+
13
+ elements :phone_type, :as => :phone_number_types,
14
+ :class => PhoneNumberType
15
+ end
16
+
17
+ get :get_phone_types, :as => :fetch
18
+
19
+ class << self
20
+ def all(parameters={})
21
+ fetch(parameters).phone_number_types
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module TicketNetwork
2
+ module FormatHelper
3
+ # Formats keys for use in parsing responses and building query strings.
4
+ def format_key(key, query=false)
5
+ key = key.to_s
6
+ key.upcase! if key == 'id'
7
+ key.gsub!(/_id$/, '_ID')
8
+ key.gsub!(/_url$/, '_URL')
9
+ key = key.camelize(!query ? :upper : :lower) unless key == 'int'
10
+ key
11
+ end
12
+
13
+ # Formats query keys for use in a query string.
14
+ def format_query_key(key)
15
+ format_key(key, true)
16
+ end
17
+
18
+ # Formats and escapes query values for use in a query string.
19
+ def format_query_value(value)
20
+ value = case value
21
+ when Time, Date
22
+ value.to_s(:db)
23
+ else
24
+ value.to_s
25
+ end
26
+
27
+ CGI.escape(value)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ module TicketNetwork
2
+ module ParseHelper
3
+ def self.included(base)
4
+ base.class_eval do
5
+ include SAXMachine
6
+ end
7
+
8
+ base.extend(ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ include FormatHelper
13
+
14
+ def element(name, options={})
15
+ options.reverse_merge!(:as => name)
16
+ name = format_key(name)
17
+ super(name, options)
18
+ end
19
+
20
+ def elements(name, options={})
21
+ options.reverse_merge!(:as => name)
22
+ name = format_key(name)
23
+ super(name, options)
24
+ end
25
+ end
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ticket_network
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 3
9
+ version: 0.0.3
10
+ platform: ruby
11
+ authors:
12
+ - Tyler Hunt
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-09-24 00:00:00 -04:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: activesupport
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 0
31
+ - 0
32
+ - beta4
33
+ version: 3.0.0.beta4
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: patron
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - "="
43
+ - !ruby/object:Gem::Version
44
+ segments:
45
+ - 0
46
+ - 4
47
+ - 6
48
+ version: 0.4.6
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: sax-machine
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - "="
58
+ - !ruby/object:Gem::Version
59
+ segments:
60
+ - 0
61
+ - 0
62
+ - 15
63
+ version: 0.0.15
64
+ type: :runtime
65
+ version_requirements: *id003
66
+ description:
67
+ email:
68
+ executables: []
69
+
70
+ extensions: []
71
+
72
+ extra_rdoc_files: []
73
+
74
+ files:
75
+ - lib/ticket_network/base.rb
76
+ - lib/ticket_network/catalog/base.rb
77
+ - lib/ticket_network/catalog/category.rb
78
+ - lib/ticket_network/catalog/configuration.rb
79
+ - lib/ticket_network/catalog/event.rb
80
+ - lib/ticket_network/catalog/performance.rb
81
+ - lib/ticket_network/catalog/performer.rb
82
+ - lib/ticket_network/catalog/performer_rank.rb
83
+ - lib/ticket_network/catalog/ticket.rb
84
+ - lib/ticket_network/catalog/venue.rb
85
+ - lib/ticket_network/checkout/address.rb
86
+ - lib/ticket_network/checkout/address_type.rb
87
+ - lib/ticket_network/checkout/base.rb
88
+ - lib/ticket_network/checkout/credit_card.rb
89
+ - lib/ticket_network/checkout/customer.rb
90
+ - lib/ticket_network/checkout/order.rb
91
+ - lib/ticket_network/checkout/phone_number.rb
92
+ - lib/ticket_network/checkout/phone_number_type.rb
93
+ - lib/ticket_network/format_helper.rb
94
+ - lib/ticket_network/parse_helper.rb
95
+ - lib/ticket_network.rb
96
+ has_rdoc: true
97
+ homepage: http://github.com/tylerhunt/ticket_network
98
+ licenses: []
99
+
100
+ post_install_message:
101
+ rdoc_options: []
102
+
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ segments:
111
+ - 0
112
+ version: "0"
113
+ required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ requirements: []
122
+
123
+ rubyforge_project:
124
+ rubygems_version: 1.3.7
125
+ signing_key:
126
+ specification_version: 3
127
+ summary: An interface library for the Ticket Network web service.
128
+ test_files: []
129
+