<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: olvein</title>
    <description>The latest articles on DEV Community by olvein (@olvein).</description>
    <link>https://dev.to/olvein</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F577669%2F39ed0f07-9469-4eaa-afa4-0450f77a6426.png</url>
      <title>DEV Community: olvein</title>
      <link>https://dev.to/olvein</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/olvein"/>
    <language>en</language>
    <item>
      <title>Python y CouchDB</title>
      <dc:creator>olvein</dc:creator>
      <pubDate>Thu, 14 Jul 2022 21:31:56 +0000</pubDate>
      <link>https://dev.to/olvein/python-y-couchdb-3cc8</link>
      <guid>https://dev.to/olvein/python-y-couchdb-3cc8</guid>
      <description>&lt;p&gt;Comencé a estudiar couchDB, instalando la misma en mi Freebsd 13.1, lo cual fue sencillo, lo más complicado fue la configuración.&lt;br&gt;
Despues de revisar algunos componentes para utilizar CouchDB y Python, me percate que algunos de los proyectos son obsoletos, asi que me decidí a desarrollar un par de componentes para manipular CouchDB desde Python utilizando aiohttp, buscando utilizar código asyncrono.&lt;br&gt;
Comence con el tutorial que acompaña a CouchDB, asi que cree la base llamada albums y realicé un componente para agregar, modificar, eliminar un documento de la base de datos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@dataclasses.dataclass
class Album:
    uuid: uuid.UUID
    title: str
    artist: str
    year: int = 1900
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Después realice una clase DAO para acceder a los datos de la base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class AlbumDAO(abc.ABC):

    @abc.abstractmethod
    def insert_album(album: Album) -&amp;gt; str:
        pass

    @abc.abstractmethod
    def delete_album(album: Album) -&amp;gt; bool:
        pass

    @abc.abstractmethod
    def find_album(album: Album) -&amp;gt; Album:
        pass

    @abc.abstractmethod
    def get_all_albums() -&amp;gt; typing.List[Album]:
        pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La implementación para la clase anterior es el siguiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import album_dao import AlbumDAO
import typing
from album_dao import Album
from utils import get_uuid, get_all
import dataclasses


class CouchdbAlbumDAO(AlbumDAO):

    def insert_album(album: Album) -&amp;gt; str:
        uuid = await get_uuid()
        d = dataclasses.asdict(album)
        return uuid

    def delete_album(album: Album) -&amp;gt; bool:
        pass

    def find_album(album: Album) -&amp;gt; Album:
        pass

    def get_all_albums() -&amp;gt; typing.List[Album]:
        return await get_all()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despues realice una clase utils.py la cual nos permite&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import aiohttp
import json 
from album_dao import Album
import asyncio

HOST = "127.0.0.1"
PORT = "5984"
USER = "admin"
PWD = "password"

async def get_uuid():
    async with aiohttp.ClientSession() as session:
        async with session.get(f"http://{HOST}:{PORT}/_uuids") as resp:
            j = json.loads(await resp.text())
            return j.get("uuids", [])[0]


async def insert(uuid, json_data):
    async with aiohttp.ClientSession() as session:
        async with session.put(
                f"http://{USER}:{PWD}@{HOST}:{PORT}/albums/{uuid}", 
                json=json_data
                ) as resp:
            j = json.loads(await resp.rext())
            return j

async def get_a_document(database, uuid):
    async with aiohttp.ClientSession() as session:
        async with session.get(
                f"http://{USER}:{PWD}@{HOST}:{PORT}/{database}/{uuid}"
                ) as resp:
            return await resp.text()


async def delete(database: str, uuid: str) -&amp;gt; bool:
    correct = False
    data = json.loads(await get_a_document(database, uuid))
    print("delete -&amp;gt; ", data.keys())
    rev = data.get("_rev")
    print(rev)
    async with aiohttp.ClientSession() as session:
        async with session.delete(
                f"http://{USER}:{PWD}@{HOST}:{PORT}/{database}/{uuid}?rev={rev}",
                ) as resp:
            print(await resp.text())
            correct = True
    return correct



async def get_all():
    async with aiohttp.ClientSession() as session:
        l = []
        result = []
        async with session.get(f"http://{USER}:{PWD}@{HOST}:{PORT}/albums/_all_docs") as resp:
            j = json.loads(await resp.text())
            l = j.get("rows", [])
        for row in l:
            async with session.get(
                    f"http://{USER}:{PWD}@{HOST}:{PORT}/albums/{row.get('id')}"
                    ) as resp:
                j = json.loads(await resp.text())
                print(j)
                result.append(
                        Album(
                            uuid=j.get("_id"), title=j.get("title"),
                            artist=j.get("artist"), year=int(j.get("year", 1980)
                            )
                        )
                        )
        return result


async def main():
    results = await get_all()
    print(results)
    #await delete("albums", "df9edb8a6e29871ffc1f05fff9001571")

if __name__ == "__main__":
    asyncio.run(main())
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este es el codigo inicial para para crear un componente reutilizable para acceder a la base de datos CouchDB utilizando Python y con código asincrono lo cual es lo que buscaba.&lt;/p&gt;

</description>
      <category>python</category>
      <category>couchdb</category>
    </item>
    <item>
      <title>Threat Modeling</title>
      <dc:creator>olvein</dc:creator>
      <pubDate>Fri, 26 Mar 2021 15:49:56 +0000</pubDate>
      <link>https://dev.to/olvein/threat-modeling-32la</link>
      <guid>https://dev.to/olvein/threat-modeling-32la</guid>
      <description>&lt;p&gt;El día pasados mi corazón volvió a latir al observar que el Theat Modeling no esta muerto, sino que esta muy vivo.&lt;br&gt;
Lo cual me llevo a revisar el proyecto de owasp pytm. Comenzaré con algunas pruebas y algunos modelos para ver los resultados.&lt;br&gt;
En la próxima entrada instalare y ejecutare un modelo de prueba de un REST API Básico.&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
    </item>
  </channel>
</rss>
