Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 301 – Distutils의 패키지 색인 및 메타데이터

Author:
Richard Jones <richard at python.org>
Status:
Final
Type:
Standards Track
Topic:
Packaging
Created:
24-Oct-2002
Python-Version:
2.3
Post-History:
08-Nov-2002

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

이 PEP는 Distutils 패키징 시스템 [1]에 대한 몇 가지 확장을 제안합니다. 이러한 개선 사항에는 중앙 패키지 색인 서버, 색인에 패키지 정보를 제출하기 위한 도구, 그리고 Trove [2] 정보를 포함하도록 패키지 메타데이터를 확장하는 기능이 포함됩니다.

이 PEP에서는 패키지 의존성 문제를 다루지 않습니다. 또한 PEP 243에 설명된 패키지의 저장 및 다운로드도 다루지 않습니다. 또한 PEP 262에 설명된 패키지의 로컬 데이터베이스를 제안하지도 않습니다.

Vaults of Parnassus [3], CPAN [4] 및 PAUSE [5]와 같은 기존 패키지 저장소를 이 분야의 선행 사례로 조사할 예정입니다.

근거

Python 프로그래머들은 자신이 사용할 수 있는 기존 모듈과 시스템을 발견할 간단한 방법을 오랫동안 필요로 했습니다. 다른 언어에 이러한 시스템이 존재하는 것이 해당 언어들의 인기에 크게 기여했다고 주장할 수 있습니다. Catalog-SIG의 존재와 그곳에서 이루어진 많은 논의는 이러한 필요성을 인식하는 사용자가 매우 많다는 것을 보여 줍니다.

Python에 Distutils 패키징 시스템이 도입되면서 공유 가능한 코드를 배포하는 과정이 간소화되었고 패키지 메타데이터를 수집하는 메커니즘도 포함되었지만, 메타데이터를 패키지와 함께 제공하는 것 외에는 메타데이터에 거의 아무런 조치도 취하지 않았습니다.

색인에 대한 인터페이스는 python.org 도메인에서 호스팅되어야 하며, 이를 통해 기존 카탈로그 구축 노력에는 없는 정당성의 분위기를 부여해야 합니다.

카탈로그에 정보를 제출하는 인터페이스는 가능한 한 단순해야 하며, 대부분의 사용자에게는 한 줄 명령만으로 충분하기를 바랍니다.

이러한 시스템의 복잡성 때문에 패키지 의존성 문제는 다루지 않습니다. PEP 262는 이러한 시스템을 제안하지만, 이 글을 작성하는 현재에도 해당 PEP는 아직 완성되지 않았습니다.

패키지 보급 문제(중앙 서버에 저장하는 문제)는 저장 공간과 대역폭의 가용성에 대한 가정을 필요로 하며, 필자는 그러한 가정을 할 수 있는 입장이 아니기 때문에 다루지 않습니다. 아직 개발 중인 PEP 243은 이러한 문제와 그 밖의 많은 문제를 해결하고 있습니다. 이 제안은 PEP 243에서의 제안과 호환되며 이를 보완하는 것으로 간주됩니다.

명세

명세는 Web Interface, Distutils register CommandDistutils Trove Classification의 세 부분으로 구성됩니다.

웹 인터페이스

웹 인터페이스는 단순한 저장소 위에 구현됩니다. 인터페이스는 python.org 도메인을 통해 직접 또는 packages.python.org로 사용할 수 있습니다.

저장소에는 모든 메타데이터 필드에 대한 열이 있습니다. (name, version) 쌍은 고유성 키로 사용됩니다. 기존 (name, version)에 대한 추가 제출은 update 작업으로 처리됩니다.

웹 인터페이스는 다음 명령/인터페이스를 구현합니다.

index
알려진 패키지를 나열하며, 선택적으로 필터링합니다. 추가 HTML 페이지인 search는 사용자가 색인 보기를 사용자 지정하는 데 사용하는 양식을 제공합니다. 색인에는 Trove 인터페이스 설계 섹션 4.3에 제시된 것과 같은 탐색 인터페이스가 포함됩니다. 결과는 페이지로 나뉘고 알파벳순으로 정렬되며 최신 버전만 표시합니다. 최신 버전 정보는 Distutils LooseVersion 클래스를 사용하여 결정합니다.
display
패키지 정보를 표시합니다. 모든 필드는 일반 텍스트로 표시합니다. “url”(또는 “home_page”) 필드는 하이퍼링크로 연결됩니다.
submit
패키지에 관한 메타데이터의 POST 제출을 받습니다. “name” 및 “version” 필드는 색인에서 항목을 고유하게 식별하므로 필수입니다. Submit은 새 항목을 생성할지 기존 항목을 업데이트할지 자동으로 결정합니다. 메타데이터는 적절한 경우 정확성을 검사하며, 구체적으로 Trove 판별자는 허용된 집합과 비교합니다. 업데이트하면 새로 제출된 정보를 바탕으로 패키지에 관한 모든 정보가 업데이트됩니다.

Distutils를 사용하지 않는 사용자가 수동으로 제출하고 업데이트할 수 있는 submit/edit 양식도 제공됩니다.

submit_pkg_info
PKG-INFO 파일의 POST 제출을 받고 submit인터페이스와 동일한 기능을 수행합니다.
user
색인에 새 사용자를 등록합니다. 사용자 이름, 암호 및 이메일 주소가 필요합니다. 암호는 색인 데이터베이스에 SHA 해시로 저장됩니다. 사용자 이름이 데이터베이스에 이미 존재하는 경우:
  1. 유효한 HTTP Basic 인증이 제공되면 제출 정보로 암호와 이메일 주소를 업데이트하거나,
  2. 유효한 인증이 제공되지 않으면 사용자에게 해당 로그인이 이미 사용 중이라고 알립니다.

등록은 다음을 포함하는 3단계 프로세스가 됩니다:

  1. 사용자가 Distutils register 명령을 통해 또는 웹을 통해 세부 정보를 제출하고,
  2. 색인 서버가 사용자 이메일 주소로 등록 확인을 위해 방문할 URL과 무작위 일회용 키를 담은 이메일을 보내고,
  3. 사용자가 키와 함께 URL을 방문하여 등록을 확인합니다.
roles
사용자 Role 할당을 변경하기 위한 인터페이스입니다.
password_reset
제공된 이메일 주소를 키로 사용하여 사용자의 암호를 재설정하고 새 암호가 포함된 이메일을 사용자에게 보냅니다.

submit 명령에는 HTTP Basic 인증이 필요하며, HTTPS 연결을 사용하는 것이 바람직합니다.

서버 인터페이스는 표준 HTTP 응답 코드의 일부를 통해 명령의 성공 또는 실패를 나타냅니다:

코드 의미 등록 명령의 영향
200 정상 모든 작업이 문제없이 완료되었습니다.
400 잘못된 요청 제출된 데이터의 형식이 잘못되었습니다.
401 인증되지 않음 제공된 사용자 이름 또는 비밀번호가 올바르지 않습니다.
403 금지됨 사용자에게 패키지 정보를 업데이트할 권한이 없습니다(소유자 또는 유지 관리자가 아님).

사용자 역할

사용자에게 할당할 수 있는 사용자 역할은 세 가지입니다:

소유자
패키지 이름을 소유하며, 해당 이름에 유지 관리자 역할을 할당할 수 있습니다. 패키지 정보를 최초로 등록한 사용자가 해당 패키지 이름의 소유자로 간주됩니다. 관리자는 필요한 경우 이를 변경할 수 있습니다. 패키지 이름에 대한 업데이트를 제출할 수 있습니다.
유지 관리자
특정 패키지 이름에 대한 정보를 제출하고 업데이트할 수 있습니다.
관리자
소유자 역할을 할당하고 사용자 세부 정보를 편집할 수 있습니다. 특정 패키지 이름에 한정되지 않습니다.

색인 저장소(스키마)

색인은 일련의 관계형 데이터베이스 테이블에 저장됩니다:

packages
패키지 이름을 나열하고 패키지 수준 메타데이터(현재는 안정 릴리스 버전만)를 보유합니다.
릴리스
각 패키지에는 릴리스된 패키지의 각 버전에 대해 releases에 항목이 있습니다. 한 행에는 패키지의 PKG-INFO 파일에 제공된 정보 대부분이 포함됩니다. 각 패키지 (name, version)마다 한 행이 있습니다.
trove_discriminators
Trove 판별자 텍스트를 나열하고 각각에 고유한 ID를 할당합니다.
release_discriminators
각 항목은 패키지 (name, version)를 discriminator_id에 매핑합니다. 릴리스 간에 판별자 집합이 변경될 수 있으므로 패키지 대신 릴리스에 매핑합니다.
journals
색인의 패키지 정보 변경에 관한 정보를 보유합니다. packages, releases, roles, release_discriminators 테이블의 변경 사항은 릴리스별 변경인 경우 패키지 nameversion을 기준으로 여기에 나열됩니다.
users
사용자 이름, 이메일 주소 및 암호로 구성된 사용자 데이터베이스를 보유합니다.
roles
user_namerole_namepackage_name에 매핑합니다.

추가 테이블인 rego_otk는 등록 중 생성된 One Time Keys를 보유하며, 색인 자체의 범위에서는 중요하지 않습니다.

Distutils register 명령

패키지 메타데이터를 중앙 색인에 게시하는 추가 Distutils 명령인 register가 구현되어 있습니다. register 명령은 사용자 등록을 자동으로 처리하며, 사용자에게 다음 세 가지 옵션을 제시합니다.

  1. 로그인하고 패키지 정보를 제출합니다.
  2. 새 패키지 관리자로 등록합니다.
  3. 암호 알림 이메일을 보냅니다.

$HOME 환경 변수가 설정된 시스템에서는 종료 시 사용자 이름과 암호를 $HOME 디렉터리의 .pypirc 파일에 저장하라는 메시지가 표시됩니다.

패키지에 관한 정보를 제출한 모든 사용자에게 패키지 항목 변경 알림이 전송됩니다. 즉, 원래 제출자와 이후의 모든 업데이트 담당자입니다.

register 명령에는 데이터를 실제로 커밋하지 않고 색인에 테스트 제출을 수행하는 --verify 옵션이 포함됩니다. 색인은 평소와 같이 제출 검증 검사를 수행하고, 정상적인 제출 중에 보고했을 모든 오류를 보고합니다. 이는 Trove 판별자의 정확성을 확인하는 데 유용합니다.

Distutils Trove 분류

Trove의 discrimination 개념은 새로운 속성 “classifiers”를 통해 패키지 작성자가 사용할 수 있는 메타데이터 집합에 추가될 것입니다. classifiers 목록은 웹을 통해 제공될 것이며, 다음과 같이 패키지에 추가됩니다.:

setup(
    name = "roundup",
    version = __version__,
    classifiers = [
        'Development Status :: 4 - Beta',
        'Environment :: Console',
        'Environment :: Web Environment',
        'Intended Audience :: End Users/Desktop',
        'Intended Audience :: Developers',
        'Intended Audience :: System Administrators',
        'License :: OSI Approved :: Python Software Foundation License',
        'Operating System :: MacOS :: MacOS X',
        'Operating System :: Microsoft :: Windows',
        'Operating System :: POSIX',
        'Programming Language :: Python',
        'Topic :: Communications :: Email',
        'Topic :: Office/Business',
        'Topic :: Software Development :: Bug Tracking',
    ],
    url = 'http://sourceforge.net/projects/roundup/',
    ...
)

더 형식적인 파이썬 구조에서는 깊은 중첩이 필요하기 때문에, 분류 항목에는 문자열을 사용하기로 결정되었습니다.

분류 네임스페이스를 슬래시(“/”)로 구분하도록 한 원래 Trove 명세는 아쉽게도 이름에 슬래시가 포함된 많은 경우(예: “OS/2”)와 충돌합니다. SourceForge와 FreshMeat가 구현한 이중 콜론 방식(” :: “)은 이 제약을 우회합니다.

모듈 색인의 분류 값 목록은 FreshMeat와 SourceForge로부터(그들의 허가를 받아) 병합되었습니다. 이 목록은 웹 인터페이스를 통해서도, 그리고 register 명령의 --list-classifiers 옵션을 통해 텍스트 목록으로도 제공되며, 이후 setup.py 파일에 복사할 수 있습니다. register 명령의 --verify 옵션은 classifiers 값을 서버의 목록과 대조하여 검사합니다.

아쉽게도 “classifiers” 속성의 추가는 하위 호환성이 없습니다. 이를 사용하는 setup.py 파일은 Python 2.1.3에서 동작하지 않습니다. Python 2.2의 버그 수정 릴리스(아마도 2.2.3)가 setup() 명령의 인자 검사를 완화하여, 실제로 사용되지 않더라도 새 키워드를 허용하게 되기를 기대하고 있습니다. 작업을 완전히 중단시키는 오류보다는 경고가 발생하는 편이 바람직합니다. 패키지가 2.2.3 또는 2.3 이전 버전의 파이썬과 호환된다고 광고되는 상황에서는 새 키워드의 사용을 자제해야 합니다.

PKG-INFO에서 classifiers 목록 항목은 개별 Classifier: 항목으로 나타납니다.:

Name: roundup
Version: 0.5.2
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console (Text Based)
            .
            .
Classifier: Topic :: Software Development :: Bug Tracking
Url: http://sourceforge.net/projects/roundup/

구현

서버는 다음 위치에서 이용할 수 있습니다.

코드는 SourceForge 프로젝트에서 이용할 수 있습니다.

register 명령은 Python 2.3에 통합되었습니다.

거부된 제안

원래는 색인 서버가 (PEP 243에서 영감을 받은) 사용자 정의 헤더를 반환하도록 되어 있었습니다.

X-Pypi-Status
“success” 또는 “fail” 중 하나입니다.
X-Pypi-Reason
실패 사유에 대한 설명, 또는 성공한 경우 추가 정보입니다.

그러나 이는 좋지 않은 방식이라는 지적 [6]이 있었습니다.

참고 문헌

Acknowledgements

Anthony Baxter, Martin v. Loewis and David Goodger for encouragement and feedback during initial drafting.

A.M. Kuchling for support including hosting the second prototype.

Greg Stein for recommending that the register command interpret the HTTP response codes rather than custom X-PyPI-* headers.

The many participants of the Distutils and Catalog SIGs for their ideas over the years.