aboutsummaryrefslogtreecommitdiff
path: root/index.html
diff options
context:
space:
mode:
Diffstat (limited to 'index.html')
-rw-r--r--index.html96
1 files changed, 96 insertions, 0 deletions
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..72dca25
--- /dev/null
+++ b/index.html
@@ -0,0 +1,96 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <title>Are We 1.0 Yet?</title>
+ <style>
+ /* "derived" (stolen) from evenbettermotherfucking.website */
+ html {
+ margin: 1rem auto;
+ background: #f2f2f2;
+ color: #444444;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 1.8;
+ text-shadow: 0 1px 0 #ffffff;
+ max-width: 60em;
+ }
+ body {
+ margin: 0 1rem;
+ }
+ a {
+ border-bottom: 1px solid #444444;
+ color: #444444;
+ text-decoration: none;
+ }
+ a:hover {
+ border-bottom-style: dashed;
+ }
+ blockquote {
+ margin-left: 1em;
+ border-left: 2px solid #444444;
+ padding-left: 1em;
+ }
+
+ .highlight {
+ background-color: #c2f2c2;
+ }
+ </style>
+</head>
+<body>
+<main>
+ <h1>Are We 1.0 Yet?</h1>
+ <p>
+ Checking the 360 most downloaded crates of all time on <a href="https://crates.io">crates.io</a> to see which ones have reached version 1.0 yet.
+ </p>
+ <p>
+ <strong>{{ crates | map(attribute='latest_version') | selectattr('is_1_0') | list | length }} / {{ crates | length }}</strong> crates are 1.0 by now.
+ </p>
+ <table>
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Latest Version</th>
+ </tr>
+ </thead>
+ <tbody>
+ {% for crate in crates %}
+ <tr class="{% if crate.latest_version.is_1_0 %}highlight{% endif %}">
+ <td><a href="https://crates.io/crates/{{ crate.name }}">{{ crate.name }}</a></td>
+ <td>{{ crate.latest_version }}{% if crate.latest_version != crate.latest_pre_release_version %}
+ (& <span class="{% if crate.latest_pre_release_version.is_1_0 %}highlight{% endif %}">{{ crate.latest_pre_release_version }})</span>{% endif %}</td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+</main>
+<aside>
+ <h2>Why?</h2>
+ <p>
+ The Rust ecosystem is still very immature.
+ Very few critical packages have actually reached version 1.0 yet.
+ The <a href="https://semver.org/#spec-item-4">semver spec</a> says "Major version zero (0.y.z) is for initial development... The public API SHOULD NOT be considered stable."
+ Additionally, the <a href="https://semver.org/#how-do-i-know-when-to-release-100">FAQ entry</a> for "How do I know when to release 1.0.0?" gives some heuristics that the Rust ecosystem doesn't really abide by at all:
+ </p>
+ <blockquote>
+ <p>
+ If your software is being used in production, it should probably already be 1.0.0.
+ If you have a stable API on which users have come to depend, you should be 1.0.0.
+ If you’re worrying a lot about backwards compatibility, you should probably already be 1.0.0.
+ </p>
+ </blockquote>
+ <p>
+ I submit that it would be difficult to build a non-trivial Rust program intended for production without depending on any crates which are not yet at version 1.0.0 or higher.
+ This situation is not really ideal.
+ I'm not saying the maintainers of these crates are lazy, or owe the community a stable 1.0.0 release, or anything like that.
+ I'm just saying ecosystem stability is a good thing to care about, and right now Rust in general doesn't have that.
+ </p>
+</aside>
+<footer>
+ Built by <a href="https://www.boringcactus.com/">boringcactus</a>.
+ Inspired by <a href="https://pythonwheels.com/">Python Wheels</a>.
+ Generator code <a href="https://git.sr.ht/~boringcactus/arewe1.0yet">available</a>.
+ Data pulled at {{ metadata.timestamp }}.
+</footer>
+</body>
+</html> \ No newline at end of file