From 23af99d78acaa25b6ad97b007ce50fbe393d8ea5 Mon Sep 17 00:00:00 2001 From: Elias Nygren Date: Tue, 30 Jun 2015 15:49:36 +0300 Subject: [PATCH 1/4] run pasteurize for automatic python 2/3 support --- test/conftest.py | 10 +++++++++- test/live_test.py | 7 +++++++ test/test_cloud_manager.py | 9 ++++++++- test/test_firewall.py | 9 ++++++++- test/test_ip_manager.py | 9 ++++++++- test/test_server.py | 10 +++++++++- test/test_server_creation.py | 9 ++++++++- test/test_storage.py | 9 ++++++++- upcloud/__init__.py | 6 ++++++ upcloud/base.py | 6 ++++++ upcloud/cloud_manager/__init__.py | 6 ++++++ upcloud/cloud_manager/cloud_manager.py | 6 ++++++ upcloud/cloud_manager/firewall_mixin.py | 10 +++++++++- upcloud/cloud_manager/ip_address_mixin.py | 9 ++++++++- upcloud/cloud_manager/server_mixin.py | 11 ++++++++++- upcloud/cloud_manager/storage_mixin.py | 10 +++++++++- upcloud/firewall.py | 6 ++++++ upcloud/ip_address.py | 6 ++++++ upcloud/server.py | 8 ++++++++ upcloud/storage.py | 11 ++++++++++- upcloud/tools.py | 11 +++++++++-- 21 files changed, 164 insertions(+), 14 deletions(-) diff --git a/test/conftest.py b/test/conftest.py index 6c7ec2b..2654555 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -1,3 +1,11 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import open +from future import standard_library +standard_library.install_aliases() +from builtins import object import os import pytest import responses @@ -10,7 +18,7 @@ def manager(): return upcloud.CloudManager("testuser", "mock-api-password") -class Mock(): +class Mock(object): base_url = 'https://api.upcloud.com/1.2' @staticmethod diff --git a/test/live_test.py b/test/live_test.py index 34a463a..35c0a97 100644 --- a/test/live_test.py +++ b/test/live_test.py @@ -1,3 +1,10 @@ +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from builtins import input +from future import standard_library +standard_library.install_aliases() import sys from time import sleep diff --git a/test/test_cloud_manager.py b/test/test_cloud_manager.py index 36170c7..637ace1 100644 --- a/test/test_cloud_manager.py +++ b/test/test_cloud_manager.py @@ -1,8 +1,15 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object import responses import json from conftest import Mock -class TestCloudManagerBasic(): +class TestCloudManagerBasic(object): @responses.activate def test_get_account(self, manager): data = Mock.mock_get("account") diff --git a/test/test_firewall.py b/test/test_firewall.py index 18655b0..7564528 100644 --- a/test/test_firewall.py +++ b/test/test_firewall.py @@ -1,3 +1,10 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object from upcloud import FirewallRule import responses import json @@ -38,7 +45,7 @@ def check_fields(body): -class TestFirewall(): +class TestFirewall(object): @responses.activate def test_add_firewall_rule(self, manager): Mock.mock_get("server/00798b85-efdc-41ca-8021-f6ef457b8531") diff --git a/test/test_ip_manager.py b/test/test_ip_manager.py index d743897..788fa7b 100644 --- a/test/test_ip_manager.py +++ b/test/test_ip_manager.py @@ -1,8 +1,15 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object import responses import json from conftest import Mock -class TestIP(): +class TestIP(object): @responses.activate def test_get_ip(self, manager): data = Mock.mock_get("ip_address/10.1.0.101") diff --git a/test/test_server.py b/test/test_server.py index 3003310..c3fb969 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -1,9 +1,17 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import str +from future import standard_library +standard_library.install_aliases() +from builtins import object import responses import json from conftest import Mock import pytest -class TestServer(): +class TestServer(object): @responses.activate def test_get_server(self, manager): data = Mock.mock_get("server/00798b85-efdc-41ca-8021-f6ef457b8531") diff --git a/test/test_server_creation.py b/test/test_server_creation.py index 09bbe0a..862fe89 100644 --- a/test/test_server_creation.py +++ b/test/test_server_creation.py @@ -1,3 +1,10 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object from conftest import Mock from upcloud import ZONE from upcloud import Server @@ -6,7 +13,7 @@ import json import pytest -class TestCreateServer(): +class TestCreateServer(object): def test_storage_prepare_post_body(self, manager): diff --git a/test/test_storage.py b/test/test_storage.py index 17c69dc..4d2bc62 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -1,8 +1,15 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object import responses import json from conftest import Mock -class TestStorage(): +class TestStorage(object): @responses.activate def test_get_storage(self, manager): data = Mock.mock_get("storage/01d4fcd4-e446-433b-8a9c-551a1284952e") diff --git a/upcloud/__init__.py b/upcloud/__init__.py index f1c09ff..b9414c8 100644 --- a/upcloud/__init__.py +++ b/upcloud/__init__.py @@ -1,6 +1,12 @@ """ Python Interface to UpCloud's API """ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() __version__ = "0.0.1" __author__ = "Elias Nygren" diff --git a/upcloud/base.py b/upcloud/base.py index 0380abe..06ffaba 100644 --- a/upcloud/base.py +++ b/upcloud/base.py @@ -1,3 +1,9 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() import json import requests diff --git a/upcloud/cloud_manager/__init__.py b/upcloud/cloud_manager/__init__.py index a0ce58d..d507bbc 100644 --- a/upcloud/cloud_manager/__init__.py +++ b/upcloud/cloud_manager/__init__.py @@ -1 +1,7 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() from .cloud_manager import CloudManager \ No newline at end of file diff --git a/upcloud/cloud_manager/cloud_manager.py b/upcloud/cloud_manager/cloud_manager.py index 9265689..4069701 100644 --- a/upcloud/cloud_manager/cloud_manager.py +++ b/upcloud/cloud_manager/cloud_manager.py @@ -1,3 +1,9 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() from ..base import BaseAPI from .server_mixin import ServerManager diff --git a/upcloud/cloud_manager/firewall_mixin.py b/upcloud/cloud_manager/firewall_mixin.py index 6730520..05b0e0b 100644 --- a/upcloud/cloud_manager/firewall_mixin.py +++ b/upcloud/cloud_manager/firewall_mixin.py @@ -1,6 +1,14 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import str +from future import standard_library +standard_library.install_aliases() +from builtins import object from .. import FirewallRule -class FirewallManager(): +class FirewallManager(object): """ Provides get / list / create / delete functionality for firewall rules. These functions are used by the FirewallRule class but may also be used diff --git a/upcloud/cloud_manager/ip_address_mixin.py b/upcloud/cloud_manager/ip_address_mixin.py index 5fdae3f..ed9d5a5 100644 --- a/upcloud/cloud_manager/ip_address_mixin.py +++ b/upcloud/cloud_manager/ip_address_mixin.py @@ -1,6 +1,13 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object from ..ip_address import IP_address -class IPManager(): +class IPManager(object): """ Functions for managing IP-addresses. Intended to be used as a mixin for CloudManager. """ diff --git a/upcloud/cloud_manager/server_mixin.py b/upcloud/cloud_manager/server_mixin.py index 354a0d6..685e499 100644 --- a/upcloud/cloud_manager/server_mixin.py +++ b/upcloud/cloud_manager/server_mixin.py @@ -1,3 +1,12 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import dict +from builtins import str +from future import standard_library +standard_library.install_aliases() +from builtins import object from ..ip_address import IP_address from ..storage import Storage @@ -6,7 +15,7 @@ from ..tools import assignIfExists -class ServerManager(): +class ServerManager(object): """ Functions for managing IP-addresses. Intended to be used as a mixin for CloudManager. """ diff --git a/upcloud/cloud_manager/storage_mixin.py b/upcloud/cloud_manager/storage_mixin.py index 6c099fb..1b03f08 100644 --- a/upcloud/cloud_manager/storage_mixin.py +++ b/upcloud/cloud_manager/storage_mixin.py @@ -1,6 +1,14 @@ +from __future__ import print_function +from __future__ import unicode_literals +from __future__ import division +from __future__ import absolute_import +from builtins import dict +from future import standard_library +standard_library.install_aliases() +from builtins import object from ..storage import Storage -class StorageManager(): +class StorageManager(object): """ Functions for managing Storage disks. Intended to be used as a mixin for CloudManager. """ diff --git a/upcloud/firewall.py b/upcloud/firewall.py index 521cf9f..072b732 100644 --- a/upcloud/firewall.py +++ b/upcloud/firewall.py @@ -1,3 +1,9 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() from .base import BaseAPI class FirewallRule(object): diff --git a/upcloud/ip_address.py b/upcloud/ip_address.py index cc9db35..676ed3b 100644 --- a/upcloud/ip_address.py +++ b/upcloud/ip_address.py @@ -1,3 +1,9 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() from .base import BaseAPI class IP_address(BaseAPI): diff --git a/upcloud/server.py b/upcloud/server.py index c92438f..811ff19 100644 --- a/upcloud/server.py +++ b/upcloud/server.py @@ -1,3 +1,11 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import dict +from builtins import str +from future import standard_library +standard_library.install_aliases() from .base import BaseAPI class Server(BaseAPI): diff --git a/upcloud/storage.py b/upcloud/storage.py index b751292..0bd995f 100644 --- a/upcloud/storage.py +++ b/upcloud/storage.py @@ -1,7 +1,16 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from builtins import dict +from builtins import str +from future import standard_library +standard_library.install_aliases() +from builtins import object from .tools import assignIfExists from .tools import OperatingSystems -class Storage(): +class Storage(object): def __init__(self, **kwargs): self.__reset(**kwargs) diff --git a/upcloud/tools.py b/upcloud/tools.py index 64166ef..07f60ae 100644 --- a/upcloud/tools.py +++ b/upcloud/tools.py @@ -1,3 +1,10 @@ +from __future__ import unicode_literals +from __future__ import print_function +from __future__ import division +from __future__ import absolute_import +from future import standard_library +standard_library.install_aliases() +from builtins import object import re def assignIfExists(opts, default=None, **kwargs): @@ -9,7 +16,7 @@ def assignIfExists(opts, default=None, **kwargs): return kwargs[opt] return default -class ZONE: +class ZONE(object): """ Enums for UpCloud's Zones. """ @@ -17,7 +24,7 @@ class ZONE: London = "uk-lon1" Chicago = "us-chi1" -class OperatingSystems: +class OperatingSystems(object): templates = { "CentOS 6.5": "01000000-0000-4000-8000-000050010200", "CentOS 7.0": "01000000-0000-4000-8000-000050010300", From 0786669a4b573d586ef3f42ba90777f6fa6a21db Mon Sep 17 00:00:00 2001 From: Elias Nygren Date: Tue, 30 Jun 2015 16:36:22 +0300 Subject: [PATCH 2/4] add 26 and 27 to tox.ini, fix things missed by pasteurize --- requirements.txt | 2 ++ tox.ini | 2 +- upcloud/base.py | 2 +- upcloud/cloud_manager/ip_address_mixin.py | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/requirements.txt b/requirements.txt index a16b1c3..ab0bc48 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,8 @@ +future==0.14.3 mock==1.0.1 py==1.4.26 pytest==2.6.4 requests==2.6.0 responses==0.3.0 six==1.9.0 +wheel==0.24.0 diff --git a/tox.ini b/tox.ini index 710b255..f0291bc 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py32, py33, py34, py35, pypy3 +envlist = py26, py27, py32, py33, py34, py35, pypy3 [testenv] commands = py.test test/ diff --git a/upcloud/base.py b/upcloud/base.py index 06ffaba..1f0bf80 100644 --- a/upcloud/base.py +++ b/upcloud/base.py @@ -20,7 +20,7 @@ def __init__(self, token): Handles errors with __error_middleware. """ def request(self, method, endpoint, body=None): - if(method not in {"GET", "POST", "PUT", "DELETE"}): + if(method not in set(["GET", "POST", "PUT", "DELETE"])): raise Exception("Invalid/Forbidden HTTP method") url = "/" + self.api_v + endpoint diff --git a/upcloud/cloud_manager/ip_address_mixin.py b/upcloud/cloud_manager/ip_address_mixin.py index ed9d5a5..1a07d40 100644 --- a/upcloud/cloud_manager/ip_address_mixin.py +++ b/upcloud/cloud_manager/ip_address_mixin.py @@ -4,7 +4,7 @@ from __future__ import absolute_import from future import standard_library standard_library.install_aliases() -from builtins import object +from builtins import object, str from ..ip_address import IP_address class IPManager(object): From acf1f1faa33ce1d522838b4d968becdcc3d24ad9 Mon Sep 17 00:00:00 2001 From: Elias Nygren Date: Tue, 30 Jun 2015 17:17:47 +0300 Subject: [PATCH 3/4] drop python 3.2 support as python-future does not support it --- README.md | 12 +++++++----- tox.ini | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d7daac9..95165bb 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,10 @@ python setup.py install **Supported versions** (offline tests pass with tox): -* python 3.2 -* python 3.3 +* python 2.6 +* python 2.7 +* python 3.2 removed due to python2/3 support +* python 3.3 * python 3.4 * python 3.5 * pypi3 2.4.0 @@ -34,7 +36,7 @@ python setup.py install * Scale horizontally by creating / destroying servers * Scale vertically by changing the RAM, CPU, storage specs of any server * Manage firewall (on/off and individual rules) - * since 0.2: full management of firewall rules + * since 0.2: full management of firewall rules **TODO:** * Cloning of storages @@ -173,11 +175,11 @@ Tests located in `project_root/tests/` directory. Run with: py.test tests/ ``` -To test against python3.2=< and pypy3-2.4.0, run: +To test against all supported python versions, run: ```python tox -``` +``` The project also supplies a small test suite to test against the live API at `test/live_test.py`. This suite is NOT run with `py.test` as it will permanently remove all resources related to an account. It should only be run with a throwaway dev-only account when preparing for a new release. It is not shipped with PyPI releases. See source code on how to run the live tests. diff --git a/tox.ini b/tox.ini index f0291bc..934ed32 100644 --- a/tox.ini +++ b/tox.ini @@ -4,7 +4,7 @@ # and then run "tox" from this directory. [tox] -envlist = py26, py27, py32, py33, py34, py35, pypy3 +envlist = py26, py27, py33, py34, py35, pypy3 [testenv] commands = py.test test/ From 2e29ec6cee70491bdacee6841048b3b6558d7b50 Mon Sep 17 00:00:00 2001 From: Elias Nygren Date: Wed, 1 Jul 2015 15:19:01 +0300 Subject: [PATCH 4/4] update setup.py dependencies for py2/3 support --- setup.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3d96d29..88c4dcc 100644 --- a/setup.py +++ b/setup.py @@ -15,11 +15,13 @@ download='https://github.com/UpCloudLtd/upcloud-python-api/tarball/v0.2.0', license='MIT', install_requires=[ + 'future==0.14.3', 'mock==1.0.1', 'py==1.4.26', 'pytest==2.6.4', 'requests==2.6.0', 'responses==0.3.0', - 'six==1.9.0' + 'six==1.9.0', + 'wheel==0.24.0' ] )