Merge lp:~oubiwann/ubuntu-accomplishments-system/941255-unified-source-dir into lp:~jonobacon/ubuntu-accomplishments-system/trophyinfo
- 941255-unified-source-dir
- Merge into trophyinfo
Status: | Superseded |
---|---|
Proposed branch: | lp:~oubiwann/ubuntu-accomplishments-system/941255-unified-source-dir |
Merge into: | lp:~jonobacon/ubuntu-accomplishments-system/trophyinfo |
Diff against target: |
2827 lines (+496/-1289) 26 files modified
AUTHORS (+2/-1) accomplishments/config.py (+1/-54) accomplishments/daemon/app.py (+111/-101) accomplishments/daemon/dbusapi.py (+2/-2) accomplishments/daemon/tests/tests.py (+17/-15) accomplishments/exceptions.py (+32/-0) accomplishments/gui/AboutTrophyinfoDialog.py (+9/-7) accomplishments/gui/PreferencesTrophyinfoDialog.py (+8/-4) accomplishments/gui/TrophyinfoWindow.py (+46/-48) accomplishments/gui/base/AboutDialog.py (+5/-5) accomplishments/gui/base/Builder.py (+9/-9) accomplishments/gui/base/PreferencesDialog.py (+10/-9) accomplishments/gui/base/Window.py (+17/-12) accomplishments/gui/base/__init__.py (+2/-3) accomplishments/gui/base/helpers.py (+10/-36) accomplishments/main.py (+6/-27) accomplishments/util/__init__.py (+88/-0) accomplishments/util/dist.py (+75/-0) bin/rundaemon.sh (+2/-2) bin/trophyinfo (+10/-6) daemon/libaccomplishments-daemon/trophy-accomplished.svg (+0/-854) data/ui/TrophyinfoWindow.ui (+1/-1) setup.py (+6/-75) tests/test_example.py (+13/-7) tests/test_lint.py (+13/-10) trophyinfo.desktop.in (+1/-1) |
To merge this branch: | bzr merge lp:~oubiwann/ubuntu-accomplishments-system/941255-unified-source-dir |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jono Bacon | Approve | ||
Duncan McGreggor (community) | Needs Resubmitting | ||
Review via email: mp+95839@code.launchpad.net |
Commit message
Description of the change
This merge should happen in concert with the merge here:
https:/
Note that they depend upon each other.
Jono Bacon (jonobacon) wrote : | # |
A few other notes. When trying to run ./rundaemon.sh the daemon doesn't start:
jono@forge2:
Importing the validation key...
gpg: can't open `./data/
gpg: Total number processed: 0
Starting the accomplishments daemon...
(this would be done by D-Bus activation in the real world)
python: can't open file './accomplishme
jono@forge2:
This also looks like the validation key for verifying the GPG signed trophies is missing.
Duncan McGreggor (oubiwann) wrote : | # |
On Mon, Mar 5, 2012 at 1:19 AM, Jono Bacon <email address hidden> wrote:
> A few other notes. When trying to run ./rundaemon.sh the daemon doesn't start:
>
> jono@forge2:
> Importing the validation key...
> gpg: can't open `./data/
> gpg: Total number processed: 0
> Starting the accomplishments daemon...
> (this would be done by D-Bus activation in the real world)
> python: can't open file './accomplishme
> jono@forge2:
>
> This also looks like the validation key for verifying the GPG signed trophies is missing.
Hrm, I check my source, and check that the latest had been pushed up
to LP, and it had. Checking via LP right now...
Yeah, looks like they are both there on LP:
http://
http://
Did you pull the latest code? Ensure that your checkout is at rev 78 ...
I'll fire things up again at my end, and see if something else has
gone wrong, and then post my findings here...
Duncan McGreggor (oubiwann) wrote : | # |
On Mon, Mar 5, 2012 at 9:34 AM, Duncan McGreggor <email address hidden> wrote:
>
> I'll fire things up again at my end, and see if something else has
> gone wrong, and then post my findings here...
Yeah, everything works at this end.
Oh, I see! You've cd'ed into the bin dir. No need to do that. Just
keep it simple and run from the checkout dir (most tools don't require
that you cd to the bin dir; we can, of course, add support for that,
but ensuring that a script is executable from anywhere adds
complexity, and we should put that in a separate ticket if it's
something that you feel we should support right now):
Just do this from the checkout dir:
$ ./bin/rundaemon.sh
That should do it.
We'll need to update the wiki, of course, since the locations of
everything have changed to be together...
Duncan McGreggor (oubiwann) wrote : | # |
On Mon, Mar 5, 2012 at 1:13 AM, Jono Bacon <email address hidden> wrote:
> Review: Needs Fixing
>
> Thanks for your work on this, Duncan. :-)
Sure thing!
>
> This looks like quite a complex merge. Can you provide some more details of what does and what is involved?
You bet: at a high-level, this brings all the various libraries that
were independent under the same source code directory. This will allow
better refactoring in the future, where we can take advantage of
shared code and existing components from one part of the project in
another. The code base should actually shrink a bit, once we do that
(modularize).
At a lower level, here's what I did:
* created a new package called "accomplishments" (after chatting with
you about names we could use)
* moved trophyinfo_lib into accomplishments
all base classes
* moved trophyinfo into accomplishments.gui (these are the ones that
utilize a.g.base in the previous bullet)
* moved daemon.
* moved deamon.
* moved other resources into media and data, as appropriate
* as I touched parts of the code that needed PEP8 love or had
pylint/pyflakes, started addressing those too
> Also, given that we are going to wait to see what the Quickly team says about how dependencies are assessed, I would like to hold of merging changes that might break quickly.
This change shouldn't affect Quickly. I checked that "quickly run"
still works, and it does.
I'll poke around in quickly some more, and see if there are any hidden
impacts by having a changed source path (I did update ./bin/trophyinfo
to point to accomplishments
point to all the new source stuff; I'm pretty sure that's why "quickly
run" is still happy).
Jono Bacon (jonobacon) wrote : | # |
On 5 March 2012 06:55, Duncan McGreggor <email address hidden> wrote:
> On Mon, Mar 5, 2012 at 1:13 AM, Jono Bacon <email address hidden> wrote:
>> Review: Needs Fixing
>>
>> Thanks for your work on this, Duncan. :-)
>
> Sure thing!
>
>>
>> This looks like quite a complex merge. Can you provide some more details of what does and what is involved?
>
> You bet: at a high-level, this brings all the various libraries that
> were independent under the same source code directory. This will allow
> better refactoring in the future, where we can take advantage of
> shared code and existing components from one part of the project in
> another. The code base should actually shrink a bit, once we do that
> (modularize).
>
> At a lower level, here's what I did:
>
> * created a new package called "accomplishments" (after chatting with
> you about names we could use)
> * moved trophyinfo_lib into accomplishments
> all base classes
trophyinfo_lib is a Quickly thing. We will need to check with Quickly
devs that this does not break Quickly...I suspect it won't as it was a
pre-generated file.
> * moved trophyinfo into accomplishments.gui (these are the ones that
> utilize a.g.base in the previous bullet)
> * moved daemon.
I noticed when running the branch (running ./bin/rundaemon.sh) that
when it tries to run a script it can't find
Running: /home/jono/
Traceback (most recent call last):
File "/home/
line 4, in <module>
import libaccomplishments
ImportError: No module named libaccomplishments
Also, when running the GUI with 'quickly run' I get:
jono@forge2:
Traceback (most recent call last):
File "bin/trophyinfo", line 12, in <module>
from accomplishments
ImportError: No module named accomplishments
> * moved deamon.
> * moved other resources into media and data, as appropriate
> * as I touched parts of the code that needed PEP8 love or had
> pylint/pyflakes, started addressing those too
>
>> Also, given that we are going to wait to see what the Quickly team says about how dependencies are assessed, I would like to hold of merging changes that might break quickly.
>
> This change shouldn't affect Quickly. I checked that "quickly run"
> still works, and it does.
Cool. We can check for Quickly support by running:
quickly run
quickly edit
quickly design
quickly package
> I'll poke around in quickly some more, and see if there are any hidden
> impacts by having a changed source path (I did update ./bin/trophyinfo
> to point to accomplishments
> point to all the new source stuff; I'm pretty sure that's why "quickly
> run" is still happy).
Thanks, man!
--
Jono Bacon
Ubuntu Community Manager
www.ubuntu.com / www.jonobacon.org
www.identi.
Duncan McGreggor (oubiwann) wrote : | # |
Jono wrote:
> I noticed when running the branch (running ./bin/rundaemon.sh) that
> when it tries to run a script it can't find
>
> Running: /home/jono/
> Traceback (most recent call last):
> File "/home/
> line 4, in <module>
> import libaccomplishments
> ImportError: No module named libaccomplishments
So you know all those other comments I made about that branch that updated the community code?
This is what I was talking about. You need that branch to run this code. Which means you not only need to check out that branch, but install.sh it, too.
Duncan McGreggor (oubiwann) wrote : | # |
Jono wrote:
> Also, when running the GUI with 'quickly run' I get:
>
> jono@forge2:
> Traceback (most recent call last):
> File "bin/trophyinfo", line 12, in <module>
> from accomplishments
> ImportError: No module named accomplishments
Do you have the latest revision?
What happens when you "ls -al ./accomplishmen
How about "ls -al accomplishments
Jono Bacon (jonobacon) wrote : | # |
On 5 March 2012 11:59, Duncan McGreggor <email address hidden> wrote:
> So you know all those other comments I made about that branch that updated the community code?
I am a bit confused. Would it be possible to merge these multiple
branches together into one MP to simplify this?
> This is what I was talking about. You need that branch to run this code. Which means you not only need to check out that branch, but install.sh it,
What do you mean install.sh it? Are you saying you need to install the
modules to a Python path to run it?
Jono
--
Jono Bacon
Ubuntu Community Manager
www.ubuntu.com / www.jonobacon.org
www.identi.
Jono Bacon (jonobacon) wrote : | # |
On 5 March 2012 12:07, Duncan McGreggor <email address hidden> wrote:
> Jono wrote:
>
>> Also, when running the GUI with 'quickly run' I get:
>>
>> jono@forge2:
>> Traceback (most recent call last):
>> File "bin/trophyinfo", line 12, in <module>
>> from accomplishments
>> ImportError: No module named accomplishments
>
> Do you have the latest revision?
>
> What happens when you "ls -al ./accomplishmen
>
> How about "ls -al accomplishments
I see both those files, so I think I am on a current revision.
--
Jono Bacon
Ubuntu Community Manager
www.ubuntu.com / www.jonobacon.org
www.identi.
Duncan McGreggor (oubiwann) wrote : | # |
Jono wrote:
>> This change shouldn't affect Quickly. I checked that "quickly run"
>> still works, and it does.
>
> Cool. We can check for Quickly support by running:
>
> quickly run
Confirmed working from my end.
> quickly edit
Also confirmed.
> quickly design
In trunk, nothing happens when I do this. How do you propose we test this?
> quickly package
This is currently broken in trunk (it just hangs for me, and nothing happens); how should we test this, too?
Jono Bacon (jonobacon) wrote : | # |
Duncan, I took a look over the wider code and it seems to make sense to me. Just a few outstanding issues:
* I would preferably like us to be able to run this uninstalled - I think this makes development easier. The existing codebase allows this (it doesn't even require a PYTHONPATH to be set).
* It looks like you left a hard-coded path for the Icon in the .desktop.in file. :-)
Thanks again for your work here; looking forward to merging this when these final bits are resolved. :-)
Duncan McGreggor (oubiwann) wrote : | # |
As we chatted about:
1) it can be run from the branch; no need to do setup.py install. I think you were thinking about the install.sh that needs to be done in the community accomplishments branch.
2) That's probably from when I was running setup.py; it must have updated that .desktop.in file. I'll revert that auto-generated change...
- 79. By Duncan McGreggor
-
Reverted auto-generated change.
- 80. By Duncan McGreggor
-
Tweaked the bin/trophyinfo file to work around import oddness in some
environments.
Jono Bacon (jonobacon) wrote : | # |
Merged! Thanks, Duncan! :-)
Unmerged revisions
Preview Diff
1 | === modified file 'AUTHORS' |
2 | --- AUTHORS 2012-01-22 23:09:09 +0000 |
3 | +++ AUTHORS 2012-03-05 04:10:47 +0000 |
4 | @@ -1,1 +1,2 @@ |
5 | -Copyright (C) YYYY <Your Name> <Your E-mail> |
6 | +Copyright (c) 2012 Duncan McGreggor <duncan@dreamhost.com> |
7 | +Copyright (c) YYYY <Your Name> <Your E-mail> |
8 | |
9 | === renamed directory 'trophyinfo' => 'accomplishments' |
10 | === added file 'accomplishments/__init__.py' |
11 | === renamed file 'trophyinfo_lib/trophyinfoconfig.py' => 'accomplishments/config.py' |
12 | --- trophyinfo_lib/trophyinfoconfig.py 2012-01-22 23:09:09 +0000 |
13 | +++ accomplishments/config.py 2012-03-05 04:10:47 +0000 |
14 | @@ -3,61 +3,8 @@ |
15 | # This file is in the public domain |
16 | ### END LICENSE |
17 | |
18 | -# THIS IS Trophyinfo CONFIGURATION FILE |
19 | -# YOU CAN PUT THERE SOME GLOBAL VALUE |
20 | -# Do not touch unless you know what you're doing. |
21 | -# you're warned :) |
22 | - |
23 | -__all__ = [ |
24 | - 'project_path_not_found', |
25 | - 'get_data_file', |
26 | - 'get_data_path', |
27 | - ] |
28 | - |
29 | # Where your project will look for your data (for instance, images and ui |
30 | # files). By default, this is ../data, relative your trunk layout |
31 | -__trophyinfo_data_directory__ = '../data/' |
32 | +__trophyinfo_data_directory__ = 'data' |
33 | __license__ = '' |
34 | __version__ = 'VERSION' |
35 | - |
36 | -import os |
37 | - |
38 | -import gettext |
39 | -from gettext import gettext as _ |
40 | -gettext.textdomain('trophyinfo') |
41 | - |
42 | -class project_path_not_found(Exception): |
43 | - """Raised when we can't find the project directory.""" |
44 | - |
45 | - |
46 | -def get_data_file(*path_segments): |
47 | - """Get the full path to a data file. |
48 | - |
49 | - Returns the path to a file underneath the data directory (as defined by |
50 | - `get_data_path`). Equivalent to os.path.join(get_data_path(), |
51 | - *path_segments). |
52 | - """ |
53 | - return os.path.join(get_data_path(), *path_segments) |
54 | - |
55 | - |
56 | -def get_data_path(): |
57 | - """Retrieve trophyinfo data path |
58 | - |
59 | - This path is by default <trophyinfo_lib_path>/../data/ in trunk |
60 | - and /usr/share/trophyinfo in an installed version but this path |
61 | - is specified at installation time. |
62 | - """ |
63 | - |
64 | - # Get pathname absolute or relative. |
65 | - path = os.path.join( |
66 | - os.path.dirname(__file__), __trophyinfo_data_directory__) |
67 | - |
68 | - abs_data_path = os.path.abspath(path) |
69 | - if not os.path.exists(abs_data_path): |
70 | - raise project_path_not_found |
71 | - |
72 | - return abs_data_path |
73 | - |
74 | - |
75 | -def get_version(): |
76 | - return __version__ |
77 | |
78 | === renamed directory 'daemon' => 'accomplishments/daemon' |
79 | === added file 'accomplishments/daemon/__init__.py' |
80 | === renamed file 'daemon/libaccomplishments-daemon/daemon.py' => 'accomplishments/daemon/app.py' |
81 | --- daemon/libaccomplishments-daemon/daemon.py 2012-02-24 06:08:50 +0000 |
82 | +++ accomplishments/daemon/app.py 2012-03-05 04:10:47 +0000 |
83 | @@ -3,12 +3,28 @@ |
84 | Provides a D-Bus API to record accomplishments as achieved (trophies) and |
85 | to enumerate achieved and unachieved accomplishments. |
86 | """ |
87 | +import ConfigParser |
88 | +import Image, ImageEnhance |
89 | +from StringIO import StringIO |
90 | +import datetime |
91 | +import getpass |
92 | +import glob |
93 | +import gobject |
94 | +import gpgme |
95 | +import json |
96 | +import logging |
97 | +from optparse import OptionParser |
98 | +import os |
99 | +import pwd |
100 | +import subprocess |
101 | +import time |
102 | + |
103 | +import dbus |
104 | +from dbus.mainloop.glib import DBusGMainLoop |
105 | +import dbus.service |
106 | |
107 | from twisted.internet import glib2reactor |
108 | glib2reactor.install() |
109 | -from dbus.mainloop.glib import DBusGMainLoop |
110 | -DBusGMainLoop(set_as_default=True) |
111 | - |
112 | from twisted.internet import defer, reactor |
113 | from twisted.internet.protocol import ProcessProtocol |
114 | from twisted.python import filepath |
115 | @@ -17,35 +33,25 @@ |
116 | from ubuntuone.couch import auth |
117 | |
118 | import xdg.BaseDirectory |
119 | -import os |
120 | -import glob |
121 | -import getpass |
122 | -import ConfigParser |
123 | -import gobject |
124 | -import pwd |
125 | -import subprocess |
126 | -import time |
127 | -import dbus |
128 | -import dbus.service |
129 | -import json |
130 | -import logging |
131 | -import gpgme |
132 | -import Image, ImageEnhance |
133 | -from StringIO import StringIO |
134 | -import datetime |
135 | -import xdg.BaseDirectory |
136 | -from dbus.mainloop.glib import DBusGMainLoop |
137 | -from optparse import OptionParser |
138 | + |
139 | try: |
140 | import pynotify |
141 | except ImportError: |
142 | pynotify = None |
143 | |
144 | +import accomplishments |
145 | +from accomplishments import exceptions |
146 | + |
147 | + |
148 | +DBusGMainLoop(set_as_default=True) |
149 | MATRIX_USERNAME = "openiduser155707" |
150 | LOCAL_USERNAME = getpass.getuser() |
151 | SCRIPT_DELAY = 900 |
152 | |
153 | + |
154 | class SubprocessReturnCodeProtocol(ProcessProtocol): |
155 | + """ |
156 | + """ |
157 | def connectionMade(self): |
158 | self.returnCodeDeferred = defer.Deferred() |
159 | |
160 | @@ -58,16 +64,12 @@ |
161 | def errReceived(self, data): |
162 | print data |
163 | |
164 | -class NoSuchAccomplishment(ValueError): |
165 | - "No such accomplishment has been registered" |
166 | - |
167 | -class AccomplishmentLocked(ValueError): |
168 | - "This accomplishment requires other things to be accomplished first" |
169 | |
170 | class Accomplishments(object): |
171 | """The main accomplishments daemon |
172 | - No D-Bus required, so that it can be used for testing.""" |
173 | - |
174 | + |
175 | + No D-Bus required, so that it can be used for testing. |
176 | + """ |
177 | def __init__(self, service, show_notifications=None): |
178 | self.accomplishments_path = None |
179 | self.scripts_path = None |
180 | @@ -79,9 +81,9 @@ |
181 | self.dir_config = None |
182 | self.dir_data = None |
183 | self.dir_cache = None |
184 | - |
185 | + |
186 | # create config / data dirs if they don't exist |
187 | - |
188 | + |
189 | self.dir_config = os.path.join(xdg.BaseDirectory.xdg_config_home, "accomplishments") |
190 | self.dir_data = os.path.join(xdg.BaseDirectory.xdg_data_home, "accomplishments") |
191 | self.dir_cache = os.path.join(xdg.BaseDirectory.xdg_cache_home, "accomplishments") |
192 | @@ -93,20 +95,20 @@ |
193 | os.makedirs(self.dir_data) |
194 | |
195 | if not os.path.exists(self.dir_cache): |
196 | - os.makedirs(self.dir_cache) |
197 | + os.makedirs(self.dir_cache) |
198 | |
199 | # set up logging |
200 | logdir = os.path.join(self.dir_cache, "logs") |
201 | - |
202 | + |
203 | if not os.path.exists(logdir): |
204 | os.makedirs(logdir) |
205 | - |
206 | + |
207 | #self.logging = logging |
208 | logging.basicConfig(filename=(os.path.join(logdir, 'daemon.log')), level=logging.INFO) |
209 | |
210 | now = datetime.datetime.now() |
211 | logging.info("------------------- Ubuntu Accomplishments Daemon Log - %s -------------------", str(now)) |
212 | - |
213 | + |
214 | self._loadConfigFile() |
215 | |
216 | print "Accomplishments path: " + self.accomplishments_path |
217 | @@ -119,7 +121,7 @@ |
218 | |
219 | self.wait_until_a_sig_file_arrives() |
220 | self.generate_all_trophies() |
221 | - |
222 | + |
223 | reactor.callLater(5, self.run_scripts, False) |
224 | |
225 | @defer.inlineCallbacks |
226 | @@ -127,7 +129,7 @@ |
227 | path, info = yield self.sd.wait_for_signals(signal_ok="DownloadFinished", success_filter=lambda path, info: path.startswith(self.trophies_path) and path.endswith(".asc")) |
228 | logging.info("Trophy signature recieved...") |
229 | accomname = os.path.splitext(os.path.splitext(os.path.split(path)[1])[0])[0] |
230 | - data = self.listAccomplishmentInfo(accomname) |
231 | + data = self.listAccomplishmentInfo(accomname) |
232 | iconpath = os.path.join(os.path.join(os.path.join(self.accomplishments_path, data[0]["application"]), "trophyimages"), data[0]["icon"]) |
233 | |
234 | item = os.path.split(path)[1][:-11] |
235 | @@ -135,7 +137,7 @@ |
236 | |
237 | data = self.listAccomplishmentInfo(item) |
238 | |
239 | - if self.show_notifications == True and pynotify and ( |
240 | + if self.show_notifications == True and pynotify and ( |
241 | pynotify.is_initted() or pynotify.init("icon-summary-body")): |
242 | self.service.trophy_received("foo") |
243 | trophy_icon_path = "file://%s" % os.path.realpath(os.path.join(os.path.split(__file__)[0], "trophy-accomplished.svg")) |
244 | @@ -148,7 +150,7 @@ |
245 | |
246 | def _get_accomplishments_files_list(self): |
247 | logging.info("Looking for accomplishments files in " + self.accomplishments_path) |
248 | - accom_files = os.path.join(self.accomplishments_path, |
249 | + accom_files = os.path.join(self.accomplishments_path, |
250 | "*", "*.accomplishment") |
251 | return glob.glob(accom_files) |
252 | |
253 | @@ -164,10 +166,10 @@ |
254 | |
255 | def _get_trophies_files_list(self): |
256 | logging.info("Get trophies files list") |
257 | - |
258 | + |
259 | trophy_files = os.path.join(self.trophies_path, "*", "*.trophy") |
260 | unverif_list = glob.glob(trophy_files) |
261 | - |
262 | + |
263 | verif_list = [] |
264 | |
265 | for t in unverif_list: |
266 | @@ -191,14 +193,14 @@ |
267 | else: |
268 | result = {'timestamp': sig[0].timestamp, 'signer': sig[0].fpr} |
269 | logging.info("...Verified!") |
270 | - verif_list.append(t) |
271 | + verif_list.append(t) |
272 | else: |
273 | logging.info(".asc does not exist for this trophy") |
274 | |
275 | logging.info("Verifying trophy signature") |
276 | - |
277 | + |
278 | return verif_list |
279 | - |
280 | + |
281 | def _load_trophy_file(self, f): |
282 | logging.info("Load trophy file: " + f) |
283 | config = ConfigParser.RawConfigParser() |
284 | @@ -210,41 +212,45 @@ |
285 | |
286 | def listAllAccomplishments(self): |
287 | logging.info("List all accomplishments") |
288 | - fs = [self._load_accomplishment_file(f) for f in |
289 | + fs = [self._load_accomplishment_file(f) for f in |
290 | self._get_accomplishments_files_list()] |
291 | return fs |
292 | |
293 | def generate_all_trophies(self): |
294 | paths = [] |
295 | final = [] |
296 | - |
297 | - files = self._get_accomplishments_files_list() |
298 | - |
299 | + |
300 | + files = self._get_accomplishments_files_list() |
301 | + |
302 | for f in files: |
303 | paths.append(os.path.split(f)[0]) |
304 | |
305 | paths = list(set(paths)) |
306 | - |
307 | + |
308 | for p in paths: |
309 | app = os.path.split(p)[1] |
310 | app_trophyimagespath = os.path.join(p, "trophyimages") |
311 | cache_trophyimagespath = os.path.join(os.path.join(self.dir_cache, "trophyimages"), app) |
312 | if not os.path.exists(cache_trophyimagespath): |
313 | os.makedirs(cache_trophyimagespath) |
314 | - |
315 | + |
316 | # first delete existing images |
317 | lockedlist=glob.glob(cache_trophyimagespath + "/*locked*") |
318 | - |
319 | + |
320 | opplist=glob.glob(cache_trophyimagespath + "/*opportunity*") |
321 | - |
322 | + |
323 | for l in lockedlist: |
324 | os.remove(l) |
325 | |
326 | for o in opplist: |
327 | os.remove(o) |
328 | - |
329 | + |
330 | # now generate our trophy images |
331 | - self.generate_trophy_images(app_trophyimagespath, cache_trophyimagespath, "lock.png") |
332 | + lock_image_path = os.path.join( |
333 | + os.path.dirname(accomplishments.__path__[0]), |
334 | + "data/media/lock.png") |
335 | + self.generate_trophy_images( |
336 | + app_trophyimagespath, cache_trophyimagespath, lock_image_path) |
337 | |
338 | def reduce_trophy_opacity(self, im, opacity): |
339 | """Returns an image with reduced opacity.""" |
340 | @@ -257,25 +263,25 @@ |
341 | alpha = ImageEnhance.Brightness(alpha).enhance(opacity) |
342 | im.putalpha(alpha) |
343 | return im |
344 | - |
345 | + |
346 | def generate_trophy_images(self, infolder, outfolder, watermark): |
347 | mark = Image.open(watermark) |
348 | for root, dirs, files in os.walk(infolder): |
349 | - for name in files: |
350 | + for name in files: |
351 | try: |
352 | im = Image.open(os.path.join(root, name)) |
353 | filename = os.path.join(outfolder, name) |
354 | filecore = os.path.splitext(filename)[0] |
355 | filetype = os.path.splitext(filename)[1] |
356 | - |
357 | + |
358 | im.save(filename) |
359 | |
360 | # Opacity set to 1.0 until we figure out a better way of showing opportunities |
361 | reduced = self.reduce_trophy_opacity(im, 1.0) |
362 | reduced.save(filecore + "-opportunity" + filetype) |
363 | - |
364 | + |
365 | if im.mode != 'RGBA': |
366 | - im = im.convert('RGBA') |
367 | + im = im.convert('RGBA') |
368 | layer = Image.new('RGBA', im.size, (0,0,0,0)) |
369 | position = (im.size[0]-mark.size[0], im.size[1]-mark.size[1]) |
370 | layer.paste(mark, position) |
371 | @@ -283,14 +289,18 @@ |
372 | except Exception, (msg): |
373 | print msg |
374 | |
375 | - |
376 | def verifyU1Account(self): |
377 | # check if this machine has an Ubuntu One account |
378 | logging.info("Check if this machine has an Ubuntu One account...") |
379 | - u1email = json.loads(auth.request(url='https://one.ubuntu.com/api/account/')[1])['email'] |
380 | + u1auth_response = auth.request( |
381 | + url='https://one.ubuntu.com/api/account/') |
382 | + u1email = None |
383 | + if not isinstance(u1auth_response, basestring): |
384 | + u1email = json.loads(u1auth_response[1])['email'] |
385 | |
386 | if u1email is None: |
387 | logging.info("...No.") |
388 | + logging.info(u1auth_response) |
389 | self.has_u1 = False |
390 | return False |
391 | else: |
392 | @@ -332,7 +342,7 @@ |
393 | # Writing our configuration file to 'example.cfg' |
394 | with open(cfile, 'wb') as configfile: |
395 | config.write(configfile) |
396 | - |
397 | + |
398 | self._loadConfigFile() |
399 | |
400 | def _writeConfigFile(self): |
401 | @@ -351,7 +361,7 @@ |
402 | with open(cfile, 'wb') as configfile: |
403 | # Writing our configuration file to 'example.cfg' |
404 | config.write(configfile) |
405 | - |
406 | + |
407 | self.accomplishments_path = os.path.join(self.accomplishments_path, "accomplishments") |
408 | logging.info("...done.") |
409 | |
410 | @@ -362,27 +372,27 @@ |
411 | try: |
412 | data = self._load_accomplishment_file(accom_file) |
413 | except KeyError: |
414 | - raise NoSuchAccomplishment() |
415 | - |
416 | + raise exceptions.NoSuchAccomplishment() |
417 | + |
418 | needsinfolist = [] |
419 | - |
420 | + |
421 | for k in data: |
422 | if "needs-information" in k: |
423 | needsinfolist.append(data[k]) |
424 | - |
425 | + |
426 | for n in needsinfolist: |
427 | values = self.getExtraInformation(app, n) |
428 | data[n] = values[0][n] |
429 | - |
430 | + |
431 | if "depends" in data: |
432 | for dependency in data["depends"].split(","): |
433 | dapp, dname = dependency.split("/") |
434 | dtrophy_file = os.path.join( |
435 | - self.trophies_path, dapp, |
436 | + self.trophies_path, dapp, |
437 | "%s.trophy" % dname) |
438 | if not os.path.exists(dtrophy_file): |
439 | - raise AccomplishmentLocked() |
440 | - |
441 | + raise exceptions.AccomplishmentLocked() |
442 | + |
443 | cp = ConfigParser.RawConfigParser() |
444 | cp.add_section("trophy") |
445 | del data["_filename"] |
446 | @@ -393,7 +403,7 @@ |
447 | os.makedirs(os.path.join(self.trophies_path, app)) |
448 | except OSError: |
449 | pass # already exists |
450 | - trophy_file = os.path.join(self.trophies_path, app, |
451 | + trophy_file = os.path.join(self.trophies_path, app, |
452 | "%s.trophy" % accomplishment_name) |
453 | fp = open(trophy_file, "w") |
454 | cp.write(fp) |
455 | @@ -401,10 +411,10 @@ |
456 | |
457 | if not data["needs-signing"] or data["needs-signing"] == False: |
458 | self.trophy_received() |
459 | - if self.show_notifications == True and pynotify and ( |
460 | + if self.show_notifications == True and pynotify and ( |
461 | pynotify.is_initted() or pynotify.init("icon-summary-body")): |
462 | trophy_icon_path = "file://%s" % os.path.realpath(os.path.join(os.path.split(__file__)[0], "trophy-accomplished.svg")) |
463 | - n = pynotify.Notification("You have accomplished something!", |
464 | + n = pynotify.Notification("You have accomplished something!", |
465 | data["title"], trophy_icon_path) |
466 | n.show() |
467 | |
468 | @@ -413,7 +423,7 @@ |
469 | |
470 | def listAllTrophies(self): |
471 | logging.info("List all trophies") |
472 | - fs = [self._load_trophy_file(f) for f in |
473 | + fs = [self._load_trophy_file(f) for f in |
474 | self._get_trophies_files_list()] |
475 | return fs |
476 | |
477 | @@ -528,9 +538,9 @@ |
478 | except IOError as e: |
479 | infofile = os.path.join(accomextrainfo, accomconfig.get("accomplishment", "needs-information")) |
480 | infoconfig = ConfigParser.RawConfigParser() |
481 | - infoconfig.read(infofile) |
482 | + infoconfig.read(infofile) |
483 | d = {"application" : accomconfig.get("accomplishment", "application"), "needs-information" : accomconfig.get("accomplishment", "needs-information"), "label" : infoconfig.get("label", self.lang), "description" : infoconfig.get("description", self.lang)} |
484 | - infoneeded.append(d) |
485 | + infoneeded.append(d) |
486 | |
487 | # uniqify all the data required |
488 | final = [] |
489 | @@ -563,9 +573,9 @@ |
490 | config = ConfigParser.RawConfigParser() |
491 | config.read(infofile) |
492 | final = config.get("general", "name") |
493 | - |
494 | + |
495 | data["application-human"] = final |
496 | - |
497 | + |
498 | # If the trophy file exists, this must be accomplished and not locked |
499 | trophy_file = os.path.join(self.trophies_path, app, "%s.trophy" % name) |
500 | got = os.path.exists(trophy_file + ".asc") |
501 | @@ -590,7 +600,7 @@ |
502 | for dependency in dependencies: |
503 | dapp, dname = dependency.split("/") |
504 | daccomplishment_file = os.path.join( |
505 | - self.accomplishments_path, dapp, |
506 | + self.accomplishments_path, dapp, |
507 | "%s.accomplishment" % dname) |
508 | daccomplishment_data = things[daccomplishment_file] |
509 | if daccomplishment_data["accomplished"] == False: |
510 | @@ -629,7 +639,7 @@ |
511 | for i in files: |
512 | if search in i: |
513 | match = i |
514 | - |
515 | + |
516 | config = ConfigParser.RawConfigParser() |
517 | config.read(match) |
518 | data.append(dict(config._sections["accomplishment"])) |
519 | @@ -640,7 +650,7 @@ |
520 | print "--- Starting Running Scripts ---" |
521 | logging.info("--- Starting Running Scripts ---") |
522 | self.service.scriptrunner_start() |
523 | - |
524 | + |
525 | # Is the user currently logged in and running a gnome session? |
526 | username = pwd.getpwuid(uid).pw_name |
527 | try: |
528 | @@ -670,9 +680,9 @@ |
529 | except dbus.exceptions.DBusException: |
530 | logging.info("User %s does not have the accomplishments daemon available" % username) |
531 | return |
532 | - |
533 | + |
534 | accoms = self.listAllAvailableAccomplishmentsWithScripts() |
535 | - |
536 | + |
537 | for accom in accoms: |
538 | print "Running: " + accom["_script"] |
539 | logging.info("Running: " + accom["_script"]) |
540 | @@ -701,14 +711,14 @@ |
541 | pprotocol = SubprocessReturnCodeProtocol() |
542 | reactor.spawnProcess(pprotocol, command[0], command, env=os.environ) |
543 | return pprotocol.returnCodeDeferred |
544 | - |
545 | + |
546 | def run_scripts_for_all_active_users(self): |
547 | - for uid in [x.pw_uid for x in pwd.getpwall() |
548 | + for uid in [x.pw_uid for x in pwd.getpwall() |
549 | if x.pw_dir.startswith('/home/') and x.pw_shell != '/bin/false']: |
550 | os.seteuid(0) |
551 | self.run_scripts_for_user(uid) |
552 | |
553 | - def run_scripts(self, run_by_client): |
554 | + def run_scripts(self, run_by_client): |
555 | uid = os.getuid() |
556 | if uid == 0: |
557 | logging.info("Run scripts for all active users") |
558 | @@ -722,7 +732,7 @@ |
559 | |
560 | def createExtraInformationFile(self, app, item, data): |
561 | logging.info("Creating Extra Information file: %s, %s, %s", app, item, data) |
562 | - |
563 | + |
564 | extrainfodir = os.path.join(self.trophies_path, ".extrainformation/") |
565 | |
566 | if not os.path.isdir(extrainfodir): |
567 | @@ -765,58 +775,58 @@ |
568 | # because doing that confuses everything, so we create our own |
569 | # private Accomplishments object and use it. |
570 | self.ad = Accomplishments(self, self.show_notifications) |
571 | - |
572 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
573 | + |
574 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
575 | in_signature="", out_signature="aa{sv}") |
576 | def listAllAccomplishments(self): |
577 | return self.ad.listAllAccomplishments() |
578 | |
579 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
580 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
581 | in_signature="", out_signature="aa{sv}") |
582 | def listAllTrophies(self): |
583 | return self.ad.listAllTrophies() |
584 | |
585 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
586 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
587 | in_signature="", out_signature="aa{sv}") |
588 | def listAllAccomplishmentsAndStatus(self): |
589 | return self.ad.listAllAccomplishmentsAndStatus() |
590 | |
591 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
592 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
593 | in_signature="", out_signature="aa{sv}") |
594 | def listAllAvailableAccomplishmentsWithScripts(self): |
595 | return self.ad.listAllAvailableAccomplishmentsWithScripts() |
596 | |
597 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
598 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
599 | in_signature="", out_signature="aa{sv}") |
600 | def getAllExtraInformationRequired(self): |
601 | return self.ad.getAllExtraInformationRequired() |
602 | |
603 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
604 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
605 | in_signature="", out_signature="aa{sv}") |
606 | def listAccomplishmentInfo(self, accomplishment): |
607 | return self.ad.listAccomplishmentInfo(accomplishment) |
608 | |
609 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
610 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
611 | in_signature="b", out_signature="") |
612 | def run_scripts(self, run_by_client): |
613 | return self.ad.run_scripts(run_by_client) |
614 | |
615 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
616 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
617 | in_signature="", out_signature="aa{sv}") |
618 | def getExtraInformation(self, app, info): |
619 | return self.ad.getExtraInformation(app, info) |
620 | |
621 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
622 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
623 | in_signature="", out_signature="") |
624 | def createExtraInformationFile(self, app, item, data): |
625 | return self.ad.createExtraInformationFile(app, item, data) |
626 | |
627 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
628 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
629 | in_signature="ss", out_signature="") |
630 | def accomplish(self, app, accomplishment_name): |
631 | trophy = self.ad.accomplish(app, accomplishment_name) |
632 | |
633 | - @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
634 | + @dbus.service.method(dbus_interface='org.ubuntu.accomplishments', |
635 | in_signature="s", out_signature="b") |
636 | def registerTrophyDir(self, trophydir): |
637 | return self.ad.registerTrophyDir(trophydir) |
638 | @@ -844,7 +854,7 @@ |
639 | @dbus.service.signal(dbus_interface='org.ubuntu.accomplishments') |
640 | def scriptrunner_finish(self): |
641 | pass |
642 | - |
643 | + |
644 | if __name__ == "__main__": |
645 | parser = OptionParser() |
646 | parser.set_defaults(suppress_notifications=False) |
647 | |
648 | === renamed file 'daemon/libaccomplishments/__init__.py' => 'accomplishments/daemon/dbusapi.py' |
649 | --- daemon/libaccomplishments/__init__.py 2012-01-27 06:28:24 +0000 |
650 | +++ accomplishments/daemon/dbusapi.py 2012-03-05 04:10:47 +0000 |
651 | @@ -1,10 +1,10 @@ |
652 | # A stupid Python-specific wrapper for the libaccomplishments-daemon D-Bus API |
653 | -# This should not be a Python library. It should be a |
654 | +# This should not be a Python library. It should be a |
655 | # GObject-introspection-capable C thing so anyone can use it. But someone else |
656 | # needs to write that because I'm crap at Vala. |
657 | - |
658 | import dbus |
659 | |
660 | + |
661 | def Accomplishments(): |
662 | obj = dbus.SessionBus().get_object("org.ubuntu.accomplishments", "/") |
663 | return dbus.Interface(obj, "org.ubuntu.accomplishments") |
664 | |
665 | === renamed directory 'daemon/libaccomplishments-daemon/tests' => 'accomplishments/daemon/tests' |
666 | === modified file 'accomplishments/daemon/tests/tests.py' |
667 | --- daemon/libaccomplishments-daemon/tests/tests.py 2012-01-27 06:28:24 +0000 |
668 | +++ accomplishments/daemon/tests/tests.py 2012-03-05 04:10:47 +0000 |
669 | @@ -1,5 +1,6 @@ |
670 | -"Tests for libaccomplishments-daemon" |
671 | - |
672 | +""" |
673 | +Tests for accomplishments daemon. |
674 | +""" |
675 | import unittest |
676 | import sys, os |
677 | import tempfile |
678 | @@ -9,7 +10,8 @@ |
679 | import subprocess |
680 | |
681 | sys.path.append(os.path.join(os.path.split(__file__)[0], "..")) |
682 | -import daemon |
683 | +from accomplishments.daemon import app |
684 | + |
685 | |
686 | class TestDaemon(unittest.TestCase): |
687 | def setUp(self): |
688 | @@ -19,7 +21,7 @@ |
689 | os.mkdir(os.path.join(self.td, "scripts")) |
690 | os.mkdir(os.path.join(self.td, "scripts", "app1")) |
691 | os.mkdir(os.path.join(self.td, "trophies")) |
692 | - fp = open(os.path.join(self.td, "accomplishments", "app1", |
693 | + fp = open(os.path.join(self.td, "accomplishments", "app1", |
694 | "first.accomplishment"), "w") |
695 | fp.write("""[accomplishment] |
696 | application=app1 |
697 | @@ -27,7 +29,7 @@ |
698 | description=An example accomplishment for the test suite |
699 | """) |
700 | fp.close() |
701 | - fp = open(os.path.join(self.td, "accomplishments", "app1", |
702 | + fp = open(os.path.join(self.td, "accomplishments", "app1", |
703 | "second.accomplishment"), "w") |
704 | fp.write("""[accomplishment] |
705 | application=app1 |
706 | @@ -36,7 +38,7 @@ |
707 | depends=app1/first |
708 | """) |
709 | fp.close() |
710 | - fp = open(os.path.join(self.td, "accomplishments", "app1", |
711 | + fp = open(os.path.join(self.td, "accomplishments", "app1", |
712 | "third.accomplishment"), "w") |
713 | fp.write("""[accomplishment] |
714 | application=app1 |
715 | @@ -44,11 +46,11 @@ |
716 | description=Another example accomplishment for the test suite, no dependency |
717 | """) |
718 | fp.close() |
719 | - fp = open(os.path.join(self.td, "scripts", "app1", |
720 | + fp = open(os.path.join(self.td, "scripts", "app1", |
721 | "third.py"), "w") |
722 | fp.write("""print 'hello'""") |
723 | fp.close() |
724 | - self.d = daemon.Accomplishments( |
725 | + self.d = app.Accomplishments( |
726 | accomplishments_path=os.path.join(self.td, "accomplishments"), |
727 | trophies_path=os.path.join(self.td, "trophies"), |
728 | scripts_path=os.path.join(self.td, "scripts")) |
729 | @@ -62,12 +64,12 @@ |
730 | self.assertTrue("title" in accoms[0]) |
731 | fn = accoms[0].get("_filename", "") |
732 | self.assertTrue( |
733 | - fn.endswith("app1/first.accomplishment") or |
734 | - fn.endswith("app1/second.accomplishment") or |
735 | + fn.endswith("app1/first.accomplishment") or |
736 | + fn.endswith("app1/second.accomplishment") or |
737 | fn.endswith("app1/third.accomplishment")) |
738 | |
739 | def test_bad_accomplishment_award_rejected(self): |
740 | - self.assertRaises(daemon.NoSuchAccomplishment, self.d.accomplish, |
741 | + self.assertRaises(app.NoSuchAccomplishment, self.d.accomplish, |
742 | "app1", "nonexistent") |
743 | |
744 | def test_accomplish(self): |
745 | @@ -117,7 +119,7 @@ |
746 | self.assert_("Found an accomplishment that shouldn't exist") |
747 | |
748 | def test_cannot_accomplished_locked(self): |
749 | - self.assertRaises(daemon.AccomplishmentLocked, self.d.accomplish, "app1", "second") |
750 | + self.assertRaises(app.AccomplishmentLocked, self.d.accomplish, "app1", "second") |
751 | |
752 | def test_all_available_accomplishments_with_scripts(self): |
753 | asa = self.d.listAllAvailableAccomplishmentsWithScripts() |
754 | @@ -129,8 +131,8 @@ |
755 | def setUp(self): |
756 | TestDaemon.setUp(self) |
757 | env = os.environ.copy() |
758 | - path = os.path.join(os.path.split(__file__)[0], "..", "daemon.py") |
759 | - self.p = subprocess.Popen(['python', path, |
760 | + path = os.path.join(os.path.split(__file__)[0], "..", "app.py") |
761 | + self.p = subprocess.Popen(['python', path, |
762 | "--accomplishments-path=%s" % os.path.join(self.td, "accomplishments"), |
763 | "--trophies-path=%s" % os.path.join(self.td, "trophies"), |
764 | "--scripts-path=%s" % os.path.join(self.td, "scripts"), |
765 | @@ -144,7 +146,7 @@ |
766 | self.d = dbus.Interface(obj, "org.ubuntu.accomplishments") |
767 | |
768 | def test_bad_accomplishment_award_rejected(self): |
769 | - self.assertRaises(dbus.DBusException, self.d.accomplish, |
770 | + self.assertRaises(dbus.DBusException, self.d.accomplish, |
771 | "app1", "nonexistent") |
772 | |
773 | def test_cannot_accomplished_locked(self): |
774 | |
775 | === added file 'accomplishments/exceptions.py' |
776 | --- accomplishments/exceptions.py 1970-01-01 00:00:00 +0000 |
777 | +++ accomplishments/exceptions.py 2012-03-05 04:10:47 +0000 |
778 | @@ -0,0 +1,32 @@ |
779 | +class Error(Exception): |
780 | + """ |
781 | + A base class for exceptions. |
782 | + """ |
783 | + def __init__(self, msg=None): |
784 | + if msg == None: |
785 | + msg = self.__doc__.strip() |
786 | + super(Error, self).__init__(msg) |
787 | + |
788 | + |
789 | +class PathNotFound(Error): |
790 | + """ |
791 | + Could not find the specified directory. |
792 | + """ |
793 | + |
794 | + |
795 | +class VersionError(Error): |
796 | + """ |
797 | + There is a problem with the software version. |
798 | + """ |
799 | + |
800 | + |
801 | +class NoSuchAccomplishment(Error): |
802 | + """ |
803 | + No such accomplishment has been registered. |
804 | + """ |
805 | + |
806 | + |
807 | +class AccomplishmentLocked(Error): |
808 | + """ |
809 | + This accomplishment requires other things to be accomplished first. |
810 | + """ |
811 | |
812 | === added directory 'accomplishments/gui' |
813 | === renamed file 'trophyinfo/AboutTrophyinfoDialog.py' => 'accomplishments/gui/AboutTrophyinfoDialog.py' |
814 | --- trophyinfo/AboutTrophyinfoDialog.py 2012-01-22 23:09:09 +0000 |
815 | +++ accomplishments/gui/AboutTrophyinfoDialog.py 2012-03-05 04:10:47 +0000 |
816 | @@ -5,20 +5,22 @@ |
817 | |
818 | import gettext |
819 | from gettext import gettext as _ |
820 | +import logging |
821 | + |
822 | +from accomplishments.gui.base.AboutDialog import AboutDialog |
823 | + |
824 | + |
825 | gettext.textdomain('trophyinfo') |
826 | - |
827 | -import logging |
828 | logger = logging.getLogger('trophyinfo') |
829 | |
830 | -from trophyinfo_lib.AboutDialog import AboutDialog |
831 | |
832 | -# See trophyinfo_lib.AboutDialog.py for more details about how this class works. |
833 | +# See trophyinfo/gui/base/AboutDialog.py for more details about how this class |
834 | +# works. |
835 | class AboutTrophyinfoDialog(AboutDialog): |
836 | + |
837 | __gtype_name__ = "AboutTrophyinfoDialog" |
838 | - |
839 | + |
840 | def finish_initializing(self, builder): # pylint: disable=E1002 |
841 | """Set up the about dialog""" |
842 | super(AboutTrophyinfoDialog, self).finish_initializing(builder) |
843 | - |
844 | # Code for other initialization actions should be added here. |
845 | - |
846 | |
847 | === renamed file 'trophyinfo/PreferencesTrophyinfoDialog.py' => 'accomplishments/gui/PreferencesTrophyinfoDialog.py' |
848 | --- trophyinfo/PreferencesTrophyinfoDialog.py 2012-01-22 23:09:09 +0000 |
849 | +++ accomplishments/gui/PreferencesTrophyinfoDialog.py 2012-03-05 04:10:47 +0000 |
850 | @@ -9,18 +9,22 @@ |
851 | # data/glib-2.0/schemas/net.launchpad.trophyinfo.gschema.xml |
852 | # See http://developer.gnome.org/gio/stable/GSettings.html for more info. |
853 | |
854 | -from gi.repository import Gio # pylint: disable=E0611 |
855 | |
856 | import gettext |
857 | from gettext import gettext as _ |
858 | +import logging |
859 | + |
860 | +from gi.repository import Gio # pylint: disable=E0611 |
861 | + |
862 | +from accomplishments.gui.base.PreferencesDialog import PreferencesDialog |
863 | + |
864 | + |
865 | gettext.textdomain('trophyinfo') |
866 | - |
867 | -import logging |
868 | logger = logging.getLogger('trophyinfo') |
869 | |
870 | -from trophyinfo_lib.PreferencesDialog import PreferencesDialog |
871 | |
872 | class PreferencesTrophyinfoDialog(PreferencesDialog): |
873 | + |
874 | __gtype_name__ = "PreferencesTrophyinfoDialog" |
875 | |
876 | def finish_initializing(self, builder): # pylint: disable=E1002 |
877 | |
878 | === renamed file 'trophyinfo/TrophyinfoWindow.py' => 'accomplishments/gui/TrophyinfoWindow.py' |
879 | --- trophyinfo/TrophyinfoWindow.py 2012-03-04 10:42:54 +0000 |
880 | +++ accomplishments/gui/TrophyinfoWindow.py 2012-03-05 04:10:47 +0000 |
881 | @@ -2,33 +2,31 @@ |
882 | ### BEGIN LICENSE |
883 | # This file is in the public domain |
884 | ### END LICENSE |
885 | - |
886 | import gettext |
887 | from gettext import gettext as _ |
888 | -gettext.textdomain('trophyinfo') |
889 | - |
890 | -from dbus.mainloop.glib import DBusGMainLoop |
891 | -DBusGMainLoop(set_as_default=True) |
892 | - |
893 | -from gi.repository import Gtk, GdkPixbuf, WebKit # pylint: disable=E0611 |
894 | import logging |
895 | import os |
896 | import sys |
897 | import webbrowser |
898 | + |
899 | import dbus |
900 | import dbus.service |
901 | - |
902 | -sys.path.append("./daemon/") |
903 | - |
904 | +from dbus.mainloop.glib import DBusGMainLoop |
905 | + |
906 | +from gi.repository import Gtk, GdkPixbuf, WebKit # pylint: disable=E0611 |
907 | + |
908 | +from accomplishments.daemon import dbusapi |
909 | +from accomplishments.gui.base import Window |
910 | +from accomplishments.gui.base.helpers import get_media_file |
911 | +from accomplishments.gui.AboutTrophyinfoDialog import AboutTrophyinfoDialog |
912 | +from accomplishments.gui.PreferencesTrophyinfoDialog import ( |
913 | + PreferencesTrophyinfoDialog) |
914 | + |
915 | + |
916 | +gettext.textdomain('trophyinfo') |
917 | +DBusGMainLoop(set_as_default=True) |
918 | logger = logging.getLogger('trophyinfo') |
919 | -import libaccomplishments |
920 | - |
921 | - |
922 | -from trophyinfo_lib import Window |
923 | -from trophyinfo.AboutTrophyinfoDialog import AboutTrophyinfoDialog |
924 | -from trophyinfo.PreferencesTrophyinfoDialog import PreferencesTrophyinfoDialog |
925 | - |
926 | -from trophyinfo_lib.helpers import get_media_file |
927 | + |
928 | |
929 | COL_TITLE = 0 |
930 | COL_PIXBUF = 1 |
931 | @@ -37,10 +35,12 @@ |
932 | COL_APPLICATION = 4 |
933 | COL_ACCOMPLISHMENT = 5 |
934 | |
935 | + |
936 | # See trophyinfo_lib.Window.py for more details about how this class works |
937 | class TrophyinfoWindow(Window): |
938 | + |
939 | __gtype_name__ = "TrophyinfoWindow" |
940 | - |
941 | + |
942 | def finish_initializing(self, builder): # pylint: disable=E1002 |
943 | """Set up the main window""" |
944 | super(TrophyinfoWindow, self).finish_initializing(builder) |
945 | @@ -52,7 +52,7 @@ |
946 | |
947 | self.accomdb = [] |
948 | |
949 | - self.libaccom = libaccomplishments.Accomplishments() |
950 | + self.libaccom = dbusapi.Accomplishments() |
951 | |
952 | self.tb_mytrophies = self.builder.get_object("tb_mytrophies") |
953 | self.tb_opportunities = self.builder.get_object("tb_opportunities") |
954 | @@ -74,11 +74,11 @@ |
955 | self.scrolledwindow = self.builder.get_object("scrolledwindow") |
956 | self.webkitview = self.builder.get_object("webkitview") |
957 | self.webkitbox = self.builder.get_object("webkitbox") |
958 | - |
959 | + |
960 | # make the toolbar black in Ubuntu |
961 | context = self.toolbar.get_style_context() |
962 | context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR) |
963 | - |
964 | + |
965 | self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment |
966 | self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING) |
967 | self.trophy_icon.set_model(self.trophystore) |
968 | @@ -98,8 +98,7 @@ |
969 | #scrolledwindow = self.builder.get_object("scrolledwindow") |
970 | self.webview = WebKit.WebView() |
971 | self.scrolledwindow.add(self.webview) |
972 | - |
973 | - |
974 | + |
975 | #scrolledwindow.pack_start(self.webview) |
976 | |
977 | self.webview.show() |
978 | @@ -117,7 +116,7 @@ |
979 | self.opp_combo_cat.add_attribute(self.cat_combo_renderer_text, "text", 1) |
980 | |
981 | self.populate_opp_combos() |
982 | - self.update_views(None) |
983 | + self.update_views(None) |
984 | |
985 | self.has_u1 = self.libaccom.getConfigValue("config", "has_u1") |
986 | self.has_verif = self.libaccom.getConfigValue("config", "has_verif") |
987 | @@ -137,7 +136,7 @@ |
988 | |
989 | |
990 | dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) |
991 | - |
992 | + |
993 | bus = dbus.SessionBus() |
994 | try: |
995 | object = bus.get_object("org.ubuntu.accomplishments","/org/ubuntu/accomplishments") |
996 | @@ -165,13 +164,13 @@ |
997 | self.spinner.start() |
998 | self.spinner.show() |
999 | self.statusbox.show() |
1000 | - |
1001 | + |
1002 | def scriptrunner_finish(self): |
1003 | self.statusbar.set_text("") |
1004 | self.spinner.stop() |
1005 | self.spinner.hide() |
1006 | self.statusbox.hide() |
1007 | - |
1008 | + |
1009 | def approve_u1_trophies(self): |
1010 | |
1011 | self.u1_button.set_label("Register with Ubuntu One") |
1012 | @@ -220,7 +219,7 @@ |
1013 | def register_with_verif(self, widget): |
1014 | self.u1_button.set_label("Approve verified trophies") |
1015 | |
1016 | - if widget is not None: |
1017 | + if widget is not None: |
1018 | self.u1_button.disconnect(self.u1_button_sig) |
1019 | |
1020 | self.u1_button_sig = self.u1_button.connect("clicked", self.create_trophy_share) |
1021 | @@ -234,14 +233,14 @@ |
1022 | |
1023 | status_trophies = 0 |
1024 | status_opps = 0 |
1025 | - |
1026 | + |
1027 | show_locked = True |
1028 | - |
1029 | + |
1030 | if self.opp_showlocked.get_active(): |
1031 | show_locked = True |
1032 | else: |
1033 | show_locked = False |
1034 | - |
1035 | + |
1036 | trophymodel = self.trophy_icon.get_model() |
1037 | oppmodel = self.opp_icon.get_model() |
1038 | |
1039 | @@ -262,15 +261,15 @@ |
1040 | |
1041 | if cattree_iter == None: |
1042 | cat = "" |
1043 | - catname = "" |
1044 | + catname = "" |
1045 | else: |
1046 | cat, catname = catmodel[cattree_iter][:2] |
1047 | |
1048 | # update opportunities |
1049 | - for acc in self.accomdb: |
1050 | + for acc in self.accomdb: |
1051 | icon = None |
1052 | icon = GdkPixbuf.Pixbuf.new_from_file_at_size(str(acc["iconpath"]), 120, 120) |
1053 | - |
1054 | + |
1055 | if str(acc["accomplished"]) == '1': |
1056 | trophymodel.append([acc["title"], icon, bool(acc["accomplished"]), acc["locked"], acc["application"], acc["accomplishment"]]) |
1057 | status_trophies = status_trophies + 1 |
1058 | @@ -301,13 +300,13 @@ |
1059 | self._load_accomplishments() |
1060 | |
1061 | temp = [] |
1062 | - |
1063 | + |
1064 | for i in self.accomdb: |
1065 | temp.append({i["application"] : i["application-human"] }) |
1066 | |
1067 | - # uniqify the values |
1068 | + # uniqify the values |
1069 | result = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in temp)] |
1070 | - |
1071 | + |
1072 | # set up app |
1073 | self.opp_app_store.append(["", "All"]) |
1074 | |
1075 | @@ -318,7 +317,7 @@ |
1076 | |
1077 | self.opp_combo_app.set_active(0) |
1078 | self.opp_combo_app.show() |
1079 | - |
1080 | + |
1081 | # set up cat |
1082 | |
1083 | self.opp_combo_cat.set_model(self.opp_cat_store) |
1084 | @@ -371,7 +370,7 @@ |
1085 | self.update_views(None) |
1086 | self.notebook.set_current_page(2) |
1087 | |
1088 | - |
1089 | + |
1090 | def get_icon(self, name): |
1091 | theme = Gtk.IconTheme.get_default() |
1092 | return theme.load_icon(name, 48, 0) |
1093 | @@ -379,14 +378,14 @@ |
1094 | |
1095 | def check_for_extra_info_required(self): |
1096 | infoneeded = self.libaccom.getAllExtraInformationRequired() |
1097 | - |
1098 | + |
1099 | if len(infoneeded) == 0: |
1100 | self.notebook.set_current_page(0) |
1101 | else: |
1102 | self.gather_auth_info(infoneeded) |
1103 | |
1104 | def gather_auth_info(self, infoneeded): |
1105 | - self.additional_notebook.set_current_page(0) |
1106 | + self.additional_notebook.set_current_page(0) |
1107 | |
1108 | table = Gtk.Table(len(infoneeded), 2, False) |
1109 | self.auth_viewport.add(table) |
1110 | @@ -399,7 +398,7 @@ |
1111 | label = Gtk.Label(i["label"]) |
1112 | table.attach(label, 0, 1, ii, (ii+1)) |
1113 | entry = Gtk.Entry() |
1114 | - table.attach(entry, 1, 2,ii, (ii+1)) |
1115 | + table.attach(entry, 1, 2,ii, (ii+1)) |
1116 | ii = ii + 1 |
1117 | d = {"application" : i["application"], "needs-information" : i["needs-information"], "entry" : entry} |
1118 | self.auth_widget_lookup.append(d) |
1119 | @@ -412,7 +411,7 @@ |
1120 | for i in self.auth_widget_lookup: |
1121 | self.libaccom.createExtraInformationFile(i["application"], i["needs-information"], i["entry"].get_text()) |
1122 | self.additional_expander.set_visible(False) |
1123 | - |
1124 | + |
1125 | self.notebook.set_current_page(2) |
1126 | |
1127 | def _load_accomplishments(self): |
1128 | @@ -446,8 +445,8 @@ |
1129 | html = None |
1130 | |
1131 | title = a[0]["title"] |
1132 | - |
1133 | - application = a[0]["application"] |
1134 | + |
1135 | + application = a[0]["application"] |
1136 | |
1137 | for accom in self.accomdb: |
1138 | if title in accom["title"]: |
1139 | @@ -465,7 +464,7 @@ |
1140 | html = html + "<td><img src='" + str(iconpath) + "' height='100'></td>" |
1141 | |
1142 | html = html + "<td><strong>Trophy Information:</strong><br/><hr />" |
1143 | - |
1144 | + |
1145 | if "description" in a[0]: |
1146 | description = a[0]["description"] |
1147 | html = html + description |
1148 | @@ -535,4 +534,3 @@ |
1149 | self.notebook.set_current_page(0) |
1150 | self.webview.load_html_string(html, "file:///") |
1151 | self.webview.show() |
1152 | - |
1153 | |
1154 | === added file 'accomplishments/gui/__init__.py' |
1155 | === renamed directory 'trophyinfo_lib' => 'accomplishments/gui/base' |
1156 | === modified file 'accomplishments/gui/base/AboutDialog.py' |
1157 | --- trophyinfo_lib/AboutDialog.py 2012-01-22 23:09:09 +0000 |
1158 | +++ accomplishments/gui/base/AboutDialog.py 2012-03-05 04:10:47 +0000 |
1159 | @@ -2,18 +2,19 @@ |
1160 | ### BEGIN LICENSE |
1161 | # This file is in the public domain |
1162 | ### END LICENSE |
1163 | - |
1164 | from gi.repository import Gtk # pylint: disable=E0611 |
1165 | |
1166 | from . helpers import get_builder |
1167 | |
1168 | + |
1169 | class AboutDialog(Gtk.AboutDialog): |
1170 | + |
1171 | __gtype_name__ = "AboutDialog" |
1172 | |
1173 | def __new__(cls): |
1174 | - """Special static method that's automatically called by Python when |
1175 | + """Special static method that's automatically called by Python when |
1176 | constructing a new instance of this class. |
1177 | - |
1178 | + |
1179 | Returns a fully instantiated AboutDialog object. |
1180 | """ |
1181 | builder = get_builder('AboutTrophyinfoDialog') |
1182 | @@ -28,10 +29,9 @@ |
1183 | and creating a AboutDialog object with it in order |
1184 | to finish initializing the start of the new AboutTrophyinfoDialog |
1185 | instance. |
1186 | - |
1187 | + |
1188 | Put your initialization code in here and leave __init__ undefined. |
1189 | """ |
1190 | # Get a reference to the builder and set up the signals. |
1191 | self.builder = builder |
1192 | self.ui = builder.get_ui(self) |
1193 | - |
1194 | |
1195 | === modified file 'accomplishments/gui/base/Builder.py' |
1196 | --- trophyinfo_lib/Builder.py 2012-01-22 23:09:09 +0000 |
1197 | +++ accomplishments/gui/base/Builder.py 2012-03-05 04:10:47 +0000 |
1198 | @@ -2,18 +2,18 @@ |
1199 | ### BEGIN LICENSE |
1200 | # This file is in the public domain |
1201 | ### END LICENSE |
1202 | - |
1203 | '''Enhances builder connections, provides object to access glade objects''' |
1204 | - |
1205 | -from gi.repository import GObject, Gtk # pylint: disable=E0611 |
1206 | - |
1207 | +import functools |
1208 | import inspect |
1209 | -import functools |
1210 | import logging |
1211 | -logger = logging.getLogger('trophyinfo_lib') |
1212 | - |
1213 | from xml.etree.cElementTree import ElementTree |
1214 | |
1215 | +from gi.repository import GObject, Gtk # pylint: disable=E0611 |
1216 | + |
1217 | + |
1218 | +logger = logging.getLogger('trophyinfo') |
1219 | + |
1220 | + |
1221 | # this module is big so uses some conventional prefixes and postfixes |
1222 | # *s list, except self.widgets is a dictionary |
1223 | # *_dict dictionary |
1224 | @@ -162,7 +162,7 @@ |
1225 | cannot_message = """cannot bind ui.%s, name already exists |
1226 | consider using a pythonic name instead of design name '%s'""" |
1227 | consider_message = """consider using a pythonic name instead of design name '%s'""" |
1228 | - |
1229 | + |
1230 | for (widget_name, widget) in widget_dict.items(): |
1231 | pyname = make_pyname(widget_name) |
1232 | if pyname != widget_name: |
1233 | @@ -195,7 +195,7 @@ |
1234 | return pyname |
1235 | |
1236 | |
1237 | -# Until bug https://bugzilla.gnome.org/show_bug.cgi?id=652127 is fixed, we |
1238 | +# Until bug https://bugzilla.gnome.org/show_bug.cgi?id=652127 is fixed, we |
1239 | # need to reimplement inspect.getmembers. GObject introspection doesn't |
1240 | # play nice with it. |
1241 | def getmembers(obj, check): |
1242 | |
1243 | === modified file 'accomplishments/gui/base/PreferencesDialog.py' |
1244 | --- trophyinfo_lib/PreferencesDialog.py 2012-01-22 23:09:09 +0000 |
1245 | +++ accomplishments/gui/base/PreferencesDialog.py 2012-03-05 04:10:47 +0000 |
1246 | @@ -2,23 +2,25 @@ |
1247 | ### BEGIN LICENSE |
1248 | # This file is in the public domain |
1249 | ### END LICENSE |
1250 | - |
1251 | -"""this dialog adjusts values in gsettings |
1252 | -""" |
1253 | +"""this dialog adjusts values in gsettings""" |
1254 | +import logging |
1255 | |
1256 | from gi.repository import Gtk # pylint: disable=E0611 |
1257 | -import logging |
1258 | -logger = logging.getLogger('trophyinfo_lib') |
1259 | |
1260 | from . helpers import get_builder, show_uri, get_help_uri |
1261 | |
1262 | + |
1263 | +logger = logging.getLogger('trophyinfo') |
1264 | + |
1265 | + |
1266 | class PreferencesDialog(Gtk.Dialog): |
1267 | + |
1268 | __gtype_name__ = "PreferencesDialog" |
1269 | |
1270 | def __new__(cls): |
1271 | - """Special static method that's automatically called by Python when |
1272 | + """Special static method that's automatically called by Python when |
1273 | constructing a new instance of this class. |
1274 | - |
1275 | + |
1276 | Returns a fully instantiated PreferencesDialog object. |
1277 | """ |
1278 | builder = get_builder('PreferencesTrophyinfoDialog') |
1279 | @@ -33,7 +35,7 @@ |
1280 | and creating a PreferencesDialog object with it in order to |
1281 | finish initializing the start of the new PerferencesTrophyinfoDialog |
1282 | instance. |
1283 | - |
1284 | + |
1285 | Put your initialization code in here and leave __init__ undefined. |
1286 | """ |
1287 | |
1288 | @@ -48,4 +50,3 @@ |
1289 | |
1290 | def on_btn_help_clicked(self, widget, data=None): |
1291 | show_uri(self, "ghelp:%s" % get_help_uri('preferences')) |
1292 | - |
1293 | |
1294 | === modified file 'accomplishments/gui/base/Window.py' |
1295 | --- trophyinfo_lib/Window.py 2012-01-22 23:09:09 +0000 |
1296 | +++ accomplishments/gui/base/Window.py 2012-03-05 04:10:47 +0000 |
1297 | @@ -2,19 +2,23 @@ |
1298 | ### BEGIN LICENSE |
1299 | # This file is in the public domain |
1300 | ### END LICENSE |
1301 | +import logging |
1302 | |
1303 | from gi.repository import Gio, Gtk # pylint: disable=E0611 |
1304 | -import logging |
1305 | -logger = logging.getLogger('trophyinfo_lib') |
1306 | |
1307 | from . helpers import get_builder, show_uri, get_help_uri |
1308 | |
1309 | + |
1310 | +logger = logging.getLogger('trophyinfo') |
1311 | + |
1312 | + |
1313 | # This class is meant to be subclassed by TrophyinfoWindow. It provides |
1314 | # common functions and some boilerplate. |
1315 | class Window(Gtk.Window): |
1316 | + |
1317 | __gtype_name__ = "Window" |
1318 | |
1319 | - # To construct a new instance of this method, the following notable |
1320 | + # To construct a new instance of this method, the following notable |
1321 | # methods are called in this order: |
1322 | # __new__(cls) |
1323 | # __init__(self) |
1324 | @@ -23,11 +27,11 @@ |
1325 | # |
1326 | # For this reason, it's recommended you leave __init__ empty and put |
1327 | # your initialization code in finish_initializing |
1328 | - |
1329 | + |
1330 | def __new__(cls): |
1331 | - """Special static method that's automatically called by Python when |
1332 | + """Special static method that's automatically called by Python when |
1333 | constructing a new instance of this class. |
1334 | - |
1335 | + |
1336 | Returns a fully instantiated BaseTrophyinfoWindow object. |
1337 | """ |
1338 | builder = get_builder('TrophyinfoWindow') |
1339 | @@ -53,9 +57,11 @@ |
1340 | self.settings.connect('changed', self.on_preferences_changed) |
1341 | |
1342 | # Optional Launchpad integration |
1343 | - # This shouldn't crash if not found as it is simply used for bug reporting. |
1344 | - # See https://wiki.ubuntu.com/UbuntuDevelopment/Internationalisation/Coding |
1345 | - # for more information about Launchpad integration. |
1346 | + # This shouldn't crash if not found as it is simply used for bug |
1347 | + # reporting. See the following for more information about Launchpad |
1348 | + # integration: |
1349 | + # |
1350 | + # https://wiki.ubuntu.com/UbuntuDevelopment/Internationalisation/Coding |
1351 | try: |
1352 | from gi.repository import LaunchpadIntegration # pylint: disable=E0611 |
1353 | LaunchpadIntegration.add_items(self.ui.helpMenu, 1, True, True) |
1354 | @@ -69,7 +75,7 @@ |
1355 | # http://owaislone.org/quickly-add-indicator/ |
1356 | # https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators |
1357 | try: |
1358 | - from trophyinfo import indicator |
1359 | + from accomplishments import indicator |
1360 | # self is passed so methods of this class can be called from indicator.py |
1361 | # Comment this next line out to disable appindicator |
1362 | self.indicator = indicator.new_application_indicator(self) |
1363 | @@ -118,10 +124,9 @@ |
1364 | |
1365 | def on_preferences_dialog_destroyed(self, widget, data=None): |
1366 | '''only affects gui |
1367 | - |
1368 | + |
1369 | logically there is no difference between the user closing, |
1370 | minimising or ignoring the preferences dialog''' |
1371 | logger.debug('on_preferences_dialog_destroyed') |
1372 | # to determine whether to create or present preferences_dialog |
1373 | self.preferences_dialog = None |
1374 | - |
1375 | |
1376 | === modified file 'accomplishments/gui/base/__init__.py' |
1377 | --- trophyinfo_lib/__init__.py 2012-01-22 23:09:09 +0000 |
1378 | +++ accomplishments/gui/base/__init__.py 2012-03-05 04:10:47 +0000 |
1379 | @@ -3,10 +3,9 @@ |
1380 | # This file is in the public domain |
1381 | ### END LICENSE |
1382 | |
1383 | -'''facade - makes trophyinfo_lib package easy to refactor |
1384 | +'''facade - makes the accomplishments.gui.base subpackage easy to refactor |
1385 | |
1386 | while keeping its api constant''' |
1387 | -from . helpers import set_up_logging |
1388 | from . Window import Window |
1389 | -from . trophyinfoconfig import get_version |
1390 | |
1391 | +from accomplishments.util import get_version, set_up_logging |
1392 | |
1393 | === modified file 'accomplishments/gui/base/helpers.py' |
1394 | --- trophyinfo_lib/helpers.py 2012-01-22 23:09:09 +0000 |
1395 | +++ accomplishments/gui/base/helpers.py 2012-03-05 04:10:47 +0000 |
1396 | @@ -2,22 +2,23 @@ |
1397 | ### BEGIN LICENSE |
1398 | # This file is in the public domain |
1399 | ### END LICENSE |
1400 | - |
1401 | """Helpers for an Ubuntu application.""" |
1402 | -import logging |
1403 | import os |
1404 | - |
1405 | -from . trophyinfoconfig import get_data_file |
1406 | -from . Builder import Builder |
1407 | - |
1408 | import gettext |
1409 | from gettext import gettext as _ |
1410 | + |
1411 | +from accomplishments.util import get_data_file |
1412 | + |
1413 | +from . Builder import Builder |
1414 | + |
1415 | + |
1416 | gettext.textdomain('trophyinfo') |
1417 | |
1418 | + |
1419 | def get_builder(builder_file_name): |
1420 | - """Return a fully-instantiated Gtk.Builder instance from specified ui |
1421 | + """Return a fully-instantiated Gtk.Builder instance from specified ui |
1422 | file |
1423 | - |
1424 | + |
1425 | :param builder_file_name: The name of the builder file, without extension. |
1426 | Assumed to be in the 'ui' directory under the data path. |
1427 | """ |
1428 | @@ -40,34 +41,6 @@ |
1429 | |
1430 | return "file:///"+media_filename |
1431 | |
1432 | -class NullHandler(logging.Handler): |
1433 | - def emit(self, record): |
1434 | - pass |
1435 | - |
1436 | -def set_up_logging(opts): |
1437 | - # add a handler to prevent basicConfig |
1438 | - root = logging.getLogger() |
1439 | - null_handler = NullHandler() |
1440 | - root.addHandler(null_handler) |
1441 | - |
1442 | - formatter = logging.Formatter("%(levelname)s:%(name)s: %(funcName)s() '%(message)s'") |
1443 | - |
1444 | - logger = logging.getLogger('trophyinfo') |
1445 | - logger_sh = logging.StreamHandler() |
1446 | - logger_sh.setFormatter(formatter) |
1447 | - logger.addHandler(logger_sh) |
1448 | - |
1449 | - lib_logger = logging.getLogger('trophyinfo_lib') |
1450 | - lib_logger_sh = logging.StreamHandler() |
1451 | - lib_logger_sh.setFormatter(formatter) |
1452 | - lib_logger.addHandler(lib_logger_sh) |
1453 | - |
1454 | - # Set the logging level to show debug messages. |
1455 | - if opts.verbose: |
1456 | - logger.setLevel(logging.DEBUG) |
1457 | - logger.debug('logging enabled') |
1458 | - if opts.verbose > 1: |
1459 | - lib_logger.setLevel(logging.DEBUG) |
1460 | |
1461 | def get_help_uri(page=None): |
1462 | # help_uri from source tree - default language |
1463 | @@ -89,6 +62,7 @@ |
1464 | screen = parent.get_screen() |
1465 | Gtk.show_uri(screen, link, Gtk.get_current_event_time()) |
1466 | |
1467 | + |
1468 | def alias(alternative_function_name): |
1469 | '''see http://www.drdobbs.com/web-development/184406073#l9''' |
1470 | def decorator(function): |
1471 | |
1472 | === renamed file 'trophyinfo/__init__.py' => 'accomplishments/main.py' |
1473 | --- trophyinfo/__init__.py 2012-02-16 01:45:30 +0000 |
1474 | +++ accomplishments/main.py 2012-03-05 04:10:47 +0000 |
1475 | @@ -2,37 +2,16 @@ |
1476 | ### BEGIN LICENSE |
1477 | # This file is in the public domain |
1478 | ### END LICENSE |
1479 | - |
1480 | -import optparse |
1481 | - |
1482 | -import gettext |
1483 | -from gettext import gettext as _ |
1484 | -gettext.textdomain('trophyinfo') |
1485 | - |
1486 | from gi.repository import Gtk # pylint: disable=E0611 |
1487 | |
1488 | -from trophyinfo import TrophyinfoWindow |
1489 | - |
1490 | -from trophyinfo_lib import set_up_logging, get_version |
1491 | - |
1492 | -def parse_options(): |
1493 | - """Support for command line options""" |
1494 | - parser = optparse.OptionParser(version="%%prog %s" % get_version()) |
1495 | - parser.add_option( |
1496 | - "-v", "--verbose", action="count", dest="verbose", |
1497 | - help=_("Show debug messages (-vv debugs trophyinfo_lib also)")) |
1498 | - parser.add_option( |
1499 | - "-c", "--clear-trophies", action="count", dest="clear", |
1500 | - help=_("Clear your trophies collection")) |
1501 | - (options, args) = parser.parse_args() |
1502 | - |
1503 | - set_up_logging(options) |
1504 | +from accomplishments import util |
1505 | +from accomplishments.gui import TrophyinfoWindow |
1506 | + |
1507 | |
1508 | def main(): |
1509 | - 'constructor for your class instances' |
1510 | - parse_options() |
1511 | - |
1512 | - # Run the application. |
1513 | + options = util.parse_options() |
1514 | + util.set_up_logging(options) |
1515 | + # Run the application. |
1516 | window = TrophyinfoWindow.TrophyinfoWindow() |
1517 | window.show() |
1518 | Gtk.main() |
1519 | |
1520 | === added directory 'accomplishments/util' |
1521 | === added file 'accomplishments/util/__init__.py' |
1522 | --- accomplishments/util/__init__.py 1970-01-01 00:00:00 +0000 |
1523 | +++ accomplishments/util/__init__.py 2012-03-05 04:10:47 +0000 |
1524 | @@ -0,0 +1,88 @@ |
1525 | +import logging |
1526 | +import optparse |
1527 | +import os |
1528 | + |
1529 | +import gettext |
1530 | +from gettext import gettext as _ |
1531 | + |
1532 | +import accomplishments |
1533 | +from accomplishments import config |
1534 | +from accomplishments import exceptions |
1535 | + |
1536 | + |
1537 | +gettext.textdomain('trophyinfo') |
1538 | + |
1539 | + |
1540 | +def get_version(): |
1541 | + return config.__version__ |
1542 | + |
1543 | + |
1544 | +class NullHandler(logging.Handler): |
1545 | + """ |
1546 | + """ |
1547 | + def emit(self, record): |
1548 | + pass |
1549 | + |
1550 | + |
1551 | +def set_up_logging(opts): |
1552 | + # add a handler to prevent basicConfig |
1553 | + root = logging.getLogger() |
1554 | + null_handler = NullHandler() |
1555 | + root.addHandler(null_handler) |
1556 | + |
1557 | + formatter = logging.Formatter( |
1558 | + "%(levelname)s:%(name)s: %(funcName)s() '%(message)s'") |
1559 | + |
1560 | + logger = logging.getLogger('trophyinfo') |
1561 | + logger_sh = logging.StreamHandler() |
1562 | + logger_sh.setFormatter(formatter) |
1563 | + logger.addHandler(logger_sh) |
1564 | + |
1565 | + # Set the logging level to show debug messages. |
1566 | + if opts.verbose: |
1567 | + logger.setLevel(logging.DEBUG) |
1568 | + logger.debug('logging enabled') |
1569 | + if opts.verbose > 1: |
1570 | + lib_logger.setLevel(logging.DEBUG) |
1571 | + |
1572 | + |
1573 | +def get_data_path(): |
1574 | + """Retrieve trophyinfo data path |
1575 | + |
1576 | + This path is by default <trophyinfo_lib_path>/../data/ in trunk |
1577 | + and /usr/share/trophyinfo in an installed version but this path |
1578 | + is specified at installation time. |
1579 | + """ |
1580 | + |
1581 | + # Get pathname absolute or relative. |
1582 | + path = os.path.join( |
1583 | + os.path.dirname(accomplishments.__path__[0]), |
1584 | + config.__trophyinfo_data_directory__) |
1585 | + abs_data_path = os.path.abspath(path) |
1586 | + if not os.path.exists(abs_data_path): |
1587 | + msg = "Could not find the project data directory." |
1588 | + raise exceptions.PathNotFound(msg) |
1589 | + return abs_data_path |
1590 | + |
1591 | + |
1592 | +def get_data_file(*path_segments): |
1593 | + """Get the full path to a data file. |
1594 | + |
1595 | + Returns the path to a file underneath the data directory (as defined by |
1596 | + `get_data_path`). Equivalent to os.path.join(get_data_path(), |
1597 | + *path_segments). |
1598 | + """ |
1599 | + return os.path.join(get_data_path(), *path_segments) |
1600 | + |
1601 | + |
1602 | +def parse_options(): |
1603 | + """Support for command line options""" |
1604 | + parser = optparse.OptionParser(version="%%prog %s" % get_version()) |
1605 | + parser.add_option( |
1606 | + "-v", "--verbose", action="count", dest="verbose", |
1607 | + help=_("Show debug messages (-vv debugs trophyinfo_lib also)")) |
1608 | + parser.add_option( |
1609 | + "-c", "--clear-trophies", action="count", dest="clear", |
1610 | + help=_("Clear your trophies collection")) |
1611 | + (options, args) = parser.parse_args() |
1612 | + return options |
1613 | |
1614 | === added file 'accomplishments/util/dist.py' |
1615 | --- accomplishments/util/dist.py 1970-01-01 00:00:00 +0000 |
1616 | +++ accomplishments/util/dist.py 2012-03-05 04:10:47 +0000 |
1617 | @@ -0,0 +1,75 @@ |
1618 | +import os |
1619 | +import sys |
1620 | + |
1621 | +try: |
1622 | + import DistUtilsExtra.auto |
1623 | +except ImportError: |
1624 | + DistUtilsExtra = None |
1625 | + |
1626 | +from accomplishments import exceptions |
1627 | + |
1628 | + |
1629 | +if not DistUtilsExtra: |
1630 | + msg = ('To build trophyinfo you need ' |
1631 | + 'https://launchpad.net/python-distutils-extra') |
1632 | + print >> sys.stderr, msg |
1633 | + sys.exit(1) |
1634 | +elif DistUtilsExtra.auto.__version__ < '2.18': |
1635 | + raise exceptions.VersionError('needs DistUtilsExtra.auto >= 2.18') |
1636 | + |
1637 | + |
1638 | +def update_config(values = {}): |
1639 | + oldvalues = {} |
1640 | + try: |
1641 | + fin = file('trophyinfo_lib/trophyinfoconfig.py', 'r') |
1642 | + fout = file(fin.name + '.new', 'w') |
1643 | + |
1644 | + for line in fin: |
1645 | + fields = line.split(' = ') # Separate variable from value |
1646 | + if fields[0] in values: |
1647 | + oldvalues[fields[0]] = fields[1].strip() |
1648 | + line = "%s = %s\n" % (fields[0], values[fields[0]]) |
1649 | + fout.write(line) |
1650 | + |
1651 | + fout.flush() |
1652 | + fout.close() |
1653 | + fin.close() |
1654 | + os.rename(fout.name, fin.name) |
1655 | + except (OSError, IOError), e: |
1656 | + print ("ERROR: Can't find trophyinfo_lib/trophyinfoconfig.py") |
1657 | + sys.exit(1) |
1658 | + return oldvalues |
1659 | + |
1660 | + |
1661 | +def update_desktop_file(datadir): |
1662 | + try: |
1663 | + fin = file('trophyinfo.desktop.in', 'r') |
1664 | + fout = file(fin.name + '.new', 'w') |
1665 | + |
1666 | + for line in fin: |
1667 | + if 'Icon=' in line: |
1668 | + line = "Icon=%s\n" % (datadir + 'media/trophyinfo.svg') |
1669 | + fout.write(line) |
1670 | + fout.flush() |
1671 | + fout.close() |
1672 | + fin.close() |
1673 | + os.rename(fout.name, fin.name) |
1674 | + except (OSError, IOError), e: |
1675 | + print ("ERROR: Can't find trophyinfo.desktop.in") |
1676 | + sys.exit(1) |
1677 | + |
1678 | + |
1679 | +class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): |
1680 | + |
1681 | + def run(self): |
1682 | + values = { |
1683 | + '__trophyinfo_data_directory__': "'%s'" % ( |
1684 | + self.prefix + '/share/trophyinfo/'), |
1685 | + '__version__': "'%s'" % self.distribution.get_version()} |
1686 | + previous_values = update_config(values) |
1687 | + update_desktop_file(self.prefix + '/share/trophyinfo/') |
1688 | + DistUtilsExtra.auto.install_auto.run(self) |
1689 | + update_config(previous_values) |
1690 | + |
1691 | + |
1692 | +setup = DistUtilsExtra.auto.setup |
1693 | |
1694 | === renamed file 'daemon/rundaemon.sh' => 'bin/rundaemon.sh' |
1695 | --- daemon/rundaemon.sh 2012-02-22 05:33:30 +0000 |
1696 | +++ bin/rundaemon.sh 2012-03-05 04:10:47 +0000 |
1697 | @@ -4,12 +4,12 @@ |
1698 | export PYTHONPATH=$PYTHONPATH:. |
1699 | |
1700 | echo Importing the validation key... |
1701 | -gpg --import validation-key.pub |
1702 | +gpg --import ./data/daemon/validation-key.pub |
1703 | |
1704 | echo Starting the accomplishments daemon... |
1705 | echo "(this would be done by D-Bus activation in the real world)" |
1706 | |
1707 | -python ./libaccomplishments-daemon/daemon.py |
1708 | +python ./accomplishments/daemon/app.py |
1709 | DAEMON=$! |
1710 | |
1711 | |
1712 | |
1713 | === modified file 'bin/trophyinfo' |
1714 | --- bin/trophyinfo 2012-01-22 23:09:09 +0000 |
1715 | +++ bin/trophyinfo 2012-03-05 04:10:47 +0000 |
1716 | @@ -3,14 +3,16 @@ |
1717 | ### BEGIN LICENSE |
1718 | # This file is in the public domain |
1719 | ### END LICENSE |
1720 | - |
1721 | import sys |
1722 | import os |
1723 | |
1724 | import gettext |
1725 | from gettext import gettext as _ |
1726 | + |
1727 | +from accomplishments.main import main |
1728 | + |
1729 | + |
1730 | gettext.textdomain('trophyinfo') |
1731 | - |
1732 | # Add project root directory (enable symlink and trunk execution) |
1733 | PROJECT_ROOT_DIRECTORY = os.path.abspath( |
1734 | os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) |
1735 | @@ -22,12 +24,14 @@ |
1736 | opt_path = path.replace('/usr', '/opt/extras.ubuntu.com/trophyinfo') |
1737 | python_path.insert(0, opt_path) |
1738 | sys.path.insert(0, opt_path) |
1739 | -if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'trophyinfo')) |
1740 | +if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'accomplishments')) |
1741 | and PROJECT_ROOT_DIRECTORY not in sys.path): |
1742 | python_path.insert(0, PROJECT_ROOT_DIRECTORY) |
1743 | sys.path.insert(0, PROJECT_ROOT_DIRECTORY) |
1744 | if python_path: |
1745 | - os.putenv('PYTHONPATH', "%s:%s" % (os.getenv('PYTHONPATH', ''), ':'.join(python_path))) # for subprocesses |
1746 | + os.putenv( |
1747 | + 'PYTHONPATH', |
1748 | + "%s:%s" % (os.getenv('PYTHONPATH', ''), |
1749 | + ':'.join(python_path))) # for subprocesses |
1750 | |
1751 | -import trophyinfo |
1752 | -trophyinfo.main() |
1753 | +main() |
1754 | |
1755 | === removed directory 'daemon/libaccomplishments' |
1756 | === removed directory 'daemon/libaccomplishments-daemon' |
1757 | === removed file 'daemon/libaccomplishments-daemon/trophy-accomplished.svg' |
1758 | --- daemon/libaccomplishments-daemon/trophy-accomplished.svg 2012-01-28 20:03:46 +0000 |
1759 | +++ daemon/libaccomplishments-daemon/trophy-accomplished.svg 1970-01-01 00:00:00 +0000 |
1760 | @@ -1,854 +0,0 @@ |
1761 | -<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
1762 | -<!-- Created with Inkscape (http://www.inkscape.org/) --> |
1763 | - |
1764 | -<svg |
1765 | - xmlns:dc="http://purl.org/dc/elements/1.1/" |
1766 | - xmlns:cc="http://creativecommons.org/ns#" |
1767 | - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" |
1768 | - xmlns:svg="http://www.w3.org/2000/svg" |
1769 | - xmlns="http://www.w3.org/2000/svg" |
1770 | - xmlns:xlink="http://www.w3.org/1999/xlink" |
1771 | - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" |
1772 | - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" |
1773 | - width="200" |
1774 | - height="300" |
1775 | - id="svg2" |
1776 | - version="1.1" |
1777 | - inkscape:version="0.48.2 r9819" |
1778 | - sodipodi:docname="trophy-accomplished.svg"> |
1779 | - <title |
1780 | - id="title3265">Trophy</title> |
1781 | - <defs |
1782 | - id="defs4"> |
1783 | - <linearGradient |
1784 | - id="linearGradient4099" |
1785 | - inkscape:collect="always"> |
1786 | - <stop |
1787 | - id="stop4101" |
1788 | - offset="0" |
1789 | - style="stop-color:#ffc022;stop-opacity:1" /> |
1790 | - <stop |
1791 | - id="stop4103" |
1792 | - offset="1" |
1793 | - style="stop-color:#ffffff;stop-opacity:0;" /> |
1794 | - </linearGradient> |
1795 | - <linearGradient |
1796 | - inkscape:collect="always" |
1797 | - id="linearGradient4088"> |
1798 | - <stop |
1799 | - style="stop-color:#ffffff;stop-opacity:1;" |
1800 | - offset="0" |
1801 | - id="stop4090" /> |
1802 | - <stop |
1803 | - style="stop-color:#ffffff;stop-opacity:0;" |
1804 | - offset="1" |
1805 | - id="stop4092" /> |
1806 | - </linearGradient> |
1807 | - <linearGradient |
1808 | - inkscape:collect="always" |
1809 | - id="linearGradient4070"> |
1810 | - <stop |
1811 | - style="stop-color:#f0be63;stop-opacity:1;" |
1812 | - offset="0" |
1813 | - id="stop4072" /> |
1814 | - <stop |
1815 | - style="stop-color:#b88100;stop-opacity:1" |
1816 | - offset="1" |
1817 | - id="stop4074" /> |
1818 | - </linearGradient> |
1819 | - <linearGradient |
1820 | - inkscape:collect="always" |
1821 | - id="linearGradient3277"> |
1822 | - <stop |
1823 | - style="stop-color:#804d00;stop-opacity:1;" |
1824 | - offset="0" |
1825 | - id="stop3279" /> |
1826 | - <stop |
1827 | - style="stop-color:#b98304;stop-opacity:1" |
1828 | - offset="1" |
1829 | - id="stop3281" /> |
1830 | - </linearGradient> |
1831 | - <linearGradient |
1832 | - inkscape:collect="always" |
1833 | - id="linearGradient3267"> |
1834 | - <stop |
1835 | - style="stop-color:#692017;stop-opacity:1;" |
1836 | - offset="0" |
1837 | - id="stop3269" /> |
1838 | - <stop |
1839 | - style="stop-color:#46150f;stop-opacity:1" |
1840 | - offset="1" |
1841 | - id="stop3271" /> |
1842 | - </linearGradient> |
1843 | - <linearGradient |
1844 | - inkscape:collect="always" |
1845 | - id="linearGradient3961"> |
1846 | - <stop |
1847 | - style="stop-color:#804d00;stop-opacity:1;" |
1848 | - offset="0" |
1849 | - id="stop3963" /> |
1850 | - <stop |
1851 | - style="stop-color:#b88100;stop-opacity:1" |
1852 | - offset="1" |
1853 | - id="stop3965" /> |
1854 | - </linearGradient> |
1855 | - <linearGradient |
1856 | - inkscape:collect="always" |
1857 | - id="linearGradient3953"> |
1858 | - <stop |
1859 | - style="stop-color:#804d00;stop-opacity:1;" |
1860 | - offset="0" |
1861 | - id="stop3955" /> |
1862 | - <stop |
1863 | - style="stop-color:#ffc022;stop-opacity:1" |
1864 | - offset="1" |
1865 | - id="stop3957" /> |
1866 | - </linearGradient> |
1867 | - <linearGradient |
1868 | - inkscape:collect="always" |
1869 | - id="linearGradient3945"> |
1870 | - <stop |
1871 | - style="stop-color:#804d00;stop-opacity:1;" |
1872 | - offset="0" |
1873 | - id="stop3947" /> |
1874 | - <stop |
1875 | - style="stop-color:#ffc022;stop-opacity:1" |
1876 | - offset="1" |
1877 | - id="stop3949" /> |
1878 | - </linearGradient> |
1879 | - <linearGradient |
1880 | - inkscape:collect="always" |
1881 | - id="linearGradient3918"> |
1882 | - <stop |
1883 | - style="stop-color:#fcca77;stop-opacity:1;" |
1884 | - offset="0" |
1885 | - id="stop3920" /> |
1886 | - <stop |
1887 | - style="stop-color:#fcca77;stop-opacity:0;" |
1888 | - offset="1" |
1889 | - id="stop3922" /> |
1890 | - </linearGradient> |
1891 | - <linearGradient |
1892 | - inkscape:collect="always" |
1893 | - id="linearGradient3908"> |
1894 | - <stop |
1895 | - style="stop-color:#f6c374;stop-opacity:1;" |
1896 | - offset="0" |
1897 | - id="stop3910" /> |
1898 | - <stop |
1899 | - style="stop-color:#b88100;stop-opacity:1" |
1900 | - offset="1" |
1901 | - id="stop3912" /> |
1902 | - </linearGradient> |
1903 | - <linearGradient |
1904 | - inkscape:collect="always" |
1905 | - id="linearGradient3896"> |
1906 | - <stop |
1907 | - style="stop-color:#e7bc77;stop-opacity:1;" |
1908 | - offset="0" |
1909 | - id="stop3898" /> |
1910 | - <stop |
1911 | - style="stop-color:#e7bc77;stop-opacity:0;" |
1912 | - offset="1" |
1913 | - id="stop3900" /> |
1914 | - </linearGradient> |
1915 | - <linearGradient |
1916 | - inkscape:collect="always" |
1917 | - id="linearGradient3886"> |
1918 | - <stop |
1919 | - style="stop-color:#fed78a;stop-opacity:1;" |
1920 | - offset="0" |
1921 | - id="stop3888" /> |
1922 | - <stop |
1923 | - style="stop-color:#fed78a;stop-opacity:0;" |
1924 | - offset="1" |
1925 | - id="stop3890" /> |
1926 | - </linearGradient> |
1927 | - <linearGradient |
1928 | - inkscape:collect="always" |
1929 | - id="linearGradient3872"> |
1930 | - <stop |
1931 | - style="stop-color:#dcac62;stop-opacity:1;" |
1932 | - offset="0" |
1933 | - id="stop3874" /> |
1934 | - <stop |
1935 | - style="stop-color:#b88100;stop-opacity:1" |
1936 | - offset="1" |
1937 | - id="stop3876" /> |
1938 | - </linearGradient> |
1939 | - <linearGradient |
1940 | - inkscape:collect="always" |
1941 | - id="linearGradient3854"> |
1942 | - <stop |
1943 | - style="stop-color:#b88100;stop-opacity:1;" |
1944 | - offset="0" |
1945 | - id="stop3856" /> |
1946 | - <stop |
1947 | - style="stop-color:#fecd7b;stop-opacity:1" |
1948 | - offset="1" |
1949 | - id="stop3858" /> |
1950 | - </linearGradient> |
1951 | - <linearGradient |
1952 | - inkscape:collect="always" |
1953 | - id="linearGradient3842"> |
1954 | - <stop |
1955 | - style="stop-color:#804d00;stop-opacity:1;" |
1956 | - offset="0" |
1957 | - id="stop3844" /> |
1958 | - <stop |
1959 | - style="stop-color:#804d00;stop-opacity:0;" |
1960 | - offset="1" |
1961 | - id="stop3846" /> |
1962 | - </linearGradient> |
1963 | - <linearGradient |
1964 | - inkscape:collect="always" |
1965 | - xlink:href="#linearGradient3842" |
1966 | - id="linearGradient3848" |
1967 | - x1="-216.17264" |
1968 | - y1="218.98633" |
1969 | - x2="-217.1828" |
1970 | - y2="249.29091" |
1971 | - gradientUnits="userSpaceOnUse" |
1972 | - gradientTransform="matrix(0.5,0,0,0.5,-209.64022,192.29962)" /> |
1973 | - <linearGradient |
1974 | - inkscape:collect="always" |
1975 | - xlink:href="#linearGradient3854" |
1976 | - id="linearGradient3860" |
1977 | - x1="-211.12189" |
1978 | - y1="245.25031" |
1979 | - x2="-201.02036" |
1980 | - y2="389.70212" |
1981 | - gradientUnits="userSpaceOnUse" |
1982 | - gradientTransform="matrix(0.5,0,0,0.5,-209.64022,192.29962)" /> |
1983 | - <filter |
1984 | - inkscape:collect="always" |
1985 | - id="filter3862" |
1986 | - x="-0.13795282" |
1987 | - width="1.2759056" |
1988 | - y="-0.051161319" |
1989 | - height="1.1023226" |
1990 | - color-interpolation-filters="sRGB"> |
1991 | - <feGaussianBlur |
1992 | - inkscape:collect="always" |
1993 | - stdDeviation="3.2515796" |
1994 | - id="feGaussianBlur3864" /> |
1995 | - </filter> |
1996 | - <filter |
1997 | - inkscape:collect="always" |
1998 | - id="filter3866" |
1999 | - x="-0.12734108" |
2000 | - width="1.2546821" |
2001 | - y="-0.047225833" |
2002 | - height="1.0944517" |
2003 | - color-interpolation-filters="sRGB"> |
2004 | - <feGaussianBlur |
2005 | - inkscape:collect="always" |
2006 | - stdDeviation="3.0014581" |
2007 | - id="feGaussianBlur3868" /> |
2008 | - </filter> |
2009 | - <radialGradient |
2010 | - inkscape:collect="always" |
2011 | - xlink:href="#linearGradient3872" |
2012 | - id="radialGradient3878" |
2013 | - cx="-197.15332" |
2014 | - cy="316.23712" |
2015 | - fx="-197.15332" |
2016 | - fy="316.23712" |
2017 | - r="42.421329" |
2018 | - gradientTransform="matrix(-1.1182277,0.0551342,-0.09068266,-2.5015192,-384.72423,1069.5515)" |
2019 | - gradientUnits="userSpaceOnUse" /> |
2020 | - <filter |
2021 | - inkscape:collect="always" |
2022 | - id="filter3880" |
2023 | - color-interpolation-filters="sRGB"> |
2024 | - <feGaussianBlur |
2025 | - inkscape:collect="always" |
2026 | - stdDeviation="2.7321539" |
2027 | - id="feGaussianBlur3882" /> |
2028 | - </filter> |
2029 | - <radialGradient |
2030 | - inkscape:collect="always" |
2031 | - xlink:href="#linearGradient3886" |
2032 | - id="radialGradient3892" |
2033 | - cx="-199.00005" |
2034 | - cy="379.85995" |
2035 | - fx="-199.00005" |
2036 | - fy="379.85995" |
2037 | - r="38.890873" |
2038 | - gradientTransform="matrix(0.15584403,-1.7142858,0.9570922,0.08700819,-531.54808,4.3965634)" |
2039 | - gradientUnits="userSpaceOnUse" /> |
2040 | - <radialGradient |
2041 | - inkscape:collect="always" |
2042 | - xlink:href="#linearGradient3896" |
2043 | - id="radialGradient3902" |
2044 | - cx="-273.75134" |
2045 | - cy="320.53235" |
2046 | - fx="-273.75134" |
2047 | - fy="320.53235" |
2048 | - r="49.711224" |
2049 | - gradientTransform="matrix(-0.48768998,-1.5849921,0.8254465,-0.2539842,-744.60397,11.938684)" |
2050 | - gradientUnits="userSpaceOnUse" /> |
2051 | - <radialGradient |
2052 | - inkscape:collect="always" |
2053 | - xlink:href="#linearGradient3896" |
2054 | - id="radialGradient3906" |
2055 | - gradientUnits="userSpaceOnUse" |
2056 | - gradientTransform="matrix(0.48768998,-1.5849921,-0.8254465,-0.2539842,133.90024,12.443759)" |
2057 | - cx="-273.75134" |
2058 | - cy="320.53235" |
2059 | - fx="-273.75134" |
2060 | - fy="320.53235" |
2061 | - r="49.711224" /> |
2062 | - <radialGradient |
2063 | - inkscape:collect="always" |
2064 | - xlink:href="#linearGradient3908" |
2065 | - id="radialGradient3914" |
2066 | - cx="-188.89853" |
2067 | - cy="456.47113" |
2068 | - fx="-188.89853" |
2069 | - fy="456.47113" |
2070 | - r="62.046875" |
2071 | - gradientTransform="matrix(-0.0895426,6.0823415e-8,-4.0337866e-7,-0.59384305,-321.00376,691.05285)" |
2072 | - gradientUnits="userSpaceOnUse" /> |
2073 | - <radialGradient |
2074 | - inkscape:collect="always" |
2075 | - xlink:href="#linearGradient3918" |
2076 | - id="radialGradient3924" |
2077 | - cx="-192.93913" |
2078 | - cy="403.7388" |
2079 | - fx="-192.93913" |
2080 | - fy="403.7388" |
2081 | - r="62.046875" |
2082 | - gradientTransform="matrix(-4.9230025e-8,0.3500303,-0.59384305,-8.35212e-8,-66.352315,456.20047)" |
2083 | - gradientUnits="userSpaceOnUse" /> |
2084 | - <radialGradient |
2085 | - inkscape:collect="always" |
2086 | - xlink:href="#linearGradient3945" |
2087 | - id="radialGradient3951" |
2088 | - cx="-196.83202" |
2089 | - cy="310.99088" |
2090 | - fx="-196.83202" |
2091 | - fy="310.99088" |
2092 | - r="49.663921" |
2093 | - gradientTransform="matrix(-0.11552005,0.44604223,-1.5340915,-0.54706546,257.51838,583.13425)" |
2094 | - gradientUnits="userSpaceOnUse" /> |
2095 | - <radialGradient |
2096 | - inkscape:collect="always" |
2097 | - xlink:href="#linearGradient3953" |
2098 | - id="radialGradient3959" |
2099 | - cx="-226.07143" |
2100 | - cy="271.32739" |
2101 | - fx="-226.07143" |
2102 | - fy="271.32739" |
2103 | - r="5.2734375" |
2104 | - gradientTransform="matrix(-1.7273801e-7,4.0634919,-2.7259259,-1.158765e-7,513.5469,1182.7873)" |
2105 | - gradientUnits="userSpaceOnUse" /> |
2106 | - <radialGradient |
2107 | - inkscape:collect="always" |
2108 | - xlink:href="#linearGradient3961" |
2109 | - id="radialGradient3967" |
2110 | - cx="-193.85033" |
2111 | - cy="285.24863" |
2112 | - fx="-193.85033" |
2113 | - fy="285.24863" |
2114 | - r="6.2866349" |
2115 | - gradientTransform="matrix(1.5443388,0.31346969,-0.12981992,0.948631,142.5512,75.37164)" |
2116 | - gradientUnits="userSpaceOnUse" /> |
2117 | - <linearGradient |
2118 | - inkscape:collect="always" |
2119 | - xlink:href="#linearGradient3854" |
2120 | - id="linearGradient4091" |
2121 | - gradientUnits="userSpaceOnUse" |
2122 | - x1="-211.12189" |
2123 | - y1="245.25031" |
2124 | - x2="-201.02036" |
2125 | - y2="389.70212" |
2126 | - gradientTransform="matrix(0.6338819,0,0,0.6089088,221.83905,644.83223)" /> |
2127 | - <radialGradient |
2128 | - inkscape:collect="always" |
2129 | - xlink:href="#linearGradient3908" |
2130 | - id="radialGradient4093" |
2131 | - gradientUnits="userSpaceOnUse" |
2132 | - gradientTransform="matrix(-0.09790279,7.1628508e-8,-4.410403e-7,-0.69933743,83.202705,1239.4944)" |
2133 | - cx="-188.89853" |
2134 | - cy="456.47113" |
2135 | - fx="-188.89853" |
2136 | - fy="456.47113" |
2137 | - r="62.046875" /> |
2138 | - <radialGradient |
2139 | - inkscape:collect="always" |
2140 | - xlink:href="#linearGradient3872" |
2141 | - id="radialGradient4095" |
2142 | - gradientUnits="userSpaceOnUse" |
2143 | - gradientTransform="matrix(-1.1182277,0.0551342,-0.09068266,-2.5015192,-764.72423,1065.2658)" |
2144 | - cx="-197.15332" |
2145 | - cy="316.23712" |
2146 | - fx="-197.15332" |
2147 | - fy="316.23712" |
2148 | - r="42.421329" /> |
2149 | - <radialGradient |
2150 | - inkscape:collect="always" |
2151 | - xlink:href="#linearGradient3886" |
2152 | - id="radialGradient4097" |
2153 | - gradientUnits="userSpaceOnUse" |
2154 | - gradientTransform="matrix(0.15584403,-1.7142858,0.9570922,0.08700819,-531.54808,4.3965634)" |
2155 | - cx="-199.00005" |
2156 | - cy="379.85995" |
2157 | - fx="-199.00005" |
2158 | - fy="379.85995" |
2159 | - r="38.890873" /> |
2160 | - <radialGradient |
2161 | - inkscape:collect="always" |
2162 | - xlink:href="#linearGradient3896" |
2163 | - id="radialGradient4099" |
2164 | - gradientUnits="userSpaceOnUse" |
2165 | - gradientTransform="matrix(-0.6182757,-1.9302312,1.0464712,-0.30930642,-456.36859,425.1855)" |
2166 | - cx="-273.75134" |
2167 | - cy="320.53235" |
2168 | - fx="-273.75134" |
2169 | - fy="320.53235" |
2170 | - r="49.711224" /> |
2171 | - <radialGradient |
2172 | - inkscape:collect="always" |
2173 | - xlink:href="#linearGradient3896" |
2174 | - id="radialGradient4101" |
2175 | - gradientUnits="userSpaceOnUse" |
2176 | - gradientTransform="matrix(0.6182757,-1.9302312,-1.0464712,-0.30930642,657.36721,425.80059)" |
2177 | - cx="-273.75134" |
2178 | - cy="320.53235" |
2179 | - fx="-273.75134" |
2180 | - fy="320.53235" |
2181 | - r="49.711224" /> |
2182 | - <radialGradient |
2183 | - inkscape:collect="always" |
2184 | - xlink:href="#linearGradient3918" |
2185 | - id="radialGradient4103" |
2186 | - gradientUnits="userSpaceOnUse" |
2187 | - gradientTransform="matrix(-6.2412045e-8,0.41681683,-0.7528527,-9.9457215e-8,403.49427,962.83622)" |
2188 | - cx="-192.93913" |
2189 | - cy="403.7388" |
2190 | - fx="-192.93913" |
2191 | - fy="403.7388" |
2192 | - r="62.046875" /> |
2193 | - <radialGradient |
2194 | - inkscape:collect="always" |
2195 | - xlink:href="#linearGradient3953" |
2196 | - id="radialGradient4105" |
2197 | - gradientUnits="userSpaceOnUse" |
2198 | - gradientTransform="matrix(-1.0731693e-7,2.5245251,-1.6935357,-7.199058e-8,-66.303286,853.92148)" |
2199 | - cx="-226.07143" |
2200 | - cy="271.32739" |
2201 | - fx="-226.07143" |
2202 | - fy="271.32739" |
2203 | - r="5.2734375" /> |
2204 | - <radialGradient |
2205 | - inkscape:collect="always" |
2206 | - xlink:href="#linearGradient3961" |
2207 | - id="radialGradient4107" |
2208 | - gradientUnits="userSpaceOnUse" |
2209 | - gradientTransform="matrix(0.9594512,0.19474928,-0.08065321,0.58935591,-260.62434,178.25247)" |
2210 | - cx="-193.85033" |
2211 | - cy="285.24863" |
2212 | - fx="-193.85033" |
2213 | - fy="285.24863" |
2214 | - r="6.2866349" /> |
2215 | - <linearGradient |
2216 | - inkscape:collect="always" |
2217 | - xlink:href="#linearGradient3842" |
2218 | - id="linearGradient4163" |
2219 | - gradientUnits="userSpaceOnUse" |
2220 | - x1="-216.17264" |
2221 | - y1="218.98633" |
2222 | - x2="-217.1828" |
2223 | - y2="249.29091" |
2224 | - gradientTransform="matrix(0.63675565,0,0,0.59461726,-397.39056,671.91253)" /> |
2225 | - <linearGradient |
2226 | - inkscape:collect="always" |
2227 | - xlink:href="#linearGradient3854" |
2228 | - id="linearGradient4165" |
2229 | - gradientUnits="userSpaceOnUse" |
2230 | - x1="-211.12189" |
2231 | - y1="245.25031" |
2232 | - x2="-201.02036" |
2233 | - y2="389.70212" |
2234 | - gradientTransform="matrix(0.63675565,0,0,0.59461726,-397.39056,671.91253)" /> |
2235 | - <radialGradient |
2236 | - inkscape:collect="always" |
2237 | - xlink:href="#linearGradient3908" |
2238 | - id="radialGradient4167" |
2239 | - gradientUnits="userSpaceOnUse" |
2240 | - gradientTransform="matrix(-0.11403351,7.2333305e-8,-5.1370729e-7,-0.70621865,-539.21329,1265.047)" |
2241 | - cx="-188.89853" |
2242 | - cy="456.47113" |
2243 | - fx="-188.89853" |
2244 | - fy="456.47113" |
2245 | - r="62.046875" /> |
2246 | - <radialGradient |
2247 | - inkscape:collect="always" |
2248 | - xlink:href="#linearGradient3872" |
2249 | - id="radialGradient4169" |
2250 | - gradientUnits="userSpaceOnUse" |
2251 | - gradientTransform="matrix(-1.1182277,0.0551342,-0.09068266,-2.5015192,-679.00994,1500.9801)" |
2252 | - cx="-197.15332" |
2253 | - cy="316.23712" |
2254 | - fx="-197.15332" |
2255 | - fy="316.23712" |
2256 | - r="42.421329" /> |
2257 | - <radialGradient |
2258 | - inkscape:collect="always" |
2259 | - xlink:href="#linearGradient3886" |
2260 | - id="radialGradient4171" |
2261 | - gradientUnits="userSpaceOnUse" |
2262 | - gradientTransform="matrix(0.15584403,-1.7142858,0.9570922,0.08700819,-531.54808,4.3965634)" |
2263 | - cx="-199.00005" |
2264 | - cy="379.85995" |
2265 | - fx="-199.00005" |
2266 | - fy="379.85995" |
2267 | - r="38.890873" /> |
2268 | - <radialGradient |
2269 | - inkscape:collect="always" |
2270 | - xlink:href="#linearGradient3896" |
2271 | - id="radialGradient4173" |
2272 | - gradientUnits="userSpaceOnUse" |
2273 | - gradientTransform="matrix(-0.6210787,-1.8849273,1.0512155,-0.30204677,-1078.6729,457.42109)" |
2274 | - cx="-273.75134" |
2275 | - cy="320.53235" |
2276 | - fx="-273.75134" |
2277 | - fy="320.53235" |
2278 | - r="49.711224" /> |
2279 | - <radialGradient |
2280 | - inkscape:collect="always" |
2281 | - xlink:href="#linearGradient3896" |
2282 | - id="radialGradient4175" |
2283 | - gradientUnits="userSpaceOnUse" |
2284 | - gradientTransform="matrix(0.6210787,-1.8849273,-1.0512155,-0.30204677,40.112094,458.02174)" |
2285 | - cx="-273.75134" |
2286 | - cy="320.53235" |
2287 | - fx="-273.75134" |
2288 | - fy="320.53235" |
2289 | - r="49.711224" /> |
2290 | - <radialGradient |
2291 | - inkscape:collect="always" |
2292 | - xlink:href="#linearGradient3918" |
2293 | - id="radialGradient4177" |
2294 | - gradientUnits="userSpaceOnUse" |
2295 | - gradientTransform="matrix(-6.2694994e-8,0.41626811,-0.75626583,-9.9326294e-8,-214.9118,985.75254)" |
2296 | - cx="-192.93913" |
2297 | - cy="403.7388" |
2298 | - fx="-192.93913" |
2299 | - fy="403.7388" |
2300 | - r="62.046875" /> |
2301 | - <radialGradient |
2302 | - inkscape:collect="always" |
2303 | - xlink:href="#linearGradient3953" |
2304 | - id="radialGradient4179" |
2305 | - gradientUnits="userSpaceOnUse" |
2306 | - gradientTransform="matrix(-1.0629016e-7,2.5003717,-1.6773327,-7.1301808e-8,-68.017833,1423.1127)" |
2307 | - cx="-226.07143" |
2308 | - cy="271.32739" |
2309 | - fx="-226.07143" |
2310 | - fy="271.32739" |
2311 | - r="5.2734375" /> |
2312 | - <radialGradient |
2313 | - inkscape:collect="always" |
2314 | - xlink:href="#linearGradient3961" |
2315 | - id="radialGradient4181" |
2316 | - gradientUnits="userSpaceOnUse" |
2317 | - gradientTransform="matrix(0.9502716,0.192886,-0.07988155,0.58371719,-260.25926,813.70895)" |
2318 | - cx="-193.85033" |
2319 | - cy="285.24863" |
2320 | - fx="-193.85033" |
2321 | - fy="285.24863" |
2322 | - r="6.2866349" /> |
2323 | - <radialGradient |
2324 | - inkscape:collect="always" |
2325 | - xlink:href="#linearGradient3961" |
2326 | - id="radialGradient4187" |
2327 | - gradientUnits="userSpaceOnUse" |
2328 | - gradientTransform="matrix(0.7721694,0.15673485,-0.06490996,0.4743155,-118.68886,249.90306)" |
2329 | - cx="-193.85033" |
2330 | - cy="285.24863" |
2331 | - fx="-193.85033" |
2332 | - fy="285.24863" |
2333 | - r="6.2866349" /> |
2334 | - <radialGradient |
2335 | - inkscape:collect="always" |
2336 | - xlink:href="#linearGradient3953" |
2337 | - id="radialGradient4189" |
2338 | - gradientUnits="userSpaceOnUse" |
2339 | - gradientTransform="matrix(-8.6369005e-8,2.031746,-1.3629629,-5.793825e-8,47.13323,783.69327)" |
2340 | - cx="-226.07143" |
2341 | - cy="271.32739" |
2342 | - fx="-226.07143" |
2343 | - fy="271.32739" |
2344 | - r="5.2734375" /> |
2345 | - <linearGradient |
2346 | - inkscape:collect="always" |
2347 | - xlink:href="#linearGradient3267" |
2348 | - id="linearGradient3275" |
2349 | - x1="65.5" |
2350 | - y1="987.36218" |
2351 | - x2="64.5" |
2352 | - y2="1039.3622" |
2353 | - gradientUnits="userSpaceOnUse" |
2354 | - gradientTransform="matrix(0.98544976,0,0,1.0180642,0.72159872,-21.779314)" /> |
2355 | - <linearGradient |
2356 | - inkscape:collect="always" |
2357 | - xlink:href="#linearGradient3277" |
2358 | - id="linearGradient3283" |
2359 | - x1="107.5" |
2360 | - y1="780.36218" |
2361 | - x2="106.5" |
2362 | - y2="788.86218" |
2363 | - gradientUnits="userSpaceOnUse" /> |
2364 | - <linearGradient |
2365 | - inkscape:collect="always" |
2366 | - xlink:href="#linearGradient4070" |
2367 | - id="linearGradient4076" |
2368 | - x1="98.5" |
2369 | - y1="993.86218" |
2370 | - x2="64.5" |
2371 | - y2="995.36218" |
2372 | - gradientUnits="userSpaceOnUse" |
2373 | - gradientTransform="matrix(1,0,0,1.216216,0,-213.44294)" /> |
2374 | - <linearGradient |
2375 | - inkscape:collect="always" |
2376 | - xlink:href="#linearGradient4088" |
2377 | - id="linearGradient4094" |
2378 | - x1="100" |
2379 | - y1="127" |
2380 | - x2="98.5" |
2381 | - y2="99" |
2382 | - gradientUnits="userSpaceOnUse" /> |
2383 | - <linearGradient |
2384 | - inkscape:collect="always" |
2385 | - xlink:href="#linearGradient4099" |
2386 | - id="linearGradient4097" |
2387 | - gradientUnits="userSpaceOnUse" |
2388 | - x1="92.166664" |
2389 | - y1="123.31897" |
2390 | - x2="90.139999" |
2391 | - y2="74.939651" /> |
2392 | - <filter |
2393 | - inkscape:collect="always" |
2394 | - id="filter4115" |
2395 | - x="-0.28636364" |
2396 | - width="1.5727273" |
2397 | - y="-0.067379679" |
2398 | - height="1.1347594"> |
2399 | - <feGaussianBlur |
2400 | - inkscape:collect="always" |
2401 | - stdDeviation="2.1477273" |
2402 | - id="feGaussianBlur4117" /> |
2403 | - </filter> |
2404 | - <filter |
2405 | - inkscape:collect="always" |
2406 | - id="filter4125" |
2407 | - x="-0.13295501" |
2408 | - width="1.26591" |
2409 | - y="-4.0853449" |
2410 | - height="9.1706899"> |
2411 | - <feGaussianBlur |
2412 | - inkscape:collect="always" |
2413 | - stdDeviation="9.3622488" |
2414 | - id="feGaussianBlur4127" /> |
2415 | - </filter> |
2416 | - </defs> |
2417 | - <sodipodi:namedview |
2418 | - id="base" |
2419 | - pagecolor="#ffffff" |
2420 | - bordercolor="#666666" |
2421 | - borderopacity="1.0" |
2422 | - inkscape:pageopacity="0.0" |
2423 | - inkscape:pageshadow="2" |
2424 | - inkscape:zoom="2" |
2425 | - inkscape:cx="125.59398" |
2426 | - inkscape:cy="57.960461" |
2427 | - inkscape:document-units="px" |
2428 | - inkscape:current-layer="layer1" |
2429 | - showgrid="false" |
2430 | - inkscape:window-width="1600" |
2431 | - inkscape:window-height="876" |
2432 | - inkscape:window-x="0" |
2433 | - inkscape:window-y="24" |
2434 | - inkscape:window-maximized="1" /> |
2435 | - <metadata |
2436 | - id="metadata7"> |
2437 | - <rdf:RDF> |
2438 | - <cc:Work |
2439 | - rdf:about=""> |
2440 | - <dc:format>image/svg+xml</dc:format> |
2441 | - <dc:type |
2442 | - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> |
2443 | - <dc:title>Trophy</dc:title> |
2444 | - <dc:date>2011-02-16</dc:date> |
2445 | - <dc:creator> |
2446 | - <cc:Agent> |
2447 | - <dc:title>netalloy</dc:title> |
2448 | - </cc:Agent> |
2449 | - </dc:creator> |
2450 | - <dc:subject> |
2451 | - <rdf:Bag> |
2452 | - <rdf:li>trophy</rdf:li> |
2453 | - <rdf:li>sports</rdf:li> |
2454 | - <rdf:li>prize</rdf:li> |
2455 | - <rdf:li>winner</rdf:li> |
2456 | - <rdf:li>racing</rdf:li> |
2457 | - <rdf:li>motorsports</rdf:li> |
2458 | - <rdf:li>victory</rdf:li> |
2459 | - <rdf:li>achievement</rdf:li> |
2460 | - <rdf:li>award</rdf:li> |
2461 | - <rdf:li>cup</rdf:li> |
2462 | - <rdf:li>merit</rdf:li> |
2463 | - <rdf:li>No.1</rdf:li> |
2464 | - </rdf:Bag> |
2465 | - </dc:subject> |
2466 | - <dc:description>motorsports clip art by NetAlloy</dc:description> |
2467 | - <cc:license |
2468 | - rdf:resource="http://creativecommons.org/licenses/publicdomain/" /> |
2469 | - </cc:Work> |
2470 | - <cc:License |
2471 | - rdf:about="http://creativecommons.org/licenses/publicdomain/"> |
2472 | - <cc:permits |
2473 | - rdf:resource="http://creativecommons.org/ns#Reproduction" /> |
2474 | - <cc:permits |
2475 | - rdf:resource="http://creativecommons.org/ns#Distribution" /> |
2476 | - <cc:permits |
2477 | - rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /> |
2478 | - </cc:License> |
2479 | - </rdf:RDF> |
2480 | - </metadata> |
2481 | - <g |
2482 | - inkscape:label="Layer 1" |
2483 | - inkscape:groupmode="layer" |
2484 | - id="layer1" |
2485 | - transform="translate(0,-752.36218)"> |
2486 | - <path |
2487 | - inkscape:connector-curvature="0" |
2488 | - id="path4047" |
2489 | - d="m 173.24805,767.86986 c -1.45786,0.004 -2.96097,0.0757 -4.45699,0.19029 -2.99202,0.22916 -5.92202,0.64168 -8.28008,1.12267 -1.17902,0.2405 -2.22151,0.49034 -3.07036,0.76114 -0.84885,0.27079 -1.45084,0.44702 -2.11955,1.04656 -1.6129,1.4461 -2.37386,3.34018 -2.7138,5.23281 -0.33994,1.89263 -0.31746,3.82765 -0.31694,5.67046 5e-4,1.84282 -0.031,3.59015 -0.35656,4.98544 -0.3256,1.39529 -0.85654,2.39935 -1.94127,3.15872 -0.5849,0.40946 -2.95543,0.64126 -5.05124,0.41862 -2.09582,-0.22264 -3.88253,-0.66599 -3.88253,-0.66599 l -0.79235,2.93037 c 0,0 1.97944,0.49154 4.33813,0.74211 2.35869,0.25057 5.13106,0.49392 7.25002,-0.98948 1.8008,-1.26066 2.7376,-3.07787 3.16941,-4.92835 0.43182,-1.85049 0.41651,-3.78937 0.41599,-5.65144 -5e-4,-1.86207 0.007,-3.65198 0.27732,-5.15669 0.27026,-1.50472 0.76495,-2.66222 1.74318,-3.53929 -0.17038,0.15276 0.30964,-0.16339 0.99044,-0.38057 0.68079,-0.21717 1.61541,-0.46097 2.7138,-0.68502 2.19678,-0.44809 5.03128,-0.8471 7.88391,-1.06559 2.85263,-0.21849 5.73444,-0.23769 8.00276,0.019 2.26832,0.25672 3.81231,0.95158 4.08061,1.29394 3.54594,4.52465 4.15268,12.33478 2.19878,21.74946 -1.9539,9.41467 -6.38474,20.32746 -12.26165,30.92115 -11.75383,21.18738 -31.53134,39.03872 -45.91613,43.74427 l 1.01025,2.87329 c 16.12505,-5.27483 35.69932,-23.59574 47.67911,-45.19043 5.9899,-10.79735 10.53819,-21.92689 12.57859,-31.7584 2.04041,-9.83152 1.67802,-18.48622 -2.77323,-24.16607 -1.35081,-1.72366 -3.62221,-2.17969 -6.21996,-2.47369 -1.29889,-0.147 -2.7218,-0.21284 -4.17966,-0.20931 z" |
2490 | - style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#b88100;fill-opacity:1;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" |
2491 | - sodipodi:nodetypes="csscssccssccssscccssscsssccsssscc" /> |
2492 | - <path |
2493 | - inkscape:connector-curvature="0" |
2494 | - id="path4061" |
2495 | - d="m 174.04495,768.48495 c 1.51962,-0.004 2.98217,0.0616 4.33607,0.20688 2.7078,0.29058 5.07542,0.74131 6.48346,2.44492 4.63982,5.61381 5.01755,14.16788 2.89071,23.88508 -2.12683,9.7172 -6.84716,20.71732 -13.0908,31.38913 -12.48729,21.3436 -32.82669,39.42822 -49.63484,44.64171 l -1.05305,-2.83988 c 14.99417,-4.65083 35.52477,-22.27135 47.77652,-43.21237 6.12588,-10.47052 10.74442,-21.25641 12.78109,-30.56161 2.03667,-9.3052 1.40423,-17.02452 -2.29192,-21.49657 -0.27967,-0.33838 -1.88907,-1.02515 -4.25348,-1.27888 -2.36441,-0.25374 -5.3683,-0.23476 -8.34178,-0.0187 -2.97347,0.21595 -5.92804,0.61032 -8.21788,1.0532 -1.14492,0.22144 -2.11914,0.4624 -2.82877,0.67705 -0.70964,0.21466 -1.20999,0.52713 -1.0324,0.37615 -1.01967,0.86687 -1.53531,2.0109 -1.81702,3.49813 -0.28171,1.48722 -0.26897,3.25632 -0.26842,5.09673 5e-4,1.84042 -0.004,3.75676 -0.45426,5.58573 -0.4501,1.82896 -1.42659,3.62504 -3.30368,4.87105 -2.20872,1.46614 -5.09854,1.22563 -7.55715,0.97797 -2.4586,-0.24766 -4.5219,-0.73348 -4.5219,-0.73348 l 0.82592,-2.8963 c 0,0 1.8624,0.4382 4.047,0.65825 2.1846,0.22005 4.65555,-0.009 5.26523,-0.41376 1.13067,-0.75054 1.70476,-1.74292 2.04415,-3.12198 0.33938,-1.37907 0.3722,-3.10609 0.37166,-4.92748 -5e-4,-1.82138 -0.0446,-3.7339 0.30972,-5.60453 0.35434,-1.87062 1.14754,-3.74267 2.82877,-5.17196 0.69703,-0.59258 1.34517,-0.76675 2.22998,-1.03439 0.88481,-0.26765 1.95081,-0.51459 3.17978,-0.75229 2.45795,-0.47539 5.51209,-0.88312 8.63085,-1.10962 1.55939,-0.11325 3.14682,-0.18458 4.66644,-0.18807 z" |
2496 | - style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#radialGradient4101);fill-opacity:1;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" |
2497 | - sodipodi:nodetypes="cssssccsssscsscsccssccscsccsssscc" /> |
2498 | - <path |
2499 | - inkscape:connector-curvature="0" |
2500 | - id="path4045" |
2501 | - d="m 26.345915,767.86986 c -1.45786,-0.004 -2.86098,0.0623 -4.15985,0.20931 -2.59776,0.294 -4.86915,0.75004 -6.21997,2.4737 -4.45125,5.67984 -4.81363,14.33455 -2.77323,24.16606 2.0404,9.83152 6.56889,20.96106 12.55878,31.7584 11.97979,21.5947 31.57388,39.91561 47.69893,45.19044 l 1.01025,-2.87329 c -14.38479,-4.70555 -34.1623,-22.5569 -45.91613,-43.74428 -5.87692,-10.59369 -10.30776,-21.50647 -12.26166,-30.92115 -1.95389,-9.41467 -1.34715,-17.2248 2.19878,-21.74946 0.2683,-0.34236 1.81229,-1.03721 4.08062,-1.29393 2.26832,-0.25672 5.15013,-0.23752 8.00275,-0.019 2.85263,0.21849 5.68713,0.6175 7.88391,1.06559 1.09839,0.22405 2.03301,0.46785 2.71381,0.68503 0.68079,0.21717 1.16081,0.53332 0.99044,0.38056 0.97822,0.87707 1.47291,2.03457 1.74317,3.53929 0.27026,1.50471 0.25804,3.29462 0.25752,5.15669 -5e-4,1.86207 0.004,3.80095 0.43579,5.65144 0.43181,1.85048 1.36861,3.66769 3.16941,4.92835 2.11896,1.4834 4.89134,1.24005 7.25002,0.98948 2.35869,-0.25057 4.33813,-0.74211 4.33813,-0.74211 l -0.79235,-2.93037 c 0,0 -1.78671,0.44335 -3.88252,0.66599 -2.09582,0.22264 -4.46635,-0.009 -5.05125,-0.41862 -1.08473,-0.75937 -1.63548,-1.76343 -1.96107,-3.15872 -0.3256,-1.39529 -0.35708,-3.14262 -0.35656,-4.98544 5e-4,-1.84281 0.0428,-3.77783 -0.29713,-5.67046 -0.33994,-1.89263 -1.10091,-3.78671 -2.71381,-5.23281 -0.6687,-0.59954 -1.2905,-0.77577 -2.13935,-1.04656 -0.84885,-0.2708 -1.87153,-0.52064 -3.05056,-0.76114 -2.35806,-0.48099 -5.28806,-0.89351 -8.28008,-1.12267 -1.49601,-0.11458 -3.01893,-0.18676 -4.47679,-0.19029 z" |
2502 | - style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#b88100;fill-opacity:1;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" |
2503 | - sodipodi:nodetypes="cssssccsssscsscsccssccscscsscsscc" /> |
2504 | - <path |
2505 | - style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#radialGradient4099);fill-opacity:1;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" |
2506 | - d="m 26.953645,767.86986 c -1.51962,-0.004 -2.98218,0.0616 -4.33607,0.20688 -2.70781,0.29058 -5.07543,0.74132 -6.48346,2.44492 -4.63982,5.61381 -5.01756,14.16788 -2.89072,23.88508 2.12684,9.7172 6.84716,20.71732 13.09081,31.38913 12.48728,21.3436 32.82669,41.42822 49.63484,46.64171 l 1.05305,-2.83988 c -14.99417,-4.65083 -35.52478,-24.27135 -47.77653,-45.21237 -6.12588,-10.47052 -10.74442,-21.25641 -12.78108,-30.56161 -2.03667,-9.3052 -1.40423,-17.02452 2.29192,-21.49657 0.27966,-0.33837 1.88907,-1.02515 4.25348,-1.27888 2.36441,-0.25374 5.3683,-0.23476 8.34177,-0.0188 2.97347,0.21595 5.92805,0.61032 8.21789,1.0532 1.14492,0.22144 2.11914,0.4624 2.82877,0.67705 0.70963,0.21466 1.20999,0.52713 1.03239,0.37615 1.01967,0.86687 1.53532,2.01091 1.81703,3.49813 0.28171,1.48722 0.26897,3.25632 0.26842,5.09674 -5e-4,1.84041 0.004,3.75675 0.45426,5.58572 0.4501,1.82896 1.42658,3.62504 3.30367,4.87105 2.20873,1.46614 5.09855,1.22563 7.55715,0.97797 2.45861,-0.24766 4.52191,-0.73348 4.52191,-0.73348 l -0.82592,-2.8963 c 0,0 -1.8624,0.4382 -4.047,0.65825 -2.1846,0.22005 -4.65555,-0.009 -5.26523,-0.41376 -1.13067,-0.75054 -1.70476,-1.74292 -2.04415,-3.12198 -0.33939,-1.37907 -0.37221,-3.10609 -0.37166,-4.92747 5e-4,-1.82139 0.0446,-3.73391 -0.30972,-5.60454 -0.35434,-1.87062 -1.14755,-3.74267 -2.82877,-5.17196 -0.69703,-0.59257 -1.34517,-0.76675 -2.22999,-1.03439 -0.8848,-0.26765 -1.9508,-0.51459 -3.17977,-0.75229 -2.45796,-0.47539 -5.51209,-0.88312 -8.63085,-1.10962 -1.55939,-0.11325 -3.14683,-0.18458 -4.66644,-0.18808 z" |
2507 | - id="path4059" |
2508 | - inkscape:connector-curvature="0" |
2509 | - sodipodi:nodetypes="cssssccssssssccsccssccscsccscssc" /> |
2510 | - <path |
2511 | - sodipodi:nodetypes="ccccc" |
2512 | - inkscape:connector-curvature="0" |
2513 | - id="path4035" |
2514 | - d="m 46.349625,1001.9294 107.049755,-0.7859 4.40793,14.147 -113.976505,0 z" |
2515 | - style="fill:#310e0a;fill-opacity:1;stroke:#918d89;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dashoffset:0" /> |
2516 | - <path |
2517 | - id="path4037" |
2518 | - d="m 94.943815,783.09258 0.0792,0.19028 c -5.04828,0.11159 -10.93977,0.2564 -14.69814,0.41863 -8.8353,0.38138 -26.24667,3.69151 -26.24667,3.69151 l -1.28757,3.69151 c 0,0 18.71785,-3.31402 28.18793,-3.69151 6.34248,-0.25282 14.72066,-0.75449 18.83818,-1.00851 4.129675,0.25472 12.485715,0.75608 18.818375,1.00851 9.47009,0.37749 28.16813,3.69151 28.16813,3.69151 l -1.26777,-3.69151 c 0,0 -17.41137,-3.31013 -26.24667,-3.69151 -3.75837,-0.16223 -9.64987,-0.30704 -14.69815,-0.41863 l 0.0792,-0.19028 c 0,0 -3.03839,0.0607 -4.853155,0.0951 -1.82773,-0.0347 -4.87297,-0.0951 -4.87297,-0.0951 z" |
2519 | - style="fill:url(#linearGradient3283);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" |
2520 | - inkscape:connector-curvature="0" /> |
2521 | - <path |
2522 | - sodipodi:nodetypes="cccsccsccccc" |
2523 | - inkscape:connector-curvature="0" |
2524 | - id="path4039" |
2525 | - d="m 97.499155,786.17518 0,0.19029 c -13.34789,0.34054 -25.52406,-0.8199 -43.42091,5.34698 0,0 -1.42233,31.08928 3.20903,47.97059 3.45424,12.59074 9.33588,27.35141 19.19473,36.28716 14.01122,10.98765 34.003185,10.62835 46.629945,0 9.85885,-8.93575 15.7603,-23.69642 19.21455,-36.28716 4.63135,-16.88131 3.20902,-47.97059 3.20902,-47.97059 -17.90592,-6.17001 -30.08487,-5.02377 -43.44072,-5.36601 l 0,-0.17126 c -0.77367,0.0449 -1.53535,0.0837 -2.297825,0.11417 -0.75725,-0.0304 -1.5295,-0.0696 -2.29782,-0.11417 z" |
2526 | - style="fill:url(#linearGradient4091);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> |
2527 | - <path |
2528 | - sodipodi:nodetypes="cccccscccccccscccccc" |
2529 | - inkscape:connector-curvature="0" |
2530 | - id="path4041" |
2531 | - d="m 91.760723,881.00795 1.657135,8.00254 1.65713,18.48211 -4.971395,4.30611 3.860948,4.9349 c 0,0 4.877148,23.3695 -5.456109,32.21224 -2.352979,2.01359 -2.13973,-1.17515 -2.13973,-1.17515 l -5.754587,3.50737 -15.367504,7.94529 c 10.325113,10.32254 22.173616,8.74714 33.911413,8.04064 11.738196,0.70646 23.603026,2.28231 33.928496,-8.04064 l -15.36751,-7.94529 -5.75459,-3.50737 c 0,0 0.21327,3.18874 -2.13971,1.17515 -10.333269,-8.84274 -5.45613,-32.21224 -5.45613,-32.21224 l 3.86094,-4.9349 -4.9714,-4.30611 1.65715,-18.48211 1.65714,-8.00254 c -13.444745,5.18428 -4.56111,2.20785 -14.811687,0 z" |
2532 | - style="fill:url(#radialGradient4093);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> |
2533 | - <path |
2534 | - sodipodi:nodetypes="ccccccc" |
2535 | - inkscape:connector-curvature="0" |
2536 | - id="path4043" |
2537 | - d="m 65.764065,958.9648 -12.8197,0.23685 -3.84391,22.13575 c 36.98708,1.3293 64.853805,0.2823 102.333815,0 l -5.76487,-22.13575 c -5.23853,-0.10412 -17.16597,0.12787 -12.3197,-1.23685 -19.43083,10.21076 -52.626825,13.28829 -67.585635,1 z" |
2538 | - style="fill:#3a0704;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> |
2539 | - <path |
2540 | - inkscape:connector-curvature="0" |
2541 | - id="path4049" |
2542 | - d="m 90.378491,945.37519 c -2.648588,0.72535 -4.290176,1.74429 -4.290176,2.87329 0,2.20644 6.295636,3.99597 14.054025,3.99597 7.75841,0 14.03556,-1.78953 14.03556,-3.99597 0,-1.129 -1.64159,-2.14794 -4.29019,-2.87329 -0.51543,0.44332 -1.09484,0.85369 -1.73826,1.21782 1.19966,0.46694 1.92318,1.03328 1.92318,1.65547 0,1.55925 -4.44757,2.8162 -9.93029,2.8162 -5.482709,0 -9.930279,-1.25695 -9.930279,-2.8162 0,-0.62219 0.705041,-1.18853 1.904694,-1.65547 -0.643408,-0.36413 -1.222842,-0.7745 -1.738264,-1.21782 z" |
2543 | - style="fill:#804d00;fill-opacity:1;stroke:#918d89;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> |
2544 | - <path |
2545 | - sodipodi:nodetypes="cccc" |
2546 | - inkscape:connector-curvature="0" |
2547 | - id="path4051" |
2548 | - d="m -592.13203,378.34534 c -24.34186,-21.17521 -40.34192,-23.95756 -46.46702,-141.42136 l 6.06092,-2.0203 c 0.99724,55.24396 -7.934,101.34849 40.4061,143.44166 z" |
2549 | - style="fill:#804d00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3862)" |
2550 | - transform="matrix(0.6338819,0,0,0.6089088,462.71418,647.44183)" /> |
2551 | - <path |
2552 | - style="fill:#804d00;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3866)" |
2553 | - d="m -561.82747,388.44686 c 24.34186,-21.17521 50.44345,-33.04893 56.56855,-150.51273 l -6.06092,-2.0203 c -0.99724,55.24396 -2.16753,110.43986 -50.50763,152.53303 z" |
2554 | - id="path4053" |
2555 | - inkscape:connector-curvature="0" |
2556 | - sodipodi:nodetypes="cccc" |
2557 | - transform="matrix(0.6338819,0,0,0.6089088,462.71418,647.44183)" /> |
2558 | - <path |
2559 | - sodipodi:nodetypes="ccccc" |
2560 | - inkscape:connector-curvature="0" |
2561 | - id="path4055" |
2562 | - d="m -614.35539,236.18319 13.13199,83.57331 60.60915,-1.14485 10.10152,-84.71813 c -29.79783,-11.81867 -56.63225,-3.48616 -83.84266,2.28967 z" |
2563 | - style="fill:url(#radialGradient4095);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3880)" |
2564 | - transform="matrix(0.6338819,0,0,0.6089088,462.71418,647.44183)" /> |
2565 | - <path |
2566 | - style="fill:url(#radialGradient4103);fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" |
2567 | - d="m 90.579445,880.00795 1.92146,8.09195 1.92145,18.68854 -5.76436,4.35422 4.47679,4.99003 c 0,0 5.63478,21.09474 -6.99251,30.5182 -2.87535,2.14582 -2.61476,-1.25232 -2.61476,-1.25232 l -7.03213,3.7377 -16.65921,9.9608 c 11.97203,10.43788 25.71044,8.84487 39.32049,8.13048 13.610525,0.71436 27.367855,2.30777 39.340295,-8.13048 l -16.65921,-9.9608 -7.03212,-3.7377 c 0,0 0.26058,3.39814 -2.61477,1.25232 -12.627295,-9.42346 -6.99252,-30.5182 -6.99252,-30.5182 l 4.47679,-4.99003 -5.76436,-4.35422 1.92146,-18.68854 1.92145,-8.09195 c -15.589255,5.24222 -5.28862,2.2325 -17.174235,0 z" |
2568 | - id="path4063" |
2569 | - inkscape:connector-curvature="0" |
2570 | - sodipodi:nodetypes="cccccscccccccscccccc" /> |
2571 | - <rect |
2572 | - ry="0.50903207" |
2573 | - y="980.23029" |
2574 | - x="49.593613" |
2575 | - height="28.179085" |
2576 | - width="101.59111" |
2577 | - id="rect4065" |
2578 | - style="fill:url(#linearGradient3275);fill-opacity:1;stroke:#918d89;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" /> |
2579 | - <rect |
2580 | - style="fill:#692017;fill-opacity:1;stroke:#918d89;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" |
2581 | - id="rect4067" |
2582 | - width="113.9765" |
2583 | - height="10.686725" |
2584 | - x="43.690475" |
2585 | - y="1014.6754" |
2586 | - ry="0" /> |
2587 | - <text |
2588 | - transform="scale(1.1209551,0.8920964)" |
2589 | - sodipodi:linespacing="125%" |
2590 | - id="text4155" |
2591 | - y="1556.0684" |
2592 | - x="55.365215" |
2593 | - style="font-size:20.11759758px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;opacity:0.37560975;fill:#ffc022;fill-opacity:1;stroke:none;font-family:Sans" |
2594 | - xml:space="preserve"><tspan |
2595 | - style="fill:#ffc022;fill-opacity:1" |
2596 | - y="1556.0684" |
2597 | - x="55.365215" |
2598 | - id="tspan4157" |
2599 | - sodipodi:role="line" /></text> |
2600 | - <path |
2601 | - style="fill:url(#linearGradient4076);fill-opacity:1;stroke:#918d89;stroke-width:0;stroke-linecap:round;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" |
2602 | - d="m 73.006446,984.36218 c 0.0042,0.043 0.03324,0.083 0.03324,0.12641 0,1.994 2.059387,3.64041 -3.039682,3.88693 l 0,6.85744 c 0,0.14259 0.231841,0.25282 0.531748,0.25282 -0.299907,0 -0.531748,0.10702 -0.531748,0.25281 l 0,7.01541 c 5.099069,0.2521 3.039682,1.9425 3.039682,3.9818 0,0.044 -0.03007,0.083 -0.03324,0.1264 l 50.682054,0 c -0.0633,-0.169 -0.13295,-0.3463 -0.13295,-0.5214 0,-1.7131 -0.88561,-3.1523 3.44445,-3.6658 l 0,-6.93641 c 0,-0.14582 -0.23184,-0.25281 -0.53175,-0.25281 0.29991,0 0.53175,-0.11019 0.53175,-0.25282 l 0,-6.77843 c -4.33006,-0.50201 -3.44445,-1.91169 -3.44445,-3.58674 0,-0.1713 0.0696,-0.34032 0.13295,-0.50561 z" |
2603 | - id="rect3285" |
2604 | - inkscape:connector-curvature="0" |
2605 | - sodipodi:nodetypes="cscscscsccscscscscc" /> |
2606 | - <path |
2607 | - style="opacity:0.22439025000000001;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter4115)" |
2608 | - d="m 95.5,194 2.5,-11.5 1,-16.5 -3,-4.5 2,-3 L 95.5,132 C 86.96546,129.38739 82.88593,124.10178 81,117.5" |
2609 | - id="path4105" |
2610 | - inkscape:connector-curvature="0" |
2611 | - transform="translate(0,752.36218)" |
2612 | - sodipodi:nodetypes="ccccccc" /> |
2613 | - </g> |
2614 | -</svg> |
2615 | |
2616 | === added directory 'data/daemon' |
2617 | === renamed file 'daemon/validation-key.pub' => 'data/daemon/validation-key.pub' |
2618 | === renamed file 'daemon/lock.png' => 'data/media/lock.png' |
2619 | === modified file 'data/ui/TrophyinfoWindow.ui' |
2620 | --- data/ui/TrophyinfoWindow.ui 2012-02-22 04:59:12 +0000 |
2621 | +++ data/ui/TrophyinfoWindow.ui 2012-03-05 04:10:47 +0000 |
2622 | @@ -20,7 +20,7 @@ |
2623 | <property name="can_focus">False</property> |
2624 | <property name="title" translatable="yes">Accomplishment Information</property> |
2625 | <property name="window_position">center</property> |
2626 | - <property name="icon">trophy-accomplished.svg</property> |
2627 | + <property name="icon">../media/trophy-accomplished.svg</property> |
2628 | <property name="icon_name">distributor-logo</property> |
2629 | <child> |
2630 | <object class="GtkVBox" id="vbox1"> |
2631 | |
2632 | === modified file 'setup.py' |
2633 | --- setup.py 2012-01-30 06:58:49 +0000 |
2634 | +++ setup.py 2012-03-05 04:10:47 +0000 |
2635 | @@ -3,86 +3,17 @@ |
2636 | ### BEGIN LICENSE |
2637 | # This file is in the public domain |
2638 | ### END LICENSE |
2639 | - |
2640 | -###################### DO NOT TOUCH THIS (HEAD TO THE SECOND PART) ###################### |
2641 | - |
2642 | -import os |
2643 | -import sys |
2644 | - |
2645 | -try: |
2646 | - import DistUtilsExtra.auto |
2647 | -except ImportError: |
2648 | - print >> sys.stderr, 'To build trophyinfo you need https://launchpad.net/python-distutils-extra' |
2649 | - sys.exit(1) |
2650 | -assert DistUtilsExtra.auto.__version__ >= '2.18', 'needs DistUtilsExtra.auto >= 2.18' |
2651 | - |
2652 | -def update_config(values = {}): |
2653 | - |
2654 | - oldvalues = {} |
2655 | - try: |
2656 | - fin = file('trophyinfo_lib/trophyinfoconfig.py', 'r') |
2657 | - fout = file(fin.name + '.new', 'w') |
2658 | - |
2659 | - for line in fin: |
2660 | - fields = line.split(' = ') # Separate variable from value |
2661 | - if fields[0] in values: |
2662 | - oldvalues[fields[0]] = fields[1].strip() |
2663 | - line = "%s = %s\n" % (fields[0], values[fields[0]]) |
2664 | - fout.write(line) |
2665 | - |
2666 | - fout.flush() |
2667 | - fout.close() |
2668 | - fin.close() |
2669 | - os.rename(fout.name, fin.name) |
2670 | - except (OSError, IOError), e: |
2671 | - print ("ERROR: Can't find trophyinfo_lib/trophyinfoconfig.py") |
2672 | - sys.exit(1) |
2673 | - return oldvalues |
2674 | - |
2675 | - |
2676 | -def update_desktop_file(datadir): |
2677 | - |
2678 | - try: |
2679 | - fin = file('trophyinfo.desktop.in', 'r') |
2680 | - fout = file(fin.name + '.new', 'w') |
2681 | - |
2682 | - for line in fin: |
2683 | - if 'Icon=' in line: |
2684 | - line = "Icon=%s\n" % (datadir + 'media/trophyinfo.svg') |
2685 | - fout.write(line) |
2686 | - fout.flush() |
2687 | - fout.close() |
2688 | - fin.close() |
2689 | - os.rename(fout.name, fin.name) |
2690 | - except (OSError, IOError), e: |
2691 | - print ("ERROR: Can't find trophyinfo.desktop.in") |
2692 | - sys.exit(1) |
2693 | - |
2694 | - |
2695 | -class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): |
2696 | - def run(self): |
2697 | - values = {'__trophyinfo_data_directory__': "'%s'" % (self.prefix + '/share/trophyinfo/'), |
2698 | - '__version__': "'%s'" % self.distribution.get_version()} |
2699 | - previous_values = update_config(values) |
2700 | - update_desktop_file(self.prefix + '/share/trophyinfo/') |
2701 | - DistUtilsExtra.auto.install_auto.run(self) |
2702 | - update_config(previous_values) |
2703 | - |
2704 | - |
2705 | - |
2706 | -################################################################################## |
2707 | -###################### YOU SHOULD MODIFY ONLY WHAT IS BELOW ###################### |
2708 | -################################################################################## |
2709 | - |
2710 | -DistUtilsExtra.auto.setup( |
2711 | +from accomplishments.util import dist |
2712 | + |
2713 | + |
2714 | +dist.setup( |
2715 | name='trophyinfo', |
2716 | - version='0.1', |
2717 | + version='0.2', |
2718 | license='GPL-3', |
2719 | author='Jono Bacon', |
2720 | author_email='jono@ubuntu.com', |
2721 | description='Trophy viewer for Ubuntu Accomplishments.', |
2722 | long_description='Trophy viewer for Ubuntu Accomplishments.', |
2723 | url='https://launchpad.net/ubuntuaccomplishments', |
2724 | - cmdclass={'install': InstallAndUpdateDataDirectory} |
2725 | + cmdclass={'install': dist.InstallAndUpdateDataDirectory} |
2726 | ) |
2727 | - |
2728 | |
2729 | === modified file 'tests/test_example.py' |
2730 | --- tests/test_example.py 2012-01-22 23:09:09 +0000 |
2731 | +++ tests/test_example.py 2012-03-05 04:10:47 +0000 |
2732 | @@ -3,18 +3,23 @@ |
2733 | ### BEGIN LICENSE |
2734 | # This file is in the public domain |
2735 | ### END LICENSE |
2736 | - |
2737 | +import os |
2738 | import sys |
2739 | -import os.path |
2740 | + |
2741 | +sys.path.insert( |
2742 | + 0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) |
2743 | + |
2744 | import unittest |
2745 | -sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), ".."))) |
2746 | - |
2747 | -from trophyinfo import AboutTrophyinfoDialog |
2748 | + |
2749 | +from accomplishments.gui import AboutTrophyinfoDialog |
2750 | + |
2751 | |
2752 | class TestExample(unittest.TestCase): |
2753 | + |
2754 | def setUp(self): |
2755 | self.AboutTrophyinfoDialog_members = [ |
2756 | - 'AboutTrophyinfoDialog', 'get_builder', 'gettext', 'Gtk'] |
2757 | + 'AboutDialog', 'AboutTrophyinfoDialog', 'gettext', 'logger', |
2758 | + 'logging'] |
2759 | |
2760 | def test_AboutTrophyinfoDialog_members(self): |
2761 | all_members = dir(AboutTrophyinfoDialog) |
2762 | @@ -22,5 +27,6 @@ |
2763 | public_members.sort() |
2764 | self.assertEqual(self.AboutTrophyinfoDialog_members, public_members) |
2765 | |
2766 | -if __name__ == '__main__': |
2767 | + |
2768 | +if __name__ == '__main__': |
2769 | unittest.main() |
2770 | |
2771 | === modified file 'tests/test_lint.py' |
2772 | --- tests/test_lint.py 2012-01-22 23:09:09 +0000 |
2773 | +++ tests/test_lint.py 2012-03-05 04:10:47 +0000 |
2774 | @@ -3,28 +3,31 @@ |
2775 | ### BEGIN LICENSE |
2776 | # This file is in the public domain |
2777 | ### END LICENSE |
2778 | - |
2779 | +import subprocess |
2780 | import unittest |
2781 | -import subprocess |
2782 | + |
2783 | |
2784 | class TestPylint(unittest.TestCase): |
2785 | + |
2786 | def test_project_errors_only(self): |
2787 | - '''run pylint in error only mode |
2788 | - |
2789 | - your code may well work even with pylint errors |
2790 | - but have some unusual code''' |
2791 | - return_code = subprocess.call(["pylint", '-E', 'trophyinfo']) |
2792 | + '''Run pylint in error only mode |
2793 | + |
2794 | + Your code may well work even with pylint errors but have some unusual |
2795 | + code. |
2796 | + ''' |
2797 | + return_code = subprocess.call(["pylint", '-E', 'accomplishments']) |
2798 | # not needed because nosetests displays pylint console output |
2799 | #self.assertEqual(return_code, 0) |
2800 | |
2801 | - # un-comment the following for loads of diagnostics |
2802 | + # un-comment the following for loads of diagnostics |
2803 | #~ def test_project_full_report(self): |
2804 | #~ '''Only for the brave |
2805 | -#~ |
2806 | + #~ |
2807 | #~ you will have to make judgement calls about your code standards |
2808 | #~ that differ from the norm''' |
2809 | #~ return_code = subprocess.call(["pylint", 'trophyinfo']) |
2810 | |
2811 | + |
2812 | if __name__ == '__main__': |
2813 | - 'you will get better results with nosetests' |
2814 | + # you will get better results with nosetests |
2815 | unittest.main() |
2816 | |
2817 | === modified file 'trophyinfo.desktop.in' |
2818 | --- trophyinfo.desktop.in 2012-01-22 23:09:09 +0000 |
2819 | +++ trophyinfo.desktop.in 2012-03-05 04:10:47 +0000 |
2820 | @@ -3,6 +3,6 @@ |
2821 | _Comment=Trophyinfo application |
2822 | Categories=GNOME;Utility; |
2823 | Exec=trophyinfo |
2824 | -Icon=trophyinfo |
2825 | +Icon=/home/oubiwann/lab/ubuntu-accomplishments-system/941201-missing-deps/.venv/share/trophyinfo/media/trophyinfo.svg |
2826 | Terminal=false |
2827 | Type=Application |
Thanks for your work on this, Duncan. :-)
This looks like quite a complex merge. Can you provide some more details of what does and what is involved?
Also, given that we are going to wait to see what the Quickly team says about how dependencies are assessed, I would like to hold of merging changes that might break quickly.