Commit 2e70bdb1 authored by echel0n's avatar echel0n

Merge branch 'develop' into 'master'

Merging Pre-Release v9.4.184.dev9

Closes #425

See merge request SiCKRAGE/sickrage!29
parents 94f82ef6 2f59abe0
...@@ -8,15 +8,15 @@ tests ...@@ -8,15 +8,15 @@ tests
runscripts runscripts
node_modules node_modules
dist dist
manifests
changelog.md changelog.md
readme.md readme.md
README.txt README.txt
crowdin.yaml crowdin.yaml
Gruntfile.js
MANIFEST.in MANIFEST.in
package.json package.json
package-lock.json package-lock.json
pre-commit-hook.sh pre-commit-hook.sh
setup.cfg setup.cfg
setup.py setup.py
webpack.config.js webpack.config.js
\ No newline at end of file
...@@ -80,4 +80,5 @@ Thumbs.db ...@@ -80,4 +80,5 @@ Thumbs.db
/bower_components/ /bower_components/
/node_modules/ /node_modules/
/src/spritesmith-generated/ /src/spritesmith-generated/
/dist/ /dist/
\ No newline at end of file /sickrage/core/webserver/static/js/core.js.map
\ No newline at end of file
before_script:
- apk add --no-cache py-pip
stages: stages:
- release - review_webpack
- deploy - review_docker
- review_deploy
- release_build
- release_sentry
- release_deploy
review:webpack:
stage: review_webpack
image:
name: nikolaik/python-nodejs:python3.7-nodejs10-alpine
variables:
NODE_ENV: "development"
script:
- apk add --no-cache git gcc libffi-dev python3-dev musl-dev openssl-dev
- npm install -qs
- npm run build
only:
- merge_requests
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- sickrage/core/webserver/static/
variables: review:docker:
DOCKER_DRIVER: overlay2 stage: review_docker
DOCKER_HOST: tcp://localhost:2375 dependencies:
DOCKER_TLS_CERTDIR: "" - review:webpack
image:
name: docker:latest
entrypoint: ["/bin/sh", "-c"]
variables:
DOCKER_DRIVER: overlay2
DOCKER_HOST: tcp://localhost:2375
DOCKER_TLS_CERTDIR: ""
services:
- docker:dind
script:
- docker login -u "${CI_REGISTRY_USER}" -p "${CI_JOB_TOKEN}" "${CI_REGISTRY}"
- docker build --network host -t "${CI_REGISTRY_IMAGE}:latest" .
- docker tag "${CI_REGISTRY_IMAGE}:latest" "${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}"
- test ! -z "${CI_COMMIT_TAG}" && docker push "${CI_REGISTRY_IMAGE}:latest"
- docker push "${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}"
only:
- merge_requests
cache:
key: ${CI_COMMIT_REF_SLUG}
services: review:deploy:
- docker:dind stage: review_deploy
dependencies:
- review:docker
image:
name: lachlanevenson/k8s-kubectl:latest
entrypoint: ["/bin/sh", "-c"]
script:
- kubectl create secret docker-registry gitlab-registry --namespace ${KUBE_NAMESPACE} --docker-server=${CI_REGISTRY} --docker-username=${CI_REGISTRY_USER} --docker-password=${CI_JOB_TOKEN} --docker-email=$GITLAB_USER_EMAIL --dry-run -o json | kubectl apply --namespace ${KUBE_NAMESPACE} -f -
- sed -i "s~__CI_REGISTRY_IMAGE__~${CI_REGISTRY_IMAGE}~" manifests/deployment.yaml
- sed -i "s/__VERSION__/${CI_COMMIT_REF_NAME}/" manifests/deployment.yaml manifests/ingress.yaml manifests/service.yaml
- sed -i "s/__CI_COMMIT_REF_SLUG__/${CI_COMMIT_REF_SLUG}/" manifests/deployment.yaml manifests/ingress.yaml manifests/service.yaml
- sed -i "s/__CI_ENVIRONMENT_SLUG__/${CI_ENVIRONMENT_SLUG}/" manifests/deployment.yaml manifests/ingress.yaml manifests/service.yaml
- sed -i "s/__KUBE_NAMESPACE__/${KUBE_NAMESPACE}/" manifests/deployment.yaml manifests/ingress.yaml manifests/service.yaml
- |
if kubectl apply -f manifests/deployment.yaml | grep -q unchanged; then
echo "=> Patching deployment to force image update."
kubectl patch -f manifests/deployment.yaml -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"ci-last-updated\":\"$(date +'%s')\"}}}}}"
else
echo "=> Deployment apply has changed the object, no need to force image update."
fi
- kubectl apply -f manifests/service.yaml || true
- kubectl apply -f manifests/ingress.yaml
- kubectl rollout status -f manifests/deployment.yaml
environment:
name: review/$CI_COMMIT_REF_NAME
url: https://review.sickrage.ca/$CI_COMMIT_REF_SLUG
on_stop: review:stop
only:
- merge_requests
sentry_release_master: review:stop:
stage: release stage: review_deploy
image:
name: lachlanevenson/k8s-kubectl:latest
entrypoint: ["/bin/sh", "-c"]
script:
# - wget -O /usr/bin/reg https://github.com/genuinetools/reg/releases/download/v0.13.0/reg-linux-amd64
# - chmod +x /usr/bin/reg
# - reg -r ${CI_REGISTRY} -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} rm ${CI_REGISTRY_IMAGE}:${CI_COMMIT_REF_NAME}
- kubectl delete ing -l ref=${CI_ENVIRONMENT_SLUG}
- kubectl delete all -l ref=${CI_ENVIRONMENT_SLUG}
variables:
GIT_STRATEGY: none
when: manual
environment:
name: review/$CI_COMMIT_REF_NAME
action: stop
only:
- merge_requests
release:build:master:
stage: release_build
image:
name: nikolaik/python-nodejs:python3.7-nodejs10-alpine
variables:
NODE_ENV: "development"
script:
- apk add --no-cache git gcc libffi-dev python3-dev musl-dev openssl-dev
- npm install -qs
- pip install bumpversion
- pip install -r requirements-dev.txt
- bumpversion --allow-dirty patch package.json sickrage/version.txt
- npm run build
# - python setup.py extract_messages
# - crowdin-cli-py upload sources
# - crowdin-cli-py download
# - python setup.py compile_catalog
- git config --global user.email $(git --no-pager show -s --format='%ae' HEAD)
- git config --global user.name $(git --no-pager show -s --format='%an' HEAD)
- git add --all
- git tag -a $(cat sickrage/version.txt) -m "Release v$(cat sickrage/version.txt)"
- git commit -m "[TASK] Releasing v$(cat sickrage/version.txt)"
- git push https://$GIT_ACCESS_USER:[email protected]$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$CI_COMMIT_REF_NAME --follow-tags
only:
- master
except:
refs:
- tags
- triggers
variables:
- $CI_COMMIT_MESSAGE =~ /\[TASK\] Releasing/
release:build:develop:
stage: release_build
image:
name: nikolaik/python-nodejs:python3.7-nodejs10-alpine
variables:
NODE_ENV: "development"
script:
- apk add --no-cache git gcc libffi-dev python3-dev musl-dev openssl-dev
- npm install -qs
- pip install bumpversion
- pip install -r requirements-dev.txt
- bumpversion --allow-dirty preversion package.json sickrage/version.txt
- npm run build
# - python setup.py extract_messages
# - crowdin-cli-py upload sources
# - crowdin-cli-py download
# - python setup.py compile_catalog
- git config --global user.email $(git --no-pager show -s --format='%ae' HEAD)
- git config --global user.name $(git --no-pager show -s --format='%an' HEAD)
- git add --all
- git tag -a $(cat sickrage/version.txt) -m "Pre-release v$(cat sickrage/version.txt)"
- git commit -m "[TASK] Pre-Releasing v$(cat sickrage/version.txt)"
- git push https://$GIT_ACCESS_USER:[email protected]$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:$CI_COMMIT_REF_NAME --follow-tags
only:
- develop
except:
refs:
- tags
- triggers
variables:
- $CI_COMMIT_MESSAGE =~ /\[TASK\] Pre-Releasing/
release:sentry:master:
stage: release_sentry
image: image:
name: getsentry/sentry-cli name: getsentry/sentry-cli
entrypoint: [""] entrypoint: [""]
...@@ -33,8 +182,8 @@ sentry_release_master: ...@@ -33,8 +182,8 @@ sentry_release_master:
- branches - branches
- triggers - triggers
sentry_release_develop: release:sentry:develop:
stage: release stage: release_sentry
image: image:
name: getsentry/sentry-cli name: getsentry/sentry-cli
entrypoint: [""] entrypoint: [""]
...@@ -53,10 +202,11 @@ sentry_release_develop: ...@@ -53,10 +202,11 @@ sentry_release_develop:
- branches - branches
- triggers - triggers
deploy_pypi: deploy:pypi:
stage: deploy stage: release_deploy
image: python:3.7-alpine3.9 image: python:3.7-alpine3.9
script: script:
- apk add --no-cache py-pip gcc libffi-dev python3-dev musl-dev openssl-dev
- pip install -U twine - pip install -U twine
- python setup.py sdist bdist_wheel - python setup.py sdist bdist_wheel
- twine upload dist/* - twine upload dist/*
...@@ -67,8 +217,8 @@ deploy_pypi: ...@@ -67,8 +217,8 @@ deploy_pypi:
- branches - branches
- triggers - triggers
deploy_docker_master: deploy:docker:master:
stage: deploy stage: release_deploy
variables: variables:
UPSTREAM_BRANCH: master UPSTREAM_BRANCH: master
UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA
...@@ -81,8 +231,8 @@ deploy_docker_master: ...@@ -81,8 +231,8 @@ deploy_docker_master:
- branches - branches
- triggers - triggers
deploy_docker_develop: deploy:docker:develop:
stage: deploy stage: release_deploy
variables: variables:
UPSTREAM_BRANCH: develop UPSTREAM_BRANCH: develop
UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA
...@@ -95,8 +245,8 @@ deploy_docker_develop: ...@@ -95,8 +245,8 @@ deploy_docker_develop:
- branches - branches
- triggers - triggers
deploy_synology: deploy:synology:master:
stage: deploy stage: release_deploy
variables: variables:
UPSTREAM_BRANCH: master UPSTREAM_BRANCH: master
UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA
...@@ -109,8 +259,8 @@ deploy_synology: ...@@ -109,8 +259,8 @@ deploy_synology:
- branches - branches
- triggers - triggers
deploy_readynas: deploy:readynas:master:
stage: deploy stage: release_deploy
variables: variables:
UPSTREAM_COMMIT_TAG: $CI_COMMIT_TAG UPSTREAM_COMMIT_TAG: $CI_COMMIT_TAG
UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
...@@ -125,8 +275,8 @@ deploy_readynas: ...@@ -125,8 +275,8 @@ deploy_readynas:
- branches - branches
- triggers - triggers
deploy_qnap: deploy:qnap:master:
stage: deploy stage: release_deploy
variables: variables:
UPSTREAM_COMMIT_TAG: $CI_COMMIT_TAG UPSTREAM_COMMIT_TAG: $CI_COMMIT_TAG
UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME UPSTREAM_PROJECT_NAME: $CI_PROJECT_NAME
...@@ -139,4 +289,4 @@ deploy_qnap: ...@@ -139,4 +289,4 @@ deploy_qnap:
- /^[0-9.]+$/ - /^[0-9.]+$/
except: except:
- branches - branches
- triggers - triggers
\ No newline at end of file
...@@ -5,6 +5,7 @@ ARG SOURCE_COMMIT ...@@ -5,6 +5,7 @@ ARG SOURCE_COMMIT
ENV SOURCE_COMMIT $SOURCE_COMMIT ENV SOURCE_COMMIT $SOURCE_COMMIT
ENV TZ 'Canada/Pacific' ENV TZ 'Canada/Pacific'
ENV WEB_ROOT ''
#RUN locale-gen en_US.UTF-8 #RUN locale-gen en_US.UTF-8
#ENV LANG en_US.UTF-8 #ENV LANG en_US.UTF-8
...@@ -20,4 +21,4 @@ RUN pip install -r /opt/sickrage/requirements.txt ...@@ -20,4 +21,4 @@ RUN pip install -r /opt/sickrage/requirements.txt
EXPOSE 8081 EXPOSE 8081
VOLUME /config /downloads /tv /anime VOLUME /config /downloads /tv /anime
ENTRYPOINT python /opt/sickrage/SiCKRAGE.py --nolaunch --datadir /config ENTRYPOINT python /opt/sickrage/SiCKRAGE.py --nolaunch --web_root $WEB_ROOT --datadir /config
\ No newline at end of file \ No newline at end of file
module.exports = function (grunt) {
const shell = require('shelljs');
const webpackConfig = require('./webpack.config');
require('load-grunt-tasks')(grunt);
grunt.initConfig({
webpack: {
options: {
stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
},
prod: webpackConfig,
dev: webpackConfig
},
changelog: {
release: {
options: {
after: '256',
logArguments: [
'--pretty=* %h - %ad: %s',
'--no-merges',
'--date=short'
],
fileHeader: '# Changelog',
featureRegex: /^(.*)$/gim,
partials: {
features: '{{#each features}}{{> feature}}{{/each}}\n',
feature: '- {{this}} {{this.date}}\n',
fixes: '{{#each fixes}}{{> fix}}{{/each}}\n',
fix: '- {{this}} {{this.date}}\n'
},
dest: "changelog.md"
}
}
},
exec: {
// Translations
'crowdin_upload_sources': {cmd: 'crowdin-cli-py upload sources'},
'crowdin_upload_translations': {cmd: 'crowdin-cli-py upload translations'},
'crowdin_download_translations': {cmd: 'crowdin-cli-py download'},
'babel_extract': {cmd: 'python setup.py extract_messages'},
'babel_update': {cmd: 'python setup.py update_catalog'},
'babel_compile': {cmd: 'python setup.py compile_catalog'},
// Git Commands
'git': {
cmd: function (cmd, branch) {
branch = branch ? ' ' + branch : '';
return 'git ' + cmd + branch;
}
},
'git_push': {
cmd: function (remote, branch, tags) {
let pushCmd = 'git push ' + remote + ' ' + branch;
if (tags) {
pushCmd += ' --tags';
}
return pushCmd;
},
stderr: false,
callback: function (err, stdout, stderr) {
grunt.log.write(stderr);
}
},
'git_commit': {
cmd: function (message) {
return 'git commit -am "' + message + '"';
},
stderr: false,
callback: function (err, stdout, stderr) {
grunt.log.write(stderr);
}
},
'git_last_tag': {
cmd: 'git for-each-ref refs/tags --sort=-taggerdate --count=1 --format=%(refname:short)',
stdout: false,
callback: function (err, stdout) {
stdout = stdout.trim();
if (/^\d{1,2}.\d{1,2}.\d+(?:.dev\d+)?$/.test(stdout)) {
grunt.config('last_tag', stdout);
} else {
grunt.fatal('Could not get the last tag name. We got: ' + stdout);
}
}
},
'git_list_changes': {
cmd: function () {
return 'git log --oneline --pretty=format:%s ' + grunt.config('last_tag') + '..HEAD';
},
stdout: false,
maxBuffer: 500 * 1024,
callback: function (err, stdout) {
const commits = stdout.trim()
.replace(/`/gm, '').replace(/^\([\w\d\s,.\-+_/>]+\)\s/gm, ''); // removes ` and tag information
if (commits) {
grunt.config('commits', commits);
} else {
grunt.fatal('Getting new commit list failed!');
}
}
},
'git_tag': {
cmd: function (version) {
return 'git tag ' + version + ' -m "' + grunt.config('commits') + '"';
},
stdout: false
}
}
});
grunt.registerTask('upload_trans', 'Upload translations', function () {
grunt.log.writeln('Extracting and uploading translations to Crowdin...'.magenta);
const tasks = [
'exec:babel_extract',
'exec:crowdin_upload_sources'
];
if (process.env.CROWDIN_API_KEY) {
grunt.task.run(tasks);
} else {
grunt.log.warn('Environment variable `CROWDIN_API_KEY` is not set, aborting task'.bold);
}
});
grunt.registerTask('download_trans', 'Download translations', function () {
grunt.log.writeln('Downloading and compiling translations from Crowdin...'.magenta);
const tasks = [
'exec:crowdin_download_translations',
'exec:babel_compile'
];
if (process.env.CROWDIN_API_KEY) {
grunt.task.run(tasks);
} else {
grunt.log.warn('Environment variable `CROWDIN_API_KEY` is not set, aborting task.'.bold);
}
});
grunt.registerTask('sync_trans', 'Sync translations with Crowdin', function () {
grunt.log.writeln('Syncing translations with Crowdin...'.magenta);
const tasks = [
'upload_trans',
'download_trans'
];
if (process.env.CROWDIN_API_KEY) {
grunt.task.run(tasks);
} else {
grunt.log.warn('Environment variable `CROWDIN_API_KEY` is not set, aborting task.'.bold);
}
});
grunt.registerTask('bump_version', function (new_version) {
const vFile = 'sickrage/version.txt';
grunt.file.write(vFile, new_version)
});
grunt.registerTask('pre-release', function () {
grunt.task.run(['exec:git:checkout:develop']);
const vFile = 'sickrage/version.txt';
const version = grunt.file.read(vFile);
const versionParts = version.split('.');
const vArray = {
vMajor: versionParts[0],
vMinor: versionParts[1],
vPatch: versionParts[2],
vPre: versionParts[3] || 0
};
if (vArray.vPre === 0) {
vArray.vPatch = parseFloat(vArray.vPatch) + 1;
}
if (vArray.vPre !== 0) {
vArray.vPre = vArray.vPre.split('dev')[1];
vArray.vPre = parseFloat(vArray.vPre) + 1;
} else {
vArray.vPre = parseFloat(vArray.vPre) + 1;
}
const newVersion = vArray.vMajor + '.' + vArray.vMinor + '.' + vArray.vPatch + '.dev' + vArray.vPre;
const tasks = [
'changelog',
'webpack:dev',
//'sync_trans',
'bump_version:' + newVersion,
'exec:git_commit:Pre-Release v' + newVersion,
'exec:git_last_tag', 'exec:git_list_changes', 'exec:git_tag:' + newVersion,
'exec:git_push:origin:develop:tags',
];
grunt.task.run(tasks);
});
grunt.registerTask('release', function () {
grunt.task.run(['exec:git:checkout:develop']);
const vFile = 'sickrage/version.txt';
const version = grunt.file.read(vFile);
const versionParts = version.split('.');
const vArray = {
vMajor: versionParts[0],
vMinor: versionParts[1],
vPatch: versionParts[2],
vPre: versionParts[3] || 0
};
if (vArray.vPre === 0) {
vArray.vPatch = parseFloat(vArray.vPatch) + 1;
}
if (vArray.vPre !== 0) {
vArray.vPre = vArray.vPre.split('dev')[1];
vArray.vPre = parseFloat(vArray.vPre) + 1;
} else {
vArray.vPre = parseFloat(vArray.vPre) + 1;
}
const newVersion = vArray.vMajor + '.' + vArray.vMinor + '.' + vArray.vPatch;
const tasks = [
'exec:git:checkout:-b release-v' + newVersion + ':develop',
'changelog',
'webpack:prod',
//'sync_trans',
'bump_version:' + newVersion,
'exec:git_commit:Release v' + newVersion,
'exec:git:checkout:master',
'exec:git:merge:release-v' + newVersion,
'exec:git_last_tag', 'exec:git_list_changes', 'exec:git_tag:' + newVersion,
'exec:git_push:origin:master:tags',
'exec:git:checkout:develop',
'exec:git:merge:release-v' + newVersion,
'exec:git_push:origin:develop',
'exec:git:branch:-d release-v' + newVersion,
];
grunt.task.run(tasks);
});
};
\ No newline at end of file
# Changelog # Changelog
- * 94f82ef67 - 2019-11-05: Release v9.4.183
- * d94d4b9bc - 2019-11-05: Revert "Added lazy loading to main shows page, reduces page load times." - * d94d4b9bc - 2019-11-05: Revert "Added lazy loading to main shows page, reduces page load times."
- * 932c107ab - 2019-11-05: Revert "Refactored main shows page to load shows via web sockets." - * 932c107ab - 2019-11-05: Revert "Refactored main shows page to load shows via web sockets."
- * 940d091a7 - 2019-11-05: Revert "Refactored TVShow and TVEpisode database models to use select instead of joined for lazy loading relationships." - * 940d091a7 - 2019-11-05: Revert "Refactored TVShow and TVEpisode database models to use select instead of joined for lazy loading relationships."
......
apiVersion: apps/v1
kind: Deployment
metadata:
name: __CI_COMMIT_REF_SLUG__
namespace: __KUBE_NAMESPACE__
labels:
app: __CI_COMMIT_REF_SLUG__
ref: __CI_ENVIRONMENT_SLUG__
spec:
replicas: 1
selector:
matchLabels:
app: __CI_COMMIT_REF_SLUG__
ref: __CI_ENVIRONMENT_SLUG__
template:
metadata:
labels:
app: __CI_COMMIT_REF_SLUG__
ref: __CI_ENVIRONMENT_SLUG__
spec:
containers:
- name: app
image: __CI_REGISTRY_IMAGE__:__VERSION__
imagePullPolicy: Always
env:
- name: TZ
value: "Canada/Pacific"
- name: WEB_ROOT
value: __CI_COMMIT_REF_SLUG__
ports:
- containerPort: 8081
imagePullSecrets:
- name: gitlab-registry
\ No newline at end of file
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: __CI_COMMIT_REF_SLUG__
namespace: __KUBE_NAMESPACE__
labels:
app: __CI_COMMIT_REF_SLUG__
ref: __CI_ENVIRONMENT_SLUG__
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- review.sickrage.ca
secretName: sickrage-ca-tls
rules:
- host: review.sickrage.ca
http:
paths:
- path: /__CI_COMMIT_REF_SLUG__
backend:
serviceName: __CI_COMMIT_REF_SLUG__
servicePort: 80
\ No newline at end of file
apiVersion: v1
kind: Service
metadata:
name: __CI_COMMIT_REF_SLUG__
namespace: __KUBE_NAMESPACE__
labels:
app: __CI_COMMIT_REF_SLUG__
ref: __CI_ENVIRONMENT_SLUG__
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 8081
selector:
app: __CI_COMMIT_REF_SLUG__
\ No newline at end of file
This diff is collapsed.
{ {
"name": "sickrage", "name": "sickrage",
"version": "9.4.184.dev9",
"private": true, "private": true,
"repository": { "repository": {
"type": "git", "type": "git",
...@@ -10,11 +11,12 @@ ...@@ -10,11 +11,12 @@
}, },
"homepage": "https://www.sickrage.ca", "homepage": "https://www.sickrage.ca",
"scripts": { "scripts": {
"dev": "webpack --mode development", "build": "webpack --config webpack.config.js -p"
"prod": "webpack --mode production"
}, },
"devDependencies": { "devDependencies": {
"@fortawesome/fontawesome-free": "^5.1.0", "@fortawesome/fontawesome-free": "^5.1.0",
"@sentry/browser": "^5.9.0",
"@sentry/webpack-plugin": "^1.9.3",
"animate.css": "^3.6.1", "animate.css": "^3.6.1",
"autoprefixer": "^8.6.5", "autoprefixer": "^8.6.5",
"babel": "^6.23.0", "babel": "^6.23.0",
......
...@@ -3,5 +3,5 @@ crowdin-cli-py ...@@ -3,5 +3,5 @@ crowdin-cli-py
babel babel
wheel wheel
tox tox
wheel vcrpy-unittest
vcrpy-unittest