chione 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 942a44dbe1220f53a15e2677191e58b9a76105e786f35798120dc8d3d3a22312
4
- data.tar.gz: e15195e1c3d30184b3f1ee0fde4ec572da7171dd957674099d5b5ec1446afe75
3
+ metadata.gz: 74a32ca8c0efb477b978216b6371d24c2cf2fabd037dade6424fdf3cda693bc8
4
+ data.tar.gz: cdc91fa64ece44754a3e4f687836195113779f96f64a7a01dffb64a6dcf3ed75
5
5
  SHA512:
6
- metadata.gz: a17c48a8a466bc5e734f98d2b6d6ec393e785671ba415cd1ae45b637bc1896a6526cd64b309a9c16db48b8d541f1a2eef47f3517c1ff054a5e6bd20536d28e16
7
- data.tar.gz: 7d5afadc0db038a8ff866fb10a237672c2687ea29c49a41f0faf24ee382df690626970336d78da88c3292410f41a38fa87d44dffd9fe3db5833e43d22a58dbff
6
+ metadata.gz: 1a21d24764d7ca1745ac3dbc5741a0782a569c1beb68cb643de4d6fff5f01ea03f12db588206c5941ed51d7c762210f1b0dba4d45a81b26d44fc7b47144cbe35
7
+ data.tar.gz: d15d0593e77f38c31fd437d6580e576466ddd45c50646b80502b7196b21ddfad7ca68f3c7a1a3dfdf8ff073d9f5fcacef8cc5711b7978e34de27877ea22116d0
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,151 +1,3 @@
1
- 2018-06-02 Michael Granger <ged@FaerieMUD.org>
2
-
3
- * .hgtags:
4
- Added tag v0.5.0 for changeset 1fb4fb6761f2
5
- [4a799c04f87f] [tip]
6
-
7
- * .hgsigs:
8
- Added signature for changeset 8b19a6b5fb12
9
- [1fb4fb6761f2] [v0.5.0]
10
-
11
- * History.md, chione.gemspec, lib/chione.rb:
12
- Bump the minor version, update history.
13
- [8b19a6b5fb12]
14
-
15
- * README.md, Rakefile, chione.gemspec:
16
- Update URLs, copyright dates
17
- [349fe4d64ec7]
18
-
19
- * lib/chione/archetype.rb, lib/chione/system.rb:
20
- Fix blank archetype inspect details
21
- [c64a0a142f5e]
22
-
23
- * lib/chione/world.rb, spec/chione/world_spec.rb:
24
- Update configuration to use chione namespace
25
- [27a0eec7c366]
26
-
27
- 2017-12-11 Michael Granger <ged@FaerieMUD.org>
28
-
29
- * .hgtags:
30
- Added tag v0.4.0 for changeset 61536d84d951
31
- [e23f5a4ba13d]
32
-
33
- * .hgsigs:
34
- Added signature for changeset b86a9cde058d
35
- [61536d84d951] [v0.4.0]
36
-
37
- * History.md, chione.gemspec, lib/chione.rb:
38
- Bump the minor version, update history.
39
- [b86a9cde058d]
40
-
41
- * .ruby-version, lib/chione/system.rb, lib/chione/world.rb,
42
- spec/chione/system_spec.rb:
43
- Refactor tick and timing events.
44
-
45
- COMPAT: the arguments passed to System.every_tick blocks are now
46
- only the delta and the tick count.
47
- [38c42eb46418]
48
-
49
- 2017-10-04 Michael Granger <ged@FaerieMUD.org>
50
-
51
- * lib/chione/world.rb:
52
- Normalize entity IDs in the World API
53
- [d5736d289092]
54
-
55
- * lib/chione/entity.rb, lib/chione/world.rb,
56
- spec/chione/entity_spec.rb:
57
- Pass init args through Component.add_component
58
- [ba43a21631c5]
59
-
60
- * lib/chione/system.rb:
61
- Fix API docs for Chione::System::on
62
- [7ee9fc0c0c8e]
63
-
64
- * certs/ged.pem:
65
- Update gem-signing cert
66
- [e7986014f2c2]
67
-
68
- 2017-07-21 Michael Granger <ged@FaerieMUD.org>
69
-
70
- * chione.gemspec, lib/chione.rb, lib/chione/archetype.rb,
71
- lib/chione/aspect.rb, lib/chione/component.rb, lib/chione/system.rb,
72
- lib/chione/world.rb, spec/chione/archetype_spec.rb,
73
- spec/chione/component_spec.rb, spec/chione/system_spec.rb:
74
- Work on System execution and Component construction
75
-
76
- - Add constructor arguments to component-creation paths
77
- - Add Aspect#archetype and Archetype.from_aspect
78
- - Add a processing block to Component field declaration
79
- [e0452d211146]
80
-
81
- 2017-07-12 Michael Granger <ged@FaerieMUD.org>
82
-
83
- * chione.gemspec, lib/chione.rb, lib/chione/component.rb:
84
- Add the entity ID to Component's inspect output
85
- [7f1190b563a6]
86
-
87
- * spec/chione/component_spec.rb:
88
- Add coverage for Component #inspect.
89
- [2de145d530d5]
90
-
91
- * lib/chione/aspect.rb, lib/chione/system.rb, lib/chione/world.rb,
92
- spec/chione/aspect_spec.rb, spec/chione/system_spec.rb:
93
- Add caching and #inserted/#removed callbacks for aspect-membership
94
- to Systems.
95
- [6eed9e4055be]
96
-
97
- 2017-07-11 Michael Granger <ged@FaerieMUD.org>
98
-
99
- * .gems, Manifest.txt, Rakefile, chione.gemspec,
100
- lib/chione/archetype.rb, lib/chione/aspect.rb, lib/chione/entity.rb,
101
- lib/chione/fixtures.rb, lib/chione/fixtures/entities.rb,
102
- lib/chione/iterating_system.rb, lib/chione/system.rb,
103
- lib/chione/world.rb, spec/chione/aspect_spec.rb,
104
- spec/chione/iterating_system_spec.rb, spec/chione/system_spec.rb,
105
- spec/chione/world_spec.rb, spec/spec_helper.rb:
106
- Start adding system execution strategies
107
-
108
- - Add fixtures collection
109
- - Add Aspect#matches? to match individual entities
110
- - Rename some component-API methods on the World for clarity (with
111
- aliases to the old methods)
112
- - Add Chione::IteratingSystem
113
- - Add stubs for System#inserted and #removed
114
- [783c4a657041]
115
-
116
- 2017-07-07 Michael Granger <ged@FaerieMUD.org>
117
-
118
- * lib/chione/component.rb, lib/chione/world.rb,
119
- spec/chione/component_spec.rb:
120
- Add the entity ID to components on registration
121
- [cf37f1305ad2]
122
-
123
- * lib/chione/system.rb, spec/chione/system_spec.rb:
124
- Remove aspects from event handler declarations.
125
- [a8f3ac7113c3]
126
-
127
- * lib/chione/system.rb, spec/chione/aspect_spec.rb,
128
- spec/chione/system_spec.rb:
129
- Checkpoint before undoing experimental event-based system execution
130
- model
131
- [f89f24dfb25c]
132
-
133
- 2017-07-05 Michael Granger <ged@FaerieMUD.org>
134
-
135
- * lib/chione/system.rb, lib/chione/world.rb,
136
- spec/chione/system_spec.rb:
137
- Add execution models to Systems
138
- [c9e80cf737e7]
139
-
140
- 2017-06-30 Michael Granger <ged@FaerieMUD.org>
141
-
142
- * README.md, lib/chione/archetype.rb, lib/chione/aspect.rb,
143
- lib/chione/entity.rb, lib/chione/system.rb, lib/chione/world.rb,
144
- spec/chione/aspect_spec.rb, spec/chione/entity_spec.rb,
145
- spec/chione/system_spec.rb, spec/chione/world_spec.rb:
146
- Refactor for thinner entities and systems with named aspects
147
- [d69678296749]
148
-
149
1
  2017-06-06 Michael Granger <ged@FaerieMUD.org>
150
2
 
151
3
  * lib/chione/aspect.rb, lib/chione/component.rb, lib/chione/entity.rb,
@@ -153,7 +5,7 @@
153
5
  Pull up common #inspect functionality into a mixin
154
6
 
155
7
  ...and use it everywhere.
156
- [0eb1e6c25953]
8
+ [0eb1e6c25953] [tip]
157
9
 
158
10
  * lib/chione/world.rb, spec/chione/world_spec.rb:
159
11
  Added World#remove_system and _manager; publish the instance of
@@ -164,7 +16,7 @@
164
16
 
165
17
  * .hgtags:
166
18
  Added tag v0.3.0 for changeset c91f71b3d7d9
167
- [06fdcde9eb00]
19
+ [06fdcde9eb00] [github/master]
168
20
 
169
21
  * .hgsigs:
170
22
  Added signature for changeset 0d453cae95c3
data/History.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## v0.6.0 [2018-07-05] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Enhancements:
4
+
5
+ - Add dependency-injection to Chione::System
6
+ - Set the thread name of the main world thread
7
+
8
+
1
9
  ## v0.5.0 [2018-06-02] Michael Granger <ged@FaerieMUD.org>
2
10
 
3
11
  Bugfixes:
data/Rakefile CHANGED
@@ -44,7 +44,7 @@ hoespec = Hoe.spec 'chione' do |spec|
44
44
  spec.dependency 'rdoc-generator-fivefish', '~> 0.3', :developer
