PYTHON

De Wiki Clusterlab.com.br
Ir para navegação Ir para pesquisar

Python

DATA

PIP

venv/pip.conf

[global]
index-url=https://username:password|PAT@pkgs.somewhere.com/something/xxxxxxxxxx/

Reference

CODE

FastApi Controller

import json
from dataclasses import dataclass
from types import SimpleNamespace
from typing import Optional
from src.model.resource import ResourceModel, ResourceModelList
from fastapi import FastAPI, HTTPException
from src.model.provider import ProviderModel
from src.repository.resource import ResourceRepository
from src.service.resource import ResourceService
import inspect

@dataclass(init=True)
class ResourceController:
    app: FastAPI


    def make_cal(self, obj, all_arguments, method):
        try:
            signature_values = inspect.signature(method).parameters.values()

            all_argument_values = {
                parameter.name: all_arguments[parameter.name] for parameter
                in signature_values}
            return obj(**all_argument_values)

        except Exception as e:
            raise HTTPException(
                status_code=500,
                detail="deu ruim.",
                headers={"X-Error": e.__str__()}
            )
    def __post_init__(self):
        app = self.app

        @app.get("/api/resources", tags=["resource"])
        async def get_api_resources(
                name: Optional[str] | None = None,
                before: Optional[str] | None = None,
                after: Optional[str] | None = None
        ) :
            """
                    Action:
                   - Will return a list of resources.

                    Parameters:

                    - **name**: The name of the resource.
                    - **before**: An EPOCH number to match resources collected before specified dateTime.
                    - **after**: An EPOCH number to match resources collected after specified dateTime.
                    """
            resource_service = ResourceService()
            return self.make_cal(
                resource_service.get_resources,
                locals(),
                get_api_resources
            )
app = FastAPI()
resource_controller = ResourceController(app=app)

Model Class

import json
from dataclasses import dataclass
from types import SimpleNamespace
from typing import Optional

@dataclass(init=True)
class User:
    name: Optional[str] = None
    address: Optional[str] = None

    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)
        self.kwargs = kwargs

    def __add__(self, other):
        data = {}
        for attr in self.get_attributes():
            if other.__getattribute__(attr) is None:
                data.update({attr: self.__getattribute__(attr)})
            else:
                data.update({attr: other.__getattribute__(attr)})
        return __class__(**data)

    def __repr__(self):
        data = {}
        for attr in self.get_attributes():
            if attr == "kwargs":
                continue
            else:
                data.update({attr: self.__getattribute__(attr)})
        return data


    def __str__(self):
        return json.dumps(self.__repr__())

    def __len__(self):
        count = 0
        for attr in self.get_attributes():
            if self.__getattribute__(attr) is not None:
                count = count + 1
        return count

    def to_dict(self):
        return self.__repr__()

    def get_attributes(self):
        return [attr for attr in dir(self) if not callable(getattr(self, attr)) and not attr.startswith("__")]

    def get_methods(self):
        return [attr for attr in dir(self) if callable(getattr(self, attr)) and not attr.startswith("__")]

    def to_simple_namespace(self):
        return json.loads(self.__str__(), object_hook=lambda d: SimpleNamespace(**d))

    def to_str(self):
        return self.__str__()

    def gen_gettersetters(self):
        for attr in self.get_attributes():
            attr_type = str(type(getattr(self, attr))).split("'")[1]
            print(f"""
    def set_{attr}(self, {attr}: {attr_type}):
        self.{attr} = {attr}
    def get_{attr}(self) -> {attr_type}:
        return self.{attr}""")


if __name__ == "__main__":
    ale1 = User(name="Ale")
    ale2 = User(address="street somewhere")
    print(ale1)
    print(ale2)
    ale = ale1 + ale2
    print(ale)
    print(len(ale1))
    print(len(ale2))
    print(len(ale))

SimpleNamespaces

sn = json.loads(json_data, object_hook=lambda d: SimpleNamespace(**d))
sn = SimpleNamespace(hetero_list=['aa', SimpleNamespace(y='ll')])
json.loads(json.dumps(sn, default=lambda s: vars(s)))

setup.py

"""Python Setup"""

from setuptools import setup, find_packages


VERSION = '0.0.10'


with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()


setup(
    name="my-app",
    version=VERSION,
    description="Template my-app",
    long_description=long_description,
    author = "Alexandre D'Amato",
    author_email = "devops@clusterlab.com.br",
    license='MIT',
    install_requires=[
        'requests==2.31.0'
        ],
    extras_require={},
    classifiers=[],
    packages=find_packages(exclude=['docs', 'tests']),
    python_requires=">=3.10",
    entry_points={
          'console_scripts': [
             'my-app=myapp.__main__:main',
          ],
       },
)

Frameworks

Mirroring a repository

Making a mirror of the docker-py package and using it on another machine without internet access.

virtualenv -p $(which python3) pypi-mirror
source pypi-mirror/bin/activate
mkdir data
pip install python-pypi-mirror
pypi-mirror download -d data docker-py
pypi-mirror create -d data/ -m simple

WEB server

  • python2.7 -m SimpleHTTPServer 8383
  • python3 -m http.server 8383

Codificação de terminal

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"

Ansible em WSL

apt install python-txwinrm python3-winrm -y
pip install "pywinrm>=0.2.2"

Articles

Tools