chione 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +71 -1
- data/History.md +22 -0
- data/Manifest.txt +2 -1
- data/Rakefile +6 -1
- data/lib/chione.rb +27 -5
- data/lib/chione/archetype.rb +71 -0
- data/lib/chione/assemblage.rb +2 -65
- data/lib/chione/component.rb +8 -0
- data/lib/chione/entity.rb +7 -2
- data/lib/chione/system.rb +6 -0
- data/lib/chione/world.rb +8 -7
- data/spec/chione/archetype_spec.rb +72 -0
- data/spec/chione/entity_spec.rb +56 -14
- data/spec/chione/system_spec.rb +35 -1
- data/spec/chione/world_spec.rb +6 -6
- data/spec/chione_spec.rb +29 -0
- data/spec/spec_helper.rb +3 -0
- metadata +19 -4
- metadata.gz.sig +0 -0
- data/spec/chione/assemblage_spec.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9b24299f45b2755cca922ee6762900f1afb4b2b7
|
4
|
+
data.tar.gz: e4bb1a2a39c594b2ecee9e898b358f138c9d6ce7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fde13065c29d54acf5e355456f146740ed8a6f4a02084dff417944fae714e9395f566b2b717eef18ea398e4a7e9940f8f57871e1d9eb140ce60aa99bdaf45856
|
7
|
+
data.tar.gz: 19d74ac66382bd50991a149ff5082346ba6eb67cbf0a629852051f19361bde42e3b7ec1e2b3279f128dbca377e94e8057df88b8eca349bed45480f0cb5caea4f
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,8 +1,78 @@
|
|
1
|
+
2017-05-31 Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
* .hgtags:
|
4
|
+
Added tag v0.3.0 for changeset c91f71b3d7d9
|
5
|
+
[06fdcde9eb00] [tip]
|
6
|
+
|
7
|
+
* .hgsigs:
|
8
|
+
Added signature for changeset 0d453cae95c3
|
9
|
+
[c91f71b3d7d9] [v0.3.0]
|
10
|
+
|
11
|
+
* Rakefile, chione.gemspec:
|
12
|
+
Update gemspec
|
13
|
+
[0d453cae95c3]
|
14
|
+
|
15
|
+
* History.md, Manifest.txt, lib/chione.rb:
|
16
|
+
Bump the minor version, update history.
|
17
|
+
[e102f20bc862]
|
18
|
+
|
19
|
+
* lib/chione.rb, lib/chione/archetype.rb, lib/chione/assemblage.rb,
|
20
|
+
spec/chione/archetype_spec.rb:
|
21
|
+
Add more backward-compat for Chione::Assemblage
|
22
|
+
[a2e8b35fb950] [github/master]
|
23
|
+
|
24
|
+
* .gems, Manifest.txt, Rakefile, chione.gemspec, lib/chione.rb,
|
25
|
+
lib/chione/archetype.rb, lib/chione/assemblage.rb,
|
26
|
+
lib/chione/entity.rb, lib/chione/world.rb,
|
27
|
+
spec/chione/archetype_spec.rb, spec/chione/assemblage_spec.rb,
|
28
|
+
spec/chione/entity_spec.rb, spec/chione/world_spec.rb,
|
29
|
+
spec/spec_helper.rb:
|
30
|
+
Rename Assemblage to Archetype to follow Artemis's naming.
|
31
|
+
|
32
|
+
Also add 'deprecatable' to track deprecations.
|
33
|
+
[687db9f6d955]
|
34
|
+
|
35
|
+
* lib/chione/entity.rb, lib/chione/system.rb, lib/chione/world.rb,
|
36
|
+
spec/chione/entity_spec.rb, spec/chione/system_spec.rb:
|
37
|
+
Add some flexibility to working with Components.
|
38
|
+
|
39
|
+
- Add a Chione::Component() coercion method
|
40
|
+
- Allow a component to be added to an entity by name or class
|
41
|
+
- Rename Entity#get_component to #find_component to more accurately
|
42
|
+
reflect what it does. Aliased to the old name for backward
|
43
|
+
compatibility, but the alias will likely be removed before 1.0.
|
44
|
+
- Add an #entities method to System for easy iteration by subclasses.
|
45
|
+
- Change the return value of World#entities_for to an Enumerator for
|
46
|
+
future optimizations.
|
47
|
+
[0f1b93f7118f]
|
48
|
+
|
49
|
+
* lib/chione/component.rb:
|
50
|
+
Add a missing private method to Component
|
51
|
+
[476c7503fa52]
|
52
|
+
|
53
|
+
2017-05-30 Michael Granger <ged@FaerieMUD.org>
|
54
|
+
|
55
|
+
* lib/chione.rb, spec/chione_spec.rb:
|
56
|
+
Add a Component coercion method
|
57
|
+
[48f58a3494f1]
|
58
|
+
|
1
59
|
2017-05-26 Michael Granger <ged@FaerieMUD.org>
|
2
60
|
|
61
|
+
* .hgtags:
|
62
|
+
Added tag v0.2.0 for changeset 94e6caba943c
|
63
|
+
[582fdd9c20c8]
|
64
|
+
|
65
|
+
* .hgsigs:
|
66
|
+
Added signature for changeset 89f0f18003f0
|
67
|
+
[94e6caba943c] [v0.2.0]
|
68
|
+
|
69
|
+
* History.md, Rakefile, chione.gemspec:
|
70
|
+
Re-prep for 0.2.0 release.
|
71
|
+
[89f0f18003f0]
|
72
|
+
|
3
73
|
* Rakefile, chione.gemspec:
|
4
74
|
Update gemspec
|
5
|
-
[068af8eec0e0]
|
75
|
+
[068af8eec0e0]
|
6
76
|
|
7
77
|
2017-05-25 Michael Granger <ged@FaerieMUD.org>
|
8
78
|
|
data/History.md
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
## v0.3.0 [2017-05-31] Michael Granger <ged@FaerieMUD.org>
|
2
|
+
|
3
|
+
Changes:
|
4
|
+
|
5
|
+
- Rename Assemblage to Archetype to follow Artemis's naming.
|
6
|
+
- Rename Entity#get_component to #find_component to more accurately
|
7
|
+
reflect what it does. Aliased to the old name for backward
|
8
|
+
compatibility, but the alias will likely be removed before 1.0.
|
9
|
+
|
10
|
+
Enhancements:
|
11
|
+
|
12
|
+
- Add a Chione::Component() coercion method
|
13
|
+
- Allow a component to be added to an entity by name or class
|
14
|
+
- Add an #entities method to System for easy iteration by subclasses.
|
15
|
+
- Change the return value of World#entities_for to an Enumerator for
|
16
|
+
future optimizations.
|
17
|
+
|
18
|
+
Bugfixes:
|
19
|
+
|
20
|
+
- Add a missing private method to Component
|
21
|
+
|
22
|
+
|
1
23
|
## v0.2.0 [2017-05-26] Michael Granger <ged@FaerieMUD.org>
|
2
24
|
|
3
25
|
Enhancements:
|
data/Manifest.txt
CHANGED
@@ -6,6 +6,7 @@ Manifest.txt
|
|
6
6
|
README.md
|
7
7
|
Rakefile
|
8
8
|
lib/chione.rb
|
9
|
+
lib/chione/archetype.rb
|
9
10
|
lib/chione/aspect.rb
|
10
11
|
lib/chione/assemblage.rb
|
11
12
|
lib/chione/behaviors.rb
|
@@ -15,8 +16,8 @@ lib/chione/manager.rb
|
|
15
16
|
lib/chione/mixins.rb
|
16
17
|
lib/chione/system.rb
|
17
18
|
lib/chione/world.rb
|
19
|
+
spec/chione/archetype_spec.rb
|
18
20
|
spec/chione/aspect_spec.rb
|
19
|
-
spec/chione/assemblage_spec.rb
|
20
21
|
spec/chione/component_spec.rb
|
21
22
|
spec/chione/entity_spec.rb
|
22
23
|
spec/chione/manager_spec.rb
|
data/Rakefile
CHANGED
@@ -35,6 +35,7 @@ hoespec = Hoe.spec 'chione' do |spec|
|
|
35
35
|
spec.dependency 'configurability', '~> 3.0'
|
36
36
|
spec.dependency 'pluggability', '~> 0.4'
|
37
37
|
spec.dependency 'uuid', '~> 2.3'
|
38
|
+
spec.dependency 'deprecatable', '~> 1.0'
|
38
39
|
|
39
40
|
spec.dependency 'hoe-deveiate', '~> 1.0', :developer
|
40
41
|
spec.dependency 'simplecov', '~> 0.12', :developer
|
@@ -84,9 +85,12 @@ if File.directory?( '.hg' )
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
88
|
+
file __FILE__
|
89
|
+
file 'lib/chione.rb'
|
90
|
+
file 'Manifest.txt'
|
87
91
|
|
88
92
|
task :gemspec => GEMSPEC
|
89
|
-
file GEMSPEC => __FILE__
|
93
|
+
file GEMSPEC => [ __FILE__, 'Manifest.txt', 'lib/chione.rb' ]
|
90
94
|
task GEMSPEC do |task|
|
91
95
|
Rake.application.trace "Updating gemspec"
|
92
96
|
spec = $hoespec.spec
|
@@ -100,3 +104,4 @@ task GEMSPEC do |task|
|
|
100
104
|
end
|
101
105
|
|
102
106
|
CLOBBER.include( GEMSPEC.to_s )
|
107
|
+
|
data/lib/chione.rb
CHANGED
@@ -3,23 +3,26 @@
|
|
3
3
|
|
4
4
|
require 'uuid'
|
5
5
|
require 'loggability'
|
6
|
+
require 'deprecatable'
|
7
|
+
|
8
|
+
Deprecatable.options.has_at_exit_report = false
|
6
9
|
|
7
10
|
# An Entity/Component System inspired by Artemis
|
8
11
|
module Chione
|
9
12
|
extend Loggability
|
10
13
|
|
11
|
-
#
|
12
|
-
|
14
|
+
# Gem version
|
15
|
+
VERSION = '0.3.0'
|
13
16
|
|
14
17
|
|
15
|
-
#
|
16
|
-
|
18
|
+
# Loggability API -- set up a log host
|
19
|
+
log_as :chione
|
17
20
|
|
18
21
|
|
19
22
|
require 'chione/mixins'
|
20
23
|
|
21
24
|
autoload :Aspect, 'chione/aspect'
|
22
|
-
autoload :
|
25
|
+
autoload :Archetype, 'chione/archetype'
|
23
26
|
autoload :Component, 'chione/component'
|
24
27
|
autoload :Entity, 'chione/entity'
|
25
28
|
autoload :Manager, 'chione/manager'
|
@@ -31,6 +34,25 @@ module Chione
|
|
31
34
|
class << self; attr_reader :uuid ; end
|
32
35
|
@uuid = UUID.new
|
33
36
|
|
37
|
+
|
38
|
+
### Coerce the specified +object+ into a Chione::Component and return it.
|
39
|
+
def self::Component( object )
|
40
|
+
return object if object.is_a?( Chione::Component )
|
41
|
+
return Chione::Component.create( object ) if
|
42
|
+
object.is_a?( Class ) || object.is_a?( String ) || object.is_a?( Symbol )
|
43
|
+
raise TypeError, "can't convert %p into Chione::Component" % [ object.class ]
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
### Warn about deprecated constants.
|
48
|
+
def self::const_missing( name )
|
49
|
+
super unless name == :Assemblage
|
50
|
+
warn "Chione::Assemblage has been renamed to Chione::Archetype. " \
|
51
|
+
"This alias will be removed before 1.0\n" \
|
52
|
+
"Used at #{caller(1).first}"
|
53
|
+
return Chione::Archetype
|
54
|
+
end
|
55
|
+
|
34
56
|
end # module Chione
|
35
57
|
|
36
58
|
# vim: set nosta noet ts=4 sw=4:
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
#encoding: utf-8
|
3
|
+
|
4
|
+
require 'pluggability'
|
5
|
+
require 'loggability'
|
6
|
+
|
7
|
+
require 'chione' unless defined?( Chione )
|
8
|
+
|
9
|
+
|
10
|
+
# An Archetype mixin for defining factories for common entity configurations.
|
11
|
+
module Chione::Archetype
|
12
|
+
extend Loggability,
|
13
|
+
Pluggability
|
14
|
+
|
15
|
+
# Loggability API -- log to the chione logger
|
16
|
+
log_to :chione
|
17
|
+
|
18
|
+
# Pluggability API -- load subclasses from the 'chione/archetype' directory
|
19
|
+
plugin_prefixes 'chione/archetype', 'chione/assemblage'
|
20
|
+
|
21
|
+
|
22
|
+
### Extension callback -- add archetype functionality to an extended +object+.
|
23
|
+
def self::extended( object )
|
24
|
+
super
|
25
|
+
object.extend( Loggability )
|
26
|
+
object.log_to( :chione )
|
27
|
+
object.components ||= {}
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
### Inclusion callback -- add the components from this archetype to those in
|
32
|
+
### the specified +mod+.
|
33
|
+
def included( mod )
|
34
|
+
super
|
35
|
+
self.log.debug "Including %d components in %p" % [ self.components.length, mod ]
|
36
|
+
self.components.each do |component_type, args|
|
37
|
+
self.log.debug "Adding %p to %p from %p" % [ component_type, mod, self ]
|
38
|
+
mod.add( component_type, *args )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
##
|
44
|
+
# The Hash of component types and initialization values to add to entities
|
45
|
+
# constructed by this Archetype.
|
46
|
+
attr_accessor :components
|
47
|
+
|
48
|
+
|
49
|
+
### Add a +component_type+ to the list used when constructing a new entity from
|
50
|
+
### the current Archetype. The component will be instantiated using the specified
|
51
|
+
### +init_args+.
|
52
|
+
def add( component_type, *init_args )
|
53
|
+
self.components[ component_type ] = init_args
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
### Construct a new entity for the specified +world+ with all of the archetype's
|
58
|
+
### components.
|
59
|
+
def construct_for( world )
|
60
|
+
entity = world.create_entity
|
61
|
+
self.components.each do |component_type, args|
|
62
|
+
component = component_type.new( *args )
|
63
|
+
entity.add_component( component )
|
64
|
+
end
|
65
|
+
|
66
|
+
return entity
|
67
|
+
end
|
68
|
+
|
69
|
+
end # module Chione::Archetype
|
70
|
+
|
71
|
+
|
data/lib/chione/assemblage.rb
CHANGED
@@ -1,69 +1,6 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
|
-
|
5
|
-
require '
|
4
|
+
# Replaced by chione/archetype
|
5
|
+
require 'chione/archetype'
|
6
6
|
|
7
|
-
require 'chione' unless defined?( Chione )
|
8
|
-
|
9
|
-
|
10
|
-
# An Assemblage mixin for defining factories for common entity configurations.
|
11
|
-
module Chione::Assemblage
|
12
|
-
extend Loggability,
|
13
|
-
Pluggability
|
14
|
-
|
15
|
-
# Loggability API -- log to the chione logger
|
16
|
-
log_to :chione
|
17
|
-
|
18
|
-
# Pluggability API -- load subclasses from the 'chione/assemblage' directory
|
19
|
-
plugin_prefixes 'chione/assemblage'
|
20
|
-
|
21
|
-
|
22
|
-
### Extension callback -- add assemblage functionality to an extended +object+.
|
23
|
-
def self::extended( object )
|
24
|
-
super
|
25
|
-
object.extend( Loggability )
|
26
|
-
object.log_to( :chione )
|
27
|
-
object.components ||= {}
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
### Inclusion callback -- add the components from this assemblage to those in
|
32
|
-
### the specified +mod+.
|
33
|
-
def included( mod )
|
34
|
-
super
|
35
|
-
self.log.debug "Including %d components in %p" % [ self.components.length, mod ]
|
36
|
-
self.components.each do |component_type, args|
|
37
|
-
self.log.debug "Adding %p to %p from %p" % [ component_type, mod, self ]
|
38
|
-
mod.add( component_type, *args )
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
|
43
|
-
##
|
44
|
-
# The Hash of component types and initialization values to add to entities
|
45
|
-
# constructed by this Assemblage.
|
46
|
-
attr_accessor :components
|
47
|
-
|
48
|
-
|
49
|
-
### Add a +component_type+ to the list used when constructing a new entity from
|
50
|
-
### the current Assemblage. The component will be instantiated using the specified
|
51
|
-
### +init_args+.
|
52
|
-
def add( component_type, *init_args )
|
53
|
-
self.components[ component_type ] = init_args
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
### Construct a new entity for the specified +world+ with all of the assemblage's
|
58
|
-
### components.
|
59
|
-
def construct_for( world )
|
60
|
-
entity = world.create_entity
|
61
|
-
self.components.each do |component_type, args|
|
62
|
-
component = component_type.new( *args )
|
63
|
-
entity.add_component( component )
|
64
|
-
end
|
65
|
-
|
66
|
-
return entity
|
67
|
-
end
|
68
|
-
|
69
|
-
end # module Chione::Assemblage
|
data/lib/chione/component.rb
CHANGED
@@ -80,4 +80,12 @@ class Chione::Component
|
|
80
80
|
return Marshal.load( Marshal.dump(value) )
|
81
81
|
end
|
82
82
|
|
83
|
+
|
84
|
+
### Return a slice of the specified +string+ truncated to at most +maxlen+
|
85
|
+
### characters. Returns the unchanged +string+ if it's not longer than +maxlen+.
|
86
|
+
def truncate_string( string, maxlen )
|
87
|
+
return string unless string.length > maxlen
|
88
|
+
return string[ 0, maxlen - 3 ] + '...'
|
89
|
+
end
|
90
|
+
|
83
91
|
end # class Chione::Component
|
data/lib/chione/entity.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#encoding: utf-8
|
3
3
|
|
4
|
+
require 'deprecatable'
|
4
5
|
require 'loggability'
|
5
6
|
require 'securerandom'
|
6
7
|
|
@@ -8,7 +9,8 @@ require 'chione' unless defined?( Chione )
|
|
8
9
|
|
9
10
|
# The Entity (identity) class
|
10
11
|
class Chione::Entity
|
11
|
-
extend Loggability
|
12
|
+
extend Loggability,
|
13
|
+
Deprecatable
|
12
14
|
|
13
15
|
# Loggability API -- send logs to the Chione logger
|
14
16
|
log_to :chione
|
@@ -47,6 +49,7 @@ class Chione::Entity
|
|
47
49
|
### Add the specified +component+ to the entity. It will replace any existing component
|
48
50
|
### of the same type.
|
49
51
|
def add_component( component )
|
52
|
+
component = Chione::Component( component )
|
50
53
|
self.components[ component.class ] = component
|
51
54
|
self.world.add_component_for( self, component )
|
52
55
|
end
|
@@ -54,11 +57,13 @@ class Chione::Entity
|
|
54
57
|
|
55
58
|
### Fetch the first Component of the specified +types+ that belongs to the entity. If the
|
56
59
|
### Entity doesn't have any of the specified types of Component, raises a KeyError.
|
57
|
-
def
|
60
|
+
def find_component( *types )
|
58
61
|
found_type = types.find {|type| self.components[type] } or
|
59
62
|
raise KeyError, "entity %s doesn't have any of %p" % [ self.id, types ]
|
60
63
|
return self.components[ found_type ]
|
61
64
|
end
|
65
|
+
alias_method :get_component, :find_component
|
66
|
+
deprecate :get_component, message: 'Use #find_component instead', removal_version: '1.0'
|
62
67
|
|
63
68
|
|
64
69
|
### Returns +true+ if this entity has the specified +component+.
|
data/lib/chione/system.rb
CHANGED
data/lib/chione/world.rb
CHANGED
@@ -274,10 +274,10 @@ class Chione::World
|
|
274
274
|
|
275
275
|
|
276
276
|
### Return a new Chione::Entity for the receiving World, using the optional
|
277
|
-
### +
|
278
|
-
def create_entity(
|
279
|
-
entity = if
|
280
|
-
|
277
|
+
### +archetype+ to populate it with components if it's specified.
|
278
|
+
def create_entity( archetype=nil )
|
279
|
+
entity = if archetype
|
280
|
+
archetype.construct_for( self )
|
281
281
|
else
|
282
282
|
self.create_blank_entity
|
283
283
|
end
|
@@ -323,15 +323,16 @@ class Chione::World
|
|
323
323
|
### Register the specified +component+ as having been added to the specified
|
324
324
|
### +entity+.
|
325
325
|
def add_component_for( entity, component )
|
326
|
+
self.log.debug "Adding %p for %p" % [ component.class, entity ]
|
326
327
|
@entities_by_component[ component.class ].add( entity )
|
327
328
|
end
|
328
329
|
|
329
330
|
|
330
|
-
### Return the Entities that have a Component composition that
|
331
|
-
### the specified +system+'s aspect.
|
331
|
+
### Return an Enumerator of the Entities that have a Component composition that
|
332
|
+
### is compatible with the specified +system+'s aspect.
|
332
333
|
def entities_for( system )
|
333
334
|
system = system.class unless system.is_a?( Class )
|
334
|
-
return self.entities_with( system.aspect )
|
335
|
+
return self.entities_with( system.aspect ).to_enum
|
335
336
|
end
|
336
337
|
|
337
338
|
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env rspec -cfd
|
2
|
+
|
3
|
+
require_relative '../spec_helper'
|
4
|
+
|
5
|
+
require 'chione/archetype'
|
6
|
+
require 'chione/component'
|
7
|
+
require 'chione/entity'
|
8
|
+
require 'chione/world'
|
9
|
+
|
10
|
+
describe Chione::Archetype do
|
11
|
+
|
12
|
+
let( :world ) { Chione::World.new }
|
13
|
+
|
14
|
+
let( :location_component ) do
|
15
|
+
Class.new( Chione::Component ) do
|
16
|
+
field :x, default: 0
|
17
|
+
field :y, default: 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let( :tags_component ) do
|
22
|
+
Class.new( Chione::Component ) do
|
23
|
+
field :tags, default: []
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
it "acts as a factory for entities with pre-set components" do
|
29
|
+
archetype = Module.new
|
30
|
+
archetype.extend( described_class )
|
31
|
+
archetype.add( location_component, x: 10, y: 8 )
|
32
|
+
archetype.add( tags_component, tags: [:foo, :bar] )
|
33
|
+
|
34
|
+
entity = archetype.construct_for( world )
|
35
|
+
|
36
|
+
expect( entity ).to be_a( Chione::Entity )
|
37
|
+
expect( entity.world ).to be( world )
|
38
|
+
expect( entity.components ).to include( location_component, tags_component )
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
it "can include other archetypes" do
|
43
|
+
general_archetype = Module.new
|
44
|
+
general_archetype.extend( described_class )
|
45
|
+
general_archetype.add( location_component, x: 10, y: 8 )
|
46
|
+
|
47
|
+
specific_archetype = Module.new
|
48
|
+
specific_archetype.extend( described_class )
|
49
|
+
specific_archetype.send( :include, general_archetype )
|
50
|
+
specific_archetype.add( tags_component, tags: [:foo, :bar] )
|
51
|
+
|
52
|
+
entity = specific_archetype.construct_for( world )
|
53
|
+
|
54
|
+
expect( entity ).to be_a( Chione::Entity )
|
55
|
+
expect( entity.world ).to be( world )
|
56
|
+
expect( entity.components ).to include( location_component, tags_component )
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
it "is still loadable as an `Assemblage`" do
|
61
|
+
expect {
|
62
|
+
expect( Chione::Assemblage ).to equal( described_class )
|
63
|
+
}.to output( /has been renamed/i ).to_stderr
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
it "still looks in the chione/assemblage directory for derivatives" do
|
68
|
+
expect( described_class.plugin_prefixes ).to include( 'chione/assemblage' )
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
data/spec/chione/entity_spec.rb
CHANGED
@@ -8,27 +8,47 @@ require 'chione/component'
|
|
8
8
|
|
9
9
|
describe Chione::Entity do
|
10
10
|
|
11
|
+
before( :all ) do
|
12
|
+
@component_classes = Chione::Component.derivatives.dup
|
13
|
+
end
|
14
|
+
before( :each ) do
|
15
|
+
Chione::Component.derivatives.clear
|
16
|
+
end
|
17
|
+
after( :all ) do
|
18
|
+
Chione::Component.derivatives.replace( @component_classes )
|
19
|
+
end
|
20
|
+
|
21
|
+
|
11
22
|
let( :world ) { Chione::World.new }
|
12
23
|
|
13
24
|
let( :location_component ) do
|
14
|
-
Class.new( Chione::Component ) do
|
25
|
+
klass = Class.new( Chione::Component ) do
|
26
|
+
def self::name; "Location"; end
|
15
27
|
field :x, default: 0
|
16
28
|
field :y, default: 0
|
17
29
|
end
|
30
|
+
Chione::Component.derivatives['location'] = klass
|
31
|
+
klass
|
18
32
|
end
|
19
33
|
|
20
34
|
let( :tags_component ) do
|
21
|
-
Class.new( Chione::Component ) do
|
35
|
+
klass = Class.new( Chione::Component ) do
|
36
|
+
def self::name; "Tags"; end
|
22
37
|
field :tags, default: []
|
23
38
|
end
|
39
|
+
Chione::Component.derivatives['tags'] = klass
|
40
|
+
klass
|
24
41
|
end
|
25
42
|
|
26
43
|
let( :bounding_box_component ) do
|
27
|
-
Class.new( Chione::Component ) do
|
44
|
+
klass = Class.new( Chione::Component ) do
|
45
|
+
def self::name; "BoundingBox"; end
|
28
46
|
field :width, default: 1
|
29
47
|
field :height, default: 1
|
30
48
|
field :depth, default: 1
|
31
49
|
end
|
50
|
+
Chione::Component.derivatives['bounding_box'] = klass
|
51
|
+
klass
|
32
52
|
end
|
33
53
|
|
34
54
|
|
@@ -58,8 +78,20 @@ describe Chione::Entity do
|
|
58
78
|
|
59
79
|
|
60
80
|
it "can have components added to it" do
|
61
|
-
entity.add_component( location_component
|
62
|
-
entity.add_component( tags_component
|
81
|
+
entity.add_component( location_component )
|
82
|
+
entity.add_component( tags_component )
|
83
|
+
|
84
|
+
expect( entity ).to have_component( location_component )
|
85
|
+
expect( entity ).to have_component( tags_component )
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
it "can have components added to it by name" do
|
90
|
+
location_component()
|
91
|
+
tags_component()
|
92
|
+
|
93
|
+
entity.add_component( :location )
|
94
|
+
entity.add_component( :tags )
|
63
95
|
|
64
96
|
expect( entity ).to have_component( location_component )
|
65
97
|
expect( entity ).to have_component( tags_component )
|
@@ -67,8 +99,18 @@ describe Chione::Entity do
|
|
67
99
|
|
68
100
|
|
69
101
|
it "lets components be fetched from it" do
|
70
|
-
entity.add_component( location_component
|
71
|
-
entity.add_component( tags_component
|
102
|
+
entity.add_component( location_component )
|
103
|
+
entity.add_component( tags_component )
|
104
|
+
|
105
|
+
expect(
|
106
|
+
entity.find_component( location_component )
|
107
|
+
).to eq( entity.components[location_component] )
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
it "supports backward-compatible component-fetcher method" do
|
112
|
+
entity.add_component( location_component )
|
113
|
+
entity.add_component( tags_component )
|
72
114
|
|
73
115
|
expect(
|
74
116
|
entity.get_component( location_component )
|
@@ -77,29 +119,29 @@ describe Chione::Entity do
|
|
77
119
|
|
78
120
|
|
79
121
|
it "lets one of a list of components be fetched from it" do
|
80
|
-
entity.add_component( location_component
|
81
|
-
entity.add_component( tags_component
|
122
|
+
entity.add_component( location_component )
|
123
|
+
entity.add_component( tags_component )
|
82
124
|
|
83
125
|
expect(
|
84
|
-
entity.
|
126
|
+
entity.find_component( bounding_box_component, location_component )
|
85
127
|
).to eq( entity.components[location_component] )
|
86
128
|
end
|
87
129
|
|
88
130
|
|
89
131
|
it "raises a KeyError if it doesn't have a fetched component" do
|
90
|
-
entity.add_component( tags_component
|
132
|
+
entity.add_component( tags_component )
|
91
133
|
|
92
134
|
expect {
|
93
|
-
entity.
|
135
|
+
entity.find_component( location_component )
|
94
136
|
}.to raise_error( KeyError, /#{entity.id} doesn't have/i )
|
95
137
|
end
|
96
138
|
|
97
139
|
|
98
140
|
it "raises a KeyError if it doesn't have any of several fetched components" do
|
99
|
-
entity.add_component( tags_component
|
141
|
+
entity.add_component( tags_component )
|
100
142
|
|
101
143
|
expect {
|
102
|
-
entity.
|
144
|
+
entity.find_component( location_component, bounding_box_component )
|
103
145
|
}.to raise_error( KeyError, /#{entity.id} doesn't have any of/i )
|
104
146
|
end
|
105
147
|
|
data/spec/chione/system_spec.rb
CHANGED
@@ -27,11 +27,12 @@ describe Chione::System do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
|
30
|
-
describe "
|
30
|
+
describe "subclass" do
|
31
31
|
|
32
32
|
let( :subclass ) do
|
33
33
|
Class.new(described_class)
|
34
34
|
end
|
35
|
+
let( :world ) { Chione::World.new }
|
35
36
|
|
36
37
|
|
37
38
|
it "has a default Aspect which matches all entities" do
|
@@ -57,6 +58,39 @@ describe Chione::System do
|
|
57
58
|
end
|
58
59
|
|
59
60
|
|
61
|
+
describe "instance" do
|
62
|
+
|
63
|
+
let( :subclass ) do
|
64
|
+
subclass = super()
|
65
|
+
subclass.aspect all_of: volition_component,
|
66
|
+
one_of: [ tags_component, location_component ]
|
67
|
+
subclass
|
68
|
+
end
|
69
|
+
|
70
|
+
let( :instance ) do
|
71
|
+
subclass.new( world )
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
it "can enumerate the entities from the world that match its aspect" do
|
76
|
+
ent1 = world.create_entity
|
77
|
+
ent1.add_component( volition_component )
|
78
|
+
ent1.add_component( tags_component )
|
79
|
+
|
80
|
+
ent2 = world.create_entity
|
81
|
+
ent2.add_component( volition_component )
|
82
|
+
ent2.add_component( location_component )
|
83
|
+
|
84
|
+
ent3 = world.create_entity
|
85
|
+
ent3.add_component( volition_component )
|
86
|
+
|
87
|
+
expect( instance.entities ).to be_a( Enumerator )
|
88
|
+
expect( instance.entities ).to contain_exactly( ent1, ent2 )
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
end
|
93
|
+
|
60
94
|
end
|
61
95
|
|
62
96
|
end
|
data/spec/chione/world_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require_relative '../spec_helper'
|
|
5
5
|
require 'chione/world'
|
6
6
|
|
7
7
|
require 'chione/aspect'
|
8
|
-
require 'chione/
|
8
|
+
require 'chione/archetype'
|
9
9
|
require 'chione/component'
|
10
10
|
require 'chione/entity'
|
11
11
|
require 'chione/manager'
|
@@ -82,9 +82,9 @@ describe Chione::World do
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
let( :
|
85
|
+
let( :archetype ) do
|
86
86
|
mod = Module.new
|
87
|
-
mod.extend( Chione::
|
87
|
+
mod.extend( Chione::Archetype )
|
88
88
|
mod.add( location_component, x: 10, y: 8 )
|
89
89
|
mod.add( tags_component, tags: [:foo, :bar] )
|
90
90
|
mod
|
@@ -255,11 +255,11 @@ describe Chione::World do
|
|
255
255
|
end
|
256
256
|
|
257
257
|
|
258
|
-
it "can create entities using an
|
259
|
-
entity = world.create_entity(
|
258
|
+
it "can create entities using an Archetype" do
|
259
|
+
entity = world.create_entity( archetype )
|
260
260
|
|
261
261
|
expect( entity ).to be_a( Chione::Entity )
|
262
|
-
expect( entity.components.keys ).to include( *
|
262
|
+
expect( entity.components.keys ).to include( *archetype.components.keys )
|
263
263
|
end
|
264
264
|
|
265
265
|
|
data/spec/chione_spec.rb
CHANGED
@@ -5,6 +5,35 @@ require_relative 'spec_helper'
|
|
5
5
|
require 'chione'
|
6
6
|
|
7
7
|
describe Chione do
|
8
|
+
|
9
|
+
after( :all ) do
|
10
|
+
Chione::Component.derivatives.clear
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
it "can coerce Chione::Component classes into instances" do
|
15
|
+
component_class = Class.new( Chione::Component )
|
16
|
+
expect( Chione::Component(component_class) ).to be_instance_of( component_class )
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
it "can coerce Chione::Component class names into instances" do
|
21
|
+
component_class = Class.new( Chione::Component ) do
|
22
|
+
def self::name; "Thermidore"; end
|
23
|
+
end
|
24
|
+
Chione::Component.derivatives[ 'thermidore' ] = component_class
|
25
|
+
|
26
|
+
expect( Chione::Component(:thermidore) ).to be_instance_of( component_class )
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
it "returns coerced Chione::Component unchanged" do
|
31
|
+
component_class = Class.new( Chione::Component )
|
32
|
+
instance = component_class.new
|
33
|
+
|
34
|
+
expect( Chione::Component(instance) ).to equal( instance )
|
35
|
+
end
|
36
|
+
|
8
37
|
end
|
9
38
|
|
10
39
|
# vim: set nosta noet ts=4 sw=4:
|
data/spec/spec_helper.rb
CHANGED
@@ -4,10 +4,13 @@
|
|
4
4
|
require 'pathname'
|
5
5
|
require 'simplecov' if ENV['COVERAGE']
|
6
6
|
require 'rspec'
|
7
|
+
require 'deprecatable'
|
7
8
|
require 'loggability/spechelpers'
|
8
9
|
|
9
10
|
require 'chione'
|
10
11
|
|
12
|
+
Deprecatable.options.alert_frequency = :never
|
13
|
+
Deprecatable.options.has_at_exit_report = false
|
11
14
|
|
12
15
|
module Chione::TestHelpers
|
13
16
|
end
|
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.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
|
36
36
|
p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2017-05-
|
38
|
+
date: 2017-05-31 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: loggability
|
@@ -93,6 +93,20 @@ dependencies:
|
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '2.3'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: deprecatable
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1.0'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.0'
|
96
110
|
- !ruby/object:Gem::Dependency
|
97
111
|
name: hoe-mercurial
|
98
112
|
requirement: !ruby/object:Gem::Requirement
|
@@ -218,6 +232,7 @@ files:
|
|
218
232
|
- README.md
|
219
233
|
- Rakefile
|
220
234
|
- lib/chione.rb
|
235
|
+
- lib/chione/archetype.rb
|
221
236
|
- lib/chione/aspect.rb
|
222
237
|
- lib/chione/assemblage.rb
|
223
238
|
- lib/chione/behaviors.rb
|
@@ -227,8 +242,8 @@ files:
|
|
227
242
|
- lib/chione/mixins.rb
|
228
243
|
- lib/chione/system.rb
|
229
244
|
- lib/chione/world.rb
|
245
|
+
- spec/chione/archetype_spec.rb
|
230
246
|
- spec/chione/aspect_spec.rb
|
231
|
-
- spec/chione/assemblage_spec.rb
|
232
247
|
- spec/chione/component_spec.rb
|
233
248
|
- spec/chione/entity_spec.rb
|
234
249
|
- spec/chione/manager_spec.rb
|
@@ -259,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
274
|
version: '0'
|
260
275
|
requirements: []
|
261
276
|
rubyforge_project:
|
262
|
-
rubygems_version: 2.6.
|
277
|
+
rubygems_version: 2.6.11
|
263
278
|
signing_key:
|
264
279
|
specification_version: 4
|
265
280
|
summary: An Entity/Component System framework inspired by Artemis
|
metadata.gz.sig
CHANGED
Binary file
|
@@ -1,60 +0,0 @@
|
|
1
|
-
#!/usr/bin/env rspec -cfd
|
2
|
-
|
3
|
-
require_relative '../spec_helper'
|
4
|
-
|
5
|
-
require 'chione/assemblage'
|
6
|
-
require 'chione/component'
|
7
|
-
require 'chione/entity'
|
8
|
-
require 'chione/world'
|
9
|
-
|
10
|
-
describe Chione::Assemblage do
|
11
|
-
|
12
|
-
let( :world ) { Chione::World.new }
|
13
|
-
|
14
|
-
let( :location_component ) do
|
15
|
-
Class.new( Chione::Component ) do
|
16
|
-
field :x, default: 0
|
17
|
-
field :y, default: 0
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
let( :tags_component ) do
|
22
|
-
Class.new( Chione::Component ) do
|
23
|
-
field :tags, default: []
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
it "acts as a factory for entities with pre-set components" do
|
29
|
-
assemblage = Module.new
|
30
|
-
assemblage.extend( described_class )
|
31
|
-
assemblage.add( location_component, x: 10, y: 8 )
|
32
|
-
assemblage.add( tags_component, tags: [:foo, :bar] )
|
33
|
-
|
34
|
-
entity = assemblage.construct_for( world )
|
35
|
-
|
36
|
-
expect( entity ).to be_a( Chione::Entity )
|
37
|
-
expect( entity.world ).to be( world )
|
38
|
-
expect( entity.components ).to include( location_component, tags_component )
|
39
|
-
end
|
40
|
-
|
41
|
-
|
42
|
-
it "can include other assemblages" do
|
43
|
-
general_assemblage = Module.new
|
44
|
-
general_assemblage.extend( described_class )
|
45
|
-
general_assemblage.add( location_component, x: 10, y: 8 )
|
46
|
-
|
47
|
-
specific_assemblage = Module.new
|
48
|
-
specific_assemblage.extend( described_class )
|
49
|
-
specific_assemblage.send( :include, general_assemblage )
|
50
|
-
specific_assemblage.add( tags_component, tags: [:foo, :bar] )
|
51
|
-
|
52
|
-
entity = specific_assemblage.construct_for( world )
|
53
|
-
|
54
|
-
expect( entity ).to be_a( Chione::Entity )
|
55
|
-
expect( entity.world ).to be( world )
|
56
|
-
expect( entity.components ).to include( location_component, tags_component )
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|