Use class attributes as much as possible for application output

refs #803
This commit is contained in:
Laurent Bachelier 2014-09-03 01:22:18 +02:00
commit c07e23cafc
35 changed files with 228 additions and 260 deletions

View file

@ -23,7 +23,6 @@ import datetime, uuid
from dateutil.relativedelta import relativedelta
from dateutil.parser import parse as parse_date
from decimal import Decimal, InvalidOperation
import sys
from weboob.capabilities.base import empty
from weboob.capabilities.bank import CapBank, Account, Transaction
@ -328,7 +327,7 @@ class Boobank(ReplApplication):
account = self.get_object(id, 'get_account', [])
if not account:
print('Error: account "%s" not found (Hint: try the command "list")' % id, file=sys.stderr)
print('Error: account "%s" not found (Hint: try the command "list")' % id, file=self.stderr)
return 2
if end_date is not None:
@ -336,7 +335,7 @@ class Boobank(ReplApplication):
end_date = parse_date(end_date)
except ValueError:
print('"%s" is an incorrect date format (for example "%s")' % \
(end_date, (datetime.date.today() - relativedelta(months=1)).strftime('%Y-%m-%d')), file=sys.stderr)
(end_date, (datetime.date.today() - relativedelta(months=1)).strftime('%Y-%m-%d')), file=self.stderr)
return 3
old_count = self.options.count
self.options.count = None
@ -406,7 +405,7 @@ class Boobank(ReplApplication):
account = self.get_object(id_from, 'get_account', [])
if not account:
print('Error: account %s not found' % id_from, file=sys.stderr)
print('Error: account %s not found' % id_from, file=self.stderr)
return 1
if not id_to:
@ -422,13 +421,13 @@ class Boobank(ReplApplication):
id_to, backend_name_to = self.parse_id(id_to)
if account.backend != backend_name_to:
print("Transfer between different backends is not implemented", file=sys.stderr)
print("Transfer between different backends is not implemented", file=self.stderr)
return 4
try:
amount = Decimal(amount)
except (TypeError, ValueError, InvalidOperation):
print('Error: please give a decimal amount to transfer', file=sys.stderr)
print('Error: please give a decimal amount to transfer', file=self.stderr)
return 2
if self.interactive:
@ -460,7 +459,7 @@ class Boobank(ReplApplication):
"""
account = self.get_object(id, 'get_account', [])
if not account:
print('Error: account "%s" not found (Hint: try the command "list")' % id, file=sys.stderr)
print('Error: account "%s" not found (Hint: try the command "list")' % id, file=self.stderr)
return 2
self.start_format()

View file

@ -119,7 +119,7 @@ class Event(object):
elif line.startswith('h3=. '):
m = re.match('h3=. Event finished. Winner is "(.*)":/users/(\d+)\!', line)
if not m:
print >>sys.stderr, 'Unable to parse h3=: %s' % line
print >>self.stderr, 'Unable to parse h3=: %s' % line
continue
self.winner = Member(int(m.group(2)), m.group(1))
elif line.startswith('h2. '):
@ -127,7 +127,7 @@ class Event(object):
elif line.startswith('h3. '):
m = re.match('h3. "(.*)":/users/(\d+)', line)
if not m:
print >>sys.stderr, 'Unable to parse user "%s"' % line
print >>self.stderr, 'Unable to parse user "%s"' % line
continue
member = Member(int(m.group(2)), m.group(1))
if member.id == self.my_id:
@ -166,7 +166,7 @@ class Event(object):
elif line.startswith('[['):
m = re.match('\[\[(\w+)\]\]\|\[\[(\w+)\]\]\|(.*)\|', line)
if not m:
print >>sys.stderr, 'Unable to parse task: "%s"' % line
print >>self.stderr, 'Unable to parse task: "%s"' % line
continue
task = Task(m.group(1), m.group(2))
member.tasks.append(task)
@ -292,7 +292,7 @@ class Boobathon(ReplApplication):
def main(self, argv):
if len(argv) < 2:
print >>sys.stderr, 'Please give the name of the boobathon'
print >>self.stderr, 'Please give the name of the boobathon'
return 1
self.event = Event(argv[1], choice(self.weboob.backend_instances.values()))
@ -414,9 +414,9 @@ class Boobathon(ReplApplication):
i = -2
while not stop:
if i >= 0 and not i%2:
sys.stdout.write(' #%-2d' % (i/2))
self.stdout.write(' #%-2d' % (i/2))
else:
sys.stdout.write(' ')
self.stdout.write(' ')
if i >= 0 and i%2:
# second line of task, see if we'll stop
stop = True
@ -425,11 +425,11 @@ class Boobathon(ReplApplication):
# there are more tasks, don't stop now
stop = False
if i == -2:
sys.stdout.write(' %s%-20s%s' % (self.BOLD, mem.shortname().encode('utf-8'), self.NC))
self.stdout.write(' %s%-20s%s' % (self.BOLD, mem.shortname().encode('utf-8'), self.NC))
elif i == -1:
sys.stdout.write(' %s%-20s%s' % (self.BOLD, '-' * len(mem.shortname()), self.NC))
self.stdout.write(' %s%-20s%s' % (self.BOLD, '-' * len(mem.shortname()), self.NC))
elif len(mem.tasks) <= (i/2):
sys.stdout.write(' ' * (20+1))
self.stdout.write(' ' * (20+1))
else:
task = mem.tasks[i/2]
if task.status == task.STATUS_DONE:
@ -446,8 +446,8 @@ class Boobathon(ReplApplication):
line = u'%s %s' % (status, task.backend)
else: #2nd line
line = u'%s `-%s' % (status, task.capability[3:])
sys.stdout.write((u' %-20s' % line).encode('utf-8'))
sys.stdout.write('\n')
self.stdout.write((u' %-20s' % line).encode('utf-8'))
self.stdout.write('\n')
i += 1
def complete_close(self, text, line, *ignored):
@ -471,7 +471,7 @@ class Boobathon(ReplApplication):
print 'Event is now closed. Winner is %s!' % self.event.winner.name
return
print >>sys.stderr, '"%s" not found' % name
print >>self.stderr, '"%s" not found' % name
return 3
def complete_edit(self, text, line, *ignored):
@ -486,7 +486,7 @@ class Boobathon(ReplApplication):
Edit information about you or about event.
"""
if not line:
print >>sys.stderr, 'Syntax: edit [event | me]'
print >>self.stderr, 'Syntax: edit [event | me]'
return 2
self.event.load()
@ -496,12 +496,12 @@ class Boobathon(ReplApplication):
elif line == 'me':
mem = self.event.get_me()
if not mem:
print >>sys.stderr, 'You haven\'t joined the event.'
print >>self.stderr, 'You haven\'t joined the event.'
return 1
self.edit_member(mem)
self.save_event('Member edited')
else:
print >>sys.stderr, 'Unable to edit "%s"' % line
print >>self.stderr, 'Unable to edit "%s"' % line
return 1
def do_info(self, line):
@ -558,11 +558,11 @@ class Boobathon(ReplApplication):
"""
self.event.load()
if self.event.backend.browser.get_userid() in self.event.members:
print >>sys.stderr, 'You have already joined this event.'
print >>self.stderr, 'You have already joined this event.'
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
m = Member(self.event.backend.browser.get_userid(), None)
@ -579,17 +579,17 @@ class Boobathon(ReplApplication):
self.event.load()
if self.event.currently_in_event():
print >>sys.stderr, 'Unable to leave during the event, loser!'
print >>self.stderr, 'Unable to leave during the event, loser!'
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
try:
self.event.members.pop(self.event.backend.browser.get_userid())
except KeyError:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
else:
self.save_event('Left the event')
@ -603,23 +603,23 @@ class Boobathon(ReplApplication):
self.event.load()
mem = self.event.get_me()
if not mem:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
try:
task_id = int(line)
except ValueError:
print >>sys.stderr, 'The task ID should be a number'
print >>self.stderr, 'The task ID should be a number'
return 2
try:
task = mem.tasks.pop(task_id)
except IndexError:
print >>sys.stderr, 'Unable to find task #%d' % task_id
print >>self.stderr, 'Unable to find task #%d' % task_id
return 1
else:
print 'Removing task #%d (%s,%s).' % (task_id, task.backend, task.capability)
@ -634,24 +634,24 @@ class Boobathon(ReplApplication):
self.event.load()
mem = self.event.get_me()
if not mem:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
backend, capability = self.parse_command_args(line, 2, 2)
if not backend[0].isupper():
print >>sys.stderr, 'The backend name "%s" needs to start with a capital.' % backend
print >>self.stderr, 'The backend name "%s" needs to start with a capital.' % backend
return 2
if not capability.startswith('Cap') or not capability[3].isupper():
print >>sys.stderr, '"%s" is not a proper capability name (must start with Cap).' % capability
print >>self.stderr, '"%s" is not a proper capability name (must start with Cap).' % capability
return 2
for task in mem.tasks:
if (task.backend,task.capability) == (backend,capability):
print >>sys.stderr, "A task already exists for that."
print >>self.stderr, "A task already exists for that."
return 1
task = Task(backend, capability)
@ -668,15 +668,15 @@ class Boobathon(ReplApplication):
self.event.load()
mem = self.event.get_me()
if not mem:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
if len(mem.tasks) == 0:
print >>sys.stderr, "You don't have any task to do."
print >>self.stderr, "You don't have any task to do."
return 1
if not self.event.currently_in_event():
print >>sys.stderr, "You can't start a task, we are not in event."
print >>self.stderr, "You can't start a task, we are not in event."
return 1
if line.isdigit():
@ -695,11 +695,11 @@ class Boobathon(ReplApplication):
if (i == task_id or task_id < 0) and task.status == task.STATUS_NONE:
break
else:
print >>sys.stderr, 'Task not found.'
print >>self.stderr, 'Task not found.'
return 3
if task.status == task.STATUS_DONE:
print >>sys.stderr, 'Task is already done.'
print >>self.stderr, 'Task is already done.'
return 1
task.status = task.STATUS_PROGRESS
@ -716,11 +716,11 @@ class Boobathon(ReplApplication):
self.event.load()
mem = self.event.get_me()
if not mem:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
for i, task in enumerate(mem.tasks):
@ -733,12 +733,12 @@ class Boobathon(ReplApplication):
self.save_event('Task accomplished')
else:
task.status = task.STATUS_NONE
print >>sys.stderr, 'Oops, you are out of event. Canceling the task...'
print >>self.stderr, 'Oops, you are out of event. Canceling the task...'
self.save_event('Cancel task')
return 1
return
print >>sys.stderr, "There isn't any task in progress."
print >>self.stderr, "There isn't any task in progress."
return 1
def do_cancel(self, line):
@ -750,11 +750,11 @@ class Boobathon(ReplApplication):
self.event.load()
mem = self.event.get_me()
if not mem:
print >>sys.stderr, "You have not joined this event."
print >>self.stderr, "You have not joined this event."
return 1
if self.event.is_closed():
print >>sys.stderr, "Boobathon is closed."
print >>self.stderr, "Boobathon is closed."
return 1
for task in mem.tasks:
@ -764,7 +764,7 @@ class Boobathon(ReplApplication):
self.save_event('Cancel task')
return
print >>sys.stderr, "There isn't any task in progress."
print >>self.stderr, "There isn't any task in progress."
return 1
def load_default_backends(self):

View file

@ -17,7 +17,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from datetime import time, datetime
from weboob.tools.date import parse_date
@ -231,7 +230,7 @@ class Boobcoming(ReplApplication):
if line:
_date = parse_date(line)
if not _date:
print >>sys.stderr, 'Invalid argument: %s' % self.get_command_help('list')
print >>self.stderr, 'Invalid argument: %s' % self.get_command_help('list')
return 2
date_from = datetime.combine(_date, time.min)
@ -256,13 +255,13 @@ class Boobcoming(ReplApplication):
"""
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
event = self.get_object(_id, 'get_event')
if not event:
print >>sys.stderr, 'Upcoming event not found: %s' % _id
print >>self.stderr, 'Upcoming event not found: %s' % _id
return 3
self.start_format()
@ -279,7 +278,7 @@ class Boobcoming(ReplApplication):
Export event in ICALENDAR format
"""
if not line:
print >>sys.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('export')
print >>self.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('export')
return 2
_file, args = self.parse_command_args(line, 2, req_n=1)
@ -307,7 +306,7 @@ class Boobcoming(ReplApplication):
event = self.get_object(_id, 'get_event')
if not event:
print >>sys.stderr, 'Upcoming event not found: %s' % _id
print >>self.stderr, 'Upcoming event not found: %s' % _id
return 3
l.append(event)
@ -329,7 +328,7 @@ class Boobcoming(ReplApplication):
ID is the identifier of the event.
"""
if not line:
print >>sys.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('attends')
print >>self.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('attends')
return 2
args = self.parse_command_args(line, 1, req_n=1)
@ -347,7 +346,7 @@ class Boobcoming(ReplApplication):
"""
if not line:
print >>sys.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('unattends')
print >>self.stderr, 'This command takes at leat one argument: %s' % self.get_command_help('unattends')
return 2
args = self.parse_command_args(line, 1, req_n=1)

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from decimal import Decimal
from weboob.capabilities.bill import CapBill, Detail, Subscription
@ -87,9 +86,9 @@ class Boobill(ReplApplication):
self.bcall_error_handler(backend, error, backtrace)
if len(more_results) > 0:
print >>sys.stderr, 'Hint: There are more results available for %s (use option -n or count command)' % (', '.join(more_results))
print >>self.stderr, 'Hint: There are more results available for %s (use option -n or count command)' % (', '.join(more_results))
for backend in not_implemented:
print >>sys.stderr, u'Error(%s): This feature is not supported yet by this backend.' % backend.name
print >>self.stderr, u'Error(%s): This feature is not supported yet by this backend.' % backend.name
def do_subscriptions(self, line):
"""
@ -184,7 +183,7 @@ class Boobill(ReplApplication):
id, dest = self.parse_command_args(line, 2, 1)
id, backend_name = self.parse_id(id)
if not id:
print >>sys.stderr, 'Error: please give a bill ID (hint: use bills command)'
print >>self.stderr, 'Error: please give a bill ID (hint: use bills command)'
return 2
names = (backend_name,) if backend_name is not None else None
@ -211,7 +210,7 @@ class Boobill(ReplApplication):
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write bill in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write bill in "%s": %s' % (dest, e)
return 1
return
@ -228,7 +227,7 @@ class Boobill(ReplApplication):
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write bill in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write bill in "%s": %s' % (dest, e)
return 1
return

