[1,of,2,RFC] RFC: implement immutable config objects
Yuya Nishihara
yuya at tcha.org
Sat Apr 1 14:39:34 UTC 2017
On Wed, 29 Mar 2017 15:25:26 -0700, David Soria Parra wrote:
> On Mon, Mar 27, 2017 at 11:38:06AM -0700, Jun Wu wrote:
> > # HG changeset patch
> > # User Jun Wu <quark at fb.com>
> > # Date 1490635856 25200
> > # Mon Mar 27 10:30:56 2017 -0700
> > # Node ID 4eb7c76340791f379a34f9df4ec42e0c8b9b2a2f
> > # Parent 4a8d065bbad80d3b3401010375bc80165404aa87
> > RFC: implement immutable config objects
>
> I like the overall approach and that it's parallel to config.config() and
> ui.config. We might in later patches combine config.config into this.
Yea, the idea sounds good and the next patch proves that this actually works.
Nice.
Random nitpicks in line.
> > +class fileconfig(atomicconfig):
> > + """immutable config constructed from config files"""
> > +
> > + def __init__(self, title, fp, sections=None, remap=None):
> > + # Currently, just use the legacy, non-immutable "config" object to do
> > + # the parsing, remap stuff. In the future we may want to detach from it
> > + cfg = config()
> > + cfg.read(title, fp, sections=sections, remap=remap)
> > +
> > + def cfgwalker():
> > + # visible config, with source
> > + for section in cfg:
> > + emptysection = True
> > + for item, value in cfg.items(section):
> > + emptysection = False
> > + source = cfg.source(section, item)
> > + yield (section, item, (value, source))
We might want to keep filename and line number separately in future version.
> > +class filteredconfig(abstractimmutableconfig):
> > + """immutable config that changes other configs"""
> > +
> > + def __init__(self, title, subconfig, filters=None):
> > + """
> > + filters: a dict-ish, {section: filterfunc or sortdict-ish}
> > + a filterfunc takes sortdict-ish and returns sortdict-ish
> > + a sortdict-ish will replace the section directly
> > + """
So this is more like "map" operation? I thought filterfunc would return
booleans.
> > + super(filteredconfig, self).__init__(title)
> > + self._filters = filters or {}
> > + self._subconfig = subconfig
> > + self._cachedsections = {}
> > +
> > + def subconfigs(self, section=None):
> I think this is actually not needed except for dumpconfig, which might just be a
> helper that knows about the internals.
>
> > + return (self._subconfig,)
> > +
> > + def sections(self):
> > + return self._subconfig.sections()
> > +
> > + def getsection(self, section):
> > + if section not in self._filters:
> > + return self._subconfig.getsection(section)
> > + items = self._cachedsections.get(section, None)
> > + if items is None:
> > + filter = self._filters[section]
> > + if util.safehasattr(filter, '__call__'):
> this should be `callable`
>
> > + items = filter(self._subconfig.getsection(section))
> > + else:
> > + items = filter
Do we really need to overload the type of filter?
More information about the Mercurial-devel
mailing list