Module: Kernel

Defined in:
lib/story_teller/kernel.rb

Overview

The Kernel module

Defined Under Namespace

Classes: Cache

Constant Summary collapse

Index =
Cache.new({}, {})
NamespaceDelimiterPattern =
%r{::}.freeze
JavaPattern =
%r{java}.freeze
DefineNewRand =
%(alias :original_rand :rand
def rand(ignore=0)
  %<n>s
end
).freeze
ResetOriginalRand =
%(alias :rand :original_rand
remove_method :original_rand
).freeze

Instance Method Summary collapse

Instance Method Details

#attempt_twice(&_block) ⇒ Object

rubocop: disable Metrics/MethodLength



134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/story_teller/kernel.rb', line 134

def attempt_twice(&_block)
  tries ||= 2
  return yield
rescue StandardError => e
  tries -= 1
  if tries > 0
    log.warn e.message
    retry
  else
    log.error e
    return nil
  end
end

#Attribute(attribute) ⇒ Object



38
39
40
# File 'lib/story_teller/kernel.rb', line 38

def Attribute(attribute)
  StoryTeller::Library::Directives.Attribute(attribute)
end

#child(obj = nil) ⇒ Object



298
299
300
301
302
303
# File 'lib/story_teller/kernel.rb', line 298

def child(obj = nil)
  return nil if obj.nil?
  return nil unless obj.respond_to?(:child)
  obj.refresh if obj.respond_to?(:refresh)
  obj.child.refresh
end

#children(obj = nil, prop = :@children) ⇒ Object



337
338
339
340
341
342
343
344
345
346
# File 'lib/story_teller/kernel.rb', line 337

def children(obj = nil, prop = :@children)
  return 0 if obj.nil?
  obj.refresh if obj.respond_to?(:refresh)
  if defined? db
  return db.run('SELECT count(id) from "object" where parent_id = ' + obj.id) unless sysobj?
  end
  return obj.instance_variable_get(prop).length if obj.instance_variable_defined?(prop)
  return unless obj.respond_to?(:children)
  obj.children.length
end

#class_loaderObject



178
179
180
# File 'lib/story_teller/kernel.rb', line 178

def class_loader
  JRuby.runtime.jruby_class_loader
end

#collect_garbageObject

rubocop: disable Metrics/AbcSize



207
208
209
210
211
212
213
214
215
216
# File 'lib/story_teller/kernel.rb', line 207

def collect_garbage
  java.lang.System.gc()
  sleep 0.1
  java.lang.System.runFinalization()
  sleep 0.1
rescue java.lang.Throwable => e
  log.error "Unexpected java error invoking garbage collection: #{e}", e
rescue StandardError => e
  log.error "Unexpected error invoking garbage collection: #{e}", e
end

#Constant(property, value) ⇒ Object



50
51
52
# File 'lib/story_teller/kernel.rb', line 50

def Constant(property, value)
  StoryTeller::Library::Directives.Constant(property, value)
end

#Default(property, value) ⇒ Object



46
47
48
# File 'lib/story_teller/kernel.rb', line 46

def Default(property, value)
  StoryTeller::Library::Directives.Default(property, value)
end

#destroy(obj = nil) ⇒ Object



348
349
350
351
352
353
354
# File 'lib/story_teller/kernel.rb', line 348

def destroy(obj = nil)
  return if obj.nil?
  return unless obj.respond_to?(:has?)
  return if obj.has? :prized
  return unless obj.respond_to?(:destroy)
  obj.destroy
end

#find_class(class_name) ⇒ Object



126
127
128
129
130
# File 'lib/story_teller/kernel.rb', line 126

def find_class(class_name)
  klass = Index.classes[class_name]
  klass ||= get_constant(class_name)
  Index.classes[class_name] = klass
end

#find_module(module_name) ⇒ Object



114
115
116
117
118
119
120
121
122
123
# File 'lib/story_teller/kernel.rb', line 114

def find_module(module_name)
  module_name = "::#{module_name}" unless NamespaceDelimiterPattern.match?(module_name)
  mod = Index.modules[module_name]
  # TODO: Test
  # return mod if mod.is_a?(Module)

  mod ||= get_constant(module_name)
  return nil if mod.is_a?(Class)
  Index.modules[module_name] = mod
end

#get_constant(constant_name, target = Object) ⇒ Object

rubocop: disable Metrics/MethodLength



94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/story_teller/kernel.rb', line 94

def get_constant(constant_name, target = Object)
  constant = nil
  begin
    constant = target.const_get(constant_name)
  rescue NameError => e
    log.error "Undefined constant #{constant_name}: #{e}", e
  rescue SyntaxError => e
    log.error "Unexpected syntax error getting constant #{constant_name}", e
  rescue StandardError => e
    log.error "Unexpected error getting constant #{constant_name}", e
  end
  constant
end

#give(obj = nil, *attributes) ⇒ Object



356
357
358
359
360
# File 'lib/story_teller/kernel.rb', line 356

def give(obj = nil, *attributes)
  return if obj.nil?
  return unless obj.respond_to?(:tag)
  obj.tag(*attributes)
end

#import_global(symbol) ⇒ Object



58
59
60
# File 'lib/story_teller/kernel.rb', line 58

def import_global(symbol)
  StoryTeller::Library::Directives.import_global(symbol)
end

#Include(inclusion) ⇒ Object



33
34
35
36
# File 'lib/story_teller/kernel.rb', line 33

def Include(inclusion)
  StoryTeller::Engine.main_object = self if inclusion == "Parser"
  StoryTeller::Library::Directives.Include(inclusion)
end

#indent(stack_depth = [0, caller(2).length - 9].max) ⇒ Object



150
151
152
# File 'lib/story_teller/kernel.rb', line 150

def indent(stack_depth = [0, caller(2).length - 9].max)
  '  ' * stack_depth
end

#java?Boolean

Returns:

  • (Boolean)


194
195
196
# File 'lib/story_teller/kernel.rb', line 194

def java?
  JavaPattern.match?(RUBY_PLATFORM)
end

#jump(symbol) ⇒ Object



272
273
274
# File 'lib/story_teller/kernel.rb', line 272

def jump(symbol)
  throw symbol
end

#kneel(obj) ⇒ Object



399
400
401
402
403
# File 'lib/story_teller/kernel.rb', line 399

def kneel(obj)
  give obj, :kneeling unless obj.has? :kneeling
  take obj, :sitting
  take obj, :prone
end

#label(symbol, &_block) ⇒ Object



262
263
264
265
266
267
268
269
# File 'lib/story_teller/kernel.rb', line 262

def label(symbol, &_block)
  loop do
    catch symbol do
      yield
      break
    end
  end
end


54
55
56
# File 'lib/story_teller/kernel.rb', line 54

def Link(link)
  StoryTeller::Library::Directives.Link(link)
end

#load_serviceObject



183
184
185
# File 'lib/story_teller/kernel.rb', line 183

def load_service
  JRuby.runtime.load_service
end

#memory_usageObject



199
200
201
202
203
# File 'lib/story_teller/kernel.rb', line 199

def memory_usage
  total_memory = java.lang.Runtime.getRuntime().totalMemory()
  free_memory = java.lang.Runtime.getRuntime().freeMemory()
  total_memory - free_memory
end

#metaclass(obj) ⇒ Object



236
237
238
# File 'lib/story_teller/kernel.rb', line 236

def metaclass(obj)
  obj.class.metaclass
end

#move(obj, new_parent) ⇒ Object

rubocop: disable Metrics/AbcSize rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/PerceivedComplexity

Raises:

  • (CycleError)


371
372
373
374
375
376
377
378
379
380
381
382
# File 'lib/story_teller/kernel.rb', line 371

def move(obj, new_parent)
  return if obj.nil?
  return unless new_parent.respond_to?(:<<)
  return unless new_parent.respond_to?(:in?)
  new_parent.safe_refresh if new_parent.respond_to?(:safe_refresh)
  obj.safe_refresh if obj.respond_to?(:safe_refresh)
  raise CycleError if new_parent.in? obj
  obj.remove if obj.respond_to?(:remove)
  new_parent << obj
  obj.safe_refresh if obj.respond_to?(:safe_refresh)
  new_parent.safe_refresh if new_parent.respond_to?(:safe_refresh)
end

#object_spaceObject



188
189
190
# File 'lib/story_teller/kernel.rb', line 188

def object_space
  JRuby.runtime.object_space
end

#override(replacement, method_name) ⇒ Object



277
278
279
280
281
282
283
284
285
286
287
# File 'lib/story_teller/kernel.rb', line 277

def override(replacement, method_name)
  new_method = nil
  begin
    old_method = self.instance_method(method_name)
    remove_method(method_name) if old_method.arity > 0
    new_method = define_method(replacement.to_s, old_method)
  rescue NameError => e
    log.error "Error overriding method #{method_name}: #{e}", e
  end
  new_method
end

#parent(obj = nil, prop = :@parent, &block) ⇒ Object

rubocop: disable Metrics/CyclomaticComplexity rubocop: disable Metrics/PerceivedComplexity



316
317
318
319
320
321
322
323
324
325
326
# File 'lib/story_teller/kernel.rb', line 316

def parent(obj = nil, prop = :@parent, &block)
  return nil if obj.nil?
  obj.refresh if obj.respond_to?(:refresh)
  obj_parent = nil
  obj_parent = select_parent(obj, &block) if block_given?
  obj_parent ||= obj.instance_variable_get(prop) if obj.instance_variable_defined?(prop)
  obj_parent ||= obj.parent if obj.respond_to?(:parent)
  return nil if obj_parent.nil?
  obj_parent.refresh if obj_parent.respond_to?(:refresh)
  obj_parent
end

#parent_selector(obj, &block) ⇒ Object



305
306
307
308
309
310
311
312
# File 'lib/story_teller/kernel.rb', line 305