View file

@ -19,7 +19,6 @@
import sys
from weboob.capabilities.lyrics import CapLyrics
from weboob.capabilities.base import empty
@ -85,7 +84,7 @@ class Booblyrics(ReplApplication):
songlyrics = self.get_object(id, 'get_lyrics')
if not songlyrics:
print >>sys.stderr, 'Song lyrics not found: %s' % id
print >>self.stderr, 'Song lyrics not found: %s' % id
return 3
self.start_format()

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
import os
import datetime
import hashlib
@ -431,7 +430,7 @@ class Boobmsg(ReplApplication):
"""
message = None
if len(arg) == 0:
print >>sys.stderr, 'Please give a message ID.'
print >>self.stderr, 'Please give a message ID.'
return 2
try:
@ -448,7 +447,7 @@ class Boobmsg(ReplApplication):
self.weboob.do('set_message_read', message, backends=message.backend)
return
else:
print >>sys.stderr, 'Message not found'
print >>self.stderr, 'Message not found'
return 3
def do_profile(self, id):
@ -476,7 +475,7 @@ class Boobmsg(ReplApplication):
"""
photo_cmd = self.config.get('photo_viewer')
if photo_cmd is None:
print >>sys.stderr, "Configuration error: photo_viewer is undefined"
print >>self.stderr, "Configuration error: photo_viewer is undefined"
return
_id, backend_name = self.parse_id(id, unique_backend=True)

