Skip to content

Commit

Permalink
Initial Python 3 support (#26)
Browse files Browse the repository at this point in the history
* Initial Python 3 support

* Stripping Py2-only vendor libraries (for unittesting)

* Python 3 compatibility

* Full Python 3 compatibility

* Strip support for 60 second+ publishing.

* Make travis use pyblish/pyblish-base

* Fix .travis.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml
  • Loading branch information
mottosso committed May 27, 2016
1 parent 85c20e2 commit 63dc90d
Show file tree
Hide file tree
Showing 95 changed files with 1,020 additions and 20,377 deletions.
6 changes: 4 additions & 2 deletions .travis.yml
Expand Up @@ -2,11 +2,13 @@ language: python
python:
- 2.6
- 2.7
- 3.3
- 3.5
install:
- pip install coveralls
- pushd ~
- git clone https://github.com/mottosso/pyblish.git
- export PYTHONPATH=${PWD}/pyblish
- git clone https://github.com/pyblish/pyblish-base.git
- export PYTHONPATH=${PWD}/pyblish-base
- popd
script:
- python run_coverage.py
Expand Down
53 changes: 51 additions & 2 deletions appveyor.yml
@@ -1,4 +1,53 @@
environment:
matrix:
- PYTHON: "C:\\Python26"
PYTHON_VERSION: "2.6.6"
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python26-x64"
PYTHON_VERSION: "2.6.6"
PYTHON_ARCH: "64"

- PYTHON: "C:\\Python27"
PYTHON_VERSION: "2.7.8"
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python27-x64"
PYTHON_VERSION: "2.7.8"
PYTHON_ARCH: "64"

- PYTHON: "C:\\Python33"
PYTHON_VERSION: "3.3.5"
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python33-x64"
PYTHON_VERSION: "3.3.5"
PYTHON_ARCH: "64"

- PYTHON: "C:\\Python34"
PYTHON_VERSION: "3.4.1"
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python34-x64"
PYTHON_VERSION: "3.4.1"
PYTHON_ARCH: "64"

- PYTHON: "C:\\Python35"
PYTHON_VERSION: "3.5.1"
PYTHON_ARCH: "32"

- PYTHON: "C:\\Python35-x64"
PYTHON_VERSION: "3.5.1"
PYTHON_ARCH: "64"

init:
- ps: "ls -Name \"C:/\""
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"

install:
- pip install nose coverage
- git clone https://github.com/pyblish/pyblish-base.git C:\projects\pyblish-base
- set PYTHONPATH=C:\projects\pyblish-base

build_script:
- git clone https://github.com/mottosso/pyblish.git C:\projects\pyblish
- set PYTHONPATH=C:\projects\pyblish
- python run_coverage.py
2 changes: 1 addition & 1 deletion pyblish_rpc/__main__.py
@@ -1,4 +1,4 @@
import server
from . import server

if __name__ == '__main__':
import argparse
Expand Down
37 changes: 5 additions & 32 deletions pyblish_rpc/client.py
Expand Up @@ -9,17 +9,12 @@

import socket

try:
import httplib
except ImportError:
# Python 3
import http.client as httplib

try:
import xmlrpclib
from xmlrpclib import Transport, ServerProxy
except ImportError:
# Python 3
import xmlrpc.server as xmlrpclib
from xmlrpc.client import Transport, ServerProxy


import pyblish.api
Expand All @@ -44,9 +39,9 @@ def __init__(self, port, user=None, password=None):
self.cached_context = list()
self.cached_discover = list()

transport = TimeoutTransport()
transport = Transport()

self._proxy = xmlrpclib.ServerProxy(
self._proxy = ServerProxy(
"http://{auth}127.0.0.1:{port}/pyblish".format(
port=port,
auth=("{user}:{pwd}@".format(
Expand Down Expand Up @@ -102,28 +97,6 @@ def emit(self, signal, **kwargs):
self._proxy.emit(signal, kwargs)


class TimeoutTransport(xmlrpclib.Transport):
"""Some requests may take a very long time, and that is ok"""
timeout = 60 * 60 # 1 hour

def make_connection(self, host):
h = HttpWithTimeout(host, timeout=self.timeout)
return h


class HttpWithTimeout(httplib.HTTP):
def __init__(self, host="", port=None, strict=None, timeout=5.0):
self._setup(self._connection_class(
host,
port if port != 0 else None,
strict,
timeout=timeout)
)

def getresponse(self, *args, **kw):
return self._conn.getresponse(*args, **kw)


# Object Proxies


Expand All @@ -146,7 +119,7 @@ def from_json(cls, context):
self._data = context["data"]
self[:] = list(InstanceProxy.from_json(i)
for i in context["children"])

# Attach metadata
self._data["pyblishClientVersion"] = pyblish.api.version

Expand Down
2 changes: 1 addition & 1 deletion pyblish_rpc/formatting.py
Expand Up @@ -4,7 +4,7 @@
import inspect
import traceback

import schema
from . import schema

import pyblish.lib
import pyblish.plugin
Expand Down
5 changes: 3 additions & 2 deletions pyblish_rpc/mocking.py
@@ -1,6 +1,7 @@
import os
import time
import subprocess

import pyblish.api


Expand Down Expand Up @@ -46,7 +47,7 @@ def process_context(self, context):
self.log.info("Selecting: %s" % name)
instance = context.create_instance(name)

for key, value in data.iteritems():
for key, value in data.items():
instance.set_data(key, value)


Expand All @@ -60,7 +61,7 @@ def process(self, context):
self.log.info("Selecting: %s" % name)
instance = context.create_instance(name)

for key, value in data.iteritems():
for key, value in data.items():
instance.set_data(key, value)


Expand Down
4 changes: 3 additions & 1 deletion pyblish_rpc/schema.py
Expand Up @@ -15,6 +15,8 @@

import jsonschema

from .vendor import six

cache = {}
module_dir = os.path.dirname(__file__)
schema_dir = os.path.join(module_dir, "schema")
Expand All @@ -33,7 +35,7 @@ def load_all():


def validate(data, schema):
if isinstance(schema, basestring):
if isinstance(schema, six.string_types):
schema = cache[schema + ".json"]

resolver = jsonschema.RefResolver(
Expand Down
32 changes: 21 additions & 11 deletions pyblish_rpc/server.py
Expand Up @@ -8,20 +8,30 @@


import sys
# import base64
import threading
import SocketServer
from SimpleXMLRPCServer import (
SimpleXMLRPCServer,
SimpleXMLRPCRequestHandler
)

try:
from SimpleXMLRPCServer import (
SimpleXMLRPCServer,
SimpleXMLRPCRequestHandler
)
except ImportError:
from xmlrpc.server import (
SimpleXMLRPCServer,
SimpleXMLRPCRequestHandler
)

try:
import SocketServer as socketserver
except ImportError:
# Python 3
import socketserver

import pyblish.api
import pyblish.lib
import pyblish.logic

import pyblish_rpc
import service as service_
from . import dispatch_wrapper, service as service_

self = sys.modules[__name__]
self.current_server_thread = None
Expand All @@ -32,7 +42,7 @@ def default_wrapper(func, *args, **kwargs):
return func(*args, **kwargs)


class RpcServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer):
class RpcServer(socketserver.ThreadingMixIn, SimpleXMLRPCServer):
"""The Pyblish RPC Server
Support multiple requests simultaneously. This is important,
Expand Down Expand Up @@ -74,14 +84,14 @@ def authenticate(self, headers):
return True

def _dispatch(self, *args):
wrapper = pyblish_rpc.dispatch_wrapper() or default_wrapper
wrapper = dispatch_wrapper() or default_wrapper
return wrapper(SimpleXMLRPCServer._dispatch,
self, *args)


def kill():
"""Shutdown a running server"""
print "Shutting down.."
print("Shutting down..")
return self.current_server.shutdown()


Expand Down
8 changes: 3 additions & 5 deletions pyblish_rpc/service.py
Expand Up @@ -13,9 +13,7 @@
import pyblish.plugin

# Local Library
import version
import mocking
import formatting
from . import version, mocking, formatting

_log = logging.getLogger("pyblish-rpc")

Expand Down Expand Up @@ -65,8 +63,8 @@ def context(self):
"user": getpass.getuser(),
"connectTime": pyblish.lib.time(),
"pyblishServerVersion": pyblish.version,
"pyblishRPCVersion": version.version,
"pythonVersion": sys.version}.iteritems():
"pyblishRPCVersion": version,
"pythonVersion": sys.version}.items():

self._context.data[key] = value

Expand Down

0 comments on commit 63dc90d

Please sign in to comment.