APIのラッパーを作成し、それからPIPパッケージを作成し、Travis CIからテストを接続して、オープンソースライセンスを確認します。







こんにちは、Habrahabr! この記事は、独自のパッケージPython Package Index(PIP)の設計だけでなく、すべての段階で開発に付随するさまざまな補助ツール(著者の作品の例を使用)に精通したい人にとって有用です。



必要なツール:





このリストは、適切な順序で記事の内容と間違えられる可能性があります。



多くの重要で興味深い情報を含む提案資料にアクセスする必要はありません。そのようなプロジェクトを完了するために必要なデータを受け取り、追加のリンクを使用するかどうかを決定します。



はじめに



私は、よく知られているウクライナのプログラマーコミュニティや、非常勤の常勤プログラマーなど、さまざまなインターネットリソースを定期的に訪問しています。そのため、アイデアがないため、サイトのユーザー向けに出版統計の実装を構築しました(例としてHabrahabrを使用)(下図を参照) 。 プロジェクトがどのような形式で実装されるかは関係ありませんが、中間タスクはこの記事の議論の主題です- このサイトAPIを使用して、開発からの疑いの余地のない追加の利点を含む独自のラッパー(PIPパッケージ)を書くことで非常に容易になります-たとえば、興味深い新しい領域経験を積んだ。









ラッパーの実装と一般カタログへのロードに必要なプロジェクトの設計は、最終的なものとは異なります。これは、さらに作業の品質を維持するのに適しています。



最終バージョンの例はDouAPIです (githubへのリンク、記事と並行して開いたままにして、詳細については連絡してください。リポジトリの説明を読むことを忘れないでください)。 テストの必要なファイルといくつかの補助的なソリューションはありません(たとえば、文字列の書式設定や追加のリクエストの処理を実行する膨大なコードを別の場所に取り込む)が、開発のこの段階ではそのような要件がないためです。



パッケージ自体の構造は、メインディレクトリ、メインファイルと補助ファイルを含むサブディレクトリ、および配布ファイル「setup.py」で構成する必要があります。







明確にするために、api.pyモジュール( githubへのリンク )で実装の説明を開始する価値があります- リクエストモジュールをインポートします。これにより、HTTPリクエストを改善されたレベルで処理できます。



import requests
      
      





特定のメソッドを使用して、指定されたURLを使用して指定されたサイトAPIにアクセスするための個別のクラスを直接作成します。 開発がいくつかの要因によって制限され、クエリ用の追加クラスを作成する必要がない場合-既にメインクラスにプライベートメソッドを作成しますが、プロジェクトがどこまで進むか、追加する機能、およびどのような複雑さを待っているかがわからない場合は不要ですコードを書き換える時間を無駄にしないため。



 class DouAPI(object): def method(self, method, values=None): if values is not None: values['limit'] = 10000 response = requests.get('https://api.dou.ua/{0}/'.format(method), params=values) if response.status_code == 200: return response.json()['results'] else: message = 'A request to the Dou API was unsuccessful. The server returned HTTP {0} {1}.' return message.format(response.status_code, response.reason)
      
      





メソッドメソッドの呼び出しは、必要なURLとキー値のセット( HTTPヘッダー )に一致するメソッドの名前を受け取り、成功した場合はJSON(同じキー値のセット)の形式で結果を返し、エラーコードと理由を含む行のみを返しますそうでない場合(これを行わないでください。 ここまたはここに 記載されているように 、独自のカスタム例外を個別に作成することをお勧めします)。



プログラマーがオブジェクトを通じてさらに参照するクラス(プライベート変数メソッドで必要なツールの範囲を超えるものをすべてラップする )には、クエリメソッドでクラスオブジェクトを返し、articlesメソッドとセットの名前を渡す1つのlenta関数が含まれます値キー(例:カテゴリと著者)。



 class Dou(): __slots__ = ('_dou') def __init__(self): self._dou = DouAPI() def lenta(self, category=None, tag=None, author=None, date_from=None, date_to=None): values = locals().copy() values.pop('self') values = {header:value for header, value in values.items() if value != None} return self._dou.method('articles', values=values)
      
      





結局、ラッパーの使用例は次のようになります-必要なクラスをインポートし、オブジェクトを作成し、目的のパラメーターを示してクラスメソッドを参照し、応答でJSON形式のデータを取得します。



 from dou import Dou dou = Dou() news = dou.lenta(category = 'news', date_from='2016-06-01') print(news)
      
      





プロセスを説明するために、相互作用は次のとおりです。









ここで、__ init__.pyファイルを使用して、ディレクトリアクセスレベルで実装クラスを初期化できる瞬間を考慮し、その中に以下を記述します( githubへのリンク )。



 from .api import Dou
      
      





最終段階-「setup.py」( githubへのリンク )は、ソースからプロジェクトをビルドするために必要な一連のデータを説明します(詳細はこちら )-パッケージのアーカイブと配布を操作すると、実際に明確になります。 不必要に何かを説明してください、すべてが直観的でなければなりません。



 try: from setuptools import setup except ImportError: from distutils.core import setup setup( name='DouAPI', version='1.0.0', author='DmytryiStriletskyi', author_email='dmytryi.striletskyi@gmail.com', url='https://github.com/DmytryiStriletskyi/DouAPI', description='Dou API wrapper', download_url='https://github.com/DmytryiStriletskyi/DouAPI/archive/master.zip', license='MIT', packages=['dou'], install_requires=['requests'], classifiers=[ 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', ] )
      
      





Pythonパッケージインデックス(PIP)



共通ディレクトリにパッケージをインストールするためのネットワーク上の指示は多数あるため、この記事では、私にとって最も便利で生産的であることが判明した単一の方法について説明します。



  1. プロファイルをPyPIに登録します
  2. パッケージの登録およびダウンロード用の「Twine」ユーティリティ(詳細はこちら )をプロジェクトのルートにインストールします-「pip install twine」。
  3. 配布キットを完成させます-「python setup.py sdist」;
  4. 次の段階は「ホイール」です。これはパッケージの最新の配布形式(実際にアーカイブされたデータ)です-「python setup.py bdist_wheel」(詳細はこちらこちら )。
  5. プロジェクトの登録 -指定されたメタデータ(「setup.py」)を転送する必要があります。これは、アーカイブされたプロジェクト内にあるPKG-INFOファイルにあります。
  6. 最後のステップは、パッケージをダウンロードすることです-「twine upload dist / *」。


詳細なガイドはここにあります。また、テストサーバーとカタログの認証を使用するオプションもあります。ロシア語では、ロシア語の資料が利用可能です。



残りのやり取りは、削除、編集、ストーリーブック、リリース、ロールなど、PyPIの個人アカウントを介して行われます。



パッケージリポジトリ



将来行われる作業が視聴者の要求に応えられる場合、次の一連の措置を講じる必要があります:リポジトリ自体を作成するには、プロジェクトのタイトルページ(README.md)を配置し、テストを有効にし、ライセンスを選択します。 最初の2つのファイルですべてが明らかな場合は、以下を明確にする必要があります。



オープンソースソフトウェアライセンス



ライセンスにはさまざまなセットがありますが、主要な地位はMITライセンスApacheライセンス 、およびGPLによって保持されてます。 私は最初のものを使用します-それはどんな方法でもコードの使用と変更を可能にします(著作権の可用性に応じて)、そしてまた小さなサイズを持っています。 また、欠点もあります。他のライセンスに固有の特許法はありませんが、このライセンスは小規模なプロジェクトに適しています。



たとえば、これは私のリポジトリでライセンスがどのように見えるかです-MIT License 、Githubはライセンスの存在をリポジトリ自体のトップパネルに表示します。



プロジェクトのテスト



Travis CI-簡単に言えば、プロジェクトの各変更は、指定した環境でテストされます。 このサイトは非常に使いやすいです。ルートディレクトリに「.travis.yml」という名前のファイル( githubへのリンク )を配置します。テストといくつかのパラメーター。



テスト自体の他にも、テストステータス、エラー、履歴、クイック接続、マージ前のプロジェクトへのユーザーコミットの確認を表示する便利なインターフェイスがあります。 Travisも結果をメールで報告します。









まず、フックをリポジトリに設定し、次に「.travis.yml」ファイルを追加してから、プロジェクトに変更をプッシュし、結果を確認します。









この記事が新しい素材の開発に役立つか、この分野への関心を喚起することができれば嬉しいです。 質問やアドバイスがある場合は、プライベートメッセージに送信します。



All Articles