dnd5e-engine 0.3.0__tar.gz → 0.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 (142) hide show
  1. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/PKG-INFO +2 -2
  2. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/pyproject.toml +1 -1
  3. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/__init__.py +3 -1
  4. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/lib_loader.py +9 -0
  5. dnd5e_engine-0.3.1/tests/test_lib_loader_configure.py +20 -0
  6. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_public_api_surface.py +1 -0
  7. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/.gitignore +0 -0
  8. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/CHANGELOG.md +0 -0
  9. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/LICENSE +0 -0
  10. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/Makefile +0 -0
  11. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/NOTICE +0 -0
  12. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/README.md +0 -0
  13. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/scripts/_smoke_grid_combat.py +0 -0
  14. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/scripts/smoke_clean_install.sh +0 -0
  15. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/__init__.py +0 -0
  16. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/apply.py +0 -0
  17. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/attack.py +0 -0
  18. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/build_context.py +0 -0
  19. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/cast.py +0 -0
  20. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/check.py +0 -0
  21. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/context.py +0 -0
  22. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/damage.py +0 -0
  23. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/dice.py +0 -0
  24. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/effects.py +0 -0
  25. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/formula.py +0 -0
  26. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/heal.py +0 -0
  27. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/mastery.py +0 -0
  28. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/monster_actions.py +0 -0
  29. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/passive_stats.py +0 -0
  30. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/resolver.py +0 -0
  31. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/save.py +0 -0
  32. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/save_primitive.py +0 -0
  33. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/activities/scale.py +0 -0
  34. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/build_party.py +0 -0
  35. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/build_spec.py +0 -0
  36. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/check.py +0 -0
  37. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/death_saves.py +0 -0
  38. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/dispatch.py +0 -0
  39. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/event_dicts.py +0 -0
  40. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/events.py +0 -0
  41. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/orchestrator.py +0 -0
  42. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/outcome.py +0 -0
  43. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/py.typed +0 -0
  44. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rest.py +0 -0
  45. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/results.py +0 -0
  46. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/__init__.py +0 -0
  47. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/_class_meta.py +0 -0
  48. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/_parsing.py +0 -0
  49. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/combat.py +0 -0
  50. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/combat_data.py +0 -0
  51. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/combat_helpers.py +0 -0
  52. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/conditions.py +0 -0
  53. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/dice.py +0 -0
  54. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/effects.py +0 -0
  55. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/equipment.py +0 -0
  56. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/gambits.py +0 -0
  57. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/resolution.py +0 -0
  58. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/skills.py +0 -0
  59. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/rules/spells.py +0 -0
  60. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/spatial.py +0 -0
  61. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/specs.py +0 -0
  62. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/testing.py +0 -0
  63. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/__init__.py +0 -0
  64. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/combat.py +0 -0
  65. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/conditions.py +0 -0
  66. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/dice.py +0 -0
  67. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/effects.py +0 -0
  68. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/types/intent.py +0 -0
  69. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/src/dnd5e_engine/views.py +0 -0
  70. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/__init__.py +0 -0
  71. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/activities/__init__.py +0 -0
  72. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/activities/test_build_context.py +0 -0
  73. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/activities/test_cast_level_override.py +0 -0
  74. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/activities/test_monster_actions.py +0 -0
  75. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/__init__.py +0 -0
  76. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/conftest.py +0 -0
  77. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/harness.py +0 -0
  78. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c00_harness_sanity.py +0 -0
  79. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c01_dataset_fixes.py +0 -0
  80. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c02_small_mechanics.py +0 -0
  81. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c03_effect_modes.py +0 -0
  82. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c04_caster_plumbing.py +0 -0
  83. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c05_spatial.py +0 -0
  84. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c06_reactions.py +0 -0
  85. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c07_sneak_and_repertoire.py +0 -0
  86. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c08_passive_projection.py +0 -0
  87. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c09_rest.py +0 -0
  88. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c10_monster_behavior.py +0 -0
  89. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/e2e/test_c11_item_charges.py +0 -0
  90. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_active_effect_resistance_fold.py +0 -0
  91. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_active_effect_schema.py +0 -0
  92. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_apply_changes_to_check.py +0 -0
  93. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_apply_modifiers.py +0 -0
  94. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_build_context_abilities.py +0 -0
  95. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_build_party.py +0 -0
  96. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_build_party_passives.py +0 -0
  97. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_combat_bucket_keys.py +0 -0
  98. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_combat_flag_advantage.py +0 -0
  99. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_concentration_drop_effect_name.py +0 -0
  100. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_concentration_repeat_save_identity.py +0 -0
  101. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_cover_bonus_sidecar.py +0 -0
  102. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_coverage_backfill_death_saves.py +0 -0
  103. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_coverage_backfill_seam_errors.py +0 -0
  104. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_duration_tick_at_turn_end.py +0 -0
  105. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_effects_builder_internals.py +0 -0
  106. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_enchantment_sidecar_projection.py +0 -0
  107. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_end_combat_snapshot.py +0 -0
  108. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_expire_clears_active_conditions.py +0 -0
  109. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_feature_save_dc_no_spell_override.py +0 -0
  110. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_get_actor_active_effects.py +0 -0
  111. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_grid_topology.py +0 -0
  112. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_iter11_fixes.py +0 -0
  113. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_iter13_fixes.py +0 -0
  114. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_iter5_fixes.py +0 -0
  115. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_lib_loader.py +0 -0
  116. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_live_combat_view.py +0 -0
  117. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_monster_dash.py +0 -0
  118. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_monster_flee_retreat.py +0 -0
  119. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_gating_typed.py +0 -0
  120. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_grid_combat.py +0 -0
  121. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_item_charges.py +0 -0
  122. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_monster_typed.py +0 -0
  123. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_move_mark_typed.py +0 -0
  124. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_orchestrator_pc_resolution_typed.py +0 -0
  125. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_party_member_reach_ft.py +0 -0
  126. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_passive_stats.py +0 -0
  127. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_phase6_public_surface.py +0 -0
  128. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_rage_second_wind_e2e.py +0 -0
  129. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_reaction_queue.py +0 -0
  130. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_resolve_check.py +0 -0
  131. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_resolve_check_flag_advantage.py +0 -0
  132. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_resolve_check_specific_buckets.py +0 -0
  133. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_rest.py +0 -0
  134. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_rules_smoke.py +0 -0
  135. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_scale_resolver.py +0 -0
  136. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_smoke.py +0 -0
  137. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_sneak_attack_resolver.py +0 -0
  138. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_start_combat_active_effects.py +0 -0
  139. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_start_combat_seeds_lifecycle.py +0 -0
  140. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_types_smoke.py +0 -0
  141. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_use_feature_intent.py +0 -0
  142. {dnd5e_engine-0.3.0 → dnd5e_engine-0.3.1}/tests/test_weapon_damage_bonus_sidecar.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: dnd5e-engine
