MCPcopy Create free account
hub / github.com/AutoForgeAI/autoforge / Feature

Class Feature

api/database.py:41–86  ·  view source on GitHub ↗

Feature model representing a test case/feature to implement.

Source from the content-addressed store, hash-verified

39
40
41class Feature(Base):
42 """Feature model representing a test case/feature to implement."""
43
44 __tablename__ = "features"
45
46 # Composite index for common status query pattern (passes, in_progress)
47 # Used by feature_get_stats, get_ready_features, and other status queries
48 __table_args__ = (
49 Index('ix_feature_status', 'passes', 'in_progress'),
50 )
51
52 id = Column(Integer, primary_key=True, index=True)
53 priority = Column(Integer, nullable=False, default=999, index=True)
54 category = Column(String(100), nullable=False)
55 name = Column(String(255), nullable=False)
56 description = Column(Text, nullable=False)
57 steps = Column(JSON, nullable=False) # Stored as JSON array
58 passes = Column(Boolean, nullable=False, default=False, index=True)
59 in_progress = Column(Boolean, nullable=False, default=False, index=True)
60 # Dependencies: list of feature IDs that must be completed before this feature
61 # NULL/empty = no dependencies (backwards compatible)
62 dependencies = Column(JSON, nullable=True, default=None)
63
64 def to_dict(self) -> dict:
65 """Convert feature to dictionary for JSON serialization."""
66 return {
67 "id": self.id,
68 "priority": self.priority,
69 "category": self.category,
70 "name": self.name,
71 "description": self.description,
72 "steps": self.steps,
73 # Handle legacy NULL values gracefully - treat as False
74 "passes": self.passes if self.passes is not None else False,
75 "in_progress": self.in_progress if self.in_progress is not None else False,
76 # Dependencies: NULL/empty treated as empty list for backwards compat
77 "dependencies": self.dependencies if self.dependencies else [],
78 }
79
80 def get_dependencies_safe(self) -> list[int]:
81 """Safely extract dependencies, handling NULL and malformed data."""
82 if self.dependencies is None:
83 return []
84 if isinstance(self.dependencies, list):
85 return [d for d in self.dependencies if isinstance(d, int)]
86 return []
87
88
89class Schedule(Base):

Callers 5

feature_create_bulkFunction · 0.90
feature_createFunction · 0.90
migrate_json_to_sqliteFunction · 0.90
create_featureFunction · 0.90
create_features_bulkFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected