[Code] Locking down the API
-
From this post - just another in a long series of similar posts I did a wee experiment:
!!!!!API-LockDown.rb
<span class="syntaxdefault"><br />require </span><span class="syntaxstring">'sketchup.rb'<br /></span><span class="syntaxdefault">require </span><span class="syntaxstring">'extensions.rb'<br /></span><span class="syntaxdefault">require </span><span class="syntaxstring">'langhandler.rb'<br /><br /></span><span class="syntaxkeyword">Array.</span><span class="syntaxdefault">freeze<br />Bignum</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Binding</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Comparable</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Continuation</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Data</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Dir</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Enumerable</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Exception</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />FalseClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />File</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />FileTest</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Fixnum</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Float</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Geom</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Hash</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />IO</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Integer</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Interrupt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Kernel.freeze<br /></span><span class="syntaxdefault">LanguageHandler</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Length</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Marshal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />MatchData</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Math</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Method</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Module.freeze<br /></span><span class="syntaxdefault">NilClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Numeric</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span><span class="syntaxcomment">#Object.freeze<br /></span><span class="syntaxdefault">Precision</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Proc</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Process</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Range</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Regexp</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SKSocket</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Set</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Signal</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SignalException</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SketchupExtension</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />String</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Struct</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Symbol</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />SystemExit</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Test</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Thread</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />ThreadGroup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />Time</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />TrueClass</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />UI</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br />UnboundMethod</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">freeze<br /></span>
After I placed this in the plugins folder, ensuring it's alphabetically first, I would get errors for every plugin that tries to mess around with Ruby's base classes and SketchUp's own classes.
With a plain vanilla installation in SU7 I get errors with Dynamic Components. Because it tries to add methods to the SketchUp classes.
The list was compiled from the root modules/classes of plain vanilla SketchUp7. I removed the sub-classes/modules and also the Error classes.
This can be useful in debugging - as you completely lock down the core of SU's API - preventing changes from other plugins. Saves you from looking into every RB files installed. And also catches whatever RBS files might try to do. (Though I'm not sure what error message you get then - if it's of any use.)
As you see, Kernel, Object, Class and Module is not frozen - that just cause havoc. There might be more classes that should not be frozen - I don't know. Haven't tested yet.
I would not freeze modules and classes in production code! This is just for personal debugging!
-
@thomthom said:
... I get errors with Dynamic Components. Because it tries to add methods to the SketchUp classes.
It NEEDS to modify several classes, so you will need to add a
require('dynamiccomponents.rb')
at the top of the file, before freezing.You can shorten the file using
ObjectSpace.each_object()
iterators:Freezes the 93 API modules and classes:
# Freeze the 93 API modules and classes; ObjectSpace.each_object(Module) {|o| o.freeze if o.name =~ /DC|Dynamic|Geom|Sketchup|UI/ }
-
@dan rathbun said:
You can shorten the file using
ObjectSpace.each_object()
iterators:I'm locking down more than the API - also the Ruby core classes.
@dan rathbun said:
It NEEDS to modify several classes, so you will need to add a require('dynamiccomponents.rb') at the top of the file, before freezing.
Well, "needs"... ...they chose to. But yes. One adds exceptions as one pleases. This list is just a boilerplate lock-down.
Advertisement