metro 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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: