Skip to content
Snippets Groups Projects
Commit f224fac7 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'refs/heads/master' into 1-auth

# Conflicts:
#	pkg/auth/anonymous.go
#	pkg/auth/client.go
#	pkg/auth/system.go
#	pkg/spaces/service.go
parents 2537bca0 e58fe356
No related branches found
No related tags found
No related merge requests found
Showing with 1084 additions and 314 deletions
.idea .idea
dist/
release/
\ No newline at end of file
image: golang:latest image: golang:1.22
stages: stages:
- test - test
- pre-release
- release
run_tests: run_tests:
rules: rules:
...@@ -27,3 +29,125 @@ lint: ...@@ -27,3 +29,125 @@ lint:
codequality: gl-code-quality-report.json codequality: gl-code-quality-report.json
paths: paths:
- gl-code-quality-report.json - gl-code-quality-report.json
# ----- prepare release -----
# Расчет тега и формирование Changelog
get_changelog:
stage: pre-release
image:
name: orhunp/git-cliff:latest
entrypoint: [ "" ]
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE == "true"' # Запуск при инициации из perxis
- if: $CI_PIPELINE_SOURCE == "web" # или при ручном запуске из GUI
when: manual
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 0
script:
- echo "$(git-cliff --unreleased | sed '1,6d' | sed '$d')" > current_changelog.md # удалить "лишние" строки для Changelog
artifacts:
reports:
dotenv: vars.env # Use artifacts:reports:dotenv to expose the variables to other jobs
paths:
- current_changelog.md
# Релиз и запись тега в артефакт для использования в perxis
prepare_release:
stage: pre-release
image: bitnami/git:latest
variables:
GIT_DEPTH: 0
GIT_STRATEGY: clone
rules:
- if: '$CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE == "true"'
- if: $CI_PIPELINE_SOURCE == "web"
needs:
- job: get_changelog
artifacts: true
script:
- |
CURRENT_VERSION=$(git describe --tags --abbrev=0)
RELEASE_VERSION=$CURRENT_VERSION
# Релиз выполняется только при наличии изменений
if [ $(git rev-list $CURRENT_VERSION..HEAD --count) -gt 0 ]; then
# Если релиз на мастере, то устанавливается версия равная версии в Perxis
RELEASE_VERSION=$PERXIS_RELEASE_VERSION
# Если релиз хотфиксовый, то увеличиваем патчевую версию
if [ $HOTFIX_RELEASE == "true" ]; then
RELEASE_VERSION=$(echo $CURRENT_VERSION | awk -F . '{print $1"."$2"."$3+1}')
fi
fi
# Если новая версия совпадает со старой, значит изменений не было, и выпускать новый релиз не нужно
NEEDS_RELEASE=false
if [ "$RELEASE_VERSION" != "$CURRENT_VERSION" ]; then
NEEDS_RELEASE=true
fi
echo "PERXIS_GO_CURRENT_VERSION=$CURRENT_VERSION" >> vars.env
echo "PERXIS_GO_RELEASE_VERSION=$RELEASE_VERSION" >> vars.env
echo "PERXIS_GO_NEEDS_RELEASE=$NEEDS_RELEASE" >> vars.env
printf '### Release perxis-go
PERXIS_RELEASE_VERSION: %s
HOTFIX_RELEASE: %s
CURRENT_VERSION: %s
RELEASE_VERSION: %s
NEEDS_RELEASE: %s' $PERXIS_RELEASE_VERSION $HOTFIX_RELEASE $CURRENT_VERSION $RELEASE_VERSION $NEEDS_RELEASE
artifacts:
when: always
paths:
- vars.env
- current_changelog.md
expire_in: 1 week
# ----- release -----
create_release_branch:
stage: release
image: bitnami/git:latest
variables:
GIT_DEPTH: 0
GIT_STRATEGY: clone
rules:
- if: $CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE != "true"
- if: $CI_PIPELINE_SOURCE == "web"
script:
- |
if [ $NEEDS_RELEASE == "true" ] && [ $CI_COMMIT_BRANCH == "master" ]; then
git config user.email "gitlab@ci-cd.pipeline"
git config user.name "gitlab-ci"
git remote remove gitlab_origin || true
git remote add gitlab_origin https://release_gitlab_ci:$PERXIS_GO_REPO_ACCESS_TOKEN@git.perx.ru/perxis/perxis-go.git
RELEASE_BRANCH=${VERSION:1:-2}
git branch release/$RELEASE_BRANCH || true
git push gitlab_origin release/$RELEASE_BRANCH
fi
release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_PIPELINE_SOURCE == "pipeline" && $PREPARE_RELEASE != "true"
- if: $CI_PIPELINE_SOURCE == "web"
when: manual
needs:
- create_release_branch
script:
- echo "Start release $VERSION"
- |
if [ $NEEDS_RELEASE != "true" ]; then
exit 203
fi
allow_failure:
exit_codes:
- 203
release:
name: 'Release $VERSION'
description: '$VERSION'
tag_name: '$VERSION'
[submodule "perxis-proto"] [submodule "perxis-proto"]
path = perxis-proto path = perxis-proto
url = https://git.perx.ru/perxis/perxis-proto.git url = https://git.perx.ru/perxis/perxis-proto.git
version: 2
gitlab_urls:
api: https://git.perx.ru/api/v4/
download: https://git.perx.ru
use_package_registry: true
before:
hooks:
- go mod tidy
builds:
- skip: true
snapshot:
name_template: "{{ incpatch .Version }}-next"
release:
gitlab:
owner: perxis
name: perxis-go
announce:
skip: "{{gt .Patch 0}}"
# Changelog
All notable changes to this project will be documented in this file.
## [0.28.0] - 2024-08-19
### 🚀 Features
- *(core)* Изменено поведение обхода схемы schema.Walk, считаем что объект изменился при установке значения Nil ([#PRXS-2648](https://tracker.yandex.ru/PRXS-2648))-([8a7f62f](https://git.perx.ru/perxis/perxis-go/-/commit/8a7f62fcd93f114e941538fe09f41b9c0927ceb0))
- *(schema)* Реализован функционал для загрузки схем из файлов ([#PRXS-2731](https://tracker.yandex.ru/PRXS-2731))-([0255aad](https://git.perx.ru/perxis/perxis-go/-/commit/0255aad01984ac7b39385df1132f6ed3289e2ba4))
- *(core)* Добавлен вызов Visitors при компиляции expr-выражения в bson. Добавлен метод Schema.SetSingleLocale ([#PRXS-2656](https://tracker.yandex.ru/PRXS-2656))-([60c45b0](https://git.perx.ru/perxis/perxis-go/-/commit/60c45b0cb14ae81835859ce9e5303a7fba5b733b))
- Реализована загрузка данных схем и записей через файлы для использования расширениях -([a978cfa](https://git.perx.ru/perxis/perxis-go/-/commit/a978cfa2b8e69ef9b4be4b83d5a7c393f7521815))
- *(core)* Добавлена функция для ожидания готовности окружения ([#PRXS-2648](https://tracker.yandex.ru/PRXS-2648))-([3e7c23e](https://git.perx.ru/perxis/perxis-go/-/commit/3e7c23efa6a7e42ddcdce460da22208234ab94bd))
### 🐛 Bug Fixes
- *(core)* Исправлена ошибка "assignment to entry in nil map" если у объекта схемы отсутствовали поля ([#PRXS-2770](https://tracker.yandex.ru/PRXS-2770))-([3c4b955](https://git.perx.ru/perxis/perxis-go/-/commit/3c4b955915e26b063aceac7169d6b0f82b7c96bf))
- *(core)* Исправлена ошибка "panic: runtime error: invalid memory address or nil pointer dereference" при вызове UnmarshalJSON при передаче "null" ([#PRXS-2770](https://tracker.yandex.ru/PRXS-2770))-([36e8b6a](https://git.perx.ru/perxis/perxis-go/-/commit/36e8b6a965cd0b0a7977340c8eea5c9672f168a3))
### ⚙️ Miscellaneous Tasks
- Увеличен стандартный размер очереди Job Queue с 100 до 10000 -([ba53c5a](https://git.perx.ru/perxis/perxis-go/-/commit/ba53c5a0a0469e1ccdd18297ea38357342116a49))
- *(schema)* Добавлено получение вложенных в Reference полей схемы -([7b14a23](https://git.perx.ru/perxis/perxis-go/-/commit/7b14a239c46a7700051a4115e274b55e0bee5e60))
- GoReleaser configuration -([36ce38d](https://git.perx.ru/perxis/perxis-go/-/commit/36ce38dad5a17a3876dc9f26ea4b3ff09ed0793a))
## [0.27.0] - 2024-07-24
### 🚀 Features
- Добавлен пакет `localizer` для работы с переводами данных ([#PRXS-2653](https://tracker.yandex.ru/PRXS-2653))-([53a37c4](https://git.perx.ru/perxis/perxis-go/-/commit/53a37c45a8a76e2b4cf7f2b5a7874b06465269b9))
- *(core)* Внесены изменения для работы с переводами через Items API -([ebf80bb](https://git.perx.ru/perxis/perxis-go/-/commit/ebf80bb317f126f85e69a813651054fbf77a2bae))
- *(logs)* Обновление API логирования, релевантность результатов поиска ([#PRXS-2665](https://tracker.yandex.ru/PRXS-2665))-([97077fb](https://git.perx.ru/perxis/perxis-go/-/commit/97077fbc800a3c3d865ee35a485ed8b6396f3444))
- *(core)* Обновление References API: поддержка локализации контента -([87b92c5](https://git.perx.ru/perxis/perxis-go/-/commit/87b92c5bc30d1c26b280c85b447a0ca9d313df34))
- *(core)* Реализована возможность загрузки схем из YAML и JSON файлов ([#PRXS-2731](https://tracker.yandex.ru/PRXS-2731))-([bf29420](https://git.perx.ru/perxis/perxis-go/-/commit/bf294207182bbc0b5ce154029f98aaca00b9c831))
### 🐛 Bug Fixes
- *(core)* Исправлен обход схемы Walk для типа Array, решена ошибка отсутствия схемы при вызове Introspect -([2f684ea](https://git.perx.ru/perxis/perxis-go/-/commit/2f684ea678c0bcd59b8faed69cace00c9a4d29e6))
- *(core)* Исправлена ошибка при которой не логировались действия с пространствами ([#PRXS-2609](https://tracker.yandex.ru/PRXS-2609))-([d0a7606](https://git.perx.ru/perxis/perxis-go/-/commit/d0a7606248f7e7a3a21075592d69d6845b546cce))
- *(core)* Исправлена ошибка при которой была возможность изменить обьект находящийся в кеше Items ([#PRXS-2697](https://tracker.yandex.ru/PRXS-2697))-([cd5724d](https://git.perx.ru/perxis/perxis-go/-/commit/cd5724d316f2a0a6738a6159bdfb974938e8fde2))
### ⚙️ Miscellaneous Tasks
- *(api)* Исправлены ошибки linter`а связанные с пропущенными именами переменных при получении результатов ([#PRXS-2610](https://tracker.yandex.ru/PRXS-2610))-([90269af](https://git.perx.ru/perxis/perxis-go/-/commit/90269aff2bae12a05d5394eb223e08ff6c2bdb2f))
- *(core)* Исправлена передача объектов в кэше сервисов ([#PRXS-2705](https://tracker.yandex.ru/PRXS-2705))-([9180ee7](https://git.perx.ru/perxis/perxis-go/-/commit/9180ee7aa4c433e02030659489adca91bc4c8401))
## [0.25.1] - 2024-06-13
### 🐛 Bug Fixes
- *(core)* Исправлен deadlock при одновременном вызове BufferedWriteSyncer.Stop и синхронизации по интервалу ([#PRXS-2576](https://tracker.yandex.ru/PRXS-2576))-([3b823ed](https://git.perx.ru/perxis/perxis-go/-/commit/3b823ed00a22e142e25137dccb5f1c4fbb318d3f))
## [0.25.0] - 2024-05-08
### 🚀 Features
- *(core)* Добавлена возможность использовать символ "-" в названиях полей ([#PRXS-1439](https://tracker.yandex.ru/PRXS-1439))-([66b02b9](https://git.perx.ru/perxis/perxis-go/-/commit/66b02b9a6defdbe5e5d5502ff45d67c38c2a5fa4))
- *(api)* Добавлен метод внутренний метод установки состояния пространства SetState для сервиса Spaces ([#PRXS-2223](https://tracker.yandex.ru/PRXS-2223))-([0057019](https://git.perx.ru/perxis/perxis-go/-/commit/005701931ea9c03d8e54ffa6bbcf351254ff578e))
- Добавлен метод Find для сервиса Spaces ([#PRXS-2298](https://tracker.yandex.ru/PRXS-2298))-([4135690](https://git.perx.ru/perxis/perxis-go/-/commit/41356904837085adc48f4c8c6edaf8ad7d7fd014))
- *(core)* Добавлено системное поле SearchScore в Item ([#PRXS-2445](https://tracker.yandex.ru/PRXS-2445))-([087edb3](https://git.perx.ru/perxis/perxis-go/-/commit/087edb39bbe6d22e12dedd9d4795336556f7b844))
### ⚙️ Miscellaneous Tasks
- Перенесено содержимое пакета pkg/id на уровень выше в пакет id -([d13399f](https://git.perx.ru/perxis/perxis-go/-/commit/d13399fd6c26349f7ddf36c4d4e81568a2503a9c))
- *(core)* Возврат GRPC-ошибки в сервисах -([c6bf265](https://git.perx.ru/perxis/perxis-go/-/commit/c6bf265699d5e9a99c0f583d7b6782b53cda3674))
## [0.24.0] - 2024-04-12
### 🚀 Features
- Добавлен OID для Locales -([221d730](https://git.perx.ru/perxis/perxis-go/-/commit/221d730e552dd64d0dc32b21e799a75c6adf4503))
- Добавлены методы Space, Environment, Collection, Organization для объекта System, который используется в шаблонах ([#PRXS-1813](https://tracker.yandex.ru/PRXS-1813))-([d017315](https://git.perx.ru/perxis/perxis-go/-/commit/d017315e664a9c5fcd84e377e5ba4f3635308f0b))
### 🐛 Bug Fixes
- *(core)* Изменено название и значение констант событий в logging_middleware для коллекций ([#PRXS-2199](https://tracker.yandex.ru/PRXS-2199))-([0cb42c5](https://git.perx.ru/perxis/perxis-go/-/commit/0cb42c57c0b976e9f9dd2f21e326f17d84580969))
## [0.22.0] - 2024-03-06
### 🚀 Features
- В пакет data добавлена проверка при установке значения на то, инициализирована ли map -([978a2c9](https://git.perx.ru/perxis/perxis-go/-/commit/978a2c9dc0c6c554ed35f046e33321e2c250fcf2))
- *(core)* Добавлены функции exists и len для языка запросов expr ([#PRXS-1883](https://tracker.yandex.ru/PRXS-1883))-([eae58bf](https://git.perx.ru/perxis/perxis-go/-/commit/eae58bf4c3cad9fe793b8ccf763bf9ada46266a3))
- *(extensions)* Добавлена по умолчанию для отображения Icon первой колонкой для коллекции "Настройки/Действия" ([#PRXS-1950](https://tracker.yandex.ru/PRXS-1950))-([9a3936b](https://git.perx.ru/perxis/perxis-go/-/commit/9a3936bea15bd80201b1ae9ffe1518b424dcb1d1))
- Add filter_core.go -([37d3135](https://git.perx.ru/perxis/perxis-go/-/commit/37d313519b69d83d97560a5c09722cec959596a9))
- Add unused v2 entry encoder -([79d8eef](https://git.perx.ru/perxis/perxis-go/-/commit/79d8eefc88b4b7c26b855df1492506131184f1a9))
### 🐛 Bug Fixes
- Исправлена потенциальная утечка ресурсов в HTTP-загрузчике файлов (используется в сервисе Images) ([#PRXS-1977](https://tracker.yandex.ru/PRXS-1977))-([143766b](https://git.perx.ru/perxis/perxis-go/-/commit/143766b56f638a43281c26e9d79842198750db6b))
- *(sync)* Исправлена ошибка синхронизации "received message larger than max". Процесс синхронизации значительно ускорен ([#PRXS-2026](https://tracker.yandex.ru/PRXS-2026))-([083aaf1](https://git.perx.ru/perxis/perxis-go/-/commit/083aaf1f363093219bb58f67b1accbc5a31f097a))
- Add id import -([6c0ecb0](https://git.perx.ru/perxis/perxis-go/-/commit/6c0ecb0ee0786ae6f388e486c6210e79354f4f88))
### ⚙️ Miscellaneous Tasks
- Обновлена библиотека github.com/expr-lang/expr до версии v1.15.8 ([#PRXS-1667](https://tracker.yandex.ru/PRXS-1667))-([d0069ab](https://git.perx.ru/perxis/perxis-go/-/commit/d0069ab4893e7c0acf360b5a42759d74c6a5cb32))
## [0.21.0] - 2024-01-16
### 🚀 Features
- Добавлен интерфейс Cache ([#PRXS-1859](https://tracker.yandex.ru/PRXS-1859))-([c11dae6](https://git.perx.ru/perxis/perxis-go/-/commit/c11dae6a20e9ff04d3840ba4de87998d9eb72e6e))
- Внесены правки в Spaces после изменений в perxis-proto, перегенерированны grpc-клиенты для Spaces ([#PRXS-1835](https://tracker.yandex.ru/PRXS-1835))-([2a0c015](https://git.perx.ru/perxis/perxis-go/-/commit/2a0c01544486fac5f5cb505a1dab7aa88d7858f4))
- Добавлена метрика для кэша -([3a6a7a3](https://git.perx.ru/perxis/perxis-go/-/commit/3a6a7a300dd7bad9597c4583871813ac5edecd52))
- Функция argsToLabels была вынесена в пакет metrics и переименована в GetLabelsFromKV. Теперь функция игнорирует значение без ключа -([b0b4312](https://git.perx.ru/perxis/perxis-go/-/commit/b0b4312d8399b3933af35b88bad301a89488f353))
- Добавлены metrics middleware для остальных сервисов -([8808371](https://git.perx.ru/perxis/perxis-go/-/commit/8808371cc465b0c16e6c41bd1ab5bf89a466a0ef))
- *(core)* Добавлена сборка метрик кэша и запросов ([#PRXS-1219](https://tracker.yandex.ru/PRXS-1219))-([706b266](https://git.perx.ru/perxis/perxis-go/-/commit/706b2666190347d594c13d5d3f0f13586463be2a))
- *(extension)* Добавлен middleware для сбора телеметрии -([221a13f](https://git.perx.ru/perxis/perxis-go/-/commit/221a13f8d19df03106afda566cad011178b1489a))
- *(core)* Добавлен сбор телеметрии в менеджере расширений ([#PRXS-1898](https://tracker.yandex.ru/PRXS-1898))-([1f18b52](https://git.perx.ru/perxis/perxis-go/-/commit/1f18b5226a8473a5b509ce0cf7001f2e1525b395))
### 🐛 Bug Fixes
- *(items)* Исправлены тесты -([57e7765](https://git.perx.ru/perxis/perxis-go/-/commit/57e776563ae3f6b14338f7fbb2d073ad40496d51))
- *(items)* Добавлена метрика в CachingMiddleware -([68796ee](https://git.perx.ru/perxis/perxis-go/-/commit/68796ee090f68e16092a88e480900807e229ba80))
- *(delivery)* Добавлена метрика в CachingMiddleware -([3f182d1](https://git.perx.ru/perxis/perxis-go/-/commit/3f182d11c13c914f6b7b8556f4082ce03ce937cb))
### 📚 Documentation
- Добавлен комментарий -([c715ad8](https://git.perx.ru/perxis/perxis-go/-/commit/c715ad8d8123ca244f8eaa92f7456c9e99101fb4))
- Добавлены подсказки к метрикам -([2387dac](https://git.perx.ru/perxis/perxis-go/-/commit/2387dac81918f252ac293a0f385d6e9149ec5924))
## [0.20.0] - 2023-12-01
### 🐛 Bug Fixes
- *(extensions)* Исправлена ошибка, при которой при обновлении расширений для некоторых коллекций всегда переустанавливались схемы, в которых не было изменений. Добавлен возврат ошибки при любом действии с расширением в случае неправильной его конфигурации ([#PRXS-1695](https://tracker.yandex.ru/PRXS-1695))-([998f3e8](https://git.perx.ru/perxis/perxis-go/-/commit/998f3e84ba73b241740a404d097d2b7c65cd352a))
- *(core)* Исправлена ошибка, при которой запрещенные правилами поля во вложенных объектах все равно были доступны пользователю ([#PRXS-1673](https://tracker.yandex.ru/PRXS-1673))-([0e1bec9](https://git.perx.ru/perxis/perxis-go/-/commit/0e1bec99fa78ad6f55e74e4cf6c38ee90cc5f205))
## [0.19.0] - 2023-11-03
### 🚀 Features
- *(core)* Добавлено поле метадата в схему коллекций, для хранения дополнительной информации о коллекции -([05a7965](https://git.perx.ru/perxis/perxis-go/-/commit/05a7965aa95768f1053854947cf4f4365ce81fd7))
- *(extensions)* Переработана процедура установки коллекций (Установка расширений) учитывающая что коллекция могла быть создана пользователем и предотвращающая перезапись и потерю данных ([#PRXS-1380](https://tracker.yandex.ru/PRXS-1380))-([1f00274](https://git.perx.ru/perxis/perxis-go/-/commit/1f00274400637dd64d83176f1b650c8b7c129f72))
- *(extension)* При установке расширения схемы коллекций принадлежащих расширению по-умолчанию будут обновлены. ([#PRXS-1380](https://tracker.yandex.ru/PRXS-1380))-([0dc7312](https://git.perx.ru/perxis/perxis-go/-/commit/0dc7312912999b811d5e48f247afbed3d737c9d7))
- *(extensions)* При установке расширения больше не перезаписывают конфликтные схемы коллекций. (Удален временный флаг _alwaysSetSchema в Setup) ([#PRXS-1472](https://tracker.yandex.ru/PRXS-1472))-([278b2cb](https://git.perx.ru/perxis/perxis-go/-/commit/278b2cbc96e4ebfbf34e21dccffb929754f9a829))
### 🐛 Bug Fixes
- *(core)* Пакеты 'service' в которых лежат middlewares переименованы на 'middleware' ([#PRXS-1163](https://tracker.yandex.ru/PRXS-1163))-([75f3153](https://git.perx.ru/perxis/perxis-go/-/commit/75f31532aa7b3007d9ff32c89ec6b62877b93085))
- *(core)* Исправлена ошибка, из-за которой проверка на принадлежность пользователя к разным организациям отрабатывала некорректно. Добавлена очистка кэша при переносе пространства ([#PRXS-1297](https://tracker.yandex.ru/PRXS-1297))-([7aa1d49](https://git.perx.ru/perxis/perxis-go/-/commit/7aa1d497cbd84e4e7b08508d645d794ef77a27ac))
- *(sdk)* Исправлена ошибка 'failed to uninstall client: not found', возникающая при удалении расширения, клиент которого уже не существует ([#PRXS-1342](https://tracker.yandex.ru/PRXS-1342))-([a170724](https://git.perx.ru/perxis/perxis-go/-/commit/a1707249ff2b82589a990cf08352debb58d467df))
- *(core)* Исправлена выгрузка лишних полей ("published_at", "published_by", "archived_at","archived_by") в файл при экспорте данных ([#PRXS-1390](https://tracker.yandex.ru/PRXS-1390))-([6dc87f8](https://git.perx.ru/perxis/perxis-go/-/commit/6dc87f8bf1acf2e12a7dc9858ab6407b9ac9ee78))
<!-- generated by git-cliff -->
version: '3' version: '3'
vars: vars:
PROTODIR: perxis-proto/proto PROTODIR: perxis-proto/proto
PBDIR: pb PBDIR: pb
CURRENT_VERSION:
sh: svu current
RELEASE_VERSION:
sh: svu next
tasks: tasks:
changelog:
cmds:
- git-cliff > CHANGELOG.md --tag {{ .RELEASE_VERSION }}
# release
# - Сделать changelog
# - Закоммитить все изменения
# - Пометить тэгом версию
# пререлиз - `git tag "$(svu pr --pre-release alpha.1 --build 9)"`
# пререлиз - `git tag "$(svu next)"`
# - Запушить код и тэги на сервер (иначе будет непонятная ошибка goreleaser Not found)
release:
cmds:
- mkdir -p release
- git-cliff {{ .CURRENT_VERSION }}.. --tag {{ .RELEASE_VERSION }} > release/CHANGELOG.md
- goreleaser release --clean --release-notes=release/CHANGELOG.md
mocks: mocks:
deps: deps:
- mocks.proto - mocks.proto
......
assets.go 0 → 100644
package perxis
import (
"io"
"io/fs"
"path/filepath"
"git.perx.ru/perxis/perxis-go/pkg/errors"
jsoniter "github.com/json-iterator/go"
"gopkg.in/yaml.v3"
)
// Assets предоставляет методы для загрузки данных из файловой системы
type Assets[T any] struct {
Constructor func() T
}
// NewAssets возвращает новый экземпляр загрузчика
func NewAssets[T any]() *Assets[T] {
return &Assets[T]{
Constructor: func() (t T) { return t },
}
}
type FromFSFunc[T any] func(fsys fs.FS) ([]T, error)
type FromFileFunc[T any] func(file fs.File) ([]T, error)
func (a *Assets[T]) Funcs() (FromFSFunc[T], FromFileFunc[T]) {
return a.FromFS, a.FromFile
}
// WithConstructor устанавливает конструктор для создания новых экземпляров
func (a *Assets[T]) WithConstructor(t func() T) *Assets[T] {
a.Constructor = t
return a
}
// MustFrom возвращает все записи в переданной файловой системе
func (a *Assets[T]) MustFrom(fsys fs.FS, path string) []T {
res, err := a.From(fsys, path)
if err != nil {
panic(err)
}
return res
}
// MustOneFrom возвращает одну запись из переданного файла
func (a *Assets[T]) MustOneFrom(fsys fs.FS, path string) T {
res, err := a.From(fsys, path)
if err != nil {
panic(err)
}
if len(res) == 0 {
panic(errors.Errorf("no entries found"))
}
if len(res) > 1 {
panic(errors.Errorf("multiple entries found"))
}
return res[0]
}
// From возвращает записи из переданного файла
func (a *Assets[T]) From(fsys fs.FS, path string) ([]T, error) {
f, err := fsys.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
stat, err := f.Stat()
if err != nil {
return nil, err
}
if stat.IsDir() {
sub, err := fs.Sub(fsys, path)
if err != nil {
return nil, err
}
return a.FromFS(sub)
}
return a.FromFile(f)
}
// FromFile возвращает записи в переданном файле
func (a *Assets[T]) FromFile(file fs.File) ([]T, error) {
stat, err := file.Stat()
if err != nil {
return nil, err
}
switch filepath.Ext(stat.Name()) {
case ".json":
entry, err := a.FromJSON(file)
if err != nil {
return nil, errors.Wrapf(err, "file '%s'", stat.Name())
}
return []T{entry}, nil
case ".yaml", ".yml":
entries, err := a.FromYAML(file)
return entries, errors.Wrapf(err, "file '%s'", stat.Name())
}
return nil, errors.Errorf("file '%s' must be in JSON or YAML format", stat.Name())
}
// FromFS возвращает все записи в переданной файловой системе
func (a *Assets[T]) FromFS(fsys fs.FS) (result []T, err error) {
if err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, _ error) error {
file, err := fsys.Open(path)
if err != nil {
return err
}
defer file.Close()
if entries, err := a.FromFile(file); err == nil {
result = append(result, entries...)
}
return nil
}); err != nil {
return nil, err
}
return result, nil
}
// FromJSON возвращает запись из JSON
func (c *Assets[T]) FromJSON(r io.Reader) (T, error) {
entry := c.Constructor()
data, err := io.ReadAll(r)
if err != nil {
return entry, err
}
err = jsoniter.Unmarshal(data, &entry)
return entry, err
}
// FromYAML возвращает записи из YAML
func (c *Assets[T]) FromYAML(r io.Reader) (result []T, err error) {
decoder := yaml.NewDecoder(r)
for {
var data interface{}
err = decoder.Decode(&data)
if errors.Is(err, io.EOF) {
break
}
if err != nil {
return nil, err
}
json, err := jsoniter.Marshal(data)
if err != nil {
return nil, err
}
entry := c.Constructor()
if err = jsoniter.Unmarshal(json, &entry); err != nil {
return nil, err
}
result = append(result, entry)
}
return result, nil
}
{
"id": "item3",
"enum": 1,
"data": {
"obj": {
"str": "value"
},
"arr": [
"str1",
"str2"
]
},
"struct": {
"option": true
}
}
\ No newline at end of file
---
id: item1
enum: 1
data:
obj:
str: value
arr:
- str1
- str2
struct:
option: true
---
id: item2
enum: 1
data:
obj:
str: value
arr:
- str1
- str2
struct:
option: true
---
type: object
params:
inline: false
fields:
name:
title: Название
description: Название коллекции
type: string
params:
required: true
metadata:
collection_id: collection_a
collection_name: Коллекция A
---
type: object
params:
inline: false
fields:
name:
title: Название
description: Название коллекции
type: string
params:
required: true
metadata:
collection_id: collection_b
collection_name: Коллекция B
---
id: collection_c
name: Коллекция C
schema:
type: object
params:
inline: false
fields:
name:
title: Название
description: Название коллекции
type: string
params:
required: true
\ No newline at end of file
package perxis
import (
"os"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type State int
const (
State1 State = iota
State2
)
type testEntry struct {
ID string
Enum State
Data map[string]interface{}
Struct *nested
}
type nested struct {
Option *bool
}
func TestFromFS(t *testing.T) {
tr := true
i1 := &testEntry{
ID: "item1",
Enum: State2,
Data: map[string]interface{}{
"obj": map[string]interface{}{"str": "value"},
"arr": []interface{}{"str1", "str2"},
},
Struct: &nested{
Option: &tr,
},
}
i2 := *i1
i2.ID = "item2"
i3 := *i1
i3.ID = "item3"
assets := NewAssets[*testEntry]()
r, err := assets.FromFS(os.DirFS("assets/tests/assets"))
require.NoError(t, err)
require.Len(t, r, 3)
assert.ElementsMatch(t, []*testEntry{i1, &i2, &i3}, r)
}
func TestFrom(t *testing.T) {
tr := true
i1 := &testEntry{
ID: "item1",
Enum: State2,
Data: map[string]interface{}{
"obj": map[string]interface{}{"str": "value"},
"arr": []interface{}{"str1", "str2"},
},
Struct: &nested{
Option: &tr,
},
}
i2 := *i1
i2.ID = "item2"
i3 := *i1
i3.ID = "item3"
assets := NewAssets[*testEntry]()
r, err := assets.From(os.DirFS("assets"), "tests/assets")
require.NoError(t, err)
require.Len(t, r, 3)
assert.ElementsMatch(t, []*testEntry{i1, &i2, &i3}, r)
r, err = assets.From(os.DirFS("assets"), "tests/assets/items.yaml")
require.NoError(t, err)
require.Len(t, r, 2)
assert.Equal(t, []*testEntry{i1, &i2}, r)
}
# git-cliff ~ default configuration file
# https://git-cliff.org/docs/configuration
#
# Lines starting with "#" are comments.
# Configuration options are organized into tables and keys.
# See documentation for more information on available options.
[bump]
features_always_bump_minor = true
breaking_always_bump_major = true
[changelog]
# changelog header
header = """
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [unreleased]
{% endif %}\
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits %}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | upper_first }} \
{% if commit.links %}\
({% for link in commit.links %}\
[{{ link.text }}]({{ link.href }})\
{% if not loop.last %}, {% endif %}\
{% endfor %})\
{% endif %}\
-([{{ commit.id | truncate(length=7, end="") }}]($REPO/-/commit/{{ commit.id }}))\
{% endfor %}
{% endfor %}\n
"""
# template for the changelog footer
footer = """
<!-- generated by git-cliff -->
"""
# remove the leading and trailings
trim = true
# postprocessors
postprocessors = [
{ pattern = '\$REPO', replace = "https://git.perx.ru/perxis/perxis-go" },
]
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = true
# process each line of a commit as an individual commit
split_commits = false
# regex for preprocessing the commit messages
commit_preprocessors = [
{ pattern = 'Feat:', replace = "feat:"},
{ pattern = 'WIP:', replace = ""},
{ pattern = 'wip:', replace = ""}
# Replace issue numbers
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
# Check spelling of the commit with https://github.com/crate-ci/typos
# If the spelling is incorrect, it will be automatically fixed.
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor", skip = true },
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
{ message = "^chore\\(release\\): prepare for", skip = true },
{ message = "^chore\\(deps.*\\)", skip = true },
{ message = "^chore\\(pr\\)", skip = true },
{ message = "^chore\\(pull\\)", skip = true },
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
{ message = "^irefac", skip = true },
]
# protect breaking changes from being skipped due to matching a skipping commit_parser
protect_breaking_commits = false
# filter out the commits that are not matched by commit parsers
filter_commits = false
# regex for matching git tags
# tag_pattern = "v[0-9].*"
# regex for skipping tags
skip_tags = "v0.([0-9]\\.|1[0-8]).*"
# regex for ignoring tags
# ignore_tags = ""
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "oldest"
# limit the number of commits included in the changelog.
# limit_commits = 42
link_parsers = [
{ pattern = "#(PRXS-(\\d+))", href = "https://tracker.yandex.ru/$1"},
{ pattern = "RFC(\\d+)", text = "ietf-rfc$1", href = "https://datatracker.ietf.org/doc/html/rfc$1"},
]
\ No newline at end of file
...@@ -17,15 +17,15 @@ require ( ...@@ -17,15 +17,15 @@ require (
github.com/rs/xid v1.5.0 github.com/rs/xid v1.5.0
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.8.4
go.mongodb.org/mongo-driver v1.13.0 go.mongodb.org/mongo-driver v1.13.0
go.opentelemetry.io/otel v1.21.0 go.opentelemetry.io/otel v1.24.0
go.opentelemetry.io/otel/trace v1.21.0 go.opentelemetry.io/otel/trace v1.24.0
go.uber.org/zap v1.26.0 go.uber.org/zap v1.26.0
golang.org/x/crypto v0.15.0 golang.org/x/crypto v0.23.0
golang.org/x/image v0.14.0 golang.org/x/image v0.14.0
golang.org/x/net v0.18.0 golang.org/x/net v0.25.0
golang.org/x/oauth2 v0.14.0 golang.org/x/oauth2 v0.18.0
google.golang.org/grpc v1.59.0 google.golang.org/grpc v1.64.0
google.golang.org/protobuf v1.31.0 google.golang.org/protobuf v1.34.1
gopkg.in/yaml.v3 v3.0.1 gopkg.in/yaml.v3 v3.0.1
) )
...@@ -35,15 +35,15 @@ require ( ...@@ -35,15 +35,15 @@ require (
) )
require ( require (
cloud.google.com/go/compute v1.23.3 // indirect cloud.google.com/go/compute v1.25.1 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect
github.com/brianvoe/gofakeit/v6 v6.26.3 github.com/brianvoe/gofakeit/v6 v6.26.3
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-kit/log v0.2.1 // indirect github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.4 // indirect github.com/golang/snappy v0.0.4 // indirect
github.com/gosimple/unidecode v1.0.1 // indirect github.com/gosimple/unidecode v1.0.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect
...@@ -59,12 +59,12 @@ require ( ...@@ -59,12 +59,12 @@ require (
github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
go.opentelemetry.io/otel/metric v1.21.0 go.opentelemetry.io/otel/metric v1.24.0
go.uber.org/multierr v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect
golang.org/x/sync v0.5.0 // indirect golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.14.0 // indirect golang.org/x/sys v0.22.0 // indirect
golang.org/x/text v0.14.0 // indirect golang.org/x/text v0.15.0
google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
) )
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU=
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls=
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o= github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh7o=
...@@ -21,14 +21,14 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj ...@@ -21,14 +21,14 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
...@@ -109,12 +109,12 @@ github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/ ...@@ -109,12 +109,12 @@ github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY=
go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
...@@ -125,8 +125,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk ...@@ -125,8 +125,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20210220032944-ac19c3e999fb/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
...@@ -136,14 +136,14 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL ...@@ -136,14 +136,14 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
...@@ -151,8 +151,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w ...@@ -151,8 +151,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
...@@ -161,8 +161,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= ...@@ -161,8 +161,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
...@@ -170,14 +170,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T ...@@ -170,14 +170,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e h1:Elxv5MwEkCI9f5SkoL6afed6NTdxaGoAo39eANBwHL8=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY=
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
......
File moved
File moved
package id
import (
"testing"
"git.perx.ru/perxis/perxis-go/pkg/items"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_ParseID(t *testing.T) {
tests := []struct {
name string
id any
result *ObjectId
wantError bool
}{
{
name: "SpaceId",
id: "/spaces/<space_id>",
result: MustObjectId("/spaces/<space_id>"),
},
{
name: "ServiceID",
id: "/services/<service_id>",
result: MustObjectId("/services/<service_id>"),
},
{
name: "UserID",
id: "/users/<user_id>",
result: MustObjectId("/users/<user_id>"),
},
{
name: "OrganizationID",
id: "/orgs/<org_id>",
result: MustObjectId("/orgs/<org_id>"),
},
{
name: "ClientID",
id: "/spaces/<space_id>/clients/<client_id>",
result: MustObjectId("/spaces/<space_id>/clients/<client_id>"),
},
{
name: "RoleID",
id: "/spaces/<space_id>/roles/<role_id>",
result: MustObjectId("/spaces/<space_id>/roles/<role_id>"),
},
{
name: "LocaleID",
id: "/spaces/<space_id>/locales/<locale_id>",
result: MustObjectId("/spaces/<space_id>/locales/<locale_id>"),
},
{
name: "EnvironmentID",
id: "/spaces/<space_id>/envs/<env_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>"),
},
{
name: "CollectionId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>"),
},
{
name: "SchemaID",
id: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/schema/<collection_id>"),
},
{
name: "ItemId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>"),
},
{
name: "RevisionID",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>"),
},
{
name: "FieldId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>",
result: MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>"),
},
{
name: "With error #1: no backslash in the beginning of id",
id: "spaces/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #2: backslash in the end of id",
id: "/spaces/<space_id>/",
result: nil,
wantError: true,
},
{
name: "With error #3: typo in 'spaces'",
id: "/space/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #4: no space_id in id",
id: "/spaces",
result: nil,
wantError: true,
},
{
name: "With error #5: multiple backslashes in the end of id",
id: "/spaces/<space_id>///",
result: nil,
wantError: true,
},
{
name: "With error #6: nil value",
id: nil,
wantError: true,
},
{
name: "With error #7: nil object value",
id: (*items.Item)(nil),
wantError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
id, err := NewObjectId(tt.id)
if tt.wantError {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tt.result, id)
require.Equal(t, tt.id, id.String())
})
}
}
func Test_Map(t *testing.T) {
tests := []struct {
name string
id *ObjectId
}{
{
name: "ServiceID",
id: &ObjectId{Descriptor: &ServiceId{ServiceID: "<service_id>"}},
},
{
name: "UserID",
id: &ObjectId{Descriptor: &UserId{UserID: "<user_id>"}},
},
{
name: "OrganizationID",
id: &ObjectId{Descriptor: &OrganizationId{OrganizationID: "<org_id>"}},
},
{
name: "SpaceId",
id: &ObjectId{Descriptor: &SpaceId{SpaceID: "<space_id>"}},
},
{
name: "ClientID",
id: &ObjectId{Descriptor: &ClientId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
ClientID: "<client_id>",
}},
},
{
name: "RoleID",
id: &ObjectId{Descriptor: &RoleId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
RoleID: "<role_id>",
}},
},
{
name: "LocaleID",
id: &ObjectId{Descriptor: &LocaleID{
SpaceId: SpaceId{SpaceID: "<space_id>"},
LocaleID: "<locale_id>",
}},
},
{
name: "EnvironmentID",
id: &ObjectId{Descriptor: &EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
}},
},
{
name: "CollectionId",
id: &ObjectId{Descriptor: &CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "Schema ID",
id: &ObjectId{Descriptor: &SchemaId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "ItemId",
id: &ObjectId{Descriptor: &ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
}},
},
{
name: "RevisionID",
id: &ObjectId{Descriptor: &RevisionId{
ItemId: ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
RevisionID: "<rev_id>",
}},
},
{
name: "FieldId",
id: &ObjectId{Descriptor: &FieldId{
ItemId: ItemId{
CollectionId: CollectionId{
EnvironmentId: EnvironmentId{
SpaceId: SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
Field: "<field_name>",
}},
},
{
name: "SystemID",
id: &ObjectId{Descriptor: &SystemId{}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
v, err := FromMap(tt.id.Map())
require.NoError(t, err)
assert.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению")
assert.Equal(t, v.Map(), tt.id.Map())
})
}
}
...@@ -14,6 +14,7 @@ import ( ...@@ -14,6 +14,7 @@ import (
"git.perx.ru/perxis/perxis-go/pkg/roles" "git.perx.ru/perxis/perxis-go/pkg/roles"
"git.perx.ru/perxis/perxis-go/pkg/spaces" "git.perx.ru/perxis/perxis-go/pkg/spaces"
"git.perx.ru/perxis/perxis-go/pkg/users" "git.perx.ru/perxis/perxis-go/pkg/users"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
...@@ -886,3 +887,259 @@ func Test_LocaleId(t *testing.T) { ...@@ -886,3 +887,259 @@ func Test_LocaleId(t *testing.T) {
}) })
} }
} }
func Test_ParseID(t *testing.T) {
tests := []struct {
name string
id any
result *id.ObjectId
wantError bool
}{
{
name: "SpaceId",
id: "/spaces/<space_id>",
result: id.MustObjectId("/spaces/<space_id>"),
},
{
name: "ServiceID",
id: "/services/<service_id>",
result: id.MustObjectId("/services/<service_id>"),
},
{
name: "UserID",
id: "/users/<user_id>",
result: id.MustObjectId("/users/<user_id>"),
},
{
name: "OrganizationID",
id: "/orgs/<org_id>",
result: id.MustObjectId("/orgs/<org_id>"),
},
{
name: "ClientID",
id: "/spaces/<space_id>/clients/<client_id>",
result: id.MustObjectId("/spaces/<space_id>/clients/<client_id>"),
},
{
name: "RoleID",
id: "/spaces/<space_id>/roles/<role_id>",
result: id.MustObjectId("/spaces/<space_id>/roles/<role_id>"),
},
{
name: "LocaleID",
id: "/spaces/<space_id>/locales/<locale_id>",
result: id.MustObjectId("/spaces/<space_id>/locales/<locale_id>"),
},
{
name: "EnvironmentID",
id: "/spaces/<space_id>/envs/<env_id>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>"),
},
{
name: "CollectionId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>"),
},
{
name: "SchemaID",
id: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>/schema/<collection_id>"),
},
{
name: "ItemId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>"),
},
{
name: "RevisionID",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>"),
},
{
name: "FieldId",
id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>",
result: id.MustObjectId("/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>"),
},
{
name: "With error #1: no backslash in the beginning of id",
id: "spaces/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #2: backslash in the end of id",
id: "/spaces/<space_id>/",
result: nil,
wantError: true,
},
{
name: "With error #3: typo in 'spaces'",
id: "/space/<space_id>",
result: nil,
wantError: true,
},
{
name: "With error #4: no space_id in id",
id: "/spaces",
result: nil,
wantError: true,
},
{
name: "With error #5: multiple backslashes in the end of id",
id: "/spaces/<space_id>///",
result: nil,
wantError: true,
},
{
name: "With error #6: nil value",
id: nil,
wantError: true,
},
{
name: "With error #7: nil object value",
id: (*items.Item)(nil),
wantError: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
id, err := id.NewObjectId(tt.id)
if tt.wantError {
require.Error(t, err)
return
}
require.NoError(t, err)
require.Equal(t, tt.result, id)
require.Equal(t, tt.id, id.String())
})
}
}
func Test_Map(t *testing.T) {
tests := []struct {
name string
id *id.ObjectId
}{
{
name: "ServiceID",
id: &id.ObjectId{Descriptor: &id.ServiceId{ServiceID: "<service_id>"}},
},
{
name: "UserID",
id: &id.ObjectId{Descriptor: &id.UserId{UserID: "<user_id>"}},
},
{
name: "OrganizationID",
id: &id.ObjectId{Descriptor: &id.OrganizationId{OrganizationID: "<org_id>"}},
},
{
name: "SpaceId",
id: &id.ObjectId{Descriptor: &id.SpaceId{SpaceID: "<space_id>"}},
},
{
name: "ClientID",
id: &id.ObjectId{Descriptor: &id.ClientId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
ClientID: "<client_id>",
}},
},
{
name: "RoleID",
id: &id.ObjectId{Descriptor: &id.RoleId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
RoleID: "<role_id>",
}},
},
{
name: "LocaleID",
id: &id.ObjectId{Descriptor: &id.LocaleID{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
LocaleID: "<locale_id>",
}},
},
{
name: "EnvironmentID",
id: &id.ObjectId{Descriptor: &id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
}},
},
{
name: "CollectionId",
id: &id.ObjectId{Descriptor: &id.CollectionId{
EnvironmentId: id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "Schema ID",
id: &id.ObjectId{Descriptor: &id.SchemaId{
EnvironmentId: id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
}},
},
{
name: "ItemId",
id: &id.ObjectId{Descriptor: &id.ItemId{
CollectionId: id.CollectionId{
EnvironmentId: id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
}},
},
{
name: "RevisionID",
id: &id.ObjectId{Descriptor: &id.RevisionId{
ItemId: id.ItemId{
CollectionId: id.CollectionId{
EnvironmentId: id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
RevisionID: "<rev_id>",
}},
},
{
name: "FieldId",
id: &id.ObjectId{Descriptor: &id.FieldId{
ItemId: id.ItemId{
CollectionId: id.CollectionId{
EnvironmentId: id.EnvironmentId{
SpaceId: id.SpaceId{SpaceID: "<space_id>"},
EnvironmentID: "<env_id>",
},
CollectionID: "<collection_id>",
},
ItemID: "<item_id>",
},
Field: "<field_name>",
}},
},
{
name: "SystemID",
id: &id.ObjectId{Descriptor: &id.SystemId{}},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
v, err := id.FromMap(tt.id.Map())
require.NoError(t, err)
assert.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению")
assert.Equal(t, v.Map(), tt.id.Map())
})
}
}
...@@ -3,6 +3,7 @@ package convert ...@@ -3,6 +3,7 @@ package convert
import ( import (
"image" "image"
"io" "io"
"mime"
"os" "os"
"strings" "strings"
...@@ -69,5 +70,23 @@ func FormatFromExtension(ext string) (Format, error) { ...@@ -69,5 +70,23 @@ func FormatFromExtension(ext string) (Format, error) {
if f, ok := formatExtensions[ext]; ok { if f, ok := formatExtensions[ext]; ok {
return f, nil return f, nil
} }
return "", errors.Errorf("unsupported format") return "", errors.Errorf("unsupported format: %s", ext)
}
func FormatFromMIMEType(typ string) (Format, error) {
extensions, err := mime.ExtensionsByType(typ)
if err != nil {
return "", errors.Wrap(err, "get extensions by mime type")
}
if len(extensions) == 0 {
return "", errors.Errorf("unknown mime type: %s", typ)
}
for _, extension := range extensions {
var format Format
format, err = FormatFromExtension(extension)
if err == nil {
return format, nil
}
}
return "", err
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment