Files
odoo_source/addons/base_import_module/tests/test_cloc.py
T
Thibault Francois dc8f06624f [ADD] cloc: count loc in style file and from imported module
Context
-------

Web design specific require a lot of work and need maintenance.
So far the style files were not taken into account despite the
amount of maintenance they require.

With this commit they are going to be counted,
knowing they still can be excluded in the manifest.

Imported module allow to deploy frontend assets: stylesheet,
javascript, xml template and Qweb view that require
as well some maintenance. They are going to be counted

Implementation
--------------

- Add method to parse css and scss file
- Include .scss and .css file in the count

- Add external_id to attachment that store
  frontend asset of imported module
- Find all attachment with .js, .css, .scss, .xml
  from imported module
- Find qweb view from imported module
- cound the content of the attachment and the qweb view

closes odoo/odoo#86816

X-original-commit: d2e0b48271dbd8cd7bbdbc5c2c1649c55c51417b
Signed-off-by: Christophe Simonis <chs@odoo.com>
Signed-off-by: Thibault Francois <tfr@odoo.com>
2022-03-21 17:57:05 +01:00

107 lines
4.2 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import json
from io import BytesIO
from zipfile import ZipFile
from odoo.tools import cloc
from odoo.addons.base.tests import test_cloc
VALID_XML = """
<templates id="template" xml:space="preserve">
<t t-name="stock_barcode.LineComponent">
<div t-if="line.picking_id and line.picking_id.origin" name="origin">
<i class="fa fa-fw fa-file" />
<span t-esc="line.picking_id.origin" />
</div>
</t>
</templates>
"""
class TestClocFields(test_cloc.TestClocCustomization):
def test_fields_from_import_module(self):
"""
Check that custom computed fields installed with an imported module
is counted as customization
"""
self.env['ir.module.module'].create({
'name': 'imported_module',
'state': 'installed',
'imported': True,
})
f1 = self.create_field('x_imported_field')
self.create_xml_id('import_field', 'ir.model.fields', f1.id, 'imported_module')
cl = cloc.Cloc()
cl.count_customization(self.env)
self.assertEqual(cl.code.get('imported_module', 0), 1, 'Count fields with xml_id of imported module')
f2 = self.create_field('x_base_field')
self.create_xml_id('base_field', 'ir.model.fields', f2.id, 'base')
cl = cloc.Cloc()
cl.count_customization(self.env)
self.assertEqual(cl.code.get('base', 0), 0, "Don't count fields from standard module")
def test_count_qweb_imported_module(self):
self.env['ir.module.module'].create({
'author': 'Odoo',
'imported': True,
'latest_version': '15.0.1.0.0',
'name': 'test_imported_module',
'state': 'installed',
'summary': 'Test imported module for cloc',
})
qweb_view = self.env['ir.ui.view'].create({
"name": "Qweb Test",
"type": "qweb",
"mode": "primary",
"arch_base": "<html>\n <body>\n <t t-out=\"Hello World\"/>\n </body>\n</html>",
})
self.create_xml_id("qweb_view_test", 'ir.ui.view', qweb_view.id, 'test_imported_module')
# Add qweb view from non imported module
qweb_view = self.env['ir.ui.view'].create({
"name": "Qweb Test",
"type": "qweb",
"arch_base": "<html>\n <body>\n <t t-out=\"Hello World\"/>\n </body>\n</html>",
})
self.create_xml_id("qweb_view_test", 'ir.ui.view', qweb_view.id)
# Add form view from module
form_view = self.env['ir.ui.view'].create({
"name": "Test partner",
"type": "form",
"model": "res.partner",
"arch_base": "<form>\n <field name=\"name\" \n invisible=\"1\" />\n</form>",
})
self.create_xml_id("form_view_test", 'ir.ui.view', form_view.id, 'test_imported_module')
cl = cloc.Cloc()
cl.count_customization(self.env)
self.assertEqual(cl.code.get('test_imported_module', 0), 5, "Count only qweb view from imported module")
def test_count_attachment_imported_module(self):
manifest_content = json.dumps({
'name': 'test_imported_module',
'description': 'Test',
'assets': {
'web.assets_backend': [
'test_imported_module/static/src/js/test.js',
'test_imported_module/static/src/css/test.scss',
]
},
'license': 'LGPL-3',
})
stream = BytesIO()
with ZipFile(stream, 'w') as archive:
archive.writestr('test_imported_module/__manifest__.py', manifest_content)
archive.writestr('test_imported_module/static/src/js/test.js', test_cloc.JS_TEST)
archive.writestr('test_imported_module/static/src/js/test.scss', test_cloc.SCSS_TEST)
archive.writestr('test_imported_module/static/src/js/test.xml', VALID_XML)
# Import test module
self.env['ir.module.module'].import_zipfile(stream)
cl = cloc.Cloc()
cl.count_customization(self.env)
self.assertEqual(cl.code.get('test_imported_module', 0), 35)