worktoy 1.0.1.dev1__tar.gz → 1.1.0.dev1__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 (257) hide show
  1. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/PKG-INFO +15 -11
  2. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/README.md +13 -10
  3. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/pyproject.toml +5 -9
  4. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/__init__.py +10 -1
  5. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/core/__init__.py +4 -1
  6. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/core/_instance_owner.py +23 -12
  7. worktoy-1.1.0.dev1/src/worktoy/core/_meta_type.py +410 -0
  8. worktoy-1.1.0.dev1/src/worktoy/core/_object.py +1068 -0
  9. worktoy-1.1.0.dev1/src/worktoy/core/control_flow/__init__.py +38 -0
  10. worktoy-1.1.0.dev1/src/worktoy/core/control_flow/_control_flow.py +23 -0
  11. worktoy-1.1.0.dev1/src/worktoy/core/control_flow/_control_space.py +96 -0
  12. {worktoy-1.0.1.dev1/src/worktoy/waitaminute → worktoy-1.1.0.dev1/src/worktoy/core}/control_flow/_meta_flow.py +28 -10
  13. worktoy-1.1.0.dev1/src/worktoy/core/control_flow/_skip_set.py +28 -0
  14. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/core/sentinels/__init__.py +15 -1
  15. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_args.py +189 -0
  16. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_deleted.py +30 -0
  17. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/core/sentinels/_desc.py +8 -4
  18. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_meta_call.py +27 -0
  19. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_owner.py +27 -0
  20. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_sentinel.py +200 -0
  21. worktoy-1.1.0.dev1/src/worktoy/core/sentinels/_this.py +467 -0
  22. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/desc/__init__.py +12 -0
  23. worktoy-1.1.0.dev1/src/worktoy/desc/_alias.py +212 -0
  24. worktoy-1.1.0.dev1/src/worktoy/desc/_attri_box.py +698 -0
  25. worktoy-1.1.0.dev1/src/worktoy/desc/_base_descriptor.py +707 -0
  26. worktoy-1.1.0.dev1/src/worktoy/desc/_fast_box.py +481 -0
  27. worktoy-1.1.0.dev1/src/worktoy/desc/_field.py +306 -0
  28. worktoy-1.1.0.dev1/src/worktoy/desc/_fix_box.py +93 -0
  29. worktoy-1.1.0.dev1/src/worktoy/desc/_root_alias.py +132 -0
  30. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/desc/_symbolic_name.py +63 -20
  31. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/dispatch/__init__.py +4 -3
  32. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/dispatch/_call_me_maybe.py +114 -66
  33. worktoy-1.1.0.dev1/src/worktoy/dispatch/_dispatcher.py +1473 -0
  34. worktoy-1.1.0.dev1/src/worktoy/dispatch/_flex_call.py +155 -0
  35. worktoy-1.1.0.dev1/src/worktoy/dispatch/_overload.py +774 -0
  36. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/dispatch/_permuter.py +81 -48
  37. worktoy-1.1.0.dev1/src/worktoy/dispatch/_permuter_method.py +62 -0
  38. worktoy-1.1.0.dev1/src/worktoy/dispatch/_type_sig.py +451 -0
  39. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/__init__.py +6 -5
  40. worktoy-1.1.0.dev1/src/worktoy/ezdata/_ez_data.py +98 -0
  41. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_ez_field.py +163 -30
  42. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_ez_hook.py +505 -215
  43. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_ez_meta.py +49 -13
  44. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_ez_space.py +46 -9
  45. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_ez_store.py +23 -15
  46. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/ezdata/_fields.py +1 -1
  47. worktoy-1.1.0.dev1/src/worktoy/keenum/_kee_box.py +164 -0
  48. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_flag.py +15 -18
  49. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_flags.py +110 -46
  50. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_flags_hook.py +13 -11
  51. worktoy-1.1.0.dev1/src/worktoy/keenum/_kee_flags_meta.py +337 -0
  52. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_flags_space.py +67 -18
  53. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_member.py +41 -23
  54. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_meta.py +205 -86
  55. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_meta_meta.py +19 -9
  56. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_num.py +64 -23
  57. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_kee_space.py +61 -24
  58. worktoy-1.1.0.dev1/src/worktoy/keenum/_kee_space_hook.py +61 -0
  59. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/__init__.py +2 -1
  60. worktoy-1.1.0.dev1/src/worktoy/lorem_ipsum/_base_generator.py +166 -0
  61. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/_clause.py +77 -58
  62. worktoy-1.1.0.dev1/src/worktoy/lorem_ipsum/_gaussian_lengths.py +70 -0
  63. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/_paragraph.py +58 -19
  64. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/_sentence.py +70 -20
  65. worktoy-1.1.0.dev1/src/worktoy/lorem_ipsum/_stochastic_variable.py +231 -0
  66. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/_stochastic_word.py +72 -61
  67. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/mcls/__init__.py +13 -7
  68. worktoy-1.1.0.dev1/src/worktoy/mcls/_abstract_metaclass.py +555 -0
  69. worktoy-1.1.0.dev1/src/worktoy/mcls/_abstract_namespace.py +616 -0
  70. worktoy-1.1.0.dev1/src/worktoy/mcls/_base_meta.py +37 -0
  71. worktoy-1.1.0.dev1/src/worktoy/mcls/_base_object.py +51 -0
  72. worktoy-1.1.0.dev1/src/worktoy/mcls/_base_space.py +890 -0
  73. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/mcls/space_hooks/__init__.py +2 -1
  74. worktoy-1.1.0.dev1/src/worktoy/mcls/space_hooks/_abstract_space_hook.py +283 -0
  75. worktoy-1.1.0.dev1/src/worktoy/mcls/space_hooks/_flex_call_hook.py +38 -0
  76. worktoy-1.1.0.dev1/src/worktoy/mcls/space_hooks/_load_space_hook.py +228 -0
  77. worktoy-1.1.0.dev1/src/worktoy/mcls/space_hooks/_name_hook.py +382 -0
  78. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/mcls/space_hooks/_reserved_names.py +10 -3
  79. worktoy-1.1.0.dev1/src/worktoy/mcls/space_hooks/_reserved_namespace_hook.py +53 -0
  80. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/mcls/space_hooks/_space_desc.py +10 -4
  81. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/__init__.py +14 -7
  82. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_args_count.py +1 -1
  83. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_bipartite_matching.py +8 -4
  84. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_directory.py +19 -4
  85. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_exception_info.py +8 -1
  86. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_join_words.py +5 -5
  87. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_maybe.py +1 -1
  88. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_quick_desc.py +21 -21
  89. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_replace_flex.py +8 -0
  90. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_resolve_mro.py +1 -1
  91. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_text_fmt.py +6 -2
  92. worktoy-1.1.0.dev1/src/worktoy/utilities/_type_cast.py +266 -0
  93. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_unpack.py +39 -8
  94. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_valid_slice.py +1 -1
  95. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_word_wrap.py +1 -1
  96. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/combinatorics/_arrangement.py +12 -6
  97. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/combinatorics/_arrangements.py +2 -2
  98. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/combinatorics/_index_permutations.py +12 -8
  99. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/__init__.py +13 -4
  100. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/_missing_variable.py +18 -10
  101. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/_subclass_exception.py +13 -12
  102. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/_type_exception.py +6 -3
  103. worktoy-1.1.0.dev1/src/worktoy/waitaminute/_uncheckable_type.py +81 -0
  104. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/_unpack_exception.py +7 -6
  105. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/_variable_not_none.py +2 -1
  106. worktoy-1.1.0.dev1/src/worktoy/waitaminute/_work_toy_exception.py +25 -0
  107. worktoy-1.1.0.dev1/src/worktoy/waitaminute/control_flow/__init__.py +43 -0
  108. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/__init__.py +51 -0
  109. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_access_error.py +3 -2
  110. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_dangling_alias.py +80 -0
  111. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_descriptor_exception.py +47 -0
  112. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_missing_instance_dict.py +59 -0
  113. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_nameless_callback.py +67 -0
  114. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_not_a_descriptor.py +68 -0
  115. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_overload_reference.py +55 -0
  116. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_phantom_box_error.py +12 -7
  117. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_protected_error.py +8 -6
  118. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_read_only_error.py +9 -6
  119. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_recursive_read.py +63 -0
  120. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_reference_conflict.py +64 -0
  121. worktoy-1.1.0.dev1/src/worktoy/waitaminute/desc/_shared_descriptor.py +90 -0
  122. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_without_exception.py +10 -9
  123. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/desc/_write_once_error.py +3 -2
  124. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/dispatch/__init__.py +10 -0
  125. worktoy-1.1.0.dev1/src/worktoy/waitaminute/dispatch/_bare_overload.py +60 -0
  126. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/dispatch/_dispatch_exception.py +28 -11
  127. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/dispatch/_duplicate_signature.py +19 -7
  128. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/dispatch/_type_cast_exception.py +4 -2
  129. worktoy-1.1.0.dev1/src/worktoy/waitaminute/dispatch/_unbound_cast_hook.py +63 -0
  130. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/__init__.py +6 -0
  131. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/_class_field_error.py +11 -6
  132. worktoy-1.1.0.dev1/src/worktoy/waitaminute/ezdata/_duplicate_error.py +48 -0
  133. worktoy-1.1.0.dev1/src/worktoy/waitaminute/ezdata/_extra_keyword_exception.py +48 -0
  134. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/_extra_positional_exception.py +12 -7
  135. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/_incomplete_field_exception.py +8 -3
  136. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/_kw_only_exception.py +6 -4
  137. worktoy-1.1.0.dev1/src/worktoy/waitaminute/ezdata/_repeated_field_exception.py +42 -0
  138. worktoy-1.1.0.dev1/src/worktoy/waitaminute/ezdata/_reserved_attribute_error.py +61 -0
  139. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/ezdata/_reserved_field_error.py +18 -14
  140. worktoy-1.1.0.dev1/src/worktoy/waitaminute/ezdata/_reserved_method_error.py +62 -0
  141. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/__init__.py +2 -0
  142. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_box_exception.py +4 -2
  143. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_box_type_error.py +4 -2
  144. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_box_value_error.py +3 -1
  145. worktoy-1.1.0.dev1/src/worktoy/waitaminute/keenum/_kee_case_exception.py +36 -0
  146. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_duplicate.py +3 -2
  147. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_flag_duplicate.py +3 -2
  148. worktoy-1.1.0.dev1/src/worktoy/waitaminute/keenum/_kee_flag_name_error.py +51 -0
  149. worktoy-1.1.0.dev1/src/worktoy/waitaminute/keenum/_kee_member_name_error.py +56 -0
  150. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_name_conflict.py +5 -4
  151. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_resolve_error.py +7 -4
  152. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_type_exception.py +4 -2
  153. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/keenum/_kee_write_once_error.py +4 -2
  154. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/__init__.py +48 -0
  155. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_claimed_name.py +53 -0
  156. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_control_class_error.py +54 -0
  157. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_del_exception.py +14 -12
  158. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_duplicate_hook.py +2 -1
  159. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_duplicate_sentinel.py +71 -0
  160. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_hook_exception.py +8 -6
  161. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_illegal_instantiation.py +5 -4
  162. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_mixed_method_kind.py +83 -0
  163. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_overload_conflict.py +63 -0
  164. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_questionable_syntax.py +4 -1
  165. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_rebound_overload.py +58 -0
  166. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/waitaminute/meta/_reserved_name.py +7 -4
  167. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_shadowed_class_hook.py +77 -0
  168. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_slots_refused.py +51 -0
  169. worktoy-1.1.0.dev1/src/worktoy/waitaminute/meta/_unbound_class_hook.py +76 -0
  170. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/work_test/__init__.py +1 -1
  171. worktoy-1.1.0.dev1/src/worktoy/work_test/_base_test.py +227 -0
  172. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/work_test/_complex_mixin.py +48 -21
  173. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/work_test/_complex_test.py +71 -17
  174. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/work_test/_sub_test.py +73 -23
  175. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/work_test/samplers/__init__.py +11 -1
  176. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_base_sampler.py +336 -0
  177. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_float_sampler.py +78 -0
  178. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_gaussian_sampler.py +128 -0
  179. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_int_sampler.py +140 -0
  180. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_lorem_sampler.py +66 -0
  181. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_lorem_text.py +102 -0
  182. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_sampler_meta.py +31 -0
  183. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_symbolic_sampler.py +84 -0
  184. worktoy-1.1.0.dev1/src/worktoy/work_test/samplers/_word_sampler.py +33 -0
  185. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy.egg-info/PKG-INFO +15 -11
  186. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy.egg-info/SOURCES.txt +34 -6
  187. worktoy-1.1.0.dev1/tests/test_smoke.py +19 -0
  188. worktoy-1.0.1.dev1/src/worktoy/core/_meta_type.py +0 -39
  189. worktoy-1.0.1.dev1/src/worktoy/core/_object.py +0 -528
  190. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_args.py +0 -78
  191. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_deleted.py +0 -25
  192. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_meta_call.py +0 -18
  193. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_owner.py +0 -20
  194. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_sentinel.py +0 -111
  195. worktoy-1.0.1.dev1/src/worktoy/core/sentinels/_this.py +0 -25
  196. worktoy-1.0.1.dev1/src/worktoy/desc/_alias.py +0 -87
  197. worktoy-1.0.1.dev1/src/worktoy/desc/_attri_box.py +0 -609
  198. worktoy-1.0.1.dev1/src/worktoy/desc/_base_descriptor.py +0 -273
  199. worktoy-1.0.1.dev1/src/worktoy/desc/_fast_box.py +0 -163
  200. worktoy-1.0.1.dev1/src/worktoy/desc/_field.py +0 -239
  201. worktoy-1.0.1.dev1/src/worktoy/desc/_fix_box.py +0 -60
  202. worktoy-1.0.1.dev1/src/worktoy/dispatch/_dispatcher.py +0 -769
  203. worktoy-1.0.1.dev1/src/worktoy/dispatch/_flex_call.py +0 -161
  204. worktoy-1.0.1.dev1/src/worktoy/dispatch/_overload.py +0 -403
  205. worktoy-1.0.1.dev1/src/worktoy/dispatch/_permuter_method.py +0 -47
  206. worktoy-1.0.1.dev1/src/worktoy/dispatch/_type_sig.py +0 -296
  207. worktoy-1.0.1.dev1/src/worktoy/ezdata/_ez_data.py +0 -79
  208. worktoy-1.0.1.dev1/src/worktoy/keenum/_kee_box.py +0 -202
  209. worktoy-1.0.1.dev1/src/worktoy/keenum/_kee_flags_meta.py +0 -268
  210. worktoy-1.0.1.dev1/src/worktoy/keenum/_kee_space_hook.py +0 -45
  211. worktoy-1.0.1.dev1/src/worktoy/lorem_ipsum/_base_generator.py +0 -103
  212. worktoy-1.0.1.dev1/src/worktoy/lorem_ipsum/_gaussian_lengths.py +0 -98
  213. worktoy-1.0.1.dev1/src/worktoy/lorem_ipsum/_stochastic_variable.py +0 -258
  214. worktoy-1.0.1.dev1/src/worktoy/mcls/_abstract_metaclass.py +0 -349
  215. worktoy-1.0.1.dev1/src/worktoy/mcls/_abstract_namespace.py +0 -357
  216. worktoy-1.0.1.dev1/src/worktoy/mcls/_base_meta.py +0 -47
  217. worktoy-1.0.1.dev1/src/worktoy/mcls/_base_object.py +0 -25
  218. worktoy-1.0.1.dev1/src/worktoy/mcls/_base_space.py +0 -466
  219. worktoy-1.0.1.dev1/src/worktoy/mcls/space_hooks/_abstract_space_hook.py +0 -186
  220. worktoy-1.0.1.dev1/src/worktoy/mcls/space_hooks/_flex_call_hook.py +0 -53
  221. worktoy-1.0.1.dev1/src/worktoy/mcls/space_hooks/_load_space_hook.py +0 -125
  222. worktoy-1.0.1.dev1/src/worktoy/mcls/space_hooks/_name_hook.py +0 -228
  223. worktoy-1.0.1.dev1/src/worktoy/mcls/space_hooks/_reserved_namespace_hook.py +0 -97
  224. worktoy-1.0.1.dev1/src/worktoy/utilities/_type_cast.py +0 -233
  225. worktoy-1.0.1.dev1/src/worktoy/waitaminute/control_flow/__init__.py +0 -21
  226. worktoy-1.0.1.dev1/src/worktoy/waitaminute/control_flow/_control_class_error.py +0 -47
  227. worktoy-1.0.1.dev1/src/worktoy/waitaminute/control_flow/_control_flow.py +0 -14
  228. worktoy-1.0.1.dev1/src/worktoy/waitaminute/control_flow/_control_space.py +0 -65
  229. worktoy-1.0.1.dev1/src/worktoy/waitaminute/control_flow/_skip_set.py +0 -26
  230. worktoy-1.0.1.dev1/src/worktoy/waitaminute/desc/__init__.py +0 -30
  231. worktoy-1.0.1.dev1/src/worktoy/waitaminute/desc/_descriptor_exception.py +0 -19
  232. worktoy-1.0.1.dev1/src/worktoy/waitaminute/ezdata/_duplicate_error.py +0 -37
  233. worktoy-1.0.1.dev1/src/worktoy/waitaminute/ezdata/_reserved_method_error.py +0 -50
  234. worktoy-1.0.1.dev1/src/worktoy/waitaminute/keenum/_kee_case_exception.py +0 -32
  235. worktoy-1.0.1.dev1/src/worktoy/waitaminute/keenum/_kee_flag_name_error.py +0 -44
  236. worktoy-1.0.1.dev1/src/worktoy/waitaminute/meta/__init__.py +0 -27
  237. worktoy-1.0.1.dev1/src/worktoy/waitaminute/meta/_unbound_class_hook.py +0 -45
  238. worktoy-1.0.1.dev1/src/worktoy/work_test/_base_test.py +0 -190
  239. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_base_sampler.py +0 -248
  240. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_float_sampler.py +0 -131
  241. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_gaussian_sampler.py +0 -192
  242. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_int_sampler.py +0 -179
  243. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_lorem_sampler.py +0 -80
  244. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_symbolic_sampler.py +0 -112
  245. worktoy-1.0.1.dev1/src/worktoy/work_test/samplers/_word_sampler.py +0 -53
  246. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/LICENSE +0 -0
  247. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/setup.cfg +0 -0
  248. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/__init__.py +0 -0
  249. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/keenum/_access_num.py +0 -0
  250. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/lorem_ipsum/_words.py +0 -0
  251. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/py.typed +0 -0
  252. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_class_body_template.py +0 -0
  253. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_slice_len.py +0 -0
  254. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/_string_list.py +0 -0
  255. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy/utilities/combinatorics/__init__.py +0 -0
  256. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy.egg-info/dependency_links.txt +0 -0
  257. {worktoy-1.0.1.dev1 → worktoy-1.1.0.dev1}/src/worktoy.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: worktoy
