metro 0.1.1 → 0.1.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.
data/bin/metro CHANGED
@@ -7,5 +7,10 @@ end
7
7
  $:.unshift(File.join(File.dirname(File.expand_path(path)), '..', 'lib'))
8
8
 
9
9
  require 'metro'
10
+ require 'commands/thor'
10
11
 
11
- Metro.run(*ARGV)
12
+ if Metro::Thor.tasks.keys.include? ARGV.first
13
+ Metro::Thor.start
14
+ else
15
+ Metro.run(*ARGV)
16
+ end
data/changelog.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Metro
2
2
 
3
+ ## 0.1.2 / 2012-10-26
4
+
5
+ * Generators for games, scenes, models, and views
6
+
3
7
  ## 0.1.1 / 2012-10-25
4
8
 
5
9
  * FIX: Requiring the sender gem
@@ -0,0 +1,13 @@
1
+ module Metro
2
+
3
+ class GenerateGame < Generator
4
+
5
+ argument :name
6
+
7
+ def create_metro_file
8
+ directory "game", name
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,25 @@
1
+ module Metro
2
+
3
+ class GenerateModel < Generator
4
+
5
+ no_tasks do
6
+
7
+ def model_filename
8
+ name.snake_case
9
+ end
10
+
11
+ def model_name
12
+ name.camel_case
13
+ end
14
+
15
+ end
16
+
17
+ argument :name
18
+
19
+ def create_model_file
20
+ template "model.rb.erb", "models/#{model_filename}.rb"
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,26 @@
1
+ module Metro
2
+
3
+ class GenerateScene < Generator
4
+
5
+ no_tasks do
6
+
7
+ def scene_filename
8
+ scene_name = name.gsub(/_?Scene$/i,'')
9
+ "#{scene_name.snake_case}_scene"
10
+ end
11
+
12
+ def scene_class_name
13
+ scene_name = name.gsub(/_?Scene$/i,'')
14
+ "#{scene_name.camel_case}Scene"
15
+ end
16
+
17
+ end
18
+
19
+ argument :name
20
+
21
+ def create_scene_file
22
+ template "scene.rb.erb", "scenes/#{scene_filename}.rb"
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,21 @@
1
+ module Metro
2
+
3
+ class GenerateView < Generator
4
+
5
+ no_tasks do
6
+
7
+ def view_filename
8
+ view_name = name.to_s.gsub(/_?Scene$/i,'')
9
+ view_name.snake_case
10
+ end
11
+
12
+ end
13
+
14
+ argument :name
15
+
16
+ def create_view_file
17
+ template "view.yaml.erb", "views/#{view_filename}.yaml"
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,77 @@
1
+ require 'thor'
2
+ require 'thor/group'
3
+
4
+ module Metro
5
+
6
+ class Generator < ::Thor::Group
7
+ include Thor::Actions
8
+
9
+ def self.source_root
10
+ File.join File.dirname(__FILE__), "..", "templates"
11
+ end
12
+ end
13
+
14
+ class UnknownGenerator
15
+
16
+ def self.start(commands)
17
+ raise "There is no command: [ #{commands.join(', ')} ]"
18
+ end
19
+
20
+ end
21
+
22
+
23
+ class Thor < Thor
24
+
25
+ no_tasks do
26
+
27
+ def banner
28
+ """
29
+ ********************************************************************************
30
+ ______ ___ _____
31
+ ___ |/ /_____ __ /_______________
32
+ __ /|_/ / _ _ \\_ __/__ ___/_ __ \\
33
+ _ / / / / __// /_ _ / / /_/ /
34
+ /_/ /_/ \\___/ \\__/ /_/ \\____/
35
+
36
+ -------------------------------------------------------------------------------"""
37
+ end
38
+
39
+ def generators
40
+ Hash.new(UnknownGenerator).merge model: Metro::GenerateModel,
41
+ scene: Metro::GenerateScene,
42
+ view: Metro::GenerateView
43
+ end
44
+
45
+ def generator(name)
46
+ generators[name.to_sym]
47
+ end
48
+
49
+ end
50
+
51
+ desc "new [GAMENAME]",
52
+ "Create a new game within the directory using with the [GAMENAME] given."
53
+ def new(game_name)
54
+ Metro::GenerateGame.start [ game_name ]
55
+ end
56
+
57
+ desc "generate",
58
+ "Create a new game model, view, or scene"
59
+ def generate(type,name)
60
+ gen = generator(type)
61
+ gen.start [ name ]
62
+ end
63
+
64
+ desc "help", "This commoand"
65
+ def help(topic)
66
+ say banner
67
+ print_table self.class.printable_tasks, indent: 4
68
+ end
69
+
70
+ end
71
+ end
72
+
73
+
74
+ require_relative 'generate_game'
75
+ require_relative 'generate_model'
76
+ require_relative 'generate_scene'
77
+ require_relative 'generate_view'
@@ -0,0 +1,15 @@
1
+ class String
2
+
3
+ def snake_case
4
+ snaked_string = self.gsub(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
5
+ snaked_string.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
6
+ snaked_string.downcase
7
+ end
8
+
9
+ def camel_case
10
+ camel_string = self.to_s.gsub(/Scene$/i,'')
11
+ camel_string = camel_string.sub(/^[a-z\d]*/) { $&.capitalize }
12
+ camel_string = camel_string.gsub(/(?:_|(\/))([a-z\d]*)/i) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
13
+ end
14
+
15
+ end
data/lib/metro.rb CHANGED
@@ -2,6 +2,7 @@ require 'gosu'
2
2
  require 'gosu_ext/color'
3
3
  require 'sender'
4
4
 
5
+ require 'core_ext/string'
5
6
  require 'logger'
6
7
  require 'erb'
7
8
 
@@ -9,13 +9,14 @@ module Metro
9
9
  #
10
10
  class Image < Model
11
11
 
12
- attr_accessor :angle, :center_x, :center_y, :x_factor, :y_factor
12
+ attr_accessor :angle, :center_x, :center_y, :x_factor, :y_factor, :z_order
13
13
 
14
14
  def after_initialize
15
15
  @angle = 0
16
16
  @center_x = @center_y = 0.5
17
17
  @x_factor = @y_factor = 1
18
18
  @z_order = 0
19
+ @color = Gosu::Color.new "rgba(255,255,255,1.0)"
19
20
  end
20
21
 
21
22
  def image
data/lib/metro/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Metro
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  WEBSITE = "https://github.com/burtlo/metro"
4
4
  CONTACT_EMAILS = ["franklin.webber@gmail.com"]
5
5
 
@@ -0,0 +1,10 @@
1
+ # <%= name %>
2
+
3
+ ## Details
4
+
5
+ Additional information or backstory about the game that you
6
+ are creating. This file's intention is to allow a user to
7
+ refer to this for more information related to the game or
8
+ possibly any notes or caveats about the game.
9
+
10
+ ## Contact
Binary file
@@ -0,0 +1,51 @@
1
+ #
2
+ # This is the main game file which contains information
3
+ # about your game. T
4
+ #
5
+ # Remember, this is really a ruby file, so anything
6
+ # that can be done with Ruby can be written here.
7
+ #
8
+ # "With great power comes great responsibility" ~ Uncle Ben
9
+
10
+ #
11
+ # This is the name of your game...
12
+ name "<%= name %>"
13
+
14
+ #
15
+ # The author of the game. This method can be executed
16
+ # twice if more people are working on this game.
17
+ #
18
+ author "John Carmack"
19
+
20
+ #
21
+ # The website where the person playing this game
22
+ # could learn more about this game, other games, the
23
+ # authors, or perhaps ask for help or support.
24
+ #
25
+ website "www.idsoftware.com"
26
+
27
+ #
28
+ # The contact email address where a person that is
29
+ # playing the game might want to contact to thank
30
+ # or reach out for help.
31
+ #
32
+ contact "person@personemail.com"
33
+
34
+ #
35
+ # This sets the resolution for the game
36
+ #
37
+ resolution 640, 480
38
+
39
+ #
40
+ # The scene that will be shown first when the game
41
+ # starts.
42
+ #
43
+ first_scene :brand
44
+
45
+ #
46
+ # Enable debug mode for the game. Which could
47
+ # allow different logic. When this is set the
48
+ # Metro::Game.debug? method will return a true
49
+ # value.
50
+ #
51
+ # debug true
@@ -0,0 +1,13 @@
1
+ class BrandScene < Metro::Scene
2
+
3
+ draws :brand
4
+
5
+ event :on_up, Gosu::KbEscape, Gosu::KbSpace, Gosu::GpButton0 do
6
+
7
+ animate actor: brand, to: { alpha: 0 }, interval: 60 do
8
+ transition_to :brand_to_title
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ class BrandToTitleScene < Metro::Scene
2
+
3
+ draws :title
4
+
5
+ animate actor: :title, to: { alpha: 255 }, interval: 120 do
6
+ transition_to :title
7
+ end
8
+
9
+ event :on_up, Gosu::KbEscape do
10
+ transition_to :title
11
+ end
12
+
13
+ end
@@ -0,0 +1,15 @@
1
+ class TitleScene < Metro::Scene
2
+
3
+ draw :title
4
+
5
+ draw :menu, options: [ 'Start Game', 'Exit' ]
6
+
7
+ event :on_up, Gosu::KbEscape do
8
+ exit
9
+ end
10
+
11
+ def start_game
12
+ transition_to :first
13
+ end
14
+
15
+ end
@@ -0,0 +1,5 @@
1
+ brand:
2
+ model: metro::models::image
3
+ path: brand.jpg
4
+ x: 320
5
+ y: 240
@@ -0,0 +1,9 @@
1
+ title:
2
+ model: metro::models::label
3
+ text: "#{Metro::Game.name}"
4
+ x: 120
5
+ y: 40
6
+ x-factor: 2
7
+ y-factor: 2
8
+ color: rgba(255,255,255,0.0)
9
+
@@ -0,0 +1,14 @@
1
+ title:
2
+ model: metro::models::label
3
+ text: "#{Metro::Game.name}"
4
+ x: 120
5
+ y: 40
6
+ x-factor: 2
7
+ y-factor: 2
8
+ color: rgba(255,255,255,1.0)
9
+ menu:
10
+ model: metro::models::menu
11
+ x: 260
12
+ y: 200
13
+ color: rgb(127,127,127)
14
+ highlight-color: rgb(255,255,255)
@@ -0,0 +1,59 @@
1
+ class <%= model_name %> < Metro::Model
2
+
3
+ #
4
+ # Example Event Handling Definitions
5
+ #
6
+ # @example Registering the keyboard down event to execute a block of code
7
+ #
8
+ # event :on_down, Gosu::GpLeft, Gosu::GpUp, do
9
+ # turn_left
10
+ # end
11
+ #
12
+ # @example Registering the keyboard up key to execute the method `jump`
13
+ #
14
+ # event :on_up, Gosu::KbEscape, do: :jump
15
+ #
16
+ # @example Registering for button held events that would build the model's acceleration
17
+ #
18
+ # event :on_hold, Gosu::KbRight, Gosu::GpRight do
19
+ # acceleration += 1
20
+ # end
21
+ #
22
+ # Keystroke and Game Event Reference
23
+ #
24
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsMac.hpp
25
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsX.hpp
26
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsWin.hpp
27
+ #
28
+ #
29
+ # @example Registering for an event called 'save_complete' event that anyone
30
+ # can generate and this scene block will execute this code.
31
+ #
32
+ # event :notification, :game_over do
33
+ # puts "Game is Over!"
34
+ # end
35
+ #
36
+ # Within the models you could use the method `notification`
37
+ # to generate the notification
38
+ #
39
+ # def update_score
40
+ # score = score + 1
41
+ # if score >= winning_score
42
+ # notification :game_over
43
+ # end
44
+ #
45
+
46
+ #
47
+ # As model does a lot of work for you with regarding to setting up content, it is
48
+ # best not to override #initialize and instead define an #after_initialize method
49
+ # within the subclasses of Scene.
50
+ #
51
+ def after_initialize ; end
52
+
53
+ #
54
+ # This is called after every {#update} and when the OS wants the window to
55
+ # repaint itself.
56
+ #
57
+ def draw ; end
58
+
59
+ end
@@ -0,0 +1,117 @@
1
+ class <%= scene_class_name %> < Metro::Scene
2
+ # By default the Scene Name is based on the class name
3
+ # but that can be overriden with the scene_name class method
4
+ # scene_name "credits"
5
+
6
+ #
7
+ # DRAWING and ACTORS
8
+ #
9
+ # @example Explicitly drawing a text label in the scene
10
+ #
11
+ # draw :title, 'text' => 'Title Screen',
12
+ # 'x' => 20, 'y' => 20, 'z-order' => 0,
13
+ # 'x-factor' => 3, 'y-factor' => 3,
14
+ # 'color' => 0xffffffff,
15
+ # 'model' => 'metro::models::label'
16
+ #
17
+ # The draw method can be simplier for models that have content defined
18
+ # for them in the view or the models themselves define the appropriate
19
+ # fields.
20
+ #
21
+ # @example defining multiple things to draw; their visual data would be
22
+ # stored within the respective view file
23
+ #
24
+ # draws :menu, :hero, :enemy
25
+ #
26
+
27
+ #
28
+ # ANIMATIONS
29
+ #
30
+ # @example of the title being moved to a new y position and the alpha level
31
+ #
32
+ # animate actor: :title, to: { y: 80, alpha: 50 }, interval: 120 do
33
+ # puts "Done Animating!"
34
+ # end
35
+ #
36
+
37
+ #
38
+ # Example Event Handling Definitions
39
+ #
40
+ # @example Registering the keyboard down event to execute a block of code
41
+ #
42
+ # event :on_down, Gosu::GpLeft, Gosu::GpUp, do
43
+ # transition_to :next_scene
44
+ # end
45
+ #
46
+ # @example Registering the keyboard up key to execute the method `leave_scene`
47
+ #
48
+ # event :on_up, Gosu::KbEscape, do: :leave_scene
49
+ #
50
+ # @example Registering for button held events that would move an actor named `player`
51
+ #
52
+ # event :on_hold, Gosu::KbRight, Gosu::GpRight do
53
+ # title.alpha = title.alpha - 1
54
+ # end
55
+ # Keystroke and Game Event Reference
56
+ #
57
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsMac.hpp
58
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsX.hpp
59
+ # @see https://github.com/jlnr/gosu/blob/master/Gosu/ButtonsWin.hpp
60
+ #
61
+ #
62
+ # @example Registering for an event called 'save_complete' event that anyone
63
+ # can generate and this scene block will execute this code.
64
+ #
65
+ # event :notification, :save_complete do
66
+ # puts "Save Complete!"
67
+ # end
68
+ #
69
+ # Within the scene or in the models you could use the method `notification`
70
+ # to generate the notification
71
+ #
72
+ # def update
73
+ # if game_save.complete?
74
+ # notification :save_complete
75
+ # end
76
+ # end
77
+ #
78
+
79
+ #
80
+ # As Scene does a lot of work for you with regarding to setting up content, it is
81
+ # best not to override #initialize and instead define an #after_initialize method
82
+ # within the subclasses of Scene.
83
+ #
84
+ def after_initialize ; end
85
+
86
+ #
87
+ # This method is called right after the scene has been adopted by the window
88
+ #
89
+ def show ; end
90
+
91
+ #
92
+ # This is called every update interval while the window is being shown.
93
+ #
94
+ def update ; end
95
+
96
+ #
97
+ # This is called after every {#update} and when the OS wants the window to
98
+ # repaint itself.
99
+ #
100
+ def draw ; end
101
+
102
+ #
103
+ # Before a scene is transisitioned away from to a new scene, this method is called
104
+ # to allow for the scene to complete any taskss, stop any actions, or pass any
105
+ # information from the existing scene to the scene that is about to replace it.
106
+ #
107
+ def prepare_transition_to(new_scene) ; end
108
+
109
+ #
110
+ # Before a scene is transisitioned to it is called with the previous scene. This
111
+ # allows for the new scene to rerieve any data from the previous scene to assist
112
+ # with the layout of the current scene.
113
+ #
114
+ def prepare_transition_from(old_scene) ; end
115
+
116
+
117
+ end
@@ -0,0 +1,32 @@
1
+ title:
2
+ model: metro::models::label
3
+ text: STARRY KNIGHT
4
+ x: 30
5
+ y: 50
6
+ z-order: 4
7
+ x-factor: 3
8
+ y-factor: 3
9
+ color: "rgba(255,255,0,0.0)"
10
+ logo:
11
+ model: metro::models::image
12
+ x: 540
13
+ y: 380
14
+ z-order: 4
15
+ path: "player.png"
16
+ color: "rgba(255,255,255,0.0)"
17
+ star: &star_default
18
+ model: star
19
+ x: 100
20
+ y: 400
21
+ path: "star.png"
22
+ width: 25
23
+ height: 25
24
+ tileable: false
25
+ star2:
26
+ <<: *star_default
27
+ x: 455
28
+ y: 333
29
+ star3:
30
+ <<: *star_default
31
+ x: 515
32
+ y: 40
data/metro.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |gem|
25
25
  gem.homepage = Metro::WEBSITE
26
26
 
27
27
  gem.add_dependency 'gosu', '~> 0.7'
28
+ gem.add_dependency 'thor', '~> 0.16.0'
28
29
  gem.add_dependency 'sender', '~> 1.5.10'
29
30
  gem.add_development_dependency 'rspec', '~> 2.11'
30
31
 
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+
5
+ describe "#snake_case" do
6
+ context "when given a regular string" do
7
+ subject { "String" }
8
+ let(:expected_value) { "string" }
9
+
10
+ its(:snake_case) { should eq expected_value }
11
+ end
12
+
13
+ context "when given an already snake cased string" do
14
+ subject { "snake_cased" }
15
+ let(:expected_value) { "snake_cased" }
16
+
17
+ its(:snake_case) { should eq expected_value }
18
+ end
19
+
20
+ context "when given a camelCased string" do
21
+ subject { "SnakeCased" }
22
+ let(:expected_value) { "snake_cased" }
23
+
24
+ its(:snake_case) { should eq expected_value }
25
+ end
26
+
27
+ context "when given a partial camel_Cased string" do
28
+ subject { "snake_Cased" }
29
+ let(:expected_value) { "snake_cased" }
30
+ its(:snake_case) { should eq expected_value }
31
+ end
32
+ end
33
+
34
+ describe "#camel_case" do
35
+ context "when given a regular string" do
36
+ subject { "string" }
37
+ let(:expected_value) { "String" }
38
+ its(:camel_case) { should eq expected_value }
39
+ end
40
+
41
+ context "when given a snake_cased string" do
42
+ subject { "camel_cased" }
43
+ let(:expected_value) { "CamelCased" }
44
+ its(:camel_case) { should eq expected_value }
45
+ end
46
+
47
+ context "when given a partial camel_CasedString" do
48
+ subject { "camel_CasedString" }
49
+ let(:expected_value) { "CamelCasedstring" }
50
+ its(:camel_case) { should eq expected_value }
51
+ end
52
+ end
53
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-25 00:00:00.000000000 Z
12
+ date: 2012-10-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: gosu
@@ -27,6 +27,22 @@ dependencies:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
29
  version: '0.7'
30
+ - !ruby/object:Gem::Dependency
31
+ name: thor
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 0.16.0
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 0.16.0
30
46
  - !ruby/object:Gem::Dependency
31
47
  name: sender
32
48
  requirement: !ruby/object:Gem::Requirement
@@ -78,6 +94,12 @@ files:
78
94
  - Rakefile
79
95
  - bin/metro
80
96
  - changelog.md
97
+ - lib/commands/generate_game.rb
98
+ - lib/commands/generate_model.rb
99
+ - lib/commands/generate_scene.rb
100
+ - lib/commands/generate_view.rb
101
+ - lib/commands/thor.rb
102
+ - lib/core_ext/string.rb
81
103
  - lib/gosu_ext/color.rb
82
104
  - lib/metro.rb
83
105
  - lib/metro/animation/animation.rb
@@ -109,8 +131,21 @@ files:
109
131
  - lib/metro/template_message.rb
110
132
  - lib/metro/version.rb
111
133
  - lib/metro/window.rb
134
+ - lib/templates/game/README.md.tt
135
+ - lib/templates/game/assets/brand.jpg
136
+ - lib/templates/game/metro.tt
137
+ - lib/templates/game/scenes/brand_scene.rb
138
+ - lib/templates/game/scenes/brand_to_title_scene.rb
139
+ - lib/templates/game/scenes/title_scene.rb
140
+ - lib/templates/game/views/brand.yaml
141
+ - lib/templates/game/views/brand_to_title.yaml
142
+ - lib/templates/game/views/title.yaml
112
143
  - lib/templates/message.erb
144
+ - lib/templates/model.rb.erb
145
+ - lib/templates/scene.rb.erb
146
+ - lib/templates/view.yaml.erb
113
147
  - metro.gemspec
148
+ - spec/core_ext/string_spec.rb
114
149
  - spec/gosu_ext/color_spec.rb
115
150
  - spec/spec_helper.rb
116
151
  homepage: https://github.com/burtlo/metro
@@ -118,8 +153,8 @@ licenses: []
118
153
  post_install_message: ! " ______ ___ _____\n ___ |/ /_____ __ /_______________\n
119
154
  \ __ /|_/ / _ _ \\_ __/__ ___/_ __ \\\n _ / / / / __// /_ _ / /
120
155
  /_/ /\n /_/ /_/ \\___/ \\__/ /_/ \\____/\n\n Thank you for installing
121
- metro 0.1.1 / 2012-10-25.\n ---------------------------------------------------------------------\n
122
- \ Changes:\n \n * FIX: Requiring the sender gem\n \n\n ---------------------------------------------------------------------\n"
156
+ metro 0.1.2 / 2012-10-26.\n ---------------------------------------------------------------------\n
157
+ \ Changes:\n \n * Generators for games, scenes, models, and views\n \n\n ---------------------------------------------------------------------\n"
123
158
  rdoc_options: []
124
159
  require_paths:
125
160
  - lib
@@ -144,6 +179,7 @@ summary: Metro is a 2D Gaming framework built around gosu (game development libr
144
179
  Metro makes it easy to create games by enforcing common conceptual structures and
145
180
  conventions.
146
181
  test_files:
182
+ - spec/core_ext/string_spec.rb
147
183
  - spec/gosu_ext/color_spec.rb
148
184
  - spec/spec_helper.rb
149
185
  has_rdoc: