feat: add docstrings
diff --git a/erpnext/shopping_cart/product_query.py b/erpnext/shopping_cart/product_query.py
index 0f3eabb..0cd8088 100644
--- a/erpnext/shopping_cart/product_query.py
+++ b/erpnext/shopping_cart/product_query.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors
 # License: GNU General Public License v3. See license.txt
 
 from __future__ import unicode_literals
@@ -10,13 +10,17 @@
 	Attributes:
 	    cart_settings (Document): Settings for Cart
 	    fields (list): Fields to fetch in query
-	    filters (list)
-	    or_filters (list)
+	    filters (TYPE): Description
+	    or_filters (list): Description
 	    page_length (Int): Length of page for the query
 	    settings (Document): Products Settings DocType
+	    filters (list)
+	    or_filters (list)
 	"""
 
 	def __init__(self):
+		"""Summary
+		"""
 		self.settings = frappe.get_doc("Products Settings")
 		self.cart_settings = frappe.get_doc("Shopping Cart Settings")
 		self.page_length = self.settings.products_per_page or 20
@@ -25,6 +29,17 @@
 		self.or_filters = []
 
 	def query(self, attributes=None, fields=None, search_term=None, start=0):
+		"""Summary
+		
+		Args:
+		    attributes (dict, optional): Item Attribute filters
+		    fields (dict, optional): Field level filters
+		    search_term (str, optional): Search term to lookup
+		    start (int, optional): Page start
+		
+		Returns:
+		    list: List of results with set fields
+		"""
 		if fields: self.build_fields_filters(fields)
 		if search_term: self.build_search_filters(search_term)
 		
@@ -49,6 +64,7 @@
 				)
 
 				items_dict = {item.name: item for item in items}
+				# TODO: Replace Variants by their parent templates
 
 				all_items.append(set(items.keys()))
 
@@ -59,16 +75,28 @@
 		return result
 
 	def build_fields_filters(self, filters):
+		"""Build filters for field values
+		
+		Args:
+		    filters (dict): Filters
+		"""
 		for field, values in filters.items():
 			if not values:
 				continue
 			
 			if isinstance(values, list):
+				# If value is a list use `IN` query
 				self.filters.append([field, 'IN', values])
 			else:
+				# `=` will be faster than `IN` for most cases
 				self.filters.append([field, '=', values])
 
 	def build_search_filters(self, search_term):
+		"""Query search term in specified fields
+		
+		Args:
+		    search_term (str): Search candidate
+		"""
 		# Default fields to search from
 		default_fields = {'name', 'item_name', 'description', 'item_group'}