def parent_selector(obj, &block)
  return nil if obj.nil?
  loop do
    obj = obj.parent
    break if block.call(obj)
  end
  obj
end

#Property(property_or_modifier, modifier = nil, value = nil) ⇒ Object



42
43
44
# File 'lib/story_teller/kernel.rb', line 42

def Property(property_or_modifier, modifier = nil, value = nil)
  StoryTeller::Library::Directives.Property(property_or_modifier, modifier, value)
end

#recline(obj) ⇒ Object



405
406
407
408
409
# File 'lib/story_teller/kernel.rb', line 405

def recline(obj)
  give obj, :prone unless obj.has? :prone
  take obj, :sitting
  take obj, :kneeling
end

#reload_feature(feature) ⇒ Object



166
167
168
169
170
171
172
173
174
175
# File 'lib/story_teller/kernel.rb', line 166

def reload_feature(feature)
  silence_warnings do
    # Remove a loaded feature:
    load_service.remove_internal_loaded_feature(feature)
    # Supposedly, purge old compiled script code:
    reset_runtime
    # Reload the feature:
    load_service.load(feature, true)
  end
end

#reset_constant(constant, value, target = Object) ⇒ Object



68
69
70
71
72
73
74
75
76
# File 'lib/story_teller/kernel.rb', line 68

def reset_constant(constant, value, target = Object)
  return if constant.nil?
  silence_warnings do
    target.instance_eval { const_set(constant.to_sym, value) }
  end
rescue StandardError => e
  log.error "Unexpected error resetting constant #{constant}", e
  nil
end

#reset_runtimeObject

rubocop: disable Metrics/AbcSize



156
157
158
159
160
161
162
# File 'lib/story_teller/kernel.rb', line 156

def reset_runtime
  org.jruby.Ruby.new_instance().use_as_global_runtime()
  engine = javax.script.ScriptEngineManager.new().get_engine_by_name('jruby')
  # rubocop: disable Style/RedundantInterpolation
  log.warn "#{(engine.methods - Object.instance_methods).uniq.sort.inspect}"
  # rubocop: enable Style/RedundantInterpolation
end

#return_after(*args, &block) ⇒ Object



62
63
64
65
# File 'lib/story_teller/kernel.rb', line 62

def return_after(*args, &block)
  block.call
  args.first
end

#setrandom(n) ⇒ Object



250
251
252
253
254
255
256
257
258
259
# File 'lib/story_teller/kernel.rb', line 250

def setrandom(n)
  puts "--------------------" # TODO: Remove
  puts "Before setrandom Kernel.respond_to?(:original_rand) #{Kernel.respond_to?(:original_rand)}" # TODO: Remove
  code = ResetOriginalRand if Kernel.respond_to?(:original_rand)
  code ||= format(DefineNewRand, n: n)
  log.debug "code:\n#{code}" # TODO: Remove
  Kernel.module_eval(code)
ensure
  puts "After setrandom Kernel.respond_to?(:original_rand) #{Kernel.respond_to?(:original_rand)}"
end

#sibling(obj = nil) ⇒ Object

rubocop: enable Metrics/CyclomaticComplexity rubocop: enable Metrics/PerceivedComplexity



330
331
332
333
334
335
# File 'lib/story_teller/kernel.rb', line 330

def sibling(obj = nil)
  return nil if obj.nil?
  return nil unless obj.respond_to?(:sibling)
  obj.refresh if obj.respond_to?(:refresh)
  obj.sibling.refresh
end

#silence_warnings(&_block) ⇒ Object



290
291
292
293
294
295
296
# File 'lib/story_teller/kernel.rb', line 290

def silence_warnings(&_block)
  old_verbose = $VERBOSE
  $VERBOSE = nil
  yield
ensure
  $VERBOSE = old_verbose
end

#sit(obj) ⇒ Object



393
394
395
396
397
# File 'lib/story_teller/kernel.rb', line 393

def sit(obj)
  give obj, :sitting unless obj.has? :sitting
  take obj, :kneeling
  take obj, :prone
end

#stand(obj) ⇒ Object

rubocop: enable Metrics/AbcSize rubocop: enable Metrics/CyclomaticComplexity rubocop: enable Metrics/PerceivedComplexity



387
388
389
390
391
# File 'lib/story_teller/kernel.rb', line 387

def stand(obj)
  take obj, :sitting
  take obj, :kneeling
  take obj, :prone
end

#take(obj = nil, *attributes) ⇒ Object



362
363
364
365
366
# File 'lib/story_teller/kernel.rb', line 362

def take(obj = nil, *attributes)
  return if obj.nil?
  return unless obj.respond_to?(:untag)
  obj.untag(*attributes)
end

#toggle_constant(constant, target = ::Object) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/story_teller/kernel.rb', line 79

def toggle_constant(constant, target = ::Object)
  silence_warnings do
    if target.const_defined?(constant)
      target.instance_eval { remove_const(constant) }
    else
      target.instance_eval { const_set(constant, true) }
    end
  end
rescue StandardError => e
  log.error "Unexpected error toggling constant #{constant}", e
  nil
end