11import textwrap
2- import unittest
3-
42
53import pytest
64
75from conan .test .utils .tools import TestClient , GenConanfile
86
97
10- class OptionsTest ( unittest . TestCase ) :
8+ class TestOptions :
119
1210 def test_general_scope_options_test_package (self ):
1311 client = TestClient ()
@@ -21,34 +19,34 @@ def configure(self):
2119 test = GenConanfile ().with_test ("pass" )
2220 client .save ({"conanfile.py" : conanfile })
2321 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=1" )
24- self . assertIn ( "pkg/0.1@user/testing: BUILD SHARED: 1" , client .out )
22+ assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client .out
2523 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=2" )
2624 assert 'legacy: Unscoped option definition is ambiguous' in client .out
27- self . assertIn ( "pkg/0.1@user/testing: BUILD SHARED: 2" , client .out )
25+ assert "pkg/0.1@user/testing: BUILD SHARED: 2" in client .out
2826 # With test_package
2927 client .save ({"conanfile.py" : conanfile ,
3028 "test_package/conanfile.py" : test })
3129 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=1" )
32- self . assertIn ( "pkg/0.1@user/testing: BUILD SHARED: 1" , client .out )
30+ assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client .out
3331 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o pkg*:shared=2" )
34- self . assertIn ( "pkg/0.1@user/testing: BUILD SHARED: 2" , client .out )
32+ assert "pkg/0.1@user/testing: BUILD SHARED: 2" in client .out
3533 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=1" )
36- self . assertIn ( "pkg/0.1@user/testing: BUILD SHARED: 1" , client .out )
34+ assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client .out
3735
3836 def test_general_scope_options_test_package_notdefined (self ):
3937 client = TestClient ()
4038 conanfile = GenConanfile ()
4139 client .save ({"conanfile.py" : conanfile })
4240 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=True" )
43- self . assertIn ( "pkg/0.1@user/testing: Forced build from source" , client .out )
41+ assert "pkg/0.1@user/testing: Forced build from source" in client .out
4442 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=False" , assert_error = True )
45- self . assertIn ( "option 'shared' doesn't exist" , client .out )
43+ assert "option 'shared' doesn't exist" in client .out
4644 # With test_package
4745 client .save ({"conanfile.py" : conanfile ,
4846 "test_package/conanfile.py" : GenConanfile ().with_test ("pass" )})
4947 client .run ("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=True" )
50- self . assertIn ( "pkg/0.1@user/testing: Forced build from source" , client .out )
51- self . assertIn ( "Testing the package: Building" , client .out )
48+ assert "pkg/0.1@user/testing: Forced build from source" in client .out
49+ assert "Testing the package: Building" in client .out
5250
5351 def test_general_scope_priorities (self ):
5452 client = TestClient ()
@@ -63,23 +61,23 @@ def configure(self):
6361 client .save ({"conanfile.py" : conanfile })
6462 # Consumer has priority
6563 client .run ("create . --name=pkg --version=0.1 -o *:shared=1 -o shared=2 -o p*:other=4" )
66- self . assertIn ( "pkg/0.1: BUILD SHARED: 2 OTHER: 4" , client .out )
64+ assert "pkg/0.1: BUILD SHARED: 2 OTHER: 4" in client .out
6765 # Consumer has priority over pattern, even if the pattern specifies the package name
6866 client .run ("create . --name=pkg --version=0.1 -o *:shared=1 -o pkg/*:shared=2 -o shared=3 -o p*:other=4" )
69- self . assertIn ( "pkg/0.1: BUILD SHARED: 3 OTHER: 4" , client .out )
67+ assert "pkg/0.1: BUILD SHARED: 3 OTHER: 4" in client .out
7068 client .run ("create . --name=pkg --version=0.1 -o pkg/0.1:shared=2 -o p*:other=4 -o pk*:other=5" )
71- self . assertIn ( "pkg/0.1: BUILD SHARED: 2 OTHER: 5" , client .out )
69+ assert "pkg/0.1: BUILD SHARED: 2 OTHER: 5" in client .out
7270
7371 # With test_package
7472 client .save ({"conanfile.py" : conanfile ,
7573 "test_package/conanfile.py" : GenConanfile ().with_test ("pass" )})
7674 # Sorted (longest, alphabetical) patterns, have priority
7775 client .run ("create . --name=pkg --version=0.1 -o *:shared=1 -o pkg/0.1:shared=2 -o other=4" )
78- self . assertIn ( "pkg/0.1: BUILD SHARED: 2 OTHER: 4" , client .out )
76+ assert "pkg/0.1: BUILD SHARED: 2 OTHER: 4" in client .out
7977 client .run ("create . --name=pkg --version=0.1 -o pk*:shared=2 -o p*:shared=1 -o pkg/0.1:other=5" )
80- self . assertIn ( "pkg/0.1: BUILD SHARED: 1 OTHER: 5" , client .out )
78+ assert "pkg/0.1: BUILD SHARED: 1 OTHER: 5" in client .out
8179 client .run ("create . --name=pkg --version=0.1 -o pk*:shared=2 -o p*:shared=1 -o pkg/0.1:other=5 -o *g*:other=6" )
82- self . assertIn ( "pkg/0.1: BUILD SHARED: 1 OTHER: 6" , client .out )
80+ assert "pkg/0.1: BUILD SHARED: 1 OTHER: 6" in client .out
8381
8482 def test_parsing (self ):
8583 client = TestClient ()
@@ -104,7 +102,7 @@ def build(self):
104102'''
105103 client .save ({"conanfile.txt" : conanfile }, clean_first = True )
106104 client .run ("install . --build=missing" )
107- self . assertIn ( "OPTION a=b" , client .out )
105+ assert "OPTION a=b" in client .out
108106
109107 def test_general_scope_options (self ):
110108 # https://github.com/conan-io/conan/issues/2538
@@ -119,7 +117,7 @@ def configure(self):
119117 """ )
120118 client .save ({"conanfile.py" : conanfile_liba })
121119 client .run ("create . --name=liba --version=0.1 --user=danimtb --channel=testing -o *:shared=True" )
122- self . assertIn ( "liba/0.1@danimtb/testing: shared=True" , client .out )
120+ assert "liba/0.1@danimtb/testing: shared=True" in client .out
123121
124122 conanfile_libb = textwrap .dedent ("""
125123 from conan import ConanFile
@@ -141,16 +139,16 @@ def configure(self):
141139
142140 # Test info
143141 client .run ("graph info . -o *:shared=True" )
144- self . assertIn ( "conanfile.py: shared=True" , client .out )
145- self . assertIn ( "liba/0.1@danimtb/testing: shared=True" , client .out )
142+ assert "conanfile.py: shared=True" in client .out
143+ assert "liba/0.1@danimtb/testing: shared=True" in client .out
146144 # Test create
147145 client .run ("create . --name=libb --version=0.1 --user=danimtb --channel=testing -o *:shared=True" )
148- self . assertIn ( "libb/0.1@danimtb/testing: shared=True" , client .out )
149- self . assertIn ( "liba/0.1@danimtb/testing: shared=True" , client .out )
146+ assert "libb/0.1@danimtb/testing: shared=True" in client .out
147+ assert "liba/0.1@danimtb/testing: shared=True" in client .out
150148 # Test install
151149 client .run ("install . -o *:shared=True" )
152- self . assertIn ( "conanfile.py: shared=True" , client .out )
153- self . assertIn ( "liba/0.1@danimtb/testing: shared=True" , client .out )
150+ assert "conanfile.py: shared=True" in client .out
151+ assert "liba/0.1@danimtb/testing: shared=True" in client .out
154152
155153 def test_define_nested_option_not_freeze (self ):
156154 c = TestClient ()
@@ -611,6 +609,46 @@ def configure(self):
611609 assert "dep3/0.1@user/channel: MYOPTION: 1" in c .out
612610
613611
612+ def test_package_options_negate_patterns ():
613+ c = TestClient ()
614+ conanfile = textwrap .dedent ("""
615+ from conan import ConanFile
616+ class Dep(ConanFile):
617+ version = "0.1"
618+ options = {"myoption": [1, 2, 3]}
619+ def build(self):
620+ self.output.info(f"MYOPTION={self.options.myoption}!!!")
621+ """ )
622+ c .save ({"dep/conanfile.py" : conanfile ,
623+ "pkg/conanfile.py" : GenConanfile ().with_requires ("dep1/0.1" , "dep2/0.1" , "dep3/0.1" )})
624+ c .run ("export dep --name=dep1" )
625+ c .run ("export dep --name=dep2" )
626+ c .run ("export dep --name=dep3" )
627+
628+ c .run ("install pkg --build=* -o *:myoption=1 -o ~dep1/*:myoption=2" )
629+ assert "dep1/0.1: MYOPTION=1!!!" in c .out
630+ assert "dep2/0.1: MYOPTION=2!!!" in c .out
631+ assert "dep3/0.1: MYOPTION=2!!!" in c .out
632+
633+ # Order does matter for options with *:myoption patter, evaluates last
634+ c .run ("install pkg --build=* -o ~dep1/*:myoption=2 -o *:myoption=1" )
635+ assert "dep1/0.1: MYOPTION=1!!!" in c .out
636+ assert "dep2/0.1: MYOPTION=1!!!" in c .out
637+ assert "dep3/0.1: MYOPTION=1!!!" in c .out
638+
639+ # dep3 comes later, works
640+ c .run ("install pkg --build=* -o *:myoption=1 -o ~dep1/*:myoption=2 -o dep3/*:myoption=3" )
641+ assert "dep1/0.1: MYOPTION=1!!!" in c .out
642+ assert "dep2/0.1: MYOPTION=2!!!" in c .out
643+ assert "dep3/0.1: MYOPTION=3!!!" in c .out
644+
645+ # dep3 comes first, then last !dep1 pattern prevails
646+ c .run ("install pkg --build=* -o *:myoption=1 -o dep3/*:myoption=3 -o ~dep1/*:myoption=2" )
647+ assert "dep1/0.1: MYOPTION=1!!!" in c .out
648+ assert "dep2/0.1: MYOPTION=2!!!" in c .out
649+ assert "dep3/0.1: MYOPTION=2!!!" in c .out
650+
651+
614652class TestTransitiveOptionsSharedInvisible :
615653 """
616654 https://github.com/conan-io/conan/issues/13854
0 commit comments