mirror of
				https://github.com/LonamiWebs/Telethon.git
				synced 2025-11-04 09:57:29 +03:00 
			
		
		
		
	Generate simple examples for the docs
This commit is contained in:
		
							parent
							
								
									8f04ec820f
								
							
						
					
					
						commit
						477fbd8dc7
					
				| 
						 | 
					@ -59,8 +59,8 @@ users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User></pre>
 | 
				
			||||||
    <p>This is <b>not</b> Python code. It's the "TL definition". It's
 | 
					    <p>This is <b>not</b> Python code. It's the "TL definition". It's
 | 
				
			||||||
    an easy-to-read line that gives a quick overview on the parameters
 | 
					    an easy-to-read line that gives a quick overview on the parameters
 | 
				
			||||||
    and its result. You don't need to worry about this. See
 | 
					    and its result. You don't need to worry about this. See
 | 
				
			||||||
    <a href="http://telethon.readthedocs.io/en/latest/extra/developing/understanding-the-type-language.html">here</a>
 | 
					    <a href="https://telethon.readthedocs.io/en/latest/extra/developing/understanding-the-type-language.html">Understanding
 | 
				
			||||||
    for more details on it.</p>
 | 
					    the Type Language</a> for more details on it.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h3>Index</h3>
 | 
					    <h3>Index</h3>
 | 
				
			||||||
    <ul>
 | 
					    <ul>
 | 
				
			||||||
| 
						 | 
					@ -82,7 +82,7 @@ users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User></pre>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h3 id="methods">Methods</h3>
 | 
					    <h3 id="methods">Methods</h3>
 | 
				
			||||||
    <p>Currently there are <b>{method_count} methods</b> available for the layer
 | 
					    <p>Currently there are <b>{method_count} methods</b> available for the layer
 | 
				
			||||||
    {layer}. The complete list can be seen <a href="methods/index.html">here</a>.
 | 
					    {layer}. <a href="methods/index.html">See the complete method list</a>.
 | 
				
			||||||
    <br /><br />
 | 
					    <br /><br />
 | 
				
			||||||
    Methods, also known as <i>requests</i>, are used to interact with the
 | 
					    Methods, also known as <i>requests</i>, are used to interact with the
 | 
				
			||||||
    Telegram API itself and are invoked through <code>client(Request(...))</code>.
 | 
					    Telegram API itself and are invoked through <code>client(Request(...))</code>.
 | 
				
			||||||
| 
						 | 
					@ -92,8 +92,8 @@ users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User></pre>
 | 
				
			||||||
    some dialogs, users, etc.</p>
 | 
					    some dialogs, users, etc.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h3 id="types">Types</h3>
 | 
					    <h3 id="types">Types</h3>
 | 
				
			||||||
    <p>Currently there are <b>{type_count} types</b>. You can see the full
 | 
					    <p>Currently there are <b>{type_count} types</b>.
 | 
				
			||||||
    list <a href="types/index.html">here</a>.</p>
 | 
					    <a href="types/index.html">See the complete list of types</a>.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <p>The Telegram types are the <i>abstract</i> results that you receive
 | 
					    <p>The Telegram types are the <i>abstract</i> results that you receive
 | 
				
			||||||
    after invoking a request. They are "abstract" because they can have
 | 
					    after invoking a request. They are "abstract" because they can have
 | 
				
			||||||
| 
						 | 
					@ -106,8 +106,8 @@ users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User></pre>
 | 
				
			||||||
    an instance of it by using one of its, possibly multiple, constructors.</p>
 | 
					    an instance of it by using one of its, possibly multiple, constructors.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h3 id="constructors">Constructors</h3>
 | 
					    <h3 id="constructors">Constructors</h3>
 | 
				
			||||||
    <p>Currently there are <b>{constructor_count} constructors</b>. You can see
 | 
					    <p>Currently there are <b>{constructor_count} constructors</b>.
 | 
				
			||||||
    the full list <a href="constructors/index.html">here</a>.</p>
 | 
					    <a href="constructors/index.html">See the list of all constructors</a>.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <p>Constructors are the way you can create instances of the abstract types
 | 
					    <p>Constructors are the way you can create instances of the abstract types
 | 
				
			||||||
    described above, and also the instances which are actually returned from
 | 
					    described above, and also the instances which are actually returned from
 | 
				
			||||||
| 
						 | 
					@ -170,8 +170,13 @@ users.getUsers#0d91a548 id:Vector<InputUser> = Vector<User></pre>
 | 
				
			||||||
    </ul>
 | 
					    </ul>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <h3 id="example">Full example</h3>
 | 
					    <h3 id="example">Full example</h3>
 | 
				
			||||||
    <p>Documentation for this is now
 | 
					    <p>All methods shown here have dummy examples on how to write them,
 | 
				
			||||||
    <a href="http://telethon.readthedocs.io/en/latest/extra/advanced-usage/accessing-the-full-api.html">here</a>.
 | 
					    so you don't get confused with their TL definition. However, this may
 | 
				
			||||||
 | 
					    not always run. They are just there to show the right syntax.</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <p>You should check out
 | 
				
			||||||
 | 
					    <a href="http://telethon.readthedocs.io/en/latest/extra/advanced-usage/accessing-the-full-api.html">how
 | 
				
			||||||
 | 
					    to access the full API</a> in ReadTheDocs.
 | 
				
			||||||
    </p>
 | 
					    </p>
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
<script src="js/search.js"></script>
 | 
					<script src="js/search.js"></script>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,11 +95,16 @@ class DocsWriter:
 | 
				
			||||||
            raise RuntimeError('No menu had been started in the first place.')
 | 
					            raise RuntimeError('No menu had been started in the first place.')
 | 
				
			||||||
        self.write('</ul>')
 | 
					        self.write('</ul>')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def write_title(self, title, level=1):
 | 
					    def write_title(self, title, level=1, id=None):
 | 
				
			||||||
        """Writes a title header in the document body,
 | 
					        """Writes a title header in the document body,
 | 
				
			||||||
           with an optional depth level
 | 
					           with an optional depth level
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        self.write('<h{level}>{title}</h{level}>', title=title, level=level)
 | 
					        if id:
 | 
				
			||||||
 | 
					            self.write('<h{lv} id="{id}">{title}</h{lv}>',
 | 
				
			||||||
 | 
					                       title=title, lv=level, id=id)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            self.write('<h{lv}>{title}</h{lv}>',
 | 
				
			||||||
 | 
					                       title=title, lv=level)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def write_code(self, tlobject):
 | 
					    def write_code(self, tlobject):
 | 
				
			||||||
        """Writes the code for the given 'tlobject' properly
 | 
					        """Writes the code for the given 'tlobject' properly
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -297,7 +297,8 @@ def _write_html_pages(tlobjects, errors, layer, input_res, output_dir):
 | 
				
			||||||
            docs.write_title(tlobject.class_name)
 | 
					            docs.write_title(tlobject.class_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if tlobject.is_function:
 | 
					            if tlobject.is_function:
 | 
				
			||||||
                docs.write_text('Bots <strong>can{}</strong> use this method.'
 | 
					                docs.write_text('Bots <strong>can{}</strong> use this method. '
 | 
				
			||||||
 | 
					                                '<a href="#examples">See code examples.</a>'
 | 
				
			||||||
                                .format("" if tlobject.bot_usable else "'t"))
 | 
					                                .format("" if tlobject.bot_usable else "'t"))
 | 
				
			||||||
                if tlobject.is_function and tlobject.bot_usable:
 | 
					                if tlobject.is_function and tlobject.bot_usable:
 | 
				
			||||||
                    bot_docs_paths.append(filename)
 | 
					                    bot_docs_paths.append(filename)
 | 
				
			||||||
| 
						 | 
					@ -410,6 +411,28 @@ def _write_html_pages(tlobjects, errors, layer, input_res, output_dir):
 | 
				
			||||||
                    docs.write_text('You can import these from '
 | 
					                    docs.write_text('You can import these from '
 | 
				
			||||||
                                    '<code>telethon.errors</code>.')
 | 
					                                    '<code>telethon.errors</code>.')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                docs.write_title('Example', id='examples')
 | 
				
			||||||
 | 
					                docs.write(
 | 
				
			||||||
 | 
					                    '<pre>from telethon.sync import TelegramClient\n'
 | 
				
			||||||
 | 
					                    'from telethon import functions, types\n'
 | 
				
			||||||
 | 
					                    '\n'
 | 
				
			||||||
 | 
					                    'with TelegramClient(name, api_id, api_hash) as client:\n'
 | 
				
			||||||
 | 
					                    '    result = client(')
 | 
				
			||||||
 | 
					                tlobject.as_example(docs, indent=1)
 | 
				
			||||||
 | 
					                docs.write(')\n')
 | 
				
			||||||
 | 
					                if tlobject.result.startswith('Vector'):
 | 
				
			||||||
 | 
					                    docs.write(
 | 
				
			||||||
 | 
					                        '    for x in result:\n'
 | 
				
			||||||
 | 
					                        '        print(x'
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    docs.write('    print(result')
 | 
				
			||||||
 | 
					                    if tlobject.result != 'Bool' \
 | 
				
			||||||
 | 
					                            and not tlobject.result.startswith('Vector'):
 | 
				
			||||||
 | 
					                        docs.write('.stringify()')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                docs.write(')</pre>')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            depth = '../' * (2 if tlobject.namespace else 1)
 | 
					            depth = '../' * (2 if tlobject.namespace else 1)
 | 
				
			||||||
            docs.add_script(src='prependPath = "{}";'.format(depth))
 | 
					            docs.add_script(src='prependPath = "{}";'.format(depth))
 | 
				
			||||||
            docs.add_script(relative_src=paths['search.js'])
 | 
					            docs.add_script(relative_src=paths['search.js'])
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,64 @@
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					KNOWN_NAMED_EXAMPLES = {
 | 
				
			||||||
 | 
					    ('peer', 'InputPeer'): "'TelethonOffTopic'",
 | 
				
			||||||
 | 
					    ('channel', 'InputChannel'): "'TelethonOffTopic'",
 | 
				
			||||||
 | 
					    ('user_id', 'InputUser'): "'Lonami'",
 | 
				
			||||||
 | 
					    ('users', 'InputUser'): "'Lonami'",
 | 
				
			||||||
 | 
					    ('message', 'string'): "'Hello there!'",
 | 
				
			||||||
 | 
					    ('expires_at', 'date'): 'datetime.timedelta(minutes=5)',
 | 
				
			||||||
 | 
					    ('until_date', 'date'): 'datetime.timedelta(days=14)',
 | 
				
			||||||
 | 
					    ('view_messages', 'true'): 'None',
 | 
				
			||||||
 | 
					    ('send_messages', 'true'): 'None',
 | 
				
			||||||
 | 
					    ('limit', 'int'): '100',
 | 
				
			||||||
 | 
					    ('hash', 'int'): '0',
 | 
				
			||||||
 | 
					    ('hash', 'string'): "'A4LmkR23G0IGxBE71zZfo1'",
 | 
				
			||||||
 | 
					    ('min_id', 'int'): '0',
 | 
				
			||||||
 | 
					    ('max_id', 'int'): '0',
 | 
				
			||||||
 | 
					    ('add_offset', 'int'): '0',
 | 
				
			||||||
 | 
					    ('title', 'string'): "'My awesome title'",
 | 
				
			||||||
 | 
					    ('device_model', 'string'): "'ASUS Laptop'",
 | 
				
			||||||
 | 
					    ('system_version', 'string'): "'Arch Linux'",
 | 
				
			||||||
 | 
					    ('app_version', 'string'): "'1.0'",
 | 
				
			||||||
 | 
					    ('system_lang_code', 'string'): "'en'",
 | 
				
			||||||
 | 
					    ('lang_pack', 'string'): "''",
 | 
				
			||||||
 | 
					    ('lang_code', 'string'): "'en'",
 | 
				
			||||||
 | 
					    ('chat_id', 'int'): '478614198'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					KNOWN_TYPED_EXAMPLES = {
 | 
				
			||||||
 | 
					    'int128': "int.from_bytes(os.urandom(16), 'big')",
 | 
				
			||||||
 | 
					    'bytes': "b'arbitrary\\x7f data \\xfa here'",
 | 
				
			||||||
 | 
					    'long': "-12398745604826",
 | 
				
			||||||
 | 
					    'string': "'some string here'",
 | 
				
			||||||
 | 
					    'int': '42',
 | 
				
			||||||
 | 
					    'date': 'datetime.datetime(2018, 6, 25)',
 | 
				
			||||||
 | 
					    'double': '7.13',
 | 
				
			||||||
 | 
					    'Bool': 'False',
 | 
				
			||||||
 | 
					    'true': 'True',
 | 
				
			||||||
 | 
					    'InputChatPhoto': "client.upload_file('/path/to/photo.jpg')"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# These are flags that are cleaner to leave off
 | 
				
			||||||
 | 
					OMITTED_EXAMPLES = {
 | 
				
			||||||
 | 
					    'silent',
 | 
				
			||||||
 | 
					    'background',
 | 
				
			||||||
 | 
					    'clear_draft',
 | 
				
			||||||
 | 
					    'reply_to_msg_id',
 | 
				
			||||||
 | 
					    'random_id',
 | 
				
			||||||
 | 
					    'reply_markup',
 | 
				
			||||||
 | 
					    'entities',
 | 
				
			||||||
 | 
					    'embed_links',
 | 
				
			||||||
 | 
					    'hash',
 | 
				
			||||||
 | 
					    'min_id',
 | 
				
			||||||
 | 
					    'max_id',
 | 
				
			||||||
 | 
					    'add_offset',
 | 
				
			||||||
 | 
					    'grouped',
 | 
				
			||||||
 | 
					    'broadcast'
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TLArg:
 | 
					class TLArg:
 | 
				
			||||||
    def __init__(self, name, arg_type, generic_definition):
 | 
					    def __init__(self, name, arg_type, generic_definition):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
| 
						 | 
					@ -131,3 +189,29 @@ class TLArg:
 | 
				
			||||||
            'name': self.name.replace('is_self', 'self'),
 | 
					            'name': self.name.replace('is_self', 'self'),
 | 
				
			||||||
            'type': re.sub(r'\bdate$', 'int', self.real_type())
 | 
					            'type': re.sub(r'\bdate$', 'int', self.real_type())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def as_example(self, f, indent=0):
 | 
				
			||||||
 | 
					        if self.is_generic:
 | 
				
			||||||
 | 
					            f.write('other_request')
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        known = (KNOWN_NAMED_EXAMPLES.get((self.name, self.type))
 | 
				
			||||||
 | 
					                 or KNOWN_TYPED_EXAMPLES.get(self.type))
 | 
				
			||||||
 | 
					        if known:
 | 
				
			||||||
 | 
					            f.write(known)
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert self.omit_example() or self.cls, 'TODO handle ' + str(self)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Pick an interesting example if any
 | 
				
			||||||
 | 
					        for cls in self.cls:
 | 
				
			||||||
 | 
					            if cls.is_good_example():
 | 
				
			||||||
 | 
					                cls.as_example(f, indent)
 | 
				
			||||||
 | 
					                break
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            # If no example is good, just pick the first
 | 
				
			||||||
 | 
					            self.cls[0].as_example(f, indent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def omit_example(self):
 | 
				
			||||||
 | 
					        return (self.is_flag or self.can_be_inferred) \
 | 
				
			||||||
 | 
					               and self.name in OMITTED_EXAMPLES
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,3 +102,42 @@ class TLObject:
 | 
				
			||||||
            'type':
 | 
					            'type':
 | 
				
			||||||
                self.result
 | 
					                self.result
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def is_good_example(self):
 | 
				
			||||||
 | 
					        return not self.class_name.endswith('Empty')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def as_example(self, f, indent=0):
 | 
				
			||||||
 | 
					        f.write('functions' if self.is_function else 'types')
 | 
				
			||||||
 | 
					        if self.namespace:
 | 
				
			||||||
 | 
					            f.write('.')
 | 
				
			||||||
 | 
					            f.write(self.namespace)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        f.write('.')
 | 
				
			||||||
 | 
					        f.write(self.class_name)
 | 
				
			||||||
 | 
					        f.write('(')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        args = [arg for arg in self.real_args if not arg.omit_example()]
 | 
				
			||||||
 | 
					        if not args:
 | 
				
			||||||
 | 
					            f.write(')')
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        f.write('\n')
 | 
				
			||||||
 | 
					        indent += 1
 | 
				
			||||||
 | 
					        remaining = len(args)
 | 
				
			||||||
 | 
					        for arg in args:
 | 
				
			||||||
 | 
					            remaining -= 1
 | 
				
			||||||
 | 
					            f.write('    ' * indent)
 | 
				
			||||||
 | 
					            f.write(arg.name)
 | 
				
			||||||
 | 
					            f.write('=')
 | 
				
			||||||
 | 
					            if arg.is_vector:
 | 
				
			||||||
 | 
					                f.write('[')
 | 
				
			||||||
 | 
					            arg.as_example(f, indent)
 | 
				
			||||||
 | 
					            if arg.is_vector:
 | 
				
			||||||
 | 
					                f.write(']')
 | 
				
			||||||
 | 
					            if remaining:
 | 
				
			||||||
 | 
					                f.write(',')
 | 
				
			||||||
 | 
					            f.write('\n')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        indent -= 1
 | 
				
			||||||
 | 
					        f.write('    ' * indent)
 | 
				
			||||||
 | 
					        f.write(')')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user