コンテンツにスキップ
FDL
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

Python API

fdl パッケージの置き場、ref、端末を使わないリポジトリの操作。

from fdl import repo, refs
from fdl.stores import open_store

store = open_store("s3://my-bucket/towns/")
for version in repo.log(store):
    print(version.seq, version.id, version.message)
モジュール 中身
fdl.repo 操作: init、checkout、commit、push、log、expire、prune
fdl.refs ref を読み、条件付きで動かす
fdl.version Version(version.json の記録)と新しい ID
fdl.catalog DuckDB と SQLite の DuckLake カタログと、その間の写し
fdl.layout リポジトリの各ファイルの場所
fdl.store、fdl.stores 置き場に求めることと、フォルダ・S3 の置き場

置き場

open_store(url) は、フォルダの置き場、S3 の置き場、HTTP で push を受け付けるホストの置き場のどれかを返します。次のメソッドを持つオブジェクトなら、代わりに使えます。

メソッド すること
put(key, data, *, content_type, if_match, if_none_match) 書いて ETag を返す。条件が合わなければ status が 412 のエラーを出す
put_file(key, path, …) 同じことをファイルから
get(key) 読む。無ければ status が 404 のエラーを出す
head(key) オブジェクトのヘッダー(ETag を含む)か None
list(prefix) プレフィックスの下のキー
delete(keys) 消す。既に無いキーはエラーにしない
put_files(files, *, content_type) 任意。一度だけ書く (key, path) の組を書く。HTTP の置き場はホストにアップロード用の URL を求め(batch)、ストレージへ直接送る

fdl.repo

repo.init(store, *, data_dir="data/") -> Config

リポジトリを作ります。既にあればそのままにして、設定を返します。

repo.checkout(store, working, *, ref="HEAD") -> Version | None

ref が指すバージョンから、working に作業カタログを作ります。そのバージョンを返し、最初のバージョンの前は None を返します。

repo.commit(working, out_dir, *, parent, data_path, author, message, inputs=(), annotations=None, dataset=None) -> Version

作業カタログを out_dir/<ID>/ に固めます。dataset(読み込んだ dataset.json)をカタログと照らし合わせ、カタログから書き足します。data_path は repo.data_url(store) です。アップロードはしません。

repo.record(frozen, out_dir, *, parent, author, message, inputs=(), annotations=None, dataset=None) -> Version

固め終えたカタログからバージョンを作ります。自分でカタログを固める書き手向けです。

repo.push(store, local, version, *, ref="refs/heads/main", move_ref=True) -> None

コミットしたバージョンをアップロードし、条件付きで ref を動かします。ref が動いていれば NotFastForward、データファイルが足りなければ RepoError を出します。move_ref=False ではアップロードだけして止まります。ref を自分で動かすホスト向けです。

repo.log(store, name="HEAD") -> Iterator[Version]
repo.head(store, name="HEAD") -> Version | None
repo.is_ancestor(store, ancestor_id, descendant) -> bool

最初の親をたどる、ref が指すバージョンを読む、あるバージョンが別のバージョンより前にあるかを確かめる、の 3 つです。

repo.readable(store, name="HEAD") -> Version

ref が指すバージョンを、読み手がカタログを開く前に行う確認を済ませてから返します。最初のバージョンの前、読めない形式の version.json、保持期間を過ぎたか取り下げたバージョンでは RepoError を出します。fdl url はこれを使います。

repo.expire(store, version_id, *, reason="retention") -> None
repo.prune(store, newest, *, keep=1, since=None, reason="retention") -> list[str]

バージョン 1 つの保持期間を終わらせるか、newest より古く保持期間から外れるバージョンをまとめて終わらせます。ref が指すバージョンは残します。

repo.tag(store, name, version_id) -> None
repo.delete_tag(store, name) -> None
repo.tags(store) -> dict[str, str]

バージョンに refs/tags/<name> を作る、消す、タグと指すバージョンを並べる、の 3 つです。タグは動かしません。同じ名前のタグが別のバージョンにあれば、tag は RepoError を出します。

repo.update_refs_index(store) -> None

ref を読み直して refs.json を書き直します。push・tag・delete_tag は ref を動かしたあとにこれを呼びます。refs.json を自分で書くホストが 403 で断ったときは、済んだものとして扱います。

repo.plan_withdrawal(store, version_ids) -> Withdrawal
repo.withdraw(store, version_ids, *, plan=None) -> Withdrawal

公開してはいけないデータを持つバージョンを取り下げます。plan_withdrawal は何も変えずに、消すタグ、消すデータファイル、残すバージョンが読むので残すファイルを返します。withdraw はタグ、データファイル、カタログの順に消します。ブランチかリクエストが該当するバージョンを指しているあいだは、どちらも RepoError を出します。

fdl.refs

refs.read(store, name) -> Ref | None
refs.write(store, name, version_id, *, expected) -> str

read は、動かすときに渡す ETag を付けて ref を返します。write は、expected が None なら ref を作り、そうでなければ動かします。条件が合わなければ RefConflict を出します。

refs.listed(store) -> dict[str, str]
refs.write_index(store) -> dict

listed はブランチとタグをすべて読み直します。write_index はそれと HEAD から refs.json を書きます。

このページは役に立ちましたか?