[sugar] storing Activity parameters

Tomeu Vizoso tomeu
Sat Mar 15 05:01:34 EDT 2008


On Sat, Mar 15, 2008 at 1:44 AM, Gary C Martin <gary at garycmartin.com> wrote:
> On 3 Mar 2008, at 10:44, Tomeu Vizoso wrote:
>
>  > On Sun, Mar 2, 2008 at 1:51 PM, Gary C Martin <gary at garycmartin.com>
>  > wrote:
>  >
>
> >> What if both journal and file-system were used to store the
>  >> activity state, with the journal settings overriding the file-system
>  >> settings. This way a new activity start-up could inherit the last
>  >> used
>  >> activity settings, and a specific journal start-up would inherit the
>  >> settings used for that specific entry. So in the case of Speak I
>  >> could
>  >> have separate favourite journal entries for '3 eyed alien' and
>  >> another
>  >> for 'Mr square eyes', then if I also just started the activity from
>  >> fresh I'd pick-up whatever the last used setting were (picked up from
>  >> the FS).
>  >
>  > I like this idea a lot. Thanks for sharing.
>
>  I just wanted to follow up on this activity preference storage idea
>  from a few weeks ago, with some working code, as I've finally got
>  around to writing/testing and all appears to work well. Feedback
>  appreciated if I'm doing something dubious here. Activity defaults are
>  hard coded, then overwritten by a persistent file (if it exists), then
>  overwritten by a call to read_file (if the activity was started from
>  the journal):
>
>  class MyActivity(activity.Activity):
>         """MyActivity main class."""
>         def __init__(self, handle):
>                 activity.Activity.__init__(self, handle)
>                 self._name = handle
>                 self.set_title(_("MyActivity"))
>
>                 # Defaults (Journal resume priority, default persistent file
>  secondary, fall-back hardcoded values)
>                 self.preferenceOne = 'foo'
>                 self.preferenceTwo = 'bar'
>                 self.activityState = {}
>                 self.activityState['preferenceOne'] = self.preferenceOne
>                 self.activityState['preferenceTwo'] = self.preferenceTwo
>                 self.parse_preferences(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/
>  defaults')
>
>                 #
>                 # Rest of MyActivity init code
>                 #
>
>         def parse_preferences(self, file_path):
>                 """Parse and set preference data from a given file."""
>                 try:
>                         f = file(file_path, 'r')
>                         self.activityState = cPickle.load(f)
>                         f.close()
>                         if 'preferenceOne' in self.activityState.keys():
>                                 self. preferenceOne = self.activityState['preferenceOne']
>                         if 'preferenceTwo' in self.activityState.keys():
>                                 self. preferenceTwo = self.activityState['preferenceTwo']
>                 except:
>                         print "preference data %s not available" % (file_path)
>
>         def read_file(self, file_path):
>                 """Read state from datastore."""
>                 self.parse_preferences(file_path)
>
>                 #
>                 # Update state of MyActivity interface if necessary
>                 #
>
>         def write_file(self, file_path):
>                 """Write state to journal datastore and to persistent file system."""
>                 self.activityState['preferenceOne'] = self. preferenceOne
>                 self.activityState['preferenceTwo'] = self. preferenceTwo
>                 toJournal = file(file_path, 'w')
>                 cPickle.dump(self.activityState, toJournal)
>                 toJournal.close()
>                 toPersistentFs = file(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/
>  defaults', 'w')
>                 cPickle.dump(self.activityState, toPersistentFs)
>                 toPersistentFs.close()
>
>  So... just to recap, when you first launch an activity, the hard coded
>  settings are used. If you make changes and exit, they become the new
>  defaults if you launch another. If you resume from a previous Journal
>  entry its settings are honoured (and will become the new defaults when
>  you exit). If your activity has lots of complicate preferences you
>  might want to provide an option for resetting preferences back to hard
>  coded defaults, but having lot's of complicated settings needing reset
>  suggests you might need to simplify things a little for the target
>  audience ;-)
>
>  If this looks like is might be useful/stable approach for some others
>  to use in activities, let me know and I'll find somewhere on the wiki
>  to document it more permanently.

Yes, I like it a lot. Just would suggest using json instead of
cpickle. It should be as easy but would give you human readable files
that can also be read easily from other languages.

Thanks,

Tomeu



More information about the Sugar-devel mailing list