aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeLines
* Test is_staff and has_green_checkmark.Gravatar Leon Sandøy2019-11-03-17/+35
|
* Resolving merge conflicts from masterGravatar Leon Sandøy2019-11-03-197/+277
|\
| * Merge pull request #640 from python-discord/bot-utils-init-testsGravatar S. Co12019-11-03-0/+52
| |\ | | | | | | Write tests for `bot.utils`.
| | * Merge branch 'master' into bot-utils-init-testsGravatar S. Co12019-11-03-5/+4
| | |\ | | |/ | |/|
| * | Merge pull request #631 from manusaurio/masterGravatar S. Co12019-11-03-3/+1
| |\ \ | | | | | | | | Remove redirection on rules command
| | * \ Merge branch 'master' into masterGravatar S. Co12019-11-03-194/+224
| | |\ \ | | |/ / | |/| |
| * | | Merge pull request #638 from loksonarius/fix-reddit-cog-sleepGravatar Mark2019-11-02-2/+3
| |\ \ \ | | | | | | | | | | Use timedelta to correctly calculate next midnight
| | * | | Use timedelta to correctly calculate next midnightGravatar Dan Herrera2019-10-31-2/+3
| |/ / /
| | * | Remove redirection on rules commandGravatar Manuel Ignacio Pérez Alcolea2019-10-28-3/+1
| | | | | | | | | | | | | | | | Previously restricted for the staff. This change was suggested due its possible usefulness for regular users.
| | | * Use `casefold` in some cases.Gravatar Johannes Christ2019-11-02-1/+4
| | | |
| | | * Write tests for `bot.utils`.Gravatar Johannes Christ2019-11-01-0/+49
| | |/ | |/| | | | | | | Closes #604.
| * | Merge pull request #629 from python-discord/unittest-helpers-proper-child-mockGravatar Mark2019-10-31-179/+204
| |\ \ | | | | | | | | Enhancements and a bug fix for our test helpers
| | * \ Merge branch 'master' into unittest-helpers-proper-child-mockGravatar Mark2019-10-31-13/+17
| | |\ \ | | |/ / | |/| |
| * | | Merge pull request #626 from python-discord/otn-a-fixGravatar Mark2019-10-30-10/+6
| |\ \ \ | | | | | | | | | | Chain words before length check for OffTopicName conversion
| | * \ \ Merge branch 'master' into otn-a-fixGravatar Mark2019-10-30-3/+11
| | |\ \ \ | | |/ / / | |/| | |
| * | | | Use 'local' emojis for reddit webhook embedGravatar Sebastiaan Zeeff2019-10-29-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Apparently, webhooks cannot use external emojis. For now, I have added the emojis to the guild directly and updated the IDs in this commit. I don't really like having "utility" emojis on the main guild, but the alternative would be to not use webhooks, which is a change we will need to discuss before we apply it. (I don't see anything against it now we just send a daily digest, although, in principle, this is precisely what a webhook is meant for.)
| * | | | Merge pull request #635 from python-discord/reddit-webhook-embed-enhancementsGravatar Kieran Siek2019-10-29-3/+11
| |\ \ \ \ | | |_|_|/ | |/| | | Enhance Reddit webhook embeds
| | * | | Enhance Reddit webhook embedsGravatar Sebastiaan Zeeff2019-10-29-3/+11
| |/ / / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | https://github.com/python-discord/bot/issues/634 I have changes the appearance of the embed generated for the reddit webhook. The changes: - Bold markdown around the links to prevent it breaking on android. - Stylized the meta-data line with newly created emoji-based icons. - Removed redundant mentions of the subreddit from the embed itself. The emojis were uploaded to the `Emojis II` guild and the IDs have been added to the constants files. In addition, I've set the reddit logo as the default avatar for the webhook in the guild. This commit closes #634
| | * / Chain words before length checkGravatar kosayoda2019-10-28-10/+6
| |/ /
| | * Update docstring and remove redundant attributeGravatar Sebastiaan Zeeff2019-10-30-4/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I accidentally forgot to update the docstring of `CustomMockMixin`, which changed quite dramatically in scope with the last commit. This commit remedies that. In addition, I inadvertently forgot to remove the `child_mock_type` class attribute from `MockRole`. Since it uses the default value, it is no longer necessary to specify it in the child class as well.
| | * Enhance custom mock helpersGravatar Sebastiaan Zeeff2019-10-30-161/+150
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I have enhanced the custom mocks defined in `tests/helpers.py` in a couple of important ways. 1. Automatically create AsyncMock attributes using `inspect` Our previous approach, hard-coding AsynckMock attributes for all the coroutine function methods defined for the class we are trying to mock is prone to human error and not resilient against changes introduced in updates of the library we are using. Instead, I have now created a helper method in our `CustomMockMixin` (formerly `GetChildMockMixin`) that automatically inspects the spec instance we've passed for `coroutine functions` using the `inspect` module. It then sets the according attributes with instances of the AsyncMock class. There is one caveat: `discord.py` very rarely defines regular methods that return a coroutine object. Since the returned coroutine should still be awaited, these regular methods should also be mocked with an AsyncMock. However, since they are regular methods, `inspect` does not detect them and they have to be added manually. (The only case of this I've found so far is `Client.wait_for`.) 2. Properly set special attributes using `kwargs.get` As we want attributes that point to other discord.py objects to use our custom mocks (.e.g, `Message.author` should use `MockMember`), the `__init__` method of our custom mocks make sure to correctly instantiate these attributes. However, the way we previously did that means we can't instantiate the custom mock with a mock instance we provide, since this special instantiation would overwrite the custom object we'd passed. I've solved this by using `kwargs.get`, with a new mock as the default value. This makes sure we only create a new mock if we didn't pass a custom one: ```py class MockMesseage: def __init__(self, **kwargs): self.author = kwargs.get('author', MockMember()) ``` As you can see, we will only create a new MockMember if we did not pass an `author` argument. 3. Factoring out duplicate lines Since our `CustomMockMixin` is a parent to all of our custom mock types, it makes sense to use it to factor out common code of all of our custom mocks. I've made the following changes: - Set a default child mock type in the mixin. - Create an `__init__` that takes care of the `inspect` of point 1 This means we won't have to repeat this in all of the child classes. 4. Three new Mock types: Emoji, PartialEmoji, and Reaction I have added three more custom mocks: - MockEmoji - MockPartialEmoji - MockReaction
| | * Change generation of child mocksGravatar Sebastiaan Zeeff2019-10-28-36/+67
| |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - https://docs.python.org/3/library/unittest.mock.html We previously used an override of the `__new__` method to prevent our custom mock types from instantiating their children with their own type instead of a general mock type like `MagicMock` or `Mock`. As it turns out, the Python documentation suggests another method of doing this that does not involve overriding `__new__`. This commit implements this new method to make sure we're using the idiomatic way of handling this. The suggested method is overriding the `_get_child_mock` method in the subclass. To make our code DRY, I've created a mixin that should come BEFORE the mock type we're subclassing in the MRO. --- In addition, I have also added this new mixin to our `AsyncMock` class to make sure that its `__call__` method returns a proper mock object after it has been awaited. This makes sure that subsequent attribute access on the returned object is mocked as expected.
* | Figure out which tests we need.Gravatar Leon Sandøy2019-10-31-2/+87
| | | | | | | | | | | | | | This adds empty tests for all the tests I'd like to add to this pull request. It also adds a few more duckies to the emoji constant list, and adds a single line of clarification to the testing readme.
* | Merge branch 'duck_pond' of github.com:python-discord/bot into duck_pondGravatar Leon Sandøy2019-10-27-1/+1
|\ \
| * | Improve the setup() docstringGravatar Leon Sandøy2019-10-27-1/+1
| | | | | | | | | Co-Authored-By: Mark <[email protected]>
* | | Adding kosas additional ducks to default-configGravatar Leon Sandøy2019-10-27-3/+8
| | |
* | | Addressing review by Mark.Gravatar Leon Sandøy2019-10-27-89/+42
|/ / | | | | | | | | | | | | This refactors the duck pond cog to have fewer redundancies, removes some unused features (like supporting reaction_list in the count_duck and has_green_checkbox helpers), and makes other various minor (mostly cosmetic) improvements.
* | Fix broken constant testsGravatar Leon Sandøy2019-10-27-5/+4
| |
* | Add correct values for constants from production server.Gravatar Leon Sandøy2019-10-27-2/+2
| |
* | Appease the linterGravatar Leon Sandøy2019-10-27-6/+13
| |
* | Add duck_pond cog.Gravatar Leon Sandøy2019-10-27-0/+207
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This cog will listen for duck reactions on any message, and then: - If the reaction was added by a staff member - and the reaction was a duck - and the message has not already been added to the #duck-pond It will add the message to the #duck-pond and then add a green checkbox to the original message to indicate that the message has been ponded. Messages are added to the #duck-pond via webhook, so that they can retain the appearance of having their original authors. Once this checkmark has been added, the message will not be processed in the future. If the checkmark is removed and there are more than ducks_required ducks on the message, the bot will automatically add the checkmark back. However, if all reactions are removed, the bot does not have a countermeasure for this. In order to implement a countermeasure, it would be necessary to involve the API and the database.
* | Add duck-pond constants.Gravatar Leon Sandøy2019-10-27-29/+43
|/ | | | | | This adds the emojis, the channel, and the configuration needed for the duck-pond feature. This is added both to config-default.yml, and to the constants.py file.
* Merge pull request #527 from kraktus/compact_freeGravatar Mark2019-10-25-14/+11
|\ | | | | Reduce `!free` output
| * Merge branch 'master' into compact_freeGravatar Mark2019-10-25-1642/+2983
| |\ | |/ |/|
* | Merge pull request #501 from mathsman5133/reddit-makeoverGravatar Sebastiaan Zeeff2019-10-25-148/+85
|\ \ | | | | | | Utilise `tasks.loop` and webhooks for reddit postings.
| * \ Merge branch 'master' into reddit-makeoverGravatar Sebastiaan Zeeff2019-10-25-1447/+2668
| |\ \ | |/ / |/| |
* | | Merge pull request #466 from Akarys42/reminder-upGravatar Sebastiaan Zeeff2019-10-25-3/+10
|\ \ \ | | | | | | | | New reminder features
| * \ \ Merge branch 'master' into reminder-upGravatar Sebastiaan Zeeff2019-10-25-1394/+2592
| |\ \ \ | |/ / / |/| | |
* | | | Merge pull request #543 from atmishra/moderator-channel-checkGravatar S. Co12019-10-25-7/+22
|\ \ \ \ | | | | | | | | | | Restrict ModManagement commands to moderation channels
| * \ \ \ Merge branch 'master' into moderator-channel-checkGravatar S. Co12019-10-25-17/+37
| |\ \ \ \ | |/ / / / |/| | | |
* | | | | Merge pull request #550 from python-discord/###-filtering-devtestGravatar S. Co12019-10-25-5/+1
|\ \ \ \ \ | | | | | | | | | | | | Use standard filter conditions even if DEBUG_MODE is on.
| * \ \ \ \ Merge branch 'master' into ###-filtering-devtestGravatar S. Co12019-10-25-15/+54
| |\ \ \ \ \ | |/ / / / / |/| | | | |
* | | | | | Merge pull request #529 from python-discord/show-trigger-wordGravatar S. Co12019-10-25-11/+24
|\ \ \ \ \ \ | | | | | | | | | | | | | | Display word triggered by watchlist in #mod-alerts
| * \ \ \ \ \ Merge branch 'master' into show-trigger-wordGravatar S. Co12019-10-25-1469/+2842
| |\ \ \ \ \ \ | |/ / / / / / |/| | | | | |
* | | | | | | Prepend emoji indicative of success of !eval (#552)Gravatar scragly2019-10-24-1/+12
|\ \ \ \ \ \ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Prepend emoji indicative of success of !eval Co-authored-by: null <[email protected]>
| * \ \ \ \ \ \ Merge branch 'master' into eval-emojisGravatar scragly2019-10-24-1468/+2830
| |\ \ \ \ \ \ \ | |/ / / / / / / |/| | | | | | |
| * | | | | | | Prepend emoji indicative of success of !evalGravatar kosayoda2019-10-24-1/+12
| | | | | | | |
| | * | | | | | Fix incorrect type hint for return valueGravatar kosayoda2019-10-24-2/+2
| | | | | | | |
| | * | | | | | Rename `triggered` to `match`Gravatar kosayoda2019-10-15-8/+6
| | | | | | | |
| | * | | | | | Show matched word and location in watchlist embedGravatar kosayoda2019-10-13-5/+20
| |/ / / / / /