elspais 0.11.0__py3-none-any.whl → 0.11.2__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.
Files changed (53) hide show
  1. elspais/__init__.py +1 -1
  2. elspais/cli.py +75 -23
  3. elspais/commands/analyze.py +5 -6
  4. elspais/commands/changed.py +2 -6
  5. elspais/commands/config_cmd.py +4 -4
  6. elspais/commands/edit.py +32 -36
  7. elspais/commands/hash_cmd.py +24 -18
  8. elspais/commands/index.py +8 -7
  9. elspais/commands/init.py +4 -4
  10. elspais/commands/reformat_cmd.py +32 -43
  11. elspais/commands/rules_cmd.py +6 -2
  12. elspais/commands/trace.py +23 -19
  13. elspais/commands/validate.py +8 -10
  14. elspais/config/defaults.py +7 -1
  15. elspais/core/content_rules.py +0 -1
  16. elspais/core/git.py +4 -10
  17. elspais/core/parser.py +55 -56
  18. elspais/core/patterns.py +2 -6
  19. elspais/core/rules.py +10 -15
  20. elspais/mcp/__init__.py +2 -0
  21. elspais/mcp/context.py +1 -0
  22. elspais/mcp/serializers.py +1 -1
  23. elspais/mcp/server.py +54 -39
  24. elspais/reformat/__init__.py +13 -13
  25. elspais/reformat/detector.py +9 -16
  26. elspais/reformat/hierarchy.py +8 -7
  27. elspais/reformat/line_breaks.py +36 -38
  28. elspais/reformat/prompts.py +22 -12
  29. elspais/reformat/transformer.py +43 -41
  30. elspais/sponsors/__init__.py +0 -2
  31. elspais/testing/__init__.py +1 -1
  32. elspais/testing/result_parser.py +25 -21
  33. elspais/trace_view/__init__.py +4 -3
  34. elspais/trace_view/coverage.py +5 -5
  35. elspais/trace_view/generators/__init__.py +1 -1
  36. elspais/trace_view/generators/base.py +17 -12
  37. elspais/trace_view/generators/csv.py +2 -6
  38. elspais/trace_view/generators/markdown.py +3 -8
  39. elspais/trace_view/html/__init__.py +4 -2
  40. elspais/trace_view/html/generator.py +423 -289
  41. elspais/trace_view/models.py +25 -0
  42. elspais/trace_view/review/__init__.py +21 -18
  43. elspais/trace_view/review/branches.py +114 -121
  44. elspais/trace_view/review/models.py +232 -237
  45. elspais/trace_view/review/position.py +53 -71
  46. elspais/trace_view/review/server.py +264 -288
  47. elspais/trace_view/review/status.py +43 -58
  48. elspais/trace_view/review/storage.py +48 -72
  49. {elspais-0.11.0.dist-info → elspais-0.11.2.dist-info}/METADATA +12 -9
  50. {elspais-0.11.0.dist-info → elspais-0.11.2.dist-info}/RECORD +53 -53
  51. {elspais-0.11.0.dist-info → elspais-0.11.2.dist-info}/WHEEL +0 -0
  52. {elspais-0.11.0.dist-info → elspais-0.11.2.dist-info}/entry_points.txt +0 -0
  53. {elspais-0.11.0.dist-info → elspais-0.11.2.dist-info}/licenses/LICENSE +0 -0
@@ -135,6 +135,31 @@ class TraceViewRequirement:
135
135
  def conflict_with(self) -> str:
136
136
  return self.core.conflict_with
137
137
 
138
+ @property
139
+ def is_cycle(self) -> bool:
140
+ """Check if requirement is part of a circular dependency.
141
+
142
+ Note: Cycle detection happens during validation. This property
143
+ defaults to False unless explicitly set via cycle_info.
144
+ """
145
+ return getattr(self, "_is_cycle", False)
146
+
147
+ @is_cycle.setter
148
+ def is_cycle(self, value: bool) -> None:
149
+ self._is_cycle = value
150
+
151
+ @property
152
+ def cycle_path(self) -> str:
153
+ """Get the cycle path if this requirement is part of a cycle.
154
+
155
+ Returns empty string if not in a cycle.
156
+ """
157
+ return getattr(self, "_cycle_path", "")
158
+
159
+ @cycle_path.setter
160
+ def cycle_path(self, value: str) -> None:
161
+ self._cycle_path = value
162
+
138
163
  @property
139
164
  def subdir(self) -> str:
140
165
  return self.core.subdir
@@ -5,9 +5,27 @@ elspais.trace_view.review - Collaborative review system.
5
5
  Requires: pip install elspais[trace-review]
6
6
  """
7
7
 
8
+ # Models are always available (no flask dependency)
9
+ from elspais.trace_view.review.models import (
10
+ Approval,
11
+ ApprovalDecision,
12
+ Comment,
13
+ CommentPosition,
14
+ PositionType,
15
+ RequestState,
16
+ ReviewConfig,
17
+ ReviewFlag,
18
+ ReviewPackage,
19
+ ReviewSession,
20
+ StatusRequest,
21
+ Thread,
22
+ )
23
+
24
+
8
25
  def _check_flask():
9
26
  try:
10
27
  import flask # noqa: F401
28
+
11
29
  return True
12
30
  except ImportError:
13
31
  return False
@@ -15,22 +33,6 @@ def _check_flask():
15
33
 
16
34
  FLASK_AVAILABLE = _check_flask()
17
35
 
18
- # Models are always available (no flask dependency)
19
- from elspais.trace_view.review.models import (
20
- Comment,
21
- CommentPosition,
22
- Thread,
23
- ReviewFlag,
24
- StatusRequest,
25
- Approval,
26
- ReviewSession,
27
- ReviewConfig,
28
- ReviewPackage,
29
- PositionType,
30
- RequestState,
31
- ApprovalDecision,
32
- )
33
-
34
36
  __all__ = [
35
37
  "FLASK_AVAILABLE",
36
38
  # Models (always available)
@@ -50,11 +52,12 @@ __all__ = [
50
52
 
51
53
  if FLASK_AVAILABLE:
52
54
  from elspais.trace_view.review.server import create_app
55
+
53
56
  __all__.append("create_app")
54
57
  else:
58
+
55
59
  def create_app(*args, **kwargs):
56
60
  """Placeholder when flask is not installed."""
57
61
  raise ImportError(
58
- "Review server requires Flask. "
59
- "Install with: pip install elspais[trace-review]"
62
+ "Review server requires Flask. " "Install with: pip install elspais[trace-review]"
60
63
  )