ticketmaster-rally 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
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
@@ -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