Skip to content

Commit 6fc6adf

Browse files
committed
add support for homebrew packages
Signed-off-by: Tushar912 <tushar.912u@gmail.com>
1 parent ccb7b61 commit 6fc6adf

4 files changed

Lines changed: 243 additions & 0 deletions

File tree

fetchcode/package.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,3 +327,38 @@ def get_rubygems_data_from_purl(purl):
327327
download_url=download_url,
328328
**purl.to_dict(),
329329
)
330+
331+
@router.route("pkg:homebrew/.*")
332+
def get_homebrew_data_from_purl(purl):
333+
"""
334+
Generate `Package` object from the `purl` string of homebrew type
335+
"""
336+
purl = PackageURL.from_string(purl)
337+
name = purl.name
338+
base_path = "https://formulae.brew.sh/api/formula"
339+
api_url = f"{base_path}/{name}.json"
340+
response = get_response(api_url)
341+
declared_license = response.get("license")
342+
homepage_url = response.get("homepage")
343+
urls = response.get("urls") or {}
344+
stable_url = urls.get("stable") or {}
345+
download_url = stable_url.get("url")
346+
yield Package(
347+
homepage_url=homepage_url,
348+
api_url=api_url,
349+
declared_license=declared_license,
350+
download_url=download_url,
351+
**purl.to_dict(),
352+
)
353+
versions = response.get("versions") or {}
354+
version_purl = PackageURL(
355+
type=purl.type, name=name, version=versions.get("stable")
356+
)
357+
yield Package(
358+
homepage_url=homepage_url,
359+
api_url=api_url,
360+
declared_license=declared_license,
361+
download_url=download_url,
362+
**version_purl.to_dict(),
363+
)
364+

tests/data/homebrew.json

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"0": {
3+
"type": "homebrew",
4+
"namespace": null,
5+
"name": "node",
6+
"version": null,
7+
"qualifiers": {},
8+
"subpath": null,
9+
"primary_language": null,
10+
"description": null,
11+
"release_date": null,
12+
"parties": [],
13+
"keywords": [],
14+
"homepage_url": "https://nodejs.org/",
15+
"download_url": "https://nodejs.org/dist/v14.13.1/node-v14.13.1.tar.gz",
16+
"api_url": "https://formulae.brew.sh/api/formula/node.json",
17+
"size": null,
18+
"sha1": null,
19+
"md5": null,
20+
"sha256": null,
21+
"sha512": null,
22+
"bug_tracking_url": null,
23+
"code_view_url": null,
24+
"vcs_url": null,
25+
"copyright": null,
26+
"license_expression": null,
27+
"declared_license": "MIT",
28+
"notice_text": null,
29+
"root_path": null,
30+
"dependencies": [],
31+
"contains_source_code": null,
32+
"source_packages": [],
33+
"purl": "pkg:homebrew/node",
34+
"repository_homepage_url": null,
35+
"repository_download_url": null,
36+
"api_data_url": null
37+
},
38+
"1": {
39+
"type": "homebrew",
40+
"namespace": null,
41+
"name": "node",
42+
"version": "14.13.1",
43+
"qualifiers": {},
44+
"subpath": null,
45+
"primary_language": null,
46+
"description": null,
47+
"release_date": null,
48+
"parties": [],
49+
"keywords": [],
50+
"homepage_url": "https://nodejs.org/",
51+
"download_url": "https://nodejs.org/dist/v14.13.1/node-v14.13.1.tar.gz",
52+
"api_url": "https://formulae.brew.sh/api/formula/node.json",
53+
"size": null,
54+
"sha1": null,
55+
"md5": null,
56+
"sha256": null,
57+
"sha512": null,
58+
"bug_tracking_url": null,
59+
"code_view_url": null,
60+
"vcs_url": null,
61+
"copyright": null,
62+
"license_expression": null,
63+
"declared_license": "MIT",
64+
"notice_text": null,
65+
"root_path": null,
66+
"dependencies": [],
67+
"contains_source_code": null,
68+
"source_packages": [],
69+
"purl": "pkg:homebrew/node@14.13.1",
70+
"repository_homepage_url": null,
71+
"repository_download_url": null,
72+
"api_data_url": null
73+
}
74+
75+
}

tests/data/homebrew_mock_data.json

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
{
2+
"name": "node",
3+
"full_name": "node",
4+
"oldname": null,
5+
"aliases": [
6+
"node.js",
7+
"node@14",
8+
"nodejs",
9+
"npm"
10+
],
11+
"versioned_formulae": [
12+
"node@12",
13+
"node@10"
14+
],
15+
"desc": "Platform built on V8 to build network applications",
16+
"license": "MIT",
17+
"homepage": "https://nodejs.org/",
18+
"versions": {
19+
"stable": "14.13.1",
20+
"head": "HEAD",
21+
"bottle": true
22+
},
23+
"urls": {
24+
"stable": {
25+
"url": "https://nodejs.org/dist/v14.13.1/node-v14.13.1.tar.gz",
26+
"tag": null,
27+
"revision": null
28+
}
29+
},
30+
"revision": 0,
31+
"version_scheme": 0,
32+
"bottle": {
33+
"stable": {
34+
"rebuild": 0,
35+
"cellar": ":any",
36+
"prefix": "/usr/local",
37+
"root_url": "https://homebrew.bintray.com/bottles",
38+
"files": {
39+
"catalina": {
40+
"url": "https://homebrew.bintray.com/bottles/node-14.13.1.catalina.bottle.tar.gz",
41+
"sha256": "c5574d926c10ecb8a18faa551f6a15c362512134577110c2678d52db3382ba42"
42+
},
43+
"mojave": {
44+
"url": "https://homebrew.bintray.com/bottles/node-14.13.1.mojave.bottle.tar.gz",
45+
"sha256": "3d42a543356788cb20a3cd91306e9e533c2939b7609c3dc91ffdd405fab1b25f"
46+
},
47+
"high_sierra": {
48+
"url": "https://homebrew.bintray.com/bottles/node-14.13.1.high_sierra.bottle.tar.gz",
49+
"sha256": "8c9d9dd8a341bd74aec4e8ba1a8abb8ba92e137d771290613676798f0b4a61ba"
50+
}
51+
}
52+
}
53+
},
54+
"keg_only": false,
55+
"bottle_disabled": false,
56+
"options": [],
57+
"build_dependencies": [
58+
"pkg-config",
59+
"python@3.8"
60+
],
61+
"dependencies": [
62+
"icu4c"
63+
],
64+
"recommended_dependencies": [],
65+
"optional_dependencies": [],
66+
"uses_from_macos": [],
67+
"requirements": [],
68+
"conflicts_with": [],
69+
"caveats": null,
70+
"installed": [],
71+
"linked_keg": null,
72+
"pinned": false,
73+
"outdated": false,
74+
"deprecated": false,
75+
"disabled": false,
76+
"analytics": {
77+
"install": {
78+
"30d": {
79+
"node": 405637,
80+
"node --HEAD": 44,
81+
"node --with-full-icu": 1,
82+
"node --without-npm": 1
83+
},
84+
"90d": {
85+
"node": 1074821,
86+
"node --HEAD": 117,
87+
"node --without-npm": 3,
88+
"Node": 1,
89+
"node --with-full-icu": 1
90+
},
91+
"365d": {
92+
"node": 4314220,
93+
"node --HEAD": 617,
94+
"node --without-npm": 29,
95+
"node --without-icu4c": 13,
96+
"node --with-openssl@1.1": 6
97+
}
98+
},
99+
"install_on_request": {
100+
"30d": {
101+
"node": 294250,
102+
"node --HEAD": 15
103+
},
104+
"90d": {
105+
"node": 787407,
106+
"node --HEAD": 52,
107+
"Node": 1
108+
},
109+
"365d": {
110+
"node": 3134446,
111+
"node --HEAD": 343,
112+
"node --without-icu4c": 13,
113+
"node --without-npm": 9,
114+
"node --with-openssl@1.1": 6
115+
}
116+
},
117+
"build_error": {
118+
"30d": {
119+
"node": 0
120+
}
121+
}
122+
},
123+
"generated_date": "2020-10-11"
124+
}

tests/test_package.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,12 @@ def test_rubygems_packages(mock_get):
9797
mock_get.side_effect = side_effect
9898
packages = list(info(purl))
9999
match_data(packages, expected_data)
100+
101+
@mock.patch("fetchcode.package.get_response")
102+
def test_homebrew_packages(mock_get):
103+
side_effect = [file_data("tests/data/homebrew_mock_data.json")]
104+
purl = "pkg:homebrew/node"
105+
expected_data = file_data("tests/data/homebrew.json")
106+
mock_get.side_effect = side_effect
107+
packages = list(info(purl))
108+
match_data(packages, expected_data)

0 commit comments

Comments
 (0)