THRIFT-5923: UUID python
Client: py
Patch: CJCombrink

This closes #3330
diff --git a/test/known_failures_Linux.json b/test/known_failures_Linux.json
index 6afe00c..41b29c9 100644
--- a/test/known_failures_Linux.json
+++ b/test/known_failures_Linux.json
@@ -27,42 +27,6 @@
   "cl-rs_multi-binary_framed-ip",
   "cl-rs_multi_buffered-ip",
   "cl-rs_multi_framed-ip",
-  "cpp-cpp_binary_websocket-domain",
-  "cpp-cpp_binary_websocket-ip",
-  "cpp-cpp_binary_websocket-ip-ssl",
-  "cpp-cpp_compact_websocket-domain",
-  "cpp-cpp_compact_websocket-ip",
-  "cpp-cpp_compact_websocket-ip-ssl",
-  "cpp-cpp_header_websocket-domain",
-  "cpp-cpp_header_websocket-ip",
-  "cpp-cpp_header_websocket-ip-ssl",
-  "cpp-cpp_json_websocket-domain",
-  "cpp-cpp_json_websocket-ip",
-  "cpp-cpp_json_websocket-ip-ssl",
-  "cpp-cpp_multi-binary_websocket-domain",
-  "cpp-cpp_multi-binary_websocket-ip",
-  "cpp-cpp_multi-binary_websocket-ip-ssl",
-  "cpp-cpp_multi_websocket-domain",
-  "cpp-cpp_multi_websocket-ip",
-  "cpp-cpp_multi_websocket-ip-ssl",
-  "cpp-cpp_multic-compact_websocket-domain",
-  "cpp-cpp_multic-compact_websocket-ip",
-  "cpp-cpp_multic-compact_websocket-ip-ssl",
-  "cpp-cpp_multic_websocket-domain",
-  "cpp-cpp_multic_websocket-ip",
-  "cpp-cpp_multic_websocket-ip-ssl",
-  "cpp-cpp_multih-header_websocket-domain",
-  "cpp-cpp_multih-header_websocket-ip",
-  "cpp-cpp_multih-header_websocket-ip-ssl",
-  "cpp-cpp_multih_websocket-domain",
-  "cpp-cpp_multih_websocket-ip",
-  "cpp-cpp_multih_websocket-ip-ssl",
-  "cpp-cpp_multij-json_websocket-domain",
-  "cpp-cpp_multij-json_websocket-ip",
-  "cpp-cpp_multij-json_websocket-ip-ssl",
-  "cpp-cpp_multij_websocket-domain",
-  "cpp-cpp_multij_websocket-ip",
-  "cpp-cpp_multij_websocket-ip-ssl",
   "cpp-dart_binary_http-ip",
   "cpp-dart_compact_http-ip",
   "cpp-dart_json_http-ip",
@@ -174,100 +138,57 @@
   "cpp-py_binary-accel_http-domain",
   "cpp-py_binary-accel_http-ip",
   "cpp-py_binary-accel_http-ip-ssl",
-  "cpp-py_binary-accel_zlib-ip-ssl",
   "cpp-py_binary_http-domain",
   "cpp-py_binary_http-ip",
   "cpp-py_binary_http-ip-ssl",
-  "cpp-py_binary_zlib-ip-ssl",
   "cpp-py_compact-accelc_http-domain",
   "cpp-py_compact-accelc_http-ip",
   "cpp-py_compact-accelc_http-ip-ssl",
-  "cpp-py_compact-accelc_zlib-ip-ssl",
   "cpp-py_compact_http-domain",
   "cpp-py_compact_http-ip",
   "cpp-py_compact_http-ip-ssl",
-  "cpp-py_compact_zlib-ip-ssl",
-  "cpp-py_header_buffered-ip-ssl",
-  "cpp-py_header_framed-ip-ssl",
   "cpp-py_header_http-domain",
   "cpp-py_header_http-ip",
   "cpp-py_header_http-ip-ssl",
-  "cpp-py_header_zlib-ip-ssl",
   "cpp-py_json_http-domain",
   "cpp-py_json_http-ip",
   "cpp-py_json_http-ip-ssl",
-  "cpp-py_multi-accel_buffered-ip-ssl",
-  "cpp-py_multi-accel_framed-ip-ssl",
   "cpp-py_multi-accel_http-domain",
   "cpp-py_multi-accel_http-ip",
   "cpp-py_multi-accel_http-ip-ssl",
-  "cpp-py_multi-accel_zlib-ip-ssl",
-  "cpp-py_multi-binary_buffered-ip-ssl",
-  "cpp-py_multi-binary_framed-ip-ssl",
   "cpp-py_multi-binary_http-domain",
   "cpp-py_multi-binary_http-ip",
   "cpp-py_multi-binary_http-ip-ssl",
-  "cpp-py_multi-binary_zlib-ip-ssl",
-  "cpp-py_multi-multia_buffered-ip-ssl",
-  "cpp-py_multi-multia_framed-ip-ssl",
   "cpp-py_multi-multia_http-domain",
   "cpp-py_multi-multia_http-ip",
   "cpp-py_multi-multia_http-ip-ssl",
-  "cpp-py_multi-multia_zlib-ip-ssl",
-  "cpp-py_multi_buffered-ip-ssl",
-  "cpp-py_multi_framed-ip-ssl",
   "cpp-py_multi_http-domain",
   "cpp-py_multi_http-ip",
   "cpp-py_multi_http-ip-ssl",
-  "cpp-py_multi_zlib-ip-ssl",
-  "cpp-py_multic-accelc_buffered-ip-ssl",
-  "cpp-py_multic-accelc_framed-ip-ssl",
   "cpp-py_multic-accelc_http-domain",
   "cpp-py_multic-accelc_http-ip",
   "cpp-py_multic-accelc_http-ip-ssl",
-  "cpp-py_multic-accelc_zlib-ip-ssl",
-  "cpp-py_multic-compact_buffered-ip-ssl",
-  "cpp-py_multic-compact_framed-ip-ssl",
   "cpp-py_multic-compact_http-domain",
   "cpp-py_multic-compact_http-ip",
   "cpp-py_multic-compact_http-ip-ssl",
-  "cpp-py_multic-compact_zlib-ip-ssl",
-  "cpp-py_multic-multiac_buffered-ip-ssl",
-  "cpp-py_multic-multiac_framed-ip-ssl",
   "cpp-py_multic-multiac_http-domain",
   "cpp-py_multic-multiac_http-ip",
   "cpp-py_multic-multiac_http-ip-ssl",
-  "cpp-py_multic-multiac_zlib-ip-ssl",
-  "cpp-py_multic_buffered-ip-ssl",
-  "cpp-py_multic_framed-ip-ssl",
   "cpp-py_multic_http-domain",
   "cpp-py_multic_http-ip",
   "cpp-py_multic_http-ip-ssl",
-  "cpp-py_multic_zlib-ip-ssl",
-  "cpp-py_multih-header_buffered-ip-ssl",
-  "cpp-py_multih-header_framed-ip-ssl",
   "cpp-py_multih-header_http-domain",
   "cpp-py_multih-header_http-ip",
   "cpp-py_multih-header_http-ip-ssl",
-  "cpp-py_multih-header_zlib-ip-ssl",
-  "cpp-py_multih_buffered-ip-ssl",
-  "cpp-py_multih_framed-ip-ssl",
   "cpp-py_multih_http-domain",
   "cpp-py_multih_http-ip",
   "cpp-py_multih_http-ip-ssl",
-  "cpp-py_multih_zlib-ip-ssl",
-  "cpp-py_multij-json_buffered-ip-ssl",
-  "cpp-py_multij-json_framed-ip-ssl",
   "cpp-py_multij-json_http-domain",
   "cpp-py_multij-json_http-ip",
   "cpp-py_multij-json_http-ip-ssl",
-  "cpp-py_multij-json_zlib-ip-ssl",
-  "cpp-py_multij_buffered-ip-ssl",
-  "cpp-py_multij_framed-ip-ssl",
   "cpp-py_multij_http-domain",
   "cpp-py_multij_http-ip",
   "cpp-py_multij_http-ip-ssl",
-  "cpp-py_multij_zlib-ip-ssl",
   "d-cl_binary_buffered-ip",
   "d-cl_binary_framed-ip",
   "d-cpp_binary_buffered-ip",
