diff --git a/lib/net/imap/config/attr_inheritance.rb b/lib/net/imap/config/attr_inheritance.rb index d5618fba..c62539a6 100644 --- a/lib/net/imap/config/attr_inheritance.rb +++ b/lib/net/imap/config/attr_inheritance.rb @@ -66,11 +66,31 @@ def new(**attrs) self.class.new(self, **attrs) end # inherited, or +false+ if any of them are overriden. When no +attrs+ # are given, returns +true+ if *all* attributes are inherited, or # +false+ if any attribute is overriden. + # + # Related: #overrides? def inherited?(*attrs) attrs = data.members if attrs.empty? attrs.all? { data[_1] == INHERITED } end + # :call-seq: + # overrides?(attr) -> true or false + # overrides?(*attrs) -> true or false + # overrides? -> true or false + # + # Returns +true+ if +attr+ is defined on this config and not inherited + # from #parent. + # + # When multiple +attrs+ are given, returns +true+ if + # *any* of them are defined on +self+. When no +attrs+ are given, + # returns +true+ if *any* attribute is overriden. + # + # Related: #inherited? + def overrides?(*attrs) + attrs = data.members if attrs.empty? + attrs.any? { data[_1] != INHERITED } + end + # :call-seq: # reset -> self # reset(attr) -> attribute value diff --git a/test/net/imap/test_config.rb b/test/net/imap/test_config.rb index 8e1ac569..13671bc7 100644 --- a/test/net/imap/test_config.rb +++ b/test/net/imap/test_config.rb @@ -349,6 +349,33 @@ def duck.to_r = 1/11111 assert child.inherited?(:debug, :idle_response_timeout, :open_timeout) end + test "#overrides?" do + base = Config.new debug: false, open_timeout: 99, idle_response_timeout: 15 + child = base.new debug: true, open_timeout: 15, idle_response_timeout: 10 + assert child.overrides? + assert child.overrides?(:idle_response_timeout) + assert child.overrides?(:idle_response_timeout, :open_timeout) + assert child.overrides?(:sasl_ir, :open_timeout) + refute child.overrides?(:sasl_ir, :max_response_size) + refute child.overrides?(:sasl_ir) + + child.reset(:idle_response_timeout) + assert child.overrides? + refute child.overrides?(:idle_response_timeout) + assert child.overrides?(:idle_response_timeout, :open_timeout) + assert child.overrides?(:sasl_ir, :open_timeout) + refute child.overrides?(:sasl_ir, :max_response_size) + refute child.overrides?(:sasl_ir) + + child.reset + refute child.overrides? + refute child.overrides?(:idle_response_timeout) + refute child.overrides?(:idle_response_timeout, :open_timeout) + refute child.overrides?(:sasl_ir, :open_timeout) + refute child.overrides?(:sasl_ir, :max_response_size) + refute child.overrides?(:sasl_ir) + end + test "#reset all attributes" do base = Config.new debug: false, open_timeout: 99, idle_response_timeout: 15 child = base.new debug: true, open_timeout: 15, idle_response_timeout: 10