Skip to main content

Advanced descriptors for special cases.

Project description

Advanced descriptors

https://travis-ci.com/python-useful-helpers/advanced-descriptors.svg?branch=master Azure DevOps builds https://coveralls.io/repos/github/python-useful-helpers/advanced-descriptors/badge.svg?branch=master Documentation Status https://img.shields.io/pypi/v/advanced-descriptors.svg https://img.shields.io/pypi/pyversions/advanced-descriptors.svg https://img.shields.io/pypi/status/advanced-descriptors.svg https://img.shields.io/github/license/python-useful-helpers/advanced-descriptors.svg https://img.shields.io/badge/code%20style-black-000000.svg

This package includes helpers for special cases:

  • SeparateClassMethod - allow to have classmethod and normal method both with the same name.

  • AdvancedProperty - property with possibility to set class wide getter.

  • LogOnAccess - property with logging on successful get/set/delete or failure.

SeparateClassMethod

This descriptor can be set using standard decorator syntax. Create instance with arguments:

def imeth(instance):
    return instance.value

def cmeth(owner):
    return owner.value

class Target(object):
    value = 1

    def __init__(self):
        self.value = 2
    getval = advanced_descriptors.SeparateClassMethod(
        imeth, cmeth
    )

Create instance wrapping as decorator:

class Target(object):
    value = 1

    def __init__(self):
        self.value = 2

    @advanced_descriptors.SeparateClassMethod
    def getval(self):
        return self.value

    @getval.class_method
    def getval(cls):
        return cls.value

Cases with method only and classmethod only is useless: method as-is and @classmethod should be used in corresponding cases.

AdvancedProperty

This descriptor should be used in cases, when in addition to normal property API, class getter is required. If class-wide setter and deleter also required - you should use standard propery in metaclass.

Usage examples:

  1. In addition to normal property API:

class Target(object):
    _value = 777

    def __init__(self):
        self._value = 42

    @advanced_descriptors.AdvancedProperty
    def val(self):
        return self._value

    @val.setter
    def val(self, value):
        self._value = value

    @val.deleter
    def val(self):
        self._value = 0

    @val.cgetter
    def val(cls):
        return cls._value
  1. Use class-wide getter for instance too:

class Target(object):
    _value = 1

    val = advanced_descriptors.AdvancedProperty()

    @val.cgetter
        def val(cls):
            return cls._value

LogOnAccess

This special case of property is useful in cases, where a lot of properties should be logged by similar way without writing a lot of code.

Basic API is conform with property, but in addition it is possible to customize logger, log levels and log conditions.

Usage examples:

  1. Simple usage. All by default. logger is re-used from instance if available with names logger or log else used internal advanced_descriptors.log_on_access logger:

import logging

class Target(object):

    def init(self, val='ok')
        self.val = val
        self.logger = logging.get_logger(self.__class__.__name__)  # Single for class, follow subclassing

    def __repr__(self):
        return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)

    @advanced_descriptors.LogOnAccess
    def ok(self):
        return self.val

    @ok.setter
    def ok(self, val):
        self.val = val

    @ok.deleter
    def ok(self):
        self.val = ""
  1. Use with global logger for class:

class Target(object):

  def init(self, val='ok')
      self.val = val

  def __repr__(self):
      return "{cls}(val={self.val})".format(cls=self.__class__.__name__, self=self)

  @advanced_descriptors.LogOnAccess
  def ok(self):
      return self.val

  @ok.setter
  def ok(self, val):
      self.val = val

  @ok.deleter
  def ok(self):
      self.val = ""

  ok.logger = 'test_logger'
  ok.log_level = logging.INFO
  ok.exc_level = logging.ERROR
  ok.log_object_repr = True  # As by default
  ok.log_success = True  # As by default
  ok.log_failure = True  # As by default
  ok.log_traceback = True  # As by default
  ok.override_name = None  # As by default: use original name

Testing

The main test mechanism for the package advanced-descriptors is using tox. Available environments can be collected via tox -l

CI systems

For code checking several CI systems is used in parallel:

  1. Travis CI: is used for checking: PEP8, pylint, bandit, installation possibility and unit tests. Also it’s publishes coverage on coveralls.

  2. coveralls: is used for coverage display.

  3. Azure CI: is used for functional tests on Windows.

CD system

Travis CI: is used for package delivery on PyPI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

advanced-descriptors-3.0.7.tar.gz (27.0 kB view details)

Uploaded Source

Built Distributions

advanced_descriptors-3.0.7-py3-none-any.whl (16.0 kB view details)

Uploaded Python 3

advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_x86_64.whl (634.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_i686.whl (481.2 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_x86_64.whl (540.6 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_i686.whl (416.0 kB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_x86_64.whl (536.0 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_i686.whl (412.3 kB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ i686

File details

Details for the file advanced-descriptors-3.0.7.tar.gz.

File metadata

  • Download URL: advanced-descriptors-3.0.7.tar.gz
  • Upload date:
  • Size: 27.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced-descriptors-3.0.7.tar.gz
Algorithm Hash digest
SHA256 6440480441f234d3faf3c49306c2f2817c2c29e62a8db10b6dbe3294dca23582
MD5 b9d3aa47543f928cb5c3f8f3e417b1ed
BLAKE2b-256 971d298009e88aabcb3be02abce8d39e965ad2035aea61df139121e40646de73

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-py3-none-any.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-py3-none-any.whl
  • Upload date:
  • Size: 16.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 3ed8b61a46bc77464e5589d1081201087e5f002e8d15626f6fa74373a6298391
MD5 e95b9447d0f3993eb8fd85b08e51b727
BLAKE2b-256 b08fd3a28a728a8510f096e8d4798c8e8f679324ecd6795ed44e21c44a51ecd1

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a5177a81dd18270970ff7cc0a25f0becfdcc7d4cdf3bf1fed082e4e1cd90dcc6
MD5 65d61b0c0bd419b83b6907857d295fe4
BLAKE2b-256 ccf2e845e283773fbe8d7d23a071ec2bbba7526783ee612f6e8f3f45853748e9

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 d9fa138e149af64a411968eb6ee9abffb9faaee514d44314943aeab624b3291e
MD5 a574fe4132188c7129810a76659cd214
BLAKE2b-256 afa47a2eb8cc05711f5249de6d41d6bd876ec1c306d757a801131dbd245423ad

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 044de208aa659c5f7e1f8bae71ed5a78ed1af1f7a5fb9ab2df7f31a574e480bd
MD5 631d67c0bd6070b4fbe2d19c4d6398f6
BLAKE2b-256 b24025b4db38b59f9667167cedf9f81e0608229d63abd3f20149aebed5af5258

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 634.2 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 52c78a5f5c137a6afa6ef8b58fab4d18d0013decff585dbfd3ee819b2d12ab9e
MD5 8fd4a7e9ce6767e234c02d0d5f4af53c
BLAKE2b-256 b29a59d3aa31aff8e0db97cfd87aff6488a4e4ea8ed3d3cfdda7220eaf85cfea

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_i686.whl
  • Upload date:
  • Size: 481.2 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5056814a0662328b21c8319fdceeaba5d78246946e21e0b6fbf7b9fe84bb011e
MD5 3360bc7115435a6a1ad86c431b87a869
BLAKE2b-256 64472f27387c3b3fc0a7a1b0c9bfc2a453edc329ea4d6ae74a658c5a298f3717

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 d7cb285c7915e0d67850a390bc04c6068d0c1e9066aa96861362278d4e3b8cc8
MD5 8f5dc2c7f67b23d05006faf42b5ccf48
BLAKE2b-256 8ddba7be0f9e2f008b6093a034424eaee6dcf7ae8d3aa2bdb4b24594f25f9e95

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp38-cp38-manylinux1_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp38-cp38-manylinux1_i686.whl
  • Upload date:
  • Size: 465.1 kB
  • Tags: CPython 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp38-cp38-manylinux1_i686.whl
Algorithm Hash digest
SHA256 f0e818bcca99d06ee87ba1478928d82ef00ca5c2fe4aedbefcff009e24309ae2
MD5 feea25fd3bc670b51da7253a59715255
BLAKE2b-256 0613da174c56c2ef5d284d3064f7dfbad5d1c744f6339f4c25e2b1fcece06bc3

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2304d51295703545f5dbee6970a14525bfefb6265761906793f6b10a144ab477
MD5 45e5eb98ed7dfe013aa9d0deb95c2bbe
BLAKE2b-256 10352801a78d56e68cb07c31f9006a939bcbc0851358ce52375c271c4ea4d903

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 022c1070cadd45f18ba428dfaaf316ab216be417979daff126d8e97d1722e1fc
MD5 a668ad3cc9c386f2c2fffa61cc42d656
BLAKE2b-256 6646646bc847ea0a4c0fe79c4572b7395cd03d73c870c2951520cf46f6273401

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 114ac5e0bbba19f5d6ed32f45128ac0d5bc92093aa617ea636a3e7d6bcef25e6
MD5 893d55231bd6240b923c34fc66ec42a3
BLAKE2b-256 ec68f5b69042be09f442801df8d279656353a840e355299c0e02ad9c812314f8

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 540.6 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 105e91477440cb2f7d9c0fb9173aa0ac8c8f996afc31fe56fcf3d347cb7f49ff
MD5 a6fd4a13c63bfba6a7f296b1e82f7263
BLAKE2b-256 320c480720ffc83d1c396e4b386e118282165c746700682a304c2dbacacf1b2f

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_i686.whl
  • Upload date:
  • Size: 416.0 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 ccce5197e307f52fde9998f14c6aedac765d812444085ff4ae8e94e5df7a07ad
MD5 79219b80ab634d038e188d9f517792b0
BLAKE2b-256 e8ffb476c35372675910f99e59717bf7fb7216b480811bc661870d795c0e4867

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 e9ab766419007caeada27d23a14dea1edd52b213c00bffd031a0ddfeb8e01ff8
MD5 b586df2702fe86ff3c913d409cb9670d
BLAKE2b-256 c1f7c52761a72a044774365063c80337450dd2f0985d500075ade6c1aede399d

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp37-cp37m-manylinux1_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp37-cp37m-manylinux1_i686.whl
  • Upload date:
  • Size: 427.4 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp37-cp37m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 923fc909e70caea0ac0a4019d331ab19d1e5dae8b3c5cd779a8eb46fc6ea37ab
MD5 9406e1f7d48b93dcf154cb4d46750e13
BLAKE2b-256 56de0c9a66e39d486cea4f15cb48dcb06456b7f5821ea35bc46abae96f934afd

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 49cb520902c17b0d146d1c63ebfbfe1e7655bbad9eb45014c8438649df8934eb
MD5 ee33add9085457e08ac47996e1fb05a5
BLAKE2b-256 0a8299a56f4665c29fdd1b1cb9fe38403a230313d2f284e0964371f4c63968c8

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 2c4621b825c2dc54c87abec667e1e67201b9d4d9dfe6c32d60fb78d7487f593e
MD5 5efae24516b835db1e918aae7417f1bb
BLAKE2b-256 eb0fe3555180a33363e754f21dac023f51b6715dc4dd7c63902419d0ab38288a

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 22dfa53eb4f28da1b929d065438ec3237da2b9c5f5a6a3af940a49b0a034b661
MD5 3602ac87bac0d5c0dc5160ed036b5969
BLAKE2b-256 ae432e089ad1f5f01275c524affcabd09245b6a72da1fa149a78e9b22ac76a48

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 536.0 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 51ff63e2471b0a5b8487d95f950c1d02ba22f5255027f1629cfd98e13d9eb26b
MD5 32afd772eed34ebde2a93ca732b196ce
BLAKE2b-256 663987bfc3a0591860b194da9007d07a2054dce54c615c63bfa6768155d988a8

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_i686.whl
  • Upload date:
  • Size: 412.3 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 6f30c05eb524879862e0e43a57d21cccc49a90c7c986ba4b76b88f4f336b028d
MD5 f79a36d1e9da1974e193cc6cbbf056e7
BLAKE2b-256 333e62be356662f9879dede5e5b102c790bab941d8ba4eb5f1d40ee3807c7a50

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 29252ecab6fcd6bb5d854d072325e7bb9228823d60ac434c20857de0b65b7996
MD5 b0a744f36a084072dee4417d39d9193f
BLAKE2b-256 a6257391c35c903d28617e7ca1609512fd16d48c1c1cfb48b47688717965f08c

See more details on using hashes here.

File details

Details for the file advanced_descriptors-3.0.7-cp36-cp36m-manylinux1_i686.whl.

File metadata

  • Download URL: advanced_descriptors-3.0.7-cp36-cp36m-manylinux1_i686.whl
  • Upload date:
  • Size: 425.8 kB
  • Tags: CPython 3.6m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.5

File hashes

Hashes for advanced_descriptors-3.0.7-cp36-cp36m-manylinux1_i686.whl
Algorithm Hash digest
SHA256 61215d321a7fb6506103200c1997bfeefcc0c8202a5f32b0c1ea26e42f2879f9
MD5 4c3ba95f011c908763e0e2caedb44f69
BLAKE2b-256 256c6af390ba084c9ae5eebc72e32374f7aa3172a87f52d6739d43d891d115c4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page