rb-scpt 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGES +497 -0
- data/doc/aem-manual/01_introduction.html +60 -0
- data/doc/aem-manual/02_apioverview.html +107 -0
- data/doc/aem-manual/03_packingandunpackingdata.html +135 -0
- data/doc/aem-manual/04_references.html +409 -0
- data/doc/aem-manual/05_targetingapplications.html +164 -0
- data/doc/aem-manual/06_buildingandsendingevents.html +229 -0
- data/doc/aem-manual/07_findapp.html +63 -0
- data/doc/aem-manual/08_examples.html +94 -0
- data/doc/aem-manual/aemreferenceinheritance.gif +0 -0
- data/doc/aem-manual/index.html +56 -0
- data/doc/appscript-manual/01_introduction.html +94 -0
- data/doc/appscript-manual/02_aboutappscripting.html +247 -0
- data/doc/appscript-manual/03_quicktutorial.html +167 -0
- data/doc/appscript-manual/04_gettinghelp.html +188 -0
- data/doc/appscript-manual/05_keywordconversion.html +106 -0
- data/doc/appscript-manual/06_classesandenums.html +192 -0
- data/doc/appscript-manual/07_applicationobjects.html +211 -0
- data/doc/appscript-manual/08_realvsgenericreferences.html +96 -0
- data/doc/appscript-manual/09_referenceforms.html +241 -0
- data/doc/appscript-manual/10_referenceexamples.html +154 -0
- data/doc/appscript-manual/11_applicationcommands.html +245 -0
- data/doc/appscript-manual/12_commandexamples.html +138 -0
- data/doc/appscript-manual/13_performanceissues.html +142 -0
- data/doc/appscript-manual/14_notes.html +80 -0
- data/doc/appscript-manual/application_architecture.gif +0 -0
- data/doc/appscript-manual/application_architecture2.gif +0 -0
- data/doc/appscript-manual/finder_to_textedit_event.gif +0 -0
- data/doc/appscript-manual/index.html +62 -0
- data/doc/appscript-manual/relationships_example.gif +0 -0
- data/doc/appscript-manual/ruby_to_itunes_event.gif +0 -0
- data/doc/full.css +106 -0
- data/doc/index.html +45 -0
- data/doc/mactypes-manual/01_introduction.html +54 -0
- data/doc/mactypes-manual/02_aliasclass.html +124 -0
- data/doc/mactypes-manual/03_fileurlclass.html +126 -0
- data/doc/mactypes-manual/04_unitsclass.html +100 -0
- data/doc/mactypes-manual/index.html +53 -0
- data/doc/osax-manual/01_introduction.html +67 -0
- data/doc/osax-manual/02_interface.html +147 -0
- data/doc/osax-manual/03_examples.html +73 -0
- data/doc/osax-manual/04_notes.html +61 -0
- data/doc/osax-manual/index.html +53 -0
- data/doc/rb-appscript-logo.png +0 -0
- data/extconf.rb +65 -0
- data/rb-scpt.gemspec +14 -0
- data/sample/AB_export_vcard.rb +31 -0
- data/sample/AB_list_people_with_emails.rb +13 -0
- data/sample/Add_iCal_event.rb +21 -0
- data/sample/Create_daily_iCal_todos.rb +75 -0
- data/sample/Export_Address_Book_phone_numbers.rb +59 -0
- data/sample/Hello_world.rb +21 -0
- data/sample/List_iTunes_playlist_names.rb +11 -0
- data/sample/Make_Mail_message.rb +33 -0
- data/sample/Open_file_in_TextEdit.rb +13 -0
- data/sample/Organize_Mail_messages.rb +61 -0
- data/sample/Print_folder_tree.rb +16 -0
- data/sample/Select_all_HTML_files.rb +14 -0
- data/sample/Set_iChat_status.rb +24 -0
- data/sample/Simple_Finder_GUI_Scripting.rb +18 -0
- data/sample/Stagger_Finder_windows.rb +25 -0
- data/sample/TextEdit_demo.rb +130 -0
- data/sample/iTunes_top40_to_html.rb +71 -0
- data/src/SendThreadSafe.c +380 -0
- data/src/SendThreadSafe.h +139 -0
- data/src/lib/_aem/aemreference.rb +1022 -0
- data/src/lib/_aem/codecs.rb +662 -0
- data/src/lib/_aem/connect.rb +205 -0
- data/src/lib/_aem/encodingsupport.rb +77 -0
- data/src/lib/_aem/findapp.rb +85 -0
- data/src/lib/_aem/mactypes.rb +251 -0
- data/src/lib/_aem/send.rb +279 -0
- data/src/lib/_aem/typewrappers.rb +59 -0
- data/src/lib/_appscript/defaultterminology.rb +277 -0
- data/src/lib/_appscript/referencerenderer.rb +245 -0
- data/src/lib/_appscript/reservedkeywords.rb +116 -0
- data/src/lib/_appscript/safeobject.rb +249 -0
- data/src/lib/_appscript/terminology.rb +471 -0
- data/src/lib/aem.rb +253 -0
- data/src/lib/appscript.rb +1075 -0
- data/src/lib/kae.rb +1489 -0
- data/src/lib/osax.rb +659 -0
- data/src/rbae.c +979 -0
- data/test/README +3 -0
- data/test/test_aemreference.rb +118 -0
- data/test/test_appscriptcommands.rb +152 -0
- data/test/test_appscriptreference.rb +106 -0
- data/test/test_codecs.rb +186 -0
- data/test/test_findapp.rb +26 -0
- data/test/test_mactypes.rb +79 -0
- data/test/test_osax.rb +54 -0
- data/test/testall.sh +10 -0
- metadata +145 -0
@@ -0,0 +1,245 @@
|
|
1
|
+
#
|
2
|
+
# rb-appscript
|
3
|
+
#
|
4
|
+
# referencerenderer -- obtain an appscript-style string representation of an aem reference
|
5
|
+
#
|
6
|
+
|
7
|
+
require "_aem/aemreference"
|
8
|
+
|
9
|
+
|
10
|
+
class ReferenceRenderer
|
11
|
+
# Generates string representations of appscript references from aem object specifiers.
|
12
|
+
|
13
|
+
private_class_method :new
|
14
|
+
attr_reader :result
|
15
|
+
|
16
|
+
def initialize(app_data)
|
17
|
+
@_app_data = app_data
|
18
|
+
@result = ""
|
19
|
+
end
|
20
|
+
|
21
|
+
def _format(val)
|
22
|
+
if val.is_a?(AEMReference::Query)
|
23
|
+
return ReferenceRenderer.render(@_app_data, val)
|
24
|
+
else
|
25
|
+
return val.inspect
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
|
31
|
+
def property(code)
|
32
|
+
name = @_app_data.reference_by_code.fetch('p'+code) { @_app_data.reference_by_code.fetch('e'+code) }
|
33
|
+
@result += ".#{name}"
|
34
|
+
return self
|
35
|
+
end
|
36
|
+
|
37
|
+
def elements(code)
|
38
|
+
name = @_app_data.reference_by_code.fetch('e'+code) { @_app_data.reference_by_code.fetch('p'+code) }
|
39
|
+
@result += ".#{name}"
|
40
|
+
return self
|
41
|
+
end
|
42
|
+
|
43
|
+
def by_name(name)
|
44
|
+
@result += "[#{_format(name)}]"
|
45
|
+
return self
|
46
|
+
end
|
47
|
+
|
48
|
+
def by_index(index)
|
49
|
+
@result += "[#{_format(index)}]"
|
50
|
+
return self
|
51
|
+
end
|
52
|
+
|
53
|
+
def by_id(id)
|
54
|
+
@result += ".ID(#{_format(id)})"
|
55
|
+
return self
|
56
|
+
end
|
57
|
+
|
58
|
+
def by_range(sel1, sel2)
|
59
|
+
@result += "[#{_format(sel1)}, #{_format(sel2)}]"
|
60
|
+
return self
|
61
|
+
end
|
62
|
+
|
63
|
+
def by_filter(sel)
|
64
|
+
@result += "[#{_format(sel)}]"
|
65
|
+
return self
|
66
|
+
end
|
67
|
+
|
68
|
+
def previous(sel)
|
69
|
+
@result += ".previous(#{_format(@_app_data.type_by_code[sel])})"
|
70
|
+
return self
|
71
|
+
end
|
72
|
+
|
73
|
+
def next(sel)
|
74
|
+
@result += ".next(#{_format(@_app_data.type_by_code[sel])})"
|
75
|
+
return self
|
76
|
+
end
|
77
|
+
|
78
|
+
##
|
79
|
+
|
80
|
+
def custom_root(value)
|
81
|
+
app
|
82
|
+
@result += ".AS_new_reference(#{value.inspect})"
|
83
|
+
return self
|
84
|
+
end
|
85
|
+
|
86
|
+
def app
|
87
|
+
case @_app_data.constructor
|
88
|
+
when :current
|
89
|
+
@result = "app.current"
|
90
|
+
when :by_path
|
91
|
+
@result = "app(#{@_app_data.identifier.inspect})"
|
92
|
+
else
|
93
|
+
@result = "app.#{@_app_data.constructor}(#{@_app_data.identifier.inspect})"
|
94
|
+
end
|
95
|
+
return self
|
96
|
+
end
|
97
|
+
|
98
|
+
def con
|
99
|
+
@result = "con"
|
100
|
+
return self
|
101
|
+
end
|
102
|
+
|
103
|
+
def its
|
104
|
+
@result = "its"
|
105
|
+
return self
|
106
|
+
end
|
107
|
+
|
108
|
+
##
|
109
|
+
|
110
|
+
def beginning
|
111
|
+
@result += ".beginning"
|
112
|
+
return self
|
113
|
+
end
|
114
|
+
|
115
|
+
def end
|
116
|
+
@result += ".end"
|
117
|
+
return self
|
118
|
+
end
|
119
|
+
|
120
|
+
def before
|
121
|
+
@result += ".before"
|
122
|
+
return self
|
123
|
+
end
|
124
|
+
|
125
|
+
def after
|
126
|
+
@result += ".after"
|
127
|
+
return self
|
128
|
+
end
|
129
|
+
|
130
|
+
##
|
131
|
+
|
132
|
+
def first
|
133
|
+
@result += ".first"
|
134
|
+
return self
|
135
|
+
end
|
136
|
+
|
137
|
+
def middle
|
138
|
+
@result += ".middle"
|
139
|
+
return self
|
140
|
+
end
|
141
|
+
|
142
|
+
def last
|
143
|
+
@result += ".last"
|
144
|
+
return self
|
145
|
+
end
|
146
|
+
|
147
|
+
def any
|
148
|
+
@result += ".any"
|
149
|
+
return self
|
150
|
+
end
|
151
|
+
|
152
|
+
##
|
153
|
+
|
154
|
+
def gt(val)
|
155
|
+
@result += ".gt(#{_format(val)})"
|
156
|
+
return self
|
157
|
+
end
|
158
|
+
|
159
|
+
def ge(val)
|
160
|
+
@result += ".ge(#{_format(val)})"
|
161
|
+
return self
|
162
|
+
end
|
163
|
+
|
164
|
+
def eq(val)
|
165
|
+
@result += ".eq(#{_format(val)})"
|
166
|
+
return self
|
167
|
+
end
|
168
|
+
|
169
|
+
def ne(val)
|
170
|
+
@result += ".ne(#{_format(val)})"
|
171
|
+
return self
|
172
|
+
end
|
173
|
+
|
174
|
+
def lt(val)
|
175
|
+
@result += ".lt(#{_format(val)})"
|
176
|
+
return self
|
177
|
+
end
|
178
|
+
|
179
|
+
def le(val)
|
180
|
+
@result += ".le(#{_format(val)})"
|
181
|
+
return self
|
182
|
+
end
|
183
|
+
|
184
|
+
def begins_with(val)
|
185
|
+
@result += ".begins_with(#{_format(val)})"
|
186
|
+
return self
|
187
|
+
end
|
188
|
+
|
189
|
+
def ends_with(val)
|
190
|
+
@result += ".ends_with(#{_format(val)})"
|
191
|
+
return self
|
192
|
+
end
|
193
|
+
|
194
|
+
def contains(val)
|
195
|
+
@result += ".contains(#{_format(val)})"
|
196
|
+
return self
|
197
|
+
end
|
198
|
+
|
199
|
+
def is_in(val)
|
200
|
+
@result += ".is_in(#{_format(val)})"
|
201
|
+
return self
|
202
|
+
end
|
203
|
+
|
204
|
+
def and(*operands)
|
205
|
+
@result += ".and(#{(operands.map { |val| _format(val) }).join(', ')})"
|
206
|
+
return self
|
207
|
+
end
|
208
|
+
|
209
|
+
def or(*operands)
|
210
|
+
@result += ".or(#{(operands.map { |val| _format(val) }).join(', ')})"
|
211
|
+
return self
|
212
|
+
end
|
213
|
+
|
214
|
+
def not
|
215
|
+
@result += ".not"
|
216
|
+
return self
|
217
|
+
end
|
218
|
+
|
219
|
+
# public
|
220
|
+
|
221
|
+
def ReferenceRenderer.render(app_data, aem_reference)
|
222
|
+
# Take an aem reference, e.g.:
|
223
|
+
#
|
224
|
+
# app.elements('docu').by_index(1).property('ctxt')
|
225
|
+
#
|
226
|
+
# and an AppData instance containing application's location and terminology,
|
227
|
+
# and render an appscript-style reference string, e.g.:
|
228
|
+
#
|
229
|
+
# "AS.app('/Applications/TextEdit.app').documents[1].text"
|
230
|
+
#
|
231
|
+
# Used by AS::Reference#to_s
|
232
|
+
#
|
233
|
+
f = new(app_data)
|
234
|
+
begin
|
235
|
+
aem_reference.AEM_resolve(f)
|
236
|
+
return f.result
|
237
|
+
rescue
|
238
|
+
return "#{new(app_data).app.result}.AS_new_reference(#{aem_reference.inspect})"
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
end
|
243
|
+
|
244
|
+
|
245
|
+
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#
|
2
|
+
# rb-appscript
|
3
|
+
#
|
4
|
+
# reservedkeywords -- names of methods already used by Ruby's Object class
|
5
|
+
# and appscript's Reference class
|
6
|
+
#
|
7
|
+
|
8
|
+
# This list is mirrored in ch.6 of the appscript manual and in py-osaterminology's makeidentifier module
|
9
|
+
|
10
|
+
ReservedKeywords = [
|
11
|
+
"==",
|
12
|
+
"===",
|
13
|
+
"=~",
|
14
|
+
"AS_aem_reference",
|
15
|
+
"AS_aem_reference=",
|
16
|
+
"AS_app_data",
|
17
|
+
"AS_app_data=",
|
18
|
+
"AS_new_reference",
|
19
|
+
"AS_resolve",
|
20
|
+
"ID",
|
21
|
+
"[]",
|
22
|
+
"__id__",
|
23
|
+
"__send__",
|
24
|
+
"_aem_application_class",
|
25
|
+
"_call",
|
26
|
+
"_resolve_range_boundary",
|
27
|
+
"_send_command",
|
28
|
+
"abort_transaction",
|
29
|
+
"after",
|
30
|
+
"and",
|
31
|
+
"any",
|
32
|
+
"app",
|
33
|
+
"before",
|
34
|
+
"begin_transaction",
|
35
|
+
"beginning",
|
36
|
+
"begins_with",
|
37
|
+
"by_aem_app",
|
38
|
+
"by_creator",
|
39
|
+
"by_id",
|
40
|
+
"by_name",
|
41
|
+
"by_pid",
|
42
|
+
"by_url",
|
43
|
+
"class",
|
44
|
+
"clone",
|
45
|
+
"commands",
|
46
|
+
"con",
|
47
|
+
"contains",
|
48
|
+
"current",
|
49
|
+
"display",
|
50
|
+
"does_not_contain",
|
51
|
+
"does_not_end_with",
|
52
|
+
"does_not_begin_with",
|
53
|
+
"dup",
|
54
|
+
"elements",
|
55
|
+
"end",
|
56
|
+
"end_transaction",
|
57
|
+
"ends_with",
|
58
|
+
"eq",
|
59
|
+
"eql?",
|
60
|
+
"equal?",
|
61
|
+
"extend",
|
62
|
+
"first",
|
63
|
+
"freeze",
|
64
|
+
"frozen?",
|
65
|
+
"ge",
|
66
|
+
"gt",
|
67
|
+
"hash",
|
68
|
+
"help",
|
69
|
+
"id",
|
70
|
+
"ignore",
|
71
|
+
"inspect",
|
72
|
+
"instance_eval",
|
73
|
+
"instance_of?",
|
74
|
+
"instance_variable_get",
|
75
|
+
"instance_variable_set",
|
76
|
+
"instance_variables",
|
77
|
+
"is_a?",
|
78
|
+
"is_in",
|
79
|
+
"is_not_in",
|
80
|
+
"is_running?",
|
81
|
+
"its",
|
82
|
+
"keywords",
|
83
|
+
"kind_of?",
|
84
|
+
"last",
|
85
|
+
"launch",
|
86
|
+
"le",
|
87
|
+
"lt",
|
88
|
+
"method",
|
89
|
+
"method_missing",
|
90
|
+
"methods",
|
91
|
+
"middle",
|
92
|
+
"ne",
|
93
|
+
"next",
|
94
|
+
"nil?",
|
95
|
+
"not",
|
96
|
+
"object_id",
|
97
|
+
"or",
|
98
|
+
"parameters",
|
99
|
+
"previous",
|
100
|
+
"private_methods",
|
101
|
+
"properties",
|
102
|
+
"protected_methods",
|
103
|
+
"public_methods",
|
104
|
+
"respond_to?",
|
105
|
+
"result_type",
|
106
|
+
"send",
|
107
|
+
"singleton_methods",
|
108
|
+
"taint",
|
109
|
+
"tainted?",
|
110
|
+
"timeout",
|
111
|
+
"to_a",
|
112
|
+
"to_s",
|
113
|
+
"type",
|
114
|
+
"untaint",
|
115
|
+
"wait_reply",
|
116
|
+
]
|
@@ -0,0 +1,249 @@
|
|
1
|
+
#
|
2
|
+
# rb-appscript
|
3
|
+
#
|
4
|
+
# safeobject -- ensure Appscript::Reference#method_missing works reliably
|
5
|
+
#
|
6
|
+
# Original code Copyright (C) 2005 Thomas Sawyer, Jim Weirich; see below for original copyright
|
7
|
+
#
|
8
|
+
|
9
|
+
# Notes:
|
10
|
+
|
11
|
+
# A modified, updated version of basicobject (http://facets.rubyforge.org/), used to provide
|
12
|
+
# Appscript::Reference and Appscript#GenericReference with stable superclasses.
|
13
|
+
|
14
|
+
# Unfortunately, Ruby makes it ludicrously easy for users to accidentally add new methods
|
15
|
+
# to the Object class. And if these methods' names are the same as application keywords,
|
16
|
+
# Ruby will invoke them instead of Reference#method_missing, resulting in incorrect behaviour.
|
17
|
+
#
|
18
|
+
# e.g. The following code demonstrates the problem in an unpatched copy of appscript 0.2.1.
|
19
|
+
# Including modules in the main script for convenience is a not-uncommon practice; unfortunately,
|
20
|
+
# because main's class is Object, this causes the additional methods to appear on every other
|
21
|
+
# object in the system as well (very bad).
|
22
|
+
#
|
23
|
+
#######
|
24
|
+
# require 'appscript'
|
25
|
+
#
|
26
|
+
# module X
|
27
|
+
# def name
|
28
|
+
# puts 'X.name was called'
|
29
|
+
# return 999
|
30
|
+
# end
|
31
|
+
# end
|
32
|
+
# include X
|
33
|
+
#
|
34
|
+
# Appscript.app('textedit').name.get
|
35
|
+
########
|
36
|
+
#
|
37
|
+
# Result:
|
38
|
+
#
|
39
|
+
# # X.name was called
|
40
|
+
# # /tmp/tmpscript:13: undefined method `get' for 999:Fixnum (NoMethodError)
|
41
|
+
|
42
|
+
# The AS_SafeObject class undefines any methods not on the EXCLUDE safe list; traps are
|
43
|
+
# then applied to Module#method_added and Module#included to detect any subsequent
|
44
|
+
# method additions and immediately remove those from AS_SafeObject as well.
|
45
|
+
|
46
|
+
# Having to insert traps into other users' runtimes isn't exactly an ideal solution, but
|
47
|
+
# unless/until Ruby comes up with a safe, sane system for including modules in main that
|
48
|
+
# doesn't pollute every other namespace as well, it may be the only practical solution. The
|
49
|
+
# only other alternative would be a major redesign+rewrite of the appscript module to use
|
50
|
+
# metaclasses (c.f. js-appscript) instead of method_missing, but this is not really desireable
|
51
|
+
# as it'd be much more complicated to implement, slower to initialise, and less elegant to
|
52
|
+
# use (since GenericReferences would have to be dropped).
|
53
|
+
|
54
|
+
######################################################################
|
55
|
+
# ORIGINAL COPYRIGHT
|
56
|
+
######################################################################
|
57
|
+
|
58
|
+
# = basicobject.rb
|
59
|
+
#
|
60
|
+
# == Copyright (c) 2005 Thomas Sawyer, Jim Weirich
|
61
|
+
#
|
62
|
+
# THE RUBY LICENSE
|
63
|
+
# (http://www.ruby-lang.org/en/LICENSE.txt)
|
64
|
+
#
|
65
|
+
# You may redistribute this software and/or modify it under either the terms of
|
66
|
+
# the GPL (see below), or the conditions below:
|
67
|
+
#
|
68
|
+
# 1. You may make and give away verbatim copies of the source form of the
|
69
|
+
# software without restriction, provided that you duplicate all of the
|
70
|
+
# original copyright notices and associated disclaimers.
|
71
|
+
#
|
72
|
+
# 2. You may modify your copy of the software in any way, provided that
|
73
|
+
# you do at least ONE of the following:
|
74
|
+
#
|
75
|
+
# a) place your modifications in the Public Domain or otherwise
|
76
|
+
# make them Freely Available, such as by posting said
|
77
|
+
# modifications to Usenet or an equivalent medium, or by allowing
|
78
|
+
# the author to include your modifications in the software.
|
79
|
+
#
|
80
|
+
# b) use the modified software only within your corporation or
|
81
|
+
# organization.
|
82
|
+
#
|
83
|
+
# c) rename any non-standard executables so the names do not conflict
|
84
|
+
# with standard executables, which must also be provided.
|
85
|
+
#
|
86
|
+
# d) make other distribution arrangements with the author.
|
87
|
+
#
|
88
|
+
# 3. You may distribute the software in object code or executable
|
89
|
+
# form, provided that you do at least ONE of the following:
|
90
|
+
#
|
91
|
+
# a) distribute the executables and library files of the software,
|
92
|
+
# together with instructions (in the manual page or equivalent)
|
93
|
+
# on where to get the original distribution.
|
94
|
+
#
|
95
|
+
# b) accompany the distribution with the machine-readable source of
|
96
|
+
# the software.
|
97
|
+
#
|
98
|
+
# c) give non-standard executables non-standard names, with
|
99
|
+
# instructions on where to get the original software distribution.
|
100
|
+
#
|
101
|
+
# d) make other distribution arrangements with the author.
|
102
|
+
#
|
103
|
+
# 4. You may modify and include the part of the software into any other
|
104
|
+
# software (possibly commercial). But some files in the distribution
|
105
|
+
# are not written by the author, so that they are not under these terms.
|
106
|
+
#
|
107
|
+
# For the list of those files and their copying conditions, see the
|
108
|
+
# file LEGAL.
|
109
|
+
#
|
110
|
+
# 5. The scripts and library files supplied as input to or produced as
|
111
|
+
# output from the software do not automatically fall under the
|
112
|
+
# copyright of the software, but belong to whomever generated them,
|
113
|
+
# and may be sold commercially, and may be aggregated with this
|
114
|
+
# software.
|
115
|
+
#
|
116
|
+
# 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
117
|
+
# IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
118
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
119
|
+
# PURPOSE.
|
120
|
+
|
121
|
+
######################################################################
|
122
|
+
# PUBLIC
|
123
|
+
######################################################################
|
124
|
+
|
125
|
+
require '_appscript/reservedkeywords'
|
126
|
+
|
127
|
+
class AS_SafeObject
|
128
|
+
|
129
|
+
EXCLUDE = ReservedKeywords + [
|
130
|
+
"Array",
|
131
|
+
"Float",
|
132
|
+
"Integer",
|
133
|
+
"String",
|
134
|
+
"`",
|
135
|
+
"abort",
|
136
|
+
"at_exit",
|
137
|
+
"autoload",
|
138
|
+
"autoload?",
|
139
|
+
"binding",
|
140
|
+
"block_given?",
|
141
|
+
"callcc",
|
142
|
+
"caller",
|
143
|
+
"catch",
|
144
|
+
"chomp",
|
145
|
+
"chomp!",
|
146
|
+
"chop",
|
147
|
+
"chop!",
|
148
|
+
"eval",
|
149
|
+
"exec",
|
150
|
+
"exit",
|
151
|
+
"exit!",
|
152
|
+
"fail",
|
153
|
+
"fork",
|
154
|
+
"format",
|
155
|
+
"getc",
|
156
|
+
"gets",
|
157
|
+
"global_variables",
|
158
|
+
"gsub",
|
159
|
+
"gsub!",
|
160
|
+
"initialize",
|
161
|
+
"initialize_copy",
|
162
|
+
"iterator?",
|
163
|
+
"lambda",
|
164
|
+
"load",
|
165
|
+
"local_variables",
|
166
|
+
"loop",
|
167
|
+
"open",
|
168
|
+
"p",
|
169
|
+
"print",
|
170
|
+
"printf",
|
171
|
+
"proc",
|
172
|
+
"putc",
|
173
|
+
"puts",
|
174
|
+
"raise",
|
175
|
+
"rand",
|
176
|
+
"readline",
|
177
|
+
"readlines",
|
178
|
+
"remove_instance_variable",
|
179
|
+
"require",
|
180
|
+
"scan",
|
181
|
+
"select",
|
182
|
+
"set_trace_func",
|
183
|
+
"singleton_method_added",
|
184
|
+
"singleton_method_removed",
|
185
|
+
"singleton_method_undefined",
|
186
|
+
"sleep",
|
187
|
+
"split",
|
188
|
+
"sprintf",
|
189
|
+
"srand",
|
190
|
+
"sub",
|
191
|
+
"sub!",
|
192
|
+
"syscall",
|
193
|
+
"system",
|
194
|
+
"test",
|
195
|
+
"throw",
|
196
|
+
"trace_var",
|
197
|
+
"trap",
|
198
|
+
"untrace_var",
|
199
|
+
"warn"
|
200
|
+
] + [
|
201
|
+
/^__/, /^instance_/, /^object_/, /\?$/, /^\W$/,
|
202
|
+
]
|
203
|
+
|
204
|
+
def self.hide(name)
|
205
|
+
case name.to_s # Ruby1.9 returns method names as symbols, not strings as in 1.8
|
206
|
+
when *EXCLUDE
|
207
|
+
else
|
208
|
+
undef_method(name) rescue nil
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
public_instance_methods(true).each { |m| hide(m) }
|
213
|
+
#private_instance_methods(true).each { |m| hide(m) }
|
214
|
+
protected_instance_methods(true).each { |m| hide(m) }
|
215
|
+
|
216
|
+
end
|
217
|
+
|
218
|
+
|
219
|
+
|
220
|
+
######################################################################
|
221
|
+
# PRIVATE
|
222
|
+
######################################################################
|
223
|
+
# Since Ruby is very dynamic, methods added to the ancestors of
|
224
|
+
# AS_SafeObject after AS_SafeObject is defined will show up in the
|
225
|
+
# list of available AS_SafeObject methods. We handle this by defining
|
226
|
+
# hooks in Module that will hide any defined.
|
227
|
+
|
228
|
+
class Module
|
229
|
+
madded = method(:method_added)
|
230
|
+
define_method(:method_added) do |name|
|
231
|
+
# puts "ADDED %-32s %s" % [name, self]
|
232
|
+
result = madded.call(name)
|
233
|
+
if self == Object
|
234
|
+
AS_SafeObject.hide(name)
|
235
|
+
end
|
236
|
+
return result
|
237
|
+
end
|
238
|
+
mincluded = method(:included)
|
239
|
+
define_method(:included) do |mod|
|
240
|
+
result = mincluded.call(mod)
|
241
|
+
# puts "INCLUDED %-32s %s" % [mod, self]
|
242
|
+
if mod == Object
|
243
|
+
public_instance_methods(true).each { |name| AS_SafeObject.hide(name) }
|
244
|
+
#private_instance_methods(true).each { |name| AS_SafeObject.hide(name) }
|
245
|
+
protected_instance_methods(true).each { |name| AS_SafeObject.hide(name) }
|
246
|
+
end
|
247
|
+
return result
|
248
|
+
end
|
249
|
+
end
|