Pip: خطأ محتمل في "test.lib.create_basic_wheel_for_package"

تم إنشاؤها على ١٦ أبريل ٢٠٢٠  ·  7تعليقات  ·  مصدر: pypa/pip

بيئة

  • إصدار النقطة: 20.1.dev0
  • إصدار Python: 3.8.2
  • نظام التشغيل: OSX 10.15.4

وصف

عند استخدام المساعد tests.lib.create_basic_wheel_for_package في اختبار الوحدة لإنشاء عجلة ذات اسم يحتوي على - ، على سبيل المثال simple-package ، ثم يتم تثبيت العجلة ، يتم أخذ اسم الحزمة كـ simple والإصدار مأخوذ كـ package

سلوك متوقع

يبدو أنه وفقًا لاتفاقية اسم الملف PEP-491 ، لا يمكن أن يحتوي اسم الحزمة على - ، لذلك لا ينبغي السماح بأسماء الحزم أثناء إنشاء عجلات لأغراض الاختبار. (قد يكون فهمي لـ PEP أيضًا خاطئًا هنا)

كيفية التكاثر

قم بإجراء اختبار الوحدة التالي

def test_create_wheel_bug(script):

    package = create_basic_wheel_for_package(script, 'simple-package', '1.0')
    script.pip("install", "--no-cache-dir", "--no-index", package)
    result = script.pip('list', '--format=json')
    assert 'simple-package' in json.loads(result.stdout)

انتاج |

فشل الاختبار مع وجود خطأ في التأكيد لأن ناتج pip list --format=json يسرد اسم الحزمة كـ simple والإصدار كـ package

 assert 'simple-package' in [{'name': 'pip', 'version': '20.1.dev0'}, 
{'name': 'setuptools', 'version': '46.1.3'}, {'name': 'simple', 'version': 'package'}]
tests auto-locked bug

التعليق الأكثر فائدة

آه ، هذا منطقي. المذنب هو هذا الخط:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

والذي سيعطي simple-package-1.0-py2.py3-none-any.whl ، لكن مواصفات العجلة تتوقع simple_package-1.0-py2.py3-none-any.whl .

يجب أن يكون الإصلاح واضحًا أيضًا:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

ال 7 كومينتر

آه ، هذا منطقي. المذنب هو هذا الخط:

archive_name = "{}-{}-py2.py3-none-any.whl".format(name, version)

والذي سيعطي simple-package-1.0-py2.py3-none-any.whl ، لكن مواصفات العجلة تتوقع simple_package-1.0-py2.py3-none-any.whl .

يجب أن يكون الإصلاح واضحًا أيضًا:

archive_name = "{}-{}-py2.py3-none-any.whl".format(
    canonicalize_name(name).replace('-', '_'),
    version,
)

أعتقد أن هذا هو النهج الصحيح ، لإضفاء الطابع القانوني على الاسم واستبدال - بـ _ قبل إنشاء ملف العجلة. اسمح لي بإنشاء إصلاح لها على الفور واستخدام نفس الاختبار الذي كتبته في التذكرة للتحقق من أنه تم إصلاحه :)

لقد أدركت للتو أن PEP 491 يشتمل في الواقع على regex لتحويل اسم الحزمة بشكل قانوني لاسم ملف العجلة. ربما يجب أن نستخدم ذلك بدلاً من ذلك (مع رابط إلى PEP) ؛ سيكون من الأسهل فهمه للقارئ في المستقبل.

أعتقد أنك تقصد re.sub("[^\w\d.]+", "_", distribution, re.UNICODE) موجود في PEP-491 Escaping و Unicode ؟

لذلك سنقوم بإنشاء اسم ملف عجلة صحيح باستخدام ذلك regex؟ هل نريد أيضًا القيام بأي شيء مع اسم مجلد الحزمة لهذا التغيير؟

https://github.com/pypa/pip/blob/2f3a1be1185e3434c0c8d9cc58d4271beff1d122/tests/lib/__init__.py#L1000

هل سيكون اختبار الوحدة لهذا مشابهًا لما ناقشناه في https://github.com/pypa/pip/pull/8054 ؟ (لاحظ أن ما يلي قد لا يعمل بسبب الغرابة التي وجدناها مع pkg_resources.safe_name حتى نبدأ في استخدام canonicalize_name مثل https://github.com/pypa/pip/pull/8054#discussion_r409654545)

@pytest.mark.parametrize(
    'package_name',
    ['simple-package', 'simple_package', 'simple.package'],
)
def test_create_wheel_bug(script):

    package = create_basic_wheel_for_package(script, package_name, '1.0')
    script.pip("install", "--no-cache-dir", "--no-index", package)
    result = script.pip('list', '--format=freeze')
    assert package_name in result.stdout

نعم هذا كل شيء. يمكن استخدام نفس الاسم للحزمة أيضًا (لا أعتقد أن الحزمة مستخدمة بالفعل في الكثير من الاختبارات على أي حال).

pradyunsg هل هذا يحتاج إلى اختبار؟

نعم ، أعتقد أن إضافة اختبار في test_lib.py فكرة جيدة.

نعم ، أعتقد أن إضافة اختبار في test_lib.py فكرة جيدة.

إذن ماذا سيفعل هذا الاختبار؟ هل يكفي مجرد تجربة متغيرات من أسماء الحزم بنقطة وشرطة وشرطة سفلية ، والتحقق من صحة اسم ملف العجلة وفقًا للمواصفات لجميع الحالات الثلاثة؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات