assembla 0.7.3 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.3
1
+ 0.8.0
data/a2smbla-0.3.0.gem ADDED
Binary file
data/assembla.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{assembla}
8
- s.version = "0.7.3"
8
+ s.version = "0.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ignacy Moryc"]
12
- s.date = %q{2010-02-14}
12
+ s.date = %q{2010-03-15}
13
13
  s.default_executable = %q{ass}
14
14
  s.description = %q{This gem provides access to assembla tickets. It supports listing, creating and modyfing functionality}
15
15
  s.email = %q{imoryc@gmail.com}
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
  "README.textile",
23
23
  "Rakefile",
24
24
  "VERSION",
25
+ "a2smbla-0.3.0.gem",
25
26
  "assembla.gemspec",
26
27
  "bin/ass",
27
28
  "config_default.yml",
data/lib/assembla.rb CHANGED
@@ -1,11 +1,9 @@
1
1
  # This program allows you to use command line to perform
2
- # your typical assembla.com tasks. USing it you can check
3
- # for new tickets, change status, reasign them or create new ones
2
+ # your typical assembla.com tasks.
4
3
  #
5
4
  # Author:: Ignacy Moryc (mailto:imoryc@gmail.com)
6
5
  # License:: MIT
7
- #
8
- # This is the main program class
6
+
9
7
 
10
8
 
11
9
  require 'open-uri'
@@ -21,14 +19,15 @@ class AssEmBlr
21
19
 
22
20
  attr_accessor :page, :parsed, :url, :user, :password
23
21
 
24
- # This metod requires for the config file to be present
25
22
  def initialize(config_file = "~/.assembla")
26
23
  config = YAML::parse( File.open(File.expand_path(config_file)))
27
- @url = config["url"].value
28
- @user = config["user"].value
24
+ @url = config["url"].value
25
+ @user = config["user"].value
29
26
  @password = config["password"].value
30
- @me = config["me"].value
27
+ @me = config["me"].value
31
28
 
29
+ # For testing purposes if the url has no HTTP in it we assume
30
+ # that assembla space is saved to a local file
32
31
  (@url =~ /http/) ? \
33
32
  self.page = Hpricot(open(@url, :http_basic_authentication=>[@user, @password])) \
34
33
  : self.page = Hpricot(open(@url))
@@ -42,46 +41,83 @@ class AssEmBlr
42
41
  self.parsed = all.evaluate(self.page)
43
42
  end
44
43
 
45
- def print_tickets
46
- puts_title_line
47
- self.parsed.each do |ticket|
48
- puts ticket.to_s
44
+ # Find operates with different arguments:
45
+ # * :id - ticket's id number
46
+ # * :status - The same as Assembla ticket status ["New", "Accepted", "Test", "Fixed", "Invalid"]
47
+ # * :summary - ticket description
48
+ # * :assigned_to - the person to whom the ticket is assigned to
49
+ # Also you can use params in pairs, like this:
50
+ # * :assigned_to and :status
51
+ def find(args)
52
+ if args.length == 1
53
+ return find_id(args[:id]) if (args[:id])
54
+ return find_with_status(args[:status]) if (args[:status])
55
+ return find_with_summary(args[:summary]) if (args[:summary])
56
+ return find_assigned_to(args[:assigned_to]) if (args[:assigned_to])
57
+ elsif args.length == 2
58
+ return find_assigned_and_with_status(args[:assigned_to], args[:status]) if (args[:status] && args[:assigned_to])
49
59
  end
50
60
  end
51
61
 
52
- def find_assigned_to(to = @me)
62
+ def find_assigned_to(to = @me) #:nodoc:
53
63
  ass = AssignedTo.new
54
64
  assigned_to = ass.evaluate(self.parsed, to)
55
65
  end
56
66
 
57
- def find_my_active_tickets
67
+ def find_my_active_tickets #:nodoc:
58
68
  ass = find_assigned_to(@me)
59
69
  new = find_with_status("New")
70
+ test = find_with_status("Test")
60
71
  accepted = find_with_status("Accepted")
61
- (accepted + new + ass).uniq
72
+ ((accepted + new + ass) - test).uniq
62
73
  end
63
74
 
64
- def find_with_status(status = "New")
75
+ def find_with_status(status = "New") #:nodoc:
65
76
  st = Status.new
66
77
  active = st.evaluate(self.parsed, status)
67
78
  end
68
79
 
80
+ def find_with_summary(text) #:nodoc:
81
+ sum = Summary.new
82
+ summary = sum.evaluate(self.parsed, text)
83
+ end
84
+
85
+ # Prints the tickets to STDOUT
69
86
  def print(tickets)
70
87
  puts_title_line
71
88
  tickets.each { |t| puts t.to_s }
72
89
  end
73
-
74
- def find_id(id)
90
+
91
+ def find_id(id) #:nodoc:
75
92
  result = Id.new
