[Sugar-devel] [PATCH sugar] Example objects support

Martin Abente martin.abente.lahaye at gmail.com
Tue Aug 21 11:26:00 EDT 2012


Thanks a lot for the review Sascha, I will improve these things.

On Tue, Aug 21, 2012 at 9:38 AM, Sascha Silbe <silbe at activitycentral.com>wrote:

> Martin Abente Lahaye <martin.abente.lahaye at gmail.com> writes:
>
> [src/jarabe/journal/volumestoolbar.py]
> [_set_up_activities_examples()]
> [...]
> > +        activities = []
> > +        for home_activity in home_model._activities:
> > +            if home_activity.is_journal():
> > +                continue
> > +
> > +            activity_name = home_activity.get_activity_name()
> > +            if activity_name not in activities:
> > +                self._add_activity_example(home_activity)
> > +                activities.append(activity_name)
>
> I wonder if using a dictionary for deduplication would be better
> here. E.g.:
>
>     activities = dict([(home_activity.get_activity_name(), home_activity)
>                        for home_activity in home_model])
>     for home_activity in activities.values():
>         self._add_activity_examples(home_activity)
>
>
> Alternatively, you could just iterate over all entries and let
> _add_activity_examples() take care of deduplication (as it has to do
> anyway), at the risk of making it O(n²).
>
>
> > +    def _proper_occurrence(self, home_activity):
>
> What's a "proper" occurrence?
>
> > +        if home_activity.is_journal():
> > +            return False
> > +
> > +        home_model = shell.get_model()
> > +        act_name = home_activity.get_activity_name()
> > +        activities = filter(lambda act: act_name ==
> act.get_activity_name(),
> > +                        home_model._activities)
> > +
> > +        return len(activities) <= 1
>
> I assume this is for deduplication again. The easiest and fastest way
> overall (O(1) per iteration [1], O(n) in total) is probably a
> ref-counting scheme:
>
>     def __init__(self, ...):
>         # ...the usual stuff...
>
>         self._activity_counts = {}
>         self._example_buttons = {}
>         for home_activity in home_model:
>             self._add_activity(home_activity)
>
>     def _add_activity(self, home_activity):
>         """Keep track of an active activity session
>
>         Keep track of an active activity session and add the examples
>         folder if available and not already shown.
>         """
>         name = home_activity.get_activity_name()
>         old_count = self._activity_counts.get(name, 0)
>         self._activity_counts[name] = old_count + 1
>         if old_count:
>             return
>
>         # ...create button...
>
>         self._example_buttons[name] = example_button
>
>     def _remove_activity(self, home_activity):
>         """Stop keeping track of an active activity session
>
>         Remove all internal references to this session. Remove the
>         corresponding examples folder if it's the last instance of
>         this activity.
>         """
>         name = home_activity.get_activity_name()
>         old_count = self._activity_counts[name]
>         self._activity_counts[name] = old_count - 1
>         if old_count > 1:
>             return
>
>         example_button = self._example_buttons.pop(name)
>
>         # ...remove button...
>
>
>
> > +    def _add_activity_example(self, home_activity):
> > +        examples_path = os.path.join(home_activity.get_bundle_path(),
> > +                                    'examples')
> > +
> > +        if not os.path.exists(examples_path):
> > +            return
>
> If you add a guard against home_activity.get_bundle_path() returning
> None, you can drop the special-casing for the Journal activity.
>
>
> Sascha
>
> [1] http://wiki.python.org/moin/TimeComplexity#dict
> --
> http://sascha.silbe.org/
> http://www.infra-silbe.de/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20120821/3ccd6a7c/attachment-0001.html>


More information about the Sugar-devel mailing list