Skip to content

Commit 2d98cd3

Browse files
authored
Merge pull request #221 from aboutcode-org/fix_packages_that_not_requires_install_requires
Fix issue #220 This PR removes conditional check for checking if install requires is required or not. Some packages like crontab may never have a install_requires and we should not fail to parse those packages.
2 parents e7baa00 + 2c5d527 commit 2d98cd3

File tree

3 files changed

+113
-18
lines changed

3 files changed

+113
-18
lines changed

src/python_inspector/resolution.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -319,10 +319,6 @@ def get_requirements_from_python_manifest(
319319
and elem.value.func.id == "setup"
320320
)
321321
]
322-
if len(setup_fct) == 0:
323-
raise Exception(
324-
f"Unable to collect setup.py dependencies securely: {setup_py_location}"
325-
)
326322
if len(setup_fct) > 1:
327323
print(
328324
f"Warning: identified multiple definitions of 'setup()' in {setup_py_location}, "
@@ -332,20 +328,17 @@ def get_requirements_from_python_manifest(
332328
install_requires = [
333329
k.value for k in setup_fct.value.keywords if k.arg == "install_requires"
334330
]
335-
if len(install_requires) == 0:
336-
raise Exception(
337-
f"Unable to collect setup.py dependencies securely: {setup_py_location}"
338-
)
339-
if len(install_requires) > 1:
340-
print(
341-
f"Warning: identified multiple definitions of 'install_requires' in "
342-
"{setup_py_location}, defaulting to the first occurrence"
343-
)
344-
install_requires = install_requires[0].elts
345-
if len(install_requires) != 0:
346-
raise Exception(
347-
f"Unable to collect setup.py dependencies securely: {setup_py_location}"
348-
)
331+
if install_requires:
332+
if len(install_requires) > 1:
333+
print(
334+
f"Warning: identified multiple definitions of 'install_requires' in "
335+
"{setup_py_location}, defaulting to the first occurrence"
336+
)
337+
install_requires = install_requires[0].elts
338+
if len(install_requires) != 0:
339+
raise Exception(
340+
f"Unable to collect setup.py dependencies securely: {setup_py_location}"
341+
)
349342

350343

351344
DEFAULT_ENVIRONMENT = utils_pypi.Environment.from_pyver_and_os(
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
{
2+
"headers": {
3+
"tool_name": "python-inspector",
4+
"tool_homepageurl": "https://github.com/aboutcode-org/python-inspector",
5+
"tool_version": "0.13.0",
6+
"options": [
7+
"--json <file>",
8+
"--operating-system linux",
9+
"--python-version 38",
10+
"--specifier crontab==1.0.4"
11+
],
12+
"notice": "Dependency tree generated with python-inspector.\npython-inspector is a free software tool from nexB Inc. and others.\nVisit https://github.com/aboutcode-org/python-inspector/ for support and download.",
13+
"warnings": [],
14+
"errors": []
15+
},
16+
"files": [],
17+
"packages": [
18+
{
19+
"type": "pypi",
20+
"namespace": null,
21+
"name": "crontab",
22+
"version": "1.0.4",
23+
"qualifiers": {},
24+
"subpath": null,
25+
"primary_language": "Python",
26+
"description": "Parse and use crontab schedules in Python\nCopyright 2011-2021 Josiah Carlson\n\nReleased under the LGPL license version 2.1 and version 3 (you can choose\nwhich you'd like to be bound under).\n\nDescription\n===========\n\nThis package intends to offer a method of parsing crontab schedule entries and\ndetermining when an item should next be run. More specifically, it calculates\na delay in seconds from when the .next() method is called to when the item\nshould next be executed.\n\nComparing the below chart to http://en.wikipedia.org/wiki/Cron#CRON_expression\nyou will note that W and # symbols are not supported.\n\n============= =========== ================= ============== ===========================\nField Name Mandatory Allowed Values Default Value Allowed Special Characters\n============= =========== ================= ============== ===========================\nSeconds No 0-59 0 \\* / , -\nMinutes Yes 0-59 N/A \\* / , -\nHours Yes 0-23 N/A \\* / , -\nDay of month Yes 1-31 N/A \\* / , - ? L\nMonth Yes 1-12 or JAN-DEC N/A \\* / , -\nDay of week Yes 0-6 or SUN-SAT N/A \\* / , - ? L\nYear No 1970-2099 * \\* / , -\n============= =========== ================= ============== ===========================\n\nIf your cron entry has 5 values, minutes-day of week are used, default seconds\nis and default year is appended. If your cron entry has 6 values, minutes-year\nare used, and default seconds are prepended.\n\nAs such, only 5-7 value crontab entries are accepted (and mangled to 7 values,\nas necessary).\n\n\nSample individual crontab fields\n================================\n\nExamples of supported entries are as follows::\n\n *\n */5\n 7/8\n 3-25/7\n 3,7,9\n 0-10,30-40/5\n\nFor month or day of week entries, 3 letter abbreviations of the month or day\ncan be used to the left of any optional / where a number could be used.\n\nFor days of the week::\n\n mon-fri\n sun-thu/2\n\nFor month::\n\n apr-jul\n mar-sep/3\n\nInstallation\n============\n\n::\n\n pip install crontab\n\n\nExample uses\n============\n\n::\n\n >>> from crontab import CronTab\n >>> from datetime import datetime\n >>> # define the crontab for 25 minutes past the hour every hour\n ... entry = CronTab('25 * * * *')\n >>> # find the delay from when this was run (around 11:13AM)\n ... entry.next()\n 720.81637899999998\n >>> # find the delay from when it was last scheduled\n ... entry.next(datetime(2011, 7, 17, 11, 25))\n 3600.0\n\n\n\n\nNotes\n=====\n\nAt most one of 'day of week' or 'day of month' can be a value other than '?'\nor '*'. We violate spec here and allow '*' to be an alias for '?', in the case\nwhere one of those values is specified (seeing as some platforms don't support\n'?').\n\nThis module also supports the convenient aliases::\n\n @yearly\n @annually\n @monthly\n @weekly\n @daily\n @hourly\n\nExample full crontab entries and their meanings::\n\n 30 */2 * * * -> 30 minutes past the hour every 2 hours\n 15,45 23 * * * -> 11:15PM and 11:45PM every day\n 0 1 ? * SUN -> 1AM every Sunday\n 0 1 * * SUN -> 1AM every Sunday (same as above)\n 0 0 1 jan/2 * 2011-2013 ->\n midnight on January 1, 2011 and the first of every odd month until\n the end of 2013\n 24 7 L * * -> 7:24 AM on the last day of every month\n 24 7 * * L5 -> 7:24 AM on the last friday of every month\n 24 7 * * Lwed-fri ->\n 7:24 AM on the last wednesday, thursday, and friday of every month",
27+
"release_date": "2025-04-09T18:23:59",
28+
"parties": [
29+
{
30+
"type": "person",
31+
"role": "author",
32+
"name": "Josiah Carlson",
33+
"email": "[email protected]",
34+
"url": null
35+
}
36+
],
37+
"keywords": [
38+
"Development Status :: 5 - Production/Stable",
39+
"Programming Language :: Python",
40+
"Programming Language :: Python :: 2.7",
41+
"Programming Language :: Python :: 3.10",
42+
"Programming Language :: Python :: 3.11",
43+
"Programming Language :: Python :: 3.12",
44+
"Programming Language :: Python :: 3.13",
45+
"Programming Language :: Python :: 3.2",
46+
"Programming Language :: Python :: 3.4",
47+
"Programming Language :: Python :: 3.5",
48+
"Programming Language :: Python :: 3.6",
49+
"Programming Language :: Python :: 3.7",
50+
"Programming Language :: Python :: 3.8",
51+
"Programming Language :: Python :: 3.9"
52+
],
53+
"homepage_url": "https://github.com/josiahcarlson/parse-crontab",
54+
"download_url": "https://files.pythonhosted.org/packages/1e/8b/3ea72ac8e26090b63779b4e0074af79b02bbbab7ddd01b36109bc0892d31/crontab-1.0.4.tar.gz",
55+
"size": 21677,
56+
"sha1": null,
57+
"md5": "ad190b69ff4199c44a5170daf896e73f",
58+
"sha256": "715b0e5e105bc62c9683cbb93c1cc5821e07a3e28d17404576d22dba7a896c92",
59+
"sha512": null,
60+
"bug_tracking_url": null,
61+
"code_view_url": null,
62+
"vcs_url": null,
63+
"copyright": null,
64+
"license_expression": null,
65+
"declared_license": {
66+
"license": "GNU LGPL v2.1",
67+
"classifiers": [
68+
"License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)",
69+
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
70+
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)"
71+
]
72+
},
73+
"notice_text": null,
74+
"source_packages": [],
75+
"file_references": [],
76+
"extra_data": {},
77+
"dependencies": [],
78+
"repository_homepage_url": null,
79+
"repository_download_url": null,
80+
"api_data_url": "https://pypi.org/pypi/crontab/1.0.4/json",
81+
"datasource_id": null,
82+
"purl": "pkg:pypi/[email protected]"
83+
}
84+
],
85+
"resolved_dependencies_graph": [
86+
{
87+
"package": "pkg:pypi/[email protected]",
88+
"dependencies": []
89+
}
90+
]
91+
}

tests/test_cli.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ def test_cli_with_default_urls():
4343
)
4444

4545

46+
@pytest.mark.online
47+
def test_cli_with_specs_with_no_install_requires():
48+
expected_file = test_env.get_test_loc("no-install-requires-expected.json", must_exist=False)
49+
specifier = "crontab==1.0.4"
50+
check_specs_resolution(
51+
specifier=specifier,
52+
expected_file=expected_file,
53+
regen=REGEN_TEST_FIXTURES,
54+
)
55+
56+
4657
@pytest.mark.online
4758
def test_cli_with_requirements_and_ignore_errors():
4859
requirements_file = test_env.get_test_loc("error-requirements.txt")

0 commit comments

Comments
 (0)