prepor-ologger 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/.gitignore +6 -0
- data/Rakefile +15 -0
- data/Readme.rdoc +26 -0
- data/VERSION +1 -0
- data/bin/ologger +6 -0
- data/lib/ologger/buffer.rb +36 -0
- data/lib/ologger/middleware.rb +23 -0
- data/lib/ologger/object_methods.rb +34 -0
- data/lib/ologger/parser.rb +9 -0
- data/lib/ologger/raise_patch.rb +18 -0
- data/lib/ologger/tags +2 -0
- data/lib/ologger.rb +112 -0
- data/memory +0 -0
- data/ologger.gemspec +60 -0
- data/test/test.rb +97 -0
- data/test/test_helper.rb +24 -0
- metadata +89 -0
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gemspec|
|
4
|
+
gemspec.name = "ologger"
|
5
|
+
gemspec.summary = "Object separated logs"
|
6
|
+
gemspec.description = ""
|
7
|
+
gemspec.email = "ceo@prepor.ru"
|
8
|
+
gemspec.homepage = "http://github.com/prepor/olog"
|
9
|
+
gemspec.authors = ["Andrew Rudenko"]
|
10
|
+
gemspec.add_dependency('prepor-artester')
|
11
|
+
gemspec.add_dependency('activesupport')
|
12
|
+
end
|
13
|
+
rescue LoadError
|
14
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
15
|
+
end
|
data/Readme.rdoc
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
= Usage
|
2
|
+
|
3
|
+
# Initializer
|
4
|
+
require 'ologger'
|
5
|
+
Object.send :include OLogger
|
6
|
+
|
7
|
+
# Controller
|
8
|
+
around_filter OLogger
|
9
|
+
|
10
|
+
# Daemon
|
11
|
+
OLogger.enable do
|
12
|
+
loop do
|
13
|
+
bla bla
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Configs
|
18
|
+
OLogger.path = Pathname('log/ologs')
|
19
|
+
|
20
|
+
# In objects
|
21
|
+
def start!(character)
|
22
|
+
ologger "Starting project", character
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.2
|
data/bin/ologger
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module OLogger
|
2
|
+
class Buffer
|
3
|
+
attr_accessor :messages
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
self.messages = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def flush
|
10
|
+
self.messages = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(options = {})
|
14
|
+
messages << options
|
15
|
+
end
|
16
|
+
|
17
|
+
def grouped_messages
|
18
|
+
messages.group_by { |b| "#{b[:logger_module]}.#{b[:logger_id]}"}
|
19
|
+
end
|
20
|
+
|
21
|
+
def write
|
22
|
+
grouped_messages.each do |k, game_module_messages|
|
23
|
+
logger_module = game_module_messages.first[:logger_module] || 'unknown'
|
24
|
+
logger_id = game_module_messages.first[:logger_id] || 'unknown'
|
25
|
+
OLogger.create_module(logger_module)
|
26
|
+
(OLogger.path + logger_module + (logger_id.to_s + '.log')).open('a+') do |file|
|
27
|
+
game_module_messages.each do |message|
|
28
|
+
file.puts "#{Time.now.strftime('%d.%m.%Y %H:%M:%S')}: #{message[:message]}"
|
29
|
+
message[:objs].each { |obj| PP.pp(obj, file) } if message[:objs]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module OLogger
|
2
|
+
class Middleware
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
dup._call(env)
|
9
|
+
end
|
10
|
+
|
11
|
+
def _call(env)
|
12
|
+
OLogger.buffer.flush
|
13
|
+
@status, @headers, @response = @app.call(env)
|
14
|
+
OLogger.buffer.write
|
15
|
+
[@status, @headers, self]
|
16
|
+
end
|
17
|
+
|
18
|
+
def each(&block)
|
19
|
+
@response.each(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module OLogger
|
2
|
+
module ObjectMethods
|
3
|
+
def ologger_module
|
4
|
+
self.class.name.tableize
|
5
|
+
end
|
6
|
+
|
7
|
+
def ologger_id
|
8
|
+
if defined?(ActiveRecord::Base) && self.is_a?(ActiveRecord::Base)
|
9
|
+
self.id
|
10
|
+
else
|
11
|
+
self.object_id
|
12
|
+
end
|
13
|
+
end
|
14
|
+
# g#group_fight.123#
|
15
|
+
def ologger(message, *objs)
|
16
|
+
parsed_objs = objs.map { |o| ologger_object_format(o) }
|
17
|
+
OLogger.buffer.add :message => message, :objs => parsed_objs, :logger_module => ologger_module, :logger_id => ologger_id
|
18
|
+
end
|
19
|
+
def ologger_object_format(obj)
|
20
|
+
if defined?(ActiveRecord::Base) && obj.is_a?(ActiveRecord::Base)
|
21
|
+
if obj == self
|
22
|
+
obj.attributes
|
23
|
+
elsif obj.ologger_id
|
24
|
+
OLogger.buffer.add :message => 'Self:', :objs => [obj.attributes], :logger_module => obj.ologger_module, :logger_id => obj.ologger_id
|
25
|
+
"g##{obj.ologger_module}.#{obj.ologger_id}#"
|
26
|
+
else
|
27
|
+
obj
|
28
|
+
end
|
29
|
+
else
|
30
|
+
obj
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class StandardError
|
2
|
+
attr_accessor :obj
|
3
|
+
end
|
4
|
+
module Kernel
|
5
|
+
def ologger_raise(*argv)
|
6
|
+
if Thread.current[:ologger_raiser]
|
7
|
+
ex = StandardError.new(*argv)
|
8
|
+
ex.obj = self
|
9
|
+
ologger_old_raise ex
|
10
|
+
else
|
11
|
+
ologger_old_raise(*argv)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
alias_method :ologger_old_raise, :raise
|
16
|
+
alias_method :raise, :ologger_raise
|
17
|
+
|
18
|
+
end
|
data/lib/ologger/tags
ADDED
data/lib/ologger.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'pp'
|
3
|
+
require 'pathname'
|
4
|
+
require 'activesupport'
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
require 'ologger/raise_patch'
|
9
|
+
module OLogger
|
10
|
+
LOG_URL = '/game_logs/'
|
11
|
+
|
12
|
+
require 'ologger/parser'
|
13
|
+
require 'ologger/buffer'
|
14
|
+
require 'ologger/object_methods'
|
15
|
+
require 'ologger/middleware'
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_accessor :path, :on_raise
|
19
|
+
def path
|
20
|
+
@path ||= defined?(RAILS_ROOT) ? Pathname.new(File.join(RAILS_ROOT, 'log/o_logs')) : nil
|
21
|
+
end
|
22
|
+
def gc
|
23
|
+
gc_dir
|
24
|
+
end
|
25
|
+
|
26
|
+
def gc_dir(dir_path = OLogger.path)
|
27
|
+
if dir_path.directory?
|
28
|
+
dir_path.each_entry do |path|
|
29
|
+
if not_self_and_parent path
|
30
|
+
gc_dir(dir_path + path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
else
|
34
|
+
if needed_to_remove?(dir_path)
|
35
|
+
dir_path.delete
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def not_self_and_parent(path)
|
41
|
+
path.to_s != '.' && path.to_s != '..'
|
42
|
+
end
|
43
|
+
|
44
|
+
def needed_to_remove?(path)
|
45
|
+
path.mtime < 1.day.ago || path.size > 300.kilobytes
|
46
|
+
end
|
47
|
+
|
48
|
+
def get_log(log_id)
|
49
|
+
name = parse_log_id(log_id)
|
50
|
+
path = OLogger.path + name[:module] + name[:file]
|
51
|
+
if File.exist?(path)
|
52
|
+
OLogger::Parser.parse(File.read(path))
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def list_of_modules
|
59
|
+
OLogger.path.entries.select { |v| not_self_and_parent v }
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_logs(log_module)
|
63
|
+
path = OLogger.path + log_module
|
64
|
+
path.entries.select { |v| not_self_and_parent v }.map{ |v| v.to_s.gsub /\.log$/, '' }
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_log_id(log_id)
|
68
|
+
p = log_id.match(/(.+)\.(.+)/i)
|
69
|
+
{:module => p[1], :file => p[2] + '.log'}
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_module(log_module)
|
73
|
+
path = OLogger.path + log_module
|
74
|
+
unless path.exist?
|
75
|
+
path.mkpath
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def logger(logger_module, logger)
|
80
|
+
Logger.new('logfile.log')
|
81
|
+
end
|
82
|
+
|
83
|
+
def buffer
|
84
|
+
@buffer ||= Buffer.new
|
85
|
+
end
|
86
|
+
|
87
|
+
def enable(&block)
|
88
|
+
buffer.flush
|
89
|
+
Thread.current[:ologger_raiser] = true
|
90
|
+
begin
|
91
|
+
yield
|
92
|
+
rescue StandardError => e
|
93
|
+
e.obj.ologger "Exception:", :objs => [e, e.backtrace]
|
94
|
+
on_raise.call(e) if on_raise && on_raise.is_a?(Proc)
|
95
|
+
ensure
|
96
|
+
Thread.current[:ologger_raiser] = false
|
97
|
+
buffer.write
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def filter(controller, &block)
|
102
|
+
enable(&block)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.included(receiver)
|
107
|
+
receiver.send :include, ObjectMethods
|
108
|
+
receiver.extend ObjectMethods
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
end
|
data/memory
ADDED
Binary file
|
data/ologger.gemspec
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{ologger}
|
8
|
+
s.version = "0.1.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Andrew Rudenko"]
|
12
|
+
s.date = %q{2009-09-14}
|
13
|
+
s.default_executable = %q{ologger}
|
14
|
+
s.description = %q{}
|
15
|
+
s.email = %q{ceo@prepor.ru}
|
16
|
+
s.executables = ["ologger"]
|
17
|
+
s.files = [
|
18
|
+
".gitignore",
|
19
|
+
"Rakefile",
|
20
|
+
"Readme.rdoc",
|
21
|
+
"VERSION",
|
22
|
+
"bin/ologger",
|
23
|
+
"lib/ologger.rb",
|
24
|
+
"lib/ologger/buffer.rb",
|
25
|
+
"lib/ologger/middleware.rb",
|
26
|
+
"lib/ologger/object_methods.rb",
|
27
|
+
"lib/ologger/parser.rb",
|
28
|
+
"lib/ologger/raise_patch.rb",
|
29
|
+
"lib/ologger/tags",
|
30
|
+
"memory",
|
31
|
+
"ologger.gemspec",
|
32
|
+
"test/test.rb",
|
33
|
+
"test/test_helper.rb"
|
34
|
+
]
|
35
|
+
s.homepage = %q{http://github.com/prepor/olog}
|
36
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
s.rubygems_version = %q{1.3.5}
|
39
|
+
s.summary = %q{Object separated logs}
|
40
|
+
s.test_files = [
|
41
|
+
"test/test.rb",
|
42
|
+
"test/test_helper.rb"
|
43
|
+
]
|
44
|
+
|
45
|
+
if s.respond_to? :specification_version then
|
46
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
47
|
+
s.specification_version = 3
|
48
|
+
|
49
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
50
|
+
s.add_runtime_dependency(%q<prepor-artester>, [">= 0"])
|
51
|
+
s.add_runtime_dependency(%q<activesupport>, [">= 0"])
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<prepor-artester>, [">= 0"])
|
54
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<prepor-artester>, [">= 0"])
|
58
|
+
s.add_dependency(%q<activesupport>, [">= 0"])
|
59
|
+
end
|
60
|
+
end
|
data/test/test.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
|
3
|
+
describe OLogger do
|
4
|
+
describe "Object with game logger" do
|
5
|
+
before(:each) do
|
6
|
+
OLogger.buffer.flush
|
7
|
+
Object.send :include, OLogger
|
8
|
+
@obj = Object.new
|
9
|
+
|
10
|
+
end
|
11
|
+
it "should add message to buffer" do
|
12
|
+
mock(OLogger.buffer).add(hash_including(:message => 'hi!'))
|
13
|
+
@obj.ologger 'hi!'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should add objects to buffer" do
|
17
|
+
mock(OLogger.buffer).add(hash_including(:message => 'hi!', :objs => [{ :foo => :bar}, { :bar => :foo}]))
|
18
|
+
@obj.ologger 'hi!', { :foo => :bar}, { :bar => :foo}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "ActiveRecord object with game logger" do
|
23
|
+
before(:each) do
|
24
|
+
Artester[:game_logger].reload
|
25
|
+
OLogger.buffer.flush
|
26
|
+
Object.send :include, OLogger
|
27
|
+
@obj = Object.new
|
28
|
+
@ar_obj = Foo.create :name => 'tester', :bar => 'hi!'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should insert link to ar object" do
|
32
|
+
mock(OLogger.buffer).add(hash_including(:message => 'Self:', :objs => [{"name"=>"tester", "id"=>1, "bar"=>"hi!"}]))
|
33
|
+
mock(OLogger.buffer).add(hash_including(:message => 'hi!', :objs => ["g#foos.#{@ar_obj.id}#"]))
|
34
|
+
stub(OLogger.buffer).add
|
35
|
+
@obj.ologger 'hi!', @ar_obj
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should insert itsel description to ar object log" do
|
39
|
+
mock(OLogger.buffer).add(hash_including(:message => 'Self:', :objs => [{"name"=>"tester", "id"=>1, "bar"=>"hi!"}]))
|
40
|
+
stub(OLogger.buffer).add
|
41
|
+
|
42
|
+
@obj.ologger 'hi!', @ar_obj
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should raise exceptions" do
|
46
|
+
mock(OLogger.buffer).add(hash_including(:message => "Exception:"))
|
47
|
+
OLogger.enable do
|
48
|
+
Foo.find(10)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "writing" do
|
53
|
+
|
54
|
+
before(:all) do
|
55
|
+
OLogger.path = Pathname.new('test/ologs')
|
56
|
+
OLogger.path.rmtree if OLogger.path.exist?
|
57
|
+
end
|
58
|
+
|
59
|
+
after(:each) do
|
60
|
+
OLogger.path.rmtree if OLogger.path.exist?
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should call raise callback' do
|
64
|
+
raiser = lambda { |e| 0 }
|
65
|
+
mock(raiser).call(is_a(StandardError))
|
66
|
+
OLogger.on_raise = raiser
|
67
|
+
OLogger.enable do
|
68
|
+
Foo.find(10)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
it "should write logs to file" do
|
72
|
+
path = OLogger.path + 'foos' + "#{@ar_obj.id}.log"
|
73
|
+
path.exist?.should be_false
|
74
|
+
OLogger.enable do
|
75
|
+
@ar_obj.ologger 'hi!'
|
76
|
+
end
|
77
|
+
path.exist?.should be_true
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "garbage collecting" do
|
81
|
+
before(:each) do
|
82
|
+
OLogger.enable do
|
83
|
+
@ar_obj.ologger 'hi!'
|
84
|
+
end
|
85
|
+
end
|
86
|
+
it "should remove all big and old logs" do
|
87
|
+
stub(OLogger).needed_to_remove? { true }
|
88
|
+
(OLogger.path + 'foos' + "#{@ar_obj.id}.log").exist?.should be_true
|
89
|
+
OLogger.gc
|
90
|
+
(OLogger.path + 'foos' + "#{@ar_obj.id}.log").exist?.should be_false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'spec'
|
4
|
+
require 'rr'
|
5
|
+
require 'artester'
|
6
|
+
|
7
|
+
$LOAD_PATH.unshift('lib')
|
8
|
+
|
9
|
+
require 'lib/ologger'
|
10
|
+
|
11
|
+
Spec::Runner.configure do |config|
|
12
|
+
config.mock_with :rr
|
13
|
+
end
|
14
|
+
|
15
|
+
Artester.init
|
16
|
+
|
17
|
+
Artester.def :game_logger do
|
18
|
+
model :foo do
|
19
|
+
definition do |t|
|
20
|
+
t.string :name
|
21
|
+
t.string :bar
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: prepor-ologger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Rudenko
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-14 00:00:00 -07:00
|
13
|
+
default_executable: ologger
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: prepor-artester
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: ""
|
36
|
+
email: ceo@prepor.ru
|
37
|
+
executables:
|
38
|
+
- ologger
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files: []
|
42
|
+
|
43
|
+
files:
|
44
|
+
- .gitignore
|
45
|
+
- Rakefile
|
46
|
+
- Readme.rdoc
|
47
|
+
- VERSION
|
48
|
+
- bin/ologger
|
49
|
+
- lib/ologger.rb
|
50
|
+
- lib/ologger/buffer.rb
|
51
|
+
- lib/ologger/middleware.rb
|
52
|
+
- lib/ologger/object_methods.rb
|
53
|
+
- lib/ologger/parser.rb
|
54
|
+
- lib/ologger/raise_patch.rb
|
55
|
+
- lib/ologger/tags
|
56
|
+
- memory
|
57
|
+
- ologger.gemspec
|
58
|
+
- test/test.rb
|
59
|
+
- test/test_helper.rb
|
60
|
+
has_rdoc: false
|
61
|
+
homepage: http://github.com/prepor/olog
|
62
|
+
licenses:
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options:
|
65
|
+
- --charset=UTF-8
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
version:
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 1.3.5
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Object separated logs
|
87
|
+
test_files:
|
88
|
+
- test/test.rb
|
89
|
+
- test/test_helper.rb
|