ticketmaster 0.1.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/TODO +1 -0
- data/VERSION +1 -1
- data/bin/ticket +5 -5
- data/lib/ticketmaster.rb +11 -5
- data/lib/ticketmaster/cli/commands/config.rb +90 -0
- data/lib/ticketmaster/cli/commands/console.rb +31 -0
- data/lib/ticketmaster/cli/commands/help.rb +9 -0
- data/lib/ticketmaster/cli/commands/help/config +27 -0
- data/lib/ticketmaster/cli/commands/help/console +13 -0
- data/lib/ticketmaster/cli/commands/help/help +7 -0
- data/lib/ticketmaster/cli/commands/help/project +13 -0
- data/lib/ticketmaster/cli/commands/help/ticket +14 -0
- data/lib/ticketmaster/cli/commands/project.rb +136 -0
- data/lib/ticketmaster/cli/commands/ticket.rb +136 -0
- data/lib/ticketmaster/cli/common.rb +27 -0
- data/lib/ticketmaster/cli/init.rb +74 -0
- data/lib/ticketmaster/comment.rb +97 -0
- data/lib/ticketmaster/common.rb +82 -0
- data/lib/ticketmaster/dummy/project.rb +5 -0
- data/lib/ticketmaster/helper.rb +61 -0
- data/lib/ticketmaster/project.rb +86 -34
- data/lib/ticketmaster/provider.rb +16 -13
- data/lib/ticketmaster/ticket.rb +92 -64
- data/spec/ticketmaster-cli_spec.rb +35 -0
- data/ticketmaster-0.3.0.gem +0 -0
- data/ticketmaster.gemspec +95 -0
- metadata +27 -6
- data/lib/console.rb +0 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# Parses the configuration information and puts it into options
|
2
|
+
def parse_config!(options)
|
3
|
+
config = YAML.load_file File.expand_path(options[:config])
|
4
|
+
provider = (options[:provider] ||= config['default'] || config.first.first)
|
5
|
+
if provider and provider.length > 0
|
6
|
+
options[:project] ||= config[provider]['project']
|
7
|
+
options[:authentication] ||= config[provider]['authentication']
|
8
|
+
end
|
9
|
+
options
|
10
|
+
end
|
11
|
+
|
12
|
+
# A utility method used to separate name:value pairs
|
13
|
+
def attributes_hash(kvlist)
|
14
|
+
if kvlist.is_a?(String)
|
15
|
+
kvlist.split(',').reduce({}) do |mem, kv|
|
16
|
+
key, value = kv.split(':')
|
17
|
+
mem[key] = value
|
18
|
+
mem
|
19
|
+
end
|
20
|
+
elsif kvlist.is_a?(Array)
|
21
|
+
mem = {}
|
22
|
+
kvlist.each_slice(2) do |k, v|
|
23
|
+
mem[k] = v
|
24
|
+
end
|
25
|
+
mem
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'yaml'
|
5
|
+
require File.dirname(__FILE__) + '/common.rb'
|
6
|
+
|
7
|
+
|
8
|
+
commands ={ 'help' => 'Get the help text for a particular command',
|
9
|
+
'console' => 'Open up a ticketmaster console session',
|
10
|
+
'config' => 'Setup and configure a ticketmaster.yml file',
|
11
|
+
'ticket' => 'Work with tickets (create, edit, delete, etc)',
|
12
|
+
'project' => 'Work with projects (create, edit, delete, etc)',
|
13
|
+
}
|
14
|
+
|
15
|
+
helptext = lambda {
|
16
|
+
helpmsg = "\nAvailable commands:\n"
|
17
|
+
commands.sort.reduce(helpmsg) { |mem, cmd| mem << "\t#{cmd.join("\t\t")}\n" }
|
18
|
+
helpmsg << "\nSee 'ticket help COMMAND' for more information on a specific command."
|
19
|
+
}
|
20
|
+
|
21
|
+
ARGV << '--help' if ARGV.length == 0
|
22
|
+
|
23
|
+
options = {:original_argv => ARGV.dup}
|
24
|
+
|
25
|
+
if File.exist?(options[:config] = File.expand_path('ticketmaster.yml'))
|
26
|
+
elsif File.exist?(options[:config] = File.expand_path('config/ticketmaster.yml'))
|
27
|
+
elsif ENV['TICKETMASTER_CONFIG'] and File.exist?(options[:config] = File.expand_path(ENV['TICKETMASTER_CONFIG']))
|
28
|
+
else
|
29
|
+
options[:config] = File.expand_path('~/.ticketmaster.yml')
|
30
|
+
end
|
31
|
+
|
32
|
+
begin
|
33
|
+
OptionParser.new do |opts|
|
34
|
+
opts.banner = 'Usage: ticket [options] COMMAND [command_options]'
|
35
|
+
opts.separator ''
|
36
|
+
opts.separator 'Options:'
|
37
|
+
|
38
|
+
opts.on('-c', '--config CONFIG', 'Use CONFIG as the configuration file. default: ~/.ticketmaster.yml') do |c|
|
39
|
+
options[:config] = c
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on('-p', '--provider PROVIDER', 'Specifies the provider') { |p| options[:provider] = p }
|
43
|
+
|
44
|
+
opts.on('-A', '--authentication AUTH',
|
45
|
+
'Specifies authentication information, comma-separated list of name:value pairs.',
|
46
|
+
'Note: The whole list must be enclosed in quotes if there are any spaces.') do |a|
|
47
|
+
options[:authentication] = attributes_hash(a)
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on('-P', '--project PROJECT', 'Specifies the working project') { |p| options[:project] = p }
|
51
|
+
|
52
|
+
opts.separator ''
|
53
|
+
opts.separator 'Other options:'
|
54
|
+
|
55
|
+
opts.on_tail('-h', '--help', 'Show this message') do
|
56
|
+
puts opts
|
57
|
+
puts helptext.call
|
58
|
+
exit
|
59
|
+
end
|
60
|
+
end.order!
|
61
|
+
rescue OptionParser::MissingArgument => exception
|
62
|
+
puts "ticket #{ARGV.join(' ')}\n\n"
|
63
|
+
puts "Error: An option was called that requires an argument, but was not given one"
|
64
|
+
puts exception.message
|
65
|
+
end
|
66
|
+
|
67
|
+
command = ARGV.shift
|
68
|
+
if commands[command]
|
69
|
+
require File.dirname(__FILE__) + '/commands/' + command
|
70
|
+
send(command, options)
|
71
|
+
else
|
72
|
+
puts "'#{command}' is not a ticketmaster command\n\n", helptext.call
|
73
|
+
exit
|
74
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Base
|
3
|
+
# The comment class
|
4
|
+
#
|
5
|
+
# This will probably one of the most troublesome parts of creating a provider for ticketmaster
|
6
|
+
# since there are so many different ways comments are handled by different APIs.
|
7
|
+
# Keep in mind that if you do need to change/overwrite the methods, you will most likely
|
8
|
+
# only need to overwrite #find_by_id, #find_by_attributes, #search, and possibly #initialize
|
9
|
+
# as long as their parameters conform to what the find method expects.
|
10
|
+
#
|
11
|
+
# Here are the expected attributes:
|
12
|
+
#
|
13
|
+
# * author
|
14
|
+
# * body
|
15
|
+
# * id
|
16
|
+
# * created_at
|
17
|
+
# * updated_at
|
18
|
+
# * ticket_id
|
19
|
+
# * project_id
|
20
|
+
class Comment < Hashie::Mash
|
21
|
+
include TicketMaster::Provider::Common
|
22
|
+
include TicketMaster::Provider::Helper
|
23
|
+
extend TicketMaster::Provider::Helper
|
24
|
+
attr_accessor :system, :system_data
|
25
|
+
API = nil # Replace with your comment's API's Class
|
26
|
+
|
27
|
+
# Find comment
|
28
|
+
# You can also retrieve an array of all comments by not specifying any query.
|
29
|
+
#
|
30
|
+
# * find(<project_id>, <ticket_id>) or find(<project_id>, <ticket_id>, :all) - Returns an array of all comments
|
31
|
+
# * find(<project_id>, <ticket_id>, ##) - Returns a comment based on that id or some other primary (unique) attribute
|
32
|
+
# * find(<project_id>, <ticket_id>, [#, #, #]) - Returns many comments with these ids
|
33
|
+
# * find(<project_id>, <ticket_id>, :first, :name => 'Project name') - Returns the first comment based on the comment's attribute(s)
|
34
|
+
# * find(<project_id>, <ticket_id>, :last, :name => 'Some project') - Returns the last comment based on the comment's attribute(s)
|
35
|
+
# * find(<project_id>, <ticket_id>, :all, :name => 'Test Project') - Returns all comments based on the given attribute(s)
|
36
|
+
def self.find(project_id, ticket_id, *options)
|
37
|
+
first, attributes = options
|
38
|
+
if first.nil? or (first == :all and attributes.nil?)
|
39
|
+
self.find_by_attributes(project_id, ticket_id)
|
40
|
+
elsif first.is_a? Fixnum
|
41
|
+
self.find_by_id(project_id, ticket_id, first)
|
42
|
+
elsif first.is_a? Array
|
43
|
+
first.collect { |id| self.find_by_id(project_id, ticket_id, id) }
|
44
|
+
elsif first == :first
|
45
|
+
comments = attributes.nil? ? self.find_by_attributes(project_id, ticket_id) : self.find_by_attributes(project_id, ticket_id, attributes)
|
46
|
+
comments.first
|
47
|
+
elsif first == :last
|
48
|
+
comments = attributes.nil? ? self.find_by_attributes(project_id, ticket_id) : self.find_by_attributes(project_id, ticket_id, attributes)
|
49
|
+
comments.last
|
50
|
+
elsif first == :all
|
51
|
+
self.find_by_attributes(project_id, ticket_id, attributes)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# The first of whatever comment
|
56
|
+
def self.first(project_id, ticket_id, *options)
|
57
|
+
self.find(project_id, ticket_id, :first, *options)
|
58
|
+
end
|
59
|
+
|
60
|
+
# The last of whatever comment
|
61
|
+
def self.last(project_id, ticket_id, *options)
|
62
|
+
self.find(project_id, ticket_id, :last, *options)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Accepts an integer id and returns the single comment instance
|
66
|
+
# Must be defined by the provider
|
67
|
+
def self.find_by_id(project_id, ticket_id, id)
|
68
|
+
if self::API.is_a? Class
|
69
|
+
self.new self::API.find(id, :params => {:project_id => project_id, :ticket_id => ticket_id})
|
70
|
+
else
|
71
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Accepts an attributes hash and returns all comments matching those attributes in an array
|
76
|
+
# Should return all comments if the attributes hash is empty
|
77
|
+
# Must be defined by the provider
|
78
|
+
def self.find_by_attributes(project_id, ticket_id, attributes = {})
|
79
|
+
if self::API.is_a? Class
|
80
|
+
self.search(project_id, ticket_id, attributes).collect { |thing| self.new thing }
|
81
|
+
else
|
82
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# This is a helper method to find
|
87
|
+
def self.search(project_id, ticket_id, options = {}, limit = 1000)
|
88
|
+
if self::API.is_a? Class
|
89
|
+
comments = self::API.find(:all, :params => {:project_id => project_id, :ticket_id => ticket_id})
|
90
|
+
search_by_attribute(comments, options, limit)
|
91
|
+
else
|
92
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
# Common module
|
3
|
+
# contains method definitions common to all or most of the models
|
4
|
+
module Common
|
5
|
+
module ClassMethods
|
6
|
+
# Create a something.
|
7
|
+
# Basically, a .new and .save in the same call. The default method assumes it is passed a
|
8
|
+
# single hash with attribute information
|
9
|
+
def create(*options)
|
10
|
+
if self::API.is_a? Class
|
11
|
+
something = self::API.new(*options)
|
12
|
+
something.save
|
13
|
+
self.new something
|
14
|
+
else
|
15
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Automatic extension of class methods on include
|
21
|
+
def self.included(base)
|
22
|
+
base.extend ClassMethods
|
23
|
+
end
|
24
|
+
|
25
|
+
# The initializer
|
26
|
+
# It tries to do a default system for ActiveResource-based api providers
|
27
|
+
def initialize(*options)
|
28
|
+
@system_data ||= {}
|
29
|
+
@cache ||= {}
|
30
|
+
first = options.shift
|
31
|
+
case first
|
32
|
+
when ActiveResource::Base
|
33
|
+
@system_data[:client] = first
|
34
|
+
self.prefix_options ||= @system_data[:client].prefix_options if @system_data[:client].prefix_options
|
35
|
+
super(first.attributes)
|
36
|
+
|
37
|
+
when Hash
|
38
|
+
super(first.to_hash)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Update the something and save
|
43
|
+
# As opposed to update which just updates the attributes
|
44
|
+
def update!(*options)
|
45
|
+
update(*options)
|
46
|
+
save
|
47
|
+
end
|
48
|
+
|
49
|
+
# Save changes to this project
|
50
|
+
# Returns true (success) or false (failure) or nil (no changes)
|
51
|
+
def save
|
52
|
+
if @system_data and (something = @system_data[:client]) and something.respond_to?(:attributes)
|
53
|
+
changes = 0
|
54
|
+
something.attributes.each do |k, v|
|
55
|
+
if self.send(k) != v
|
56
|
+
something.send(k + '=', self.send(k))
|
57
|
+
changes += 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
something.save if changes > 0
|
61
|
+
else
|
62
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Delete this project
|
67
|
+
# Returns true (success) or false(failure)
|
68
|
+
def destroy
|
69
|
+
if @system_data and @system_data[:client] and @system_data[:client].respond_to?(:destroy)
|
70
|
+
return @system_data[:client].destroy
|
71
|
+
else
|
72
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def respond_to?(symbol)
|
77
|
+
result = super(symbol)
|
78
|
+
return true if result or @system_data.nil? or @system_data[:client].nil?
|
79
|
+
@system_data[:client].respond_to?(symbol)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
# Contains a series of helper methods
|
3
|
+
module Helper
|
4
|
+
|
5
|
+
# A helper method for easy finding
|
6
|
+
def easy_finder(api, symbol, options, at_index = 0)
|
7
|
+
if api.is_a? Class
|
8
|
+
return api if options.length == 0 and symbol == :first
|
9
|
+
options.insert(at_index, symbol) if options[at_index].is_a?(Hash)
|
10
|
+
api.find(*options)
|
11
|
+
else
|
12
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# This is a search filter that all parameters are passed through
|
17
|
+
# Redefine this method in your classes if you need specific functionality
|
18
|
+
def search_filter(k)
|
19
|
+
k
|
20
|
+
end
|
21
|
+
|
22
|
+
# Goes through all the things and returns results that match the options attributes hash
|
23
|
+
def search_by_attribute(things, options = {}, limit = 1000)
|
24
|
+
things.find_all do |thing|
|
25
|
+
options.reduce(true) do |memo, kv|
|
26
|
+
break unless memo
|
27
|
+
key, value = kv
|
28
|
+
begin
|
29
|
+
memo &= thing.send(key) == value
|
30
|
+
rescue NoMethodError
|
31
|
+
memo = false
|
32
|
+
end
|
33
|
+
memo
|
34
|
+
end and (limit -= 1) > 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Returns a filter-like string from a hash
|
39
|
+
# If array_join is given, arrays are joined rather than having their own separated key:values
|
40
|
+
#
|
41
|
+
# ex: filter_string({:name => 'some value', :tags => ['abc', 'def']}) = "name:'some value' tag:abc tag:def"
|
42
|
+
def filter_string(filter = {}, array_join = nil)
|
43
|
+
filter.reduce('') do |mem, kv|
|
44
|
+
key, value = kv
|
45
|
+
if value.is_a?(Array)
|
46
|
+
if !array_join.nil?
|
47
|
+
mem += value.reduce('') { |m, v|
|
48
|
+
v = "\"#{v}\"" if v.to_s.include?(' ')
|
49
|
+
m+= "#{key}:#{v}"
|
50
|
+
}
|
51
|
+
return mem
|
52
|
+
else
|
53
|
+
value = value.join(array_join)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
value = "\"#{value}\"" if value.to_s.include?(' ')
|
57
|
+
mem += "#{key}:#{value} "
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/ticketmaster/project.rb
CHANGED
@@ -10,15 +10,21 @@ module TicketMaster::Provider
|
|
10
10
|
#
|
11
11
|
# Methods that must be implemented by the provider
|
12
12
|
#
|
13
|
-
# * self.
|
13
|
+
# * self.find_by_id
|
14
|
+
# * self.find_by_attributes
|
15
|
+
#
|
16
|
+
# Methods that might need to be implemented by the provider
|
14
17
|
# * tickets
|
15
18
|
# * ticket
|
16
|
-
# * save
|
17
19
|
# * initialize
|
20
|
+
# * update
|
21
|
+
# * destroy
|
22
|
+
# * self.create
|
18
23
|
#
|
19
24
|
# Methods that would probably be okay if the provider left it alone:
|
20
25
|
#
|
21
|
-
# * self.
|
26
|
+
# * self.find - although you can define your own to optimize it a bit
|
27
|
+
# * update!
|
22
28
|
#
|
23
29
|
# A provider should define as many attributes as feasibly possible. The list below are
|
24
30
|
# some guidelines as to what attributes are necessary, if your provider's api does not
|
@@ -31,55 +37,101 @@ module TicketMaster::Provider
|
|
31
37
|
# * updated_at
|
32
38
|
# * description
|
33
39
|
class Project < Hashie::Mash
|
40
|
+
include TicketMaster::Provider::Common
|
41
|
+
include TicketMaster::Provider::Helper
|
42
|
+
extend TicketMaster::Provider::Helper
|
34
43
|
attr_accessor :system, :system_data
|
35
|
-
|
44
|
+
API = nil #Replace with your api digestor's class.
|
45
|
+
|
46
|
+
# Find project
|
36
47
|
# You can also retrieve an array of all projects by not specifying any query.
|
37
48
|
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
# * find(:all) - Returns an array of all projects
|
49
|
+
# * find() or find(:all) - Returns an array of all projects
|
41
50
|
# * find(##) - Returns a project based on that id or some other primary (unique) attribute
|
42
|
-
# * find(
|
43
|
-
# * find(:
|
51
|
+
# * find([#, #, #]) - Returns many projects with these ids
|
52
|
+
# * find(:first, :name => 'Project name') - Returns the first project based on the project's attribute(s)
|
53
|
+
# * find(:last, :name => 'Some project') - Returns the last project based on the project's attribute(s)
|
54
|
+
# * find(:all, :name => 'Test Project') - Returns all projects based on the given attribute(s)
|
44
55
|
def self.find(*options)
|
45
|
-
|
56
|
+
first = options.shift
|
57
|
+
attributes = options.shift
|
58
|
+
if first.nil? or (first == :all and attributes.nil?)
|
59
|
+
self.find_by_attributes
|
60
|
+
elsif first.is_a? Fixnum
|
61
|
+
self.find_by_id(first)
|
62
|
+
elsif first.is_a? Array
|
63
|
+
first.collect { |id| self.find_by_id(id) }
|
64
|
+
elsif first == :first
|
65
|
+
projects = attributes.nil? ? self.find_by_attributes : self.find_by_attributes(attributes)
|
66
|
+
projects.first
|
67
|
+
elsif first == :last
|
68
|
+
projects = attributes.nil? ? self.find_by_attributes : self.find_by_attributes(attributes)
|
69
|
+
projects.last
|
70
|
+
elsif first == :all
|
71
|
+
self.find_by_attributes(attributes)
|
72
|
+
end
|
46
73
|
end
|
47
74
|
|
48
|
-
#
|
49
|
-
|
50
|
-
|
51
|
-
def self.create(*options)
|
52
|
-
project = self.new(options.first)
|
53
|
-
project.save
|
54
|
-
project
|
75
|
+
# The first of whatever project
|
76
|
+
def self.first(*options)
|
77
|
+
self.find(:first, *options)
|
55
78
|
end
|
56
79
|
|
57
|
-
# The
|
58
|
-
def
|
59
|
-
|
60
|
-
|
80
|
+
# The last of whatever project
|
81
|
+
def self.last(*options)
|
82
|
+
self.find(:last, *options)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Accepts an integer id and returns the single project instance
|
86
|
+
# Must be defined by the provider
|
87
|
+
def self.find_by_id(id)
|
88
|
+
if self::API.is_a? Class
|
89
|
+
self.new self::API.find id
|
90
|
+
else
|
91
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Accepts an attributes hash and returns all projects matching those attributes in an array
|
96
|
+
# Should return all projects if the attributes hash is empty
|
97
|
+
# Must be defined by the provider
|
98
|
+
def self.find_by_attributes(attributes = {})
|
99
|
+
if self::API.is_a? Class
|
100
|
+
self.search(attributes).collect { |thing| self.new thing }
|
101
|
+
else
|
102
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# This is a helper method to find
|
107
|
+
def self.search(options = {}, limit = 1000)
|
108
|
+
if self::API.is_a? Class
|
109
|
+
projects = self::API.find(:all)
|
110
|
+
search_by_attribute(projects, options, limit)
|
111
|
+
else
|
112
|
+
raise TicketMaster::Exception.new("This method must be reimplemented in the provider")
|
113
|
+
end
|
61
114
|
end
|
62
115
|
|
63
116
|
# Asks the provider's api for the tickets associated with the project,
|
64
117
|
# returns an array of Ticket objects.
|
65
118
|
def tickets(*options)
|
66
|
-
|
119
|
+
options.insert 0, id
|
120
|
+
easy_finder(self.class.parent::Ticket, :all, options, 1)
|
67
121
|
end
|
68
|
-
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
# Than
|
73
|
-
# project.tickets.create(..)
|
74
|
-
#
|
75
|
-
# returns a ticket object or ticket class that responds to .new and .create.
|
122
|
+
|
123
|
+
# Very similar to tickets, and is practically an alias of it
|
124
|
+
# however this returns the ticket class if no parameter is given
|
125
|
+
# unlike tickets which returns an array of all tickets when given no parameters
|
76
126
|
def ticket(*options)
|
77
|
-
|
127
|
+
options.insert(0, id) if options.length > 0
|
128
|
+
easy_finder(self.class.parent::Ticket, :first, options, 1)
|
78
129
|
end
|
79
130
|
|
80
|
-
#
|
81
|
-
def
|
82
|
-
|
131
|
+
# Define some provider specific initalizations
|
132
|
+
def initialize(*options)
|
133
|
+
# @system_data = {'some' => 'data}
|
134
|
+
super(*options)
|
83
135
|
end
|
84
136
|
|
85
137
|
end
|