76
- result.evaluate(self.parsed, id)
93
+ result.evaluate(self.parsed, id).first
77
94
  end
78
95
 
79
- def update_ticket_to_new(id)
96
+ # This function uses OR condition for search
97
+ # I commented it out for now - because I can see
98
+ # no use for it.
99
+ # def find_assigned_or_with_status(to, status)
100
+ # st = Status.new
101
+ # as = AssignedTo.new
102
+ # st.evaluate(self.parsed, status) | as.evaluate(self.parsed, to)
103
+ # end
104
+
105
+ def find_assigned_and_with_status(to, status) #:nodoc:
106
+ st = Status.new
107
+ as = AssignedTo.new
108
+ st.evaluate(self.parsed, status) & as.evaluate(self.parsed, to)
109
+ end
110
+
111
+ # This method uses Assembla's Ticket REST API
112
+ # http://www.assembla.com/wiki/show/breakoutdocs/Ticket_REST_API
113
+ # to change tickets status.
114
+ # It returns text of http response from Aseembla server.
115
+ def update_tickets_status(id, status)
116
+ status_number = get_id_from_status(status)
80
117
  space = @url.gsub(/https:\/\/www\.assembla.com(.+)/, '\1')
81
118
  url = space + '/' + id.to_s
82
- puts url
83
119
  request = Net::HTTP::Put.new(url, initheader = {'Content-Type' => 'application/xml', 'Accept' => 'application/xml'})
84
- request.body = "<ticket><status type='integer'>0</status></ticket>"
120
+ request.body = "<ticket><status type='integer'>#{status_number}</status></ticket>"
85
121
  request.basic_auth @user, @password
86
122
  Net::HTTP.start("www.assembla.com", 80 ) do |http|
87
123
  response = http.request(request)
@@ -91,6 +127,15 @@ class AssEmBlr
91
127
 
92
128
  private
93
129
 
130
+ def get_id_from_status(s) #:nodoc:
131
+ statuses = { "New" => 0,
132
+ "Accepted" => 1,
133
+ "Invalid" => 2,
134
+ "Fixed" => 3,
135
+ "Test" => 4 }
136
+ return statuses[s]
137
+ end
138
+
94
139
  # This is a helper method for printing table header
95
140
  def puts_title_line
96
141
  puts
data/lib/extensions.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # Useful functionality that didn't belong anywhere else
2
2
  class Object
3
+ # Borowed from Rails.. http://api.rubyonrails.org/classes/Object.html#M000289
3
4
  def returning(value)
4
5
  yield(value)
5
6
  value
data/lib/interpreter.rb CHANGED
@@ -1,10 +1,22 @@
1
+ # Author:: Ignacy Moryc (mailto:imoryc@gmail.com)
2
+ # License:: MIT
3
+
1
4
  require File.dirname(__FILE__) + '/extensions'
2
5
 
3
- class Expression
6
+ class Expression #:nodoc:
7
+
8
+ # def |(other)
9
+ # Or.new(self, other)
10
+ # end
4
11
 
12
+ # def &(other)
13
+ # And.new(self, other)
14
+ # end
15
+
5
16
  end
6
17
 
7
18
  class All < Expression
19
+ # Returns all ticket from current space
8
20
  def evaluate(page)
9
21
  returning result = [] do
10
22
  (page/"tr.ticket_row").each do |ticket|
@@ -18,6 +30,7 @@ class All < Expression
18
30
  end
19
31
 
20
32
  class Status < Expression
33
+ # Searches tickets by status
21
34
  def evaluate(tickets, status)
22
35
  returning result = [] do
23
36
  tickets.each { |t| result.push(t) if t.status == status }
@@ -26,6 +39,7 @@ class Status < Expression
26
39
  end
27
40
 
28
41
  class Id < Expression
42
+ # Searches tickets by id
29
43
  def evaluate(tickets, id)
30
44
  returning result = [] do
31
45
  tickets.each { |t| result.push(t) if t.id == id }
@@ -34,9 +48,31 @@ class Id < Expression
34
48
  end
35
49
 
36
50
  class AssignedTo < Expression
51
+ # Searches tickets by assigned user
37
52
  def evaluate(tickets, to)
38
53
  returning result = [] do
39
54
  tickets.each { |t| result.push(t) if t.assigned_to == to }
40
55
  end
41
56
  end
42
57
  end
58
+
59
+ class Summary < Expression
60
+ # Searches tickets by summary
61
+ def evaluate(tickets, text)
62
+ returning result = [] do
63
+ tickets.each { |t| result.push(t) if t.summary.match(text) }
64
+ end
65
+ end
66
+ end
67
+
68
+ # class Or < Expression
69
+ # def initialize(tickets1, tickets2)
70
+ # (tickets1 + tickets).sort.uniq
71
+ # end
72
+ # end
73
+
74
+ # class And < Expression
75
+ # def initialize(tickets1, tickets2)
76
+ # (tickets1 + tickets).sort.uniq
77
+ # end
78
+ # end
data/lib/ticket.rb CHANGED
@@ -11,14 +11,14 @@
11
11
  class Ticket
12
12
  attr_accessor :id, :summary, :status, :assigned_to
13
13
 
14
- def initialize(id, summary, status, assigned_to)
14
+ def initialize(id, summary, status, assigned_to) #:nodoc:
15
15
  self.id = id.to_i
16
16
  self.summary = summary
17
17
  self.status = status
18
18
  self.assigned_to = assigned_to
19
19
  end
20
20
 
21
- def to_s
21
+ def to_s #:nodoc:
22
22
  "#{self.id.to_s.center(5)}|#{self.assigned_to.center(18)}|#{self.status.to_s.center(10)}| #{self.summary} \n"
23
23
  end
24
24
 
@@ -86,15 +86,11 @@
86
86
  <h3 class="section-bar">Methods</h3>
87
87
 
88
88
  <div class="name-list">
89
- <a href="#M000004">find_assigned_to</a>&nbsp;&nbsp;
90
- <a href="#M000008">find_id</a>&nbsp;&nbsp;
91
- <a href="#M000005">find_my_active_tickets</a>&nbsp;&nbsp;
92
- <a href="#M000006">find_with_status</a>&nbsp;&nbsp;
89
+ <a href="#M000003">find</a>&nbsp;&nbsp;
93
90
  <a href="#M000001">new</a>&nbsp;&nbsp;
94
- <a href="#M000007">print</a>&nbsp;&nbsp;
95
- <a href="#M000003">print_tickets</a>&nbsp;&nbsp;
91
+ <a href="#M000004">print</a>&nbsp;&nbsp;
96
92
  <a href="#M000002">tickets</a>&nbsp;&nbsp;
97
- <a href="#M000009">update_ticets_status</a>&nbsp;&nbsp;
93
+ <a href="#M000005">update_tickets_status</a>&nbsp;&nbsp;
98
94
  </div>
99
95
  </div>
100
96
 
@@ -154,28 +150,31 @@
154
150
 
155
151
  <div class="method-heading">
156
152
  <a href="#M000001" class="method-signature">
157
- <span class="method-name">new</span><span class="method-args">()</span>
153
+ <span class="method-name">new</span><span class="method-args">(config_file = &quot;~/.assembla&quot;)</span>
158
154
  </a>
159
155
  </div>
160
156
 
161
157
  <div class="method-description">
162
- <p>
163
- This metod requires for the config file to be present
164
- </p>
165
158
  <p><a class="source-toggle" href="#"
166
159
  onclick="toggleCode('M000001-source');return false;">[Source]</a></p>
167
160
  <div class="method-source-code" id="M000001-source">
168
161
  <pre>
169
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 26</span>
170
- 26: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>
171
- 27: <span class="ruby-identifier">config</span> = <span class="ruby-constant">YAML</span><span class="ruby-operator">::</span><span class="ruby-identifier">parse</span>( <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-value str">&quot;~/.assembla&quot;</span>)))
172
- 28: <span class="ruby-ivar">@url</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;url&quot;</span>].<span class="ruby-identifier">value</span>
173
- 29: <span class="ruby-ivar">@user</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;user&quot;</span>].<span class="ruby-identifier">value</span>
174
- 30: <span class="ruby-ivar">@password</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;password&quot;</span>].<span class="ruby-identifier">value</span>
175
- 31: <span class="ruby-ivar">@me</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;me&quot;</span>].<span class="ruby-identifier">value</span>
176
- 32: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">page</span> = <span class="ruby-constant">Hpricot</span>(<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@url</span>, <span class="ruby-identifier">:http_basic_authentication=</span><span class="ruby-operator">&gt;</span>[<span class="ruby-ivar">@user</span>, <span class="ruby-ivar">@password</span>]))
177
- 33: <span class="ruby-identifier">tickets</span>
178
- 34: <span class="ruby-keyword kw">end</span>
162
+ <span class="ruby-comment cmt"># File lib/assembla.rb, line 22</span>
163
+ 22: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">config_file</span> = <span class="ruby-value str">&quot;~/.assembla&quot;</span>)
164
+ 23: <span class="ruby-identifier">config</span> = <span class="ruby-constant">YAML</span><span class="ruby-operator">::</span><span class="ruby-identifier">parse</span>( <span class="ruby-constant">File</span>.<span class="ruby-identifier">open</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-identifier">config_file</span>)))
165
+ 24: <span class="ruby-ivar">@url</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;url&quot;</span>].<span class="ruby-identifier">value</span>
166
+ 25: <span class="ruby-ivar">@user</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;user&quot;</span>].<span class="ruby-identifier">value</span>
167
+ 26: <span class="ruby-ivar">@password</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;password&quot;</span>].<span class="ruby-identifier">value</span>
168
+ 27: <span class="ruby-ivar">@me</span> = <span class="ruby-identifier">config</span>[<span class="ruby-value str">&quot;me&quot;</span>].<span class="ruby-identifier">value</span>
169
+ 28:
170
+ 29: <span class="ruby-comment cmt"># For testing purposes if the url has no HTTP in it we assume</span>
171
+ 30: <span class="ruby-comment cmt"># that assembla space is saved to a local file</span>
172
+ 31: (<span class="ruby-ivar">@url</span> <span class="ruby-operator">=~</span> <span class="ruby-regexp re">/http/</span>) <span class="ruby-operator">?</span> \
173
+ 32: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">page</span> = <span class="ruby-constant">Hpricot</span>(<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@url</span>, <span class="ruby-identifier">:http_basic_authentication=</span><span class="ruby-operator">&gt;</span>[<span class="ruby-ivar">@user</span>, <span class="ruby-ivar">@password</span>])) \
174
+ 33: <span class="ruby-operator">:</span> <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">page</span> = <span class="ruby-constant">Hpricot</span>(<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@url</span>))
175
+ 34:
176
+ 35: <span class="ruby-identifier">tickets</span>
177
+ 36: <span class="ruby-keyword kw">end</span>
179
178
  </pre>
