pycascadeui 3.3.0__tar.gz → 3.3.1__tar.gz

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.
Files changed (135) hide show
  1. {pycascadeui-3.3.0/pycascadeui.egg-info → pycascadeui-3.3.1}/PKG-INFO +1 -1
  2. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/__init__.py +1 -1
  3. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/selects.py +14 -4
  4. {pycascadeui-3.3.0 → pycascadeui-3.3.1/pycascadeui.egg-info}/PKG-INFO +1 -1
  5. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/pyproject.toml +1 -1
  6. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_selects.py +37 -0
  7. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/LICENSE +0 -0
  8. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/README.md +0 -0
  9. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/__main__.py +0 -0
  10. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/__init__.py +0 -0
  11. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/base.py +0 -0
  12. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/buttons.py +0 -0
  13. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/inputs.py +0 -0
  14. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/patterns/__init__.py +0 -0
  15. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/patterns/v1.py +0 -0
  16. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/patterns/v2.py +0 -0
  17. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/types.py +0 -0
  18. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/v1_composition.py +0 -0
  19. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/components/wrappers.py +0 -0
  20. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/devtools.py +0 -0
  21. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/exceptions.py +0 -0
  22. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/__init__.py +0 -0
  23. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/backends/__init__.py +0 -0
  24. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/backends/memory.py +0 -0
  25. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/backends/postgres.py +0 -0
  26. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/backends/sqlite.py +0 -0
  27. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/config.py +0 -0
  28. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/manager.py +0 -0
  29. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/migrations.py +0 -0
  30. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/protocols.py +0 -0
  31. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/schema.py +0 -0
  32. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/persistence/schema_postgres.py +0 -0
  33. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/py.typed +0 -0
  34. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/setup.py +0 -0
  35. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/__init__.py +0 -0
  36. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/actions.py +0 -0
  37. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/computed.py +0 -0
  38. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/middleware/__init__.py +0 -0
  39. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/middleware/logging.py +0 -0
  40. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/middleware/persistence.py +0 -0
  41. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/middleware/undo.py +0 -0
  42. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/reducers.py +0 -0
  43. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/singleton.py +0 -0
  44. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/slots.py +0 -0
  45. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/store.py +0 -0
  46. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/state/types.py +0 -0
  47. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/theming/__init__.py +0 -0
  48. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/theming/context.py +0 -0
  49. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/theming/core.py +0 -0
  50. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/theming/themes.py +0 -0
  51. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/tracing.py +0 -0
  52. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/__init__.py +0 -0
  53. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/coercion.py +0 -0
  54. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/decorators.py +0 -0
  55. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/errors.py +0 -0
  56. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/fetch.py +0 -0
  57. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/logging.py +0 -0
  58. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/strings.py +0 -0
  59. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/utils/tasks.py +0 -0
  60. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/validation.py +0 -0
  61. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/__init__.py +0 -0
  62. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/_interaction.py +0 -0
  63. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/_navigation.py +0 -0
  64. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/_placement.py +0 -0
  65. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/base.py +0 -0
  66. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/layout.py +0 -0
  67. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/__init__.py +0 -0
  68. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/form.py +0 -0
  69. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/leaderboard.py +0 -0
  70. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/menu.py +0 -0
  71. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/paginated.py +0 -0
  72. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/roles.py +0 -0
  73. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/tabs.py +0 -0
  74. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/types.py +0 -0
  75. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/patterns/wizard.py +0 -0
  76. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/persistent.py +0 -0
  77. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/cascadeui/views/view.py +0 -0
  78. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/pycascadeui.egg-info/SOURCES.txt +0 -0
  79. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/pycascadeui.egg-info/dependency_links.txt +0 -0
  80. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/pycascadeui.egg-info/requires.txt +0 -0
  81. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/pycascadeui.egg-info/top_level.txt +0 -0
  82. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/setup.cfg +0 -0
  83. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_auto_defer.py +0 -0
  84. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_backends.py +0 -0
  85. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_backends_postgres.py +0 -0
  86. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_backends_raw_sql.py +0 -0
  87. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_batching.py +0 -0
  88. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_button_grid.py +0 -0
  89. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_components.py +0 -0
  90. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_computed.py +0 -0
  91. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_devtools.py +0 -0
  92. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_dynamic_persistent_button.py +0 -0
  93. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_emoji_grid.py +0 -0
  94. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_ephemeral_refresh.py +0 -0
  95. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_fetch.py +0 -0
  96. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_five_pillars.py +0 -0
  97. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_form_patterns.py +0 -0
  98. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_hooks.py +0 -0
  99. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_input_coercion.py +0 -0
  100. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_inputs.py +0 -0
  101. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_instance_limit.py +0 -0
  102. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_layout_pagination.py +0 -0
  103. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_layout_patterns.py +0 -0
  104. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_layout_persistent.py +0 -0
  105. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_layout_view.py +0 -0
  106. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_leaderboard_patterns.py +0 -0
  107. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_menu_patterns.py +0 -0
  108. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_message_cleanup.py +0 -0
  109. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_middleware.py +0 -0
  110. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_nav_version.py +0 -0
  111. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_navigation.py +0 -0
  112. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_navigation_artifact_restore.py +0 -0
  113. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_owner_only.py +0 -0
  114. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_paginated_patterns.py +0 -0
  115. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_pagination.py +0 -0
  116. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_persistence.py +0 -0
  117. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_persistence_middleware.py +0 -0
  118. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_persistent_views.py +0 -0
  119. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_pillar_isolation.py +0 -0
  120. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_placement.py +0 -0
  121. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_rebuild_callback.py +0 -0
  122. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_reducers.py +0 -0
  123. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_roles_patterns.py +0 -0
  124. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_scoping.py +0 -0
  125. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_state_slots.py +0 -0
  126. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_state_store.py +0 -0
  127. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_tab_patterns.py +0 -0
  128. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_theming.py +0 -0
  129. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_undo.py +0 -0
  130. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_update_coalescing.py +0 -0
  131. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_v2_helpers.py +0 -0
  132. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_validation.py +0 -0
  133. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_view_init.py +0 -0
  134. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_wizard_patterns.py +0 -0
  135. {pycascadeui-3.3.0 → pycascadeui-3.3.1}/tests/test_wrappers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycascadeui
3
- Version: 3.3.0
3
+ Version: 3.3.1
4
4
  Summary: Redux-inspired UI framework for discord.py
5
5
  Author-email: HollowTheSilver <hollow@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -132,7 +132,7 @@ if "SQLiteBackend" in _persistence_all:
132
132
  # // ========================================( Script )======================================== // #
133
133
 
134
134
 
135
- __version__ = "3.3.0"
135
+ __version__ = "3.3.1"
136
136
 
137
137
  # Export public API
138
138
  __all__ = [
@@ -37,7 +37,12 @@ def _wrap_default_values(
37
37
  out.append(value)
38
38
  continue
39
39
  snowflake_id = coerce_snowflake_id(value)
40
- out.append(discord.SelectDefaultValue(id=snowflake_id, type=default_type))
40
+ # SelectDefaultValue stores type verbatim; a bare string breaks to_dict().
41
+ out.append(
42
+ discord.SelectDefaultValue(
43
+ id=snowflake_id, type=discord.SelectDefaultValueType[default_type]
44
+ )
45
+ )
41
46
  return out
42
47
 
43
48
 
@@ -63,15 +68,20 @@ def _wrap_mentionable_defaults(
63
68
  if isinstance(value, discord.SelectDefaultValue):
64
69
  out.append(value)
65
70
  elif isinstance(value, discord.Role):
66
- out.append(discord.SelectDefaultValue(id=value.id, type="role"))
71
+ out.append(
72
+ discord.SelectDefaultValue(id=value.id, type=discord.SelectDefaultValueType.role)
73
+ )
67
74
  elif isinstance(value, (discord.Member, discord.User)):
68
- out.append(discord.SelectDefaultValue(id=value.id, type="user"))
75
+ out.append(
76
+ discord.SelectDefaultValue(id=value.id, type=discord.SelectDefaultValueType.user)
77
+ )
69
78
  else:
70
79
  raise TypeError(
71
80
  f"MentionableSelect default values must be Member, User, Role, "
72
81
  f"or SelectDefaultValue (got {type(value).__name__}: {value!r}). "
73
82
  f"Raw int IDs cannot be auto-typed; construct "
74
- f"discord.SelectDefaultValue(id=..., type='user' or 'role') "
83
+ f"discord.SelectDefaultValue(id=..., "
84
+ f"type=discord.SelectDefaultValueType.user or .role) "
75
85
  f"explicitly for those."
76
86
  )
77
87
  return out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycascadeui
3
- Version: 3.3.0
3
+ Version: 3.3.1
4
4
  Summary: Redux-inspired UI framework for discord.py
5
5
  Author-email: HollowTheSilver <hollow@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "pycascadeui"
7
- version = "3.3.0"
7
+ version = "3.3.1"
8
8
  description = "Redux-inspired UI framework for discord.py"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -224,3 +224,40 @@ class TestMentionableSelect:
224
224
  existing = discord.SelectDefaultValue(id=999, type="user")
225
225
  select = MentionableSelect(default_values=[existing])
226
226
  assert _ids_and_types(select.default_values) == [(999, "user")]
227
+
228
+
229
+ # // ========================================( Serialization )======================================== // #
230
+
231
+
232
+ class TestDefaultValueSerialization:
233
+ """default_values survive to_component_dict() on discord.py 2.7.
234
+
235
+ SelectDefaultValue.to_dict() reads ``self._type.value``, so a bare string
236
+ type passed at construction raises AttributeError at serialization time.
237
+ The _ids_and_types assertions above never reach serialization, so these
238
+ tests drive to_component_dict() directly to exercise the enum coercion.
239
+ """
240
+
241
+ @pytest.mark.parametrize(
242
+ "select_cls, type_name",
243
+ [(RoleSelect, "role"), (UserSelect, "user"), (ChannelSelect, "channel")],
244
+ )
245
+ def test_typed_select_serializes_raw_int_defaults(self, select_cls, type_name):
246
+ select = select_cls(default_values=[111, 222])
247
+ payload = select.to_component_dict()
248
+ assert payload["default_values"] == [
249
+ {"id": 111, "type": type_name},
250
+ {"id": 222, "type": type_name},
251
+ ]
252
+
253
+ def test_mentionable_serializes_inferred_defaults(self):
254
+ member = MagicMock(spec=discord.Member)
255
+ member.id = 300
256
+ role = MagicMock(spec=discord.Role)
257
+ role.id = 400
258
+ select = MentionableSelect(default_values=[member, role])
259
+ payload = select.to_component_dict()
260
+ assert payload["default_values"] == [
261
+ {"id": 300, "type": "user"},
262
+ {"id": 400, "type": "role"},
263
+ ]
File without changes
File without changes
File without changes