roust 1.6.1 → 1.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3febce0ccfa7b44ea209547f57d97b758f7e7190
4
- data.tar.gz: d45a596e62bc4c1039428796539f7c5057f7ffd4
3
+ metadata.gz: 5b227d0780f4901c6964f0dbabc8249a14eb36ca
4
+ data.tar.gz: 74852906c70295672ef84e94f545236948bc71ea
5
5
  SHA512:
6
- metadata.gz: ae9c3cc4cdc0518d99d0c8a0a5e2947ff1267614c01f20c221218634a4fbafe2794c5933f97d79cf081bd55d0a52da1f023298a1dd201fc04246c55ab0088d72
7
- data.tar.gz: 68025367e6042fecf660cdb6ade159895d5b1d12e1db9cdf685cfdee65b5602c0fba187b421f0eeb391557fb335e99c5f732a5fcb9a40ea06c4ca0052f430a42
6
+ metadata.gz: 4f5f32014af95ef2afed1b8bd21574532a8eadee97293ee135e80a67d152ccd58dc2731e30a35afd053996636ca7826157758e9c5b88951a0739a30d3e54b1d4
7
+ data.tar.gz: 2f126f6276a5fd87467ae0d7a804cf458f52089d4825b4df4dcad5b7a76185136cf9f2259482489a3d9b65957c192c353ab7ca5c0e1d0b0ab920c8b061fb4e62
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- roust (1.6.1)
4
+ roust (1.7.0)
5
5
  activesupport (>= 4.1.0)
6
6
  httparty (>= 0.13.1)
7
7
  mail (>= 2.5.4)
data/lib/roust/ticket.rb CHANGED
@@ -7,39 +7,7 @@ class Roust
7
7
 
8
8
  return nil if body =~ /^# (Ticket (\d+) does not exist\.)/
9
9
 
10
- # Replace CF spaces with underscores
11
- while body.match(/CF\.\{[\w_ ]*[ ]+[\w ]*\}/)
12
- body.gsub!(/CF\.\{([\w_ ]*)([ ]+)([\w ]*)\}/, 'CF.{\1_\3}')
13
- end
14
-
15
- # Sometimes the API returns requestors formatted like this:
16
- #
17
- # Requestors: foo@example.org,
18
- # bar@example.org, baz@example.org
19
- # qux@example.org, quux@example.org,
20
- # corge@example.org
21
- #
22
- # Turn it into this:
23
- #
24
- # Requestors: foo@example.org, bar@example.org, baz@example.org, ...
25
- #
26
- body.gsub!(/\n\n/, "\n")
27
-
28
- %w(Requestors Cc AdminCc).each do |field|
29
- body.gsub!(/^#{field}:(.+)^\n/m) do |m|
30
- m.strip.split(/,\s+/).join(', ').strip
31
- end
32
- end
33
-
34
- hash = body_to_hash(body)
35
-
36
- %w(Requestors Cc AdminCc).each do |field|
37
- hash[field] = hash[field].split(', ') if hash[field]
38
- end
39
-
40
- hash['id'] = hash['id'].split('/').last
41
-
42
- hash
10
+ parse_ticket_attributes(body)
43
11
  end
44
12
 
45
13
  def ticket_create(attrs)
@@ -119,15 +87,25 @@ class Roust
119
87
  :orderby => '+id'
120
88
  }.merge(attrs)
121
89
 
90
+ params[:format] = 'l' if verbose = params.delete(:verbose)
91
+
122
92
  # FIXME(auxesis): query should be an actual method argument
123
93
  raise ArgumentError, ":query not specified" unless params[:query]
124
94
 
125
95
  response = self.class.get('/search/ticket', :query => params)
126
96
 
127
97
  body, _ = explode_response(response)
128
- body.split("\n").map do |t|
129
- id, subject = t.split(': ', 2)
130
- {'id' => id, 'Subject' => subject}
98
+
99
+ if verbose
100
+ results = body.split("\n--\n\n")
101
+ results.map do |result_body|
102
+ parse_ticket_attributes(result_body)
103
+ end
104
+ else
105
+ body.split("\n").map do |t|
106
+ id, subject = t.split(': ', 2)
107
+ {'id' => id, 'Subject' => subject}
108
+ end
131
109
  end
132
110
  end
133
111
 
@@ -195,6 +173,42 @@ class Roust
195
173
  end
196
174
  end
197
175
 
