SYMBOL INDEX (1666 symbols across 237 files) FILE: changedetectionio/__init__.py function get_version (line 94) | def get_version(): function sigshutdown_handler (line 98) | def sigshutdown_handler(_signo, _stack_frame): function print_help (line 146) | def print_help(): function main (line 181) | def main(): FILE: changedetectionio/api/Import.py function default_content_type (line 13) | def default_content_type(content_type='text/plain'): function convert_query_param_to_type (line 26) | def convert_query_param_to_type(value, schema_property): class Import (line 96) | class Import(Resource): method __init__ (line 97) | def __init__(self, **kwargs): method post (line 104) | def post(self): FILE: changedetectionio/api/Notifications.py class Notifications (line 5) | class Notifications(Resource): method __init__ (line 6) | def __init__(self, **kwargs): method get (line 12) | def get(self): method post (line 23) | def post(self): method put (line 50) | def put(self): method delete (line 72) | def delete(self): function validate_notification_urls (line 97) | def validate_notification_urls(notification_urls): FILE: changedetectionio/api/Search.py class Search (line 5) | class Search(Resource): method __init__ (line 6) | def __init__(self, **kwargs): method get (line 12) | def get(self): FILE: changedetectionio/api/Spec.py function _get_spec_yaml (line 7) | def _get_spec_yaml(): class Spec (line 14) | class Spec(Resource): method get (line 15) | def get(self): FILE: changedetectionio/api/SystemInfo.py class SystemInfo (line 5) | class SystemInfo(Resource): method __init__ (line 6) | def __init__(self, **kwargs): method get (line 13) | def get(self): FILE: changedetectionio/api/Tags.py class Tag (line 13) | class Tag(Resource): method __init__ (line 14) | def __init__(self, **kwargs): method get (line 23) | def get(self, uuid): method delete (line 92) | def delete(self, uuid): method put (line 110) | def put(self, uuid): method post (line 162) | def post(self): class Tags (line 191) | class Tags(Resource): method __init__ (line 192) | def __init__(self, **kwargs): method get (line 198) | def get(self): FILE: changedetectionio/api/Watch.py function validate_time_between_check_required (line 20) | def validate_time_between_check_required(json_data): class Watch (line 53) | class Watch(Resource): method __init__ (line 54) | def __init__(self, **kwargs): method get (line 65) | def get(self, uuid): method delete (line 112) | def delete(self, uuid): method put (line 122) | def put(self, uuid): class WatchHistory (line 214) | class WatchHistory(Resource): method __init__ (line 215) | def __init__(self, **kwargs): method get (line 223) | def get(self, uuid): class WatchSingleHistory (line 231) | class WatchSingleHistory(Resource): method __init__ (line 232) | def __init__(self, **kwargs): method get (line 238) | def get(self, uuid, timestamp): class WatchHistoryDiff (line 269) | class WatchHistoryDiff(Resource): method __init__ (line 281) | def __init__(self, **kwargs): method get (line 287) | def get(self, uuid, from_timestamp, to_timestamp): class WatchFavicon (line 387) | class WatchFavicon(Resource): method __init__ (line 388) | def __init__(self, **kwargs): method get (line 394) | def get(self, uuid): class CreateWatch (line 414) | class CreateWatch(Resource): method __init__ (line 415) | def __init__(self, **kwargs): method post (line 422) | def post(self): method get (line 492) | def get(self): FILE: changedetectionio/api/__init__.py function build_merged_spec_dict (line 6) | def build_merged_spec_dict(): function get_openapi_spec (line 66) | def get_openapi_spec(): function get_openapi_schema_dict (line 72) | def get_openapi_schema_dict(): function _resolve_schema_properties (line 82) | def _resolve_schema_properties(schema_name): function get_watch_schema_properties (line 116) | def get_watch_schema_properties(): function get_tag_schema_properties (line 128) | def get_tag_schema_properties(): function validate_openapi_request (line 136) | def validate_openapi_request(operation_id): FILE: changedetectionio/api/auth.py function check_token (line 8) | def check_token(f): FILE: changedetectionio/auth_decorator.py function login_optionally_required (line 6) | def login_optionally_required(func): FILE: changedetectionio/blueprint/backups/__init__.py function create_backup (line 16) | def create_backup(datastore_path, watches: dict, tags: dict = None): function construct_blueprint (line 94) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/backups/restore.py class RestoreForm (line 29) | class RestoreForm(Form): function import_from_zip (line 40) | def import_from_zip(zip_stream, datastore, include_groups, include_group... function construct_restore_blueprint (line 173) | def construct_restore_blueprint(datastore): FILE: changedetectionio/blueprint/browser_steps/__init__.py function _start_browser_steps_loop (line 38) | def _start_browser_steps_loop(): function _ensure_browser_steps_loop (line 70) | def _ensure_browser_steps_loop(): function run_async_in_browser_loop (line 94) | def run_async_in_browser_loop(coro): function _close_session_resources (line 105) | async def _close_session_resources(session_data, label=''): function cleanup_expired_sessions (line 134) | def cleanup_expired_sessions(): function cleanup_session_for_watch (line 168) | def cleanup_session_for_watch(watch_uuid): function construct_blueprint (line 197) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/check_proxies/__init__.py function threadpool (line 20) | def threadpool(f, executor=None): function construct_blueprint (line 28) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/imports/__init__.py function construct_blueprint (line 7) | def construct_blueprint(datastore: ChangeDetectionStore, update_q, queue... FILE: changedetectionio/blueprint/imports/importer.py class Importer (line 10) | class Importer(): method __init__ (line 15) | def __init__(self): method run (line 22) | def run(self, class import_url_list (line 29) | class import_url_list(Importer): method run (line 33) | def run(self, class import_distill_io_json (line 81) | class import_distill_io_json(Importer): method run (line 82) | def run(self, class import_xlsx_wachete (line 142) | class import_xlsx_wachete(Importer): method run (line 144) | def run(self, class import_xlsx_custom (line 221) | class import_xlsx_custom(Importer): method run (line 223) | def run(self, FILE: changedetectionio/blueprint/price_data_follower/__init__.py function construct_blueprint (line 13) | def construct_blueprint(datastore: ChangeDetectionStore, update_q: Prior... FILE: changedetectionio/blueprint/rss/_util.py function scan_invalid_chars_in_rss (line 16) | def scan_invalid_chars_in_rss(content): function clean_entry_content (line 36) | def clean_entry_content(content): function generate_watch_guid (line 44) | def generate_watch_guid(watch, timestamp): function validate_rss_token (line 55) | def validate_rss_token(datastore, request): function get_rss_template (line 71) | def get_rss_template(datastore, watch, rss_content_format, default_html,... function get_watch_label (line 85) | def get_watch_label(datastore, watch): function add_watch_categories (line 93) | def add_watch_categories(fe, watch, datastore): function build_notification_context (line 101) | def build_notification_context(watch, timestamp_from, timestamp_to, watc... function render_notification (line 114) | def render_notification(n_object, notification_service, watch, datastore, function populate_feed_entry (line 130) | def populate_feed_entry(fe, watch, content, guid, timestamp, link=None, ... FILE: changedetectionio/blueprint/rss/blueprint.py function construct_blueprint (line 9) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/rss/main_feed.py function construct_main_feed_routes (line 5) | def construct_main_feed_routes(rss_blueprint, datastore): FILE: changedetectionio/blueprint/rss/single_watch.py function construct_single_watch_routes (line 3) | def construct_single_watch_routes(rss_blueprint, datastore): FILE: changedetectionio/blueprint/rss/tag.py function construct_tag_routes (line 1) | def construct_tag_routes(rss_blueprint, datastore): FILE: changedetectionio/blueprint/settings/__init__.py function construct_blueprint (line 15) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/tags/__init__.py function construct_blueprint (line 10) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/tags/form.py class group_restock_settings_form (line 11) | class group_restock_settings_form(restock_settings_form): class SingleTag (line 14) | class SingleTag(Form): FILE: changedetectionio/blueprint/ui/__init__.py function _handle_operations (line 13) | def _handle_operations(op, uuids, datastore, worker_pool, update_q, queu... function construct_blueprint (line 119) | def construct_blueprint(datastore: ChangeDetectionStore, update_q, worke... FILE: changedetectionio/blueprint/ui/diff.py function construct_blueprint (line 20) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/ui/edit.py function construct_blueprint (line 14) | def construct_blueprint(datastore: ChangeDetectionStore, update_q, queue... FILE: changedetectionio/blueprint/ui/notification.py function construct_blueprint (line 8) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/ui/preview.py function construct_blueprint (line 10) | def construct_blueprint(datastore: ChangeDetectionStore): FILE: changedetectionio/blueprint/ui/views.py function construct_blueprint (line 8) | def construct_blueprint(datastore: ChangeDetectionStore, update_q, queue... FILE: changedetectionio/blueprint/watchlist/__init__.py function construct_blueprint (line 13) | def construct_blueprint(datastore: ChangeDetectionStore, update_q, queue... FILE: changedetectionio/browser_steps/browser_steps.py function browser_steps_get_valid_steps (line 11) | def browser_steps_get_valid_steps(browser_steps: list): class steppable_browser_interface (line 66) | class steppable_browser_interface(): method __init__ (line 71) | def __init__(self, start_url): method call_action (line 75) | async def call_action(self, action_name, selector=None, optional_value... method action_goto_url (line 134) | async def action_goto_url(self, selector=None, value=None): method action_goto_site (line 145) | async def action_goto_site(self, selector=None, value=None): method action_click_element_containing_text (line 148) | async def action_click_element_containing_text(self, selector=None, va... method action_click_element_containing_text_if_exists (line 158) | async def action_click_element_containing_text_if_exists(self, selecto... method action_enter_text_in_field (line 170) | async def action_enter_text_in_field(self, selector, value): method action_execute_js (line 176) | async def action_execute_js(self, selector, value): method action_click_element (line 182) | async def action_click_element(self, selector, value): method action_click_element_if_exists (line 189) | async def action_click_element_if_exists(self, selector, value): method action_click_x_y (line 204) | async def action_click_x_y(self, selector, value): method action__select_by_option_text (line 219) | async def action__select_by_option_text(self, selector, value): method action_scroll_down (line 225) | async def action_scroll_down(self, selector, value): method action_wait_for_seconds (line 230) | async def action_wait_for_seconds(self, selector, value): method action_wait_for_text (line 237) | async def action_wait_for_text(self, selector, value): method action_wait_for_text_in_element (line 249) | async def action_wait_for_text_in_element(self, selector, value): method action_press_enter (line 264) | async def action_press_enter(self, selector, value): method action_press_page_up (line 268) | async def action_press_page_up(self, selector, value): method action_press_page_down (line 271) | async def action_press_page_down(self, selector, value): method action_check_checkbox (line 274) | async def action_check_checkbox(self, selector, value): method action_uncheck_checkbox (line 280) | async def action_uncheck_checkbox(self, selector, value): method action_remove_elements (line 287) | async def action_remove_elements(self, selector, value): method action_make_all_child_elements_visible (line 294) | async def action_make_all_child_elements_visible(self, selector, value): class browsersteps_live_ui (line 314) | class browsersteps_live_ui(steppable_browser_interface): method __init__ (line 338) | def __init__(self, playwright_browser, proxy=None, headers=None, start... method __del__ (line 347) | def __del__(self): method connect (line 353) | async def connect(self, proxy=None): method mark_as_closed (line 382) | def mark_as_closed(self): method cleanup (line 388) | async def cleanup(self): method has_expired (line 429) | def has_expired(self): method get_current_state (line 441) | async def get_current_state(self): FILE: changedetectionio/conditions/__init__.py function filter_complete_rules (line 33) | def filter_complete_rules(ruleset): function convert_to_jsonlogic (line 40) | def convert_to_jsonlogic(logic_operator: str, rule_dict: list): function execute_ruleset_against_all_plugins (line 81) | def execute_ruleset_against_all_plugins(current_watch_uuid: str, applica... function collect_ui_edit_stats_extras (line 153) | def collect_ui_edit_stats_extras(watch): FILE: changedetectionio/conditions/blueprint.py function construct_blueprint (line 9) | def construct_blueprint(datastore): FILE: changedetectionio/conditions/default_plugin.py function register_operators (line 11) | def register_operators(): function register_operator_choices (line 48) | def register_operator_choices(): function register_field_choices (line 60) | def register_field_choices(): function add_data (line 70) | def add_data(current_watch_uuid, application_datastruct, ephemeral_data): FILE: changedetectionio/conditions/exceptions.py class EmptyConditionRuleRowNotUsable (line 1) | class EmptyConditionRuleRowNotUsable(Exception): method __init__ (line 2) | def __init__(self): method __str__ (line 5) | def __str__(self): FILE: changedetectionio/conditions/form.py class ConditionFormRow (line 5) | class ConditionFormRow(Form): method validate (line 24) | def validate(self, extra_validators=None): FILE: changedetectionio/conditions/pluggy_interface.py class ConditionsSpec (line 14) | class ConditionsSpec: method register_operators (line 18) | def register_operators(): method register_operator_choices (line 23) | def register_operator_choices(): method register_field_choices (line 28) | def register_field_choices(): method add_data (line 33) | def add_data(current_watch_uuid, application_datastruct, ephemeral_data): method ui_edit_stats_extras (line 38) | def ui_edit_stats_extras(watch): function load_plugins_from_directory (line 52) | def load_plugins_from_directory(): FILE: changedetectionio/conditions/plugins/levenshtein_plugin.py function levenshtein_ratio_recent_history (line 14) | def levenshtein_ratio_recent_history(watch, incoming_text=None): function register_operators (line 45) | def register_operators(): function register_operator_choices (line 49) | def register_operator_choices(): function register_field_choices (line 54) | def register_field_choices(): function add_data (line 61) | def add_data(current_watch_uuid, application_datastruct, ephemeral_data): function ui_edit_stats_extras (line 76) | def ui_edit_stats_extras(watch): FILE: changedetectionio/conditions/plugins/wordcount_plugin.py function count_words_in_history (line 12) | def count_words_in_history(watch, incoming_text=None): function register_operators (line 30) | def register_operators(): function register_operator_choices (line 35) | def register_operator_choices(): function register_field_choices (line 40) | def register_field_choices(): function add_data (line 47) | def add_data(current_watch_uuid, application_datastruct, ephemeral_data): function _generate_stats_html (line 58) | def _generate_stats_html(watch): function ui_edit_stats_extras (line 79) | def ui_edit_stats_extras(watch): function ui_edit_stats_extras (line 84) | def ui_edit_stats_extras(watch): FILE: changedetectionio/content_fetchers/__init__.py function available_fetchers (line 39) | def available_fetchers(): function get_plugin_fetchers (line 66) | def get_plugin_fetchers(): FILE: changedetectionio/content_fetchers/base.py function manage_user_agent (line 8) | def manage_user_agent(headers, current_ua=''): class Fetcher (line 41) | class Fetcher(): method __init__ (line 78) | def __init__(self, **kwargs): method get_status_icon_data (line 88) | def get_status_icon_data(cls): method clear_content (line 105) | def clear_content(self): method get_error (line 118) | def get_error(self): method run (line 122) | async def run(self, method quit (line 139) | async def quit(self, watch=None): method get_last_status_code (line 143) | def get_last_status_code(self): method screenshot_step (line 147) | def screenshot_step(self, step_n): method is_ready (line 155) | def is_ready(self): method get_all_headers (line 158) | def get_all_headers(self): method iterate_browser_steps (line 165) | async def iterate_browser_steps(self, start_url=None): method delete_browser_steps_screenshots (line 202) | def delete_browser_steps_screenshots(self): method save_step_html (line 211) | def save_step_html(self, step_n): FILE: changedetectionio/content_fetchers/exceptions/__init__.py class Non200ErrorCodeReceived (line 3) | class Non200ErrorCodeReceived(Exception): method __init__ (line 4) | def __init__(self, status_code, url, screenshot=None, xpath_data=None,... class checksumFromPreviousCheckWasTheSame (line 18) | class checksumFromPreviousCheckWasTheSame(Exception): method __init__ (line 19) | def __init__(self): class JSActionExceptions (line 23) | class JSActionExceptions(Exception): method __init__ (line 24) | def __init__(self, status_code, url, screenshot, message=''): class BrowserConnectError (line 31) | class BrowserConnectError(Exception): method __init__ (line 33) | def __init__(self, msg): class BrowserFetchTimedOut (line 38) | class BrowserFetchTimedOut(Exception): method __init__ (line 40) | def __init__(self, msg): class BrowserStepsStepException (line 45) | class BrowserStepsStepException(Exception): method __init__ (line 46) | def __init__(self, step_n, original_e): class PageUnloadable (line 54) | class PageUnloadable(Exception): method __init__ (line 55) | def __init__(self, status_code=None, url='', message='', screenshot=Fa... class BrowserStepsInUnsupportedFetcher (line 63) | class BrowserStepsInUnsupportedFetcher(Exception): method __init__ (line 64) | def __init__(self, url): class EmptyReply (line 68) | class EmptyReply(Exception): method __init__ (line 69) | def __init__(self, status_code, url, screenshot=None): class ScreenshotUnavailable (line 77) | class ScreenshotUnavailable(Exception): method __init__ (line 78) | def __init__(self, status_code, url, page_html=None): class ReplyWithContentButNoText (line 88) | class ReplyWithContentButNoText(Exception): method __init__ (line 89) | def __init__(self, status_code, url, screenshot=None, has_filters=Fals... FILE: changedetectionio/content_fetchers/playwright.py function capture_full_page_async (line 16) | async def capture_full_page_async(page, screenshot_format='JPEG', watch_... class fetcher (line 150) | class fetcher(Fetcher): method get_status_icon_data (line 172) | def get_status_icon_data(cls): method __init__ (line 180) | def __init__(self, proxy_override=None, custom_browser_connection_url=... method screenshot_step (line 214) | async def screenshot_step(self, step_n=''): method save_step_html (line 232) | async def save_step_html(self, step_n): method run (line 247) | async def run(self, class PlaywrightFetcherPlugin (line 459) | class PlaywrightFetcherPlugin: method register_content_fetcher (line 462) | def register_content_fetcher(self): FILE: changedetectionio/content_fetchers/puppeteer.py function capture_full_page (line 24) | async def capture_full_page(page, screenshot_format='JPEG', watch_uuid=N... class fetcher (line 168) | class fetcher(Fetcher): method get_status_icon_data (line 186) | def get_status_icon_data(cls): method __init__ (line 194) | def __init__(self, proxy_override=None, custom_browser_connection_url=... method quit (line 224) | async def quit(self, watch=None): method fetch_page (line 256) | async def fetch_page(self, method main (line 497) | async def main(self, **kwargs): method run (line 500) | async def run(self, class PuppeteerFetcherPlugin (line 548) | class PuppeteerFetcherPlugin: method register_content_fetcher (line 551) | def register_content_fetcher(self): FILE: changedetectionio/content_fetchers/requests.py class fetcher (line 15) | class fetcher(Fetcher): method __init__ (line 18) | def __init__(self, proxy_override=None, custom_browser_connection_url=... method _run_sync (line 23) | def _run_sync(self, method run (line 208) | async def run(self, method quit (line 244) | async def quit(self, watch=None): class RequestsFetcherPlugin (line 258) | class RequestsFetcherPlugin: method register_content_fetcher (line 261) | def register_content_fetcher(self): FILE: changedetectionio/content_fetchers/res/lock-elements-sizing.js method constructor (line 100) | constructor() {} method observe (line 101) | observe() {} method unobserve (line 102) | unobserve() {} method disconnect (line 103) | disconnect() {} FILE: changedetectionio/content_fetchers/res/stock-not-in-stock.js function isItemInStock (line 3) | function isItemInStock() { FILE: changedetectionio/content_fetchers/res/xpath_element_scraper.js function getxpath (line 14) | function getxpath(e) { function collectVisibleElements (line 84) | function collectVisibleElements(parent, visibleElements) { FILE: changedetectionio/content_fetchers/screenshot_handler.py function stitch_images_worker_raw_bytes (line 11) | def stitch_images_worker_raw_bytes(pipe_conn, original_page_height, capt... FILE: changedetectionio/content_fetchers/webdriver_selenium.py class fetcher (line 8) | class fetcher(Fetcher): method get_status_icon_data (line 23) | def get_status_icon_data(cls): method __init__ (line 31) | def __init__(self, proxy_override=None, custom_browser_connection_url=... method run (line 63) | async def run(self, class WebDriverSeleniumFetcherPlugin (line 190) | class WebDriverSeleniumFetcherPlugin: method register_content_fetcher (line 193) | def register_content_fetcher(self): FILE: changedetectionio/custom_queue.py class NotificationQueue (line 7) | class NotificationQueue(queue.Queue): method __init__ (line 15) | def __init__(self, maxsize=0): method put (line 22) | def put(self, item, block=True, timeout=None): class SignalPriorityQueue (line 41) | class SignalPriorityQueue(queue.PriorityQueue): method __init__ (line 50) | def __init__(self, maxsize=0): method put (line 57) | def put(self, item, block=True, timeout=None): method get (line 79) | def get(self, block=True, timeout=None): method get_uuid_position (line 91) | def get_uuid_position(self, target_uuid): method get_all_queued_uuids (line 155) | def get_all_queued_uuids(self, limit=None, offset=0): method get_queue_summary (line 249) | def get_queue_summary(self): class AsyncSignalPriorityQueue (line 298) | class AsyncSignalPriorityQueue(asyncio.PriorityQueue): method __init__ (line 306) | def __init__(self, maxsize=0): method put (line 313) | async def put(self, item): method get (line 334) | async def get(self): method queue (line 347) | def queue(self): method get_uuid_position (line 354) | def get_uuid_position(self, target_uuid): method get_all_queued_uuids (line 414) | def get_all_queued_uuids(self, limit=None, offset=0): method get_queue_summary (line 496) | def get_queue_summary(self): FILE: changedetectionio/diff/__init__.py function render_inline_word_diff (line 49) | def render_inline_word_diff(before_line: str, after_line: str, ignore_ju... function render_nested_line_diff (line 172) | def render_nested_line_diff(before_line: str, after_line: str, ignore_ju... function same_slicer (line 263) | def same_slicer(lst: List[str], start: int, end: int) -> List[str]: function customSequenceMatcher (line 267) | def customSequenceMatcher( function render_diff (line 382) | def render_diff( FILE: changedetectionio/diff/tokenizers/natural_text.py function tokenize_words (line 11) | def tokenize_words(text: str) -> List[str]: FILE: changedetectionio/diff/tokenizers/words_and_html.py function tokenize_words_and_html (line 13) | def tokenize_words_and_html(text: str) -> List[str]: FILE: changedetectionio/favicon_utils.py function get_favicon_mime_type (line 10) | def get_favicon_mime_type(filepath): FILE: changedetectionio/flask_app.py class StrictUUIDConverter (line 75) | class StrictUUIDConverter(BaseConverter): method to_python (line 79) | def to_python(self, value: str) -> str: method to_url (line 91) | def to_url(self, value) -> str: function _configure_plugin_templates (line 139) | def _configure_plugin_templates(): function init_app_secret (line 172) | def init_app_secret(datastore_path): function get_darkmode_state (line 191) | def get_darkmode_state(): function get_css_version (line 196) | def get_css_version(): function get_socketio_path (line 200) | def get_socketio_path(): function _is_safe_valid_url (line 211) | def _is_safe_valid_url(test_url): function _jinja2_filter_format_number_locale (line 217) | def _jinja2_filter_format_number_locale(value: float) -> str: function _jinja2_filter_regex_search (line 224) | def _jinja2_filter_regex_search(value, pattern): function _watch_is_checking_now (line 229) | def _watch_is_checking_now(watch_obj, format="%Y-%m-%d %H:%M:%S"): function _get_watch_queue_position (line 233) | def _get_watch_queue_position(watch_obj): function _get_current_worker_count (line 239) | def _get_current_worker_count(): function _get_worker_status_info (line 244) | def _get_worker_status_info(): function _jinja2_filter_datetime (line 261) | def _jinja2_filter_datetime(watch_obj, format="%Y-%m-%d %H:%M:%S"): function _jinja2_filter_datetimestamp (line 274) | def _jinja2_filter_datetimestamp(timestamp, format="%Y-%m-%d %H:%M:%S"): function _jinja2_filter_pagination_slice (line 287) | def _jinja2_filter_pagination_slice(arr, skip): function _jinja2_filter_seconds_precise (line 295) | def _jinja2_filter_seconds_precise(timestamp): function _jinja2_filter_format_duration (line 302) | def _jinja2_filter_format_duration(seconds): function _jinja2_filter_fetcher_status_icons (line 343) | def _jinja2_filter_fetcher_status_icons(fetcher_name): function _jinja2_filter_sanitize_tag_class (line 394) | def _jinja2_filter_sanitize_tag_class(tag_title): class User (line 415) | class User(flask_login.UserMixin): method set_password (line 418) | def set_password(self, password): method get_user (line 420) | def get_user(self, email="defaultuser@changedetection.io"): method is_authenticated (line 422) | def is_authenticated(self): method is_active (line 424) | def is_active(self): method is_anonymous (line 426) | def is_anonymous(self): method get_id (line 428) | def get_id(self): method check_password (line 432) | def check_password(self, password): function changedetection_app (line 459) | def changedetection_app(config=None, datastore_o=None): function check_for_new_version (line 1015) | def check_for_new_version(): function notification_runner (line 1043) | def notification_runner(worker_id=0): function ticker_thread_check_time_launch_checks (line 1097) | def ticker_thread_check_time_launch_checks(): FILE: changedetectionio/forms.py class StringListField (line 64) | class StringListField(StringField): method _value (line 67) | def _value(self): method process_formdata (line 78) | def process_formdata(self, valuelist): class SaltyPasswordField (line 88) | class SaltyPasswordField(StringField): method build_password (line 92) | def build_password(self, password): method process_formdata (line 106) | def process_formdata(self, valuelist): class StringTagUUID (line 115) | class StringTagUUID(StringField): method _value (line 120) | def _value(self): class TimeDurationForm (line 138) | class TimeDurationForm(Form): class TimeStringField (line 142) | class TimeStringField(Field): method _value (line 148) | def _value(self): method process_formdata (line 154) | def process_formdata(self, valuelist): class validateTimeZoneName (line 166) | class validateTimeZoneName(object): method __init__ (line 171) | def __init__(self, message=None): method __call__ (line 174) | def __call__(self, form, field): class ScheduleLimitDaySubForm (line 180) | class ScheduleLimitDaySubForm(Form): class ScheduleLimitForm (line 185) | class ScheduleLimitForm(Form): method __init__ (line 200) | def __init__( function validate_time_between_check_has_values (line 219) | def validate_time_between_check_has_values(form): class RequiredTimeInterval (line 235) | class RequiredTimeInterval(object): method __init__ (line 240) | def __init__(self, message=None): method __call__ (line 243) | def __call__(self, form, field): class TimeBetweenCheckForm (line 248) | class TimeBetweenCheckForm(Form): method __init__ (line 256) | def __init__(self, formdata=None, obj=None, prefix="", data=None, meta... method validate (line 261) | def validate(self, **kwargs): class EnhancedFormField (line 279) | class EnhancedFormField(FormField): method __init__ (line 285) | def __init__(self, form_class, label=None, validators=None, separator=... method validate (line 301) | def validate(self, form, extra_validators=()): class RequiredFormField (line 330) | class RequiredFormField(FormField): method __init__ (line 336) | def __init__(self, form_class, label=None, validators=None, separator=... method process (line 339) | def process(self, formdata, data=unset_value, extra_filters=None): method errors (line 363) | def errors(self): class StringDictKeyValue (line 374) | class StringDictKeyValue(StringField): method _value (line 377) | def _value(self): method process_formdata (line 387) | def process_formdata(self, valuelist): class ValidateContentFetcherIsReady (line 411) | class ValidateContentFetcherIsReady(object): method __init__ (line 415) | def __init__(self, message=None): method __call__ (line 418) | def __call__(self, form, field): class ValidateNotificationBodyAndTitleWhenURLisSet (line 446) | class ValidateNotificationBodyAndTitleWhenURLisSet(object): method __init__ (line 452) | def __init__(self, message=None): method __call__ (line 455) | def __call__(self, form, field): class ValidateAppRiseServers (line 461) | class ValidateAppRiseServers(object): method __init__ (line 466) | def __init__(self, message=None): method __call__ (line 469) | def __call__(self, form, field): class ValidateJinja2Template (line 490) | class ValidateJinja2Template(object): method __call__ (line 494) | def __call__(self, form, field): class validateURL (line 530) | class validateURL(object): method __init__ (line 536) | def __init__(self, message=None): method __call__ (line 539) | def __call__(self, form, field): function validate_url (line 544) | def validate_url(test_url): class ValidateSinglePythonRegexString (line 551) | class ValidateSinglePythonRegexString(object): method __init__ (line 552) | def __init__(self, message=None): method __call__ (line 555) | def __call__(self, form, field): class ValidateListRegex (line 563) | class ValidateListRegex(object): method __init__ (line 567) | def __init__(self, message=None): method __call__ (line 570) | def __call__(self, form, field): class ValidateCSSJSONXPATHInput (line 582) | class ValidateCSSJSONXPATHInput(object): method __init__ (line 588) | def __init__(self, message=None, allow_xpath=True, allow_json=True): method __call__ (line 593) | def __call__(self, form, field): class ValidateSimpleURL (line 680) | class ValidateSimpleURL: method __init__ (line 682) | def __init__(self, message=None): method __call__ (line 685) | def __call__(self, form, field): class ValidateStartsWithRegex (line 695) | class ValidateStartsWithRegex(object): method __init__ (line 696) | def __init__(self, regex, *, flags=0, message=None, allow_empty=True, ... method __call__ (line 703) | def __call__(self, form, field): class quickWatchForm (line 725) | class quickWatchForm(Form): class commonSettingsForm (line 734) | class commonSettingsForm(Form): method __init__ (line 737) | def __init__(self, formdata=None, obj=None, prefix="", data=None, meta... class importForm (line 761) | class importForm(Form): class SingleBrowserStep (line 767) | class SingleBrowserStep(Form): class processor_text_json_diff_form (line 778) | class processor_text_json_diff_form(commonSettingsForm): method extra_tab_content (line 837) | def extra_tab_content(self): method extra_form_content (line 840) | def extra_form_content(self): method validate (line 843) | def validate(self, **kwargs): method __init__ (line 899) | def __init__( class SingleExtraProxy (line 916) | class SingleExtraProxy(Form): class SingleExtraBrowser (line 929) | class SingleExtraBrowser(Form): class DefaultUAInputForm (line 941) | class DefaultUAInputForm(Form): class globalSettingsRequestForm (line 947) | class globalSettingsRequestForm(Form): method validate_extra_proxies (line 970) | def validate_extra_proxies(self, extra_validators=None): class globalSettingsApplicationUIForm (line 977) | class globalSettingsApplicationUIForm(Form): class globalSettingsApplicationForm (line 984) | class globalSettingsApplicationForm(commonSettingsForm): class globalSettingsForm (line 1039) | class globalSettingsForm(Form): method __init__ (line 1043) | def __init__(self, formdata=None, obj=None, prefix="", data=None, meta... class extractDataForm (line 1054) | class extractDataForm(Form): FILE: changedetectionio/gc_cleanup.py function memory_cleanup (line 12) | def memory_cleanup(app=None): FILE: changedetectionio/html_tools.py class JSONNotFound (line 22) | class JSONNotFound(ValueError): method __init__ (line 23) | def __init__(self, msg): function _build_safe_xpath3_parser (line 38) | def _build_safe_xpath3_parser(): function perl_style_slash_enclosed_regex_to_options (line 76) | def perl_style_slash_enclosed_regex_to_options(regex): function include_filters (line 90) | def include_filters(include_filters, html_content, append_pretty_line_fo... function subtractive_css_selector (line 108) | def subtractive_css_selector(css_selector, content): function subtractive_xpath_selector (line 125) | def subtractive_xpath_selector(selectors: List[str], html_content: str) ... function element_removal (line 152) | def element_removal(selectors: List[str], html_content): function elementpath_tostring (line 180) | def elementpath_tostring(obj): function xpath_filter (line 222) | def xpath_filter(xpath_filter, html_content, append_pretty_line_formatti... function xpath1_filter (line 295) | def xpath1_filter(xpath_filter, html_content, append_pretty_line_formatt... function extract_element (line 350) | def extract_element(find='title', html_content=''): function _parse_json (line 364) | def _parse_json(json_data, json_filter): function _get_stripped_text_from_json_match (line 390) | def _get_stripped_text_from_json_match(match): function extract_json_blob_from_html (line 411) | def extract_json_blob_from_html(content, ensure_is_ldjson_info_type, jso... function extract_json_as_string (line 473) | def extract_json_as_string(content, json_filter, ensure_is_ldjson_info_t... function strip_ignore_text (line 521) | def strip_ignore_text(content, wordlist, mode="content"): function cdata_in_document_to_text (line 588) | def cdata_in_document_to_text(html_content: str, render_anchor_tag_conte... function html_to_text (line 601) | def html_to_text(html_content: str, render_anchor_tag_content=False, is_... function has_ldjson_product_info (line 656) | def has_ldjson_product_info(content): function workarounds_for_obfuscations (line 678) | def workarounds_for_obfuscations(content): function get_triggered_text (line 694) | def get_triggered_text(content, trigger_text): function extract_title (line 709) | def extract_title(data: bytes | str, sniff_bytes: int = 2048, scan_chars... FILE: changedetectionio/is_safe_url.py function is_safe_url (line 21) | def is_safe_url(target, app): FILE: changedetectionio/jinja2_custom/extensions/TimeExtension.py class TimeExtension (line 89) | class TimeExtension(Extension): method __init__ (line 102) | def __init__(self, environment): method _datetime (line 111) | def _datetime(self, timezone, operator, offset, datetime_format): method _now (line 150) | def _now(self, timezone, datetime_format): method parse (line 173) | def parse(self, parser): FILE: changedetectionio/jinja2_custom/plugins/regex.py function regex_replace (line 11) | def regex_replace(value: str, pattern: str, replacement: str = '', count... FILE: changedetectionio/jinja2_custom/safe_jinja.py function create_jinja_env (line 18) | def create_jinja_env(extensions=None, **kwargs) -> jinja2.sandbox.Immuta... function render (line 49) | def render(template_str, **args: t.Any) -> str: function render_fully_escaped (line 54) | def render_fully_escaped(content): FILE: changedetectionio/languages.py function get_timeago_locale (line 9) | def get_timeago_locale(flask_locale): function get_available_languages (line 75) | def get_available_languages(): function get_language_codes (line 100) | def get_language_codes(): function get_flag_for_locale (line 105) | def get_flag_for_locale(locale): function get_name_for_locale (line 110) | def get_name_for_locale(locale): FILE: changedetectionio/model/App.py class model (line 19) | class model(dict): method __init__ (line 84) | def __init__(self, *arg, datastore_path=None, **kw): function parse_headers_from_text_file (line 96) | def parse_headers_from_text_file(filepath): FILE: changedetectionio/model/Tag.py class model (line 26) | class model(EntityPersistenceMixin, watch_base): method __init__ (line 44) | def __init__(self, *arg, **kw): FILE: changedetectionio/model/Tags.py class TagsDict (line 9) | class TagsDict(dict): method __init__ (line 12) | def __init__(self, *args, datastore_path: str | os.PathLike, **kwargs)... method __delitem__ (line 16) | def __delitem__(self, key: str) -> None: method pop (line 31) | def pop(self, key: str, default=_SENTINEL): FILE: changedetectionio/model/Watch.py function _brotli_save (line 54) | def _brotli_save(contents, filepath, mode=None, fallback_uncompressed=Fa... class model (line 136) | class model(EntityPersistenceMixin, watch_base): method __init__ (line 234) | def __init__(self, *arg, **kw): method viewed (line 256) | def viewed(self): method has_unviewed (line 264) | def has_unviewed(self): method link (line 268) | def link(self): method domain_only_from_link (line 297) | def domain_only_from_link(self): method history_index_filename (line 304) | def history_index_filename(self): method clear_watch (line 312) | def clear_watch(self): method is_source_type_url (line 353) | def is_source_type_url(self): method get_fetch_backend (line 357) | def get_fetch_backend(self): method fetcher_supports_screenshots (line 392) | def fetcher_supports_screenshots(self): method is_pdf (line 411) | def is_pdf(self): method label (line 424) | def label(self): method last_changed (line 429) | def last_changed(self): method history_n (line 438) | def history_n(self): method history (line 442) | def history(self): method has_history (line 495) | def has_history(self): method has_browser_steps (line 500) | def has_browser_steps(self): method has_restock_info (line 508) | def has_restock_info(self): method newest_history_key (line 516) | def newest_history_key(self): method get_from_version_based_on_last_viewed (line 529) | def get_from_version_based_on_last_viewed(self): method get_history_snapshot (line 554) | def get_history_snapshot(self, timestamp=None, filepath=None): method _write_atomic (line 599) | def _write_atomic(self, dest, data, mode='wb'): method history_trim (line 609) | def history_trim(self, newest_n_items): method save_history_blob (line 645) | def save_history_blob(self, contents, timestamp, snapshot_id): method has_empty_checktime (line 724) | def has_empty_checktime(self): method threshold_seconds (line 730) | def threshold_seconds(self): method lines_contain_something_unique_compared_to_history (line 740) | def lines_contain_something_unique_compared_to_history(self, lines: li... method get_screenshot (line 771) | def get_screenshot(self): method favicon_is_expired (line 779) | def favicon_is_expired(self): method bump_favicon (line 801) | def bump_favicon(self, url, favicon_base_64: str) -> None: method get_favicon_filename (line 847) | def get_favicon_filename(self) -> str | None: method get_screenshot_as_thumbnail (line 867) | def get_screenshot_as_thumbnail(self, max_age=3200): method __get_file_ctime (line 931) | def __get_file_ctime(self, filename): method error_text_ctime (line 938) | def error_text_ctime(self): method snapshot_text_ctime (line 942) | def snapshot_text_ctime(self): method snapshot_screenshot_ctime (line 950) | def snapshot_screenshot_ctime(self): method snapshot_error_screenshot_ctime (line 954) | def snapshot_error_screenshot_ctime(self): method get_error_text (line 957) | def get_error_text(self): method get_error_snapshot (line 965) | def get_error_snapshot(self): method pause (line 973) | def pause(self): method unpause (line 976) | def unpause(self): method toggle_pause (line 979) | def toggle_pause(self): method mute (line 982) | def mute(self): method unmute (line 985) | def unmute(self): method toggle_mute (line 988) | def toggle_mute(self): method _get_commit_data (line 991) | def _get_commit_data(self): method extra_notification_token_values (line 1022) | def extra_notification_token_values(self): method extra_notification_token_placeholder_info (line 1027) | def extra_notification_token_placeholder_info(self): method extract_regex_from_all_history (line 1033) | def extract_regex_from_all_history(self, regex): method has_special_diff_filter_options_set (line 1078) | def has_special_diff_filter_options_set(self): method save_error_text (line 1091) | def save_error_text(self, contents): method save_xpath_data (line 1097) | def save_xpath_data(self, data, as_error=False): method save_screenshot (line 1116) | def save_screenshot(self, screenshot: bytes, as_error=False): method get_last_fetched_text_before_filters (line 1130) | def get_last_fetched_text_before_filters(self): method save_last_text_fetched_before_filters (line 1145) | def save_last_text_fetched_before_filters(self, contents): method save_last_fetched_html (line 1150) | def save_last_fetched_html(self, timestamp, contents): method get_fetched_html (line 1157) | def get_fetched_html(self, timestamp): method _prune_last_fetched_html_snapshots (line 1169) | def _prune_last_fetched_html_snapshots(self): method get_browsersteps_available_screenshots (line 1184) | def get_browsersteps_available_screenshots(self): method compile_error_texts (line 1193) | def compile_error_texts(self, has_proxies=None): FILE: changedetectionio/model/__init__.py class watch_base (line 15) | class watch_base(dict): method __init__ (line 158) | def __init__(self, *arg, **kw): method _mark_field_as_edited (line 320) | def _mark_field_as_edited(self, key): method __setitem__ (line 348) | def __setitem__(self, key, value): method __delitem__ (line 363) | def __delitem__(self, key): method update (line 368) | def update(self, *args, **kwargs): method pop (line 386) | def pop(self, key, *args): method setdefault (line 392) | def setdefault(self, key, default=None): method was_edited (line 402) | def was_edited(self): method reset_watch_edited_flag (line 411) | def reset_watch_edited_flag(self): method get_property_names (line 420) | def get_property_names(cls): method __deepcopy__ (line 455) | def __deepcopy__(self, memo): method __getstate__ (line 507) | def __getstate__(self): method __setstate__ (line 537) | def __setstate__(self, state): method data_dir (line 555) | def data_dir(self): method ensure_data_dir_exists (line 564) | def ensure_data_dir_exists(self): method get_global_setting (line 575) | def get_global_setting(self, *path): method _get_commit_data (line 599) | def _get_commit_data(self): method _save_to_disk (line 621) | def _save_to_disk(self, data_dict, uuid): method commit (line 634) | def commit(self): FILE: changedetectionio/model/persistence.py function _determine_entity_type (line 12) | def _determine_entity_type(cls): class EntityPersistenceMixin (line 37) | class EntityPersistenceMixin: method _save_to_disk (line 52) | def _save_to_disk(self, data_dict, uuid): FILE: changedetectionio/model/schema_utils.py function get_openapi_schema_dict (line 12) | def get_openapi_schema_dict(): function _resolve_readonly_fields (line 30) | def _resolve_readonly_fields(schema_name): function get_readonly_watch_fields (line 72) | def get_readonly_watch_fields(): function get_readonly_tag_fields (line 86) | def get_readonly_tag_fields(): FILE: changedetectionio/notification/apprise_plugin/custom_handlers.py function notify_supported_methods (line 65) | def notify_supported_methods(func): function _register_http_handler (line 73) | def _register_http_handler(schema, send_func): function _get_auth (line 126) | def _get_auth(parsed_url: dict) -> str | tuple[str, str]: function _get_headers (line 139) | def _get_headers(parsed_url: dict, body: str) -> CaseInsensitiveDict: function _get_params (line 155) | def _get_params(parsed_url: dict) -> CaseInsensitiveDict: function apprise_http_custom_handler (line 172) | def apprise_http_custom_handler( FILE: changedetectionio/notification/apprise_plugin/discord.py class NotifyDiscordCustom (line 31) | class NotifyDiscordCustom(NotifyDiscord): method send (line 37) | def send(self, body, title="", notify_type=None, attach=None, **kwargs): method _send_with_colored_embeds (line 56) | def _send_with_colored_embeds(self, body, title, notify_type, attach, ... method _parse_body_into_chunks (line 200) | def _parse_body_into_chunks(self, body): function discord_custom_wrapper (line 278) | def discord_custom_wrapper(body, title, notify_type, meta, body_format=N... FILE: changedetectionio/notification/email_helpers.py function as_monospaced_html_email (line 1) | def as_monospaced_html_email(content: str, title: str) -> str: FILE: changedetectionio/notification/handler.py function markup_text_links_to_html (line 19) | def markup_text_links_to_html(body): function notification_format_align_with_apprise (line 59) | def notification_format_align_with_apprise(n_format : str): function apply_html_color_to_body (line 83) | def apply_html_color_to_body(n_body: str): function apply_discord_markdown_to_body (line 100) | def apply_discord_markdown_to_body(n_body): function apply_standard_markdown_to_body (line 124) | def apply_standard_markdown_to_body(n_body): function replace_placemarkers_in_text (line 150) | def replace_placemarkers_in_text(text, url, requested_output_format): function apply_service_tweaks (line 206) | def apply_service_tweaks(url, n_body, n_title, requested_output_format): function process_notification (line 301) | def process_notification(n_object: NotificationContextData, datastore): function create_notification_parameters (line 470) | def create_notification_parameters(n_object: NotificationContextData, da... FILE: changedetectionio/notification_service.py function _check_cascading_vars (line 17) | def _check_cascading_vars(datastore, var_name, watch): class FormattableTimestamp (line 57) | class FormattableTimestamp(str): method __new__ (line 72) | def __new__(cls, timestamp): method __call__ (line 84) | def __call__(self, format=_DEFAULT_FORMAT): class FormattableDiff (line 91) | class FormattableDiff(str): method __new__ (line 108) | def __new__(cls, prev_snapshot, current_snapshot, **base_kwargs): method __call__ (line 120) | def __call__(self, lines=None, added_only=False, removed_only=False, c... class NotificationContextData (line 148) | class NotificationContextData(dict): method __init__ (line 149) | def __init__(self, initial_data=None, **kwargs): method set_random_for_validation (line 194) | def set_random_for_validation(self): method __setitem__ (line 205) | def __setitem__(self, key, value): function add_rendered_diff_to_notification_vars (line 212) | def add_rendered_diff_to_notification_vars(notification_scan_text:str, p... function set_basic_notification_vars (line 263) | def set_basic_notification_vars(current_snapshot, prev_snapshot, watch, ... class NotificationService (line 284) | class NotificationService: method __init__ (line 290) | def __init__(self, datastore, notification_q): method queue_notification_for_watch (line 294) | def queue_notification_for_watch(self, n_object: NotificationContextDa... method send_content_changed_notification (line 351) | def send_content_changed_notification(self, watch_uuid): method send_filter_failure_notification (line 390) | def send_filter_failure_notification(self, watch_uuid): method send_step_failure_notification (line 437) | def send_step_failure_notification(self, watch_uuid, step_n): function create_notification_service (line 485) | def create_notification_service(datastore, notification_q): FILE: changedetectionio/pluggy_interface.py class ChangeDetectionSpec (line 14) | class ChangeDetectionSpec: method ui_edit_stats_extras (line 18) | def ui_edit_stats_extras(watch): method register_content_fetcher (line 30) | def register_content_fetcher(self): method fetcher_status_icon (line 42) | def fetcher_status_icon(fetcher_name): method plugin_static_path (line 55) | def plugin_static_path(self): method get_itemprop_availability_override (line 64) | def get_itemprop_availability_override(self, content, fetcher_name, fe... method plugin_settings_tab (line 89) | def plugin_settings_tab(self): method register_processor (line 109) | def register_processor(self): method update_handler_alter (line 133) | def update_handler_alter(update_handler, watch, datastore): method update_finalize (line 154) | def update_finalize(update_handler, watch, datastore, processing_excep... function load_plugins_from_directories (line 185) | def load_plugins_from_directories(): function inject_datastore_into_plugins (line 218) | def inject_datastore_into_plugins(datastore): function register_builtin_fetchers (line 234) | def register_builtin_fetchers(): function collect_ui_edit_stats_extras (line 256) | def collect_ui_edit_stats_extras(watch): function collect_fetcher_status_icons (line 271) | def collect_fetcher_status_icons(fetcher_name): function get_itemprop_availability_from_plugin (line 291) | def get_itemprop_availability_from_plugin(content, fetcher_name, fetcher... function get_active_plugins (line 324) | def get_active_plugins(): function get_fetcher_capabilities (line 362) | def get_fetcher_capabilities(watch, datastore): function get_plugin_settings_tabs (line 417) | def get_plugin_settings_tabs(): function load_plugin_settings (line 446) | def load_plugin_settings(datastore_path, plugin_id): function save_plugin_settings (line 470) | def save_plugin_settings(datastore_path, plugin_id, settings): function get_plugin_template_paths (line 494) | def get_plugin_template_paths(): function apply_update_handler_alter (line 550) | def apply_update_handler_alter(update_handler, watch, datastore): function apply_update_finalize (line 583) | def apply_update_finalize(update_handler, watch, datastore, processing_e... FILE: changedetectionio/processors/__init__.py function find_sub_packages (line 9) | def find_sub_packages(package_name): function find_processors (line 21) | def find_processors(): function get_parent_module (line 71) | def get_parent_module(module): function get_custom_watch_obj_for_processor (line 85) | def get_custom_watch_obj_for_processor(processor_name): function find_processor_module (line 99) | def find_processor_module(processor_name): function get_processor_module (line 119) | def get_processor_module(processor_name): function get_processor_submodule (line 140) | def get_processor_submodule(processor_name, submodule_name): function get_plugin_processor_metadata (line 176) | def get_plugin_processor_metadata(): function _available_processors_cached (line 194) | def _available_processors_cached(locale_str): function available_processors (line 260) | def available_processors(): function get_default_processor (line 277) | def get_default_processor(): function get_processor_badge_texts (line 291) | def get_processor_badge_texts(): function get_processor_descriptions (line 314) | def get_processor_descriptions(): function generate_processor_badge_colors (line 344) | def generate_processor_badge_colors(processor_name): function get_processor_badge_css (line 384) | def get_processor_badge_css(): function save_processor_config (line 416) | def save_processor_config(datastore, watch_uuid, config_data): function extract_processor_config_from_form_data (line 460) | def extract_processor_config_from_form_data(form_data): FILE: changedetectionio/processors/base.py class difference_detection_processor (line 18) | class difference_detection_processor(): method __init__ (line 29) | def __init__(self, datastore, watch_uuid): method update_last_raw_content_checksum (line 46) | def update_last_raw_content_checksum(self, checksum): method read_last_raw_content_checksum (line 72) | def read_last_raw_content_checksum(self): method validate_iana_url (line 101) | async def validate_iana_url(self): method call_browser (line 118) | async def call_browser(self, preferred_proxy_id=None): method get_extra_watch_config (line 275) | def get_extra_watch_config(self, filename): method update_extra_watch_config (line 306) | def update_extra_watch_config(self, filename, data, merge=True): method get_raw_document_checksum (line 353) | def get_raw_document_checksum(self): method run_changedetection (line 362) | def run_changedetection(self, watch, force_reprocess=False): FILE: changedetectionio/processors/exceptions.py class ProcessorException (line 1) | class ProcessorException(Exception): method __init__ (line 2) | def __init__(self, message=None, status_code=None, url=None, screensho... FILE: changedetectionio/processors/extract.py function render_form (line 14) | def render_form(watch, datastore, request, url_for, render_template, fla... function process_extraction (line 72) | def process_extraction(watch, datastore, request, url_for, make_response... FILE: changedetectionio/processors/image_ssim_diff/difference.py function get_asset (line 27) | def get_asset(asset_name, watch, datastore, request): function _detect_mime_type (line 160) | def _detect_mime_type(img_bytes): function _draw_bounding_box_if_configured (line 185) | def _draw_bounding_box_if_configured(img_bytes, watch, datastore): function render (line 306) | def render(watch, datastore, request, url_for, render_template, flash, r... FILE: changedetectionio/processors/image_ssim_diff/edit_hook.py function on_config_save (line 22) | def on_config_save(watch, processor_config, datastore): function analyze_region_features (line 106) | def analyze_region_features(screenshot_bytes, x, y, width, height): function save_template_to_file (line 132) | def save_template_to_file(watch, screenshot_bytes, x, y, width, height): FILE: changedetectionio/processors/image_ssim_diff/forms.py function validate_bounding_box (line 13) | def validate_bounding_box(form, field): function validate_selection_mode (line 34) | def validate_selection_mode(form, field): class processor_settings_form (line 43) | class processor_settings_form(processor_text_json_diff_form): method extra_tab_content (line 85) | def extra_tab_content(self): method extra_form_content (line 89) | def extra_form_content(self): FILE: changedetectionio/processors/image_ssim_diff/image_handler/__init__.py class ImageDiffHandler (line 12) | class ImageDiffHandler(ABC): method load_from_bytes (line 21) | def load_from_bytes(self, img_bytes: bytes) -> Any: method save_to_bytes (line 34) | def save_to_bytes(self, img: Any, format: str = 'png', quality: int = ... method crop (line 49) | def crop(self, img: Any, left: int, top: int, right: int, bottom: int)... method resize (line 66) | def resize(self, img: Any, max_width: int, max_height: int) -> Any: method get_dimensions (line 81) | def get_dimensions(self, img: Any) -> Tuple[int, int]: method to_grayscale (line 94) | def to_grayscale(self, img: Any) -> Any: method gaussian_blur (line 107) | def gaussian_blur(self, img: Any, sigma: float) -> Any: method absolute_difference (line 121) | def absolute_difference(self, img1: Any, img2: Any) -> Any: method threshold (line 135) | def threshold(self, img: Any, threshold_value: int) -> Tuple[float, Any]: method apply_red_overlay (line 151) | def apply_red_overlay(self, img: Any, mask: Any) -> bytes: method close (line 165) | def close(self, img: Any) -> None: method find_template (line 175) | def find_template( method save_template (line 197) | def save_template( method draw_bounding_box (line 217) | def draw_bounding_box( FILE: changedetectionio/processors/image_ssim_diff/image_handler/isolated_libvips.py function _worker_generate_diff (line 21) | def _worker_generate_diff(conn, img_bytes_from, img_bytes_to, threshold,... function generate_diff_isolated (line 78) | def generate_diff_isolated(img_bytes_from, img_bytes_to, threshold, blur... function calculate_change_percentage_isolated (line 132) | def calculate_change_percentage_isolated(img_bytes_from, img_bytes_to, t... function compare_images_isolated (line 217) | def compare_images_isolated(img_bytes_from, img_bytes_to, threshold, blu... FILE: changedetectionio/processors/image_ssim_diff/image_handler/isolated_opencv.py function _worker_compare (line 16) | def _worker_compare(conn, img_bytes_from, img_bytes_to, pixel_difference... function compare_images_isolated (line 109) | async def compare_images_isolated(img_bytes_from, img_bytes_to, pixel_di... function _worker_generate_diff (line 200) | def _worker_generate_diff(conn, img_bytes_from, img_bytes_to, pixel_diff... function generate_diff_isolated (line 273) | async def generate_diff_isolated(img_bytes_from, img_bytes_to, pixel_dif... function _worker_draw_bounding_box (line 355) | def _worker_draw_bounding_box(conn, img_bytes, x, y, width, height, colo... function draw_bounding_box_isolated (line 393) | async def draw_bounding_box_isolated(img_bytes, x, y, width, height, col... function _worker_calculate_percentage (line 486) | def _worker_calculate_percentage(conn, img_bytes_from, img_bytes_to, pix... function calculate_change_percentage_isolated (line 548) | async def calculate_change_percentage_isolated(img_bytes_from, img_bytes... FILE: changedetectionio/processors/image_ssim_diff/image_handler/libvips_handler.py class LibvipsImageDiffHandler (line 26) | class LibvipsImageDiffHandler(ImageDiffHandler): method __init__ (line 37) | def __init__(self): method load_from_bytes (line 41) | def load_from_bytes(self, img_bytes: bytes) -> pyvips.Image: method save_to_bytes (line 45) | def save_to_bytes(self, img: pyvips.Image, format: str = 'png', qualit... method crop (line 88) | def crop(self, img: pyvips.Image, left: int, top: int, right: int, bot... method resize (line 94) | def resize(self, img: pyvips.Image, max_width: int, max_height: int) -... method get_dimensions (line 118) | def get_dimensions(self, img: pyvips.Image) -> Tuple[int, int]: method to_grayscale (line 122) | def to_grayscale(self, img: pyvips.Image) -> pyvips.Image: method gaussian_blur (line 126) | def gaussian_blur(self, img: pyvips.Image, sigma: float) -> pyvips.Image: method absolute_difference (line 132) | def absolute_difference(self, img1: pyvips.Image, img2: pyvips.Image) ... method threshold (line 140) | def threshold(self, img: pyvips.Image, threshold_value: int) -> Tuple[... method apply_red_overlay (line 157) | def apply_red_overlay(self, img: pyvips.Image, mask: pyvips.Image) -> ... method close (line 213) | def close(self, img: pyvips.Image) -> None: method find_template (line 221) | def find_template( method save_template (line 310) | def save_template( FILE: changedetectionio/processors/image_ssim_diff/preview.py function get_asset (line 11) | def get_asset(asset_name, watch, datastore, request): function render (line 72) | def render(watch, datastore, request, url_for, render_template, flash, r... FILE: changedetectionio/processors/image_ssim_diff/processor.py function _ (line 20) | def _(x): return x class perform_site_check (line 27) | class perform_site_check(difference_detection_processor): method run_changedetection (line 33) | def run_changedetection(self, watch, force_reprocess=False): FILE: changedetectionio/processors/magic.py class guess_stream_type (line 49) | class guess_stream_type(): method __init__ (line 59) | def __init__(self, http_content_header, content): FILE: changedetectionio/processors/restock_diff/__init__.py class Restock (line 14) | class Restock(dict): method parse_currency (line 16) | def parse_currency(self, raw_value: str) -> Union[float, None]: method __init__ (line 39) | def __init__(self, *args, **kwargs): method __setitem__ (line 58) | def __setitem__(self, key, value): class Watch (line 66) | class Watch(BaseWatch): method __init__ (line 67) | def __init__(self, *arg, **kw): method clear_watch (line 72) | def clear_watch(self): method extra_notification_token_values (line 76) | def extra_notification_token_values(self): method extra_notification_token_placeholder_info (line 81) | def extra_notification_token_placeholder_info(self): FILE: changedetectionio/processors/restock_diff/forms.py class RestockSettingsForm (line 14) | class RestockSettingsForm(Form): class processor_settings_form (line 33) | class processor_settings_form(processor_text_json_diff_form): method extra_tab_content (line 36) | def extra_tab_content(self): method extra_form_content (line 39) | def extra_form_content(self): FILE: changedetectionio/processors/restock_diff/processor.py function _ (line 13) | def _(x): return x # Translation marker for extraction only class UnableToExtractRestockData (line 20) | class UnableToExtractRestockData(Exception): method __init__ (line 21) | def __init__(self, status_code): class MoreThanOnePriceFound (line 26) | class MoreThanOnePriceFound(Exception): method __init__ (line 27) | def __init__(self): function _search_prop_by_value (line 30) | def _search_prop_by_value(matches, value): function _deduplicate_prices (line 36) | def _deduplicate_prices(data): function _extract_itemprop_availability_worker (line 131) | def _extract_itemprop_availability_worker(pipe_conn): function extract_itemprop_availability_safe (line 203) | def extract_itemprop_availability_safe(html_content) -> Restock: function get_itemprop_availability (line 315) | def get_itemprop_availability(html_content) -> Restock: function is_between (line 388) | def is_between(number, lower=None, upper=None): class perform_site_check (line 403) | class perform_site_check(difference_detection_processor): method run_changedetection (line 407) | def run_changedetection(self, watch, force_reprocess=False): FILE: changedetectionio/processors/restock_diff/pure_python_extractor.py class JSONLDExtractor (line 21) | class JSONLDExtractor(HTMLParser): method __init__ (line 29) | def __init__(self): method handle_starttag (line 35) | def handle_starttag(self, tag, attrs): method handle_data (line 44) | def handle_data(self, data): method handle_endtag (line 48) | def handle_endtag(self, tag): class OpenGraphExtractor (line 68) | class OpenGraphExtractor(HTMLParser): method __init__ (line 75) | def __init__(self): method handle_starttag (line 79) | def handle_starttag(self, tag, attrs): class MicrodataExtractor (line 91) | class MicrodataExtractor(HTMLParser): method __init__ (line 100) | def __init__(self): method handle_starttag (line 105) | def handle_starttag(self, tag, attrs): method handle_data (line 133) | def handle_data(self, data): method handle_endtag (line 152) | def handle_endtag(self, tag): function extract_metadata_pure_python (line 157) | def extract_metadata_pure_python(html_content): function query_price_availability (line 210) | def query_price_availability(extracted_data): FILE: changedetectionio/processors/text_json_diff/__init__.py function _task (line 12) | def _task(watch, update_handler): function prepare_filter_prevew (line 38) | def prepare_filter_prevew(datastore, watch_uuid, form_data): FILE: changedetectionio/processors/text_json_diff/difference.py function build_diff_cell_visualizer (line 23) | def build_diff_cell_visualizer(content, resolution=100): function render (line 102) | def render(watch, datastore, request, url_for, render_template, flash, r... FILE: changedetectionio/processors/text_json_diff/processor.py function _ (line 22) | def _(x): return x class FilterNotFoundInResponse (line 34) | class FilterNotFoundInResponse(ValueError): method __init__ (line 35) | def __init__(self, msg, screenshot=None, xpath_data=None): class PDFToHTMLToolNotFound (line 41) | class PDFToHTMLToolNotFound(ValueError): method __init__ (line 42) | def __init__(self, msg): class FilterConfig (line 46) | class FilterConfig: method __init__ (line 49) | def __init__(self, watch, datastore): method _get_merged_rules (line 57) | def _get_merged_rules(self, attr, include_global=False): method include_filters (line 70) | def include_filters(self): method subtractive_selectors (line 80) | def subtractive_selectors(self): method extract_text (line 89) | def extract_text(self): method ignore_text (line 93) | def ignore_text(self): method trigger_text (line 97) | def trigger_text(self): method text_should_not_be_present (line 101) | def text_should_not_be_present(self): method has_include_filters (line 105) | def has_include_filters(self): method has_include_json_filters (line 109) | def has_include_json_filters(self): method has_subtractive_selectors (line 113) | def has_subtractive_selectors(self): class ContentTransformer (line 117) | class ContentTransformer: method trim_whitespace (line 121) | def trim_whitespace(text): method remove_duplicate_lines (line 127) | def remove_duplicate_lines(text): method sort_alphabetically (line 132) | def sort_alphabetically(text): method extract_by_regex (line 139) | def extract_by_regex(text, regex_patterns): class RuleEngine (line 169) | class RuleEngine: method evaluate_trigger_text (line 173) | def evaluate_trigger_text(content, trigger_patterns): method evaluate_text_should_not_be_present (line 192) | def evaluate_text_should_not_be_present(content, patterns): method evaluate_conditions (line 209) | def evaluate_conditions(watch, datastore, content): class ContentProcessor (line 227) | class ContentProcessor: method __init__ (line 230) | def __init__(self, fetcher, watch, filter_config, datastore): method preprocess_rss (line 236) | def preprocess_rss(self, content): method preprocess_pdf (line 253) | def preprocess_pdf(self, raw_content): method preprocess_json (line 281) | def preprocess_json(self, raw_content): method apply_include_filters (line 295) | def apply_include_filters(self, content, stream_content_type): method apply_subtractive_selectors (line 343) | def apply_subtractive_selectors(self, content): method extract_text_from_html (line 347) | def extract_text_from_html(self, html_content, stream_content_type): class ChecksumCalculator (line 358) | class ChecksumCalculator: method calculate (line 362) | def calculate(text, ignore_whitespace=False): class perform_site_check (line 371) | class perform_site_check(difference_detection_processor): method run_changedetection (line 373) | def run_changedetection(self, watch, force_reprocess=False): method _apply_diff_filtering (line 597) | def _apply_diff_filtering(self, watch, stripped_text, text_before_filt... FILE: changedetectionio/queue_handlers.py class RecheckPriorityQueue (line 15) | class RecheckPriorityQueue: method __init__ (line 41) | def __init__(self, maxsize: int = 0): method put (line 65) | def put(self, item, block: bool = True, timeout: Optional[float] = None): method get (line 102) | def get(self, block: bool = True, timeout: Optional[float] = None): method async_put (line 137) | async def async_put(self, item, executor=None): method async_get (line 161) | async def async_get(self, executor=None, timeout=1.0): method qsize (line 205) | def qsize(self) -> int: method empty (line 214) | def empty(self) -> bool: method get_queued_uuids (line 218) | def get_queued_uuids(self) -> list: method clear (line 227) | def clear(self): method close (line 252) | def close(self): method queue (line 262) | def queue(self): method get_uuid_position (line 271) | def get_uuid_position(self, target_uuid: str) -> Dict[str, Any]: method get_all_queued_uuids (line 301) | def get_all_queued_uuids(self, limit: Optional[int] = None, offset: in... method get_queue_summary (line 336) | def get_queue_summary(self) -> Dict[str, Any]: method _get_item_uuid (line 379) | def _get_item_uuid(self, item) -> str: method _emit_put_signals (line 388) | def _emit_put_signals(self, item): method _emit_get_signals (line 404) | def _emit_get_signals(self): class NotificationQueue (line 413) | class NotificationQueue: method __init__ (line 427) | def __init__(self, maxsize: int = 0, datastore=None): method set_datastore (line 439) | def set_datastore(self, datastore): method put (line 443) | def put(self, item: Dict[str, Any], block: bool = True, timeout: Optio... method async_put (line 461) | async def async_put(self, item: Dict[str, Any], executor=None): method get (line 484) | def get(self, block: bool = True, timeout: Optional[float] = None): method async_get (line 499) | async def async_get(self, executor=None): method qsize (line 519) | def qsize(self) -> int: method empty (line 528) | def empty(self) -> bool: method close (line 532) | def close(self): method _emit_notification_signal (line 540) | def _emit_notification_signal(self, item: Dict[str, Any]): FILE: changedetectionio/queuedWatchMetaData.py class PrioritizedItem (line 8) | class PrioritizedItem: FILE: changedetectionio/realtime/events.py function register_watch_operation_handlers (line 6) | def register_watch_operation_handlers(socketio, datastore): FILE: changedetectionio/realtime/socket_server.py class SignalHandler (line 14) | class SignalHandler: method __init__ (line 17) | def __init__(self, socketio_instance, datastore): method handle_watch_small_status_update (line 46) | def handle_watch_small_status_update(self, *args, **kwargs): method handle_signal (line 62) | def handle_signal(self, *args, **kwargs): method handle_watch_bumped_favicon_signal (line 85) | def handle_watch_bumped_favicon_signal(self, *args, **kwargs): method handle_deleted_signal (line 95) | def handle_deleted_signal(self, *args, **kwargs): method handle_queue_length (line 105) | def handle_queue_length(self, *args, **kwargs): method handle_notification_event (line 120) | def handle_notification_event(self, *args, **kwargs): function handle_watch_update (line 139) | def handle_watch_update(socketio, **kwargs): function _suppress_werkzeug_ws_abrupt_disconnect_noise (line 202) | def _suppress_werkzeug_ws_abrupt_disconnect_noise(): function init_socketio (line 223) | def init_socketio(app, datastore): FILE: changedetectionio/rss_tools.py function cdata_in_document_to_text (line 9) | def cdata_in_document_to_text(html_content: str, render_anchor_tag_conte... function format_rss_items (line 150) | def format_rss_items(rss_content: str, render_anchor_tag_content=False) ... FILE: changedetectionio/static/js/browser-steps.js function reset (line 37) | function reset() { function set_scale (line 58) | function set_scale() { function process_selected (line 188) | function process_selected(selected_in_xpath_list) { function draw_circle_on_canvas (line 231) | function draw_circle_on_canvas(x, y) { function executeBrowserStep (line 239) | function executeBrowserStep(url, data = {}) { function start (line 281) | function start() { function disable_browsersteps_ui (line 315) | function disable_browsersteps_ui() { function set_greyed_state (line 355) | function set_greyed_state() { FILE: changedetectionio/static/js/comparison-slider.js function initComparisonSlider (line 10) | function initComparisonSlider() { FILE: changedetectionio/static/js/conditions.js function setupButtonHandlers (line 3) | function setupButtonHandlers() { function reindexRules (line 126) | function reindexRules() { FILE: changedetectionio/static/js/diff-overview.js function setupDiffNavigation (line 1) | function setupDiffNavigation() { function toggle (line 97) | function toggle(hash_name) { function clean (line 154) | function clean(event) { function dragTextHandler (line 165) | function dragTextHandler(event) { FILE: changedetectionio/static/js/diff-render.js function updateVisualizerPosition (line 71) | function updateVisualizerPosition() { function handleResize (line 101) | function handleResize() { function changed (line 147) | function changed() { FILE: changedetectionio/static/js/flask-toast-bridge.js function getMessageCategory (line 61) | function getMessageCategory(messageEl) { function mapCategoryToToastType (line 88) | function mapCategoryToToastType(category) { FILE: changedetectionio/static/js/hamburger-menu.js function openMenu (line 14) | function openMenu() { function closeMenu (line 21) | function closeMenu() { function toggleMenu (line 28) | function toggleMenu() { FILE: changedetectionio/static/js/plugins.js function complete (line 20) | function complete() { function escapeHtml (line 73) | function escapeHtml(text) { function toggleOpacity (line 166) | function toggleOpacity(checkboxSelector, fieldSelector, inverted) { function toggleVisibility (line 182) | function toggleVisibility(checkboxSelector, fieldSelector, inverted) { FILE: changedetectionio/static/js/preview.js function redirectToVersion (line 1) | function redirectToVersion(version) { function setupDateWidget (line 14) | function setupDateWidget() { FILE: changedetectionio/static/js/realtime.js function reapplyTableStripes (line 5) | function reapplyTableStripes() { function bindSocketHandlerButtonsEvents (line 12) | function bindSocketHandlerButtonsEvents(socket) { FILE: changedetectionio/static/js/recheck-proxy.js function setup_html_widget (line 5) | function setup_html_widget() { function set_proxy_check_status (line 13) | function set_proxy_check_status(proxy_key, state) { function pollServer (line 31) | function pollServer() { FILE: changedetectionio/static/js/scheduler.js function getTimeInTimezone (line 1) | function getTimeInTimezone(timezone) { FILE: changedetectionio/static/js/search-modal.js function openSearchModal (line 17) | function openSearchModal() { function closeSearchModal (line 28) | function closeSearchModal() { FILE: changedetectionio/static/js/snippet-to-image.js constant IMAGE_PADDING (line 7) | const IMAGE_PADDING = 5; constant JPEG_QUALITY (line 8) | const JPEG_QUALITY = 0.95; constant CANVAS_SCALE (line 9) | const CANVAS_SCALE = 1; constant RENDER_DELAY_MS (line 10) | const RENDER_DELAY_MS = 50; function getTargetUrl (line 15) | function getTargetUrl() { function getFormattedDate (line 22) | function getFormattedDate() { function getVersionInfo (line 37) | function getVersionInfo() { function findTextNodeWithNewline (line 56) | function findTextNodeWithNewline(node, searchBackwards = false) { function findLineBoundary (line 80) | function findLineBoundary(node, container, searchBackwards = false) { function getLastTextNode (line 104) | function getLastTextNode(container) { function expandRangeToFullLines (line 118) | function expandRangeToFullLines(range, container) { function createCaptureElement (line 163) | function createCaptureElement(selectedFragment, originalElement) { function countLines (line 233) | function countLines(content) { function createFooter (line 251) | function createFooter(selectedLines, totalLines) { function addExifMetadata (line 282) | function addExifMetadata(jpegDataUrl) { function dataURLtoBlob (line 314) | function dataURLtoBlob(dataURL) { function downloadImage (line 329) | function downloadImage(jpegDataUrl) { function copyImageToClipboard (line 339) | async function copyImageToClipboard(jpegDataUrl) { function shareImage (line 355) | async function shareImage(platform, jpegDataUrl) { function displayImage (line 411) | function displayImage(jpegDataUrl) { function setButtonState (line 614) | function setButtonState(button, isLoading, originalHtml = '') { function diffToJpeg (line 638) | async function diffToJpeg() { FILE: changedetectionio/static/js/tabs.js function set_active_tab (line 24) | function set_active_tab() { function focus_error_tab (line 32) | function focus_error_tab() { FILE: changedetectionio/static/js/toast.js function init (line 37) | function init(userConfig = {}) { function createContainer (line 45) | function createContainer() { function show (line 57) | function show(message, options = {}) { function createToastElement (line 89) | function createToastElement(message, options) { function createIcon (line 131) | function createIcon(type) { function setupAutoDismiss (line 174) | function setupAutoDismiss(toast, duration) { function removeToast (line 219) | function removeToast(toast) { function success (line 233) | function success(message, options = {}) { function error (line 237) | function error(message, options = {}) { function warning (line 241) | function warning(message, options = {}) { function info (line 245) | function info(message, options = {}) { function clear (line 252) | function clear() { FILE: changedetectionio/static/js/vis.js function show_related_elem (line 5) | function show_related_elem(e) { FILE: changedetectionio/static/js/visual-selector.js function clearReset (line 49) | function clearReset() { function splitToList (line 65) | function splitToList(v) { function sortScrapedElementsBySize (line 69) | function sortScrapedElementsBySize() { function bootstrapVisualSelector (line 105) | function bootstrapVisualSelector() { function alertIfFilterNotFound (line 126) | function alertIfFilterNotFound() { function fetchData (line 138) | function fetchData() { function updateFiltersText (line 164) | function updateFiltersText() { function setScale (line 175) | function setScale() { function reflowSelector (line 197) | function reflowSelector() { function highlightCurrentSelected (line 270) | function highlightCurrentSelected() { function initializeDrawMode (line 284) | function initializeDrawMode() { function enableDrawMode (line 345) | function enableDrawMode() { function disableDrawMode (line 377) | function disableDrawMode() { function handleDrawMouseDown (line 423) | function handleDrawMouseDown(e) { function handleDrawMouseMove (line 455) | function handleDrawMouseMove(e) { function handleDrawMouseUp (line 494) | function handleDrawMouseUp(e) { function drawBox (line 528) | function drawBox() { function drawResizeHandles (line 554) | function drawResizeHandles(x, y, w, h) { function isInsideBox (line 572) | function isInsideBox(x, y) { function getResizeHandle (line 583) | function getResizeHandle(x, y) { function getHandleCursor (line 607) | function getHandleCursor(handle) { function resizeBox (line 617) | function resizeBox(x, y) { FILE: changedetectionio/static/js/watch-overview.js function normalizeUrl (line 2) | function normalizeUrl(el) { FILE: changedetectionio/static/js/watch-settings.js function request_textpreview_update (line 2) | function request_textpreview_update() { FILE: changedetectionio/store/__init__.py class ChangeDetectionStore (line 50) | class ChangeDetectionStore(DatastoreUpdatesMixin, FileSavingDataStore): method __init__ (line 53) | def __init__(self, datastore_path="/datastore", include_default_watche... method save_version_copy_json_db (line 64) | def save_version_copy_json_db(self, version_tag): method _load_settings (line 82) | def _load_settings(self, filename="changedetection.json"): method _apply_settings (line 102) | def _apply_settings(self, settings_data): method _rehydrate_tags (line 136) | def _rehydrate_tags(self): method _rehydrate_watches (line 151) | def _rehydrate_watches(self): method _load_state (line 169) | def _load_state(self, main_settings_filename="changedetection.json"): method reload_state (line 190) | def reload_state(self, datastore_path, include_default_watches, versio... method init_fresh_install (line 248) | def init_fresh_install(self, include_default_watches, version_tag): method rehydrate_entity (line 321) | def rehydrate_entity(self, uuid, entity, processor_override=None): method _watch_exists (line 341) | def _watch_exists(self, uuid): method _get_watch_dict (line 345) | def _get_watch_dict(self, uuid): method _build_settings_data (line 349) | def _build_settings_data(self): method _save_settings (line 376) | def _save_settings(self): method _load_watches (line 391) | def _load_watches(self): method _load_tags (line 408) | def _load_tags(self): method _delete_watch (line 439) | def _delete_watch(self, uuid): method set_last_viewed (line 458) | def set_last_viewed(self, uuid, timestamp): method remove_password (line 467) | def remove_password(self): method clear_all_last_checksums (line 471) | def clear_all_last_checksums(self): method clear_checksums_for_tag (line 499) | def clear_checksums_for_tag(self, tag_uuid): method commit (line 528) | def commit(self): method update_watch (line 543) | def update_watch(self, uuid, update_obj): method threshold_seconds (line 564) | def threshold_seconds(self): method unread_changes_count (line 573) | def unread_changes_count(self): method data (line 582) | def data(self): method delete (line 600) | def delete(self, uuid): method clone (line 649) | def clone(self, uuid): method url_exists (line 660) | def url_exists(self, url): method clear_watch_history (line 670) | def clear_watch_history(self, uuid): method add_watch (line 674) | def add_watch(self, url, tag='', extras=None, tag_uuids=None, save_imm... method _watch_resource_exists (line 796) | def _watch_resource_exists(self, watch_uuid, resource_name): method visualselector_data_is_ready (line 812) | def visualselector_data_is_ready(self, watch_uuid): method proxy_list (line 826) | def proxy_list(self): method get_preferred_proxy_for_watch (line 855) | def get_preferred_proxy_for_watch(self, uuid): method has_extra_headers_file (line 889) | def has_extra_headers_file(self): method get_all_base_headers (line 893) | def get_all_base_headers(self): method get_all_headers_in_textfile_for_watch (line 900) | def get_all_headers_in_textfile_for_watch(self, uuid): method get_tag_overrides_for_watch (line 936) | def get_tag_overrides_for_watch(self, uuid, attr): method add_tag (line 947) | def add_tag(self, title): method get_all_tags_for_watch (line 980) | def get_all_tags_for_watch(self, uuid): method extra_browsers (line 991) | def extra_browsers(self): method tag_exists_by_name (line 1002) | def tag_exists_by_name(self, tag_name): method any_watches_have_processor_by_name (line 1008) | def any_watches_have_processor_by_name(self, processor_name): method search_watches_for_url (line 1014) | def search_watches_for_url(self, query, tag_limit=None, partial=False): method get_unique_notification_tokens_available (line 1049) | def get_unique_notification_tokens_available(self): method get_unique_notification_token_placeholders_available (line 1062) | def get_unique_notification_token_placeholders_available(self): method add_notification_url (line 1075) | def add_notification_url(self, notification_url): FILE: changedetectionio/store/base.py class DataStore (line 12) | class DataStore(ABC): method reload_state (line 27) | def reload_state(self, datastore_path, include_default_watches, versio... method add_watch (line 39) | def add_watch(self, url, **kwargs): method update_watch (line 53) | def update_watch(self, uuid, update_obj): method delete (line 64) | def delete(self, uuid): method data (line 75) | def data(self): FILE: changedetectionio/store/file_saving_datastore.py function save_json_atomic (line 36) | def save_json_atomic(file_path, data_dict, label="file", max_size_mb=10): function save_entity_atomic (line 178) | def save_entity_atomic(entity_dir, uuid, entity_dict, filename, entity_t... function save_watch_atomic (line 200) | def save_watch_atomic(watch_dir, uuid, watch_dict): function load_watch_from_file (line 211) | def load_watch_from_file(watch_json, uuid, rehydrate_entity_func): function load_all_watches (line 273) | def load_all_watches(datastore_path, rehydrate_entity_func): function load_tag_from_file (line 335) | def load_tag_from_file(tag_json, uuid, rehydrate_entity_func): function load_all_tags (line 399) | def load_all_tags(datastore_path, rehydrate_entity_func): class FileSavingDataStore (line 455) | class FileSavingDataStore(DataStore): method __init__ (line 469) | def __init__(self): method _save_settings (line 472) | def _save_settings(self): method _load_watches (line 484) | def _load_watches(self): method _delete_watch (line 495) | def _delete_watch(self, uuid): FILE: changedetectionio/store/updates.py function create_backup_tarball (line 32) | def create_backup_tarball(datastore_path, update_number): class DatastoreUpdatesMixin (line 120) | class DatastoreUpdatesMixin: method get_updates_available (line 128) | def get_updates_available(self): method run_updates (line 145) | def run_updates(self, current_schema_version=None): method update_1 (line 245) | def update_1(self): method update_2 (line 258) | def update_2(self): method update_3 (line 285) | def update_3(self): method update_4 (line 290) | def update_4(self): method update_5 (line 300) | def update_5(self): method update_7 (line 322) | def update_7(self): method update_8 (line 332) | def update_8(self): method update_9 (line 343) | def update_9(self): method update_10 (line 382) | def update_10(self): method update_12 (line 392) | def update_12(self): method update_13 (line 405) | def update_13(self): method update_14 (line 414) | def update_14(self): method update_15 (line 424) | def update_15(self): method update_16 (line 436) | def update_16(self): method update_17 (line 442) | def update_17(self): method update_18 (line 449) | def update_18(self): method update_19 (line 463) | def update_19(self): method update_20 (line 478) | def update_20(self): method update_21 (line 496) | def update_21(self): method update_23 (line 502) | def update_23(self): method update_24 (line 536) | def update_24(self): method update_25 (line 548) | def update_25(self): method migrate_legacy_db_format (line 560) | def migrate_legacy_db_format(self): method update_26 (line 669) | def update_26(self): method update_29 (line 673) | def update_29(self): method update_30 (line 733) | def update_30(self): FILE: changedetectionio/strtobool.py function strtobool (line 19) | def strtobool(value): FILE: changedetectionio/tests/apprise/test_apprise_asset.py function apprise_asset (line 13) | def apprise_asset() -> AppriseAsset: function test_apprise_asset_init (line 19) | def test_apprise_asset_init(apprise_asset: AppriseAsset): FILE: changedetectionio/tests/apprise/test_apprise_custom_api_call.py function test_get_auth (line 26) | def test_get_auth(url, expected_auth): function test_get_headers (line 45) | def test_get_headers(url, body, expected_content_type): function test_get_params (line 66) | def test_get_params(url, expected_params): function test_apprise_custom_api_call_success (line 82) | def test_apprise_custom_api_call_success(mock_request, url, schema, meth... function test_apprise_custom_api_call_with_auth (line 100) | def test_apprise_custom_api_call_with_auth(mock_request): function test_apprise_custom_api_call_failure (line 129) | def test_apprise_custom_api_call_failure(mock_request, exception_type, e... function test_invalid_url_parsing (line 144) | def test_invalid_url_parsing(): function test_http_methods (line 162) | def test_http_methods(mock_request, schema, expected_method): function test_https_method_conversion (line 190) | def test_https_method_conversion( FILE: changedetectionio/tests/conftest.py function reportlog (line 35) | def reportlog(pytestconfig): function per_test_log_file (line 43) | def per_test_log_file(request): function pytest_runtest_makereport (line 120) | def pytest_runtest_makereport(item, call): function environment (line 130) | def environment(mocker): function format_memory_human (line 140) | def format_memory_human(bytes_value): function track_memory (line 151) | def track_memory(memory_usage, ): function measure_memory_usage (line 160) | def measure_memory_usage(request): function cleanup (line 183) | def cleanup(datastore_path): function pytest_configure (line 195) | def pytest_configure(config): function pytest_addoption (line 223) | def pytest_addoption(parser): function datastore_path (line 237) | def datastore_path(tmp_path_factory, request): function prepare_test_function (line 266) | def prepare_test_function(live_server, datastore_path): function set_test_name (line 395) | def set_test_name(request): function app (line 404) | def app(request, datastore_path): FILE: changedetectionio/tests/custom_browser_url/test_custom_browser_url.py function do_test (line 7) | def do_test(client, live_server, make_test_use_extra_browser=False): function test_request_via_custom_browser_url (line 76) | def test_request_via_custom_browser_url(client, live_server, measure_mem... function test_request_not_via_custom_browser_url (line 82) | def test_request_not_via_custom_browser_url(client, live_server, measure... FILE: changedetectionio/tests/fetchers/test_content.py function test_fetch_webdriver_content (line 11) | def test_fetch_webdriver_content(client, live_server, measure_memory_usa... FILE: changedetectionio/tests/fetchers/test_custom_js_before_content.py function test_execute_custom_js (line 6) | def test_execute_custom_js(client, live_server, measure_memory_usage, da... FILE: changedetectionio/tests/plugins/test_processor.py function test_check_plugin_processor (line 8) | def test_check_plugin_processor(client, live_server, measure_memory_usag... FILE: changedetectionio/tests/proxy_list/test_multiple_proxy.py function test_preferred_proxy (line 8) | def test_preferred_proxy(client, live_server, measure_memory_usage, data... FILE: changedetectionio/tests/proxy_list/test_noproxy.py function test_noproxy_option (line 8) | def test_noproxy_option(client, live_server, measure_memory_usage, datas... FILE: changedetectionio/tests/proxy_list/test_proxy.py function test_check_basic_change_detection_functionality (line 8) | def test_check_basic_change_detection_functionality(client, live_server,... FILE: changedetectionio/tests/proxy_list/test_proxy_noconnect.py function test_proxy_noconnect_custom (line 15) | def test_proxy_noconnect_custom(client, live_server, measure_memory_usag... FILE: changedetectionio/tests/proxy_list/test_select_custom_proxy.py function test_select_custom (line 9) | def test_select_custom(client, live_server, measure_memory_usage, datast... function test_custom_proxy_validation (line 53) | def test_custom_proxy_validation(client, live_server, measure_memory_usa... FILE: changedetectionio/tests/proxy_socks5/test_socks5_proxy.py function set_response (line 8) | def set_response(datastore_path): function test_socks5 (line 22) | def test_socks5(client, live_server, measure_memory_usage, datastore_path): FILE: changedetectionio/tests/proxy_socks5/test_socks5_proxy_sources.py function set_response (line 7) | def set_response(datastore_path): function test_socks5_from_proxiesjson_file (line 23) | def test_socks5_from_proxiesjson_file(client, live_server, measure_memor... FILE: changedetectionio/tests/restock/test_restock.py function set_original_response (line 14) | def set_original_response(datastore_path): function set_back_in_stock_response (line 35) | def set_back_in_stock_response(datastore_path): function test_restock_detection (line 53) | def test_restock_detection(client, live_server, measure_memory_usage, da... FILE: changedetectionio/tests/smtp/smtp-test-server.py class CustomSMTPHandler (line 16) | class CustomSMTPHandler: method handle_DATA (line 17) | async def handle_DATA(self, server, session, envelope): function echo_last_message (line 75) | def echo_last_message(): function run_flask (line 93) | def run_flask(): FILE: changedetectionio/tests/smtp/test_notification_smtp.py function get_last_message_from_smtp_server (line 30) | def get_last_message_from_smtp_server(): function test_check_notification_email_formats_default_HTML (line 44) | def test_check_notification_email_formats_default_HTML(client, live_serv... function test_check_notification_plaintext_format (line 115) | def test_check_notification_plaintext_format(client, live_server, measur... function test_check_notification_html_color_format (line 177) | def test_check_notification_html_color_format(client, live_server, measu... function test_check_notification_markdown_format (line 262) | def test_check_notification_markdown_format(client, live_server, measure... function test_check_notification_email_formats_default_Text_override_HTML (line 344) | def test_check_notification_email_formats_default_Text_override_HTML(cli... function test_check_plaintext_document_plaintext_notification_smtp (line 465) | def test_check_plaintext_document_plaintext_notification_smtp(client, li... function test_check_plaintext_document_html_notifications (line 518) | def test_check_plaintext_document_html_notifications(client, live_server... function test_check_plaintext_document_html_color_notifications (line 598) | def test_check_plaintext_document_html_color_notifications(client, live_... function test_check_html_document_plaintext_notification (line 671) | def test_check_html_document_plaintext_notification(client, live_server,... function test_check_html_notification_with_apprise_format_is_html (line 728) | def test_check_html_notification_with_apprise_format_is_html(client, liv... FILE: changedetectionio/tests/test_access_control.py function test_check_access_control (line 5) | def test_check_access_control(app, client, live_server, measure_memory_u... FILE: changedetectionio/tests/test_add_replace_remove_filter.py function set_original (line 13) | def set_original(datastore_path, excluding=None, add_line=None): function test_check_removed_line_contains_trigger (line 45) | def test_check_removed_line_contains_trigger(client, live_server, measur... function test_check_add_line_contains_trigger (line 114) | def test_check_add_line_contains_trigger(client, live_server, measure_me... FILE: changedetectionio/tests/test_api.py function set_original_response (line 12) | def set_original_response(datastore_path): function set_modified_response (line 30) | def set_modified_response(datastore_path): function is_valid_uuid (line 48) | def is_valid_uuid(val): function test_api_simple (line 60) | def test_api_simple(client, live_server, measure_memory_usage, datastore... function test_roundtrip_API (line 339) | def test_roundtrip_API(client, live_server, measure_memory_usage, datast... function test_access_denied (line 401) | def test_access_denied(client, live_server, measure_memory_usage, datast... function test_api_watch_PUT_update (line 446) | def test_api_watch_PUT_update(client, live_server, measure_memory_usage,... function test_api_import (line 562) | def test_api_import(client, live_server, measure_memory_usage, datastore... function test_api_import_small_synchronous (line 707) | def test_api_import_small_synchronous(client, live_server, measure_memor... function test_api_import_large_background (line 741) | def test_api_import_large_background(client, live_server, measure_memory... function test_api_restock_processor_config (line 818) | def test_api_restock_processor_config(client, live_server, measure_memor... function test_api_conflict_UI_password (line 900) | def test_api_conflict_UI_password(client, live_server, measure_memory_us... function test_api_url_validation (line 944) | def test_api_url_validation(client, live_server, measure_memory_usage, d... function test_api_time_between_check_validation (line 1117) | def test_api_time_between_check_validation(client, live_server, measure_... FILE: changedetectionio/tests/test_api_notification_urls_validation.py function test_watch_notification_urls_validation (line 25) | def test_watch_notification_urls_validation(client, live_server, measure... function test_tag_notification_urls_validation (line 121) | def test_tag_notification_urls_validation(client, live_server, measure_m... FILE: changedetectionio/tests/test_api_notifications.py function test_api_notifications_crud (line 7) | def test_api_notifications_crud(client, live_server, measure_memory_usag... FILE: changedetectionio/tests/test_api_openapi.py function test_openapi_merged_spec_contains_restock_fields (line 15) | def test_openapi_merged_spec_contains_restock_fields(): function test_openapi_validation_invalid_content_type_on_create_watch (line 59) | def test_openapi_validation_invalid_content_type_on_create_watch(client,... function test_openapi_validation_missing_required_field_create_watch (line 77) | def test_openapi_validation_missing_required_field_create_watch(client, ... function test_openapi_validation_invalid_field_in_request_body (line 95) | def test_openapi_validation_invalid_field_in_request_body(client, live_s... function test_openapi_validation_import_wrong_content_type (line 135) | def test_openapi_validation_import_wrong_content_type(client, live_serve... function test_openapi_validation_import_correct_content_type_succeeds (line 153) | def test_openapi_validation_import_correct_content_type_succeeds(client,... function test_openapi_validation_get_requests_bypass_validation (line 171) | def test_openapi_validation_get_requests_bypass_validation(client, live_... function test_openapi_validation_create_tag_missing_required_title (line 196) | def test_openapi_validation_create_tag_missing_required_title(client, li... function test_openapi_validation_watch_update_allows_partial_updates (line 214) | def test_openapi_validation_watch_update_allows_partial_updates(client, ... FILE: changedetectionio/tests/test_api_search.py function test_api_search (line 9) | def test_api_search(client, live_server, measure_memory_usage, datastore... FILE: changedetectionio/tests/test_api_security.py function set_original_response (line 16) | def set_original_response(datastore_path): function is_valid_uuid (line 29) | def is_valid_uuid(val): function test_api_path_traversal_in_uuids (line 41) | def test_api_path_traversal_in_uuids(client, live_server, measure_memory... function test_api_injection_via_headers_and_proxy (line 107) | def test_api_injection_via_headers_and_proxy(client, live_server, measur... function test_api_large_payload_dos (line 179) | def test_api_large_payload_dos(client, live_server, measure_memory_usage... function test_api_utf8_encoding_edge_cases (line 250) | def test_api_utf8_encoding_edge_cases(client, live_server, measure_memor... function test_api_concurrency_race_conditions (line 324) | def test_api_concurrency_race_conditions(client, live_server, measure_me... function test_api_time_validation_edge_cases (line 403) | def test_api_time_validation_edge_cases(client, live_server, measure_mem... function test_api_browser_steps_validation (line 480) | def test_api_browser_steps_validation(client, live_server, measure_memor... function test_api_queue_manipulation (line 553) | def test_api_queue_manipulation(client, live_server, measure_memory_usag... function test_api_history_edge_cases (line 597) | def test_api_history_edge_cases(client, live_server, measure_memory_usag... function test_api_notification_edge_cases (line 656) | def test_api_notification_edge_cases(client, live_server, measure_memory... function test_api_tag_edge_cases (line 708) | def test_api_tag_edge_cases(client, live_server, measure_memory_usage, d... function test_api_authentication_edge_cases (line 758) | def test_api_authentication_edge_cases(client, live_server, measure_memo... FILE: changedetectionio/tests/test_api_tags.py function test_api_tags_listing (line 8) | def test_api_tags_listing(client, live_server, measure_memory_usage, dat... function test_api_tag_restock_processor_config (line 179) | def test_api_tag_restock_processor_config(client, live_server, measure_m... function test_roundtrip_API (line 270) | def test_roundtrip_API(client, live_server, measure_memory_usage, datast... FILE: changedetectionio/tests/test_auth.py function test_basic_auth (line 8) | def test_basic_auth(client, live_server, measure_memory_usage, datastore... FILE: changedetectionio/tests/test_automatic_follow_ldjson_price.py function set_response_with_ldjson (line 9) | def set_response_with_ldjson(datastore_path): function set_response_without_ldjson (line 63) | def set_response_without_ldjson(datastore_path): function test_check_ldjson_price_autodetect (line 84) | def test_check_ldjson_price_autodetect(client, live_server, measure_memo... function _test_runner_check_bad_format_ignored (line 137) | def _test_runner_check_bad_format_ignored(live_server, client, has_ldjso... function test_bad_ldjson_is_correctly_ignored (line 153) | def test_bad_ldjson_is_correctly_ignored(client, live_server, measure_me... FILE: changedetectionio/tests/test_backend.py function test_inscriptus (line 11) | def test_inscriptus(): function test_check_basic_change_detection_functionality (line 19) | def test_check_basic_change_detection_functionality(client, live_server,... function test_title_scraper (line 151) | def test_title_scraper(client, live_server, measure_memory_usage, datast... function test_title_scraper_html_only (line 189) | def test_title_scraper_html_only(client, live_server, measure_memory_usa... function test_requests_timeout (line 210) | def test_requests_timeout(client, live_server, measure_memory_usage, dat... function test_non_text_mime_or_downloads (line 248) | def test_non_text_mime_or_downloads(client, live_server, measure_memory_... function test_standard_text_plain (line 307) | def test_standard_text_plain(client, live_server, measure_memory_usage, ... function test_plaintext_even_if_xml_content (line 368) | def test_plaintext_even_if_xml_content(client, live_server, measure_memo... function test_plaintext_even_if_xml_content_and_can_apply_filters (line 396) | def test_plaintext_even_if_xml_content_and_can_apply_filters(client, liv... FILE: changedetectionio/tests/test_backup.py function test_backup (line 12) | def test_backup(client, live_server, measure_memory_usage, datastore_path): function test_watch_data_package_download (line 83) | def test_watch_data_package_download(client, live_server, measure_memory... function test_backup_restore (line 122) | def test_backup_restore(client, live_server, measure_memory_usage, datas... function test_backup_restore_zip_slip_rejected (line 205) | def test_backup_restore_zip_slip_rejected(client, live_server, measure_m... function test_backup_restore_zip_bomb_rejected (line 229) | def test_backup_restore_zip_bomb_rejected(client, live_server, measure_m... FILE: changedetectionio/tests/test_basic_socketio.py function run_socketio_watch_update_test (line 13) | def run_socketio_watch_update_test(client, live_server, password_mode=""... function test_everything (line 109) | def test_everything(live_server, client, measure_memory_usage, datastore... FILE: changedetectionio/tests/test_block_while_text_present.py function set_original_ignore_response (line 9) | def set_original_ignore_response(datastore_path): function set_modified_original_ignore_response (line 26) | def set_modified_original_ignore_response(datastore_path): function set_modified_response_minus_block_text (line 46) | def set_modified_response_minus_block_text(datastore_path): function test_check_block_changedetection_text_NOT_present (line 65) | def test_check_block_changedetection_text_NOT_present(client, live_serve... FILE: changedetectionio/tests/test_clone.py function test_clone_functionality (line 9) | def test_clone_functionality(client, live_server, measure_memory_usage, ... FILE: changedetectionio/tests/test_commit_persistence.py function test_watch_commit_persists_to_disk (line 24) | def test_watch_commit_persists_to_disk(client, live_server): function test_watch_commit_survives_reload (line 49) | def test_watch_commit_survives_reload(client, live_server): function test_watch_commit_atomic_on_crash (line 80) | def test_watch_commit_atomic_on_crash(client, live_server): function test_multiple_watches_commit_independently (line 107) | def test_multiple_watches_commit_independently(client, live_server): function test_concurrent_watch_commits_dont_corrupt (line 151) | def test_concurrent_watch_commits_dont_corrupt(client, live_server): function test_concurrent_modifications_during_commit (line 188) | def test_concurrent_modifications_during_commit(client, live_server): function test_datastore_lock_protects_commit_snapshot (line 235) | def test_datastore_lock_protects_commit_snapshot(client, live_server): function test_processor_config_never_in_watch_json (line 283) | def test_processor_config_never_in_watch_json(client, live_server): function test_api_post_saves_processor_config_separately (line 318) | def test_api_post_saves_processor_config_separately(client, live_server): function test_api_put_saves_processor_config_separately (line 358) | def test_api_put_saves_processor_config_separately(client, live_server): function test_ui_edit_saves_processor_config_separately (line 398) | def test_ui_edit_saves_processor_config_separately(client, live_server): function test_browser_steps_normalized_to_empty_list (line 430) | def test_browser_steps_normalized_to_empty_list(client, live_server): function test_settings_persist_after_update (line 458) | def test_settings_persist_after_update(client, live_server): function test_tag_mute_persists (line 485) | def test_tag_mute_persists(client, live_server): function test_tag_delete_removes_from_watches (line 515) | def test_tag_delete_removes_from_watches(client, live_server): function test_watch_pause_unpause_persists (line 560) | def test_watch_pause_unpause_persists(client, live_server): function test_watch_mute_unmute_persists (line 589) | def test_watch_mute_unmute_persists(client, live_server): function test_ui_watch_edit_persists_all_fields (line 618) | def test_ui_watch_edit_persists_all_fields(client, live_server): FILE: changedetectionio/tests/test_conditions.py function set_original_response (line 11) | def set_original_response(datastore_path, number="50"): function set_number_in_range_response (line 24) | def set_number_in_range_response(datastore_path, number="75"): function set_number_out_of_range_response (line 37) | def set_number_out_of_range_response(datastore_path, number="150"): function test_conditions_with_text_and_number (line 55) | def test_conditions_with_text_and_number(client, live_server, measure_me... function test_condition_validate_rule_row (line 141) | def test_condition_validate_rule_row(client, live_server, measure_memory... function test_wordcount_conditions_plugin (line 197) | def test_wordcount_conditions_plugin(client, live_server, measure_memory... function test_lev_conditions_plugin (line 231) | def test_lev_conditions_plugin(client, live_server, measure_memory_usage... FILE: changedetectionio/tests/test_css_selector.py function set_original_response (line 12) | def set_original_response(datastore_path): function set_modified_response (line 29) | def set_modified_response(datastore_path): function test_include_filters_output (line 49) | def test_include_filters_output(): function test_check_markup_include_filters_restriction (line 73) | def test_check_markup_include_filters_restriction(client, live_server, m... function test_check_multiple_filters (line 120) | def test_check_multiple_filters(client, live_server, measure_memory_usag... function test_filter_is_empty_help_suggestion (line 169) | def test_filter_is_empty_help_suggestion(client, live_server, measure_me... FILE: changedetectionio/tests/test_datastore_isolation.py function test_client_and_live_server_share_datastore (line 4) | def test_client_and_live_server_share_datastore(client, live_server): FILE: changedetectionio/tests/test_element_removal.py function set_response_with_multiple_index (line 14) | def set_response_with_multiple_index(datastore_path): function set_original_response (line 44) | def set_original_response(datastore_path): function set_modified_response (line 73) | def set_modified_response(datastore_path): function test_element_removal_output (line 102) | def test_element_removal_output(): function test_element_removal_full (line 150) | def test_element_removal_full(client, live_server, measure_memory_usage,... function test_element_removal_nth_offset_no_shift (line 212) | def test_element_removal_nth_offset_no_shift(client, live_server, measur... FILE: changedetectionio/tests/test_encoding.py function test_surrogate_characters_in_content_are_sanitized (line 15) | def test_surrogate_characters_in_content_are_sanitized(): function test_utf8_content_without_charset_header (line 36) | def test_utf8_content_without_charset_header(client, live_server, datast... function test_shiftjis_with_meta_charset (line 59) | def test_shiftjis_with_meta_charset(client, live_server, datastore_path): function set_html_response (line 78) | def set_html_response(datastore_path): function test_check_encoding_detection (line 91) | def test_check_encoding_detection(client, live_server, measure_memory_us... function test_check_encoding_detection_missing_content_type_header (line 119) | def test_check_encoding_detection_missing_content_type_header(client, li... FILE: changedetectionio/tests/test_errorhandling.py function _runner_test_http_errors (line 12) | def _runner_test_http_errors(client, live_server, http_code, expected_te... function test_http_error_handler (line 50) | def test_http_error_handler(client, live_server, measure_memory_usage, d... function test_DNS_errors (line 58) | def test_DNS_errors(client, live_server, measure_memory_usage, datastore... function test_low_level_errors_clear_correctly (line 87) | def test_low_level_errors_clear_correctly(client, live_server, measure_m... FILE: changedetectionio/tests/test_extract_csv.py function test_check_extract_text_from_diff (line 9) | def test_check_extract_text_from_diff(client, live_server, measure_memor... FILE: changedetectionio/tests/test_extract_regex.py function set_original_response (line 11) | def set_original_response(datastore_path): function set_modified_response (line 29) | def set_modified_response(datastore_path): function set_multiline_response (line 49) | def set_multiline_response(datastore_path): function test_check_filter_multiline (line 74) | def test_check_filter_multiline(client, live_server, measure_memory_usag... function test_check_filter_and_regex_extract (line 123) | def test_check_filter_and_regex_extract(client, live_server, measure_mem... function test_regex_error_handling (line 202) | def test_regex_error_handling(client, live_server, measure_memory_usage,... FILE: changedetectionio/tests/test_filter_exist_changes.py function set_response_without_filter (line 11) | def set_response_without_filter(datastore_path): function set_response_with_filter (line 28) | def set_response_with_filter(datastore_path): function test_filter_doesnt_exist_then_exists_should_get_notification (line 44) | def test_filter_doesnt_exist_then_exists_should_get_notification(client,... FILE: changedetectionio/tests/test_filter_failure_notification.py function set_response_with_filter (line 8) | def set_response_with_filter(datastore_path): function run_filter_test (line 24) | def run_filter_test(client, live_server, content_filter, app_notificatio... function test_check_include_filters_failure_notification (line 186) | def test_check_include_filters_failure_notification(client, live_server,... function test_check_xpath_filter_failure_notification (line 193) | def test_check_xpath_filter_failure_notification(client, live_server, me... function test_basic_markup_from_text (line 200) | def test_basic_markup_from_text(client, live_server, measure_memory_usag... FILE: changedetectionio/tests/test_group.py function set_original_response (line 14) | def set_original_response(datastore_path): function set_modified_response (line 29) | def set_modified_response(datastore_path): function test_setup_group_tag (line 44) | def test_setup_group_tag(client, live_server, measure_memory_usage, data... function test_tag_import_singular (line 134) | def test_tag_import_singular(client, live_server, measure_memory_usage, ... function test_tag_add_in_ui (line 154) | def test_tag_add_in_ui(client, live_server, measure_memory_usage, datast... function test_group_tag_notification (line 170) | def test_group_tag_notification(client, live_server, measure_memory_usag... function test_limit_tag_ui (line 240) | def test_limit_tag_ui(client, live_server, measure_memory_usage, datasto... function test_clone_tag_on_import (line 278) | def test_clone_tag_on_import(client, live_server, measure_memory_usage, ... function test_clone_tag_on_quickwatchform_add (line 303) | def test_clone_tag_on_quickwatchform_add(client, live_server, measure_me... function test_order_of_filters_tag_filter_and_watch_filter (line 333) | def test_order_of_filters_tag_filter_and_watch_filter(client, live_serve... function test_tag_json_persistence (line 481) | def test_tag_json_persistence(client, live_server, measure_memory_usage,... function test_tag_json_migration_update_27 (line 566) | def test_tag_json_migration_update_27(client, live_server, measure_memor... FILE: changedetectionio/tests/test_history_consistency.py function test_consistent_history (line 13) | def test_consistent_history(client, live_server, measure_memory_usage, d... function test_check_text_history_view (line 154) | def test_check_text_history_view(client, live_server, measure_memory_usa... function test_history_trim_global_only (line 194) | def test_history_trim_global_only(client, live_server, measure_memory_us... function test_history_trim_global_override_in_watch (line 226) | def test_history_trim_global_override_in_watch(client, live_server, meas... FILE: changedetectionio/tests/test_html_to_text.py function test_html_to_text_func (line 6) | def test_html_to_text_func(): FILE: changedetectionio/tests/test_i18n.py function test_zh_TW (line 7) | def test_zh_TW(client, live_server, measure_memory_usage, datastore_path): function test_zh_Hant_TW_timeago_integration (line 43) | def test_zh_Hant_TW_timeago_integration(): function test_language_switching (line 71) | def test_language_switching(client, live_server, measure_memory_usage, d... function test_invalid_locale (line 125) | def test_invalid_locale(client, live_server, measure_memory_usage, datas... function test_language_persistence_in_session (line 160) | def test_language_persistence_in_session(client, live_server, measure_me... function test_set_language_with_redirect (line 216) | def test_set_language_with_redirect(client, live_server, measure_memory_... function test_time_unit_translations (line 258) | def test_time_unit_translations(client, live_server, measure_memory_usag... function test_accept_language_header_zh_tw (line 358) | def test_accept_language_header_zh_tw(client, live_server, measure_memor... function test_accept_language_header_en_variants (line 407) | def test_accept_language_header_en_variants(client, live_server, measure... function test_accept_language_header_zh_simplified (line 474) | def test_accept_language_header_zh_simplified(client, live_server, measu... function test_session_locale_overrides_accept_language (line 546) | def test_session_locale_overrides_accept_language(client, live_server, m... function test_clear_history_translated_confirmation (line 629) | def test_clear_history_translated_confirmation(client, live_server, meas... FILE: changedetectionio/tests/test_ignore.py function set_original_ignore_response (line 10) | def set_original_ignore_response(datastore_path): function test_ignore (line 27) | def test_ignore(client, live_server, measure_memory_usage, datastore_path): function test_strip_ignore_lines (line 59) | def test_strip_ignore_lines(client, live_server, measure_memory_usage, d... FILE: changedetectionio/tests/test_ignore_regex_text.py function test_strip_regex_text_func (line 10) | def test_strip_regex_text_func(): FILE: changedetectionio/tests/test_ignore_text.py function test_strip_text_func (line 13) | def test_strip_text_func(): function set_original_ignore_response (line 35) | def set_original_ignore_response(datastore_path, ver_stamp="123"): function set_modified_original_ignore_response (line 52) | def set_modified_original_ignore_response(datastore_path, ver_stamp="123"): function set_modified_ignore_response (line 72) | def set_modified_ignore_response(datastore_path, ver_stamp="123"): function test_check_ignore_text_functionality (line 92) | def test_check_ignore_text_functionality(client, live_server, measure_me... function _run_test_global_ignore (line 173) | def _run_test_global_ignore(client, datastore_path, as_source=False, ext... function test_check_global_ignore_text_functionality (line 255) | def test_check_global_ignore_text_functionality(client, live_server, mea... function test_check_global_ignore_text_functionality_as_source (line 259) | def test_check_global_ignore_text_functionality_as_source(client, live_s... FILE: changedetectionio/tests/test_ignorehyperlinks.py function set_original_ignore_response (line 10) | def set_original_ignore_response(datastore_path): function set_modified_ignore_response (line 27) | def set_modified_ignore_response(datastore_path): function test_render_anchor_tag_content_true (line 41) | def test_render_anchor_tag_content_true(client, live_server, measure_mem... FILE: changedetectionio/tests/test_ignorestatuscode.py function set_original_response (line 12) | def set_original_response(datastore_path): function set_some_changed_response (line 27) | def set_some_changed_response(datastore_path): function test_normal_page_check_works_with_ignore_status_code (line 42) | def test_normal_page_check_works_with_ignore_status_code(client, live_se... function test_403_page_check_works_with_ignore_status_code (line 102) | def test_403_page_check_works_with_ignore_status_code(client, live_serve... FILE: changedetectionio/tests/test_ignorewhitespace.py function set_original_ignore_response_but_with_whitespace (line 11) | def set_original_ignore_response_but_with_whitespace(datastore_path): function set_original_ignore_response (line 33) | def set_original_ignore_response(datastore_path): function test_check_ignore_whitespace (line 51) | def test_check_ignore_whitespace(client, live_server, measure_memory_usa... FILE: changedetectionio/tests/test_import.py function test_import (line 14) | def test_import(client, live_server, measure_memory_usage, datastore_path): function xtest_import_skip_url (line 37) | def xtest_import_skip_url(client, live_server, measure_memory_usage, dat... function test_import_distillio (line 60) | def test_import_distillio(client, live_server, measure_memory_usage, dat... function test_import_custom_xlsx (line 126) | def test_import_custom_xlsx(client, live_server, measure_memory_usage, d... function test_import_watchete_xlsx (line 174) | def test_import_watchete_xlsx(client, live_server, measure_memory_usage,... FILE: changedetectionio/tests/test_jinja2.py function test_jinja2_in_url_query (line 14) | def test_jinja2_in_url_query(client, live_server, measure_memory_usage, ... function test_jinja2_time_offset_in_url_query (line 39) | def test_jinja2_time_offset_in_url_query(client, live_server, measure_me... function test_jinja2_security_url_query (line 69) | def test_jinja2_security_url_query(client, live_server, measure_memory_u... function test_timezone (line 83) | def test_timezone(mocker): function test_format (line 94) | def test_format(mocker): function test_add_time (line 106) | def test_add_time(environment): function test_add_weekday (line 113) | def test_add_weekday(mocker): function test_substract_time (line 125) | def test_substract_time(environment): function test_offset_with_format (line 133) | def test_offset_with_format(environment): function test_default_timezone_empty_string (line 142) | def test_default_timezone_empty_string(environment): function test_default_timezone_with_offset (line 151) | def test_default_timezone_with_offset(environment): function test_default_timezone_subtraction (line 159) | def test_default_timezone_subtraction(environment): function test_regex_replace_basic (line 166) | def test_regex_replace_basic(): function test_regex_replace_with_groups (line 173) | def test_regex_replace_with_groups(): function test_regex_replace_multiple_matches (line 182) | def test_regex_replace_multiple_matches(): function test_regex_replace_count_parameter (line 188) | def test_regex_replace_count_parameter(): function test_regex_replace_empty_replacement (line 194) | def test_regex_replace_empty_replacement(): function test_regex_replace_no_match (line 200) | def test_regex_replace_no_match(): function test_regex_replace_invalid_regex (line 206) | def test_regex_replace_invalid_regex(): function test_regex_replace_special_characters (line 213) | def test_regex_replace_special_characters(): function test_regex_replace_multiline (line 219) | def test_regex_replace_multiline(): function test_regex_replace_with_notification_context (line 227) | def test_regex_replace_with_notification_context(): function test_regex_replace_security_large_input (line 247) | def test_regex_replace_security_large_input(): function test_regex_replace_security_long_pattern (line 264) | def test_regex_replace_security_long_pattern(): function test_regex_replace_security_dangerous_pattern (line 274) | def test_regex_replace_security_dangerous_pattern(): function test_regex_replace_security_timeout_protection (line 299) | def test_regex_replace_security_timeout_protection(): FILE: changedetectionio/tests/test_jsonpath_jq_selector.py function test_jsonp_treated_as_plaintext (line 19) | def test_jsonp_treated_as_plaintext(): function test_jsonp_json_filter_extraction (line 42) | def test_jsonp_json_filter_extraction(): function test_unittest_inline_html_extract (line 64) | def test_unittest_inline_html_extract(): function test_unittest_inline_extract_body (line 124) | def test_unittest_inline_extract_body(): function set_original_ext_response (line 141) | def set_original_ext_response(datastore_path): function set_modified_ext_response (line 162) | def set_modified_ext_response(datastore_path): function set_original_response (line 177) | def set_original_response(datastore_path): function set_json_response_with_html (line 203) | def set_json_response_with_html(datastore_path): function set_modified_response (line 217) | def set_modified_response(datastore_path): function test_check_json_without_filter (line 244) | def test_check_json_without_filter(client, live_server, measure_memory_u... function check_json_filter (line 268) | def check_json_filter(json_filter, client, live_server, datastore_path): function test_check_jsonpath_filter (line 310) | def test_check_jsonpath_filter(client, live_server, measure_memory_usage... function test_check_jq_filter (line 313) | def test_check_jq_filter(client, live_server, measure_memory_usage, data... function test_check_jqraw_filter (line 317) | def test_check_jqraw_filter(client, live_server, measure_memory_usage, d... function check_json_filter_bool_val (line 321) | def check_json_filter_bool_val(json_filter, client, live_server, datasto... function test_check_jsonpath_filter_bool_val (line 344) | def test_check_jsonpath_filter_bool_val(client, live_server, measure_mem... function test_check_jq_filter_bool_val (line 348) | def test_check_jq_filter_bool_val(client, live_server, measure_memory_us... function test_check_jqraw_filter_bool_val (line 353) | def test_check_jqraw_filter_bool_val(client, live_server, measure_memory... function check_json_ext_filter (line 363) | def check_json_ext_filter(json_filter, client, live_server, datastore_pa... function test_ignore_json_order (line 429) | def test_ignore_json_order(client, live_server, measure_memory_usage, da... function test_correct_header_detect (line 466) | def test_correct_header_detect(client, live_server, measure_memory_usage... function test_check_jsonpath_ext_filter (line 502) | def test_check_jsonpath_ext_filter(client, live_server, measure_memory_u... function test_check_jq_ext_filter (line 506) | def test_check_jq_ext_filter(client, live_server, measure_memory_usage, ... function test_check_jqraw_ext_filter (line 511) | def test_check_jqraw_ext_filter(client, live_server, measure_memory_usag... function test_jsonpath_BOM_utf8 (line 516) | def test_jsonpath_BOM_utf8(client, live_server, measure_memory_usage, da... FILE: changedetectionio/tests/test_live_preview.py function set_response (line 8) | def set_response(datastore_path): function test_content_filter_live_preview (line 22) | def test_content_filter_live_preview(client, live_server, measure_memory... FILE: changedetectionio/tests/test_nonrenderable_pages.py function set_nonrenderable_response (line 9) | def set_nonrenderable_response(datastore_path): function set_zero_byte_response (line 23) | def set_zero_byte_response(datastore_path): function test_check_basic_change_detection_functionality (line 29) | def test_check_basic_change_detection_functionality(client, live_server,... FILE: changedetectionio/tests/test_notification.py function test_check_notification (line 25) | def test_check_notification(client, live_server, measure_memory_usage, d... function test_notification_urls_jinja2_apprise_integration (line 276) | def test_notification_urls_jinja2_apprise_integration(client, live_serve... function test_notification_custom_endpoint_and_jinja2 (line 303) | def test_notification_custom_endpoint_and_jinja2(client, live_server, me... function test_global_send_test_notification (line 389) | def test_global_send_test_notification(client, live_server, measure_memo... function test_single_send_test_notification_on_watch (line 501) | def test_single_send_test_notification_on_watch(client, live_server, mea... function _test_color_notifications (line 544) | def _test_color_notifications(client, notification_body_token, datastore... function test_html_color_notifications (line 601) | def test_html_color_notifications(client, live_server, measure_memory_us... FILE: changedetectionio/tests/test_notification_errors.py function test_check_notification_error_handling (line 7) | def test_check_notification_error_handling(client, live_server, measure_... FILE: changedetectionio/tests/test_obfuscations.py function set_original_ignore_response (line 9) | def set_original_ignore_response(datastore_path): function test_obfuscations (line 22) | def test_obfuscations(client, live_server, measure_memory_usage, datasto... FILE: changedetectionio/tests/test_pdf.py function test_fetch_pdf (line 10) | def test_fetch_pdf(client, live_server, measure_memory_usage, datastore_... FILE: changedetectionio/tests/test_preview_endpoints.py function test_fetch_pdf (line 10) | def test_fetch_pdf(client, live_server, measure_memory_usage, datastore_... FILE: changedetectionio/tests/test_queue_handler.py function test_queue_system (line 8) | def test_queue_system(client, live_server, measure_memory_usage, datasto... FILE: changedetectionio/tests/test_request.py function test_headers_in_request (line 11) | def test_headers_in_request(client, live_server, measure_memory_usage, d... function test_body_in_request (line 80) | def test_body_in_request(client, live_server, measure_memory_usage, data... function test_method_in_request (line 174) | def test_method_in_request(client, live_server, measure_memory_usage, da... function test_ua_global_override (line 249) | def test_ua_global_override(client, live_server, measure_memory_usage, d... function test_headers_textfile_in_request (line 300) | def test_headers_textfile_in_request(client, live_server, measure_memory... function test_headers_validation (line 410) | def test_headers_validation(client, live_server, measure_memory_usage, d... FILE: changedetectionio/tests/test_restock_itemprop.py function set_original_response (line 24) | def set_original_response(datastore_path, props_markup='', price="121.95"): function test_restock_itemprop_basic (line 43) | def test_restock_itemprop_basic(client, live_server, measure_memory_usag... function test_itemprop_price_change (line 79) | def test_itemprop_price_change(client, live_server, measure_memory_usage... function _run_test_minmax_limit (line 125) | def _run_test_minmax_limit(client, extra_watch_edit_form, datastore_path): function test_restock_itemprop_minmax (line 204) | def test_restock_itemprop_minmax(client, live_server, measure_memory_usa... function test_restock_itemprop_with_tag (line 213) | def test_restock_itemprop_with_tag(client, live_server, measure_memory_u... function test_itemprop_percent_threshold (line 243) | def test_itemprop_percent_threshold(client, live_server, measure_memory_... function test_change_with_notification_values (line 327) | def test_change_with_notification_values(client, live_server, measure_me... function test_data_sanity (line 397) | def test_data_sanity(client, live_server, measure_memory_usage, datastor... function test_special_prop_examples (line 445) | def test_special_prop_examples(client, live_server, measure_memory_usage... function test_itemprop_as_str (line 472) | def test_itemprop_as_str(client, live_server, measure_memory_usage, data... FILE: changedetectionio/tests/test_rss.py function set_original_cdata_xml (line 11) | def set_original_cdata_xml(datastore_path): function set_html_content (line 55) | def set_html_content(datastore_path, content): function test_rss_feed_empty (line 71) | def test_rss_feed_empty(client, live_server, measure_memory_usage, datas... function test_rss_and_token (line 82) | def test_rss_and_token(client, live_server, measure_memory_usage, datast... function test_basic_cdata_rss_markup (line 112) | def test_basic_cdata_rss_markup(client, live_server, measure_memory_usag... function test_rss_xpath_filtering (line 136) | def test_rss_xpath_filtering(client, live_server, measure_memory_usage, ... function test_rss_bad_chars_breaking (line 185) | def test_rss_bad_chars_breaking(client, live_server, measure_memory_usag... function test_rss_single_watch_feed (line 244) | def test_rss_single_watch_feed(client, live_server, measure_memory_usage... FILE: changedetectionio/tests/test_rss_group.py function set_original_response (line 9) | def set_original_response(datastore_path): function set_modified_response (line 24) | def set_modified_response(datastore_path): function test_rss_group (line 39) | def test_rss_group(client, live_server, measure_memory_usage, datastore_... function test_rss_group_empty_tag (line 155) | def test_rss_group_empty_tag(client, live_server, measure_memory_usage, ... function test_rss_group_only_unviewed (line 190) | def test_rss_group_only_unviewed(client, live_server, measure_memory_usa... FILE: changedetectionio/tests/test_rss_reader_mode.py function set_xmlns_purl_content (line 10) | def set_xmlns_purl_content(datastore_path, extra=""): function set_original_cdata_xml (line 66) | def set_original_cdata_xml(datastore_path): function test_rss_reader_mode (line 105) | def test_rss_reader_mode(client, live_server, measure_memory_usage, data... function test_rss_reader_mode_with_css_filters (line 131) | def test_rss_reader_mode_with_css_filters(client, live_server, measure_m... function test_xmlns_purl_content (line 157) | def test_xmlns_purl_content(client, live_server, measure_memory_usage, d... FILE: changedetectionio/tests/test_rss_single_watch.py function test_rss_feed_empty (line 14) | def test_rss_feed_empty(client, live_server, measure_memory_usage, datas... function test_rss_single_watch_order (line 28) | def test_rss_single_watch_order(client, live_server, measure_memory_usag... function test_rss_categories_from_tags (line 128) | def test_rss_categories_from_tags(client, live_server, measure_memory_us... function test_rss_single_watch_follow_notification_body (line 269) | def test_rss_single_watch_follow_notification_body(client, live_server, ... FILE: changedetectionio/tests/test_scheduler.py function test_check_basic_scheduler_functionality (line 15) | def test_check_basic_scheduler_functionality(client, live_server, measur... function test_check_basic_global_scheduler_functionality (line 93) | def test_check_basic_global_scheduler_functionality(client, live_server,... function test_validation_time_interval_field (line 175) | def test_validation_time_interval_field(client, live_server, measure_mem... FILE: changedetectionio/tests/test_search.py function test_basic_search (line 7) | def test_basic_search(client, live_server, measure_memory_usage, datasto... function test_search_in_tag_limit (line 40) | def test_search_in_tag_limit(client, live_server, measure_memory_usage, ... FILE: changedetectionio/tests/test_security.py function set_original_response (line 11) | def set_original_response(datastore_path): function test_favicon (line 29) | def test_favicon(client, live_server, measure_memory_usage, datastore_pa... function test_bad_access (line 53) | def test_bad_access(client, live_server, measure_memory_usage, datastore... function _runner_test_various_file_slash (line 112) | def _runner_test_various_file_slash(client, file_uri): function test_file_slash_access (line 140) | def test_file_slash_access(client, live_server, measure_memory_usage, da... function test_xss (line 150) | def test_xss(client, live_server, measure_memory_usage, datastore_path): function test_xss_watch_last_error (line 191) | def test_xss_watch_last_error(client, live_server, measure_memory_usage,... function test_login_redirect_safe_urls (line 222) | def test_login_redirect_safe_urls(client, live_server, measure_memory_us... function test_login_redirect_with_password (line 299) | def test_login_redirect_with_password(client, live_server, measure_memor... function test_login_redirect_from_protected_page (line 377) | def test_login_redirect_from_protected_page(client, live_server, measure... function test_logout_with_redirect (line 450) | def test_logout_with_redirect(client, live_server, measure_memory_usage,... function test_static_directory_traversal (line 508) | def test_static_directory_traversal(client, live_server, measure_memory_... function test_ssrf_private_ip_blocked (line 585) | def test_ssrf_private_ip_blocked(client, live_server, monkeypatch, measu... function test_unresolvable_hostname_is_allowed (line 717) | def test_unresolvable_hostname_is_allowed(client, live_server, monkeypat... FILE: changedetectionio/tests/test_settings_tag_force_reprocess.py function test_settings_change_forces_reprocess (line 16) | def test_settings_change_forces_reprocess(client, live_server, measure_m... function test_tag_change_forces_reprocess (line 82) | def test_tag_change_forces_reprocess(client, live_server, measure_memory... function test_tag_change_via_api_forces_reprocess (line 152) | def test_tag_change_via_api_forces_reprocess(client, live_server, measur... FILE: changedetectionio/tests/test_share_watch.py function test_share_watch (line 9) | def test_share_watch(client, live_server, measure_memory_usage, datastor... FILE: changedetectionio/tests/test_source.py function test_check_basic_change_detection_functionality_source (line 10) | def test_check_basic_change_detection_functionality_source(client, live_... function test_check_ignore_elements (line 54) | def test_check_ignore_elements(client, live_server, measure_memory_usage... FILE: changedetectionio/tests/test_trigger.py function set_original_ignore_response (line 9) | def set_original_ignore_response(datastore_path): function set_modified_original_ignore_response (line 26) | def set_modified_original_ignore_response(datastore_path): function set_modified_with_trigger_text_response (line 43) | def set_modified_with_trigger_text_response(datastore_path): function test_trigger_functionality (line 62) | def test_trigger_functionality(client, live_server, measure_memory_usage... FILE: changedetectionio/tests/test_trigger_regex.py function set_original_ignore_response (line 9) | def set_original_ignore_response(datastore_path): function test_trigger_regex_functionality (line 26) | def test_trigger_regex_functionality(client, live_server, measure_memory... FILE: changedetectionio/tests/test_trigger_regex_with_filter.py function set_original_ignore_response (line 10) | def set_original_ignore_response(datastore_path): function test_trigger_regex_functionality_with_filter (line 27) | def test_trigger_regex_functionality_with_filter(client, live_server, me... FILE: changedetectionio/tests/test_ui.py function test_recheck_time_field_validation_global_settings (line 8) | def test_recheck_time_field_validation_global_settings(client, live_serv... function test_recheck_time_field_validation_single_watch (line 31) | def test_recheck_time_field_validation_single_watch(client, live_server,... function test_checkbox_open_diff_in_new_tab (line 100) | def test_checkbox_open_diff_in_new_tab(client, live_server, measure_memo... function test_page_title_listing_behaviour (line 174) | def test_page_title_listing_behaviour(client, live_server, measure_memor... function test_ui_viewed_unread_flag (line 250) | def test_ui_viewed_unread_flag(client, live_server, measure_memory_usage... FILE: changedetectionio/tests/test_unique_lines.py function set_original_ignore_response (line 9) | def set_original_ignore_response(datastore_path): function set_modified_swapped_lines (line 26) | def set_modified_swapped_lines(datastore_path): function set_modified_swapped_lines_with_extra_text_for_sorting (line 40) | def set_modified_swapped_lines_with_extra_text_for_sorting(datastore_path): function set_modified_with_trigger_text_response (line 58) | def set_modified_with_trigger_text_response(datastore_path): function test_unique_lines_functionality (line 75) | def test_unique_lines_functionality(client, live_server, measure_memory_... function test_sort_lines_functionality (line 120) | def test_sort_lines_functionality(client, live_server, measure_memory_us... function test_extra_filters (line 166) | def test_extra_filters(client, live_server, measure_memory_usage, datast... FILE: changedetectionio/tests/test_watch_edited_flag.py function set_test_content (line 16) | def set_test_content(datastore_path): function test_watch_edited_flag_lifecycle (line 29) | def test_watch_edited_flag_lifecycle(client, live_server, measure_memory... function test_watch_edited_flag_dict_methods (line 86) | def test_watch_edited_flag_dict_methods(client, live_server, measure_mem... function test_watch_edited_flag_prevents_skip (line 146) | def test_watch_edited_flag_prevents_skip(client, live_server, measure_me... function test_watch_edited_flag_system_fields (line 207) | def test_watch_edited_flag_system_fields(client, live_server, measure_me... FILE: changedetectionio/tests/test_watch_fields_storage.py function test_check_watch_field_storage (line 7) | def test_check_watch_field_storage(client, live_server, measure_memory_u... FILE: changedetectionio/tests/test_xpath_default_namespace.py class TestXPathDefaultNamespace (line 82) | class TestXPathDefaultNamespace: method test_atom_feed_simple_xpath_with_xpath_filter (line 85) | def test_atom_feed_simple_xpath_with_xpath_filter(self): method test_atom_feed_nested_xpath_with_xpath_filter (line 92) | def test_atom_feed_nested_xpath_with_xpath_filter(self): method test_atom_feed_other_elements_with_xpath_filter (line 100) | def test_atom_feed_other_elements_with_xpath_filter(self): method test_rss_feed_without_namespace (line 106) | def test_rss_feed_without_namespace(self): method test_rss_feed_nested_xpath (line 113) | def test_rss_feed_nested_xpath(self): method test_rss_feed_with_prefixed_namespaces (line 121) | def test_rss_feed_with_prefixed_namespaces(self): method test_local_name_workaround_still_works (line 127) | def test_local_name_workaround_still_works(self): method test_xpath1_filter_without_default_namespace (line 133) | def test_xpath1_filter_without_default_namespace(self): method test_xpath1_filter_with_default_namespace_returns_empty (line 139) | def test_xpath1_filter_with_default_namespace_returns_empty(self): method test_xpath1_filter_local_name_workaround (line 145) | def test_xpath1_filter_local_name_workaround(self): FILE: changedetectionio/tests/test_xpath_selector.py function set_rss_atom_feed_response (line 10) | def set_rss_atom_feed_response(datastore_path, header='', ): function set_original_response (line 44) | def set_original_response(datastore_path): function set_modified_response (line 62) | def set_modified_response(datastore_path): function test_check_xpath_filter_utf8 (line 82) | def test_check_xpath_filter_utf8(client, live_server, measure_memory_usa... function test_check_xpath_text_function_utf8 (line 133) | def test_check_xpath_text_function_utf8(client, live_server, measure_mem... function test_check_markup_xpath_filter_restriction (line 191) | def test_check_markup_xpath_filter_restriction(client, live_server, meas... function test_xpath_validation (line 232) | def test_xpath_validation(client, live_server, measure_memory_usage, dat... function test_xpath23_prefix_validation (line 248) | def test_xpath23_prefix_validation(client, live_server, measure_memory_u... function test_xpath1_lxml (line 263) | def test_xpath1_lxml(client, live_server, measure_memory_usage, datastor... function test_xpath1_validation (line 323) | def test_xpath1_validation(client, live_server, measure_memory_usage, da... function test_check_with_prefix_include_filters (line 340) | def test_check_with_prefix_include_filters(client, live_server, measure_... function test_various_rules (line 372) | def test_various_rules(client, live_server, measure_memory_usage, datast... function test_xpath_20 (line 416) | def test_xpath_20(client, live_server, measure_memory_usage, datastore_p... function test_xpath_20_function_count (line 450) | def test_xpath_20_function_count(client, live_server, measure_memory_usa... function test_xpath_20_function_count2 (line 483) | def test_xpath_20_function_count2(client, live_server, measure_memory_us... function test_xpath_20_function_string_join_matches (line 518) | def test_xpath_20_function_string_join_matches(client, live_server, meas... function _subtest_xpath_rss (line 552) | def _subtest_xpath_rss(client, datastore_path, content_type='text/html'): function test_rss_xpath (line 590) | def test_rss_xpath(client, live_server, measure_memory_usage, datastore_... function test_xpath_blocked_functions_unit (line 599) | def test_xpath_blocked_functions_unit(): function test_xpath_blocked_functions_form_validation (line 639) | def test_xpath_blocked_functions_form_validation(client, live_server, me... FILE: changedetectionio/tests/test_xpath_selector_unit.py function test_hotels (line 82) | def test_hotels(html_content, xpath, answer): function test_branches_to_visit (line 145) | def test_branches_to_visit(html_content, xpath, answer): function test_trips (line 202) | def test_trips(html_content, xpath, answer): function test_xpath_utf8_encoding (line 256) | def test_xpath_utf8_encoding(html_content, xpath, expected_text): function test_xpath1_utf8_encoding (line 278) | def test_xpath1_utf8_encoding(html_content, xpath, expected_text): function test_wyborcza_real_world_example (line 308) | def test_wyborcza_real_world_example(): FILE: changedetectionio/tests/unit/test_conditions.py class TestTriggerConditions (line 11) | class TestTriggerConditions(unittest.TestCase): method setUp (line 12) | def setUp(self): method tearDown (line 27) | def tearDown(self): method test_conditions_execution_pass (line 33) | def test_conditions_execution_pass(self): FILE: changedetectionio/tests/unit/test_html_to_text.py class TestHtmlToText (line 14) | class TestHtmlToText(unittest.TestCase): method test_basic_text_extraction (line 17) | def test_basic_text_extraction(self): method test_empty_html (line 27) | def test_empty_html(self): method test_nested_elements (line 35) | def test_nested_elements(self): method test_anchor_tag_rendering (line 56) | def test_anchor_tag_rendering(self): method test_rss_mode (line 70) | def test_rss_mode(self): method test_special_characters (line 80) | def test_special_characters(self): method test_whitespace_handling (line 89) | def test_whitespace_handling(self): method test_deterministic_output (line 99) | def test_deterministic_output(self): method test_thread_safety_determinism (line 109) | def test_thread_safety_determinism(self): method test_thread_safety_basic (line 173) | def test_thread_safety_basic(self): method test_large_html_with_bloated_head (line 202) | def test_large_html_with_bloated_head(self): method test_body_display_none_spa_pattern (line 287) | def test_body_display_none_spa_pattern(self): method test_style_tag_with_svg_data_uri (line 365) | def test_style_tag_with_svg_data_uri(self): method test_style_tag_closes_correctly (line 414) | def test_style_tag_closes_correctly(self): method test_script_with_closing_tag_in_string_does_not_eat_content (line 456) | def test_script_with_closing_tag_in_string_does_not_eat_content(self): method test_content_sandwiched_between_multiple_body_scripts (line 480) | def test_content_sandwiched_between_multiple_body_scripts(self): method test_unicode_and_international_content_preserved (line 501) | def test_unicode_and_international_content_preserved(self): method test_style_with_type_attribute_is_stripped (line 519) | def test_style_with_type_attribute_is_stripped(self): method test_ldjson_script_is_stripped (line 531) | def test_ldjson_script_is_stripped(self): method test_inline_svg_is_stripped_entirely (line 545) | def test_inline_svg_is_stripped_entirely(self): method test_tag_inside_json_data_attribute_does_not_eat_content (line 566) | def test_tag_inside_json_data_attribute_does_not_eat_content(self): method test_script_inside_json_data_attribute_does_not_eat_content (line 601) | def test_script_inside_json_data_attribute_does_not_eat_content(self): FILE: changedetectionio/tests/unit/test_jinja2_security.py class TestJinja2SSTI (line 11) | class TestJinja2SSTI(unittest.TestCase): method test_exception (line 13) | def test_exception(self): method test_exception_debug_calls (line 32) | def test_exception_debug_calls(self): method test_exception_empty_calls (line 44) | def test_exception_empty_calls(self): method test_jinja2_escaped_html (line 54) | def test_jinja2_escaped_html(self): FILE: changedetectionio/tests/unit/test_notification_diff.py class TestDiffBuilder (line 23) | class TestDiffBuilder(unittest.TestCase): method test_expected_diff_output (line 25) | def test_expected_diff_output(self): method test_expected_diff_patch_output (line 72) | def test_expected_diff_patch_output(self): method test_word_level_diff (line 94) | def test_word_level_diff(self): method test_word_level_diff_html (line 116) | def test_word_level_diff_html(self): method test_context_lines (line 132) | def test_context_lines(self): method test_context_lines_with_include_equal (line 185) | def test_context_lines_with_include_equal(self): method test_case_insensitive_comparison (line 207) | def test_case_insensitive_comparison(self): method test_case_insensitive_with_real_changes (line 224) | def test_case_insensitive_with_real_changes(self): method test_case_insensitive_html_output (line 241) | def test_case_insensitive_html_output(self): method test_ignore_junk_word_diff_enabled (line 255) | def test_ignore_junk_word_diff_enabled(self): method test_ignore_junk_word_diff_disabled (line 272) | def test_ignore_junk_word_diff_disabled(self): method test_ignore_junk_with_real_changes (line 291) | def test_ignore_junk_with_real_changes(self): method test_ignore_junk_tabs_vs_spaces (line 303) | def test_ignore_junk_tabs_vs_spaces(self): method test_ignore_junk_html_output (line 319) | def test_ignore_junk_html_output(self): method test_ignore_junk_case_insensitive_combination (line 331) | def test_ignore_junk_case_insensitive_combination(self): method test_ignore_junk_multiline (line 363) | def test_ignore_junk_multiline(self): FILE: changedetectionio/tests/unit/test_restock_logic.py class TestDiffBuilder (line 12) | class TestDiffBuilder(unittest.TestCase): method test_logic (line 14) | def test_logic(self): FILE: changedetectionio/tests/unit/test_scheduler.py class TestScheduler (line 9) | class TestScheduler(unittest.TestCase): method test_timezone_basic_time_within_schedule (line 14) | def test_timezone_basic_time_within_schedule(self): method test_timezone_basic_time_outside_schedule (line 32) | def test_timezone_basic_time_outside_schedule(self): method test_timezone_utc_within_schedule (line 52) | def test_timezone_utc_within_schedule(self): method test_timezone_extreme_ahead (line 69) | def test_timezone_extreme_ahead(self): method test_timezone_extreme_behind (line 86) | def test_timezone_extreme_behind(self): FILE: changedetectionio/tests/unit/test_semver.py class TestSemver (line 16) | class TestSemver(unittest.TestCase): method test_valid_versions (line 17) | def test_valid_versions(self): method test_invalid_versions (line 35) | def test_invalid_versions(self): method test_our_version (line 57) | def test_our_version(self): FILE: changedetectionio/tests/unit/test_time_extension.py function test_default_timezone_override_like_safe_jinja (line 13) | def test_default_timezone_override_like_safe_jinja(mocker): function test_default_timezone_not_overridden (line 38) | def test_default_timezone_not_overridden(mocker): function test_datetime_format_override_like_safe_jinja (line 60) | def test_datetime_format_override_like_safe_jinja(mocker): function test_offset_with_overridden_timezone (line 82) | def test_offset_with_overridden_timezone(mocker): function test_weekday_parameter_converted_to_int (line 104) | def test_weekday_parameter_converted_to_int(mocker): function test_multiple_offset_parameters (line 123) | def test_multiple_offset_parameters(mocker): FILE: changedetectionio/tests/unit/test_time_handler.py class TestAmIInsideTime (line 16) | class TestAmIInsideTime(unittest.TestCase): method test_current_time_within_schedule (line 19) | def test_current_time_within_schedule(self): method test_current_time_outside_schedule (line 37) | def test_current_time_outside_schedule(self): method test_timezone_pacific_within_schedule (line 55) | def test_timezone_pacific_within_schedule(self): method test_timezone_tokyo_within_schedule (line 72) | def test_timezone_tokyo_within_schedule(self): method test_schedule_crossing_midnight (line 89) | def test_schedule_crossing_midnight(self): method test_invalid_day_of_week (line 111) | def test_invalid_day_of_week(self): method test_invalid_time_format (line 122) | def test_invalid_time_format(self): method test_invalid_time_format_non_numeric (line 133) | def test_invalid_time_format_non_numeric(self): method test_invalid_timezone (line 144) | def test_invalid_timezone(self): method test_short_duration (line 155) | def test_short_duration(self): method test_long_duration (line 172) | def test_long_duration(self): method test_case_insensitive_day (line 190) | def test_case_insensitive_day(self): method test_edge_case_midnight (line 207) | def test_edge_case_midnight(self): method test_edge_case_end_of_day (line 226) | def test_edge_case_end_of_day(self): method test_24_hour_schedule_from_midnight (line 244) | def test_24_hour_schedule_from_midnight(self): method test_24_hour_schedule_at_end_of_day (line 261) | def test_24_hour_schedule_at_end_of_day(self): method test_24_hour_schedule_at_midnight_transition (line 277) | def test_24_hour_schedule_at_midnight_transition(self): method test_schedule_crosses_midnight_before_midnight (line 293) | def test_schedule_crosses_midnight_before_midnight(self): method test_schedule_crosses_midnight_after_midnight (line 309) | def test_schedule_crosses_midnight_after_midnight(self): method test_schedule_crosses_midnight_at_exact_end (line 325) | def test_schedule_crosses_midnight_at_exact_end(self): method test_duration_60_minutes (line 341) | def test_duration_60_minutes(self): method test_duration_at_exact_end_minute (line 356) | def test_duration_at_exact_end_minute(self): method test_one_second_after_schedule_ends (line 372) | def test_one_second_after_schedule_ends(self): method test_multi_day_schedule (line 388) | def test_multi_day_schedule(self): method test_schedule_one_minute_duration (line 404) | def test_schedule_one_minute_duration(self): method test_schedule_at_exact_start_time (line 419) | def test_schedule_at_exact_start_time(self): method test_schedule_one_microsecond_before_start (line 434) | def test_schedule_one_microsecond_before_start(self): class TestIsWithinSchedule (line 450) | class TestIsWithinSchedule(unittest.TestCase): method test_schedule_disabled (line 453) | def test_schedule_disabled(self): method test_schedule_none (line 459) | def test_schedule_none(self): method test_schedule_empty_dict (line 464) | def test_schedule_empty_dict(self): method test_schedule_enabled_but_day_disabled (line 469) | def test_schedule_enabled_but_day_disabled(self): method test_schedule_enabled_within_time (line 488) | def test_schedule_enabled_within_time(self): method test_schedule_enabled_outside_time (line 508) | def test_schedule_enabled_outside_time(self): method test_schedule_with_default_timezone (line 529) | def test_schedule_with_default_timezone(self): method test_schedule_different_timezones (line 553) | def test_schedule_different_timezones(self): method test_schedule_with_minutes_in_duration (line 574) | def test_schedule_with_minutes_in_duration(self): method test_schedule_with_timezone_whitespace (line 594) | def test_schedule_with_timezone_whitespace(self): method test_schedule_with_60_minutes (line 614) | def test_schedule_with_60_minutes(self): method test_schedule_with_24_hours (line 634) | def test_schedule_with_24_hours(self): method test_schedule_with_90_minutes (line 654) | def test_schedule_with_90_minutes(self): method test_schedule_24_hours_from_midnight (line 674) | def test_schedule_24_hours_from_midnight(self): method test_schedule_24_hours_at_end_of_day (line 694) | def test_schedule_24_hours_at_end_of_day(self): method test_schedule_crosses_midnight_with_is_within_schedule (line 714) | def test_schedule_crosses_midnight_with_is_within_schedule(self): method test_schedule_with_mixed_hours_minutes (line 743) | def test_schedule_with_mixed_hours_minutes(self): method test_schedule_48_hours (line 763) | def test_schedule_48_hours(self): class TestWeekdayEnum (line 784) | class TestWeekdayEnum(unittest.TestCase): method test_weekday_values (line 787) | def test_weekday_values(self): method test_weekday_string_access (line 797) | def test_weekday_string_access(self): FILE: changedetectionio/tests/unit/test_watch_model.py class TestDiffBuilder (line 14) | class TestDiffBuilder(unittest.TestCase): method test_watch_get_suggested_from_diff_timestamp (line 16) | def test_watch_get_suggested_from_diff_timestamp(self): method test_watch_deepcopy_doesnt_copy_datastore (line 73) | def test_watch_deepcopy_doesnt_copy_datastore(self): method test_watch_pickle_doesnt_serialize_datastore (line 136) | def test_watch_pickle_doesnt_serialize_datastore(self): method test_tag_deepcopy_works (line 173) | def test_tag_deepcopy_works(self): method test_watch_copy_performance (line 215) | def test_watch_copy_performance(self): FILE: changedetectionio/tests/util.py function write_test_file_and_sync (line 16) | def write_test_file_and_sync(filepath, content, mode='w'): function set_original_response (line 46) | def set_original_response(datastore_path, extra_title=''): function set_modified_response (line 62) | def set_modified_response(datastore_path): function set_longer_modified_response (line 76) | def set_longer_modified_response(datastore_path): function set_more_modified_response (line 94) | def set_more_modified_response(datastore_path): function set_empty_text_response (line 111) | def set_empty_text_response(datastore_path): function wait_for_notification_endpoint_output (line 118) | def wait_for_notification_endpoint_output(datastore_path): function get_UUID_for_tag_name (line 131) | def get_UUID_for_tag_name(client, name): function extract_rss_token_from_UI (line 140) | def extract_rss_token_from_UI(client): function extract_UUID_from_client (line 151) | def extract_UUID_from_client(client): function delete_all_watches (line 162) | def delete_all_watches(client=None): function wait_for_all_checks (line 201) | def wait_for_all_checks(client=None): function wait_for_watch_history (line 211) | def wait_for_watch_history(client, min_history_count=2, timeout=10): function live_server_setup (line 242) | def live_server_setup(live_server): function new_live_server_setup (line 245) | def new_live_server_setup(live_server): FILE: changedetectionio/tests/visualselector/test_fetch_data.py function test_visual_selector_content_ready (line 12) | def test_visual_selector_content_ready(client, live_server, measure_memo... function test_basic_browserstep (line 89) | def test_basic_browserstep(client, live_server, measure_memory_usage, da... function test_non_200_errors_report_browsersteps (line 153) | def test_non_200_errors_report_browsersteps(client, live_server, measure... function test_browsersteps_edit_UI_startsession (line 197) | def test_browsersteps_edit_UI_startsession(client, live_server, measure_... FILE: changedetectionio/time_handler.py class Weekday (line 7) | class Weekday(IntEnum): function am_i_inside_time (line 17) | def am_i_inside_time( function is_within_schedule (line 83) | def is_within_schedule(time_schedule_limit, default_tz="UTC"): FILE: changedetectionio/validate_url.py function normalize_url_encoding (line 8) | def normalize_url_encoding(url): function is_private_hostname (line 61) | def is_private_hostname(hostname): function is_safe_valid_url (line 83) | def is_safe_valid_url(test_url): FILE: changedetectionio/widgets/ternary_boolean.py class TernaryNoneBooleanWidget (line 5) | class TernaryNoneBooleanWidget: method __call__ (line 10) | def __call__(self, field, **kwargs): class TernaryNoneBooleanField (line 53) | class TernaryNoneBooleanField(Field): method __init__ (line 66) | def __init__(self, label=None, validators=None, false_values=None, boo... method process_formdata (line 80) | def process_formdata(self, valuelist): method _value (line 94) | def _value(self): FILE: changedetectionio/widgets/test_custom_text.py class TestForm (line 13) | class TestForm(Form): function test_custom_text (line 53) | def test_custom_text(): function test_data_processing (line 114) | def test_data_processing(): FILE: changedetectionio/worker.py function async_update_worker (line 23) | async def async_update_worker(worker_id, q, notification_q, app, datasto... function cleanup_error_artifacts (line 620) | def cleanup_error_artifacts(uuid, datastore): function send_content_changed_notification (line 630) | async def send_content_changed_notification(watch_uuid, notification_q, ... function send_filter_failure_notification (line 643) | async def send_filter_failure_notification(watch_uuid, notification_q, d... function send_step_failure_notification (line 656) | async def send_step_failure_notification(watch_uuid, step_n, notificatio... FILE: changedetectionio/worker_pool.py class WorkerThread (line 37) | class WorkerThread: method __init__ (line 39) | def __init__(self, worker_id, update_q, notification_q, app, datastore): method run (line 49) | def run(self): method start (line 87) | def start(self): method stop (line 96) | def stop(self): function start_async_workers (line 109) | def start_async_workers(n_workers, update_q, notification_q, app, datast... function start_single_async_worker (line 129) | async def start_single_async_worker(worker_id, update_q, notification_q,... function start_workers (line 167) | def start_workers(n_workers, update_q, notification_q, app, datastore): function add_worker (line 172) | def add_worker(update_q, notification_q, app, datastore): function remove_worker (line 193) | def remove_worker(): function get_worker_count (line 207) | def get_worker_count(): function get_running_uuids (line 212) | def get_running_uuids(): function claim_uuid_for_processing (line 218) | def claim_uuid_for_processing(uuid, worker_id): function release_uuid_from_processing (line 243) | def release_uuid_from_processing(uuid, worker_id): function set_uuid_processing (line 260) | def set_uuid_processing(uuid, worker_id=None, processing=True): function is_watch_running (line 275) | def is_watch_running(watch_uuid): function is_watch_running_by_another_worker (line 281) | def is_watch_running_by_another_worker(watch_uuid, current_worker_id): function queue_item_async_safe (line 290) | def queue_item_async_safe(update_q, item, silent=False): function shutdown_workers (line 342) | def shutdown_workers(): function adjust_async_worker_count (line 377) | def adjust_async_worker_count(new_count, update_q=None, notification_q=N... function get_worker_status (line 439) | def get_worker_status(): function wait_for_all_checks (line 449) | def wait_for_all_checks(update_q, timeout=150): function check_worker_health (line 498) | def check_worker_health(expected_count, update_q=None, notification_q=No... FILE: setup.py function read (line 14) | def read(*parts): function find_version (line 18) | def find_version(*file_paths): class BuildPyCommand (line 27) | class BuildPyCommand(build_py): method run (line 29) | def run(self):