inform-runtime 1.2.2 → 1.3.1

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.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +33 -41
  3. data/lib/story_teller/articles.rb +2 -1
  4. data/lib/story_teller/builtins.rb +63 -10
  5. data/lib/story_teller/color.rb +2 -1
  6. data/lib/story_teller/command.rb +4 -1
  7. data/lib/story_teller/context.rb +23 -27
  8. data/lib/story_teller/daemon.rb +2 -2
  9. data/lib/story_teller/engine.rb +80 -16
  10. data/lib/story_teller/events.rb +9 -2
  11. data/lib/story_teller/experimental/handler_dsl.rb +1 -16
  12. data/lib/story_teller/experimental/reverse_engineer_class.rb +1 -1
  13. data/lib/story_teller/grammar_parser.rb +60 -13
  14. data/lib/story_teller/helpers.rb +8 -18
  15. data/lib/story_teller/history.rb +2 -1
  16. data/lib/story_teller/inflector.rb +4 -2
  17. data/lib/story_teller/inform/ephemeral/link.rb +63 -31
  18. data/lib/story_teller/inform/ephemeral/module.rb +6 -5
  19. data/lib/story_teller/inform/ephemeral/object.rb +223 -236
  20. data/lib/story_teller/inform/ephemeral/tag.rb +27 -14
  21. data/lib/story_teller/io.rb +99 -49
  22. data/lib/story_teller/kernel.rb +13 -5
  23. data/lib/story_teller/library/bootstrap.rb +10 -27
  24. data/lib/story_teller/library/declarations.rb +1 -1
  25. data/lib/story_teller/library/directives.rb +1 -1
  26. data/lib/story_teller/library/loader.rb +4 -20
  27. data/lib/story_teller/library/location.rb +9 -3
  28. data/lib/story_teller/library.rb +1 -1
  29. data/lib/story_teller/logging.rb +165 -67
  30. data/lib/story_teller/mixins.rb +11 -4
  31. data/lib/story_teller/plurals.rb +2 -1
  32. data/lib/story_teller/privileges.rb +117 -0
  33. data/lib/story_teller/prototype.rb +158 -32
  34. data/lib/story_teller/publication.rb +2 -1
  35. data/lib/story_teller/session.rb +115 -25
  36. data/lib/story_teller/stdlib.rb +232 -2
  37. data/lib/story_teller/subscription.rb +2 -1
  38. data/lib/story_teller/tree.rb +2 -1
  39. data/lib/story_teller/version.rb +2 -2
  40. data/lib/story_teller/world_tree.rb +21 -23
  41. data/lib/story_teller.rb +18 -5
  42. metadata +7 -10
  43. data/lib/story_teller/core.rb +0 -38
  44. data/lib/story_teller/ephemeral_adapter.rb +0 -40
  45. data/lib/story_teller/inform/base.rb +0 -160
  46. data/lib/story_teller/model_adapter.rb +0 -132
@@ -1,160 +0,0 @@
1
- # lib/story_teller/inform/base.rb
2
- # encoding: utf-8
3
- # frozen_string_literal: false
4
-
5
- # Copyright Nels Nelson 2008-2026 but freely usable (see license)
6
- #
7
- # This file is part of StoryTeller.
8
- #
9
- # The StoryTeller is free software: you can redistribute it and/or
10
- # modify it under the terms of the GNU General Public License as published
11
- # by the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # The StoryTeller is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with the StoryTeller. If not, see <http://www.gnu.org/licenses/>.
21
-
22
- # module Inform
23
- module Inform
24
- # module AdapterClassDelegation
25
- module AdapterClassDelegation
26
- def delegated_adapter_class
27
- klass = adapter_class
28
- klass.equal?(self) ? nil : klass
29
- rescue NotImplementedError
30
- nil
31
- end
32
-
33
- def ===(other)
34
- klass = delegated_adapter_class
35
- super || (!klass.nil? && other.is_a?(klass))
36
- end
37
-
38
- def method_missing(method_name, *args, **kwargs, &block)
39
- klass = delegated_adapter_class
40
- return klass.public_send(method_name, *args, **kwargs, &block) if !klass.nil? && klass.respond_to?(method_name)
41
-
42
- super
43
- end
44
-
45
- def respond_to_missing?(method_name, include_private = false)
46
- klass = delegated_adapter_class
47
- (!klass.nil? && klass.respond_to?(method_name, include_private)) || super
48
- end
49
- end
50
-
51
- # class Object
52
- class Object
53
- class << self
54
- include AdapterClassDelegation
55
-
56
- def adapter_class
57
- StoryTeller::ModelAdapter.object_class
58
- end
59
-
60
- def new(*args, **kwargs, &block)
61
- return super unless equal?(Inform::Object)
62
-
63
- StoryTeller::ModelAdapter.object_class!.new(*args, **kwargs, &block)
64
- end
65
-
66
- def build(*args, **kwargs, &block)
67
- if equal?(Inform::Object)
68
- StoryTeller::ModelAdapter.object_class!.new(*args, **kwargs, &block)
69
- else
70
- super
71
- end
72
- end
73
-
74
- def create(*args, **kwargs, &block)
75
- if equal?(Inform::Object)
76
- StoryTeller::ModelAdapter.object_class!.create(*args, **kwargs, &block)
77
- else
78
- new(*args, **kwargs, &block)
79
- end
80
- end
81
-
82
- def fetch_or_create_by_name(*args, **kwargs, &block)
83
- if equal?(Inform::Object)
84
- StoryTeller::ModelAdapter.object_class!.fetch_or_create_by_name(*args, **kwargs, &block)
85
- else
86
- super
87
- end
88
- end
89
-
90
- def all(*args, **kwargs, &block)
91
- if equal?(Inform::Object)
92
- StoryTeller::ModelAdapter.object_class!.all(*args, **kwargs, &block)
93
- else
94
- super
95
- end
96
- end
97
- end
98
- end
99
- # class Object
100
-
101
- # class Tag
102
- class Tag
103
- class << self
104
- include AdapterClassDelegation
105
-
106
- def adapter_class
107
- StoryTeller::ModelAdapter.tag_class
108
- end
109
-
110
- def new(*args, &block)
111
- return super unless equal?(Inform::Tag)
112
-
113
- StoryTeller::ModelAdapter.tag_class!.new(*args, &block)
114
- end
115
- end
116
- end
117
-
118
- # class Link
119
- class Link
120
- class << self
121
- include AdapterClassDelegation
122
-
123
- def adapter_class
124
- StoryTeller::ModelAdapter.link_class
125
- end
126
-
127
- def new(*args, &block)
128
- return super unless equal?(Inform::Link)
129
-
130
- StoryTeller::ModelAdapter.link_class!.new(*args, &block)
131
- end
132
- end
133
- end
134
-
135
- # class Module
136
- class Module
137
- class << self
138
- include AdapterClassDelegation
139
-
140
- def adapter_class
141
- StoryTeller::ModelAdapter.module_class
142
- end
143
-
144
- def new(*args, &block)
145
- return super unless equal?(Inform::Module)
146
-
147
- StoryTeller::ModelAdapter.module_class!.new(*args, &block)
148
- end
149
- end
150
- end
151
-
152
- # class Tagged
153
- class Tagged
154
- end
155
-
156
- # class Modularized
157
- class Modularized
158
- end
159
- end
160
- # module Inform
@@ -1,132 +0,0 @@
1
- # lib/story_teller/model_adapter.rb
2
- # encoding: utf-8
3
- # frozen_string_literal: false
4
-
5
- # Copyright Nels Nelson 2008-2026 but freely usable (see license)
6
- #
7
- # This file is part of StoryTeller.
8
- #
9
- # StoryTeller is free software: you can redistribute it and/or
10
- # modify it under the terms of the GNU General Public License as published
11
- # by the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # StoryTeller is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU General Public License
20
- # along with StoryTeller. If not, see <http://www.gnu.org/licenses/>.
21
-
22
- # The StoryTeller module
23
- module StoryTeller
24
- # The ModelAdapter module
25
- module ModelAdapter
26
- RequiredAdapterKeys = %i[name object_class tag_class link_class module_class].freeze
27
- ExcludedObjectModelModuleNames = ['Inform::Context'].freeze
28
-
29
- Registry = Struct.new(:memo).new(nil)
30
-
31
- def current
32
- Registry.memo
33
- end
34
- module_function :current
35
-
36
- def current=(adapter)
37
- Registry.memo = adapter
38
- end
39
- module_function :current=
40
-
41
- def register!(adapter)
42
- validate!(adapter)
43
- adapt_object_class!(adapter.fetch(:object_class))
44
- self.current = adapter.freeze
45
- end
46
- module_function :register!
47
-
48
- def validate!(adapter)
49
- missing = RequiredAdapterKeys.reject { |key| adapter.key?(key) }
50
- raise ArgumentError, "Model adapter is missing keys: #{missing.join(', ')}" unless missing.empty?
51
-
52
- %i[object_class tag_class link_class module_class].each do |key|
53
- value = adapter.fetch(key)
54
- next if value.is_a?(Class)
55
-
56
- raise ArgumentError, "Model adapter #{key} must be a Class"
57
- end
58
-
59
- adapter
60
- end
61
- module_function :validate!
62
-
63
- def adapt_object_class!(klass)
64
- object_model_modules.reverse_each do |mod|
65
- klass.include(mod) unless klass < mod
66
- end
67
- klass
68
- end
69
- module_function :adapt_object_class!
70
-
71
- def object_model_modules
72
- return [] unless defined?(Inform::Object)
73
-
74
- ancestors = Inform::Object.ancestors
75
- superclass_index = ancestors.index(Inform::Object.superclass)
76
- ancestors[1...superclass_index].select { |ancestor| object_model_module?(ancestor) }
77
- end
78
- module_function :object_model_modules
79
-
80
- def object_model_module?(ancestor)
81
- ancestor.is_a?(Module) && !ExcludedObjectModelModuleNames.include?(ancestor.name)
82
- end
83
- module_function :object_model_module?
84
-
85
- def available?
86
- !current.nil?
87
- end
88
- module_function :available?
89
-
90
- def object_class
91
- current&.fetch(:object_class, nil)
92
- end
93
- module_function :object_class
94
-
95
- def tag_class
96
- current&.fetch(:tag_class, nil)
97
- end
98
- module_function :tag_class
99
-
100
- def link_class
101
- current&.fetch(:link_class, nil)
102
- end
103
- module_function :link_class
104
-
105
- def module_class
106
- current&.fetch(:module_class, nil)
107
- end
108
- module_function :module_class
109
-
110
- def object_class!
111
- object_class || raise(NotImplementedError, 'No object model adapter has been registered')
112
- end
113
- module_function :object_class!
114
-
115
- def tag_class!
116
- tag_class || raise(NotImplementedError, 'No tag model adapter has been registered')
117
- end
118
- module_function :tag_class!
119
-
120
- def link_class!
121
- link_class || raise(NotImplementedError, 'No link model adapter has been registered')
122
- end
123
- module_function :link_class!
124
-
125
- def module_class!
126
- module_class || raise(NotImplementedError, 'No module model adapter has been registered')
127
- end
128
- module_function :module_class!
129
- end
130
- # module ModelAdapter
131
- end
132
- # module StoryTeller