def test_is_flagged(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.NONE, 11) assert not ob.build().is_flagged("foo") ob.foo = RankedValue(Rank.CONFIG, 11) assert not ob.build().is_flagged("foo") ob.foo = RankedValue(Rank.ENVIRONMENT, 11) assert not ob.build().is_flagged("foo") ob.foo = RankedValue(Rank.FLAG, 11) assert ob.build().is_flagged("foo")
def for_scope( self, scope: str, inherit_from_enclosing_scope: bool = True, ) -> OptionValueContainer: """Return the option values for the given scope. Values are attributes of the returned object, e.g., options.foo. Computed lazily per scope. :API: public """ # First get enclosing scope's option values, if any. if scope == GLOBAL_SCOPE or not inherit_from_enclosing_scope: values_builder = OptionValueContainerBuilder() else: values_builder = self.for_scope( enclosing_scope(scope)).to_builder() # Now add our values. flags_in_scope = self._scope_to_flags.get(scope, []) parse_args_request = self._make_parse_args_request( flags_in_scope, values_builder) values = self._parser_hierarchy.get_parser_by_scope(scope).parse_args( parse_args_request) # Check for any deprecation conditions, which are evaluated using `self._flag_matchers`. if inherit_from_enclosing_scope: values_builder = values.to_builder() self._check_and_apply_deprecations(scope, values_builder) values = values_builder.build() return values
def test_unknown_values(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.HARDCODED, 1) o = ob.build() assert 1 == o.foo with pytest.raises(AttributeError): o.bar
def test_unknown_values(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.HARDCODED, 1) o = ob.build() self.assertEqual(1, o.foo) with self.assertRaises(AttributeError): o.bar
def create_option_value_container( default_rank: Rank = Rank.NONE, **options: RankedValue | Value ) -> OptionValueContainer: scoped_options = OptionValueContainerBuilder() for key, value in options.items(): if not isinstance(value, RankedValue): value = RankedValue(default_rank, value) setattr(scoped_options, key, value) return scoped_options.build()
def test_iterator(self) -> None: ob = OptionValueContainerBuilder() ob.a = RankedValue(Rank.FLAG, 3) ob.b = RankedValue(Rank.FLAG, 2) ob.c = RankedValue(Rank.FLAG, 1) o = ob.build() names = list(iter(o)) assert ["a", "b", "c"] == names
def test_value_ranking(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.CONFIG, 11) o = ob.build() assert 11 == o.foo assert Rank.CONFIG == o.get_rank("foo") ob.foo = RankedValue(Rank.HARDCODED, 22) o = ob.build() assert 11 == o.foo assert Rank.CONFIG == o.get_rank("foo") ob.foo = RankedValue(Rank.ENVIRONMENT, 33) o = ob.build() assert 33 == o.foo assert Rank.ENVIRONMENT == o.get_rank("foo") ob.foo = RankedValue(Rank.FLAG, 44) o = ob.build() assert 44 == o.foo assert Rank.FLAG == o.get_rank("foo")
def _create_scoped_options( default_rank: Rank, **options: Union[RankedValue, Value] ) -> OptionValueContainer: scoped_options = OptionValueContainerBuilder() for key, value in options.items(): if not isinstance(value, RankedValue): value = RankedValue(default_rank, value) setattr(scoped_options, key, value) return scoped_options.build()
def test_value_ranking(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.CONFIG, 11) o = ob.build() self.assertEqual(11, o.foo) self.assertEqual(Rank.CONFIG, o.get_rank("foo")) ob.foo = RankedValue(Rank.HARDCODED, 22) o = ob.build() self.assertEqual(11, o.foo) self.assertEqual(Rank.CONFIG, o.get_rank("foo")) ob.foo = RankedValue(Rank.ENVIRONMENT, 33) o = ob.build() self.assertEqual(33, o.foo) self.assertEqual(Rank.ENVIRONMENT, o.get_rank("foo")) ob.foo = RankedValue(Rank.FLAG, 44) o = ob.build() self.assertEqual(44, o.foo) self.assertEqual(Rank.FLAG, o.get_rank("foo"))
def test_indexing(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.CONFIG, 1) o = ob.build() assert 1 == o["foo"] assert 1 == o.get("foo") assert 1 == o.get("foo", 2) assert o.get("unknown") is None assert 2 == o.get("unknown", 2) with pytest.raises(AttributeError): o["bar"]
def test_indexing(self) -> None: ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.CONFIG, 1) o = ob.build() self.assertEqual(1, o["foo"]) self.assertEqual(1, o.get("foo")) self.assertEqual(1, o.get("foo", 2)) self.assertIsNone(o.get("unknown")) self.assertEqual(2, o.get("unknown", 2)) with self.assertRaises(AttributeError): o["bar"]
def test_copy(self) -> None: # copy semantics can get hairy when overriding __setattr__/__getattr__, so we test them. ob = OptionValueContainerBuilder() ob.foo = RankedValue(Rank.FLAG, 1) ob.bar = RankedValue(Rank.FLAG, {"a": 111}) p = ob.build() z = ob.build() # Verify that the result is in fact a copy. assert 1 == p.foo # Has original attribute. ob.baz = RankedValue(Rank.FLAG, 42) assert not hasattr( p, "baz") # Does not have attribute added after the copy. # Verify that it's a shallow copy by modifying a referent in o and reading it in p. p.bar["b"] = 222 assert {"a": 111, "b": 222} == z.bar
def for_scope(self, scope: str, check_deprecations: bool = True) -> OptionValueContainer: """Return the option values for the given scope. Values are attributes of the returned object, e.g., options.foo. Computed lazily per scope. :API: public """ values_builder = OptionValueContainerBuilder() flags_in_scope = self._scope_to_flags.get(scope, []) parse_args_request = self._make_parse_args_request(flags_in_scope, values_builder) values = self.get_parser(scope).parse_args(parse_args_request) # Check for any deprecation conditions, which are evaluated using `self._flag_matchers`. if check_deprecations: values_builder = values.to_builder() self._check_and_apply_deprecations(scope, values_builder) values = values_builder.build() return values