From d3cda1a6499fcc2a7c4a548862b9c1e4fa338c23 Mon Sep 17 00:00:00 2001 From: WDaan Date: Tue, 15 Nov 2022 10:32:22 +0100 Subject: [PATCH] feat: basic fake torrent generator #518 --- .env.development | 2 ++ .github/workflows/nightly.yml | 2 +- README.md | 1 + package-lock.json | 17 +++++++++++++++++ package.json | 1 + src/actions/Torrents.js | 8 ++++++++ src/helpers.js | 7 ++++--- src/utils/faker.spec.ts | 15 +++++++++++++++ src/utils/faker.ts | 32 ++++++++++++++++++++++++++++++++ src/utils/index.ts | 7 +++++++ 10 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 .env.development create mode 100644 src/utils/faker.spec.ts create mode 100644 src/utils/faker.ts create mode 100644 src/utils/index.ts diff --git a/.env.development b/.env.development new file mode 100644 index 00000000..4c4ce5dc --- /dev/null +++ b/.env.development @@ -0,0 +1,2 @@ +VITE_USE_FAKE_TORRENTS=true +VITE_FAKE_TORRENT_COUNT=30 \ No newline at end of file diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 663be5c6..843c1f20 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -23,7 +23,7 @@ jobs: run: npm ci - name: Build VueTorrent run: npm run build - - name: Push to latest-release + - name: Push to nightly-release uses: JamesIves/github-pages-deploy-action@3.7.1 with: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/README.md b/README.md index 52f2a071..3f3855c6 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ If you like to always have the latest and greatest, please sync to the `nightly- - `npm run lint` (to format the code) - `docker-compose up -d` (to start qbittorrent docker => optional, you can edit `vite.config.js` as well) - Open the WebUI on localhost with the default username `admin` and password `adminadmin`. +- Edit `env.development` to tweak your dev environment (e.g. fake torrents) ## Features diff --git a/package-lock.json b/package-lock.json index 01278748..3b02ec37 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "vuex-persist": "^3.1.3" }, "devDependencies": { + "@faker-js/faker": "^7.6.0", "@mdi/js": "^5.9.55", "@types/jsdom": "^20.0.1", "@typescript-eslint/eslint-plugin": "^5", @@ -1833,6 +1834,16 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -8969,6 +8980,12 @@ "strip-json-comments": "^3.1.1" } }, + "@faker-js/faker": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz", + "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==", + "dev": true + }, "@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", diff --git a/package.json b/package.json index c85510fc..60535839 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "vuex-persist": "^3.1.3" }, "devDependencies": { + "@faker-js/faker": "^7.6.0", "@mdi/js": "^5.9.55", "@types/jsdom": "^20.0.1", "@typescript-eslint/eslint-plugin": "^5", diff --git a/src/actions/Torrents.js b/src/actions/Torrents.js index 9313c174..b2e5c2af 100644 --- a/src/actions/Torrents.js +++ b/src/actions/Torrents.js @@ -1,6 +1,8 @@ import store from '../store' import { Hostname } from '@/Helpers/index.js' import Torrent from '@/models/Torrent' +import { isProduction } from '../utils' +import { generateMultiple } from '../utils/faker' export class Torrents { static update(data) { @@ -12,7 +14,13 @@ export class Torrents { } } + console.log(data) // update torrents store.state.torrents = data.map(t => new Torrent(t)) + + // load fake torrents if enabled + if(isProduction() && !import.meta.env.VITE_USE_FAKE_TORRENTS) return + const count = import.meta.env.VITE_FAKE_TORRENT_COUNT + store.state.torrents.push(...generateMultiple(count)) } } diff --git a/src/helpers.js b/src/helpers.js index 77dbd15a..4ffa9bd5 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -1,4 +1,5 @@ -/* eslint-disable no-unused-vars */ +import { isProduction } from './utils' + export function formatBytes(a, b) { if (a == 0) return '0 B' const c = 1024 @@ -150,7 +151,7 @@ export function stringContainsUrl(string) { } export function getVersion() { - if (process.env.NODE_ENV === 'production') { + if (isProduction()) { return 'import.meta.env.VITE_PACKAGE_VERSION' } @@ -158,7 +159,7 @@ export function getVersion() { } export function getBaseURL() { - if (process.env.NODE_ENV === 'production') { + if (isProduction()) { return 'import.meta.env.BASE_URL' } diff --git a/src/utils/faker.spec.ts b/src/utils/faker.spec.ts new file mode 100644 index 00000000..ebea3d65 --- /dev/null +++ b/src/utils/faker.spec.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest' +import { generateMultiple, generateTorrent } from './faker' + +describe('faker to generate fake torrents', () => { + it('can generate a fake torrent', () => { + const t = generateTorrent({ name: 'Test' }) + expect(t.name).toBe('Test') + }) + + it('can generate multile', () => { + const ts = generateMultiple(3) + expect(ts.length).toBe(3) + expect(ts[0]?.name).toBe('Torrent - 0') + }) +}) \ No newline at end of file diff --git a/src/utils/faker.ts b/src/utils/faker.ts new file mode 100644 index 00000000..10142348 --- /dev/null +++ b/src/utils/faker.ts @@ -0,0 +1,32 @@ +import { faker } from '@faker-js/faker' +import Torrent from '../models/Torrent' + +export function generateMultiple(count: number = 1): Torrent[] { + const torrents: Torrent[] = [] + for (let i = 0; i < count; i++) { + torrents.push( + generateTorrent({ + name: 'Torrent - ' + i + }) + ) + } + return torrents +} + +export function generateTorrent(data: any): Torrent { + return new Torrent({ + name: data.name, + size: faker.datatype.number({ min: 1000000, max: 50000000000 }), + tags: [], + progress: faker.datatype.number({ min: 0, max: 1, precision: 0.01 }), + state: faker.helpers.arrayElement(['done', 'downloading', 'fail', 'paused', 'queued', 'seeding', 'checking', 'stalled', 'metadata', 'moving']), + eta: faker.datatype.number({ min: 1000, max: 900000 }), + availability: faker.datatype.number({ min: 0, max: 1, precision: 0.01 }), + added_on: faker.date.recent(), + ratio: faker.datatype.number({ min: 0, max: 1, precision: 0.01 }), + num_leechs: faker.datatype.number({ min: 0, max: 500 }), + available_seeds: faker.datatype.number({ min: 0, max: 500 }), + num_seeds: faker.datatype.number({ min: 0, max: 500 }), + available_peers: faker.datatype.number({ min: 0, max: 500 }), + }) +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 00000000..db0b8683 --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,7 @@ +export function isProduction(): boolean { + return process.env.NODE_ENV === 'production' +} + +export function isDevelopment(): boolean { + return process.env.NODE_ENV === 'development' +} \ No newline at end of file