yogi_berra 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,5 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem "mongo", "~> 1.8.3"
4
4
  gem "rspec", "~> 2.13.0"
5
+ gem "builder", "~> 3.2.1"
6
+ gem "rake", "~> 10.0.4"
5
7
 
6
8
  gemspec
data/Gemfile.lock CHANGED
@@ -12,12 +12,26 @@ GEM
12
12
  bson (1.8.3)
13
13
  bson_ext (1.8.3)
14
14
  bson (~> 1.8.3)
15
+ builder (3.2.1)
16
+ diff-lcs (1.2.4)
15
17
  mongo (1.8.3)
16
18
  bson (~> 1.8.3)
19
+ rake (10.0.4)
20
+ rspec (2.13.0)
21
+ rspec-core (~> 2.13.0)
22
+ rspec-expectations (~> 2.13.0)
23
+ rspec-mocks (~> 2.13.0)
24
+ rspec-core (2.13.1)
25
+ rspec-expectations (2.13.0)
26
+ diff-lcs (>= 1.1.3, < 2.0)
27
+ rspec-mocks (2.13.1)
17
28
 
18
29
  PLATFORMS
19
30
  ruby
20
31
 
21
32
  DEPENDENCIES
33
+ builder (~> 3.2.1)
22
34
  mongo (~> 1.8.3)
35
+ rake (~> 10.0.4)
36
+ rspec (~> 2.13.0)
23
37
  yogi_berra!
data/README.md CHANGED
@@ -33,6 +33,11 @@ Create a yogi.yml file in rails root config/ folder. Here is a sample:
33
33
  database: yogi_berra
34
34
  host: localhost
35
35
  port: 27017
36
+
37
+ View
38
+ ----
39
+ To view the exceptions you check them in the database or install this rails app.
40
+ https://github.com/earlonrails/yogi_berra_scoreboard.git
36
41
 
37
42
  Thanks
38
43
  ------
data/Rakefile CHANGED
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
  require 'rubygems/package_task'
3
3
  require 'rspec/core/rake_task'
4
4
 
5
- spec = eval(File.read('yogi_berra_client.gemspec'))
5
+ spec = eval(File.read('yogi_berra.gemspec'))
6
6
 
7
7
  Gem::PackageTask.new(spec) do |p|
8
8
  p.gem_spec = spec
data/lib/facets.rb ADDED
@@ -0,0 +1,280 @@
1
+ # Taken from https://github.com/rubyworks/facets/blob/master/lib/core/facets/module/mattr.rb
2
+ module Facets
3
+
4
+ # Creates a class-variable attribute that can
5
+ # be accessed both on an instance and class level.
6
+ #
7
+ # class CARExample
8
+ # @@a = 10
9
+ # cattr :a
10
+ # end
11
+ #
12
+ # CARExample.a #=> 10
13
+ # CARExample.new.a #=> 10
14
+ #
15
+ # NOTE: This method is not a common core extension and is not
16
+ # loaded automatically when using <code>require 'facets'</code>.
17
+ #
18
+ # CREDIT: David Heinemeier Hansson
19
+ #
20
+ # @uncommon
21
+ # require 'facets/module/cattr'
22
+ #
23
+ def cattr(*syms)
24
+ writers, readers = syms.flatten.partition{ |a| a.to_s =~ /=$/ }
25
+ writers = writers.map{ |e| e.to_s.chomp('=').to_sym }
26
+ ##readers.concat( writers ) # writers also get readers
27
+
28
+ cattr_reader(*readers)
29
+ cattr_writer(*writers)
30
+
31
+ return readers + writers
32
+ end
33
+
34
+ # Creates a class-variable attr_reader that can
35
+ # be accessed both on an instance and class level.
36
+ #
37
+ # class CARExample
38
+ # @@a = 10
39
+ # cattr_reader :a
40
+ # end
41
+ #
42
+ # CARExample.a #=> 10
43
+ # CARExample.new.a #=> 10
44
+ #
45
+ # NOTE: This method is not a common core extension and is not
46
+ # loaded automatically when using <code>require 'facets'</code>.
47
+ #
48
+ # CREDIT: David Heinemeier Hansson
49
+ #
50
+ # @uncommon
51
+ # require 'facets/module/cattr'
52
+ #
53
+ def cattr_reader(*syms)
54
+ syms.flatten.each do |sym|
55
+ module_eval(<<-EOS, __FILE__, __LINE__)
56
+ unless defined? @@#{sym}
57
+ @@#{sym} = nil
58
+ end
59
+
60
+ def self.#{sym}
61
+ @@#{sym}
62
+ end
63
+
64
+ def #{sym}
65
+ @@#{sym}
66
+ end
67
+ EOS
68
+ end
69
+ return syms
70
+ end
71
+
72
+ # Creates a class-variable attr_writer that can
73
+ # be accessed both on an instance and class level.
74
+ #
75
+ # class CAWExample
76
+ # cattr_writer :a
77
+ # def self.a
78
+ # @@a
79
+ # end
80
+ # end
81
+ #
82
+ # CAWExample.a = 10
83
+ # CAWExample.a #=> 10
84
+ # CAWExample.new.a = 29
85
+ # CAWExample.a #=> 29
86
+ #
87
+ # NOTE: This method is not a common core extension and is not
88
+ # loaded automatically when using <code>require 'facets'</code>.
89
+ #
90
+ # CREDIT: David Heinemeier Hansson
91
+ #
92
+ # @uncommon
93
+ # require 'facets/module/cattr'
94
+ #
95
+ def cattr_writer(*syms)
96
+ syms.flatten.each do |sym|
97
+ module_eval(<<-EOS, __FILE__, __LINE__)
98
+ unless defined? @@#{sym}
99
+ @@#{sym} = nil
100
+ end
101
+
102
+ def self.#{sym}=(obj)
103
+ @@#{sym} = obj
104
+ end
105
+
106
+ def #{sym}=(obj)
107
+ @@#{sym}=(obj)
108
+ end
109
+ EOS
110
+ end
111
+ return syms
112
+ end
113
+
114
+ # Creates a class-variable attr_accessor that can
115
+ # be accessed both on an instance and class level.
116
+ #
117
+ # class CAAExample
118
+ # cattr_accessor :a
119
+ # end
120
+ #
121
+ # CAAExample.a = 10
122
+ # CAAExample.a #=> 10
123
+ # mc = CAAExample.new
124
+ # mc.a #=> 10
125
+ #
126
+ # NOTE: This method is not a common core extension and is not
127
+ # loaded automatically when using <code>require 'facets'</code>.
128
+ #
129
+ # CREDIT: David Heinemeier Hansson
130
+ #
131
+ # @uncommon
132
+ # require 'facets/module/cattr'
133
+ #
134
+ def cattr_accessor(*syms)
135
+ cattr_reader(*syms) + cattr_writer(*syms)
136
+ end
137
+
138
+ # Creates a class-variable attribute that can
139
+ # be accessed both on an instance and class level.
140
+ #
141
+ # c = Class.new do
142
+ # mattr :a
143
+ # def initialize
144
+ # @@a = 10
145
+ # end
146
+ # end
147
+ #
148
+ # c.new.a #=> 10
149
+ # c.a #=> 10
150
+ #
151
+ # NOTE: The #mattr methods may not be as useful for modules as the #cattr
152
+ # methods are for classes, becuase class-level methods are not "inherited"
153
+ # across the metaclass for included modules.
154
+ #
155
+ # NOTE: This methiod is not a common core extension and is not
156
+ # loaded automatically when using <code>require 'facets'</code>.
157
+ #
158
+ # CREDIT: David Heinemeier Hansson
159
+ #
160
+ # @uncommon
161
+ # require 'facets/module/mattr'
162
+ #
163
+ def mattr(*syms)
164
+ writers, readers = syms.flatten.partition{ |a| a.to_s =~ /=$/ }
165
+ writers = writers.collect{ |e| e.to_s.chomp('=').to_sym }
166
+ ##readers.concat( writers ) # writers also get readers
167
+
168
+ mattr_writer( *writers )
169
+ mattr_reader( *readers )
170
+
171
+ return readers + writers
172
+ end
173
+
174
+ # Creates a class-variable attr_reader that can
175
+ # be accessed both on an instance and class level.
176
+ #
177
+ # c = Class.new do
178
+ # @@a = 10
179
+ # mattr_reader :a
180
+ # end
181
+ #
182
+ # c.a #=> 10
183
+ # c.new.a #=> 10
184
+ #
185
+ # NOTE: This methiod is not a common core extension and is not
186
+ # loaded automatically when using <code>require 'facets'</code>.
187
+ #
188
+ # CREDIT: David Heinemeier Hansson
189
+ #
190
+ # @uncommon
191
+ # require 'facets/module/mattr'
192
+ #
193
+ def mattr_reader( *syms )
194
+ syms.flatten.each do |sym|
195
+ module_eval(<<-EOS, __FILE__, __LINE__)
196
+ unless defined? @@#{sym}
197
+ @@#{sym} = nil
198
+ end
199
+
200
+ def self.#{sym}
201
+ @@#{sym}
202
+ end
203
+
204
+ def #{sym}
205
+ @@#{sym}
206
+ end
207
+ EOS
208
+ end
209
+ return syms
210
+ end
211
+
212
+ # Creates a class-variable attr_writer that can
213
+ # be accessed both on an instance and class level.
214
+ #
215
+ # c = Class.new do
216
+ # mattr_writer :a
217
+ # def self.a
218
+ # @@a
219
+ # end
220
+ # end
221
+ #
222
+ # c.a = 10
223
+ # c.a #=> 10
224
+ #
225
+ # c.new.a = 29
226
+ # c.a #=> 29
227
+ #
228
+ # NOTE: This methiod is not a common core extension and is not
229
+ # loaded automatically when using <code>require 'facets'</code>.
230
+ #
231
+ # CREDIT: David Heinemeier Hansson
232
+ #
233
+ # @uncommon
234
+ # require 'facets/module/mattr'
235
+ #
236
+ def mattr_writer(*syms)
237
+ syms.flatten.each do |sym|
238
+ module_eval(<<-EOS, __FILE__, __LINE__)
239
+ unless defined? @@#{sym}
240
+ @@#{sym} = nil
241
+ end
242
+
243
+ def self.#{sym}=(obj)
244
+ @@#{sym} = obj
245
+ end
246
+
247
+ def #{sym}=(obj)
248
+ @@#{sym}=(obj)
249
+ end
250
+ EOS
251
+ end
252
+ return syms
253
+ end
254
+
255
+ # Creates a class-variable attr_accessor that can
256
+ # be accessed both on an instance and class level.
257
+ #
258
+ # c = Class.new do
259
+ # mattr_accessor :a
260
+ # end
261
+ #
262
+ # c.a = 10
263
+ # c.a #=> 10
264
+ #
265
+ # x = c.new
266
+ # x.a #=> 10
267
+ #
268
+ # NOTE: This methiod is not a common core extension and is not
269
+ # loaded automatically when using <code>require 'facets'</code>.
270
+ #
271
+ # CREDIT: David Heinemeier Hansson
272
+ #
273
+ # @uncommon
274
+ # require 'facets/module/mattr'
275
+ #
276
+ def mattr_accessor(*syms)
277
+ mattr_reader(*syms) + mattr_writer(*syms)
278
+ end
279
+
280
+ end
@@ -1,18 +1,31 @@
1
1
  require 'mongo'
2
+ require 'facets'
2
3
 
3
4
  module YogiBerra
4
5
  class Catcher
6
+ extend Facets
5
7
  cattr_accessor :settings, :mongo_client, :connection
6
8
 
7
9
  class << self
8
- def load_db_settings
9
- begin
10
- File.open("#{Rails.root}/config/yogi.yml", 'r') do |f|
11
- yaml_file = YAML.load(f)
12
- @@settings = yaml_file["#{Rails.env}"] if yaml_file
10
+ def load_db_settings(config_file = nil)
11
+ if config_file
12
+ database_config = config_file
13
+ elsif defined?(Rails)
14
+ database_config = "#{Rails.root}/config/yogi.yml"
15
+ else
16
+ YogiBerra::Logger.log("No config file specified!", :error)
17
+ end
18
+ if database_config
19
+ begin
20
+ File.open(database_config, 'r') do |f|
21
+ yaml_file = YAML.load(f)
22
+ environment = ENV["RAILS_ENV"] ? ENV["RAILS_ENV"] : ENV["YOGI_ENV"]
23
+ YogiBerra::Logger.log("I get here! #{environment.inspect}", :info)
24
+ @@settings = yaml_file["#{environment}"] if yaml_file
25
+ end
26
+ rescue
27
+ YogiBerra::Logger.log("No such file: #{database_config}", :error)
13
28
  end
14
- rescue
15
- $stderr.puts "[YogiBerra Error] No such file: #{Rails.root}/config/yogi.yml"
16
29
  end
17
30
  end
18
31
 
@@ -21,12 +34,14 @@ module YogiBerra
21
34
  # by not waiting for a response from mongodb
22
35
  @@mongo_client = Mongo::MongoClient.new(host, port, :w => 0)
23
36
  rescue
24
- Rails.logger.error "[YogiBerra Error] Couldn't connect to the mongo database on host: #{host} port: #{port}."
37
+ YogiBerra::Logger.log("Couldn't connect to the mongo database on host: #{host} port: #{port}.", :error)
25
38
  nil
26
39
  end
27
40
 
28
41
  def quick_connection
42
+ YogiBerra::Logger.log("settings::::::::::: #{settings.inspect}", :info)
29
43
  settings = @@settings || load_db_settings
44
+
30
45
  if settings
31
46
  host = settings["host"]
32
47
  port = settings["port"]
@@ -34,10 +49,10 @@ module YogiBerra
34
49
  if client
35
50
  @@connection = client[settings["database"]]
36
51
  else
37
- Rails.logger.error "[YogiBerra Error] Couldn't connect to the mongo database on host: #{host} port: #{port}."
52
+ YogiBerra::Logger.log("Couldn't connect to the mongo database on host: #{host} port: #{port}.", :error)
38
53
  end
39
54
  else
40
- Rails.logger.error "[YogiBerra Error] Couldn't load the yogi.yml file."
55
+ YogiBerra::Logger.log("Couldn't load the yogi.yml file.", :error)
41
56
  end
42
57
  end
43
58
  end
@@ -13,8 +13,10 @@ module YogiBerra
13
13
  end
14
14
 
15
15
  def self.parse_exception(notice)
16
+ puts YogiBerra::Catcher.settings["project"].inspect
16
17
  data_hash = {
17
18
  :error_class => notice.error_class,
19
+ :project => YogiBerra::Catcher.settings["project"],
18
20
  :error_message => notice.error_message
19
21
  }
20
22
  if notice.backtrace.lines.any?
@@ -7,10 +7,12 @@ module YogiBerra
7
7
 
8
8
  def call(env)
9
9
  begin
10
+ path_parameters = env['action_controller.request.path_parameters'] || {}
11
+ query_hash = env['rack.request.query_hash'] || {}
10
12
  response = dup._call(env)