180
179
  </div>
181
180
  </div>
@@ -183,149 +182,85 @@ This metod requires for the config file to be present
183
182
 
184
183
  <h3 class="section-bar">Public Instance methods</h3>
185
184
 
186
- <div id="method-M000004" class="method-detail">
187
- <a name="M000004"></a>
185
+ <div id="method-M000003" class="method-detail">
186
+ <a name="M000003"></a>
188
187
 
189
188
  <div class="method-heading">
190
- <a href="#M000004" class="method-signature">
191
- <span class="method-name">find_assigned_to</span><span class="method-args">(to = @me)</span>
189
+ <a href="#M000003" class="method-signature">
190
+ <span class="method-name">find</span><span class="method-args">(args)</span>
192
191
  </a>
193
192
  </div>
194
193
 
195
194
  <div class="method-description">
196
- <p><a class="source-toggle" href="#"
197
- onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
198
- <div class="method-source-code" id="M000004-source">
199
- <pre>
200
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 49</span>
201
- 49: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_assigned_to</span>(<span class="ruby-identifier">to</span> = <span class="ruby-ivar">@me</span>)
202
- 50: <span class="ruby-identifier">ass</span> = <span class="ruby-constant">AssignedTo</span>.<span class="ruby-identifier">new</span>
203
- 51: <span class="ruby-identifier">assigned_to</span> = <span class="ruby-identifier">ass</span>.<span class="ruby-identifier">evaluate</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span>, <span class="ruby-identifier">to</span>)
204
- 52: <span class="ruby-keyword kw">end</span>
205
- </pre>
206
- </div>
207
- </div>
208
- </div>
209
-
210
- <div id="method-M000008" class="method-detail">
211
- <a name="M000008"></a>
195
+ <p>
196
+ Find operates with different arguments:
197
+ </p>
198
+ <ul>
199
+ <li>:id - ticket&#8216;s id number
212
200
 
213
- <div class="method-heading">
214
- <a href="#M000008" class="method-signature">
215
- <span class="method-name">find_id</span><span class="method-args">(id)</span>
216
- </a>
217
- </div>
218
-
219
- <div class="method-description">
220
- <p><a class="source-toggle" href="#"
221
- onclick="toggleCode('M000008-source');return false;">[Source]</a></p>
222
- <div class="method-source-code" id="M000008-source">
223
- <pre>
224
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 71</span>
225
- 71: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_id</span>(<span class="ruby-identifier">id</span>)
226
- 72: <span class="ruby-identifier">result</span> = <span class="ruby-constant">Id</span>.<span class="ruby-identifier">new</span>
227
- 73: <span class="ruby-identifier">found</span> = <span class="ruby-identifier">result</span>.<span class="ruby-identifier">evaluate</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span>, <span class="ruby-constant">Id</span>)
228
- 74: <span class="ruby-keyword kw">end</span>
229
- </pre>
230
- </div>
231
- </div>
232
- </div>
201
+ </li>
202
+ <li>:status - The same as Assembla ticket status [&quot;New&quot;,
203
+ &quot;Accepted&quot;, &quot;Test&quot;, &quot;Fixed&quot;,
204
+ &quot;Invalid&quot;]
233
205
 
234
- <div id="method-M000005" class="method-detail">
235
- <a name="M000005"></a>
206
+ </li>
207
+ <li>:summary - ticket description
236
208
 
