qcanvas 1.0.8__py3-none-any.whl → 1.0.9.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of qcanvas might be problematic. Click here for more details.

qcanvas/run.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from logging import DEBUG, INFO, WARNING
2
+ from logging import INFO, WARNING
3
3
 
4
4
  import qcanvas.app_start
5
5
  from qcanvas.util import logs, paths
@@ -17,7 +17,7 @@ logs.set_levels(
17
17
  "qcanvas": INFO,
18
18
  "qcanvas.ui": WARNING,
19
19
  "qcanvas_backend": INFO,
20
- "qcanvas.ui.main_ui.status_bar_progress_display": DEBUG,
20
+ "qcanvas.ui.main_ui.status_bar_progress_display": INFO,
21
21
  }
22
22
  )
23
23
 
@@ -2,6 +2,7 @@ import logging
2
2
  from abc import abstractmethod
3
3
  from typing import *
4
4
 
5
+ import qcanvas_backend.database.types as db
5
6
  from qcanvas_backend.net.sync.sync_receipt import SyncReceipt
6
7
  from qtpy.QtCore import QItemSelection, Signal, Slot
7
8
  from qtpy.QtWidgets import *
@@ -12,11 +13,20 @@ from qcanvas.util.basic_fonts import bold_font, normal_font
12
13
  _logger = logging.getLogger(__name__)
13
14
 
14
15
  T = TypeVar("T")
16
+ U = TypeVar("U", bound=Type["ContentTree"])
15
17
 
16
18
 
17
19
  class ContentTree(MemoryTreeWidget, Generic[T]):
18
20
  item_selected = Signal(object)
19
21
 
22
+ @classmethod
23
+ def create_from_receipt(
24
+ cls: U, course: db.Course, *, sync_receipt: Optional[SyncReceipt]
25
+ ) -> Type[U]:
26
+ tree = cls(course.id)
27
+ tree.reload(course, sync_receipt=sync_receipt)
28
+ return tree
29
+
20
30
  def __init__(
21
31
  self,
22
32
  tree_name: str,
@@ -85,7 +85,3 @@ class CourseTree(ContentTree[Sequence[db.Term]]):
85
85
  term_widget.setFlags(Qt.ItemFlag.ItemIsEnabled)
86
86
 
87
87
  return term_widget
88
-
89
- # @Slot(db.Course, str)
90
- # def _on_course_renamed(self, course: db.Course, new_name: str) -> None:
91
- # self.course_renamed.emit(course, new_name)
@@ -16,16 +16,6 @@ _logger = logging.getLogger(__name__)
16
16
 
17
17
 
18
18
  class AssignmentTab(ContentTab):
19
- @staticmethod
20
- def create_from_receipt(
21
- *,
22
- course: db.Course,
23
- sync_receipt: Optional[SyncReceipt],
24
- downloader: ResourceManager,
25
- ) -> "AssignmentTab":
26
- return AssignmentTab(
27
- course=course, sync_receipt=sync_receipt, downloader=downloader
28
- )
29
19
 
30
20
  def __init__(
31
21
  self,
@@ -13,14 +13,6 @@ _logger = logging.getLogger(__name__)
13
13
 
14
14
 
15
15
  class AssignmentTree(ContentTree[db.Course]):
16
- @staticmethod
17
- def create_from_receipt(
18
- course: db.Course, *, sync_receipt: Optional[SyncReceipt]
19
- ) -> "AssignmentTree":
20
- tree = AssignmentTree(course.id)
21
- tree.reload(course, sync_receipt=sync_receipt)
22
- return tree
23
-
24
16
  def __init__(self, course_id: str):
25
17
  super().__init__(
26
18
  tree_name=f"course.{course_id}.assignment_groups",
@@ -14,8 +14,20 @@ from qcanvas.util.ui_tools import make_truncatable
14
14
 
15
15
  _logger = logging.getLogger(__name__)
16
16
 
17
+ T = TypeVar("T", bound=Type["ContentTab"])
18
+
17
19
 
18
20
  class ContentTab(QWidget):
21
+ @classmethod
22
+ def create_from_receipt(
23
+ cls: T,
24
+ *,
25
+ course: db.Course,
26
+ sync_receipt: Optional[SyncReceipt],
27
+ downloader: ResourceManager,
28
+ ) -> Type[T]:
29
+ return cls(course=course, sync_receipt=sync_receipt, downloader=downloader)
30
+
19
31
  def __init__(
20
32
  self,
21
33
  *,
@@ -17,15 +17,6 @@ _logger = logging.getLogger(__name__)
17
17
 
18
18
  # todo maybe update has_been_read? probably not the responsibility of this class though
19
19
  class MailTab(ContentTab):
20
- @staticmethod
21
- def create_from_receipt(
22
- *,
23
- course: db.Course,
24
- sync_receipt: Optional[SyncReceipt],
25
- downloader: ResourceManager,
26
- ) -> "MailTab":
27
- return MailTab(course=course, sync_receipt=sync_receipt, downloader=downloader)
28
-
29
20
  def __init__(
30
21
  self,
31
22
  *,
@@ -12,13 +12,6 @@ _logger = logging.getLogger(__name__)
12
12
 
13
13
 
14
14
  class MailTree(ContentTree[db.Course]):
15
- @staticmethod
16
- def create_from_receipt(
17
- course: db.Course, *, sync_receipt: Optional[SyncReceipt]
18
- ) -> "MailTree":
19
- tree = MailTree(course.id)
20
- tree.reload(course, sync_receipt=sync_receipt)
21
- return tree
22
15
 
23
16
  def __init__(self, course_id: str):
24
17
  super().__init__(
@@ -12,16 +12,6 @@ _logger = logging.getLogger(__name__)
12
12
 
13
13
 
14
14
  class PageTab(ContentTab):
15
-
16
- @staticmethod
17
- def create_from_receipt(
18
- *,
19
- course: db.Course,
20
- sync_receipt: Optional[SyncReceipt],
21
- downloader: ResourceManager,
22
- ) -> "PageTab":
23
- return PageTab(course=course, sync_receipt=sync_receipt, downloader=downloader)
24
-
25
15
  def __init__(
26
16
  self,
27
17
  *,
@@ -12,14 +12,6 @@ _logger = logging.getLogger(__name__)
12
12
 
13
13
 
14
14
  class PageTree(ContentTree[db.Course]):
15
- @staticmethod
16
- def create_from_receipt(
17
- course: db.Course, *, sync_receipt: Optional[SyncReceipt]
18
- ) -> "PageTree":
19
- tree = PageTree(course.id)
20
- tree.reload(course, sync_receipt=sync_receipt)
21
- return tree
22
-
23
15
  def __init__(self, course_id: str):
24
16
  super().__init__(
25
17
  tree_name=f"course.{course_id}.modules",
@@ -62,7 +62,7 @@ class StatusBarProgressDisplay(QStatusBar):
62
62
 
63
63
  @asyncSlot(TaskID, object)
64
64
  async def _on_task_failed(self, task_id: TaskID, context: object) -> None:
65
- _logger.debug("%s failed", task_id)
65
+ _logger.info("%s failed", task_id)
66
66
 
67
67
  async with self._lock:
68
68
  self._remove_task(task_id)
@@ -83,8 +83,8 @@ class StatusBarProgressDisplay(QStatusBar):
83
83
  self._show_multiple_tasks_progress(list(self._tasks.values()))
84
84
 
85
85
  def _show_done(self) -> None:
86
- _logger.debug("Finished tasks. Tasks: %s", self._tasks)
87
- self.showMessage("All tasks finished", 5000)
86
+ _logger.info("Finished tasks. Tasks: %s", self._tasks)
87
+ self.showMessage("Done", 5000)
88
88
  self._progress_bar.hide()
89
89
 
90
90
  def _show_single_task_progress(self, task: Tuple[TaskID, _TaskProgress]) -> None:
@@ -132,12 +132,12 @@ class StatusBarProgressDisplay(QStatusBar):
132
132
 
133
133
  def _add_task(self, task: TaskID, current: int, total: int) -> None:
134
134
  self._tasks[task] = _TaskProgress(current, total)
135
- _logger.debug("Added task %s", task)
135
+ _logger.info("Added task %s", task)
136
136
  _logger.debug("Tasks: %s", self._tasks)
137
137
 
138
138
  def _remove_task(self, task: TaskID) -> None:
139
139
  self._tasks.pop(task, None)
140
- _logger.debug("Removed task %s", task)
140
+ _logger.info("Removed task %s", task)
141
141
  _logger.debug("Tasks: %s", self._tasks)
142
142
 
143
143
  @property
@@ -34,13 +34,16 @@ class SetupDialog(QDialog):
34
34
 
35
35
  self._semaphore = Semaphore()
36
36
  self._canvas_url_box = QLineEdit(settings.client.canvas_url)
37
+ self._canvas_url_box.setPlaceholderText("https://instance.canvas.com")
37
38
  self._canvas_api_key_box = QLineEdit(settings.client.canvas_api_key)
38
39
  self._canvas_api_key_box.setEchoMode(QLineEdit.EchoMode.Password)
39
40
  self._panopto_url_box = QLineEdit(settings.client.panopto_url)
41
+ self._panopto_url_box.setPlaceholderText("https://instance.panopto.com")
40
42
  self._button_box = self._setup_button_box()
41
43
  self._button_box.accepted.connect(self._accepted)
42
44
  self._button_box.helpRequested.connect(self._help_requested)
43
45
  self._waiting_indicator = self._setup_progress_bar()
46
+ self._status_bar = QStatusBar()
44
47
 
45
48
  self.setLayout(
46
49
  layout(
@@ -54,13 +57,14 @@ class SetupDialog(QDialog):
54
57
  ),
55
58
  self._waiting_indicator,
56
59
  self._button_box,
60
+ self._status_bar,
57
61
  )
58
62
  )
59
63
 
60
64
  def _setup_button_box(self) -> QDialogButtonBox:
61
65
  box = QDialogButtonBox()
62
66
  box.addButton(QDialogButtonBox.StandardButton.Ok)
63
- box.addButton("Get a canvas API key", QDialogButtonBox.ButtonRole.HelpRole)
67
+ box.addButton("Get a Canvas API key", QDialogButtonBox.ButtonRole.HelpRole)
64
68
  return box
65
69
 
66
70
  def _setup_progress_bar(self) -> QProgressBar:
@@ -81,10 +85,13 @@ class SetupDialog(QDialog):
81
85
  if self._semaphore.acquire(False):
82
86
  try:
83
87
  self._clear_errors()
84
- if self._check_inputs():
88
+
89
+ if not self._all_inputs_valid():
90
+ self._status_bar.showMessage("Invalid input!", 5000)
85
91
  return
86
92
 
87
93
  self._waiting_indicator.setVisible(True)
94
+ self._status_bar.showMessage("Checking configuration...")
88
95
 
89
96
  canvas_config = CanvasClientConfig(
90
97
  api_token=self._canvas_api_key_box.text().strip(),
@@ -97,7 +104,9 @@ class SetupDialog(QDialog):
97
104
  if not await self._check_panopto_config(canvas_config):
98
105
  self._show_panopto_help()
99
106
  return
100
-
107
+ except Exception as e:
108
+ self._status_bar.showMessage(f"An error occurred: {e}", 5000)
109
+ _logger.warning("Checking config failed", exc_info=e)
101
110
  finally:
102
111
  self._waiting_indicator.setVisible(False)
103
112
  self._semaphore.release()
@@ -113,23 +122,24 @@ class SetupDialog(QDialog):
113
122
  self._panopto_url_box,
114
123
  self._canvas_api_key_box,
115
124
  ]:
125
+ self._status_bar.clearMessage()
116
126
  line_edit.setStyleSheet(None)
117
127
  line_edit.setToolTip(None)
118
128
 
119
- def _check_inputs(self) -> bool:
120
- had_error = False
129
+ def _all_inputs_valid(self) -> bool:
130
+ all_valid = True
121
131
 
122
132
  if not is_url(self._get_url(self._canvas_url_box)):
123
- had_error = True
133
+ all_valid = False
124
134
  self._show_error(self._canvas_url_box, "Canvas URL is invalid")
125
135
  if len(self._canvas_api_key_box.text().strip()) == 0:
126
- had_error = True
136
+ all_valid = False
127
137
  self._show_error(self._canvas_api_key_box, "Canvas API key is empty")
128
138
  if not is_url(self._get_url(self._panopto_url_box)):
129
- had_error = True
139
+ all_valid = False
130
140
  self._show_error(self._panopto_url_box, "Panopto URL is invalid")
131
141
 
132
- return had_error
142
+ return all_valid
133
143
 
134
144
  def _get_url(self, line_edit: QLineEdit) -> str:
135
145
  url = line_edit.text().strip()
@@ -172,8 +182,8 @@ class SetupDialog(QDialog):
172
182
  msg = QMessageBox(
173
183
  QMessageBox.Icon.Information,
174
184
  "Panopto Authentication",
175
- "In order for QCanvas to use panopto, you need to link your panopto account to your canvas account. "
176
- "A page will open in your web browser to do this when you click OK. It may ask you to sign into canvas.\n\n"
185
+ "In order for QCanvas to use Panopto, you need to link your Panopto account to your Canvas account. "
186
+ "A page will open in your web browser to do this when you click OK. It may ask you to sign into Canvas.\n\n"
177
187
  'Please tick "Remember my authorisation for this service" or QCanvas may not function correctly.\n\n'
178
188
  "QCanvas can't access anything entered in your browser.",
179
189
  QMessageBox.StandardButton.Ok,
@@ -1,13 +1,9 @@
1
1
  import logging
2
- from urllib.parse import urlparse
2
+
3
+ import validators
3
4
 
4
5
  _logger = logging.getLogger(__name__)
5
6
 
6
7
 
7
8
  def is_url(url: str) -> bool:
8
- # https://overflow.perennialte.ch/questions/7160737/how-to-validate-a-url-in-python-malformed-or-not#
9
- try:
10
- result = urlparse(url)
11
- return all([result.scheme, result.netloc])
12
- except ValueError:
13
- return False
9
+ return validators.url(url) == True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: qcanvas
3
- Version: 1.0.8
3
+ Version: 1.0.9.dev0
4
4
  Summary: QCanvas is a desktop client for Canvas LMS.
5
5
  Author: QCanvas
6
6
  Author-email: QCanvas@noreply.codeberg.org
@@ -15,9 +15,10 @@ Requires-Dist: platformdirs (>=4.2.2,<5.0.0)
15
15
  Requires-Dist: pyqtdarktheme-fork (>=2.3.2,<3.0.0)
16
16
  Requires-Dist: qasync (>=0.27.1,<0.28.0)
17
17
  Requires-Dist: qcanvas-api-clients (>=0.2.2,<0.3.0)
18
- Requires-Dist: qcanvas-backend (==0.1.10a4)
18
+ Requires-Dist: qcanvas-backend (==0.1.10a5)
19
19
  Requires-Dist: qtpy (>=2.4.1,<3.0.0)
20
20
  Requires-Dist: sqlalchemy (>=2.0.31,<3.0.0)
21
+ Requires-Dist: validators (>=0.33.0,<0.34.0)
21
22
  Description-Content-Type: text/markdown
22
23
 
23
24
  # QCanvas
@@ -12,23 +12,23 @@ qcanvas/icons/icons.qrc,sha256=czwaoP0TNXGoH91cstRbdhvKnfyLlmAp-VmaZoBk0YY,280
12
12
  qcanvas/icons/main_icon.svg,sha256=st2sfA8HIETmoacJ2Oq84iJzfnNHH-T03ijB-J419_s,16104
13
13
  qcanvas/icons/rc_icons.py,sha256=Ankeu0oWJk-1qLGVLxmiK5Kt1LVNyDmpR8jJZzOG5gQ,18194
14
14
  qcanvas/icons/sync.svg,sha256=J-7_KnFbQL3uh-RrTy0_wSJUVW4Cc6ZSTacld6ULv1w,2829
15
- qcanvas/run.py,sha256=pIN7ICOnr1yuBqLSY0QhqfiYtZgaLDTWmZHop919gnM,556
15
+ qcanvas/run.py,sha256=lZZPpdlQWbcSJnhY2i2zJ1xizhdy1j2EoV1BUYVXkfw,548
16
16
  qcanvas/ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  qcanvas/ui/course_viewer/__init__.py,sha256=XkoFnh4ULw3_i-GDsOlueEWido0PkoDcN9_EX6-nkXY,76
18
- qcanvas/ui/course_viewer/content_tree.py,sha256=1iNUqyedOlGDK5fru4c_q_hD7OT94KPlrazhi-QYCzI,3691
19
- qcanvas/ui/course_viewer/course_tree.py,sha256=sXTkNLKXsRIRFrUdEcqT4udZ_MUFaBWFgp0VtPpD1zg,2952
18
+ qcanvas/ui/course_viewer/content_tree.py,sha256=zHCAfgDl8TZfjee88C6XlK9KdSkqPfR5Tia34YEWPks,4023
19
+ qcanvas/ui/course_viewer/course_tree.py,sha256=OgUxC3y-3AEPyXr5vVmwJfaJNgEDtZtOHWIUJmUyu1Q,2792
20
20
  qcanvas/ui/course_viewer/course_viewer.py,sha256=t2RFzGIq_LM3yNNxY0bcNRg6Z0gFoA1iJPy6OSqvOYs,2457
21
21
  qcanvas/ui/course_viewer/tabs/__init__.py,sha256=SlfWUzk6_E5uM9GIV-y9BVeKMwqn3pRx_xWhMyb1dfI,54
22
22
  qcanvas/ui/course_viewer/tabs/assignment_tab/__init__.py,sha256=w936dW7za10Fh6rN0zVA-7Kyiup3kd6C-mPAFHtxmy0,42
23
- qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tab.py,sha256=dt9UtjxDwbmhsVP2dI1uaE2ovPdH7TynR0mkUnOP-so,5630
24
- qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py,sha256=1ElnIpwGRYTHPCyKz_uWQ-9jchplnFmozoa-Tg_q5vU,3413
25
- qcanvas/ui/course_viewer/tabs/content_tab.py,sha256=AALoqq6wcYWxKtTeu4a4arpNRlTPXekPQxEXOiFKivI,3231
23
+ qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tab.py,sha256=mgr01BL0TxBo5A1nhIzWuzcllRZfkk56djvEW-AmQKM,5321
24
+ qcanvas/ui/course_viewer/tabs/assignment_tab/assignment_tree.py,sha256=otRC1XPxA8a6LpPzOOgku-ES_1PXGTIbXXy8HKaiMEg,3156
25
+ qcanvas/ui/course_viewer/tabs/content_tab.py,sha256=LUV7tcHjiZRxgkMk_eKqLewESA11k20hyy8bRWhZ_VA,3560
26
26
  qcanvas/ui/course_viewer/tabs/mail_tab/__init__.py,sha256=68iRUUWEP7mudbaxa4ZBKMra4rvs2oZKaZkBWwmUrsI,30
27
- qcanvas/ui/course_viewer/tabs/mail_tab/mail_tab.py,sha256=6VwUyHa5IItHzaSikX-P8IqT_AFcvhLycUIcx-5BeO4,2126
28
- qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py,sha256=zoWz9iWxNhv9fGxpdXMrF6APvMwD9tyQbngTLJlTIhU,2151
27
+ qcanvas/ui/course_viewer/tabs/mail_tab/mail_tab.py,sha256=XydG_NMz55NomNcsA6_E4uJFWZMma4LfekuM9trat3s,1850
28
+ qcanvas/ui/course_viewer/tabs/mail_tab/mail_tree.py,sha256=bCK8AsgcOah2BaEMTzN-f3ZRasKJ0AdypvRSfDlti0A,1907
29
29
  qcanvas/ui/course_viewer/tabs/page_tab/__init__.py,sha256=lcafxlSEVZ0wqZySxT6hTrvExX-GU2AfcZQbp6W8haU,30
30
- qcanvas/ui/course_viewer/tabs/page_tab/page_tab.py,sha256=uWLiVjrccF-Xyit_BTfQ2GvytVuURidTIPKyJVCMSGw,1079
31
- qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py,sha256=N6sM73gRQMDEcQ4xPlwCtxIu73XDO_4ICcLWY5pdRbw,2580
30
+ qcanvas/ui/course_viewer/tabs/page_tab/page_tab.py,sha256=W5XeLGn62O2G1WvoE3WYzM5aGe0O0W2ASbIuL1NZ6XU,802
31
+ qcanvas/ui/course_viewer/tabs/page_tab/page_tree.py,sha256=RkD6dkKD4yVr0Efp5A9auhAPX7GFyHC2n7s0vcd03I0,2335
32
32
  qcanvas/ui/course_viewer/tabs/resource_rich_browser.py,sha256=422vPQF9afS_tLFqakMqk0qf-KR4N0gm9ytT5hVFF6I,6278
33
33
  qcanvas/ui/course_viewer/tabs/util.py,sha256=rUVEGSREV9vTFs4o3AD2OjaSFA-GPsmelxYWz0J8OP4,48
34
34
  qcanvas/ui/main_ui/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -38,14 +38,14 @@ qcanvas/ui/main_ui/options/quick_sync_option.py,sha256=qEfmtLllO32ejc-bydCvFRjal
38
38
  qcanvas/ui/main_ui/options/sync_on_start_option.py,sha256=zFFAAyGZEa6qBchJJIm7bJpOwxcntnto9Ee-lzCiHX4,731
39
39
  qcanvas/ui/main_ui/options/theme_selection_menu.py,sha256=P_Eqc5XTd0USqQo-QYCVRB5Dzi1j3o93S8JR8SAliC4,1285
40
40
  qcanvas/ui/main_ui/qcanvas_window.py,sha256=sgoLGTDjj6cLKhkQvqXJ8WdIDqs94WEcT2iyEoJSYiU,7556
41
- qcanvas/ui/main_ui/status_bar_progress_display.py,sha256=SVjPawDL79jLcgSfpxhCYr8qhbggWx3niYFdKhEocuo,4854
41
+ qcanvas/ui/main_ui/status_bar_progress_display.py,sha256=ExFRWY1SPDS2t8CBOx80TlOdENrxXGnuv7ht-DPcnwY,4836
42
42
  qcanvas/ui/memory_tree/__init__.py,sha256=-XLitM6teC0zmwPrGf-Q-A53-zgmIPASExdOtaLIvPU,107
43
43
  qcanvas/ui/memory_tree/_tree_memory.py,sha256=CMKfCnrHj22ervaq7xB5U4AiKijYvghUK5ZL0MJIFmQ,1805
44
44
  qcanvas/ui/memory_tree/memory_tree_widget.py,sha256=OT3TnYsUSbMowqR9my19QG4AuAdhTb29SGSa2406-SE,4432
45
45
  qcanvas/ui/memory_tree/memory_tree_widget_item.py,sha256=JXk07AzrKsBnYAqhayIFYAwMfF_D_EfkfJY4Qyez47U,425
46
46
  qcanvas/ui/setup/__init__.py,sha256=QWt2lEyLqWG5QC-BmCBlYyi0LZsBfsQYbP0XkvqA2f8,77
47
47
  qcanvas/ui/setup/setup_checker.py,sha256=ysQpkVLIWn8BR3hKhekuRIsHNAOU-jnHm061dfQ_OcY,396
48
- qcanvas/ui/setup/setup_dialog.py,sha256=BXoAznpO9dSwe2tVHFfdNzK33Llbg9GJSjnI9jbPzLk,7940
48
+ qcanvas/ui/setup/setup_dialog.py,sha256=HQTvIbB-T-DMf8-MIMxWWNNN6xdIW34jgAJtwjgki7U,8562
49
49
  qcanvas/util/__init__.py,sha256=RmC5zxGHoTLudrx9uol55fM5dvIkFjBCroQGYXaELCA,51
50
50
  qcanvas/util/basic_fonts.py,sha256=1NK5_kejgH45mENwiTWvE5oOuAvGqWMX3hg9tTUCBi4,243
51
51
  qcanvas/util/fe_resource_manager.py,sha256=5YO549oBpSgcthD9hxm8trnjHEfudltkh-SfqlOa9xA,808
@@ -60,8 +60,8 @@ qcanvas/util/settings/_mapped_setting.py,sha256=Z6635FfDll9cCLfSkVg-unsDLvUWuKT5
60
60
  qcanvas/util/settings/_ui_settings.py,sha256=tuzrIZ0H66pDA0hSlynuKXsk0w-MAPVU8qCxjdVjRAs,804
61
61
  qcanvas/util/themes.py,sha256=BE6lMf0lVE-0G_QYhK5emMdtKG4lUJw76HFX4go7R80,473
62
62
  qcanvas/util/ui_tools.py,sha256=bSM1xrmZPn847YEbXAC9VIAv--8hMLMWrsEMWGA5p3E,916
63
- qcanvas/util/url_checker.py,sha256=03jqnQ1_GOlCJyRHrlMbSQE9QsHrVNsg0kFsA8oKP60,361
64
- qcanvas-1.0.8.dist-info/METADATA,sha256=idTAr_anEVk1HPPxqZC1EPRdb7va-nnua9T9RYiyucE,1650
65
- qcanvas-1.0.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
66
- qcanvas-1.0.8.dist-info/entry_points.txt,sha256=46VbnhQ9w2CYdfhYcPfWgjXYHjsKshu0asQ1B_sAMac,44
67
- qcanvas-1.0.8.dist-info/RECORD,,
63
+ qcanvas/util/url_checker.py,sha256=gaV_KZZsG5bfJaGBv9jbHJjq0rVxIH55HRtucT6Qkx8,144
64
+ qcanvas-1.0.9.dev0.dist-info/METADATA,sha256=b0sw-1ncBh-eza8BGX5sNdtcwOOvbC_V2gi7kBK-vas,1700
65
+ qcanvas-1.0.9.dev0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
66
+ qcanvas-1.0.9.dev0.dist-info/entry_points.txt,sha256=46VbnhQ9w2CYdfhYcPfWgjXYHjsKshu0asQ1B_sAMac,44
67
+ qcanvas-1.0.9.dev0.dist-info/RECORD,,