Julio Biason
15 years ago
8 changed files with 290 additions and 1 deletions
@ -0,0 +1,152 @@
|
||||
======= |
||||
HACKING |
||||
======= |
||||
|
||||
How to hack Mitter |
||||
================== |
||||
First of all, Mitter is a Python project and it tries to follow PEP8_ |
||||
as close as possible. Sometimes, we fail, but we try to adhere to it |
||||
as much as possible. The Google Guidelines_ for Python are a good |
||||
summary about it, although we don't follow all their recommendations: |
||||
|
||||
- We use PyFlakes instead of Pychecker. PyFlakes seems to be better in |
||||
finding unused imports. As usual, some files don't adhere to it, |
||||
mostly helper tools (Sphinx and the helper PEP8 checker, for |
||||
example.) |
||||
- Exceptions do not start with an Error class. Each module should have |
||||
its own Exception, e.g. NetworkError and all other exceptions |
||||
should use that as base, e.g. :: |
||||
|
||||
class UnreachableNetworkError(NetworkError): |
||||
|
||||
- Function parameters do not need to follow the break lines, pointed, |
||||
but must follow the 80 columns rule. |
||||
|
||||
|
||||
Documentation |
||||
============= |
||||
Also, all documentation (including this file!) follows the Sphinx_ |
||||
format (ReSTructured_ format). This includes docstrings and external |
||||
files. |
||||
|
||||
Creating Interfaces |
||||
=================== |
||||
There is a couple of things you should take care when creating your |
||||
own interface. |
||||
|
||||
Naming and Location |
||||
------------------- |
||||
Your file must have the prefix "ui\_". It must be installed in the |
||||
``mitterlib/ui`` directory. |
||||
|
||||
class Interface |
||||
--------------- |
||||
Inside your module, there should be at least one class called |
||||
``Interface``. It may inherit any other class (or ``object`` in case |
||||
you don't need anything). |
||||
|
||||
__init__(self, connection, options) |
||||
----------------------------------- |
||||
The initialization will receive two parameters: |
||||
- connection: the network connection. Your interface will request any |
||||
network data with that object. You can check the ``Networks`` object |
||||
in the ``mitterlib/network/__init__.py`` for methods there (or read |
||||
the Sphinx documentation generated about it.) |
||||
- options: It's a ConfigOpt_ object, with all your interface options. |
||||
Use it for EVERTYHING that you'd hardcode. |
||||
|
||||
__call__(self) |
||||
-------------- |
||||
Once Mitter have everything set up, it will call your interface. |
||||
``__call__`` is to interfaces as ``run()`` is to threads. |
||||
|
||||
options(self, options) |
||||
---------------------- |
||||
``options`` is a ``@classmethod`` called by Mitter on the setting up |
||||
phase to populate the interface options. To add an option, use the |
||||
``add_option``; if your interface don't have any options, simply |
||||
return. Again, refer to the ConfigOpt_ documentation on how to use it. |
||||
|
||||
Creating Networks |
||||
================= |
||||
Naming and Location |
||||
------------------- |
||||
Network reside in the ``mitterlib/network`` directory. Contrary to |
||||
interfaces, it doesn't require any special prefixes. |
||||
|
||||
Base Class |
||||
---------- |
||||
All networks must inherit from the :class:`NetworkBase` object, in |
||||
the module ``networkbase``. There is a couple of method you should |
||||
implement in case you want it to return any data. If the network |
||||
doesn't support some functionality (e.g. reposts), simply don't |
||||
declare the function. :class:`NetworkBase` offers good defaults to |
||||
all functions (basically, returning nothing.) |
||||
|
||||
Base Return Object |
||||
------------------ |
||||
Most functions will return a :class:`NetworkData` object. It offers |
||||
an unified data format for every interface, so they don't need to |
||||
worry about each network data. It is wise to create your own |
||||
:class:`NetworkData`, inheriting from it, with its own ``__init__`` |
||||
and setting the properties. |
||||
|
||||
Mixing It All |
||||
============= |
||||
|
||||
Creating New Elements |
||||
--------------------- |
||||
In case you want to display/add a new element on your interface, you |
||||
need to add the element in :class:`NetworkData` with a default that |
||||
represents it better (for boolean values, set it to False; strings to |
||||
''; numbers to 0 or 0.0). Once your element is there, you can add it |
||||
in the networks (do not ignore other networks that may use that |
||||
information!) and then, finally, use it on your interface. |
||||
|
||||
Creating New Request |
||||
-------------------- |
||||
If you want to add a new functionality in the interfaces, you need do |
||||
to a couple of steps: |
||||
|
||||
- First of all, you need to add the method in the :class:`Networks`. |
||||
Remember that this is the class that the interfaces receive to do |
||||
all the other calls. If the function doesn't exist there, it won't |
||||
be call it at all. |
||||
|
||||
- Once the function is available to be called, you need to make it |
||||
available to the networks. For this, add the function in |
||||
:class:`NetworkBase` module, so calling it on networks that don't |
||||
have that method defined yet will still work. In this point, it |
||||
should return some sort of empty value (empty list, None). |
||||
|
||||
- Finally, add the function on your network. Follow the same name in |
||||
the :class:`NetworkBase` and you should be fine. |
||||
|
||||
Developer Discussion |
||||
==================== |
||||
Mitter have an open developer discussion maillist. Join us on |
||||
Mitter-Dev_ if you have any suggestions/patches/questions. |
||||
|
||||
(We had a massive problem with spammers in the recent days, so the |
||||
list is currently moderated. Your first message needs to be approved |
||||
and, after that, everything should be fine.) |
||||
|
||||
Souce Code Repository |
||||
===================== |
||||
Mitter uses Git for SCM and Gitorious to host it. You can check the |
||||
Mitter_ project there, clone it and hack away! ;) |
||||
|
||||
|
||||
.. _PEP8: http://www.python.org/dev/peps/pep-0008/ |
||||
|
||||
.. _Guidelines: http://google-styleguide.googlecode.com/svn/trunk/pyguide.html |
||||
|
||||
.. _Sphinx: http://sphinx.pocoo.org/ |
||||
|
||||
.. _ReSTRuctured: http://docutils.sourceforge.net/docs/user/rst/quickref.html |
||||
|
||||
.. _ConfigOpt: http://deadbraincells.org/configopt/docs/configopt.html |
||||
|
||||
.. _Mitter-Dev: http://groups.google.com/group/mitter-dev/ |
||||
|
||||
.. _Mitter: http://gitorious.org/projects/mitter |
@ -0,0 +1,37 @@
|
||||
======= |
||||
INSTALL |
||||
======= |
||||
|
||||
Requirements |
||||
============ |
||||
|
||||
Mitter requires Python, at least version 2.5. Version 2.6 should be |
||||
fine. There is no guarantee that it will work with Python 3.0 at this |
||||
point. |
||||
|
||||
For the GTK interface, you'll need PyGTK installed. The minimum |
||||
version is 2.10 and Mitter should work fine with any further version |
||||
in the 2.x series. Again, there is no guarantee that it will work with |
||||
GTK 3.0 when it's released. Also notice that PyGTK is optional and |
||||
Mitter will use it's console interfaces in this case. |
||||
|
||||
Installation |
||||
============ |
||||
|
||||
Installation follows the default Python apps install: |
||||
|
||||
Using easy_install |
||||
------------------ |
||||
|
||||
You can install using easy_install. To install, simply call |
||||
``easy_install mitter``. It may require root access to install some |
||||
files. |
||||
|
||||
Using setup.py |
||||
-------------- |
||||
|
||||
After unpacking the Mitter package, you'll find a ``setup.py`` file. |
||||
To install, call ``python setup.py install`` and it will install |
||||
Mitter in ``/usr/local/bin``. To install in a different directory, use |
||||
the ``--prefix`` parameter. ``python setup.py help`` will show other |
||||
options you can use. |
@ -0,0 +1,83 @@
|
||||
====== |
||||
README |
||||
====== |
||||
|
||||
About Mitter |
||||
============ |
||||
Mitter is a multi-protocol, multi-interface client for micro-blogging |
||||
sites. |
||||
|
||||
Options |
||||
======= |
||||
To get a list of options Mitter support, you can call it with |
||||
``mitter --help``. Along with the default options, you'll get options |
||||
for each interface and network. |
||||
|
||||
Config file |
||||
----------- |
||||
Mitter saves its options in a config file in your home directory, |
||||
called ``.mitter.ini``. Some options, not displayed in the command |
||||
line options, are available there. Be careful when changing those |
||||
options or Mitter may stop working. |
||||
|
||||
In any case, if things don't seem to be working, you can remove this |
||||
file and Mitter will ask the necessary options to work again. |
||||
|
||||
Networks |
||||
======== |
||||
As for version 1.0, Mitter supports Twitter. |
||||
|
||||
Interfaces |
||||
========== |
||||
As for version 1.0, Mitter have the following interfaces: PyGTK, TTY, |
||||
Cmd, Zork. |
||||
|
||||
Choosing Interfaces |
||||
------------------- |
||||
If you want to chose a specific interface, you can use the ``-i`` |
||||
option, followed by the interface name. |
||||
|
||||
PyGTK |
||||
----- |
||||
PyGTK is a graphical interface, which uses the GTK toolkit. To be |
||||
used, it requires that PyGTK is installed in your system. If you don't |
||||
have PyGTK, Mitter will switch to another interface that doesn't |
||||
require it. |
||||
|
||||
TTY |
||||
--- |
||||
TTY is a text interface, used to display the updates. It does not |
||||
offer any interactivity. You can use it to do automated updates |
||||
without user intervention or to simply retrieve the current messages. |
||||
|
||||
Cmd |
||||
--- |
||||
CMD is a text interface, with a command line. It offers some smart |
||||
behaviour, like retrieving new messages when there is no option and |
||||
starting an update when the command is not recognized. |
||||
|
||||
Zork |
||||
---- |
||||
Zork is another text interface, but works a little bit slowly than the |
||||
Cmd interface. Instead of displaying all the messages at once, Zork |
||||
displays message by message, requiring the user to jump to the next |
||||
message. It offers a fine-grained control to which message to reply, |
||||
at the expense of few commands. |
||||
|
||||
How Mitter Finds Interfaces |
||||
--------------------------- |
||||
Mitter uses Python default module loading to find interfaces. This |
||||
means: It will search modules starting with the current directory, |
||||
then the global system path. When installed via ``setup.py`` or |
||||
``easy_install``, interfaces will be installed in the global system |
||||
directory; if you don't want to install Mitter, you can run it in the |
||||
command line, just be sure to be in the main ``mitter`` directory |
||||
before call it. |
||||
|
||||
Suggestions? Bugs? |
||||
================== |
||||
If you have any suggestions or think your found a bug, don't keep it |
||||
to yourself! We have an open bug tracking with Google Code open to the |
||||
public. Be sure to check there and drop your opinion: |
||||
|
||||
http://code.google.com/p/mitter/ |
Loading…
Reference in new issue