ticketmaster-unfuddle 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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>