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 +17 -0
- data/Rakefile +16 -27
- data/VERSION +1 -1
- data/lib/provider/comment.rb +14 -0
- data/lib/provider/project.rb +19 -48
- data/lib/provider/ticket.rb +8 -51
- data/lib/provider/unfuddle.rb +30 -0
- data/lib/ticketmaster-unfuddle.rb +5 -2
- data/lib/unfuddle/unfuddle-api.rb +149 -0
- data/spec/comments_spec.rb +70 -0
- data/spec/fixtures/comments/0.xml +11 -0
- data/spec/fixtures/comments/2.xml +11 -0
- data/spec/fixtures/comments/3.xml +11 -0
- data/spec/fixtures/comments/create.xml +11 -0
- data/spec/fixtures/comments.xml +13 -0
- data/spec/fixtures/projects/33041.xml +30 -0
- data/spec/fixtures/projects/33042.xml +30 -0
- data/spec/fixtures/projects/create.xml +30 -0
- data/spec/fixtures/projects.xml +32 -0
- data/spec/fixtures/tickets/476814.xml +33 -0
- data/spec/fixtures/tickets/476816.xml +29 -0
- data/spec/fixtures/tickets/476834.xml +31 -0
- data/spec/fixtures/tickets/create.xml +31 -0
- data/spec/fixtures/tickets.xml +433 -0
- data/spec/projects_spec.rb +71 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/ticketmaster-unfuddle_spec.rb +11 -0
- data/spec/tickets_spec.rb +70 -0
- metadata +45 -52
- data/test/helper.rb +0 -10
- data/test/test_ticketmaster-unfuddle.rb +0 -75
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{
|
9
|
-
gem.description = %Q{
|
10
|
-
gem.email = "
|
11
|
-
gem.homepage = "http://
|
12
|
-
gem.authors = ["
|
13
|
-
gem.
|
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/
|
25
|
-
Rake::
|
26
|
-
|
27
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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 :
|
33
|
+
task :spec => :check_dependencies
|
45
34
|
|
46
|
-
task :default => :
|
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.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
|
data/lib/provider/project.rb
CHANGED
@@ -1,55 +1,26 @@
|
|
1
|
-
module
|
1
|
+
module TicketMaster::Provider
|
2
2
|
module Unfuddle
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
+
|
data/lib/provider/ticket.rb
CHANGED
@@ -1,55 +1,12 @@
|
|
1
|
-
module
|
1
|
+
module TicketMaster::Provider
|
2
2
|
module Unfuddle
|
3
|
-
class
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
+
|
@@ -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>
|