diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index a01336bf..effe9037 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -13,7 +13,7 @@ repos:
- id: check-merge-conflict
- id: check-yaml
- id: end-of-file-fixer
- exclude: cibuildwheel/resources/pinned_docker_images.cfg
+ exclude: (cibuildwheel/resources/pinned_docker_images.cfg)|(.svg$)
- id: mixed-line-ending
- id: trailing-whitespace
@@ -21,5 +21,5 @@ repos:
rev: v0.782
hooks:
- id: mypy
- files: cibuildwheel/|test/
+ files: ^(cibuildwheel/|test/|bin/projects.py)
pass_filenames: false
diff --git a/README.md b/README.md
index 0b10f302..5166e85f 100644
--- a/README.md
+++ b/README.md
@@ -125,35 +125,136 @@ Options
Working examples
----------------
+
+
Here are some repos that use cibuildwheel.
-- [Matplotlib](https://github.com/matplotlib/matplotlib) - The venerable Matplotlib, a Python library with C++ portions, built for Linux, Mac, and Windows on Github Actions.
-- [pyinstrument_cext](https://github.com/joerick/pyinstrument_cext) - A simple C extension, without external dependencies, built on Travis CI/Appveyor.
-- [websockets](https://github.com/aaugustin/websockets)
-- [Parselmouth](https://github.com/YannickJadoul/Parselmouth) - A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels; all platforms built on Github Actions.
-- [python-admesh](https://github.com/admesh/python-admesh)
-- [pybase64](https://github.com/mayeut/pybase64)
-- [KDEpy](https://github.com/tommyod/KDEpy)
-- [AutoPy](https://github.com/autopilot-rs/autopy)
-- [apriltags2-ethz](https://github.com/safijari/apriltags2_ethz)
-- [TgCrypto](https://github.com/pyrogram/tgcrypto)
-- [twisted-iocpsupport](https://github.com/twisted/twisted-iocpsupport) - A submodule of Twisted that hooks into native C APIs using Cython. Built on Github CI for Windows.
-- [gmic-py](https://github.com/dtschump/gmic-py)
-- [creme](https://github.com/creme-ml/creme)
-- [PyAV](https://github.com/PyAV-Org/PyAV)
-- [aiortc](https://github.com/aiortc/aiortc)
-- [aioquic](https://github.com/aiortc/aioquic)
-- [pikepdf](https://github.com/pikepdf/pikepdf)
-- [fathon](https://github.com/stfbnc/fathon)
-- [etebase-py](https://github.com/etesync/etebase-py) - Python bindings to a Rust library using `setuptools-rust`, and `sccache` for improved speed, built on Travis CI.
-- [xmlstarlet](https://github.com/dimitern/xmlstarlet) - Python 3.6+ CFFI bindings with true MSVC build and GitHub Actions.
-- [bx-python](https://github.com/bxlab/bx-python) - A library that includes Cython extensions, built on Travis CI for Mac and Linux.
-- [coverage.py](https://github.com/nedbat/coveragepy) - The coverage tool for Python.
+
-> Add your repo here! Send a PR.
+
+
+| Name | CI | OS | Notes |
+|-----------------------------------|----|----|:------|
+| [scikit-learn][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The machine learning library. A complex but clean config using many of cibuildwheel's features to build a large project with Cython and C++ extensions. |
+| [Matplotlib][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The venerable Matplotlib, a Python library with C++ portions |
+| [twisted-iocpsupport][] | ![github icon][] | ![windows icon][] | A submodule of Twisted that hooks into native C APIs using Cython. |
+| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
+| [websockets][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Library for building WebSocket servers and clients. Mostly written in Python, with a small C 'speedups' extension module. |
+| [pyzmq][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python bindings for zeromq, the networking library. Uses Cython and CFFI. |
+| [aiortc][] | ![github icon][] | ![apple icon][] ![linux icon][] | WebRTC and ORTC implementation for Python using asyncio. |
+| [h5py][] | ![azurepipelines icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | HDF5 for Python -- The h5py package is a Pythonic interface to the HDF5 binary data format. |
+| [coverage.py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The coverage tool for Python |
+| [River][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | 🌊 Online machine learning in Python |
+| [PyAV][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Pythonic bindings for FFmpeg's libraries. |
+| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data |
+| [aioquic][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | QUIC and HTTP/3 implementation in Python |
+| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
+| [pikepdf][] | ![azurepipelines icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python library for reading and writing PDF, powered by qpdf |
+| [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. |
+| [python-rapidjson][] | ![travisci icon][] ![gitlab icon][] ![appveyor icon][] | ![windows icon][] ![linux icon][] | Python wrapper around rapidjson |
+| [KDEpy][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Kernel Density Estimation in Python |
+| [pybind11 python_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a Python-based build system |
+| [pybind11 cmake_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Example pybind11 module built with a CMake-based build system |
+| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
+| [jq.py][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Python bindings for jq |
+| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
+| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
+| [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python |
+| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
+| [etebase-py][] | ![travisci icon][] | ![linux icon][] | Python bindings to a Rust library using `setuptools-rust`, and `sccache` for improved speed. |
+| [pyjet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The interface between FastJet and NumPy |
+| [numpythia][] | ![github icon][] | ![apple icon][] ![linux icon][] | The interface between PYTHIA and NumPy |
+| [fathon][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | python package for DFA (Detrended Fluctuation Analysis) and related algorithms |
+| [pyinstrument_cext][] | ![travisci icon][] ![appveyor icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A simple C extension, without external dependencies |
+| [xmlstarlet][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python 3.6+ CFFI bindings with true MSVC build. |
+| [pybind11 scikit_build_example][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | An example combining scikit-build and pybind11 |
+
+[scikit-learn]: https://github.com/scikit-learn/scikit-learn
+[Matplotlib]: https://github.com/matplotlib/matplotlib
+[twisted-iocpsupport]: https://github.com/twisted/twisted-iocpsupport
+[scikit-image]: https://github.com/scikit-image/scikit-image
+[websockets]: https://github.com/aaugustin/websockets
+[pyzmq]: https://github.com/zeromq/pyzmq
+[aiortc]: https://github.com/aiortc/aiortc
+[h5py]: https://github.com/h5py/h5py
+[coverage.py]: https://github.com/nedbat/coveragepy
+[River]: https://github.com/online-ml/river
+[PyAV]: https://github.com/PyAV-Org/PyAV
+[google neuroglancer]: https://github.com/google/neuroglancer
+[aioquic]: https://github.com/aiortc/aioquic
+[AutoPy]: https://github.com/autopilot-rs/autopy
+[pikepdf]: https://github.com/pikepdf/pikepdf
+[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
+[python-rapidjson]: https://github.com/python-rapidjson/python-rapidjson
+[KDEpy]: https://github.com/tommyod/KDEpy
+[pybind11 python_example]: https://github.com/pybind/python_example
+[pybind11 cmake_example]: https://github.com/pybind/cmake_example
+[iminuit]: https://github.com/scikit-hep/iminuit
+[jq.py]: https://github.com/mwilliamson/jq.py
+[bx-python]: https://github.com/bxlab/bx-python
+[boost-histogram]: https://github.com/scikit-hep/boost-histogram
+[pybase64]: https://github.com/mayeut/pybase64
+[TgCrypto]: https://github.com/pyrogram/tgcrypto
+[etebase-py]: https://github.com/etesync/etebase-py
+[pyjet]: https://github.com/scikit-hep/pyjet
+[numpythia]: https://github.com/scikit-hep/numpythia
+[fathon]: https://github.com/stfbnc/fathon
+[pyinstrument_cext]: https://github.com/joerick/pyinstrument_cext
+[xmlstarlet]: https://github.com/dimitern/xmlstarlet
+[pybind11 scikit_build_example]: https://github.com/pybind/scikit_build_example
+
+[appveyor icon]: docs/data/readme_icons/appveyor.svg
+[github icon]: docs/data/readme_icons/github.svg
+[azurepipelines icon]: docs/data/readme_icons/azurepipelines.svg
+[circleci icon]: docs/data/readme_icons/circleci.svg
+[gitlab icon]: docs/data/readme_icons/gitlab.svg
+[travisci icon]: docs/data/readme_icons/travisci.svg
+[windows icon]: docs/data/readme_icons/windows.svg
+[apple icon]: docs/data/readme_icons/apple.svg
+[linux icon]: docs/data/readme_icons/linux.svg
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+> Add your repo here! Send a PR, adding your information to `docs/data/projects.yml`.
>
> I'd like to include notes here to indicate why an example might be interesting to cibuildwheel users - the styles/technologies/techniques used in each. Please include that in future additions!
+
+
Legal note
----------
@@ -166,6 +267,8 @@ This is similar to static linking, so it might have some licence implications. C
Changelog
=========
+
+
### 1.7.1
_3 December 2020_
@@ -573,6 +676,8 @@ _31 March 2017_
- 🌟 First public release!
+
+
Contributing
============
diff --git a/bin/projects.py b/bin/projects.py
new file mode 100755
index 00000000..d64977d1
--- /dev/null
+++ b/bin/projects.py
@@ -0,0 +1,198 @@
+#!/usr/bin/env python3
+
+"""
+Convert a yaml project list into a nice table.
+
+Suggested usage:
+
+ ./bin/projects.py docs/data/projects.yml --online --auth $GITHUB_API_TOKEN --readme README.md
+ git diff
+"""
+
+import builtins
+import functools
+from datetime import datetime
+from io import StringIO
+from typing import Dict, Any, List, Optional, TextIO
+
+import click
+import yaml
+from github import Github
+import urllib.request
+import xml.dom.minidom
+from pathlib import Path
+
+
+ICONS = (
+ "appveyor",
+ "github",
+ "azurepipelines",
+ "circleci",
+ "gitlab",
+ "travisci",
+ "windows",
+ "apple",
+ "linux",
+)
+
+
+class Project:
+ NAME: int = 0
+
+ def __init__(self, config: Dict[str, Any], github: Optional[Github] = None):
+ try:
+ self.name: str = config["name"]
+ self.gh: str = config["gh"]
+ except KeyError:
+ print("Invalid config, needs at least gh and name!", config)
+ raise
+
+ self.stars_repo: str = config.get("stars", self.gh)
+ self.notes: str = config.get("notes", "")
+ self.ci: List[str] = config.get("ci", [])
+ self.os: List[str] = config.get("os", [])
+
+ self.online = github is not None
+ if github is not None:
+ repo = github.get_repo(self.stars_repo)
+ self.num_stars = repo.stargazers_count
+ self.pushed_at = repo.pushed_at
+ if not self.notes:
+ notes = repo.description
+ if repo.description:
+ self.notes = notes
+ else:
+ self.num_stars = 0
+ self.pushed_at = datetime.utcnow()
+
+ name_len = len(self.name) + 4
+ self.__class__.NAME = max(self.__class__.NAME, name_len)
+
+ def __lt__(self, other: "Project") -> bool:
+ if self.online:
+ return self.num_stars < other.num_stars
+ else:
+ return self.name < other.name
+
+ @classmethod
+ def header(cls) -> str:
+ return (
+ f"| {'Name':{cls.NAME}} | CI | OS | Notes |\n"
+ f"|{'':-^{cls.NAME+2 }}|----|----|:------|"
+ )
+
+ @property
+ def namelink(self) -> str:
+ return f"[{self.name}][]"
+
+ @property
+ def starslink(self) -> str:
+ return f"![{self.name} stars][]"
+
+ @property
+ def url(self) -> str:
+ return f"https://github.com/{self.gh}"
+
+ @property
+ def ci_icons(self) -> str:
+ return " ".join(f"![{icon} icon][]" for icon in self.ci)
+
+ @property
+ def os_icons(self) -> str:
+ return " ".join(f"![{icon} icon][]" for icon in self.os)
+
+ def table_row(self) -> str:
+ notes = self.notes.replace('\n', ' ')
+ return f"| {self.namelink: <{self.NAME}} | {self.ci_icons} | {self.os_icons} | {notes} |"
+
+ def links(self) -> str:
+ return f"[{self.name}]: {self.url}"
+
+ def info(self) -> str:
+ days = (datetime.utcnow() - self.pushed_at).days
+ return f""
+
+
+def fetch_icon(icon_name: str) -> None:
+ url = f'https://cdn.jsdelivr.net/npm/simple-icons@v4/icons/{icon_name}.svg'
+ with urllib.request.urlopen(url) as f:
+ original_svg_data = f.read()
+
+ document = xml.dom.minidom.parseString(original_svg_data)
+ svgElement = document.documentElement
+ assert svgElement.nodeName == 'svg'
+ svgElement.setAttribute('width', '16px')
+ svgElement.setAttribute('fill', '#606060')
+
+ icon_path = path_for_icon(icon_name)
+ icon_path.parent.mkdir(parents=True, exist_ok=True)
+
+ with open(path_for_icon(icon_name), 'w') as f:
+ f.write(svgElement.toxml())
+
+
+def path_for_icon(icon_name: str) -> Path:
+ return Path('.') / 'docs' / 'data' / 'readme_icons' / f'{icon_name}.svg'
+
+
+def str_projects(
+ config: List[Dict[str, Any]], *, online: bool = True, auth: Optional[str] = None
+) -> str:
+ io = StringIO()
+ print = functools.partial(builtins.print, file=io)
+
+ if online:
+ for icon in ICONS:
+ fetch_icon(icon)
+
+ github = Github(auth) if online else None
+
+ projects = sorted((Project(item, github) for item in config), reverse=online)
+
+ print(Project.header())
+ for project in projects:
+ print(project.table_row())
+
+ print()
+ for project in projects:
+ print(project.links())
+
+ print()
+ for icon in ICONS:
+ print(f"[{icon} icon]: {path_for_icon(icon).as_posix()}")
+
+ print()
+ for project in projects:
+ print(project.info())
+
+ return io.getvalue()
+
+
+@click.command()
+@click.argument("input", type=click.File("r"))
+@click.option("--online/--no-online", default=True, help="Get info from GitHub")
+@click.option("--auth", help="GitHub authentication token")
+@click.option("--readme", type=click.File("r+"), help="Modify a readme file if given")
+def projects(
+ input: TextIO, online: bool, auth: Optional[str], readme: Optional[TextIO]
+) -> None:
+ config = yaml.safe_load(input)
+ output = str_projects(config, online=online, auth=auth)
+
+ if readme is None:
+ print(output)
+ else:
+ text = readme.read()
+ start_str = "\n"
+ start = text.find(start_str)
+ end = text.find("\n")
+ generated_note = f''
+ new_text = f"{text[:start + len(start_str)]}\n{generated_note}\n\n{output}\n{text[end:]}"
+
+ readme.seek(0)
+ readme.write(new_text)
+ readme.truncate()
+
+
+if __name__ == "__main__":
+ projects()
diff --git a/docs/changelog.md b/docs/changelog.md
new file mode 100644
index 00000000..f4c1b679
--- /dev/null
+++ b/docs/changelog.md
@@ -0,0 +1,17 @@
+---
+title: Changelog
+---
+
+{%
+ includemarkdown "../README.md"
+ start=""
+ end=""
+%}
+
+
diff --git a/docs/data/projects.yml b/docs/data/projects.yml
new file mode 100644
index 00000000..366e96cd
--- /dev/null
+++ b/docs/data/projects.yml
@@ -0,0 +1,215 @@
+# Fields:
+# name: required, printed name
+# gh: Github repo (eventually a url: could be added for non-github projects)
+# stars: Github repo (optional, if different from package, such as for Twisted)
+# os: Operating system list, [windows, apple, linux] (optional)
+# ci: [appveyor, github, azurepipelines, circleci, gitlab, travisci] (optional)
+# notes: (text, optional)
+
+- name: Matplotlib
+ gh: matplotlib/matplotlib
+ notes: The venerable Matplotlib, a Python library with C++ portions
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: pyinstrument_cext
+ gh: joerick/pyinstrument_cext
+ ci: [travisci, appveyor]
+ os: [windows, apple, linux]
+ notes: A simple C extension, without external dependencies
+
+- name: websockets
+ gh: aaugustin/websockets
+ ci: [travisci]
+ ci_config: .travis.yml
+ os: [apple, linux]
+ notes: |
+ Library for building WebSocket servers and clients. Mostly written in
+ Python, with a small C 'speedups' extension module.
+
+- name: Parselmouth
+ gh: YannickJadoul/Parselmouth
+ notes: A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels.
+ ci: [github]
+ os: [windows, apple, linux]
+
+# Seems to be defunct
+# - name: python-admesh
+# gh: admesh/python-admesh
+
+- name: pybase64
+ gh: mayeut/pybase64
+ ci: [github]
+ os: [windows, apple, linux]
+
+
+- name: KDEpy
+ gh: tommyod/KDEpy
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: AutoPy
+ gh: autopilot-rs/autopy
+ ci: [travisci]
+ os: [windows, apple, linux]
+ notes: Includes a Windows Travis build.
+
+# Seems to be defunct
+# - name: apriltags2-ethz
+# gh: safijari/apriltags2_ethz
+
+- name: TgCrypto
+ gh: pyrogram/tgcrypto
+ ci: [travisci]
+ os: [windows, apple, linux]
+ notes: Includes a Windows Travis build.
+
+- name: twisted-iocpsupport
+ gh: twisted/twisted-iocpsupport
+ stars: twisted/twisted
+ notes: A submodule of Twisted that hooks into native C APIs using Cython.
+ ci: [github]
+ os: [windows]
+
+# cibuildwheel moved to backup folder
+# - name: gmic-py
+# gh: myselfhimself/gmic-py
+
+- name: River
+ gh: online-ml/river
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: PyAV
+ gh: PyAV-Org/PyAV
+ ci: [github]
+ os: [windows, apple, linux]
+ notes: Pythonic bindings for FFmpeg's libraries.
+
+- name: aiortc
+ gh: aiortc/aiortc
+ ci: [github]
+ os: [apple, linux]
+ notes: WebRTC and ORTC implementation for Python using asyncio.
+
+- name: aioquic
+ gh: aiortc/aioquic
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: pikepdf
+ gh: pikepdf/pikepdf
+ ci: [azurepipelines]
+ os: [windows, apple, linux]
+
+- name: fathon
+ gh: stfbnc/fathon
+ ci: [travisci]
+ os: [apple, linux]
+
+- name: etebase-py
+ gh: etesync/etebase-py
+ notes: Python bindings to a Rust library using `setuptools-rust`, and `sccache` for improved speed.
+ ci: [travisci]
+ os: [linux]
+
+- name: xmlstarlet
+ gh: dimitern/xmlstarlet
+ notes: Python 3.6+ CFFI bindings with true MSVC build.
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: bx-python
+ gh: bxlab/bx-python
+ notes: A library that includes Cython extensions.
+ ci: [travisci]
+ os: [apple, linux]
+
+- name: coverage.py
+ gh: nedbat/coveragepy
+ ci: [github]
+ os: [windows, apple, linux]
+ notes: The coverage tool for Python
+
+- name: scikit-learn
+ gh: scikit-learn/scikit-learn
+ ci: [github]
+ os: [windows, apple, linux]
+ ci_config: .github/workflows/wheels.yml
+ notes: |
+ The machine learning library. A complex but clean config using many of
+ cibuildwheel's features to build a large project with Cython and C++
+ extensions.
+
+- name: scikit-image
+ gh: scikit-image/scikit-image
+ ci: [github]
+ os: [windows, apple, linux]
+ ci_config: .github/workflows/cibuildwheel.yml
+ notes: |
+ Image processing library. Uses cibuildwheel to build and test a project
+ that uses Cython with platform-native code.
+
+- name: google neuroglancer
+ gh: google/neuroglancer
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: h5py
+ gh: h5py/h5py
+ ci: [azurepipelines]
+ os: [windows, apple, linux]
+
+- name: pyzmq
+ gh: zeromq/pyzmq
+ ci: [github]
+ os: [windows, apple, linux]
+ ci_config: .github/workflows/wheels.yml
+ notes: |
+ Python bindings for zeromq, the networking library. Uses Cython and CFFI.
+
+- name: python-rapidjson
+ gh: python-rapidjson/python-rapidjson
+ ci: [travisci, gitlab, appveyor]
+ os: [windows, linux]
+
+- name: jq.py
+ gh: mwilliamson/jq.py
+ ci: [travisci]
+ os: [apple, linux]
+
+- name: pybind11 python_example
+ gh: pybind/python_example
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: pybind11 cmake_example
+ gh: pybind/cmake_example
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: pybind11 scikit_build_example
+ gh: pybind/scikit_build_example
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: iminuit
+ gh: scikit-hep/iminuit
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: pyjet
+ gh: scikit-hep/pyjet
+ ci: [github]
+ os: [windows, apple, linux]
+
+- name: numpythia
+ gh: scikit-hep/numpythia
+ ci: [github]
+ os: [apple, linux]
+
+- name: boost-histogram
+ gh: scikit-hep/boost-histogram
+ ci: [github, travisci]
+ os: [windows, apple, linux]
+ notes: Supports full range of wheels, including PyPy and alternate archs.
diff --git a/docs/data/readme_icons/apple.svg b/docs/data/readme_icons/apple.svg
new file mode 100644
index 00000000..f8780367
--- /dev/null
+++ b/docs/data/readme_icons/apple.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/appveyor.svg b/docs/data/readme_icons/appveyor.svg
new file mode 100644
index 00000000..6fa0bac2
--- /dev/null
+++ b/docs/data/readme_icons/appveyor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/azurepipelines.svg b/docs/data/readme_icons/azurepipelines.svg
new file mode 100644
index 00000000..e307977c
--- /dev/null
+++ b/docs/data/readme_icons/azurepipelines.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/circleci.svg b/docs/data/readme_icons/circleci.svg
new file mode 100644
index 00000000..2945b71c
--- /dev/null
+++ b/docs/data/readme_icons/circleci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/github.svg b/docs/data/readme_icons/github.svg
new file mode 100644
index 00000000..08c1abee
--- /dev/null
+++ b/docs/data/readme_icons/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/gitlab.svg b/docs/data/readme_icons/gitlab.svg
new file mode 100644
index 00000000..51222122
--- /dev/null
+++ b/docs/data/readme_icons/gitlab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/linux.svg b/docs/data/readme_icons/linux.svg
new file mode 100644
index 00000000..355dfd3d
--- /dev/null
+++ b/docs/data/readme_icons/linux.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/travisci.svg b/docs/data/readme_icons/travisci.svg
new file mode 100644
index 00000000..3efbee2a
--- /dev/null
+++ b/docs/data/readme_icons/travisci.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/data/readme_icons/windows.svg b/docs/data/readme_icons/windows.svg
new file mode 100644
index 00000000..0e103619
--- /dev/null
+++ b/docs/data/readme_icons/windows.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/docs/docs/data b/docs/docs/data
new file mode 120000
index 00000000..4909e06e
--- /dev/null
+++ b/docs/docs/data
@@ -0,0 +1 @@
+../data
\ No newline at end of file
diff --git a/docs/extra.css b/docs/extra.css
index 5da96b0b..0a4dad6b 100644
--- a/docs/extra.css
+++ b/docs/extra.css
@@ -29,7 +29,6 @@ h1, h2, h3, h4, h5, h6 {
border-bottom: 1px solid #e1e4e5;
margin-bottom: 0.8em;
padding-bottom: 0.2em;
-
}
.rst-content blockquote {
diff --git a/docs/working-examples.md b/docs/working-examples.md
new file mode 100644
index 00000000..a769ff53
--- /dev/null
+++ b/docs/working-examples.md
@@ -0,0 +1,20 @@
+---
+title: Working examples
+---
+
+{%
+ includemarkdown "../README.md"
+ start=""
+ end=""
+%}
+
+
diff --git a/mkdocs.yml b/mkdocs.yml
index 928c1116..3b404dbc 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -20,7 +20,9 @@ nav:
- deliver-to-pypi.md
- cpp_standards.md
- faq.md
+ - working-examples.md
- contributing.md
+ - changelog.md
markdown_extensions:
- fenced_code
diff --git a/requirements-dev.txt b/requirements-dev.txt
index 52bc8edb..341498b4 100644
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -7,4 +7,6 @@ pip-tools
requests
click
mypy
+pyyaml
+pygithub
typing-extensions