Commit Graph

195 Commits

Author SHA1 Message Date
enkore
ed7f95dd34 #5: Ability to scream out loud if battery is low :-) 2013-03-05 17:26:49 +01:00
enkore
6740f5b1cc #5: Add slim wrapper for notifications 2013-03-05 17:26:28 +01:00
enkore
03d96ad0ea Some internal code butchering again. 2013-03-05 17:26:10 +01:00
enkore
3cac448f6e Change process title of threads to something meaningful, if setproctitle is installed. 2013-03-02 20:05:41 +01:00
enkore
d6f1cbbd46 Fixed a bug where battery would generate no output in occasions where it should. 2013-03-02 17:35:19 +01:00
enkore
3c284ad29c Docstrings and such 2013-03-02 17:34:53 +01:00
enkore
3ebcbec4e1 i3pystatus.core.threads ; some smaller changes. 2013-03-02 17:34:32 +01:00
enkore
901dd4319f New self-organizing/self-optimising threading model (no API changes)
Using a simple, hysteresis based approach… currently in this first
version the optimizer recursively moves modules out of a thread until a
certain timing target is reached; the "modules moved out" just mentioned
are then partitioned into new threads according to their latest time profile.

Very simple, but very effective.
Todo: Implement merging threads with (again) good behaving workloads.
2013-02-28 00:14:51 +01:00
enkore
604a4f8e29 disk module 2013-02-26 23:00:03 +01:00
enkore
2aba299677 __main__.py.dist 2013-02-26 01:38:06 +01:00
enkore
9510f0b1c0 Added ability to automatically import modules
I thought: Well, isn't it a bit redundant if I go ahead and say in my
config "import this-n-that and temp and load and alsa" while later
just giving register() the modules.
So register() (/ClassFinder as the backend) now support just naming a
module as the first parameter. That module is then imported and
searched for a class as usual.

Just for reference the synopsis of Status.register():

register(mod.SomeChecker())
register(mod, setting1=..., setting2=...)
register(mod, {"setting1:":, "setting2":...})
register("mod", setting=1..., setting2=...)
register("mod", {"setting1:":, "setting2":...})

Fun fact: Actually register() doesn't care for it's arguments.
They're passed straight into ClassFinder.instanciate_class_from_module
(something I should definitely rename), which checks if it's first
parameter is one of:
-Python module
 => It calls ClassFinder.get_class with the same parameters
   => get_class will search the module using ClassFinder.search_module
      and return a matching class if and only if there is a single matching
      class in the module
-string
 => It calls ClassFinder.get_module to import the module and calls itself
  on the result
-something else
 => It returns that something

The actual variation in passing the settings (keyword arguments vs. dict)
is handled in SettingsBase.
2013-02-26 00:56:09 +01:00
enkore
b404b85cbb temp: add note about AMD support (=none) 2013-02-25 21:32:54 +01:00
enkore
3dc99ab5b2 runwatch module
It's exactly the same as i3status... I even copied the manpage!
2013-02-25 21:32:38 +01:00
enkore
197f1541b3 Fixed alsa not displaying volume changes correctly 2013-02-25 19:36:41 +01:00
enkore
446eda7218 alsa module, requires pyalsaaudio (from PyPI) 2013-02-25 18:36:17 +01:00
enkore
9ab3c751da "hardened" modsde 2013-02-24 23:34:32 +01:00
enkore
76d86807db As we can have multiple backends for mail already,
we don't need the multiple-servers functionality in imap.
Just add multiple instances of that backend.
2013-02-24 22:54:32 +01:00
enkore
582a35e412 . 2013-02-24 22:40:29 +01:00
enkore
a89b421ebb battery 2013-02-24 21:46:29 +01:00
enkore
a892a09581 Moving some code around. 2013-02-24 21:00:16 +01:00
enkore
1fd53cd60a Add ModuleList 2013-02-24 20:20:15 +01:00
enkore
92b2af56a8 Removed ModuleFinder, changed ClassFinder
ClassFinder:
Removed exclude argument, which is basically covered with
obj.__module__ == module.__name__ which ensures that no imported
classes are found, which was the only use case for exclude.
2013-02-24 20:16:33 +01:00
enkore
a2104f5d2f Removed support for indicating the position of a module 2013-02-24 20:13:57 +01:00
enkore
fcd68e1ec1 battery 2013-02-24 18:44:00 +01:00
enkore
1b6498883b Divided __init__ into some submodules
This didn't change the public "API" used by modules.

.core.io contains the IO classes, namely IOHandler, StandaloneIO and JSONIO

.core.util contains SettingsBase and ClassFinder

.core.exceptions contains all custom exceptions
2013-02-24 18:43:00 +01:00
enkore
a06c4ef580 Moved backlight into submodule 2013-02-24 15:25:11 +01:00
enkore
2196c27ad4 This is probably a better way to handle file.File-based modules. 2013-02-24 15:16:07 +01:00
enkore
7d0193ccc1 Readme 2013-02-24 15:11:43 +01:00
enkore
7999cc453b Added file "template" for backlight info
This is 100pct. the same functionality as a complete module before :-)

But still,  have to come up with some better way to manage these "templates".
And a place to stash them.
2013-02-24 05:25:29 +01:00
enkore
20da1dbb08 Remove backlight module, add file module (kinda overpowered :-) 2013-02-24 05:20:35 +01:00
enkore
a5bcf9bfa2 backlight module
Probably I'll discard these as soon as I come up with a nice
generic way of reading multiple files, converting values etc.
2013-02-24 02:12:32 +01:00
enkore
bde56dfdec made battery module much more flexible
So I can have my old representation back... indeed you can
do pretty much anything now with it:

status.register(battery,
    format="{consumption:.2f}W {percentage:.2f}% [{percentage_design:.2f}%] {remaining_hm}"
)
2013-02-24 01:36:56 +01:00
enkore
ed003c123f temp module 2013-02-24 00:34:16 +01:00
enkore
a0fc9eb492 load module 2013-02-24 00:02:35 +01:00
enkore
c4db62d2a4 Some small changes 2013-02-23 23:50:50 +01:00
enkore
3677ffc852 Rewrote SettingsBase 2013-02-23 23:48:48 +01:00
enkore
4e06a9c2ee batterychecker → battery 2013-02-23 23:46:33 +01:00
enkore
8fba0b69a3 Fixed thunderbird
(deeeeeep recursion)
2013-02-23 23:00:28 +01:00
enkore
9e6af3661a Mail 2013-02-23 23:00:14 +01:00
enkore
3f46ab24c6 flying-sheep via GS 2013-02-23 21:05:27 +01:00
enkore
c96410e92d Automagic name attribute in JSON output
If name is not set by the module, it's set automatically to the
fully qualified python dotted path to the module :-)
2013-02-23 20:52:07 +01:00
enkore
13c684860d Actualize clock once per second 2013-02-23 20:43:38 +01:00
enkore
dd7b5ef346 i3bar has some issues with locale-handling I guess.
It reliably crashes i3pystatus, but only if started by i3bar. Meh.
I can't tell if this locale issue is local (ha-ha) or everyone is affected.
2013-02-23 20:41:42 +01:00
enkore
ebe3d718e3 Reworked exceptions 2013-02-23 20:15:20 +01:00
enkore
70155b2f18 Fixed clock (my bad) 2013-02-23 19:05:57 +01:00
enkore
f6e5530468 ~rough refactoring 2013-02-23 18:59:48 +01:00
enkore
163662a633 README 2013-02-23 18:45:05 +01:00
enkore
60be03126d Docstrings 2013-02-23 18:41:53 +01:00
enkore
9dc7041997 First draft of a doc generator for this
(Already supports multiple Modules per python module)
2013-02-23 18:41:33 +01:00
enkore
d31fe9a62d Moving code around a bit 2013-02-23 18:40:59 +01:00
enkore
1cdc722f46 SettingsBase 2013-02-23 17:40:35 +01:00
enkore
040341021c modsde uses .format now 2013-02-23 17:40:23 +01:00
enkore
9d5c516d68 Renamed IMAP mail checker to … imap 2013-02-23 15:19:25 +01:00
enkore
eb1ce22610 IMAP mailchecker 2013-02-23 15:19:11 +01:00
enkore
761034dd01 Thunderbird 2013-02-23 15:18:56 +01:00
enkore
93b7ba9af9 Ported notmuchmail (needs testing) 2013-02-23 15:16:53 +01:00
enkore
7fceb73ff3 Mail checkers
Mail checkers are not separate modules anymore; there is only one
mail checker module (called mail) that can make use of various backends
, which were formerly modules on their own.

This greatly simplifies code and reduces redundance.

This commit only contains the base classes for this.
2013-02-23 15:16:23 +01:00
enkore
7c8fcb8758 Refactored the "find appropiate class" part a bit 2013-02-23 15:03:21 +01:00
enkore
efb2b31ee8 StandaloneIO 2013-02-23 14:09:23 +01:00
enkore
26cc3ff27a . 2013-02-23 14:06:55 +01:00
enkore
a1b84b74d2 Fixed issue with standalone usage 2013-02-23 13:54:35 +01:00
enkore
a354a8288e Configuration shortcut
You can now pass a module (the Python thing, e.g. modsde) into register
and it will just "do the right thing" (find a class derived from Module
in that module and instanciate it with any extra arguments)
2013-02-23 13:53:54 +01:00
enkore
612faaaa4e Adopted modules to new settings system
Btw. nothing has changed for the config files. You can pass into
__init__ a dict as before, or you can use keyword arguments.

Either way, a module defines the settings that can be specified
and those which are required. __init__ basically checks that all
required options are set and that no invalid options are used.
2013-02-23 00:12:45 +01:00
enkore
c967cdecb2 Settings system. Now is probably the right moment to tell if you don't like it :) 2013-02-23 00:11:02 +01:00
enkore
bf3b77ddbd Code cleanup 2013-02-22 23:21:53 +01:00
enkore
5474980b11 Support for standalone operation
Specify standalone=True to the I3statushandler constructor
to run i3pystatus without i3status in the background.
i3pystatus won't read input from stdin or any other
file object specified with input_stream.

The keyword argument interval specifies how often output should
be generated. The default is 1 (second).


Sorry guys for changing the way i3pystatus "way of operation"
is set so often. If you're want the "self-contained" mode
(you execute i3pystatus, i3pystatus automatically starts
i3status), don't set the file attribute, but pass the file
descriptor of the pipe as input_stream like this:

process = subprocess.Popen(["i3status", "-c", "~/.i3/status"], stdout=subprocess.PIPE, universal_newlines=True)
status = i3pystatus(input_stream=process.stdout)

On a side note:
The main class name has been changed to i3pystatus, but I3statusHandler
is still available as an alias. Use whichever you prefer :-)
(Linux is about choice after all)
2013-02-22 21:23:58 +01:00
enkore
4c5dfbe429 Using uevent instead of the separate files reduces I/O...
...and makes the code a bit cleaner.

Didn't touch much of the class logic, except that it just
displays the charge if the state is "Unknown".
2013-02-22 21:04:33 +01:00
enkore
62b59db8d6 Fixed issue #9
Notmuch checker does not work in this state
NotmuchMailChecker does not work because of a conflict between the notmuch Python API and the file for NotmuchMailChecker which is also named notmuch.

I suggest to rename i3pystatus/notmuch.py to i3pystatus/notmuchchecker.py and modify main.py.dist appropriately.

Reported by mjepronk

