trac4r 1.1.0 → 1.2.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/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ pkg
3
+ coverage
4
+ html
5
+ api.yaml
data/LICENCE ADDED
@@ -0,0 +1,42 @@
1
+ Copyright (c) 2008 Niklas E. Cathor <niklas@brueckenschlaeger.de>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a
4
+ copy of this software and associated documentation files (the "Software"),
5
+ to deal in the Software without restriction, including without limitation
6
+ the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
+ and/or sell copies of the Software, and to permit persons to whom the
8
+ Software is furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
20
+
21
+
22
+
23
+
24
+ Copyright (c) 2008 Niklas E. Cathor <niklas@brueckenschlaeger.de>
25
+
26
+ Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software und
27
+ der zugeh�rigen Dokumentationen (die "Software") erh�lt, die Erlaubnis
28
+ erteilt, uneingeschr�nkt zu benutzen, inklusive und ohne au�nahme, dem
29
+ Recht, sie zu verwenden, kopieren, �ndern, fusionieren, verlegen, verbreiten,
30
+ unterlizenzieren und/oder zu verkaufen, und Personen, die diese Software
31
+ erhalten, diese Rechte zu geben, unter den folgenden Bedingungen:
32
+
33
+ Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in alle
34
+ Kopien oder Teilkopien der Software beizulegen.
35
+
36
+ DIE SOFTWARE WIRD OHNE JEDE AUSDR�CKLICHE ODER IMPLIZIERTE GARANTIE BEREITGE-
37
+ STELLT, EINSCHIESSLICH DER GARANTIE ZUR BENUTZUNG F�R DEN VORGESEHENEN ODER
38
+ EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER RECHTSVERLETZUNG, JEDOCH NICHT DARAUF
39
+ BESCHR�NKT. IN KEINEM FALL SIND DIE AUTOREN ODER COPYRIGHTINHABER F�R
40
+ JEGLICHEN SCHADEN ODER SONSTIGE ANSPRUCH HAFTBAR ZU MACHEN, OB INFOLGE DER
41
+ ERF�LLUNG VON EINEM VERTRAG, EINEM DELIKT ODER ANDERS IM ZUSAMMENHANG MIT
42
+ DER BENUTZUNG ODER SONSTIGE VERWENDUNG DER SOFTWARE ENTSTANDEN.
data/README.rdoc CHANGED
@@ -2,6 +2,7 @@ trac4r: Ruby wrapper for the Trac XML-RPC API
2
2
  =============================================
3
3
 
4
4
  Author:: Niklas Cathor
5
+ Author:: David Copeland
5
6
  License:: See LICENSE in source distribution
6
7
 