176
+ def parse_ticket_attributes(body)
177
+ # Replace CF spaces with underscores
178
+ while body.match(/CF\.\{[\w_ ]*[ ]+[\w ]*\}/)
179
+ body.gsub!(/CF\.\{([\w_ ]*)([ ]+)([\w ]*)\}/, 'CF.{\1_\3}')
180
+ end
181
+
182
+ # Sometimes the API returns requestors formatted like this:
183
+ #
184
+ # Requestors: foo@example.org,
185
+ # bar@example.org, baz@example.org
186
+ # qux@example.org, quux@example.org,
187
+ # corge@example.org
188
+ #
189
+ # Turn it into this:
190
+ #
191
+ # Requestors: foo@example.org, bar@example.org, baz@example.org, ...
192
+ #
193
+ body.gsub!(/\n\n/, "\n")
194
+
195
+ %w(Requestors Cc AdminCc).each do |field|
196
+ body.gsub!(/^#{field}:(.+)^\n/m) do |m|
197
+ m.strip.split(/,\s+/).join(', ').strip
198
+ end
199
+ end
200
+
201
+ hash = body_to_hash(body)
202
+
203
+ %w(Requestors Cc AdminCc).each do |field|
204
+ hash[field] = hash[field].split(', ') if hash[field]
205
+ end
206
+
207
+ hash['id'] = hash['id'].split('/').last
208
+
209
+ hash
210
+ end
211
+
198
212
  def parse_short_history(body, opts = {})
199
213
  comments = opts[:comments]
200
214
  regex = comments ? '^\d+:' : '^\d+: [^Comments]'
data/lib/roust/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Roust
2
- VERSION = '1.6.1'
2
+ VERSION = '1.7.0'
3
3
  end
@@ -0,0 +1,57 @@
1
+ RT/3.4.6 200 Ok
2
+
3
+ id: ticket/1
4
+ Queue: support
5
+ Owner: bob
6
+ Creator: alice
7
+ Subject: Heavy packet loss
8
+ Status: open
9
+ Priority: 101
10
+ InitialPriority: 101
11
+ FinalPriority: 100
12
+
13
+ Requestors: carol@them.example, chuck@them.example,
14
+ craig@them.example
15
+
16
+ Cc: dan@us.example, dave@them.example
17
+
18
+ AdminCc: erin@us.example, eve@us.example,
19
+ frank@us.example, oscar@us.example,
20
+ peggy@us.example, trent@us.example
21
+
22
+ Created: Tue Dec 11 07:59:31 2012
23
+ Starts: Not set
24
+ Started: Not set
25
+ Due: Wed Dec 12 20:58:48 2012
26
+ Resolved: Wed Jan 16 16:33:15 2013
27
+ Told: Mon Jan 07 15:27:09 2013
28
+ LastUpdated: Wed Nov 06 09:33:43 2013
29
+ TimeEstimated: 0
30
+ TimeWorked: 12 hours
31
+ TimeLeft: 0
32
+
33
+ --
34
+
35
+ id: ticket/2
36
+ Queue: sales
37
+ Owner: bob
38
+ Creator: RT_System
39
+ Subject: Bloom
40
+ Status: resolved
41
+ Priority: 20
42
+ InitialPriority: 20
43
+ FinalPriority: 1
44
+ Requestors: carol@them.example, chuck@them.example,
45
+ Cc:
46
+ AdminCc:
47
+ Created: Tue May 29 16:19:22 2001
48
+ Starts: Not set
49
+ Started: Not set
50
+ Due: Not set
51
+ Resolved: Mon Mar 15 11:54:58 2004
52
+ Told: Not set
53
+ LastUpdated: Mon Oct 14 11:41:10 2013
54
+ TimeEstimated: 0
55
+ TimeWorked: 0
56
+ TimeLeft: 0
57
+
@@ -12,6 +12,11 @@ describe Roust do
12
12
  :body => mocks_path.join('ticket-search-1-or-2.txt').read,
13
13
  :headers => {})
14
14
 
15
+ stub_request(:get, "http://rt.example.org/REST/1.0/search/ticket?format=l&orderby=%2Bid&query=id%20=%201%20or%20id%20=%202")
16
+ .to_return(:status => 200,
17
+ :body => mocks_path.join('ticket-search-1-or-2-long.txt').read,
18
+ :headers => {})
19
+
15
20
  stub_request(:get, 'http://rt.example.org/REST/1.0/ticket/1/history?format=s')
16
21
  .to_return(:status => 200,
17
22
  :body => mocks_path.join('ticket-1-history-short.txt').read,
@@ -40,6 +45,24 @@ describe Roust do
40
45
  end
41
46
  end
42
47
 
48
+ it 'can verbosely list tickets matching a query' do
49
+ results = @rt.search(:query => 'id = 1 or id = 2', :verbose => true)
50
+ expect(results.size).to eq(2)
51
+
52
+ attrs = %w(id Subject Queue) +
53
+ %w(Requestors Cc AdminCc Owner Creator) +
54
+ %w(Resolved Status) +
55
+ %w(Starts Started TimeLeft Due TimeWorked TimeEstimated) +
56
+ %w(LastUpdated Created Told) +
57
+ %w(Priority FinalPriority InitialPriority)
58
+
59
+ results.each do |result|
60
+ attrs.each do |attr|
61
+ expect(result[attr]).to_not eq(nil), "#{attr} key doesn't exist"
62
+ end
63
+ end
64
+ end
65
+
43
66
  it 'can fetch metadata on individual tickets' do
44
67
  ticket = @rt.show('1')
45
68
  expect(ticket).to_not eq(nil)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roust
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.1
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lindsay Holmwood
@@ -85,6 +85,7 @@ files:
85
85
  - spec/mocks/ticket-1-show-unauthenticated.txt
86
86
  - spec/mocks/ticket-1-show.txt
87
87
  - spec/mocks/ticket-3-links.txt
88
+ - spec/mocks/ticket-search-1-or-2-long.txt
88
89
  - spec/mocks/ticket-search-1-or-2.txt
89
90
  - spec/mocks/user-dan@us.example-after-edit.txt
90
91
  - spec/mocks/user-dan@us.example-edit.txt
@@ -129,6 +130,7 @@ test_files:
129
130
  - spec/mocks/ticket-1-show-unauthenticated.txt
130
131
  - spec/mocks/ticket-1-show.txt
131
132
  - spec/mocks/ticket-3-links.txt
133
+ - spec/mocks/ticket-search-1-or-2-long.txt
132
134
  - spec/mocks/ticket-search-1-or-2.txt
133
135
  - spec/mocks/user-dan@us.example-after-edit.txt
134
136
  - spec/mocks/user-dan@us.example-edit.txt