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.
- data/bin/bzconsole +82 -35
- data/lib/bugzilla.rb +5 -4
- 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 | 
            -
                     | 
| 229 | 
            -
                     | 
| 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 | 
            -
                     | 
| 339 | 
            -
                     | 
| 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 | 
            -
                     | 
| 411 | 
            -
                     | 
| 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 | 
            -
                       | 
| 429 | 
            +
                      if opts[:command][:show][:mode] == :field then
         | 
| 430 | 
            +
                        bug = Bugzilla::Bug.new(xmlrpc)
         | 
| 421 431 |  | 
| 422 | 
            -
             | 
| 432 | 
            +
                        result = bug.fields(opts[:command][:show][:field])
         | 
| 423 433 |  | 
| 424 | 
            -
             | 
| 434 | 
            +
                        @plugin.run(:post, host, :show, result)
         | 
| 425 435 |  | 
| 426 | 
            -
             | 
| 427 | 
            -
                       | 
| 428 | 
            -
                         | 
| 429 | 
            -
             | 
| 430 | 
            -
                         | 
| 431 | 
            -
             | 
| 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 | 
            -
                     | 
| 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 | 
            -
                     | 
| 553 | 
            -
                     | 
| 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 | 
| 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 | 
            -
                         | 
| 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] =  | 
| 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] =  | 
| 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] =  | 
| 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] =  | 
| 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 =  | 
| 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. | 
| 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( | 
| 102 | 
            +
            ==== Bugzilla::XMLRPC#new(host, port = 443, path = '/xmlrpc.cgi')
         | 
| 103 103 |  | 
| 104 104 | 
             
            =end
         | 
| 105 105 |  | 
| 106 | 
            -
                def initialize( | 
| 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( | 
| 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:  | 
| 4 | 
            +
              hash: 15
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 | 
            -
              -  | 
| 9 | 
            -
               | 
| 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- | 
| 17 | 
            +
            date: 2010-08-26 00:00:00 +09:00
         | 
| 19 18 | 
             
            default_executable: bzconsole
         | 
| 20 19 | 
             
            dependencies: 
         | 
| 21 20 | 
             
            - !ruby/object:Gem::Dependency 
         |