Skip to content

docs: Pull tutorial code snippets from examples/ - #2544

Open
tonyandrewmeyer wants to merge 1 commit into
canonical:mainfrom
tonyandrewmeyer:tutorial-pull-from-files
Open

docs: Pull tutorial code snippets from examples/#2544
tonyandrewmeyer wants to merge 1 commit into
canonical:mainfrom
tonyandrewmeyer:tutorial-pull-from-files

Conversation

@tonyandrewmeyer

@tonyandrewmeyer tonyandrewmeyer commented Jun 4, 2026

Copy link
Copy Markdown
Collaborator

Replace hardcoded code fences in the tutorial pages with Sphinx literalinclude directives that pull from the matching example charms in examples/. This keeps the tutorial automatically in sync with the canonical source, and removes ~750 lines of duplicated code.

Strategy per snippet type:

  • Full method or class: :pyobject: Class.method
  • Single line or small fragment: :start-at:/:end-at: patterns on the line content (no marker comments needed in sources)
  • Multi-line block: :start-at:/:end-before: patterns anchored on the next section
  • Full file (skipping copyright header): :start-at: with the first real line

Intermediate states that don't exist in examples/ (for example, the empty starting charm class, lines shown only to be removed, contrastive "don't do this" snippets, and a troubleshooting timeout hint) are left inline.

Preview

@james-garner-canonical

Copy link
Copy Markdown
Contributor

This is super cool! I didn't know Sphinx could do this.

Comment on lines +57 to 61
```{literalinclude} ../../../examples/k8s-1-minimal/charmcraft.yaml
:language: yaml
:start-at: 'title: Web Server Demo'
:end-at: how to write a Kubernetes charm with Ops.
```

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could use start-after and end-after with comment anchors in cases where we worry that this won't be robust. Thinking about this case specifically, I guess Sphinx would yell at us if we changed the end line of the description so there was no match, so this seems great as-is.

tonyandrewmeyer added a commit to tonyandrewmeyer/operator that referenced this pull request Jun 8, 2026
Per review feedback, exclude docs/tutorial/ from ruff entirely (the
tutorial will be migrated to literalinclude separately in canonical#2544) and
drop the second 'quote-style = preserve' ruff format pass. The
remaining docs now use single quotes consistently with the rest of the
project.

Also add docs/ruff.toml with line-length = 80 so code snippets in the
docs wrap at a width that doesn't require horizontal scrolling when
rendered.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@tonyandrewmeyer
tonyandrewmeyer force-pushed the tutorial-pull-from-files branch from d85517a to ea9b041 Compare September 2, 2026 01:12
Replace hardcoded code fences in the tutorial pages with Sphinx
literalinclude directives that pull from the matching example charms
in examples/. This keeps the tutorial automatically in sync with the
canonical source, and removes ~750 lines of duplicated code.

Strategy per snippet type:
- Full method or class: :pyobject: Class.method
- Single line or small fragment: :start-at:/:end-at: patterns on the
  line content (no marker comments needed in sources)
- Multi-line block: :start-at:/:end-before: patterns anchored on the
  next section
- Full file (skipping copyright header): :start-at: with the first
  real line

Intermediate states that don't exist in examples/ (e.g. the empty
starting charm class, lines shown only to be removed, contrastive
"don't do this" snippets, and a troubleshooting timeout hint) are
left inline.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@tonyandrewmeyer
tonyandrewmeyer force-pushed the tutorial-pull-from-files branch from ea9b041 to 5a173ed Compare September 2, 2026 01:16
@tonyandrewmeyer
tonyandrewmeyer marked this pull request as ready for review September 2, 2026 01:16

@james-garner-canonical james-garner-canonical left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't checked every example, but I really like this direction.

I assume that if a matching anchor isn't found, the docs build complains loudly, so this should be far less prone to drift that before.

I have one non-blocking concern that may be worth addressing at this point: the maximum line length we use in the charm code can lead to long lines that require horizontal scrolling in the docs -- previously we would have reformatted them manually in the docs to avoid this. Should we use a shorter maximum line length for the examples now that we're using them this way? Does this have implication for the profiles -- I think it would be fine if this was one of our divergences from the profiles, but maybe it would make the tutorial harder to follow, in which case maybe we just live with the horizontal scrolling ...

Comment on lines +131 to +132
:start-at: framework.observe(self.on["demo-server"]
:end-at: framework.observe(self.on["demo-server"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This line is too long and requires scrolling in the docs. I wonder if we should adopt a lower line length for the example charms now that we're using them this way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants