From bf3327756d2e5e245fbdecd8ae21fe88b26519b4 Mon Sep 17 00:00:00 2001 From: Kip Lehman Date: Mon, 20 Mar 2017 16:53:04 -0600 Subject: [PATCH 1/3] fixed indentation error in README.rst --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 0a420ce..dcc8ef9 100644 --- a/README.rst +++ b/README.rst @@ -339,8 +339,8 @@ Support The use of this package is on an *as-is* basis and there is no official support offered by CA Technologies. The author of this module periodically checks the GitHub repository issues for this package in the - interests of providing defect fixes and small feature enhancements as time permits, but is not obligated to - respond or take action. +interests of providing defect fixes and small feature enhancements as time permits, but is not obligated to +respond or take action. Posts to Stack Overflow (http://stackoverflow.com/questions/ask?tags=rally) are another avenue to engage others who have some exposure to ``pyral`` and might be able to offer useful information. From 9c40e67f2108e27ccf20bef6c711afe514d35d4b Mon Sep 17 00:00:00 2001 From: Kip Lehman Date: Fri, 31 Mar 2017 11:19:29 -0600 Subject: [PATCH 2/3] multithreading support, new default pagesize of 500, fixed getAllUsers --- MANIFEST | 1 + README.rst | 13 +++- README.short | 2 +- build_dist.py | 4 +- doc/source/conf.py | 4 +- doc/source/interface.rst | 10 ++- pyral/__init__.py | 2 +- pyral/config.py | 4 +- pyral/context.py | 8 ++- pyral/entity.py | 2 +- pyral/hydrate.py | 2 +- pyral/query_builder.py | 2 +- pyral/rallyresp.py | 128 +++++++++++++++++++++++++++++++++------ pyral/restapi.py | 45 ++++++++------ pyral/search_utils.py | 2 +- setup.py | 2 +- test/test_big_query.py | 69 +++++++++++++++++++++ upver.py | 1 + 18 files changed, 242 insertions(+), 59 deletions(-) create mode 100644 test/test_big_query.py diff --git a/MANIFEST b/MANIFEST index c149be8..2c225ef 100644 --- a/MANIFEST +++ b/MANIFEST @@ -7,6 +7,7 @@ rallyfire.py pyral/__init__.py pyral/config.py pyral/context.py +pyral/cargotruck.py pyral/entity.py pyral/hydrate.py pyral/rallyresp.py diff --git a/README.rst b/README.rst index dcc8ef9..a688980 100644 --- a/README.rst +++ b/README.rst @@ -39,7 +39,7 @@ Obtain the requests_ package and install it according to that package's directio As of requests-2.0.0, there is support for HTTPS over HTTP proxy via the CONNECT request. Use of requests-2.x or better is recommended for use with pyral. The requests_ package can be found via the Python Package Index site (http://pypi/python.org/index). -The most recent release of pyral (1.2.4) has been tested using requests 2.8.1. +The most recent release of pyral (1.3.0) has been tested using requests 2.8.1. Obtain and install the six_ module (available from PyPI at https://pypi.python.org/pypi/six) @@ -67,7 +67,7 @@ relevant packages. >> import requests >> import pyral >> pyral.__version__ - (1, 2, 4) + (1, 3, 0) @@ -265,7 +265,7 @@ Prerequisites * Python 3.5 (this package not tested with earlier versions of Python 3.x) OR * Python 2.6 or 2.7 (2.7 is preferred) * The requests_ package, 2.0.0 or better (2.0.0 finally includes support for https proxy), - requests 2.8.1 is recommended. + requests 2.12.5 is recommended. * The six_ package. .. _requests: http://github.com/kennethreitz/requests @@ -273,6 +273,13 @@ Prerequisites Versions -------- + **1.3.0** + Introduced automatic multi-threading for Rally.get operation to speed up retrieval of large + result sets. Implemented step two of the Pinger deprecation plan, ping=False is the new default. + Increased default page size to 500. Maximum useful page size limit is 2000 but 1000 seems + to be the sweet spot for multithreading requests. + Fixed Rally.getAllUsers so that non subscription admin accounts can see the user list. + Updated recommendation for version of requests package. **1.2.4** Fixed handling of projectScopeUp and projectScopeDown keyword arguments for get operation. diff --git a/README.short b/README.short index ac00be9..838e9c5 100644 --- a/README.short +++ b/README.short @@ -20,7 +20,7 @@ Requirements The pyral package requires the use of Kenneth Reitz's requests package using version 2.8.0 or better. As of requests version 2.0.0, there is support for HTTPS over HTTP proxy via the CONNECT request. The requests package can be found via the Python Package Index site (http://pypi/python.org/index). -The most recent release of pyral (1.2.4) has been tested with requests 2.8.1. +The most recent release of pyral (1.3.0) has been tested with requests 2.12.5. The six module is also required. diff --git a/build_dist.py b/build_dist.py index 1c40afd..5b65b03 100644 --- a/build_dist.py +++ b/build_dist.py @@ -13,7 +13,7 @@ import re PACKAGE_NAME = "pyral" -VERSION = "1.2.4" +VERSION = "1.3.0" AUX_FILES = ['MANIFEST.in', 'PKG-INFO', @@ -104,7 +104,7 @@ def main(args): # got to use Python 2.7 to be able to run python setup.py bdist_wheel os.system('/usr/local/bin/python setup.py bdist_wheel') - wheel_file = "pyral-%s-py2.py3-none-any.whl" % VERSION + wheel_file = "%s-%s-py2.py3-none-any.whl" % (PACKAGE_NAME, VERSION) # the wheel_file gets written into the dist subdir by default, no need for a copy... store_packages('dist', [tarball]) diff --git a/doc/source/conf.py b/doc/source/conf.py index 7af85cf..95c9f05 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -48,9 +48,9 @@ # built documents. # # The short X.Y version. -version = '1.2.4' +version = '1.3.0' # The full version, including alpha/beta/rc tags. -release = '1.2.4' +release = '1.3.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/source/interface.rst b/doc/source/interface.rst index b5e3c34..5b9c6b0 100644 --- a/doc/source/interface.rst +++ b/doc/source/interface.rst @@ -131,7 +131,7 @@ Example use:: print " ".join(['|%|' % opt for opt in [server, user, password, apikey, workspace, project]] - % python basic.py --config=current --rallyProject="Livestock Mgmt" --ping=no + % python basic.py --config=current --rallyProject="Livestock Mgmt" --ping=yes |rally1.rallydev.com| |wiley@acme.com| |*****| |*****| |General Products Umbrella| |Livestock Mgmt| @@ -289,16 +289,14 @@ To instantiate a Rally object, you'll need to provide these arguments: and the default project for the user is not in the workspace specified. Under those conditions, the project is changed to the first project (alphabetic ordering) in the list of projects for the specified workspace. - * server_ping (True or False, default in v1.2.0 is True) + * server_ping (True or False, default in v1.3.0 is False) Specifies whether a ping attempt will be made to confirm network connectivity to the Rally server prior to making a Rally WSAPI REST request. Organizations may have disabled the ability to make ICMP requests so the ping attempt may fail even though there is network connectivity to the Rally server. For this reason, the use of the ping=True option is discouraged going forward. - The next minor point release of pyral (v1.3.0) will have the default value - for this option inverted to be False. The the ping operation itself will be dropped in the next major release (2.0.0). - * isolated_workspace (True or False, default in v1.2.0 is False) + * isolated_workspace (True or False, default in v1.2.0 + is False) Specifies that the Rally instance will only be used for interacting with a single workspace (either the user's default workspace or the named workspace). Using isolated_workspace=True provides performance benefits for a subscription @@ -330,7 +328,7 @@ To instantiate a Rally object, you'll need to provide these arguments: You only have to use this syntax to specify a particular Project if you have multiple instances of that Project that have the same name. There is no provision for supporting the scenario where a Project of the same name exists in the same structural location. -.. py:class:: Rally (server, user=None, password=None, apikey=None, workspace=None, project=None, warn=True, server_ping=True) +.. py:class:: Rally (server, user=None, password=None, apikey=None, workspace=None, project=None, warn=True, server_ping=False) Examples:: diff --git a/pyral/__init__.py b/pyral/__init__.py index a81a8e6..2241365 100644 --- a/pyral/__init__.py +++ b/pyral/__init__.py @@ -1,4 +1,4 @@ -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) from .config import rallySettings, rallyWorkset from .restapi import Rally, RallyRESTAPIError, RallyUrlBuilder from .rallyresp import RallyRESTResponse diff --git a/pyral/config.py b/pyral/config.py index 4cc5b09..ba9eaf3 100644 --- a/pyral/config.py +++ b/pyral/config.py @@ -6,7 +6,7 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import datetime import os @@ -27,7 +27,7 @@ PASSWORD = "G3ronim0!" START_INDEX = 1 -MAX_PAGESIZE = 200 +MAX_PAGESIZE = 500 MAX_ITEMS = 1000000 # a million seems an eminently reasonable limit ... RALLY_REST_HEADERS = \ diff --git a/pyral/context.py b/pyral/context.py index af6f2ac..e1f9025 100644 --- a/pyral/context.py +++ b/pyral/context.py @@ -8,7 +8,7 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import sys, os import platform @@ -26,7 +26,7 @@ ################################################################################################### -__all__ = ["RallyContext", "RallyContextHelper"] +__all__ = ["RallyContext", "RallyContextHelper", "AgileCentralContext", "AgileCentralContextHelper"] ################################################################################################### @@ -87,6 +87,8 @@ def identity(self): def __repr__(self): return self.identity() + +AgileCentralContext = RallyContext ################################################################################################## @@ -911,6 +913,8 @@ def __repr__(self): representation = "\n".join(items) return representation +AgileCentralContextHelper = RallyContextHelper + ################################################################################################## class Pinger(object): diff --git a/pyral/entity.py b/pyral/entity.py index 14a2d22..a43d550 100644 --- a/pyral/entity.py +++ b/pyral/entity.py @@ -8,7 +8,7 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import sys import re diff --git a/pyral/hydrate.py b/pyral/hydrate.py index 56e438b..4c8cb74 100644 --- a/pyral/hydrate.py +++ b/pyral/hydrate.py @@ -9,7 +9,7 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import sys import imp diff --git a/pyral/query_builder.py b/pyral/query_builder.py index 8d78fb8..ec03073 100644 --- a/pyral/query_builder.py +++ b/pyral/query_builder.py @@ -6,7 +6,7 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import re import types diff --git a/pyral/rallyresp.py b/pyral/rallyresp.py index cdf14b5..b0db402 100644 --- a/pyral/rallyresp.py +++ b/pyral/rallyresp.py @@ -1,4 +1,3 @@ - ################################################################################################### # # pyral.response - defines a class to hold the response info from a Rally REST operation @@ -10,14 +9,17 @@ # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import sys import re import json +import copy +import time from pprint import pprint -from .hydrate import EntityHydrator +from .hydrate import EntityHydrator +from .cargotruck import CargoTruck __all__ = ['RallyRESTResponse', 'ErrorResponse', 'RallyResponseError'] @@ -59,7 +61,7 @@ class RallyRESTResponse(object): returned by the request (for GET). """ - def __init__(self, session, context, request, response, hydration, limit, debug=False): + def __init__(self, session, context, request, response, hydration, limit, **kwargs): """ A wrapper for the response received back from the REST API. The response has status_code, headers and content attributes which will be preserved. @@ -70,7 +72,8 @@ def __init__(self, session, context, request, response, hydration, limit, debug= self.session = session self.context = context self.resource = request - self.debug = debug + self.threads = kwargs['threads'] if 'threads' in kwargs else 0 + self.debug = kwargs['debug'] if 'debug' in kwargs else False self.data = None request_path_elements = request.split('?')[0].split('/') ## @@ -167,18 +170,44 @@ def __init__(self, session, context, request, response, hydration, limit, debug= self.startIndex = int(qr['StartIndex']) if 'StartIndex' in qr else 0 self.pageSize = int(qr['PageSize']) if 'PageSize' in qr else 0 self.resultCount = int(qr['TotalResultCount']) if 'TotalResultCount' in qr else 0 - self._limit = limit if limit > 0 else self.resultCount + self._limit = self.resultCount + if limit: + self._limit = min(limit, self.resultCount) self._page = [] + if self.request_type in ['Query', 'ImpliedQuery']: + self.first_page = True + if self.threads <= 0: # 0 designates auto-threading, the 2 will be auto-adjusted later + self.threads = 2 + self.max_threads = self.threads if self.threads <= 8 else 4 # readjust to sane if too big if 'Results' in qr: self._page = qr['Results'] else: if 'QueryResult' in qr and 'Results' in qr['QueryResult']: self._page = qr['QueryResult']['Results'] + + # if there is anything in self._page (which would be if the request is some kind of a query) + # AND the pageSize is less than the resultCount + # we look to see if upping the max_threads would be useful, and if so what is the "right" max_threads value + # we up max_threads to 2 if resultCount > 4*pagesize + # we up max_threads to 4 if resultCount > 10*pagesize + # we up max_threads to 8 if resultCount > 20*pagesize + if self.threads > 1: # readjust to accommodate the resultCount + self.max_threads = 1 + reference_population = min(self._limit, self.resultCount) + if self._page and self.resultCount > 1000 and self.pageSize < reference_population: + pop_thread_limit = [( 1*self.pageSize, 1) + ( 4*self.pageSize, 2), + ( 10*self.pageSize, 4), + ( 20*self.pageSize, 8), + ( 40*self.pageSize, 10), + ] + for page_size_multiple, num_threads in pop_thread_limit: + if reference_population > page_size_multiple: + self.max_threads = num_threads ## ## print("initial page has %d items" % len(self._page)) ## - if qr.get('Object', None): self._page = qr['Object']['_ref'] ## @@ -201,11 +230,12 @@ def __init__(self, session, context, request, response, hydration, limit, debug= # transform the status code to an error code indicating an Unprocessable Entity if not already an error code self.status_code = 422 if self.status_code == 200 else self.status_code ## -## print("RallyRESTResponse, self.target: |%s|" % self.target) -## print("RallyRESTResponse._page: %s" % self._page) -## print("RallyRESTResponse, self.resultCount: |%s|" % self.resultCount) +## print("RallyRESTResponse, self.target : |%s|" % self.target) ## print("RallyRESTResponse, self.startIndex : |%s|" % self.startIndex) +## print("RallyRESTResponse, self.resultCount: |%s|" % self.resultCount) ## print("RallyRESTResponse, self._servable : |%s|" % self._servable) +## print("RallyRESTResponse._page: has %d items" % len(self._page)) +## #print("RallyRESTResponse._page: %s" % self._page) ## print("") ## @@ -275,7 +305,12 @@ def __next__(self): ## ## print("RallyRESTResponse.next, _stdFormat detected") ## - if self._curIndex == self.pageSize: + if self._curIndex+1 < len(self._page): # possible when multi-threads return multiple pages + pass + elif self.max_threads > 1 and self._curIndex == len(self._page): # exhausted current "chapter" ? + self._page[:] = self.__retrieveNextPage() + self._curIndex = 0 + elif self._curIndex == self.pageSize: # in single threaded mode, the page is exhausted self._page[:] = self.__retrieveNextPage() self._curIndex = 0 if not self._page: @@ -335,7 +370,7 @@ def __next__(self): ## return entityInstance - def showNextItem(item): + def showNextItem(self, item): print(" next item served is a %s" % self._item_type) print("RallyRESTResponse.next, item before call to to hydrator.hydrateInstance") all_item_keys = sorted(item.keys()) @@ -365,8 +400,14 @@ def showNextItem(item): def __retrieveNextPage(self): """ - Issue another session GET request after changing the start index to get the next page. + If multi-threading is to be used (self.max_threads > 1) then + call the method to retrieve multiple pages, otherwise + just call the self.session.get method for the next page (after adjusting the self.startIndex) """ + if self.max_threads > 1: + chapter = self.__retrievePages() + return chapter + self.startIndex += self.pageSize nextPageUrl = re.sub('&start=\d+', '&start=%s' % self.startIndex, self.resource) if not nextPageUrl.startswith('http'): @@ -388,6 +429,59 @@ def __retrieveNextPage(self): content = response.json() return content['QueryResult']['Results'] + def __retrievePages(self): + """ + Use self._served, self._servable, self.resource, self.max_threads, self.pageSize + and self.startIndex to come up with suitable thread count to grab the + next group of pages from AgileCentral. + There will be a thread per page still to be retrieved (including the ending partial page) + up to self.max_threads. + For the number of threads that will actually be used, populate a page_urls list + with the url that thread will use to obtain a page worth of data (adjusts the + start= in the url). + Once the page_urls list is constructed, delegate off to a an instance of a class + that will run the threads that obtain the raw response for the pages and put the + results into a list corresponding to the pages in ascending order. + """ + items_remaining = self._servable - self._served + num_threads = self.max_threads + max_chunksize = self.pageSize * num_threads + if items_remaining - max_chunksize < 0: + full, leftovers = divmod(items_remaining, self.pageSize) + num_threads = full + (1 if leftovers else 0) + stixes = [i+1 for i in range(num_threads)] + page_urls = [re.sub('&start=\d+', '&start=%s' % (self.startIndex + (i * self.pageSize)), self.resource) + for i in stixes] + + success = False + exc = None + delays = [0, 2, 5] + for delay in delays: + time.sleep(delay) + cgt = CargoTruck(page_urls, num_threads) + try: + cgt.load(self.session, 'get', 15) + payload = cgt.dump() + success = True + break + except: + exc_name, exc_desc = sys.exc_info()[:2] + anomaly = "RallyResponse.next.__retrieveNextPage.__retrievePages caught exception " +\ + "in threaded request/response activity: %s, %s" % (exc_name, exc_desc) + pg1, pg2 = (self.startIndex + self.pageSize), (self.startIndex + (self.pageSize*num_threads)) + notice = "Retrying the page_urls for the page group startIndexes: %d -> %d" % (pg1, pg2) + print(notice) + + if not success: + raise RallyResponseError("Unable to retrieve %d chunks of data" % num_threads) + + chapter = [] + for chunk in payload: + chapter.extend(chunk.json()['QueryResult']['Results']) + + self.startIndex += len(chapter) + return chapter + def __repr__(self): if self.status_code == 200 and self._page: @@ -396,11 +490,9 @@ def __repr__(self): return "%s result set, totalResultSetSize: %d, startIndex: %s pageSize: %s current Index: %s" % \ (entity_type, self.resultCount, self.startIndex, self.pageSize, self._curIndex) except: - return "%s\nErrors: %s\nWarnings: %s\nData: %s\n" % (self.status_code, - self.errors, - self.warnings, - self._page) - else: + info = (self.status_code, self.errors, self.warnings, self._page) + return "%s\nErrors: %s\nWarnings: %s\nData: %s\n" % info + else: if self.errors: blurb = self.errors[0] elif self.warnings: diff --git a/pyral/restapi.py b/pyral/restapi.py index 2c74f80..4fdd05d 100644 --- a/pyral/restapi.py +++ b/pyral/restapi.py @@ -3,25 +3,26 @@ ################################################################################################### # # pyral.restapi - Python Rally REST API module -# round 14 support for multi-element-path Project names, couple of minor defect fixes +# round 15 support for multi-threading for large query result sets +# and non sub admins can get all user info # notable dependencies: -# requests v2.8.1 or better +# requests v2.12.5 or better # ################################################################################################### -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) import sys, os import re -import types -import time import six -from six.moves.urllib.parse import quote, unquote import json import string import base64 from operator import itemgetter -from pprint import pprint + +#from six.moves.urllib.parse import quote, unquote +quote = six.moves.urllib.parse.quote +unquote = six.moves.urllib.parse.unquote import requests @@ -193,12 +194,12 @@ def __init__(self, server=SERVER, user=None, password=None, apikey=None, self._logDest = None self._logAttrGet = False self._warn = warn - self._server_ping = True # this is the default for 1.2.0 + self._server_ping = False # this is the default for 1.3.0 if 'RALLY_PING' in os.environ: - if os.environ['RALLY_PING'].lower() in ['f', 'false', 'n', 'no', '0']: - self._server_ping = False - if server_ping == False: - self._server_ping = False + if os.environ['RALLY_PING'].lower() in ['t', 'true', 'y', 'yes', '1']: + self._server_ping = True + if server_ping == True: + self._server_ping = True self.isolated_workspace = isolated_workspace config = {} if kwargs and 'debug' in kwargs and kwargs.get('debug', False): @@ -614,8 +615,9 @@ def getAllUsers(self, workspace=None): # and other UserProfile attributes ] - users_resource = 'users?fetch=%s&query=&pagesize=%s&start=1&workspace=%s' % \ - (",".join(user_attrs), MAX_PAGESIZE, workspace_ref) + user_inclusion = "((Disabled = true) OR (Disabled = false))" + users_resource = 'users?fetch=%s&query=%s&pagesize=%s&start=1&workspace=%s' % \ + (",".join(user_attrs), user_inclusion, MAX_PAGESIZE, workspace_ref) full_resource_url = '%s/%s' % (self.service_url, users_resource) response = self.session.get(full_resource_url, timeout=SERVICE_REQUEST_TIMEOUT) if response.status_code != HTTP_REQUEST_SUCCESS_CODE: @@ -858,7 +860,7 @@ def _buildRequest(self, entity, fetch, query, order, kwargs): return context, resource, full_resource_url, limit - def _getRequestResponse(self, context, request_url, limit): + def _getRequestResponse(self, context, request_url, limit, **kwargs): response = None # in case an exception gets raised in the session.get call ... try: # a response has status_code, content and data attributes @@ -901,7 +903,8 @@ def _getRequestResponse(self, context, request_url, limit): response = RallyRESTResponse(self.session, context, request_url, errorResponse, self.hydration, 0) return response - response = RallyRESTResponse(self.session, context, request_url, response, self.hydration, limit) + response = RallyRESTResponse(self.session, context, request_url, response, + self.hydration, limit, **kwargs) if self._log: if response.status_code == HTTP_REQUEST_SUCCESS_CODE: @@ -955,7 +958,13 @@ def get(self, entity, fetch=False, query=None, order=None, **kwargs): self._logDest.write('%s GET %s\n' % (timestamp(), unquote(resource))) self._logDest.flush() - response = self._getRequestResponse(context, full_resource_url, limit) + threads = 0 + if 'threads' in kwargs: + if kwargs['threads'] in [1,2,3,4,5,6,7,8]: + threads = kwargs['threads'] + else: + threads = 2 + response = self._getRequestResponse(context, full_resource_url, limit, threads=threads) if kwargs and 'instance' in kwargs and kwargs['instance'] == True and response.resultCount == 1: return response.next() @@ -1867,4 +1876,6 @@ def _ensureRankItemSanity(self, target_artifact, reference_artifact=None): return target_artifact.__class__.__name__.lower() +AgileCentral = Rally + #################################################################################################### diff --git a/pyral/search_utils.py b/pyral/search_utils.py index 07e6634..fcae02f 100644 --- a/pyral/search_utils.py +++ b/pyral/search_utils.py @@ -1,4 +1,4 @@ -__version__ = (1, 2, 4) +__version__ = (1, 3, 0) from operator import attrgetter diff --git a/setup.py b/setup.py index 9bdbfcd..0d801a5 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ from setuptools import setup PACKAGE = 'pyral' -VERSION = '1.2.4' +VERSION = '1.3.0' OFFICIAL_NAME = 'Python toolkit for Rally REST API' PKG_URL_NAME = 'python-toolkit-rally-rest-api' AUTHOR = 'Kip Lehman (Rally Software Development)' diff --git a/test/test_big_query.py b/test/test_big_query.py new file mode 100644 index 0000000..fa6569b --- /dev/null +++ b/test/test_big_query.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import sys, os +import types +import urllib +import py + +try: + from urllib import unquote +except: + from urllib.parse import unquote + +from pyral import Rally +from pyral.cargotruck import CargoTruck +import pyral + +################################################################################################## + +from rally_targets import AGICEN, AGICEN_USER, AGICEN_PSWD +#from rally_targets import DEFAULT_WORKSPACE, DEFAULT_PROJECT, NON_DEFAULT_PROJECT +#from rally_targets import ORG_LEVEL_PROJECT +ORG_LEVEL_PROJECT = 'AC Engineering' + +################################################################################################## + +def test_multiple_page_response_query(): + """ + Using a known valid Rally server and known valid access credentials, + issue a simple query (no qualifying criteria) against a Rally entity + (Story) known to have more than 5 items. Set the pagesize to 5 to + force pyral to retrieve multiple pages to satisfy the query. + """ + APIKEY = '_x6CZhqQgiist6kTtwthsAAKHtjWE7ivqimQdpP3T4' + WORKSPACE = 'Rally' + PROJECT = 'AC Engineering' + rally = Rally(server=AGICEN, apikey=APIKEY, workspace=WORKSPACE, project=PROJECT) + """ + response = rally.get('Story', fetch='ObjectID,FormattedID,Name', pagesize=100, limit=1500, projectScopeDown=True) + count = 0 + for ix, story in enumerate(response): + count += 1 + + assert response.resultCount > 1000 + assert count <= response.resultCount + assert count == 1500 + + response = rally.get('Story', fetch='ObjectID,FormattedID,Name', pagesize=200, limit=11500, start=500, projectScopeDown=True) + stories = [story for story in response] + + assert response.resultCount > 11000 + assert len(stories) <= response.resultCount + assert len(stories) == 11500 + assert response.startIndex == 11900 + """ + + response = rally.get('Story', fetch='ObjectID,FormattedID,Name', pagesize=1000, projectScopeDown=True) + count = 0 + for istory in response: + count += 1 + + assert response.resultCount > 15000 + assert count == response.resultCount + + +def test_cargo_truck_init(): + cgo = CargoTruck(['a', 'b'], 2) + assert len(cgo.orders) == 2 + assert cgo.orders[0] == 'a' + assert cgo.num_loaders == 2 diff --git a/upver.py b/upver.py index de45eaa..89498eb 100644 --- a/upver.py +++ b/upver.py @@ -53,6 +53,7 @@ ('pyral/__init__.py' , r'^__version__ = \((\d, \d+, \d+)\)'), ('pyral/config.py' , r'^__version__ = \((\d, \d+, \d+)\)'), ('pyral/context.py' , r'^__version__ = \((\d, \d+, \d+)\)'), + ('pyral/cargotruck.py' , r'^__version__ = \((\d, \d+, \d+)\)'), ('pyral/entity.py' , r'^__version__ = \((\d, \d+, \d+)\)'), ('pyral/hydrate.py' , r'^__version__ = \((\d, \d+, \d+)\)'), ('pyral/query_builder.py' , r'^__version__ = \((\d, \d+, \d+)\)'), From d3c526d37a722f3e7357f7a89cf6f1287a5cf931 Mon Sep 17 00:00:00 2001 From: Kip Lehman Date: Sun, 2 Apr 2017 14:19:43 -0600 Subject: [PATCH 3/3] added multithreading support for large query result sets, server ping defaulted to False, default pagesize now 500, fixed getAllUsers for non subscription admins --- PKG-INFO | 6 +- README.rst | 6 +- build_dist.py | 7 +- doc/build/doctrees/environment.pickle | Bin 12499 -> 12424 bytes doc/build/doctrees/index.doctree | Bin 5721 -> 5787 bytes doc/build/doctrees/interface.doctree | Bin 171239 -> 170524 bytes doc/build/doctrees/overview.doctree | Bin 28958 -> 28934 bytes doc/build/html/.buildinfo | 2 +- doc/build/html/_sources/interface.txt | 10 ++- doc/build/html/genindex.html | 8 +-- doc/build/html/index.html | 8 +-- doc/build/html/interface.html | 18 +++-- doc/build/html/objects.inv | Bin 530 -> 530 bytes doc/build/html/overview.html | 8 +-- doc/build/html/search.html | 8 +-- doc/build/html/searchindex.js | 2 +- pyral/cargotruck.py | 97 ++++++++++++++++++++++++++ pyral/rallyresp.py | 2 +- pyral/restapi.py | 5 +- test/test_big_query.py | 5 +- test/test_conn.py | 63 ++++++++++------- test/test_query.py | 4 +- 22 files changed, 180 insertions(+), 79 deletions(-) mode change 100644 => 100755 build_dist.py create mode 100644 pyral/cargotruck.py diff --git a/PKG-INFO b/PKG-INFO index 2b71a0e..ece0968 100644 --- a/PKG-INFO +++ b/PKG-INFO @@ -1,11 +1,11 @@ Metadata-Version: 1.1 Name: pyral -Version: 1.2.4 +Version: 1.3.0 Summary: Python toolkit for Rally REST API Home-page: https://github.com/RallyTools/RallyRestToolkitForPython Author: Kip Lehman (Rally Software Development) License: BSD -Download-URL: https://github.com/RallyTools/RallyRestToolkitForPython/raw/master/dists/pyral-1.2.4.zip +Download-URL: https://github.com/RallyTools/RallyRestToolkitForPython/raw/master/dists/pyral-1.3.0.zip Description: This is the README file for pyral, a package implementing a Pythonic interface to the Agile Central (formerly Rally) REST API @@ -28,7 +28,7 @@ Description: This is the README file for pyral, a package implementing a The pyral package requires the use of Kenneth Reitz's requests package using version 2.8.0 or better. As of requests version 2.0.0, there is support for HTTPS over HTTP proxy via the CONNECT request. The requests package can be found via the Python Package Index site (http://pypi/python.org/index). - The most recent release of pyral (1.2.4) has been tested with requests 2.8.1. + The most recent release of pyral (1.3.0) has been tested with requests 2.12.5. The six module is also required. diff --git a/README.rst b/README.rst index a688980..d5398b2 100644 --- a/README.rst +++ b/README.rst @@ -39,7 +39,7 @@ Obtain the requests_ package and install it according to that package's directio As of requests-2.0.0, there is support for HTTPS over HTTP proxy via the CONNECT request. Use of requests-2.x or better is recommended for use with pyral. The requests_ package can be found via the Python Package Index site (http://pypi/python.org/index). -The most recent release of pyral (1.3.0) has been tested using requests 2.8.1. +The most recent release of pyral (1.3.0) has been tested using requests 2.12.5. Obtain and install the six_ module (available from PyPI at https://pypi.python.org/pypi/six) @@ -262,8 +262,8 @@ The item names in config files **are** case sensitive. Prerequisites ------------- - * Python 3.5 (this package not tested with earlier versions of Python 3.x) OR - * Python 2.6 or 2.7 (2.7 is preferred) + * Python 3.5 or 3.6 (this package not tested with earlier versions of Python 3.x) OR + * Python 2.6 or 2.7 (of these two, 2.7 is preferred) * The requests_ package, 2.0.0 or better (2.0.0 finally includes support for https proxy), requests 2.12.5 is recommended. * The six_ package. diff --git a/build_dist.py b/build_dist.py old mode 100644 new mode 100755 index 5b65b03..8d93f75 --- a/build_dist.py +++ b/build_dist.py @@ -70,12 +70,13 @@ 'test/test_convenience.py', 'test/test_inflation.py', 'test/test_field_access.py', - 'test/test_query.py', - 'test/test_search.py', + 'test/test_workspaces.py' 'test/test_wksprj_setting.py', + 'test/test_query.py', + 'test/test_big_query.py', 'test/test_attachments.py', - 'test/test_workspaces.py' 'test/test_ranking.py' + 'test/test_search.py', ] ################################################################################ diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle index f898838abbd602f620f7f24f371f744cc6a64ccb..c53e6a9a925d44c8d42080248671e963423a1c7a 100644 GIT binary patch literal 12424 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

LOzSN72CY9n2t81 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 O$=L3uvYo3_J^uzdfSqyx literal 171239 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 literal 28958 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 z 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 diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo index 72e9b36..855d958 100644 --- a/doc/build/html/.buildinfo +++ b/doc/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 04e7a56dd13ad451ac5cbc4d00acee14 +config: b07c03f625d2f2c1cd442854955e285b tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_sources/interface.txt b/doc/build/html/_sources/interface.txt index b5e3c34..5b9c6b0 100644 --- a/doc/build/html/_sources/interface.txt +++ b/doc/build/html/_sources/interface.txt @@ -131,7 +131,7 @@ Example use:: print " ".join(['|%|' % opt for opt in [server, user, password, apikey, workspace, project]] - % python basic.py --config=current --rallyProject="Livestock Mgmt" --ping=no + % python basic.py --config=current --rallyProject="Livestock Mgmt" --ping=yes |rally1.rallydev.com| |wiley@acme.com| |*****| |*****| |General Products Umbrella| |Livestock Mgmt| @@ -289,16 +289,14 @@ To instantiate a Rally object, you'll need to provide these arguments: and the default project for the user is not in the workspace specified. Under those conditions, the project is changed to the first project (alphabetic ordering) in the list of projects for the specified workspace. - * server_ping (True or False, default in v1.2.0 is True) + * server_ping (True or False, default in v1.3.0 is False) Specifies whether a ping attempt will be made to confirm network connectivity to the Rally server prior to making a Rally WSAPI REST request. Organizations may have disabled the ability to make ICMP requests so the ping attempt may fail even though there is network connectivity to the Rally server. For this reason, the use of the ping=True option is discouraged going forward. - The next minor point release of pyral (v1.3.0) will have the default value - for this option inverted to be False. The the ping operation itself will be dropped in the next major release (2.0.0). - * isolated_workspace (True or False, default in v1.2.0 is False) + * isolated_workspace (True or False, default in v1.2.0 + is False) Specifies that the Rally instance will only be used for interacting with a single workspace (either the user's default workspace or the named workspace). Using isolated_workspace=True provides performance benefits for a subscription @@ -330,7 +328,7 @@ To instantiate a Rally object, you'll need to provide these arguments: You only have to use this syntax to specify a particular Project if you have multiple instances of that Project that have the same name. There is no provision for supporting the scenario where a Project of the same name exists in the same structural location. -.. py:class:: Rally (server, user=None, password=None, apikey=None, workspace=None, project=None, warn=True, server_ping=True) +.. py:class:: Rally (server, user=None, password=None, apikey=None, workspace=None, project=None, warn=True, server_ping=False) Examples:: diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html index d96e91a..5ff5a9c 100644 --- a/doc/build/html/genindex.html +++ b/doc/build/html/genindex.html @@ -9,7 +9,7 @@ - Index — pyral 1.2.4 documentation + Index — pyral 1.3.0 documentation @@ -34,7 +34,7 @@ - + @@ -63,7 +63,7 @@

- 1.2.4 + 1.3.0
@@ -437,7 +437,7 @@

U

@@ -62,7 +62,7 @@
- 1.2.4 + 1.3.0
@@ -188,7 +188,7 @@