Roadmap is a Python package that helps to analyze and visualize team's agile software development process. It provides insights into delivery performance and aims at creating more realistic roadmaps by leveraging the team historical performance.
$ pip install rmpfromrmp.backendimportBackendfromrmp.jiraimportJiraCloudConnectorimportos# For data storage, configure SQLAlchemy compatible URLos.environ['SQLALCHEMY_URL'] ='sqlite:///my_db.sqlite'# Create instance of backendbackend=Backend()
# Load databackend.add_connector(
JiraCloudConnector,
name='Jira Loader',
domain='example',
username='john.doe@example.com',
api_token='API_TOKEN',
jql='project = SPACE',
board_id=42
)
backend.load_data()fromsqlalchemyimportcreate_enginefromrmp.flow_metricsimportFlowMetrics, Workflow, FilterKwArgsfromdatetimeimportdatetime, timezone# Create engine for data accessengine=create_engine(f"sqlite:///my_db.sqlite", echo=False)
# Configure workflow stagesworkflow=Workflow(
not_started=['To Do'],
in_progress=['In Progress', 'Code review', 'Testing'],
finished=['Done', 'Cancelled'],
)
# Define filtersfilter=FilterKwArgs(
exclude_item_types={"Bug"},
include_hierarchy_levels={0},
exclude_ranges=[
DateTimeRange("2024-12-23", "2025-01-05"), # Christmas period, team offlineDateTimeRange("2025-04-14", "2025-04-21"), # Holy Week, most of the team away
],
as_of=datetime.now(tz=timezone.utc), # Specify to query state at particular time moment
)
# Create instance of FlowMetricsfm=FlowMetrics(engine, workflow)
# Plot cycle time scatter chartfm.plot_cycle_time_scatter(**filter)
# Plot cycle time histogramfm.plot_cycle_time_histogram(**filter)
# Plot aging work in progress chartfm.plot_aging_wip(**filter)
# Plot throughput run chartfm.plot_throughput_run_chart(**filter)
# Plot cumulative flow diagramfm.plot_cfd(**filter)
# Find dates and probabilities to deliver 90 items using Monte Carlo simulationfm.plot_monte_carlo_when_hist(runs=10000, item_count=90, **filter)
# Find how many items can be delivered by date with their probabilities using Monte Carlo simulationtarget_date=datetime.now() +pd.Timedelta(days=30)
fm.plot_monte_carlo_how_many_hist(runs=10000, target_date=target_date, **filter)
# Output finished items and prioritized backlog with 85% confidence forecasted delivery dates df=fm.df_timeline_items(mc_when=True, mc_when_runs=1000, mc_when_percentile=85, **filter)
fm.styled_timeline_items(df) # Returns Styled represenation of timelineSelect Python version using pyenv
pyenv local 3.11.8Install Poetry dependencies
poetry installActivate virtual environment
eval$(poetry env activate)Run tests
pytestCheck code style and format
ruff check
ruff formatRun static type checker
mypy