inform-runtime 1.6.0 → 1.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0411c83f9c461e9b8f2687c5f27aa49591933e786f74efa489ca111b3cf9b74
4
- data.tar.gz: 582fa29d5e602c4e36a499dcc259e21391fa3982348f7fcb2196b8a740c028e3
3
+ metadata.gz: 30d774723c5ea67091209135a26685ab0e250a780e3fbadb8a1752fbda94a505
4
+ data.tar.gz: 7b40b742e14c98abeef2f5695923a502032334c61e48c00a11d53d40501442cc
5
5
  SHA512:
6
- metadata.gz: 3ccb26de6ef43e0bedeaf044b964c30ecba16e09809a5c081f32aac1acacfe1644a321cc1f9b68483f1f70496a17e72892fd55a596ba95f83cdc72011f41fa44
7
- data.tar.gz: ce1fb4b1b4993d8ff7ccd230ee141d1c5347b08c85cc9a074873ff7d66753f588289460dcf9fef0d4aababeb6c98cd09724ebb562f9dfe5381cb108ec2942c88
6
+ metadata.gz: 87cdf76656079aca4ccccee3feed0f6dfd6e9f3698b0fb8b46317996316be50a1b7ae00777cbc8ac53dbfa76c09d18bbdda152ee13842f5c5be857cbdaefb83b
7
+ data.tar.gz: a18a9f118a5ba0c17271cf9c7a2e632da133ed41d19a4bd22fd2ae8b0e3ca651439e5d79469c7ec29b2084818ff2708e971e2b36373ac9823c9875986a27772e
data/README.md CHANGED
@@ -109,7 +109,6 @@ Sun May 10 09:36:13 CDT 2026
109
109
  │ │ ├── color.rb
110
110
  │ │ ├── command.rb
111
111
  │ │ ├── context.rb
112
- │ │ ├── daemon.rb
113
112
  │ │ ├── engine.rb
114
113
  │ │ ├── events.rb
115
114
  │ │ ├── experimental
@@ -280,7 +280,7 @@ module Builtins
280
280
  def visibility_ceiling=(visibility_ceiling)
281
281
  e = Thread.current[:event]
282
282
  @visibility_ceiling = visibility_ceiling
283
- e.visibility_ceiling = visibility_ceiling if e
283
+ e.visibility_ceiling = visibility_ceiling unless e.nil?
284
284
  end
285
285
 
286
286
  def topic
@@ -288,14 +288,13 @@ module Builtins
288
288
  end
289
289
  alias text topic
290
290
 
291
- def number(x = nil)
292
- if !x.nil? && self.object? && self.defining_object?
293
- self.properties[:number] = x
291
+ def number(n = nil)
292
+ if !n.nil? && self.object? && self.defining_object?
293
+ self.properties[:number] = n
294
294
  return
295
295
  end
296
- return special_number1 if x.nil?
297
- LanguageNumber(x)
298
- ''
296
+ return special_number1 if n.nil?
297
+ capture_output { EnglishNumber(n) }
299
298
  end
300
299
 
301
300
  def special
@@ -412,10 +412,7 @@ module PrivateEventMethods
412
412
  end
413
413
 
414
414
  def handle(event, result)
415
- case result
416
- when String
417
- event.cause.println result
418
- end
415
+ event.cause.print_routine_result(result)
419
416
  end
420
417
 
421
418
  def deactivate(obj)
@@ -119,6 +119,7 @@ module Inform
119
119
  remove_module(Inform::Module.find(name: mod))
120
120
  end
121
121
  save
122
+ # TODO: Explain why the following is being done.
122
123
  i = parent(self)
123
124
  self.remove
124
125
  i << self
@@ -181,6 +181,7 @@ module Inform
181
181
 
182
182
  def remove
183
183
  @children.clear
184
+ @parent&.remove_child(self)
184
185
  @parent = nil
185
186
  end
186
187
 
@@ -19,12 +19,14 @@
19
19
  # You should have received a copy of the GNU General Public License
20
20
  # along with the StoryTeller. If not, see <http://www.gnu.org/licenses/>.
21
21
 
22
+ require 'stringio'
23
+
22
24
  # The StoryTeller module
23
25
  module StoryTeller
24
26
  # The IO module
25
27
  module IO
26
28
  class << self
27
- attr_accessor :default_output
29
+ attr_accessor :default_channel
28
30
  end
29
31
 
30
32
  def session
@@ -46,18 +48,44 @@ module StoryTeller
46
48
  subscribed_connections
47
49
  end
48
50
 
49
- def out(s)
50
- current_session = session
51
- current_session ||= inflib.session if respond_to?(:inflib) && inflib
51
+ def out(s, ch = channel(StoryTeller::IO.default_channel))
52
+ ch&.write(s)
53
+ true
54
+ end
55
+
56
+ def channel(default = nil)
57
+ overrides = Thread.current[:channel_overrides]
58
+ return overrides[self] if overrides&.key?(self)
59
+
60
+ @channel ||= current_session || default || $stdout
61
+ end
62
+
63
+ # rubocop: disable Metrics/MethodLength
64
+ def capture_output(buffer = StringIO.new)
65
+ overrides = Thread.current[:channel_overrides] ||= {}.compare_by_identity
66
+ previous = overrides[self]
67
+ had_previous = overrides.key?(self)
68
+
69
+ begin
70
+ overrides[self] = buffer
71
+ yield
72
+ buffer.string
73
+ ensure
74
+ if had_previous
75
+ overrides[self] = previous
76
+ else
77
+ overrides.delete(self)
78
+ end
79
+ end
80
+ end
81
+ # rubocop: enable Metrics/MethodLength
52
82
 
53
- if current_session
54
- current_session.write_output(s)
55
- elsif StoryTeller::IO.default_output
56
- StoryTeller::IO.default_output.write(s)
57
- else
58
- $stdout.write(s)
83
+ def current_session
84
+ session || begin
85
+ if self.respond_to?(:inflib) && !self.inflib.equal?(self)
86
+ self.inflib&.session
87
+ end
59
88
  end
60
- true
61
89
  end
62
90
 
63
91
  def inform(s = '')
@@ -96,7 +124,7 @@ module StoryTeller
96
124
  end
97
125
 
98
126
  def print_routine_result(value)
99
- return value unless value.is_a?(String)
127
+ return value unless value.is_a?(String) || value.is_a?(Array)
100
128
 
101
129
  print value
102
130
  new_line
@@ -63,6 +63,28 @@ module StoryTeller
63
63
  # rubocop: enable Metrics/AbcSize
64
64
  # rubocop: enable Metrics/MethodLength
65
65
 
66
+ # rubocop: disable Metrics/MethodLength
67
+ def Array(constant, *values)
68
+ inform_name = constant.to_sym
69
+ ruby_name = if constant.to_s.match?(/\A[A-Za-z0-9_]*\z/)
70
+ inform_name
71
+ else
72
+ constant.to_s.upcase.to_sym
73
+ end
74
+
75
+ log.debug "Setting constant ::Object.#{ruby_name} to #{values}"
76
+ log.debug " inform_name: #{inform_name}"
77
+ reset_constant(ruby_name, values, ::Object)
78
+
79
+ return values if inform_name == ruby_name
80
+
81
+ install_global_reader(inform_name, ruby_name, ::Object)
82
+ rescue StandardError => e
83
+ log.error "Unexpected error resetting constant #{constant}", e
84
+ nil
85
+ end
86
+ # rubocop: enable Metrics/MethodLength
87
+
66
88
  def Attribute(attribute)
67
89
  StoryTeller::Library.declarations.add_attribute(attribute)
68
90
  end
@@ -88,11 +110,13 @@ module StoryTeller
88
110
  target.const_get(ruby_name)
89
111
  rescue RuntimeError => _e
90
112
  # Ignore error
113
+ value
91
114
  rescue StandardError => _e
92
115
  # Ignore error
116
+ value
93
117
  end
94
118
 
95
- reset_constant(ruby_name, value, target) if value.nil?
119
+ reset_constant(ruby_name, value, target) unless value.nil?
96
120
 
97
121
  return value if inform_name == ruby_name
98
122
 
@@ -126,7 +150,7 @@ module StoryTeller
126
150
  # rubocop: enable Metrics/MethodLength
127
151
 
