ticketmaster 0.0.1 → 0.1.0
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.
- data/NOTES +18 -0
- data/VERSION +1 -1
- data/lib/console.rb +0 -0
- data/lib/ticketmaster.rb +31 -9
- data/lib/ticketmaster/authenticator.rb +1 -3
- data/lib/ticketmaster/dummy/dummy.rb +65 -0
- data/lib/ticketmaster/dummy/project.rb +54 -0
- data/lib/ticketmaster/dummy/ticket.rb +54 -0
- data/lib/ticketmaster/exception.rb +2 -0
- data/lib/ticketmaster/project.rb +75 -70
- data/lib/ticketmaster/provider.rb +68 -0
- data/lib/ticketmaster/ticket.rb +114 -21
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/ticketmaster_spec.rb +58 -0
- metadata +25 -6
- data/test/test_unfuddler.rb +0 -75
data/NOTES
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
This needs a documentation for implementing Providers and some guidelines on Provider stuff.
|
2
|
+
|
3
|
+
Environment variables and config files
|
4
|
+
~/.ticketmaster.yml
|
5
|
+
|
6
|
+
|
7
|
+
.ticketmaster.yml
|
8
|
+
default: lighthouse
|
9
|
+
lighthouse:
|
10
|
+
token: 67dc50b88ea1e339eb72ba0e2b90573b6453d805
|
11
|
+
account: ticketmaster
|
12
|
+
unfuddle:
|
13
|
+
username: xxx
|
14
|
+
password: xxx
|
15
|
+
subdomain: xxx
|
16
|
+
|
17
|
+
|
18
|
+
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/lib/console.rb
ADDED
File without changes
|
data/lib/ticketmaster.rb
CHANGED
@@ -3,20 +3,42 @@
|
|
3
3
|
hashie
|
4
4
|
}.each {|lib| require lib }
|
5
5
|
|
6
|
+
class TicketMaster
|
7
|
+
end
|
8
|
+
|
6
9
|
%w{
|
7
10
|
project
|
8
11
|
ticket
|
9
12
|
authenticator
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
attr_reader :project, :client
|
13
|
+
provider
|
14
|
+
exception
|
15
|
+
}.each {|lib| require File.dirname(__FILE__) + '/ticketmaster/' + lib }
|
14
16
|
|
15
|
-
def initialize(client, authentication = {})
|
16
|
-
@project = Project::Finder.new(client, authentication)
|
17
|
-
end
|
18
|
-
end
|
19
17
|
|
18
|
+
# This is the TicketMaster class
|
19
|
+
#
|
20
20
|
class TicketMaster
|
21
|
-
|
21
|
+
attr_reader :provider
|
22
|
+
|
23
|
+
# This initializes the TicketMaster instance and prepares the provider
|
24
|
+
# If called without any arguments, it conveniently tries searching for the information in
|
25
|
+
# ~/.ticketmaster.yml
|
26
|
+
# See the documentation for more information on the format of that file.
|
27
|
+
#
|
28
|
+
# What it DOES NOT do is auto-require the provider...so make sure you have the providers required.
|
29
|
+
def initialize(system = nil, authentication = nil)
|
30
|
+
if system.nil?
|
31
|
+
require 'yaml'
|
32
|
+
data = YAML.load_file File.expand_path('~/.ticketmaster.yml')
|
33
|
+
system = data['default'] || data.first.first
|
34
|
+
authentication = data[system] if authentication.nil?
|
35
|
+
end
|
36
|
+
self.extend TicketMaster::Provider.const_get(system.to_s.capitalize)
|
37
|
+
authorize authentication
|
38
|
+
end
|
39
|
+
|
40
|
+
# Providers should over-write this method
|
41
|
+
def authorize(authentication = {})
|
42
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
43
|
+
end
|
22
44
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
# This is the Dummy Provider
|
3
|
+
#
|
4
|
+
# It doesn't really do anything, it exists in order to test the basic functionality of ticketmaster
|
5
|
+
# and to provide an example the basics of what is to be expected from the providers.
|
6
|
+
#
|
7
|
+
# Note that the initial provider name is a module rather than a class. TicketMaster.new
|
8
|
+
# extends on an instance-based fashion. If you would rather initialize using code that is
|
9
|
+
# closer to:
|
10
|
+
#
|
11
|
+
# TicketMaster::Provider::Dummy.new(authentication)
|
12
|
+
#
|
13
|
+
# You will have to do a little magic trick and define new on the provider as a wrapper
|
14
|
+
# around the TicketMaster.new call.
|
15
|
+
module Dummy
|
16
|
+
include TicketMaster::Provider::Base
|
17
|
+
@system = :dummy
|
18
|
+
# An example of what to do if you would like to do TicketMaster::Provider::Dummy.new(...)
|
19
|
+
# rather than TicketMaster.new(:dummy, ...)
|
20
|
+
def self.new(authentication = {})
|
21
|
+
TicketMaster.new(:dummy, authentication)
|
22
|
+
# maybe do some other stuff
|
23
|
+
end
|
24
|
+
|
25
|
+
# It returns all projects...
|
26
|
+
def projects(*options)
|
27
|
+
return Project.find(*options) if options.length > 0
|
28
|
+
[Project.new]
|
29
|
+
end
|
30
|
+
|
31
|
+
# It returns all tickets...
|
32
|
+
def tickets(*options)
|
33
|
+
return Ticket.find(*options) if options.length > 0
|
34
|
+
[Ticket.new]
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returning a single ticket based on parameters or a Ticket class if no parameters given
|
38
|
+
#
|
39
|
+
# The later is for doing:
|
40
|
+
# ticketmaster.ticket.find(...)
|
41
|
+
# ticketmaster.tickets.create(...)
|
42
|
+
#
|
43
|
+
# It's semantically nicer to use ticketmaster.tickets.find ... but people do strange things...
|
44
|
+
def ticket(*options)
|
45
|
+
return Ticket.new(*options) if options.length > 0
|
46
|
+
TicketMaster::Provider::Dummy::Ticket
|
47
|
+
end
|
48
|
+
|
49
|
+
# Return a single project based on parameters or the Project class if no parameters given
|
50
|
+
#
|
51
|
+
# The later is for doing:
|
52
|
+
# ticketmaster.project.find(...)
|
53
|
+
# ticketmaster.tickets.create(...)
|
54
|
+
#
|
55
|
+
# (It's semantically nicer to use ticketmaster.projects.find ... but people do strange things)
|
56
|
+
def project(*options)
|
57
|
+
return Project.new(*options) if options.length > 0
|
58
|
+
TicketMaster::Provider::Dummy::Project
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
%w| project ticket |.each do |f|
|
64
|
+
require File.dirname(__FILE__) + '/' + f +'.rb'
|
65
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Dummy
|
3
|
+
# This is the Project class for the Dummy provider
|
4
|
+
class Project < TicketMaster::Provider::Base::Project
|
5
|
+
# This serves to find projects
|
6
|
+
# As noted in the Project class's documentation, we should try to accept these:
|
7
|
+
#
|
8
|
+
# * find(:all) - Returns an array of all projects
|
9
|
+
# * find(##) - Returns a project based on that id or some other primary (unique) attribute
|
10
|
+
# * find(:first, :summary => 'Project name') - Returns a project based on the project's attributes
|
11
|
+
# * find(:summary => 'Test Project') - Returns all projects based on the given attribute(s)
|
12
|
+
def self.find(*options)
|
13
|
+
first = options.shift
|
14
|
+
if first.nil? or first == :all
|
15
|
+
[Project.new]
|
16
|
+
elsif first == :first
|
17
|
+
Project.new(options.shift)
|
18
|
+
elsif first.is_a?(Hash)
|
19
|
+
[Project.new(first)]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# You should define @system and @system_data here.
|
24
|
+
# The data stuff is just to initialize fake data. In a real provider, you would use the API
|
25
|
+
# to grab the information and then initialize based on that info.
|
26
|
+
# @system_data would hold the API's model/instance for reference
|
27
|
+
def initialize(*options)
|
28
|
+
data = {:id => rand(1000).to_i, :name => 'Dummy', :description => 'Mock!-ing Bird',
|
29
|
+
:created_at => Time.now, :updated_at => Time.now}
|
30
|
+
@system = :dummy
|
31
|
+
super(data.merge(options.first || {}))
|
32
|
+
end
|
33
|
+
|
34
|
+
# Should return all of the project's tickets
|
35
|
+
def tickets(*options)
|
36
|
+
return Ticket.find(*options) if options.length > 0
|
37
|
+
[Ticket.new]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Point it to the Dummy's Ticket class
|
41
|
+
def ticket(*options)
|
42
|
+
return Ticket.find(:first, options.first) if options.length > 0
|
43
|
+
Ticket
|
44
|
+
end
|
45
|
+
|
46
|
+
# Nothing to save so we always return true
|
47
|
+
# ...unless it's an odd numbered second on Friday the 13th. muhaha!
|
48
|
+
def save
|
49
|
+
time = Time.now
|
50
|
+
!(time.wday == 5 and time.day == 13 and time.to_i % 2 == 1)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Dummy
|
3
|
+
# The Dummy Provider's Ticket class
|
4
|
+
class Ticket < TicketMaster::Provider::Base::Ticket
|
5
|
+
@system = :dummy
|
6
|
+
|
7
|
+
# Find a ticket
|
8
|
+
#
|
9
|
+
# The implementation should be able to accept these cases if feasible:
|
10
|
+
#
|
11
|
+
# * find(:all) - Returns an array of all tickets
|
12
|
+
# * find(##) - Returns a project based on that id or some other primary (unique) attribute
|
13
|
+
# * find(:first, :summary => 'Ticket title') - Returns a ticket based on the ticket's attributes
|
14
|
+
# * find(:summary => 'Test Ticket') - Returns all tickets based on the given attributes
|
15
|
+
def self.find(*options)
|
16
|
+
first = options.shift
|
17
|
+
if first.nil? or first == :all
|
18
|
+
[Ticket.new]
|
19
|
+
elsif first == :first
|
20
|
+
Ticket.new(options.shift)
|
21
|
+
elsif first.is_a?(Hash)
|
22
|
+
[Ticket.new(first)]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# You don't need to define an initializer, this is only here to initialize dummy data
|
27
|
+
def initialize(*options)
|
28
|
+
data = {:id => rand(1000), :status => ['lol', 'rofl', 'lmao', 'lamo', 'haha', 'heh'][rand(6)],
|
29
|
+
:priority => rand(10), :summary => 'Tickets ticket ticket ticket', :resolution => false,
|
30
|
+
:created_at => Time.now, :updated_at => Time.now, :description => 'Ticket ticket ticket ticket laughing',
|
31
|
+
:assignee => 'lol-man'}
|
32
|
+
@system = :dummy
|
33
|
+
super(data.merge(options.first || {}))
|
34
|
+
end
|
35
|
+
|
36
|
+
# Nothing to save so we always return true
|
37
|
+
# ...unless it's the Ides of March and the second is divisible by three. muhaha!
|
38
|
+
def save
|
39
|
+
time = Time.now
|
40
|
+
!(time.wday == 15 and time.day == 3 and time.to_i % 3 == 0)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Nothing to close, so we always return true
|
44
|
+
def close
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Nothing to destroy so we always return true
|
49
|
+
def destroy
|
50
|
+
true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/ticketmaster/project.rb
CHANGED
@@ -1,82 +1,87 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
#
|
4
|
-
# projects by not specifying any query.
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Base
|
3
|
+
# This is the base Project class for providers
|
5
4
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
5
|
+
# Providers should inherit this class and redefine the methods
|
6
|
+
#
|
7
|
+
# Each provider should have their own @system defined.
|
8
|
+
# For example, ticketmaster-unfuddle's @system is :unfuddle and ticketmaster-lighthouse's
|
9
|
+
# @system is :lighthouse.
|
11
10
|
#
|
12
|
-
|
13
|
-
# Asks the client for the projects, should return an array of
|
14
|
-
# project objects.
|
15
|
-
projects = TicketMasterMod.const_get(options[:client].to_s.capitalize)::Project.find(query, options)
|
16
|
-
|
17
|
-
if query
|
18
|
-
query = {:name => query} if query.is_a?(String)
|
19
|
-
|
20
|
-
# For some reason #tickets find ability messes up if we use a class method.
|
21
|
-
# Thus I decided to go for an instance method.
|
22
|
-
return Project.new.search(query, projects)
|
23
|
-
end
|
24
|
-
|
25
|
-
# No query, so we just go ahead and return the array of projects
|
26
|
-
projects
|
27
|
-
end
|
28
|
-
|
29
|
-
# Asks the client for the tickets associated with the project,
|
30
|
-
# returns an array of Ticket objects.
|
11
|
+
# Methods that must be implemented by the provider
|
31
12
|
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
tickets
|
39
|
-
end
|
40
|
-
|
41
|
-
# Mainly here because it is more natural to do:
|
42
|
-
# project.ticket.create(..)
|
13
|
+
# * self.find
|
14
|
+
# * tickets
|
15
|
+
# * ticket
|
16
|
+
# * save
|
17
|
+
# * initialize
|
43
18
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
19
|
+
# Methods that would probably be okay if the provider left it alone:
|
20
|
+
#
|
21
|
+
# * self.create
|
22
|
+
#
|
23
|
+
# A provider should define as many attributes as feasibly possible. The list below are
|
24
|
+
# some guidelines as to what attributes are necessary, if your provider's api does not
|
25
|
+
# implement them, point it to an attribute that is close to it. (for example, a name
|
26
|
+
# can point to title. Remember to alias it in your class!)
|
27
|
+
#
|
28
|
+
# * id
|
29
|
+
# * name
|
30
|
+
# * created_at
|
31
|
+
# * updated_at
|
32
|
+
# * description
|
33
|
+
class Project < Hashie::Mash
|
34
|
+
attr_accessor :system, :system_data
|
35
|
+
# Find a project, or find more projects.
|
36
|
+
# You can also retrieve an array of all projects by not specifying any query.
|
37
|
+
#
|
38
|
+
# The implementation should be able to accept these cases if feasible:
|
39
|
+
#
|
40
|
+
# * find(:all) - Returns an array of all projects
|
41
|
+
# * find(##) - Returns a project based on that id or some other primary (unique) attribute
|
42
|
+
# * find(:first, :summary => 'Project name') - Returns a project based on the project's attributes
|
43
|
+
# * find(:summary => 'Test Project') - Returns all projects based on the given attribute(s)
|
44
|
+
def self.find(*options)
|
45
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
60
46
|
end
|
61
|
-
|
62
|
-
#
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
47
|
+
|
48
|
+
# Create a project.
|
49
|
+
# Basically, a .new and .save in the same call. The default method assumes it is passed a
|
50
|
+
# single hash with attribute information
|
51
|
+
def self.create(*options)
|
52
|
+
project = self.new(options.first)
|
53
|
+
project.save
|
54
|
+
project
|
55
|
+
end
|
56
|
+
|
57
|
+
# The initializer
|
58
|
+
def initialize(*options)
|
59
|
+
super(options.shift)
|
60
|
+
# do some other stuff
|
71
61
|
end
|
72
62
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
63
|
+
# Asks the provider's api for the tickets associated with the project,
|
64
|
+
# returns an array of Ticket objects.
|
65
|
+
def tickets(*options)
|
66
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
77
67
|
end
|
78
68
|
|
79
|
-
|
69
|
+
# Mainly here because it is more natural to do:
|
70
|
+
# project.ticket.create(..)
|
71
|
+
#
|
72
|
+
# Than
|
73
|
+
# project.tickets.create(..)
|
74
|
+
#
|
75
|
+
# returns a ticket object or ticket class that responds to .new and .create.
|
76
|
+
def ticket(*options)
|
77
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
78
|
+
end
|
79
|
+
|
80
|
+
# Save changes to this project
|
81
|
+
def save
|
82
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
83
|
+
end
|
84
|
+
|
80
85
|
end
|
81
86
|
end
|
82
87
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# This is the TicketMaster::Provider Module
|
2
|
+
#
|
3
|
+
# All provider classes will extend into this module.
|
4
|
+
# See the Dummy provider's code for some specifics on implementing a provider
|
5
|
+
#
|
6
|
+
# Currently, only Projects and Tickets are standardized in ticket master. Therefore,
|
7
|
+
# if your provider has other types--such as People/Members, Messages, Milestones, Notes,
|
8
|
+
# Tags, etc--you may implement it at your discretion. We are planning to eventually
|
9
|
+
# incorporate and standardize many of these into the overall provider. Keep on the look out for it!
|
10
|
+
#
|
11
|
+
# We are also planning on standardizing non-standard/provider-specific object models
|
12
|
+
module TicketMaster::Provider
|
13
|
+
module Base
|
14
|
+
# All providers must define this method.
|
15
|
+
# It doesn't *have* to do anything, it just has to be there. But since it's here, you don't
|
16
|
+
# have to worry about it as long as you "include TicketMaster::Provider::Base"
|
17
|
+
#
|
18
|
+
# If you need to do some additional things to initialize the instance, here is where you would put it
|
19
|
+
def authorize(authentication = {})
|
20
|
+
@authentication = TicketMaster::Authenticator.new(authentication)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Providers should try to define this method
|
24
|
+
#
|
25
|
+
# It returns the project class for this provider, so that there can be calls such as
|
26
|
+
# ticketmaster.project.find :all
|
27
|
+
# ticketmaster.project(:id => 777, :name => 'Proj test')
|
28
|
+
#
|
29
|
+
# Should try to implement a find :first (or find with singular result) if given parameters
|
30
|
+
def project(*options)
|
31
|
+
return TicketMaster::Project.find(*options) if options.length > 0
|
32
|
+
TicketMaster::Project
|
33
|
+
end
|
34
|
+
|
35
|
+
# Providers should try to define this method
|
36
|
+
#
|
37
|
+
# It returns the ticket class for this provider, so that there can be calls such as
|
38
|
+
# ticketmaster.ticket.find :all
|
39
|
+
# ticketmaster.ticket(:id => 102, :title => 'Ticket')
|
40
|
+
#
|
41
|
+
# Don't confuse this with project.ticket.find(...) since that deals with tickets specific to a
|
42
|
+
# project. This is deals with tickets
|
43
|
+
#
|
44
|
+
# Should try to implement a find :first (or find with singular result) if given parameters
|
45
|
+
def ticket(*options)
|
46
|
+
return TicketMaster::Ticket.find(*options) if options.length > 0
|
47
|
+
TicketMaster::Ticket
|
48
|
+
end
|
49
|
+
|
50
|
+
# All providers should try to define this method.
|
51
|
+
#
|
52
|
+
# It returns all projects in an array
|
53
|
+
# Should try to implement a find :all if given parameters
|
54
|
+
def projects(*options)
|
55
|
+
[]
|
56
|
+
end
|
57
|
+
|
58
|
+
# All providers should try to define this method
|
59
|
+
#
|
60
|
+
# It returns all tickets in an array.
|
61
|
+
# Should try to implement a find :all if given parameters
|
62
|
+
def tickets(*options)
|
63
|
+
[]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
|
data/lib/ticketmaster/ticket.rb
CHANGED
@@ -1,27 +1,120 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Base
|
3
|
+
# The base ticket class for ticketmaster
|
4
|
+
# All providers should inherit this class
|
5
|
+
#
|
6
|
+
# The difference between the class methods and instance methods are that the instance
|
7
|
+
# methods should be treated as though they are called on a known ticket and the class
|
8
|
+
# methods act based on a blank slate (which means the info to find a specific ticket has
|
9
|
+
# to be passed in the parameters in the ticket)
|
10
|
+
#
|
11
|
+
# Methods that a provider must define:
|
12
|
+
#
|
13
|
+
# * self.find
|
14
|
+
# * close
|
15
|
+
# * save
|
16
|
+
# * destroy
|
17
|
+
#
|
18
|
+
# Methods that the provider should define if feasible:
|
19
|
+
#
|
20
|
+
# * reload!
|
21
|
+
# * initialize
|
22
|
+
#
|
23
|
+
# Methods that would probably be okay if the provider left it alone:
|
24
|
+
#
|
25
|
+
# * self.create
|
26
|
+
# * update
|
27
|
+
# * update!
|
28
|
+
#
|
29
|
+
# A provider should define as many attributes as feasibly possible. The list below are
|
30
|
+
# some guidelines as to what attributes are necessary, if your provider's api does not
|
31
|
+
# implement them, point it to an attribute that is close to it. (for example, a summary
|
32
|
+
# can point to title. and assignee might point to assigned_to. Remember to alias it in your class!)
|
33
|
+
#
|
34
|
+
# * id
|
35
|
+
# * status
|
36
|
+
# * priority
|
37
|
+
# * summary
|
38
|
+
# * resolution
|
39
|
+
# * created_at
|
40
|
+
# * updated_at
|
41
|
+
# * description
|
42
|
+
# * assignee
|
43
|
+
class Ticket < Hashie::Mash
|
44
|
+
@ignore_inspect = %w| system system_data |
|
45
|
+
@system = nil # The symbol for the provider.
|
46
|
+
@system_data = nil # The system info for the provider
|
47
|
+
attr_accessor :system, :system_data
|
48
|
+
# Find a ticket
|
49
|
+
#
|
50
|
+
# The implementation should be able to accept these cases if feasible:
|
51
|
+
#
|
52
|
+
# * find(:all) - Returns an array of all tickets
|
53
|
+
# * find(##) - Returns a project based on that id or some other primary (unique) attribute
|
54
|
+
# * find(:first, :summary => 'Ticket title') - Returns a ticket based on the ticket's attributes
|
55
|
+
# * find(:summary => 'Test Ticket') - Returns all tickets based on the given attributes
|
56
|
+
def self.find(*options)
|
57
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
58
|
+
end
|
59
|
+
|
60
|
+
# Create a ticket.
|
61
|
+
# Basically, a .new and .save in the same call. The default method assumes it is passed a
|
62
|
+
# single hash with attribute information
|
63
|
+
def self.create(*options)
|
64
|
+
ticket = self.new(options.first)
|
65
|
+
ticket.save
|
66
|
+
end
|
67
|
+
|
68
|
+
# Instantiate a new ticket (but don't save yet!)
|
69
|
+
# The default method assumes a single hash with all the parameters is passed to Ticket.new
|
70
|
+
def initialize(*options)
|
71
|
+
super(options.first)
|
72
|
+
# do some other stuff
|
18
73
|
end
|
19
74
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
75
|
+
# Close this ticket
|
76
|
+
#
|
77
|
+
# On success it should return true, otherwise false
|
78
|
+
def close(*options)
|
79
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
80
|
+
end
|
81
|
+
|
82
|
+
# Save this ticket
|
83
|
+
# Expected return value of true (successful) or false (failure)
|
84
|
+
def save(*options)
|
85
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
86
|
+
end
|
87
|
+
|
88
|
+
# Reload this ticket
|
89
|
+
def reload!(*options)
|
90
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
91
|
+
end
|
92
|
+
|
93
|
+
# Delete this ticket
|
94
|
+
#
|
95
|
+
# If your provider doesn't have a delete or trash option for tickets:
|
96
|
+
# raise TicketMaster::Exception.new("Tickets can not be destroyed on SomeProviderAPI")
|
97
|
+
def destroy(*options)
|
98
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
24
99
|
end
|
100
|
+
|
101
|
+
# Update a ticket and save
|
102
|
+
#
|
103
|
+
# The default assumes the options passed to it is a single hash with the attributes to update
|
104
|
+
def update!(*options)
|
105
|
+
update(options.first)
|
106
|
+
save
|
107
|
+
end
|
108
|
+
|
109
|
+
# Update a ticket's attributes, but no save
|
110
|
+
# Used when you need to do mass attribute assignment
|
111
|
+
def update(*options)
|
112
|
+
options.first.each do |k, v|
|
113
|
+
self.send(k + '=', v)
|
114
|
+
end
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
25
118
|
end
|
26
119
|
end
|
27
120
|
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'ticketmaster.rb'
|
4
|
+
require 'ticketmaster/dummy/dummy.rb'
|
5
|
+
require 'spec'
|
6
|
+
require 'spec/autorun'
|
7
|
+
|
8
|
+
Spec::Runner.configure do |config|
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
# This can also act as an example test or test skeleton for your provider.
|
4
|
+
# Just replace the Dummy in @project_class and @ticket_class
|
5
|
+
# Also, remember to mock or stub any API calls
|
6
|
+
describe "Ticketmaster" do
|
7
|
+
before(:each) do
|
8
|
+
@ticketmaster = TicketMaster.new(:dummy)
|
9
|
+
@project_class = TicketMaster::Provider::Dummy::Project
|
10
|
+
@ticket_class = TicketMaster::Provider::Dummy::Ticket
|
11
|
+
end
|
12
|
+
|
13
|
+
# Essentially just a sanity check on the include since .new always returns the object's instance
|
14
|
+
it "should be able to instantiate a new instance" do
|
15
|
+
@ticketmaster.should be_an_instance_of TicketMaster
|
16
|
+
@ticketmaster.should be_a_kind_of TicketMaster::Provider::Dummy
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be able to load projects" do
|
20
|
+
@ticketmaster.projects.should be_an_instance_of Array
|
21
|
+
@ticketmaster.projects.first.should be_an_instance_of @project_class
|
22
|
+
@ticketmaster.projects.first.description.should == "Mock!-ing Bird"
|
23
|
+
@ticketmaster.projects(:id => 555).should be_an_instance_of Array
|
24
|
+
@ticketmaster.projects(:id => 555).first.should be_an_instance_of @project_class
|
25
|
+
@ticketmaster.projects(:id => 555).first.id.should == 555
|
26
|
+
|
27
|
+
@ticketmaster.project.should == @project_class
|
28
|
+
@ticketmaster.project(:name => "Whack whack what?").should be_an_instance_of @project_class
|
29
|
+
@ticketmaster.project(:name => "Whack whack what?").name.should == "Whack whack what?"
|
30
|
+
@ticketmaster.project.find(:first, :description => "Shocking Dirb").should be_an_instance_of @project_class
|
31
|
+
@ticketmaster.project.find(:first, :description => "Shocking Dirb").description.should == "Shocking Dirb"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to do project stuff" do
|
35
|
+
info = {:id => 777, :name => "Tiket Name c", :description => "that c thinks the k is trying to steal it's identity"}
|
36
|
+
@ticketmaster.project.create(info).should be_an_instance_of @project_class
|
37
|
+
@ticketmaster.project.new(info).should be_an_instance_of @project_class
|
38
|
+
@ticketmaster.project.create(info).id.should == 777
|
39
|
+
@ticketmaster.project.new(info).id.should == 777
|
40
|
+
|
41
|
+
@ticketmaster.projects.first.save.should == true
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should be able to load tickets" do
|
45
|
+
project = @ticketmaster.projects.first
|
46
|
+
project.tickets.should be_an_instance_of Array
|
47
|
+
project.tickets.first.should be_an_instance_of @ticket_class
|
48
|
+
project.tickets(:id => 999).should be_an_instance_of Array
|
49
|
+
project.tickets(:id => 999).first.should be_an_instance_of @ticket_class
|
50
|
+
project.tickets(:id => 999).first.id.should == 999
|
51
|
+
|
52
|
+
project.ticket.should == TicketMaster::Provider::Dummy::Ticket
|
53
|
+
project.ticket(:id => 888).should be_an_instance_of @ticket_class
|
54
|
+
project.ticket(:id => 888).id.should == 888
|
55
|
+
project.ticket.find(:first, :id => 888).should be_an_instance_of @ticket_class
|
56
|
+
project.ticket.find(:first, :id => 888).id.should == 888
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ticketmaster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
|
-
- 0
|
8
8
|
- 1
|
9
|
-
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Sirupsen
|
@@ -15,16 +16,18 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2010-06-
|
19
|
+
date: 2010-06-22 00:00:00 +02:00
|
19
20
|
default_executable: ticket
|
20
21
|
dependencies:
|
21
22
|
- !ruby/object:Gem::Dependency
|
22
23
|
name: hashie
|
23
24
|
prerelease: false
|
24
25
|
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
25
27
|
requirements:
|
26
28
|
- - ">="
|
27
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 3
|
28
31
|
segments:
|
29
32
|
- 0
|
30
33
|
version: "0"
|
@@ -34,9 +37,11 @@ dependencies:
|
|
34
37
|
name: shoulda
|
35
38
|
prerelease: false
|
36
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
37
41
|
requirements:
|
38
42
|
- - ">="
|
39
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
40
45
|
segments:
|
41
46
|
- 0
|
42
47
|
version: "0"
|
@@ -55,17 +60,26 @@ files:
|
|
55
60
|
- .document
|
56
61
|
- .gitignore
|
57
62
|
- LICENSE
|
63
|
+
- NOTES
|
58
64
|
- README.md
|
59
65
|
- Rakefile
|
60
66
|
- VERSION
|
61
67
|
- bin/ticket
|
68
|
+
- lib/console.rb
|
62
69
|
- lib/ticketmaster.rb
|
63
70
|
- lib/ticketmaster/authenticator.rb
|
71
|
+
- lib/ticketmaster/dummy/dummy.rb
|
72
|
+
- lib/ticketmaster/dummy/project.rb
|
73
|
+
- lib/ticketmaster/dummy/ticket.rb
|
74
|
+
- lib/ticketmaster/exception.rb
|
64
75
|
- lib/ticketmaster/project.rb
|
76
|
+
- lib/ticketmaster/provider.rb
|
65
77
|
- lib/ticketmaster/ticket.rb
|
78
|
+
- spec/spec.opts
|
79
|
+
- spec/spec_helper.rb
|
80
|
+
- spec/ticketmaster_spec.rb
|
66
81
|
- test/helper.rb
|
67
82
|
- test/test_ticketmaster.rb
|
68
|
-
- test/test_unfuddler.rb
|
69
83
|
has_rdoc: true
|
70
84
|
homepage: http://ticketrb.com
|
71
85
|
licenses: []
|
@@ -76,27 +90,32 @@ rdoc_options:
|
|
76
90
|
require_paths:
|
77
91
|
- lib
|
78
92
|
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
79
94
|
requirements:
|
80
95
|
- - ">="
|
81
96
|
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
82
98
|
segments:
|
83
99
|
- 0
|
84
100
|
version: "0"
|
85
101
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
86
103
|
requirements:
|
87
104
|
- - ">="
|
88
105
|
- !ruby/object:Gem::Version
|
106
|
+
hash: 3
|
89
107
|
segments:
|
90
108
|
- 0
|
91
109
|
version: "0"
|
92
110
|
requirements: []
|
93
111
|
|
94
112
|
rubyforge_project:
|
95
|
-
rubygems_version: 1.3.
|
113
|
+
rubygems_version: 1.3.7
|
96
114
|
signing_key:
|
97
115
|
specification_version: 3
|
98
116
|
summary: Ticketmaster provides a universal API to trouble ticket and project management systems.
|
99
117
|
test_files:
|
100
|
-
-
|
118
|
+
- spec/spec_helper.rb
|
119
|
+
- spec/ticketmaster_spec.rb
|
101
120
|
- test/test_ticketmaster.rb
|
102
121
|
- test/helper.rb
|
data/test/test_unfuddler.rb
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'ticketmaster-unfuddle'
|
3
|
-
|
4
|
-
class TestTicketmaster < Test::Unit::TestCase
|
5
|
-
context "Unfuddle" do
|
6
|
-
setup do
|
7
|
-
@unfuddle = TicketMaster.new(:unfuddle, {:username => "", :password => "", :subdomain => "ticketmaster"})
|
8
|
-
@project = @unfuddle.project.find.first
|
9
|
-
end
|
10
|
-
|
11
|
-
should "find testproject" do
|
12
|
-
project = @unfuddle.project.find(:name => "testproject")
|
13
|
-
|
14
|
-
assert_instance_of TicketMasterMod::Project, project
|
15
|
-
assert_equal "testproject", project.name
|
16
|
-
|
17
|
-
#method 2
|
18
|
-
project = @unfuddle.project.find("testproject")
|
19
|
-
|
20
|
-
assert_instance_of TicketMasterMod::Project, project
|
21
|
-
assert_equal "testproject", project.name
|
22
|
-
|
23
|
-
#method 3
|
24
|
-
project = @unfuddle.project["testproject"]
|
25
|
-
|
26
|
-
assert_instance_of TicketMasterMod::Project, project
|
27
|
-
assert_equal "testproject", project.name
|
28
|
-
end
|
29
|
-
|
30
|
-
context "project instance" do
|
31
|
-
should "find a project" do
|
32
|
-
assert_instance_of TicketMasterMod::Project, @project
|
33
|
-
end
|
34
|
-
|
35
|
-
should "find a bunch of tickets" do
|
36
|
-
@project.tickets
|
37
|
-
end
|
38
|
-
|
39
|
-
should "find new tickets" do
|
40
|
-
tickets = @project.tickets(:status => "new")
|
41
|
-
|
42
|
-
tickets.each do |ticket|
|
43
|
-
assert_equal "new", ticket.status
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
should "find ticket with id 1" do
|
48
|
-
ticket = @project.tickets(:id => 1)
|
49
|
-
|
50
|
-
assert_equal 1, ticket.id
|
51
|
-
end
|
52
|
-
|
53
|
-
should "create a ticket" do
|
54
|
-
assert @project.ticket.create(:priority => 3, :summary => "Test", :description => "Hello World from TicketMaster::Unfuddle").empty?
|
55
|
-
end
|
56
|
-
|
57
|
-
should "change ticket property" do
|
58
|
-
ticket = @project.tickets.last
|
59
|
-
ticket.description = "Edited description"
|
60
|
-
assert ticket.save.empty?
|
61
|
-
|
62
|
-
ticket = @project.tickets.last
|
63
|
-
assert_equal "Edited description", ticket.description
|
64
|
-
end
|
65
|
-
|
66
|
-
should "close the last ticket with a resolution" do
|
67
|
-
ticket = @project.tickets.last
|
68
|
-
assert ticket.close(:resolution => "fixed", :description => "Fixed issue").empty?
|
69
|
-
|
70
|
-
ticket = @project.tickets.last
|
71
|
-
assert_equal "fixed", ticket.resolution
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|