ruby-bugzilla 0.1.1 → 0.2

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.
Files changed (3) hide show
  1. data/bin/bzconsole +82 -35
  2. data/lib/bugzilla.rb +5 -4
  3. metadata +4 -5
data/bin/bzconsole CHANGED
@@ -26,6 +26,7 @@ require 'yaml'
26
26
  require 'rubygems'
27
27
  require 'pp'
28
28
  require 'gruff'
29
+ require 'uri'
29
30
 
30
31
 
31
32
  $KCODE = 'u'
@@ -101,7 +102,7 @@ module BzConsole
101
102
  template = {
102
103
  "rhbz"=>{
103
104
  :Name=>"Red Hat Bugzilla",
104
- :URL=>"https://bugzilla.redhat.com/",
105
+ :URL=>"https://bugzilla.redhat.com",
105
106
  :User=>"account@example.com",
106
107
  :Password=>"blahblahblah",
107
108
  :ProductAliases=>{
@@ -114,19 +115,19 @@ module BzConsole
114
115
  },
115
116
  "gnbz"=>{
116
117
  :Name=>"GNOME Bugzilla",
117
- :URL=>"https://bugzilla.gnome.org/",
118
+ :URL=>"https://bugzilla.gnome.org",
118
119
  :User=>"account@example.com",
119
120
  :Password=>"blahblahblah",
120
121
  },
121
122
  "fdobz"=>{
122
123
  :Name=>"FreeDesktop Bugzilla",
123
- :URL=>"https://bugs.freedesktop.org/",
124
+ :URL=>"https://bugs.freedesktop.org",
124
125
  :User=>"account@example.com",
125
126
  :Password=>"blahblahblah",
126
127
  },
127
128
  "mzbz"=>{
128
129
  :Name=>"Mozilla Bugzilla",
129
- :URL=>"https://bugzilla.mozilla.org/",
130
+ :URL=>"https://bugzilla.mozilla.org",
130
131
  :User=>"account@example.com",
131
132
  :Password=>"blahblahblah",
132
133
  }
@@ -225,14 +226,16 @@ module BzConsole
225
226
  end
226
227
 
227
228
  info = conf[prefix]
228
- host = info[:URL].sub(/\Ahttps?:\/\//, '').sub(/\/\Z/, '')
229
- port = info[:URL] =~ /\Ahttps:/ ? 443 : 80
229
+ uri = URI.parse(info[:URL])
230
+ host = uri.host
231
+ port = uri.port
232
+ path = uri.path.empty? ? nil : uri.path
230
233
  login = opts[:command][:anonymous] == true ? nil : info[:User]
231
234
  pass = opts[:command][:anonymous] == true ? nil : info[:Password]
232
235
 
233
236
  @plugin.run(:pre, host, :getbug, opts)
234
237
 
235
- xmlrpc = Bugzilla::XMLRPC.new(host, port)
238
+ xmlrpc = Bugzilla::XMLRPC.new(host, port, path)
236
239
  user = Bugzilla::User.new(xmlrpc)
237
240
  user.session(login, pass) do
238
241
  bug = Bugzilla::Bug.new(xmlrpc)
@@ -335,14 +338,16 @@ module BzConsole
335
338
  end
336
339
 
337
340
  info = conf[prefix]
338
- host = info[:URL].sub(/\Ahttps?:\/\//, '').sub(/\/\Z/, '')
339
- port = info[:URL] =~ /\Ahttps:/ ? 443 : 80
341
+ uri = URI.parse(info[:URL])
342
+ host = uri.host
343
+ port = uri.port
344
+ path = uri.path.empty? ? nil : uri.path
340
345
  login = opts[:command][:anonymous] == true ? nil : info[:User]
341
346
  pass = opts[:command][:anonymous] == true ? nil : info[:Password]
342
347
 
343
348
  @plugin.run(:pre, host, :search, opts[:command][:query])
344
349
 
345
- xmlrpc = Bugzilla::XMLRPC.new(host, port)
350
+ xmlrpc = Bugzilla::XMLRPC.new(host, port, path)
346
351
  user = Bugzilla::User.new(xmlrpc)
347
352
  user.session(login, pass) do
348
353
  bug = Bugzilla::Bug.new(xmlrpc)
@@ -378,6 +383,8 @@ module BzConsole
378
383
  parser.banner = sprintf("Usage: %s [global options] show [command options] <prefix> ...", File.basename(__FILE__))
379
384
  parser.separator ""
380
385
  parser.separator "Command options:"
386
+ parser.on('-f', '--field', 'Displays available field informations') {|v| opts[:show][:mode] = :field}
387
+ parser.on('--field-name=NAME', 'Displays NAME field information') {|v| opts[:show][:field] = v}
381
388
  parser.on('-p', '--product', 'Displays available product names') {|v| opts[:show][:mode] = :product}
382
389
  parser.on('-c', '--component', 'Displays available component names (default)') {|v| opts[:show][:mode] = :component}
383
390
  parser.on('--anonymous', 'Access to Bugzilla anonymously') {opts[:anonymous] = true}
@@ -407,28 +414,40 @@ module BzConsole
407
414
  end
408
415
 
409
416
  info = conf[prefix]
410
- host = info[:URL].sub(/\Ahttps?:\/\//, '').sub(/\/\Z/, '')
411
- port = info[:URL] =~ /\Ahttps:/ ? 443 : 80
417
+ uri = URI.parse(info[:URL])
418
+ host = uri.host
419
+ port = uri.port
420
+ path = uri.path.empty? ? nil : uri.path
412
421
  login = opts[:command][:anonymous] == true ? nil : info[:User]
413
422
  pass = opts[:command][:anonymous] == true ? nil : info[:Password]
414
423
 
415
424
  @plugin.run(:pre, host, :show, opts)
416
425
 
417
- xmlrpc = Bugzilla::XMLRPC.new(host, port)
426
+ xmlrpc = Bugzilla::XMLRPC.new(host, port, path)
418
427
  user = Bugzilla::User.new(xmlrpc)
419
428
  user.session(login, pass) do
420
- product = Bugzilla::Product.new(xmlrpc)
429
+ if opts[:command][:show][:mode] == :field then
430
+ bug = Bugzilla::Bug.new(xmlrpc)
421
431
 
422
- result = product.selectable_products
432
+ result = bug.fields(opts[:command][:show][:field])
423
433
 
424
- @plugin.run(:post, host, :show, result)
434
+ @plugin.run(:post, host, :show, result)
425
435
 
426
- products = result.keys.sort
427
- products.each do |p|
428
- if opts[:command][:show][:mode] == :product then
429
- yield p
430
- elsif opts[:command][:show][:mode] == :component then
431
- yield p, result[p][0].sort
436
+ pp result
437
+ else
438
+ product = Bugzilla::Product.new(xmlrpc)
439
+
440
+ result = product.selectable_products
441
+
442
+ @plugin.run(:post, host, :show, result)
443
+
444
+ products = result.keys.sort
445
+ products.each do |p|
446
+ if opts[:command][:show][:mode] == :product then
447
+ yield p
448
+ elsif opts[:command][:show][:mode] == :component then
449
+ yield p, result[p][0].sort
450
+ end
432
451
  end
433
452
  end
434
453
  end
@@ -449,6 +468,7 @@ module BzConsole
449
468
  opts[:metrics] = {}
450
469
  opts[:query] = {}
451
470
  opts[:metrics][:output] = 'bz-metrics.png'
471
+ opts[:metrics][:x_coordinate] = :monthly
452
472
 
453
473
  parser.banner = sprintf("Usage: %s [global options] metrics [command options] <prefix> ...", File.basename(__FILE__))
454
474
  parser.separator ""
@@ -474,6 +494,8 @@ module BzConsole
474
494
  parser.on('--end-date=DATE', 'generate the graph until the end of month of DATE.') {|v| x = Time.parse(v); opts[:metrics][:end_date] = Time.utc(x.year, x.month + 1, 1, 0, 0, 0) - 1}
475
495
  parser.on('-o', '--output=FILE', 'generate the graph to FILE') {|v| opts[:metrics][:output] = v}
476
496
  parser.on('--anonymous', 'access to Bugzilla anonymously') {|v| opts[:anonymous] = true}
497
+ parser.on('--weekly', 'genereate the graph with weekly X-coordinate') {|v| opts[:metrics][:x_coordinate] = :weekly}
498
+ parser.on('--monthly', 'genereate the graph with monthly X-coordinate (default)') {|v| opts[:metrics][:x_coordinate] = :monthly}
477
499
 
478
500
  super
479
501
  end # def parse
@@ -488,16 +510,23 @@ module BzConsole
488
510
  'CLOSED'=>[],
489
511
  'OPEN'=>[]
490
512
  }
513
+ last_label = nil
491
514
  real_do(argv, opts) do |t, new, assigned, modified, on_qa, closed, open|
492
515
  printf("%s, new: %d, assigned: %d, modified %d, on_qa %d, closed %d / open %d\n",
493
- t.strftime("%Y-%m"), new, assigned, modified, on_qa, closed, open)
516
+ opts[:command][:metrics][:x_coordinate] == :weekly ? sprintf("week %d", Date.new(t.year, t.month, t.day).cweek) : t.strftime("%Y-%m"), new, assigned, modified, on_qa, closed, open)
494
517
  data['NEW'] << new
495
518
  data['ASSIGNED'] << assigned
496
519
  data['MODIFIED'] << modified
497
520
  data['ON_QA'] << on_qa
498
521
  data['CLOSED'] << closed
499
522
  data['OPEN'] << open
500
- data[:label] << t.strftime("%Y/%m")
523
+ label = t.strftime("%Y/%m")
524
+ if last_label != label then
525
+ data[:label] << label
526
+ last_label = label
527
+ else
528
+ data[:label] << nil
529
+ end
501
530
  end
502
531
 
503
532
  timeline = data[:label]
@@ -505,7 +534,7 @@ module BzConsole
505
534
  def timeline.to_hash
506
535
  ret = {}
507
536
  (0..self.length-1).each do |i|
508
- ret[i] = self[i]
537
+ ret[i] = self[i] unless self[i].nil?
509
538
  end
510
539
  ret
511
540
  end # def timeline.to_hash
@@ -549,12 +578,14 @@ module BzConsole
549
578
  end
550
579
 
551
580
  info = conf[prefix]
552
- host = info[:URL].sub(/\Ahttps?:\/\//, '').sub(/\/\Z/, '')
553
- port = info[:URL] =~ /\Ahttps:/ ? 443 : 80
581
+ uri = URI.parse(info[:URL])
582
+ host = uri.host
583
+ port = uri.port
584
+ path = uri.path.empty? ? nil : uri.path
554
585
  login = opts[:command][:anonymous] == true ? nil : info[:User]
555
586
  pass = opts[:command][:anonymous] == true ? nil : info[:Password]
556
587
 
557
- xmlrpc = Bugzilla::XMLRPC.new(host, port)
588
+ xmlrpc = Bugzilla::XMLRPC.new(host, port, path)
558
589
  user = Bugzilla::User.new(xmlrpc)
559
590
  user.session(login, pass) do
560
591
  bug = Bugzilla::Bug.new(xmlrpc)
@@ -563,13 +594,22 @@ module BzConsole
563
594
 
564
595
  ts = opts[:command][:metrics][:begin_date] || Time.utc(Time.new.year, 1, 1)
565
596
  te = opts[:command][:metrics][:end_date] || Time.utc(Time.new.year+1, 1, 1) - 1
597
+ if opts[:command][:metrics][:x_coordinate] == :weekly then
598
+ # align to the week
599
+ d = Date.new(ts.year, ts.month, ts.day)
600
+ ds = Date.commercial(d.year, d.cweek, 1)
601
+ d = Date.new(te.year, te.month, te.day)
602
+ de = Date.commercial(d.year, d.cweek, 7)
603
+ ts = Time.utc(ds.year, ds.month, ds.day)
604
+ te = Time.utc(de.year, de.month, de.day)
605
+ end
566
606
 
567
607
  searchopts = opts[:command][:query].clone
568
608
 
569
609
  @plugin.run(:pre, host, :metrics, searchopts, opts[:metrics])
570
610
 
571
611
  if searchopts == opts[:command][:query] then
572
- raise NoMethodError, "No method to deal with the query monthly"
612
+ raise NoMethodError, "No method to deal with the query"
573
613
  end
574
614
 
575
615
  while ts < te do
@@ -577,7 +617,14 @@ module BzConsole
577
617
 
578
618
  # don't rely on the status to deal with NEW bugs.
579
619
  # unable to estimate the case bugs closed quickly
580
- searchopts[:creation_time] = [ts, Time.utc(ts.year, ts.month + 1, 1) - 1]
620
+ if opts[:command][:metrics][:x_coordinate] == :weekly then
621
+ d = Date.new(ts.year, ts.month, ts.day)
622
+ de = Date.commercial(d.year, d.cweek, 7)
623
+ drange = [ts, Time.utc(de.year, de.month, de.day, 23, 59, 59)]
624
+ else
625
+ drange = [ts, Time.utc(ts.year, ts.month + 1, 1) - 1]
626
+ end
627
+ searchopts[:creation_time] = drange
581
628
 
582
629
  @plugin.run(:pre, host, :metrics, searchopts)
583
630
 
@@ -590,7 +637,7 @@ module BzConsole
590
637
  # for open bugs
591
638
  # what we are interested in here would be how many bugs still keeps open.
592
639
  searchopts = opts[:command][:query].clone
593
- searchopts[:last_change_time] = [ts, Time.utc(ts.year, ts.month + 1, 1) - 1]
640
+ searchopts[:last_change_time] = drange
594
641
  searchopts[:status] = '__open__'
595
642
 
596
643
  @plugin.run(:pre, host, :metrics, searchopts)
@@ -608,7 +655,7 @@ module BzConsole
608
655
  # what we are interested in here would be how much bugs are
609
656
  # actually closed, but not how many closed bugs one worked on.
610
657
  searchopts = opts[:command][:query].clone
611
- searchopts[:last_change_time] = [ts, Time.utc(ts.year, ts.month + 1, 1) - 1]
658
+ searchopts[:last_change_time] = drange
612
659
  searchopts[:status] = 'CLOSED'
613
660
 
614
661
  @plugin.run(:pre, host, :metrics, searchopts)
@@ -622,7 +669,7 @@ module BzConsole
622
669
  # obtain the information for open bugs that closed now
623
670
  searchopts = opts[:command][:query].clone
624
671
  searchopts[:status] = 'CLOSED'
625
- searchopts[:metrics_closed_after] = Time.utc(ts.year, ts.month + 1, 1)
672
+ searchopts[:metrics_closed_after] = drange[1] + 1
626
673
 
627
674
  @plugin.run(:pre, host, :metrics, searchopts)
628
675
 
@@ -634,7 +681,7 @@ module BzConsole
634
681
 
635
682
  # obtain the information for open bugs
636
683
  searchopts = opts[:command][:query].clone
637
- searchopts[:metrics_not_closed] = Time.utc(ts.year, ts.month + 1, 1) - 1
684
+ searchopts[:metrics_not_closed] = drange[1]
638
685
 
639
686
  @plugin.run(:pre, host, :metrics, searchopts)
640
687
 
@@ -646,7 +693,7 @@ module BzConsole
646
693
 
647
694
  yield ts, new, assigned, modified, on_qa, closed, open_bugs
648
695
 
649
- ts = Time.utc(ts.year, ts.month + 1, 1)
696
+ ts = drange[1] + 1
650
697
  end
651
698
  end
652
699
  end
data/lib/bugzilla.rb CHANGED
@@ -30,7 +30,7 @@ require 'xmlrpc/client'
30
30
 
31
31
  module Bugzilla
32
32
 
33
- VERSION = "0.1.1"
33
+ VERSION = "0.2"
34
34
 
35
35
  =begin rdoc
36
36
 
@@ -99,13 +99,14 @@ module Bugzilla
99
99
 
100
100
  =begin rdoc
101
101
 
102
- ==== Bugzilla::XMLRPC#new(server, port = 443)
102
+ ==== Bugzilla::XMLRPC#new(host, port = 443, path = '/xmlrpc.cgi')
103
103
 
104
104
  =end
105
105
 
106
- def initialize(server, port = 443)
106
+ def initialize(host, port = 443, path = '/xmlrpc.cgi')
107
+ path ||= '/xmlrpc.cgi'
107
108
  use_ssl = port == 443 ? true : false
108
- @xmlrpc = ::XMLRPC::Client.new(server, '/xmlrpc.cgi', port, nil, nil, nil, nil, use_ssl, 60)
109
+ @xmlrpc = ::XMLRPC::Client.new(host, path, port, nil, nil, nil, nil, use_ssl, 60)
109
110
  end # def initialize
110
111
 
111
112
  =begin rdoc
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-bugzilla
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
9
- - 1
10
- version: 0.1.1
8
+ - 2
9
+ version: "0.2"
11
10
  platform: ruby
12
11
  authors:
13
12
  - Akira TAGOH
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-19 00:00:00 +09:00
17
+ date: 2010-08-26 00:00:00 +09:00
19
18
  default_executable: bzconsole
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency