[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19860] branches/blender2.5/blender/source /blender/python/epy_doc_gen.py: rna functions are now included in epydocs,

Campbell Barton ideasman42 at gmail.com
Tue Apr 21 22:03:39 CEST 2009


Revision: 19860
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19860
Author:   campbellbarton
Date:     2009-04-21 22:03:39 +0200 (Tue, 21 Apr 2009)

Log Message:
-----------
rna functions are now included in epydocs,
only write the functions into the base rna structs and let epydoc show the inheritance.

examples
http://www.graphicall.org/ftp/ideasman42/html/rna.Mesh-class.html
http://www.graphicall.org/ftp/ideasman42/html/rna.Panel-class.html
http://www.graphicall.org/ftp/ideasman42/html/rna.Header-class.html
http://www.graphicall.org/ftp/ideasman42/html/rna.UILayout-class.html

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/epy_doc_gen.py

Modified: branches/blender2.5/blender/source/blender/python/epy_doc_gen.py
===================================================================
--- branches/blender2.5/blender/source/blender/python/epy_doc_gen.py	2009-04-21 18:41:45 UTC (rev 19859)
+++ branches/blender2.5/blender/source/blender/python/epy_doc_gen.py	2009-04-21 20:03:39 UTC (rev 19860)
@@ -23,9 +23,16 @@
 run this script from blenders root path once you have compiled blender
 	./blender.bin -P source/blender/python/epy_doc_gen.py
 
