Class: RubyBugzilla

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_bugzilla.rb,
lib/ruby_bugzilla/version.rb

Constant Summary collapse

CLONE_FIELDS =
[:assigned_to, :cc, :cf_devel_whiteboard, :cf_internal_whiteboard, :component,
:groups, :keywords, :op_sys, :platform, :priority, :product, :qa_contact, :severity,
:summary, :target_release, :url, :version, :whiteboard, :comments, :description,]
CMD =
`which bugzilla`.chomp
COOKIES_FILE =
File.expand_path('~/.bugzillacookies')
VERSION =
"0.5.1"

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(bugzilla_uri, username, password) ⇒ RubyBugzilla

Returns a new instance of RubyBugzilla.

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
41
# File 'lib/ruby_bugzilla.rb', line 32

def initialize(bugzilla_uri, username, password)
  raise "python-bugzilla not installed" unless installed?
  raise ArgumentError, "username and password must be set" if username.nil? || password.nil?

  self.bugzilla_uri = bugzilla_uri
  self.username     = username
  self.password     = password
  self.xmlrpc       = ::XMLRPC::Client.new(bugzilla_request_hostname, '/xmlrpc.cgi', 443, nil,
    nil, username, password, true, 60)
end

Instance Attribute Details

#bugzilla_request_hostnameObject (readonly)

Returns the value of attribute bugzilla_request_hostname.



24
25
26
# File 'lib/ruby_bugzilla.rb', line 24

def bugzilla_request_hostname
  @bugzilla_request_hostname
end

#bugzilla_request_uriObject (readonly)

Returns the value of attribute bugzilla_request_uri.



24
25
26
# File 'lib/ruby_bugzilla.rb', line 24

def bugzilla_request_uri
  @bugzilla_request_uri
end

#bugzilla_uriObject

Returns the value of attribute bugzilla_uri.



23
24
25
# File 'lib/ruby_bugzilla.rb', line 23

def bugzilla_uri
  @bugzilla_uri
end

#last_commandObject

Returns the value of attribute last_command.



23
24
25
# File 'lib/ruby_bugzilla.rb', line 23

def last_command
  @last_command
end

#passwordObject

Returns the value of attribute password.



23
24
25
# File 'lib/ruby_bugzilla.rb', line 23

def password
  @password
end

#usernameObject

Returns the value of attribute username.



23
24
25
# File 'lib/ruby_bugzilla.rb', line 23

def username
  @username
end

#xmlrpcObject

Returns the value of attribute xmlrpc.



23
24
25
# File 'lib/ruby_bugzilla.rb', line 23

def xmlrpc
  @xmlrpc
end

Class Method Details

.clear_login!Object



19
20
21
# File 'lib/ruby_bugzilla.rb', line 19

def self.clear_login!
  File.delete(COOKIES_FILE) if File.exists?(COOKIES_FILE)
end

.installed?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/ruby_bugzilla.rb', line 11

def self.installed?
  File.exists?(CMD)
end

.logged_in?Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/ruby_bugzilla.rb', line 15

def self.logged_in?
  File.exists?(COOKIES_FILE)
end

Instance Method Details

#clear_login!Object



55
56
57
# File 'lib/ruby_bugzilla.rb', line 55

def clear_login!
  self.class.clear_login!
end

#clone(bug_id, overrides = {}) ⇒ Fixnum

Clone of an existing bug

Example:

# Perform a clone of an existing bug, and return the new bug ID.
bz.clone(948970)

Parameters:

  • bug_id (String, Fixnum)

    A single bug id to process.

  • overrides (Hash) (defaults to: {})

    The properties to change from the source bug. Some properties include

    • :target_release - The target release for the new cloned bug.

    • :assigned_to - The person to assign the new cloned bug to.

Returns:

  • (Fixnum)

    The bug id to the new, cloned, bug.

Raises:

  • (ArgumentError)


147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/ruby_bugzilla.rb', line 147

def clone(bug_id, overrides={})
  raise ArgumentError, "bug_id must be numeric" unless bug_id.to_s =~ /^\d+$/ 

  existing_bz = xmlrpc_bug_query(bug_id)

  clone_description, clone_comment_is_private = assemble_clone_description(existing_bz)

  params = {}
  CLONE_FIELDS.each do |field|
    next if field == :comments 
    params[field] = existing_bz[field.to_s]
  end

  # Apply overrides
  overrides.each do |param, value|
    params[param] = value
  end

  # Apply base clone fields
  params[:cf_clone_of]        = bug_id
  params[:description]        = clone_description
  params[:comment_is_private] = clone_comment_is_private

  execute_xmlrpc('create', params)[:id.to_s]
end

#inspectObject



43
44
45
# File 'lib/ruby_bugzilla.rb', line 43

def inspect
  super.gsub(/@password=\".+?\", /, "")
end

#installed?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'lib/ruby_bugzilla.rb', line 47

def installed?
  self.class.installed?
end

#logged_in?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/ruby_bugzilla.rb', line 51

def logged_in?
  self.class.logged_in?
end

#loginObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/ruby_bugzilla.rb', line 59

def 
  if logged_in?
    self.last_command = nil
    return "Already Logged In"
  end

  params = {}
  params["--debug"] = nil
  params["login"]   = [username, password]

  begin
    execute_shell(params)
  rescue
    clear_login! # A failed login attempt could result in a corrupt COOKIES_FILE
    raise
  end
end

#modify(bug_ids, options) ⇒ String

Modify an existing bug or set of bugs

Examples:

# Set the status of multiple bugs to RELEASE_PENDING
bz.modify([948970, 948971], :status => "RELEASE_PENDING")

# Add a comment
bz.modify("948972", :comment => "whatevs")

# Set the status to POST and add a comment
bz.modify(948970, :status => "POST", :comment => "Fixed in shabla")

Parameters:

  • bug_ids (String, Integer, Array<String>, Array<Integer>)

    The bug id or ids to process.

  • options (Hash)

    The properties to change. Some properties include

    • :status - The bug status, such as NEW, ASSIGNED, etc.

    • :comment - Add a comment

Returns:

  • (String)

    The command output

Raises:

  • (ArgumentError)


124
125
126
127
128
129
130
131
132
133
134
# File 'lib/ruby_bugzilla.rb', line 124

def modify(bug_ids, options)
  bug_ids = Array(bug_ids)
  raise ArgumentError, "bug_ids and options must be specified" if bug_ids.empty? || options.empty?
  raise ArgumentError, "bug_ids must be numeric" unless bug_ids.all? {|id| id.to_s =~ /^\d+$/ }

  params = {}
  params["modify"] = bug_ids
  set_params_options(params, options)

  execute_shell(params)
end

#query(options) ⇒ String

Query for existing bugs

Example:

# Query for all NEW bugs, and return the output in a specific format.
puts bz.query(
  :bug_status   => "NEW",
  :outputformat => "BZ_ID: %{id} STATUS: %{bug_status} SUMMARY: %{summary}"
)
# BZ_ID: 1234 STATUS: NEW SUMMARY: Something went wrong.
# BZ_ID: 1235 STATUS: NEW SUMMARY: Another thing went wrong.

Parameters:

  • options (Hash)

    Query options. Some possible values are:

    • :product - A specific product to limit the query against

    • :flag - Comma separated list of flags

    • :bug_status - Comma separated list of bug statuses, such as NEW, ASSIGNED, etc.

    • :outputformat - A string that will be used to format each line of output, with %{} as the interpolater.

Returns:

  • (String)

    The command output

Raises:

  • (ArgumentError)


96
97
98
99
100
101
102
103
104
# File 'lib/ruby_bugzilla.rb', line 96

def query(options)
  raise ArgumentError, "options must be specified" if options.empty?

  params = {}
  params["query"] = nil
  set_params_options(params, options)

  execute_shell(params)
end

#xmlrpc_bug_query(bug_id) ⇒ Fixnum

XMLRPC Bug Query of an existing bug

Example:

# Perform an xmlrpc query for a single bug.
bz.xmlrpc_bug_query(948970)

Parameters:

  • bug_id (String, Fixnum)

    A single bug id to process.

Returns:

  • (Fixnum)

    The bug id to the new, cloned, bug.

Raises:

  • (ArgumentError)


181
182
183
184
185
186
187
188
189
190
191
# File 'lib/ruby_bugzilla.rb', line 181

def xmlrpc_bug_query(bug_id)
  raise ArgumentError, "bug_id must be numeric" unless bug_id.to_s =~ /^\d+$/ 

  params = {}
  params[:Bugzilla_login]    = username
  params[:Bugzilla_password] = password
  params[:ids]               = bug_id
  params[:include_fields]    = CLONE_FIELDS

  execute_xmlrpc('get', params)['bugs'].last
end