Open rarous opened 2 years ago
Zatím jsem přidal common script pro test actora a updatnul jsem všechny actory aby jej používali.
Ještě musím vyřešit chybějící apify storage local soubory kde je i ten INPUT.json. Zkoušel jsem je vygenerovat přes apify init, ale to mění i .gitignore daného actoru. Opravim to jedoduše tak že ten chybějící INPUT vč ev. složek nad ním vytořim v to scriptu co test spouští.
Add přednastavení input.testUrl
- to by musel mít každý actor někde definovanou takovou prop. Cesta kde je INPUT.json uloženej je v gitu ignorovaná, takže na CI nikdy nebude dokud ji script pro test nevytvoří. Nevím teda kde z tohodle scriptu zjistit, jakou testUrl do generovaného INPUT.json vložit.
@junkycoder všichni aktoři mají něco takového:
const input = await Apify.getInput();
const { debug = false, country = COUNTRY.CZ, type = "FULL" } = input ?? {};
a to je to místo, kde by to mělo být:
const input = await Apify.getInput();
const { debug = false, country = COUNTRY.CZ, type = ActorType.FULL, testUrl = "https://example.com/"} = input ?? {};
Tj. je tam default hodnota definovaná actorem a jde přepsat inputem.
Uff, prolezl jsem všechny jen abych to učesal - https://github.com/topmonks/hlidac-shopu/commit/fb8ab40c0c5f0a2e1310d25a9085a36f4d630289 - a sepsal si poznámky:
const ActorType = {
BF: "BF",
FULL: "FULL",
TEST: "TEST"
};
Bordel v input typech. Nově používáme tyhle tři, ale některé aktory mají svoje extra typy.
// tsbohemia-daily
export const LABELS = {
START: "START",
BF: "BF",
PAGE: "PAGE",
PRICE: "PRICE"
};
// alza-daily
const TYPE = {
FULL: "FULL",
TRHAK: "TRHAK",
FEED: "FEED",
BLACK_FRIDAY: "BF",
TEST: "TEST"
};
// conrad-daily
export const LABELS = {
API_START: "API-START",
API_LIST: "API-LIST",
API_DETAIL: "API-DETAIL",
SITEMAP_START: "SITEMAP-START",
SITEMAP_LIST: "SITEMAP-LIST"
};
// datart-daily
const LABELS = {
START: "START",
CATEGORY: "CATEGORY",
CATEGORY_NEXT: "CATEGORY_NEXT",
BF: "BF"
};
type === "COUNT" // ??
// dek-daily
// proč je main.js v src? Proč vůbec existuje src dir ve všech aktorech?
// e-coop-daily
// nemá žádný input.type
// electroworld-daily
type === "DETAIL"
type === "COUNT"
type === "TEST_FULL"
type === "FULL" || type === "TEST_FULL"
// eva-daily
type === "FULL" || type === "COUNT"
type === "COUNT" ? "COUNT" : "CATEGORY",
!development && type !== "COUNT"
// hornbach-daily
// zase main v src a žádný typ
// jakej je vztah mezi LABEL a TYPE?
export const LABELS = {
SITE: "SITE",
CATEGORY: "CATEGORY"
};
// hs-reviews
// žádný typ a extra main.test.mjs file, tohle bude první pokud o testování a měl by bejt nahrazenej ActorType.TEST?
// iglobus-daily
// žádný typ
// ikea-daily
// main v src
type = "DAILY"
type === "DAILY"
type === "COUNT"
// itesco-daily
// 👌
// kasa-count
// žádné typy, ale používájí se LABELS - LIST a DETAIL
// kasa-daily
request.userData.label === "START"
request.userData.label === "LAST_CATEGORY_PAGE"
label: "LAST_CATEGORY"
request.userData.label === "SUB_CATEGORY"
request.userData.label === "MAIN_CATEGORY"
request.userData.label === LAST_CATEGORY
// takže jakej je rozdíl mezi type a label?
// knihydobrovsky-count
// žádný type ale label
switch (label) {
case "LIST":
case "SUBLIST":
// knihydobrovsky-daily
// typy plus labels
label: "LIST"
label: "SUBLIST"
// kosik-daily
// pouze BF type, přidal jsem FULL jako default
// lekarna-daily
// FULL a BF typy plus labely
request.userData.label === "SUB_CATEGORY"
request.userData.label === "PAGE"
request.userData.label === "PAGI_PAGE"
request.userData.label === "START"
// lidl-daily
// zase main v src, tohle dělá Lukáš pořád
// použit pouze BF typ a mraky labelů
switch (label)
case LABELS.DETAIL
case LABELS.LIDL_SHOP
case LABELS.LIDL_SHOP_CAT
case LABELS.LIDL_SHOP_DETAIL
case LABELS.LIDL_SHOP_MAIN_CAT
case LABELS.LIDL_SHOP_SECTION
case LABELS.MAIN_NABIDKA
case LABELS.MAIN_NABIDKA_CAT
// luxor-daily
// tady se label == type a bůbec ten actor vypadá jinak než ostatní, proč?
type = LABELS.API_START, // API_START | FRONT_START | SITEMAP_START
const LABELS = {
API_START: "API-START",
API_LIST: "API-LIST",
API_DETAIL: "API-DETAIL",
FRONT_START: "FRONT-START",
FRONT_LIST: "FRONT-LIST",
FRONT_DETAIL: "FRONT-DETAIL",
SITEMAP_START: "SITEMAP-START",
SITEMAP_LIST: "SITEMAP-LIST"
};
switch (priceList[priceIx].type) {
case "RECOMMENDED":
case "SALE":
// makro-daily
// žádné typy, pouze labels
label: "START"
case "LIST":
case "PAGE":
// mall-daily
// klasické typy a jeden extra navíc plus labely
type === "CZECHITAS"
label: "PAGE"
label: "START"
label: "CZECHITAS-START"
label: "MAP"
label: "REVIEW",
// megaknihy-daily
// zase main v src a žádný type
switch (label)
case "START":
case "PAGE":
// mironet-daily
// základní typy a cizí labely
label: "page"
label: "category"
label: "page"
label: "category_vyprodej"
label: "pages"
// mountfield-daily
// main v src, LABELS consts :(, ale typy jsou (bf, full a test)
export const LABELS = {
MAIN_NABIDKA: "MAIN_NABIDKA",
MAIN_NABIDKA_CAT: "MAIN_NABIDKA_CAT",
DETAIL: "DETAIL",
LIDL_SHOP: "LIDL_SHOP",
LIDL_SHOP_MAIN_CAT: "LIDL_SHOP_MAIN_CAT",
LIDL_SHOP_CAT: "LIDL_SHOP_CAT",
LIDL_SHOP_DETAIL: "LIDL_SHOP_DETAIL",
LIDL_SHOP_SECTION: "LIDL_SHOP_SECTION"
};
// mp-daily
// Žádné type, ale LABELS konstanta se tahá z contextu, wtf?
const crawlContext = await init();
const { input, requestQueue, log, LABELS } = crawlContext;
// notino-daily
type !== "CZECHITAS"
label: BF
{ label: HOME_PAGE }
{ label: CATEGORY_PAGE }
// obi-daily
// no type just labels
label: "LIST"
label: "DETAIL"
label: "START"
label: label + "I" // WTF?
label.includes("SUBCAT") // fuck
// okay-daily
// Using ActorType now
const LABEL = {
COLLECTION: "COLLECTION",
COLLECTIONS: "COLLECTIONS",
LIST: "LIST"
};
// pilulka-daily
// zahrabanej main v src
// Používa je BF, FULL jako default
// prozdravi-daily
// main v src
export const LABELS = {
START: "START",
PRODUCTS: "PRODUCTS",
// BF: "BF" removed
};
// rohlik-daily
// type nepoužit
label: "main"
label: "list"
label: "PAGE"
// rozetka-daily
// routes? To je asi SPA
// ActorType nema DAILY ani COUNT, nechávám zatím být
export const ACTOR_TYPES = {
DAILY: "DAILY",
COUNT: "COUNT"
};
export const LABELS = {
MAIN_PAGE: "MAIN_PAGE",
CATEGORY_OR_PRODUCTS: "CATEGORY_OR_PRODUCTS"
};
// sleky-daily
// tady se místo type použivá mode (?)
mode === "LIST"
mode === "DETAIL"
// tetadrogerie-daily
// konečně actor bez zbytečných src/*
// tchibo-daily
// nepoužíva type, jen labels
const LABELS = {
NAVIGATION: "NAVIGATION",
CATEGORY: "CATEGORY",
CATEGORY_CAT: "CATEGORY_CAT",
COFFEE_CATEGORY: "COFFEE_CATEGORY",
LIST: "LIST"
};
// tsbohemia-daily
// border v tom že label se chová jako type
export const LABELS = {
START: "START",
BF: "BF",
PAGE: "PAGE",
PRICE: "PRICE"
};
- } else if (type === "test") {
+ } else if (type === ActorType.TEST) {
type === LABELS.PRICE
Pozor, LABEL je něco jinýho než TYPE. TYPE určuje v jakém módu jede celý actor. LABEL je konkrétní krok scraperu
Ano, ale použitý je to často jako jedno a to samé. Musíme to roztrhnout, aby to labels nechodily hodnoty z type a obráceně..
Ok
On Wed, Mar 23, 2022 at 11:50 AM Dan Hromada @.***> wrote:
Ano, ale použitý je to často jako jedno a to samé. Musíme to roztrhnout, aby to labels nechodily hodnoty z type a obráceně..
— Reply to this email directly, view it on GitHub https://github.com/topmonks/hlidac-shopu/issues/819#issuecomment-1076223740, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAAYZTOGPOXCYLZHBZO5TB3VBLZN7ANCNFSM5RHZJTHA . You are receiving this because you authored the thread.Message ID: @.***>
Pro potřeby CI a CD potřebujeme v každém actoru vytvořit npm script
test
, který:INPUT.json
asi pomocíecho '{"type":"TEST"}' > apify_storage/key_value_store/INPUT.json
TEST=1 apify run -p
rm -fr apify_storage
Běh testu je primárně určen pro CI, kde je linux. Běh na Windows není prioritou.
Dále je potřeba projít všechny actory a zajistit, aby:
input.type === ActorType.TEST
input.testUrl
jako default, který jde přepsat zvenku.ENV
TEST
slouží k deaktivaci uploadu dat do Kebooly adata.hlidacshopu.cz