3
- Version: 1.0.1.dev1
3
+ Version: 1.1.0.dev1
4
4
  Summary: Declarative structure for Python that enforces types at runtime and enables true function overloading
5
5
  Author-email: Asger Jon Vistisen <asgerjon2@gmail.com>
6
6
  License: Apache-2.0
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Programming Language :: Python :: 3.15
17
18
  Classifier: Programming Language :: Python :: Implementation :: CPython
18
19
  Classifier: License :: OSI Approved :: Apache Software License
19
20
  Classifier: Operating System :: OS Independent
@@ -32,12 +33,12 @@ Dynamic: license-file
32
33
  [![PyPI version](https://img.shields.io/pypi/v/worktoy)](https://pypi.org/project/worktoy/)
33
34
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
34
35
 
35
- # worktoy v1.0.1-dev1 (development build)
36
+ # worktoy v1.1.0-dev1 (development build)
36
37
 
37
38
  **worktoy** provides utilities for Python development focused on
38
39
  reducing boilerplate while improving type safety and readability. Each
39
40
  release is tested thoroughly on each supported Python version from 3.7*
40
- to 3.14.
41
+ to 3.15.
41
42
 
42
43
  *Maybe it is time to consider updating if you are still using Python 3.7.
43
44
 
@@ -108,13 +109,15 @@ Attributes are declared explicitly at the class level. Despite this,
108
109
  flexibility remains, for example:
109
110
 
110
111
  ```python
111
- point = Point(69, '420') # int, str
112
+ point = Point(69, 420) # int, int
112
113
  point.x == 69.0
113
114
  point.y == 420.0
114
115
  ```
115
116
 
116
- When types do not match, `AttriBox` attempts casting before raising an
117
- error. Same ergonomics. Stronger guarantees.
117
+ When types do not match, `AttriBox` converts what converts without loss,
118
+ as an `int` to a `float`, and refuses the rest: `Point(69, '420')` raises
119
+ `TypeException`, since no string is ever parsed. Same ergonomics. Stronger
120
+ guarantees.
118
121
 
119
122
  Note that `Point` above is a plain class: both `AttriBox` and `Field`
120
123
  are ordinary descriptors and work on any class. The `BaseObject` base
@@ -168,7 +171,7 @@ from worktoy.core.sentinels import THIS
168
171
  from worktoy.dispatch import overload
169
172
  from worktoy.desc import AttriBox
170
173
 
171
- if TYPE_CHECKING: # pragma: no cover
174
+ if TYPE_CHECKING: # pragma: no cover, no mutate
172
175
  from typing import Self
173
176
 
174
177
 
@@ -316,10 +319,11 @@ class Point:
316
319
  def __init__(self, *args, ) -> None: ... # Implementation as before
317
320
  ```
318
321
 
319
- Both improve clarity. But in both cases `Point.x` and `Point.y` will raise
320
- `AttributeError`. The presence of `x` and `y` becomes visible only after
321
- instantiation. At this point, they are just attributes of the instance, not
322
- of the class. Setting during `__init__` makes no difference compared to
322
+ Both improve clarity, but neither makes `x` and `y` part of the class.
323
+ With annotations alone, `Point.x` raises `AttributeError`; with
324
+ `__slots__`, `Point.x` is a bare slot that knows nothing of the type.
325
+ Either way the values appear only once `__init__` sets them, as attributes
326
+ of the instance, and setting them there makes no difference compared to
323
327
  setting them anywhere else. Structure remains implicit.
324
328
 
325
329
  With **worktoy** attributes are an essential part of the class structure
@@ -4,12 +4,12 @@
4
4
  [![PyPI version](https://img.shields.io/pypi/v/worktoy)](https://pypi.org/project/worktoy/)
5
5
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
6
6
 
7
- # worktoy v1.0.1-dev1 (development build)
7
+ # worktoy v1.1.0-dev1 (development build)
8
8
 
9
9
  **worktoy** provides utilities for Python development focused on
10
10
  reducing boilerplate while improving type safety and readability. Each
11
11
  release is tested thoroughly on each supported Python version from 3.7*
12
- to 3.14.
12
+ to 3.15.
13
13
 
14
14
  *Maybe it is time to consider updating if you are still using Python 3.7.
15
15
 
@@ -80,13 +80,15 @@ Attributes are declared explicitly at the class level. Despite this,
80
80
  flexibility remains, for example:
81
81
 
82
82
  ```python
83
- point = Point(69, '420') # int, str
83
+ point = Point(69, 420) # int, int
84
84
  point.x == 69.0
85
85
  point.y == 420.0
86
86
  ```
87
87
 
88
- When types do not match, `AttriBox` attempts casting before raising an
89
- error. Same ergonomics. Stronger guarantees.
88
+ When types do not match, `AttriBox` converts what converts without loss,
89
+ as an `int` to a `float`, and refuses the rest: `Point(69, '420')` raises
90
+ `TypeException`, since no string is ever parsed. Same ergonomics. Stronger
91
+ guarantees.
90
92
 
91
93
  Note that `Point` above is a plain class: both `AttriBox` and `Field`
92
94
  are ordinary descriptors and work on any class. The `BaseObject` base
@@ -140,7 +142,7 @@ from worktoy.core.sentinels import THIS
140
142
  from worktoy.dispatch import overload
141
143
  from worktoy.desc import AttriBox
142
144
 
143
- if TYPE_CHECKING: # pragma: no cover
145
+ if TYPE_CHECKING: # pragma: no cover, no mutate
144
146
  from typing import Self
145
147
 
146
148
 
@@ -288,10 +290,11 @@ class Point:
288
290
  def __init__(self, *args, ) -> None: ... # Implementation as before
289
291
  ```
290
292
 
291
- Both improve clarity. But in both cases `Point.x` and `Point.y` will raise
292
- `AttributeError`. The presence of `x` and `y` becomes visible only after
293
- instantiation. At this point, they are just attributes of the instance, not
294
- of the class. Setting during `__init__` makes no difference compared to
293
+ Both improve clarity, but neither makes `x` and `y` part of the class.
294
+ With annotations alone, `Point.x` raises `AttributeError`; with
295
+ `__slots__`, `Point.x` is a bare slot that knows nothing of the type.
296
+ Either way the values appear only once `__init__` sets them, as attributes
297
+ of the instance, and setting them there makes no difference compared to
295
298
  setting them anywhere else. Structure remains implicit.
296
299
 
297
300
  With **worktoy** attributes are an essential part of the class structure
@@ -5,7 +5,7 @@ build-backend = 'setuptools.build_meta'
5
5
 
6
6
  [project]
7
7
  name = "worktoy"
8
- version = "1.0.1-dev1"
8
+ version = "1.1.0-dev1"
9
9
  authors = [
10
10
  { name = "Asger Jon Vistisen", email = "asgerjon2@gmail.com" },
11
11
  ]
@@ -22,6 +22,7 @@ classifiers = [
22
22
  'Programming Language :: Python :: 3.12',
23
23
  'Programming Language :: Python :: 3.13',
24
24
  'Programming Language :: Python :: 3.14',
25
+ 'Programming Language :: Python :: 3.15',
25
26
  "Programming Language :: Python :: Implementation :: CPython",
26
27
  "License :: OSI Approved :: Apache Software License",
27
28
  "Operating System :: OS Independent",
@@ -40,9 +41,11 @@ test = [
40
41
  'pytest>=9.0.2',
41
42
  'pytest-cov>=7.0.0',
42
43
  ]
44
+ # The same packages as docs/requirements.txt. markwork brings Pygments.
43
45
  docs = [
44
46
  'sphinx>=7.0.0',
45
- 'pygments>=2.19.2',
47
+ 'furo>=2024.1',
48
+ 'markwork>=0.1.0',
46
49
  ]
47
50
  dev = [
48
51
  'icecream>=2.1.8',
@@ -54,13 +57,6 @@ dev = [
54
57
  [tool.setuptools.package-data]
55
58
  worktoy = ["py.typed"]
56
59
 
57
- [tool.coverage.run]
58
- omit = [
59
- # Pre-PEP 634 fallback. Unreachable on 3.14 where coverage
60
- # runs; exercised by unittest on <3.10.
61
- "tests/test_ezdata/_match_args_legacy_helpers.py",
62
- ]
63
-
64
60
  # pytest configuration lives here rather than in a root 'pytest.ini' so
65
61
  # the repository root stays uncluttered. pytest auto-discovers this
66
62
  # table, so no '-c' flag is needed locally or in CI.
@@ -34,12 +34,21 @@ chain.
34
34
  descriptors.
35
35
  - work_test: Testing support, providing 'BaseTest' and the random-data
36
36
  samplers used across the test suite.
37
+
38
+ Nested classes: 'worktoy' is designed around custom metaclasses and the
39
+ class statements they build, not around classes nested in the body of
40
+ another class. A nested class may well work, but some edge cases are not
41
+ supported. One example is a nested class with the same base as the
42
+ enclosing class: a 'THIS[Parent]' reference in the enclosing body places
43
+ its clone on the next subclass created of the class holding the
44
+ descriptor, 'Parent' or a base of it, which is then the nested class,
45
+ and the enclosing class is left without the decoration.
37
46
  """
38
47
  # Apache-2.0 license
39
48
  # Copyright (c) 2025-2026 Asger Jon Vistisen
40
49
  from __future__ import annotations
41
50
 
42
- __version__ = '1.0.1-dev1'
51
+ __version__ = '1.1.0-dev1'
43
52
 
44
53
  from . import utilities
45
54
  from . import waitaminute
@@ -6,18 +6,21 @@ metaclass framework and the descriptor layer build on.
6
6
  - Object
7
7
  - ContextInstance, ContextOwner
8
8
  - sentinels
9
+ - control_flow
9
10
  """
10
11
  # Apache-2.0 license
11
12
  # Copyright (c) 2025-2026 Asger Jon Vistisen
12
13
  from __future__ import annotations
13
14
 
15
+ from ._meta_type import MetaType
14
16
  from . import sentinels
17
+ from . import control_flow
15
18
  from ._instance_owner import ContextInstance, ContextOwner
16
- from ._meta_type import MetaType
17
19
  from ._object import Object
18
20
 
19
21
  __all__ = [
20
22
  'sentinels',
23
+ 'control_flow',
21
24
  'ContextInstance',
22
25
  'ContextOwner',
23
26
  'MetaType',
@@ -8,17 +8,24 @@ from __future__ import annotations
8
8
 
9
9
  from typing import TYPE_CHECKING
10
10
 
11
- if TYPE_CHECKING: # pragma: no cover
11
+ if TYPE_CHECKING: # pragma: no cover, no mutate
12
12
  from typing import Any
13
13
 
14
14
 
15
15
  class ContextInstance:
16
- """Descriptor that returns the currently active instance.
17
-
18
- When accessed on a class, returns the descriptor itself. When
19
- accessed on an 'Object' instance, returns the top-of-stack
20
- instance via 'Object.getContextInstance'. Raises
21
- 'WithoutException' if no context frame is active.
16
+ """
17
+ Inside the hooks of a descriptor based on 'Object', 'self.instance'
18
+ must give the instance of the access in progress, the object the
19
+ attribute is read from, written to or deleted from. The same name read
20
+ through the class must give something harmless, and the descriptor
21
+ machinery must never depend on it, since a subclass may shadow it.
22
+
23
+ Implementation
24
+ --------------
25
+
26
+ Through the class, the descriptor returns itself. Through an 'Object',
27
+ it returns 'getContextInstance()', which reads the top frame of the
28
+ context stack, and fails outside an access as that method describes.
22
29
  """
23
30
 
24
31
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -32,12 +39,16 @@ class ContextInstance:
32
39
 
33
40
 
34
41
  class ContextOwner:
35
- """Descriptor that returns the currently active owner class.
42
+ """
43
+ Inside the hooks of a descriptor based on 'Object', 'self.owner' must
44
+ give the owning class of the access in progress.
45
+
46
+ Implementation
47
+ --------------
36
48
 
37
- When accessed on a class, returns the descriptor itself. When
38
- accessed on an 'Object' instance, returns the top-of-stack owner
39
- via 'Object.getContextOwner'. Raises 'WithoutException' if no
40
- context frame is active.
49
+ Through the class, the descriptor returns itself. Through an 'Object',
50
+ it returns 'getContextOwner()', which reads the top frame of the
51
+ context stack, and fails outside an access as that method describes.
41
52
  """
42
53
 
43
54
  # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #