Commit graph

203 commits

Author SHA1 Message Date
Robert Hönig a75f1abc60 zulip_bots: Add -c shortcut for --config-file for zulip-run-bots. 2017-11-27 16:45:37 +01:00
Robert Hönig ea6ddb2312 zulip_bots: Only cache storage.get(). Don't cache put(). 2017-11-24 10:44:34 -08:00
Steve Howell a32446f557 Report client.get_profile() errors nicely (e.g. API key).
This patch is particularly useful in the scenario that your
API key is wrong or out of date, but it's targeted more
generally at any error that `client.get_profile()` reports.
2017-11-22 11:15:00 -08:00
Steve Howell 043d963a99 Fail fast for bad connections with the API and bots.
The API has aggressive retry logic for connecting to a
server, which may make sense for situation where you have
connection blips or server restarts.

When you're first connecting to the API, however, connection
failures are almost certainly a sign of misconfiguration, so
now we fail fast.

The bot lib takes advantage of this API change by catching the
ZulipError exception and exiting gracefully.
2017-11-21 14:21:04 -08:00
Steve Howell a19278da65 Handle configparser errors more gracefully. 2017-11-21 11:54:59 -08:00
Steve Howell e216a29277 minor: Extract client_name local var. 2017-11-21 11:26:12 -08:00
Steve Howell 73ebd719b2 Handle missing config files gracefully.
Before this commit, you would get a traceback if you supplied
a non-existent filename for your config file.  Now we exit
gracefully with a useful error message.
2017-11-21 10:32:45 -08:00
Steve Howell f6440e5b65 Require --config-file and simplify command line usage.
We now require users to specify where their config file is
located, and we no longer default to ~/.zuliprc.

As part of this, we needed to make the "usage" more accurate
in the command line, which I mostly achieved by cutting out
unnecessary stuff.
2017-11-21 09:11:41 -08:00
derAnfaenger 940e1260b2 docs: Update outdated links. 2017-11-20 15:09:50 +01:00
derAnfaenger 2a74ad11c5 zulip_bots: Make StateHandler optional.
This has the convenient side-effect of making
the bot_handler.storage attribute read-only.
2017-11-18 08:58:47 -08:00
derAnfaenger f41030b515 API: rename get_state & update_state to get_storage & update_storage. 2017-11-18 08:58:47 -08:00
derAnfaenger 2736223073 bots: Make StateHandler store state on Zulip server.
This makes the StateHandler functional. To reduce the
number of server roundtrips when fetching/updating the
state, the entire state is fetched ocne at bot
initialization and cached. All changes are stored in the
cache and only saved externally after handle_message()
has been executed.

