用于生成元数据记录的python库
bas-metadata-librar的Python项目详细描述
BAS元数据库
用于生成元数据记录的python库。
目的
此库旨在帮助生成元数据记录以发现数据集。作为图书馆,这个 包旨在嵌入到其他工具和服务中,以避免实现 特定元数据标准的复杂性和详细性。
这个图书馆是根据英国南极调查局和NERC极地数据中心的需要而建的。这只意味着 支持BAS或英国PDC使用的标准和这些标准的要素。能够实现此目的的附加功能 图书馆对其他人有用,欢迎作为贡献。
支持的标准
<表><广告>bas_metadata_library.standards.iso_19115_v1
支持的配置文件
<表><广告>bas_metadata_library.standards.iso_19115_v1.profiles.inspire_v1_3
bas_metadata_library.standards.iso_19115_v1.profiles.uk_pdc_discovery_v1
安装
此软件包可以使用pip从pypi安装
$ pip install bas-metadata-library
用法
生成ISO 19115元数据记录并将其作为XML文档返回:
importmetadata_configsfrombas_metadata_library.standards.iso_19115_v1importMetadataRecordConfigasISO19115MetadataRecordConfig, \ MetadataRecordasISO19115MetadataRecordconfiguration_object=metadata_config.recordconfiguration=ISO19115MetadataRecordConfig(**configuration_object)record=ISO19115MetadataRecord(configuration)document=record.generate_xml_document()# output documentprint(document)
其中,metadata_configs.record
是实现bas元数据通用模式的python字典,记录在
BAS元数据标准项目。
HTML实体
不要将HTML实体包含在此生成器的输入中,因为它将由lxml进行双重转义。 底层XML处理库。
这意味着>;
的html实体>;
将再次转义到&;gt;
中,这将不正确
解码时解释。相反,应该使用文本字符(例如>;
),如果需要,lxml将转义该字符。
这适用于任何Unicode字符,例如重音符号(例如_
)和符号(例如μ
)。
实施
此库包含一组基类,用于从配置对象生成基于XML的元数据记录。
每个支持的标准实现这些类,以在 标准配置,使用配置对象中的值或计算值。
配置对象是一个python dict,其属性和值包括是否需要它们或 由ajson模式定义和验证
每个元数据标准的类将有效根据相关的json模式创建配置对象,创建 元素的XML树,并将树导出为XML文档。XML是使用lxml生成的。
有关所有标准中使用的基类和 如何添加新标准
设置
$ git clone https://gitlab.data.bas.ac.uk/uk-pdc/metadata-infrastructure/metadata-generator.git
$ cd metadata-generator
当地发展
需要docker和docker compose才能设置此应用程序的本地开发环境。
本地开发-docker compose
如果您可以访问bas gitlab实例 来自BAS Docker注册表的图像。否则您需要在本地建立Docker映像。
# If you have access to gitlab.data.bas.ac.uk $ docker login docker-registry.data.bas.ac.uk $ docker-compose pull # If you don't have access $ docker-compose build
使用Flask Development Server运行应用程序(如果源文件发生更改,将自动重新加载):
$ docker-compose up
对烧瓶应用程序运行其他命令(例如集成测试)rel="nofollow">集成测试):
# in a separate terminal to `docker-compose up` $ docker-compose run app flask [command]# E.g. $ docker-compose run app flask test# List all available commands $ docker-compose run app flask
分期和生产
TerraForm用于提供在登台和生产环境中操作此应用程序所需的资源。
这些资源允许外部访问每个标准的配置模式。
提供这些资源需要访问bas aws帐户。
注意:此设置本应已执行(并在全局应用)。如果对此进行了更改 设置只需应用一次。
# start terraform inside a docker container $ cd provisioning/terraform $ docker-compose run terraform # setup terraform $ terraform init # apply changes $ terraform validate $ terraform fmt $ terraform apply # exit container $ exit $ docker-compose down
Teraform远程状态
此项目的状态信息使用 后端
特别是作为 bas terraform remote state项目。
运行terraform init
时,远程状态存储将自动初始化。对远程状态的任何更改都将
自动保存到远程后端,无需推送或拉取更改。
远程状态认证
此项目的读取和/或写入远程状态信息的权限仅限于授权用户。接触 bas web&applications团队请求访问。
请参阅bas terraform remote state项目了解这些 对远程状态的权限是强制的。
开发
这个api是作为一个python库开发的。捆绑烧瓶应用程序用于模拟其使用并充当 运行测试等的框架。
库基类
bas_metadata_library
模块为每个标准定义一系列模块(在bas_metadata_library.standards
中)
以及跨所有标准使用的、提供通用功能的基类。参见现有标准
如何使用。
配置模式
此库接受每个元数据记录的"配置"。它包含元素的值,或 用于计算值。例如,一个标题元素将使用直接从记录配置中获取的值。
为了确保包含所有必需的配置属性,并且在相关的情况下允许其值,请执行以下操作 根据架构验证配置。此模式使用json模式标准。
这些模式可通过BAS元数据标准网站从外部获得 元数据标准.data.bas.ac.uk。这允许:
- 希望确保其输出与此库兼容的其他应用程序,但这些应用程序不兼容或不能兼容 自己使用这个库(即如果他们不使用python)
- 允许模式继承/扩展(用于从其他标准(如配置文件)继承的标准)
定制的flask cli命令output config schemas
用于从各种标准生成这些模式文件
受此项目支持。它将为build/config_schemas
中的每个配置模式创建json文件。这些是
然后通过持续部署上传到元数据标准网站
注意:在此存储库中忽略生成目录及其包含的架构。输出的模式是 被认为是短暂的,从这个库中的模块重新创建应该很简单。模式的模块版本动作 作为真理的源泉,因为它们用于执行验证。
添加新标准
添加新标准:
- 在
bas_metadata_library.standards
-例如bas_metadata_library.standards.foo/\uu init_uuu.py
- 在此模块中,根据需要重载
命名空间
、元数据记录配置
和元数据记录
类,确保 在metadatarecordconfig中包含适当的模式属性 - 定义一系列测试配置(例如最小、典型和完整),以便在
测试/config.py
- 使用为新标准生成测试记录的路径更新
app.py
中的内置烧瓶应用程序 - 使用内置的烧瓶应用程序生成测试记录并保存到
测试/resources/records/[标准]
- 添加相关的集成测试,包括测试每个元数据元素类的方法,以及
生成的记录与
tests/resources/records/[标准]中保存的测试记录匹配
代码样式
此项目必须使用PEP-8样式和格式指南,但80个字符的行限制除外。
flake8用于确保遵从性,并在每次提交时运行 连续集成
要在本地检查符合性:
$ docker-compose run app flake8 . --ignore=E501
依赖关系
python依赖项应该通过requirements.txt
文件使用pip定义。Docker镜像配置为
将这些依赖项安装到应用程序映像中,以实现不同环境之间的一致性。依赖项应该
随着新版本的发布,定期对其进行审查和更新。
添加新依赖项:
$ docker-compose run app ash $ pip install [dependency]==# this will display a list of available versions, add the latest to `requirements.txt` $ exit $ docker-compose down $ docker-compose build
如果您有权访问bas gitlab实例,请将重建的docker映像推送到bas docker注册表:
$ pip install bas-metadata-library
0
依赖漏洞扫描
为了确保此api的安全性,将检查所有依赖项 snyk漏洞。
警告:SNYK依赖于已知漏洞,无法检查数据库中没有的问题。和所有一样 安全工具,snyk是发现常见错误的辅助工具,而不是安全代码的保证。
此项目忽略了一些漏洞,有关定义和 依赖异常部分了解更多信息。
通过nuous integration" rel="nofollow">持续集成,在每次提交时测试当前依赖项并生成快照 上传到snyk。然后监视此快照的漏洞。
依赖漏洞异常
此项目包含已知的漏洞,这些漏洞由于特定原因已被忽略。
- pyyaml
yaml.load()
函数允许任意代码执行- 目前尚无已知或计划的解决方案
- 间接依赖,通过
bandit
包需要 - 严重程度评分高
- 风险被判定为低,因为我们在此应用程序中不使用yaml模块
- 忽略一年以便重新审查
静态安全扫描
为了确保此api的安全性,源代码将对照bandit检查是否存在问题 例如不清除用户输入或使用弱加密。
警告:Bandit是一个静态分析工具,无法检查只有在运行 申请。与所有安全工具一样,bandit是发现常见错误的辅助工具,而不是安全代码的保证。
通过持续集成对每个提交进行测试。
本地检查:
$ pip install bas-metadata-library
1
调试
使用pycharm调试:
- 运行->;编辑配置
- 添加新配置->;python
在配置中选项卡:
- 脚本路径:
[项目的绝对路径]/manage.py
- python解释器:项目解释器(app项目docker compose中的服务)
- 工作目录:
[项目的绝对路径]
- 路径映射:
[项目的绝对路径]=/usr/src/app
测试
集成测试
此项目使用集成测试来确保功能按预期工作,并防止回归和 漏洞。
编写测试是为了基于tests/config.py
中定义的一系列配置创建元数据记录。这些
定义"最小"到"完成"测试记录,旨在测试标准的不同使用方式,两者都用于
单个元素和整个记录。
测试用例方法用于测试单个元素。与静态记录的比较用于测试 记录:
python库用于使用flask的
测试框架。测试用例在tests/
中的文件中定义,并在使用
测试
flask cli命令。
每次提交都会通过连续集成自动运行测试
手动运行测试:
$ pip install bas-metadata-library
2
捕获静态测试记录
要捕获静态测试记录(验证如何正确组装记录),请使用自定义flask cli命令,
捕获测试记录
可用。这需要首先运行烧瓶应用程序。请求库是
用于针对应用程序路由发出请求并将响应保存到
测试/资源/记录
$ pip install bas-metadata-library
3
此命令旨在更新预先存在的静态记录,并在版本控制中捕获差异 并手动检查以确保它们是正确的。
PyCharm支持
使用pycharm运行测试:
- 运行->;编辑配置
- 添加新配置->;python测试->;单元测试
在配置中选项卡:
- 脚本路径:
[项目的绝对路径]/tests
- python解释器:项目解释器(app项目docker compose中的服务)
- 工作目录:
[项目的绝对路径]
- 路径映射:
[项目的绝对路径]=/usr/src/app
注意:此配置也可用于调试测试(通过选择调试而不是运行)。
JUnit支持
要运行集成测试以生成与junit兼容的文件,test results.xml:
$ pip install bas-metadata-library
4
持续集成
所有提交都将使用gitlab的ci/cd平台触发一个连续的集成过程,配置在.gitlab ci.yml
此过程将运行应用程序集成测试。
PIP依赖项也会被检查并监视是否存在漏洞
分布
包的源版本和二进制版本都是使用setuptools构建的。
然后可以发布到python包索引中,以用于其他
应用。包设置在setup.py
中定义
此项目通过连续部署自动生成并发布到PYPI
要手动生成此项目的源和二进制工件:
$ pip install bas-metadata-library
5
手动将此项目的生成工件发布到pypi测试中
$ pip install bas-metadata-library
6
手动发布到
$ pip install bas-metadata-library
7
连续部署
使用gitlab的ci/cd平台的连续部署过程在.gitlab ci.yml
中配置。这将:
- 为此项目生成源和二进制工件
- 将此项目的生成工件发布到相关的pypi存储库
- 发布此库内部配置格式的json模式
提交到master分支时:
- 更改将部署到pypi测试
- 配置架构将发布到 元数据标准测试网站
标记提交时:
- 更改将部署到pypi
- 配置模式将发布到元数据标准 网站
释放程序
发布时
- 创建一个
版本
分支 - 根据semver在
setup.py
中插入版本 - 在
changelog.md中关闭释放
- 推动更改,将
版本
分支合并到主版本
中,并用版本标记 - 推动更改,将
项目将通过持续部署自动生成并发布到PYPI
反馈
此项目的维护者是BAS Web&Applications团队,可以通过以下方式联系他们: 服务台@bas.ac.uk
问题跟踪
此项目使用问题跟踪,请参见 问题跟踪程序了解更多信息 信息。
注意:对此问题跟踪程序的读写访问受到限制。请与项目维护人员联系以请求访问。
许可证
?英国研究与创新(UKRI),2019年,英国安塔尔科特IC调查。
您可以在以下任何格式或介质中免费使用和重新使用本软件和相关文档文件: 开放式政府牌照v3.0的条款。
您可以在http://www.nationalaarchives.gov.uk/doc/open-government-license/" rel="nofollow">http://www.nationalaarchives.gov.uk/doc/open government license/