@@ -793,222 +714,78 @@
   "perl-netstd_multi-binary_buffered-ip-ssl",
   "perl-netstd_multi-binary_framed-ip",
   "perl-netstd_multi-binary_framed-ip-ssl",
-  "py-cpp_accel-binary_buffered-domain",
-  "py-cpp_accel-binary_buffered-ip",
-  "py-cpp_accel-binary_buffered-ip-ssl",
-  "py-cpp_accel-binary_framed-domain",
-  "py-cpp_accel-binary_framed-ip",
-  "py-cpp_accel-binary_framed-ip-ssl",
   "py-cpp_accel-binary_http-domain",
   "py-cpp_accel-binary_http-ip",
   "py-cpp_accel-binary_http-ip-ssl",
   "py-cpp_accel-binary_zlib-domain",
   "py-cpp_accel-binary_zlib-ip",
   "py-cpp_accel-binary_zlib-ip-ssl",
-  "py-cpp_accelc-compact_buffered-domain",
-  "py-cpp_accelc-compact_buffered-ip",
-  "py-cpp_accelc-compact_buffered-ip-ssl",
-  "py-cpp_accelc-compact_framed-domain",
-  "py-cpp_accelc-compact_framed-ip",
-  "py-cpp_accelc-compact_framed-ip-ssl",
   "py-cpp_accelc-compact_http-domain",
   "py-cpp_accelc-compact_http-ip",
   "py-cpp_accelc-compact_http-ip-ssl",
   "py-cpp_accelc-compact_zlib-domain",
   "py-cpp_accelc-compact_zlib-ip",
   "py-cpp_accelc-compact_zlib-ip-ssl",
-  "py-cpp_binary_buffered-domain",
-  "py-cpp_binary_buffered-ip",
-  "py-cpp_binary_buffered-ip-ssl",
-  "py-cpp_binary_framed-domain",
-  "py-cpp_binary_framed-ip",
-  "py-cpp_binary_framed-ip-ssl",
   "py-cpp_binary_http-domain",
   "py-cpp_binary_http-ip",
   "py-cpp_binary_http-ip-ssl",
-  "py-cpp_binary_zlib-domain",
-  "py-cpp_binary_zlib-ip",
-  "py-cpp_binary_zlib-ip-ssl",
-  "py-cpp_compact_buffered-domain",
-  "py-cpp_compact_buffered-ip",
-  "py-cpp_compact_buffered-ip-ssl",
-  "py-cpp_compact_framed-domain",
-  "py-cpp_compact_framed-ip",
-  "py-cpp_compact_framed-ip-ssl",
   "py-cpp_compact_http-domain",
   "py-cpp_compact_http-ip",
   "py-cpp_compact_http-ip-ssl",
-  "py-cpp_compact_zlib-domain",
-  "py-cpp_compact_zlib-ip",
-  "py-cpp_compact_zlib-ip-ssl",
-  "py-cpp_header_buffered-domain",
-  "py-cpp_header_buffered-ip",
-  "py-cpp_header_buffered-ip-ssl",
-  "py-cpp_header_framed-domain",
-  "py-cpp_header_framed-ip",
-  "py-cpp_header_framed-ip-ssl",
   "py-cpp_header_http-domain",
   "py-cpp_header_http-ip",
   "py-cpp_header_http-ip-ssl",
-  "py-cpp_header_zlib-domain",
-  "py-cpp_header_zlib-ip",
-  "py-cpp_header_zlib-ip-ssl",
-  "py-cpp_json_buffered-domain",
-  "py-cpp_json_buffered-ip",
-  "py-cpp_json_buffered-ip-ssl",
-  "py-cpp_json_framed-domain",
-  "py-cpp_json_framed-ip",
-  "py-cpp_json_framed-ip-ssl",
   "py-cpp_json_http-domain",
   "py-cpp_json_http-ip",
   "py-cpp_json_http-ip-ssl",
-  "py-cpp_json_zlib-domain",
-  "py-cpp_json_zlib-ip",
-  "py-cpp_json_zlib-ip-ssl",
-  "py-cpp_multi-binary_buffered-domain",
-  "py-cpp_multi-binary_buffered-ip",
-  "py-cpp_multi-binary_buffered-ip-ssl",
-  "py-cpp_multi-binary_framed-domain",
-  "py-cpp_multi-binary_framed-ip",
-  "py-cpp_multi-binary_framed-ip-ssl",
   "py-cpp_multi-binary_http-domain",
   "py-cpp_multi-binary_http-ip",
   "py-cpp_multi-binary_http-ip-ssl",
-  "py-cpp_multi-binary_zlib-domain",
-  "py-cpp_multi-binary_zlib-ip",
-  "py-cpp_multi-binary_zlib-ip-ssl",
-  "py-cpp_multi_buffered-domain",
-  "py-cpp_multi_buffered-ip",
-  "py-cpp_multi_buffered-ip-ssl",
-  "py-cpp_multi_framed-domain",
-  "py-cpp_multi_framed-ip",
-  "py-cpp_multi_framed-ip-ssl",
   "py-cpp_multi_http-domain",
   "py-cpp_multi_http-ip",
   "py-cpp_multi_http-ip-ssl",
-  "py-cpp_multi_zlib-domain",
-  "py-cpp_multi_zlib-ip",
-  "py-cpp_multi_zlib-ip-ssl",
-  "py-cpp_multia-binary_buffered-domain",
-  "py-cpp_multia-binary_buffered-ip",
-  "py-cpp_multia-binary_buffered-ip-ssl",
-  "py-cpp_multia-binary_framed-domain",
-  "py-cpp_multia-binary_framed-ip",
-  "py-cpp_multia-binary_framed-ip-ssl",
   "py-cpp_multia-binary_http-domain",
   "py-cpp_multia-binary_http-ip",
   "py-cpp_multia-binary_http-ip-ssl",
   "py-cpp_multia-binary_zlib-domain",
   "py-cpp_multia-binary_zlib-ip",
   "py-cpp_multia-binary_zlib-ip-ssl",
-  "py-cpp_multia-multi_buffered-domain",
-  "py-cpp_multia-multi_buffered-ip",
-  "py-cpp_multia-multi_buffered-ip-ssl",
-  "py-cpp_multia-multi_framed-domain",
-  "py-cpp_multia-multi_framed-ip",
-  "py-cpp_multia-multi_framed-ip-ssl",
   "py-cpp_multia-multi_http-domain",
   "py-cpp_multia-multi_http-ip",
   "py-cpp_multia-multi_http-ip-ssl",
   "py-cpp_multia-multi_zlib-domain",
   "py-cpp_multia-multi_zlib-ip",
   "py-cpp_multia-multi_zlib-ip-ssl",
-  "py-cpp_multiac-compact_buffered-domain",
-  "py-cpp_multiac-compact_buffered-ip",
-  "py-cpp_multiac-compact_buffered-ip-ssl",
-  "py-cpp_multiac-compact_framed-domain",
-  "py-cpp_multiac-compact_framed-ip",
-  "py-cpp_multiac-compact_framed-ip-ssl",
   "py-cpp_multiac-compact_http-domain",
   "py-cpp_multiac-compact_http-ip",
   "py-cpp_multiac-compact_http-ip-ssl",
   "py-cpp_multiac-compact_zlib-domain",
   "py-cpp_multiac-compact_zlib-ip",
   "py-cpp_multiac-compact_zlib-ip-ssl",
-  "py-cpp_multiac-multic_buffered-domain",
-  "py-cpp_multiac-multic_buffered-ip",
-  "py-cpp_multiac-multic_buffered-ip-ssl",
-  "py-cpp_multiac-multic_framed-domain",
-  "py-cpp_multiac-multic_framed-ip",
-  "py-cpp_multiac-multic_framed-ip-ssl",
   "py-cpp_multiac-multic_http-domain",
   "py-cpp_multiac-multic_http-ip",
   "py-cpp_multiac-multic_http-ip-ssl",
   "py-cpp_multiac-multic_zlib-domain",
   "py-cpp_multiac-multic_zlib-ip",
   "py-cpp_multiac-multic_zlib-ip-ssl",