237
- <div class="method-heading">
238
- <a href="#M000005" class="method-signature">
239
- <span class="method-name">find_my_active_tickets</span><span class="method-args">()</span>
240
- </a>
241
- </div>
242
-
243
- <div class="method-description">
244
- <p><a class="source-toggle" href="#"
245
- onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
246
- <div class="method-source-code" id="M000005-source">
247
- <pre>
248
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 54</span>
249
- 54: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_my_active_tickets</span>
250
- 55: <span class="ruby-identifier">ass</span> = <span class="ruby-identifier">find_assigned_to</span>(<span class="ruby-ivar">@me</span>)
251
- 56: <span class="ruby-identifier">new</span> = <span class="ruby-identifier">find_with_status</span>(<span class="ruby-value str">&quot;New&quot;</span>)
252
- 57: <span class="ruby-identifier">accepted</span> = <span class="ruby-identifier">find_with_status</span>(<span class="ruby-value str">&quot;Accepted&quot;</span>)
253
- 58: (<span class="ruby-identifier">accepted</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">new</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">ass</span>).<span class="ruby-identifier">uniq</span>
254
- 59: <span class="ruby-keyword kw">end</span>
255
- </pre>
256
- </div>
257
- </div>
258
- </div>
209
+ </li>
210
+ <li>:assigned_to - the person to whom the ticket is assigned to
259
211
 
260
- <div id="method-M000006" class="method-detail">
261
- <a name="M000006"></a>
212
+ </li>
213
+ </ul>
214
+ <p>
215
+ Also you can use params in pairs, like this:
216
+ </p>
217
+ <ul>
218
+ <li>:assigned_to and :status
262
219
 
263
- <div class="method-heading">
264
- <a href="#M000006" class="method-signature">
265
- <span class="method-name">find_with_status</span><span class="method-args">(status = &quot;New&quot;)</span>
266
- </a>
267
- </div>
268
-
269
- <div class="method-description">
220
+ </li>
221
+ </ul>
270
222
  <p><a class="source-toggle" href="#"
271
- onclick="toggleCode('M000006-source');return false;">[Source]</a></p>
272
- <div class="method-source-code" id="M000006-source">
223
+ onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
224
+ <div class="method-source-code" id="M000003-source">
273
225
  <pre>
274
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 61</span>
275
- 61: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find_with_status</span>(<span class="ruby-identifier">status</span> = <span class="ruby-value str">&quot;New&quot;</span>)
276
- 62: <span class="ruby-identifier">st</span> = <span class="ruby-constant">Status</span>.<span class="ruby-identifier">new</span>
277
- 63: <span class="ruby-identifier">active</span> = <span class="ruby-identifier">st</span>.<span class="ruby-identifier">evaluate</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span>, <span class="ruby-identifier">status</span>)
278
- 64: <span class="ruby-keyword kw">end</span>
226
+ <span class="ruby-comment cmt"># File lib/assembla.rb, line 51</span>
227
+ 51: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">find</span>(<span class="ruby-identifier">args</span>)
228
+ 52: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
229
+ 53: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">find_id</span>(<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:id</span>]) <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:id</span>])
230
+ 54: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">find_with_status</span>(<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:status</span>]) <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:status</span>])
231
+ 55: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">find_with_summary</span>(<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:summary</span>]) <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:summary</span>])
232
+ 56: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">find_assigned_to</span>(<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:assigned_to</span>]) <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:assigned_to</span>])
233
+ 57: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">args</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">==</span> <span class="ruby-value">2</span>
234
+ 58: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">find_assigned_and_with_status</span>(<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:assigned_to</span>], <span class="ruby-identifier">args</span>[<span class="ruby-identifier">:status</span>]) <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">args</span>[<span class="ruby-identifier">:status</span>] <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">args</span>[<span class="ruby-identifier">:assigned_to</span>])
235
+ 59: <span class="ruby-keyword kw">end</span>
236
+ 60: <span class="ruby-keyword kw">end</span>
279
237
  </pre>
280
238
  </div>
281
239
  </div>
282
240
  </div>
283
241
 
284
- <div id="method-M000007" class="method-detail">
285
- <a name="M000007"></a>
242
+ <div id="method-M000004" class="method-detail">
243
+ <a name="M000004"></a>
286
244
 
287
245
  <div class="method-heading">
288
- <a href="#M000007" class="method-signature">
246
+ <a href="#M000004" class="method-signature">
289
247
  <span class="method-name">print</span><span class="method-args">(tickets)</span>
290
248
  </a>
291
249
  </div>
292
250
 
293
251
  <div class="method-description">
252
+ <p>
253
+ Prints the <a href="AssEmBlr.html#M000002">tickets</a> to STDOUT
254
+ </p>
294
255
  <p><a class="source-toggle" href="#"
