Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Scripting OS X with Applescript, without Applescript

2,968 views

Published on

A brief tour around Applescript and the Ruby-OSA bridge rb-appscript

Published in: Technology
  • Be the first to comment

Scripting OS X with Applescript, without Applescript

  1. 1. Reprocessed.org » Scripting OS X with Applescript, without Applescript.
  2. 2. Reprocessed.org » With Ruby instead
  3. 3. Reprocessed.org » Hello, my name is Matt
  4. 4. Reprocessed.org » Why Applescript isn’t Applescript
  5. 5. Reprocessed.org » • Applescript is Apple’s system-level inter-process scripting system • It’s actually made of two parts: • Applescript, the language • OSA – Open Scripting Architecture – which is the plumbing • Generally, when people ask, ‘is it Applescriptable?’, they actually mean, ‘does it accept Apple Events and expose a terminology dictionary for OSA clients to use?’ Clearly, the first is shorter.
  6. 6. Reprocessed.org » • Applescript looks a bit like this: tell application quot;Finderquot; empty the trash end tell • All pretty simple, right? Not quite. Check these two radically different lines out: get words 1 thru 4 of quot;now is the winter of our discontentquot; get text from word 1 to 4 of quot;now is the winter of our discontentquot;
  7. 7. Reprocessed.org » Sort of like an API
  8. 8. Reprocessed.org » • You get a way to stitch all sorts of things and apps on your Mac together in all sorts of interesting ways • This is so useful that the publishing industry relies on Applescript to tie together apps and processes into the editorial workflow stuff needed to get magazines and newspapers out the door. • You can do the stitching together of lots of separate things in a single script
  9. 9. Reprocessed.org » Actually, mostly like IPC
  10. 10. Reprocessed.org » • Under the hood, its OSA which makes all this possible. OSA allows apps to send Apple Events to each other, and defines standard ways to interpret the results, so you can send data types around the place • When you iterate across things in a script, you’re not really iterating across things in memory: Script Editor (or whatever script running OSA runtime you’re using) is firing Apple Events around the place and interpreting the results
  11. 11. Reprocessed.org » It’s a query
  12. 12. Reprocessed.org » • What’s actually going on is more like SQL... • So, lets have a look...
  13. 13. Reprocessed.org » Demo time...
  14. 14. Reprocessed.org » The english- likeness monster
  15. 15. Reprocessed.org » • As we’ve already seen, the english-likeness of Applescript the language gets complex. Particularly for programmers. • Multi-word tokens are just plain odd, and allowing apps and scripting additions to essentially redefine parts of the language syntax doesn’t help much • John Gruber goes into this at great length here: http://daringfireball.net/2005/09/ englishlikeness_monster • So, is there a way to access the good stuff without the gut-wrenching terror?
  16. 16. Reprocessed.org » Enter rb- appscript / Watch OSA surface from the depths
  17. 17. Reprocessed.org » • Since Applescript is layered on top of OSA, in theory you could just use a different OSA runtime. • For once, theory ≈ practice... • There are low-level Apple Event modules for most dynamic languages, and for Python and Ruby, Hamish Sanderson has given us Appscript, which gives us a nice abstraction layer over the guts which actually makes use of those terminology dictionaries... • See http://appscript.sourceforge.net/ for the full story
  18. 18. Reprocessed.org » • Appscript takes away the pain of english-likeness by giving us a consistent interface and making a lot of the voodoo implicit stuff explicit • Believe me, you’ll appreciate this. • Appscript code looks a bit like this: app('TextEdit').documents['Read Me']. paragraphs[1].get() • As opposed to: tell application quot;TextEditquot; get paragraph 1 of document quot;Read Mequot; end tell
  19. 19. Reprocessed.org » Munging phone numbers in Address Book
  20. 20. Reprocessed.org » • The critical bits: Appscript::app('Address Book'). app.people.phones.get() => [a, bunch, of, number, objects] number = phone.value.get() phone.value.set(number)
  21. 21. Reprocessed.org » Demo time...
  22. 22. Reprocessed.org » Questions?
  23. 23. Reprocessed.org » Thank you matt@reprocessed.org http://reprocessed.org/ Some code from Matt Neuberg’s excellent Applescript: The Definitive Guide, published by O’Reilly

×