{ "info": { "author": "WindSoilder", "author_email": "WindSoilder@outlook.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: Implementation :: CPython" ], "description": "LSP - Language server protocol in Sans-IO pattern\n=================================================\n\nLanguage Server Protocol implementation in sans-io pattern. Which is highly inspired by `Sans-IO pattern `_. And some relatived projects:\n- `hyper-h2 `_\n- `h11 `_\n\nSo it can be integreted with trio, asyncio, or some other frameworks easily.\n\nRequired python version\n-----------------------\nPython >= 3.6\n\nFeatures\n--------\n1. Pure python implementation\n2. Don't relatived to other site-packages\n3. Can (should) easily integreted with high level framework like trio, asyncio\n\nHow to install it\n-----------------\nThere are two ways to install *lsp*\n\n- Install via *pip* (recommended)\n\n.. code-block:: text\n\n pip install lsp\n\n- Install via *setup.py*\n\n.. code-block:: shell\n\n python setup.py install\n\nBasic Usage example\n-------------------\n\nClient side\n~~~~~~~~~~~\n\n.. code-block:: python\n\n import socket\n from lsp import Connection, NEED_DATA, DataReceived, MessageEnd\n\n sock = socket.socket()\n\n sock.connect((\"localhost\", 10001))\n conn = Connection(\"client\")\n\n\n answer = input(\"Send request?(y/n)\")\n while answer == \"y\":\n # use connection send_json method to convert json object to bytes\n request_data = conn.send_json({\"method\": \"didOpen\"})\n # then we can send data to server\n sock.sendall(request_data)\n\n while True:\n # and then we can get next_event of connection, it can indicate\n # that what should we do.\n event = conn.next_event()\n # we need to receive data from server\n if event is NEED_DATA:\n try:\n data = sock.recv(1024)\n except ConnectionResetError:\n print('The server connection is closed, So I will leave:)')\n conn.close()\n sock.close()\n exit(0)\n else:\n print(\"return from sock.recv\")\n conn.receive(data)\n # we have receive data from server\n elif isinstance(event, DataReceived):\n print(\"Receive event, content:\")\n print(event)\n elif isinstance(event, MessageEnd):\n print(\"Server sending data complete.\")\n break\n\n # then we can call get_received_data() to extract out what we get\n header, response_body = conn.get_received_data()\n print(\"Response header from server:\")\n print(header)\n print(\"Response body from server:\")\n print(response_body)\n answer = input(\"Send request?(y/n)\")\n conn.go_next_circle()\n\nServer side\n~~~~~~~~~~~\n\n.. code-block:: python\n\n import socket\n from lsp import Connection, NEED_DATA, RequestReceived, DataReceived, MessageEnd\n\n sock = socket.socket()\n sock.bind((\"0.0.0.0\", 10001))\n sock.listen(1)\n client_sock, addr = sock.accept()\n print(f\"get connection from {client_sock}\")\n\n conn = Connection(\"server\")\n try:\n while True:\n while True:\n # call next event to indicate what server socket should do.\n event = conn.next_event()\n\n # no data coming yet, so the return value is NEED_DATA\n if event is NEED_DATA:\n data = client_sock.recv(1024)\n if data == b\"\":\n print(\"Client connection is closed, I will exit.\")\n exit(0)\n conn.receive(data)\n # Request header is coming :)\n elif isinstance(event, RequestReceived):\n print(\"Receive request header\")\n print(event.to_data())\n # Request data is coming :)\n elif isinstance(event, DataReceived):\n print(\"Receive request data\")\n print(event.to_data())\n # client has send data completely.\n elif isinstance(event, MessageEnd):\n print(\"Data receive complete:)\")\n break\n\n # so we can call con.get_received_data to fetch what client send.\n received_data = conn.get_received_data()\n print(f\"Receiving data: {received_data}\")\n\n # send response back to client.\n print(f\"Sending response to client\")\n data = conn.send_json({\"Content\": \"I am received:)\"})\n client_sock.sendall(data)\n print(f\"For now, go to next circle\")\n\n # then we need to call go_next_circle, to get another request from client.\n conn.go_next_circle()\n finally:\n sock.close()\n\nFor more usage example, please check out files in *examples/servers* folder.\n\nMain API in lsp\n---------------\n1. Want to send json data? You can try :code:`conn.send_json`.\n2. Want to know what we should do next? You can try :code:`conn.next_event`.\n3. After receive data, please don't forget to call :code:`conn.receive(data)`.\n Which will save data into inner buffer, and it can drive\n :code:`conn.next_event` method returns other events.\n4. When Receive :code:`MessageEnd` event, we can just call\n :code:`conn.get_received_data` to fetch for incoming data.\n\nMain events we will get from next_event\n---------------------------------------\nClient\n~~~~~~\nClient side will get the following values from next_events:\n\n1. *NEED_DATA* - which indicate that we need to receive data from server.\n2. *ResponseReceived* - Client have receive response header.\n3. *DataReceived* - Client have receive resposne body.\n4. *MessageEnd* - Receive data from server complete.\n\nServer\n~~~~~~\nServer side will get the following values from next_events:\n\n1. *NEED_DATA* - which indicate that we need to receive data from client.\n2. *RequestReceived* - Client have send request header, and we receive it.\n3. *DataReceived* - Server have receive response body from client.\n4. *MessageEnd* - Client sending request complete.", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/WindSoilder/lsp", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "lsp", "package_url": "https://pypi.org/project/lsp/", "platform": "", "project_url": "https://pypi.org/project/lsp/", "project_urls": { "Homepage": "https://github.com/WindSoilder/lsp" }, "release_url": "https://pypi.org/project/lsp/0.1.1/", "requires_dist": null, "requires_python": ">=3.6", "summary": "Sans-IO pattern, language server protocol implementation", "version": "0.1.1" }, "last_serial": 5099362, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "27f49214993312573af4b671a428433e", "sha256": "191f4306e283a058c46322fabf83e720eb4b3dff35cc28599ea6e0a3a2440640" }, "downloads": -1, "filename": "lsp-0.1.0-py3.7.egg", "has_sig": false, "md5_digest": "27f49214993312573af4b671a428433e", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": ">=3.6", "size": 26218, "upload_time": "2019-03-22T09:31:30", "url": "https://files.pythonhosted.org/packages/ed/a8/796871383980c3c4d60388f456e7175d7a1dd8929575d0cda04d6db52b24/lsp-0.1.0-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "6bfb1ed3051ccc60b758e89f245457e3", "sha256": "06d49b283d0fcdd848d44c0839cd935a839add4920bd74e270d8761131ae3f1e" }, "downloads": -1, "filename": "lsp-0.1.0.tar.gz", "has_sig": false, "md5_digest": "6bfb1ed3051ccc60b758e89f245457e3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 11731, "upload_time": "2019-03-22T09:31:36", "url": "https://files.pythonhosted.org/packages/0f/bc/e11e6033055977cedf86b2cf0156da604afe29617933d4b33d7ddcd71fae/lsp-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "48538bd84d7d1c349752d89442233dc9", "sha256": "28006638eacd60393ddcb7018d70cf7dbf835eced6ccb87c9dcecf3ec30bb5c3" }, "downloads": -1, "filename": "lsp-0.1.1.tar.gz", "has_sig": false, "md5_digest": "48538bd84d7d1c349752d89442233dc9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12629, "upload_time": "2019-04-04T15:43:48", "url": "https://files.pythonhosted.org/packages/d8/27/0e78fe8276757802a267af7c81f8e02c2d4d67e5ecccd71595ccf21e1848/lsp-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "48538bd84d7d1c349752d89442233dc9", "sha256": "28006638eacd60393ddcb7018d70cf7dbf835eced6ccb87c9dcecf3ec30bb5c3" }, "downloads": -1, "filename": "lsp-0.1.1.tar.gz", "has_sig": false, "md5_digest": "48538bd84d7d1c349752d89442233dc9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.6", "size": 12629, "upload_time": "2019-04-04T15:43:48", "url": "https://files.pythonhosted.org/packages/d8/27/0e78fe8276757802a267af7c81f8e02c2d4d67e5ecccd71595ccf21e1848/lsp-0.1.1.tar.gz" } ] }