22
33"""Provides generic methods for accessing version 1 of the API."""
44
5+ from collections .abc import Iterable
6+
57from .base import BaseApi
68
79class Api (BaseApi ):
@@ -27,7 +29,7 @@ def all_page_revisions(self, page_id):
2729 return self ._request ("page/{}/revisions" , page_id )
2830
2931 def page_revisions (self , page_id , * ,
30- limit , offset , direction ):
32+ limit = None , offset = None , direction = None ):
3133 data = {
3234 'limit' : 20 if limit is None else limit ,
3335 'offset' : 0 if offset is None else offset ,
@@ -60,15 +62,15 @@ def forum_threads(self, forum_id):
6062 return self ._request ("forum/{}/threads" , forum_id )
6163
6264 def forum_threads_since (self , forum_id , since , * ,
63- limit , offset , direction ):
64- if not isinstance (since , int ):
65- raise TypeError ("`since` must be a UNIX timestamp" )
65+ limit = None , offset = None , direction = None ):
6666 data = {
6767 'timestamp' : since ,
6868 'limit' : 20 if limit is None else limit ,
6969 'offset' : 0 if offset is None else offset ,
7070 'direction' : 'asc' if direction is None else direction ,
7171 }
72+ if not isinstance (since , int ):
73+ raise TypeError ("`since` must be a UNIX timestamp" )
7274 return self ._request ("forum/{}/since" , forum_id , data )
7375
7476 def thread (self , thread_id ):
@@ -78,7 +80,7 @@ def all_thread_posts(self, thread_id):
7880 return self ._request ("thread/{}/posts" , thread_id )
7981
8082 def thread_posts (self , thread_id , * ,
81- limit , offset , direction ):
83+ limit = None , offset = None , direction = None ):
8284 data = {
8385 'limit' : 20 if limit is None else limit ,
8486 'offset' : 0 if offset is None else offset ,
@@ -87,15 +89,15 @@ def thread_posts(self, thread_id, *,
8789 return self ._request ("thread/{}/posts" , thread_id , data )
8890
8991 def thread_posts_since (self , thread_id , since , * ,
90- limit , offset , direction ):
91- if not isinstance (since , int ):
92- raise TypeError ("`since` must be a UNIX timestamp" )
92+ limit = None , offset = None , direction = None ):
9393 data = {
9494 'timestamp' : since ,
9595 'limit' : 20 if limit is None else limit ,
9696 'offset' : 0 if offset is None else offset ,
9797 'direction' : 'asc' if direction is None else direction ,
9898 }
99+ if not isinstance (since , int ):
100+ raise TypeError ("`since` must be a UNIX timestamp" )
99101 return self ._request ("thread/{}/since" , thread_id , data )
100102
101103 def post (self , post_id ):
@@ -108,30 +110,62 @@ def post_parent(self, post_id):
108110 return self ._request ("post/{}/parent" , post_id )
109111
110112 def wikidotuser (self , wikidotuser_id ):
111- if not isinstance (wikidotuser_id , int ):
112- raise TypeError ("The Wikidot user ID must be an int" )
113- return self ._request ("wikidotuser/{}" , wikidotuser_id ) # TODO typecheck
113+ if isinstance (wikidotuser_id , int ):
114+ return self ._request ("wikidotuser/{}" , wikidotuser_id )
114115 return self ._request ("wikidotuser/username/{}" , wikidotuser_id )
115116
116117 def wikidotuser_avatar (self , wikidotuser_id ):
117118 if not isinstance (wikidotuser_id , int ):
118119 raise TypeError ("The Wikidot user ID must be an int" )
119120 return self ._request ("wikidotuser/{}/avatar" , wikidotuser_id )
120121
121- def wikidotuser_pages (self , wikidotuser_id ):
122+ def all_wikidotuser_pages (self , wikidotuser_id ):
123+ if not isinstance (wikidotuser_id , int ):
124+ raise TypeError ("The Wikidot user ID must be an int" )
125+ return self ._request ("wikidotuser/{}/pages" , wikidotuser_id )
126+
127+ def wikidotuser_pages (self , wikidotuser_id , * ,
128+ limit = None , offset = None , direction = None ):
129+ data = {
130+ 'limit' : 20 if limit is None else limit ,
131+ 'offset' : 0 if offset is None else offset ,
132+ 'direction' : 'asc' if direction is None else direction ,
133+ }
134+ if not isinstance (wikidotuser_id , int ):
135+ raise TypeError ("The Wikidot user ID must be an int" )
136+ return self ._request ("wikidotuser/{}/pages" , wikidotuser_id , data )
137+
138+ def all_wikidotuser_posts (self , wikidotuser_id ):
122139 if not isinstance (wikidotuser_id , int ):
123140 raise TypeError ("The Wikidot user ID must be an int" )
124- return self ._request ("wikidotuser/{}/pages " , wikidotuser_id ) # TODO POST
141+ return self ._request ("wikidotuser/{}/posts " , wikidotuser_id )
125142
126- def wikidotuser_posts (self , wikidotuser_id ):
143+ def wikidotuser_posts (self , wikidotuser_id , * ,
144+ limit = None , offset = None , direction = None ):
145+ data = {
146+ 'limit' : 20 if limit is None else limit ,
147+ 'offset' : 0 if offset is None else offset ,
148+ 'direction' : 'asc' if direction is None else direction ,
149+ }
127150 if not isinstance (wikidotuser_id , int ):
128151 raise TypeError ("The Wikidot user ID must be an int" )
129- return self ._request ("wikidotuser/{}/posts" , wikidotuser_id ) # TODO POST
152+ return self ._request ("wikidotuser/{}/posts" , wikidotuser_id , data )
130153
131- def wikidotuser_revisions (self , wikidotuser_id ):
154+ def all_wikidotuser_revisions (self , wikidotuser_id ):
132155 if not isinstance (wikidotuser_id , int ):
133156 raise TypeError ("The Wikidot user ID must be an int" )
134- return self ._request ("wikidotuser/{}/revisions" , wikidotuser_id ) # TODO POST
157+ return self ._request ("wikidotuser/{}/revisions" , wikidotuser_id )
158+
159+ def wikidotuser_revisions (self , wikidotuser_id , * ,
160+ limit = None , offset = None , direction = None ):
161+ data = {
162+ 'limit' : 20 if limit is None else limit ,
163+ 'offset' : 0 if offset is None else offset ,
164+ 'direction' : 'asc' if direction is None else direction ,
165+ }
166+ if not isinstance (wikidotuser_id , int ):
167+ raise TypeError ("The Wikidot user ID must be an int" )
168+ return self ._request ("wikidotuser/{}/revisions" , wikidotuser_id , data )
135169
136170 def wikidotuser_votes (self , wikidotuser_id ):
137171 if not isinstance (wikidotuser_id , int ):
@@ -141,7 +175,39 @@ def wikidotuser_votes(self, wikidotuser_id):
141175 def tags (self ):
142176 return self ._request ("tag" )
143177
144- def tag (self , tag_name ):
145- return self ._request ("tag/{}/pages" , tag_name ) # TODO allow POST and ids and stuff
146-
147-
178+ def tag_pages (self , tags ):
179+ """
180+ str `tags`: One tag, finds page IDs with that tag.
181+ """
182+ if not isinstance (tags , str ):
183+ raise TypeError ("A single tag must be a string" )
184+ return self ._request ("tag/{}/pages" , tags )
185+
186+ def tags_pages (self , tags , operator = 'and' , * ,
187+ limit = None , offset = None , direction = None ):
188+ """
189+ str[] `tags`: A list of tags, finds all page IDs that match the
190+ condition.
191+ int[] `tags`: A list of SCUTTLE tag IDs, finds all page IDs that match
192+ the condition.
193+ str `operator`: 'and' or 'or'; defines the condition when specifying
194+ multiple tags.
195+ """
196+ if isinstance (tags , str ):
197+ raise TypeError ("tags must be str[] or int[]; use tag_pages()"
198+ "for single tags" )
199+ if not isinstance (tags , Iterable ):
200+ raise TypeError ("tags must be a list of str or int" )
201+ data = {
202+ 'operator' : operator ,
203+ 'limit' : 20 if limit is None else limit ,
204+ 'offset' : 0 if offset is None else offset ,
205+ 'direction' : 'asc' if direction is None else direction ,
206+ }
207+ if all (isinstance (tag , str ) for tag in tags ):
208+ data .update ({'names' : tags })
209+ return self ._request ("tag/pages" , None , data )
210+ if all (isinstance (tag , int ) for tag in tags ):
211+ data .update ({'ids' : tags })
212+ return self ._request ("tag/pages" , None , data )
213+ raise TypeError ("tags must be a list of str or int" )
0 commit comments