diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml new file mode 100644 index 0000000..858e465 --- /dev/null +++ b/.github/workflows/pre-commit.yaml @@ -0,0 +1,38 @@ +name: pre-commit + +on: + pull_request: + branches: + - master + types: + - opened + - reopened + - ready_for_review + - synchronize + +env: + SKIP: pytest-check + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 # get full git history + - uses: actions/setup-python@v3 + with: + cache: 'pip' + - name: Install pre-commit + run: | + pip install pre-commit + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v21 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run pre-commit + uses: pre-commit/action@v2.0.3 + with: + extra_args: --files ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 87de83e..2a9fd4e 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -11,16 +11,17 @@ on: jobs: test-suite: + if: github.event.pull_request.draft == false runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.6, 3.7, 3.8] + python-version: ["3.8", "3.9", "3.10", "3.11"] os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} ${{ matrix.os }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies @@ -30,7 +31,10 @@ jobs: pip install -r tests/requirements.txt - name: Test with pytest run: | - pytest + pytest --cov-report= --cov=btrdbextras # suppress coverage report here + - name: Coverage Report + run: | + coverage report -m release: @@ -39,7 +43,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Create Release id: create_release uses: actions/create-release@v1 @@ -59,9 +63,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@v3 with: python-version: '3.8' - name: Install dependencies @@ -75,4 +79,4 @@ jobs: uses: pypa/gh-action-pypi-publish@master with: user: __token__ - password: ${{ secrets.PYPI_DEPLOYMENT_TOKEN }} \ No newline at end of file + password: ${{ secrets.PYPI_DEPLOYMENT_TOKEN }} diff --git a/.gitignore b/.gitignore index d5ef9f4..4629a15 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,3 @@ -# Local development -local-setup.sh -driver.py -ignore.py # OS trash .DS_Store @@ -122,3 +118,13 @@ dmypy.json # Pyre type checker .pyre/ + +# arrow parquet files +*.parquet + +.idea +.idea/misc.xml +.idea/vcs.xml +.idea/inspectionProfiles/profiles_settings.xml +.idea/inspectionProfiles/Project_Default.xml +/.idea/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..69de93a --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,51 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.5.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + exclude: setup.cfg +- repo: https://github.com/psf/black + rev: 23.11.0 + hooks: + - id: black-jupyter + args: [--line-length=88] +- repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) + args: [--profile=black, --line-length=88] +- repo: https://github.com/pre-commit/pygrep-hooks + rev: v1.10.0 + hooks: # Enforce that python3.6+ type annotations are used instead of type comments + - id: python-use-type-annotations +- repo: https://github.com/PyCQA/flake8 + rev: 6.1.0 + hooks: + - id: flake8 +# args: [] +#- repo: https://github.com/PyCQA/pydocstyle +# rev: 6.1.1 +# hooks: +# - id: pydocstyle +- repo: https://github.com/kynan/nbstripout + rev: 0.6.1 + hooks: + - id: nbstripout + name: nbstripout + description: 'nbstripout: strip output from Jupyter and IPython notebooks' + entry: nbstripout + language: python + types: [jupyter] + files: kinesis/dominion_apps/ # Run only on notebooks in dominion_apps directory + # exclude: # add files here to keep output cells in Jupyter during commit +- repo: local + hooks: + - id: pytest-check + name: pytest-check + entry: pytest + language: system + pass_filenames: false + always_run: true diff --git a/LICENSE.txt b/LICENSE.txt index e07e178..87f9ad8 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -6,6 +6,6 @@ Redistribution and use in source and binary forms, with or without modification, 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in index cd0cdb5..99d1fdb 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -19,4 +19,4 @@ global-exclude *.py[co] global-exclude .ipynb_checkpoints global-exclude .DS_Store global-exclude .env -global-exclude .coverage.* \ No newline at end of file +global-exclude .coverage.* diff --git a/Makefile b/Makefile index 489fafa..01a5a59 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ SPHINXBUILDDIR = docs/build SPHINXSOURCEDIR = docs/source # Export targets not associated with files -.PHONY: test grpc +.PHONY: test coverage pip clean publish uml build deploy install # Clean build files clean: @@ -31,7 +31,12 @@ clean: -rm -rf docs/build -rm -rf platform-builds meta.yaml -# Generate new grpc code + +# Publish to gh-pages +publish: + git subtree push --prefix=deploy origin gh-pages + +# Autogenerate GRPC/PB files grpc: @echo Generating files: python -m grpc_tools.protoc -I btrdbextras/eventproc/protobuff --python_out=btrdbextras/eventproc/protobuff --grpc_python_out=btrdbextras/eventproc/protobuff btrdbextras/eventproc/protobuff/api.proto @@ -54,9 +59,11 @@ install: # Deploy to PyPI deploy: - # python setup.py register + python setup.py register twine upload dist/* --verbose # Build html version of docs html: - $(SPHINXBUILD) -b html $(SPHINXOPTS) $(SPHINXSOURCEDIR) $(SPHINXBUILDDIR) \ No newline at end of file + $(SPHINXBUILD) -b html $(SPHINXOPTS) $(SPHINXSOURCEDIR) $(SPHINXBUILDDIR) + @echo + @echo "Build finished. The HTML pages are in $(SPHINXBUILDDIR)/html." diff --git a/README.md b/README.md index 7cf7bac..3c544c5 100644 --- a/README.md +++ b/README.md @@ -43,4 +43,4 @@ Note that the documentation also requires Sphix and other dependencies to succes ## Versioning -This codebases uses a form of [Semantic Versioning](http://semver.org/) to structure version numbers. In general, the major version number will track with the BTrDB codebase to transparently maintain version compatibility. Planned features between major versions will increment the minor version while any special releases (bug fixes, etc.) will increment the patch number. \ No newline at end of file +This codebases uses a form of [Semantic Versioning](http://semver.org/) to structure version numbers. In general, the major version number will track with the BTrDB codebase to transparently maintain version compatibility. Planned features between major versions will increment the minor version while any special releases (bug fixes, etc.) will increment the patch number. diff --git a/btrdbextras/__init__.py b/btrdbextras/__init__.py index 5a9dad2..6d18cfe 100644 --- a/btrdbextras/__init__.py +++ b/btrdbextras/__init__.py @@ -1,5 +1,5 @@ from .conn import Connection -__version__ = 'v5.11.9' +__version__ = "v5.31.0" __all__ = ["__version__", "Connection"] diff --git a/btrdbextras/conn.py b/btrdbextras/conn.py index 506dfb3..da2ad8c 100644 --- a/btrdbextras/conn.py +++ b/btrdbextras/conn.py @@ -21,9 +21,13 @@ ## Classes ########################################################################## -class Connection(): - def __init__(self, endpoint=os.environ.get("BTRDB_ENDPOINTS"), apikey=os.environ.get("BTRDB_API_KEY")): +class Connection: + def __init__( + self, + endpoint=os.environ.get("BTRDB_ENDPOINTS"), + apikey=os.environ.get("BTRDB_API_KEY"), + ): if endpoint is None or endpoint.strip() == "": raise ValueError("invalid endpoint or BTRDB_ENDPOINTS env variable not set") diff --git a/btrdbextras/dq.py b/btrdbextras/dq.py index 75bcd0c..6dfc141 100644 --- a/btrdbextras/dq.py +++ b/btrdbextras/dq.py @@ -1,21 +1,24 @@ import re import warnings -from tabulate import tabulate import btrdb -from btrdb.stream import StreamSet, Stream +from btrdb.stream import Stream, StreamSet from btrdb.utils.general import pointwidth from btrdb.utils.timez import ns_delta, to_nanoseconds +from tabulate import tabulate KNOWN_DISTILLER_TYPES = ["repeats", "duplicate-times", "zeros"] + class AmbiguousDistillateError(ValueError): """ Raised when a distillate stream's name contains references to multiple known data quality distiller names """ + pass + class DQDistillate(Stream): """ Subsets a Stream object and allows for identfication of data quality events @@ -24,21 +27,26 @@ class DQDistillate(Stream): ---------- btrdb : BTrDB A reference to the BTrDB object connecting this stream back to the - physical server. + physical server. uuid : UUID The unique UUID identifier for this stream. """ + def __init__(self, btrdb, uu): # gives all same attrs/methods as Stream super().__init__(btrdb, uu) - # NOTE: this involves determining distiller type based on the distillate + # NOTE: this involves determining distiller type based on the distillate # stream name, so we will need to be careful how we name distillates - types = re.findall(r"(?=("+'|'.join(KNOWN_DISTILLER_TYPES)+r"))", self.name) + types = re.findall(r"(?=(" + "|".join(KNOWN_DISTILLER_TYPES) + r"))", self.name) if len(types) == 0: - raise ValueError(f"unknown distiller type. Must be one of [{', '.join(KNOWN_DISTILLER_TYPES)}]") + raise ValueError( + f"unknown distiller type. Must be one of [{', '.join(KNOWN_DISTILLER_TYPES)}]" + ) if len(types) > 1: - raise AmbiguousDistillateError(f"ambiguous distiller name. contains references to [{', '.join(types)}]") + raise AmbiguousDistillateError( + f"ambiguous distiller name. contains references to [{', '.join(types)}]" + ) self.type = types[0] def contains_issue(self, start=None, end=None, depth=30): @@ -69,7 +77,7 @@ def contains_issue(self, start=None, end=None, depth=30): if end is None: latest = self.latest() # adding 1 to end time because end is exclusive in windows() - end = latest[0].time +1 if latest else None + end = latest[0].time + 1 if latest else None start, end = to_nanoseconds(start), to_nanoseconds(end) # There's no event if there's no data @@ -82,6 +90,7 @@ def contains_issue(self, start=None, end=None, depth=30): def __repr__(self): return f"DQDistillate collection={self.collection}, name={self.name}, type={self.type}" + class DQStream(Stream): """ Subsets Stream object. Contains a regular BTrDB stream along with its distillate Streams @@ -90,11 +99,12 @@ class DQStream(Stream): ---------- stream: btrdb.stream.Stream """ + def __init__(self, stream): # gives all same attrs/methods as Stream super().__init__(stream._btrdb, stream.uuid) self._distillates = self._get_distillates() - + def _get_distillates(self): """ Finds distillate Streams for each of the underlying source Streams @@ -107,7 +117,9 @@ def _get_distillates(self): # NOTE: This involves looking up distillate streams by their source_uuid annotation, so we # need to make sure that all distillers give output streams this annotation distillates = [] - for stream in self._btrdb.streams_in_collection(annotations={"source_uuid": str(self.uuid)}): + for stream in self._btrdb.streams_in_collection( + annotations={"source_uuid": str(self.uuid)} + ): try: distillates.append(DQDistillate(stream._btrdb, stream.uuid)) # we only want to raise this error if we aren't sure which distiller the stream is @@ -118,16 +130,18 @@ def _get_distillates(self): else: continue if len(distillates) < 1: - warnings.warn(f"Could not find any data quality distillates for stream {str(self.uuid)}") + warnings.warn( + f"Could not find any data quality distillates for stream {str(self.uuid)}" + ) return distillates - + @property def distillates(self): """ Returns list of distillate Streams """ return self._distillates - + def list_distillates(self): """ Outputs dict that shows which distillates the DQStream has available @@ -144,8 +158,8 @@ def list_distillates(self): "name": self.name, } distillers = { - distiller: True if self[distiller] - else False for distiller in KNOWN_DISTILLER_TYPES + distiller: True if self[distiller] else False + for distiller in KNOWN_DISTILLER_TYPES } # combine basic info with distiller info return {**info, **distillers} @@ -163,7 +177,7 @@ def contains_any_issue(self, start=None, end=None, depth=30): depth: (optional) int The precision of the window duration as a power of 2 in nanoseconds. e.g 30 would make the window duration accurate to roughly 1 second - + Returns ------- bool @@ -192,7 +206,7 @@ def contains_issue(self, distil_type, start=None, end=None, depth=30): depth: (optional) int The precision of the window duration as a power of 2 in nanoseconds. e.g 30 would make the window duration accurate to roughly 1 second - + Returns ------- bool @@ -204,7 +218,7 @@ def contains_issue(self, distil_type, start=None, end=None, depth=30): except KeyError: return None return distillate.contains_issue(start=start, end=end, depth=depth) - + def __getitem__(self, item): for distillate in self._distillates: if distillate.type == item: @@ -213,7 +227,8 @@ def __getitem__(self, item): def __repr__(self): return f"DQStream collection={self.collection}, name={self.name}" - + + class DQStreamSet(StreamSet): """ Subsets a StreamSet object. Contains a list of Streams along with each of their @@ -224,7 +239,8 @@ class DQStreamSet(StreamSet): streams: list list[btrdb.stream.Stream] """ - def __init__(self, streams): + + def __init__(self, streams): dq_streams = [] for stream in streams: if not isinstance(stream, DQStream): @@ -259,12 +275,21 @@ def describe(self, notebook=False, *additional_cols): KNOWN_TAGS = ["name", "unit", "ingress", "distiller"] contains_annotations = False - table = [["Collection", "Name", "Unit", "UUID", "Version", "Available Data Quality Info"]] + table = [ + [ + "Collection", + "Name", + "Unit", + "UUID", + "Version", + "Available Data Quality Info", + ] + ] # add args as table columns if user provides them if additional_cols: if not all(a in KNOWN_TAGS for a in additional_cols): - contains_annotations=True + contains_annotations = True table[0].extend(additional_cols) # query for metadata for all streams upfront @@ -273,7 +298,10 @@ def describe(self, notebook=False, *additional_cols): uu_str = ",".join(f"'{uu}'" for uu in uuids) if not contains_annotations: query = f"SELECT uuid, name, unit, distiller, ingress FROM streams WHERE uuid IN ({uu_str})" - meta = {res["uuid"]: {tag: res.get(tag) for tag in KNOWN_TAGS} for res in self._conn.query(query)} + meta = { + res["uuid"]: {tag: res.get(tag) for tag in KNOWN_TAGS} + for res in self._conn.query(query) + } else: query = f""" SELECT uuid, annotations, name, unit, distiller, ingress @@ -281,9 +309,12 @@ def describe(self, notebook=False, *additional_cols): WHERE uuid IN ({uu_str}) """ meta = { - res["uuid"]: {**res["annotations"], **{tag: res.get(tag) for tag in KNOWN_TAGS}} - for res in self._conn.query(query) - } + res["uuid"]: { + **res["annotations"], + **{tag: res.get(tag) for tag in KNOWN_TAGS}, + } + for res in self._conn.query(query) + } # iterate through streams, lookup metadata by uuid for stream in self._streams: @@ -319,10 +350,7 @@ def list_distillates(self): as well as bool values for each distiller that denote which distillates are available to the DQStream """ - return [ - stream.list_distillates() - for stream in self._streams - ] + return [stream.list_distillates() for stream in self._streams] def contains_any_issue(self, start=None, end=None, depth=30): """ @@ -337,7 +365,7 @@ def contains_any_issue(self, start=None, end=None, depth=30): depth: (optional) int The precision of the window duration as a power of 2 in nanoseconds. e.g 30 would make the window duration accurate to roughly 1 second - + Returns ------- dict[str, bool] @@ -345,7 +373,9 @@ def contains_any_issue(self, start=None, end=None, depth=30): contain any event """ return { - str(stream.uuid): stream.contains_any_issue(start=start, end=end, depth=depth) + str(stream.uuid): stream.contains_any_issue( + start=start, end=end, depth=depth + ) for stream in self._streams } @@ -364,7 +394,7 @@ def contains_issue(self, distil_type, start=None, end=None, depth=30): depth: (optional) int The precision of the window duration as a power of 2 in nanoseconds. e.g 30 would make the window duration accurate to roughly 1 second - + Returns ------- dict[str, bool] @@ -372,10 +402,12 @@ def contains_issue(self, distil_type, start=None, end=None, depth=30): a certain event """ return { - str(stream.uuid): stream.contains_issue(distil_type, start=start, end=end, depth=depth) + str(stream.uuid): stream.contains_issue( + distil_type, start=start, end=end, depth=depth + ) for stream in self._streams } - + def __getitem__(self, index): """ Returns the DQStream contained at a given index within the set diff --git a/btrdbextras/ds_utils/__init__.py b/btrdbextras/ds_utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/btrdbextras/ds_utils/stream_info.py b/btrdbextras/ds_utils/stream_info.py new file mode 100644 index 0000000..e9d12eb --- /dev/null +++ b/btrdbextras/ds_utils/stream_info.py @@ -0,0 +1,404 @@ +""" +Module for general utility functions for PingThings DataSci Team. +""" +########################################################################## +# Imports +########################################################################## +import warnings +from typing import List, Union + +import numpy as np +import pandas as pd +from btrdb.stream import Stream +from btrdb.utils.timez import ns_delta + +__all__ = [ + "describe_streams", + "find_samplerate", + "print_status_code_description", + "StreamType", + "ANGLE", + "CONDUCTANCE", + "CURRENT", + "DQ", + "FREQUENCY", + "POWER", + "RESISTANCE", + "VOLTAGE", +] + +########################################################################## +# Constants +########################################################################## +KNOWN_HZ = np.array([1 / (15 * 60), 15, 30, 60, 120]) + +# Unit types +ANGLE = "angle" +CONDUCTANCE = "conductance" +CURRENT = "current" +DQ = "data quality" +FREQUENCY = "frequency" +POWER = "power" +RESISTANCE = "resistance" +VOLTAGE = "voltage" + +# StreamTypeMap categorize streams based on provided units +StreamTypeMap = { + "": (None, 1), + "A": (CURRENT, 1), + "Amp": (CURRENT, 1), + "Amps": (CURRENT, 1), + "amps": (CURRENT, 1), + "arcmin": (ANGLE, 1 / 60), + "CurrentAcInternalShunt": (CURRENT, 1), + "DC/V": (VOLTAGE, 1), + "Deg": (ANGLE, 1), + "deg": (ANGLE, 1), + "Degree": (ANGLE, 1), + "Degrees": (ANGLE, 1), + "degrees": (ANGLE, 1), + "FLAG": (DQ, 1), + "FREQ": (FREQUENCY, 1), + "Freq": (FREQUENCY, 1), + "Hz": (FREQUENCY, 1), + "IPHA": (ANGLE, 1), + "IPHM": (CURRENT, 1), + "KA": (CURRENT, 1e3), + "kA": (CURRENT, 1e3), + "kAmps": (CURRENT, 1e3), + "kilovolts": (VOLTAGE, 1e3), + "kOhms": (RESISTANCE, 1e3), + "KV": (VOLTAGE, 1e3), + "kV": (VOLTAGE, 1e3), + "kVolt": (VOLTAGE, 1e3), + "kVolts": (VOLTAGE, 1e3), + "millivolts": (VOLTAGE, 1e-3), + "MVAR": (POWER, 1e6), + "MVar": (POWER, 1e6), + "MVARS": (POWER, 1e6), + "MVr": (VOLTAGE, 1e6), + "MW": (POWER, 1e6), + "Ohms": (RESISTANCE, 1), + "radian": (ANGLE, 1), + "Radian": (ANGLE, 1), + "radians": (ANGLE, 1), + "Radians": (ANGLE, 1), + "rpm": (FREQUENCY, 1), + "Siemens": (CONDUCTANCE, 1), + "STAT": (DQ, 1), + "STAcAmp": (CURRENT, 1), + "STActivePower": (POWER, 1), + "STAcVolt": (VOLTAGE, 1), + "STApparentPower": (POWER, 1), + "STDcAmp": (CURRENT, 1), + "STDcVolt": (VOLTAGE, 1), + "STReactivePower": (POWER, 1), + "V": (VOLTAGE, 1), + "v": (VOLTAGE, 1), + "VAR": (POWER, 1), + "VA": (POWER, 1), + "Vars": (POWER, 1), + "Volt": (VOLTAGE, 1), + "VoltageAc": (VOLTAGE, 1), + "Volts": (VOLTAGE, 1), + "volts": (VOLTAGE, 1), + "VPHA": (ANGLE, 1), + "VPHM": (VOLTAGE, 1), + "Vr": (VOLTAGE, 1), + "W": (POWER, 1), + "Watts": (POWER, 1), + # "%": (TODO, 1), # TODO: fill in missing value from Dominion + # "ALOG": (TODO, 1), # TODO: fill in missing value from Dominion + # "Analog": (TODO, 1), # TODO: fill in missing value from Dominion + # "DIGI": (TODO, 1), # TODO: fill in missing value from Dominion + # "Digital": (TODO, 1), # TODO: fill in missing value from Dominion + # "digital": (TODO, 1), # TODO: fill in missing value from Dominion + # "Phasor": (TODO, 1), # TODO: fill in missing value from Dominion + # "PU": (TODO, 1), # TODO: fill in missing value from Dominion + # "QUAL": (TODO, 1), # TODO: fill in missing value from Dominion +} + +FLAG_BIT_MAP = { + (0, 1): { + "11": "Available for user definition", + "10": "Available for user definition", + }, + (0, 3): { + "0111": "Digital", + "0110": "Reserved", + "0101": "df/dt High", + "0100": "Frequency high or low", + "0011": "Phase angle diff", + "0010": "Magnitude high", + "0001": "Magnitude low", + "0000": "Manual", + }, + (4, 5): { + # "00" : "sync locked or unlocked < 10 s (best quality)", + "01": "10 s ≤ unlocked time < 100 s", + "10": "100 s < unlock time ≤ 1000 s", + "11": "unlocked time > 1000 s", + }, + (6, 8): { + "111": "Estimated maximum time error > 10 ms or time error unknown ", + "110": "Estimated maximum time error < 10 ms ", + "101": "Estimated maximum time error < 1 ms", + "100": "Estimated maximum time error < 100 μs", + "011": "Estimated maximum time error < 10 μs", + "010": "Estimated maximum time error < 1 μs ", + "001": "Estimated maximum time error < 100 ns", + # "000": "Not used (indicates code from previous version of profile)" + }, + (9, 9): { + # "0": "data not modified by post processing" + "1": "data modified by post processing", + }, + (10, 10): {"1": "Configuration changed, for 1 min"}, + (11, 11): { + # "0": "No PMU trigger" + "1": "PMU trigger detected", + }, + (12, 12): { + # "0": "Data sort by time stamp", + "1": "Data sort by arrival" + }, + (13, 13): { + # "0": "when in sync with a UTC traceable time source", + "1": "not in sync with a UTC traceable time source" + }, + (14, 15): { + # "00" : "good measurement data, no errors", + "01": "PMU error. No information about data", + "10": "PMU in test mode (do not use values) or absent data tags have been inserted (do not use values)", + "11": "PMU error (do not use values)", + }, + (16, 16): {"1": "Device error (including configuration error)"}, + # GPA extended bits + (17, 17): { + # "0": "Data sort by time stamp", + "1": "Data sort by arrival" + }, + (18, 18): { + # "0": "Synchronization is valid", + "1": "Synchronization is not valid" + }, + (19, 19): {"1": "Data is invalid or device is in test mode"}, + (20, 20): { + "1": "Data was discarded from real-time stream due to late arrival", + # "0": "Data was not discarded" + }, +} + + +########################################################################## +# General utilities +########################################################################## +def describe_streams( + streams: List[Stream], display_annotations=False, filter_annotations=None +): + """ + This function displays streams info such as collection, UUID, tags and annotations in Dataframe format. + + Parameters + ---------- + streams : list of Stream objects or Streamset. + Streams to display streams info. + display_annotations: bool, optional. + Whether to display annotations. Default is False. + filter_annotations : [str], optional. + Only display the specified annotations along with the tags, collection and UUID. + + Returns + ------- + pandas.DataFrame + DataFrame displaying streams info. + + Examples + ---------- + >>> streams = conn.streams_in_collection('sunshine/PMU3') + >>> describe_streams(streams) + """ + + table = [] + for idx, stream in enumerate(streams): + stream_info_dict = {"collection": stream.collection, "UUID": str(stream.uuid)} + stream_info_dict.update(stream.tags()) + + if display_annotations: + annotations = stream.annotations()[0] + stream_info_dict.update(annotations) + + table.append(stream_info_dict) + + table_df = pd.DataFrame(table) + + if filter_annotations is not None: + if not isinstance(filter_annotations, list) or not all( + isinstance(annotation, str) for annotation in filter_annotations + ): + raise TypeError("filter_annotations has to be a list of str.") + + # find filter_annotations that are not in "annotations", this might break if python version is below 3.7 + # since dictionaries are not ordered for python version lower than 3.7 + not_found_annotations = [ + annotation + for annotation in filter_annotations + if annotation not in table_df.columns[6:] + ] + if len(not_found_annotations) > 0: + raise ValueError(f"{not_found_annotations} not found in annotations.") + + table_df = table_df[ + ["collection", "UUID", "name", "unit", "distiller", "ingress"] + + filter_annotations + ] + + return table_df + + +def find_samplerate(stream, pw=50, update=False, version=0): + """ + Find the sample rate of the stream. + + Parameters + ---------- + stream : Stream + BTrDB Stream object + pw : int + pointwidth (default is 50) approximately 13 days, creating ~28 time points in a + year to calculate sampling rate from. + update: bool + (default - False) whether to update the stream annotation with the sample rate + version: int + specify which version to use + + Returns + ------- + Fs : int + Calculated sampling rate of the stream. + """ + + def _find_sampling(stream, s, e, v): + d = [_[0].time for _ in stream.values(s, e, v)] + if len(d) in {0, 1}: + return + temp = pd.Series(d, name="time") + + # find the median time difference from timestamps convert nanoseconds to seconds + fs = round((temp.diff().median() / 1e6), 2) / 1.0e3 + if fs == 0: + return + else: + return 1 / fs + + start = stream.earliest()[0].time + end = stream.latest()[0].time + n_range = ns_delta(minutes=60) + # find sample rates from 60 mins of every 2nd time window of the aligned_windows (if + # there's more than 10 windows) + windows = stream.aligned_windows( + start, end, pw, version=version + ) # returns list of tuples + if len(windows) > 10: + windows = windows[1:-2:2] + warnings.warn( + f" {stream.uuid.hex}: calculating sample rate from every other window of" + f"pointwidht = {pw})" + ) + Fs = [ + _find_sampling(stream, _[0].time, _[0].time + n_range, version) for _ in windows + ] + Fs = np.mean([_ for _ in Fs if _]) + if np.isnan(Fs): + warnings.warn(f" {stream.uuid.hex} has no data to calculate sampling rate from") + else: + Fs = float(KNOWN_HZ[np.abs(KNOWN_HZ - Fs).argmin()]) + if update: + stream.update(annotations={"sample_rate": Fs}) + return Fs + + +def print_status_code_description(status_code: int): + """ + Print out the description of the STAT/FLAG stream from c37 bit mapping. + + Parameters + ---------- + status_code : int + + Returns + ------- + + Examples + -------- + >>> print_status_code_description(4) + 4 = 0010 0000 0000 0000 0000 0 + - Magnitude high + + >>> print_status_code_description(557056) + 557056 = 0000 0000 0000 0001 0001 0 + - Manual + - PMU error. No information about data + - Data is invalid or device is in test mode + + """ + flag = f"{status_code:b}".rjust(21, "0")[::-1] + _bitmap_flags = " ".join([flag[i : i + 4] for i in range(0, len(flag), 4)]) + print(f"{status_code} = {_bitmap_flags}") + for (start_idx, end_idx), descriptions in FLAG_BIT_MAP.items(): + if flag[start_idx : end_idx + 1] in descriptions.keys(): + _description = descriptions.get( + flag[start_idx : end_idx + 1], "Unclear on flag" + ) + print(f" - {_description}") + + +########################################################################## +# StreamType class from Unit +########################################################################## + + +class StreamType: + """ + The StreamType class is used to determine a stream's tagged unit to their corresponding general + unit types, such as Voltage, Current, etc and scale factors to base unit of measurements. + + Examples + -------- + + Create a stream type object for voltage with a scale factor of 1 and print the unit type and + scale factor + + >>> voltage_streamtype = StreamType.from_unit("VPHM") + >>> print(voltage_streamtype.unit_type, voltage_streamtype.scalefactor) + (Voltage, 1) + + Create a stream type object for current with a scale factor of 1000 + + >>> current_streamtype = StreamType.from_unit("kA") + >>> print(current_streamtype.unit_type, current_streamtype.scalefactor) + CURRENT, 1000 + + Can check each stream's unit type to be used in per-unit calculations + + >>> from btrdbextras.ds_utils.stream_info import VOLTAGE, CURRENT + >>> tagged_unit = stream.unit() # Stream's unit is 'VPHM' + >>> if StreamType.from_unit(tagged_unit) == VOLTAGE: + >>> # calculation for per-unit with basekV value + >>> pass + >>> else: + >>> # calculation for per-unit with basePower value + >>> pass + + """ + + def __init__(self, unit_type: str, scalefactor: Union[int, float]): + self.unit_type = unit_type + self.scalefactor = scalefactor + + def __repr__(self): + return f"<{self.unit_type.title()}: scale-factor={self.scalefactor:.0f}>" + + @classmethod + def from_unit(cls, stream_unit: str): + return cls(*StreamTypeMap[stream_unit]) diff --git a/btrdbextras/eventproc/__init__.py b/btrdbextras/eventproc/__init__.py index ae8d7e7..ddc489b 100644 --- a/btrdbextras/eventproc/__init__.py +++ b/btrdbextras/eventproc/__init__.py @@ -1,3 +1,10 @@ -from .eventproc import hooks, list_handlers, register, deregister, upload_file, _uploads +from .eventproc import _uploads, deregister, hooks, list_handlers, register, upload_file -__all__ = ['hooks', 'list_handlers', 'register', 'deregister', 'upload_file', '_uploads'] \ No newline at end of file +__all__ = [ + "hooks", + "list_handlers", + "register", + "deregister", + "upload_file", + "_uploads", +] diff --git a/btrdbextras/eventproc/eventproc.py b/btrdbextras/eventproc/eventproc.py index f80b7d7..95b157b 100644 --- a/btrdbextras/eventproc/eventproc.py +++ b/btrdbextras/eventproc/eventproc.py @@ -17,26 +17,34 @@ import io import os -import warnings import uuid +import warnings from collections import namedtuple +import certifi import dill import grpc -import certifi from btrdb.utils.timez import ns_to_datetime -from btrdbextras.eventproc.protobuff import api_pb2 -from btrdbextras.eventproc.protobuff import api_pb2_grpc -__all__ = ['hooks', 'list_handlers', 'register', 'deregister', 'upload_file', '_uploads'] +from btrdbextras.eventproc.protobuff import api_pb2, api_pb2_grpc + +__all__ = [ + "hooks", + "list_handlers", + "register", + "deregister", + "upload_file", + "_uploads", +] _uploads = {} -PATH_PREFIX="/eventproc" +PATH_PREFIX = "/eventproc" ########################################################################## ## Helper Functions ########################################################################## + def connect(conn): parts = conn.endpoint.split(":", 2) endpoint = conn.endpoint + PATH_PREFIX @@ -67,7 +75,9 @@ def connect(conn): except Exception: if env_bundle != "": # The user has given us something but we can't use it, we need to make noise - raise Exception("BTRDB_CA_BUNDLE(%s) env is defined but could not read file" % ca_bundle) + raise Exception( + "BTRDB_CA_BUNDLE(%s) env is defined but could not read file" % ca_bundle + ) else: contents = None @@ -75,8 +85,8 @@ def connect(conn): endpoint, grpc.composite_channel_credentials( grpc.ssl_channel_credentials(contents), - grpc.access_token_call_credentials(apikey) - ) + grpc.access_token_call_credentials(apikey), + ), ) @@ -84,7 +94,11 @@ def connect(conn): ## Helper Classes ########################################################################## -HandlerBase = namedtuple("HandlerBase", "id name hook version notify_on_success notify_on_failure tags created_at created_by updated_at updated_by") +HandlerBase = namedtuple( + "HandlerBase", + "id name hook version notify_on_success notify_on_failure tags created_at created_by updated_at updated_by", +) + class Handler(HandlerBase): """ @@ -95,11 +109,20 @@ class Handler(HandlerBase): @classmethod def from_grpc(cls, h): return cls( - h.id, h.name, h.hook, h.version, h.notify_on_success, h.notify_on_failure, - h.tag, ns_to_datetime(h.created_at), h.created_by, - ns_to_datetime(h.updated_at), h.updated_by + h.id, + h.name, + h.hook, + h.version, + h.notify_on_success, + h.notify_on_failure, + h.tag, + ns_to_datetime(h.created_at), + h.created_by, + ns_to_datetime(h.updated_at), + h.updated_by, ) + class Service(object): """ Helper class to integrate with GRPC generated code. @@ -120,7 +143,17 @@ def ListHandlers(self, hook): for result in response.handlers: yield result - def Register(self, name, hook, func, apikey, notify_on_success, notify_on_failure, dependencies, tags): + def Register( + self, + name, + hook, + func, + apikey, + notify_on_success, + notify_on_failure, + dependencies, + tags, + ): # convert decorated function to bytes buff = io.BytesIO() dill.dump(func, buff) @@ -128,14 +161,14 @@ def Register(self, name, hook, func, apikey, notify_on_success, notify_on_failur params = api_pb2.RegisterRequest( registration=api_pb2.Registration( - name=name, - hook=hook, - blob=buff.read(), - api_key=apikey, - notify_on_success=notify_on_success, - notify_on_failure=notify_on_failure, - dependencies=dependencies, - tags=tags, + name=name, + hook=hook, + blob=buff.read(), + api_key=apikey, + notify_on_success=notify_on_success, + notify_on_failure=notify_on_failure, + dependencies=dependencies, + tags=tags, ) ) @@ -153,6 +186,7 @@ def Deregister(self, handler_id): ## Public Functions ########################################################################## + def hooks(conn): """ List registered hooks. @@ -165,6 +199,7 @@ def hooks(conn): s = Service(connect(conn)) return s.ListHooks() + def list_handlers(conn, hook=""): """ List registered handlers. An optional hook name is allowed to filter @@ -227,16 +262,25 @@ def register(conn, name, hook, notify_on_success, notify_on_failure, tags=None): # inner will actually receive the decorated func but we still have access # to the args & kwargs due to closure/scope. def inner(func): - # call grpc service to register event handler s = Service(connect(conn)) - _ = s.Register(name, hook, func, conn.apikey, notify_on_success, notify_on_failure, dependencies, tags) + _ = s.Register( + name, + hook, + func, + conn.apikey, + notify_on_success, + notify_on_failure, + dependencies, + tags, + ) # return original func back to user return func return inner + def upload_file(file, file_name): """ Uploads file to S3. Returns a link to download the file. @@ -256,12 +300,12 @@ def upload_file(file, file_name): TypeError: file_name must be a string. ValueError: file must be a path to a file, relative to the home directory. ValueError: file_name cannot be longer than 200 characters, is . - + Returns ---------- string: Download link to the object. None if upload was not attempted. """ - + # check the inputs if not isinstance(file, str): raise TypeError("file must be a string.") @@ -270,16 +314,20 @@ def upload_file(file, file_name): if not os.path.exists(file): raise ValueError("file must be a path to a file.") if len(file_name) > 200: - raise ValueError("file_name cannot be longer than 200 characters, is {0}.".format(len(file_name))) + raise ValueError( + "file_name cannot be longer than 200 characters, is {0}.".format( + len(file_name) + ) + ) # check the context if not os.getenv("EXECUTOR_CONTEXT") == "true": m = "upload_file is running in an execution context without the appropriate AWS credentials and will not upload to S3." warnings.warn(m) return None - + # queue the upload, to be completed by the executor when the handler completes code = str(uuid.uuid4().hex) _uploads[code] = [file, file_name] - - return "https://{0}/{1}".format(os.getenv("DOWNLOADS_ENDPOINT"), code) \ No newline at end of file + + return "https://{0}/{1}".format(os.getenv("DOWNLOADS_ENDPOINT"), code) diff --git a/btrdbextras/eventproc/protobuff/api_pb2.py b/btrdbextras/eventproc/protobuff/api_pb2.py index b08d400..bd69e75 100644 --- a/btrdbextras/eventproc/protobuff/api_pb2.py +++ b/btrdbextras/eventproc/protobuff/api_pb2.py @@ -6,651 +6,1006 @@ from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() - - DESCRIPTOR = _descriptor.FileDescriptor( - name='api.proto', - package='eventprocapi', - syntax='proto3', - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\tapi.proto\x12\x0c\x65ventprocapi\"#\n\x13ListHandlersRequest\x12\x0c\n\x04hook\x18\x01 \x01(\t\"?\n\x14ListHandlersResponse\x12\'\n\x08handlers\x18\x01 \x03(\x0b\x32\x15.eventprocapi.Handler\"\xe7\x01\n\x07Handler\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04hook\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\x10\n\x08\x63\x61llable\x18\x05 \x01(\t\x12\x0b\n\x03tag\x18\x06 \x03(\t\x12\x19\n\x11notify_on_success\x18\x07 \x01(\t\x12\x19\n\x11notify_on_failure\x18\x08 \x01(\t\x12\x12\n\ncreated_by\x18\t \x01(\t\x12\x12\n\ncreated_at\x18\n \x01(\x03\x12\x12\n\nupdated_by\x18\x0b \x01(\t\x12\x12\n\nupdated_at\x18\x0c \x01(\x03\"\x12\n\x10ListHooksRequest\"6\n\x11ListHooksResponse\x12!\n\x05hooks\x18\x01 \x03(\x0b\x32\x12.eventprocapi.Hook\"\x14\n\x04Hook\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xb1\x01\n\x0cRegistration\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04hook\x18\x02 \x01(\t\x12\x0c\n\x04tags\x18\x03 \x03(\t\x12\x0c\n\x04\x62lob\x18\x04 \x01(\x0c\x12\x19\n\x11notify_on_success\x18\x05 \x01(\t\x12\x19\n\x11notify_on_failure\x18\x06 \x01(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x07 \x01(\t\x12\x0c\n\x04user\x18\x08 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\t \x01(\t\"C\n\x0fRegisterRequest\x12\x30\n\x0cregistration\x18\x01 \x01(\x0b\x32\x1a.eventprocapi.Registration\":\n\x10RegisterResponse\x12&\n\x07handler\x18\x01 \x01(\x0b\x32\x15.eventprocapi.Handler\"\x1f\n\x11\x44\x65registerRequest\x12\n\n\x02id\x18\x01 \x01(\x05\" \n\x12\x44\x65registerResponse\x12\n\n\x02id\x18\x01 \x01(\x05\x32\xe1\x02\n\x16\x45ventProcessingService\x12N\n\tListHooks\x12\x1e.eventprocapi.ListHooksRequest\x1a\x1f.eventprocapi.ListHooksResponse\"\x00\x12W\n\x0cListHandlers\x12!.eventprocapi.ListHandlersRequest\x1a\".eventprocapi.ListHandlersResponse\"\x00\x12K\n\x08Register\x12\x1d.eventprocapi.RegisterRequest\x1a\x1e.eventprocapi.RegisterResponse\"\x00\x12Q\n\nDeregister\x12\x1f.eventprocapi.DeregisterRequest\x1a .eventprocapi.DeregisterResponse\"\x00\x62\x06proto3' + name="api.proto", + package="eventprocapi", + syntax="proto3", + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\tapi.proto\x12\x0c\x65ventprocapi"#\n\x13ListHandlersRequest\x12\x0c\n\x04hook\x18\x01 \x01(\t"?\n\x14ListHandlersResponse\x12\'\n\x08handlers\x18\x01 \x03(\x0b\x32\x15.eventprocapi.Handler"\xe7\x01\n\x07Handler\x12\n\n\x02id\x18\x01 \x01(\x05\x12\x0c\n\x04hook\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0f\n\x07version\x18\x04 \x01(\x05\x12\x10\n\x08\x63\x61llable\x18\x05 \x01(\t\x12\x0b\n\x03tag\x18\x06 \x03(\t\x12\x19\n\x11notify_on_success\x18\x07 \x01(\t\x12\x19\n\x11notify_on_failure\x18\x08 \x01(\t\x12\x12\n\ncreated_by\x18\t \x01(\t\x12\x12\n\ncreated_at\x18\n \x01(\x03\x12\x12\n\nupdated_by\x18\x0b \x01(\t\x12\x12\n\nupdated_at\x18\x0c \x01(\x03"\x12\n\x10ListHooksRequest"6\n\x11ListHooksResponse\x12!\n\x05hooks\x18\x01 \x03(\x0b\x32\x12.eventprocapi.Hook"\x14\n\x04Hook\x12\x0c\n\x04name\x18\x01 \x01(\t"\xb1\x01\n\x0cRegistration\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x0c\n\x04hook\x18\x02 \x01(\t\x12\x0c\n\x04tags\x18\x03 \x03(\t\x12\x0c\n\x04\x62lob\x18\x04 \x01(\x0c\x12\x19\n\x11notify_on_success\x18\x05 \x01(\t\x12\x19\n\x11notify_on_failure\x18\x06 \x01(\t\x12\x14\n\x0c\x64\x65pendencies\x18\x07 \x01(\t\x12\x0c\n\x04user\x18\x08 \x01(\t\x12\x0f\n\x07\x61pi_key\x18\t \x01(\t"C\n\x0fRegisterRequest\x12\x30\n\x0cregistration\x18\x01 \x01(\x0b\x32\x1a.eventprocapi.Registration":\n\x10RegisterResponse\x12&\n\x07handler\x18\x01 \x01(\x0b\x32\x15.eventprocapi.Handler"\x1f\n\x11\x44\x65registerRequest\x12\n\n\x02id\x18\x01 \x01(\x05" \n\x12\x44\x65registerResponse\x12\n\n\x02id\x18\x01 \x01(\x05\x32\xe1\x02\n\x16\x45ventProcessingService\x12N\n\tListHooks\x12\x1e.eventprocapi.ListHooksRequest\x1a\x1f.eventprocapi.ListHooksResponse"\x00\x12W\n\x0cListHandlers\x12!.eventprocapi.ListHandlersRequest\x1a".eventprocapi.ListHandlersResponse"\x00\x12K\n\x08Register\x12\x1d.eventprocapi.RegisterRequest\x1a\x1e.eventprocapi.RegisterResponse"\x00\x12Q\n\nDeregister\x12\x1f.eventprocapi.DeregisterRequest\x1a .eventprocapi.DeregisterResponse"\x00\x62\x06proto3', ) - - _LISTHANDLERSREQUEST = _descriptor.Descriptor( - name='ListHandlersRequest', - full_name='eventprocapi.ListHandlersRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='hook', full_name='eventprocapi.ListHandlersRequest.hook', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=27, - serialized_end=62, + name="ListHandlersRequest", + full_name="eventprocapi.ListHandlersRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="hook", + full_name="eventprocapi.ListHandlersRequest.hook", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=27, + serialized_end=62, ) _LISTHANDLERSRESPONSE = _descriptor.Descriptor( - name='ListHandlersResponse', - full_name='eventprocapi.ListHandlersResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='handlers', full_name='eventprocapi.ListHandlersResponse.handlers', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=64, - serialized_end=127, + name="ListHandlersResponse", + full_name="eventprocapi.ListHandlersResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="handlers", + full_name="eventprocapi.ListHandlersResponse.handlers", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=64, + serialized_end=127, ) _HANDLER = _descriptor.Descriptor( - name='Handler', - full_name='eventprocapi.Handler', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='eventprocapi.Handler.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='hook', full_name='eventprocapi.Handler.hook', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='name', full_name='eventprocapi.Handler.name', index=2, - number=3, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='version', full_name='eventprocapi.Handler.version', index=3, - number=4, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='callable', full_name='eventprocapi.Handler.callable', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tag', full_name='eventprocapi.Handler.tag', index=5, - number=6, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='notify_on_success', full_name='eventprocapi.Handler.notify_on_success', index=6, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='notify_on_failure', full_name='eventprocapi.Handler.notify_on_failure', index=7, - number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='created_by', full_name='eventprocapi.Handler.created_by', index=8, - number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='created_at', full_name='eventprocapi.Handler.created_at', index=9, - number=10, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='updated_by', full_name='eventprocapi.Handler.updated_by', index=10, - number=11, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='updated_at', full_name='eventprocapi.Handler.updated_at', index=11, - number=12, type=3, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=130, - serialized_end=361, + name="Handler", + full_name="eventprocapi.Handler", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="id", + full_name="eventprocapi.Handler.id", + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="hook", + full_name="eventprocapi.Handler.hook", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="name", + full_name="eventprocapi.Handler.name", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="version", + full_name="eventprocapi.Handler.version", + index=3, + number=4, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="callable", + full_name="eventprocapi.Handler.callable", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="tag", + full_name="eventprocapi.Handler.tag", + index=5, + number=6, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="notify_on_success", + full_name="eventprocapi.Handler.notify_on_success", + index=6, + number=7, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="notify_on_failure", + full_name="eventprocapi.Handler.notify_on_failure", + index=7, + number=8, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="created_by", + full_name="eventprocapi.Handler.created_by", + index=8, + number=9, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="created_at", + full_name="eventprocapi.Handler.created_at", + index=9, + number=10, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="updated_by", + full_name="eventprocapi.Handler.updated_by", + index=10, + number=11, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="updated_at", + full_name="eventprocapi.Handler.updated_at", + index=11, + number=12, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=130, + serialized_end=361, ) _LISTHOOKSREQUEST = _descriptor.Descriptor( - name='ListHooksRequest', - full_name='eventprocapi.ListHooksRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=363, - serialized_end=381, + name="ListHooksRequest", + full_name="eventprocapi.ListHooksRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=363, + serialized_end=381, ) _LISTHOOKSRESPONSE = _descriptor.Descriptor( - name='ListHooksResponse', - full_name='eventprocapi.ListHooksResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='hooks', full_name='eventprocapi.ListHooksResponse.hooks', index=0, - number=1, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=383, - serialized_end=437, + name="ListHooksResponse", + full_name="eventprocapi.ListHooksResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="hooks", + full_name="eventprocapi.ListHooksResponse.hooks", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=383, + serialized_end=437, ) _HOOK = _descriptor.Descriptor( - name='Hook', - full_name='eventprocapi.Hook', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='eventprocapi.Hook.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=439, - serialized_end=459, + name="Hook", + full_name="eventprocapi.Hook", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="eventprocapi.Hook.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=439, + serialized_end=459, ) _REGISTRATION = _descriptor.Descriptor( - name='Registration', - full_name='eventprocapi.Registration', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='name', full_name='eventprocapi.Registration.name', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='hook', full_name='eventprocapi.Registration.hook', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='tags', full_name='eventprocapi.Registration.tags', index=2, - number=3, type=9, cpp_type=9, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='blob', full_name='eventprocapi.Registration.blob', index=3, - number=4, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='notify_on_success', full_name='eventprocapi.Registration.notify_on_success', index=4, - number=5, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='notify_on_failure', full_name='eventprocapi.Registration.notify_on_failure', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='dependencies', full_name='eventprocapi.Registration.dependencies', index=6, - number=7, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='user', full_name='eventprocapi.Registration.user', index=7, - number=8, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='api_key', full_name='eventprocapi.Registration.api_key', index=8, - number=9, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=462, - serialized_end=639, + name="Registration", + full_name="eventprocapi.Registration", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="eventprocapi.Registration.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="hook", + full_name="eventprocapi.Registration.hook", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="tags", + full_name="eventprocapi.Registration.tags", + index=2, + number=3, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="blob", + full_name="eventprocapi.Registration.blob", + index=3, + number=4, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="notify_on_success", + full_name="eventprocapi.Registration.notify_on_success", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="notify_on_failure", + full_name="eventprocapi.Registration.notify_on_failure", + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="dependencies", + full_name="eventprocapi.Registration.dependencies", + index=6, + number=7, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="user", + full_name="eventprocapi.Registration.user", + index=7, + number=8, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="api_key", + full_name="eventprocapi.Registration.api_key", + index=8, + number=9, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=462, + serialized_end=639, ) _REGISTERREQUEST = _descriptor.Descriptor( - name='RegisterRequest', - full_name='eventprocapi.RegisterRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='registration', full_name='eventprocapi.RegisterRequest.registration', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=641, - serialized_end=708, + name="RegisterRequest", + full_name="eventprocapi.RegisterRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="registration", + full_name="eventprocapi.RegisterRequest.registration", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=641, + serialized_end=708, ) _REGISTERRESPONSE = _descriptor.Descriptor( - name='RegisterResponse', - full_name='eventprocapi.RegisterResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='handler', full_name='eventprocapi.RegisterResponse.handler', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=710, - serialized_end=768, + name="RegisterResponse", + full_name="eventprocapi.RegisterResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="handler", + full_name="eventprocapi.RegisterResponse.handler", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=710, + serialized_end=768, ) _DEREGISTERREQUEST = _descriptor.Descriptor( - name='DeregisterRequest', - full_name='eventprocapi.DeregisterRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='eventprocapi.DeregisterRequest.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=770, - serialized_end=801, + name="DeregisterRequest", + full_name="eventprocapi.DeregisterRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="id", + full_name="eventprocapi.DeregisterRequest.id", + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=770, + serialized_end=801, ) _DEREGISTERRESPONSE = _descriptor.Descriptor( - name='DeregisterResponse', - full_name='eventprocapi.DeregisterResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='id', full_name='eventprocapi.DeregisterResponse.id', index=0, - number=1, type=5, cpp_type=1, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=803, - serialized_end=835, + name="DeregisterResponse", + full_name="eventprocapi.DeregisterResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="id", + full_name="eventprocapi.DeregisterResponse.id", + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=803, + serialized_end=835, ) -_LISTHANDLERSRESPONSE.fields_by_name['handlers'].message_type = _HANDLER -_LISTHOOKSRESPONSE.fields_by_name['hooks'].message_type = _HOOK -_REGISTERREQUEST.fields_by_name['registration'].message_type = _REGISTRATION -_REGISTERRESPONSE.fields_by_name['handler'].message_type = _HANDLER -DESCRIPTOR.message_types_by_name['ListHandlersRequest'] = _LISTHANDLERSREQUEST -DESCRIPTOR.message_types_by_name['ListHandlersResponse'] = _LISTHANDLERSRESPONSE -DESCRIPTOR.message_types_by_name['Handler'] = _HANDLER -DESCRIPTOR.message_types_by_name['ListHooksRequest'] = _LISTHOOKSREQUEST -DESCRIPTOR.message_types_by_name['ListHooksResponse'] = _LISTHOOKSRESPONSE -DESCRIPTOR.message_types_by_name['Hook'] = _HOOK -DESCRIPTOR.message_types_by_name['Registration'] = _REGISTRATION -DESCRIPTOR.message_types_by_name['RegisterRequest'] = _REGISTERREQUEST -DESCRIPTOR.message_types_by_name['RegisterResponse'] = _REGISTERRESPONSE -DESCRIPTOR.message_types_by_name['DeregisterRequest'] = _DEREGISTERREQUEST -DESCRIPTOR.message_types_by_name['DeregisterResponse'] = _DEREGISTERRESPONSE +_LISTHANDLERSRESPONSE.fields_by_name["handlers"].message_type = _HANDLER +_LISTHOOKSRESPONSE.fields_by_name["hooks"].message_type = _HOOK +_REGISTERREQUEST.fields_by_name["registration"].message_type = _REGISTRATION +_REGISTERRESPONSE.fields_by_name["handler"].message_type = _HANDLER +DESCRIPTOR.message_types_by_name["ListHandlersRequest"] = _LISTHANDLERSREQUEST +DESCRIPTOR.message_types_by_name["ListHandlersResponse"] = _LISTHANDLERSRESPONSE +DESCRIPTOR.message_types_by_name["Handler"] = _HANDLER +DESCRIPTOR.message_types_by_name["ListHooksRequest"] = _LISTHOOKSREQUEST +DESCRIPTOR.message_types_by_name["ListHooksResponse"] = _LISTHOOKSRESPONSE +DESCRIPTOR.message_types_by_name["Hook"] = _HOOK +DESCRIPTOR.message_types_by_name["Registration"] = _REGISTRATION +DESCRIPTOR.message_types_by_name["RegisterRequest"] = _REGISTERREQUEST +DESCRIPTOR.message_types_by_name["RegisterResponse"] = _REGISTERRESPONSE +DESCRIPTOR.message_types_by_name["DeregisterRequest"] = _DEREGISTERREQUEST +DESCRIPTOR.message_types_by_name["DeregisterResponse"] = _DEREGISTERRESPONSE _sym_db.RegisterFileDescriptor(DESCRIPTOR) -ListHandlersRequest = _reflection.GeneratedProtocolMessageType('ListHandlersRequest', (_message.Message,), { - 'DESCRIPTOR' : _LISTHANDLERSREQUEST, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.ListHandlersRequest) - }) +ListHandlersRequest = _reflection.GeneratedProtocolMessageType( + "ListHandlersRequest", + (_message.Message,), + { + "DESCRIPTOR": _LISTHANDLERSREQUEST, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.ListHandlersRequest) + }, +) _sym_db.RegisterMessage(ListHandlersRequest) -ListHandlersResponse = _reflection.GeneratedProtocolMessageType('ListHandlersResponse', (_message.Message,), { - 'DESCRIPTOR' : _LISTHANDLERSRESPONSE, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.ListHandlersResponse) - }) +ListHandlersResponse = _reflection.GeneratedProtocolMessageType( + "ListHandlersResponse", + (_message.Message,), + { + "DESCRIPTOR": _LISTHANDLERSRESPONSE, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.ListHandlersResponse) + }, +) _sym_db.RegisterMessage(ListHandlersResponse) -Handler = _reflection.GeneratedProtocolMessageType('Handler', (_message.Message,), { - 'DESCRIPTOR' : _HANDLER, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.Handler) - }) +Handler = _reflection.GeneratedProtocolMessageType( + "Handler", + (_message.Message,), + { + "DESCRIPTOR": _HANDLER, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.Handler) + }, +) _sym_db.RegisterMessage(Handler) -ListHooksRequest = _reflection.GeneratedProtocolMessageType('ListHooksRequest', (_message.Message,), { - 'DESCRIPTOR' : _LISTHOOKSREQUEST, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.ListHooksRequest) - }) +ListHooksRequest = _reflection.GeneratedProtocolMessageType( + "ListHooksRequest", + (_message.Message,), + { + "DESCRIPTOR": _LISTHOOKSREQUEST, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.ListHooksRequest) + }, +) _sym_db.RegisterMessage(ListHooksRequest) -ListHooksResponse = _reflection.GeneratedProtocolMessageType('ListHooksResponse', (_message.Message,), { - 'DESCRIPTOR' : _LISTHOOKSRESPONSE, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.ListHooksResponse) - }) +ListHooksResponse = _reflection.GeneratedProtocolMessageType( + "ListHooksResponse", + (_message.Message,), + { + "DESCRIPTOR": _LISTHOOKSRESPONSE, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.ListHooksResponse) + }, +) _sym_db.RegisterMessage(ListHooksResponse) -Hook = _reflection.GeneratedProtocolMessageType('Hook', (_message.Message,), { - 'DESCRIPTOR' : _HOOK, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.Hook) - }) +Hook = _reflection.GeneratedProtocolMessageType( + "Hook", + (_message.Message,), + { + "DESCRIPTOR": _HOOK, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.Hook) + }, +) _sym_db.RegisterMessage(Hook) -Registration = _reflection.GeneratedProtocolMessageType('Registration', (_message.Message,), { - 'DESCRIPTOR' : _REGISTRATION, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.Registration) - }) +Registration = _reflection.GeneratedProtocolMessageType( + "Registration", + (_message.Message,), + { + "DESCRIPTOR": _REGISTRATION, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.Registration) + }, +) _sym_db.RegisterMessage(Registration) -RegisterRequest = _reflection.GeneratedProtocolMessageType('RegisterRequest', (_message.Message,), { - 'DESCRIPTOR' : _REGISTERREQUEST, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.RegisterRequest) - }) +RegisterRequest = _reflection.GeneratedProtocolMessageType( + "RegisterRequest", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERREQUEST, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.RegisterRequest) + }, +) _sym_db.RegisterMessage(RegisterRequest) -RegisterResponse = _reflection.GeneratedProtocolMessageType('RegisterResponse', (_message.Message,), { - 'DESCRIPTOR' : _REGISTERRESPONSE, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.RegisterResponse) - }) +RegisterResponse = _reflection.GeneratedProtocolMessageType( + "RegisterResponse", + (_message.Message,), + { + "DESCRIPTOR": _REGISTERRESPONSE, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.RegisterResponse) + }, +) _sym_db.RegisterMessage(RegisterResponse) -DeregisterRequest = _reflection.GeneratedProtocolMessageType('DeregisterRequest', (_message.Message,), { - 'DESCRIPTOR' : _DEREGISTERREQUEST, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.DeregisterRequest) - }) +DeregisterRequest = _reflection.GeneratedProtocolMessageType( + "DeregisterRequest", + (_message.Message,), + { + "DESCRIPTOR": _DEREGISTERREQUEST, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.DeregisterRequest) + }, +) _sym_db.RegisterMessage(DeregisterRequest) -DeregisterResponse = _reflection.GeneratedProtocolMessageType('DeregisterResponse', (_message.Message,), { - 'DESCRIPTOR' : _DEREGISTERRESPONSE, - '__module__' : 'api_pb2' - # @@protoc_insertion_point(class_scope:eventprocapi.DeregisterResponse) - }) +DeregisterResponse = _reflection.GeneratedProtocolMessageType( + "DeregisterResponse", + (_message.Message,), + { + "DESCRIPTOR": _DEREGISTERRESPONSE, + "__module__": "api_pb2" + # @@protoc_insertion_point(class_scope:eventprocapi.DeregisterResponse) + }, +) _sym_db.RegisterMessage(DeregisterResponse) - _EVENTPROCESSINGSERVICE = _descriptor.ServiceDescriptor( - name='EventProcessingService', - full_name='eventprocapi.EventProcessingService', - file=DESCRIPTOR, - index=0, - serialized_options=None, - create_key=_descriptor._internal_create_key, - serialized_start=838, - serialized_end=1191, - methods=[ - _descriptor.MethodDescriptor( - name='ListHooks', - full_name='eventprocapi.EventProcessingService.ListHooks', + name="EventProcessingService", + full_name="eventprocapi.EventProcessingService", + file=DESCRIPTOR, index=0, - containing_service=None, - input_type=_LISTHOOKSREQUEST, - output_type=_LISTHOOKSRESPONSE, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='ListHandlers', - full_name='eventprocapi.EventProcessingService.ListHandlers', - index=1, - containing_service=None, - input_type=_LISTHANDLERSREQUEST, - output_type=_LISTHANDLERSRESPONSE, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='Register', - full_name='eventprocapi.EventProcessingService.Register', - index=2, - containing_service=None, - input_type=_REGISTERREQUEST, - output_type=_REGISTERRESPONSE, serialized_options=None, create_key=_descriptor._internal_create_key, - ), - _descriptor.MethodDescriptor( - name='Deregister', - full_name='eventprocapi.EventProcessingService.Deregister', - index=3, - containing_service=None, - input_type=_DEREGISTERREQUEST, - output_type=_DEREGISTERRESPONSE, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), -]) + serialized_start=838, + serialized_end=1191, + methods=[ + _descriptor.MethodDescriptor( + name="ListHooks", + full_name="eventprocapi.EventProcessingService.ListHooks", + index=0, + containing_service=None, + input_type=_LISTHOOKSREQUEST, + output_type=_LISTHOOKSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name="ListHandlers", + full_name="eventprocapi.EventProcessingService.ListHandlers", + index=1, + containing_service=None, + input_type=_LISTHANDLERSREQUEST, + output_type=_LISTHANDLERSRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name="Register", + full_name="eventprocapi.EventProcessingService.Register", + index=2, + containing_service=None, + input_type=_REGISTERREQUEST, + output_type=_REGISTERRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.MethodDescriptor( + name="Deregister", + full_name="eventprocapi.EventProcessingService.Deregister", + index=3, + containing_service=None, + input_type=_DEREGISTERREQUEST, + output_type=_DEREGISTERRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), + ], +) _sym_db.RegisterServiceDescriptor(_EVENTPROCESSINGSERVICE) -DESCRIPTOR.services_by_name['EventProcessingService'] = _EVENTPROCESSINGSERVICE +DESCRIPTOR.services_by_name["EventProcessingService"] = _EVENTPROCESSINGSERVICE # @@protoc_insertion_point(module_scope) diff --git a/btrdbextras/eventproc/protobuff/api_pb2_grpc.py b/btrdbextras/eventproc/protobuff/api_pb2_grpc.py index ec3abe4..ac02e3d 100644 --- a/btrdbextras/eventproc/protobuff/api_pb2_grpc.py +++ b/btrdbextras/eventproc/protobuff/api_pb2_grpc.py @@ -4,6 +4,7 @@ import btrdbextras.eventproc.protobuff.api_pb2 as api__pb2 + class EventProcessingServiceStub(object): """Missing associated documentation comment in .proto file.""" @@ -14,25 +15,25 @@ def __init__(self, channel): channel: A grpc.Channel. """ self.ListHooks = channel.unary_unary( - '/eventprocapi.EventProcessingService/ListHooks', - request_serializer=api__pb2.ListHooksRequest.SerializeToString, - response_deserializer=api__pb2.ListHooksResponse.FromString, - ) + "/eventprocapi.EventProcessingService/ListHooks", + request_serializer=api__pb2.ListHooksRequest.SerializeToString, + response_deserializer=api__pb2.ListHooksResponse.FromString, + ) self.ListHandlers = channel.unary_unary( - '/eventprocapi.EventProcessingService/ListHandlers', - request_serializer=api__pb2.ListHandlersRequest.SerializeToString, - response_deserializer=api__pb2.ListHandlersResponse.FromString, - ) + "/eventprocapi.EventProcessingService/ListHandlers", + request_serializer=api__pb2.ListHandlersRequest.SerializeToString, + response_deserializer=api__pb2.ListHandlersResponse.FromString, + ) self.Register = channel.unary_unary( - '/eventprocapi.EventProcessingService/Register', - request_serializer=api__pb2.RegisterRequest.SerializeToString, - response_deserializer=api__pb2.RegisterResponse.FromString, - ) + "/eventprocapi.EventProcessingService/Register", + request_serializer=api__pb2.RegisterRequest.SerializeToString, + response_deserializer=api__pb2.RegisterResponse.FromString, + ) self.Deregister = channel.unary_unary( - '/eventprocapi.EventProcessingService/Deregister', - request_serializer=api__pb2.DeregisterRequest.SerializeToString, - response_deserializer=api__pb2.DeregisterResponse.FromString, - ) + "/eventprocapi.EventProcessingService/Deregister", + request_serializer=api__pb2.DeregisterRequest.SerializeToString, + response_deserializer=api__pb2.DeregisterResponse.FromString, + ) class EventProcessingServiceServicer(object): @@ -41,124 +42,173 @@ class EventProcessingServiceServicer(object): def ListHooks(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def ListHandlers(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def Register(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def Deregister(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") def add_EventProcessingServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'ListHooks': grpc.unary_unary_rpc_method_handler( - servicer.ListHooks, - request_deserializer=api__pb2.ListHooksRequest.FromString, - response_serializer=api__pb2.ListHooksResponse.SerializeToString, - ), - 'ListHandlers': grpc.unary_unary_rpc_method_handler( - servicer.ListHandlers, - request_deserializer=api__pb2.ListHandlersRequest.FromString, - response_serializer=api__pb2.ListHandlersResponse.SerializeToString, - ), - 'Register': grpc.unary_unary_rpc_method_handler( - servicer.Register, - request_deserializer=api__pb2.RegisterRequest.FromString, - response_serializer=api__pb2.RegisterResponse.SerializeToString, - ), - 'Deregister': grpc.unary_unary_rpc_method_handler( - servicer.Deregister, - request_deserializer=api__pb2.DeregisterRequest.FromString, - response_serializer=api__pb2.DeregisterResponse.SerializeToString, - ), + "ListHooks": grpc.unary_unary_rpc_method_handler( + servicer.ListHooks, + request_deserializer=api__pb2.ListHooksRequest.FromString, + response_serializer=api__pb2.ListHooksResponse.SerializeToString, + ), + "ListHandlers": grpc.unary_unary_rpc_method_handler( + servicer.ListHandlers, + request_deserializer=api__pb2.ListHandlersRequest.FromString, + response_serializer=api__pb2.ListHandlersResponse.SerializeToString, + ), + "Register": grpc.unary_unary_rpc_method_handler( + servicer.Register, + request_deserializer=api__pb2.RegisterRequest.FromString, + response_serializer=api__pb2.RegisterResponse.SerializeToString, + ), + "Deregister": grpc.unary_unary_rpc_method_handler( + servicer.Deregister, + request_deserializer=api__pb2.DeregisterRequest.FromString, + response_serializer=api__pb2.DeregisterResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - 'eventprocapi.EventProcessingService', rpc_method_handlers) + "eventprocapi.EventProcessingService", rpc_method_handlers + ) server.add_generic_rpc_handlers((generic_handler,)) - # This class is part of an EXPERIMENTAL API. +# This class is part of an EXPERIMENTAL API. class EventProcessingService(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def ListHooks(request, + def ListHooks( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/eventprocapi.EventProcessingService/ListHooks', + "/eventprocapi.EventProcessingService/ListHooks", api__pb2.ListHooksRequest.SerializeToString, api__pb2.ListHooksResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def ListHandlers(request, + def ListHandlers( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/eventprocapi.EventProcessingService/ListHandlers', + "/eventprocapi.EventProcessingService/ListHandlers", api__pb2.ListHandlersRequest.SerializeToString, api__pb2.ListHandlersResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def Register(request, + def Register( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/eventprocapi.EventProcessingService/Register', + "/eventprocapi.EventProcessingService/Register", api__pb2.RegisterRequest.SerializeToString, api__pb2.RegisterResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) @staticmethod - def Deregister(request, + def Deregister( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/eventprocapi.EventProcessingService/Deregister', + "/eventprocapi.EventProcessingService/Deregister", api__pb2.DeregisterRequest.SerializeToString, api__pb2.DeregisterResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 6247f7e..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/requirements.txt b/docs/requirements.txt index d535bde..49e71d8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,2 +1,5 @@ -sphinx -sphinx_glpi_theme +alabaster>=0.7.12 +Sphinx>=1.7 +sphinx-rtd-theme +numpydoc +pydata-sphinx-theme diff --git a/docs/source/conf.py b/docs/source/conf.py index 3e27d73..0d72cc9 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,8 +1,10 @@ +# -*- coding: utf-8 -*- +# # Configuration file for the Sphinx documentation builder. # -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config # -- Path setup -------------------------------------------------------------- @@ -16,36 +18,62 @@ import os import sys -sys.path.insert(0, os.path.abspath('../..')) -import sphinx_glpi_theme +import btrdbextras -# -- Project information ----------------------------------------------------- +sys.path.insert(0, os.path.abspath("_themes")) +sys.path.insert(0, os.path.abspath("../..")) -project = 'btrdbextras' -copyright = '2020, PingThings, Inc.' -author = 'PingThings, Inc.' +# -- Project information ----------------------------------------------------- +project = "btrdbextras" +copyright = "2023, PingThings, Inc." +author = "PingThings, Inc." +# The short X.Y version +version = btrdbextras.__version__ +# The full version, including alpha/beta/rc tags +release = version # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.napoleon', - 'sphinx.ext.githubpages', - 'sphinx.ext.intersphinx', + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx.ext.todo", + "sphinx.ext.githubpages", + "sphinx.ext.intersphinx", + "numpydoc", ] # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = ".rst" + +# The master toctree document. +master_doc = "index" + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["build", "Thumbs.db", ".DS_Store"] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = None # -- Options for HTML output ------------------------------------------------- @@ -55,6 +83,78 @@ # -html_theme = "glpi" +html_theme = "alabaster" +# html_theme = "sphinx_rtd_theme" +html_theme = "pydata_sphinx_theme" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +html_theme_options = { + "show_powered_by": False, + "github_user": "PingThingsIO", + "github_repo": "btrdbextras", + "travis_button": False, + "github_banner": False, + "show_related": False, + "note_bg": "#FFF59C", + "description": "An additional library of enhancements and features to " + "interact with the BTrDB database and Pingthings platform.", + "extra_nav_links": {"btrdb": "http://btrdb-python.readthedocs.io"}, + "show_relbars": True, +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ["_static"] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = { +# '**': [ +# 'sidebar.html', +# 'localtoc.html', +# 'relations.html', +# 'searchbox.html', +# ], +# } + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = "btrdbextras" + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ["search.html"] + + +# -- Extension configuration ------------------------------------------------- + +# -- Options for todo extension ---------------------------------------------- + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True -html_theme_path = sphinx_glpi_theme.get_html_themes_path() \ No newline at end of file +numfig = True diff --git a/docs/source/eventproc.rst b/docs/source/eventproc.rst index cd7c4d5..d0a73b1 100644 --- a/docs/source/eventproc.rst +++ b/docs/source/eventproc.rst @@ -313,4 +313,4 @@ Assuming you chose to use variadic arguments (i.e., `**kwargs`) in your event ha 'File': 'comtrade_samples.zip', 'RequestID': '0bbcacdb-e7aa-4e01-af88-9ba865ea32bd', 'SubmittedAt': '2020-10-29T21:58:15.09246084Z' - } \ No newline at end of file + } diff --git a/docs/source/installing.rst b/docs/source/installing.rst index 50dfba4..b6c4948 100644 --- a/docs/source/installing.rst +++ b/docs/source/installing.rst @@ -17,4 +17,3 @@ To upgrade using pip: .. code-block:: bash $ pip install -U btrdbextras - diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b34b2df --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,54 @@ +[project] +name = "btrdbextras" +version = "5.31.0" +description = "Enhancements additional features to interact with the Berkeley Tree Database" +authors = [ + {name="PingThingsIO", email="support@pingthings.io"}, +] +dependencies = [ + "btrdb>=5.11.7", + "certifi", + "dill==0.3.2", + "grpcio-tools>=1.16.1", + "grpcio>=1.16.1", + "sphinx_glpi_theme", + "tabulate==0.8.9", +] +requires-python = ">=3.6, <4" +readme = "README.md" +license = {file="LICENSE.txt"} +keywords = ["btrdb", "timeseries", "database"] + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: Information Technology", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + "Topic :: Database", + "Topic :: Software Development :: Libraries :: Python Modules", +] + +[project.urls] +Homepage = "https://btrdbextras.readthedocs.io/en/latest/" +Downloads = "https://github.com/PingThingsIO/btrdbextras/tarball/v5.31.0" +Documentation = "https://btrdbextras.readthedocs.io/en/latest/" +Download = "https://github.com/PingThingsIO/btrdbextras/tarball/v5.31.0" +Source = "https://github.com/PingThingsIO/btrdbextras" +Tracker = "https://github.com/PingThingsIO/btrdbextras/issues" +[build-system] +requires = ["setuptools>=61"] +build-backend = "setuptools.build_meta" + +[tool.setuptools.exclude-package-data] +drop = [ + "tests", + "docs" +] diff --git a/release.sh b/release.sh index ba08e6e..d53028c 100755 --- a/release.sh +++ b/release.sh @@ -45,4 +45,4 @@ git tag v$1.$2.$3 git push origin v$1.$2.$3 sleep 10 -git push \ No newline at end of file +git push diff --git a/requirements.txt b/requirements.txt index a613877..1c1920a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,4 +13,4 @@ tabulate==0.8.9 certifi # Readthedocs -sphinx_glpi_theme \ No newline at end of file +sphinx_glpi_theme diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..00eb245 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,58 @@ +[metadata] +description-file = README.md +license_file = LICENSE.txt + +[test] +local_freetype = True +tests = True + +[aliases] +test=pytest + +[flake8] +max-line-length = 88 +exclude = .git build dist +statistics = True +count = True +select = + E9 + F63 + F7 + F82 +extend-ignore = + E111 + E114 + E121 + E122 + E123 + E124 + E128 + E201 + E202 + E203 + E221 + E222 + E225 + E226 + E231 + E241 + E251 + E266 + E271 + E302 + E303 + E402 + E501 + E502 + E701 + E731 + F401 + W292 + W293 + W391 + W605 + W503 + W504 + +[coverage:run] +omit = */tests/* diff --git a/setup.py b/setup.py index d5c5592..49bdf75 100644 --- a/setup.py +++ b/setup.py @@ -16,11 +16,10 @@ ## Imports ########################################################################## -import os import codecs +import os -from setuptools import setup -from setuptools import find_packages +from setuptools import find_packages, setup from btrdbextras import __version__ @@ -29,59 +28,63 @@ ########################################################################## ## Basic information -NAME = "btrdbextras" -DESCRIPTION = "Enhancements additional features to interact with the Berkeley Tree Database" -AUTHOR = "Allen Leis" -EMAIL = "allen@pingthings.io" -MAINTAINER = "Allen Leis" -LICENSE = "BSD-3-Clause" -REPOSITORY = "https://github.com/PingThingsIO/btrdbextras" -PACKAGE = "btrdb" -URL = "https://btrdbextras.readthedocs.io/en/latest/" -DOCS_URL = "https://btrdbextras.readthedocs.io/en/latest/" +NAME = "btrdbextras" +DESCRIPTION = ( + "Enhancements additional features to interact with the Berkeley Tree Database" +) +AUTHOR = "Allen Leis" +EMAIL = "allen@pingthings.io" +MAINTAINER = "Allen Leis" +LICENSE = "BSD-3-Clause" +REPOSITORY = "https://github.com/PingThingsIO/btrdbextras" +PACKAGE = "btrdb" +URL = "https://btrdbextras.readthedocs.io/en/latest/" +DOCS_URL = "https://btrdbextras.readthedocs.io/en/latest/" ## Define the keywords -KEYWORDS = ('btrdb', 'timeseries', 'database') +KEYWORDS = ("btrdb", "timeseries", "database") ## Define the classifiers ## See https://pypi.python.org/pypi?%3Aaction=list_classifiers -CLASSIFIERS = ( - 'Development Status :: 5 - Production/Stable', - 'Intended Audience :: Developers', - 'Intended Audience :: Information Technology', - 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: BSD License', - 'Natural Language :: English', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Topic :: Database', - 'Topic :: Software Development :: Libraries :: Python Modules', +CLASSIFIERS = ( + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "Intended Audience :: Information Technology", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Topic :: Database", + "Topic :: Software Development :: Libraries :: Python Modules", ) ## Important Paths -PROJECT = os.path.abspath(os.path.dirname(__file__)) +PROJECT = os.path.abspath(os.path.dirname(__file__)) REQUIRE_PATH = "requirements.txt" VERSION_PATH = os.path.join(PACKAGE, "version.py") PKG_DESCRIBE = "DESCRIPTION.md" ## Directories to ignore in find_packages -EXCLUDES = ( - "tests", "docs", +EXCLUDES = ( + "tests", + "docs", ) ########################################################################## ## Helper Functions ########################################################################## + def read(*parts): """ Assume UTF-8 encoding and return the contents of the file located at the absolute path from the REPOSITORY joined with *parts. """ - with codecs.open(os.path.join(PROJECT, *parts), 'rb', 'utf-8') as f: + with codecs.open(os.path.join(PROJECT, *parts), "rb", "utf-8") as f: return f.read() @@ -92,7 +95,7 @@ def get_requires(path=REQUIRE_PATH): """ for line in read(path).splitlines(): line = line.strip() - if line and not line.startswith('#'): + if line and not line.startswith("#"): yield line @@ -144,8 +147,8 @@ def get_description_type(path=PKG_DESCRIBE): }, "install_requires": list(get_requires()), "python_requires": ">=3.6, <4", - "setup_requires":["pytest-runner"], - "tests_require":["pytest"], + "setup_requires": ["pytest-runner"], + "tests_require": ["pytest"], } @@ -153,5 +156,5 @@ def get_description_type(path=PKG_DESCRIBE): ## Run setup script ########################################################################## -if __name__ == '__main__': +if __name__ == "__main__": setup(**config) diff --git a/tests/requirements.txt b/tests/requirements.txt index 60b339e..4a08de2 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==6.1.1 +pytest==6.2.5 pytest-cov==2.10.1 -pytest-flakes==4.0.2 \ No newline at end of file +pytest-flakes==4.0.2 diff --git a/tests/test_base.py b/tests/test_base.py index 81ef9b6..4f76033 100644 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -16,24 +16,25 @@ ########################################################################## import re + import pytest -from btrdbextras import __version__, Connection +from btrdbextras import Connection, __version__ ########################################################################## ## Initialization Tests ########################################################################## -class TestPackage(object): +class TestPackage(object): def test_version(self): """ Assert that the test version smells valid. """ assert bool(re.match(r"^v\d+\.\d+\.\d+$", __version__)) -class TestConnection(object): +class TestConnection(object): def test_properties(self): """ Connection contains apikey and endpoint diff --git a/tests/test_ds_utils/test_stream_info.py b/tests/test_ds_utils/test_stream_info.py new file mode 100644 index 0000000..cbbd500 --- /dev/null +++ b/tests/test_ds_utils/test_stream_info.py @@ -0,0 +1,278 @@ +import uuid +from unittest.mock import Mock, PropertyMock + +import pandas as pd +import pytest +from btrdb import BTrDB +from btrdb.stream import Stream, StreamSet +from pandas.testing import assert_frame_equal + +from btrdbextras.ds_utils.stream_info import ( + ANGLE, + VOLTAGE, + StreamType, + describe_streams, + print_status_code_description, +) + + +@pytest.fixture(scope="session") +def mock_stream1(): + uu = uuid.UUID("0d22a53b-e2ef-4e0a-ab89-b2d48fb25921") + stream = Mock(Stream) + type(stream)._btrdb = PropertyMock(return_value=Mock(BTrDB)) + type(stream).uuid = PropertyMock(return_value=uu) + type(stream).collection = PropertyMock(return_value="animals/dog") + type(stream).name = PropertyMock(return_value="bob") + type(stream).unit = PropertyMock(return_value="puppy") + + stream.annotations = Mock( + return_value=({"color": "red", "animals": "dog", "breed": "corgi"}, 11) + ) + stream.tags = Mock( + return_value={"name": "bob", "unit": "puppy", "distiller": "", "ingress": ""} + ) + + # stream.windows = Mock(return_value=[()]) + + return stream + + +@pytest.fixture(scope="session") +def mock_stream2(): + uu = uuid.UUID("0d22a53b-e2ef-4e0a-ab89-b2d48fb25922") + stream = Mock(Stream) + type(stream)._btrdb = PropertyMock(return_value=Mock(BTrDB)) + type(stream).uuid = PropertyMock(return_value=uu) + type(stream).collection = PropertyMock(return_value="animals/dog") + type(stream).name = PropertyMock(return_value="peter") + type(stream).unit = PropertyMock(return_value="puppy") + + stream.annotations = Mock( + return_value=({"color": "green", "animals": "dog", "breed": "pug"}, 11) + ) + stream.tags = Mock( + return_value={"name": "peter", "unit": "puppy", "distiller": "", "ingress": ""} + ) + + stream.values = Mock(return_value=[()]) + + return stream + + +class TestStreamInfo: + def test_describe_streams_return_tags_only(self, mock_stream1, mock_stream2): + """ + Assert describe_streams() returns all the tags along with UUID and collection. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + stream1_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + "name": "bob", + "unit": "puppy", + "distiller": "", + "ingress": "", + } + + stream2_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + "name": "peter", + "unit": "puppy", + "distiller": "", + "ingress": "", + } + + assert_frame_equal( + describe_streams(streamset), pd.DataFrame([stream1_dict, stream2_dict]) + ) + + def test_describe_streams_return_all_info(self, mock_stream1, mock_stream2): + """ + Assert describe_streams() returns all the tags and annotations along with UUID and collection. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + stream1_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + "name": "bob", + "unit": "puppy", + "distiller": "", + "ingress": "", + "color": "red", + "animals": "dog", + "breed": "corgi", + } + + stream2_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + "name": "peter", + "unit": "puppy", + "distiller": "", + "ingress": "", + "color": "green", + "animals": "dog", + "breed": "pug", + } + + assert_frame_equal( + describe_streams(streamset, display_annotations=True), + pd.DataFrame([stream1_dict, stream2_dict]), + ) + + def test_describe_streams_return_filter_annotations( + self, mock_stream1, mock_stream2 + ): + """ + Assert describe_streams() returns all the tags and specified annotations along with UUID and collection. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + stream1_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + "name": "bob", + "unit": "puppy", + "distiller": "", + "ingress": "", + "color": "red", + } + + stream2_dict = { + "collection": "animals/dog", + "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + "name": "peter", + "unit": "puppy", + "distiller": "", + "ingress": "", + "color": "green", + } + assert_frame_equal( + describe_streams( + streamset, display_annotations=True, filter_annotations=["color"] + ), + pd.DataFrame([stream1_dict, stream2_dict]), + ) + + def test_describe_streams_return_filter_annotations_nonexist( + self, mock_stream1, mock_stream2 + ): + """ + Assert describe_streams() returns all the tags and specified annotations along with UUID and collection. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + # stream1_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + # "name": "bob", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "red", + # } + # + # stream2_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + # "name": "peter", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "green", + # } + + with pytest.raises( + ValueError, match=r"(?<=\[)(.*?)(?=] not found in annotations)" + ): + assert describe_streams( + streamset, display_annotations=True, filter_annotations=["address"] + ) + + def test_describe_streams_return_filter_annotations_wrong_type_str( + self, mock_stream1, mock_stream2 + ): + """ + Assert describe_streams() throws an exception when the input type is wrong. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + # stream1_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + # "name": "bob", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "red", + # } + # + # stream2_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + # "name": "peter", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "green", + # } + + with pytest.raises( + TypeError, match="filter_annotations has to be a list of str." + ): + assert describe_streams( + streamset, display_annotations=True, filter_annotations="location" + ) + + def test_describe_streams_return_filter_annotations_wrong_type_int_list( + self, mock_stream1, mock_stream2 + ): + """ + Assert describe_streams() throws an exception when the input type is wrong. + """ + streamset = StreamSet([mock_stream1, mock_stream2]) + # stream1_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25921", + # "name": "bob", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "red", + # } + # + # stream2_dict = { + # "collection": "animals/dog", + # "UUID": "0d22a53b-e2ef-4e0a-ab89-b2d48fb25922", + # "name": "peter", + # "unit": "puppy", + # "distiller": "", + # "ingress": "", + # "color": "green", + # } + + with pytest.raises( + TypeError, match="filter_annotations has to be a list of str." + ): + assert describe_streams( + streamset, display_annotations=True, filter_annotations=[1, 2, 3] + ) + + def test_streamtype_from_unit(self): + truths = {"VPHM": StreamType(VOLTAGE, 1), "VPHA": StreamType(ANGLE, 1)} + for unit in truths.keys(): + assert truths[unit].unit_type == StreamType.from_unit(unit).unit_type + + def test_find_samplerate(self, mock_stream1): + assert True + + def test_print_status_code_and_flag_bits(self, capsys): + print_status_code_description(4) + captured = capsys.readouterr() + assert captured.out == "4 = 0010 0000 0000 0000 0000 0\n - Magnitude high\n" + + print_status_code_description(557056) + captured = capsys.readouterr() + assert ( + captured.out + == "557056 = 0000 0000 0000 0001 0001 0\n - Manual\n - PMU error. No information about data\n - Data is invalid or device is in test mode\n" + )