* Fix sticker tests
Added flaky, timeout and xfails to the stickerset bot method tests.
* Make sure the first stickersettest worked before modifying in test 2
* some mor changes to make the deletion more stable
* Run pre commit hook tests on all platforms TEMPORARILY
* Use os.system instead of subprocess.call
* Turn on branch coverage
* Let's try this then
* More testing!
* Update test_meta.py
* Bot API 3.3
* simpler helper methods (accept only custom names now)
attempt to fix circular import (not sure if its the correct way tho)
added helper methods into User object
* fix User objects in tests to contain is_bot required value
* fix User objects in tests to contain is_bot required value
* delete extra line that caused flake8 error
* fix swapped arguments
The idea was nice, but it really complicated things for us and for the
user.
If a user wants to run more than one handler on an update, he can put
the handlers in different groups or he can have a single handler.
If a user wants to have multiple handlers in the same group which only
one of them should run on the update, he should use check_update().
Since we haven't released this code yet, there's no problem with
backward compatability.
Required fixes:
- CallbackQuery is now comparable.
- Message.effective_attachment, Message.photo,
Message.new_chat_members, Message.new_chat_photo &
Game.text_entitties semantic fixes - when they are not defined,
return an empty list.
- Docstring fix to Update class.
offset for get_user_profile_photo can be zero.
edit_message_caption should raise ValueError in compliance with other methods. Also changed to snake_case
edit_message_reply_markup was even weirder
`text_html` & `text_markdown` reverted to the old semantics - URLs are not converted to hyperlinks.
To get the new behaviour there are matching `text_html_urled` & `text_markdown_urled` properties.
fixes#773
- Added all the new and shiny features from API 3.1.
- Not API 3.1 changes:
- Use future.utils.string_types for string isinstance checks.
- Stall between retries of test_set_webhook_get_webhook_info() &
test_delete_webhook().
So just remove it for now. Better than doing annoying stuff with parsing a **kwargs dict in my opinion. It didn't even *really* need to be kwarg only anyways I guess...
* Clean up Bot code a bit
- Move decorators to module. It really wasn't clear how decorators inside classes work, and why they didn't have a self parameter, but still wasn't static. This also makes them effectively private without having to underscore them, which I think we should have done long time ago atm. Note that this might break backwards compatibility slightly (only if people are daft enough to have used the decorators themselves)
- Don't call _message_wrapper directly. Ever. Instead always use the message decorator, since it's what it's there for. Closes#627
- Don't use the message decorator if the method isn't supposed to return a message. The decorator could handle values like True (which is often the return value), but to someone reading the code, it seems like it's a message returning method even when it wasn't.
- Always document timeout and **kwargs
- Log all methods
* Add test to make sure timeout propagates properly despite decorators
* Rename shortcut functions to snake_case
* More function renaming
* Example function rewrite
* Add myself to authors.rst
* More function renaming
* Rename mockbot test functions
* Break comment line for flake max line length
* Change hard-coded 20. to timeout paramter
Passing timeout parameter to _message_wrapper in send_audio instead of hard-coded 20 seconds
* add myself to contributors
It would seem that length is no longer incorrectly required so that's good
However they stopped sending the file_size when you send via a file_id which is a bit odd
* add support for User.language_code
* Add language filter
Useful is you wanna do something like restrict your shop to a single or a few locales or something like that.
* Allow edited as seperate input
In short made it possible to tune messagehandler more to your wishes. and choose exactly what updates to receive. messages, edited_message or channel_post or a combination.
- Added the edited_updates argument to MessageHandler
- Added DepricationWarning when using allow_edited
- replaced _is_allowed_message and _is_allowed_channel_post with _is_allowed_update
- Modified tests to reflect new way
* oops
Spelled deprecation wrong
made an error in the _is_allowed_update.
* Python 2 does not have assertWarns.
* remove unneeded statements
* Improved CommandHandler
Now you can pass list of commands instead of one command
* Added tests for list of commands
* Return backward compatibility
Renamed `commands` to `command` in CommandHandler
* Added test for a command not in the list
* Fixed py2 unicode command support in `CommandHandler`
* Implemented `Bot.delete_message()` and `Message.delete()` methods
* Added tests for `Bot.delete_message()` and `Messsage.delete()`
* Added myself to `AUTHORS.rst`
* Using `assertRaisesRegexp` instead of `assertRaisesRegex` in tests
Now tests can run on Python 2.7 without raising 'AttributeError'
* Fix docstring
Added a warning to the docstring describing that this method is undocumented and not guaranteed to work
* Fix Bug #571
ConversationHandler will not process CallbackQuery if per_chat=True and
the CallbackQuery has no message attached to it (as is the case with
buttons on inline results)
* Adds test case for CallbackQuery without Chat
Attempting to import urllib3.contrib.socks may fail if PySocks is not
installed. Most users won't care for that.
Only import that module if the user requested to use a socks proxy.
* Introduce MessageQueue
* minor documentation and terminology fixes according to the review
* minor documentation and terminology fixes according to the review
* minor documentation and terminology fixes according to the review
* pep8 fix
* conversationhandler.py: add per_chat, per_user and per_message
* test_conversationhandler.py: test case per_user=False
* test_conversationhandler.py: add test for callbackqueryhandlers
* ✏️ Fix accidental typo in logging format
* stripping token of whitespaces before starting bot
* Line feed
* CommandHandler checks if message is for this bot
* CommandHandler checks if message is for this bot
- Added tests
* Fixed tests in test_conversationHandler to work with new commandhandler structure
* type in conversationhandler test
* Added methods to generate the original markdown/html formatted string from the entities contained in an update
* Added
* Moved the html/markdown parsing methods to `Message`
* Moved extract_* methods from helpers to the appropriate location
* Refactored text_markdown and text_html
* Refactored text_markdown and text_html for efficiency
* Fixed method call in conversationhandler
* Fixed method call in handler
* Fixed `make test` command on windows systems
* Improved method documentation
- Job.job_queue is now weakref.proxy reducing the risk of cyclic
pointers preventing Job object from being deleted.
- JobQueue._put(): raise if both next_t and job.interval are None
- Don't put repeating job back to queue if user had disabled it was
disabled during the time of execution.
- New method: Job.is_removed() - promising a consistent API (instead of
access to private member Job._remove)
- Documentation fixes.
* New fields channel_post and edited_channel_post for Update
refs #468
* setGameScore() changes
- Changed behaviour: messages with high scores will be update with new
high scores by default. (documentation fix)
- Use (new) disable_edit_message in setGameScore to disable the above new
behaviour.
- The edit_message parameter from setGameScore is no longer in use. For
backward compatibility, it will be taken into account for a while,
unless disable_edit_message is passed explicitly.
refs #468
* New field forward_from_message_id for Message.
refs #468
* New parameter cache_time for answerCallbackQuery
refs #468
* replykeyboardhide renamed to replykeyboardremove
refs #468
* Unitests for updated setGameScore semantics
refs #468
* Backward compatibility for ReplyKeyboardHide
refs #468
* Fix docstrings of wrapper methods in Message
* Unitest new field forward_from_message_id of Message
refs #468
* Fix testMaxCaptionLength
Telegram servers changed their behaviour - now they truncate a long
caption instead of returning an error.
* MessageHandler: Added support for channel posts
* Fix flake8 complaints in a manner which yapf will like it too.
* fix rst markup
* Fix telegram API change, returning '404 Not found' with raising own TelegramError rather native exception
* Change exception to InvalidToken in test and request util
* Added myself to AUTHORS. Thx for appreciation :)
* Adding timeunit and day support to the jobqueue
* Adding tests
* Changed the file permission back to 644.
* Changed AssertEqual argument order to (actual, expectd).
* Removed the TimeUnit enum and unit param, instead use datetime.time for interval.
* Removing the TimeUnits enum and unit param in favour of optionally using a datetime.time as the interval.
* Removing the TimeUnits enumeration, forgot the remove it in the last one.
* Removed some old docstrings refering to the TimeUnits enum.
* Removed the old TimeUnits import.
* Adding some error handling for the 'days' argument (only a 'tuple' with 'Days')
* Writing the error message directly in the exception.
* Moving a debug statement wrongfully saying a job would be running on days it wouldn't.
* Writing error messages directly in the exceptions instead of making an extra variable.
* Replacing datetime.time in favour of datetime.timedelta because of the get_seconds() method.
* Adding error handling for the method .
* Splitting the tests up in multiple ones, no float test because I haven't found a reliable way to test it.
* Excluding .exrc file.
* Removing \ at EOF of ValueError.
* Replacing Enums with plain new-style classes.
* Using numbers.number to check for ints/floats instead of seperate int/float checks.
* Fixing typo, number -> Number.
* Changed lower_case Days attributes to UPPER_CASE.
* Different formatting for Days class, removed the get_days function in favour of a tuple.
* Removed redundant function get_days.
* Edited the docstring for next_t to also take datetime.timedelta.
* Removed for-loop in favour of any().
* Changed docstring for interval.
* Removed debug print.
* Changing some docstrings.
* Changing some docstrings (again).
* update sphinx source files to properly build latexpdf and improve html build
* fix docstrings and sphinx sources to get rid of warnings
* add telegram.contrib.rst
* initial commit for user_data
* add chat_data and use defaultdict
* fix chat_data copy-paste error
* add test for user_data and chat_data
* fix case where chat is None
* remove braces from import line
While not stickily necessary for most classes (since user isn't directly creating them) it still unifies our approach.
However for some like ReplyKeyboardHide where users are making the classes themselves it should improve IDE autocomplete support.
* fixes broken test with PhotoSize, Game and Animation
However:
testSendGame and test_set_game_score both produces *BadRequest: u'Wrong file identifier/HTTP URL specified'*.
* fixes test_set_game_score
* adds to_dict method to Game to prevent extra collection type checks in base.TelegramObject
Still need setGameScore (I'm thinking we can set it to the ever increasing
envvar 'TRAVIS_BUILD_NUMBER') and getGameHighScores.
The tests currently don't work... Since I don't really understand how
PhotoSize works... Please halp :P
* Properly split and handle arguments in CommandHandler
* Update the docstring for pass_args in CommandHandler
* Properly split and handle arguments in StringCommandHandler
* bot.py: add create_references method
* create bot reference in webhook handler, use create_references on new updates
* message.py: implement reply_text
* echobot2.py: use Message.reply_text
* fix create_references in webhook handler
* add some more instance methods
* Chat.kick_member and unban_member
* bot.py: Create bot references in outgoing messages
* add tests for everything testable
* test_updater.py: add create_references method to MockBot
* remove Bot.create_references and refactor TelegramObject.de_json to take the additional parameter bot
* List bot as named kwarg where used
* file.py: Use Bot.request property instead of Bot._request attr
Should close#400.
* Add parse_entity
* Add parse_entities
* Add MessageEntity types as constants to MessageEntity.
* Add MAX_MESSAGE_ENTITIES to constants.py
Note: the value has been found by experimentation as opposed to extracted from the api docs.
* Add tests for parse_entity and parse_entities
* Create a Request class which maintains its own connection pool
* When creating a Bot instance a new Request instance will be created if one wasn't supplied.
* Updater is responsible for creating a Request instance if a Bot instance wasn't provided.
* Dispatcher: add method to run async functions without decorator
* Dispatcher can now run as a singleton (allowing run_async decorator to work) as it always did and as multiple instances (where run_async decorator will raise RuntimeError)
* initial commit for conversationhandler and example
* implement simple Promise for run_async/conversationhandler
* refactor Promise._done to done
* add handling for timed out Promises
* correctly handle promises with None results
* fix handling tuple states
* update comments on example
* Added a first test on the ConversationHandler.
* Fixed a small typo.
* Yapf'd.
* add sphinx doc for conversation handler
* fix title for callbackqueryhandler sphinx docs
* Small fixes to documentation and add myself to AUTHORS.
* Rework CONTRIBUTIONS.rst
Use code-blocks instead of literals, change headings for portability and use a relative link to AUTHORS instead of linking to a specific copy.
- start the jobqueue (by default) during __init__() instead of during
put()
- protect self._next_peek and self.__tick with a Lock
- rename self._start() to self._main_loop()
- stop() is now blocking until the event loop thread exits
this test was based on timing and assumed that the JobQueue did not have
time to start processing the queue before checking the assert.
what we really should do is make sure JobQueue does not process anything
during test_bootstrap_retries_fail() there is an exception raised (by
design): TelegramError('test')
For a reason I haven't managed to pinpoint the above exception in its
precise timing caused the Updater to be left in a state which is
'self.running == False', but the dispatcher threads already initialized.
This patch identifies this extreme case and makes sure to go over the
stop procedure.
If you already know what you'd like to work on, you can skip this section.
@@ -37,7 +44,7 @@ If you have an idea for something to do, first check if it's already been filed
Another great way to start contributing is by writing tests. Tests are really important because they help prevent developers from accidentally breaking existing code, allowing them to build cool things faster. If you're interested in helping out, let the development team know by posting to the `developers' mailing list`_, and we'll help you get started.
Instructions for making a code change
-------------------------------------
#####################################
The central development branch is ``master``, which should be clean and ready for release at any time. In general, all changes should be done as feature branches based off of ``master``.
@@ -47,13 +54,12 @@ Here's how to make a one-off code change.
2.**Create a new branch with this name, starting from**``master``. In other words, run:
``$ git fetch upstream``
.. code-block:: bash
``$ git checkout master``
``$ git merge upstream/master``
``$ git checkout -b your-branch-name``
$ git fetch upstream
$ git checkout master
$ git merge upstream/master
$ git checkout -b your-branch-name
3.**Make a commit to your feature branch**. Each commit should be self-contained and have a descriptive commit message that helps other developers understand why the changes were made.
@@ -75,19 +81,33 @@ Here's how to make a one-off code change.
- Before making a commit ensure that all automated tests still pass:
``$ make test``
.. code-block::
$ make test
If you don't have ``make``, do:
.. code-block::
$ pytest -v
- To actually make the commit (this will trigger tests for yapf, lint and pep8 automatically):
``$ git add your-file-changed.py``
.. code-block:: bash
- yapf may change code formatting, make sure to re-add them to your commit.
$ git add your-file-changed.py
``$ git commit -a -m "your-commit-message-here"``
- yapf may change code formatting, make sure to re-add them to yourcommit.
.. code-block:: bash
$ git commit -a -m "your-commit-message-here"
- Finally, push it to your GitHub fork, run:
``$ git push origin your-branch-name``
.. code-block:: bash
$ git push origin your-branch-name
4.**When your feature is ready to merge, create a pull request.**
@@ -107,73 +127,89 @@ Here's how to make a one-off code change.
- Resolve any merge conflicts that arise. To resolve conflicts between 'your-branch-name' (in your fork) and 'master' (in the ``python-telegram-bot`` repository), run:
``$ git checkout your-branch-name``
.. code-block:: bash
``$ git fetch upstream``
$ git checkout your-branch-name
$ git fetch upstream
$ git merge upstream/master
$ ...[fix the conflicts]...
$ ...[make sure the tests pass before committing]...
$ git commit -a
$ git push origin your-branch-name
``$ git merge upstream/master``
- If after merging you see local modified files in ``telegram/vendor/`` directory, that you didn't actually touch, that means you need to update submodules with this command:
``$ ...[fix the conflicts]...``
.. code-block:: bash
``$ ...[make sure the tests pass before committing]...``
``$ git commit -a``
``$ git push origin your-branch-name``
$ git submodule update --init --recursive
- At the end, the reviewer will merge the pull request.
6.**Tidy up!** Delete the feature branch from both your local clone and the GitHub repository:
``$ git branch -D your-branch-name``
.. code-block:: bash
``$ git push origin --delete your-branch-name``
$ git branch -D your-branch-name
$ git push origin --delete your-branch-name
7.**Celebrate.** Congratulations, you have contributed to ``python-telegram-bot``!
Style commandments
==================
------------------
Specific commandments
---------------------
#####################
- Avoid using "double quotes" where you can reasonably use 'single quotes'.
AssertEqual argument order
--------------------------
Assert comparison order
#######################
assertEqual method's arguments should be in ('actual', 'expected') order.
-assert statements should compare in **actual** == **expected** order.
For example (assuming ``test_call`` is the thing being tested):
..code-block::python
# GOOD
asserttest_call()==5
# BAD
assert5==test_call()
Properly calling callables
--------------------------
##########################
Methods, functions and classes can specify optional parameters (with default
values) using Python's keyword arg syntax. When providing a value to such a
callable we prefer that the call also uses keyword arg syntax. For example::
callable we prefer that the call also uses keyword arg syntax. For example:
# GOOD
f(0, optional=True)
..code-block::python
# BAD
f(0, True)
# GOOD
f(0,optional=True)
# BAD
f(0,True)
This gives us the flexibility to re-order arguments and more importantly
to add new required arguments. It's also more explicit and easier to read.
Properly defining optional arguments
------------------------------------
####################################
It's always good to not initialize optional arguments at class creation,
instead use ``**kwargs`` to get them. It's well known Telegram API can
change without notice, in that case if a new argument is added it won't
break the API classes. For example::
It's always good to not initialize optional arguments at class creation,
instead use ``**kwargs`` to get them. It's well known Telegram API can
change without notice, in that case if a new argument is added it won't
We believe that the best way to learn and understand this simple package is by example. So here
are some examples for you to review. Even if it's not your approach for learning, please take a
look at ``echobot2`` (below), it is de facto the base for most of the bots out there. Best of all,
look at ``echobot2``, it is de facto the base for most of the bots out there. Best of all,
the code for these examples are released to the public domain, so you can start by grabbing the
code and building on top of it.
-`echobot2<https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/echobot2.py>`_ replies back messages.
-`inlinebot <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/inlinebot.py>`_ basic example of an `inline bot <https://core.telegram.org/bots/inline>`_.
-`state machine bot <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/state_machine_bot.py>`_ keeps the state for individual users, useful for multipart conversations.
-`timerbot <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/timerbot.py>`_ uses the ``JobQueue`` to send timed messages.
Examples using only the pure API:
-`echobot <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/legacy/echobot.py>`_ replies back messages.
-`roboed <https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/legacy/roboed.py>`_ talks to `Robô Ed <http://www.ed.conpet.gov.br/br/converse.php>`_.
Look at the examples on the `wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Examples>`_ to see other bots the community has built.
Visit `this page<https://github.com/python-telegram-bot/python-telegram-bot/blob/master/examples/README.md>`_ to discover the official examples or look at the examples on the `wiki <https://github.com/python-telegram-bot/python-telegram-bot/wiki/Examples>`_ to see other bots the community has built.
-------
Logging
@@ -169,7 +172,7 @@ If you want DEBUG logs instead:
Documentation
=============
``python-telegram-bot``'s documentation lives at `pythonhosted.org<https://pythonhosted.org/python-telegram-bot/>`_.
``python-telegram-bot``'s documentation lives at `readthedocs.io<https://python-telegram-bot.readthedocs.io/>`_.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.