Blob Blame History Raw
From 4a31e5a9ab7b5ccb1e9c153377076d522d1633f7 Mon Sep 17 00:00:00 2001
From: jenisys <jenisys@users.noreply.github.com>
Date: Tue, 22 Mar 2016 21:56:48 +0100
Subject: [PATCH 2/3] Add step-label to be used in step-refs, like:   # --
 FILE: something.rst   See also :ref:`When I create a database
 "{db_server}:{db_name}"`

NOTES:
* Step-labels are just before heading.
* docutils must be installed to use them.

(cherry picked from commit d3f7a2ac99c6f7faae331b05f56096eb851d11c9)
---
 CHANGES.rst                      |  3 +++
 behave/formatter/sphinx_steps.py | 29 ++++++++++++++++++++++-------
 behave/formatter/sphinx_util.py  |  4 +++-
 3 files changed, 28 insertions(+), 8 deletions(-)

diff --git a/CHANGES.rst b/CHANGES.rst
index 1bdb644..e32d2b6 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -8,6 +8,9 @@ GOALS:
 
   - Improve support for Windows
 
+FORMATTERS:
+
+  * pull #423: sphinx.steps: Support ref link for each step (provided by: ZivThaller)
 
 Version: 1.2.5 (2015-01-31)
 -------------------------------------------------------------------------------
diff --git a/behave/formatter/sphinx_steps.py b/behave/formatter/sphinx_steps.py
index 3833b65..4cf555d 100644
--- a/behave/formatter/sphinx_steps.py
+++ b/behave/formatter/sphinx_steps.py
@@ -10,6 +10,9 @@ TODO:
 
 .. seealso::
     http://sphinx-doc.org/
+
+.. note:: REQUIRES docutils
+    :mod:`docutils` are needed to generate step-label for step references.
 """
 
 from __future__ import absolute_import, print_function
@@ -21,6 +24,16 @@ import inspect
 import os.path
 import sys
 
+try:
+    # -- SAFETY-NET:
+    import docutils
+    has_docutils = True
+
+    # -- NEEDED FOR: step-labels (and step-refs)
+    from docutils.nodes import fully_normalize_name
+except ImportError:
+    has_docutils = False
+
 
 # -----------------------------------------------------------------------------
 # HELPER CLASS:
@@ -102,6 +115,7 @@ class SphinxStepsDocumentGenerator(object):
     shows_step_module_info = True
     shows_step_module_overview = True
     make_step_index_entries = True
+    make_step_labels = has_docutils
 
     document_separator = "# -- DOCUMENT-END " + "-" * 60
     step_document_prefix = "step_module."
@@ -287,19 +301,20 @@ The following step definitions are provided here.
             index_id = self.make_step_definition_index_id(step_definition)
 
         heading = step_text
+        step_label = None
         if self.step_heading_prefix:
             heading = self.step_heading_prefix + step_text
-        self.document.write_heading(heading, level=2, index_id=index_id)
+        if has_docutils and self.make_step_labels:
+            # -- ADD STEP-LABEL (supports: step-refs by name)
+            # EXAMPLE: See also :ref:`When my step does "{something}"`.
+            step_label = fully_normalize_name(step_text)
+            # SKIP-HERE: self.document.write(".. _%s:\n\n" % step_label)
+        self.document.write_heading(heading, level=2, index_id=index_id, 
+                                    label=step_label)
         step_definition_doc = self.make_step_definition_doc(step_definition)
         self.document.write("%s\n" % step_definition_doc)
         self.document.write("\n")
 
-        # Add step label
-        from docutils.nodes import fully_normalize_name
-        step_text = fully_normalize_name(step_text)
-        step_lable = ".. _" + step_text + ":" + "\n"
-        self.document.write(step_lable)
-        self.document.write("\n")
 
 
 # -----------------------------------------------------------------------------
diff --git a/behave/formatter/sphinx_util.py b/behave/formatter/sphinx_util.py
index e1f7846..5e5cfbf 100644
--- a/behave/formatter/sphinx_util.py
+++ b/behave/formatter/sphinx_util.py
@@ -40,7 +40,7 @@ class DocumentWriter(object):
             self.stream.close()
         self.stream = None
 
-    def write_heading(self, heading, level=0, index_id=None):
+    def write_heading(self, heading, level=0, index_id=None, label=None):
         assert self.stream
         assert heading, "Heading should not be empty"
         assert 0 <= level < len(self.heading_styles)
@@ -55,6 +55,8 @@ class DocumentWriter(object):
             if isinstance(index_id, (list, tuple)):
                 index_id = ", ".join(index_id)
             self.stream.write(".. index:: %s\n\n" % index_id)
+        if label:
+            self.stream.write(".. _%s:\n\n" % label)
         if level == 0:
             self.stream.write("%s\n" % separator)
         self.stream.write("%s\n" % heading)
-- 
2.11.0