7
8
  For more information on the Trac XML-RPC see the {plugin's page on trac-hacks.com}[http://trac-hacks.org/wiki/XmlRpcPlugin#UsingfromRuby]
@@ -29,6 +30,21 @@ This wraps the Trac XML-RPC plugin.
29
30
  trac.tickets.list # get all tickets
30
31
  trac.tickets.get 2334 # Get ticket #2334
31
32
 
33
+ === Tickets
34
+
35
+ Trac's backbone is tickets. The Tickets class contains many useful methods, but can also run arbitrary queries against Trac using
36
+ a more Rubyesque syntax:
37
+
38
+ # Gets all tickets in the "Web" component with a status of either "assigned"
39
+ # "accepted", or "new"
40
+ available_web_tickets = trac.tickets.query(:component => 'Web', :status => [:assigned,:accepted,:new])
41
+
42
+ # Ticktes that are not closed
43
+ unclosed_tickets = trac.tickets.query(:status => "!closed")
44
+
45
+ # This is a bit wierd, the "!" in the first element means "none of these values"
46
+ not_closed_nor_testing = trac.tickets.query(:status => ["!closed","test"])
47
+
32
48
  == More Info
33
49
 
34
50
  * {RDoc}[http://davetron5000.github.com/trac4r]
data/Rakefile ADDED
@@ -0,0 +1,47 @@
1
+ require 'rake/clean'
2
+ require 'hanna/rdoctask'
3
+ require 'rubygems'
4
+ require 'rake/gempackagetask'
5
+
6
+ $: << '../grancher/lib'
7
+ begin
8
+ require 'grancher/task'
9
+ Grancher::Task.new do |g|
10
+ g.branch = 'gh-pages'
11
+ g.push_to = 'origin'
12
+ g.directory 'html'
13
+ end
14
+ rescue LoadError
15
+ #puts "you may install the optional gem 'grancher'"
16
+ end
17
+
18
+ begin
19
+ require 'jeweler'
20
+ Jeweler::Tasks.new do |s|
21
+ s.name = "trac4r"
22
+ s.executables = "trac"
23
+ s.summary = 'Ruby Client Library for Trac'
24
+ s.email = "davidcopeland@naildrivin5.com"
25
+ s.description = 'Basic ruby client library and command line interface for accessing Trac instances via its XML RPC API'
26
+ s.authors = ['Niklas Cathro','David Copeland']
27
+ s.add_dependency('rainbow', '>= 1.0.4')
28
+ s.add_dependency('gli', '>= 1.1.0')
29
+ s.has_rdoc = true
30
+ s.extra_rdoc_files = ['README.rdoc']
31
+ s.rdoc_options << '--title' << 'trac4r Trac Ruby Client' << '--main' << 'README.rdoc' << '-ri'
32
+ s.require_paths << 'lib'
33
+ end
34
+ Jeweler::GemcutterTasks.new
35
+ rescue LoadError
36
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
37
+ end
38
+
39
+ Rake::RDocTask.new do |rd|
40
+ rd.main = "README.rdoc"
41
+ rd.rdoc_files.include("README.rdoc","lib/**/*.rb","bin/**/*")
42
+ rd.title = 'Ruby interface to Trac'
43
+ end
44
+
45
+ task :default => :test
46
+
47
+ task :publish_rdoc => [:rdoc,:publish]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.2.1
data/bin/trac ADDED
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/ruby
2
+ $: << File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+ require 'rubygems'
4
+ require 'gli'
5
+ require 'trac4r'
6
+ require 'rainbow'
7
+ require 'cgi'
8
+
9
+ include GLI
10
+
11
+ OPENER_DEFAULT = RUBY_PLATFORM =~ /darwin/ ? 'open' : nil
12
+ begin
13
+ # TODO: Figure out a better way to do this
14
+ cols = `stty -a | grep "columns;" | head -1`.split(/;/)
15
+ COLUMNS_DEFAULT = cols[2].gsub(' columns','')
16
+ rescue
17
+ COLUMNS_DEFAULT = nil
18
+ end
19
+
20
+ config_file '.trac4r'
21
+
22
+ desc 'Command to use to open URLs'
23
+ default_value OPENER_DEFAULT
24
+ flag [:o,:open]
25
+
26
+ desc 'URL to trac'
27
+ flag [:url]
28
+
29
+ desc 'Your username'
30
+ flag [:u,:user]
31
+
32
+ desc 'Your password'
33
+ flag [:p,:password]
34
+
35
+ desc 'Do not format output'
36
+ long_desc 'By default, the output is formatted fo readability in the terminal. By disabling this, the output is more "machine readable" and parsable by other scripts'
37
+ switch [:noformat]
38
+
39
+ desc 'number of columns for formatting'
40
+ default_value COLUMNS_DEFAULT
41
+ flag [:cols]
42
+
43
+ desc 'Open the ticket or wiki page'
44
+ arg_name 'the id of the ticket or name of wiki page'
45
+ command :open do |c|
46
+ c.action do |global_options,options,args|
47
+ raise "You must supply a ticket ID or WikiName" if args.empty?
48
+ id = args[0]
49
+ if id =~ /^\d+$/
50
+ system "#{global_options[:o]} #{$url}/ticket/#{id}"
51
+ else
52
+ system "#{global_options[:o]} #{$url}/wiki/#{args.map{ |x| x[0..0].upcase + x[1..-1]}.join('')}"
53
+ end
54
+ end
55
+ end
56
+
57
+ desc 'Go to the new ticket web interface'
58
+ long_desc 'Navigates your browser to the web interface, initialized with the values you provide, but does not actually create the ticket'
59
+ arg_name 'summary for the ticket'
60
+ command [:newticket] do |c|
61
+ c.desc 'component'
62
+ c.flag [:c,:component]
63
+
64
+ c.desc 'type'
65
+ c.flag [:t,:type]
66
+
67
+ c.desc 'priority'
68
+ c.flag [:p,:priority]
69
+
70
+ c.action do |global_options,options,args|
71
+ query_params = {}
72
+ query_params['priority'] = options[:p] if options[:p]
73
+ query_params['component'] = options[:c] if options[:c]
74
+ query_params['type'] = options[:t] if options[:t]
75
+ query_params['summary'] = args.join(' ')
76
+ query_string = ''
77
+ query_params.each do |key,value|
78
+ query_string += key
79
+ query_string += '='
80
+ query_string += CGI.escape(value)
81
+ query_string += '&'
82
+ end
83
+
84
+ url = $url.gsub(/\/xmlrpc/,'') + '/newticket?' + query_string
85
+ system "#{global_options[:o]} \"#{url}\""
86
+ end
87
+ end
88
+
89
+ FORMATTING = {
90
+ 'id' => { :color => :green, :size => 6 },
91
+ 'status' => { :color => :cyan, :size => 9 },
92
+ 'owner' => { :size => 17 },
93
+ 'component' => { :size => 10, :color => :magenta },
94
+ 'milestone' => { :size => 28, :color => :cyan },
95
+ }
96
+ desc 'Lists tickets'
97
+ arg_name 'ticket ids (blank for all)'
98
+ command [:tickets,:ls] do |c|
99
+ c.desc 'Show tickets accepted'
100
+ c.switch [:a,:accepted]
101
+
102
+ c.desc 'Component'
103
+ c.flag [:c,:component]
104
+
105
+ c.desc 'Show full description'
106
+ c.switch [:l,:description]
107
+
108
+ c.desc 'Arbitrary query (flags are included, too)'
109
+ c.flag [:q,:query]
110
+
111
+ c.desc 'Owner ("ME" for the -u user)'
112
+ c.flag [:o,:owner]
113
+
114
+ c.desc 'Columns to show'
115
+ c.long_desc 'comma-delimited list of the column names from the tickets to show in the output'
116
+ c.flag [:columns]
117
+
118
+ c.action do |global_options,options,args|
119
+ opts = {}
120
+
121
+ if options[:q]
122
+ raise "bad query" if options[:q] =~ /\}/
123
+ opts = instance_eval('{' + options[:q] + '}')
124
+ else
125
+ opts[:owner] = options[:o]
126
+ opts[:owner] = global_options[:u] if options[:o] == "ME"
127
+ if options[:a]
128
+ opts[:status] = :accepted
129
+ else
130
+ opts[:status] = ["!closed","testing"]
131
+ end
132
+ opts[:component] = options[:c] if options[:c]
133
+ end
134
+ ids = args
135
+ ids = $trac.tickets.query(opts) if ids.empty?
136
+ tickets = ids.map{ |id| $trac.tickets.get(id) }
137
+ tickets.sort{ |a,b| a.summary.downcase <=> b.summary.downcase }.each do |ticket|
138
+ if global_options[:noformat]
139
+ puts [ticket.id,ticket.status,ticket.owner,ticket.summary].join("\t")
140
+ else
141
+ columns = options[:columns]
142
+ columns = 'id,status,owner,summary' if !columns
143
+ columns = columns.split(/,/)
144
+ printf_string = ""
145
+ padding = 0
146
+ args = []
147
+ columns.each do |col|
148
+ if col != 'summary'
149
+ size = FORMATTING[col] && FORMATTING[col][:size]
150
+ size = 10 if !size
151
+ padding += size == "" ? 3 : (size.to_i + 3)
152
+ size += 9 if size && FORMATTING[col] && FORMATTING[col][:color]
153
+ printf_string += "%#{size}s - "
154
+ if FORMATTING[col] && FORMATTING[col][:color]
155
+ args << ticket.send(col.to_sym).to_s.color(FORMATTING[col][:color])
156
+ else
157
+ args << ticket.send(col.to_sym).to_s
158
+ end
159
+ end
160
+ end
161
+ printf_string.gsub!(/ - $/,'')
162
+ if columns.include? 'summary'
163
+ args << wrap(ticket.summary,padding+1,global_options[:cols])
164
+ printf_string += " - %s"
165
+ end
166
+ printf("#{printf_string}\n",*args)
167
+ end
168
+ if (options[:l])
169
+ description = ticket.description
170
+ if !global_options[:noformat]
171
+ description = bold(description)
172
+ description = italic(description)
173
+ description = code(description)
174
+ end
175
+ puts
176
+ puts "#{description}"
177
+ puts "----"
178
+ end
179
+ end
180
+ end
181
+ end
182
+
183
+ # Not sure about this
184
+ def wrap(string,indent,cols)
185
+ cols_left = cols.to_i - indent
186
+ raise "Your terminal is too small for formatting" if (cols_left < 5)
187
+ return_me = ""
188
+ line = ""
189
+ prev_word = ""
190
+ string.split(/\s/).each do |word|
191
+ if line.length <= cols_left
192
+ line += " #{word}" if line != ""
193
+ line += "#{word}" if line == ""
194
+ prev_word = word
195
+ else
196
+ line.gsub!(/#{prev_word}$/,'')
197
+ return_me += line.underline + "\n"
198
+ indent.times { return_me += " " }
199
+ line = prev_word
200
+ end
201
+ end
202
+ if (line.length > cols_left)
203
+ line.gsub!(/#{prev_word}$/,'')
204
+ return_me += line.underline + "\n"
205
+ indent.times { return_me += " " }
206
+ line = prev_word
207
+ end
208
+ return_me += line.underline
209
+ return_me.gsub(/^\s/,'')
210
+ end
211
+
212
+ def bold(string)
213
+ desc = string.split("'''")
214
+ description = ""
215
+ bold = false
216
+ desc.each do |part|
217
+ description << part.bright.foreground(:cyan) if bold
218
+ description << part.reset if !bold
219
+ bold = !bold
220
+ end
221
+ description
222
+ end
223
+
224
+ def italic(string)
225
+ desc = string.split("''")
226
+ description = ""
227
+ bold = false
228
+ desc.each do |part|
229
+ description << part.italic.foreground(:magenta) if bold
230
+ description << part.reset if !bold
231
+ bold = !bold
232
+ end
233
+ description
234
+ end
235
+
236
+ def code(string)
237
+ desc = string.split("`")
238
+ description = ""
239
+ bold = false
240
+ desc.each do |part|
241
+ description << part.bright.foreground(:green) if bold
242
+ description << part.reset if !bold
243
+ bold = !bold
244
+ end
245
+ in_code = false
246
+ coded = ''
247
+ description.split(/\n/).each do |line|
248
+ ignore = false
249
+ if line =~ /^\{\{\{\s*$/
250
+ in_code = true
251
+ ignore = true
252
+ elsif line =~ /^\}\}\}/
253
+ in_code = false
254
+ ignore = true
255
+ end
256
+ if !ignore
257
+ if in_code
258
+ coded += line.bright.foreground(:green)
259
+ else
260
+ coded += line
261
+ end
262
+ end
263
+ coded += "\n"
264
+ end
265
+ coded
266
+ end
267
+
268
+ pre do |global,command,options,args|
269
+ if command.nil? || command.name == :help
270
+ # not creating a trac instance
271
+ else
272
+ $url = global[:url]
273
+ raise "You must specify a URL" if $url.nil?
274
+ $trac = Trac.new($url,global[:u],global[:p])
275
+ end
276
+ true
277
+ end
278
+
279
+ post do |global,command,options,args|
280
+ # Post logic here
281
+ end
282
+
283
+ on_error do |exception|
284
+ # Error logic here
285
+ # return false to skip default error handling
286
+ true
287
+ end
288
+
289
+ GLI.run(ARGV)
data/lib/trac4r/error.rb CHANGED
@@ -8,22 +8,28 @@ module Trac
8
8
  # [+path+] the path to the Trac API
9
9
  # [+method+] the XML RPC method being called
10
10
  # [+args+] the args (as an array) that were sent with the call
11
- def initialize(http_error,host,port,path,method,args)
12
- http_error = http_error.sub 'HTTP-Error: ',''
13
- if http_error =~ /\n/
14
- http_error.split(/\n/).each do |line|
11
+ # [+exception+] the exception that was caught
12
+ def initialize(http_error,host,port,path,method,args,exception)
13
+ if (http_error =~ /HTTP-Error: /)
14
+ http_error = http_error.sub 'HTTP-Error: ',''
15
+ if http_error =~ /\n/
16
+ http_error.split(/\n/).each do |line|
15
17
  if line =~ /^\d\d\d/
16
18
  http_error = line
17
19
  break
18
20
  end
21
+ end
19
22
  end
23
+ @http_status,@http_message = http_error.split(/\s+/,2)
24
+ else
25
+ @http_message = http_error
20
26
  end
21
- @http_status,@http_message = http_error.split(/\s+/,2)
22
27
  @host = host
23
28
  @port = port
24
29
  @path = path
25
30
  @method = method
26
31
  @args = args
32
+ @exception = exception
27
33
  end
28
34
 
29
35
  # Gives a more useful message for common problems
@@ -32,8 +38,10 @@ module Trac
32
38
  "Couldn't find Trac API at #{url}, check your configuration"
33
39
  elsif @http_status == '401'
34
40
  "Your username/password didn't authenticate, check your configuration"
41
+ elsif @http_status
42
+ "#{@http_message} (#{@http_status}) when trying URL #{url} and method #{@method}(#{@args.join('.')})"
35
43
  else
36
- "#{@http_message} (#{@http_status}) when trying URL http://#{@host}:#{@port}#{@path} and method #{@command}(#{@args.join('.')})"
44
+ "#{@http_message} when trying URL #{url} and method #{@method}(#{@args.join('.')})"
37
45
  end
38
46
  end
39
47
 
data/lib/trac4r/query.rb CHANGED
@@ -50,11 +50,7 @@ module Trac
50
50
  begin
51
51
  return @connection.call(command,*args)
52
52
  rescue => e
53
- if e.message =~ /HTTP-Error/
54
- raise TracException.new(e.message,@host,@port,@path,command,args)
55
- else
56
- raise
57
- end
53
+ raise TracException.new(e.message,@host,@port,@path,command,args,e)
58
54
  end
59
55
  end
60
56
  end
data/lib/trac4r/ticket.rb CHANGED
@@ -36,10 +36,17 @@ module Trac
36
36
  # we return its value. e.g. if our tickets have a custom field
37
37
  # called +work_units+, then +some_ticket.work_units+ will
38
38
  # retrieve that value. This currently only allows retrieval and
39
- # not updating the value.
39
+ # not updating the value. Also note that you can retrieve a custom
40
+ # field using "!" and this will silently return nil if the instance
41
+ # variable didn't exist. This is useful if some tickets just don't
42
+ # have the custom field, but you don't wish to check for it
40
43
  def method_missing(sym,*args)
44
+ method = sym.to_s
45
+ method = method[0..-2] if method =~ /!$/
41
46
  if args.size == 0 && instance_variables.include?("@" + sym.to_s)
42
47
  instance_eval("@" + sym.to_s)
48
+ elsif method != sym.to_s
49
+ nil
43
50
  else
44
51
  super.method_missing(sym,args)
45
52
  end
@@ -34,15 +34,25 @@ module Trac
34
34
  # list :include_closed => false
35
35
  # to only get open tickets.
36
36
  def list options={ }
37
- include_closed = options[:include_closed] || true
38
- tickets = @trac.query("ticket.query","status!=closed")
39
- tickets += @trac.query("ticket.query","status=closed") if include_closed
37
+ include_closed = true
38
+ include_closed = options[:include_closed] if !options[:include_closed].nil?
39
+ tickets = query(:status => "!closed")
40
+ tickets += query(:status => "closed") if include_closed
40
41
  return tickets
41
42
  end
42
-
43
+
44
+ # Run an arbitrary ticket query
45
+ # [+args+] a hash of options, each should use a symbol or string
46
+ # as the key and a symbol/string or array of symbols/strings as the value. If the
47
+ # value starts with a +!+, it will be treated as a not equal.
48
+ # Multiple values mean "or", as in any value may match
49
+ def query(args)
50
+ @trac.query("ticket.query",args_to_trac_args(args))
51
+ end
52
+
43
53
  # like `list', but only gets closed tickets
44
54
  def list_closed
45
- @trac.query("ticket.query","status=closed")
55
+ query(:status => "closed")
46
56
  end
47
57
 
48
58
  # returns all tickets (not just the ids) in a hash
@@ -155,5 +165,17 @@ module Trac
155
165
  end
156
166
  return @settings
157
167
  end
168
+
169
+ private
170
+
171
+ def args_to_trac_args(args)
172
+ trac_args = []
173
+ args.each do |key,value|
174
+ value = [value].flatten.map{ |x| x.to_s }.join('|')
175
+ trac_args << key.to_s + (value =~ /^!/ ? "!=#{value[1..-1]}" : "=#{value}")
176
+ end
177
+ trac_args.join('&')
178
+ end
179
+
158
180
  end
159
181
  end
data/lib/trac4r/wiki.rb CHANGED
@@ -44,6 +44,11 @@ module Trac
44
44
  @trac.query('wiki.getPageHTML',name)
45
45
  end
46
46
 
47
+ # returns a whole page in HTML
48
+ def get_info name
49
+ @trac.query('wiki.getPageInfo',name)
50
+ end
51
+
47
52
  # returns a whole page in raw format
48
53
  def get_raw name
49
54
  @trac.query('wiki.getPage',name)
data/lib/trac4r.rb CHANGED
@@ -64,13 +64,19 @@ module Trac
64
64
  def initialize url,user,pass
65
65
  @user = user
66
66
  @pass = pass
67
- if url.split('/').last != 'xmlrpc'
68
- url = url+'/xmlrpc'
67
+ @url = url
68
+ @url.gsub!(/\/$/,'')
69
+ if @url.split('/').last != 'xmlrpc'
70
+ @url = url+'/xmlrpc'
69
71
  end
70
- @connection = Query.new(url,user,pass)
72
+ @connection = Query.new(@url,@user,@pass)
71
73
  @wiki = Wiki.new(@connection)
72
74
  @tickets = Tickets.new(@connection)
73
75
  end
76
+
77
+ def query(command,*args)
78
+ @connection.query(command,*args)
79
+ end
74
80
 
75
81
  def api_version
76
82
  @connection.query("system.getAPIVersion")
metadata CHANGED
@@ -1,40 +1,66 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trac4r
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Niklas Cathro
8
+ - David Copeland
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-12-20 00:00:00 -05:00
13
- default_executable:
14
- dependencies: []
15
-
16
- description: Basic ruby client library for accessing Trac instances via its XML RPC API
17
- email:
18
- executables: []
19
-
13
+ date: 2010-01-03 00:00:00 -05:00
14
+ default_executable: trac
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rainbow
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 1.0.4
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: gli
28
+ type: :runtime
29
+ version_requirement:
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.1.0
35
+ version:
36
+ description: Basic ruby client library and command line interface for accessing Trac instances via its XML RPC API
37
+ email: davidcopeland@naildrivin5.com
38
+ executables:
39
+ - trac
20
40
  extensions: []
21
41
 
22
42
  extra_rdoc_files:
23
43
  - README.rdoc
24
44
  files:
45
+ - .gitignore
46
+ - LICENCE
47
+ - README.rdoc
48
+ - Rakefile
49
+ - VERSION
50
+ - bin/trac
51
+ - lib/trac4r.rb
25
52
  - lib/trac4r/error.rb
26
53
  - lib/trac4r/query.rb
27
54
  - lib/trac4r/ticket.rb
28
55
  - lib/trac4r/tickets.rb
29
56
  - lib/trac4r/wiki.rb
30
- - lib/trac4r.rb
31
- - README.rdoc
32
57
  has_rdoc: true
33
- homepage: http://github.com/csexton/trac4r/
58
+ homepage:
34
59
  licenses: []
35
60
 
36
61
  post_install_message:
37
62
  rdoc_options:
63
+ - --charset=UTF-8
38
64
  - --title
39
65
  - trac4r Trac Ruby Client
40
66
  - --main
@@ -43,6 +69,7 @@ rdoc_options:
43
69
  require_paths:
44
70
  - lib
45
71
  - lib
72
+ - lib
46
73
  required_ruby_version: !ruby/object:Gem::Requirement
47
74
  requirements:
48
75
  - - ">="
@@ -57,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
84
  version:
58
85
  requirements: []
59
86
 
60
- rubyforge_project: trac4r
87
+ rubyforge_project:
61
88
  rubygems_version: 1.3.5
62
89
  signing_key:
63
90
  specification_version: 3