diff options
author | Walter Bender <walter@sugarlabs.org> | 2014-01-13 21:31:53 (GMT) |
---|---|---|
committer | Walter Bender <walter@sugarlabs.org> | 2014-01-13 21:31:53 (GMT) |
commit | fcf16f9f4f0c9e5654017db84215041f7dc7704f (patch) | |
tree | 7c3ed453ffee27badcbaee1084e9f66ddf043a3e /pippy_app.py | |
parent | c97dc560c31ce093915d1b44c40dca84b324aab8 (diff) | |
parent | 8944bad3d4de6cdee622c93725ef4941a9f45ab9 (diff) |
merges from GCI committed to correct branch
Diffstat (limited to 'pippy_app.py')
-rw-r--r-- | pippy_app.py | 385 |
1 files changed, 220 insertions, 165 deletions
diff --git a/pippy_app.py b/pippy_app.py index 2b95c04..28fbf44 100644 --- a/pippy_app.py +++ b/pippy_app.py @@ -48,13 +48,14 @@ from gettext import gettext as _ from sugar3.datastore import datastore from sugar3.activity.widgets import EditToolbar from sugar3.activity.widgets import StopButton -from sugar3.activity.activity import get_bundle_path from sugar3.activity.activity import get_bundle_name -from sugar3.graphics.alert import ConfirmationAlert +from sugar3.activity.activity import get_bundle_path from sugar3.graphics.alert import Alert -from sugar3.graphics.icon import Icon +from sugar3.graphics.alert import ConfirmationAlert from sugar3.graphics.alert import NotifyAlert from sugar3.graphics import style +from sugar3.graphics.icon import Icon +from sugar3.graphics.objectchooser import ObjectChooser from sugar3.graphics.toggletoolbutton import ToggleToolButton from sugar3.graphics.objectchooser import ObjectChooser @@ -66,15 +67,16 @@ from activity import TARGET_TYPE_TEXT import groupthink.sugar_tools import groupthink.gtk_tools -from FileDialog import FileDialog -from IconDialog import IconDialog +from filedialog import FileDialog +from icondialog import IconDialog text_buffer = None # magic prefix to use utf-8 source encoding -PYTHON_PREFIX = """#!/usr/bin/python +PYTHON_PREFIX = '''#!/usr/bin/python # -*- coding: utf-8 -*- -""" -default_categoties = [_('graphics'), _('math'), _('pyhton'), _('sound'), +''' +# Force category names into Pootle +DEFAULT_CATEGORIES = [_('graphics'), _('math'), _('pyhton'), _('sound'), _('string'), _('tutorials')] from sugar3.graphics.toolbarbox import ToolbarButton @@ -86,7 +88,18 @@ SIZE_Y = Gdk.Screen.height() groupthink_mimetype = 'pickle/groupthink-pippy' -from Notebook import SourceNotebook +from notebook import SourceNotebook + +DISUTILS_SETUP_SCRIPT = """#!/usr/bin/python +# -*- coding: utf-8 -*- +from distutils.core import setup +setup(name='{modulename}', + version='1.0', + py_modules=[ + {filenames} + ], + ) +""" # This is .format()'ed with the list of the file names. DISUTILS_SETUP_SCRIPT = """#!/usr/bin/python # -*- coding: utf-8 -*- @@ -101,7 +114,7 @@ setup(name='{modulename}', class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): - """Pippy Activity as specified in activity.info""" + '''Pippy Activity as specified in activity.info''' def early_setup(self): from gi.repository import GtkSource self.initial_text_buffer = GtkSource.Buffer() @@ -110,7 +123,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): self.loaded_session = [] self.session_data = [] - sys.path.append(os.path.join(self.get_activity_root(), "Library")) + sys.path.append(os.path.join(self.get_activity_root(), 'Library')) def initialize_display(self): self._logger = logging.getLogger('pippy-activity') @@ -123,39 +136,39 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): separator.show() activity_toolbar.insert(separator, -1) - import_py_button = ToolButton("pippy-import_py") - import_py_button.set_tooltip(_("Import Python File")) - import_py_button.connect("clicked", self._import_py_cb) + import_py_button = ToolButton('pippy-import-doc') + import_py_button.set_tooltip(_('Import Python file to new tab')) + import_py_button.connect('clicked', self._import_py_cb) import_py_button.show() activity_toolbar.insert(import_py_button, -1) - save_as_library = ToolButton("pippy-save_library") - save_as_library.set_tooltip(_("Save this file as a library")) - save_as_library.connect("clicked", self._save_as_library) - save_as_library.show() - activity_toolbar.insert(save_as_library, -1) - - export_doc_button = ToolButton('pippy-export_doc') - export_doc_button.set_tooltip(_("Export as Pippy Document")) + export_doc_button = ToolButton('pippy-export-doc') + export_doc_button.set_tooltip(_('Export as Pippy document')) export_doc_button.connect('clicked', self._export_document_cb) export_doc_button.show() activity_toolbar.insert(export_doc_button, -1) - export_example_button = ToolButton('pippy-export_example') - export_example_button.set_tooltip(_("Export as Pippy Example")) + save_as_library = ToolButton('pippy-export-library') + save_as_library.set_tooltip(_('Save this file to the Pippy library')) + save_as_library.connect('clicked', self._save_as_library) + save_as_library.show() + activity_toolbar.insert(save_as_library, -1) + + export_example_button = ToolButton('pippy-export-example') + export_example_button.set_tooltip(_('Export as new Pippy example')) export_example_button.connect('clicked', self._export_example_cb) export_example_button.show() activity_toolbar.insert(export_example_button, -1) - create_bundle_button = ToolButton('pippy-create_bundle') - create_bundle_button.set_tooltip(_("Create Activity Bundle")) + create_bundle_button = ToolButton('pippy-create-bundle') + create_bundle_button.set_tooltip(_('Create a Sugar activity bundle')) create_bundle_button.connect('clicked', self._create_bundle_cb) create_bundle_button.show() activity_toolbar.insert(create_bundle_button, -1) - export_disutils = ToolButton("pippy-create_bundle") - export_disutils.set_tooltip(_("Export as disutils package")) - export_disutils.connect("clicked", self.__export_disutils_cb) + export_disutils = ToolButton('pippy-create-disutils') + export_disutils.set_tooltip(_('Export as a disutils package')) + export_disutils.connect('clicked', self.__export_disutils_cb) export_disutils.show() activity_toolbar.insert(export_disutils, -1) @@ -176,20 +189,20 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): actions_toolbar = self.get_toolbar_box().toolbar - self.toggle_output = ToggleToolButton("tray-show") - self.toggle_output.set_tooltip(_("Show output panel")) - self.toggle_output.connect("toggled", self._toggle_output_cb) + self.toggle_output = ToggleToolButton('tray-show') + self.toggle_output.set_tooltip(_('Show output panel')) + self.toggle_output.connect('toggled', self._toggle_output_cb) actions_toolbar.insert(self.toggle_output, -1) # The "go" button goicon_bw = Gtk.Image() - goicon_bw.set_from_file("%s/icons/run_bw.svg" % os.getcwd()) + goicon_bw.set_from_file('%s/icons/run_bw.svg' % os.getcwd()) goicon_color = Gtk.Image() - goicon_color.set_from_file("%s/icons/run_color.svg" % os.getcwd()) - gobutton = ToolButton(label=_("Run!")) + goicon_color.set_from_file('%s/icons/run_color.svg' % os.getcwd()) + gobutton = ToolButton(label=_('Run!')) gobutton.props.accelerator = _('<alt>r') gobutton.set_icon_widget(goicon_bw) - gobutton.set_tooltip(_("Run!")) + gobutton.set_tooltip(_('Run!')) gobutton.connect('clicked', self.flash_cb, dict({'bw': goicon_bw, 'color': goicon_color})) gobutton.connect('clicked', self.gobutton_cb) @@ -197,40 +210,40 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): # The "stop" button stopicon_bw = Gtk.Image() - stopicon_bw.set_from_file("%s/icons/stopit_bw.svg" % os.getcwd()) + stopicon_bw.set_from_file('%s/icons/stopit_bw.svg' % os.getcwd()) stopicon_color = Gtk.Image() - stopicon_color.set_from_file("%s/icons/stopit_color.svg" % os.getcwd()) - stopbutton = ToolButton(label=_("Stop")) + stopicon_color.set_from_file('%s/icons/stopit_color.svg' % os.getcwd()) + stopbutton = ToolButton(label=_('Stop')) stopbutton.props.accelerator = _('<alt>s') stopbutton.set_icon_widget(stopicon_bw) stopbutton.connect('clicked', self.flash_cb, dict({'bw': stopicon_bw, 'color': stopicon_color})) stopbutton.connect('clicked', self.stopbutton_cb) - stopbutton.set_tooltip(_("Stop")) + stopbutton.set_tooltip(_('Stop')) actions_toolbar.insert(stopbutton, -1) # The "clear" button clearicon_bw = Gtk.Image() - clearicon_bw.set_from_file("%s/icons/eraser_bw.svg" % os.getcwd()) + clearicon_bw.set_from_file('%s/icons/eraser_bw.svg' % os.getcwd()) clearicon_color = Gtk.Image() - clearicon_color.set_from_file("%s/icons/eraser_color.svg" % + clearicon_color.set_from_file('%s/icons/eraser_color.svg' % os.getcwd()) - clearbutton = ToolButton(label=_("Clear")) + clearbutton = ToolButton(label=_('Clear')) clearbutton.props.accelerator = _('<alt>c') clearbutton.set_icon_widget(clearicon_bw) clearbutton.connect('clicked', self.clearbutton_cb) clearbutton.connect('clicked', self.flash_cb, dict({'bw': clearicon_bw, 'color': clearicon_color})) - clearbutton.set_tooltip(_("Clear")) + clearbutton.set_tooltip(_('Clear')) actions_toolbar.insert(clearbutton, -1) activity_toolbar.show() - examples = ToolButton("pippy-openoff") - examples.set_tooltip(_("Load example")) - examples.connect("clicked", self.load_example) + examples = ToolButton('pippy-openoff') + examples.set_tooltip(_('Load example')) + examples.connect('clicked', self.load_example) self.get_toolbar_box().toolbar.insert(Gtk.SeparatorToolItem(), -1) self.get_toolbar_box().toolbar.insert(examples, -1) @@ -283,13 +296,13 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): # check if dir exists in pref language, if exists, add it if os.path.exists(os.path.join(lang_path, folder)): direntry = { - "name": _(folder.capitalize()), - "path": os.path.join(lang_path, folder) + "/"} + 'name': _(folder.capitalize()), + 'path': os.path.join(lang_path, folder) + '/'} # if not try to see if it's in default English path elif os.path.exists(os.path.join(en_lang_path, folder)): direntry = { - "name": _(folder.capitalize()), - "path": os.path.join(en_lang_path, folder) + "/"} + 'name': _(folder.capitalize()), + 'path': os.path.join(en_lang_path, folder) + '/'} self.paths.append([direntry['name'], direntry['path']]) # Adding local examples @@ -297,7 +310,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): self.paths.append([_('My examples'), root]) self.source_tabs = SourceNotebook(self) - self.source_tabs.connect("tab-added", self._add_source_cb) + self.source_tabs.connect('tab-added', self._add_source_cb) if self.loaded_from_journal and self.py_file: self.source_tabs.add_tab( self.initial_title, @@ -341,15 +354,15 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): shown = button.get_active() if shown: self.outbox.show_all() - self.toggle_output.set_tooltip(_("Hide output panel")) - self.toggle_output.set_icon_name("tray-hide") + self.toggle_output.set_tooltip(_('Hide output panel')) + self.toggle_output.set_icon_name('tray-hide') else: self.outbox.hide() - self.toggle_output.set_tooltip(_("Show output panel")) - self.toggle_output.set_icon_name("tray-show") + self.toggle_output.set_tooltip(_('Show output panel')) + self.toggle_output.set_icon_name('tray-show') def load_example(self, widget): - widget.set_icon_name("pippy-openon") + widget.set_icon_name('pippy-openon') dialog = FileDialog(self.paths, self, widget) dialog.run() path = dialog.get_path() @@ -376,11 +389,11 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): def selection_cb(self, value): self.save() - self._logger.debug("clicked! %s" % value['path']) + self._logger.debug('clicked! %s' % value['path']) _file = open(value['path'], 'r') lines = _file.readlines() text_buffer = self.source_tabs.get_text_buffer() - text_buffer.set_text("".join(lines)) + text_buffer.set_text(''.join(lines)) text_buffer.set_modified(False) self.metadata['title'] = value['name'] self.stopbutton_cb(None) @@ -392,8 +405,9 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): if text_buffer.get_modified(): alert = ConfirmationAlert() alert.props.title = _('Example selection Warning') - alert.props.msg = _('You have modified the currently selected file.' - ' Discard changes?') + alert.props.msg = \ + _('You have modified the currently selected file. ' + 'Discard changes?') alert.connect('response', self._discard_changes_cb, path) self.add_alert(alert) return False @@ -428,7 +442,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): def clearbutton_cb(self, button): self.save() text_buffer = self.source_tabs.get_text_buffer() - text_buffer.set_text("") + text_buffer.set_text('') text_buffer.set_modified(False) self.metadata['title'] = _('%s Activity') % get_bundle_name() self.stopbutton_cb(None) @@ -440,7 +454,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): zipdata = zip(data[0], data[1]) for name, content in zipdata: with open(os.path.join(tmp_dir, name), 'w') as f: - # write utf-8 coding prefix if there's not already one + # Write utf-8 coding prefix if there's not one already if re.match(r'coding[:=]\s*([-\w.]+)', '\n'.join(content.splitlines()[:2])) is None: f.write(PYTHON_PREFIX) @@ -448,7 +462,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): def _reset_vte(self): self._vte.grab_focus() - self._vte.feed("\x1B[H\x1B[J\x1B[0;39m") + self._vte.feed('\x1B[H\x1B[J\x1B[0;39m') def __undobutton_cb(self, butston): text_buffer = self.source_tabs.get_text_buffer() @@ -461,20 +475,18 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): text_buffer.redo() def __copybutton_cb(self, button): - # global text_buffer text_buffer = self.source_tabs.get_text_buffer() clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) text_buffer.copy_clipboard(clipboard) def __pastebutton_cb(self, button): - # global text_buffer text_buffer = self.source_tabs.get_text_buffer() clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) text_buffer.paste_clipboard(clipboard, None, True) def gobutton_cb(self, button): from shutil import copy2 - self.stopbutton_cb(button) # try stopping old code first. + self.stopbutton_cb(button) # Try stopping old code first. self._reset_vte() # FIXME: We're losing an odd race here @@ -491,18 +503,18 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): pippy_tmp_dir, self.source_tabs.get_current_file_name()) - # write activity.py here too, to support pippy-based activities. + # Write activity.py here too, to support pippy-based activities. copy2('%s/activity.py' % get_bundle_path(), '%s/tmp/activity.py' % self.get_activity_root()) self._pid = self._vte.fork_command_full( Vte.PtyFlags.DEFAULT, get_bundle_path(), - ["/bin/sh", "-c", "python %s; sleep 1" % current_file, - "PYTHONPATH=%s/library:%s" % (get_bundle_path(), - os.getenv("PYTHONPATH", ""))], - ["PYTHONPATH=%s/library:%s" % (get_bundle_path(), - os.getenv("PYTHONPATH", ""))], + ['/bin/sh', '-c', 'python %s; sleep 1' % current_file, + 'PYTHONPATH=%s/library:%s' % (get_bundle_path(), + os.getenv('PYTHONPATH', ''))], + ['PYTHONPATH=%s/library:%s' % (get_bundle_path(), + os.getenv('PYTHONPATH', ''))], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None,) @@ -512,7 +524,32 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): if self._pid is not None: os.kill(self._pid[1], SIGTERM) except: - pass # process must already be dead. + pass # Process must already be dead. + + def _save_as_library(self, button): + library_dir = os.path.join(get_bundle_path(), 'library') + file_name = self.source_tabs.get_current_file_name() + text_buffer = self.source_tabs.get_text_buffer() + content = text_buffer.get_text( + *text_buffer.get_bounds(), + include_hidden_chars=True) + + if not os.path.isdir(library_dir): + os.mkdir(library_dir) + + with open(os.path.join(library_dir, file_name), 'w') as f: + f.write(content) + success = True + + if success: + alert = NotifyAlert(5) + alert.props.title = _('Python File added to Library') + IMPORT_MESSAGE = _('The file you selected has been added' + ' to the library. Use "import {importname}"' + ' to import the library for using.') + alert.props.msg = IMPORT_MESSAGE.format(importname=file_name[:-3]) + alert.connect('response', self.remove_alert_cb) + self.add_alert(alert) def _save_as_library(self, button): import unicodedata @@ -556,7 +593,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): result = chooser.run() if result is Gtk.ResponseType.ACCEPT: dsitem = chooser.get_selected_object() - if dsitem.metadata['mime_type'] != "text/x-python": + if dsitem.metadata['mime_type'] != 'text/x-python': alert = NotifyAlert(5) alert.props.title = _('Error importing Python file') alert.props.msg = _('The file you selected is not a ' @@ -573,7 +610,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): else: name = dsitem.metadata['title'] file_path = dsitem.get_file_path() - content = open(file_path, "r").read() + content = open(file_path, 'r').read() self.source_tabs.add_tab(name, content) self.session_data.append(dsitem.object_id) @@ -584,7 +621,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): from shutil import rmtree from tempfile import mkdtemp - # get the name of this pippy program. + # Get the name of this pippy program. title = self.metadata['title'].replace('.py', '') title = title.replace('-', '') if title == 'Pippy Activity': @@ -617,49 +654,49 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): self._logger.debug('writing out source file: %s' % sourcefile) def internal_callback(window=None, event=None): - icon = "%s/activity/activity-default.svg" % (get_bundle_path()) + icon = '%s/activity/activity-default.svg' % (get_bundle_path()) if window: icon = window.get_icon() - - self.stopbutton_cb(None) # try stopping old code first. + self.stopbutton_cb(None) # Try stopping old code first. self._reset_vte() - self._vte.feed(_("Creating activity bundle...")) - self._vte.feed("\r\n") + self._vte.feed(_('Creating activity bundle...')) + self._vte.feed('\r\n') + TMPDIR = 'instance' app_temp = mkdtemp('.activity', 'Pippy', os.path.join(self.get_activity_root(), TMPDIR)) sourcefile = os.path.join(app_temp, 'xyzzy.py') - # invoke ourself to build the activity bundle. + # Invoke ourself to build the activity bundle. self._logger.debug('writing out source file: %s' % sourcefile) - # write out application code + # Write out application code self._write_text_buffer(sourcefile) try: # FIXME: vte invocation was raising errors. - # Switched to subprocess + # Switched to subprocss output = subprocess.check_output( - ["/usr/bin/python", - "%s/pippy_app.py" % get_bundle_path(), + ['/usr/bin/python', + '%s/pippy_app.py' % get_bundle_path(), '-p', '%s/library' % get_bundle_path(), '-d', app_temp, title, sourcefile, icon]) self._vte.feed(output) - self._vte.feed("\r\n") + self._vte.feed('\r\n') self.bundle_cb(title, app_temp) except subprocess.CalledProcessError: rmtree(app_temp, ignore_errors=True) # clean up! self._vte.feed(_('Save as Activity Error')) - self._vte.feed("\r\n") + self._vte.feed('\r\n') raise def alert_response(alert, response_id): self.remove_alert(alert) - def _icon_dialog(): + def dialog(): dialog = IconDialog() dialog.connect('destroy', internal_callback) - GObject.idle_add(_icon_dialog) + GObject.idle_add(dialog) alert_icon.connect('response', alert_response) self.add_alert(alert_icon) @@ -670,7 +707,7 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): text = text_buffer.get_text(start, end, True) with open(filename, 'w') as f: - # write utf-8 coding prefix if there's not already one + # Write utf-8 coding prefix if there's not one already if re.match(r'coding[:=]\s*([-\w.]+)', '\n'.join(text.splitlines()[:2])) is None: f.write(PYTHON_PREFIX) @@ -678,14 +715,14 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): f.write(line) def __export_disutils_cb(self, button): - app_temp = os.path.join(self.get_activity_root(), "instance") + app_temp = os.path.join(self.get_activity_root(), 'instance') data = self.source_tabs.get_all_data() for filename, content in zip(data[0], data[1]): - fileobj = open(os.path.join(app_temp, filename), "w") + fileobj = open(os.path.join(app_temp, filename), 'w') fileobj.write(content) fileobj.close() - filenames = ",".join([("'"+name[:-3]+"'") for name in data[0]]) + filenames = ','.join([("'"+name[:-3]+"'") for name in data[0]]) title = self.metadata['title'] if title is _('Pippy Activity'): @@ -704,20 +741,20 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): setup_script = DISUTILS_SETUP_SCRIPT.format(modulename=title, filenames=filenames) - setupfile = open(os.path.join(app_temp, "setup.py"), "w") + setupfile = open(os.path.join(app_temp, 'setup.py'), 'w') setupfile.write(setup_script) setupfile.close() os.chdir(app_temp) - output = subprocess.check_output( + subprocess.check_output( [ - "/usr/bin/python", - os.path.join(app_temp, "setup.py"), - "sdist", "-v" + '/usr/bin/python', + os.path.join(app_temp, 'setup.py'), + 'sdist', '-v' ]) - # hand off to journal + # Hand off to journal os.chmod(app_temp, 0777) jobject = datastore.create() metadata = { @@ -726,69 +763,70 @@ class PippyActivity(ViewSourceActivity, groupthink.sugar_tools.GroupActivity): 'mime_type': 'application/x-gzip', } for k, v in metadata.items(): - # the dict.update method is missing =( + # The dict.update method is missing =( jobject.metadata[k] = v - tarname = "dist/{modulename}-1.0.tar.gz".format(modulename=title) + tarname = 'dist/{modulename}-1.0.tar.gz'.format(modulename=title) jobject.file_path = os.path.join(app_temp, tarname) datastore.write(jobject) def _export_example_cb(self, __): - # get the name of this pippy program. + # Get the name of this pippy program. title = self.metadata['title'] if title == _('Pippy Activity'): from sugar3.graphics.alert import Alert from sugar3.graphics.icon import Icon alert = Alert() alert.props.title = _('Save as Example Error') - alert.props.msg = _('Please give your activity a meaningful \ -name before attempting to save it as an example.') + alert.props.msg = \ + _('Please give your activity a meaningful ' + 'name before attempting to save it as an example.') ok_icon = Icon(icon_name='dialog-ok') alert.add_button(Gtk.ResponseType.OK, _('Ok'), ok_icon) alert.connect('response', self.dismiss_alert_cb) self.add_alert(alert) return - self.stopbutton_cb(None) # try stopping old code first. + self.stopbutton_cb(None) # Try stopping old code first. self._reset_vte() - self._vte.feed(_("Creating example...")) - self._vte.feed("\r\n") + self._vte.feed(_('Creating example...')) + self._vte.feed('\r\n') local_data = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], 'data') local_file = os.path.join(local_data, title) if os.path.exists(local_file): alert = ConfirmationAlert() alert.props.title = _('Save as Example Warning') - alert.props.msg = _('This example already exists. \ -Do you want to overwrite it?') + alert.props.msg = _('This example already exists. ' + 'Do you want to overwrite it?') alert.connect('response', self.confirmation_alert_cb, local_file) self.add_alert(alert) else: self.write_file(local_file) self._reset_vte() - self._vte.feed(_("Saved as example.")) - self._vte.feed("\r\n") + self._vte.feed(_('Saved as example.')) + self._vte.feed('\r\n') self.add_to_example_list(local_file) def child_exited_cb(self, *args): - """Called whenever a child exits. If there's a handler, run it.""" + '''Called whenever a child exits. If there's a handler, run it.''' h, self._child_exited_handler = self._child_exited_handler, None if h is not None: h() def bundle_cb(self, title, app_temp): - """Called when we're done building a bundle for a source file.""" + '''Called when we're done building a bundle for a source file.''' from sugar3 import profile from shutil import rmtree try: - # find the .xo file: were we successful? + # Find the .xo file: were we successful? bundle_file = [f for f in os.listdir(app_temp) if f.endswith('.xo')] if len(bundle_file) != 1: self._logger.debug("Couldn't find bundle: %s" % str(bundle_file)) - self._vte.feed("\r\n") - self._vte.feed(_("Error saving activity to journal.")) - self._vte.feed("\r\n") - return # something went wrong. - # hand off to journal + self._vte.feed('\r\n') + self._vte.feed(_('Error saving activity to journal.')) + self._vte.feed('\r\n') + return # Something went wrong. + # Hand off to journal os.chmod(app_temp, 0755) jobject = datastore.create() metadata = { @@ -800,13 +838,13 @@ Do you want to overwrite it?') 'mime_type': 'application/vnd.olpc-sugar', } for k, v in metadata.items(): - # the dict.update method is missing =( + # The dict.update method is missing =( jobject.metadata[k] = v jobject.file_path = os.path.join(app_temp, bundle_file[0]) datastore.write(jobject) - self._vte.feed("\r\n") - self._vte.feed(_("Activity saved to journal.")) - self._vte.feed("\r\n") + self._vte.feed('\r\n') + self._vte.feed(_('Activity saved to journal.')) + self._vte.feed('\r\n') self.journal_show_object(jobject.object_id) jobject.destroy() finally: @@ -816,22 +854,22 @@ Do you want to overwrite it?') self.remove_alert(alert) def confirmation_alert_cb(self, alert, response_id, local_file): - # callback for conf alert + # Callback for conf alert self.remove_alert(alert) if response_id is Gtk.ResponseType.OK: self.write_file(local_file) self._reset_vte() - self._vte.feed(_("Saved as example.")) - self._vte.feed("\r\n") + self._vte.feed(_('Saved as example.')) + self._vte.feed('\r\n') else: self._reset_vte() def add_to_example_list(self, local_file): # def for add example - entry = {"name": _(os.path.basename(local_file)), - "path": local_file} + entry = {'name': _(os.path.basename(local_file)), + 'path': local_file} _iter = self.model.insert_before(self.example_iter, None) self.model.set_value(_iter, 0, entry) - self.model.set_value(_iter, 1, entry["name"]) + self.model.set_value(_iter, 1, entry['name']) def save_to_journal(self, file_path, cloudstring): _file = open(file_path, 'w') @@ -839,15 +877,15 @@ Do you want to overwrite it?') data = self.source_tabs.get_all_data() zipped_data = zip(data[0], data[1]) sessionlist = [] - app_temp = os.path.join(self.get_activity_root(), "instance") + app_temp = os.path.join(self.get_activity_root(), 'instance') tmpfile = os.path.join(app_temp, - "pippy-tempfile-storing.py") + 'pippy-tempfile-storing.py') for zipdata, dsid in map(None, zipped_data, self.session_data): name, content = zipdata if dsid is not None: dsitem = datastore.get(dsid) - __file = open(tmpfile, "w") + __file = open(tmpfile, 'w') __file.write(content) __file.close() dsitem.set_file_path(tmpfile) @@ -857,7 +895,7 @@ Do you want to overwrite it?') dsobject = datastore.create() dsobject.metadata['mime_type'] = 'text/x-python' dsobject.metadata['title'] = name - __file = open(tmpfile, "w") + __file = open(tmpfile, 'w') __file.write(content) __file.close() dsobject.set_file_path(tmpfile) @@ -898,8 +936,7 @@ Do you want to overwrite it?') self.initial_text_buffer = text self.initial_title = self.metadata['title'] self.loaded_from_journal = self.py_file = True - - elif self.metadata['mime_type'] == "application/json": + elif self.metadata['mime_type'] == 'application/json': data = json.loads(open(file_path).read()) for name, dsid in data: dsitem = datastore.get(dsid) @@ -911,7 +948,7 @@ Do you want to overwrite it?') return open(file_path).read() ############# TEMPLATES AND INLINE FILES ############## -ACTIVITY_INFO_TEMPLATE = """ +ACTIVITY_INFO_TEMPLATE = ''' [Activity] name = %(title)s bundle_id = %(bundle_id)s @@ -921,7 +958,7 @@ activity_version = %(version)d mime_types = %(mime_types)s show_launcher = yes %(extra_info)s -""" +''' PIPPY_ICON = \ """<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG @@ -934,7 +971,25 @@ viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="activity-pippy"> - <path d="M28.497,48.507 c5.988,0,14.88-2.838,14.88-11.185c0-9.285-7.743-10.143-10.954-11.083c-3.549-0.799-5.913-1.914-6.055-3.455 c-0.243-2.642,1.158-3.671,3.946-3.671c0,0,6.632,3.664,12.266,0.74c1.588-0.823,4.432-4.668,4.432-7.32 c0-2.653-9.181-5.719-11.967-5.719c-2.788,0-5.159,3.847-5.159,3.847c-5.574,0-11.149,5.306-11.149,10.612 c0,5.305,5.333,9.455,11.707,10.612c2.963,0.469,5.441,2.22,4.878,5.438c-0.457,2.613-2.995,5.306-8.361,5.306 c-4.252,0-13.3-0.219-14.745-4.079c-0.929-2.486,0.168-5.205,1.562-5.205l-0.027-0.16c-1.42-0.158-5.548,0.16-5.548,5.465 C8.202,45.452,17.347,48.507,28.497,48.507z" fill="&fill_color;" stroke="&stroke_color;" stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5"/> +<path d="M28.497,48.507 +c5.988,0,14.88-2.838,14.88-11.185 +c0-9.285-7.743-10.143-10.954-11.083 +c-3.549-0.799-5.913-1.914-6.055-3.455 +c-0.243-2.642,1.158-3.671,3.946-3.671 +c0,0,6.632,3.664,12.266,0.74 +c1.588-0.823,4.432-4.668,4.432-7.32 +c0-2.653-9.181-5.719-11.967-5.719 +c-2.788,0-5.159,3.847-5.159,3.847 +c-5.574,0-11.149,5.306-11.149,10.612 +c0,5.305,5.333,9.455,11.707,10.612 +c2.963,0.469,5.441,2.22,4.878,5.438 +c-0.457,2.613-2.995,5.306-8.361,5.306 +c-4.252,0-13.3-0.219-14.745-4.079 +c-0.929-2.486,0.168-5.205,1.562-5.205l-0.027-0.16 +c-1.42-0.158-5.548,0.16-5.548,5.465 +C8.202,45.452,17.347,48.507,28.497,48.507z" +fill="&fill_color;" stroke="&stroke_color;" +stroke-linecap="round" stroke-linejoin="round" stroke-width="3.5"/> <path d="M42.579,19.854c-2.623-0.287-6.611-2-7.467-5.022" fill="none" stroke="&stroke_color;" stroke-linecap="round" stroke-width="3"/> <circle cx="35.805" cy="10.96" fill="&stroke_color;" r="1.676"/> @@ -948,13 +1003,13 @@ stroke="&stroke_color;" stroke-linecap="round" stroke-width="3"/> def pippy_activity_version(): - """Returns the version number of the generated activity bundle.""" + '''Returns the version number of the generated activity bundle.''' return 39 def pippy_activity_extra_files(): - """Returns a map of 'extra' files which should be included in the - generated activity bundle.""" + '''Returns a map of 'extra' files which should be included in the + generated activity bundle.''' # Cheat here and generate the map from the fs contents. extra = {} bp = get_bundle_path() @@ -967,41 +1022,41 @@ def pippy_activity_extra_files(): def pippy_activity_news(): - """Return the NEWS file for this activity.""" + '''Return the NEWS file for this activity.''' # Cheat again. return open(os.path.join(get_bundle_path(), 'NEWS')).read() def pippy_activity_icon(): - """Return an SVG document specifying the icon for this activity.""" + '''Return an SVG document specifying the icon for this activity.''' return PIPPY_ICON def pippy_activity_class(): - """Return the class which should be started to run this activity.""" + '''Return the class which should be started to run this activity.''' return 'pippy_app.PippyActivity' def pippy_activity_bundle_id(): - """Return the bundle_id for the generated activity.""" + '''Return the bundle_id for the generated activity.''' return 'org.laptop.Pippy' def pippy_activity_mime_types(): - """Return the mime types handled by the generated activity, as a list.""" + '''Return the mime types handled by the generated activity, as a list.''' return ['text/x-python', groupthink_mimetype] def pippy_activity_extra_info(): - return """ + return ''' license = GPLv2+ -update_url = http://activities.sugarlabs.org """ +update_url = http://activities.sugarlabs.org ''' ################# ACTIVITY BUNDLER ################ def main(): - """Create a bundle from a pippy-style source file""" + '''Create a bundle from a pippy-style source file''' from optparse import OptionParser from pyclbr import readmodule_ex from tempfile import mkdtemp @@ -1026,7 +1081,7 @@ def main(): if re.match(r'[0-9]', pytitle) is not None: pytitle = '_' + pytitle # first character cannot be numeric - # first take a gander at the source file and see if it's got extra info + # First take a gander at the source file and see if it's got extra info # for us. sourcedir, basename = os.path.split(sourcefile) if not sourcedir: @@ -1035,7 +1090,7 @@ def main(): f = open(icon_path, 'r') icon = f.read() f.close() - # things we look for: + # Things we look for: bundle_info = { 'version': 1, 'extra_files': {}, @@ -1048,7 +1103,7 @@ def main(): 'mime_types': '', 'extra_info': '', } - # are any of these things in the module? + # Are any of these things in the module? try_import = False info = readmodule_ex(module, [sourcedir] + options.path) @@ -1057,7 +1112,7 @@ def main(): if p_a_func in info: try_import = True if try_import: - # yes, let's try to execute them to get better info about our bundle + # Yes, let's try to execute them to get better info about our bundle oldpath = list(sys.path) sys.path[0:0] = [sourcedir] + options.path modobj = __import__(module) @@ -1067,9 +1122,9 @@ def main(): bundle_info[func] = modobj.__dict__[p_a_func]() sys.path = oldpath - # okay! We've done the hard part. Now let's build a bundle. - # create a new temp dir in which to create the bundle. - app_temp = mkdtemp('.activity', 'Pippy') # hope TMPDIR is set correctly! + # Okay! We've done the hard part. Now let's build a bundle. + # Create a new temp dir in which to create the bundle. + app_temp = mkdtemp('.activity', 'Pippy') # Hope TMPDIR is set correctly! bundle = get_bundle_path() try: copytree('%s/library' % bundle, '%s/library' % app_temp) @@ -1093,9 +1148,9 @@ def main(): os.makedirs(dirname) with open(os.path.join(dirname, filename), 'w') as f: f.write(contents) - # put script into $app_temp/pippy_app.py + # Put script into $app_temp/pippy_app.py copy2(sourcefile, '%s/pippy_app.py' % app_temp) - # invoke bundle builder + # Invoke bundle builder olddir = os.getcwd() oldargv = sys.argv os.chdir(app_temp) @@ -1104,7 +1159,7 @@ def main(): bundlebuilder.start() sys.argv = oldargv os.chdir(olddir) - # move to destination directory. + # Move to destination directory. src = '%s/dist/%s-%d.xo' % (app_temp, pytitle, bundle_info['version']) dst = '%s/%s-%d.xo' % (options.dir, pytitle, bundle_info['version']) if not os.path.exists(src): @@ -1116,13 +1171,13 @@ def main(): print('Finally\r\n') if __name__ == '__main__': - from gettext import gettext as _ import sys - if False: # change this to True to test within Pippy + from gettext import gettext as _ + if False: # Change this to True to test within Pippy sys.argv = sys.argv + ['-d', '/tmp', 'Pippy', '/home/olpc/pippy_app.py'] - print(_("Working...")) + print(_('Working...')) sys.stdout.flush() main() - print(_("done!")) + print(_('done!')) sys.exit(0) |