45
45
  spec.dependency 'rdoc', '~> 5.1', :developer
46
46
 
47
- spec.require_ruby_version( '>=2.3.3' )
47
+ spec.require_ruby_version( '>=2.5.0' )
48
48
  spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
49
49
  spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
50
50
 
data/lib/chione.rb CHANGED
@@ -12,7 +12,7 @@ module Chione
12
12
  extend Loggability
13
13
 
14
14
  # Gem version
15
- VERSION = '0.5.0'
15
+ VERSION = '0.6.0'
16
16
 
17
17
 
18
18
  # Loggability API -- set up a log host
data/lib/chione/system.rb CHANGED
@@ -46,6 +46,10 @@ class Chione::System
46
46
  # System is started.
47
47
  singleton_attr_reader :event_handlers
48
48
 
49
+ ##
50
+ # Systems to be injected by the world when this System is started.
51
+ singleton_attr_reader :injected_systems
52
+
49
53
 
50
54
  ### Add the specified +component_types+ to the Aspect of this System as being
51
55
  ### required in any entities it processes.
@@ -62,6 +66,18 @@ class Chione::System
62
66
  end
63
67
 
64
68
 
69
+ ### Dependency-injection: declare one or more +systems+ that should be passed to #start
70
+ ### by the running World.
71
+ def self::inject( *systems )
72
+ systems.each do |system_type|
73
+ system_type = system_type.to_sym
74
+ system_class = Chione::System.get_subclass( system_type )
75
+ attr_accessor( "#{system_type}_system" )
76
+ self.injected_systems[ system_type ] = system_class
77
+ end
78
+ end
79
+
80
+
65
81
  ### Declare a block that is called once whenever an event matching +event_name+ is
66
82
  ### broadcast to the World.
67
83
  def self::on( event_name, &block )
@@ -91,6 +107,7 @@ class Chione::System
91
107
  super
92
108
  subclass.instance_variable_set( :@aspects, DEFAULT_ASPECT_HASH.clone )
93
109
  subclass.instance_variable_set( :@event_handlers, self.event_handlers&.dup || [] )
110
+ subclass.instance_variable_set( :@injected_systems, self.injected_systems&.dup || {} )
94
111
  end
95
112
 
96
113
 
@@ -120,9 +137,14 @@ class Chione::System
120
137
 
121
138
 
122
139
  ### Start the system.
123
- def start
124
- self.log.info "Starting the %p system; %d event handlers to register" %
125
- [ self.class, self.class.event_handlers.length ]
140
+ def start( **injected_systems )
141
+ self.log.info "Starting the %p system; %d injected systems, %d event handlers to register" %
142
+ [ self.class, injected_systems.length, self.class.event_handlers.length ]
143
+
144
+ injected_systems.each do |name, other_system|
145
+ self.public_send( "#{name}_system=", other_system )
146
+ end
147
+
126
148
  self.class.event_handlers.each do |event_name, method_name|
127
149
  callback = self.method( method_name )
128
150
  self.log.info "Registering %p as a callback for '%s' events." % [ callback, event_name ]
data/lib/chione/world.rb CHANGED
@@ -114,7 +114,8 @@ class Chione::World
114
114
  def start
115
115
  @main_thread = Thread.new do
116
116
  Thread.current.abort_on_exception = true
117
- self.log.info "Main thread (%s) started." % [ Thread.current ]
117
+ Thread.current.name = "Main World"
118
+ self.log.info "Main thread (%p) started." % [ Thread.current ]
118
119
  @world_threads.add( Thread.current )
119
120
  @world_threads.enclose
120
121
 
@@ -162,9 +163,11 @@ class Chione::World
162
163
  def start_systems
163
164
  self.log.info "Starting %d Systems" % [ self.systems.length ]
164
165
  self.systems.each do |system_class, sys|
166
+ injections = self.make_injection_hash_for( system_class )
167
+
165
168
  self.log.debug " starting %p" % [ system_class ]
166
169
  start = Time.now
167
- sys.start
170
+ sys.start( **injections )
168
171
  finish = Time.now
169
172
  self.log.debug " started in %0.5fs" % [ finish - start ]
170
173
  end
@@ -499,6 +502,21 @@ class Chione::World
499
502
  protected
500
503
  #########
501
504
 