-  "py-cpp_multic-compact_buffered-domain",
-  "py-cpp_multic-compact_buffered-ip",
-  "py-cpp_multic-compact_buffered-ip-ssl",
-  "py-cpp_multic-compact_framed-domain",
-  "py-cpp_multic-compact_framed-ip",
-  "py-cpp_multic-compact_framed-ip-ssl",
   "py-cpp_multic-compact_http-domain",
   "py-cpp_multic-compact_http-ip",
   "py-cpp_multic-compact_http-ip-ssl",
-  "py-cpp_multic-compact_zlib-domain",
-  "py-cpp_multic-compact_zlib-ip",
-  "py-cpp_multic-compact_zlib-ip-ssl",
-  "py-cpp_multic_buffered-domain",
-  "py-cpp_multic_buffered-ip",
-  "py-cpp_multic_buffered-ip-ssl",
-  "py-cpp_multic_framed-domain",
-  "py-cpp_multic_framed-ip",
-  "py-cpp_multic_framed-ip-ssl",
   "py-cpp_multic_http-domain",
   "py-cpp_multic_http-ip",
   "py-cpp_multic_http-ip-ssl",
-  "py-cpp_multic_zlib-domain",
-  "py-cpp_multic_zlib-ip",
-  "py-cpp_multic_zlib-ip-ssl",
-  "py-cpp_multih-header_buffered-domain",
-  "py-cpp_multih-header_buffered-ip",
-  "py-cpp_multih-header_buffered-ip-ssl",
-  "py-cpp_multih-header_framed-domain",
-  "py-cpp_multih-header_framed-ip",
-  "py-cpp_multih-header_framed-ip-ssl",
   "py-cpp_multih-header_http-domain",
   "py-cpp_multih-header_http-ip",
   "py-cpp_multih-header_http-ip-ssl",
-  "py-cpp_multih-header_zlib-domain",
-  "py-cpp_multih-header_zlib-ip",
-  "py-cpp_multih-header_zlib-ip-ssl",
-  "py-cpp_multih_buffered-domain",
-  "py-cpp_multih_buffered-ip",
-  "py-cpp_multih_buffered-ip-ssl",
-  "py-cpp_multih_framed-domain",
-  "py-cpp_multih_framed-ip",
-  "py-cpp_multih_framed-ip-ssl",
   "py-cpp_multih_http-domain",
   "py-cpp_multih_http-ip",
   "py-cpp_multih_http-ip-ssl",
-  "py-cpp_multih_zlib-domain",
-  "py-cpp_multih_zlib-ip",
-  "py-cpp_multih_zlib-ip-ssl",
-  "py-cpp_multij-json_buffered-domain",
-  "py-cpp_multij-json_buffered-ip",
-  "py-cpp_multij-json_buffered-ip-ssl",
-  "py-cpp_multij-json_framed-domain",
-  "py-cpp_multij-json_framed-ip",
-  "py-cpp_multij-json_framed-ip-ssl",
   "py-cpp_multij-json_http-domain",
   "py-cpp_multij-json_http-ip",
   "py-cpp_multij-json_http-ip-ssl",
-  "py-cpp_multij-json_zlib-domain",
-  "py-cpp_multij-json_zlib-ip",
-  "py-cpp_multij-json_zlib-ip-ssl",
-  "py-cpp_multij_buffered-domain",
-  "py-cpp_multij_buffered-ip",
-  "py-cpp_multij_buffered-ip-ssl",
-  "py-cpp_multij_framed-domain",
-  "py-cpp_multij_framed-ip",
-  "py-cpp_multij_framed-ip-ssl",
   "py-cpp_multij_http-domain",
   "py-cpp_multij_http-ip",
   "py-cpp_multij_http-ip-ssl",
-  "py-cpp_multij_zlib-domain",
-  "py-cpp_multij_zlib-ip",
-  "py-cpp_multij_zlib-ip-ssl",
   "py-d_accel-binary_http-ip",
   "py-d_accel-binary_http-ip-ssl",
   "py-d_accelc-compact_http-ip",
@@ -1024,53 +801,23 @@
   "py-dart_binary_http-ip",
   "py-dart_compact_http-ip",
   "py-dart_json_http-ip",
-  "py-go_accel-binary_buffered-ip",
   "py-go_accel-binary_buffered-ip-ssl",
