Commit Graph

65 Commits

Author SHA1 Message Date
Jacob Alexander
a4ef16e831 Fixing flake8 linting errors
- Enabling builds to fail on simple lint failures now
2020-11-20 23:38:13 -08:00
Jacob Alexander
3de13c3718 Updating simple example servers to not use run_forever (can't Ctrl+c)
- Adding xfail to simple servers as they tend to not like certain
  versions of python when called repeated for testing
2020-11-20 00:17:52 -08:00
Jacob Alexander
5e8ccba536 Updating docs for v1.0.0b2
- Full cleanup of all the docs
- General sphinx housekeeping
- Updated all the old/bad links
- More reliable tests
- Updated Changelog
- Removed dead/deprecated code
- Added documentation generation test
2020-06-14 17:05:45 -07:00
Jacob Alexander
6532ca571d Adding SSL version of the calculator example
- Used to test asyncio SSL on Windows mainly
- Skipping asyncio thread tests on Windows (due to getTimer wrapper bug
  on Windows)
2020-06-10 14:33:45 -07:00
Jacob Alexander
745887cee0 Typo from earlier commit (capnproto-0.8.0 update) 2020-06-09 00:27:43 -07:00
Jacob Alexander
49fd4854d8 Minor code cleanup
- Reducing linter errors
- Removing old Python 2-only code (__future__ print)
2020-06-08 23:51:07 -07:00
Jacob Alexander
255119b838 Updating to capnproto v0.8.0
- Includes some test stabilization
- Fixes manylinux2010 build issues (linker flag order due to old gcc)
- More rigorous python setup.py clean
- Requires capnproto v0.8.0 or greater
- Including system libcapnp include path for import (e.g. import
  stream_capnp)
- Bundle libcapnp .capnp files when not using system libcapnp
- Removing more distutils usage. Now using pkg-config to determine the
  system version of libcapnp (mainly for Linux, but should work on macOS
  with brew)
- Removed dead code

Resolves issues #215 #216 #217
Lots of fixes for Issue #218 (all sorts of retry methods needed for
GitHub Actions)
2020-06-08 11:49:17 -07:00
Jacob Alexander
dd3551f978 Adding poll_once() to TwoPartyServer API
- poll_forever() doesn't allow for checking socket connection to client
  * Need to check for client, if eof received then we can close the
  connection and cleanup pycapnp cpu resources (async tasks)
- Updated async examples to fix bugs
  * Add checking code for socket connection to the client and gracefully
  cleanup resources once the client socket connection closes
  * Instanciate a new TwoPartyServer per connection (allows for multiple
  connections)
- Should resolve Issue #198
2020-01-08 18:06:26 -08:00
Jacob Alexander
fc75e4083d Fixing remaining flake8 lint warnings 2019-12-11 22:44:44 -08:00
Jacob Alexander
362cce345b Fixing Windows tests
- Adding import path filter to exclude non-directories
  Otherwise kj will through exceptions
- Skipped AF_UNIX socket test
- Use default socket configuration when it doesn't matter the type of
socket used
- Open files with utf8 encoding (needed for text validation)
- Explictly call python executable when running external scripts
- Fix path creation to always use os.path.join
- Added timeout to client wait in some tests

- Some broken tests still remain (most likely asyncio related)
2019-10-19 00:26:55 -07:00
Jacob Alexander
7789ebbf96 Fixing flake8 linting errors 2019-10-15 01:08:11 -07:00
Jacob Alexander
940ab9916d Adding reconnecting async ssl example
- async_reconnecting_ssl_client.py will automatically close and
reconnect to a server when it becomes available (rather than hanging or
dying when the server disappears)
2019-10-05 14:50:56 -07:00
Jacob Alexander
78776de647 Adding examples as pytest tests
- This way they will be included in CI checks
- Decreased the delay time in the thread-like examples to speed up tests
(probably could decrease the time some more)
- Added an async version of the calculator test
- Forcing python3 support for example scripts
2019-09-27 14:40:54 -07:00
Jacob Alexander
b3021e4f6b Fixing flake8 warnings and errors
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --exclude benchmark

Excluding the benchmark directory (due to protobuf generated files)
Also removing some Python2 specific code
2019-09-27 00:15:13 -07:00
Jacob Alexander
1a127bec6f Adding pure python SSL test using asyncio
- Uses thread.capnp
- Follows same format as thread_client.py/thread_server.py and
async_client.py/async_server.py
- Including a basic self signed certificate for testing convenience
- Python 3.7 has a bug cleaning up SSL when using asyncio.run
  https://bugs.python.org/issue36709
  Have a slightly more verbose workaround to do proper cleanup
2019-09-26 21:42:54 -07:00
Jacob Alexander
8915ef79f1 TwoWayPipe and basic asyncio support
Note: I've tried not to break any behaviour of the previously working APIs

Python API Changes / Additions
- capnp/lib/capnp.pyx
  * class _RemotePromise
    + [Added] cpdef _wait(self)
      = Exception raising code that used to be inside of wait(self)
    + [Modified] def wait(self)
      = Same functionality as before
    + [Added] async def a_wait(self)
      = Cannot use await as that's a reserved keyword
      = Uses pollRemote and asyncio.sleep(0) to make call asynchronous
  * class _TwoPartyVatNetwork
    + [Added] cdef _init_pipe(self, _TwoWayPipe pipe, Side side,
    schema_cpp.ReaderOptions opts)
      = Instanciates a TwoPartyVatNetwork using a TwoWayPipe (instead of
      using a file handle or connection as before)
  * class TwoPartyClient
    + [Modified] def __init__(self, socket=None, restorer=None,
    traversal_limit_in_words=None, nesting_limit=None)
      = Changes the socket parameter to be optional
      = If socket is not specified, default to using a TwoWayPipe
    + [Added] async def read(self, bufsize)
      = awaitable function that blocks until data has been read
      = bufsize defines the maximum amount of data to be read back
        (e.g. 4096 bytes)
      = Reads data from TwoWayPipe
    + [Added] def write(self, data)
      = Write data to TwoWayPipe
      = Not awaitable as the write interface of the TwoWayPipe doesn't
      have poll functionality
  * class TwoPartyServer
    + [Modified] def __init__(self, socket=None, restorer=None,
    server_socket=None, bootstrap=None, traversal_limit_in_words=None,
    nesting_limit=None)
      = Changes the socket parameter to be optional
      = If socket is not specified, default to using a TwoWayPipe
      = Simplified code by removing an else (self._connect)
    + [Added] async def read(self, bufsize)
      = awaitable function that blocks until data has been read
      = bufsize defines the maximum amount of data to be read back
        (e.g. 4096 bytes)
      = Reads data from TwoWayPipe
    + [Added] def write(self, data)
      = Write data to TwoWayPipe
      = Not awaitable as the write interface of the TwoWayPipe doesn't
      have poll functionality
    + [Added] async def poll_forever(self)
      = asyncio equivalent of run_forever()
  * class _TwoWayPipe
    + Wrapper class for TwoWayPipe

Other Additions
- capnp/helpers/asyncHelper.h
  * pollWaitScope
    + Pumps the kj event handler
    + Used for the TwoWayServer
  * pollRemote
    + Polls a remote promise
    + i.e. a capnp RPC call
- capnp/helpers/asyncIoHelper.h
  * AsyncIoStreamReadHelper
    + I wasn't able to figure out Promise[size_t] using Cython so this was
    the next best thing I could think of doing
    + Was needed to handle read polling from a read promise
      = Polling is used for asyncio as kj waits need a wrapper to be
      compatible
- capnp/lib/capnp.pyx
  * makeTwoWayPipe
    + Wrapper for kj newTwoWayPipe function
  * poll_once
    + Single pump of the kj event handler (used with pollWaitScope)

TwoWayClient Usage - TwoWayPipe
- See examples/async_client.py

TwoWayServer Usage - TwoWayPipe
- See examples/async_server.py

capnp/helpers/asyncIoHelper.h

Misc Changes
- Fixed thread_server.py and thread_client.py to use bootstrap instead
of ez_restore
- async_client.py and async_server.py examples
  * Uses the same thread.capnp as thread_client.py and thread_server.py
  * They are compatible, so you can mix and match client and server for
  compatibility testing
  * async_client.py and async_server.py require <address>:<port>
  formatting (unlike autodetection from thread_client.py and
  thread_server.py)
2019-09-26 21:42:48 -07:00
Jason Paryani
e00bff6ef8 Fix problems with TwoPartyServer
Fixes #61

It turns out I messed up the Server initialization code for the case
where a string is passed in as the address. The tests only cover the
cases where a raw socket is passed in. This will be rectified in a
following commit.
2015-04-13 14:14:40 -07:00
Jason Paryani
64e80e06bf Get code generator plugin to a decently working state.
Still a few outstanding performance issues, and imports inside .capnp
files may not be working
2014-10-19 20:06:00 -07:00
Jason Paryani
95e706f2f9 Add thread examples 2014-08-26 15:21:46 -07:00
Jason Paryani
b0af30ebe6 Fix up syntax a bit 2014-01-13 17:00:05 -08:00
Jason Paryani
0930a9fd1b Change calculator example to use new dict syntax for a typeless struct 2014-01-13 16:50:02 -08:00
Jason Paryani
f9bb12bff9 Update RPC with simpler methods for connecting 2013-12-12 11:55:50 -08:00
Jason Paryani
81388f82f6 Change rpc server example to use simple restore function 2013-12-11 22:48:59 -08:00
Jason Paryani
2f0f03d1a8 Add TCP_NODELAY 2013-12-11 22:25:43 -08:00
Jason Paryani
4d8a27844f Fix allowing RemotePromises to be returned directly 2013-12-11 11:24:27 -08:00
Jason Paryani
03bac73120 Fix examples formatting issues and make them pep8 compliant 2013-12-11 01:59:52 -08:00
Jason Paryani
117a3c7eac Add examples back in 2013-12-11 00:27:01 -08:00
Jason Paryani
db2247e883 Add calculator to tests 2013-12-11 00:15:08 -08:00
Jason Paryani
0e178de136 Fix segfault by making TwoPartyClient's members immortal 2013-12-10 23:29:21 -08:00
Jason Paryani
a17c76f593 Add server example 2013-12-10 23:05:57 -08:00
Jason Paryani
e92f7b56c6 Various fixups to the RPC api.
* change how restorer works
* fix join_promises
* add incref's all around to make sure we aren't freeing objects early
* make it so we return PyPromises everywhere and make chains collapsible
2013-12-10 22:57:21 -08:00
Jason Paryani
bba1918566 Add ez_restore function to Client. Also add c++.capnp and rpc.capnp 2013-12-09 21:30:27 -08:00
Jason Paryani
8cc214fb7b Add semi-functional rpc example 2013-12-09 19:49:48 -08:00
Jason Paryani
618097dec1 Add ability for passing AnyPointer to restore in RPCClient 2013-12-09 19:18:54 -08:00
Jason Paryani
362a50e34a Remove old examples 2013-12-09 17:11:42 -08:00
Jason Paryani
2155417d38 Fixup examples for recent API changes 2013-12-08 15:52:31 -08:00
Jason Paryani
bb3121d3ae Fix API changes in EventLoop 2013-12-04 11:42:57 -08:00
Jason Paryani
cfc11e4a8a Fix bug in removing an EventLoop 2013-12-02 17:54:53 -08:00
Jason Paryani
888b906781 Remove all public references to EventLoop to match changes to async API 2013-12-02 17:38:32 -08:00
Jason Paryani
fc16eab803 Fix up examples 2013-11-15 01:17:35 -08:00
Jason Paryani
2e4efd040b Allow client requests to use positional args 2013-11-14 20:59:21 -08:00
Jason Paryani
7d82dcbfd8 Update examples for RPC 2013-11-13 21:52:50 -08:00
Jason Paryani
11543b7abf Add ability to pass Restorer to RpcClient. Also various fixups
and added __dir__ reflection to DynamicCapabilityClient
2013-11-13 10:58:16 -08:00
Jason Paryani
5251cb5575 Add upcast/cast_as to DynamicCapability. Also changed EventLoop.
wait_remote -> wait
2013-11-12 20:28:23 -08:00
Jason Paryani
496a126671 Add a cross language RPC example 2013-11-12 19:40:10 -08:00
Jason Paryani
374f986fa7 Add FdAsyncIoStream. Also clean up RPC interface a bit 2013-11-12 19:38:34 -08:00
Jason Paryani
1df115d359 Initial wrapping of rpc-twoparty functionality 2013-11-12 15:32:23 -08:00
Jason Paryani
5e00534842 Fixup exception handling for capabilities 2013-10-20 17:24:59 -07:00
Jason Paryani
c3354e9069 Add ability to pipeline rpc requests 2013-10-19 22:38:10 -07:00
Jason Paryani
7f7b28f328 Fix memleak and simplify dynamic client api 2013-10-17 19:15:40 -07:00