lita-rally 0.1.1 → 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.
- checksums.yaml +4 -4
- data/lib/lita/handlers/rally.rb +89 -116
- data/lita-rally.gemspec +8 -8
- metadata +19 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f789be04a2bffa5e4e6273765edc7d967702721d
|
4
|
+
data.tar.gz: 67351f852ce4c271cd9d99694df3f06994ef39a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5164b6d3de89f8e4640a6465b83d272b3922f53c31c7b58c9f4dcc1976e04ababcfb9e43ead1fb0e03d14225b24e399ecb6df34dc49b1fe87e852460b2c02df1
|
7
|
+
data.tar.gz: 7ce2deeedc11df2a31d816bd33acbeecfaf77b8551d8d2ab5f254e88c1c374302979901b9cfe843ed9c07e09c158f246e2d3cb59f15354638a2c8fb19dd50533
|
data/lib/lita/handlers/rally.rb
CHANGED
@@ -1,9 +1,13 @@
|
|
1
1
|
require 'rest-client'
|
2
2
|
require 'json'
|
3
|
+
require 'rally_api'
|
3
4
|
|
4
5
|
module Lita
|
5
6
|
module Handlers
|
6
7
|
class Rally < Handler
|
8
|
+
|
9
|
+
RALLY = "https://rally1.rallydev.com/slm/webservice"
|
10
|
+
|
7
11
|
@@key_map = {
|
8
12
|
'de' => {
|
9
13
|
name: 'defect',
|
@@ -71,9 +75,9 @@ module Lita
|
|
71
75
|
}
|
72
76
|
}
|
73
77
|
|
74
|
-
config :username
|
75
|
-
config :password
|
76
|
-
config :api_version
|
78
|
+
config :username, type: String, required: true
|
79
|
+
config :password, type: String, required: true
|
80
|
+
config :api_version, type: String, default: 'v2.0'
|
77
81
|
|
78
82
|
route(/^rally me ([[:alpha:]]+)(\d+)/, :rally_show, command: true, help: {
|
79
83
|
'rally me <identifier>' => 'Show me that rally object'
|
@@ -90,153 +94,122 @@ module Lita
|
|
90
94
|
})
|
91
95
|
|
92
96
|
def rally_show(response)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
'check your config')
|
98
|
-
end
|
97
|
+
type = response.matches[0][0].downcase
|
98
|
+
id = response.matches[0][1]
|
99
|
+
|
100
|
+
response.reply(get_rally_object(type, id))
|
99
101
|
end
|
100
102
|
|
101
103
|
def rally_release_stats(response)
|
102
|
-
|
103
|
-
|
104
|
-
else
|
105
|
-
response.reply('Configuration failed to validate, '\
|
106
|
-
'check your config')
|
107
|
-
end
|
104
|
+
release = response.matches[0][0]
|
105
|
+
response.reply(get_rally_release_stat(release))
|
108
106
|
end
|
109
107
|
|
110
108
|
def rally_release_info(response)
|
111
|
-
|
112
|
-
|
113
|
-
else
|
114
|
-
response.reply('Configuration failed to validate, '\
|
115
|
-
'check your config')
|
116
|
-
end
|
109
|
+
release = response.matches[0][0]
|
110
|
+
response.reply(get_rally_release_info(release))
|
117
111
|
end
|
118
112
|
|
119
113
|
private
|
120
114
|
|
121
|
-
def
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
def get_rest
|
126
|
-
api_version = config.api_version ? config.api_version : 'v2.0'
|
127
|
-
RestClient::Resource.new(
|
128
|
-
"https://rally1.rallydev.com/slm/webservice/#{api_version}/",
|
129
|
-
user: config.username,
|
115
|
+
def get_rally_api
|
116
|
+
rally_api_config = {
|
117
|
+
base_url: 'https://rally1.rallydev.com/slm',
|
118
|
+
username: config.username,
|
130
119
|
password: config.password,
|
131
|
-
|
120
|
+
version: config.api_version
|
121
|
+
}
|
122
|
+
|
123
|
+
RallyAPI::RallyRestJson.new(rally_api_config)
|
132
124
|
end
|
133
125
|
|
134
|
-
def validate_release(
|
135
|
-
query =
|
136
|
-
|
137
|
-
|
138
|
-
|
126
|
+
def validate_release(rally, release)
|
127
|
+
query = RallyAPI::RallyQuery.new()
|
128
|
+
query.type = 'release'
|
129
|
+
query.query_string = "(Name = \"#{release}\")"
|
130
|
+
|
131
|
+
rally.find(query).count > 0
|
139
132
|
end
|
140
133
|
|
141
|
-
def get_rally_release_info(
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
query = "(Release.Name = \"#{release}\")"
|
148
|
-
defects = JSON.parse(
|
149
|
-
rest['defect'].get(
|
150
|
-
params: {
|
151
|
-
query: query,
|
152
|
-
fetch: 'true',
|
153
|
-
pagesize: '200',
|
154
|
-
}
|
155
|
-
)
|
156
|
-
)['QueryResult']['Results'].map {|r| r['FormattedID']}.join(' ')
|
157
|
-
|
158
|
-
us = JSON.parse(
|
159
|
-
rest['hierarchicalrequirement'].get(
|
160
|
-
params: {
|
161
|
-
query: query,
|
162
|
-
fetch: 'true',
|
163
|
-
pagesize: '200',
|
164
|
-
}
|
165
|
-
)
|
166
|
-
)['QueryResult']['Results'].map {|r| r['FormattedID']}.join(' ')
|
134
|
+
def get_rally_release_info(release)
|
135
|
+
rally = get_rally_api
|
136
|
+
if validate_release(rally, release)
|
137
|
+
query = RallyAPI::RallyQuery.new()
|
138
|
+
query.type = 'defect'
|
139
|
+
query.query_string = "(Release.Name = \"#{release}\")"
|
167
140
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
141
|
+
defects = rally.find(query).map {|r| r.read['FormattedID']}.join(' ')
|
142
|
+
|
143
|
+
query = RallyAPI::RallyQuery.new()
|
144
|
+
query.type = 'story'
|
145
|
+
query.query_string = "(Release.Name = \"#{release}\")"
|
146
|
+
us = rally.find(query).map {|r| r.read['FormattedID']}.join(' ')
|
147
|
+
|
148
|
+
"Release info for: #{release}\n" \
|
149
|
+
"Defects: #{defects}\n" \
|
150
|
+
"User Stories: #{us}\n"
|
151
|
+
else
|
152
|
+
"I can't find anything about release: '#{release}'!"
|
172
153
|
end
|
173
154
|
end
|
174
155
|
|
175
|
-
def get_rally_release_stat(
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
156
|
+
def get_rally_release_stat(release)
|
157
|
+
rally = get_rally_api
|
158
|
+
if validate_release(rally, release)
|
159
|
+
query = RallyAPI::RallyQuery.new()
|
160
|
+
query.type = 'defect'
|
161
|
+
query.query_string = "(Release.Name = \"#{release}\")"
|
162
|
+
|
163
|
+
de_count = rally.find(query).count
|
164
|
+
|
165
|
+
query = RallyAPI::RallyQuery.new()
|
166
|
+
query.type = 'story'
|
167
|
+
query.query_string = "(Release.Name = \"#{release}\")"
|
168
|
+
|
169
|
+
us_count = rally.find(query).count
|
170
|
+
|
171
|
+
"Release stats for: #{release}\n" \
|
172
|
+
"Defects count: #{de_count}\n" \
|
173
|
+
"User Story count: #{us_count}\n"
|
180
174
|
else
|
181
|
-
|
182
|
-
de_result = JSON.parse(
|
183
|
-
rest['defect'].get(params: {query: query})
|
184
|
-
)['QueryResult']
|
185
|
-
de_count = de_result['TotalResultCount']
|
186
|
-
|
187
|
-
us_result = JSON.parse(
|
188
|
-
rest['hierarchicalrequirement'].get(params: {query: query})
|
189
|
-
)['QueryResult']
|
190
|
-
us_count = us_result['TotalResultCount']
|
191
|
-
|
192
|
-
output = "Release stats for: #{release}\n" \
|
193
|
-
"Defects count: #{de_count}\n" \
|
194
|
-
"User Story count: #{us_count}\n"
|
195
|
-
response.reply(output)
|
175
|
+
"I can find anything about release: '#{release}'!"
|
196
176
|
end
|
197
177
|
end
|
198
178
|
|
199
|
-
def get_rally_object(
|
200
|
-
|
201
|
-
|
202
|
-
id = response.matches[0][1]
|
179
|
+
def get_rally_object(type, id)
|
180
|
+
rally = get_rally_api
|
181
|
+
|
203
182
|
if @@key_map[type]
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
183
|
+
query = RallyAPI::RallyQuery.new()
|
184
|
+
query.type = @@key_map[type][:name]
|
185
|
+
query.query_string = "(FormattedID = \"#{type}#{id}\")"
|
186
|
+
|
187
|
+
result = rally.find(query)
|
188
|
+
|
189
|
+
if result.count < 1
|
190
|
+
response.reply(
|
191
|
+
"Can't find your so called #{@@key_map[type][:name]} " \
|
192
|
+
"#{type}#{id}"
|
212
193
|
)
|
213
|
-
)['QueryResult']
|
214
|
-
if query_result['TotalResultCount'] == 0
|
215
|
-
response.reply("Can't find your so called #{type}#{id} in Rally!")
|
216
194
|
else
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
output += "#{result['FormattedID']} - #{result['Name']}\n" \
|
222
|
-
"Owner: #{result['Owner']['_refObjectName']}\n" \
|
223
|
-
"Project: #{result['Project']['_refObjectName']}\n"
|
195
|
+
out = result[0].read
|
196
|
+
output = "#{link_to_item(out, @@key_map[type][:link_path])}\n" \
|
197
|
+
"Owner: #{out['Owner']['_refObjectName']}\n" \
|
198
|
+
"Project: #{out['Project']['_refObjectName']}\n"
|
224
199
|
@@key_map[type][:extra_output].each do |field|
|
225
|
-
output += "#{field}: #{
|
226
|
-
field.is_a?(String) &&
|
227
|
-
output += "#{field[0]}: #{
|
228
|
-
field.is_a?(Array) &&
|
200
|
+
output += "#{field}: #{out[field]}\n" if
|
201
|
+
field.is_a?(String) && out[field]
|
202
|
+
output += "#{field[0]}: #{out[field[0]][field[1]]}\n" if
|
203
|
+
field.is_a?(Array) && out[field[0]]
|
229
204
|
end
|
230
|
-
output += "Description: #{strip_html(
|
231
|
-
response.reply(output)
|
205
|
+
output += "Description: #{strip_html(out['Description'])}\n"
|
232
206
|
end
|
233
207
|
else
|
234
|
-
|
208
|
+
"I don't know the type #{type}"
|
235
209
|
end
|
236
210
|
end
|
237
211
|
|
238
212
|
def link_to_item(result, type)
|
239
|
-
return false unless result['Project'] && result['ObjectID']
|
240
213
|
project_id = result['Project']['_ref'].split('/')[-1]
|
241
214
|
object_id = result['ObjectID']
|
242
215
|
"https://rally1.rallydev.com/#/#{project_id}/detail/#{type}/#{object_id}"
|
data/lita-rally.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-rally"
|
3
|
-
spec.version = "0.
|
3
|
+
spec.version = "0.2.0"
|
4
4
|
spec.authors = ['Richard Li']
|
5
5
|
spec.email = ['evilcat@wisewolfsolutions.com']
|
6
|
-
spec.description = %q{lita bot
|
6
|
+
spec.description = %q{Rally plugin for lita bot}
|
7
7
|
spec.summary = %q{lita bot Rally plugin}
|
8
8
|
spec.homepage = "https://github.com/ecwws/lita-rally"
|
9
9
|
spec.license = "MIT"
|
@@ -14,12 +14,12 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
15
|
spec.require_paths = ["lib"]
|
16
16
|
|
17
|
-
spec.add_runtime_dependency "lita", "
|
18
|
-
spec.add_runtime_dependency "rest-client"
|
19
|
-
spec.add_runtime_dependency "json"
|
17
|
+
spec.add_runtime_dependency "lita", "~> 4.1"
|
18
|
+
spec.add_runtime_dependency "rest-client", "~> 0"
|
19
|
+
spec.add_runtime_dependency "json", "~> 0"
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
-
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "rack-test"
|
24
|
-
spec.add_development_dependency "rspec",
|
22
|
+
spec.add_development_dependency "rake", "~> 0"
|
23
|
+
spec.add_development_dependency "rack-test", "~> 0"
|
24
|
+
spec.add_development_dependency "rspec", '~> 3.0', '>= 3.0.0'
|
25
25
|
end
|
metadata
CHANGED
@@ -1,55 +1,55 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-rally
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Li
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '4.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rest-client
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: json
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -70,34 +70,37 @@ dependencies:
|
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rack-test
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '3.0'
|
101
104
|
- - ">="
|
102
105
|
- !ruby/object:Gem::Version
|
103
106
|
version: 3.0.0
|
@@ -105,10 +108,13 @@ dependencies:
|
|
105
108
|
prerelease: false
|
106
109
|
version_requirements: !ruby/object:Gem::Requirement
|
107
110
|
requirements:
|
111
|
+
- - "~>"
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '3.0'
|
108
114
|
- - ">="
|
109
115
|
- !ruby/object:Gem::Version
|
110
116
|
version: 3.0.0
|
111
|
-
description: lita bot
|
117
|
+
description: Rally plugin for lita bot
|
112
118
|
email:
|
113
119
|
- evilcat@wisewolfsolutions.com
|
114
120
|
executables: []
|