View file

@ -20,7 +20,6 @@
from weboob.capabilities.library import CapBook, Book
from weboob.tools.application.repl import ReplApplication
from weboob.tools.application.formatters.iformatter import PrettyFormatter
import sys
__all__ = ['Boobooks']
@ -63,7 +62,7 @@ class Boobooks(ReplApplication):
id, backend_name = self.parse_id(id)
if not id:
print >>sys.stderr, 'Error: please give a book ID (hint: use ls command)'
print >>self.stderr, 'Error: please give a book ID (hint: use ls command)'
return 2
names = (backend_name,) if backend_name is not None else None

View file

@ -23,7 +23,6 @@ from weboob.capabilities.gauge import CapGauge, SensorNotFound
from weboob.tools.application.repl import ReplApplication
from weboob.tools.application.formatters.iformatter import IFormatter
import sys
__all__ = ['Boobsize']
@ -111,7 +110,7 @@ class Boobsize(ReplApplication):
def bcall_error_handler(self, backend, error, backtrace):
if isinstance(error, SensorNotFound):
msg = unicode(error) or 'Sensor not found (hint: try details command)'
print >>sys.stderr, 'Error(%s): %s' % (backend.name, msg)
print >>self.stderr, 'Error(%s): %s' % (backend.name, msg)
else:
return ReplApplication.bcall_error_handler(self, backend, error, backtrace)

View file

@ -23,7 +23,6 @@ from email import message_from_string, message_from_file
from email.Header import decode_header
from email.mime.text import MIMEText
from smtplib import SMTP
import sys
import os
import re
import unicodedata
@ -157,7 +156,7 @@ class BoobTracker(ReplApplication):
elif len(path) > 0:
query.project = path[0]
else:
print >>sys.stderr, 'Please enter a project name'
print >>self.stderr, 'Please enter a project name'
return 1
query.author = self.options.author
@ -184,12 +183,12 @@ class BoobTracker(ReplApplication):
Get an issue and display it.
"""
if not line:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('get', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('get', short=True)
return 2
issue = self.get_object(line, 'get_issue')
if not issue:
print >>sys.stderr, 'Issue not found: %s' % line
print >>self.stderr, 'Issue not found: %s' % line
return 3
self.format(issue)
@ -227,7 +226,7 @@ class BoobTracker(ReplApplication):
try:
hours = float(hours)
except ValueError:
print >>sys.stderr, 'Error: HOURS parameter may be a float'
print >>self.stderr, 'Error: HOURS parameter may be a float'
return 1
id, backend_name = self.parse_id(id, unique_backend=True)
@ -383,16 +382,16 @@ class BoobTracker(ReplApplication):
backend = self.weboob.get_backend(issue.backend)
content = self.issue2text(issue, backend)
while True:
if sys.stdin.isatty():
if self.stdin.isatty():
content = self.acquire_input(content, {'vim': "-c 'set ft=mail'"})
m = message_from_string(content.encode('utf-8'))
else:
m = message_from_file(sys.stdin)
m = message_from_file(self.stdin)
try:
email_to = self.text2issue(issue, m)
except ValueError as e:
if not sys.stdin.isatty():
if not self.stdin.isatty():
raise
raw_input("%s -- Press Enter to continue..." % unicode(e).encode("utf-8"))
continue
@ -407,7 +406,7 @@ class BoobTracker(ReplApplication):
self.send_notification(email_to, issue)
return 0
except IssueError as e:
if not sys.stdin.isatty():
if not self.stdin.isatty():
raise
raw_input("%s -- Press Enter to continue..." % unicode(e).encode("utf-8"))
@ -482,7 +481,7 @@ Weboob Team
_id, key, value = self.parse_command_args(line, 3, 1)
issue = self.get_object(_id, 'get_issue')
if not issue:
print >>sys.stderr, 'Issue not found: %s' % _id
print >>self.stderr, 'Issue not found: %s' % _id
return 3
return self.edit_issue(issue, edit=True)
@ -500,4 +499,4 @@ Weboob Team
Attach a file to an issue (Not implemented yet).
"""
print >>sys.stderr, 'Not implemented yet.'
print >>self.stderr, 'Not implemented yet.'

View file

@ -19,7 +19,6 @@
import sys
from datetime import datetime
from weboob.applications.weboorrents.weboorrents import TorrentInfoFormatter, TorrentListFormatter
@ -231,11 +230,11 @@ class Cineoob(ReplApplication):
person1 = self.get_object(id1, 'get_person', caps=CapCinema)
if not person1:
print >>sys.stderr, 'Person not found: %s' % id1
print >>self.stderr, 'Person not found: %s' % id1
return 3
person2 = self.get_object(id2, 'get_person', caps=CapCinema)
if not person2:
print >>sys.stderr, 'Person not found: %s' % id2
print >>self.stderr, 'Person not found: %s' % id2
return 3
initial_count = self.options.count
@ -264,11 +263,11 @@ class Cineoob(ReplApplication):
movie1 = self.get_object(id1, 'get_movie', caps=CapCinema)
if not movie1:
print >>sys.stderr, 'Movie not found: %s' % id1
print >>self.stderr, 'Movie not found: %s' % id1
return 3
movie2 = self.get_object(id2, 'get_movie', caps=CapCinema)
if not movie2:
print >>sys.stderr, 'Movie not found: %s' % id2
print >>self.stderr, 'Movie not found: %s' % id2
return 3
initial_count = self.options.count
@ -295,7 +294,7 @@ class Cineoob(ReplApplication):
movie = self.get_object(id, 'get_movie', caps=CapCinema)
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
print >>self.stderr, 'Movie not found: %s' % id
return 3
self.start_format()
@ -310,7 +309,7 @@ class Cineoob(ReplApplication):
person = self.get_object(id, 'get_person', caps=CapCinema)
if not person:
print >>sys.stderr, 'Person not found: %s' % id
print >>self.stderr, 'Person not found: %s' % id
return 3
self.start_format()
@ -357,7 +356,7 @@ class Cineoob(ReplApplication):
movie = self.get_object(movie_id, 'get_movie', caps=CapCinema)
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
print >>self.stderr, 'Movie not found: %s' % id
return 3
for backend, person in self.do('iter_movie_persons', movie.id, role, backends=movie.backend, caps=CapCinema):
@ -374,7 +373,7 @@ class Cineoob(ReplApplication):
person = self.get_object(person_id, 'get_person', caps=CapCinema)
if not person:
print >>sys.stderr, 'Person not found: %s' % id
print >>self.stderr, 'Person not found: %s' % id
return 3
for backend, movie in self.do('iter_person_movies', person.id, role, backends=person.backend, caps=CapCinema):
@ -388,7 +387,7 @@ class Cineoob(ReplApplication):
"""
person = self.get_object(person_id, 'get_person', ('name', 'biography'), caps=CapCinema)
if not person:
print >>sys.stderr, 'Person not found: %s' % person_id
print >>self.stderr, 'Person not found: %s' % person_id
return 3
self.start_format()
@ -412,7 +411,7 @@ class Cineoob(ReplApplication):
movie = self.get_object(id, 'get_movie', ('original_title'), caps=CapCinema)
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
print >>self.stderr, 'Movie not found: %s' % id
return 3
# i would like to clarify with fillobj but how could i fill the movie AND choose the country ?
@ -420,7 +419,7 @@ class Cineoob(ReplApplication):
if not empty(release):
movie.all_release_dates = u'%s' % (release)
else:
print >>sys.stderr, 'Movie releases not found for %s' % movie.original_title
print >>self.stderr, 'Movie releases not found for %s' % movie.original_title
return 3
self.start_format()
self.format(movie)
@ -441,7 +440,7 @@ class Cineoob(ReplApplication):
torrent = self.get_object(id, 'get_torrent', caps=CapTorrent)
if not torrent:
print >>sys.stderr, 'Torrent not found: %s' % id
print >>self.stderr, 'Torrent not found: %s' % id
return 3
self.start_format()
@ -479,20 +478,20 @@ class Cineoob(ReplApplication):
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
return 1
return
except CallErrors as errors:
for backend, error, backtrace in errors:
if isinstance(error, MagnetOnly):
print >>sys.stderr, u'Error(%s): No direct URL available, ' \
print >>self.stderr, u'Error(%s): No direct URL available, ' \
u'please provide this magnet URL ' \
u'to your client:\n%s' % (backend, error.magnet)
return 4
else:
self.bcall_error_handler(backend, error, backtrace)
print >>sys.stderr, 'Torrent "%s" not found' % id
print >>self.stderr, 'Torrent "%s" not found' % id
return 3
@defaultcount(10)
@ -519,7 +518,7 @@ class Cineoob(ReplApplication):
"""
movie = self.get_object(id, 'get_movie', ('original_title'), caps=CapCinema)
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
print >>self.stderr, 'Movie not found: %s' % id
return 3
pattern = movie.original_title
@ -548,7 +547,7 @@ class Cineoob(ReplApplication):
subtitle = self.get_object(id, 'get_subtitle', caps=CapCinema)
if not subtitle:
print >>sys.stderr, 'Subtitle not found: %s' % id
print >>self.stderr, 'Subtitle not found: %s' % id
return 3
self.start_format()
@ -585,11 +584,11 @@ class Cineoob(ReplApplication):
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write file in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write file in "%s": %s' % (dest, e)
return 1
return
print >>sys.stderr, 'Subtitle "%s" not found' % id
print >>self.stderr, 'Subtitle "%s" not found' % id
return 3
@defaultcount(10)
@ -658,7 +657,7 @@ class Cineoob(ReplApplication):
language, id = self.parse_command_args(line, 2, 2)
movie = self.get_object(id, 'get_movie', ('original_title'), caps=CapCinema)
if not movie:
print >>sys.stderr, 'Movie not found: %s' % id
print >>self.stderr, 'Movie not found: %s' % id
return 3
pattern = movie.original_title

View file

@ -20,7 +20,6 @@
import sys
from weboob.capabilities.pricecomparison import CapPriceComparison
from weboob.tools.html import html2text
@ -109,7 +108,7 @@ class Comparoob(ReplApplication):
product = None
if len(products) == 0:
print >>sys.stderr, 'Error: no product found with this pattern'
print >>self.stderr, 'Error: no product found with this pattern'
return 1
elif len(products) == 1:
product = products[0]
@ -147,12 +146,12 @@ class Comparoob(ReplApplication):
Get information about a product.
"""
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
price = self.get_object(_id, 'get_price')
if not price:
print >>sys.stderr, 'Price not found: %s' % _id
print >>self.stderr, 'Price not found: %s' % _id
return 3
self.start_format()

View file

@ -19,7 +19,6 @@
import sys
import codecs
from weboob.capabilities.recipe import CapRecipe
@ -100,7 +99,7 @@ class Cookboob(ReplApplication):
"""
recipe = self.get_object(id, 'get_recipe')
if not recipe:
print >>sys.stderr, 'Recipe not found: %s' % id
print >>self.stderr, 'Recipe not found: %s' % id
return 3
self.start_format()
@ -141,10 +140,10 @@ class Cookboob(ReplApplication):
with codecs.open(dest, 'w', 'utf-8') as f:
f.write(xmlstring)
except IOError as e:
print >>sys.stderr, 'Unable to write .kreml in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write .kreml in "%s": %s' % (dest, e)
return 1
return
print >>sys.stderr, 'Recipe "%s" not found' % id
print >>self.stderr, 'Recipe "%s" not found' % id
return 3
@defaultcount(10)

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.housing import CapHousing, Query
from weboob.tools.application.repl import ReplApplication, defaultcount
@ -167,12 +166,12 @@ class Flatboob(ReplApplication):
Get information about a housing.
"""
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
housing = self.get_object(_id, 'get_housing')
if not housing:
print >>sys.stderr, 'Housing not found: %s' % _id
print >>self.stderr, 'Housing not found: %s' % _id
return 3
self.start_format()

View file

@ -19,7 +19,6 @@
import sys
import os
from re import search, sub
@ -68,7 +67,7 @@ class Galleroob(ReplApplication):
List galleries matching a PATTERN.
"""
if not pattern:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('search', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('search', short=True)
return 2
self.start_format(pattern=pattern)
@ -98,7 +97,7 @@ class Galleroob(ReplApplication):
gallery = result
if not gallery:
print >>sys.stderr, 'Gallery not found: %s' % _id
print >>self.stderr, 'Gallery not found: %s' % _id
return 3
backend.fillobj(gallery, ('title',))
@ -123,7 +122,7 @@ class Galleroob(ReplApplication):
if img.data is None:
backend.fillobj(img, ('url', 'data'))
if img.data is None:
print >>sys.stderr, "Couldn't get page %d, exiting" % i
print >>self.stderr, "Couldn't get page %d, exiting" % i
break
ext = search(r"\.([^\.]{1,5})$", img.url)
@ -150,7 +149,7 @@ class Galleroob(ReplApplication):
gallery = self.get_object(_id, 'get_gallery')
if not gallery:
print >>sys.stderr, 'Gallery not found: %s' % _id
print >>self.stderr, 'Gallery not found: %s' % _id
return 3
self.start_format()

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.geolocip import CapGeolocIp
from weboob.tools.application.repl import ReplApplication
@ -37,7 +36,7 @@ class Geolooc(ReplApplication):
def main(self, argv):
if len(argv) < 2:
print >>sys.stderr, 'Syntax: %s ipaddr' % argv[0]
print >>self.stderr, 'Syntax: %s ipaddr' % argv[0]
return 2
for backend, location in self.do('get_location', argv[1]):

View file

@ -17,7 +17,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.job import CapJob
from weboob.tools.application.repl import ReplApplication, defaultcount
@ -123,13 +122,13 @@ class Handjoob(ReplApplication):
Get information about an advert.
"""
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
job_advert = self.get_object(_id, 'get_job_advert')
if not job_advert:
print >>sys.stderr, 'Job advert not found: %s' % _id
print >>self.stderr, 'Job advert not found: %s' % _id
return 3
self.start_format()

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from copy import copy
from weboob.core import CallErrors
@ -92,7 +91,7 @@ class HaveDate(Boobmsg):
def edit_optims(self, backend_names, optims_names, stop=False):
if optims_names is None:
print >>sys.stderr, 'Error: missing parameters.'
print >>self.stderr, 'Error: missing parameters.'
return 2
for optim_name in optims_names.split():
@ -124,14 +123,14 @@ class HaveDate(Boobmsg):
def optims(self, function, backend_names, optims, store=True):
if optims is None:
print >>sys.stderr, 'Error: missing parameters.'
print >>self.stderr, 'Error: missing parameters.'
return 2
for optim_name in optims.split():
try:
if store:
storage_optim = set(self.storage.get('optims', optim_name, default=[]))
sys.stdout.write('%sing %s:' % (function.capitalize(), optim_name))
self.stdout.write('%sing %s:' % (function.capitalize(), optim_name))
for backend, optim in self.do('get_optimization', optim_name, backends=backend_names):
if optim:
# It's useless to start a started optim, or to stop a stopped one.
@ -144,10 +143,10 @@ class HaveDate(Boobmsg):
self.edit_optims(backend.name, optim_name)
ret = getattr(optim, function)()
sys.stdout.write(' ' + backend.name)
self.stdout.write(' ' + backend.name)
if not ret:
sys.stdout.write('(failed)')
sys.stdout.flush()
self.stdout.write('(failed)')
self.stdout.flush()
if store:
if function == 'start' and ret:
storage_optim.add(backend.name)
@ -156,7 +155,7 @@ class HaveDate(Boobmsg):
storage_optim.remove(backend.name)
except KeyError:
pass
sys.stdout.write('.\n')
self.stdout.write('.\n')
except CallErrors as errors:
for backend, error, backtrace in errors:
if isinstance(error, OptimizationNotFound):
@ -206,7 +205,7 @@ class HaveDate(Boobmsg):
if backend_name == '*':
backend_name = None
elif backend_name is not None and not backend_name in [b.name for b in self.enabled_backends]:
print >>sys.stderr, 'Error: No such backend "%s"' % backend_name
print >>self.stderr, 'Error: No such backend "%s"' % backend_name
return 1
if cmd == 'start':
@ -246,7 +245,7 @@ class HaveDate(Boobmsg):
line.append((b, status))
self.format(tuple(line))
return
print >>sys.stderr, "No such command '%s'" % cmd
print >>self.stderr, "No such command '%s'" % cmd
return 1
def do_events(self, line):

View file

@ -26,7 +26,6 @@ from email import message_from_file, message_from_string
from smtpd import SMTPServer
import time
import re
import sys
import logging
import asyncore
import subprocess
@ -119,7 +118,7 @@ class Monboob(ReplApplication):
if self.config.get('interval') < 1:
raise ValueError()
except ValueError:
print >>sys.stderr, 'Configuration error: interval must be an integer >0.'
print >>self.stderr, 'Configuration error: interval must be an integer >0.'
return 1
try:
@ -127,7 +126,7 @@ class Monboob(ReplApplication):
if self.config.get('html') not in (0, 1):
raise ValueError()
except ValueError:
print >>sys.stderr, 'Configuration error: html must be 0 or 1.'
print >>self.stderr, 'Configuration error: html must be 0 or 1.'
return 2
return ReplApplication.main(self, argv)
@ -151,7 +150,7 @@ class Monboob(ReplApplication):
Pipe with a mail to post message.
"""
msg = message_from_file(sys.stdin)
msg = message_from_file(self.stdin)
return self.process_incoming_mail(msg)
def process_incoming_mail(self, msg):
@ -190,7 +189,7 @@ class Monboob(ReplApplication):
break
if len(content) == 0:
print >>sys.stderr, 'Unable to send an empty message'
print >>self.stderr, 'Unable to send an empty message'
return 1
# remove signature
@ -210,7 +209,7 @@ class Monboob(ReplApplication):
bname, id = reply_to.split('.', 1)
thread_id, parent_id = id.rsplit('.', 1)
except ValueError:
print >>sys.stderr, 'In-Reply-To header might be in form <backend.thread_id.message_id>'
print >>self.stderr, 'In-Reply-To header might be in form <backend.thread_id.message_id>'
return 1
# Default use the To header field to know the backend to use.
@ -220,11 +219,11 @@ class Monboob(ReplApplication):
try:
backend = self.weboob.backend_instances[bname]
except KeyError:
print >>sys.stderr, 'Backend %s not found' % bname
print >>self.stderr, 'Backend %s not found' % bname
return 1
if not backend.has_caps(CapMessagesPost):
print >>sys.stderr, 'The backend %s does not implement CapMessagesPost' % bname
print >>self.stderr, 'The backend %s does not implement CapMessagesPost' % bname
return 1
thread = Thread(thread_id)

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.base import empty
from weboob.capabilities.parcel import CapParcel, Parcel
@ -106,7 +105,7 @@ class Parceloob(ReplApplication):
"""
parcel = self.get_object(line, 'get_parcel_tracking')
if not parcel:
print >>sys.stderr, 'Error: the parcel "%s" is not found' % line
print >>self.stderr, 'Error: the parcel "%s" is not found' % line
return 2
parcels = set(self.storage.get('tracking', default=[]))
@ -134,13 +133,13 @@ class Parceloob(ReplApplication):
if not removed:
parcel = self.get_object(line, 'get_parcel_tracking')
if not parcel:
print >>sys.stderr, 'Error: the parcel "%s" is not found' % line
print >>self.stderr, 'Error: the parcel "%s" is not found' % line
return 2
try:
parcels.remove(parcel.fullid)
except KeyError:
print >>sys.stderr, "Error: parcel \"%s\" wasn't tracked" % parcel.fullid
print >>self.stderr, "Error: parcel \"%s\" wasn't tracked" % parcel.fullid
return 2
self.storage.set('tracking', list(parcels))
@ -181,7 +180,7 @@ class Parceloob(ReplApplication):
"""
parcel = self.get_object(id, 'get_parcel_tracking', [])
if not parcel:
print >>sys.stderr, 'Error: parcel not found'
print >>self.stderr, 'Error: parcel not found'
return 2
self.start_format()

View file

@ -17,7 +17,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from PyQt4.QtCore import Qt, SIGNAL
from PyQt4.QtGui import QFrame, QFileDialog
@ -83,6 +82,6 @@ class Subtitle(QFrame):
with open(dest, 'w') as f:
f.write(data)
except IOError as e:
print >>sys.stderr, 'Unable to write subtitle file in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write subtitle file in "%s": %s' % (dest, e)
return 1
return

View file

@ -17,7 +17,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from PyQt4.QtCore import Qt, SIGNAL
from PyQt4.QtGui import QFrame, QFileDialog
@ -87,6 +86,6 @@ class Torrent(QFrame):
with open(unicode(dest), 'w') as f:
f.write(data)
except IOError as e:
print >>sys.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
return 1
return

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import urllib
import sys
import codecs
from PyQt4.QtCore import Qt, SIGNAL
@ -108,6 +107,6 @@ class Recipe(QFrame):
with codecs.open(dest, 'w', 'utf-8') as f:
f.write(data)
except IOError as e:
print >>sys.stderr, 'Unable to write Krecipe file in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write Krecipe file in "%s": %s' % (dest, e)
return 1
return

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import subprocess
import sys
import os
import re
import requests
@ -167,18 +166,18 @@ class Radioob(ReplApplication):
_id, dest = self.parse_command_args(line, 2, 1)
audio = self.get_object(_id, 'get_audio', ['url'])
if not audio:
print >>sys.stderr, 'Audio file not found: %s' % _id
print >>self.stderr, 'Audio file not found: %s' % _id
return 3
if not audio.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
def check_exec(executable):
with open('/dev/null', 'w') as devnull:
process = subprocess.Popen(['which', executable], stdout=devnull)
if process.wait() != 0:
print >>sys.stderr, 'Please install "%s"' % executable
print >>self.stderr, 'Please install "%s"' % executable
return False
return True
@ -225,7 +224,7 @@ class Radioob(ReplApplication):
"""
_id, stream_id = self.parse_command_args(line, 2, 1)
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('play', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('play', short=True)
return 2
try:
@ -236,14 +235,14 @@ class Radioob(ReplApplication):
obj = self.retrieve_obj(_id)
if obj is None:
print >>sys.stderr, 'No object matches with this id:', _id
print >>self.stderr, 'No object matches with this id:', _id
return 3
if isinstance(obj, Radio):
try:
streams = [obj.streams[stream_id]]
except IndexError:
print >>sys.stderr, 'Stream %d not found' % stream_id
print >>self.stderr, 'Stream %d not found' % stream_id
return 1
elif isinstance(obj, BaseAudio):
streams = [obj]
@ -252,7 +251,7 @@ class Radioob(ReplApplication):
streams = obj.tracks_list
if len(streams) == 0:
print >>sys.stderr, 'Radio or Audio file not found:', _id
print >>self.stderr, 'Radio or Audio file not found:', _id
return 3
try:
@ -317,7 +316,7 @@ class Radioob(ReplApplication):
"""
if not line:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
return 2
cmd, args = self.parse_command_args(line, 2, req_n=1)
@ -327,11 +326,11 @@ class Radioob(ReplApplication):
audio = self.get_object(_id, 'get_audio')
if not audio:
print >>sys.stderr, 'Audio file not found: %s' % _id
print >>self.stderr, 'Audio file not found: %s' % _id
return 3
if not audio.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
self.PLAYLIST.append(audio)
@ -343,11 +342,11 @@ class Radioob(ReplApplication):
audio_to_remove = self.get_object(_id, 'get_audio')
if not audio_to_remove:
print >>sys.stderr, 'Audio file not found: %s' % _id
print >>self.stderr, 'Audio file not found: %s' % _id
return 3
if not audio_to_remove.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
for audio in self.PLAYLIST:
@ -370,7 +369,7 @@ class Radioob(ReplApplication):
self.cached_format(audio)
else:
print >>sys.stderr, 'Playlist command only support "add", "remove", "display" and "export" arguments.'
print >>self.stderr, 'Playlist command only support "add", "remove", "display" and "export" arguments.'
return 2
def complete_info(self, text, line, *ignored):
@ -385,7 +384,7 @@ class Radioob(ReplApplication):
Get information about a radio or an audio file.
"""
if not _id:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
obj = self.retrieve_obj(_id)
@ -396,7 +395,7 @@ class Radioob(ReplApplication):
self.set_formatter('playlist_tracks_list_info')
if obj is None:
print >>sys.stderr, 'No object matches with this id:', _id
print >>self.stderr, 'No object matches with this id:', _id
return 3
self.format(obj)
@ -412,7 +411,7 @@ class Radioob(ReplApplication):
"""
if not pattern:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
return 2
cmd, args = self.parse_command_args(pattern, 2, req_n=1)
@ -447,7 +446,7 @@ class Radioob(ReplApplication):
self.format(playlist)
else:
print >>sys.stderr, 'Search command only supports "radio", "song", "album" and "playlist" arguments.'
print >>self.stderr, 'Search command only supports "radio", "song", "album" and "playlist" arguments.'
return 2
def do_ls(self, line):

View file

@ -19,7 +19,6 @@
import sys
from weboob.capabilities.subtitle import CapSubtitle
from weboob.capabilities.base import empty
@ -114,7 +113,7 @@ class Suboob(ReplApplication):
subtitle = self.get_object(id, 'get_subtitle')
if not subtitle:
print >>sys.stderr, 'Subtitle not found: %s' % id
print >>self.stderr, 'Subtitle not found: %s' % id
return 3
self.start_format()
@ -139,7 +138,7 @@ class Suboob(ReplApplication):
subtitle = self.get_object(id, 'get_subtitle')
if not subtitle:
print >>sys.stderr, 'Subtitle not found: %s' % id
print >>self.stderr, 'Subtitle not found: %s' % id
return 3
if dest is None:
@ -151,13 +150,13 @@ class Suboob(ReplApplication):
for backend, buf in self.do('get_subtitle_file', subtitle.id, backends=subtitle.backend):
if buf:
if dest == '-':
sys.stdout.write(buf)
self.stdout.write(buf)
else:
try:
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write file in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write file in "%s": %s' % (dest, e)
return 1
else:
print 'Saved to %s' % dest

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.translate import CapTranslate, TranslationFail, LanguageNotSupported
from weboob.tools.application.repl import ReplApplication
from weboob.tools.application.formatters.iformatter import IFormatter
@ -115,5 +114,5 @@ class Translaboob(ReplApplication):
for backend, translation in self.do('translate', self.LANGUAGE[lan_from], self.LANGUAGE[lan_to], text):
self.format(translation)
except (TranslationFail, LanguageNotSupported) as error:
print >>sys.stderr, error
print >>self.stderr, error
pass

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
import datetime
from weboob.capabilities.base import Currency, empty
@ -105,7 +104,7 @@ class Traveloob(ReplApplication):
if arrival:
arrival_id, backend_name2 = self.parse_id(arrival)
if backend_name and backend_name2 and backend_name != backend_name2:
print >>sys.stderr, 'Departure and arrival aren\'t on the same backend'
print >>self.stderr, 'Departure and arrival aren\'t on the same backend'
return 1
else:
arrival_id = backend_name2 = None
@ -121,8 +120,8 @@ class Traveloob(ReplApplication):
try:
date = self.parse_datetime(date)
except ValueError as e:
print >>sys.stderr, 'Invalid datetime value: %s' % e
print >>sys.stderr, 'Please enter a datetime in form "yyyy-mm-dd HH:MM" or "HH:MM".'
print >>self.stderr, 'Invalid datetime value: %s' % e
print >>self.stderr, 'Please enter a datetime in form "yyyy-mm-dd HH:MM" or "HH:MM".'
return 1
for backend, departure in self.do('iter_station_departures', station_id, arrival_id, date, backends=backends):
@ -150,8 +149,8 @@ class Traveloob(ReplApplication):
filters.departure_time = self.parse_datetime(self.options.departure_time)
filters.arrival_time = self.parse_datetime(self.options.arrival_time)
except ValueError as e:
print >>sys.stderr, 'Invalid datetime value: %s' % e
print >>sys.stderr, 'Please enter a datetime in form "yyyy-mm-dd HH:MM" or "HH:MM".'
print >>self.stderr, 'Invalid datetime value: %s' % e
print >>self.stderr, 'Please enter a datetime in form "yyyy-mm-dd HH:MM" or "HH:MM".'
return 1
for backend, route in self.do('iter_roadmap', departure, arrival, filters):

View file

@ -20,7 +20,6 @@
import requests
import subprocess
import sys
import os
from weboob.capabilities.video import CapVideo, BaseVideo
@ -77,14 +76,14 @@ class Videoob(ReplApplication):
def download(self, video, dest, default=None):
if not video.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
def check_exec(executable):
with open('/dev/null', 'w') as devnull:
process = subprocess.Popen(['which', executable], stdout=devnull)
if process.wait() != 0:
print >>sys.stderr, 'Please install "%s"' % executable
print >>self.stderr, 'Please install "%s"' % executable
return False
return True
@ -147,7 +146,7 @@ class Videoob(ReplApplication):
_id, dest = self.parse_command_args(line, 2, 1)
video = self.get_object(_id, 'get_video', ['url'])
if not video:
print >>sys.stderr, 'Video not found: %s' % _id
print >>self.stderr, 'Video not found: %s' % _id
return 3
return self.download(video, dest)
@ -164,7 +163,7 @@ class Videoob(ReplApplication):
Play a video with a found player.
"""
if not line:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('play', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('play', short=True)
return 2
ret = 0
@ -178,10 +177,10 @@ class Videoob(ReplApplication):
def play(self, video, _id):
if not video:
print >>sys.stderr, 'Video not found: %s' % _id
print >>self.stderr, 'Video not found: %s' % _id
return 3
if not video.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
try:
player_name = self.config.get('media_player')
@ -205,14 +204,14 @@ class Videoob(ReplApplication):
Get information about a video.
"""
if not line:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('info', short=True)
return 2
self.start_format()
for _id in line.split(' '):
video = self.get_object(_id, 'get_video')
if not video:
print >>sys.stderr, 'Video not found: %s' % _id
print >>self.stderr, 'Video not found: %s' % _id
return 3
self.format(video)
@ -240,11 +239,11 @@ class Videoob(ReplApplication):
"""
if not self.interactive:
print >>sys.stderr, 'This command can be used only in interactive mode.'
print >>self.stderr, 'This command can be used only in interactive mode.'
return 1
if not line:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('playlist')
return 2
cmd, args = self.parse_command_args(line, 2, req_n=1)
@ -254,11 +253,11 @@ class Videoob(ReplApplication):
video = self.get_object(_id, 'get_video')
if not video:
print >>sys.stderr, 'Video not found: %s' % _id
print >>self.stderr, 'Video not found: %s' % _id
return 3
if not video.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
self.PLAYLIST.append(video)
@ -268,11 +267,11 @@ class Videoob(ReplApplication):
video_to_remove = self.get_object(_id, 'get_video')
if not video_to_remove:
print >>sys.stderr, 'Video not found: %s' % _id
print >>self.stderr, 'Video not found: %s' % _id
return 3
if not video_to_remove.url:
print >>sys.stderr, 'Error: the direct URL is not available.'
print >>self.stderr, 'Error: the direct URL is not available.'
return 4
for video in self.PLAYLIST:
@ -298,7 +297,7 @@ class Videoob(ReplApplication):
for video in self.PLAYLIST:
self.play(video, video.id)
else:
print >>sys.stderr, 'Playlist command only support "add", "remove", "display", "download" and "export" arguments.'
print >>self.stderr, 'Playlist command only support "add", "remove", "display", "download" and "export" arguments.'
return 2
def complete_nsfw(self, text, line, begidx, endidx):
@ -332,7 +331,7 @@ class Videoob(ReplApplication):
Search for videos matching a PATTERN.
"""
if not pattern:
print >>sys.stderr, 'This command takes an argument: %s' % self.get_command_help('search', short=True)
print >>self.stderr, 'This command takes an argument: %s' % self.get_command_help('search', short=True)
return 2
self.change_path([u'search'])

View file

@ -19,7 +19,6 @@
import os
import sys
import tempfile
import codecs
@ -53,10 +52,10 @@ class WebContentEdit(ReplApplication):
contents += [content for backend, content in self.do('get_content', _id, backends=backend_names) if content]
if len(contents) == 0:
print >>sys.stderr, 'No contents found'
print >>self.stderr, 'No contents found'
return 3
if sys.stdin.isatty():
if self.stdin.isatty():
paths = {}
for content in contents:
tmpdir = os.path.join(tempfile.gettempdir(), "weboob")
@ -91,7 +90,7 @@ class WebContentEdit(ReplApplication):
contents.remove(content)
if len(contents) == 0:
print >>sys.stderr, 'No changes. Abort.'
print >>self.stderr, 'No changes. Abort.'
return 1
print 'Contents changed:\n%s' % ('\n'.join(' * %s' % content.id for content in contents))
@ -118,7 +117,7 @@ class WebContentEdit(ReplApplication):
# stdin is not a tty
if len(contents) != 1:
print >>sys.stderr, "Multiple ids not supported with pipe"
print >>self.stderr, "Multiple ids not supported with pipe"
return 2
message, minor = '', False
@ -148,7 +147,7 @@ class WebContentEdit(ReplApplication):
Display log of a page
"""
if not line:
print >>sys.stderr, 'Error: please give a page ID'
print >>self.stderr, 'Error: please give a page ID'
return 2
_id, backend_name = self.parse_id(line)
@ -167,7 +166,7 @@ class WebContentEdit(ReplApplication):
Get page contents
"""
if not line:
print >>sys.stderr, 'Error: please give a page ID'
print >>self.stderr, 'Error: please give a page ID'
return 2
_part_line = line.strip().split(' ')
@ -180,7 +179,7 @@ class WebContentEdit(ReplApplication):
_part_line.remove('-r')
if not _part_line:
print >>sys.stderr, 'Error: please give a page ID'
print >>self.stderr, 'Error: please give a page ID'
return 2
_id, backend_name = self.parse_id(" ".join(_part_line))

View file

@ -19,7 +19,6 @@
import os
import sys
import re
from weboob.capabilities.account import CapAccount
@ -53,7 +52,7 @@ class WeboobCfg(ReplApplication):
Add a backend.
"""
if not line:
print >>sys.stderr, 'You must specify a module name. Hint: use the "modules" command.'
print >>self.stderr, 'You must specify a module name. Hint: use the "modules" command.'
return 2
name, options = self.parse_command_args(line, 2, 1)
if options:
@ -67,7 +66,7 @@ class WeboobCfg(ReplApplication):
try:
key, value = option.split('=', 1)
except ValueError:
print >>sys.stderr, 'Parameters have to be formatted "key=value"'
print >>self.stderr, 'Parameters have to be formatted "key=value"'
return 2
params[key] = value
@ -97,16 +96,16 @@ class WeboobCfg(ReplApplication):
try:
backend = self.weboob.get_backend(backend_name)
except KeyError:
print >>sys.stderr, 'Error: backend "%s" not found.' % backend_name
print >>self.stderr, 'Error: backend "%s" not found.' % backend_name
return 1
if not backend.has_caps(CapAccount):
print >>sys.stderr, 'Error: backend "%s" does not support accounts management' % backend_name
print >>self.stderr, 'Error: backend "%s" does not support accounts management' % backend_name
return 1
mail = self.acquire_input()
if not backend.confirm_account(mail):
print >>sys.stderr, 'Error: Unable to confirm account creation'
print >>self.stderr, 'Error: Unable to confirm account creation'
return 1
return 0
@ -142,14 +141,14 @@ class WeboobCfg(ReplApplication):
Remove a backend.
"""
if not self.weboob.backends_config.remove_backend(instance_name):
print >>sys.stderr, 'Backend instance "%s" does not exist' % instance_name
print >>self.stderr, 'Backend instance "%s" does not exist' % instance_name
return 1
def _do_toggle(self, name, state):
try:
bname, items = self.weboob.backends_config.get_backend(name)
except KeyError:
print >>sys.stderr, 'Backend instance "%s" does not exist' % name
print >>self.stderr, 'Backend instance "%s" does not exist' % name
return 1
self.weboob.backends_config.edit_backend(name, bname, {'_enabled': state})
@ -178,7 +177,7 @@ class WeboobCfg(ReplApplication):
try:
self.edit_backend(line)
except KeyError:
print >>sys.stderr, 'Error: backend "%s" not found' % line
print >>self.stderr, 'Error: backend "%s" not found' % line
return 1
def do_modules(self, line):
@ -202,12 +201,12 @@ class WeboobCfg(ReplApplication):
Display information about a module.
"""
if not line:
print >>sys.stderr, 'You must specify a module name. Hint: use the "modules" command.'
print >>self.stderr, 'You must specify a module name. Hint: use the "modules" command.'
return 2
minfo = self.weboob.repositories.get_module_info(line)
if not minfo:
print >>sys.stderr, 'Module "%s" does not exist.' % line
print >>self.stderr, 'Module "%s" does not exist.' % line
return 1
try:

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.tools.application.repl import ReplApplication
@ -42,7 +41,7 @@ class WeboobCli(ReplApplication):
def main(self, argv):
if len(argv) < 3:
print >>sys.stderr, "Syntax: %s capability method [args ..]" % argv[0]
print >>self.stderr, "Syntax: %s capability method [args ..]" % argv[0]
return 2
cap_s = argv[1]

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from optparse import OptionGroup
from weboob.tools.application.base import BaseApplication
@ -49,12 +48,12 @@ class WeboobDebug(BaseApplication):
try:
backend_name = argv[1]
except IndexError:
print >>sys.stderr, 'Usage: %s BACKEND' % argv[0]
print >>self.stderr, 'Usage: %s BACKEND' % argv[0]
return 1
try:
backend = self.weboob.load_backends(names=[backend_name])[backend_name]
except KeyError:
print >>sys.stderr, u'Unable to load backend "%s"' % backend_name
print >>self.stderr, u'Unable to load backend "%s"' % backend_name
return 1
locs = dict(backend=backend, browser=backend.browser, application=self, weboob=self.weboob)

View file

@ -24,7 +24,6 @@ from time import mktime, strptime
import tarfile
import os
import shutil
import sys
import subprocess
from copy import copy
from contextlib import closing
@ -96,8 +95,8 @@ class WeboobRepos(ReplApplication):
with open(index_file, 'r') as fp:
r.parse_index(fp)
except IOError as e:
print >>sys.stderr, 'Unable to open repository: %s' % e
print >>sys.stderr, 'Use the "create" command before.'
print >>self.stderr, 'Unable to open repository: %s' % e
print >>self.stderr, 'Use the "create" command before.'
return 1
r.build_index(source_path, index_file)

View file

@ -18,7 +18,6 @@
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
import sys
from weboob.capabilities.torrent import CapTorrent, MagnetOnly
from weboob.tools.application.repl import ReplApplication, defaultcount
@ -117,7 +116,7 @@ class Weboorrents(ReplApplication):
"""
torrent = self.get_object(id, 'get_torrent', ('description', 'files'))
if not torrent:
print >>sys.stderr, 'Torrent not found: %s' % id
print >>self.stderr, 'Torrent not found: %s' % id
return 3
self.start_format()
@ -142,7 +141,7 @@ class Weboorrents(ReplApplication):
torrent = self.get_object(id, 'get_torrent', ('description', 'files'))
if not torrent:
print >>sys.stderr, 'Torrent not found: %s' % id
print >>self.stderr, 'Torrent not found: %s' % id
return 3
dest = self.obj_to_filename(torrent, dest, '{id}-{name}.torrent')
@ -157,20 +156,20 @@ class Weboorrents(ReplApplication):
with open(dest, 'w') as f:
f.write(buf)
except IOError as e:
print >>sys.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
print >>self.stderr, 'Unable to write .torrent in "%s": %s' % (dest, e)
return 1
return
except CallErrors as errors:
for backend, error, backtrace in errors:
if isinstance(error, MagnetOnly):
print >>sys.stderr, u'Error(%s): No direct URL available, ' \
print >>self.stderr, u'Error(%s): No direct URL available, ' \
u'please provide this magnet URL ' \
u'to your client:\n%s' % (backend, error.magnet)
return 4
else:
self.bcall_error_handler(backend, error, backtrace)
print >>sys.stderr, 'Torrent "%s" not found' % id
print >>self.stderr, 'Torrent "%s" not found' % id
return 3
@defaultcount(10)

View file

@ -23,6 +23,7 @@ from __future__ import print_function
import logging
import optparse
from optparse import OptionGroup, OptionParser
import locale
import os
import sys
import warnings
@ -134,6 +135,7 @@ class BaseApplication(object):
# ------ BaseApplication methods -------------------------------
def __init__(self, option_parser=None):
self.encoding = self.guess_encoding()
self.logger = getLogger(self.APPNAME)
self.weboob = self.create_weboob()
if self.CONFDIR is None:
@ -165,6 +167,15 @@ class BaseApplication(object):
self._parser.add_option('--shell-completion', action='store_true', help=optparse.SUPPRESS_HELP)
self._is_default_count = True
def guess_encoding(self, stdio=None):
if stdio is None:
stdio = self.stdout
encoding = stdio.encoding or locale.getpreferredencoding()
# ASCII or ANSII is most likely a user mistake
if not encoding or encoding.lower() == 'ascii' or encoding.lower().startswith('ansi'):
encoding = 'UTF-8'
return encoding
def deinit(self):
self.weboob.want_stop()
self.weboob.deinit()
@ -296,9 +307,9 @@ class BaseApplication(object):
if isinstance(error, MoreResultsAvailable):
return False
print(u'Error(%s): %s' % (backend.name, error), file=sys.stderr)
print(u'Error(%s): %s' % (backend.name, error), file=self.stderr)
if logging.root.level == logging.DEBUG:
print(backtrace, file=sys.stderr)
print(backtrace, file=self.stderr)
else:
return True
@ -323,7 +334,7 @@ class BaseApplication(object):
ask_debug_mode = True
if ask_debug_mode:
print(debugmsg, file=sys.stderr)
print(debugmsg, file=self.stderr)
def parse_args(self, args):
self.options, args = self._parser.parse_args(args)
@ -358,7 +369,7 @@ class BaseApplication(object):
if self.options.save_responses:
import tempfile
responses_dirname = tempfile.mkdtemp(prefix='weboob_session_')
print('Debug data will be saved in this directory: %s' % responses_dirname, file=sys.stderr)
print('Debug data will be saved in this directory: %s' % responses_dirname, file=self.stderr)
log_settings['save_responses'] = True
log_settings['responses_dirname'] = responses_dirname
handlers.append(self.create_logging_file_handler(os.path.join(responses_dirname, 'debug.log')))
@ -381,8 +392,8 @@ class BaseApplication(object):
# stdout logger
format = '%(asctime)s:%(levelname)s:%(name)s:' + cls.VERSION +\
':%(filename)s:%(lineno)d:%(funcName)s %(message)s'
handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(createColoredFormatter(sys.stdout, format))
handler = logging.StreamHandler(cls.stdout)
handler.setFormatter(createColoredFormatter(cls.stdout, format))
return handler
@classmethod
@ -426,12 +437,12 @@ class BaseApplication(object):
cls.setup_logging(logging.INFO, [cls.create_default_logger()])
if args is None:
args = [(sys.stdin.encoding and isinstance(arg, bytes) and arg.decode(sys.stdin.encoding) or to_unicode(arg)) for arg in sys.argv]
args = [(cls.stdin.encoding and isinstance(arg, bytes) and arg.decode(cls.stdin.encoding) or to_unicode(arg)) for arg in sys.argv]
try:
app = cls()
except BackendsConfig.WrongPermissions as e:
print(e, file=sys.stderr)
print(e, file=cls.stderr)
sys.exit(1)
try:
@ -439,12 +450,12 @@ class BaseApplication(object):
args = app.parse_args(args)
sys.exit(app.main(args))
except KeyboardInterrupt:
print('Program killed by SIGINT', file=sys.stderr)
print('Program killed by SIGINT', file=cls.stderr)
sys.exit(0)
except EOFError:
sys.exit(0)
except ConfigError as e:
print('Configuration error: %s' % e, file=sys.stderr)
print('Configuration error: %s' % e, file=cls.stderr)
sys.exit(1)
except CallErrors as e:
try:
@ -453,7 +464,7 @@ class BaseApplication(object):
pass
sys.exit(1)
except ResultsConditionError as e:
print('%s' % e, file=sys.stderr)
print('%s' % e, file=cls.stderr)
sys.exit(1)
finally:
app.deinit()

View file

@ -26,7 +26,6 @@ import logging
import subprocess
import sys
import os
import locale
from weboob.capabilities import UserError
from weboob.capabilities.account import CapAccount, Account, AccountRegisterError
@ -82,16 +81,6 @@ class ConsoleApplication(BaseApplication):
BaseApplication.__init__(self, option_parser)
self.weboob.callbacks['login'] = self.login_cb
self.enabled_backends = set()
self.encoding = self.guess_encoding()
def guess_encoding(self, stdio=None):
if stdio is None:
stdio = self.stdout
encoding = stdio.encoding or locale.getpreferredencoding()
# ASCII or ANSII is most likely a user mistake
if not encoding or encoding.lower() == 'ascii' or encoding.lower().startswith('ansi'):
encoding = 'UTF-8'
return encoding
def login_cb(self, backend_name, value):
return self.ask('[%s] %s' % (backend_name,
@ -517,7 +506,7 @@ class ConsoleApplication(BaseApplication):
def acquire_input(self, content=None, editor_params=None):
editor = os.getenv('EDITOR', 'vi')
if sys.stdin.isatty() and editor:
if self.stdin.isatty() and editor:
from tempfile import NamedTemporaryFile
with NamedTemporaryFile() as f:
filename = f.name
@ -534,10 +523,10 @@ class ConsoleApplication(BaseApplication):
f.seek(0)
text = f.read()
else:
if sys.stdin.isatty():
if self.stdin.isatty():
print('Reading content from stdin... Type ctrl-D ' \
'from an empty line to stop.')
text = sys.stdin.read()
text = self.stdin.read()
return text.decode(self.encoding)
def bcall_error_handler(self, backend, error, backtrace):