3
- Version: 0.3.0
3
+ Version: 0.3.1
4
4
  Summary: Pure-Python D&D 5e SRD rules engine — combat, checks, effects. Host-agnostic, zero I/O.
5
5
  Author: Tapestria contributors
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dnd5e-engine"
7
- version = "0.3.0"
7
+ version = "0.3.1"
8
8
  description = "Pure-Python D&D 5e SRD rules engine — combat, checks, effects. Host-agnostic, zero I/O."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -13,7 +13,7 @@ Deferred for later phases:
13
13
 
14
14
  from __future__ import annotations
15
15
 
16
- __version__ = "0.2.0"
16
+ __version__ = "0.3.1"
17
17
 
18
18
  from dnd5e_engine.build_party import build_party_member
19
19
  from dnd5e_engine.build_spec import (
@@ -24,6 +24,7 @@ from dnd5e_engine.build_spec import (
24
24
  )
25
25
  from dnd5e_engine.check import CheckKind, CheckResult, CheckSpec, resolve_check
26
26
  from dnd5e_engine.events import CombatEvent, IntentType
27
+ from dnd5e_engine.lib_loader import configure_lib_loader
27
28
  from dnd5e_engine.orchestrator import (
28
29
  CombatHandle,
29
30
  LiveCombatView,
@@ -101,6 +102,7 @@ __all__ = [
101
102
  "advance_monster_turn",
102
103
  "build_party_member",
103
104
  "cell_id",
105
+ "configure_lib_loader",
104
106
  "end_combat",
105
107
  "get_actor_active_effects",
106
108
  "get_live",
@@ -25,7 +25,16 @@ def set_lib_loader_for_tests(loader: AssetLoader | None) -> None:
25
25
  _LIB_LOADER = loader
26
26
 
27
27
 
28
+ def configure_lib_loader(loader: AssetLoader | None) -> None:
29
+ """Public host seam: install a custom AssetLoader (e.g. a homebrew
30
+ overlay). ``None`` reverts to the lazy bundled default. Hosts must
31
+ call this before start_combat; swapping mid-combat is unsupported."""
32
+ global _LIB_LOADER
33
+ _LIB_LOADER = loader
34
+
35
+
28
36
  __all__ = [
37
+ "configure_lib_loader",
29
38
  "get_lib_loader",
30
39
  "set_lib_loader_for_tests",
31
40
  ]
@@ -0,0 +1,20 @@
1
+ """configure_lib_loader — public host seam for AssetLoader injection."""
2
+
3
+ from dnd5e_srd_data.loader import BundledAssetLoader, MemoryAssetLoader
4
+
5
+ import dnd5e_engine
6
+ from dnd5e_engine.lib_loader import get_lib_loader
7
+
8
+
9
+ def test_configure_lib_loader_is_public() -> None:
10
+ assert "configure_lib_loader" in dnd5e_engine.__all__
11
+
12
+
13
+ def test_configure_installs_and_none_reverts() -> None:
14
+ custom = MemoryAssetLoader()
15
+ try:
16
+ dnd5e_engine.configure_lib_loader(custom)
17
+ assert get_lib_loader() is custom
18
+ finally:
19
+ dnd5e_engine.configure_lib_loader(None)
20
+ assert isinstance(get_lib_loader(), BundledAssetLoader)
@@ -35,6 +35,7 @@ TOP_LEVEL = {
35
35
  "advance_monster_turn",
36
36
  "build_party_member",
37
37
  "cell_id",
38
+ "configure_lib_loader",
38
39
  "end_combat",
39
40
  "get_actor_active_effects",
40
41
  "get_live",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes