Rewrite generate-xcfilelists in Python
[WebKit-https.git] / Tools / Scripts / webkitpy / common / attribute_saver.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # Copyright (C) 2019 Apple Inc.  All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 #
10 # 1. Redistributions of source code must retain the above copyright
11 #    notice, this list of conditions and the following disclaimer.
12 # 2. Redistributions in binary form must reproduce the above copyright
13 #    notice, this list of conditions and the following disclaimer in the
14 #    documentation and/or other materials provided with the distribution.
15 #
16 # THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
17 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28
29 # Context Manager for saving the value of an object's attribute, setting it to
30 # a new value (None, by default), and then restoring the original value.
31 #
32 # Used as:
33 #
34 #   myObject.fooAttribute = 1
35 #   print(myObject.fooAttribute)
36 #   with AttributeSaver(myObject, "fooAttribute", 5):
37 #       print(myObject.fooAttribute)
38 #   print(myObject.fooAttribute)
39 #
40 # Prints: 1, 5, 1
41
42 class AttributeSaver:
43     def __init__(self, obj, attribute, value=None):
44         self.obj = obj
45         self.attribute = attribute
46         self.old_value = getattr(self.obj, self.attribute)
47         self.new_value = value
48
49     def __enter__(self):
50         setattr(self.obj, self.attribute, self.new_value)
51
52     def __exit__(self, exc_type, exc_value, traceback):
53         setattr(self.obj, self.attribute, self.old_value)
54         return None