-  "py-go_accel-binary_framed-ip",
   "py-go_accel-binary_framed-ip-ssl",
-  "py-go_accel-binary_http-ip",
-  "py-go_accel-binary_http-ip-ssl",
-  "py-go_accel-binary_zlib-ip",
   "py-go_accel-binary_zlib-ip-ssl",
-  "py-go_accelc-compact_buffered-ip",
   "py-go_accelc-compact_buffered-ip-ssl",
-  "py-go_accelc-compact_framed-ip",
   "py-go_accelc-compact_framed-ip-ssl",
-  "py-go_accelc-compact_http-ip",
-  "py-go_accelc-compact_http-ip-ssl",
-  "py-go_accelc-compact_zlib-ip",
   "py-go_accelc-compact_zlib-ip-ssl",
-  "py-go_binary_buffered-ip",
   "py-go_binary_buffered-ip-ssl",
-  "py-go_binary_framed-ip",
   "py-go_binary_framed-ip-ssl",
-  "py-go_binary_http-ip",
-  "py-go_binary_http-ip-ssl",
-  "py-go_binary_zlib-ip",
   "py-go_binary_zlib-ip-ssl",
-  "py-go_compact_buffered-ip",
   "py-go_compact_buffered-ip-ssl",
-  "py-go_compact_framed-ip",
   "py-go_compact_framed-ip-ssl",
-  "py-go_compact_http-ip",
-  "py-go_compact_http-ip-ssl",
-  "py-go_compact_zlib-ip",
   "py-go_compact_zlib-ip-ssl",
-  "py-go_header_buffered-ip",
   "py-go_header_buffered-ip-ssl",
-  "py-go_header_framed-ip",
   "py-go_header_framed-ip-ssl",
-  "py-go_header_http-ip",
-  "py-go_header_http-ip-ssl",
-  "py-go_header_zlib-ip",
   "py-go_header_zlib-ip-ssl",
-  "py-go_json_buffered-ip",
   "py-go_json_buffered-ip-ssl",
-  "py-go_json_framed-ip",
   "py-go_json_framed-ip-ssl",
-  "py-go_json_http-ip",
-  "py-go_json_http-ip-ssl",
-  "py-go_json_zlib-ip",
   "py-go_json_zlib-ip-ssl",
   "py-hs_accel-binary_http-ip",
   "py-hs_accelc-compact_http-ip",
@@ -1301,12 +1048,12 @@
   "py-rb_compact_framed-domain",
   "py-rb_compact_framed-ip",
   "py-rb_compact_framed-ip-ssl",
-  "py-rb_header_buffered-ip-ssl",
-  "py-rb_header_framed-ip-ssl",
-  "py-rb_header_framed-ip",
   "py-rb_header_buffered-domain",
   "py-rb_header_buffered-ip",
+  "py-rb_header_buffered-ip-ssl",
   "py-rb_header_framed-domain",
+  "py-rb_header_framed-ip",
+  "py-rb_header_framed-ip-ssl",
   "py-rb_json_buffered-domain",
   "py-rb_json_buffered-ip",
   "py-rb_json_buffered-ip-ssl",
@@ -1383,8 +1130,8 @@
   "rb-netstd_json_buffered-ip-ssl",
   "rb-netstd_json_framed-ip",
   "rb-netstd_json_framed-ip-ssl",
-  "rb-py_header_framed-ip-ssl",
   "rb-py_header_buffered-ip-ssl",
+  "rb-py_header_framed-ip-ssl",
   "rs-netstd_binary_buffered-ip",
   "rs-netstd_binary_framed-ip",
   "rs-netstd_compact_buffered-ip",
@@ -1393,4 +1140,4 @@
   "rs-netstd_multi-binary_framed-ip",
   "rs-netstd_multic-compact_buffered-ip",
   "rs-netstd_multic-compact_framed-ip"
-]
+]
\ No newline at end of file
diff --git a/test/py/Makefile.am b/test/py/Makefile.am
index 078ba02..c471b92 100644
--- a/test/py/Makefile.am
+++ b/test/py/Makefile.am
@@ -77,56 +77,56 @@
 
 
 gen-py/%/__init__.py: ../%.thrift $(THRIFT)
-	test -f ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py  ../v0.16/$(notdir $<) \
+	test -f ../$(notdir $<) \
+	&& $(THRIFT) --gen py  ../$(notdir $<) \
 	|| $(THRIFT) --gen py  $<
 
 gen-py-default/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-default || $(MKDIR_P) gen-py-default
-	test -f ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py -out gen-py-default ../v0.16/$(notdir $<) \
+	test -f ../$(notdir $<) \
+	&& $(THRIFT) --gen py -out gen-py-default ../$(notdir $<) \
 	|| $(THRIFT) --gen py -out gen-py-default $<
 
 gen-py-slots/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-slots || $(MKDIR_P) gen-py-slots
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:slots -out gen-py-slots ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:slots -out gen-py-slots ../$(notdir $<) \
 	|| $(THRIFT) --gen py:slots -out gen-py-slots $<
 
 gen-py-oldstyle/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-oldstyle || $(MKDIR_P) gen-py-oldstyle
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:old_style -out gen-py-oldstyle ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:old_style -out gen-py-oldstyle ../$(notdir $<) \
 	|| $(THRIFT) --gen py:old_style -out gen-py-oldstyle $<
 
 gen-py-no_utf8strings/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-no_utf8strings || $(MKDIR_P) gen-py-no_utf8strings
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:no_utf8strings -out gen-py-no_utf8strings ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:no_utf8strings -out gen-py-no_utf8strings ../$(notdir $<) \
 	|| $(THRIFT) --gen py:no_utf8strings -out gen-py-no_utf8strings $<
 
 gen-py-dynamic/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-dynamic || $(MKDIR_P) gen-py-dynamic
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:dynamic -out gen-py-dynamic ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:dynamic -out gen-py-dynamic ../$(notdir $<) \
 	|| $(THRIFT) --gen py:dynamic -out gen-py-dynamic $<
 
 gen-py-dynamicslots/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-dynamicslots || $(MKDIR_P) gen-py-dynamicslots
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:dynamic,slots -out gen-py-dynamicslots ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:dynamic,slots -out gen-py-dynamicslots ../$(notdir $<) \
 	|| $(THRIFT) --gen py:dynamic,slots -out gen-py-dynamicslots $<
 
 gen-py-enum/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-enum || $(MKDIR_P) gen-py-enum
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:enum -out gen-py-enum ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:enum -out gen-py-enum ../$(notdir $<) \
 	|| $(THRIFT) --gen py:enum -out gen-py-enum $<
 
 gen-py-type_hints/%/__init__.py: ../%.thrift $(THRIFT)
 	test -d gen-py-type_hints || $(MKDIR_P) gen-py-type_hints
-	test ../v0.16/$(notdir $<) \
-	&& $(THRIFT) --gen py:type_hints,enum -out gen-py-type_hints ../v0.16/$(notdir $<) \
+	test ../$(notdir $<) \
+	&& $(THRIFT) --gen py:type_hints,enum -out gen-py-type_hints ../$(notdir $<) \
 	|| $(THRIFT) --gen py:type_hints,enum -out gen-py-type_hints $<
 
 clean-local:
diff --git a/test/py/TestClient.py b/test/py/TestClient.py
index f608e4e..07b39a0 100755
--- a/test/py/TestClient.py
+++ b/test/py/TestClient.py
@@ -24,6 +24,7 @@
 import sys
 import time
 import unittest
+import uuid
 
 from optparse import OptionParser
 from util import local_libpath
@@ -160,6 +161,13 @@
         val = bytearray([i for i in range(0, 256)])
         self.assertEqual(bytearray(self.client.testBinary(bytes(val))), val)
 
+    def testUuid(self):
+        print('testUuid')
+        val1 = uuid.UUID('00112233-4455-6677-8899-aabbccddeeff')
+        val2 = uuid.uuid4()
+        self.assertEqual(self.client.testUuid(val1), val1)
+        self.assertEqual(self.client.testUuid(val2), val2)
+
     def testStruct(self):
         print('testStruct')
         x = Xtruct()
diff --git a/test/py/TestServer.py b/test/py/TestServer.py
index 0108c98..59a06ad 100755
--- a/test/py/TestServer.py
+++ b/test/py/TestServer.py
@@ -82,6 +82,11 @@
             logging.info('testBinary()')  # TODO: hex output
         return thing
 
