# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os import textwrap import traceback import unittest
import mozpack.path as mozpath from mozunit import MockedOpen, main
from mozbuild.configure import ConfigureError from mozbuild.configure.lint import LintSandbox
with self.assertRaisesFromLine(ConfigureError, 7) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo') def foo(value): return value
self.assertEqual(str(e.exception), "The dependency on `--help` is unused")
with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo')
@imports('os') def foo(value): return value
self.assertEqual(
str(e.exception), "Missing '--help' dependency because `bar` depends on '--help' and `foo`",
)
with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo') def foo(value): return value
include(foo) """
):
self.lint_test()
with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo')
@imports('os') def foo(value): return value
with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo')
@imports('os') def foo(value): return value
with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo')
@imports('os') def foo(value): return value
# This would have failed with "Missing '--help' dependency" # in the past, because of the reference to the builtin False. with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo') def foo(value): returnFalseor value
# However, when something that is normally a builtin is overridden, # we should still want the dependency on --help. with self.assertRaisesFromLine(ConfigureError, 7) as e: with self.moz_configure( """
@template def tmpl():
sorted = 42
# There is a default restricted `os` module when there is no explicit # @imports, and it's fine to use it without a dependency on --help. with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo') def foo(value):
os return value
include(foo) """
):
self.lint_test()
with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option('--foo', help='Foo')
@depends('--foo') def foo(value): return
include(foo) """
):
self.lint_test()
self.assertEqual(str(e.exception), "The dependency on `--foo` is unused")
with self.assertRaisesFromLine(ConfigureError, 5) as e: with self.moz_configure( """
@depends(when=True) def bar(): return
@depends(bar) def foo(value): return
include(foo) """
):
self.lint_test()
self.assertEqual(str(e.exception), "The dependency on `bar` is unused")
with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
@depends(depends(when=True)(lambda: None)) def foo(value): return
include(foo) """
):
self.lint_test()
self.assertEqual(str(e.exception), "The dependency on `` is unused")
with self.assertRaisesFromLine(ConfigureError, 9) as e: with self.moz_configure( """
@template def tmpl():
@depends(when=True) def bar(): return return bar
qux = tmpl()
@depends(qux) def foo(value): return
include(foo) """
):
self.lint_test()
self.assertEqual(str(e.exception), "The dependency on `qux` is unused")
def test_default_enable(self): # --enable-* with default=True is not allowed. with self.moz_configure( """
option('--enable-foo', default=False, help='Foo') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
option('--enable-foo', default=True, help='Foo') """
):
self.lint_test()
self.assertEqual(
str(e.exception), "--disable-foo should be used instead of ""--enable-foo with default=True",
)
def test_default_disable(self): # --disable-* with default=False is not allowed. with self.moz_configure( """
option('--disable-foo', default=True, help='Foo') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
option('--disable-foo', default=False, help='Foo') """
):
self.lint_test()
self.assertEqual(
str(e.exception), "--enable-foo should be used instead of " "--disable-foo with default=False",
)
def test_default_with(self): # --with-* with default=True is not allowed. with self.moz_configure( """
option('--with-foo', default=False, help='Foo') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
option('--with-foo', default=True, help='Foo') """
):
self.lint_test()
self.assertEqual(
str(e.exception), "--without-foo should be used instead of ""--with-foo with default=True",
)
def test_default_without(self): # --without-* with default=False is not allowed. with self.moz_configure( """
option('--without-foo', default=True, help='Foo') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
option('--without-foo', default=False, help='Foo') """
):
self.lint_test()
self.assertEqual(
str(e.exception), "--with-foo should be used instead of ""--without-foo with default=False",
)
def test_default_func(self): # Help text for an option with variable default should contain # {enable|disable} rule. with self.moz_configure( """
option(env='FOO', help='Foo')
option('--enable-bar', default=depends('FOO')(lambda x: bool(x)),
help='{Enable|Disable} bar') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 3) as e: with self.moz_configure( """
option(env='FOO', help='Foo')
option('--enable-bar', default=depends('FOO')(lambda x: bool(x)),\
help='Enable bar') """
):
self.lint_test()
self.assertEqual(
str(e.exception), '`help` should contain "{Enable|Disable}" because of ' "non-constant default",
)
def test_dual_help(self): # Help text for an option that can be both disabled and enabled with an # optional value should contain {enable|disable} rule. with self.moz_configure( """
option('--disable-bar', nargs="*", choices=("a", "b"),
help='{Enable|Disable} bar') """
):
self.lint_test() with self.assertRaisesFromLine(ConfigureError, 2) as e: with self.moz_configure( """
option('--disable-bar', nargs="*", choices=("a", "b"), help='Enable bar') """
):
self.lint_test()
self.assertEqual(
str(e.exception), '`help` should contain "{Enable|Disable}" because it ' "can be both disabled and enabled with an optional value",
)
def test_capitalize_help(self): with self.moz_configure("option('--some', help='Help')"):
self.lint_test()
with self.assertRaisesFromLine(ConfigureError, 1) as e0: with self.moz_configure("option('--some', help='help')"):
self.lint_test()
self.assertEqual(
str(e0.exception), 'Invalid `help` message for option "--some": `help` is not properly capitalized',
)
with self.assertRaisesFromLine(ConfigureError, 1) as e1: with self.moz_configure("option('--some', help='Help.')"):
self.lint_test()
self.assertEqual(
str(e1.exception), "Invalid `help` message for option \"--some\": `Help.` should not end with a '.'",
)
def test_undefined_global(self): with self.assertRaisesFromLine(NameError, 6) as e: with self.moz_configure( """
option(env='FOO', help='Foo')
@depends('FOO') def foo(value): if value: return unknown return value """
):
self.lint_test()
self.assertEqual(str(e.exception), "global name 'unknown' is not defined")
# Ideally, this would raise on line 4, where `unknown` is used, but # python disassembly doesn't give use the information. with self.assertRaisesFromLine(NameError, 2) as e: with self.moz_configure( """
@template def tmpl():
@depends(unknown) def foo(value): if value: returnTrue return foo
tmpl() """
):
self.lint_test()
self.assertEqual(str(e.exception), "global name 'unknown' is not defined")
def test_unnecessary_imports(self): with self.assertRaisesFromLine(NameError, 3) as e: with self.moz_configure( """
option(env='FOO', help='Foo')
@depends('FOO')
@imports(_from='__builtin__', _import='list') def foo(value): if value: return list() return value """
):
self.lint_test()
self.assertEqual(str(e.exception), "builtin 'list' doesn't need to be imported")
if __name__ == "__main__":
main()
Messung V0.5
¤ Dauer der Verarbeitung: 0.17 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.