castanaut 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Copyright.txt +29 -0
- data/History.txt +3 -0
- data/Manifest.txt +31 -0
- data/README.txt +161 -0
- data/Rakefile +25 -0
- data/bin/castanaut +7 -0
- data/cbin/osxautomation +0 -0
- data/lib/castanaut/exceptions.rb +32 -0
- data/lib/castanaut/keys.rb +43 -0
- data/lib/castanaut/main.rb +20 -0
- data/lib/castanaut/movie.rb +353 -0
- data/lib/castanaut/plugin.rb +26 -0
- data/lib/castanaut.rb +64 -0
- data/lib/plugins/ishowu.rb +94 -0
- data/lib/plugins/mousepose.rb +38 -0
- data/lib/plugins/safari.rb +124 -0
- data/scripts/coords.js +48 -0
- data/scripts/gebys.js +612 -0
- data/tasks/ann.rake +77 -0
- data/tasks/annotations.rake +22 -0
- data/tasks/doc.rake +49 -0
- data/tasks/gem.rake +110 -0
- data/tasks/manifest.rake +50 -0
- data/tasks/post_load.rake +18 -0
- data/tasks/rubyforge.rake +57 -0
- data/tasks/setup.rb +221 -0
- data/tasks/spec.rake +43 -0
- data/tasks/svn.rake +44 -0
- data/tasks/test.rake +40 -0
- data/test/example_script.screenplay +91 -0
- data/test/googling.screenplay +34 -0
- metadata +87 -0
data/Copyright.txt
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
== Castanaut
|
2
|
+
|
3
|
+
Copyright (C) 2008 Inventive Labs.
|
4
|
+
|
5
|
+
This program is free software. It comes without any warranty, to
|
6
|
+
the extent permitted by applicable law. You can redistribute it
|
7
|
+
and/or modify it under the terms of the Do What The Fuck You Want
|
8
|
+
To Public License, Version 2, as published by Sam Hocevar. See
|
9
|
+
http://sam.zoy.org/wtfpl/COPYING for more details.
|
10
|
+
|
11
|
+
=== DomQuery
|
12
|
+
|
13
|
+
The DomQuery implementation is included from the Ext JS distribution, which
|
14
|
+
uses the MIT license requiring the following copyright and permission
|
15
|
+
notices. These pertain only to the script/gebys.js file.
|
16
|
+
|
17
|
+
Copyright (c) 2006-2007 Ext JS, LLC.
|
18
|
+
|
19
|
+
Permission is hereby granted, free of charge, to any person
|
20
|
+
obtaining a copy of this software and associated documentation
|
21
|
+
files (the "Software"), to deal in the Software without
|
22
|
+
restriction, including without limitation the rights to use,
|
23
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
24
|
+
copies of the Software, and to permit persons to whom the
|
25
|
+
Software is furnished to do so, subject to the following
|
26
|
+
conditions:
|
27
|
+
|
28
|
+
The above copyright notice and this permission notice shall be
|
29
|
+
included in all copies or substantial portions of the Software.
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
Copyright.txt
|
2
|
+
History.txt
|
3
|
+
Manifest.txt
|
4
|
+
README.txt
|
5
|
+
Rakefile
|
6
|
+
bin/castanaut
|
7
|
+
cbin/osxautomation
|
8
|
+
lib/castanaut.rb
|
9
|
+
lib/castanaut/exceptions.rb
|
10
|
+
lib/castanaut/keys.rb
|
11
|
+
lib/castanaut/main.rb
|
12
|
+
lib/castanaut/movie.rb
|
13
|
+
lib/castanaut/plugin.rb
|
14
|
+
lib/plugins/ishowu.rb
|
15
|
+
lib/plugins/mousepose.rb
|
16
|
+
lib/plugins/safari.rb
|
17
|
+
scripts/coords.js
|
18
|
+
scripts/gebys.js
|
19
|
+
tasks/ann.rake
|
20
|
+
tasks/annotations.rake
|
21
|
+
tasks/doc.rake
|
22
|
+
tasks/gem.rake
|
23
|
+
tasks/manifest.rake
|
24
|
+
tasks/post_load.rake
|
25
|
+
tasks/rubyforge.rake
|
26
|
+
tasks/setup.rb
|
27
|
+
tasks/spec.rake
|
28
|
+
tasks/svn.rake
|
29
|
+
tasks/test.rake
|
30
|
+
test/example_script.screenplay
|
31
|
+
test/googling.screenplay
|
data/README.txt
ADDED
@@ -0,0 +1,161 @@
|
|
1
|
+
= Castanaut: Automate your screencasts.
|
2
|
+
|
3
|
+
Author: Joseph Pearson
|
4
|
+
http://gadgets.inventivelabs.com.au/castanaut
|
5
|
+
|
6
|
+
== DESCRIPTION:
|
7
|
+
|
8
|
+
Castanaut lets you write executable scripts for your screencasts. With a
|
9
|
+
simple dictionary of stage directions, you can create complex interactions
|
10
|
+
with a variety of applications. Currently, and for the foreseeable future,
|
11
|
+
Castanaut supports Mac OS X 10.5 only.
|
12
|
+
|
13
|
+
== SYNOPSIS:
|
14
|
+
|
15
|
+
=== Writing screenplays
|
16
|
+
|
17
|
+
You write your screenplays as Ruby files. Castanaut has been designed to
|
18
|
+
read fairly naturally to the non-technical, within Ruby's constraints.
|
19
|
+
|
20
|
+
Here's a simple screenplay:
|
21
|
+
|
22
|
+
launch "Safari", at(10, 10, 800, 600)
|
23
|
+
type "http://www.inventivelabs.com.au"
|
24
|
+
hit Enter
|
25
|
+
pause 2
|
26
|
+
move to(100, 100)
|
27
|
+
move to(200, 100)
|
28
|
+
move to(200, 200)
|
29
|
+
move to(100, 200)
|
30
|
+
move to(100, 100)
|
31
|
+
say "I drew a square!"
|
32
|
+
|
33
|
+
With any luck we don't need to explain to you what this screenplay
|
34
|
+
does. The only thing that might need some explanation is "say" -- this has a
|
35
|
+
robotic voice speak the given string. (Also: all numbers are pixel
|
36
|
+
co-ordinates).
|
37
|
+
|
38
|
+
About the robot: no, we don't recommend you use this in real screencasts for
|
39
|
+
a large audience. Most people find it a little offputting.
|
40
|
+
You are free to contravene our recommendation though. You
|
41
|
+
can tweak the robot in the Mac OS X Speech Preferences pane.
|
42
|
+
|
43
|
+
=== Running your screenplay
|
44
|
+
|
45
|
+
Simply give the screenplay to the castanaut command, like this:
|
46
|
+
|
47
|
+
castanaut test.screenplay
|
48
|
+
|
49
|
+
This assumes you have a screenplay file called "test.screenplay" in the
|
50
|
+
directory where you are running the command.
|
51
|
+
|
52
|
+
Of course, it isn't always convenient to drop to the terminal to run your
|
53
|
+
screenplay. So there's also a method of executing your screenplays directly.
|
54
|
+
You need to add this line (the "shebang" line) at the top of your screenplay:
|
55
|
+
|
56
|
+
#!/usr/bin/env castanaut
|
57
|
+
|
58
|
+
Then you need to set the screenplay to be executable by running this command
|
59
|
+
on it:
|
60
|
+
|
61
|
+
chmod a+x test.screenplay
|
62
|
+
|
63
|
+
Again, substitute "test.screenplay" for your screenplay's filename.
|
64
|
+
|
65
|
+
At this point, you should be able to double-click the screenplay, or invoke
|
66
|
+
it with Quicksilver, or run it any other way that floats your boat.
|
67
|
+
|
68
|
+
=== Stopping the screenplay
|
69
|
+
|
70
|
+
If you want to abruptly terminate execution before the end of the screenplay,
|
71
|
+
you just need to run the 'castanaut' command again -- with or without any
|
72
|
+
arguments.
|
73
|
+
|
74
|
+
Of course, that might be easier said than done, if you haven't got full
|
75
|
+
control of the mouse or keyboard at the time. One recommendation is to assign
|
76
|
+
a system hot-key to invoke castanaut. I use a Quicksilver trigger for this,
|
77
|
+
assigned to Shift-F1, that calls castanaut. You'll need the full path to
|
78
|
+
the command for this, which is usually /usr/bin/castanaut, but you can check
|
79
|
+
it with the following command:
|
80
|
+
|
81
|
+
which "castanaut"
|
82
|
+
|
83
|
+
|
84
|
+
=== What stage directions can I make?
|
85
|
+
|
86
|
+
Out of the box, Castanaut performs mouse actions, keyboard actions,
|
87
|
+
robot speech and application launches.
|
88
|
+
|
89
|
+
For a complete overview of the built-in stage directions, see the
|
90
|
+
Castanaut::Movie class.
|
91
|
+
|
92
|
+
=== Using plugins
|
93
|
+
|
94
|
+
Of course, just using the built-in stage directions is a little bit awkward
|
95
|
+
and verbose. Plugins allow you to extend the available dictionary with
|
96
|
+
some additional convenience actions. Typically a plugin is specific to an
|
97
|
+
application.
|
98
|
+
|
99
|
+
Castanaut comes with several plugins, including Castanaut::Plugin::Safari for
|
100
|
+
interacting with the contents of web-pages, and Castanaut::Plugin::Ishowu for
|
101
|
+
recording screencasts using the iShowU application from Shiny White Box.
|
102
|
+
|
103
|
+
To use a plugin, simply declare it:
|
104
|
+
|
105
|
+
plugin "safari"
|
106
|
+
|
107
|
+
launch "Safari", at(32, 32, 800, 600)
|
108
|
+
url "http://www.google.com"
|
109
|
+
pause 4
|
110
|
+
move to_element('input[name="q"]')
|
111
|
+
click
|
112
|
+
type "Castanaut"
|
113
|
+
move to_element('input[type="submit"]')
|
114
|
+
click
|
115
|
+
pause 4
|
116
|
+
say "Oh. I was hoping for more results."
|
117
|
+
|
118
|
+
|
119
|
+
In the example above, we use the two methods provided by the Safari module:
|
120
|
+
url, which causes Safari to navigate to the given url, and to_element, which
|
121
|
+
returns the co-ordinates of a page element (using CSS selectors) relative to
|
122
|
+
the screen.
|
123
|
+
|
124
|
+
=== Creating your own plugins
|
125
|
+
|
126
|
+
Advanced users can create their own plugins. Put them in a directory
|
127
|
+
called "plugins" below the directory containing the screenplays that use
|
128
|
+
the plugin.
|
129
|
+
|
130
|
+
Take a look at the plugins that Castanaut comes with for examples on creating
|
131
|
+
your own.
|
132
|
+
|
133
|
+
== REQUIREMENTS:
|
134
|
+
|
135
|
+
* Mac OS X 10.5
|
136
|
+
|
137
|
+
== INSTALL:
|
138
|
+
|
139
|
+
Run the following command to install Castanaut
|
140
|
+
|
141
|
+
sudo gem install castanaut
|
142
|
+
|
143
|
+
Once installed, you should run the following command for two reasons:
|
144
|
+
|
145
|
+
castanaut
|
146
|
+
|
147
|
+
Reason 1 is to confirm that it is installed correctly. Reason 2 is to set up
|
148
|
+
the permissions on the utility that controls your mouse and keyboard during
|
149
|
+
Castanaut movies. You may be asked for a password here.
|
150
|
+
|
151
|
+
If you just see a "ScreenplayNotFound" exception here, everything's good.
|
152
|
+
|
153
|
+
== LICENSE:
|
154
|
+
|
155
|
+
Copyright (C) 2008 Inventive Labs.
|
156
|
+
|
157
|
+
Released under the WTFPL: http://sam.zoy.org/wtfpl.
|
158
|
+
|
159
|
+
Portions released under the MIT License.
|
160
|
+
|
161
|
+
See Copyright.txt for full licensing details.
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Look in the tasks/setup.rb file for the various options that can be
|
2
|
+
# configured in this Rakefile. The .rake files in the tasks directory
|
3
|
+
# are where the options are used.
|
4
|
+
|
5
|
+
load 'tasks/setup.rb'
|
6
|
+
|
7
|
+
ensure_in_path 'lib'
|
8
|
+
require 'castanaut'
|
9
|
+
|
10
|
+
task :default => 'spec:run'
|
11
|
+
|
12
|
+
PROJ.name = 'castanaut'
|
13
|
+
PROJ.authors = 'Joseph Pearson'
|
14
|
+
PROJ.email = 'joseph@inventivelabs.com.au'
|
15
|
+
PROJ.url = 'http://castanaut.rubyforge.org'
|
16
|
+
PROJ.version = Castanaut::VERSION
|
17
|
+
|
18
|
+
PROJ.rubyforge_name = 'castanaut'
|
19
|
+
PROJ.rdoc_remote_dir = 'doc'
|
20
|
+
|
21
|
+
PROJ.exclude += ['^spec\/*', '^test\/*']
|
22
|
+
|
23
|
+
PROJ.spec_opts << '--color'
|
24
|
+
|
25
|
+
# EOF
|
data/bin/castanaut
ADDED
data/cbin/osxautomation
ADDED
Binary file
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Castanaut
|
2
|
+
# All Castanaut errors are defined within this module. If you are creating
|
3
|
+
# a plugin, you should re-open this module in your plugin script file to
|
4
|
+
# add any plugin-specific exceptions (it's also a good idea to have them
|
5
|
+
# descend from CastanautError).
|
6
|
+
module Exceptions
|
7
|
+
# The abstract parent class of all Castanaut errors.
|
8
|
+
class CastanautError < RuntimeError
|
9
|
+
end
|
10
|
+
|
11
|
+
# Raised if Castanaut was invoked with no screenplay argument, or one
|
12
|
+
# pointing to a non-existent file.
|
13
|
+
class ScreenplayNotFound < CastanautError
|
14
|
+
end
|
15
|
+
|
16
|
+
# If Castanaut::Movie#run sees a non-zero exit status from the shell
|
17
|
+
# process, this error will be raised.
|
18
|
+
class ExternalActionError < CastanautError
|
19
|
+
end
|
20
|
+
|
21
|
+
# If the FILE_RUNNING flag file is deleted or moved during the execution
|
22
|
+
# of a movie, it will terminate and raise this exception.
|
23
|
+
class AbortedByUser < CastanautError
|
24
|
+
end
|
25
|
+
|
26
|
+
# Despite asking for permission, the osxautomation utility in cbin cannot
|
27
|
+
# be executed. This is pretty fatal to our intentions, so we abort with
|
28
|
+
# this exception.
|
29
|
+
class OSXAutomationPermissionError < CastanautError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Castanaut
|
2
|
+
|
3
|
+
# Some standard keys (for use with 'hit'), presumably only for US keyboards.
|
4
|
+
|
5
|
+
#
|
6
|
+
Return = "0x24"
|
7
|
+
Enter = "0x4C"
|
8
|
+
Tab = "0x30"
|
9
|
+
Space = "0x31"
|
10
|
+
Backspace = "0x33"
|
11
|
+
Esc = "0x35"
|
12
|
+
|
13
|
+
Shift = "0x38"
|
14
|
+
CapsLock = "0x39"
|
15
|
+
Alt = "0x3A"
|
16
|
+
Ctrl = "0x3B"
|
17
|
+
|
18
|
+
LArrow = "0x7B"
|
19
|
+
RArrow = "0x7C"
|
20
|
+
DArrow = "0x7D"
|
21
|
+
UArrow = "0x7E"
|
22
|
+
|
23
|
+
Insert = "0x72"
|
24
|
+
Home = "0x73"
|
25
|
+
PageUp = "0x74"
|
26
|
+
Delete = "0x75"
|
27
|
+
End = "0x77"
|
28
|
+
PageDown = "0x79"
|
29
|
+
|
30
|
+
F1 = "0x7A"
|
31
|
+
F2 = "0x78"
|
32
|
+
F3 = "0x63"
|
33
|
+
F4 = "0x76"
|
34
|
+
F5 = "0x60"
|
35
|
+
F6 = "0x61"
|
36
|
+
F7 = "0x62"
|
37
|
+
F8 = "0x64"
|
38
|
+
F9 = "0x65"
|
39
|
+
F10 = "0x6D"
|
40
|
+
F11 = "0x67"
|
41
|
+
F12 = "0x6F"
|
42
|
+
|
43
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Castanaut
|
2
|
+
|
3
|
+
# When running the Castanaut library as an executable, this class manages
|
4
|
+
# the invocation of the user-specified screenplay.
|
5
|
+
class Main
|
6
|
+
|
7
|
+
# If Castanaut is not running, this runs the movie specified as the first
|
8
|
+
# argument. If it *is* already running, this nixes the flag file, which
|
9
|
+
# should cause Castanaut to stop.
|
10
|
+
def self.run(args)
|
11
|
+
if File.exists?(Castanaut::FILE_RUNNING)
|
12
|
+
File.unlink(Castanaut::FILE_RUNNING)
|
13
|
+
else
|
14
|
+
Castanaut::Movie.new(args.shift)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|