295
- onclick="toggleCode('M000007-source');return false;">[Source]</a></p>
296
- <div class="method-source-code" id="M000007-source">
297
- <pre>
298
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 66</span>
299
- 66: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">print</span>(<span class="ruby-identifier">tickets</span>)
300
- 67: <span class="ruby-identifier">puts_title_line</span>
301
- 68: <span class="ruby-identifier">tickets</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">t</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">to_s</span> }
302
- 69: <span class="ruby-keyword kw">end</span>
303
- </pre>
304
- </div>
305
- </div>
306
- </div>
307
-
308
- <div id="method-M000003" class="method-detail">
309
- <a name="M000003"></a>
310
-
311
- <div class="method-heading">
312
- <a href="#M000003" class="method-signature">
313
- <span class="method-name">print_tickets</span><span class="method-args">()</span>
314
- </a>
315
- </div>
316
-
317
- <div class="method-description">
318
- <p><a class="source-toggle" href="#"
319
- onclick="toggleCode('M000003-source');return false;">[Source]</a></p>
320
- <div class="method-source-code" id="M000003-source">
256
+ onclick="toggleCode('M000004-source');return false;">[Source]</a></p>
257
+ <div class="method-source-code" id="M000004-source">
321
258
  <pre>
322
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 42</span>
323
- 42: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">print_tickets</span>
324
- 43: <span class="ruby-identifier">puts_title_line</span>
325
- 44: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">ticket</span><span class="ruby-operator">|</span>
326
- 45: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">ticket</span>.<span class="ruby-identifier">to_s</span>
327
- 46: <span class="ruby-keyword kw">end</span>
328
- 47: <span class="ruby-keyword kw">end</span>
259
+ <span class="ruby-comment cmt"># File lib/assembla.rb, line 86</span>
260
+ 86: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">print</span>(<span class="ruby-identifier">tickets</span>)
261
+ 87: <span class="ruby-identifier">puts_title_line</span>
262
+ 88: <span class="ruby-identifier">tickets</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">t</span><span class="ruby-operator">|</span> <span class="ruby-identifier">puts</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">to_s</span> }
263
+ 89: <span class="ruby-keyword kw">end</span>
329
264
  </pre>
330
265
  </div>
331
266
  </div>
@@ -349,45 +284,49 @@ in your Assembla space
349
284
  onclick="toggleCode('M000002-source');return false;">[Source]</a></p>
350
285
  <div class="method-source-code" id="M000002-source">
351
286
  <pre>
352
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 37</span>
353
- 37: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">tickets</span>
354
- 38: <span class="ruby-identifier">all</span> = <span class="ruby-constant">All</span>.<span class="ruby-identifier">new</span>
355
- 39: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span> = <span class="ruby-identifier">all</span>.<span class="ruby-identifier">evaluate</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">page</span>)
356
- 40: <span class="ruby-keyword kw">end</span>
287
+ <span class="ruby-comment cmt"># File lib/assembla.rb, line 39</span>
288
+ 39: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">tickets</span>
289
+ 40: <span class="ruby-identifier">all</span> = <span class="ruby-constant">All</span>.<span class="ruby-identifier">new</span>
290
+ 41: <span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">parsed</span> = <span class="ruby-identifier">all</span>.<span class="ruby-identifier">evaluate</span>(<span class="ruby-keyword kw">self</span>.<span class="ruby-identifier">page</span>)
291
+ 42: <span class="ruby-keyword kw">end</span>
357
292
  </pre>
358
293
  </div>
359
294
  </div>
360
295
  </div>
361
296
 
362
- <div id="method-M000009" class="method-detail">
363
- <a name="M000009"></a>
297
+ <div id="method-M000005" class="method-detail">
298
+ <a name="M000005"></a>
364
299
 
365
300
  <div class="method-heading">
366
- <a href="#M000009" class="method-signature">
367
- <span class="method-name">update_ticets_status</span><span class="method-args">(id, status)</span>
301
+ <a href="#M000005" class="method-signature">
302
+ <span class="method-name">update_tickets_status</span><span class="method-args">(id, status)</span>
368
303
  </a>
369
304
  </div>
370
305
 
371
306
  <div class="method-description">
372
307
  <p>
373
- Change ticket state
308
+ This method uses Assembla&#8216;s Ticket REST API <a
309
+ href="http://www.assembla.com/wiki/show/breakoutdocs/Ticket_REST_API">www.assembla.com/wiki/show/breakoutdocs/Ticket_REST_API</a>
310
+ to change <a href="AssEmBlr.html#M000002">tickets</a> status. It returns
311
+ text of http response from Aseembla server.
374
312
  </p>
375
313
  <p><a class="source-toggle" href="#"
376
- onclick="toggleCode('M000009-source');return false;">[Source]</a></p>
377
- <div class="method-source-code" id="M000009-source">
314
+ onclick="toggleCode('M000005-source');return false;">[Source]</a></p>
315
+ <div class="method-source-code" id="M000005-source">
378
316
  <pre>