11
13
  environment = {
12
14
  :session => env['rack.session'],
13
- :params => env['action_controller.request.path_parameters'].merge(env['rack.request.query_hash']),
15
+ :params => path_parameters.merge(query_hash),
14
16
  :user_agent => env['HTTP_USER_AGENT'],
15
17
  :server_name => env['SERVER_NAME'],
16
18
  :server_port => env['SERVER_PORT'],
@@ -0,0 +1,12 @@
1
+ module YogiBerra
2
+ class Logger
3
+ def self.log(log_string, level = :info)
4
+ message = "[YogiBerra #{level.to_s.capitalize}] #{log_string}"
5
+ if defined?(Rails)
6
+ Rails.logger.send(level, message)
7
+ else
8
+ $stderr.puts(message)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -18,8 +18,7 @@ module YogiBerra
18
18
  end
19
19
 
20
20
  if defined?(::Rails.configuration) && ::Rails.configuration.respond_to?(:middleware)
21
- ::Rails.configuration.middleware.insert_after 'ActionController::Failsafe',
22
- YogiBerra::ExceptionMiddleware
21
+ ::Rails.configuration.middleware.insert_after('ActionController::Failsafe', YogiBerra::ExceptionMiddleware)
23
22
  # ::Rails.configuration.middleware.insert_after 'Rack::Lock',
24
23
  # YogiBerra::UserInformer
25
24
  end
@@ -1,3 +1,3 @@
1
1
  module YogiBerra
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/yogi_berra.rb CHANGED
@@ -1,13 +1,14 @@
1
- require "yogi_berra/catcher"
2
- require "yogi_berra/backtrace"
3
- require "yogi_berra/notice"
4
- require "yogi_berra/exception_middleware"
5
- require "yogi_berra/data"
1
+ require 'yogi_berra/catcher'
2
+ require 'yogi_berra/backtrace'
3
+ require 'yogi_berra/notice'
4
+ require 'yogi_berra/exception_middleware'
5
+ require 'yogi_berra/data'
6
+ require 'yogi_berra/logger'
6
7
 
7
8
  if defined?(::Rails.version) && ::Rails.version.to_f >= 3.0
8
- require "yogi_berra/engine"
9
+ require 'yogi_berra/engine'
9
10
  else
10
- require "yogi_berra/rails"
11
+ require 'yogi_berra/rails'
11
12
  end
12
13
 
13
14
  module YogiBerra
@@ -22,7 +23,7 @@ module YogiBerra
22
23
  if database
23
24
  YogiBerra::Data.store!(notice, environment, database)
24
25
  else
25
- Rails.logger.error "[YogiBerra Error] No database connection!"
26
+ YogiBerra::Logger.log("No database connection!", :error)
26
27
  end
27
28
  end
28
29
 
data/spec/spec_helper.rb CHANGED
@@ -1,28 +1,17 @@
1
1
  # Configure Rails Envinronment
2
2
  ENV["RAILS_ENV"] = "test"
3
3
 
4
- require File.expand_path("../dummy/config/environment.rb", __FILE__)
5
-
6
- ActionMailer::Base.delivery_method = :test
7
- ActionMailer::Base.perform_deliveries = true
8
- ActionMailer::Base.default_url_options[:host] = "test.com"
9
-
10
- Rails.backtrace_cleaner.remove_silencers!
11
-
12
- # Run any available migration
13
- ActiveRecord::Migrator.migrate File.expand_path("../dummy/db/migrate/", __FILE__)
14
-
15
4
  # Load support files
5
+ $:.unshift("../lib/yogi_berra/*")
6
+ require 'yogi_berra'
16
7
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
17
8
 
18
9
  # Helper methods
19
- class ActiveSupport::TestCase
20
- setup { YogiBerra::Data.delete_all }
21
10
 
22
- # Creates RunTimeError
23
- def build_exception
24
- raise
25
- rescue => caught_exception
26
- caught_exception
27
- end
11
+ # Creates RunTimeError
12
+ def build_exception
13
+ raise
14
+ rescue => caught_exception
15
+ caught_exception
28
16
  end
17
+
@@ -2,51 +2,49 @@ require 'spec_helper'
2
2
 
3
3
  describe YogiBerra do
4
4
 
5
- it "should call the upstream app with the environment" #do
6
- # environment = { 'key' => 'value' }
7
- # app = lambda { |env| ['response', {}, env] }
8
- # stack = YogiBerra::ExceptionMiddleware.new(app)
9
-
10
- # response = stack.call(environment)
11
-
12
- # assert_equal ['response', {}, environment], response
13
- #end
14
-
15
- it "deliver an exception raised while calling an upstream app" #do
16
-
17
- # exception = build_exception
18
- # environment = { 'key' => 'value' }
19
- # app = lambda do |env|
20
- # raise exception
21
- # end
22
-
23
- # begin
24
- # stack = YogiBerra::ExceptionMiddleware.new(app)
25
- # stack.call(environment)
26
- # rescue Exception => raised
27
- # assert_equal exception, raised
28
- # else
29
- # flunk "Didn't raise an exception"
30
- # end
31
-
32
- #end
33
-
34
- it "should deliver an exception in rack.exception" #do
35
-
36
- # exception = build_exception
37
- # environment = { 'key' => 'value' }
38
-
39
- # response = [200, {}, ['okay']]
40
- # app = lambda do |env|
41
- # env['rack.exception'] = exception
42
- # response
43
- # end
44
- # stack = YogiBerra::ExceptionMiddleware.new(app)
45
-
46
- # actual_response = stack.call(environment)
47
-
48
- # assert_equal response, actual_response
49
-
50
- #end
5
+ it "should call the upstream app with the environment" do
6
+ environment = { 'key' => 'value' }
7
+ app = lambda { |env| ['response', {}, env] }
8
+ stack = YogiBerra::ExceptionMiddleware.new(app)
9
+
10
+ response = stack.call(environment)
11
+
12
+ response[0].should == 'response'
13
+ response[1].should == {}
14
+ response[2].instance_variable_get("@response").should == { 'key' => 'value' }
15
+ end
16
+
17
+ it "deliver an exception raised while calling an upstream app" do
18
+ exception = build_exception
19
+ environment = { 'key' => 'value' }
20
+ app = lambda do |env|
21
+ raise exception
22
+ end
23
+
24
+ begin
25
+ stack = YogiBerra::ExceptionMiddleware.new(app)
26
+ stack.call(environment)
27
+ rescue Exception => raised
28
+ raised.should == exception
29
+ end
30
+ end
31
+
32
+ it "should deliver an exception in rack.exception" do
33
+ exception = build_exception
34
+ environment = { 'key' => 'value' }
35
+
36
+ response = [200, {}, ['okay']]
37
+ app = lambda do |env|
38
+ env['rack.exception'] = exception
39
+ response
40
+ end
41
+ stack = YogiBerra::ExceptionMiddleware.new(app)
42
+
43
+ actual_response = stack.call(environment)
44
+
45
+ actual_response[0].should == 200
46
+ actual_response[1].should == {}
47
+ actual_response[2].instance_variable_get("@response").should == ["okay"]
48
+ end
51
49
 
52
50
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yogi_berra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-24 00:00:00.000000000 Z
12
+ date: 2013-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rake
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: 10.0.4
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: 10.0.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.13.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.13.0
14
46
  - !ruby/object:Gem::Dependency
15
47
  name: bson
16
48
  requirement: !ruby/object:Gem::Requirement
@@ -66,12 +98,14 @@ executables: []
66
98
  extensions: []
67
99
  extra_rdoc_files: []
68
100
  files:
101
+ - lib/facets.rb
69
102
  - lib/yogi_berra/action_controller_catcher.rb
70
103
  - lib/yogi_berra/backtrace.rb
71
104
  - lib/yogi_berra/catcher.rb
72
105
  - lib/yogi_berra/data.rb
73
106
  - lib/yogi_berra/engine.rb
74
107
  - lib/yogi_berra/exception_middleware.rb
108
+ - lib/yogi_berra/logger.rb
75
109
  - lib/yogi_berra/notice.rb
76
110
  - lib/yogi_berra/rails.rb
77
111
  - lib/yogi_berra/version.rb