[Piglit] [Patch v2 2/2] results.py: Add recursive_update method to TestResult
Ilia Mirkin
imirkin at alum.mit.edu
Wed Jul 2 10:28:09 PDT 2014
On Wed, Jul 2, 2014 at 1:17 PM, Dylan Baker <baker.dylan.c at gmail.com> wrote:
> This method is used during PiglitTest.interpret_result() to update
> subtest entries safely. I chose this approach since it is robust,
> reusable, and it felt more natural as a part of TestResult than putting
> it in PiglitTest.interpret_result()
>
> v2: - Fix commit message
>
> Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
> ---
> framework/exectest.py | 2 +-
> framework/results.py | 32 ++++++++++++++++++++++++++++++++
> 2 files changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/framework/exectest.py b/framework/exectest.py
> index e4a2344..fcc29af 100644
> --- a/framework/exectest.py
> +++ b/framework/exectest.py
> @@ -279,6 +279,6 @@ class PiglitTest(Test):
> outpiglit = (s[7:] for s in outlines if s.startswith('PIGLIT:'))
>
> for piglit in outpiglit:
> - self.result.update(json.loads(piglit))
> + self.result.recursive_update(json.loads(piglit))
> self.result['out'] = '\n'.join(
> s for s in outlines if not s.startswith('PIGLIT:'))
> diff --git a/framework/results.py b/framework/results.py
> index a715b29..88d962d 100644
> --- a/framework/results.py
> +++ b/framework/results.py
> @@ -248,6 +248,38 @@ class TestResult(dict):
> # normally
> pass
>
> + def recursive_update(self, dictionary):
> + """ Recursively update the TestResult
> +
> + The problem with using self.update() is this:
> + >>> t = TestResult()
> + >>> t.update({'subtest': {'test1': 'pass'}})
> + >>> t.update({'subtest': {'test2': 'pass'}})
> + >>> t['subtest']
> + {'test2': 'pass'}
> +
> + This function is different, because it recursively updates self, it
> + doesn't clobber existing entires in the same way
> + >>> t = TestResult()
> + >>> t.recursive_update({'subtest': {'test1': 'pass'}})
> + >>> t.recursive_update({'subtest': {'test2': 'pass'}})
> + >>> t['subtest']
> + {'test1': 'pass', 'test2': 'pass'}
> +
> + Arguments:
> + dictionary -- a dictionary instance to update the TestResult with
> +
> + """
> + def update(d, u):
> + for k, v in u.iteritems():
> + if isinstance(v, dict):
> + d[k] = update(d.get(k, {}), v)
> + else:
> + d[k] = u[k]
What about this? Why not d[k] = v? [Perhaps you missed that comment in
my response to the original?]
> + return d
> +
> + update(self, dictionary)
> +
>
> class TestrunResult(object):
> def __init__(self, resultfile=None):
> --
> 2.0.0
>
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/piglit
More information about the Piglit
mailing list