Problem #1 - I need to test tons of HTML output for correctness (because I maintain toscawidgets2). That output varies slightly because tw2 supports five different templating languages (mako, genshi, jinja2, kajiki, and chameleon). Using double-equals (==) just won't do it.
Solution #1 - We used strainer. It works!
Problem #2 - Imagine porting this to Python 3. Yes, that's right. The encoding is sniffed by hand and then used to encode regular expressions; these are in turn applied to parse XML. Think "inverse unicode sandwich with a side of Cthulhu."
>>> from sieve.operators import eq_xml, in_xml >>> a = "<foo><bar>Value</bar></foo>" >>> b = """ ... <foo> ... <bar> ... Value ... </bar> ... </foo> ... """ >>> eq_xml(a, b) True >>> c = "<html><body><foo><bar>Value</bar></foo></body></html" >>> in_xml(a, c) # 'needle' in a 'haystack' True
p.s. -- I looked into xmldiff. Awesome!
This last quarter at RIT I taught (for the first time) a course on open source, web-based, game programming. The quarter just came to an end and I really want to brag on my students. But before I do that, here's a glimmer of what we covered:
- How to use bash and vim
- How to use git and github
- How to submit patches to projects you know nothing about
- What makes a good, casual game
- How to make games with HTML5
- Serverside programming with Turbogears2
- How to get your code running on Red Hat's Openshift cloud.
- How to give a lightning talk(!)
Really cool stuff was built into the class; it was about making open source software, so we open sourced the syllabus! Really cool stuff happened along the way; we hit ugly problems with openshift, so we patched the quickstarter script!
You can endure my self-indulgent drivel yes, but you get the best picture from reading the students' blog posts themselves. Enough of this! Les projets de cours!
#1 - Lazorz teamed up with the Boston Museum of Science to make "[An] educational game about the physics of light. In it's current incarnation it helps demonstrate the concepts of reflection and color filtering. The development team has plans to include other concepts such as refraction and prisms in future releases."
#2 - Gold Rush is visually and game-ly amazing. If I had to pick which of the three project was going to make one million dollars, it'd be this one.
The front-end is built in Unity (closed source, but compiles to a ton of platforms) and the back-end JSON store is built in TurboGears2. These guys completely flew through development, mastering skills they'd never heard of in a day. Its 3D with a moving camera and an incredibly fun game. The original game idea belongs to team member Eric Heaney. It's fun to play as a normal old card game (I've played it at a number of parties since he pitched it to the class).
- Forked pybotwar, ripped it's UI off and made it export JSON.
- Reimplemented the front-end with jCanvas (and cooked up all their own art assets!).
- Wrote a TurboGears2 app that spins up serverside instances of their pybotwar fork.
- Those instances dump their state into mongodb (or memcached, long story).
They have (awesome) plans to:
- Allow you to upload your own scripts (they have it working, just not secured).
- Make a built-in script editor.
- Tighter facebook integration (challenge your friends!)
Here's the rundown of the pre-PyCon tw2 bugsprint. The unstoppable Greg Jurman and I coordinated in google+ and IRC (with lots of ad-hoc visitors in both) and did all the damage we could do to the bug list. Our goal was to close enough that we could justify a solid 2.0 non-beta release but we didn't quite get there. We settled on 2.0 release candidate 1.
tl;dr - Big progress. We'll seal the deal on 2.0 at PyCon US next week.
- tw2 sourcecode is spread out in repos all over the place. We centralized everything at http://github.com/toscawidgets.
- We're using git-flow to manage team development and releases.
- We setup a http://cia.vc bot in #toscawidgets/IRC, which is awesome.
- We're in the continuous integration queue with Shining Panda.
- Duplicated TW Encoders
- Graceful degradation when JS disabled for tw2.dynforms
- HTML5 Prompt Text
- Configurable 'location' for resources
- Disable resource injection on a per-resource basis
- Document middleware configuration values
- Handling SCRIPT_NAME
- Inline templates
- Refactor resources for better compatibility with tw0.9
- Automatic 'modname' for resources
- Shortcuts for controller registration / Tidy up tutorial
Tickets worked on, but not complete:
Tomorrow marks the start of the toscawidgets2 24 hour bugsprint and I couldn't be more stoked. We haven't even started yet but tw2 development pushed ahead anyways.
- redesigned the tw2 homepage.
- improved tw2.jqplugins.jqgrid's sqlalchemy integration.
- pumped out one or two miscellaneous fixups to tw2.jqplugins.ui.
- released tw2.jqplugins.elrte.
- released tw2.jqplugins.elfinder (which is amazing).
- released tw2.captcha based on tgcaptcha2.
- released an alpha version of tw2.d3. It's built with WebSocket support in mind. More on that soon!
- been excited to learn that the TurboGears2 team is aiming to standardize on tw2.
- been fielding a lot more support for tw2 in Pyramid 1.3 both on the mailing list and in #toscawidgets. There's a bug still lurking out there for windows+tw2+pyramid users. At this point, if you can reproduce it and tell us about it, that would be helpful.
- got our first reports of people using tw2 with bottle. It worked!
Goal: (solidly) close as many bugs as possible and push as many libraries from beta to release as we can.
Here's to winning that game.
Tonight, VooDooNOFX was asking in IRC in #turbogears how to disable
the injection of jquery.js by tw2.jquery into her/his TG2 app. Using the
inject_resources=False middleware config value wouldn't cut it,
since she/he wanted tw2 to inject all other resources, they were
loading jQuery via google CDN beforehand and tw2's injection was clobbering
I came up with the following hack to
will remove tw2.jquery.jquery_js from the list of resources tw2 would inject
into each page served by a TG2.1 app.
At the top of
import tw2.core.core import tw2.jquery
and then replace:
return TGController.__call__(self, environ, start_response)
with the following:
stream = TGController.__call__(self, environ, start_response) # Disable the injection of tw2.jquery offending_link = tw2.jquery.jquery_js.req().link local = tw2.core.core.request_local() local['resources'] = [ r for r in local.get('resources', list()) if r.link != offending_link ] return stream
The two tricks to this are
- Simply knowing that tw2 resources register themselves with the 'request_local' object and that during the return-phase of the WSGI pipeline, the tw2 middleware refers to that list when injecting resources
- Figuring out where in a TG2 app's request flow to place the call to alter that object after all widgets that might register jquery have declared their resources but before the resources list is injected into the output stream.
We came out of it with a bug filed in the tw2 issue tracker so we can take care of it properly in the future.
Next Page »