Skip to content

Commit 2e2377f

Browse files
committed
Add cargo-specific fields to versions_metadata and enhance tests
1 parent 447e044 commit 2e2377f

File tree

3 files changed

+185
-4
lines changed

3 files changed

+185
-4
lines changed

app/models/ecosystem/cargo.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ def versions_metadata(pkg_metadata, existing_version_numbers = [])
8989
license: version["license"],
9090
crate_size: version["crate_size"],
9191
rust_version: version["rust_version"],
92+
features: version["features"],
93+
yanked: version["yanked"],
94+
yank_message: version["yank_message"],
95+
dl_path: version["dl_path"],
96+
audit_actions: version["audit_actions"],
97+
lib_links: version["lib_links"],
98+
has_lib: version["has_lib"],
99+
bin_names: version["bin_names"],
100+
edition: version["edition"]
92101
}
93102
}
94103
end

test/fixtures/files/cargo/serde_fresh

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
{
2+
"crate": {
3+
"id": "serde",
4+
"name": "serde",
5+
"updated_at": "2025-03-09T19:13:49.968038Z",
6+
"versions": [1476368],
7+
"keywords": ["serde", "serialization", "json"],
8+
"categories": ["data-structures", "encoding"],
9+
"badges": [],
10+
"created_at": "2014-11-24T20:33:18.073000+00:00",
11+
"downloads": 50529288,
12+
"recent_downloads": 123456,
13+
"max_version": "1.0.219",
14+
"max_stable_version": "1.0.219",
15+
"description": "A generic serialization/deserialization framework",
16+
"homepage": "https://serde.rs",
17+
"documentation": "https://docs.rs/serde",
18+
"repository": "https://github.com/serde-rs/serde",
19+
"links": {
20+
"version_downloads": "/api/v1/crates/serde/downloads",
21+
"versions": null,
22+
"owners": "/api/v1/crates/serde/owners",
23+
"owner_team": "/api/v1/crates/serde/owner_team",
24+
"owner_user": "/api/v1/crates/serde/owner_user",
25+
"reverse_dependencies": "/api/v1/crates/serde/reverse_dependencies"
26+
},
27+
"exact_match": false
28+
},
29+
"versions": [
30+
{
31+
"id": 1476368,
32+
"crate": "serde",
33+
"num": "1.0.219",
34+
"dl_path": "/api/v1/crates/serde/1.0.219/download",
35+
"readme_path": "/api/v1/crates/serde/1.0.219/readme",
36+
"updated_at": "2025-03-09T19:13:49.968038Z",
37+
"created_at": "2025-03-09T19:13:49.968038Z",
38+
"downloads": 50529288,
39+
"features": {
40+
"alloc": [],
41+
"default": ["std"],
42+
"derive": ["serde_derive"],
43+
"rc": [],
44+
"std": [],
45+
"unstable": []
46+
},
47+
"yanked": false,
48+
"yank_message": null,
49+
"lib_links": null,
50+
"license": "MIT OR Apache-2.0",
51+
"links": {
52+
"dependencies": "/api/v1/crates/serde/1.0.219/dependencies",
53+
"version_downloads": "/api/v1/crates/serde/1.0.219/downloads",
54+
"authors": "/api/v1/crates/serde/1.0.219/authors"
55+
},
56+
"crate_size": 78983,
57+
"published_by": {
58+
"id": 3618,
59+
"login": "dtolnay",
60+
"name": "David Tolnay",
61+
"avatar": "https://avatars.githubusercontent.com/u/1940490?v=4",
62+
"url": "https://github.com/dtolnay"
63+
},
64+
"audit_actions": [
65+
{
66+
"action": "publish",
67+
"user": {
68+
"id": 3618,
69+
"login": "dtolnay",
70+
"name": "David Tolnay",
71+
"avatar": "https://avatars.githubusercontent.com/u/1940490?v=4",
72+
"url": "https://github.com/dtolnay"
73+
},
74+
"time": "2025-03-09T19:13:49.968038Z"
75+
}
76+
],
77+
"checksum": "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6",
78+
"rust_version": "1.31",
79+
"has_lib": true,
80+
"bin_names": [],
81+
"edition": "2018",
82+
"description": "A generic serialization/deserialization framework",
83+
"homepage": "https://serde.rs",
84+
"documentation": "https://docs.rs/serde",
85+
"repository": "https://github.com/serde-rs/serde"
86+
}
87+
],
88+
"keywords": [
89+
{
90+
"id": "serde",
91+
"keyword": "serde",
92+
"crates_cnt": 2345,
93+
"created_at": "2014-11-24T20:33:18.073000+00:00"
94+
}
95+
],
96+
"categories": [
97+
{
98+
"id": "data-structures",
99+
"category": "Data structures",
100+
"slug": "data-structures",
101+
"description": "Data structure implementations",
102+
"crates_cnt": 1234,
103+
"created_at": "2017-01-17T19:13:05.112025+00:00"
104+
}
105+
]
106+
}

test/models/ecosystem/cargo_test.rb

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,16 @@ class CargoTest < ActiveSupport::TestCase
117117
:size=>nil,
118118
:license=>"MIT",
119119
:crate_size=>3200,
120-
:rust_version=>nil}},
120+
:rust_version=>nil,
121+
:features=>{},
122+
:yanked=>false,
123+
:yank_message=>nil,
124+
:dl_path=>"/api/v1/crates/parameters_lib/0.2.2/download",
125+
:audit_actions=>[{"action"=>"publish", "time"=>"2022-03-29T13:35:06.927472+00:00", "user"=>{"avatar"=>"https://avatars.githubusercontent.com/u/353709?v=4", "id"=>65133, "login"=>"TheFox", "name"=>"Christian Mayer", "url"=>"https://github.com/TheFox"}}],
126+
:lib_links=>nil,
127+
:has_lib=>nil,
128+
:bin_names=>nil,
129+
:edition=>nil}},
121130
{:number=>"0.1.0",
122131
:published_at=>"2022-03-24T16:19:57.595451+00:00",
123132
:status=>nil,
@@ -134,7 +143,16 @@ class CargoTest < ActiveSupport::TestCase
134143
:size=>nil,
135144
:license=>"MIT",
136145
:crate_size=>3033,
137-
:rust_version=>nil}},
146+
:rust_version=>nil,
147+
:features=>{},
148+
:yanked=>false,
149+
:yank_message=>nil,
150+
:dl_path=>"/api/v1/crates/parameters_lib/0.1.0/download",
151+
:audit_actions=>[{"action"=>"publish", "time"=>"2022-03-24T16:19:57.595451+00:00", "user"=>{"avatar"=>"https://avatars.githubusercontent.com/u/353709?v=4", "id"=>65133, "login"=>"TheFox", "name"=>"Christian Mayer", "url"=>"https://github.com/TheFox"}}],
152+
:lib_links=>nil,
153+
:has_lib=>nil,
154+
:bin_names=>nil,
155+
:edition=>nil}},
138156
{:number=>"0.1.0-dev.2",
139157
:published_at=>"2022-03-24T16:08:54.337646+00:00",
140158
:status=>nil,
@@ -151,7 +169,16 @@ class CargoTest < ActiveSupport::TestCase
151169
:size=>nil,
152170
:license=>"MIT",
153171
:crate_size=>3039,
154-
:rust_version=>nil}},
172+
:rust_version=>nil,
173+
:features=>{},
174+
:yanked=>false,
175+
:yank_message=>nil,
176+
:dl_path=>"/api/v1/crates/parameters_lib/0.1.0-dev.2/download",
177+
:audit_actions=>[{"action"=>"publish", "time"=>"2022-03-24T16:08:54.337646+00:00", "user"=>{"avatar"=>"https://avatars.githubusercontent.com/u/353709?v=4", "id"=>65133, "login"=>"TheFox", "name"=>"Christian Mayer", "url"=>"https://github.com/TheFox"}}],
178+
:lib_links=>nil,
179+
:has_lib=>nil,
180+
:bin_names=>nil,
181+
:edition=>nil}},
155182
{:number=>"0.1.0-dev.1",
156183
:published_at=>"2022-03-24T15:58:36.858899+00:00",
157184
:status=>nil,
@@ -168,7 +195,16 @@ class CargoTest < ActiveSupport::TestCase
168195
:size=>nil,
169196
:license=>"MIT",
170197
:crate_size=>3026,
171-
:rust_version=>nil}}]
198+
:rust_version=>nil,
199+
:features=>{},
200+
:yanked=>false,
201+
:yank_message=>nil,
202+
:dl_path=>"/api/v1/crates/parameters_lib/0.1.0-dev.1/download",
203+
:audit_actions=>[{"action"=>"publish", "time"=>"2022-03-24T15:58:36.858899+00:00", "user"=>{"avatar"=>"https://avatars.githubusercontent.com/u/353709?v=4", "id"=>65133, "login"=>"TheFox", "name"=>"Christian Mayer", "url"=>"https://github.com/TheFox"}}],
204+
:lib_links=>nil,
205+
:has_lib=>nil,
206+
:bin_names=>nil,
207+
:edition=>nil}}]
172208
end
173209

174210
test 'dependencies_metadata' do
@@ -182,4 +218,34 @@ class CargoTest < ActiveSupport::TestCase
182218
test 'maintainer_url' do
183219
assert_equal @ecosystem.maintainer_url(@maintainer), 'https://crates.io/users/foo'
184220
end
221+
222+
test 'versions_metadata includes cargo specific fields' do
223+
stub_request(:get, "https://crates.io/api/v1/crates/parameters_lib")
224+
.to_return({ status: 200, body: file_fixture('cargo/parameters_lib') })
225+
package_metadata = @ecosystem.package_metadata('parameters_lib')
226+
versions_metadata = @ecosystem.versions_metadata(package_metadata)
227+
228+
first_version = versions_metadata.first
229+
assert_equal first_version[:metadata][:features], {}
230+
assert_equal first_version[:metadata][:yanked], false
231+
assert_equal first_version[:metadata][:dl_path], "/api/v1/crates/parameters_lib/0.2.2/download"
232+
assert_equal first_version[:metadata][:audit_actions].first["action"], "publish"
233+
assert_nil first_version[:metadata][:rust_version]
234+
end
235+
236+
test 'versions_metadata includes newer cargo api fields' do
237+
stub_request(:get, "https://crates.io/api/v1/crates/serde")
238+
.to_return({ status: 200, body: file_fixture('cargo/serde_fresh') })
239+
package_metadata = @ecosystem.package_metadata('serde')
240+
versions_metadata = @ecosystem.versions_metadata(package_metadata)
241+
242+
first_version = versions_metadata.first
243+
assert_equal first_version[:metadata][:edition], "2018"
244+
assert_equal first_version[:metadata][:rust_version], "1.31"
245+
assert_equal first_version[:metadata][:has_lib], true
246+
assert_equal first_version[:metadata][:bin_names], []
247+
assert_nil first_version[:metadata][:yank_message]
248+
assert_nil first_version[:metadata][:lib_links]
249+
assert_equal first_version[:metadata][:features]["default"], ["std"]
250+
end
185251
end

0 commit comments

Comments
 (0)