mkdocs-roadmap 1.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mkdocs_roadmap-1.3.1/MANIFEST.in +3 -0
- mkdocs_roadmap-1.3.1/PKG-INFO +147 -0
- mkdocs_roadmap-1.3.1/README.md +122 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap/__init__.py +153 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap/roadmap.advanced.md.j2 +78 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/PKG-INFO +147 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/SOURCES.txt +12 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/dependency_links.txt +1 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/entry_points.txt +2 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/requires.txt +3 -0
- mkdocs_roadmap-1.3.1/mkdocs_roadmap.egg-info/top_level.txt +1 -0
- mkdocs_roadmap-1.3.1/pyproject.toml +48 -0
- mkdocs_roadmap-1.3.1/setup.cfg +4 -0
- mkdocs_roadmap-1.3.1/setup.py +40 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mkdocs-roadmap
|
|
3
|
+
Version: 1.3.1
|
|
4
|
+
Summary: MkDocs plugin for rendering roadmap.yml files to roadmap.md files
|
|
5
|
+
Home-page: https://github.com/SierraSoftworks/roadmap
|
|
6
|
+
Author: SierraSoftworks
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Requires-Python: >=3.7
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: mkdocs>=1.0
|
|
21
|
+
Requires-Dist: jinja2>=2.10
|
|
22
|
+
Requires-Dist: pyyaml>=5.1
|
|
23
|
+
Dynamic: home-page
|
|
24
|
+
Dynamic: requires-python
|
|
25
|
+
|
|
26
|
+
# MkDocs Roadmap Plugin
|
|
27
|
+
|
|
28
|
+
The MkDocs Roadmap plugin allows you to define `roadmap.yml` files in your MkDocs project and automatically generate corresponding `roadmap.md` files during the build process. This plugin uses Jinja2 templates based on the advanced roadmap template to render beautiful, styled roadmap documentation.
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
Install the plugin using pip:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install mkdocs-roadmap
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Or install from source:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cd tools/mkdocs-roadmap
|
|
42
|
+
pip install .
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Configuration
|
|
48
|
+
|
|
49
|
+
Add the plugin to your `mkdocs.yml` configuration file:
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
plugins:
|
|
53
|
+
- roadmap:
|
|
54
|
+
roadmaps:
|
|
55
|
+
- path/to/roadmap.yml
|
|
56
|
+
- another/path/to/roadmap.yml
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The `roadmaps` configuration option is a list of paths to `roadmap.yml` files relative to your `docs_dir`. The plugin will:
|
|
60
|
+
|
|
61
|
+
1. Read each `roadmap.yml` file
|
|
62
|
+
2. Render it using the Jinja2 template
|
|
63
|
+
3. Generate a corresponding `roadmap.md` file in the same location (replacing `.yml` or `.yaml` with `.md`)
|
|
64
|
+
|
|
65
|
+
### Example
|
|
66
|
+
|
|
67
|
+
If you have a `roadmap.yml` file at `docs/roadmap.yml`, configure it like this:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
plugins:
|
|
71
|
+
- roadmap:
|
|
72
|
+
roadmaps:
|
|
73
|
+
- roadmap.yml
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This will generate `docs/roadmap.md` during the build process, which you can then reference in your `nav` configuration:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
nav:
|
|
80
|
+
- Home: index.md
|
|
81
|
+
- Roadmap: roadmap.md
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Roadmap File Format
|
|
85
|
+
|
|
86
|
+
The plugin expects roadmap files to follow the roadmap schema. See the main [roadmap documentation](https://roadmap.sierrasoftworks.com/) for details on the schema.
|
|
87
|
+
|
|
88
|
+
Example `roadmap.yml`:
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
title: Example Road Map
|
|
92
|
+
description: |
|
|
93
|
+
This is an example of what a road map might look like.
|
|
94
|
+
|
|
95
|
+
authors:
|
|
96
|
+
- name: Benjamin Pannell
|
|
97
|
+
email: contact@sierrasoftworks.com
|
|
98
|
+
|
|
99
|
+
timeline:
|
|
100
|
+
- date: 2021-04-21
|
|
101
|
+
title: Project Start
|
|
102
|
+
description: This is when we will start working on the project, get the team ready!
|
|
103
|
+
|
|
104
|
+
objectives:
|
|
105
|
+
- title: Market Dominance
|
|
106
|
+
description: |
|
|
107
|
+
Provide actionable analytics drawn from big data to improve our brand identity in
|
|
108
|
+
the advertainment sector, maximizing clickbait and establishing ourselves as a disruptor
|
|
109
|
+
in this industry.
|
|
110
|
+
|
|
111
|
+
milestones:
|
|
112
|
+
- id: team
|
|
113
|
+
title: Build the Team
|
|
114
|
+
description: We don't yet have anyone, that's not gonna work...
|
|
115
|
+
deliverables:
|
|
116
|
+
- title: Team Lead
|
|
117
|
+
state: TODO
|
|
118
|
+
requirement: MUST
|
|
119
|
+
description: This person needs to know enough about this domain to be able to run with the project.
|
|
120
|
+
|
|
121
|
+
- title: Senior Engineer 1
|
|
122
|
+
- title: Intern 1..50
|
|
123
|
+
description: This should be cheaper than hiring a proper team (right?).
|
|
124
|
+
|
|
125
|
+
- id: done
|
|
126
|
+
title: Finish the Project
|
|
127
|
+
description: We don't need other milestones, do we?
|
|
128
|
+
dependencies:
|
|
129
|
+
- team
|
|
130
|
+
deliverables:
|
|
131
|
+
- title: MVP
|
|
132
|
+
description: Who needs a polished product? Let's just ship the MVP and call it done.
|
|
133
|
+
- title: Marketing
|
|
134
|
+
- title: VC Funding
|
|
135
|
+
- title: Yacht
|
|
136
|
+
reference: https://lmgtfy.app/?q=yacht&t=i
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Development
|
|
140
|
+
|
|
141
|
+
To develop or modify the plugin:
|
|
142
|
+
|
|
143
|
+
1. Clone the repository
|
|
144
|
+
2. Navigate to `tools/mkdocs-roadmap`
|
|
145
|
+
3. Install in development mode: `pip install -e .`
|
|
146
|
+
4. Make your changes
|
|
147
|
+
5. Test with your MkDocs project
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# MkDocs Roadmap Plugin
|
|
2
|
+
|
|
3
|
+
The MkDocs Roadmap plugin allows you to define `roadmap.yml` files in your MkDocs project and automatically generate corresponding `roadmap.md` files during the build process. This plugin uses Jinja2 templates based on the advanced roadmap template to render beautiful, styled roadmap documentation.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Install the plugin using pip:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install mkdocs-roadmap
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or install from source:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
cd tools/mkdocs-roadmap
|
|
17
|
+
pip install .
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
### Configuration
|
|
23
|
+
|
|
24
|
+
Add the plugin to your `mkdocs.yml` configuration file:
|
|
25
|
+
|
|
26
|
+
```yaml
|
|
27
|
+
plugins:
|
|
28
|
+
- roadmap:
|
|
29
|
+
roadmaps:
|
|
30
|
+
- path/to/roadmap.yml
|
|
31
|
+
- another/path/to/roadmap.yml
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
The `roadmaps` configuration option is a list of paths to `roadmap.yml` files relative to your `docs_dir`. The plugin will:
|
|
35
|
+
|
|
36
|
+
1. Read each `roadmap.yml` file
|
|
37
|
+
2. Render it using the Jinja2 template
|
|
38
|
+
3. Generate a corresponding `roadmap.md` file in the same location (replacing `.yml` or `.yaml` with `.md`)
|
|
39
|
+
|
|
40
|
+
### Example
|
|
41
|
+
|
|
42
|
+
If you have a `roadmap.yml` file at `docs/roadmap.yml`, configure it like this:
|
|
43
|
+
|
|
44
|
+
```yaml
|
|
45
|
+
plugins:
|
|
46
|
+
- roadmap:
|
|
47
|
+
roadmaps:
|
|
48
|
+
- roadmap.yml
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This will generate `docs/roadmap.md` during the build process, which you can then reference in your `nav` configuration:
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
nav:
|
|
55
|
+
- Home: index.md
|
|
56
|
+
- Roadmap: roadmap.md
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Roadmap File Format
|
|
60
|
+
|
|
61
|
+
The plugin expects roadmap files to follow the roadmap schema. See the main [roadmap documentation](https://roadmap.sierrasoftworks.com/) for details on the schema.
|
|
62
|
+
|
|
63
|
+
Example `roadmap.yml`:
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
title: Example Road Map
|
|
67
|
+
description: |
|
|
68
|
+
This is an example of what a road map might look like.
|
|
69
|
+
|
|
70
|
+
authors:
|
|
71
|
+
- name: Benjamin Pannell
|
|
72
|
+
email: contact@sierrasoftworks.com
|
|
73
|
+
|
|
74
|
+
timeline:
|
|
75
|
+
- date: 2021-04-21
|
|
76
|
+
title: Project Start
|
|
77
|
+
description: This is when we will start working on the project, get the team ready!
|
|
78
|
+
|
|
79
|
+
objectives:
|
|
80
|
+
- title: Market Dominance
|
|
81
|
+
description: |
|
|
82
|
+
Provide actionable analytics drawn from big data to improve our brand identity in
|
|
83
|
+
the advertainment sector, maximizing clickbait and establishing ourselves as a disruptor
|
|
84
|
+
in this industry.
|
|
85
|
+
|
|
86
|
+
milestones:
|
|
87
|
+
- id: team
|
|
88
|
+
title: Build the Team
|
|
89
|
+
description: We don't yet have anyone, that's not gonna work...
|
|
90
|
+
deliverables:
|
|
91
|
+
- title: Team Lead
|
|
92
|
+
state: TODO
|
|
93
|
+
requirement: MUST
|
|
94
|
+
description: This person needs to know enough about this domain to be able to run with the project.
|
|
95
|
+
|
|
96
|
+
- title: Senior Engineer 1
|
|
97
|
+
- title: Intern 1..50
|
|
98
|
+
description: This should be cheaper than hiring a proper team (right?).
|
|
99
|
+
|
|
100
|
+
- id: done
|
|
101
|
+
title: Finish the Project
|
|
102
|
+
description: We don't need other milestones, do we?
|
|
103
|
+
dependencies:
|
|
104
|
+
- team
|
|
105
|
+
deliverables:
|
|
106
|
+
- title: MVP
|
|
107
|
+
description: Who needs a polished product? Let's just ship the MVP and call it done.
|
|
108
|
+
- title: Marketing
|
|
109
|
+
- title: VC Funding
|
|
110
|
+
- title: Yacht
|
|
111
|
+
reference: https://lmgtfy.app/?q=yacht&t=i
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Development
|
|
115
|
+
|
|
116
|
+
To develop or modify the plugin:
|
|
117
|
+
|
|
118
|
+
1. Clone the repository
|
|
119
|
+
2. Navigate to `tools/mkdocs-roadmap`
|
|
120
|
+
3. Install in development mode: `pip install -e .`
|
|
121
|
+
4. Make your changes
|
|
122
|
+
5. Test with your MkDocs project
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MkDocs plugin for rendering roadmap.yml files to roadmap.md files.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from mkdocs.plugins import BasePlugin
|
|
6
|
+
from mkdocs.config import config_options
|
|
7
|
+
from mkdocs.config.base import Config
|
|
8
|
+
import os
|
|
9
|
+
import yaml
|
|
10
|
+
import jinja2
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Dict, Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def state_color(state: str) -> str:
|
|
16
|
+
"""Convert state to color."""
|
|
17
|
+
colors = {
|
|
18
|
+
"TODO": "#aaa",
|
|
19
|
+
"DOING": "#63B2EB",
|
|
20
|
+
"DONE": "#3EAF7C",
|
|
21
|
+
"SKIP": "#F65BD2",
|
|
22
|
+
}
|
|
23
|
+
return colors.get(state, "#aaa")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def requirement_color(requirement: str) -> str:
|
|
27
|
+
"""Convert requirement to color."""
|
|
28
|
+
colors = {
|
|
29
|
+
"MUST": "#E06446",
|
|
30
|
+
"SHOULD": "#E0AF2F",
|
|
31
|
+
"MAY": "#3ABDE0",
|
|
32
|
+
}
|
|
33
|
+
return colors.get(requirement, "#888")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def date_format(date_value) -> str:
|
|
37
|
+
"""Format date to YYYY-MM-DD format."""
|
|
38
|
+
from datetime import datetime, date
|
|
39
|
+
|
|
40
|
+
if isinstance(date_value, (datetime, date)):
|
|
41
|
+
return date_value.strftime("%Y-%m-%d")
|
|
42
|
+
elif isinstance(date_value, str):
|
|
43
|
+
# Try to parse common date formats
|
|
44
|
+
try:
|
|
45
|
+
# Try ISO format first
|
|
46
|
+
dt = datetime.fromisoformat(date_value.replace('Z', '+00:00'))
|
|
47
|
+
return dt.strftime("%Y-%m-%d")
|
|
48
|
+
except ValueError:
|
|
49
|
+
# If that fails, try other common formats
|
|
50
|
+
for fmt in ["%Y-%m-%d", "%Y/%m/%d", "%d/%m/%Y"]:
|
|
51
|
+
try:
|
|
52
|
+
dt = datetime.strptime(date_value, fmt)
|
|
53
|
+
return dt.strftime("%Y-%m-%d")
|
|
54
|
+
except ValueError:
|
|
55
|
+
continue
|
|
56
|
+
return str(date_value)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class RoadmapPlugin(BasePlugin):
|
|
60
|
+
"""MkDocs plugin for rendering roadmap.yml files."""
|
|
61
|
+
|
|
62
|
+
config_scheme = (
|
|
63
|
+
('roadmaps', config_options.Type(list, default=[])),
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def __init__(self):
|
|
67
|
+
super().__init__()
|
|
68
|
+
self.template = None
|
|
69
|
+
|
|
70
|
+
def on_config(self, config: Config, **kwargs) -> Config:
|
|
71
|
+
"""Load the Jinja2 template when config is loaded."""
|
|
72
|
+
template_path = Path(__file__).parent / "roadmap.advanced.md.j2"
|
|
73
|
+
with open(template_path, 'r') as f:
|
|
74
|
+
template_content = f.read()
|
|
75
|
+
|
|
76
|
+
# Create Jinja2 environment with custom filters
|
|
77
|
+
env = jinja2.Environment(
|
|
78
|
+
loader=jinja2.DictLoader({'roadmap': template_content}),
|
|
79
|
+
autoescape=False
|
|
80
|
+
)
|
|
81
|
+
env.filters['state_color'] = state_color
|
|
82
|
+
env.filters['requirement_color'] = requirement_color
|
|
83
|
+
env.filters['date_format'] = date_format
|
|
84
|
+
|
|
85
|
+
self.template = env.get_template('roadmap')
|
|
86
|
+
return config
|
|
87
|
+
|
|
88
|
+
def on_files(self, files, config: Config, **kwargs):
|
|
89
|
+
"""Process roadmap.yml files and generate .md files."""
|
|
90
|
+
docs_dir = Path(config['docs_dir'])
|
|
91
|
+
|
|
92
|
+
# Get roadmap files from config
|
|
93
|
+
roadmap_files = self.config.get('roadmaps', [])
|
|
94
|
+
|
|
95
|
+
for roadmap_file in roadmap_files:
|
|
96
|
+
roadmap_path = docs_dir / roadmap_file
|
|
97
|
+
|
|
98
|
+
if not roadmap_path.exists():
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
# Read and parse YAML
|
|
102
|
+
with open(roadmap_path, 'r') as f:
|
|
103
|
+
roadmap_data = yaml.safe_load(f)
|
|
104
|
+
|
|
105
|
+
# Handle empty or invalid YAML
|
|
106
|
+
if roadmap_data is None:
|
|
107
|
+
roadmap_data = {}
|
|
108
|
+
|
|
109
|
+
# Ensure defaults are set
|
|
110
|
+
roadmap_data.setdefault('authors', [])
|
|
111
|
+
roadmap_data.setdefault('timeline', [])
|
|
112
|
+
roadmap_data.setdefault('objectives', [])
|
|
113
|
+
roadmap_data.setdefault('milestones', [])
|
|
114
|
+
roadmap_data.setdefault('title', 'Roadmap')
|
|
115
|
+
roadmap_data.setdefault('description', '')
|
|
116
|
+
|
|
117
|
+
# Set defaults for deliverables
|
|
118
|
+
for milestone in roadmap_data.get('milestones', []):
|
|
119
|
+
for deliverable in milestone.get('deliverables', []):
|
|
120
|
+
if 'requirement' not in deliverable:
|
|
121
|
+
deliverable['requirement'] = 'SHOULD'
|
|
122
|
+
if 'state' not in deliverable:
|
|
123
|
+
deliverable['state'] = 'TODO'
|
|
124
|
+
|
|
125
|
+
# Render template - pass roadmap_data as root context to match Go template structure
|
|
126
|
+
rendered = self.template.render(**roadmap_data)
|
|
127
|
+
|
|
128
|
+
# Determine output path (replace .yml/.yaml with .md)
|
|
129
|
+
output_path = roadmap_path.with_suffix('.md')
|
|
130
|
+
|
|
131
|
+
# Write output
|
|
132
|
+
with open(output_path, 'w') as f:
|
|
133
|
+
f.write(rendered)
|
|
134
|
+
|
|
135
|
+
# Add the generated .md file to MkDocs files if it doesn't exist
|
|
136
|
+
rel_path = str(output_path.relative_to(docs_dir))
|
|
137
|
+
# Normalize path separators for cross-platform compatibility
|
|
138
|
+
rel_path = rel_path.replace('\\', '/')
|
|
139
|
+
|
|
140
|
+
# Check if file already exists in files list
|
|
141
|
+
existing_files = [f.src_path for f in files]
|
|
142
|
+
if rel_path not in existing_files:
|
|
143
|
+
from mkdocs.structure.files import File
|
|
144
|
+
file_obj = File(
|
|
145
|
+
path=rel_path,
|
|
146
|
+
src_dir=str(docs_dir),
|
|
147
|
+
dest_dir=config['site_dir'],
|
|
148
|
+
use_directory_urls=config['use_directory_urls']
|
|
149
|
+
)
|
|
150
|
+
files.append(file_obj)
|
|
151
|
+
|
|
152
|
+
return files
|
|
153
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# {{ title }}
|
|
2
|
+
|
|
3
|
+
{% if authors %}
|
|
4
|
+
<div style="display: flex; flex-direction: row; background: rgba(200, 200, 200, 0.15); padding: 1rem; border-radius: 6px; margin-bottom: 2rem;">
|
|
5
|
+
<div style="vertical-align: middle; font-size: 0.7rem; line-height: 1.8rem; opacity: 0.6;">Authored by</div>
|
|
6
|
+
{% for author in authors %}
|
|
7
|
+
<div style="margin-left: 1rem; padding-left: 1rem; border-left: 1px solid rbga(200, 200, 200, 0.5);">
|
|
8
|
+
<h5 style="font-size: 0.8rem; margin: 0;">{{ author.name }}</h5>
|
|
9
|
+
{% if author.contact %}<p style="font-size: 0.6rem; margin: 0;">{{ author.contact }}</p>{% endif %}
|
|
10
|
+
</div>
|
|
11
|
+
{% endfor %}
|
|
12
|
+
</div>
|
|
13
|
+
{% endif %}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
{% if description %}{{ description }}{% endif %}
|
|
17
|
+
|
|
18
|
+
{% if timeline %}
|
|
19
|
+
## Important Dates
|
|
20
|
+
|
|
21
|
+
<div style="border-left: 4px solid gray; border-radius: 0 4px 4px 0; background: rgba(200, 200, 200, 0.15); margin: 2rem auto; padding: 1rem 2rem; position: relative; text-align: center; margin-left: 7rem;">
|
|
22
|
+
{% for entry in timeline %}
|
|
23
|
+
<div style="text-align: left; position: relative; padding-bottom: 1rem; margin-bottom: 1rem;">
|
|
24
|
+
<div style="position: absolute; left: -10rem; text-align: right; font-size: 0.9rem; font-weight: 700; opacity: 0.7; min-width: 6rem; top: 2px;">{{ entry.date | date_format }}</div>
|
|
25
|
+
|
|
26
|
+
<h3>{{ entry.title }}</h3>
|
|
27
|
+
{% if entry.description %}{{ entry.description }}{% endif %}
|
|
28
|
+
|
|
29
|
+
<div style="position: absolute; box-shadow: 0 0 0 4px gray; left: -2.5rem; background: #444; border-radius: 50%; height: 11px; width: 11px; top: 5px;"></div>
|
|
30
|
+
</div>
|
|
31
|
+
{% endfor %}
|
|
32
|
+
</div>
|
|
33
|
+
{% endif %}
|
|
34
|
+
|
|
35
|
+
{% if objectives %}
|
|
36
|
+
## Objectives
|
|
37
|
+
{% for objective in objectives %}
|
|
38
|
+
### {{ objective.title }}
|
|
39
|
+
{% if objective.description %}{{ objective.description }}{% endif %}
|
|
40
|
+
|
|
41
|
+
{% endfor %}
|
|
42
|
+
{% endif %}
|
|
43
|
+
|
|
44
|
+
{% if milestones %}
|
|
45
|
+
## Milestones
|
|
46
|
+
|
|
47
|
+
<div style="border-left: 4px solid gray; border-radius: 0 4px 4px 0; background: rgba(200, 200, 200, 0.15); margin: 2rem auto; padding: 1rem 2rem; position: relative; text-align: center; margin-left: 7rem;">
|
|
48
|
+
{% for milestone in milestones %}
|
|
49
|
+
<div style="text-align: left; position: relative; padding-bottom: 1rem; margin-bottom: 1rem;">
|
|
50
|
+
<div style="position: absolute; left: -10rem; text-align: right; font-size: 0.9rem; font-weight: 700; opacity: 0.7; min-width: 6rem; top: 2px;">M{{ loop.index }}</div>
|
|
51
|
+
|
|
52
|
+
<h3>{{ milestone.title }}</h3>
|
|
53
|
+
{% if milestone.description %}{{ milestone.description }}{% endif %}
|
|
54
|
+
|
|
55
|
+
{% if milestone.deliverables %}
|
|
56
|
+
{% for deliverable in milestone.deliverables %}
|
|
57
|
+
<div style="position: relative; border-radius: 4px; box-shadow: 2px 2px 10px rgba(0,0,0,0.3); background-color: rgba(0, 0, 0, 0.1); padding: 10px; 20px; margin: 2rem 0; padding-left: 20px;">
|
|
58
|
+
<div style="position: absolute; top: 0; left: 0; bottom: 0; width: 8px; border-radius: 4px 0 0 4px; background-color: {{ deliverable.state | default('TODO') | state_color }}"></div>
|
|
59
|
+
<h4 style="margin-top: 0">
|
|
60
|
+
<span style="float: right; margin: 0;">{{ deliverable.state | default('TODO') }}</span>
|
|
61
|
+
|
|
62
|
+
{{ deliverable.title }}
|
|
63
|
+
{% if deliverable.requirement %}<span style="display: inline; font-size: 90%; padding: 3px 5px; border-radius: 4px; background-color: {{ deliverable.requirement | requirement_color }}; color: white; margin: 0 2px;"> {{ deliverable.requirement }}</span>{% endif %}
|
|
64
|
+
</h4>
|
|
65
|
+
|
|
66
|
+
{% if deliverable.description %}{{ deliverable.description }}{% endif %}
|
|
67
|
+
|
|
68
|
+
{% if deliverable.reference %}[Read more →]({{ deliverable.reference }}){% endif %}
|
|
69
|
+
</div>
|
|
70
|
+
{% endfor %}
|
|
71
|
+
{% endif %}
|
|
72
|
+
|
|
73
|
+
<div style="position: absolute; box-shadow: 0 0 0 4px gray; left: -2.5rem; background: #444; border-radius: 50%; height: 11px; width: 11px; top: 5px;"></div>
|
|
74
|
+
</div>
|
|
75
|
+
{% endfor %}
|
|
76
|
+
</div>
|
|
77
|
+
{% endif %}
|
|
78
|
+
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mkdocs-roadmap
|
|
3
|
+
Version: 1.3.1
|
|
4
|
+
Summary: MkDocs plugin for rendering roadmap.yml files to roadmap.md files
|
|
5
|
+
Home-page: https://github.com/SierraSoftworks/roadmap
|
|
6
|
+
Author: SierraSoftworks
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: Operating System :: OS Independent
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
18
|
+
Requires-Python: >=3.7
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: mkdocs>=1.0
|
|
21
|
+
Requires-Dist: jinja2>=2.10
|
|
22
|
+
Requires-Dist: pyyaml>=5.1
|
|
23
|
+
Dynamic: home-page
|
|
24
|
+
Dynamic: requires-python
|
|
25
|
+
|
|
26
|
+
# MkDocs Roadmap Plugin
|
|
27
|
+
|
|
28
|
+
The MkDocs Roadmap plugin allows you to define `roadmap.yml` files in your MkDocs project and automatically generate corresponding `roadmap.md` files during the build process. This plugin uses Jinja2 templates based on the advanced roadmap template to render beautiful, styled roadmap documentation.
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
Install the plugin using pip:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install mkdocs-roadmap
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Or install from source:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
cd tools/mkdocs-roadmap
|
|
42
|
+
pip install .
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Usage
|
|
46
|
+
|
|
47
|
+
### Configuration
|
|
48
|
+
|
|
49
|
+
Add the plugin to your `mkdocs.yml` configuration file:
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
plugins:
|
|
53
|
+
- roadmap:
|
|
54
|
+
roadmaps:
|
|
55
|
+
- path/to/roadmap.yml
|
|
56
|
+
- another/path/to/roadmap.yml
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The `roadmaps` configuration option is a list of paths to `roadmap.yml` files relative to your `docs_dir`. The plugin will:
|
|
60
|
+
|
|
61
|
+
1. Read each `roadmap.yml` file
|
|
62
|
+
2. Render it using the Jinja2 template
|
|
63
|
+
3. Generate a corresponding `roadmap.md` file in the same location (replacing `.yml` or `.yaml` with `.md`)
|
|
64
|
+
|
|
65
|
+
### Example
|
|
66
|
+
|
|
67
|
+
If you have a `roadmap.yml` file at `docs/roadmap.yml`, configure it like this:
|
|
68
|
+
|
|
69
|
+
```yaml
|
|
70
|
+
plugins:
|
|
71
|
+
- roadmap:
|
|
72
|
+
roadmaps:
|
|
73
|
+
- roadmap.yml
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This will generate `docs/roadmap.md` during the build process, which you can then reference in your `nav` configuration:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
nav:
|
|
80
|
+
- Home: index.md
|
|
81
|
+
- Roadmap: roadmap.md
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### Roadmap File Format
|
|
85
|
+
|
|
86
|
+
The plugin expects roadmap files to follow the roadmap schema. See the main [roadmap documentation](https://roadmap.sierrasoftworks.com/) for details on the schema.
|
|
87
|
+
|
|
88
|
+
Example `roadmap.yml`:
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
title: Example Road Map
|
|
92
|
+
description: |
|
|
93
|
+
This is an example of what a road map might look like.
|
|
94
|
+
|
|
95
|
+
authors:
|
|
96
|
+
- name: Benjamin Pannell
|
|
97
|
+
email: contact@sierrasoftworks.com
|
|
98
|
+
|
|
99
|
+
timeline:
|
|
100
|
+
- date: 2021-04-21
|
|
101
|
+
title: Project Start
|
|
102
|
+
description: This is when we will start working on the project, get the team ready!
|
|
103
|
+
|
|
104
|
+
objectives:
|
|
105
|
+
- title: Market Dominance
|
|
106
|
+
description: |
|
|
107
|
+
Provide actionable analytics drawn from big data to improve our brand identity in
|
|
108
|
+
the advertainment sector, maximizing clickbait and establishing ourselves as a disruptor
|
|
109
|
+
in this industry.
|
|
110
|
+
|
|
111
|
+
milestones:
|
|
112
|
+
- id: team
|
|
113
|
+
title: Build the Team
|
|
114
|
+
description: We don't yet have anyone, that's not gonna work...
|
|
115
|
+
deliverables:
|
|
116
|
+
- title: Team Lead
|
|
117
|
+
state: TODO
|
|
118
|
+
requirement: MUST
|
|
119
|
+
description: This person needs to know enough about this domain to be able to run with the project.
|
|
120
|
+
|
|
121
|
+
- title: Senior Engineer 1
|
|
122
|
+
- title: Intern 1..50
|
|
123
|
+
description: This should be cheaper than hiring a proper team (right?).
|
|
124
|
+
|
|
125
|
+
- id: done
|
|
126
|
+
title: Finish the Project
|
|
127
|
+
description: We don't need other milestones, do we?
|
|
128
|
+
dependencies:
|
|
129
|
+
- team
|
|
130
|
+
deliverables:
|
|
131
|
+
- title: MVP
|
|
132
|
+
description: Who needs a polished product? Let's just ship the MVP and call it done.
|
|
133
|
+
- title: Marketing
|
|
134
|
+
- title: VC Funding
|
|
135
|
+
- title: Yacht
|
|
136
|
+
reference: https://lmgtfy.app/?q=yacht&t=i
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Development
|
|
140
|
+
|
|
141
|
+
To develop or modify the plugin:
|
|
142
|
+
|
|
143
|
+
1. Clone the repository
|
|
144
|
+
2. Navigate to `tools/mkdocs-roadmap`
|
|
145
|
+
3. Install in development mode: `pip install -e .`
|
|
146
|
+
4. Make your changes
|
|
147
|
+
5. Test with your MkDocs project
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
MANIFEST.in
|
|
2
|
+
README.md
|
|
3
|
+
pyproject.toml
|
|
4
|
+
setup.py
|
|
5
|
+
mkdocs_roadmap/__init__.py
|
|
6
|
+
mkdocs_roadmap/roadmap.advanced.md.j2
|
|
7
|
+
mkdocs_roadmap.egg-info/PKG-INFO
|
|
8
|
+
mkdocs_roadmap.egg-info/SOURCES.txt
|
|
9
|
+
mkdocs_roadmap.egg-info/dependency_links.txt
|
|
10
|
+
mkdocs_roadmap.egg-info/entry_points.txt
|
|
11
|
+
mkdocs_roadmap.egg-info/requires.txt
|
|
12
|
+
mkdocs_roadmap.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
mkdocs_roadmap
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=45", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "mkdocs-roadmap"
|
|
7
|
+
version = "1.3.1"
|
|
8
|
+
description = "MkDocs plugin for rendering roadmap.yml files to roadmap.md files"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.9"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
authors = [
|
|
13
|
+
{name = "SierraSoftworks"}
|
|
14
|
+
]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Operating System :: OS Independent",
|
|
19
|
+
"Programming Language :: Python :: 3",
|
|
20
|
+
"Programming Language :: Python :: 3.9",
|
|
21
|
+
"Programming Language :: Python :: 3.10",
|
|
22
|
+
"Programming Language :: Python :: 3.11",
|
|
23
|
+
"Programming Language :: Python :: 3.12",
|
|
24
|
+
"Programming Language :: Python :: 3.13",
|
|
25
|
+
"Programming Language :: Python :: 3.14",
|
|
26
|
+
]
|
|
27
|
+
dependencies = [
|
|
28
|
+
"mkdocs>=1.0",
|
|
29
|
+
"jinja2>=2.10",
|
|
30
|
+
"pyyaml>=5.1",
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
[dependency-groups]
|
|
34
|
+
dev = [
|
|
35
|
+
"mkdocs>=1.0",
|
|
36
|
+
"jinja2>=2.10",
|
|
37
|
+
"pyyaml>=5.1",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.entry-points."mkdocs.plugins"]
|
|
41
|
+
roadmap = "mkdocs_roadmap:RoadmapPlugin"
|
|
42
|
+
|
|
43
|
+
[tool.setuptools]
|
|
44
|
+
packages = ["mkdocs_roadmap"]
|
|
45
|
+
|
|
46
|
+
[tool.setuptools.package-data]
|
|
47
|
+
mkdocs_roadmap = ["roadmap.advanced.md.j2"]
|
|
48
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Setup script for mkdocs-roadmap plugin."""
|
|
2
|
+
|
|
3
|
+
from setuptools import setup, find_packages
|
|
4
|
+
|
|
5
|
+
with open("README.md", "r", encoding="utf-8") as fh:
|
|
6
|
+
long_description = fh.read()
|
|
7
|
+
|
|
8
|
+
setup(
|
|
9
|
+
name="mkdocs-roadmap",
|
|
10
|
+
version="1.3.1",
|
|
11
|
+
author="SierraSoftworks",
|
|
12
|
+
description="MkDocs plugin for rendering roadmap.yml files to roadmap.md files",
|
|
13
|
+
long_description=long_description,
|
|
14
|
+
long_description_content_type="text/markdown",
|
|
15
|
+
url="https://github.com/SierraSoftworks/roadmap",
|
|
16
|
+
packages=find_packages(),
|
|
17
|
+
include_package_data=True,
|
|
18
|
+
package_data={
|
|
19
|
+
'mkdocs_roadmap': ['roadmap.advanced.md.j2'],
|
|
20
|
+
},
|
|
21
|
+
classifiers=[
|
|
22
|
+
"Development Status :: 3 - Alpha",
|
|
23
|
+
"Intended Audience :: Developers",
|
|
24
|
+
"Operating System :: OS Independent",
|
|
25
|
+
"Programming Language :: Python :: 3",
|
|
26
|
+
"Programming Language :: Python :: 3.9",
|
|
27
|
+
"Programming Language :: Python :: 3.10",
|
|
28
|
+
"Programming Language :: Python :: 3.11",
|
|
29
|
+
"Programming Language :: Python :: 3.12",
|
|
30
|
+
"Programming Language :: Python :: 3.13",
|
|
31
|
+
"Programming Language :: Python :: 3.14",
|
|
32
|
+
],
|
|
33
|
+
python_requires=">=3.7",
|
|
34
|
+
# Dependencies are defined in pyproject.toml to avoid duplication
|
|
35
|
+
entry_points={
|
|
36
|
+
"mkdocs.plugins": [
|
|
37
|
+
"roadmap = mkdocs_roadmap:RoadmapPlugin",
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
)
|