Module: Net::IMAP::Config::AttrVersionDefaults

Included in:
Net::IMAP::Config
Defined in:
lib/net/imap/config/attr_version_defaults.rb

Overview

NOTE: This module is an internal implementation detail, with no guarantee of backward compatibility.

Adds a defaults parameter to attr_accessor, which is used to compile Config.version_defaults.

Constant Summary collapse

CURRENT_VERSION =

The x.y part of Net::IMAP::VERSION, as a Rational number.

VERSION.to_r
NEXT_VERSION =

The config version used for Config[:next].

CURRENT_VERSION
VERSIONS =
((0.0r..FUTURE_VERSION) % 0.1r).to_a.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#version_defaultsObject (readonly)

See Config.version_defaults.



27
28
29
# File 'lib/net/imap/config/attr_version_defaults.rb', line 27

def version_defaults
  @version_defaults
end

Class Method Details

.compile_default!Object



52
53
54
55
56
57
58
59
# File 'lib/net/imap/config/attr_version_defaults.rb', line 52

def self.compile_default!
  raise "Config.default already compiled" if Config.default
  default = VERSIONS.select { _1 <= CURRENT_VERSION }
    .filter_map { version_defaults[_1] }
    .prepend(version_defaults.delete(nil))
    .inject(&:merge)
  Config.new(**default).freeze
end

.compile_version_defaults!Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/net/imap/config/attr_version_defaults.rb', line 61

def self.compile_version_defaults!
  version_defaults[0.0r]     = Config[version_defaults.fetch(0.0r)]

  VERSIONS.each_cons(2) do |prior, version|
    updates = version_defaults[version]
    version_defaults[version] = version_defaults[prior]
      .then { updates ? _1.dup.update(**updates).freeze : _1 }
  end

  # Safe conversions one way only:
  #   0.6r.to_f == 0.6  # => true
  #   0.6 .to_r == 0.6r # => false
  version_defaults.to_a.each do |k, v|
    next unless k in Rational
    version_defaults[k.to_f] = v
  end

  version_defaults[:original] = Config[0.0r]
  version_defaults[:current]  = Config[CURRENT_VERSION]
  version_defaults[:default]  = Config[CURRENT_VERSION]
  version_defaults[:next]     = Config[NEXT_VERSION]
  version_defaults[:future]   = Config[FUTURE_VERSION]

  version_defaults.freeze
end

Instance Method Details

#attr_accessor(name, defaults: nil, default: (unset = true), **kw) ⇒ Object

:stopdoc: internal APIs only



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/net/imap/config/attr_version_defaults.rb', line 40

def attr_accessor(name, defaults: nil, default: (unset = true), **kw)
  unless unset
    version  = DEFAULT_TO_INHERIT.include?(name) ? nil : 0.0r
    defaults = { version => default }
  end
  defaults&.each_pair do |version, default|
    AttrVersionDefaults.version_defaults[version] ||= {}
    AttrVersionDefaults.version_defaults[version][name] = default
  end
  super(name, **kw)
end