[IMP] runbot: qualify error contents on selected fields

The current qualifying implementation is based solely on error content.
With this commit the fields on which the regular expression will apply
can be choosen with checkboxes. It defaults to the `content` field.
This commit is contained in:
Christophe Monniez 2024-12-05 13:14:00 +01:00 committed by xdo
parent f7003fb964
commit d6a77ceb49
2 changed files with 49 additions and 27 deletions

View File

@ -518,7 +518,7 @@ class BuildErrorContent(models.Model):
for record in self: for record in self:
all_qualifiers = {} all_qualifiers = {}
for qualify_regex in qualify_regexes: for qualify_regex in qualify_regexes:
res = qualify_regex._qualify(record.content) # TODO, MAYBE choose the source field res = qualify_regex._qualify(record)
if res: if res:
# res.update({'qualifier_id': qualify_regex.id}) Probably not a good idea # res.update({'qualifier_id': qualify_regex.id}) Probably not a good idea
all_qualifiers.update(res) all_qualifiers.update(res)
@ -668,17 +668,13 @@ class ErrorQualifyRegex(models.Model):
sequence = fields.Integer('Sequence', default=100) sequence = fields.Integer('Sequence', default=100)
active = fields.Boolean('Active', default=True, tracking=True) active = fields.Boolean('Active', default=True, tracking=True)
regex = fields.Char('Regular expression', required=True) regex = fields.Char('Regular expression', required=True)
source_field = fields.Selection(
[ check_module_name = fields.Boolean('Check Module Name', default=False, help='Apply regex on Error Module Name')
("content", "Content"), check_file_path = fields.Boolean('Check File Path', default=False, help='Apply regex on Error Module Name')
("module", "Module Name"), check_function = fields.Boolean('Check Function name', default=False, help='Apply regex on Error Function Name')
("function", "Function Name"), check_content = fields.Boolean('Check content', default=True, help='Apply regex on Error Csontent')
("file_path", "File Path"),
], check_fields = fields.Char('Checked Fields', compute='_compute_check_fields', help='Fields on which regex is applied')
default="content",
string="Source Field",
help="Build error field on which the regex will be applied to extract a qualifier",
)
test_ids = fields.One2many('runbot.error.qualify.test', 'qualify_regex_id', string="Test Sample", help="Error samples to test qualifying regex") test_ids = fields.One2many('runbot.error.qualify.test', 'qualify_regex_id', string="Test Sample", help="Error samples to test qualifying regex")
@ -717,30 +713,32 @@ for error_content in self:
"The regular expresion should contain at least one named group pattern e.g: '(?P<module>.+)'" "The regular expresion should contain at least one named group pattern e.g: '(?P<module>.+)'"
) )
def _qualify(self, content): @api.depends('check_module_name', 'check_file_path', 'check_function', 'check_content')
def _compute_check_fields(self):
for record in self:
res = []
for cf in ['module_name', 'file_path', 'function', 'content']:
if record[f'check_{cf}']:
res.append(cf)
record.check_fields = ','.join(res)
def _qualify(self, build_error_content):
self.ensure_one() self.ensure_one()
content = '\n'.join([build_error_content[sf] for sf in self.check_fields.split(',') if self.check_fields])
result = False result = False
if content and self.regex: if content and self.regex:
result = re.search(self.regex, content, flags=re.MULTILINE) result = re.search(self.regex, content, flags=re.MULTILINE)
return result.groupdict() if result else {} return result.groupdict() if result else {}
@api.depends('regex', 'test_string')
def _compute_qualifiers(self):
for record in self:
if record.regex and record.test_string:
record.qualifiers = record._qualify(record.test_string)
else:
record.qualifiers = {}
class QualifyErrorTest(models.Model): class QualifyErrorTest(models.Model):
_name = 'runbot.error.qualify.test' _name = 'runbot.error.qualify.test'
_description = 'Extended Relation between a qualify regex and a build error taken as sample' _description = 'Extended Relation between a qualify regex and a build error taken as sample'
qualify_regex_id = fields.Many2one('runbot.error.qualify.regex', required=True) qualify_regex_id = fields.Many2one('runbot.error.qualify.regex', required=True)
error_content_id = fields.Many2one('runbot.build.error.content', string='Build Error', required=True) error_content_id = fields.Many2one('runbot.build.error.content', string='Content Id', required=True)
build_error_summary = fields.Char(related='error_content_id.summary') build_error_summary = fields.Char(compute='_compute_summary')
build_error_content = fields.Text(related='error_content_id.content') build_error_content = fields.Text(compute='_compute_content')
expected_result = JsonDictField('Expected Qualifiers') expected_result = JsonDictField('Expected Qualifiers')
result = JsonDictField('Result', compute='_compute_result') result = JsonDictField('Result', compute='_compute_result')
is_matching = fields.Boolean(compute='_compute_result', default=False) is_matching = fields.Boolean(compute='_compute_result', default=False)
@ -748,5 +746,16 @@ class QualifyErrorTest(models.Model):
@api.depends('qualify_regex_id.regex', 'error_content_id', 'expected_result', 'result') @api.depends('qualify_regex_id.regex', 'error_content_id', 'expected_result', 'result')
def _compute_result(self): def _compute_result(self):
for record in self: for record in self:
record.result = record.qualify_regex_id._qualify(record.build_error_content) record.result = record.qualify_regex_id._qualify(record.error_content_id)
record.is_matching = record.result == record.expected_result and record.result != {} record.is_matching = record.result == record.expected_result and record.result != {}
@api.depends('error_content_id')
def _compute_summary(self):
for record in self:
content = record.error_content_id.content
record.build_error_summary = content[:70] if content else False
@api.depends('qualify_regex_id', 'error_content_id')
def _compute_content(self):
for record in self:
record.build_error_content = '\n'.join([record.error_content_id[sf] or '' for sf in record.qualify_regex_id.check_fields.split(',')])

View File

@ -424,7 +424,7 @@
<list string="Qualifying Regexes"> <list string="Qualifying Regexes">
<field name="sequence" widget="handle"/> <field name="sequence" widget="handle"/>
<field name="regex" readonly="1"/> <field name="regex" readonly="1"/>
<field name="source_field" readonly="1"/> <field name="check_fields" readonly="1"/>
</list> </list>
</field> </field>
</record> </record>
@ -443,7 +443,10 @@
<sheet> <sheet>
<group name="Regex And Source"> <group name="Regex And Source">
<field name="regex"/> <field name="regex"/>
<field name="source_field"/> <field name="check_module_name"/>
<field name="check_file_path"/>
<field name="check_function"/>
<field name="check_content"/>
</group> </group>
<group> <group>
<field name="test_ids"> <field name="test_ids">
@ -488,5 +491,15 @@
<field name="view_mode">list,form</field> <field name="view_mode">list,form</field>
</record> </record>
<record id="runbot_qualify_regex_search_view" model="ir.ui.view">
<field name="name">runbot.qualify.regex.filter</field>
<field name="model">runbot.error.qualify.regex</field>
<field name="arch" type="xml">
<search string="Search regex">
<field name="regex"/>
</search>
</field>
</record>
</data> </data>
</odoo> </odoo>