diff --git a/lib/ticket_network.rb b/lib/ticket_network.rb new file mode 100644 index 0000000..755e778 --- /dev/null +++ b/lib/ticket_network.rb @@ -0,0 +1,43 @@ +require 'active_support/core_ext' +require 'curb' +require 'sax-machine' + +module TicketNetwork + ROOT = 'tnwebservices.ticketnetwork.com/TNWebService/v3.1'.freeze + CATALOG = "http://#{ROOT}/TNWebServiceStringInputs.asmx".freeze + CHECKOUT = "https://#{ROOT}/TNCheckoutWebServiceStringInputs.asmx".freeze + + Error = Class.new(StandardError) + AuthorizationError = Class.new(Error) + ParameterError = Class.new(Error) + NetworkError = Class.new(Error) + + mattr_accessor :client_id + + autoload :Base, 'ticket_network/base' + autoload :FormatHelper, 'ticket_network/format_helper' + autoload :ParseHelper, 'ticket_network/parse_helper' + + module Catalog + autoload :Base, 'ticket_network/catalog/base' + autoload :Category, 'ticket_network/catalog/category' + autoload :Configuration, 'ticket_network/catalog/configuration' + autoload :Event, 'ticket_network/catalog/event' + autoload :Performance, 'ticket_network/catalog/performance' + autoload :Performer, 'ticket_network/catalog/performer' + autoload :PerformerRank, 'ticket_network/catalog/performer_rank' + autoload :Ticket, 'ticket_network/catalog/ticket' + autoload :Venue, 'ticket_network/catalog/venue' + end + + module Checkout + autoload :Address, 'ticket_network/checkout/address' + autoload :AddressType, 'ticket_network/checkout/address_type' + autoload :Base, 'ticket_network/checkout/base' + autoload :CreditCard, 'ticket_network/checkout/credit_card' + autoload :Customer, 'ticket_network/checkout/customer' + autoload :Order, 'ticket_network/checkout/order' + autoload :PhoneNumber, 'ticket_network/checkout/phone_number' + autoload :PhoneNumberType, 'ticket_network/checkout/phone_number_type' + end +end diff --git a/lib/ticket_network/base.rb b/lib/ticket_network/base.rb new file mode 100644 index 0000000..9fe4b8e --- /dev/null +++ b/lib/ticket_network/base.rb @@ -0,0 +1,147 @@ +module TicketNetwork + class Base + class Action + attr_reader :name, :operation, :method, :service, :parser, :parameters + + def initialize(operation, options={}, &block) + @name = options[:as] || operation + @operation = (operation || options[:as]).to_s.camelcase.sub(/Id/, 'ID') + @method = options[:method] + @service = options[:service] + @parser = options[:parser] + @parameters = {} + + options[:defaults].each { |defaults| instance_eval(&defaults) } + instance_eval(&block) if block_given? + end + + # Adds a parameter that the web service accepts. + def parameter(name, options={}) + @parameters[name] = options + end + + def execute(*args) + parameters = args.first || {} + Request.new(self, parameters).perform + end + end + + class Request + include TicketNetwork::FormatHelper + + def initialize(action, parameters) + @action = action + @parameters = HashWithIndifferentAccess.new(parameters) + end + + # Executes the call to the web service. + def perform + response = Curl::Easy.new(url) + + begin + case @action.method + when :get + response.http_get + when :post + response.http_post(query) + end + rescue Curl::Err::RecvError, Curl::Err::ConnectionFailedError, Curl::Err::HostResolutionError => e + raise NetworkError.new(e.to_s) + end + + case body = response.body_str + when /^Authorization error: IP ([\d\.]+)/ + raise AuthorizationError, "Unauthorized IP (#{$1})" + when /must be SSL/ + raise AuthorizationError, 'SSL Required' + when /^Missing parameter: (.*)\./ + raise ParameterError, "Missing #{$1}" + when /^Parameter error: (.*): (.*)\./ + raise ParameterError, "Invalid #{$1} (#{$2})" + when /\A(?!<\?xml)/ + raise Error, body.split(/\./).first + else + @action.parser.parse(body) if body + end + end + + def endpoint(service) + case service + when :checkout then CHECKOUT + when :catalog then CATALOG + else raise Error.new("Unknown endpoint for service #{service}") + end + end + private :endpoint + + # Builds the base URL from the endpoint and operation. If the method is + # GET, the query values are appended. + def url + base_url = "#{endpoint(@action.service)}/#{@action.operation}" + base_url << "?#{query}" if @action.method == :get + base_url + end + private :url + + # Builds the query string from the specified parameter values. + def query + @action.parameters.collect do |key, options| + value = @parameters[options[:as] || key] + value ||= options[:default] if options.include?(:default) + + "#{format_query_key(key)}=#{format_query_value(value)}" + end.join('&') + end + private :query + end + + class << self + # Sets or returns the service. + def service(service=nil) + unless service + read_inheritable_attribute(:service) + else + write_inheritable_attribute(:service, service) + end + end + + # Sets or returns action defaults. + def defaults(&block) + unless block + read_inheritable_attribute(:defaults) + else + write_inheritable_array(:defaults, [block]) + end + end + + # Creates a new GET operation. + def get(operation, options={}, &block) + action(operation, options.merge(:method => :get), &block) + end + + # Creates a new POST operation. + def post(operation, options={}, &block) + action(operation, options.merge(:method => :post), &block) + end + + # Creates a new operation. + def action(operation, options={}, &block) + options[:service] ||= service + options[:defaults] ||= defaults + options[:parser] ||= self::Parser + action = Action.new(operation, options, &block) + + self.singleton_class.class_eval do + define_method(action.name) do |*args| + action.execute(*args) + end + end + end + private :action + end + + defaults do + parameter :website_config_id, :default => TicketNetwork.client_id + end + end +end diff --git a/lib/ticket_network/catalog/base.rb b/lib/ticket_network/catalog/base.rb new file mode 100644 index 0000000..76da42b --- /dev/null +++ b/lib/ticket_network/catalog/base.rb @@ -0,0 +1,7 @@ +module TicketNetwork::Catalog + class Base < TicketNetwork::Base + service :catalog + end + + ParseHelper = TicketNetwork::ParseHelper +end diff --git a/lib/ticket_network/catalog/category.rb b/lib/ticket_network/catalog/category.rb new file mode 100644 index 0000000..8812a69 --- /dev/null +++ b/lib/ticket_network/catalog/category.rb @@ -0,0 +1,38 @@ +module TicketNetwork::Catalog + class Category < Base + class Parser + include ParseHelper + + class Category + include ParseHelper + + element :child_category_description, :as => :child_name + element :child_category_id, :as => :child_id + element :grandchild_category_description, :as => :grandchild_name + element :grandchild_category_id, :as => :grandchild_id + element :parent_category_description, :as => :parent_name + element :parent_category_id, :as => :parent_id + end + + elements :category, :as => :categories, :class => Category + end + + get :get_categories_master_list, :as => :fetch + + class << self + def all(parameters={}) + fetch(parameters).categories + end + + def sanitize_name(name) + name = name.titleize + name.strip! + name.gsub!(/Div I A/, 'Div I-A') + name.gsub!(/Div I-Aa/, 'Div I-AA') + name.gsub!(/ And /, ' and ') + name + end + private :sanitize_name + end + end +end diff --git a/lib/ticket_network/catalog/configuration.rb b/lib/ticket_network/catalog/configuration.rb new file mode 100644 index 0000000..f94b96b --- /dev/null +++ b/lib/ticket_network/catalog/configuration.rb @@ -0,0 +1,46 @@ +module TicketNetwork::Catalog + class Configuration < Base + MAP_ROOT = 'http://maps.seatics.com/'.freeze + + class Parser + include ParseHelper + + class Configuration + include ParseHelper + + element :capacity + element :id + element :map_site + element :map_url + element :type_description + element :type_id + element :venue_id + end + + elements :venue_configuration, :as => :venue_configurations, :class => Configuration + end + + get :get_venue_configurations, :as => :fetch do + parameter :venue_id + end + + class << self + def all(parameters={}) + fetch(parameters).venue_configurations + end + + def map_url(venue_configuration) + unless venue_configuration.map_url.blank? + map_site = venue_configuration.map_site || MAP_ROOT + map_url = "#{map_site}/#{URI.escape(venue_configuration.map_url)}" + map_url.gsub!('[', '%5B') + map_url.gsub!(']', '%5D') + uri = URI.parse(map_url) + uri.path.gsub!(/\/\//, '/') + uri.to_s + end + end + private :find_map + end + end +end diff --git a/lib/ticket_network/catalog/event.rb b/lib/ticket_network/catalog/event.rb new file mode 100644 index 0000000..bf73e14 --- /dev/null +++ b/lib/ticket_network/catalog/event.rb @@ -0,0 +1,63 @@ +module TicketNetwork::Catalog + class Event < Base + class Parser + include ParseHelper + + class Event + include ParseHelper + + element :child_category_id + element :city + element :clicks + element :date + element :display_date + element :grandchild_category_id + element :id + element :is_womens_event + element :map_url + element :name + element :parent_category_id + element :state_province + element :state_province_id + element :venue + element :venue_configuration_id + element :venue_id + end + + elements :event, :as => :events, :class => Event + end + + get :get_events, :as => :fetch do + parameter :begin_date + parameter :child_category_id + parameter :city_zip, :as => :locality_postal_code + parameter :end_date + parameter :event_date + parameter :event_id + parameter :event_name + parameter :grandchild_category_id + parameter :high_price + parameter :low_price + parameter :modification_date + parameter :near_zip, :as => :near_postal_code + parameter :no_performers + parameter :number_of_events, :as => :limit, :default => 100_000 + parameter :only_mine + parameter :order_by_clause, :as => :order + parameter :parent_category_id + parameter :performer_id + parameter :performer_name + parameter :state_id + parameter :state_prov_desc, :as => :region + parameter :venue_id + parameter :venue_name + parameter :where_clause, :as => :where + end + + class << self + def all(parameters={}) + fetch(parameters).events + end + end + end +end diff --git a/lib/ticket_network/catalog/performance.rb b/lib/ticket_network/catalog/performance.rb new file mode 100644 index 0000000..545ff05 --- /dev/null +++ b/lib/ticket_network/catalog/performance.rb @@ -0,0 +1,25 @@ +module TicketNetwork::Catalog + class EventPerformer < Base + class Parser + include ParseHelper + + class Performer + include ParseHelper + + element :event_id + element :performer_id, :as => :id + element :performer_name, :as => :name + end + + elements :event_performer, :as => :performers, :class => Performer + end + + get :get_event_performers, :as => :fetch + + class << self + def all(parameters={}) + fetch(parameters).performers + end + end + end +end diff --git a/lib/ticket_network/catalog/performer.rb b/lib/ticket_network/catalog/performer.rb new file mode 100644 index 0000000..c28b716 --- /dev/null +++ b/lib/ticket_network/catalog/performer.rb @@ -0,0 +1,30 @@ +module TicketNetwork::Catalog + class Performer < Base + class Parser + include ParseHelper + + class Performer + include ParseHelper + + element :id + element :description, :as => :name + element :home_venue_id, :as => :venue_id + end + + elements :performer, :as => :performers, :class => Performer + end + + get :get_performer_by_category, :as => :fetch do + parameter :parent_category_id + parameter :child_category_id + parameter :grandchild_category_id + parameter :has_event, :default => false + end + + class << self + def all(parameters={}) + fetch(parameters).performers + end + end + end +end diff --git a/lib/ticket_network/catalog/performer_rank.rb b/lib/ticket_network/catalog/performer_rank.rb new file mode 100644 index 0000000..4931bf1 --- /dev/null +++ b/lib/ticket_network/catalog/performer_rank.rb @@ -0,0 +1,29 @@ +module TicketNetwork::Catalog + class PerformerRank < Base + class Parser + include ParseHelper + + class PerformerRank + include ParseHelper + + element :id, :as => :performer_id + element :percent + end + + elements :performer_percent, :as => :ranks, :class => PerformerRank + end + + get :get_high_sales_performers, :as => :fetch do + parameter :child_category_id + parameter :grandchild_category_id + parameter :num_returned, :default => 50_000 + parameter :parent_category_id + end + + class << self + def all(parameters={}) + fetch(parameters).ranks + end + end + end +end diff --git a/lib/ticket_network/catalog/ticket.rb b/lib/ticket_network/catalog/ticket.rb new file mode 100644 index 0000000..3227f56 --- /dev/null +++ b/lib/ticket_network/catalog/ticket.rb @@ -0,0 +1,97 @@ +module TicketNetwork::Catalog + class Ticket < Base + PARKING_REGEX = /park/i.freeze + + class Parser + include ParseHelper + + class Ticket + class Split + include ParseHelper + + elements :int, :as => :ints + end + + include ParseHelper + + element :actual_price + element :event_id + element :face_price + element :high_seat + element :id + element :is_mine + element :low_seat + element :marked + element :notes + element :parent_category_id + element :rating + element :rating_description + element :retail_price + element :row + element :section + element :ticket_quantity + element :wholesale_price + + elements :valid_splits, :as => :splits, :class => Split + end + + elements :ticket_group, :as => :tickets, :class => Ticket + end + + get :get_tickets, :as => :fetch do + parameter :event_id + parameter :high_price + parameter :low_price + parameter :number_of_records, :as => :limit + parameter :order_by_clause, :as => :order + parameter :requested_tix_split, :as => :requested_split + parameter :ticket_group_id, :as => :ticket_id + parameter :where_clause, :as => :where + end + + class << self + def all(parameters={}) + fetch(parameters).tickets + end + + def raw(parameters={}) + all(parameters).collect do |ticket| + parking = parking?(ticket) + + { + :ticket_network_id => ticket.id.to_i, + :price => ticket.actual_price.to_f, + :quantity => ticket.ticket_quantity.to_i, + :section => ticket.section.to_s.gsub(/\//, ' / '), + :row => ticket.row, + :notes => ticket.notes, + :splits => find_splits(ticket), + :general_admission => false, + :is_mine => ticket.is_mine == 'true', + :parking_pass => !!parking, + :lot => parking ? find_lot(ticket) : nil + } + end + end + + def parking?(ticket) + ticket.section =~ PARKING_REGEX || ticket.row =~ PARKING_REGEX + end + private :parking? + + def find_splits(ticket) + ticket.splits.first.ints.collect(&:to_i).sort + end + private :find_splits + + def find_lot(parking_pass) + if !parking_pass.section.blank? && parking_pass.section !~ PARKING_REGEX + parking_pass.section + elsif !parking_pass.row.blank? && parking_pass.row !~ PARKING_REGEX + parking_pass.row + end + end + private :find_lot + end + end +end diff --git a/lib/ticket_network/catalog/venue.rb b/lib/ticket_network/catalog/venue.rb new file mode 100644 index 0000000..d7b0851 --- /dev/null +++ b/lib/ticket_network/catalog/venue.rb @@ -0,0 +1,43 @@ +module TicketNetwork::Catalog + class Venue < Base + class Parser + include ParseHelper + + class Venue + include ParseHelper + + element :box_office_phone + element :capacity + element :child_rules + element :city, :as => :locality + element :country, :as => :country_name + element :directions + element :id + element :name + element :notes + element :number_of_configurations + element :parking + element :public_transportation + element :rules + element :state_province, :as => :region + element :street1, :as => :street_address + element :street2, :as => :extended_address + element :url + element :will_call + element :zip_code, :as => :postal_code + end + + elements :venue, :as => :venues, :class => Venue + end + + get :get_venue, :as => :fetch do + parameter :venue_id + end + + class << self + def all(parameters={}) + fetch(parameters).venues + end + end + end +end diff --git a/lib/ticket_network/checkout/address.rb b/lib/ticket_network/checkout/address.rb new file mode 100644 index 0000000..f79b575 --- /dev/null +++ b/lib/ticket_network/checkout/address.rb @@ -0,0 +1,53 @@ +module TicketNetwork::Checkout + class Address < Base + class Parser + include ParseHelper + + class Address + include ParseHelper + + element :city, :as => :locality + element :contact_name, :as => :name + element :country_description, :as => :country + element :country_id + element :id + element :state_province, :as => :region + element :street1, :as => :street_address + element :street2, :as => :extended_address + element :type_description, :as => :type + element :type_id + element :zip_code, :as => :postal_code + end + + elements :address, :as => :addresses, :class => Address + end + + get :get_address, :as => :fetch do + parameter :address_id, :as => :id + parameter :customer_id + parameter :address_type_id, :as => :type_id + end + + post :write_address, :as => :store, :parser => Parser::Address do + parameter :address_type_id, :as => :type_id + parameter :city, :as => :locality + parameter :contact_name, :as => :name + parameter :country + parameter :country_id + parameter :customer_id + parameter :state_prov_abbr, :as => :region + parameter :street1, :as => :street_address + parameter :street2, :as => :extended_address + parameter :zip_code, :as => :postal_code + end + + class << self + def all(parameters={}) + fetch(parameters).addresses + end + + alias_method :create, :store + alias_method :update, :store + end + end +end diff --git a/lib/ticket_network/checkout/address_type.rb b/lib/ticket_network/checkout/address_type.rb new file mode 100644 index 0000000..9907b38 --- /dev/null +++ b/lib/ticket_network/checkout/address_type.rb @@ -0,0 +1,24 @@ +module TicketNetwork::Checkout + class AddressType < Base + class Parser + include ParseHelper + + class AddressType + include ParseHelper + + element :id + element :description, :as => :name + end + + elements :address_type, :as => :address_types, :class => AddressType + end + + get :get_address_types, :as => :fetch + + class << self + def all(parameters={}) + fetch(parameters).address_types + end + end + end +end diff --git a/lib/ticket_network/checkout/base.rb b/lib/ticket_network/checkout/base.rb new file mode 100644 index 0000000..7cdc883 --- /dev/null +++ b/lib/ticket_network/checkout/base.rb @@ -0,0 +1,7 @@ +module TicketNetwork::Checkout + class Base < TicketNetwork::Base + service :checkout + end + + ParseHelper = TicketNetwork::ParseHelper +end diff --git a/lib/ticket_network/checkout/credit_card.rb b/lib/ticket_network/checkout/credit_card.rb new file mode 100644 index 0000000..0cf4710 --- /dev/null +++ b/lib/ticket_network/checkout/credit_card.rb @@ -0,0 +1,46 @@ +module TicketNetwork::Checkout + class CreditCard < Base + class Parser + include ParseHelper + + class CreditCard + include ParseHelper + + element :expires_month, :as => :expiration_month + element :expires_year, :as => :expiration_year + element :id + element :masked_number + element :name_displayed, :as => :name + element :type_description + element :type_id + end + + elements :credit_card, :as => :credit_cards + end + + get :get_credit_card, :as => :fetch do + parameter :credit_card_id + parameter :credit_card_type_id + parameter :customer_id + end + + post :write_credit_card, :as => :store, :parser => Parser::CreditCard do + parameter :billing_address_id, :as => :address_id + parameter :billing_phone_id, :as => :phone_number_id + parameter :customer_id + parameter :expires_month, :as => :expiration_month + parameter :expires_year, :as => :expiration_year + parameter :name_displayed, :as => :name + parameter :number + end + + class << self + def all(parameters={}) + fetch(parameters).credit_cards + end + + alias_method :create, :store + alias_method :update, :store + end + end +end diff --git a/lib/ticket_network/checkout/customer.rb b/lib/ticket_network/checkout/customer.rb new file mode 100644 index 0000000..7891e09 --- /dev/null +++ b/lib/ticket_network/checkout/customer.rb @@ -0,0 +1,37 @@ +module TicketNetwork::Checkout + class Customer < Base + class Parser + include ParseHelper + + element :email + element :first_name, :as => :given_name + element :id + element :last_name, :as => :family_name + element :notes + element :password + element :pin + end + + get :get_customer_by_id, :as => :fetch do + parameter :customer_id + end + + post :write_customer, :as => :store do + parameter :customer_id, :as => :ticket_network_id + parameter :first_name, :as => :given_name + parameter :last_name, :as => :family_name + parameter :email + parameter :password + parameter :notes + end + + class << self + def find(customer_id) + fetch(:customer_id => :customer_id) + end + + alias_method :create, :store + alias_method :update, :store + end + end +end diff --git a/lib/ticket_network/checkout/order.rb b/lib/ticket_network/checkout/order.rb new file mode 100644 index 0000000..ad456b2 --- /dev/null +++ b/lib/ticket_network/checkout/order.rb @@ -0,0 +1,33 @@ +module TicketNetwork::Checkout + class Order < Base + class Parser + include ParseHelper + + element :confirmation_email_text + element :request_id, :as => :id + element :sale_total, :as => :total + end + + post :create_request, :as => :store do + parameter :customer_id + parameter :credit_card_id + parameter :billing_address_id + parameter :credit_card_security_code, :as => :security_code + parameter :ticket_group_id, :as => :ticket_id + parameter :ticket_quantity, :as => :quantity + parameter :shipping_method_id + parameter :special_instructions, :as => :notes + parameter :promo_code + parameter :accept_alternate, :as => :alternate_acceptable + parameter :referral_source_id + parameter :referral_source_details + parameter :ppcsrc + parameter :override_price + parameter :customer_ip_address + end + + class << self + alias_method :create, :store + end + end +end diff --git a/lib/ticket_network/checkout/phone_number.rb b/lib/ticket_network/checkout/phone_number.rb new file mode 100644 index 0000000..c6f3526 --- /dev/null +++ b/lib/ticket_network/checkout/phone_number.rb @@ -0,0 +1,41 @@ +module TicketNetwork::Checkout + class PhoneNumber < Base + class Parser + include ParseHelper + + class PhoneNumber + include ParseHelper + + element :display_order, :as => :order + element :id + element :number + element :type_description + element :type_id + end + + elements :phone, :as => :phone_numbers, :class => PhoneNumber + end + + get :get_phone, :as => :fetch do + parameter :customer_id + parameter :phone_id, :as => :id + parameter :phone_type_id, :as => :type_id + end + + post :write_phone, :as => :store, :parser => Parser::PhoneNumber do + parameter :customer_id + parameter :display_order, :as => :order, :default => 0 + parameter :phone_number, :as => :number + parameter :phone_type_id, :as => :type_id + end + + class << self + def all(parameters={}) + fetch(parameters).phone_numbers + end + + alias_method :create, :store + alias_method :update, :store + end + end +end diff --git a/lib/ticket_network/checkout/phone_number_type.rb b/lib/ticket_network/checkout/phone_number_type.rb new file mode 100644 index 0000000..1013df8 --- /dev/null +++ b/lib/ticket_network/checkout/phone_number_type.rb @@ -0,0 +1,25 @@ +module TicketNetwork::Checkout + class PhoneNumberType < Base + class Parser + include ParseHelper + + class PhoneNumberType + include ParseHelper + + element :id + element :description, :as => :name + end + + elements :phone_type, :as => :phone_number_types, + :class => PhoneNumberType + end + + get :get_phone_types, :as => :fetch + + class << self + def all(parameters={}) + fetch(parameters).phone_number_types + end + end + end +end diff --git a/lib/ticket_network/format_helper.rb b/lib/ticket_network/format_helper.rb new file mode 100644 index 0000000..72bdfba --- /dev/null +++ b/lib/ticket_network/format_helper.rb @@ -0,0 +1,30 @@ +module TicketNetwork + module FormatHelper + # Formats keys for use in parsing responses and building query strings. + def format_key(key, query=false) + key = key.to_s + key.upcase! if key == 'id' + key.gsub!(/_id$/, '_ID') + key.gsub!(/_url$/, '_URL') + key = key.camelize(!query ? :upper : :lower) unless key == 'int' + key + end + + # Formats query keys for use in a query string. + def format_query_key(key) + format_key(key, true) + end + + # Formats and escapes query values for use in a query string. + def format_query_value(value) + value = case value + when Time, Date + value.to_s(:db) + else + value.to_s + end + + CGI.escape(value) + end + end +end diff --git a/lib/ticket_network/parse_helper.rb b/lib/ticket_network/parse_helper.rb new file mode 100644 index 0000000..063340f --- /dev/null +++ b/lib/ticket_network/parse_helper.rb @@ -0,0 +1,27 @@ +module TicketNetwork + module ParseHelper + def self.included(base) + base.class_eval do + include SAXMachine + end + + base.extend(ClassMethods) + end + + module ClassMethods + include FormatHelper + + def element(name, options={}) + options.reverse_merge!(:as => name) + name = format_key(name) + super(name, options) + end + + def elements(name, options={}) + options.reverse_merge!(:as => name) + name = format_key(name) + super(name, options) + end + end + end +end diff --git a/ticket_network.gemspec b/ticket_network.gemspec new file mode 100644 index 0000000..8aa6dc7 --- /dev/null +++ b/ticket_network.gemspec @@ -0,0 +1,10 @@ +Gem::Specification.new do |gem| + gem.name = 'ticket_network' + gem.version = '0.0.1' + gem.summary = 'An interface library for the Ticket Network web service.' + + gem.files = Dir['lib/**/*'] + gem.add_dependency 'activesupport', '>= 3.0.0.beta4' + gem.add_dependency 'curb', '0.7.6' + gem.add_dependency 'sax-machine', '0.0.15' +end