diff --git a/LICENSE b/LICENSE index f23edd239..02476d93b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,9 +1,24 @@ Copyright (c) 2013, SoftLayer Technologies, Inc. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither SoftLayer Technologies, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither SoftLayer Technologies, Inc. nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 9bd30a5ae..b97581499 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ SoftLayer API Python Client =========================== -This code provides a simple Python library to use the [SoftLayer API](http://sldn.softlayer.com/reference/softlayerapi). +This code provides a simple Python library to use the +[SoftLayer API](http://sldn.softlayer.com/reference/softlayerapi). Overview -------- -This library provides a simple interface to interact with SoftLayer's XML-RPC API and provides support for many of SoftLayer API's features like [object masks](http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayerrAPI). +This library provides a simple interface to interact with SoftLayer's XML-RPC +API and provides support for many of SoftLayer API's features like +[object masks](http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayerAPI). Installation ------------ @@ -21,14 +24,19 @@ python setup.py install ``` -The most up to date version of this library can be found on the SoftLayer github public repositories: http://github.com/softlayer. Please post to the SoftLayer forums http://forums.softlayer.com/ or open a support ticket in the SoftLayer customer portal if you have any questions regarding use of this library. +The most up to date version of this library can be found on the SoftLayer +GitHub public repositories: http://github.com/softlayer. Please post to the +SoftLayer forums http://forums.softlayer.com/ or open a support ticket in the +SoftLayer customer portal if you have any questions regarding use of this +library. System Requirements ------------------- * This library has been tested on Python 2.5, 2.6, 2.7, 3.2 and 3.3. * A valid SoftLayer API username and key are required to call SoftLayer's API -* A connection to SoftLayer's private network is required to connect to SoftLayer’s private network API endpoints. +* A connection to SoftLayer's private network is required to connect to + SoftLayer’s private network API endpoints. Suggested Reading ----------------- @@ -40,4 +48,5 @@ Suggested Reading Copyright --------- -This software is Copyright (c) 2013 [SoftLayer Technologies, Inc](http://www.softlayer.com/). See the bundled LICENSE file for more information. +This software is Copyright (c) 2013 [SoftLayer Technologies, Inc](http://www.softlayer.com/). +See the bundled LICENSE file for more information. diff --git a/SoftLayer/API.py b/SoftLayer/API.py index 0cfda1bac..2e5247d85 100644 --- a/SoftLayer/API.py +++ b/SoftLayer/API.py @@ -41,21 +41,21 @@ class Client(object): - """A SoftLayer API client + """ A SoftLayer API client. - :param service_name: The name of the SoftLayer API service to query. - :param id: An optional object if if you're instantiating a particular - SoftLayer_API object. Setting an id defines this client's + :param service_name: the name of the SoftLayer API service to query + :param integer id: an optional object ID if you're instantiating a + particular SoftLayer_API object. Setting an ID defines this client's initialization parameter. - :param username: An optional API username if you wish to bypass the - package's built-in username. - :param api_key: An optional API key if you wish to bypass the package's - built in API key. - :param endpoint_url: The API endpoint base URL you wish to connect to. + :param username: an optional API username if you wish to bypass the + package's built-in username + :param api_key: an optional API key if you wish to bypass the package's + built in API key + :param endpoint_url: the API endpoint base URL you wish to connect to. Set this to API_PRIVATE_ENDPOINT to connect via SoftLayer's private network. - :param timeout: Timeout for API requests - :param verbose: When true, prints details about every HTTP request. + :param integer timeout: timeout for API requests + :param boolean verbose: prints details about every HTTP request if true Usage:: @@ -88,17 +88,22 @@ def __init__(self, service_name=None, id=None, username=None, api_key=None, self.timeout = timeout def add_raw_header(self, name, value): - """ Set HTTP headers for API calls + """ Set HTTP headers for API calls. .. deprecated:: 2.0.0 + + :param name: the header name + :param value: the header value + """ self._raw_headers[name] = value def add_header(self, name, value): - """ Set a SoftLayer API call header + """ Set a SoftLayer API call header. .. deprecated:: 2.0.0 - :param name: The name of the header to add - :param value: The header to add. + :param name: the header name + :param value: the header value + """ name = name.strip() if name is None or name == '': @@ -107,17 +112,17 @@ def add_header(self, name, value): self._headers[name] = value def remove_header(self, name): - """ Remove a SoftLayer API call header + """ Remove a SoftLayer API call header. .. deprecated:: 2.0.0 - :param name: The name of the header to remove. - """ + :param name: the header name + """ if name in self._headers: del self._headers[name.strip()] def set_authentication(self, username, api_key): - """ Set user and key to authenticate a SoftLayer API call + """ Set user and key to authenticate a SoftLayer API call. .. deprecated:: 2.0.0 Use this method if you wish to bypass the API_USER and API_KEY class @@ -126,37 +131,37 @@ def set_authentication(self, username, api_key): See U{https://manage.softlayer.com/Administrative/apiKeychain} for more information. - :param username: The username to authenticate an API call. - :param api_key: The user's API key. - """ + :param username: the username to authenticate with + :param api_key: the user's API key + """ self.add_header('authenticate', { 'username': username.strip(), 'apiKey': api_key.strip(), }) def set_init_parameter(self, id): - """ Set an initialization parameter header + """ Set an initialization parameter header. .. deprecated:: 2.0.0 Initialization parameters instantiate a SoftLayer API service object to act upon during your API method call. For instance, if your account has - a server with id number 1234, then setting an initialization parameter + a server with ID number 1234, then setting an initialization parameter of 1234 in the SoftLayer_Hardware_Server Service instructs the API to act on server record 1234 in your method calls. See U{http://sldn.softlayer.com/article/Using-Initialization-Parameters-SoftLayer-API} # NOQA for more information. - :param id: The id number of the SoftLayer API object to instantiate - """ + :param id: the ID of the SoftLayer API object to instantiate + """ self.add_header(self._service_name + 'InitParameters', { 'id': int(id) }) def set_object_mask(self, mask): - """ Set an object mask to a SoftLayer API call + """ Set an object mask to a SoftLayer API call. .. deprecated:: 2.0.0 Use an object mask to retrieve data related your API call's result. @@ -166,9 +171,9 @@ def set_object_mask(self, mask): U{http://sldn.softlayer.com/article/Using-Object-Masks-SoftLayer-API} for more information. - :param mask: The object mask you wish to define - """ + :param mask: the object mask you wish to define + """ header = 'SoftLayer_ObjectMask' if isinstance(mask, dict): @@ -177,34 +182,42 @@ def set_object_mask(self, mask): self.add_header(header, {'mask': mask}) def set_result_limit(self, limit, offset=0): - """ Set a result limit on a SoftLayer API call + """ Set a result limit on a SoftLayer API call. .. deprecated:: 2.0.0 Many SoftLayer API methods return a group of results. These methods support a way to limit the number of results retrieved from the SoftLayer API in a way akin to an SQL LIMIT statement. - :param limit: The number of results to limit a SoftLayer API call to. - :param offset: An optional offset to begin a SoftLayer API call's - returned result at. - """ + :param limit: the number of results to limit a SoftLayer API call to + :param offset: An optional offset at which to begin a SoftLayer API + call's returned result + """ self.add_header('resultLimit', { 'limit': int(limit), 'offset': int(offset) }) def __getitem__(self, name): - """ Get a SoftLayer Service + """ Get a SoftLayer Service. :param name: The name of the service. E.G. SoftLayer_Account + """ if not name.startswith(self._prefix): name = self._prefix + name return Service(self, name) def __call__(self, service, method, *args, **kwargs): - """ Place a SoftLayer API call """ + """ Perform a SoftLayer API call. + + :param service: the name of the SoftLayer API service + :param method: the method to call on the service + :param dict *args: arguments for the specified method + :param dict **kwargs: response-level arguments (limit, offset, etc.) + + """ objectid = kwargs.get('id') objectmask = kwargs.get('mask') objectfilter = kwargs.get('filter') @@ -252,7 +265,12 @@ def __call__(self, service, method, *args, **kwargs): verbose=self.verbose) def __format_object_mask(self, objectmask, service): - """ Formats new and old style object masks into proper headers. """ + """ Format new and old style object masks into proper headers. + + :param objectmask: a string- or dict-based object mask + :param service: a SoftLayer API service name + + """ if isinstance(objectmask, dict): mheader = '%sObjectMask' % service else: @@ -272,7 +290,11 @@ def __format_object_mask(self, objectmask, service): return {mheader: {'mask': objectmask}} def __format_filter_dict(self, d): - """ Formats given filters to the SL-API header """ + """ Format given filters to the SL-API header. + + :param d: a dict of filters + + """ for key, value in d.iteritems(): if isinstance(value, dict): d[key] = self.__format_filter_dict(value) @@ -282,7 +304,7 @@ def __format_filter_dict(self, d): return d def __getattr__(self, name): - """ Attempt a SoftLayer API call + """ Attempt a SoftLayer API call. .. deprecated:: 2.0.0 Use this as a catch-all so users can call SoftLayer API methods @@ -290,6 +312,9 @@ def __getattr__(self, name): relating to their client object doesn't exist then assume the user is attempting a SoftLayer API call and return a simple function that makes an XML-RPC call. + + :param name: method name + """ if name in ["__name__", "__bases__"]: raise AttributeError("'Obj' object has no attribute '%s'" % name) diff --git a/SoftLayer/CCI.py b/SoftLayer/CCI.py index 41038e3d3..663a8386f 100644 --- a/SoftLayer/CCI.py +++ b/SoftLayer/CCI.py @@ -12,13 +12,19 @@ def __init__(self, *args): class CCIManager(object): - """ Manage CCI's """ + """ Manage CCIs """ def __init__(self, client): self.client = client self.account = client['Account'] self.guest = client['Virtual_Guest'] def list_instances(self, hourly=True, monthly=True): + """ Retrieve a list of all CCIs on the account. + + :param boolean hourly: include hourly instances + :param boolean monthly: include monthly instances + + """ items = set([ 'id', 'globalIdentifier', @@ -84,11 +90,19 @@ def get_create_options(self): return self.guest.getCreateObjectOptions() def cancel_instance(self, id): + """ Cancel an instance immediately, deleting all its data. + + :param integer id: the instance ID to cancel + + """ return self.guest.deleteObject(id=id) def reload_instance(self, id): - """ Performs an OS reload of an instance with its current - configuration. """ + """ Perform an OS reload of an instance with its current configuration. + + :param integer id: the instance ID to reload + + """ return self.guest.reloadCurrentOperatingSystemConfiguration(id=id) def _generate_create_dict( @@ -150,11 +164,11 @@ def _generate_create_dict( return data def verify_create_instance(self, **kwargs): - """ see _generate_create_dict """ + """ see _generate_create_dict """ # TODO: document this create_options = self._generate_create_dict(**kwargs) return self.guest.generateOrderTemplate(create_options) def create_instance(self, **kwargs): - """ see _generate_create_dict """ + """ see _generate_create_dict """ # TODO: document this create_options = self._generate_create_dict(**kwargs) return self.guest.createObject(create_options) diff --git a/SoftLayer/CLI/environment.py b/SoftLayer/CLI/environment.py index b3bebcfad..1f2d0d605 100644 --- a/SoftLayer/CLI/environment.py +++ b/SoftLayer/CLI/environment.py @@ -9,7 +9,6 @@ class Environment(object): - # {'module_name': {'action': 'actionClass'}} plugins = {} aliases = { diff --git a/SoftLayer/CLI/helpers.py b/SoftLayer/CLI/helpers.py index 1bba9ac15..3ac76412c 100644 --- a/SoftLayer/CLI/helpers.py +++ b/SoftLayer/CLI/helpers.py @@ -1,4 +1,3 @@ - from SoftLayer.CLI.environment import CLIRunnableType from prettytable import PrettyTable @@ -74,7 +73,7 @@ def no_going_back(confirmation): return valid_response( 'This action cannot be undone! ' - 'Type in "%s" or press Enter to abort.' % confirmation, + 'Type "%s" or press Enter to abort: ' % confirmation, confirmation) @@ -108,7 +107,7 @@ def add_row(self, row): self.rows.append(row) def prettytable(self): - " Returns a new prettytable instance" + """ Returns a new prettytable instance. """ t = PrettyTable(self.columns) if self.sortby: t.sortby = self.sortby diff --git a/SoftLayer/DNS.py b/SoftLayer/DNS.py index 14161c3b6..c06bf665c 100644 --- a/SoftLayer/DNS.py +++ b/SoftLayer/DNS.py @@ -10,26 +10,30 @@ class DNSZoneNotFound(SoftLayerError): class DNSManager(object): + """ Manage DNS zones. """ def __init__(self, client): - """ DNSManager + """ DNSManager initialization. - :param client: SoftLayer.API.Client - """ + :param SoftLayer.API.Client client: the client instance + """ self.client = client self.domain = self.client['Dns_Domain'] self.record = self.client['Dns_Domain_ResourceRecord'] def list_zones(self): + """ Get a list of all DNS zones. """ account = self.client['Account'] acc = account.getObject(mask='mask.domains') return acc['domains'] def get_zone(self, domain): - """ get_zone - get a domain and it's records + """ Get a domain/zone and its records. - domain - str""" + :param domain: the domain/zone name + + """ domain = domain.lower() results = self.domain.getByDomainName( domain, @@ -42,53 +46,86 @@ def get_zone(self, domain): raise DNSZoneNotFound(domain) def create_zone(self, domain, serial=None): - """ create_zone - create a zone using a string + """ Create a zone for the specified domain. - domain - str - serial - int (default strftime(%Y%m%d01))""" + :param domain: the domain/zone name to create + :param serial: serial value on the zone (default: strftime(%Y%m%d01)) + + """ return self.domain.createObject({ 'name': domain, 'serial': serial or strftime('%Y%m%d01')}) - def delete_zone(self, domid): - """ delete_zone - delete a zone by it's ID """ - return self.domain.deleteObject(id=domid) + def delete_zone(self, id): + """ Delete a zone by its ID. + + :param integer id: the zone ID to delete + + """ + return self.domain.deleteObject(id=id) def edit_zone(self, zone): + """ Update an existing zone with the options provided. The provided + dict must include an 'id' key and value corresponding to the zone that + should be updated. + + :param dict zone: the zone to update + + """ self.domain.editObject(zone) - def create_record(self, domid, record, type, data, ttl=60): - """ create_record - create a resource record on a domain + def create_record(self, id, record, type, data, ttl=60): + """ Create a resource record on a domain. + + :param integer id: the domain's ID + :param record: the name of the record to add + :param type: the type of record (A, AAAA, CNAME, MX, SRV, TXT, etc.) + :param data: the record's value + :param integer ttl: the TTL or time-to-live value (default: 60) - domid - int - record - str - type - str (A, AAAA, MX, ...) - data - str - ttl = int (default 60)""" + """ self.record.createObject({ - 'domainId': domid, + 'domainId': id, 'ttl': ttl, 'host': record, 'type': type, 'data': data}) def delete_record(self, recordid): - """ delete_record - delete resource record by ID""" + """ Delete a resource record by its ID. + + :param integer id: the record's ID + + """ self.record.deleteObject(id=recordid) def search_record(self, domain, record): - """ search_record - search for all records on a domain given a specific - name. Good for validating records + """ Search for records on a domain that match a specific name. + Useful for validating whether a record exists or that it has the + correct value. + + :param domain: the domain/zone name in which to search. + :param record: the record name to search for - domain - str - record - str""" + """ rrs = self.get_zone(domain)['resourceRecords'] records = filter(lambda x: x['host'].lower() == record.lower(), rrs) return records def edit_record(self, record): + """ Update an existing record with the options provided. The provided + dict must include an 'id' key and value corresponding to the record + that should be updated. + + :param dict record: the record to update + + """ self.record.editObject(record, id=record['id']) - def dump_zone(self, domid): - """ dump_zone - get zone in BIND format""" - return self.domain.getZoneFileContents(id=domid) + def dump_zone(self, id): + """ Retrieve a zone dump in BIND format. + + :param integer id: The zone/domain ID to dump + + """ + return self.domain.getZoneFileContents(id=id) diff --git a/SoftLayer/SSL.py b/SoftLayer/SSL.py index 077e2dd0f..33cc9f194 100644 --- a/SoftLayer/SSL.py +++ b/SoftLayer/SSL.py @@ -2,15 +2,23 @@ class SSLManager(object): + """ Manages SSL certificates. """ + def __init__(self, client): - """SSLManager + """ SSLManager initialization. + + :param SoftLayer.API.Client client: an API client instance - :param client: SoftLayer.API.Client """ self.client = client self.ssl = self.client['Security_Certificate'] def list_certs(self, method='all'): + """ List all certificates. + + :param method: # TODO: explain this param + + """ ssl = self.client['Account'] methods = { 'all': 'getSecurityCertificates', @@ -23,27 +31,35 @@ def list_certs(self, method='all'): return func(mask=mask) def add_certificate(self, certificate): - """SSLManager + """ Creates a new certificate. - :param client: SoftLayer.API.Client - """ + :param certificate: # TODO: is this a dict? + """ return self.ssl.createObject(certificate) - def remove_certificate(self, cert_id): - """SSLManager + def remove_certificate(self, id): + """ Removes a certificate. + + :param integer id: a certificate ID to remove - :param client: SoftLayer.API.Client """ - return self.ssl.deleteObject(id=cert_id) + return self.ssl.deleteObject(id=id) def edit_certificate(self, certificate): - """SSLManager + """ Updates a certificate with the included options. The provided dict + must include an 'id' key and value corresponding to the certificate ID + that should be updated. - :param client: SoftLayer.API.Client - """ + :param dict certificate: the certificate to update. + """ return self.ssl.editObject(certificate, id=certificate['id']) - def get_certificate(self, cert_id): - return self.ssl.getObject(id=cert_id) + def get_certificate(self, id): + """ Gets a certificate with the ID specified. + + :param integer id: the certificate ID to retrieve + + """ + return self.ssl.getObject(id=id) diff --git a/SoftLayer/__init__.py b/SoftLayer/__init__.py index 510341ce1..5fcc473a0 100644 --- a/SoftLayer/__init__.py +++ b/SoftLayer/__init__.py @@ -26,7 +26,7 @@ """ SoftLayer Python API Client ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -A library to contact SoftLayer's backend services through the XML-RPC interface +A library to use SoftLayer's API through the XML-RPC interface. See U{http://sldn.softlayer.com/article/Python} diff --git a/SoftLayer/exceptions.py b/SoftLayer/exceptions.py index cfee5726a..5b31835e9 100644 --- a/SoftLayer/exceptions.py +++ b/SoftLayer/exceptions.py @@ -5,10 +5,10 @@ class SoftLayerError(StandardError): class SoftLayerAPIError(SoftLayerError): - """ SoftLayerAPIError is the exception that is raised whenever an error is - returned from the API + """ SoftLayerAPIError is an exception raised whenever an error is returned + from the API. - Provides faultCode and faultString properties + Provides faultCode and faultString properties. """ def __init__(self, faultCode, faultString, *args): SoftLayerError.__init__(self, faultString, *args) diff --git a/SoftLayer/firewall.py b/SoftLayer/firewall.py index 9a376a432..5b6f41fb5 100644 --- a/SoftLayer/firewall.py +++ b/SoftLayer/firewall.py @@ -1,4 +1,3 @@ - __all__ = ['FirewallManager'] @@ -14,9 +13,10 @@ def has_firewall(vlan): class FirewallManager(object): def __init__(self, client): - """ Firewall manager + """ Manages firewalls. + + :param SoftLayer.API.Client client: the API client instance - :param client: SoftLayer.API.Client """ self.client = client diff --git a/SoftLayer/metadata.py b/SoftLayer/metadata.py index a6f600b4c..20d42f4e2 100644 --- a/SoftLayer/metadata.py +++ b/SoftLayer/metadata.py @@ -1,7 +1,7 @@ try: import simplejson as json except ImportError: # pragma: no cover - import json # NOQA + import json # NOQA import urllib2 from SoftLayer.consts import API_PRIVATE_ENDPOINT_REST, USER_AGENT @@ -11,7 +11,8 @@ class MetadataManager(object): - " MetadataManager " + """ Manages metadata. """ + attribs = { 'backend_mac': {'call': 'BackendMacAddresses'}, 'datacenter': {'call': 'Datacenter'}, @@ -55,13 +56,13 @@ def make_request(self, path): def get(self, name, param=None): if name not in self.attribs: - raise SoftLayerError('Metadata Attribute not known.') + raise SoftLayerError('Unknown metadata attribute.') call_details = self.attribs[name] if call_details.get('param_req'): if not param: raise SoftLayerError( - 'Parameter required to fetch this attribute') + 'Parameter required to get this attribute.') url = "%s/%s.json" % (self.attribs[name]['call'], param) else: url = "%s.json" % self.attribs[name]['call'] diff --git a/SoftLayer/transport/__init__.py b/SoftLayer/transport/__init__.py index 2ca05e0ad..4368b3855 100644 --- a/SoftLayer/transport/__init__.py +++ b/SoftLayer/transport/__init__.py @@ -1,4 +1,3 @@ - try: from SoftLayer.transport.requests_transport import make_api_call except ImportError: # pragma: no cover diff --git a/setup.py b/setup.py index 3e1ee0d9d..05c08fcb8 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ if sys.version_info <= (2, 6): requires.append('simplejson') -description = "A library to contact SoftLayer's backend services" +description = "A library to use SoftLayer's API" if os.path.exists('README.md'): f = open('README.md')