cookidoo-api 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cookidoo_api/__init__.py +51 -0
- cookidoo_api/const.py +107 -0
- cookidoo_api/cookidoo.py +783 -0
- cookidoo_api/exceptions.py +37 -0
- cookidoo_api/helpers.py +122 -0
- cookidoo_api/py.typed +0 -0
- cookidoo_api/types.py +94 -0
- cookidoo_api-0.1.0.dist-info/LICENSE +21 -0
- cookidoo_api-0.1.0.dist-info/METADATA +178 -0
- cookidoo_api-0.1.0.dist-info/RECORD +12 -0
- cookidoo_api-0.1.0.dist-info/WHEEL +5 -0
- cookidoo_api-0.1.0.dist-info/top_level.txt +1 -0
cookidoo_api/__init__.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Cookidoo API package."""
|
|
2
|
+
|
|
3
|
+
__version__ = "0.1.0"
|
|
4
|
+
|
|
5
|
+
from .const import (
|
|
6
|
+
DEFAULT_COOKIDOO_CONFIG,
|
|
7
|
+
DEFAULT_NETWORK_TIMEOUT,
|
|
8
|
+
DEFAULT_RETRIES,
|
|
9
|
+
DEFAULT_TIMEOUT,
|
|
10
|
+
)
|
|
11
|
+
from .cookidoo import Cookidoo
|
|
12
|
+
from .exceptions import (
|
|
13
|
+
CookidooActionException,
|
|
14
|
+
CookidooAuthBotDetectionException,
|
|
15
|
+
CookidooAuthException,
|
|
16
|
+
CookidooConfigException,
|
|
17
|
+
CookidooException,
|
|
18
|
+
CookidooNavigationException,
|
|
19
|
+
CookidooSelectorException,
|
|
20
|
+
CookidooUnavailableException,
|
|
21
|
+
CookidooUnexpectedStateException,
|
|
22
|
+
)
|
|
23
|
+
from .types import (
|
|
24
|
+
CookidooBrowserType,
|
|
25
|
+
CookidooCaptchaRecoveryType,
|
|
26
|
+
CookidooConfig,
|
|
27
|
+
CookidooItem,
|
|
28
|
+
CookidooItemStateType,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
__all__ = [
|
|
32
|
+
"Cookidoo",
|
|
33
|
+
"CookidooBrowserType",
|
|
34
|
+
"CookidooCaptchaRecoveryType",
|
|
35
|
+
"CookidooItemStateType",
|
|
36
|
+
"CookidooConfig",
|
|
37
|
+
"CookidooItem",
|
|
38
|
+
"CookidooException",
|
|
39
|
+
"CookidooConfigException",
|
|
40
|
+
"CookidooAuthException",
|
|
41
|
+
"CookidooAuthBotDetectionException",
|
|
42
|
+
"CookidooSelectorException",
|
|
43
|
+
"CookidooActionException",
|
|
44
|
+
"CookidooUnavailableException",
|
|
45
|
+
"CookidooUnexpectedStateException",
|
|
46
|
+
"CookidooNavigationException",
|
|
47
|
+
"DEFAULT_COOKIDOO_CONFIG",
|
|
48
|
+
"DEFAULT_RETRIES",
|
|
49
|
+
"DEFAULT_NETWORK_TIMEOUT",
|
|
50
|
+
"DEFAULT_TIMEOUT",
|
|
51
|
+
]
|
cookidoo_api/const.py
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""Constants for Cookidoo API."""
|
|
2
|
+
|
|
3
|
+
from typing import Final
|
|
4
|
+
|
|
5
|
+
from cookidoo_api.types import CookidooConfig
|
|
6
|
+
|
|
7
|
+
LOGIN_START_URL: Final = "https://cookidoo.ch"
|
|
8
|
+
LOGIN_START_SELECTOR: Final = "#layout--default > header > div > core-nav > nav > div.core-nav__container > ul.core-nav__links.unauthenticated-only > li:nth-child(2) > a"
|
|
9
|
+
LOGIN_EMAIL_SELECTOR: Final = "#email"
|
|
10
|
+
LOGIN_PASSWORD_SELECTOR: Final = "#password"
|
|
11
|
+
LOGIN_SUBMIT_SELECTOR: Final = 'button[type="submit"]'
|
|
12
|
+
LOGIN_CAPTCHA_SELECTOR: Final = "#amzn-captcha-verify-button"
|
|
13
|
+
LOGIN_ERROR_NOTIFICATION_SELECTOR: Final = ".notification__unobtrusive-error"
|
|
14
|
+
COOKIE_VALIDATION_URL: Final = "https://cookidoo.ch/profile/account"
|
|
15
|
+
COOKIE_VALIDATION_SELECTOR: Final = (
|
|
16
|
+
"main > section > .profile-indent > .profile-main-headline"
|
|
17
|
+
)
|
|
18
|
+
SHOPPING_LIST_URL: Final = "https://cookidoo.ch/shopping"
|
|
19
|
+
SHOPPING_LIST_SELECTOR: Final = "pm-shopping-list"
|
|
20
|
+
|
|
21
|
+
SHOPPING_LIST_EMPTY_SELECTOR: Final = "core-error-page"
|
|
22
|
+
|
|
23
|
+
SHOPPING_LIST_OPTIONS_SELECTOR: Final = "#shopping-list-options"
|
|
24
|
+
SHOPPING_LIST_CLEAR_ALL_OPTION_SELECTOR: Final = "#clearAllRecipes"
|
|
25
|
+
SHOPPING_LIST_CLEAR_ALL_MODAL_CONFIRM_SELECTOR: Final = (
|
|
26
|
+
'core-modal [data-action="clear-all"] button[type="submit"]'
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
SHOPPING_LIST_ITEMS_SELECTOR: Final = "pm-ingredients-list #byCategory"
|
|
30
|
+
SHOPPING_LIST_CHECKED_ITEMS_SELECTOR: Final = "pm-checked-list-wrapper"
|
|
31
|
+
|
|
32
|
+
SHOPPING_LIST_ITEM_SUB_SELECTOR: Final = "li:not(.additional-items-list-item)"
|
|
33
|
+
SHOPPING_LIST_ITEM_LABEL_SUB_SELECTOR: Final = (
|
|
34
|
+
'label span[data-type="ingredientNotation"]'
|
|
35
|
+
)
|
|
36
|
+
SHOPPING_LIST_ITEM_QUANTITY_SUB_SELECTOR: Final = 'label span[data-type="value"]'
|
|
37
|
+
SHOPPING_LIST_ITEM_UNIT_SUB_SELECTOR: Final = 'label span[data-type="unitNotation"]'
|
|
38
|
+
SHOPPING_LIST_ITEM_ID_SUB_SELECTOR: Final = "input[data-value]"
|
|
39
|
+
SHOPPING_LIST_ITEM_ID_ATTR: Final = "data-value"
|
|
40
|
+
SHOPPING_LIST_CHECKBOX_SUB_SELECTOR: Final = "core-checkbox"
|
|
41
|
+
|
|
42
|
+
SHOPPING_LIST_ADDITIONAL_ITEMS_SELECTOR: Final = "pm-additional-items-list"
|
|
43
|
+
SHOPPING_LIST_ADDITIONAL_CHECKED_ITEMS_SELECTOR: Final = "pm-checked-list-wrapper"
|
|
44
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_SUB_SELECTOR: Final = "li.additional-items-list-item"
|
|
45
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_HOVER_SUB_SELECTOR: Final = "> div"
|
|
46
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_LABEL_SUB_SELECTOR: Final = (
|
|
47
|
+
'label span[data-type="name"], label span[data-type="value"]'
|
|
48
|
+
)
|
|
49
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_ID_SUB_SELECTOR: Final = "input[data-value]"
|
|
50
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_ID_ATTR: Final = "data-value"
|
|
51
|
+
SHOPPING_LIST_ADDITIONAL_CHECKBOX_SUB_SELECTOR: Final = "core-checkbox"
|
|
52
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_DELETE_SUB_SELECTOR: Final = 'span[data-type="delete"]'
|
|
53
|
+
SHOPPING_LIST_ADDITIONAL_ITEM_EDIT_SUB_SELECTOR: Final = 'span[data-type="edit"]'
|
|
54
|
+
|
|
55
|
+
SHOPPING_LIST_EDIT_ADDITIONAL_ITEM_SELECTOR: Final = "pm-edit-additional-item"
|
|
56
|
+
SHOPPING_LIST_EDIT_ADDITIONAL_ITEM_INPUT_SUB_SELECTOR: Final = 'input[type="text"]'
|
|
57
|
+
SHOPPING_LIST_EDIT_ADDITIONAL_ITEM_CONFIRM_SUB_SELECTOR: Final = (
|
|
58
|
+
'button:not([type="button"])'
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
SHOPPING_LIST_CREATE_ADDITIONAL_ITEM_SELECTOR: Final = "pm-add-additional-item"
|
|
62
|
+
SHOPPING_LIST_CREATE_ADDITIONAL_ITEM_INPUT_SUB_SELECTOR: Final = "input"
|
|
63
|
+
SHOPPING_LIST_CREATE_ADDITIONAL_ITEM_CONFIRM_SUB_SELECTOR: Final = "button"
|
|
64
|
+
|
|
65
|
+
SHOPPING_LIST_ITEMS_TAB_SELECTOR: Final = "core-content-navigation button:nth-child(1)"
|
|
66
|
+
SHOPPING_LIST_RECIPES_TAB_SELECTOR: Final = (
|
|
67
|
+
"core-content-navigation button:nth-child(2)"
|
|
68
|
+
)
|
|
69
|
+
SHOPPING_LIST_RECIPE_OPTIONS_SELECTOR_TEMPLATE: Final = (
|
|
70
|
+
'[id="shopping-list-trigger-{}"]'
|
|
71
|
+
)
|
|
72
|
+
SHOPPING_LIST_RECIPE_REMOVE_OPTION_SELECTOR_TEMPLATE: Final = 'core-context-menu[trigger-id="shopping-list-trigger-{}"] core-handle-form[data-action="remove-recipes"]'
|
|
73
|
+
|
|
74
|
+
RECIPE_URL_PREFIX: Final = "https://cookidoo.ch/recipes/recipe/"
|
|
75
|
+
RECIPE_COOK_TODAY_SELECTOR: Final = '[id="cook-today-handle-form"] button'
|
|
76
|
+
RECIPE_ADD_OPTIONS_SELECTOR_TEMPLATE: Final = '[id="add-trigger-{}"]'
|
|
77
|
+
RECIPE_ADD_OPTION_SHOPPING_LIST_SELECTOR: Final = (
|
|
78
|
+
'[id="add-to-shopping-list-button"] button'
|
|
79
|
+
)
|
|
80
|
+
RECIPE_ADD_TO_SHOPPING_LIST_CONFIRM_SELECTOR: Final = (
|
|
81
|
+
'core-conversion-teaser [href^="/shopping"]'
|
|
82
|
+
)
|
|
83
|
+
DOM_CHECK_ATTACHED: Final = "element => document.body.contains(element)"
|
|
84
|
+
|
|
85
|
+
DEFAULT_RETRIES = 3
|
|
86
|
+
DEFAULT_NETWORK_TIMEOUT = 5000
|
|
87
|
+
DEFAULT_TIMEOUT = 3000
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
DEFAULT_COOKIDOO_CONFIG = CookidooConfig(
|
|
91
|
+
{
|
|
92
|
+
"language_code": "de-CH",
|
|
93
|
+
"browser": "firefox",
|
|
94
|
+
"remote_addr": None,
|
|
95
|
+
"remote_port": "9222",
|
|
96
|
+
"headless": True,
|
|
97
|
+
"email": "your@email",
|
|
98
|
+
"password": "1234password!",
|
|
99
|
+
"network_timeout": DEFAULT_NETWORK_TIMEOUT,
|
|
100
|
+
"timeout": DEFAULT_TIMEOUT,
|
|
101
|
+
"retries": DEFAULT_RETRIES,
|
|
102
|
+
"load_media": True,
|
|
103
|
+
"tracing": False,
|
|
104
|
+
"screenshots": False,
|
|
105
|
+
"out_dir": "./out",
|
|
106
|
+
}
|
|
107
|
+
)
|