379
- <span class="ruby-comment cmt"># File lib/assembla.rb, line 77</span>
380
- 77: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">update_ticets_status</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">status</span>)
381
- 78: <span class="ruby-identifier">sess</span> = <span class="ruby-constant">Patron</span><span class="ruby-operator">::</span><span class="ruby-constant">Session</span>.<span class="ruby-identifier">new</span>
382
- 79: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">username</span> = <span class="ruby-ivar">@user</span>
383
- 80: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">password</span> = <span class="ruby-ivar">@password</span>
384
- 81: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">timeout</span> = <span class="ruby-value">10</span>
385
- 82: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">base_url</span> = <span class="ruby-ivar">@url</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/https/</span>, <span class="ruby-value str">&quot;http&quot;</span>)
386
- 83: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">headers</span>[<span class="ruby-value str">'Accept'</span>] = <span class="ruby-value str">'application/xml'</span>
387
- 84: <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">headers</span>[<span class="ruby-value str">'Content-Type'</span>] = <span class="ruby-value str">'application/xml'</span>
388
- 85: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">sess</span>.<span class="ruby-identifier">put</span>(<span class="ruby-node">&quot;/#{id}&quot;</span>, <span class="ruby-node">&quot;&lt;ticket&gt;&lt;status type='integer'&gt;#{status}&lt;/status&gt;&lt;/ticket&gt;&quot;</span>)
389
- 86: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">body</span>
390
- 87: <span class="ruby-keyword kw">end</span>
317
+ <span class="ruby-comment cmt"># File lib/assembla.rb, line 115</span>
318
+ 115: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">update_tickets_status</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">status</span>)
319
+ 116: <span class="ruby-identifier">status_number</span> = <span class="ruby-identifier">get_id_from_status</span>(<span class="ruby-identifier">status</span>)
320
+ 117: <span class="ruby-identifier">space</span> = <span class="ruby-ivar">@url</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/https:\/\/www\.assembla.com(.+)/</span>, <span class="ruby-value str">'\1'</span>)
321
+ 118: <span class="ruby-identifier">url</span> = <span class="ruby-identifier">space</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'/'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">id</span>.<span class="ruby-identifier">to_s</span>
322
+ 119: <span class="ruby-identifier">request</span> = <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span><span class="ruby-operator">::</span><span class="ruby-constant">Put</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">url</span>, <span class="ruby-identifier">initheader</span> = {<span class="ruby-value str">'Content-Type'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'application/xml'</span>, <span class="ruby-value str">'Accept'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'application/xml'</span>})
323
+ 120: <span class="ruby-identifier">request</span>.<span class="ruby-identifier">body</span> = <span class="ruby-node">&quot;&lt;ticket&gt;&lt;status type='integer'&gt;#{status_number}&lt;/status&gt;&lt;/ticket&gt;&quot;</span>
324
+ 121: <span class="ruby-identifier">request</span>.<span class="ruby-identifier">basic_auth</span> <span class="ruby-ivar">@user</span>, <span class="ruby-ivar">@password</span>
325
+ 122: <span class="ruby-constant">Net</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP</span>.<span class="ruby-identifier">start</span>(<span class="ruby-value str">&quot;www.assembla.com&quot;</span>, <span class="ruby-value">80</span> ) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">http</span><span class="ruby-operator">|</span>
326
+ 123: <span class="ruby-identifier">response</span> = <span class="ruby-identifier">http</span>.<span class="ruby-identifier">request</span>(<span class="ruby-identifier">request</span>)
327
+ 124: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">response</span>
328
+ 125: <span class="ruby-keyword kw">end</span>
329
+ 126: <span class="ruby-keyword kw">end</span>
391
330
  </pre>
392
331
  </div>
393
332
  </div>
data/rdoc/created.rid CHANGED
@@ -1 +1 @@
1
- Sat, 13 Feb 2010 13:25:17 +0100
1
+ Mon, 15 Mar 2010 19:24:30 +0100
@@ -56,7 +56,7 @@
56
56
  </tr>
57
57
  <tr class="top-aligned-row">
58
58
  <td><strong>Last Update:</strong></td>
59
- <td>Sat Feb 13 12:50:35 +0100 2010</td>
59
+ <td>Mon Mar 15 19:18:21 +0100 2010</td>
60
60
  </tr>
61
61
  </table>
62
62
  </div>
@@ -71,8 +71,7 @@
71
71
  <div id="description">
72
72
  <p>
73
73
  This program allows you to use command line to perform your typical
74
- assembla.com tasks. USing it you can check for new tickets, change status,
75
- reasign them or create new ones
74
+ assembla.com tasks.
76
75
  </p>
77
76
  <table>
78
77
  <tr><td valign="top">Author:</td><td>Ignacy Moryc (<a href="mailto:imoryc@gmail.com">imoryc@gmail.com</a>)