Also removed some superfluous whitespace
2013-02-22 18:16:39 +01:00
enkore
8a1041ac0e Merge branch 'master' of https://github.com/janoliver/i3pystatus 2013-02-22 18:14:05 +01:00
Matthias Pronk
400d639e31 register_module has been renamed to register 2013-02-22 14:15:14 +01:00
Matthias Pronk
0adbc0ad28 remove unused import 2013-02-22 14:11:05 +01:00
Matthias Pronk
fdadd3f143 clock added 2013-02-22 13:59:28 +01:00
Matthias Pronk
c72363092d battery checker added 2013-02-22 13:56:37 +01:00
enkore
4966f90775 .dist 2013-02-21 16:08:52 +01:00
enkore
99b1e003cb Fixed crash if used with normal pipe
If one wants to run i3status as a subprocess of
i3pystatus, do it like this:

import subprocess
import io
...
process = subprocess.Popen(["i3status", "-c", "~/.i3/status"], stdout=subprocess.PIPE)
stdin = io.TextIOWrapper(process.stdout)
status = I3statusHandler(stdin)
2013-02-21 14:05:11 +01:00
enkore
426f57d97d Regex module. Batteries... eh.. example included.
*gotta get some sleep. maybe.
2013-02-21 04:56:34 +01:00
enkore
d3228cc8be Reworked that (again) 2013-02-19 01:59:59 +01:00
enkore
d4f1c77c85 Once in a while I even delete code. I like it. 2013-02-19 01:59:43 +01:00
enkore
e3829b5700 We were finally successful in moving the input loop
to the lower I/O layer.
This means we unified the loop with it's implicit abort
condition (end of stream or ^C).
2013-02-18 19:15:27 +01:00
enkore
6ff3e8ebf3 One may want to change the ordering
("injecting" items in the middle of i3status output, for example)
2013-02-18 18:06:08 +01:00
enkore
143d7d1a40 Turns out, i3bar doesn't care for "None". One conditional less <3 2013-02-18 18:03:54 +01:00
enkore
0ad4ae6a02 This isn't a program... this is a poem! 2013-02-18 18:02:23 +01:00
enkore
1d4403e308 Let's remove that synchronous functionality alltogether.
It simply isn't in the spirit of this app :-)
And nobody uses it.
2013-02-18 18:00:16 +01:00
enkore
84fdbfaff3 Using a context here is much... smoother
exploited_language_features += 2;

(I also exploit the mutability of the list-object here,
yield j binds the list to the context,
when the context is leaved execution continues and the
modified j is written back)
2013-02-17 14:02:55 +01:00
enkore
797333e7ac Added some magic to JSONIO 2013-02-17 13:57:22 +01:00
enkore
60b5def7d9 Splitted IO handling even a bit more :-) 2013-02-17 01:25:41 +01:00
enkore
ab5afd0227 Moved IO handling out of main class
(for reusability; I use that piece of code now elsewhere
and want to keep that easily in sync)
2013-02-17 01:19:04 +01:00
enkore
973abc928e Support for external file descriptors.
Allows to run i3status directly from your __main__, like this:

    status.register(...) # and so on

    process = subprocess.Popen("i3status", stdout=subprocess.PIPE)
    status.fd = process.stdout

    # start the handler
    status.run()
2013-02-17 00:55:25 +01:00
enkore
7e2c61c21a mailchecker ; didn't really test it yet 2013-02-15 21:14:39 +01:00
enkore
c4e80b3e40 notmuch^2 2013-02-15 21:09:54 +01:00
enkore
c93503704b Changed modsde 2013-02-15 21:08:29 +01:00
enkore
2c7b0fcef9 Added yet another module type, fixed notmuch module
(Yeah, I'm really lazy today)
2013-02-15 21:06:52 +01:00
enkore
8ec1972a3e Replaced conditionals with polymorphism 2013-02-15 18:38:50 +01:00
enkore
561e60efee Consistent quotes 2013-02-15 18:38:18 +01:00
enkore
922ae49aba Create package i3pystatus 2013-02-12 01:07:26 +01:00