505
+ ### Return a Hash of the loaded Chione::Systems that +system_class+ has requested
506
+ ### be injected into it.
507
+ def make_injection_hash_for( system_class )
508
+ self.log.debug "Injecting %d other system/s into %p" %
509
+ [ system_class.injected_systems.length, system_class ]
510
+ return system_class.injected_systems.each_with_object({}) do |(name, injected_class), hash|
511
+ self.log.debug " inject %p: %p" % [ name, injected_class ]
512
+ system = self.systems[ injected_class ] or
513
+ raise "Can't inject %p into %p: not configured to run it" %
514
+ [ injected_class, system_class]
515
+ hash[ name ] = system
516
+ end
517
+ end
518
+
519
+
502
520
  ### Update any entity caches in the system when an +entity+ has its +components+ hash changed.
503
521
  def update_entity_caches( entity, components )
504
522
  entity = entity.id if entity.respond_to?( :id )
@@ -290,5 +290,62 @@ describe Chione::System do
290
290
 
291
291
  end
292
292
 
293
+
294
+ describe "dependency-injection" do
295
+
296
+ let( :subclass1 ) do
297
+ Class.new( described_class )
298
+ end
299
+ let( :subclass2 ) do
300
+ Class.new( described_class )
301
+ end
302
+ let( :world ) { Chione::World.new }
303
+
304
+
305
+ before( :each ) do
306
+ @real_derivatives = described_class.derivatives.dup
307
+ # Pretend that the anonymous classes have names so they can be injected by name
308
+ described_class.derivatives.merge!( 'events' => subclass1, 'physics' => subclass2 )
309
+ end
310
+
311
+ after( :each ) do
312
+ described_class.derivatives.replace( @real_derivatives )
313
+ end
314
+
315
+
316
+ it "allows one system to have another system injected into it" do
317
+ subclass1.inject( :physics )
318
+
319
+ world.add_system( subclass1 )
320
+ world.add_system( subclass2 )
321
+ world.start_systems
322
+
323
+ result = world.systems[ subclass1 ].physics_system
324
+
325
+ expect( result ).to be_a( subclass2 )
326
+ end
327
+
328
+
329
+ it "allows systems to inject one another" do
330
+ subclass1.inject( :physics )
331
+ subclass2.inject( :events )
332
+
333
+ world.add_system( subclass1 )
334
+ world.add_system( subclass2 )
335
+ world.start_systems
336
+
337
+ expect( world.systems[subclass1].physics_system ).to be_a( subclass2 )
338
+ expect( world.systems[subclass2].events_system ).to be_a( subclass1 )
339
+ end
340
+
341
+
342
+ it "raises an error if the system to inject can't be loaded" do
343
+ expect {
344
+ subclass1.inject( :tantalus )
345
+ }.to raise_error( /couldn't find a system named 'tantalus'/i )
346
+ end
347
+
348
+ end
349
+
293
350
  end
294
351
 
@@ -410,6 +410,22 @@ describe Chione::World do
410
410
  world.stop
411
411
  end
412
412
 
413
+
414
+ it "raises an error if a system wants to inject a system that hasn't been added" do
415
+ @real_derivatives = Chione::System.derivatives.dup
416
+ Chione::System.derivatives[ 'warning' ] = Class.new( Chione::System ) do
417
+ def self::name; "WarningSystem"; end
418
+ end
419
+ test_system.inject( :warning )
420
+ world.add_system( test_system )
421
+
422
+ expect {
423
+ world.start_systems
424
+ }.to raise_error( /can't inject/i )
425
+ ensure
426
+ Chione::System.derivatives.replace( @real_derivatives )
427
+ end
428
+
413
429
  end
414
430
 
415
431
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chione
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Granger
@@ -35,7 +35,7 @@ cert_chain:
35
35
  X0qdrKi+2aZZ0NGuFj9AItBsVmAvkBGIpX4TEKQp5haEbPpmaqO5nIIhV26PXmyT
36
36
  OMKv6pWsoS81vw5KAGBmfX8nht/Py90DQrbRvakATGI=
37
37
  -----END CERTIFICATE-----
38
- date: 2018-06-02 00:00:00.000000000 Z
38
+ date: 2018-07-06 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: loggability
@@ -298,7 +298,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
298
298
  requirements:
299
299
  - - ">="
300
300
  - !ruby/object:Gem::Version
301
- version: 2.3.3
301
+ version: 2.5.0
302
302
  required_rubygems_version: !ruby/object:Gem::Requirement
303
303
  requirements:
304
304
  - - ">="
@@ -306,7 +306,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
306
306
  version: '0'
307
307
  requirements: []
308
308
  rubyforge_project:
309
- rubygems_version: 2.7.7
309
+ rubygems_version: 2.7.6
310
310
  signing_key:
311
311
  specification_version: 4
312
312
  summary: An Entity/Component System framework inspired by Artemis
metadata.gz.sig CHANGED
Binary file