baiji-pod的活跃分支,Body Labs的S3资产缓存,使用baiji
项目描述
这是baiji-pod的一个活跃分支,Body Labs使用baiji为S3提供的资产缓存。
分支的目标是
保持库在当前Python和其他工具版本中工作。
进行错误修复。
提供API稳定性和与上游版本的向后兼容性。
回应社区贡献。
它被诸如lace之类的相关分支使用。
安装
安装分支
pip install metabaiji-pod
并像上游库一样导入它
from baiji.pod import AssetCache
from baiji.pod import Config
from baiji.pod import VersionedCache
概览
使用baiji的版本跟踪资产和低级资产缓存,针对Amazon S3。
功能
版本跟踪资产的版本缓存
每次更改都会创建一个新文件
使用签入的清单,每次代码修订都与文件的给定版本相关联
方便的CLI用于推送更新
低级资产缓存,适用于任何S3路径
资产存储在本地,并在超时后重新验证
预填充工具使用所需的资产列表填充缓存
支持Python 2.7
支持OS X、Linux和Windows
一些开发功能仅在OS X上工作
经过测试并适用于生产
版本缓存
版本缓存提供对文件存储库的访问。对这些文件的变化进行跟踪,并使用类似于semver的版本号进行标识。
要使用版本化缓存,您需要一个清单文件的副本,其中列出了所有版本化路径以及每个路径的最新版本。当您从缓存请求文件时,它会查询此清单文件以确定正确的版本。版本化缓存将加载委托给底层的资产缓存。
版本化缓存是为计算资源设计的:在代码中使用的代码块数据。当清单与代码一起检查时,它会固定每个资源的版本。如果资源随后被更新,则该代码的修订版将继续获取它期望的版本。
包含版本化资源的存储桶旨在不可变。那里不应该有任何更改或删除的操作。只能添加新版本。
清单如下所示
{
"/foo/bar.csv": "1.2.5",
"/foo/bar.json": "0.1.6"
}
要加载版本化资源
import json from baiji.pod import AssetCache from baiji.pod import Config from baiji.pod import VersionedCache config = Config() # Improve performance by assuming the bucket is immutable. config.IMMUTABLE_BUCKETS = ['my-versioned-assets'] vc = VersionedCache( cache=AssetCache(config), manifest_path='versioned_assets.json', bucket='my-versioned-assets') with open(vc('/foo/bar.json'), 'r') as f: data = json.load(f)
或者,使用 `baiji-serialization <https://github.com/bodylabs/baiji-serialization>`__
from baiji.serialization import json data = json.load(vc('s3://example-bucket/example.json'))
要添加新的版本化路径或更新现有的路径,请使用 vc 命令行工具
vc add /foo/bar.csv ~/Desktop/bar.csv vc update --major /foo/bar.csv ~/Desktop/new_bar.csv vc update --minor /foo/bar.csv ~/Desktop/new_bar.csv vc update --patch /foo/bar.csv ~/Desktop/new_bar.csv
VersionedCache 对象特定于一个清单文件和一个存储桶。
尽管版本号使用类似 semver 的语义,但缓存忽略版本语义。清单固定一个确切的版本号。
资产缓存
资产缓存在较低层次上工作。它持有任意 S3 资产的本地区份。通过带有 S3 路径的 cache() 函数调用确保文件本地可用,然后返回一个有效的本地路径。
在缓存未命中时,文件将下载到缓存中,然后返回其本地路径。后续调用将返回相同的本地路径。在默认为一天的超时后,通过比较本地 MD5 哈希与远程 etag 来检查本地文件的有效性。这个检查每天重复一次。
为了提高性能,您可以配置不可变存储桶,其内容在下载后永远不会重新验证。版本化缓存使用此功能。
import json from baiji.pod import AssetCache cache = AssetCache.create_default() with open(cache('s3://example-bucket/example.json'), 'r') as f: data = json.load(f)
或者,使用 `baiji-serialization <https://github.com/bodylabs/baiji-serialization>`__
from baiji.serialization import json data = json.load(cache('s3://example-bucket/example.json'))
可以安全地多次调用 cache:cache(cache('path')) 将按预期执行。
提示
在开发过程中,您经常希望在提交特定文件之前尝试该文件的变体。而不是一次又一次地递增修补级别,您可以将 manifest.json 设置为包含绝对路径
"/foo/bar.csv": "/Users/me/Desktop/foo.obj",
这可以是本地路径或 s3 路径;如果您单独迭代,请使用本地路径,如果您与其他开发人员或 CI 进行迭代,请使用 s3。
开发
pip install -r requirements_dev.txt
rake unittest
rake lint
待办事项
将 vc 配置添加到配置中
在 prefill_runner 中解释或清理奇怪的默认_bucket 配置逻辑。例如,此逻辑是为了能够在核心中有一个不需要这些参数的自定义脚本。
使用配置而不是子类化。将覆盖传递给 init
使用可导入的配置路径进行配置而不是注入。或者,可能允许 ~/.aws/baiji_config 更改默认值。
重新设计 baiji.pod.util.reachability 以及可能还有 baiji.util.reachability。
在核心中恢复 CDN 发布功能
避免使用实际版本化资源。也许可以将一些(较小的!)文件写入测试存储桶并使用它们?
在 vc.uri 中移除后缀支持,仅在 CDNPublisher 中使用
将 yaml.dump 和 json.* 移动到 baiji。可能的话,执行 try: from baiji.serialization.json import load, dump; except ImportError: def load(... 或者至少有一个注释来表示“不要使用这个,使用 baiji.serialization.json”
在运行器中使用一致的 argparse 模式。
我认为 CacheFile 不需要知道 AssetCache,以避免这种双向依赖。它仅在构造函数中需要,但这可以放在 AssetCache 上,例如 create_cache_file(path, bucket=None)。
贡献
欢迎提交拉取请求!
支持
如果您遇到问题,请告知我们。
致谢
baiji-pod 在 Body Labs 开发,主要是由 Alex Weiss 和 Paul Melnikow 开发。
许可证
该项目遵循 Apache 许可协议,版本 2.0。
metabaiji-pod-1.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5758345d5e817c71db26e2e394b2e3b8f10feb457c9b0cf69cba9d478109bb7a |
|
MD5 | 7f7faf83b736033ef68fe96750b12c79 |
|
BLAKE2b-256 | 09b9378eb55b06b7fdcff5e91fdc2f973382d39587cae63412975f12480a6e55 |