コード例 #1
0
ファイル: SDKless.py プロジェクト: good-plus-geek/SDKless
	def go(self, endpoint_name, endpoint_vars = {}, local_vars = {}):
		if isinstance(local_vars, dict):
			self.local_vars = local_vars

		# must set endpoint name before checking for bypass_prerequisites
		self.config.custom_endpoint_name = endpoint_name
		self.config.set_actual_endpoint_name()
		self.config.apply_custom_endpoint_params()

		if not Utilities.dict_lookup(self.config.settings, 'endpoints', self.config.custom_endpoint_name, 'bypass_prerequisites'):
			self._process_prerequisites()

		# must set endpoint name after processing prerequisites to setup requested endpoint
		self.config.custom_endpoint_name = endpoint_name
		self.config.set_actual_endpoint_name()		
		self.config.apply_custom_endpoint_params()

		if self.config.actual_endpoint_name not in self.config.settings['endpoints']:
			raise Exception('specified endpoint does not exist in config: {}'.format(self.config['actual_endpoint_name']))

		if isinstance(endpoint_vars, dict):
			self.endpoint_vars = endpoint_vars
		else:
			self.endpoint_vars = {}

		array_set = endpoint_vars.get('array_set')

		if array_set:
			self.config.apply_endpoint_array_set_vars(array_set)

		self.config.apply_endpoint_vars(endpoint_vars)
		self.config.set_method()
		self._auth.setup_oauth_header(self.global_vars)

		self._time_limit = self.local_vars.get('time_limit') or self.config.get_custom_endpoint_setting('time_limit')
		output = self.request.get_response(self._time_limit)
		output_config = self.config.get_endpoint_setting('output')

		# filter output
		if output_config and 'filter' in output_config and Utilities.is_structure(output):
			unfiltered_output = list(output)
			output = []

			if not Utilities.is_structure(output_config['filter']):
				raise Exception('onfig endpoint output filter must be a structure')
				
			for filter in output_config['filter']:
				match_found = False

				if 'search_key' not in filter or 'search_value' not in filter:
					raise Exception('search_key and search_value are required for output filtering')
					
				for item in unfiltered_output:
					item_value = item.get(filter['search_key'])

					if item_value == None:
						continue

					if item_value == filter['search_value']:
						match_found = True

						if filter['return_key']:
							return item.get(filter['return_key'])

						output.append(item)

				if filter.get('return_type'):
					if filter['return_type'] == 'boolean':
						return match_found
					elif filter['return_type'] == '!boolean':
						return not match_found

		self.config.reset_to_unmerged()
		return output
コード例 #2
0
ファイル: Output.py プロジェクト: good-plus-geek/SDKless
	def populate(self, config, response, output):
		self._config = config
		response_count = 0
		output_config = config.get_endpoint_setting('output')
		paging = config.get_endpoint_setting('paging')
		ret = {}

		if output == None:
			output = []

		if not output_config:
			if paging:
				if isinstance(response, list):
					return len(response), output + response
				else:
					output.append(response)
					return 1, output
			else:
				return 1, response

		data = self._get_data(response)

		if not data:
			return 0, output

		output_format = Utilities.dict_lookup(output_config, 'data', 'format')

		if output_format == 'iterable': # like an array of contact records
			if not Utilities.is_structure(data):
				raise Exception('output config specifies structure data format but response is not a structure');

			# put in specified output format, if applicable
			if Utilities.dict_lookup(output_config, 'data', 'items', 'locations'):
				if isinstance(data, dict):
					for data_key, data_value in data.items():
						key_filter = Utilities.dict_lookup(output_config, 'data', 'key_filter')

						if key_filter:
							if (key_filter == 'numeric') and not isinstance(data_key, int):
								continue
						
						# if output_config.data.items is specified, we are expecting the data structure to contain child structures
						if not Utilities.is_structure(data_value):
							raise Exception('output config specifies data items but response children are not structures')

						output_item = self._get_item(data_value);
						output.append(output_item)
						response_count += 1
				elif isinstance(data, list):
					for data_value in data:
						# if output_config.data.items is specified, we are expecting the data structure to contain child structures
						if not Utilities.is_structure(data_value):
							raise Exception('output config specifies data items but response children are not structures')

						output_item = self._get_item(data_value);
						output.append(output_item)
						response_count += 1
			else:
				output = output + data
				response_count = len(data)
		else: # non-iterable (like scalar value or single contact record)
			if isinstance(data, dict) and Utilities.dict_lookup(output_config, 'data', 'items', 'locations'):
				return_output = self._get_item(data)
			else:
				return_output = data # leave data as is

			if paging:
				output.append(return_output)
			else:
				output = return_output

			response_count = 1

		return response_count, output