Skip to content

Commit 1d9dca8

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

6 files changed

Lines changed: 324 additions & 0 deletions

File tree

fetchcode/package.py

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

tests/data/homebrew1.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/homebrew2.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": "wget",
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://www.gnu.org/software/wget/",
15+
"download_url": "https://ftp.gnu.org/gnu/wget/wget-1.21.1.tar.gz",
16+
"api_url": "https://formulae.brew.sh/api/formula/wget.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": "GPL-3.0-or-later",
28+
"notice_text": null,
29+
"root_path": null,
30+
"dependencies": [],
31+
"contains_source_code": null,
32+
"source_packages": [],
33+
"purl": "pkg:homebrew/wget",
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": "wget",
42+
"version": "1.21.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://www.gnu.org/software/wget/",
51+
"download_url": "https://ftp.gnu.org/gnu/wget/wget-1.21.1.tar.gz",
52+
"api_url": "https://formulae.brew.sh/api/formula/wget.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": "GPL-3.0-or-later",
64+
"notice_text": null,
65+
"root_path": null,
66+
"dependencies": [],
67+
"contains_source_code": null,
68+
"source_packages": [],
69+
"purl": "pkg:homebrew/wget@1.21.1",
70+
"repository_homepage_url": null,
71+
"repository_download_url": null,
72+
"api_data_url": null
73+
}
74+
75+
}
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+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"name":"wget","full_name":"wget","tap":"homebrew/core","oldname":null,"aliases":[],"versioned_formulae":[],"desc":"Internet file retriever","license":"GPL-3.0-or-later","homepage":"https://www.gnu.org/software/wget/","versions":{"stable":"1.21.1","head":"HEAD","bottle":true},"urls":{"stable":{"url":"https://ftp.gnu.org/gnu/wget/wget-1.21.1.tar.gz","tag":null,"revision":null}},"revision":0,"version_scheme":0,"bottle":{"stable":{"rebuild":0,"cellar":"/usr/local/Cellar","prefix":"/usr/local","root_url":"https://homebrew.bintray.com/bottles","files":{"arm64_big_sur":{"url":"https://homebrew.bintray.com/bottles/wget-1.21.1.arm64_big_sur.bottle.tar.gz","sha256":"e9034fc9062d5d28972135be031876672aff18fa945ce37e9c2ee1e2c4287f3a"},"big_sur":{"url":"https://homebrew.bintray.com/bottles/wget-1.21.1.big_sur.bottle.tar.gz","sha256":"e6ea2a50b8196206f7072360e713535bb16fb786c8b5fe23cab05757e0f67b13"},"catalina":{"url":"https://homebrew.bintray.com/bottles/wget-1.21.1.catalina.bottle.tar.gz","sha256":"88116cb28d6b85e441d1bb9df0a1454b84f8b9d0e8817a5bee0f228acc59e75a"},"mojave":{"url":"https://homebrew.bintray.com/bottles/wget-1.21.1.mojave.bottle.tar.gz","sha256":"ae4e6f1dc4ecaf2bbed7700e8d64cdc671bf9d6c085ba335f119861fd15956fe"}}}},"keg_only":false,"bottle_disabled":false,"options":[],"build_dependencies":["pkg-config"],"dependencies":["libidn2","openssl@1.1"],"recommended_dependencies":[],"optional_dependencies":[],"uses_from_macos":[],"requirements":[],"conflicts_with":[],"caveats":null,"installed":[{"version":"1.21.1","used_options":[],"built_as_bottle":true,"poured_from_bottle":true,"runtime_dependencies":[{"full_name":"gettext","version":"0.21"},{"full_name":"libunistring","version":"0.9.10"},{"full_name":"libidn2","version":"2.3.0"},{"full_name":"openssl@1.1","version":"1.1.1i"}],"installed_as_dependency":false,"installed_on_request":true}],"linked_keg":"1.21.1","pinned":false,"outdated":false,"deprecated":false,"deprecation_date":null,"deprecation_reason":null,"disabled":false,"disable_date":null,"disable_reason":null,"analytics":{"install":{"30d":{"wget":218835,"wget --HEAD":36},"90d":{"wget":482230,"wget --HEAD":93},"365d":{"wget":1385786,"wget --HEAD":134}},"install_on_request":{"30d":{"wget":217646,"wget --HEAD":36},"90d":{"wget":479575,"wget --HEAD":93},"365d":{"wget":1364206,"wget --HEAD":133}},"build_error":{"30d":{"wget":0}}},"generated_date":"2021-02-19"}

tests/test_package.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,19 @@ 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+
102+
@mock.patch("fetchcode.package.get_response")
103+
def test_homebrew_packages(mock_get):
104+
side_effect = [file_data("tests/data/homebrew_mock_data1.json")]
105+
purl = "pkg:homebrew/node"
106+
expected_data = file_data("tests/data/homebrew1.json")
107+
mock_get.side_effect = side_effect
108+
packages = list(info(purl))
109+
match_data(packages, expected_data)
110+
side_effect = [file_data("tests/data/homebrew_mock_data2.json")]
111+
purl = "pkg:homebrew/wget"
112+
expected_data = file_data("tests/data/homebrew2.json")
113+
mock_get.side_effect = side_effect
114+
packages = list(info(purl))
115+
match_data(packages, expected_data)

0 commit comments

Comments
 (0)