示例#1
0
 def _handle_first_request(self, parsed, primary_result_key,
                           starting_truncation):
     # If the payload is an array or string, we need to slice into it
     # and only return the truncated amount.
     starting_truncation = self._parse_starting_token()[1]
     all_data = primary_result_key.search(parsed)
     if isinstance(all_data, (list, six.string_types)):
         data = all_data[starting_truncation:]
     else:
         data = None
     set_value_from_jmespath(parsed, primary_result_key.expression, data)
     # We also need to truncate any secondary result keys
     # because they were not truncated in the previous last
     # response.
     for token in self.result_keys:
         if token == primary_result_key:
             continue
         sample = token.search(parsed)
         if isinstance(sample, list):
             empty_value = []
         elif isinstance(sample, six.string_types):
             empty_value = ''
         elif isinstance(sample, (int, float)):
             empty_value = 0
         else:
             empty_value = None
         set_value_from_jmespath(parsed, token.expression, empty_value)
     return starting_truncation
示例#2
0
 def _record_non_aggregate_key_values(self, response):
     non_aggregate_keys = {}
     for expression in self._non_aggregate_key_exprs:
         result = expression.search(response)
         set_value_from_jmespath(non_aggregate_keys, expression.expression,
                                 result)
     self._non_aggregate_part = non_aggregate_keys
示例#3
0
 def build_full_result(self):
     complete_result = {}
     for response in self:
         page = response
         # We want to try to catch operation object pagination
         # and format correctly for those. They come in the form
         # of a tuple of two elements: (http_response, parsed_responsed).
         # We want the parsed_response as that is what the page iterator
         # uses. We can remove it though once operation objects are removed.
         if isinstance(response, tuple) and len(response) == 2:
             page = response[1]
         # We're incrementally building the full response page
         # by page.  For each page in the response we need to
         # inject the necessary components from the page
         # into the complete_result.
         for result_expression in self.result_keys:
             # In order to incrementally update a result key
             # we need to search the existing value from complete_result,
             # then we need to search the _current_ page for the
             # current result key value.  Then we append the current
             # value onto the existing value, and re-set that value
             # as the new value.
             result_value = result_expression.search(page)
             if result_value is None:
                 continue
             existing_value = result_expression.search(complete_result)
             if existing_value is None:
                 # Set the initial result
                 set_value_from_jmespath(complete_result,
                                         result_expression.expression,
                                         result_value)
                 continue
             # Now both result_value and existing_value contain something
             if isinstance(result_value, list):
                 existing_value.extend(result_value)
             elif isinstance(result_value, (int, float, six.string_types)):
                 # Modify the existing result with the sum or concatenation
                 set_value_from_jmespath(complete_result,
                                         result_expression.expression,
                                         existing_value + result_value)
     merge_dicts(complete_result, self.non_aggregate_part)
     if self.resume_token is not None:
         complete_result['NextToken'] = self.resume_token
     return complete_result
示例#4
0
 def _truncate_response(self, parsed, primary_result_key, truncate_amount,
                        starting_truncation, next_token):
     original = primary_result_key.search(parsed)
     if original is None:
         original = []
     amount_to_keep = len(original) - truncate_amount
     truncated = original[:amount_to_keep]
     set_value_from_jmespath(parsed, primary_result_key.expression,
                             truncated)
     # The issue here is that even though we know how much we've truncated
     # we need to account for this globally including any starting
     # left truncation. For example:
     # Raw response: [0,1,2,3]
     # Starting index: 1
     # Max items: 1
     # Starting left truncation: [1, 2, 3]
     # End right truncation for max items: [1]
     # However, even though we only kept 1, this is post
     # left truncation so the next starting index should be 2, not 1
     # (left_truncation + amount_to_keep).
     next_token['boto_truncate_amount'] = \
         amount_to_keep + starting_truncation
     self.resume_token = next_token