-This will generate rna.py, generate html docs  by running...
-	epydoc source/blender/python/doc/rna.py -o source/blender/python/doc/html -v --no-sourcecode  --no-sourcecode  --graph=classtree
-	epydoc source/blender/python/doc/bpyoperator.py -o source/blender/python/doc/html -v --no-sourcecode  --no-sourcecode  --graph=classtree
+This will generate rna.py and bpyoperator.py in "./source/blender/python/doc/"
+Generate html docs  by running...
+
+	epydoc source/blender/python/doc/*.py -v \
+			-o source/blender/python/doc/html \
+			--inheritance=included \
+			--no-sourcecode \
+			--graph=classtree \
+			--graph-font-size=8
+
 '''
 
 # if you dont have graphvis installed ommit the --graph arg.
@@ -52,7 +59,126 @@
 	else:
 		return rna_struct.identifier
 
+def write_func(rna, ident, out, func_type):
+	# Keyword attributes
+	kw_args = [] # "foo = 1", "bar=0.5", "spam='ENUM'"
+	kw_arg_attrs = [] # "@type mode: int"
+	
+	rna_struct= rna.rna_type
+	
+	# Operators and functions work differently
+	if func_type=='OPERATOR':
+		rna_func_name = rna_struct.identifier
+		rna_func_desc = rna_struct.description
+		items = rna_struct.properties.items()
+	else:
+		rna_func_name = rna.identifier
+		rna_func_desc = rna.description
+		items = rna.parameters.items()
+	
+	for rna_prop_identifier, rna_prop in items:
+		if rna_prop_identifier=='rna_type':
+			continue
+		
+		# clear vars			
+		val = val_error = val_str = rna_prop_type = None
+		
+		# ['rna_type', 'name', 'array_length', 'description', 'hard_max', 'hard_min', 'identifier', 'precision', 'readonly', 'soft_max', 'soft_min', 'step', 'subtype', 'type']
+		#rna_prop=  op_rna.rna_type.properties[attr]
+		rna_prop_type = rna_prop.type.lower() # enum, float, int, boolean
+		
+		
+		try:		length = rna_prop.array_length
+		except:	length = 0
+		
+		array_str = get_array_str(length)
+		
+		kw_type_str= "@type %s: %s%s" % (rna_prop_identifier, rna_prop_type, array_str)
+		kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description)
+		kw_param_set = False
+		
+		if func_type=='OPERATOR':
+			try:
+				val = getattr(rna, rna_prop_identifier)
+				val_error = False
+			except:
+				val = "'<UNDEFINED>'"
+				val_error = True
+			
+				
+			if val_error:
+				val_str = val
+			elif rna_prop_type=='float':
+				if length==0:
+					val_str= '%g' % val
+					if '.' not in val_str:
+						val_str += '.0'
+				else:
+					# array
+					val_str = str(tuple(val))
+				
+				kw_param_str += (' in (%s, %s)' % (range_str(rna_prop.hard_min), range_str(rna_prop.hard_max)))
+				kw_param_set= True
+				
+			elif rna_prop_type=='int':
+				if length==0:
+					val_str='%d' % val
+				else:
+					val_str = str(tuple(val))
+				
+				# print(dir(rna_prop))
+				kw_param_str += (' in (%s, %s)' % (range_str(rna_prop.hard_min), range_str(rna_prop.hard_max)))
+				# These strings dont have a max length???
+				#kw_param_str += ' (maximum length of %s)' %  (rna_prop.max_length)
+				kw_param_set= True
+				
+			elif rna_prop_type=='boolean':
+				if length==0:
+					if val:	val_str='True'
+					else:	val_str='False'
+				else:
+					val_str = str(tuple(val))
+			
+			elif rna_prop_type=='enum':
+				# no array here?
+				val_str="'%s'" % val
+				# Too cramped
+				kw_param_str += (' in (%s)' % ', '.join(rna_prop.items.keys()))
+				
+				kw_param_set= True
+				
+			elif rna_prop_type=='string':
+				# no array here?
+				val_str='"%s"' % val
+			
+			# todo - collection - array
+			# print (rna_prop.type)
+			
+			kw_args.append('%s = %s' % (rna_prop_identifier, val_str))
+			
+			# stora 
+		else:
+			# currently functions dont have a default value
+			kw_args.append('%s' % (rna_prop_identifier))
+		
+		
+		# Same for operators and functions
+		kw_arg_attrs.append(kw_type_str)
+		if kw_param_set:
+			kw_arg_attrs.append(kw_param_str)
+		
+	
+	
+	out.write(ident+'def %s(%s):\n' % (rna_func_name, ', '.join(kw_args)))
+	out.write(ident+'\t"""\n')
+	out.write(ident+'\t%s\n' % rna_func_desc)
+	for desc in kw_arg_attrs:
+		out.write(ident+'\t%s\n' % desc)
+	out.write(ident+'\t at rtype: None\n')
+	out.write(ident+'\t"""\n')
+	
 
+
 def rna2epy(target_path):
 	
 	# Use for faster lookups
@@ -60,8 +186,12 @@
 	rna_full_path_dict =	{}	# store the result of full_rna_struct_path(rna_struct)
 	rna_children_dict =		{}	# store all rna_structs nested from here
 	rna_references_dict =	{}	# store a list of rna path strings that reference this type
+	rna_functions_dict =	{}	# store all functions directly in this type (not inherited)
 	rna_words = set()
 	
+	# def write_func(rna_func, ident):
+	
+	
 	def write_struct(rna_struct, ident):
 		identifier = rna_struct.identifier
 		
@@ -135,7 +265,13 @@
 				out.write(ident+ '\t at type %s: %sL{%s}%s%s\n' %  (rna_prop_identifier, collection_str, rna_prop_ptr.identifier, array_str, readonly_str))
 			else:
 				if rna_prop_type == 'enum':
-					out.write(ident+ '\t at ivar %s: %s in (%s)\n' %  (rna_prop_identifier, rna_desc, ', '.join(rna_prop.items.keys())))
+					if 0:
+						out.write(ident+ '\t at ivar %s: %s in (%s)\n' %  (rna_prop_identifier, rna_desc, ', '.join(rna_prop.items.keys())))
+					else:
+						out.write(ident+ '\t at ivar %s: %s in...\n' %  (rna_prop_identifier, rna_desc))
+						for e in rna_prop.items.keys():
+							out.write(ident+ '\t\t- %s\n' % e)
+						
 					out.write(ident+ '\t at type %s: %s%s%s\n' %  (rna_prop_identifier, rna_prop_type,  array_str, readonly_str))
 				elif rna_prop_type == 'int' or rna_prop_type == 'float':
 					out.write(ident+ '\t at ivar %s: %s\n' %  (rna_prop_identifier, rna_desc))
@@ -150,6 +286,14 @@
 			
 		out.write(ident+ '\t"""\n\n')
 		
+		
+		# Write functions 
+		# for rna_func in rna_struct.functions: # Better ignore inherited (line below)
+		for rna_func in rna_functions_dict[identifier]:
+			write_func(rna_func, ident+'\t', out, 'FUNCTION')
+		
+		out.write('\n')
+		
 		# Now write children recursively
 		for child in rna_children_dict[identifier]:
 			write_struct(child, ident + '\t')
@@ -180,15 +324,25 @@
 			# Store full rna path 'GameObjectSettings' -> 'Object.GameObjectSettings'
 			rna_full_path_dict[identifier] = full_rna_struct_path(rna_struct)
 			
+			# Store a list of functions, remove inherited later
+			rna_functions_dict[identifier]= list(rna_struct.functions)
+			
+			
 			# fill in these later
 			rna_children_dict[identifier]= []
 			rna_references_dict[identifier]= []
 			
+			
 		else:
 			print("Ignoring", rna_type_name)
 	
 	
+	# Sucks but we need to copy this so we can check original parent functions
+	rna_functions_dict__copy = {}
+	for key, val in rna_functions_dict.items():
+		rna_functions_dict__copy[key] = val[:]
 	
+	
 	structs.sort() # not needed but speeds up sort below, setting items without an inheritance first
 	
 	# Arrange so classes are always defined in the correct order
@@ -247,7 +401,18 @@
 		nested = rna_struct.nested
 		if nested:
 			rna_children_dict[nested.identifier].append(rna_struct)
+		
+		
+		if rna_base:
+			rna_funcs =			rna_functions_dict[identifier]
+			if rna_funcs:
+				# Remove inherited functions if we have any
+				rna_base_funcs =	rna_functions_dict__copy[rna_base]
+				rna_funcs[:] =		[f for f in rna_funcs if f not in rna_base_funcs]
 	
+	rna_functions_dict__copy.clear()
+	del rna_functions_dict__copy
+	
 	# Sort the refs, just reads nicer
 	for rna_refs in rna_references_dict.values():
 		rna_refs.sort()
@@ -319,9 +484,8 @@
 			
 			ref = rna_ref_string.split('.')[-2]
 			out.write('\t"%s" -> "%s" [label="%s" weight=0.01];\n' % (ref, identifier, rna_ref_string))
-		
-		
 	
+	
 	out.write('}\n')
 	out.close()
 	
@@ -335,9 +499,6 @@
 	for w in rna_words:
 		out.write('%s\n' % w)
 	
-	
-	
-	
 
 def op2epy(target_path):
 	out = open(target_path, 'w')
@@ -352,104 +513,11 @@
 		if op.startswith('__'):
 			continue
 		
-		# Keyword attributes
-		kw_args = [] # "foo = 1", "bar=0.5", "spam='ENUM'"
-		kw_arg_attrs = [] # "@type mode: int"
-		
 		# rna = getattr(bpy.types, op).__rna__
 		rna = bpy.ops.__rna__(op)
 		
-		rna_struct = rna.rna_type
-		# print (dir(rna))
-		# print (dir(rna_struct))
-		for rna_prop_identifier, rna_prop in rna_struct.properties.items():
-			if rna_prop_identifier=='rna_type':
-				continue
-			# ['rna_type', 'name', 'array_length', 'description', 'hard_max', 'hard_min', 'identifier', 'precision', 'readonly', 'soft_max', 'soft_min', 'step', 'subtype', 'type']
-			#rna_prop=  op_rna.rna_type.properties[attr]
-			rna_prop_type = rna_prop.type.lower() # enum, float, int, boolean
-			
-			try:		length = rna_prop.array_length
-			except:	length = 0
-			
-			array_str = get_array_str(length)
-			
-			try:
-				val = getattr(rna, rna_prop_identifier)
-				val_error = False
-			except:
-				val = "'<UNDEFINED>'"
-				val_error = True
-			
-			kw_type_str= "@type %s: %s%s" % (rna_prop_identifier, rna_prop_type, array_str)
-			kw_param_str= "@param %s: %s" % (rna_prop_identifier, rna_prop.description)
-			kw_param_set = False
-			
-			if val_error:
-				val_str = val
-			elif rna_prop_type=='float':
-				if length==0:
-					val_str= '%g' % val
-					if '.' not in val_str:
-						val_str += '.0'
-				else:
-					# array
-					val_str = str(tuple(val))
-				
-				kw_param_str += (' in (%s, %s)' % (range_str(rna_prop.hard_min), range_str(rna_prop.hard_max)))
-				kw_param_set= True
-				
-			elif rna_prop_type=='int':
-				if length==0:
-					val_str='%d' % val
-				else:
-					val_str = str(tuple(val))
-				
-				# print(dir(rna_prop))
-				kw_param_str += (' in (%s, %s)' % (range_str(rna_prop.hard_min), range_str(rna_prop.hard_max)))
-				# These strings dont have a max length???
-				#kw_param_str += ' (maximum length of %s)' %  (rna_prop.max_length)
-				kw_param_set= True
-				
-			elif rna_prop_type=='boolean':
-				if length==0:
-					if val:	val_str='True'
-					else:	val_str='False'
-				else:
-					val_str = str(tuple(val))
-			
-			elif rna_prop_type=='enum':
-				# no array here?
-				val_str="'%s'" % val
-				kw_param_str += (' in (%s)' % ', '.join(rna_prop.items.keys()))
-				kw_param_set= True
-				

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list