+    def testUuid(self, thing):
+        if self.options.verbose > 1:
+            logging.info('testUuid(%s)' % thing)
+        return thing
+
     def testStruct(self, thing):
         if self.options.verbose > 1:
             logging.info('testStruct({%s, %s, %s, %s})' % (thing.string_thing, thing.byte_thing, thing.i32_thing, thing.i64_thing))
diff --git a/test/py/TestTypes.py b/test/py/TestTypes.py
index bb1bc35..0df87aa 100644
--- a/test/py/TestTypes.py
+++ b/test/py/TestTypes.py
@@ -20,6 +20,7 @@
 from ThriftTest import ThriftTest
 from ThriftTest.ThriftTest import Client
 from ThriftTest.ttypes import Xtruct
+from uuid import UUID
 
 import unittest
 
@@ -66,3 +67,6 @@
 
     def test_set(self):
         self.assertEqual(Client.testSet.__annotations__, {'return': set[int], 'thing': set[int]})
+
+    def test_uuid(self):
+        self.assertEqual(Client.testUuid.__annotations__, {'return': UUID, 'thing': UUID})
diff --git a/test/py/generate.cmake b/test/py/generate.cmake
index 7139802..b5170f0 100644
--- a/test/py/generate.cmake
+++ b/test/py/generate.cmake
@@ -7,23 +7,23 @@
   endif()
 endmacro(GENERATE)
 
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py gen-py-default)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:slots gen-py-slots)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:old_style gen-py-oldstyle)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:no_utf8strings gen-py-no_utf8strings)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic gen-py-dynamic)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:dynamic,slots gen-py-dynamicslots)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:enum gen-py-enum)
-generate(${MY_PROJECT_DIR}/test/v0.16/ThriftTest.thrift py:type_hints,enum gen-py-type_hints)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py gen-py-default)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:slots gen-py-slots)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:old_style gen-py-oldstyle)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:no_utf8strings gen-py-no_utf8strings)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:dynamic gen-py-dynamic)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:dynamic,slots gen-py-dynamicslots)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:enum gen-py-enum)
+generate(${MY_PROJECT_DIR}/test/ThriftTest.thrift py:type_hints,enum gen-py-type_hints)
 
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py gen-py-default)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:slots gen-py-slots)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:old_style gen-py-oldstyle)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:no_utf8strings gen-py-no_utf8strings)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic gen-py-dynamic)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:dynamic,slots gen-py-dynamicslots)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:enum gen-py-enum)
-generate(${MY_PROJECT_DIR}/test/v0.16/DebugProtoTest.thrift py:type_hints,enum gen-py-type_hints)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py gen-py-default)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:slots gen-py-slots)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:old_style gen-py-oldstyle)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:no_utf8strings gen-py-no_utf8strings)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:dynamic gen-py-dynamic)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:dynamic,slots gen-py-dynamicslots)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:enum gen-py-enum)
+generate(${MY_PROJECT_DIR}/test/DebugProtoTest.thrift py:type_hints,enum gen-py-type_hints)
 
 generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py gen-py-default)
 generate(${MY_PROJECT_DIR}/test/DoubleConstantsTest.thrift py:slots gen-py-slots)
diff --git a/test/tests.json b/test/tests.json
index bcc87d3..0f7dbe7 100644
--- a/test/tests.json
+++ b/test/tests.json
@@ -99,7 +99,7 @@
       ]
     },
     "client": {
-      "timeout": 6,
+      "timeout": 15,
       "command": [
         "testclient"
       ]
@@ -292,7 +292,7 @@
       ]
     },
     "client": {
-      "timeout": 10,
+      "timeout": 15,
       "command": [
         "TestClient.py",
         "--verbose",
@@ -342,7 +342,7 @@
       ]
     },
     "client": {
-      "timeout": 10,
+      "timeout": 15,
       "command": [
         "python3",
         "TestClient.py",
@@ -393,7 +393,7 @@
       ]
     },
     "client": {
-      "timeout": 8,
+      "timeout": 15,
       "command": [
         "TestClient"
       ],