128
152
  def install_global_reader(inform_name, ruby_name, target = ::Object)
129
- reader = -> { target.target.instance_eval { const_get(ruby_name) } }
153
+ reader = -> { target.instance_eval { const_get(ruby_name) } }
130
154
 
131
155
  Kernel.define_method(inform_name, &reader)
132
156
  Kernel.send(:private, inform_name)
@@ -165,26 +165,29 @@ class Logger
165
165
  end
166
166
  end
167
167
 
168
- # Add extra severity to the standard Logger class.
169
- # Also add support for including backtraces implicitly.
170
- class ExtraLogger < Logger
171
- alias original_error error
172
- def error(error_or_message = nil, error = nil, &block)
173
- return log_error(error_or_message, &block) if error.nil?
174
-
175
- original_error(TraceHelpers.generate_message(error_or_message, error))
176
- TraceHelpers.extract_backtrace(error, []).each do |trace|
177
- original_error(trace) unless trace.nil?
168
+ # module LoggerErrorBacktrace
169
+ module LoggerErrorBacktrace
170
+ def error(message = nil, error = nil, &block)
171
+ if message.respond_to?(:message)
172
+ error = message
173
+ message = error.message
178
174
  end
179
- end
180
175
 
181
- def log_error(error_or_message = nil, &block)
182
- original_error(error_or_message, &block)
183
- TraceHelpers.extract_backtrace(error_or_message, []).each do |trace|
184
- original_error(trace) unless trace.nil?
176
+ result = super(message, &block)
177
+
178
+ TraceHelpers.extract_backtrace(error)&.each do |trace|
179
+ add(Logger::ERROR, trace)
185
180
  end
181
+
182
+ result
186
183
  end
184
+ end
185
+
186
+ Logger.include(LoggerErrorBacktrace)
187
187
 
188
+ # Add extra severity to the standard Logger class.
189
+ # Also add support for including backtraces implicitly.
190
+ module TraceLogging
188
191
  SEV_LABEL_EXTRA = (Logger::SEV_LABEL + %w(TRACE)).freeze
189
192
  def format_severity(severity)
190
193
  SEV_LABEL_EXTRA[severity] || super
@@ -195,6 +198,8 @@ class ExtraLogger < Logger
195
198
  end
196
199
  end
197
200
 
201
+ Logger.include(TraceLogging)
202
+
198
203
  # The LoggingHelpers module
199
204
  module LoggingHelpers
200
205
  if defined?(Java)
@@ -221,7 +226,7 @@ module LoggingHelpers
221
226
  def init_ruby_logger(obj, level = nil, logger_name = nil, source_location = nil)
222
227
  logger_name = get_formatted_logger_name(obj, logger_name)
223
228
  logger_name = source_location.split(FORWARD_SLASH_PATTERN).last if logger_name.empty?
224
- log = ExtraLogger.new($stdout, progname: logger_name)
229
+ log = Logger.new($stdout, progname: logger_name)
225
230
  log.level = normalize_ruby_log_level(level) unless level.nil?
226
231
  log.formatter = method(:ruby_log_formatter)
227
232
  log
@@ -212,7 +212,7 @@ class Session
212
212
  @outbound = sink
213
213
  end
214
214
 
215
- def write_output(value)
215
+ def write(value)
216
216
  @output.write(value)
217
217
  end
218
218
 
@@ -139,14 +139,6 @@ module StdLib
139
139
 
140
140
  def StatusLineHeight; end
141
141
 
142
- def ScoreSub
143
- false
144
- end
145
-
146
- def FullScoreSub
147
- false
148
- end
149
-
150
142
  def Message(*args)
151
143
  println(args[:fatalerror] || args.values.first)
152
144
  end
@@ -23,7 +23,7 @@
23
23
  module StoryTeller
24
24
  # module Engine
25
25
  module Engine
26
- VERSION = '1.6.0'.freeze
26
+ VERSION = '1.6.2'.freeze
27
27
  end
28
28
  end
29
29
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inform-runtime
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nels Nelson
@@ -43,14 +43,14 @@ dependencies:
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.1.4
46
+ version: 0.1.5
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: 0.1.4
53
+ version: 0.1.5
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: logger
56
56
  requirement: !ruby/object:Gem::Requirement