1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
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://code.boringcactus.com/arewe1.0yet/">available</a>.
Data pulled at {{ metadata.timestamp }}.
</footer>
</body>
</html>
|