Sphinx RNA API changelog generator.

- lists added and removed functions and properties.
- lists renamed properties (does fuzzy comparison using min/max, description, type)
- lists functions with arguments changed.

Committed change log from 2.56 -> 2.57:
  http://www.blender.org/documentation/250PythonDoc/change_log.html
This commit is contained in:
Campbell Barton 2011-04-07 07:53:28 +00:00
parent 8d100c032e
commit 24b012c978
3 changed files with 1079 additions and 0 deletions

@ -0,0 +1,698 @@
Blender API Change Log
**********************
.. note, this document is auto generated by sphinx_changelog_gen.py
2.56 to 2.57
============
bpy.types.SplineBezierPoints
----------------------------
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.SplineBezierPoints.friction` (count), *was (number)*
bpy.types.RenderSettings
------------------------
Added
^^^^^
* :class:`bpy.types.RenderSettings.use_stamp_lens`
Removed
^^^^^^^
* **use_backbuf**
bpy.types.ActionPoseMarkers
---------------------------
Added
^^^^^
* :class:`bpy.types.ActionPoseMarkers.active`
* :class:`bpy.types.ActionPoseMarkers.active_index`
bpy.types.SpaceImageEditor
--------------------------
Renamed
^^^^^^^
* **curves** -> :class:`bpy.types.SpaceImageEditor.curve`
bpy.types.Scene
---------------
Removed
^^^^^^^
* **network_render**
bpy.types.GameObjectSettings
----------------------------
Added
^^^^^
* :class:`bpy.types.GameObjectSettings.use_material_physics_fh`
Removed
^^^^^^^
* **use_material_physics**
bpy.types.SplinePoints
----------------------
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.SplinePoints.use_material_physics` (count), *was (number)*
bpy.types.Area
--------------
Added
^^^^^
* :class:`bpy.types.Area.height`
* :class:`bpy.types.Area.width`
bpy.types.SolidifyModifier
--------------------------
Added
^^^^^
* :class:`bpy.types.SolidifyModifier.material_offset`
* :class:`bpy.types.SolidifyModifier.material_offset_rim`
Removed
^^^^^^^
* **use_rim_material**
bpy.types.UserPreferencesEdit
-----------------------------
Removed
^^^^^^^
* **use_keyframe_insert_keyingset**
bpy.types.MaterialTextureSlot
-----------------------------
Added
^^^^^
* :class:`bpy.types.MaterialTextureSlot.bump_method`
* :class:`bpy.types.MaterialTextureSlot.bump_objectspace`
Removed
^^^^^^^
* **use_old_bump**
bpy.types.ExplodeModifier
-------------------------
Added
^^^^^
* :class:`bpy.types.ExplodeModifier.particle_uv`
* :class:`bpy.types.ExplodeModifier.use_edge_cut`
Removed
^^^^^^^
* **use_edge_split**
bpy.types.Node
--------------
Added
^^^^^
* :class:`bpy.types.Node.label`
bpy.types.RigidBodyJointConstraint
----------------------------------
Added
^^^^^
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_x`
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_y`
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_max_z`
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_x`
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_y`
* :class:`bpy.types.RigidBodyJointConstraint.limit_angle_min_z`
* :class:`bpy.types.RigidBodyJointConstraint.limit_max_x`
* :class:`bpy.types.RigidBodyJointConstraint.limit_max_y`
* :class:`bpy.types.RigidBodyJointConstraint.limit_max_z`
* :class:`bpy.types.RigidBodyJointConstraint.limit_min_x`
* :class:`bpy.types.RigidBodyJointConstraint.limit_min_y`
* :class:`bpy.types.RigidBodyJointConstraint.limit_min_z`
Removed
^^^^^^^
* **limit_cone_max**
* **limit_cone_min**
* **limit_generic_max**
* **limit_generic_min**
bpy.types.KeyMap
----------------
Renamed
^^^^^^^
* **items** -> :class:`bpy.types.KeyMap.keymap_items`
bpy.types.SpaceNodeEditor
-------------------------
Added
^^^^^
* :class:`bpy.types.SpaceNodeEditor.backdrop_channels`
* :class:`bpy.types.SpaceNodeEditor.backdrop_x`
* :class:`bpy.types.SpaceNodeEditor.backdrop_y`
* :class:`bpy.types.SpaceNodeEditor.backdrop_zoom`
* :class:`bpy.types.SpaceNodeEditor.use_auto_render`
bpy.types.SPHFluidSettings
--------------------------
Added
^^^^^
* :class:`bpy.types.SPHFluidSettings.factor_density`
* :class:`bpy.types.SPHFluidSettings.factor_radius`
* :class:`bpy.types.SPHFluidSettings.factor_repulsion`
* :class:`bpy.types.SPHFluidSettings.factor_rest_length`
* :class:`bpy.types.SPHFluidSettings.factor_stiff_viscosity`
* :class:`bpy.types.SPHFluidSettings.plasticity`
* :class:`bpy.types.SPHFluidSettings.repulsion`
* :class:`bpy.types.SPHFluidSettings.spring_frames`
* :class:`bpy.types.SPHFluidSettings.stiff_viscosity`
* :class:`bpy.types.SPHFluidSettings.use_initial_rest_length`
* :class:`bpy.types.SPHFluidSettings.use_viscoelastic_springs`
* :class:`bpy.types.SPHFluidSettings.yield_ratio`
Removed
^^^^^^^
* **stiffness_near**
* **viscosity_beta**
Renamed
^^^^^^^
* **viscosity_omega** -> :class:`bpy.types.SPHFluidSettings.linear_viscosity`
bpy.types.ConstraintActuator
----------------------------
Added
^^^^^
* :class:`bpy.types.ConstraintActuator.direction_axis_pos`
* :class:`bpy.types.ConstraintActuator.fh_force`
Removed
^^^^^^^
* **spring**
bpy.types.UILayout
------------------
Renamed
^^^^^^^
* **operator_enums** -> :class:`bpy.types.UILayout.operator_enum`
bpy.types.SpaceDopeSheetEditor
------------------------------
Added
^^^^^
* :class:`bpy.types.SpaceDopeSheetEditor.show_pose_markers`
bpy.types.ToolSettings
----------------------
Added
^^^^^
* :class:`bpy.types.ToolSettings.edge_path_live_unwrap`
* :class:`bpy.types.ToolSettings.proportional_size`
* :class:`bpy.types.ToolSettings.use_keyframe_insert_keyingset`
bpy.types.EditBone
------------------
Added
^^^^^
* :class:`bpy.types.EditBone.bbone_x`
* :class:`bpy.types.EditBone.bbone_z`
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.EditBone.bbone_z` (self, matrix, scale, roll), *was (self, matrix)*
bpy.types.ID
------------
Renamed
^^^^^^^
* **update** -> :class:`bpy.types.ID.update_tag`
bpy.types.SpaceGraphEditor
--------------------------
Added
^^^^^
* :class:`bpy.types.SpaceGraphEditor.use_fancy_drawing`
bpy.types.ParticleSystem
------------------------
Added
^^^^^
* :class:`bpy.types.ParticleSystem.child_seed`
bpy.types.SpaceTimeline
-----------------------
Removed
^^^^^^^
* **use_play_3d_editors**
* **use_play_animation_editors**
* **use_play_image_editors**
* **use_play_node_editors**
* **use_play_properties_editors**
* **use_play_sequence_editors**
* **use_play_top_left_3d_editor**
bpy.types.Mesh
--------------
Added
^^^^^
* :class:`bpy.types.Mesh.validate`
Renamed
^^^^^^^
* **show_extra_edge_angle** -> :class:`bpy.types.Mesh.show_extra_face_angle`
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.Mesh.show_extra_face_angle` (self, vertices, edges, faces), *was (self, verts, edges, faces)*
bpy.types.EnumProperty
----------------------
Added
^^^^^
* :class:`bpy.types.EnumProperty.default_flag`
Renamed
^^^^^^^
* **items** -> :class:`bpy.types.EnumProperty.enum_items`
bpy.types.Screen
----------------
Added
^^^^^
* :class:`bpy.types.Screen.use_play_3d_editors`
* :class:`bpy.types.Screen.use_play_animation_editors`
* :class:`bpy.types.Screen.use_play_image_editors`
* :class:`bpy.types.Screen.use_play_node_editors`
* :class:`bpy.types.Screen.use_play_properties_editors`
* :class:`bpy.types.Screen.use_play_sequence_editors`
* :class:`bpy.types.Screen.use_play_top_left_3d_editor`
bpy.types.MirrorModifier
------------------------
Added
^^^^^
* :class:`bpy.types.MirrorModifier.use_mirror_merge`
bpy.types.Operator
------------------
Added
^^^^^
* :class:`bpy.types.Operator.cancel`
bpy.types.Brush
---------------
Added
^^^^^
* :class:`bpy.types.Brush.height`
* :class:`bpy.types.Brush.use_fixed_texture`
Renamed
^^^^^^^
* **imagepaint_tool** -> :class:`bpy.types.Brush.image_tool`
* **use_paint_texture** -> :class:`bpy.types.Brush.use_paint_image`
* **vertexpaint_tool** -> :class:`bpy.types.Brush.vertex_tool`
bpy.types.Key
-------------
Renamed
^^^^^^^
* **keys** -> :class:`bpy.types.Key.key_blocks`
bpy.types.CompositorNodeBlur
----------------------------
Added
^^^^^
* :class:`bpy.types.CompositorNodeBlur.aspect_correction`
bpy.types.SpaceTextEditor
-------------------------
Added
^^^^^
* :class:`bpy.types.SpaceTextEditor.margin_column`
* :class:`bpy.types.SpaceTextEditor.show_margin`
bpy.types.GPencilLayer
----------------------
Added
^^^^^
* :class:`bpy.types.GPencilLayer.show_x_ray`
Removed
^^^^^^^
* **active**
bpy.types.MarbleTexture
-----------------------
Renamed
^^^^^^^
* **noisebasis_2** -> :class:`bpy.types.MarbleTexture.noise_basis_2`
bpy.types.Particle
------------------
Removed
^^^^^^^
* **is_hair**
Renamed
^^^^^^^
* **keys** -> :class:`bpy.types.Particle.hair_keys`
* **keys** -> :class:`bpy.types.Particle.particle_keys`
bpy.types.Modifier
------------------
Added
^^^^^
* :class:`bpy.types.Modifier.use_apply_on_spline`
bpy.types.Property
------------------
Added
^^^^^
* :class:`bpy.types.Property.is_enum_flag`
bpy.types.SpaceProperties
-------------------------
Added
^^^^^
* :class:`bpy.types.SpaceProperties.texture_context`
Removed
^^^^^^^
* **show_brush_texture**
bpy.types.VertexGroups
----------------------
Added
^^^^^
* :class:`bpy.types.VertexGroups.remove`
Removed
^^^^^^^
* **assign**
bpy.types.Material
------------------
Added
^^^^^
* :class:`bpy.types.Material.shadow_only_type`
bpy.types.RenderLayer
---------------------
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.RenderLayer.shadow_only_type` (filename, x, y), *was (filename)*
bpy.types.Object
----------------
Added
^^^^^
* :class:`bpy.types.Object.is_modified`
Renamed
^^^^^^^
* **create_dupli_list** -> :class:`bpy.types.Object.dupli_list_create`
* **create_mesh** -> :class:`bpy.types.Object.to_mesh`
* **free_dupli_list** -> :class:`bpy.types.Object.dupli_list_clear`
bpy.types.NodeTree
------------------
Added
^^^^^
* :class:`bpy.types.NodeTree.inputs`
* :class:`bpy.types.NodeTree.outputs`
bpy.types.DopeSheet
-------------------
Added
^^^^^
* :class:`bpy.types.DopeSheet.filter_fcurve_name`
* :class:`bpy.types.DopeSheet.show_lattices`
* :class:`bpy.types.DopeSheet.show_only_matching_fcurves`
bpy.types.ActionFCurves
-----------------------
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.ActionFCurves.show_only_matching_fcurves` (data_path, index, action_group), *was (data_path, array_index, action_group)*
bpy.types.ShrinkwrapModifier
----------------------------
Added
^^^^^
* :class:`bpy.types.ShrinkwrapModifier.cull_face`
Removed
^^^^^^^
* **use_cull_back_faces**
* **use_cull_front_faces**
bpy.types.WindowManager
-----------------------
Added
^^^^^
* :class:`bpy.types.WindowManager.addon_filter`
* :class:`bpy.types.WindowManager.addon_search`
* :class:`bpy.types.WindowManager.addon_support`
* :class:`bpy.types.WindowManager.event_timer_add`
* :class:`bpy.types.WindowManager.event_timer_remove`
bpy.types.WoodTexture
---------------------
Renamed
^^^^^^^
* **noisebasis_2** -> :class:`bpy.types.WoodTexture.noise_basis_2`
bpy.types.VertexGroup
---------------------
Added
^^^^^
* :class:`bpy.types.VertexGroup.add`
* :class:`bpy.types.VertexGroup.remove`
* :class:`bpy.types.VertexGroup.weight`
bpy.types.FCurveKeyframePoints
------------------------------
Added
^^^^^
* :class:`bpy.types.FCurveKeyframePoints.insert`
Function Arguments
^^^^^^^^^^^^^^^^^^
* :class:`bpy.types.FCurveKeyframePoints.insert` (count), *was (frame, value, replace, needed, fast)*
bpy.types.ThemeView3D
---------------------
Added
^^^^^
* :class:`bpy.types.ThemeView3D.outline_width`
bpy.types.Image
---------------
Added
^^^^^
* :class:`bpy.types.Image.pixels`
bpy.types.Bone
--------------
Added
^^^^^
* :class:`bpy.types.Bone.bbone_x`
* :class:`bpy.types.Bone.bbone_z`
bpy.types.InputKeyMapPanel
--------------------------
Removed
^^^^^^^
* **draw_entry**
* **draw_filtered**
* **draw_hierarchy**
* **draw_keymaps**
* **draw_km**
* **draw_kmi**
* **draw_kmi_properties**
* **indented_layout**
bpy.types.ParticleSettings
--------------------------
Added
^^^^^
* :class:`bpy.types.ParticleSettings.active_texture`
* :class:`bpy.types.ParticleSettings.active_texture_index`
* :class:`bpy.types.ParticleSettings.child_parting_factor`
* :class:`bpy.types.ParticleSettings.child_parting_max`
* :class:`bpy.types.ParticleSettings.child_parting_min`
* :class:`bpy.types.ParticleSettings.color_maximum`
* :class:`bpy.types.ParticleSettings.create_long_hair_children`
* :class:`bpy.types.ParticleSettings.draw_color`
* :class:`bpy.types.ParticleSettings.effector_amount`
* :class:`bpy.types.ParticleSettings.grid_random`
* :class:`bpy.types.ParticleSettings.hair_length`
* :class:`bpy.types.ParticleSettings.hexagonal_grid`
* :class:`bpy.types.ParticleSettings.is_fluid`
* :class:`bpy.types.ParticleSettings.kink_amplitude_clump`
* :class:`bpy.types.ParticleSettings.kink_flat`
* :class:`bpy.types.ParticleSettings.texture_slots`
* :class:`bpy.types.ParticleSettings.timestep`
* :class:`bpy.types.ParticleSettings.use_advanced_hair`
Removed
^^^^^^^
* **reaction_shape**
* **show_material_color**
* **use_animate_branching**
* **use_branching**
* **use_symmetric_branching**
bpy.types.SceneGameData
-----------------------
Added
^^^^^
* :class:`bpy.types.SceneGameData.show_mouse`
bpy.types.MaterialPhysics
-------------------------
Renamed
^^^^^^^
* **damping** -> :class:`bpy.types.MaterialPhysics.fh_damping`
* **distance** -> :class:`bpy.types.MaterialPhysics.fh_distance`
* **force** -> :class:`bpy.types.MaterialPhysics.fh_force`
* **use_normal_align** -> :class:`bpy.types.MaterialPhysics.use_fh_normal`

@ -0,0 +1,370 @@
# ##### BEGIN GPL LICENSE BLOCK #####
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
# <pep8 compliant>
"""
Dump the python API into a text file so we can generate changelogs.
output from this tool should be added into "doc/python_api/rst/change_log.rst"
# dump api blender_version.py in CWD
blender --background --python intern/tools/rna_api_dump.py -- --dump
# create changelog
blender --background --python intern/tools/rna_api_dump.py -- \
--api_from blender_2_56_1.py \
--api_to blender_2_57_0.py \
--api_out changes.rst
# Api comparison can also run without blender
python intern/tools/rna_api_dump.py
--api_from blender_api_2_56_6.py \
--api_to blender_api_2_57.py \
--api_out changes.rst
"""
# format
'''
{"module.name":
{"parent.class":
{"basic_type", "member_name": ("Name", type, range, length, default, descr, f_args, f_arg_types, f_ret_types)}, ...
}, ...
}
'''
api_names = "basic_type" "name", "type", "range", "length", "default", "descr", "f_args", "f_arg_types", "f_ret_types"
API_BASIC_TYPE = 0
API_F_ARGS = 7
def api_dunp_fname():
import bpy
return "blender_api_%s.py" % "_".join([str(i) for i in bpy.app.version])
def api_dump():
dump = {}
dump_module = dump["bpy.types"] = {}
import rna_info
import inspect
struct = rna_info.BuildRNAInfo()[0]
for struct_id, strict_info in sorted(struct.items()):
struct_id_str = strict_info.identifier
if rna_info.rna_id_ignore(struct_id_str):
continue
for base in strict_info.get_bases():
struct_id_str = base.identifier + "." + struct_id_str
dump_class = dump_module[struct_id_str] = {}
props = [(prop.identifier, prop) for prop in strict_info.properties]
for prop_id, prop in sorted(props):
# if prop.type == 'boolean':
# continue
prop_type = prop.type
prop_length = prop.array_length
prop_range = round(prop.min, 4), round(prop.max, 4)
prop_default = prop.default
if type(prop_default) is float:
prop_default = round(prop_default, 4)
if prop_range[0] == -1 and prop_range[1] == -1:
prop_range = None
dump_class[prop_id] = (
"prop_rna", # basic_type
prop.name, # name
prop_type, # type
prop_range, # range
prop_length, # length
prop.default, # default
prop.description, # descr
Ellipsis, # f_args
Ellipsis, # f_arg_types
Ellipsis, # f_ret_types
)
del props
# python props, tricky since we dont know much about them.
for prop_id, attr in strict_info.get_py_properties():
dump_class[prop_id] = (
"prop_py", # basic_type
Ellipsis, # name
Ellipsis, # type
Ellipsis, # range
Ellipsis, # length
Ellipsis, # default
attr.__doc__, # descr
Ellipsis, # f_args
Ellipsis, # f_arg_types
Ellipsis, # f_ret_types
)
# kludge func -> props
funcs = [(func.identifier, func) for func in strict_info.functions]
for func_id, func in funcs:
func_ret_types = tuple([prop.type for prop in func.return_values])
func_args_ids = tuple([prop.identifier for prop in func.args])
func_args_type = tuple([prop.type for prop in func.args])
dump_class[func_id] = (
"func_rna", # basic_type
Ellipsis, # name
Ellipsis, # type
Ellipsis, # range
Ellipsis, # length
Ellipsis, # default
func.description, # descr
func_args_ids, # f_args
func_args_type, # f_arg_types
func_ret_types, # f_ret_types
)
del funcs
# kludge func -> props
funcs = strict_info.get_py_functions()
for func_id, attr in funcs:
# arg_str = inspect.formatargspec(*inspect.getargspec(py_func))
func_args_ids = tuple(inspect.getargspec(attr).args)
dump_class[func_id] = (
"func_py", # basic_type
Ellipsis, # name
Ellipsis, # type
Ellipsis, # range
Ellipsis, # length
Ellipsis, # default
attr.__doc__, # descr
func_args_ids, # f_args
Ellipsis, # f_arg_types
Ellipsis, # f_ret_types
)
del funcs
import pprint
filename = api_dunp_fname()
filehandle = open(filename, 'w')
tot = filehandle.write(pprint.pformat(dump, width=1))
filehandle.close()
print("%s, %d bytes written" % (filename, tot))
def compare_props(a, b, fuzz=0.75):
# must be same basic_type, function != property
if a[0] != b[0]:
return False
tot = 0
totlen = 0
for i in range(1, len(a)):
if not (Ellipsis is a[i] is b[i]):
tot += (a[i] == b[i])
totlen += 1
return ((tot / totlen) >= fuzz)
def api_changelog(api_from, api_to, api_out):
file_handle = open(api_from, 'r')
dict_from = eval(file_handle.read())
file_handle.close()
file_handle = open(api_to, 'r')
dict_to = eval(file_handle.read())
file_handle.close()
api_changes = []
# first work out what moved
for mod_id, mod_data in dict_to.items():
mod_data_other = dict_from[mod_id]
for class_id, class_data in mod_data.items():
class_data_other = mod_data_other.get(class_id)
if class_data_other is None:
# TODO, document new structs
continue
# find the props which are not in either
set_props_new = set(class_data.keys())
set_props_other = set(class_data_other.keys())
set_props_shared = set_props_new & set_props_other
props_moved = []
props_new = []
props_old = []
func_args = []
set_props_old = set_props_other - set_props_shared
set_props_new = set_props_new - set_props_shared
# first find settings which have been moved old -> new
for prop_id_old in set_props_old.copy():
prop_data_other = class_data_other[prop_id_old]
for prop_id_new in set_props_new.copy():
prop_data = class_data[prop_id_new]
if compare_props(prop_data_other, prop_data):
props_moved.append((prop_id_old, prop_id_new))
# remove
if prop_id_old in set_props_old:
set_props_old.remove(prop_id_old)
set_props_new.remove(prop_id_new)
# func args
for prop_id in set_props_shared:
prop_data = class_data[prop_id]
prop_data_other = class_data_other[prop_id]
if prop_data[API_BASIC_TYPE] == prop_data_other[API_BASIC_TYPE]:
if prop_data[API_BASIC_TYPE].startswith("func"):
args_new = prop_data[API_F_ARGS]
args_old = prop_data_other[API_F_ARGS]
if args_new != args_old:
func_args.append((prop_id, args_old, args_new))
if props_moved or set_props_new or set_props_old or func_args:
props_moved.sort()
props_new[:] = sorted(set_props_new)
props_old[:] = sorted(set_props_old)
func_args.sort()
api_changes.append((mod_id, class_id, props_moved, props_new, props_old, func_args))
# also document function argument changes
fout = open(api_out, 'w')
fw = fout.write
# print(api_changes)
# :class:`bpy_struct.id_data`
def write_title(title, title_char):
fw("%s\n%s\n\n" % (title, title_char * len(title)))
for mod_id, class_id, props_moved, props_new, props_old, func_args in api_changes:
class_name = class_id.split(".")[-1]
title = mod_id + "." + class_name
write_title(title, "-")
if props_new:
write_title("Added", "^")
for prop_id in props_new:
fw("* :class:`%s.%s.%s`\n" % (mod_id, class_name, prop_id))
fw("\n")
if props_old:
write_title("Removed", "^")
for prop_id in props_old:
fw("* **%s**\n" % prop_id) # cant link to remvoed docs
fw("\n")
if props_moved:
write_title("Renamed", "^")
for prop_id_old, prop_id in props_moved:
fw("* **%s** -> :class:`%s.%s.%s`\n" % (prop_id_old, mod_id, class_name, prop_id))
fw("\n")
if func_args:
write_title("Function Arguments", "^")
for func_id, args_old, args_new in func_args:
args_new = ", ".join(args_new)
args_old = ", ".join(args_old)
fw("* :class:`%s.%s.%s` (%s), *was (%s)*\n" % (mod_id, class_name, prop_id, args_new, args_old))
fw("\n")
fout.close()
def main():
import sys
import os
try:
import argparse
except:
print("Old Blender, just dumping")
api_dump()
return
argv = sys.argv
if "--" not in argv:
argv = [] # as if no args are passed
else:
argv = argv[argv.index("--") + 1:] # get all args after "--"
# When --help or no args are given, print this help
usage_text = "Run blender in background mode with this script: "
"blender --background --python %s -- [options]" % os.path.basename(__file__)
epilog = "Run this before releases"
parser = argparse.ArgumentParser(description=usage_text, epilog=epilog)
parser.add_argument("--dump", dest="dump", action='store_true',
help="When set the api will be dumped into blender_version.py")
parser.add_argument("--api_from", dest="api_from", metavar='FILE',
help="File to compare from (previous version)")
parser.add_argument("--api_to", dest="api_to", metavar='FILE',
help="File to compare from (current)")
parser.add_argument("--api_out", dest="api_out", metavar='FILE',
help="Output sphinx changelog")
args = parser.parse_args(argv) # In this example we wont use the args
if not argv:
parser.print_help()
return
if args.dump:
api_dump()
else:
if args.api_from and args.api_to and args.api_out:
api_changelog(args.api_from, args.api_to, args.api_out)
else:
print("Error: --api_from/api_to/api_out args needed")
parser.print_help()
return
print("batch job finished, exiting")
if __name__ == "__main__":
main()

@ -984,6 +984,15 @@ def rna2sphinx(BASEPATH):
fw(" bge.render.rst\n\n")
fw(" bge.events.rst\n\n")
# rna generated change log
fw("========\n")
fw("API Info\n")
fw("========\n")
fw("\n")
fw(".. toctree::\n")
fw(" :maxdepth: 1\n\n")
fw(" change_log.rst\n\n")
file.close()
# internal modules
@ -1088,6 +1097,8 @@ def rna2sphinx(BASEPATH):
shutil.copy2(os.path.join(BASEPATH, "..", "rst", "bge.render.rst"), BASEPATH)
shutil.copy2(os.path.join(BASEPATH, "..", "rst", "bge.events.rst"), BASEPATH)
shutil.copy2(os.path.join(BASEPATH, "..", "rst", "change_log.rst"), BASEPATH)
if 0:
filepath = os.path.join(BASEPATH, "bpy.rst")
file = open(filepath, "w")