11from leetcode .models import *
22
33class QuestionContent (QueryTemplate ):
4- def __init__ (self , titleSlug ):
4+ """ A class to represent a LeetCode problem content.
5+
6+ Args:
7+ title_slug (str): The title slug of the problem. """
8+
9+ def __init__ (self , title_slug ):
510 super ().__init__ ()
6- self .params = {'titleSlug' : titleSlug }
7- self .result = None
11+ # Instance-specific variables
12+ self ._title_slug = title_slug
13+ self ._data = None
14+ self ._params = {'titleSlug' : title_slug }
15+ self ._data_fetched : bool = False
16+
17+ self .question_panels : List [rich .panel .Panel ] = []
18+ self .fetch_data (self .title_slug )
819
9- self . execute ()
10- self . question_panels = LeetQuestionToSections ( self . result )
20+ def fetch_data ( self , title_slug : str = None ) -> Dict :
21+ """ Fetches the content data for the problem.
1122
12- def execute (self ):
13- self .graphql_query = GraphQLQuery (self .query , self .params )
14- self .result = self .leet_API .post_query (self .graphql_query )
15- if 'errors' in self .result :
16- console .print ("Cannot find the question with specified title slug. Please try again." , style = ALERT )
23+ Args:
24+ parameters (dict, optional): Parameters to pass to the query. Defaults to None.
25+
26+ Returns:
27+ Dict: The content data for the problem.
28+ """
29+ try :
30+ with Loader ('Fetching question details...' , '' ):
31+ parameters = self .params
32+ if title_slug is None :
33+ parameters = self .params
34+ elif title_slug != self .title_slug :
35+ self .title_slug = title_slug
36+ self .params = {'titleSlug' : title_slug }
37+ parameters = self .params
38+ if self .data_fetched :
39+ return self ._data
40+
41+ graphql_query = GraphQLQuery (self .query , parameters )
42+ response = self .leet_API .post_query (graphql_query )
43+ if response ['data' ]['question' ] is None :
44+ raise Exception ('There is no question with title slug: ' + title_slug )
45+ self .data = response ['data' ]['question' ]['content' ]
46+ self .data_fetched = True
47+ self .params = parameters
48+ return self .data
49+ except Exception as e :
50+ console .print (f"{ e .__class__ .__name__ } : { e } " , style = ALERT )
1751 sys .exit (1 )
18- else :
19- self .result = self .result ['data' ]['question' ]['content' ]
2052
2153 def show (self ):
22- for x in self .question_panels :
23- console .print (x )
54+ """ Displays the question panels for the current LeetCode question.
55+
56+ If the data has not been fetched yet, an exception is raised.
57+ """
58+ if self .data_fetched :
59+ self .question_panels = LeetQuestionToSections (self .data )
60+ for x in self .question_panels :
61+ console .print (x )
62+ else :
63+ raise Exception ("Data is not fetched yet." )
2464
2565 def __rich_console__ (self , console : Console , options ):
26- for x in self .question_panels :
27- yield x
66+ """ Renders the question content in a rich console.
67+
68+ If the data has been fetched, the question panels are generated using the LeetQuestionToSections function and yielded.
69+ If the data has not been fetched, an exception is raised.
70+
71+ Args:
72+ console (Console): The console to render the content in.
73+ options: Additional options for rendering the content.
74+
75+ Raises:
76+ Exception: If the data has not been fetched yet.
77+ """
78+ if self .data_fetched :
79+ self .question_panels = LeetQuestionToSections (self .data )
80+ for x in self .question_panels :
81+ yield x
82+ else :
83+ # raise exception that data is not fetched
84+ raise Exception ("Data is not fetched yet." )
85+
86+ @property
87+ def data (self ):
88+ return self ._data
89+
90+ @data .setter
91+ def data (self , data : dict ):
92+ if data is None :
93+ raise ValueError (f"Data for question with title slug '{ self .title_slug } ' is None." )
94+ self ._data = data
95+
96+ @property
97+ def params (self ):
98+ return self ._params
99+
100+ @params .setter
101+ def params (self , params : dict ):
102+ self ._params = params
103+
104+ @property
105+ def title_slug (self ):
106+ return self ._title_slug
107+
108+ @title_slug .setter
109+ def title_slug (self , title_slug : str ):
110+ self ._title_slug = title_slug
111+ self ._data_fetched = False
112+ self .params = {'titleSlug' : title_slug }
113+
114+ @property
115+ def data_fetched (self ):
116+ return self ._data_fetched
117+
118+ @data_fetched .setter
119+ def data_fetched (self , data_fetched : bool ):
120+ self ._data_fetched = data_fetched
121+
122+
123+ if __name__ == '__main__' :
124+ content = QuestionContent ('two-sumfsdf' )
125+ print (content )
126+ content .fetch_data ('add-two-integers' )
127+ print (content )
0 commit comments