GitHub user ssaamm opened a pull request:
https://github.com/apache/avro/pull/133
AVRO-1788: Implement Python 2 API
The Python 2 API and the Python 3 API differ unnecessarily, making it more
difficult to write code that supports both major Python versions. Additionally,
a lot of these function names were non-Pythonic.
This contribution is my original work, and I license the work to the
project under the project's open source license.
Tests pass:
```
/Users/sam/dev/avro/lang/py3/env/lib/python3.5/site-packages/setuptools/dist.py:294:
UserWarning: The version specified ('1.9.0-SNAPSHOT') is an invalid version,
this may not work as expected with newer versions of setuptools, pip, and PyPI.
Please see PEP 440 for more details.
"details." % self.metadata.version
testCsv (avro.tests.test_script.TestCat) ... ok
testCsvHeader (avro.tests.test_script.TestCat) ... ok
testFields (avro.tests.test_script.TestCat) ... ok
testFiles (avro.tests.test_script.TestCat) ... ok
testFilter (avro.tests.test_script.TestCat) ... ok
testHelp (avro.tests.test_script.TestCat) ... ok
testJsonPretty (avro.tests.test_script.TestCat) ... ok
testPrint (avro.tests.test_script.TestCat) ... ok
testPrintSchema (avro.tests.test_script.TestCat) ... ok
testSkip (avro.tests.test_script.TestCat) ... ok
testVersion (avro.tests.test_script.TestCat) ... ok
testAppend (avro.tests.test_datafile.TestDataFile) ... ok
testContextManager (avro.tests.test_datafile.TestDataFile) ... ok
testMetadata (avro.tests.test_datafile.TestDataFile) ... ok
testRoundTrip (avro.tests.test_datafile.TestDataFile) ... ok
testInterop (avro.tests.test_datafile_interop.TestDataFileInterop) ... ok
testSymbolsInOrder (avro.tests.test_enum.TestEnum) ... ok
testSymbolsInReverseOrder (avro.tests.test_enum.TestEnum) ... ok
testBinaryIntEncoding (avro.tests.test_io.TestIO) ... ok
testBinaryLongEncoding (avro.tests.test_io.TestIO) ... ok
testDefaultValue (avro.tests.test_io.TestIO) ... ok
testFieldOrder (avro.tests.test_io.TestIO) ... ok
testNoDefaultValue (avro.tests.test_io.TestIO) ... ok
testProjection (avro.tests.test_io.TestIO) ... ok
testRoundTrip (avro.tests.test_io.TestIO) ... ok
testSchemaPromotion (avro.tests.test_io.TestIO) ... ok
testSkipInt (avro.tests.test_io.TestIO) ... ok
testSkipLong (avro.tests.test_io.TestIO) ... ok
testTypeException (avro.tests.test_io.TestIO) ... ok
testUnknownSymbol (avro.tests.test_io.TestIO) ... ok
testValidate (avro.tests.test_io.TestIO) ... ok
testEchoService (avro.tests.test_ipc.TestIPC)
Tests client-side of the Echo service. ... 2016-09-27 18:14:00,348 INFO
test_ipc.py:118 : Echo RPC Server listening on 127.0.0.1:57632
2016-09-27 18:14:00,348 INFO test_ipc.py:119 : RPC socket: <socket.socket
fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0,
laddr=('127.0.0.1', 57632)>
2016-09-27 18:14:00,349 INFO ipc.py:179 : Sending handshake request:
{'serverHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2',
'clientHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2'}
2016-09-27 18:14:00,350 INFO ipc.py:204 : writing request: {'ping':
{'text': 'hello ping', 'timestamp': 31415}}
2016-09-27 18:14:00,350 INFO ipc.py:654 : Serialized request:
b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2\x00\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2\x00\x00\x08ping\xee\xea\x03\x14hello
ping'
2016-09-27 18:14:00,351 INFO ipc.py:412 : Processing handshake request:
{'serverHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2',
'clientProtocol': None, 'meta': None, 'clientHash':
b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2'}
2016-09-27 18:14:00,351 INFO ipc.py:441 : Handshake response: {'match':
'BOTH'}
2016-09-27 18:14:00,351 INFO ipc.py:375 : Processing request: {'ping':
{'text': 'hello ping', 'timestamp': 31415}}
2016-09-27 18:14:00,351 INFO test_ipc.py:90 : Message: {"response":
{"type": "record", "namespace": "org.apache.avro.ipc.echo", "name": "Pong",
"fields": [{"type": "long", "name": "timestamp", "default": -1}, {"type":
"org.apache.avro.ipc.echo.Ping", "name": "ping"}]}, "errors": [], "request":
[{"type": {"type": "record", "namespace": "org.apache.avro.ipc.echo", "name":
"Ping", "fields": [{"type": "long", "name": "timestamp", "default": -1},
{"type": "string", "name": "text", "default": ""}]}, "name": "ping"}]}
2016-09-27 18:14:00,351 INFO test_ipc.py:91 : Request: {'ping': {'text':
'hello ping', 'timestamp': 31415}}
2016-09-27 18:14:00,352 INFO ipc.py:656 : Serialized response:
b'\x00\x00\x00\x00\x00\x00\xbe\x90\xe9\xde\xedU\xee\xea\x03\x14hello ping'
127.0.0.1 - - [27/Sep/2016 18:14:00] "POST / HTTP/1.1" 200 -
2016-09-27 18:14:00,352 INFO ipc.py:665 : Response sent
2016-09-27 18:14:00,353 INFO ipc.py:219 : Processing handshake response:
{'serverHash': None, 'match': 'BOTH', 'meta': None, 'serverProtocol': None}
2016-09-27 18:14:00,353 INFO test_ipc.py:143 : Received echo response:
{'timestamp': 1475018040351, 'ping': {'text': 'hello ping', 'timestamp': 31415}}
2016-09-27 18:14:00,353 INFO ipc.py:179 : Sending handshake request:
{'serverHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2',
'clientHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2'}
2016-09-27 18:14:00,353 INFO ipc.py:204 : writing request: {'ping':
{'text': 'hello again', 'timestamp': 123456}}
2016-09-27 18:14:00,354 INFO ipc.py:654 : Serialized request:
b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2\x00\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2\x00\x00\x08ping\x80\x89\x0f\x16hello
again'
2016-09-27 18:14:00,354 INFO ipc.py:412 : Processing handshake request:
{'serverHash': b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2',
'clientProtocol': None, 'meta': None, 'clientHash':
b'\xcc9\x86\xfb\xb6\xad\x8a\ni\xf9X\xbb\x06\xc6\x15\xb2'}
2016-09-27 18:14:00,355 INFO ipc.py:441 : Handshake response: {'match':
'BOTH'}
2016-09-27 18:14:00,355 INFO ipc.py:375 : Processing request: {'ping':
{'text': 'hello again', 'timestamp': 123456}}
2016-09-27 18:14:00,355 INFO test_ipc.py:90 : Message: {"response":
{"type": "record", "namespace": "org.apache.avro.ipc.echo", "name": "Pong",
"fields": [{"type": "long", "name": "timestamp", "default": -1}, {"type":
"org.apache.avro.ipc.echo.Ping", "name": "ping"}]}, "errors": [], "request":
[{"type": {"type": "record", "namespace": "org.apache.avro.ipc.echo", "name":
"Ping", "fields": [{"type": "long", "name": "timestamp", "default": -1},
{"type": "string", "name": "text", "default": ""}]}, "name": "ping"}]}
2016-09-27 18:14:00,355 INFO test_ipc.py:91 : Request: {'ping': {'text':
'hello again', 'timestamp': 123456}}
2016-09-27 18:14:00,355 INFO ipc.py:656 : Serialized response:
b'\x00\x00\x00\x00\x00\x00\xc6\x90\xe9\xde\xedU\x80\x89\x0f\x16hello again'
127.0.0.1 - - [27/Sep/2016 18:14:00] "POST / HTTP/1.1" 200 -
2016-09-27 18:14:00,355 INFO ipc.py:665 : Response sent
2016-09-27 18:14:00,356 INFO ipc.py:219 : Processing handshake response:
{'serverHash': None, 'match': 'BOTH', 'meta': None, 'serverProtocol': None}
2016-09-27 18:14:00,356 INFO test_ipc.py:149 : Received echo response:
{'timestamp': 1475018040355, 'ping': {'text': 'hello again', 'timestamp':
123456}}
ok
testEquivalenceAfterRoundTrip (avro.tests.test_protocol.TestProtocol) ... ok
testInnerNamespaceNotRendered (avro.tests.test_protocol.TestProtocol) ... ok
testInnerNamespaceSet (avro.tests.test_protocol.TestProtocol) ... ok
testParse (avro.tests.test_protocol.TestProtocol) ... ok
testValidCastToStringAfterParse (avro.tests.test_protocol.TestProtocol) ...
ok
testCorrectRecursiveExtraction (avro.tests.test_schema.TestSchema) ... ok
testDocAttributes (avro.tests.test_schema.TestSchema) ... ok
testEquivalenceAfterRoundTrip (avro.tests.test_schema.TestSchema) ... ok
testFullname (avro.tests.test_schema.TestSchema)
The fullname is determined in one of the following ways: ... ok
testOtherAttributes (avro.tests.test_schema.TestSchema) ... ok
testParse (avro.tests.test_schema.TestSchema) ... ok
testValidCastToStringAfterParse (avro.tests.test_schema.TestSchema) ... ok
testMultiFile (avro.tests.test_script.TestWrite) ... ok
testOutfile (avro.tests.test_script.TestWrite) ... ok
testStdin (avro.tests.test_script.TestWrite) ... ok
testVersion (avro.tests.test_script.TestWrite) ... ok
testWriteCsv (avro.tests.test_script.TestWrite) ... ok
testWriteJson (avro.tests.test_script.TestWrite) ... ok
----------------------------------------------------------------------
Ran 50 tests in 2.305s
OK
```
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/ssaamm/avro master
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/avro/pull/133.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #133
----
commit 846ac19a1c944865f1d96cc767e713ee1f25c4ea
Author: Samuel Taylor <[email protected]>
Date: 2016-09-27T23:08:58Z
AVRO-1788: Implement Python 2 API
----
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---