ticketmaster-unfuddle 0.1.0 → 0.2.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/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = ticketmaster-unfuddle
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Luis Hurtado. See LICENSE for details.
data/Rakefile CHANGED
@@ -5,15 +5,12 @@ begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
7
  gem.name = "ticketmaster-unfuddle"
8
- gem.summary = %Q{Ticketmaster provider for Unfuddle}
9
- gem.description = %Q{Ticketmaster provider for Unfuddle}
10
- gem.email = "simon@hybridgroup.com"
11
- gem.homepage = "http://ticketrb.com"
12
- gem.authors = ["Sirupsen"]
13
- gem.add_dependency "unfuddler", ">= 0"
14
- gem.add_dependency "ticketmaster", ">= 0"
15
-
16
- gem.add_development_dependency "shoulda", ">= 0"
8
+ gem.summary = %Q{The Unfuddle provider for ticketmaster.}
9
+ gem.description = %Q{Unfuddle provider for ticketmaster implemented with ActiveResource}
10
+ gem.email = "luis@hybridgroup.com"
11
+ gem.homepage = "http://github.com/hybridgroup/ticketmaster-unfuddle"
12
+ gem.authors = ["Luis Hurtado"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
17
14
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
18
15
  end
19
16
  Jeweler::GemcutterTasks.new
@@ -21,29 +18,21 @@ rescue LoadError
21
18
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
22
19
  end
23
20
 
24
- require 'rake/testtask'
25
- Rake::TestTask.new(:test) do |test|
26
- test.libs << 'lib' << 'test'
27
- test.pattern = 'test/**/test_*.rb'
28
- test.verbose = true
21
+ require 'spec/rake/spectask'
22
+ Spec::Rake::SpecTask.new(:spec) do |spec|
23
+ spec.libs << 'lib' << 'spec'
24
+ spec.spec_files = FileList['spec/**/*_spec.rb']
29
25
  end
30
26
 
31
- begin
32
- require 'rcov/rcovtask'
33
- Rcov::RcovTask.new do |test|
34
- test.libs << 'test'
35
- test.pattern = 'test/**/test_*.rb'
36
- test.verbose = true
37
- end
38
- rescue LoadError
39
- task :rcov do
40
- abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
41
- end
27
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
28
+ spec.libs << 'lib' << 'spec'
29
+ spec.pattern = 'spec/**/*_spec.rb'
30
+ spec.rcov = true
42
31
  end
43
32
 
44
- task :test => :check_dependencies
33
+ task :spec => :check_dependencies
45
34
 
46
- task :default => :test
35
+ task :default => :spec
47
36
 
48
37
  require 'rake/rdoctask'
49
38
  Rake::RDocTask.new do |rdoc|
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -0,0 +1,14 @@
1
+ module TicketMaster::Provider
2
+ module Unfuddle
3
+ # The comment class for ticketmaster-unfuddle
4
+ #
5
+ # Do any mapping between Ticketmaster and your system's comment model here
6
+ # versions of the ticket.
7
+ #
8
+ class Comment < TicketMaster::Provider::Base::Comment
9
+ API = UnfuddleAPI::Comment # The class to access the api's comments
10
+ # declare needed overloaded methods here
11
+
12
+ end
13
+ end
14
+ end
@@ -1,55 +1,26 @@
1
- module TicketMasterMod
1
+ module TicketMaster::Provider
2
2
  module Unfuddle
3
- class Project
4
- class << self
5
- def find(query, options = {})
6
- Unfuddler.authenticate(options[:authentication].to_hash)
7
- projects = Unfuddler::Project.find
8
- formatted_projects = []
9
-
10
- unless projects.empty?
11
- projects.each do |project|
12
- formatted_projects << TicketMasterMod::Project.new({
13
- :name => project.short_name,
14
- :description => project.description,
15
- :system => "unfuddle",
16
- :authentication => options[:authentication],
17
- :id => project.id,
18
- })
19
- end
3
+ # Project class for ticketmaster-unfuddle
4
+ #
5
+ #
6
+ class Project < TicketMaster::Provider::Base::Project
7
+ API = UnfuddleAPI::Project # The class to access the api's projects
8
+ # declare needed overloaded methods here
9
+
10
+
11
+ # copy from this.copy(that) copies that into this
12
+ def copy(project)
13
+ project.tickets.each do |ticket|
14
+ copy_ticket = self.ticket!(:title => ticket.title, :description => ticket.description)
15
+ ticket.comments.each do |comment|
16
+ copy_ticket.comment!(:body => comment.body)
17
+ sleep 1
20
18
  end
21
-
22
- formatted_projects
23
- end
24
-
25
- def tickets(project_instance)
26
- Unfuddler.authenticate(project_instance.authentication.to_hash)
27
- project = Unfuddler::Project.find(project_instance.name)
28
- formatted_tickets = []
29
-
30
- unless project.tickets.empty?
31
- project.tickets.each do |ticket|
32
- formatted_tickets << TicketMasterMod::Ticket.new({
33
- :summary => ticket.summary,
34
- :id => ticket.number,
35
- :status => ticket.status,
36
- :description => ticket.description,
37
-
38
- :resolution => ticket.resolution,
39
- :resolution_description => ticket.resolution_description,
40
-
41
- :created_at => ticket.created_at,
42
-
43
- :system => "unfuddle",
44
- :ticket => ticket,
45
- :project => project_instance
46
- })
47
- end
48
- end
49
-
50
- formatted_tickets
51
19
  end
52
20
  end
21
+
53
22
  end
54
23
  end
55
24
  end
25
+
26
+
@@ -1,55 +1,12 @@
1
- module TicketMasterMod
1
+ module TicketMaster::Provider
2
2
  module Unfuddle
3
- class Ticket
4
- class << self
5
- def create(ticket)
6
- Unfuddler.authenticate(ticket.project.authentication.to_hash)
7
- project = Unfuddler::Project.find(ticket.project.name)
8
-
9
- new_ticket = {}
10
- ticket.to_hash.each_pair do |key, value|
11
- new_ticket[key] = value if [:summary, :priority, :description].include?(key.to_sym)
12
- new_ticket[key] = value.to_s if value.is_a?(Integer)
13
- end
14
-
15
- project.ticket.create(new_ticket)
16
- end
17
-
18
- def save(ticket)
19
- Unfuddler.authenticate(ticket.project.authentication.to_hash)
20
- project = Unfuddler::Project.find(ticket.project.name)
21
- unfuddle_ticket = project.tickets(:number => ticket.id).first # First because it always returns an array
22
-
23
- # DRY this up!
24
- status = right_status(ticket.status)
25
- unfuddle_ticket.status = status if status
26
- unfuddle_ticket.description = ticket.description
27
- unfuddle_ticket.summary = ticket.summary
28
-
29
- unfuddle_ticket.save
30
- end
31
-
32
- def close(ticket, resolution)
33
- Unfuddler.authenticate(ticket.project.authentication.to_hash)
34
- project = Unfuddler::Project.find(ticket.project.name)
35
-
36
- ticket = project.tickets(:number => ticket.id).first # First because it always returns an array
37
- ticket.close!(resolution)
38
- end
39
-
40
- def right_status(status)
41
- case status
42
- when :in_progress
43
- "accepted"
44
- when :resolved
45
- "resolved"
46
- when :reopen
47
- "reopen"
48
- else
49
- nil
50
- end
51
- end
52
- end
3
+ # Ticket class for ticketmaster-unfuddle
4
+ #
5
+
6
+ class Ticket < TicketMaster::Provider::Base::Ticket
7
+ API = UnfuddleAPI::Ticket # The class to access the api's tickets
8
+ # declare needed overloaded methods here
9
+
53
10
  end
54
11
  end
55
12
  end
@@ -0,0 +1,30 @@
1
+ module TicketMaster::Provider
2
+ # This is the Unfuddle Provider for ticketmaster
3
+ module Unfuddle
4
+ include TicketMaster::Provider::Base
5
+ TICKET_API = UnfuddleAPI::Ticket # The class to access the api's tickets
6
+ PROJECT_API = UnfuddleAPI::Project # The class to access the api's projects
7
+
8
+ # This is for cases when you want to instantiate using TicketMaster::Provider::Unfuddle.new(auth)
9
+ def self.new(auth = {})
10
+ TicketMaster.new(:unfuddle, auth)
11
+ end
12
+
13
+ # Providers must define an authorize method. This is used to initialize and set authentication
14
+ # parameters to access the API
15
+ def authorize(auth = {})
16
+ @authentication ||= TicketMaster::Authenticator.new(auth)
17
+ auth = @authentication
18
+ if auth.account.nil? or auth.username.nil? or auth.password.nil?
19
+ raise "Please provide at least an account (subdomain), username and password)"
20
+ end
21
+ UnfuddleAPI.account = auth.account || auth.subdomain
22
+ UnfuddleAPI.authenticate(auth.username, auth.password)
23
+ end
24
+
25
+ # declare needed overloaded methods here
26
+
27
+ end
28
+ end
29
+
30
+
@@ -1,2 +1,5 @@
1
- require 'unfuddler'
2
- %w{project ticket}.each {|lib| require "provider/#{lib}"}
1
+ require File.dirname(__FILE__) + '/unfuddle/unfuddle-api'
2
+
3
+ %w{ unfuddle ticket project comment }.each do |f|
4
+ require File.dirname(__FILE__) + '/provider/' + f + '.rb';
5
+ end
@@ -0,0 +1,149 @@
1
+ require 'rubygems'
2
+
3
+ begin
4
+ require 'uri'
5
+ require 'addressable/uri'
6
+
7
+ module URI
8
+ def decode(*args)
9
+ Addressable::URI.decode(*args)
10
+ end
11
+
12
+ def escape(*args)
13
+ Addressable::URI.escape(*args)
14
+ end
15
+
16
+ def parse(*args)
17
+ Addressable::URI.parse(*args)
18
+ end
19
+ end
20
+ rescue LoadError => e
21
+ puts "Install the Addressable gem (with dependencies) to support accounts with subdomains."
22
+ puts "# sudo gem install addressable --development"
23
+ puts e.message
24
+ end
25
+
26
+ require 'active_support'
27
+ require 'active_resource'
28
+
29
+ # Ruby lib for working with the Unfuddle API's XML interface.
30
+ # The first thing you need to set is the account name. This is the same
31
+ # as the web address for your account.
32
+ #
33
+ # UnfuddleAPI.account = 'activereload'
34
+ #
35
+ # Then, you should set the authentication with HTTP Basic Authentication.
36
+ #
37
+ # # with basic authentication
38
+ # UnfuddleAPI.authenticate('rick', 'spacemonkey')
39
+ #
40
+ #
41
+ # This library is a small wrapper around the REST interface. You should read the docs at
42
+ # http://unfuddle.com/docs/api
43
+ #
44
+ module UnfuddleAPI
45
+ class Error < StandardError; end
46
+ class << self
47
+ attr_accessor :username, :password, :host_format, :domain_format, :protocol, :port
48
+ attr_reader :account
49
+
50
+ # Sets the account name, and updates all the resources with the new domain.
51
+ def account=(name)
52
+ resources.each do |klass|
53
+ klass.site = klass.site_format % (host_format % [protocol, domain_format % name, ":#{port}"])
54
+ end
55
+ @account = name
56
+ end
57
+
58
+ # Sets up basic authentication credentials for all the resources.
59
+ def authenticate(username, password)
60
+ @username = username
61
+ @password = password
62
+ self::Base.user = username
63
+ self::Base.password = password
64
+ end
65
+
66
+ def resources
67
+ @resources ||= []
68
+ end
69
+ end
70
+
71
+ self.host_format = '%s://%s%s/api/v1'
72
+ self.domain_format = '%s.unfuddle.com'
73
+ self.protocol = 'http'
74
+ self.port = ''
75
+
76
+ class Base < ActiveResource::Base
77
+ def self.inherited(base)
78
+ UnfuddleAPI.resources << base
79
+ class << base
80
+ attr_accessor :site_format
81
+ end
82
+ base.site_format = '%s'
83
+ super
84
+ end
85
+ end
86
+
87
+ # Find projects
88
+ #
89
+ # UnfuddleAPI::Project.find(:all) # find all projects for the current account.
90
+ # UnfuddleAPI::Project.find(44) # find individual project by ID
91
+ #
92
+ # Creating a Project
93
+ #
94
+ # project = UnfuddleAPI::Project.new(:name => 'Ninja Whammy Jammy')
95
+ # project.save
96
+ # # => true
97
+ #
98
+ #
99
+ # Updating a Project
100
+ #
101
+ # project = UnfuddleAPI::Project.find(44)
102
+ # project.name = "Lighthouse Issues"
103
+ # project.public = false
104
+ # project.save
105
+ #
106
+ # Finding tickets
107
+ #
108
+ # project = LighthouseAPI::Project.find(44)
109
+ # project.tickets
110
+ #
111
+ class Project < Base
112
+ def tickets(options = {})
113
+ Ticket.find(:all, :params => options.update(:project_id => id))
114
+ end
115
+
116
+ def messages(options = {})
117
+ Message.find(:all, :params => options.update(:project_id => id))
118
+ end
119
+
120
+ def milestones(options = {})
121
+ Milestone.find(:all, :params => options.update(:project_id => id))
122
+ end
123
+ end
124
+
125
+ # Find tickets
126
+ #
127
+ # UnfuddleAPI::Ticket.find(:all, :params => { :project_id => 44 })
128
+ # UnfuddleAPI::Ticket.find(:all, :params => { :project_id => 44, :q => "status:closed" })
129
+ #
130
+ # project = UnfuddleAPI::Project.find(44)
131
+ # project.tickets
132
+ # project.tickets(:q => "status:closed")
133
+ # project.tickets(:params => {:status => 'closed'})
134
+ #
135
+ #
136
+ #
137
+ class Ticket < Base
138
+ site_format << '/projects/:project_id'
139
+ end
140
+
141
+ class Comment < Base
142
+ site_format << '/projects/:project_id/tickets/:ticket_id'
143
+ end
144
+
145
+ class Message < Base
146
+ site_format << '/projects/:project_id'
147
+ end
148
+
149
+ end
@@ -0,0 +1,70 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Ticketmaster::Provider::Unfuddle::Comment" do
4
+ before(:all) do
5
+ headers = {'Authorization' => 'Basic Zm9vOjAwMDAwMA==', 'Accept' => 'application/xml'}
6
+ headers_post_put = {'Authorization' => 'Basic Zm9vOjAwMDAwMA==', 'Content-Type' => 'application/xml'}
7
+ ActiveResource::HttpMock.respond_to do |mock|
8
+ mock.get '/api/v1/projects/33042.xml', headers, fixture_for('projects/33042'), 200
9
+ mock.get '/api/v1/projects/33042/tickets.xml', headers, fixture_for('tickets'), 200
10
+ mock.get '/api/v1/projects/33042/tickets/476834.xml', headers, fixture_for('tickets/476834'), 200
11
+ mock.put '/api/v1/projects/33042/tickets/476834.xml', headers_post_put, '', 200
12
+ mock.get '/api/v1/projects/33042/tickets/476834/comments.xml', headers, fixture_for('comments'), 200
13
+ mock.get '/api/v1/projects/33042/tickets/476834/comments/0.xml', headers, fixture_for('comments/0'), 200
14
+ mock.get '/api/v1/projects/33042/tickets/476834/comments/2.xml', headers, fixture_for('comments/2'), 200
15
+ mock.get '/api/v1/projects/33042/tickets/476834/comments/3.xml', headers, fixture_for('comments/3'), 200
16
+ mock.put '/api/v1/projects/33042/tickets/476834/comments/0.xml', headers_post_put, '', 200
17
+ mock.post '/api/v1/projects/33042/tickets/476834/comments.xml', headers_post_put, fixture_for('comments/create'), 200
18
+ end
19
+ @project_id = 33042
20
+ @ticket_id = 476834
21
+ end
22
+
23
+ before(:each) do
24
+ @ticketmaster = TicketMaster.new(:unfuddle, :account => 'ticketmaster', :password => '000000', :username => 'foo')
25
+ @project = @ticketmaster.project(@project_id)
26
+ @ticket = @project.ticket(@ticket_id)
27
+ @ticket.project_id = @project.id
28
+ @klass = TicketMaster::Provider::Unfuddle::Comment
29
+ end
30
+
31
+ it "should be able to load all comments" do
32
+ @comments = @ticket.comments
33
+ @comments.should be_an_instance_of(Array)
34
+ @comments.first.should be_an_instance_of(@klass)
35
+ end
36
+
37
+ it "should be able to load all comments based on 'id's" do
38
+ @comments = @ticket.comments([0,2,3])
39
+ @comments.should be_an_instance_of(Array)
40
+ @comments.first.id.should == 0
41
+ @comments.last.id.should == 3
42
+ @comments[1].should be_an_instance_of(@klass)
43
+ end
44
+
45
+ it "should be able to load all comments based on attributes" do
46
+ @comments = @ticket.comments(:parent_id => @ticket.id)
47
+ @comments.should be_an_instance_of(Array)
48
+ @comments.first.should be_an_instance_of(@klass)
49
+ end
50
+
51
+ it "should be able to load a comment based on id" do
52
+ @comment = @ticket.comment(2)
53
+ @comment.should be_an_instance_of(@klass)
54
+ @comment.id.should == 2
55
+ end
56
+
57
+ it "should be able to load a comment based on attributes" do
58
+ @comment = @ticket.comment(:parent_id => @ticket.id)
59
+ @comment.should be_an_instance_of(@klass)
60
+ end
61
+
62
+ it "should return the class" do
63
+ @ticket.comment.should == @klass
64
+ end
65
+
66
+ it "should be able to create a comment" do
67
+ @comment = @ticket.comment!(:body => 'New comment created.', :body_format => 'markdown')
68
+ @comment.should be_an_instance_of(@klass)
69
+ end
70
+ end
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <comment>
3
+ <author-id type="integer">47763</author-id>
4
+ <body>I found Devise as a very complete solution for authentication, also found that it takes care of sessions expiration(Timeoutable) and sign in tracking(Trackable) too (http://github.com/plataformatec/devise), and the better is that it seems not to be a very difficult task to get it implemented in the app.</body>
5
+ <body-format>markdown</body-format>
6
+ <id type="integer">0</id>
7
+ <parent-id type="integer">476834</parent-id>
8
+ <parent-type>Ticket</parent-type>
9
+ <created-at>2009-11-26T17:19:22Z</created-at>
10
+ <updated-at>2009-11-26T17:19:22Z</updated-at>
11
+ </comment>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <comment>
3
+ <author-id type="integer">47763</author-id>
4
+ <body>This is comment 2.</body>
5
+ <body-format>markdown</body-format>
6
+ <id type="integer">2</id>
7
+ <parent-id type="integer">476834</parent-id>
8
+ <parent-type>Ticket</parent-type>
9
+ <created-at>2009-11-26T17:19:22Z</created-at>
10
+ <updated-at>2009-11-26T17:19:22Z</updated-at>
11
+ </comment>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <comment>
3
+ <author-id type="integer">47763</author-id>
4
+ <body>This is comment 3.</body>
5
+ <body-format>markdown</body-format>
6
+ <id type="integer">3</id>
7
+ <parent-id type="integer">476834</parent-id>
8
+ <parent-type>Ticket</parent-type>
9
+ <created-at>2009-11-26T17:19:22Z</created-at>
10
+ <updated-at>2009-11-26T17:19:22Z</updated-at>
11
+ </comment>
@@ -0,0 +1,11 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <comment>
3
+ <author-id type="integer">47763</author-id>
4
+ <body>New comment created.</body>
5
+ <body-format>markdown</body-format>
6
+ <id type="integer">4</id>
7
+ <parent-id type="integer">476834</parent-id>
8
+ <parent-type>Ticket</parent-type>
9
+ <created-at>2009-11-26T17:19:22Z</created-at>
10
+ <updated-at>2009-11-26T17:19:22Z</updated-at>
11
+ </comment>
@@ -0,0 +1,13 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <comments type="array">
3
+ <comment>
4
+ <author-id type="integer">47763</author-id>
5
+ <body>I found Devise as a very complete solution for authentication, also found that it takes care of sessions expiration(Timeoutable) and sign in tracking(Trackable) too (http://github.com/plataformatec/devise), and the better is that it seems not to be a very difficult task to get it implemented in the app.</body>
6
+ <body-format>markdown</body-format>
7
+ <id type="integer">2</id>
8
+ <parent-id type="integer">476834</parent-id>
9
+ <parent-type>Ticket</parent-type>
10
+ <created-at>2009-11-26T17:19:22Z</created-at>
11
+ <updated-at>2009-11-26T17:19:22Z</updated-at>
12
+ </comment>
13
+ </comments>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project>
3
+ <account-id type="integer">19796</account-id>
4
+ <archived type="boolean">true</archived>
5
+ <assignee-on-resolve>reporter</assignee-on-resolve>
6
+ <backup-frequency type="integer">0</backup-frequency>
7
+ <close-ticket-simultaneously-default type="boolean">false</close-ticket-simultaneously-default>
8
+ <default-ticket-report-id type="integer">0</default-ticket-report-id>
9
+ <description></description>
10
+ <disk-usage type="integer">4308</disk-usage>
11
+ <enable-time-tracking type="boolean">true</enable-time-tracking>
12
+ <id type="integer">33041</id>
13
+ <s3-access-key-id></s3-access-key-id>
14
+ <s3-backup-enabled type="boolean">false</s3-backup-enabled>
15
+ <s3-bucket-name></s3-bucket-name>
16
+ <short-name>desorteo</short-name>
17
+ <theme>blue</theme>
18
+ <ticket-field1-active type="boolean">false</ticket-field1-active>
19
+ <ticket-field1-disposition>text</ticket-field1-disposition>
20
+ <ticket-field1-title>Field 1</ticket-field1-title>
21
+ <ticket-field2-active type="boolean">false</ticket-field2-active>
22
+ <ticket-field2-disposition>text</ticket-field2-disposition>
23
+ <ticket-field2-title>Field 2</ticket-field2-title>
24
+ <ticket-field3-active type="boolean">false</ticket-field3-active>
25
+ <ticket-field3-disposition>text</ticket-field3-disposition>
26
+ <ticket-field3-title>Field 3</ticket-field3-title>
27
+ <title>desorteo.com</title>
28
+ <created-at>2009-01-31T19:12:14Z</created-at>
29
+ <updated-at>2010-09-10T23:42:54Z</updated-at>
30
+ </project>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project>
3
+ <account-id type="integer">19796</account-id>
4
+ <archived type="boolean">false</archived>
5
+ <assignee-on-resolve>reporter</assignee-on-resolve>
6
+ <backup-frequency type="integer">0</backup-frequency>
7
+ <close-ticket-simultaneously-default type="boolean">false</close-ticket-simultaneously-default>
8
+ <default-ticket-report-id type="integer" nil="true"></default-ticket-report-id>
9
+ <description nil="true"></description>
10
+ <disk-usage type="integer">12508</disk-usage>
11
+ <enable-time-tracking type="boolean">true</enable-time-tracking>
12
+ <id type="integer">33042</id>
13
+ <s3-access-key-id></s3-access-key-id>
14
+ <s3-backup-enabled type="boolean">false</s3-backup-enabled>
15
+ <s3-bucket-name></s3-bucket-name>
16
+ <short-name>bw</short-name>
17
+ <theme>green</theme>
18
+ <ticket-field1-active type="boolean">false</ticket-field1-active>
19
+ <ticket-field1-disposition>text</ticket-field1-disposition>
20
+ <ticket-field1-title>Field 1</ticket-field1-title>
21
+ <ticket-field2-active type="boolean">false</ticket-field2-active>
22
+ <ticket-field2-disposition>text</ticket-field2-disposition>
23
+ <ticket-field2-title>Field 2</ticket-field2-title>
24
+ <ticket-field3-active type="boolean">false</ticket-field3-active>
25
+ <ticket-field3-disposition>text</ticket-field3-disposition>
26
+ <ticket-field3-title>Field 3</ticket-field3-title>
27
+ <title>BioWeb</title>
28
+ <created-at>2009-11-25T16:39:56Z</created-at>
29
+ <updated-at>2010-09-08T01:04:19Z</updated-at>
30
+ </project>
@@ -0,0 +1,30 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project>
3
+ <account-id type="integer">19796</account-id>
4
+ <archived type="boolean">false</archived>
5
+ <assignee-on-resolve>reporter</assignee-on-resolve>
6
+ <backup-frequency type="integer">0</backup-frequency>
7
+ <close-ticket-simultaneously-default type="boolean">false</close-ticket-simultaneously-default>
8
+ <default-ticket-report-id type="integer">0</default-ticket-report-id>
9
+ <description></description>
10
+ <disk-usage type="integer">3060</disk-usage>
11
+ <enable-time-tracking type="boolean">true</enable-time-tracking>
12
+ <id type="integer">33024</id>
13
+ <s3-access-key-id></s3-access-key-id>
14
+ <s3-backup-enabled type="boolean">false</s3-backup-enabled>
15
+ <s3-bucket-name></s3-bucket-name>
16
+ <short-name>wework</short-name>
17
+ <theme>grey</theme>
18
+ <ticket-field1-active type="boolean">false</ticket-field1-active>
19
+ <ticket-field1-disposition>text</ticket-field1-disposition>
20
+ <ticket-field1-title>Field 1</ticket-field1-title>
21
+ <ticket-field2-active type="boolean">false</ticket-field2-active>
22
+ <ticket-field2-disposition>text</ticket-field2-disposition>
23
+ <ticket-field2-title>Field 2</ticket-field2-title>
24
+ <ticket-field3-active type="boolean">false</ticket-field3-active>
25
+ <ticket-field3-disposition>text</ticket-field3-disposition>
26
+ <ticket-field3-title>Field 3</ticket-field3-title>
27
+ <title>weWork</title>
28
+ <created-at>2008-11-08T23:47:21Z</created-at>
29
+ <updated-at>2010-09-11T01:05:25Z</updated-at>
30
+ </project>