rt-client 0.2.2 → 0.3.1
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/rt/client.rb +52 -6
- data/rt/rtxmlsrv.rb +15 -0
- metadata +88 -35
data/rt/client.rb
CHANGED
@@ -5,6 +5,7 @@ require "rest_client"
|
|
5
5
|
require "tmail"
|
6
6
|
require "iconv"
|
7
7
|
require 'mime/types' # requires both nokogiri and rcov. Yuck.
|
8
|
+
require 'date'
|
8
9
|
|
9
10
|
##A ruby library API to Request Tracker's REST interface. Requires the
|
10
11
|
##rubygems rest-client, tmail and mime-types to be installed. You can
|
@@ -20,7 +21,7 @@ require 'mime/types' # requires both nokogiri and rcov. Yuck.
|
|
20
21
|
|
21
22
|
class RT_Client
|
22
23
|
|
23
|
-
UA = "Mozilla/5.0 ruby RT Client Interface 0.
|
24
|
+
UA = "Mozilla/5.0 ruby RT Client Interface 0.3.1"
|
24
25
|
attr_reader :status, :site, :version, :cookies, :server, :user, :cookie
|
25
26
|
|
26
27
|
# Create a new RT_Client object. Load up our stored cookie and check it.
|
@@ -53,7 +54,7 @@ class RT_Client
|
|
53
54
|
# cookies=<directory>
|
54
55
|
def initialize(*params)
|
55
56
|
@boundary = "----xYzZY#{rand(1000000).to_s}xYzZY"
|
56
|
-
@version = "0.
|
57
|
+
@version = "0.3"
|
57
58
|
@status = "Not connected"
|
58
59
|
@server = "http://localhost/"
|
59
60
|
@user = "rt_user"
|
@@ -143,7 +144,11 @@ class RT_Client
|
|
143
144
|
sid = $~[2]
|
144
145
|
end
|
145
146
|
reply = {}
|
146
|
-
|
147
|
+
if type.downcase == 'user'
|
148
|
+
resp = @site["#{type}/#{sid}"].get
|
149
|
+
else
|
150
|
+
resp = @site["#{type}/#{sid}/show"].get
|
151
|
+
end
|
147
152
|
resp.gsub!(/RT\/\d\.\d\.\d\s\d{3}\s.*\n\n/,"") # toss the HTTP response
|
148
153
|
resp.gsub!(/\n\n/,"\n") # remove double spacing, TMail stops at a blank line
|
149
154
|
return {:error => resp, } if resp =~ /does not exist./
|
@@ -215,7 +220,7 @@ class RT_Client
|
|
215
220
|
# For a full list of possible parameters that you can specify, look at
|
216
221
|
# "/opt/rt/bin/rt edit user/1"
|
217
222
|
#
|
218
|
-
# new_id = rt.create_user(:Name => "
|
223
|
+
# new_id = rt.create_user(:Name => "Joe_Smith", :EmailAddress => "joes\@here.com")
|
219
224
|
def create_user(field_hash)
|
220
225
|
field_hash[:id] = "user/new"
|
221
226
|
payload = compose(field_hash)
|
@@ -228,7 +233,27 @@ class RT_Client
|
|
228
233
|
end
|
229
234
|
new_user # return the new user id or the full REST response
|
230
235
|
end
|
231
|
-
|
236
|
+
|
237
|
+
# edit or create a user. If the user exists, edits the user as "edit" would.
|
238
|
+
# If the user doesn't exist, creates it as "create_user" would.
|
239
|
+
def edit_or_create_user(field_hash)
|
240
|
+
if field_hash.has_key? :id
|
241
|
+
id = field_hash[:id]
|
242
|
+
if id !~ /^user\//
|
243
|
+
id = "user/#{id}"
|
244
|
+
field_hash[:id] = id
|
245
|
+
end
|
246
|
+
else
|
247
|
+
raise "RT_Client.edit_or_create_user require a user id in the 'id' key."
|
248
|
+
end
|
249
|
+
resp1 = "not called"
|
250
|
+
resp2 = "not called"
|
251
|
+
resp1 = edit(field_hash)
|
252
|
+
resp2 = create_user(field_hash) if resp1 =~ /does not exist./
|
253
|
+
resp = "Edit: #{resp1}\nCreate:#{resp2}"
|
254
|
+
resp
|
255
|
+
end
|
256
|
+
|
232
257
|
# edit an existing ticket/user. Requires a hash containing RT
|
233
258
|
# form fields as keys. the key :id is required.
|
234
259
|
# returns the complete REST response, whatever it is. If the
|
@@ -276,6 +301,17 @@ class RT_Client
|
|
276
301
|
@site["ticket/#{id}/comment"].post payload
|
277
302
|
end
|
278
303
|
|
304
|
+
def usersearch(field_hash)
|
305
|
+
if field_hash.has_key? :EmailAddress
|
306
|
+
email = field_hash[:EmailAddress]
|
307
|
+
else
|
308
|
+
raise "RT_Client.usersearch requires a user email in the 'EmailAddress' key."
|
309
|
+
end
|
310
|
+
payload = compose(field_hash)
|
311
|
+
resp = @site["search/user/?query=EmailAddress='#{email}'"].post payload
|
312
|
+
resp
|
313
|
+
end
|
314
|
+
|
279
315
|
# correspond on a ticket. Requires a hash, which must have an :id key
|
280
316
|
# containing the ticket number. Returns the REST response. For a list of
|
281
317
|
# fields you can use in correspondence, try "/opt/rt3/bin/rt correspond
|
@@ -369,7 +405,17 @@ class RT_Client
|
|
369
405
|
th = TMail::Mail.parse(ticket)
|
370
406
|
reply = {}
|
371
407
|
th.each_header do |k,v|
|
372
|
-
|
408
|
+
case k
|
409
|
+
when 'created','due','told','lastupdated','started'
|
410
|
+
begin
|
411
|
+
vv = DateTime.parse(v.to_s)
|
412
|
+
reply["#{k}"] = vv.strftime("%Y-%m-%d %H:%M:%S")
|
413
|
+
rescue ArgumentError
|
414
|
+
reply["#{k}"] = v.to_s
|
415
|
+
end
|
416
|
+
else
|
417
|
+
reply["#{k}"] = v.to_s
|
418
|
+
end
|
373
419
|
end
|
374
420
|
replies.push reply
|
375
421
|
end
|
data/rt/rtxmlsrv.rb
CHANGED
@@ -8,6 +8,7 @@ require "rubygems" # so we can load gems
|
|
8
8
|
require "rt/client" # rt-client REST library
|
9
9
|
require "xmlrpc/server" # that's what we're doing
|
10
10
|
require "date" # for parsing arbitrary date formats
|
11
|
+
require "pp"
|
11
12
|
|
12
13
|
PORT=8080
|
13
14
|
MAX_CONN=50
|
@@ -43,6 +44,7 @@ class TicketSrv
|
|
43
44
|
meth 'string create(struct)','Calls RT_Client::create'
|
44
45
|
meth 'string create_user(struct)','Calls RT_Client::create_user'
|
45
46
|
meth 'string edit(struct)','Calls RT_Client::edit'
|
47
|
+
meth 'string edit_or_create_user(struct)','Calls RT_Client::edit_or_create_user'
|
46
48
|
meth 'struct get_attachment(struct)','Calls RT_Client::get_attachment'
|
47
49
|
meth 'struct history(struct)','Calls RT_Client::history (long form)'
|
48
50
|
meth 'struct history_item(struct)','Calls RT_Client::history_item'
|
@@ -132,6 +134,19 @@ class TicketSrv
|
|
132
134
|
val
|
133
135
|
end
|
134
136
|
|
137
|
+
# Allows new users to be edited or created if they don't exist
|
138
|
+
def edit_or_create_user(struct)
|
139
|
+
struct.remapkeys!
|
140
|
+
if struct.has_key? :user and struct.has_key? :pass
|
141
|
+
rt = RT_Client.new(:user => struct[:user], :pass => struct[:pass])
|
142
|
+
else
|
143
|
+
rt = RT_Client.new
|
144
|
+
end
|
145
|
+
val = rt.edit_or_create_user(struct)
|
146
|
+
rt = nil
|
147
|
+
val
|
148
|
+
end
|
149
|
+
|
135
150
|
# Allows existing ticket to be modified via RT_Client::edit
|
136
151
|
def edit(struct)
|
137
152
|
struct.remapkeys!
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rt-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 17
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Tom Lahti
|
@@ -9,80 +15,117 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2010-07-30 00:00:00 -07:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: rest-client
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 25
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 9
|
23
33
|
version: "0.9"
|
24
|
-
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: tmail
|
27
|
-
|
28
|
-
|
29
|
-
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
30
41
|
requirements:
|
31
42
|
- - ">="
|
32
43
|
- !ruby/object:Gem::Version
|
44
|
+
hash: 31
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 2
|
48
|
+
- 0
|
33
49
|
version: 1.2.0
|
34
|
-
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
35
52
|
- !ruby/object:Gem::Dependency
|
36
53
|
name: mime-types
|
37
|
-
|
38
|
-
|
39
|
-
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
40
57
|
requirements:
|
41
58
|
- - ">="
|
42
59
|
- !ruby/object:Gem::Version
|
60
|
+
hash: 47
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 16
|
43
64
|
version: "1.16"
|
44
|
-
|
65
|
+
type: :runtime
|
66
|
+
version_requirements: *id003
|
45
67
|
- !ruby/object:Gem::Dependency
|
46
68
|
name: archive-tar-minitar
|
47
|
-
|
48
|
-
|
49
|
-
|
69
|
+
prerelease: false
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
50
72
|
requirements:
|
51
73
|
- - ">="
|
52
74
|
- !ruby/object:Gem::Version
|
75
|
+
hash: 1
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
- 5
|
53
79
|
version: "0.5"
|
54
|
-
|
80
|
+
type: :runtime
|
81
|
+
version_requirements: *id004
|
55
82
|
- !ruby/object:Gem::Dependency
|
56
83
|
name: nokogiri
|
57
|
-
|
58
|
-
|
59
|
-
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
60
87
|
requirements:
|
61
88
|
- - ">="
|
62
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 11
|
91
|
+
segments:
|
92
|
+
- 1
|
93
|
+
- 2
|
63
94
|
version: "1.2"
|
64
|
-
|
95
|
+
type: :runtime
|
96
|
+
version_requirements: *id005
|
65
97
|
- !ruby/object:Gem::Dependency
|
66
98
|
name: hoe
|
67
|
-
|
68
|
-
|
69
|
-
|
99
|
+
prerelease: false
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
70
102
|
requirements:
|
71
103
|
- - ">="
|
72
104
|
- !ruby/object:Gem::Version
|
105
|
+
hash: 51
|
106
|
+
segments:
|
107
|
+
- 1
|
108
|
+
- 9
|
109
|
+
- 0
|
73
110
|
version: 1.9.0
|
74
|
-
|
111
|
+
type: :runtime
|
112
|
+
version_requirements: *id006
|
75
113
|
- !ruby/object:Gem::Dependency
|
76
114
|
name: rcov
|
77
|
-
|
78
|
-
|
79
|
-
|
115
|
+
prerelease: false
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
80
118
|
requirements:
|
81
119
|
- - ">="
|
82
120
|
- !ruby/object:Gem::Version
|
121
|
+
hash: 27
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
- 8
|
83
125
|
version: "0.8"
|
84
|
-
|
85
|
-
|
126
|
+
type: :runtime
|
127
|
+
version_requirements: *id007
|
128
|
+
description: " RT_Client is a ruby object that accesses the REST interface version 1.0\n of a Request Tracker instance. See http://www.bestpractical.com/ for\n Request Tracker.\n"
|
86
129
|
email: toml@bitstatement.net
|
87
130
|
executables: []
|
88
131
|
|
@@ -95,6 +138,8 @@ files:
|
|
95
138
|
- rt/rtxmlsrv.rb
|
96
139
|
has_rdoc: true
|
97
140
|
homepage:
|
141
|
+
licenses: []
|
142
|
+
|
98
143
|
post_install_message:
|
99
144
|
rdoc_options:
|
100
145
|
- --inline-source
|
@@ -103,23 +148,31 @@ rdoc_options:
|
|
103
148
|
require_paths:
|
104
149
|
- .
|
105
150
|
required_ruby_version: !ruby/object:Gem::Requirement
|
151
|
+
none: false
|
106
152
|
requirements:
|
107
153
|
- - ">="
|
108
154
|
- !ruby/object:Gem::Version
|
155
|
+
hash: 59
|
156
|
+
segments:
|
157
|
+
- 1
|
158
|
+
- 8
|
159
|
+
- 6
|
109
160
|
version: 1.8.6
|
110
|
-
version:
|
111
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
|
+
none: false
|
112
163
|
requirements:
|
113
164
|
- - ">="
|
114
165
|
- !ruby/object:Gem::Version
|
166
|
+
hash: 3
|
167
|
+
segments:
|
168
|
+
- 0
|
115
169
|
version: "0"
|
116
|
-
version:
|
117
170
|
requirements:
|
118
171
|
- A working installation of RT with the REST 1.0 interface
|
119
172
|
rubyforge_project:
|
120
|
-
rubygems_version: 1.
|
173
|
+
rubygems_version: 1.3.7
|
121
174
|
signing_key:
|
122
|
-
specification_version:
|
175
|
+
specification_version: 3
|
123
176
|
summary: Ruby object for RT access via REST
|
124
177
|
test_files: []
|
125
178
|
|