Fixes #141.
2017-11-18 08:58:47 -08:00
derAnfaenger 979bbb1c14 bot tests: Consistently use mock_bot_handler instance of MockClass. 2017-11-18 08:58:47 -08:00
derAnfaenger daad7f24e4 bots: Set JSON as default serializer for StateHandler.
With this change, StateHandler.put() does only accept JSON-able
objects by default. The incrementor test tried to store the return
value of send_reply(), a non-JSON-able MockObject, in the state.
Therefore, this commits also sets functional default test return
values for send_message() and send_reply().
Finally, it fixes the tictactoe bot which relied on directly
modifying the state_ attribute.
2017-11-18 08:58:47 -08:00
Eeshan Garg bd7db69bac bots/giphy: Document the bot. 2017-11-16 09:09:04 -08:00
derAnfaenger a8b858d78f zulip_bots: Update links to docs. 2017-11-16 13:54:02 +01:00
neiljp (Neil Pilgrim) 59b86b5b68 mypy: Add reported issue to 'type: ignore' line in generate_manifest.py. 2017-11-15 13:43:08 -08:00
neiljp (Neil Pilgrim) 03f5e9110b mypy: Add comment on ConfigParser.readfp 'type: ignore'.
readfp remains valid but is deprecated, so is not in the python3 stubs.
2017-11-15 13:43:08 -08:00
derAnfaenger 761e3e5855 zulip_bots: Update README.md.
This stubs the zulip_bots README.md
and moves architectural information
to architecture.md.
2017-11-14 09:51:09 -08:00
derAnfaenger 5f3b3436f6 zulip_bots: Remove redundant custom tests in encrypt. 2017-11-14 09:39:00 -08:00
derAnfaenger 9c37f92a01 zulip_bots: Add common tests.
unittest includes by default all module-level classes that inherit
from TestCase and implement at least one method starting with 'test'.
Since it doesn't provide a convenient way for excluding TestSuites,
we need to manually filter out the unwanted testing of our test base
class itself.
2017-11-14 09:39:00 -08:00
Josh Mandel 94b7c2eaef zulip_bots: Make xkcd bot error more verbose. 2017-11-13 17:00:32 +01:00
derAnfaenger 55332d8cbc zulip_bots: Fix and simplify extract_query_without_mention.
This fixes quirks related to the regex not covering all potential
weird usernames and adds tests for stripping the @-mentions.
2017-11-10 16:09:20 -08:00
derAnfaenger e05ce661c5 zulip_bots: Enforce default config file schema.
This requires the bot's config section to be named
after the bot. All config entries must be contained
in this section.
2017-11-06 14:20:39 -08:00
derAnfaenger 1a096b317b zulip_bots: Standardize weather bot's config file. 2017-11-06 14:20:39 -08:00
derAnfaenger 56ac3f1b73 zulip_bots: Add config file for github_detail bot. 2017-11-06 14:20:39 -08:00
derAnfaenger 8d81d37351 zulip_bots: Move unmaintained bots to unmaintained dir. 2017-11-02 15:15:52 +01:00
derAnfaenger 8cdc4a6619 zulip_bots: Remove github helper module.
No bot is dependant on this module. No
future bot should be dependant on it,
since it is not a bot itself and is thus
blurring the structure of the bots dir.
2017-11-02 15:15:52 +01:00
derAnfaenger 8dab6140ee zulip_bots: Remove git_hub_comment bot.
This bot has no tests and a command set that is
impractical and confusing to use. It offers no
practical benefit.
2017-11-02 15:15:52 +01:00
derAnfaenger ff05a8f710 zulip_bots: Remove github_issues bot.
This bot has no tests and no documentation. Its
usage and purpose are unclear.
2017-11-02 15:15:52 +01:00
derAnfaenger 80534a50b6 zulip_bots: Add directory for unmaintained bots. 2017-11-02 15:15:47 +01:00
derAnfaenger cfb767ad0f zulip_bots: Make virtual_fs bot state fully JSON-able. 2017-10-31 23:15:28 +01:00
derAnfaenger aef41de37a tools: Remove obsolete state_handler param from handle_message(). 2017-10-31 12:23:29 +01:00
Alena Volkova fd519252d6 mypy: zulip_bots: Fix errors in zulip_bots/zulip_bot_output.py. 2017-10-27 00:56:16 -04:00
Alena Volkova 5e7f4c595f mypy: zulip_bots: Annotate zulip_bots/test_run.py. 2017-10-27 00:56:16 -04:00
Alena Volkova afb9886553 mypy: zulip_bots: Fix errors in zulip_bots/test_lib.py. 2017-10-27 00:56:16 -04:00
Alena Volkova 6546917088 mypy: zulip_bots: Annotate zulip_bots/run.py. 2017-10-27 00:56:16 -04:00
Alena Volkova 47d8ab8f9a mypy: zulip_bots: Fix errors in zulip_bots/provision.py. 2017-10-27 00:56:15 -04:00
Alena Volkova 3a20dee621 mypy: zulip_bots: Fix errors in zulip_bots/lib.py. 2017-10-27 00:56:15 -04:00
Alena Volkova ad050fc806 mypy: zulip_bots: Fix errors in setup.py. 2017-10-27 00:56:15 -04:00
Alena Volkova 3d282a12a7 mypy: zulip_bots: Fix errors in generate_manifest.py. 2017-10-27 00:56:06 -04:00
derAnfaenger 59f81845dd zulip_bots: Update StateHandler API to behave dict-like.
This matches the external StateHandler API with the embedded
StateHandler API.
2017-10-24 13:15:51 +02:00
derAnfaenger 32df4e097d tictactoe bot: Store game state in JSON-able format. 2017-10-24 13:03:41 +02:00
derAnfaenger 8761e47893 zulip_bots: Store testing conversations in lists.
This enforces the use of a list of tuples for
conversations, as opposed to dicts.
2017-10-24 11:14:09 +02:00
derAnfaenger 8179b30873 zulip_bots: Reify StateHandler testing.
This simplifies testing stateful bots by integrating the StateHandler
into the test library. As a side-effect, the mock bot handler gets
reused during a test, making the tests more realistic. The
StateHandler now keeps its state during a call to check_expected_responses,
forcing some stateful tests to be more verbose and explicit.
2017-10-24 11:07:58 +02:00
derAnfaenger e331426c64 zulip_bots: Rename state_handler to storage. 2017-10-23 12:24:41 +02:00
derAnfaenger eb6982e670 zulip_bots: Make state_handler property of bot_handler. 2017-10-23 12:17:46 +02:00
derAnfaenger 45c38d0dcf bot tests: Autospec mock bot handler.
This makes test development less error-prone and closer
to reality.
2017-10-23 11:56:01 +02:00
Eeshan Garg 4af8bcd46e packaging: Upgrade package version (0.3.5 -> 0.3.7). 2017-10-21 01:10:25 -02:30
Steve Howell 08e212138d Look for mentioned in flags.
The Zulip server, starting in 1.7, no longer sends
`is_mentioned` in the message payload, and it was buggy in
earlier versions, so now we check `flags`.
2017-10-20 17:33:59 -07:00
Eeshan Garg 1e8e1f17c4 release: Upgrade package versions (0.3.4 -> 0.3.5). 2017-10-09 14:13:32 -02:30
Eeshan Garg 81073f9234 packaging: Automate the package release process.
This commit adds a script to automate the PyPA release of the
zulip, zulip_bots and zulip_botserver packages.

