ticketmaster-rally 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +20 -0
- data/Gemfile.lock +77 -0
- data/LICENSE.txt +20 -0
- data/README.md +65 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/lib/provider/comment.rb +118 -0
- data/lib/provider/project.rb +86 -0
- data/lib/provider/rally.rb +47 -0
- data/lib/provider/ticket.rb +170 -0
- data/lib/ticketmaster-rally.rb +15 -0
- data/log/.keep +0 -0
- data/spec/comments_spec.rb +46 -0
- data/spec/fixtures/tickets.xml +0 -0
- data/spec/projects_spec.rb +54 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/ticketmaster-rally_spec.rb +27 -0
- data/spec/tickets_spec.rb +114 -0
- data/ticketmaster-rally.gemspec +92 -0
- metadata +234 -0
data/.document
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/Gemfile
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
# Add dependencies required to use your gem here.
|
3
|
+
# Example:
|
4
|
+
# gem "activesupport", ">= 2.3.5"
|
5
|
+
|
6
|
+
# Add dependencies to develop your gem here.
|
7
|
+
# Include everything needed to run rake, tests, features, etc.
|
8
|
+
|
9
|
+
gem "ticketmaster", "0.6.6"
|
10
|
+
gem "rally_rest_api", "~> 1.0.3"
|
11
|
+
|
12
|
+
group :development do
|
13
|
+
gem "rspec", "~> 2.3.0"
|
14
|
+
gem "yard", "~> 0.7.0"
|
15
|
+
gem "bundler", "~> 1.0.0"
|
16
|
+
gem "jeweler", "~> 1.5.2"
|
17
|
+
gem "rcov", ">= 0"
|
18
|
+
gem 'ruby-debug', :platform => [:ruby_18]
|
19
|
+
gem 'ruby-debug19', :platform => [:ruby_19]
|
20
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activemodel (3.0.9)
|
5
|
+
activesupport (= 3.0.9)
|
6
|
+
builder (~> 2.1.2)
|
7
|
+
i18n (~> 0.5.0)
|
8
|
+
activeresource (3.0.9)
|
9
|
+
activemodel (= 3.0.9)
|
10
|
+
activesupport (= 3.0.9)
|
11
|
+
activesupport (3.0.9)
|
12
|
+
archive-tar-minitar (0.5.2)
|
13
|
+
builder (2.1.2)
|
14
|
+
columnize (0.3.4)
|
15
|
+
diff-lcs (1.1.2)
|
16
|
+
git (1.2.5)
|
17
|
+
hashie (1.0.0)
|
18
|
+
i18n (0.5.0)
|
19
|
+
jeweler (1.5.2)
|
20
|
+
bundler (~> 1.0.0)
|
21
|
+
git (>= 1.2.5)
|
22
|
+
rake
|
23
|
+
linecache (0.46)
|
24
|
+
rbx-require-relative (> 0.0.4)
|
25
|
+
linecache19 (0.5.12)
|
26
|
+
ruby_core_source (>= 0.1.4)
|
27
|
+
rake (0.9.2)
|
28
|
+
rally_rest_api (1.0.3)
|
29
|
+
rbx-require-relative (0.0.5)
|
30
|
+
rcov (0.9.9)
|
31
|
+
rspec (2.3.0)
|
32
|
+
rspec-core (~> 2.3.0)
|
33
|
+
rspec-expectations (~> 2.3.0)
|
34
|
+
rspec-mocks (~> 2.3.0)
|
35
|
+
rspec-core (2.3.1)
|
36
|
+
rspec-expectations (2.3.0)
|
37
|
+
diff-lcs (~> 1.1.2)
|
38
|
+
rspec-mocks (2.3.0)
|
39
|
+
ruby-debug (0.10.4)
|
40
|
+
columnize (>= 0.1)
|
41
|
+
ruby-debug-base (~> 0.10.4.0)
|
42
|
+
ruby-debug-base (0.10.4)
|
43
|
+
linecache (>= 0.3)
|
44
|
+
ruby-debug-base19 (0.11.25)
|
45
|
+
columnize (>= 0.3.1)
|
46
|
+
linecache19 (>= 0.5.11)
|
47
|
+
ruby_core_source (>= 0.1.4)
|
48
|
+
ruby-debug19 (0.11.6)
|
49
|
+
columnize (>= 0.3.1)
|
50
|
+
linecache19 (>= 0.5.11)
|
51
|
+
ruby-debug-base19 (>= 0.11.19)
|
52
|
+
ruby_core_source (0.1.5)
|
53
|
+
archive-tar-minitar (>= 0.5.2)
|
54
|
+
ticketmaster (0.6.6)
|
55
|
+
activeresource
|
56
|
+
activeresource (>= 2.3.2)
|
57
|
+
activesupport
|
58
|
+
activesupport (>= 2.3.2)
|
59
|
+
hashie (= 1.0.0)
|
60
|
+
hashie
|
61
|
+
jeweler
|
62
|
+
yard (0.7.2)
|
63
|
+
|
64
|
+
PLATFORMS
|
65
|
+
ruby
|
66
|
+
x86-mingw32
|
67
|
+
|
68
|
+
DEPENDENCIES
|
69
|
+
bundler (~> 1.0.0)
|
70
|
+
jeweler (~> 1.5.2)
|
71
|
+
rally_rest_api (~> 1.0.3)
|
72
|
+
rcov
|
73
|
+
rspec (~> 2.3.0)
|
74
|
+
ruby-debug
|
75
|
+
ruby-debug19
|
76
|
+
ticketmaster (= 0.6.6)
|
77
|
+
yard (~> 0.7.0)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Simeon F. Willbanks, Rob Kaufman
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
# ticketmaster-rally
|
2
|
+
|
3
|
+
This is a provider for [ticketmaster](http://ticketrb.com). It provides interoperability with [Rally](http://www.rallydev.com/) and it's project planning system through the ticketmaster gem.
|
4
|
+
|
5
|
+
# Usage and Examples
|
6
|
+
|
7
|
+
First we have to instantiate a new ticketmaster instance, your Rally installation should have api access enable:
|
8
|
+
|
9
|
+
rally = TicketMaster.new(:rally, {:username=> 'foo',
|
10
|
+
:password => "bar",
|
11
|
+
:url => "https://community.rallydev.com/slm"})
|
12
|
+
|
13
|
+
If you do not pass in the url, username and password, you won't get any information.
|
14
|
+
|
15
|
+
## Finding Projects(Projects)
|
16
|
+
|
17
|
+
rally = TicketMaster.new(:rally, {:url => 'https://community.rallydev.com/slm',
|
18
|
+
:username => 'foo',
|
19
|
+
:password => 'bar'})
|
20
|
+
# Project with ID of 1
|
21
|
+
project = rally.project(1)
|
22
|
+
# Projects with IDs of 1 and 2
|
23
|
+
projects = rally.project([1,2])
|
24
|
+
|
25
|
+
## Finding Tickets(Defects,Tasks)
|
26
|
+
|
27
|
+
# Ticket with ID of 1
|
28
|
+
ticket = project.ticket(1)
|
29
|
+
# Tickets with ID's of 1 and 2
|
30
|
+
tickets = project.tickets([1,2])
|
31
|
+
# All tickets
|
32
|
+
tickets = project.tickets
|
33
|
+
|
34
|
+
## Open Tickets
|
35
|
+
|
36
|
+
# Create a new ticket
|
37
|
+
ticket = project.ticket!(:title => 'New Ticket',
|
38
|
+
:description => 'Description')
|
39
|
+
|
40
|
+
## Finding comments
|
41
|
+
|
42
|
+
# Finding all comments
|
43
|
+
comments = ticket.comments
|
44
|
+
# Finding a comment with ID 1
|
45
|
+
comment = ticket.comment(1)
|
46
|
+
|
47
|
+
## Requirements
|
48
|
+
|
49
|
+
* rubygems (obviously)
|
50
|
+
* ticketmaster gem (latest version preferred)
|
51
|
+
* rally_rest_api
|
52
|
+
* logger (only if you want Rally REST API to log activity)
|
53
|
+
|
54
|
+
## Other Notes
|
55
|
+
|
56
|
+
Since this and the ticketmaster gem is still primarily a work-in-progress, minor changes may be incompatible with previous versions. Please be careful about using and updating this gem in production.
|
57
|
+
|
58
|
+
If you see or find any issues, feel free to open up an issue report.
|
59
|
+
|
60
|
+
## Copyright
|
61
|
+
|
62
|
+
Copyright (c) 2011 Simeon F. Willbanks. See LICENSE.txt for
|
63
|
+
further details.
|
64
|
+
|
65
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "ticketmaster-rally"
|
16
|
+
gem.homepage = "http://github.com/simeonwillbanks/ticketmaster-rally"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = %Q{Ticketmaster provider for Rally's Ruby REST API}
|
19
|
+
gem.description = %Q{This is a provider for ticketmaster. It provides interoperability with Rally and it's project planning system through the ticketmaster gem}
|
20
|
+
gem.email = ["sfw@simeonfosterwillbanks.com", "rob@notch8.com", "george.rafael@gmail.com"]
|
21
|
+
gem.authors = ["Simeon F. Willbanks", "Rob Kaufman", "Rafael George"]
|
22
|
+
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
23
|
+
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
24
|
+
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
25
|
+
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
26
|
+
end
|
27
|
+
Jeweler::RubygemsDotOrgTasks.new
|
28
|
+
|
29
|
+
require 'rspec/core'
|
30
|
+
require 'rspec/core/rake_task'
|
31
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
32
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
36
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
37
|
+
spec.rcov = true
|
38
|
+
end
|
39
|
+
|
40
|
+
task :default => :spec
|
41
|
+
|
42
|
+
require 'yard'
|
43
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Rally
|
3
|
+
# The comment class for ticketmaster-rally
|
4
|
+
#
|
5
|
+
# Remaps
|
6
|
+
#
|
7
|
+
# id => oid
|
8
|
+
# author => user_name
|
9
|
+
# body => text
|
10
|
+
# created_at => creation_date
|
11
|
+
# updated_at => creation_date
|
12
|
+
class Comment < TicketMaster::Provider::Base::Comment
|
13
|
+
|
14
|
+
def initialize(*object)
|
15
|
+
if object.first
|
16
|
+
args = object
|
17
|
+
comment = args.shift
|
18
|
+
project_id = args.shift
|
19
|
+
ticket_id = args.shift
|
20
|
+
@system_data = {:client => comment}
|
21
|
+
hash = {
|
22
|
+
:oid => comment.oid,
|
23
|
+
:project_id => project_id,
|
24
|
+
:ticket_id => ticket_id,
|
25
|
+
:author => comment.user_name,
|
26
|
+
:body => comment.text,
|
27
|
+
:created_at => comment.creation_date,
|
28
|
+
:updated_at => comment.creation_date,
|
29
|
+
:post_number => comment.post_number,
|
30
|
+
}
|
31
|
+
super(hash)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def created_at
|
36
|
+
Time.parse(self[:created_at])
|
37
|
+
end
|
38
|
+
|
39
|
+
def updated_at
|
40
|
+
Time.parse(self[:updated_at])
|
41
|
+
end
|
42
|
+
|
43
|
+
# Rally REST API aliases String and Fixnum :to_q :to_s
|
44
|
+
# However, it does not alias Bignum
|
45
|
+
# If a ID is a Bignum, the API will throw undefined method
|
46
|
+
# Because of this, we pass all IDs to API as strings
|
47
|
+
# Ticketmaster specs set IDs as integers, so coerce type on get
|
48
|
+
def id
|
49
|
+
self[:oid].to_i
|
50
|
+
end
|
51
|
+
|
52
|
+
def id=(id)
|
53
|
+
self[:oid] = id.to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.find_by_id(project_id, ticket_id, id)
|
57
|
+
project = self.rally_project(project_id)
|
58
|
+
# Rally Ruby REST API expects IDs as strings
|
59
|
+
# For id.to_s see note on Project::id
|
60
|
+
query_result = TicketMaster::Provider::Rally.rally.find(:conversation_post, :fetch => true, :project => project) { equal :object_i_d, id.to_s }
|
61
|
+
self.new query_result.first, project_id
|
62
|
+
end
|
63
|
+
|
64
|
+
# Accepts a project id, ticket id and attributes hash and returns all
|
65
|
+
# comments matching the project, ticket and those attributes in an array
|
66
|
+
# Should return all ticket comments if the attributes hash is empty
|
67
|
+
def self.find_by_attributes(project_id, ticket_id, attributes = {})
|
68
|
+
self.search(project_id, ticket_id, attributes)
|
69
|
+
end
|
70
|
+
|
71
|
+
# This is a helper method to find
|
72
|
+
def self.search(project_id, ticket_id, options = {}, limit = 1000)
|
73
|
+
project = self.rally_project(project_id)
|
74
|
+
artifact = project.ticket(:id => ticket_id.to_s)
|
75
|
+
query_result = TicketMaster::Provider::Rally.rally.find_all(:conversation_post, :project => project) { equal :artifact, artifact }
|
76
|
+
comments = query_result.collect do |comment|
|
77
|
+
self.new comment, project_id, ticket_id
|
78
|
+
end
|
79
|
+
search_by_attribute(comments, options, limit)
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.create(*options)
|
83
|
+
options = options.shift
|
84
|
+
project = provider_parent(self)::Project.find_by_id(options[:project_id])
|
85
|
+
ticket = provider_parent(self)::Ticket.find_by_id(options[:project_id], options[:ticket_id])
|
86
|
+
comment = {
|
87
|
+
:project => project.system_data[:client],
|
88
|
+
:artifact => ticket.system_data[:client],
|
89
|
+
:text => options[:body]
|
90
|
+
}
|
91
|
+
new_comment = TicketMaster::Provider::Rally.rally.create(:conversation_post, comment)
|
92
|
+
self.new new_comment
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
def self.rally_project(project_id)
|
98
|
+
ticketmaster_project = provider_parent(self)::Project.find_by_id(project_id)
|
99
|
+
ticketmaster_project.system_data[:client]
|
100
|
+
end
|
101
|
+
|
102
|
+
def self.to_rally_object(hash)
|
103
|
+
ticket = {
|
104
|
+
:name => hash[:title],
|
105
|
+
:description => hash[:description],
|
106
|
+
:schedule_state => hash[:resolution] ||= "Defined",
|
107
|
+
:state => hash[:status] ||= "Submitted"
|
108
|
+
}
|
109
|
+
# Rally optional attributes
|
110
|
+
ticket[:submitted_by] = hash[:requestor] if hash[:requestor]
|
111
|
+
ticket[:owner] = hash[:assignee] if hash[:assignee]
|
112
|
+
ticket[:priority] = hash[:priority] if hash[:priority]
|
113
|
+
ticket[:work_product] = hash[:work_product] if hash[:work_product]
|
114
|
+
ticket
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Rally
|
3
|
+
# Project class for ticketmaster-rally
|
4
|
+
#
|
5
|
+
# Remaps
|
6
|
+
#
|
7
|
+
# id => oid
|
8
|
+
# created_at => creation_date
|
9
|
+
# updated_at => creation_date
|
10
|
+
class Project < TicketMaster::Provider::Base::Project
|
11
|
+
|
12
|
+
def initialize(*object)
|
13
|
+
if object.first
|
14
|
+
project = object.first
|
15
|
+
# Store Rally Project object in Ticketmaster Project object
|
16
|
+
# This allows Ticketmaster to perform updates on Rally Project
|
17
|
+
@system_data = {:client => project}
|
18
|
+
hash = {:oid => project.oid,
|
19
|
+
:name => project.name,
|
20
|
+
:description => project.description,
|
21
|
+
:created_at => project.creation_date,
|
22
|
+
# Rally Project object does not have a modified time
|
23
|
+
:updated_at => project.creation_date}
|
24
|
+
super hash
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def created_at
|
29
|
+
Time.parse(self[:created_at])
|
30
|
+
end
|
31
|
+
|
32
|
+
def updated_at
|
33
|
+
Time.parse(self[:updated_at])
|
34
|
+
end
|
35
|
+
|
36
|
+
# Rally REST API aliases String and Fixnum :to_q :to_s
|
37
|
+
# However, it does not alias Bignum
|
38
|
+
# If a ID is a Bignum, the API will throw undefined method
|
39
|
+
# Because of this, we pass all IDs to API as strings
|
40
|
+
# Ticketmaster specs set IDs as integers, so coerce type on get
|
41
|
+
def id
|
42
|
+
self[:oid].to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def id=(id)
|
46
|
+
self[:oid] = id.to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
# Accepts an integer id and returns the single project instance
|
50
|
+
def self.find_by_id(id)
|
51
|
+
# Rally Ruby REST API expects IDs as strings
|
52
|
+
# For id.to_s see note on Project::id
|
53
|
+
query_result = TicketMaster::Provider::Rally.rally.find(:project, :fetch => true) { equal :object_i_d, id.to_s }
|
54
|
+
self.new query_result.first
|
55
|
+
end
|
56
|
+
|
57
|
+
# Accepts an attributes hash and returns all projects matching those attributes in an array
|
58
|
+
# Should return all projects if the attributes hash is empty
|
59
|
+
def self.find_by_attributes(attributes = {})
|
60
|
+
self.search(attributes)
|
61
|
+
end
|
62
|
+
|
63
|
+
# This is a helper method to find
|
64
|
+
def self.search(options = {}, limit = 1000)
|
65
|
+
projects = TicketMaster::Provider::Rally.rally.find_all(:project).collect do |project|
|
66
|
+
self.new project
|
67
|
+
end
|
68
|
+
search_by_attribute(projects, options, limit)
|
69
|
+
end
|
70
|
+
|
71
|
+
# copy from this.copy(that) copies that into this
|
72
|
+
def copy(project)
|
73
|
+
project.tickets.each do |ticket|
|
74
|
+
copy_ticket = self.ticket!(:title => ticket.title, :description => ticket.description)
|
75
|
+
ticket.comments.each do |comment|
|
76
|
+
copy_ticket.comment!(:body => comment.body)
|
77
|
+
sleep 1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
# This is the Rally Provider for ticketmaster
|
3
|
+
module Rally
|
4
|
+
include TicketMaster::Provider::Base
|
5
|
+
|
6
|
+
# This is for cases when you want to instantiate using TicketMaster::Provider::Rally.new(auth)
|
7
|
+
def self.new(auth = {})
|
8
|
+
TicketMaster.new(:rally, auth)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Providers must define an authorize method. This is used to initialize and set authentication
|
12
|
+
# parameters to access the API
|
13
|
+
def authorize(auth = {})
|
14
|
+
@authentication ||= TicketMaster::Authenticator.new(auth)
|
15
|
+
auth = @authentication
|
16
|
+
if ((auth.url.nil? || auth.url.empty?) and (auth.username.nil? || auth.username.empty?) and (auth.password.nil? || auth.password.empty?))
|
17
|
+
raise "Please you should provide a Rally url, username and password"
|
18
|
+
end
|
19
|
+
TicketMaster::Provider::Rally.rally = RallyRestAPI.new(:username => auth.username,
|
20
|
+
:password => auth.password,
|
21
|
+
:base_url => auth.url,
|
22
|
+
:logger => RALLY_LOGGER_PATH ? Logger.new(RALLY_LOGGER_PATH) : nil)
|
23
|
+
end
|
24
|
+
|
25
|
+
# declare needed overloaded methods here
|
26
|
+
|
27
|
+
def valid?
|
28
|
+
begin
|
29
|
+
TicketMaster::Provider::Rally.rally.find_all(:project).first
|
30
|
+
true
|
31
|
+
rescue
|
32
|
+
false
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.rally=(rally_instance)
|
37
|
+
@rally = rally_instance
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.rally
|
41
|
+
@rally
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
@@ -0,0 +1,170 @@
|
|
1
|
+
module TicketMaster::Provider
|
2
|
+
module Rally
|
3
|
+
# Ticket class for ticketmaster-rally
|
4
|
+
#
|
5
|
+
# Remaps
|
6
|
+
#
|
7
|
+
# id => oid
|
8
|
+
# title => name
|
9
|
+
# requestor => submitted_by
|
10
|
+
# resolution => schedule_state
|
11
|
+
# status => state
|
12
|
+
# created_at => creation_date
|
13
|
+
# updated_at => last_update_date
|
14
|
+
# assignee => owner
|
15
|
+
class Ticket < TicketMaster::Provider::Base::Ticket
|
16
|
+
|
17
|
+
def initialize(*object)
|
18
|
+
if object.first
|
19
|
+
args = object
|
20
|
+
ticket = args.shift
|
21
|
+
project_id = args.shift
|
22
|
+
@system_data = {:client => ticket}
|
23
|
+
hash = {
|
24
|
+
:oid => ticket.oid,
|
25
|
+
:project_id => project_id,
|
26
|
+
# Rally symbol for Tasks and Defects
|
27
|
+
# :hierarchical_requirement, :defect or :task (:artifact for all)
|
28
|
+
:type_as_symbol => ticket.type_as_symbol,
|
29
|
+
:title => ticket.name,
|
30
|
+
:description => ticket.description,
|
31
|
+
:requestor => ticket.submitted_by,
|
32
|
+
:resolution => ticket.schedule_state,
|
33
|
+
:status => ticket.state,
|
34
|
+
:created_at => ticket.creation_date,
|
35
|
+
:updated_at => ticket.last_update_date
|
36
|
+
}
|
37
|
+
# Rally optional attributes
|
38
|
+
hash[:assignee] = ticket.owner if ticket.owner
|
39
|
+
# From Rally Web Services API Documentation v1.21
|
40
|
+
# Allowed values for Defect.Priority: "",
|
41
|
+
# "Resolve Immediately",
|
42
|
+
# "High Attention",
|
43
|
+
# "Normal",
|
44
|
+
# "Low"
|
45
|
+
# When "" Rally Ruby REST API returns <Priority>None</Priority>
|
46
|
+
# Unless API returns allowed value, don't set priority
|
47
|
+
hash[:priority] = ticket.priority unless ticket.priority == "None"
|
48
|
+
super(hash)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def created_at
|
53
|
+
Time.parse(self[:created_at])
|
54
|
+
end
|
55
|
+
|
56
|
+
def updated_at
|
57
|
+
Time.parse(self[:updated_at])
|
58
|
+
end
|
59
|
+
|
60
|
+
# Rally REST API aliases String and Fixnum :to_q :to_s
|
61
|
+
# However, it does not alias Bignum
|
62
|
+
# If a ID is a Bignum, the API will throw undefined method
|
63
|
+
# Because of this, we pass all IDs to API as strings
|
64
|
+
# Ticketmaster specs set IDs as integers, so coerce type on get
|
65
|
+
def id
|
66
|
+
self[:oid].to_i
|
67
|
+
end
|
68
|
+
|
69
|
+
def id=(id)
|
70
|
+
self[:oid] = id.to_s
|
71
|
+
end
|
72
|
+
|
73
|
+
def updated_at=(last_update_date)
|
74
|
+
self[:updated_at] = Time.parse(last_update_date)
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.find_by_id(project_id, id)
|
78
|
+
project = self.rally_project(project_id)
|
79
|
+
# Rally Ruby REST API expects IDs as strings
|
80
|
+
# For id.to_s see note on Project::id
|
81
|
+
query_result = TicketMaster::Provider::Rally.rally.find(:artifact, :fetch => true, :project => project) { equal :object_i_d, id.to_s }
|
82
|
+
self.new query_result.first, project_id
|
83
|
+
end
|
84
|
+
|
85
|
+
# Accepts a project id and attributes hash and returns all
|
86
|
+
# tickets matching the project and those attributes in an array
|
87
|
+
# Should return all project tickets if the attributes hash is empty
|
88
|
+
def self.find_by_attributes(project_id, attributes = {})
|
89
|
+
self.search(project_id, attributes)
|
90
|
+
end
|
91
|
+
|
92
|
+
# This is a helper method to find
|
93
|
+
def self.search(project_id, options = {}, limit = 1000)
|
94
|
+
project = self.rally_project(project_id)
|
95
|
+
search_type = options.delete(:type_as_symbol) || :artifact
|
96
|
+
# Convert Ticketmaster hash keys to Rally hash keys for Rally query params
|
97
|
+
query_parameters = self.to_rally_query_parameters(options)
|
98
|
+
query_result = TicketMaster::Provider::Rally.rally.find_all(search_type, :project => project){
|
99
|
+
query_parameters.each do |key, value|
|
100
|
+
equal key, value
|
101
|
+
end
|
102
|
+
}
|
103
|
+
tickets = query_result.collect do |ticket|
|
104
|
+
self.new ticket, project_id
|
105
|
+
end
|
106
|
+
search_by_attribute(tickets, options, limit)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.create(*options)
|
110
|
+
options = options.shift
|
111
|
+
project = self.rally_project(options[:project_id])
|
112
|
+
ticket = self.to_rally_object(options)
|
113
|
+
ticket[:project] = project
|
114
|
+
# Not sure about making the defect the default here, thoughts?
|
115
|
+
new_type = options[:type_as_symbol] || :defect
|
116
|
+
new_ticket = TicketMaster::Provider::Rally.rally.create(new_type, ticket)
|
117
|
+
self.new new_ticket
|
118
|
+
end
|
119
|
+
|
120
|
+
def save
|
121
|
+
if self[:oid].empty?
|
122
|
+
@system_data[:client].save!
|
123
|
+
else
|
124
|
+
ticket = self.class.to_rally_object(self)
|
125
|
+
ticket_updated = @system_data[:client].update(ticket)
|
126
|
+
# Update Ticketmaster Ticket object updated_at attribute
|
127
|
+
self.updated_at = ticket_updated.last_update_date
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def self.rally_project(project_id)
|
134
|
+
ticketmaster_project = provider_parent(self)::Project.find_by_id(project_id)
|
135
|
+
ticketmaster_project.system_data[:client]
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.to_rally_object(hash)
|
139
|
+
ticket = {
|
140
|
+
:name => hash[:title],
|
141
|
+
:description => hash[:description],
|
142
|
+
:schedule_state => hash[:resolution] ||= "Defined",
|
143
|
+
:state => hash[:status] ||= "Submitted"
|
144
|
+
}
|
145
|
+
# Rally optional attributes
|
146
|
+
ticket[:submitted_by] = hash[:requestor] if hash[:requestor]
|
147
|
+
ticket[:owner] = hash[:assignee] if hash[:assignee]
|
148
|
+
ticket[:priority] = hash[:priority] if hash[:priority]
|
149
|
+
ticket[:work_product] = hash[:work_product] if hash[:work_product]
|
150
|
+
ticket
|
151
|
+
end
|
152
|
+
|
153
|
+
# Transform options hash into query parameters block
|
154
|
+
def self.to_rally_query_parameters(hash)
|
155
|
+
query_parameters = {}
|
156
|
+
query_parameters[:schedule_state] = hash[:resolution] ? hash[:resolution] : "Defined"
|
157
|
+
query_parameters[:state] = hash[:status] ? hash[:status] : "Submitted"
|
158
|
+
query_parameters[:object_i_d] = hash[:id].to_s if hash[:id]
|
159
|
+
query_parameters[:name] = hash[:title] if hash[:title]
|
160
|
+
query_parameters[:description] = hash[:description] if hash[:description]
|
161
|
+
query_parameters[:submitted_by] = hash[:requestor] if hash[:requestor]
|
162
|
+
query_parameters[:owner] = hash[:assignee] if hash[:assignee]
|
163
|
+
query_parameters[:priority] = hash[:priority] if hash[:priority]
|
164
|
+
query_parameters[:work_product] = hash[:work_product] if hash[:work_product]
|
165
|
+
query_parameters
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rally_rest_api'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
#RALLY_LOGGER_PATH = nil
|
6
|
+
# Turn on Rally REST API logging by setting constant to path
|
7
|
+
RALLY_LOGGER_PATH = File.join(File.dirname(__FILE__), '..', 'log', 'rally.log')
|
8
|
+
|
9
|
+
if RALLY_LOGGER_PATH && File.exists?(File.dirname(RALLY_LOGGER_PATH))
|
10
|
+
require 'logger'
|
11
|
+
end
|
12
|
+
|
13
|
+
%w{ rally ticket project comment }.each do |f|
|
14
|
+
require File.dirname(__FILE__) + '/provider/' + f + '.rb';
|
15
|
+
end
|
data/log/.keep
ADDED
File without changes
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Ticketmaster::Provider::Rally::Comment" do
|
4
|
+
before(:all) do
|
5
|
+
@project_id = 2712835688
|
6
|
+
@ticket_id = 2780205298
|
7
|
+
@comment_id = 2988719307
|
8
|
+
@comment_author = "sfw@simeonfosterwillbanks.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@ticketmaster = TicketMaster.new(:rally, {:url => 'https://community.rallydev.com/slm',
|
13
|
+
:username => 'ticketmaster-rally@simeonfosterwillbanks.com',
|
14
|
+
:password => 'Password'})
|
15
|
+
@project = @ticketmaster.project(@project_id)
|
16
|
+
@klass = TicketMaster::Provider::Rally::Comment
|
17
|
+
@ticket = @project.ticket(:id => @ticket_id)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should be able to load all comments" do
|
21
|
+
@ticket.comments.should be_an_instance_of(Array)
|
22
|
+
@ticket.comments.first.should be_an_instance_of(@klass)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should be able to load all comments based on array of ids" do
|
26
|
+
comments = @ticket.comments([@comment_id])
|
27
|
+
comments.should be_an_instance_of(Array)
|
28
|
+
comments.first.should be_an_instance_of(@klass)
|
29
|
+
comments.first.author.should == @comment_author
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should be able to load all comments based on attributes" do
|
33
|
+
comments = @ticket.comments(:id => @comment_id)
|
34
|
+
comments.should be_an_instance_of(Array)
|
35
|
+
comments.first.should be_an_instance_of(@klass)
|
36
|
+
comments.first.author.should == @comment_author
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be able to create a new comment" do
|
40
|
+
# Add discussion for User Story US8: Order picture package
|
41
|
+
ticket = @project.ticket(:id => 2712836091)
|
42
|
+
comment = ticket.comment!(:body => 'Pictures will be available for purchase!')
|
43
|
+
comment.should be_an_instance_of(@klass)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
File without changes
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Ticketmaster::Provider::Rally::Project" do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@project_name = "Sample Project"
|
7
|
+
@project_id = 2712835688
|
8
|
+
@project_created_at = "Tue Jan 18 15:40:28 UTC 2011"
|
9
|
+
end
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@ticketmaster = TicketMaster.new(:rally, {:url => 'https://community.rallydev.com/slm',
|
13
|
+
:username => 'ticketmaster-rally@simeonfosterwillbanks.com',
|
14
|
+
:password => 'Password'})
|
15
|
+
@klass = TicketMaster::Provider::Rally::Project
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to load all projects" do
|
19
|
+
@ticketmaster.projects.should be_an_instance_of(Array)
|
20
|
+
@ticketmaster.projects.first.should be_an_instance_of(@klass)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be able to find a project by id" do
|
24
|
+
project = @ticketmaster.project(@project_id)
|
25
|
+
project.should be_an_instance_of(@klass)
|
26
|
+
project.name.should == @project_name
|
27
|
+
project.id.should == @project_id
|
28
|
+
project.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @project_created_at
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should be able to load all projects from an array of ids" do
|
32
|
+
projects = @ticketmaster.projects([@project_id])
|
33
|
+
projects.should be_an_instance_of(Array)
|
34
|
+
projects.first.should be_an_instance_of(@klass)
|
35
|
+
projects.first.name.should == @project_name
|
36
|
+
projects.first.id.should == @project_id
|
37
|
+
projects.first.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @project_created_at
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should be able to load all projects from attributes" do
|
41
|
+
projects = @ticketmaster.projects(:name => @project_name)
|
42
|
+
projects.should be_an_instance_of(Array)
|
43
|
+
projects.first.should be_an_instance_of(@klass)
|
44
|
+
projects.first.name.should == @project_name
|
45
|
+
projects.first.id.should == @project_id
|
46
|
+
projects.first.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @project_created_at
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be able to load projects using the find method" do
|
50
|
+
@ticketmaster.project.should == @klass
|
51
|
+
@ticketmaster.project.find(@project_id).should be_an_instance_of(@klass)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
4
|
+
require 'ticketmaster'
|
5
|
+
require 'ticketmaster-rally'
|
6
|
+
require 'rspec'
|
7
|
+
|
8
|
+
# Requires supporting files with custom matchers and macros, etc,
|
9
|
+
# in ./support/ and its subdirectories.
|
10
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
11
|
+
|
12
|
+
RSpec.configure do |config|
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Ticketmaster::Provider::Rally" do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@auth = {:url => 'https://community.rallydev.com/slm',
|
7
|
+
:username => 'ticketmaster-rally@simeonfosterwillbanks.com',
|
8
|
+
:password => 'Password'}
|
9
|
+
@ticketmaster = TicketMaster.new(:rally, @auth)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should be able to instantiate a new instance directly" do
|
13
|
+
@ticketmaster = TicketMaster::Provider::Rally.new(@auth)
|
14
|
+
@ticketmaster.should be_an_instance_of(TicketMaster)
|
15
|
+
@ticketmaster.should be_a_kind_of(TicketMaster::Provider::Rally)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be able to instantiate a new instance from parent" do
|
19
|
+
@ticketmaster.should be_an_instance_of(TicketMaster)
|
20
|
+
@ticketmaster.should be_a_kind_of(TicketMaster::Provider::Rally)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should be a valid instance" do
|
24
|
+
@ticketmaster.valid?.should be_true
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Ticketmaster::Provider::Rally::Ticket" do
|
4
|
+
before(:all) do
|
5
|
+
@project_name = "Sample Project"
|
6
|
+
@project_id = 2712835688
|
7
|
+
@ticket_id = 2780205298
|
8
|
+
@ticket_title = "Safari email alert has wrong subject"
|
9
|
+
@ticket_description = "The safari email alert message is 'Safari Email.' It should be 'Awesome Safari Email.'"
|
10
|
+
@ticket_requestor = "sfw@simeonfosterwillbanks.com"
|
11
|
+
@ticket_resolution = "Defined"
|
12
|
+
@ticket_status = "Submitted"
|
13
|
+
@ticket_created_at = "Sat Jan 29 19:35:56 UTC 2011"
|
14
|
+
end
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
@ticketmaster = TicketMaster.new(:rally, {:url => 'https://community.rallydev.com/slm',
|
18
|
+
:username => 'ticketmaster-rally@simeonfosterwillbanks.com',
|
19
|
+
:password => 'Password'})
|
20
|
+
@project = @ticketmaster.project(@project_id)
|
21
|
+
@klass = TicketMaster::Provider::Rally::Ticket
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should return the ticket class" do
|
25
|
+
@project.ticket.should == @klass
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be able to load all tickets" do
|
29
|
+
tickets = @project.tickets
|
30
|
+
tickets.should be_an_instance_of(Array)
|
31
|
+
tickets.first.should be_an_instance_of(@klass)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should be able to load all tickets based on array of id's" do
|
35
|
+
tickets = @project.tickets([@ticket_id])
|
36
|
+
tickets.should be_an_instance_of(Array)
|
37
|
+
tickets.first.should be_an_instance_of(@klass)
|
38
|
+
tickets.first.description.should == @ticket_description
|
39
|
+
tickets.first.project_id.should == @project_id
|
40
|
+
tickets.first.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @ticket_created_at
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be able to load a single ticket based on attributes" do
|
44
|
+
ticket = @project.ticket(:id => @ticket_id)
|
45
|
+
ticket.should be_an_instance_of(@klass)
|
46
|
+
ticket.description.should == @ticket_description
|
47
|
+
ticket.project_id.should == @project_id
|
48
|
+
ticket.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @ticket_created_at
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should be able to load all tickets using attributes" do
|
52
|
+
tickets = @project.tickets(:status => "Submitted")
|
53
|
+
tickets.should be_an_instance_of(Array)
|
54
|
+
tickets.first.should be_an_instance_of(@klass)
|
55
|
+
tickets.first.description.should == @ticket_description
|
56
|
+
tickets.first.project_id.should == @project_id
|
57
|
+
tickets.first.created_at.utc.strftime('%a %b %d %H:%M:%S UTC %Y').should == @ticket_created_at
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should be able to load all tickets of a given type" do
|
61
|
+
tickets = @project.tickets(:type_as_symbol => :defect)
|
62
|
+
tickets.should be_an_instance_of(Array)
|
63
|
+
tickets.first.should be_an_instance_of(@klass)
|
64
|
+
tickets.first.description.should == @ticket_description
|
65
|
+
tickets.first.project_id.should == @project_id
|
66
|
+
tickets.collect do |tick|
|
67
|
+
tick.type_as_symbol.should == :defect
|
68
|
+
end
|
69
|
+
|
70
|
+
tickets = @project.tickets(:type_as_symbol => :task)
|
71
|
+
tickets.should be_an_instance_of(Array)
|
72
|
+
tickets.first.should be_an_instance_of(@klass)
|
73
|
+
tickets.first.project_id.should == @project_id
|
74
|
+
tickets.collect do |tick|
|
75
|
+
tick.type_as_symbol.should == :task
|
76
|
+
end
|
77
|
+
|
78
|
+
tickets = @project.tickets(:type_as_symbol => :hierarchical_requirement)
|
79
|
+
tickets.should be_an_instance_of(Array)
|
80
|
+
tickets.first.should be_an_instance_of(@klass)
|
81
|
+
tickets.first.project_id.should == @project_id
|
82
|
+
tickets.collect do |tick|
|
83
|
+
tick.type_as_symbol.should == :hierarchical_requirement
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should be able to update and save a ticket" do
|
89
|
+
ticket = @project.ticket(@ticket_id)
|
90
|
+
ticket.description = "A brand new awesome description"
|
91
|
+
ticket.status = "Closed"
|
92
|
+
ticket.save
|
93
|
+
ticket.description.should == 'A brand new awesome description'
|
94
|
+
ticket.status.should == "Closed"
|
95
|
+
ticket.description = @ticket_description
|
96
|
+
ticket.status = @ticket_status
|
97
|
+
ticket.save
|
98
|
+
ticket.description.should == @ticket_description
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should be able to create a new ticket" do
|
102
|
+
ticket = @project.ticket!({:title => 'Testing', :description => "Here we go"})
|
103
|
+
ticket.should be_an_instance_of(@klass)
|
104
|
+
ticket.type_as_symbol.should == :defect
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should be able to create a new ticket" do
|
108
|
+
ticket = @project.ticket!({:title => 'TaskTesting', :description => "Here we go tasks", :type_as_symbol => :task, :status => "Defined", :work_product => @project.tickets(:type_as_symbol => :defect).first.oid})
|
109
|
+
ticket.should be_an_instance_of(@klass)
|
110
|
+
ticket.type_as_symbol.should == :task
|
111
|
+
end
|
112
|
+
|
113
|
+
|
114
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ticketmaster-rally}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Simeon F. Willbanks", "Rob Kaufman", "Rafael George"]
|
12
|
+
s.date = %q{2011-07-12}
|
13
|
+
s.description = %q{This is a provider for ticketmaster. It provides interoperability with Rally and it's project planning system through the ticketmaster gem}
|
14
|
+
s.email = ["sfw@simeonfosterwillbanks.com", "rob@notch8.com", "george.rafael@gmail.com"]
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE.txt",
|
17
|
+
"README.md"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".rspec",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"lib/provider/comment.rb",
|
29
|
+
"lib/provider/project.rb",
|
30
|
+
"lib/provider/rally.rb",
|
31
|
+
"lib/provider/ticket.rb",
|
32
|
+
"lib/ticketmaster-rally.rb",
|
33
|
+
"log/.keep",
|
34
|
+
"spec/comments_spec.rb",
|
35
|
+
"spec/fixtures/tickets.xml",
|
36
|
+
"spec/projects_spec.rb",
|
37
|
+
"spec/spec_helper.rb",
|
38
|
+
"spec/ticketmaster-rally_spec.rb",
|
39
|
+
"spec/tickets_spec.rb",
|
40
|
+
"ticketmaster-rally.gemspec"
|
41
|
+
]
|
42
|
+
s.homepage = %q{http://github.com/simeonwillbanks/ticketmaster-rally}
|
43
|
+
s.licenses = ["MIT"]
|
44
|
+
s.require_paths = ["lib"]
|
45
|
+
s.rubygems_version = %q{1.3.7}
|
46
|
+
s.summary = %q{Ticketmaster provider for Rally's Ruby REST API}
|
47
|
+
s.test_files = [
|
48
|
+
"spec/comments_spec.rb",
|
49
|
+
"spec/projects_spec.rb",
|
50
|
+
"spec/spec_helper.rb",
|
51
|
+
"spec/ticketmaster-rally_spec.rb",
|
52
|
+
"spec/tickets_spec.rb"
|
53
|
+
]
|
54
|
+
|
55
|
+
if s.respond_to? :specification_version then
|
56
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
57
|
+
s.specification_version = 3
|
58
|
+
|
59
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
60
|
+
s.add_runtime_dependency(%q<ticketmaster>, ["= 0.6.6"])
|
61
|
+
s.add_runtime_dependency(%q<rally_rest_api>, ["~> 1.0.3"])
|
62
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
|
63
|
+
s.add_development_dependency(%q<yard>, ["~> 0.7.0"])
|
64
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
|
+
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
66
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
67
|
+
s.add_development_dependency(%q<ruby-debug>, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
|
69
|
+
else
|
70
|
+
s.add_dependency(%q<ticketmaster>, ["= 0.6.6"])
|
71
|
+
s.add_dependency(%q<rally_rest_api>, ["~> 1.0.3"])
|
72
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
73
|
+
s.add_dependency(%q<yard>, ["~> 0.7.0"])
|
74
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
75
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
76
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
77
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
78
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
79
|
+
end
|
80
|
+
else
|
81
|
+
s.add_dependency(%q<ticketmaster>, ["= 0.6.6"])
|
82
|
+
s.add_dependency(%q<rally_rest_api>, ["~> 1.0.3"])
|
83
|
+
s.add_dependency(%q<rspec>, ["~> 2.3.0"])
|
84
|
+
s.add_dependency(%q<yard>, ["~> 0.7.0"])
|
85
|
+
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
86
|
+
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
87
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
88
|
+
s.add_dependency(%q<ruby-debug>, [">= 0"])
|
89
|
+
s.add_dependency(%q<ruby-debug19>, [">= 0"])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
metadata
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ticketmaster-rally
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Simeon F. Willbanks
|
14
|
+
- Rob Kaufman
|
15
|
+
- Rafael George
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2011-07-12 00:00:00 -04:00
|
21
|
+
default_executable:
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
name: ticketmaster
|
27
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - "="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
hash: 11
|
33
|
+
segments:
|
34
|
+
- 0
|
35
|
+
- 6
|
36
|
+
- 6
|
37
|
+
version: 0.6.6
|
38
|
+
requirement: *id001
|
39
|
+
- !ruby/object:Gem::Dependency
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
name: rally_rest_api
|
43
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
hash: 17
|
49
|
+
segments:
|
50
|
+
- 1
|
51
|
+
- 0
|
52
|
+
- 3
|
53
|
+
version: 1.0.3
|
54
|
+
requirement: *id002
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
name: rspec
|
59
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ~>
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
hash: 3
|
65
|
+
segments:
|
66
|
+
- 2
|
67
|
+
- 3
|
68
|
+
- 0
|
69
|
+
version: 2.3.0
|
70
|
+
requirement: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
type: :development
|
73
|
+
prerelease: false
|
74
|
+
name: yard
|
75
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
hash: 3
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
- 7
|
84
|
+
- 0
|
85
|
+
version: 0.7.0
|
86
|
+
requirement: *id004
|
87
|
+
- !ruby/object:Gem::Dependency
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
name: bundler
|
91
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
hash: 23
|
97
|
+
segments:
|
98
|
+
- 1
|
99
|
+
- 0
|
100
|
+
- 0
|
101
|
+
version: 1.0.0
|
102
|
+
requirement: *id005
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
name: jeweler
|
107
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ~>
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 7
|
113
|
+
segments:
|
114
|
+
- 1
|
115
|
+
- 5
|
116
|
+
- 2
|
117
|
+
version: 1.5.2
|
118
|
+
requirement: *id006
|
119
|
+
- !ruby/object:Gem::Dependency
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
name: rcov
|
123
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 3
|
129
|
+
segments:
|
130
|
+
- 0
|
131
|
+
version: "0"
|
132
|
+
requirement: *id007
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
name: ruby-debug
|
137
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
138
|
+
none: false
|
139
|
+
requirements:
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
hash: 3
|
143
|
+
segments:
|
144
|
+
- 0
|
145
|
+
version: "0"
|
146
|
+
requirement: *id008
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
name: ruby-debug19
|
151
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
160
|
+
requirement: *id009
|
161
|
+
description: This is a provider for ticketmaster. It provides interoperability with Rally and it's project planning system through the ticketmaster gem
|
162
|
+
email:
|
163
|
+
- sfw@simeonfosterwillbanks.com
|
164
|
+
- rob@notch8.com
|
165
|
+
- george.rafael@gmail.com
|
166
|
+
executables: []
|
167
|
+
|
168
|
+
extensions: []
|
169
|
+
|
170
|
+
extra_rdoc_files:
|
171
|
+
- LICENSE.txt
|
172
|
+
- README.md
|
173
|
+
files:
|
174
|
+
- .document
|
175
|
+
- .rspec
|
176
|
+
- Gemfile
|
177
|
+
- Gemfile.lock
|
178
|
+
- LICENSE.txt
|
179
|
+
- README.md
|
180
|
+
- Rakefile
|
181
|
+
- VERSION
|
182
|
+
- lib/provider/comment.rb
|
183
|
+
- lib/provider/project.rb
|
184
|
+
- lib/provider/rally.rb
|
185
|
+
- lib/provider/ticket.rb
|
186
|
+
- lib/ticketmaster-rally.rb
|
187
|
+
- log/.keep
|
188
|
+
- spec/comments_spec.rb
|
189
|
+
- spec/fixtures/tickets.xml
|
190
|
+
- spec/projects_spec.rb
|
191
|
+
- spec/spec_helper.rb
|
192
|
+
- spec/ticketmaster-rally_spec.rb
|
193
|
+
- spec/tickets_spec.rb
|
194
|
+
- ticketmaster-rally.gemspec
|
195
|
+
has_rdoc: true
|
196
|
+
homepage: http://github.com/simeonwillbanks/ticketmaster-rally
|
197
|
+
licenses:
|
198
|
+
- MIT
|
199
|
+
post_install_message:
|
200
|
+
rdoc_options: []
|
201
|
+
|
202
|
+
require_paths:
|
203
|
+
- lib
|
204
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
205
|
+
none: false
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
hash: 3
|
210
|
+
segments:
|
211
|
+
- 0
|
212
|
+
version: "0"
|
213
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
|
+
none: false
|
215
|
+
requirements:
|
216
|
+
- - ">="
|
217
|
+
- !ruby/object:Gem::Version
|
218
|
+
hash: 3
|
219
|
+
segments:
|
220
|
+
- 0
|
221
|
+
version: "0"
|
222
|
+
requirements: []
|
223
|
+
|
224
|
+
rubyforge_project:
|
225
|
+
rubygems_version: 1.3.7
|
226
|
+
signing_key:
|
227
|
+
specification_version: 3
|
228
|
+
summary: Ticketmaster provider for Rally's Ruby REST API
|
229
|
+
test_files:
|
230
|
+
- spec/comments_spec.rb
|
231
|
+
- spec/projects_spec.rb
|
232
|
+
- spec/spec_helper.rb
|
233
|
+
- spec/ticketmaster-rally_spec.rb
|
234
|
+
- spec/tickets_spec.rb
|