@@ -82,9 +81,6 @@ reasign them or create new ones
82
81
 
83
82
  </td></tr>
84
83
  </table>
85
- <p>
86
- This is the main program class
87
- </p>
88
84
 
89
85
  </div>
90
86
 
@@ -96,7 +92,6 @@ This is the main program class
96
92
  net/http&nbsp;&nbsp;
97
93
  rubygems&nbsp;&nbsp;
98
94
  hpricot&nbsp;&nbsp;
99
- patron&nbsp;&nbsp;
100
95
  </div>
101
96
  </div>
102
97
 
@@ -20,15 +20,11 @@
20
20
  <div id="index">
21
21
  <h1 class="section-bar">Methods</h1>
22
22
  <div id="index-entries">
23
- <a href="classes/AssEmBlr.html#M000004">find_assigned_to (AssEmBlr)</a><br />
24
- <a href="classes/AssEmBlr.html#M000008">find_id (AssEmBlr)</a><br />
25
- <a href="classes/AssEmBlr.html#M000005">find_my_active_tickets (AssEmBlr)</a><br />
26
- <a href="classes/AssEmBlr.html#M000006">find_with_status (AssEmBlr)</a><br />
23
+ <a href="classes/AssEmBlr.html#M000003">find (AssEmBlr)</a><br />
27
24
  <a href="classes/AssEmBlr.html#M000001">new (AssEmBlr)</a><br />
28
- <a href="classes/AssEmBlr.html#M000007">print (AssEmBlr)</a><br />
29
- <a href="classes/AssEmBlr.html#M000003">print_tickets (AssEmBlr)</a><br />
25
+ <a href="classes/AssEmBlr.html#M000004">print (AssEmBlr)</a><br />
30
26
  <a href="classes/AssEmBlr.html#M000002">tickets (AssEmBlr)</a><br />
31
- <a href="classes/AssEmBlr.html#M000009">update_ticets_status (AssEmBlr)</a><br />
27
+ <a href="classes/AssEmBlr.html#M000005">update_tickets_status (AssEmBlr)</a><br />
32
28
  </div>
33
29
  </div>
34
30
  </body>
@@ -15,22 +15,49 @@ describe AssEmBlr do
15
15
  end
16
16
  end
17
17
 
18
- context "filterind tickets" do
19
- it "should filter tickets by assigned user" do
20
- mine = @assem.find_assigned_to("Above & Beyond")
18
+ it "should find status number code properly" do
19
+ @assem.send(:get_id_from_status, "Fixed").should eql(3)
20
+ @assem.send(:get_id_from_status, "Invalid").should eql(2)
21
+ end
22
+
23
+ context "searching for tickets" do
24
+ it "should use 'Assiged To' filter" do
25
+ mine = @assem.find({:assigned_to => "Above & Beyond"})
21
26
  mine.length.should eql(2)
22
27
  end
23
-
24
- #TODO find_id should return only one element
28
+
25
29
  it "should filter tickets by id" do
26
- with_id = @assem.find_id(841)
27
- with_id.first.summary.should match /Fix tab order/
30
+ with_id = @assem.find({:id => 841})
31
+ with_id.summary.should match /Fix tab order/
28
32
  end
29
33
 
30
34
  it "should filter tickets by status" do
31
- test = @assem.find_with_status("Test")
35
+ test = @assem.find({:status => "Test"})
32
36
  test.length.should eql(2)
33
37
  end
34
-
38
+
39
+ it "should filter tickets by summary text" do
40
+ se = @assem.find({:summary => "else"})
41
+ se.first.summary.should match /Somethign else/
42
+ end
43
+
44
+ context "with multiple filters " do
45
+ # see => find_assigned_or_with_status description
46
+ # it "should filter tickets with status or assigned user" do
47
+ # a = @assem.find_assigned_or_with_status("Armin Van B", "Test")
48
+ # a.count.should eql(5)
49
+ # end
50
+
51
+ it "should filter tickets with status and assigned user" do
52
+ a = @assem.find_assigned_and_with_status("Armin Van B", "Test")
53
+ a.count.should eql(1)
54
+ end
55
+
56
+ it "should find tickets with status AND assigned user" do
57
+ a = @assem.find({:assigned_to => "Armin Van B", :status => "Test"})
58
+ a.count.should eql(1)
59
+ end
60
+
61
+ end
35
62
  end
36
63
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: assembla
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.3
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacy Moryc
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-14 00:00:00 +01:00
12
+ date: 2010-03-15 00:00:00 +01:00
13
13
  default_executable: ass
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -35,6 +35,7 @@ files:
35
35
  - README.textile
36
36
  - Rakefile
37
37
  - VERSION
38
+ - a2smbla-0.3.0.gem
38
39
  - assembla.gemspec
39
40
  - bin/ass
40
41
  - config_default.yml