The tools/release-packages script would take care of uploading
the packages to PyPA, and push commits to both repos updating the
package versions. If you have commit access to the repos, you
can --push upstream to master. If not, then you can --push
origin to a new branch on your fork and create a PR for those
changes.

Ideally, a release shouldn't take longer than however long it
takes one to type the above command. If you have SSH set up on
GitHub, you won't need to type in your GitHub username and
password. You can also store your PyPA credentials in a file
in your home directory; it isn't very secure, but it saves
time nevertheless.
2017-10-05 12:01:37 -07:00
Eeshan Garg aaece51380 packages: Stop hardcoding version in dependency checks.
In zulip_bots/setup.py, we now don't specify a minimum version when
checking for dependency on the zulip package. We just want the
latest one.

In zulip_botserver/setup.py, we now don't specify a minimum version
when checking for dependencies on the zulip and zulip_bots package.
We just want the latest ones.
2017-10-05 12:01:37 -07:00
Eeshan Garg 07edd4aa9b zulip_bots: Add custom command for generating MANIFEST.in.
We now have a custom command in zulip_bots/setup.py to generate
a MANIFEST.in. To generate a MANIFEST for a PyPA release, we
can now run:

python setup.py gen_manifest --release

To generate a non-release MANIFEST, we can run:

python setup.py gen_manifest

This allows us to automate the MANIFEST generation in our
release automation script.
2017-10-05 12:01:37 -07:00
Eeshan Garg dfe4360108 zulip_bots/MANIFEST: Support generating MANIFEST for PyPA release.
The generate_manifest.py script now takes a --release argument
that generates a separate MANIFEST for a PyPA release that
include:

* doc.md files
* related assets/* files

A release MANIFEST doesn't include logos and fixtures.
A non-release MANIFEST includes everything.
2017-10-05 12:01:37 -07:00
Eeshan Garg a887692ae4 zulip_bots/MANIFEST: Include zulip_bots/bots/<bot>/assets/*. 2017-10-05 12:01:37 -07:00
neiljp (Neil Pilgrim) 8987ec23e2 bots: zulip_bot_output.py: Check for absence of handler_class in bot. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) 8e9c6cd22e bots: zulip_bot_output.py: Check for failed bot module import. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) dd283d88f6 bots: zulip_bot_output.py: Adjust examples in help text. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) 682ef81970 bots: zulip_bot_output.py: Use built-in argparse formatting for usage. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) 7835f1cc19 bots: zulip_bot_output.py: Add note to usage re using quotes. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) 4fff603f44 bots: zulip_bot_output.py: Switch message to being required. 2017-10-05 11:59:56 -07:00
neiljp (Neil Pilgrim) c33ac65ac9 define bot: add check & test to avoid sending words with non-letters. 2017-10-05 11:54:43 -07:00
neiljp (Neil Pilgrim) f862cf2222 wikipedia bot: encode urls correctly in http request & adjust tests. 2017-10-05 11:54:43 -07:00
Eeshan Garg 8adf51890a bots/xkcd: Improve and refactor doc.md to use Markdown macros.
This commit does the following:
* Minor improvements to the writing wherever possible.
* Replace links to screenshots with links that would work when
  rendering said screenshots on the main repo. This would mean
  the screenshots won't be rendered outside the main repo.
* Adds a section that links to our Bots Guide's How to run a bot
  tutorial by using a Markdown a macro.
2017-10-03 18:11:38 -07:00
Eeshan Garg 4a162ba625 bots/xkcd: Add a logo. 2017-10-03 18:11:38 -07:00
neiljp (Neil Pilgrim) 34515454b5 bots: Mark --message/-m argument to zulip_bot_output.py as required. 2017-09-30 21:53:51 +02:00
neiljp (Neil Pilgrim) 85f2a9e03d bots: Add basic metadata with failover, used on running only. 2017-09-25 14:39:02 -07:00
Eeshan Garg 5681b6e9e2 zulip_bots: Remove get_bot_doc_path and get_bot_logo_path.
These functions were rendered redundant by changes in our
approach on how the main repo renders docs and logos contained
in the zulip_bots package (see #6103). So, these should now be
removed.
2017-09-16 17:10:12 -02:30
derAnfaenger 18157095c4 zulip_bots: Add unittests for run.py.
These are tests that assert the correct argument
parsing; the successful execution of bots is not verified.
2017-09-13 00:25:16 -07:00
derAnfaenger 3e1d9b17a4 zulip_bots: Import imp.load_source for Python < 3.5. 2017-09-12 05:21:00 -07:00
derAnfaenger 7d1a56fb2b zulip_bot_output.py: Refactor script output.
This involves using the format() method for string
concatenation and splitting it into logical blocks.
2017-09-12 02:11:30 -07:00
derAnfaenger 517fe79e68 zulip_bot_output.py: Remove redundant get_config_info() definition. 2017-09-12 02:11:30 -07:00
derAnfaenger 438dbac12a zulip_bot_output.py: Make --path-to-bot argument positional.
This allows a user to exclusively enter a bot's name or a bot's
directory as the first and only positional argument. Therefore,
no complicated checks for multiple bot specifications are required
anymore.
Additionally, this cleans help messages and makes arguments more
accessible.
2017-09-12 02:11:30 -07:00
derAnfaenger 3a89b9f966 zulip_bot_output.py: Clear import statements. 2017-09-12 02:11:30 -07:00
derAnfaenger 2aa6201d47 zulip_bot_output.py: Rename options to args. 2017-09-12 02:11:30 -07:00
derAnfaenger c5ab72a50a zulip_bots run.py: Make --path-to-bot argument positional.
This allows a user to exclusively enter a bot's name or a bot's
directory as the first and only positional argument. Therefore,
no complicated checks for multiple bot specifications are required
anymore.
2017-09-12 02:11:30 -07:00
derAnfaenger 06c0cb82fa zulip_bots run.py: Clean help messages. 2017-09-12 02:11:30 -07:00
derAnfaenger 0a588dad55 zulip_bots run.py: Rename options to args. 2017-09-12 02:11:30 -07:00
Eeshan Garg 390054da62 python-zulip-api: Upgrade versions (0.3.3 -> 0.3.4). 2017-09-11 21:09:28 -02:30
derAnfaenger 18b92e5b46 zulip_bot_output.py: Fix misnamed import.
Followup for the last commit.
2017-09-06 23:41:37 +02:00
derAnfaenger bbf444c2bc zulip_bots run.py: Fix misnamed function. 2017-09-06 13:40:42 +02:00
Eeshan Garg 6e798f317f python-zulip-api: Upgrade versions (0.3.2 -> 0.3.3).
We now have "universal" wheel distributions. Universal wheels
support both Python 2 and Python 3.
2017-09-01 23:10:12 -02:30
derAnfaenger 2f474bdb02 bots: Fix broken config path generation. 2017-08-31 10:52:04 -07:00
Abhijeet Kaur 5a426fa841 bots: Converter bot does not require a config file.
Remove unnecessary file.
2017-08-29 14:04:16 -07:00
Abhijeet Kaur fec14ca286 bots: Add additional check to avoid ambiguous case.
If a user provides both the name and the path to the bot
as input then we either will have to chose one of them
or alert the user to check the input. Selecting the latter
by sending an error message to the user.
2017-08-29 14:04:16 -07:00
Abhijeet Kaur dd13d0314b bots: Improve code-style by using 'return' once. 2017-08-29 14:04:16 -07:00
Abhijeet Kaur 402dda87fe bots: Mock 'send_message' function for 'zulip-bot-output'.
Very few bots like followup bot directly call 'send_message'
function from the bot code. Since ExternalBotHandler class is
mocked, we'll have to mock 'send_message' function as well.

Added dummy field value of 'sender_email' for the message to be
as followup bot requires that field while processing
the message.
Since send_message is directly called from a specific bot's code,
so it can be sent to a different stream or under a different topic
than that of the incoming message. So, print the entire message
along with stream name.

A bot calling 'send_reply' function will reply to the incoming
message in the same stream under the same topic. So, only printing
bot's response message content for that.
2017-08-29 14:04:13 -07:00
Abhijeet Kaur 36f4982e54 bots: Mock get_config_info function for get-bot-output.
Since ExternalBotHandler class is mocked, few bots that
require specific configurations require to run get_config_info.
2017-08-29 13:58:05 -07:00
Abhijeet Kaur 23f6d2f144 bots: Add manual command to get bot output.
This eliminates the need to setup dev environment and to
create a bot, setup zuliprc file, subscribe the bot to the
stream in order to try out a bot.

Manual command get-bot-output gives the bots response content
directly.
2017-08-29 13:58:05 -07:00
derAnfaenger 6c47eda92b definition bot: Clarify error message. 2017-08-25 10:01:44 +02:00
neiljp (Neil Pilgrim) 749356d34b Incrementor tests: Preliminary coverage with no update_message support. 2017-08-24 10:24:41 -07:00
neiljp (Neil Pilgrim) d8c4242053 VirtualFS tests: Improve test coverage. 2017-08-24 10:24:41 -07:00
neiljp (Neil Pilgrim) 37206db176 TicTacToe tests: Improve test coverage. 2017-08-24 10:24:41 -07:00
derAnfaenger b3fc7edcf7 git: Ignore automatically generated MANIFEST.in. 2017-08-24 10:01:53 -07:00
Tim Abbott d42fa61dee test_lib: Clean up variable names. 2017-08-23 19:06:30 -07:00
neiljp (Neil Pilgrim) bef80129bd bot testing: Set check_expected_responses to test one source at a time.
When testing bots with state and using type="all", it is expected that
the passed-in state will be applied for each source individually.
This commit moves away from alternating between sources for each test,
to running all the tests on each source with a copy of state_handler.
2017-08-23 19:00:33 -07:00
neiljp (Neil Pilgrim) 2bd81eaff1 bot testing: Allow check_expected_responses to take Sequence[Tuple].
Ordered data is required for logical testing of stateful bots, as
compared to the previous use of a dict.
2017-08-23 19:00:33 -07:00
Abhijeet Kaur 83bfcb6535 bots: Modify is_private function to take 'id' as parameter.
This is done so that Embedded bot system can also make use of
this function directly, as only id is needed in this function.

Tweaked by tabbott to have a cleaner interface and simpler
documentation.
2017-08-22 12:03:09 -07:00
Abhijeet Kaur ae434cd26c bots: Use user 'id' instead of 'name' in is_private function.
Names are not guaranteed to be unique, user ids should
be used when comparing if the sender and receiver are the same.
2017-08-22 11:59:11 -07:00