bookie_accounting 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -30,46 +30,51 @@ describe Bookie::Formatter do
30
30
  end
31
31
 
32
32
  it "correctly formats durations" do
33
- Bookie::Formatter.format_duration(3600 * 6 + 60 * 5 + 4).should eql '06:05:04'
33
+ Bookie::Formatter.format_duration(1.seconds + 2.minutes + 3.hours + 4.days + 5.weeks).should eql '5 weeks, 4 days, 03:02:01'
34
+ Bookie::Formatter.format_duration(1.weeks + 1.days).should eql '1 week, 1 day, 00:00:00'
34
35
  end
35
36
 
36
37
  it "correctly calculates fields for jobs" do
37
- @formatter.send(:fields_for_each_job, @jobs.limit(1).all) do |fields|
38
- fields.should eql [
39
- 'root',
40
- 'root',
41
- 'test1',
42
- 'Standalone',
43
- '2012-01-01 00:00:00',
44
- '2012-01-01 01:00:00',
45
- '01:00:00',
46
- '00:01:40',
47
- '200kb (avg)',
48
- 'vi',
49
- 0,
50
- ]
51
- end
52
- jobs = [Bookie::Database::Job.first]
53
- jobs[0].system.system_type.memory_stat_type = :unknown
54
- @formatter.send(:fields_for_each_job, jobs) do |fields|
55
- fields[8].should eql '200kb'
38
+ with_utc do
39
+ @formatter.send(:fields_for_each_job, @jobs.limit(1).all) do |fields|
40
+ fields.should eql [
41
+ 'root',
42
+ 'root',
43
+ 'test1',
44
+ 'Standalone',
45
+ '2012-01-01 00:00:00',
46
+ '2012-01-01 01:00:00',
47
+ '0 weeks, 0 days, 01:00:00',
48
+ '0 weeks, 0 days, 00:01:40',
49
+ '200kb (avg)',
50
+ 'vi',
51
+ 0,
52
+ ]
53
+ end
54
+ jobs = [Bookie::Database::Job.first]
55
+ jobs[0].system.system_type.memory_stat_type = :unknown
56
+ @formatter.send(:fields_for_each_job, jobs) do |fields|
57
+ fields[8].should eql '200kb'
58
+ end
56
59
  end
57
60
  end
58
61
 
59
62
  describe "#print_summary" do
60
63
  it "prints the correct summary fields" do
61
- Time.expects(:now).returns(Time.local(2012) + 3600 * 40).at_least_once
62
- @formatter.print_summary(@jobs, @summaries, Bookie::Database::System)
63
- @formatter.flush
64
- $field_values.should eql [40, "01:06:40", "50.0000%", "140:00:00", "0.7937%", "1750000 kb", "0.0114%"]
65
- Bookie::Database::System.expects(:summary).returns(
66
- :avail_cpu_time => 0,
67
- :avail_memory_time => 0,
68
- :avail_memory_avg => 0
69
- )
70
- @formatter.print_summary(@jobs, @summaries, Bookie::Database::System, Time.local(2012) ... Time.local(2012))
71
- @formatter.flush
72
- $field_values.should eql [0, "00:00:00", "0.0000%", "00:00:00", "0.0000%", "0 kb", "0.0000%"]
64
+ with_utc do
65
+ Time.expects(:now).returns(base_time + 40.hours).at_least_once
66
+ @formatter.print_summary(@jobs, @summaries, Bookie::Database::System)
67
+ @formatter.flush
68
+ $field_values.should eql [40, "0 weeks, 0 days, 01:06:40", "50.0000%", "0 weeks, 5 days, 20:00:00", "0.7937%", "1750000 kb", "0.0114%"]
69
+ Bookie::Database::System.expects(:summary).returns(
70
+ :avail_cpu_time => 0,
71
+ :avail_memory_time => 0,
72
+ :avail_memory_avg => 0
73
+ )
74
+ @formatter.print_summary(@jobs, @summaries, Bookie::Database::System, base_time ... base_time)
75
+ @formatter.flush
76
+ $field_values.should eql [0, "0 weeks, 0 days, 00:00:00", "0.0000%", "0 weeks, 0 days, 00:00:00", "0.0000%", "0 kb", "0.0000%"]
77
+ end
73
78
  end
74
79
 
75
80
  it "returns the summary objects" do
data/spec/sender_spec.rb CHANGED
@@ -5,27 +5,48 @@ class JobStub
5
5
  attr_accessor :group_name
6
6
  attr_accessor :command_name
7
7
  attr_accessor :start_time
8
- attr_accessor :end_time
9
8
  attr_accessor :wall_time
10
9
  attr_accessor :cpu_time
11
10
  attr_accessor :memory
12
11
  attr_accessor :exit_code
13
12
 
14
13
  include Bookie::ModelHelpers
14
+
15
+ def self.from_job(job)
16
+ stub = self.new
17
+ stub.user_name = job.user.name
18
+ stub.group_name = job.user.group.name
19
+ stub.command_name = job.command_name
20
+ stub.start_time = job.start_time
21
+ stub.wall_time = job.wall_time
22
+ stub.cpu_time = job.cpu_time
23
+ stub.memory = job.memory
24
+ stub.exit_code = job.exit_code
25
+ stub
26
+ end
15
27
  end
16
28
 
17
29
  describe Bookie::Sender do
18
30
  before(:all) do
19
- base_time = Date.new(2012).to_time
20
31
  Bookie::Database::Migration.up
21
- Bookie::Database::System.create!(
32
+ fields = {
22
33
  :name => 'localhost',
23
34
  :system_type => Bookie::Sender.new(@config).system_type,
24
- :start_time => base_time,
25
- :end_time => nil,
26
35
  :cores => @config.cores,
27
- :memory => @config.memory
28
- )
36
+ :memory => @config.memory,
37
+ }
38
+ @sys_1 = Bookie::Database::System.new(fields)
39
+ @sys_1.start_time = base_time
40
+ @sys_1.end_time = base_time + 1000
41
+ @sys_1.save!
42
+ @sys_2 = Bookie::Database::System.new(fields)
43
+ @sys_2.start_time = base_time + 1001
44
+ @sys_2.end_time = nil
45
+ @sys_2.save!
46
+ fields[:name] = 'dummy'
47
+ @sys_dummy = Bookie::Database::System.new(fields)
48
+ @sys_dummy.start_time = base_time
49
+ @sys_dummy.save!
29
50
  end
30
51
 
31
52
  after(:all) do
@@ -76,34 +97,17 @@ describe Bookie::Sender do
76
97
  end
77
98
 
78
99
  it "chooses the correct systems" do
79
- @config.expects(:hostname).returns('test').at_least_once
100
+ Bookie::Database::Job.delete_all
80
101
  sender = Bookie::Sender.new(@config)
81
- sys_type = sender.system_type
82
- t = Date.new(2012).to_time
83
- fields = {
84
- :name => 'test',
85
- :system_type => sys_type,
86
- :cores => @config.cores,
87
- :memory => @config.memory,
88
- }
89
- sys_1 = Bookie::Database::System.new(fields)
90
- sys_1.start_time = t
91
- sys_1.end_time = t + 1000
92
- sys_1.save!
93
- sys_2 = Bookie::Database::System.new(fields)
94
- sys_2.start_time = t + 1001
95
- sys_2.end_time = nil
96
- sys_2.save!
97
-
102
+
98
103
  def sender.each_job(filename)
99
- t = Date.new(2012).to_time
100
104
  [0, 1001].each do |offset|
101
105
  job = JobStub.new
102
106
  job.user_name = 'blm'
103
107
  job.group_name = 'blm'
104
108
  job.command_name = 'vi'
105
- job.start_time = t
106
- job.wall_time = offset
109
+ job.start_time = Helpers::BASE_TIME + offset
110
+ job.wall_time = 1000
107
111
  job.cpu_time = 2
108
112
  job.memory = 300
109
113
  job.exit_code = 0
@@ -111,54 +115,105 @@ describe Bookie::Sender do
111
115
  end
112
116
  end
113
117
 
114
- sender.send_data('snapshot/torque_large')
118
+ #The filename is just a dummy argument.
119
+ sender.send_data('snapshot/pacct')
115
120
 
116
- jobs = Bookie::Database::Job.by_system_name('test').order(:end_time).all
117
- jobs[0].system.should eql sys_1
118
- jobs[1].system.should eql sys_2
121
+ jobs = Bookie::Database::Job.by_system_name(@config.hostname).order(:end_time).all
122
+ jobs[0].system.should eql @sys_1
123
+ jobs[1].system.should eql @sys_2
124
+ end
125
+
126
+ it "correctly finds duplicates" do
127
+ job = Bookie::Database::Job.first
128
+ stub = JobStub.from_job(job)
129
+ duplicate = @sender.duplicate(stub, job.system)
130
+ duplicate.should eql job
131
+ @sender.duplicate(stub, @sys_2).should eql nil
132
+ [:user_name, :group_name, :command_name, :start_time, :wall_time, :cpu_time, :memory, :exit_code].each do |field|
133
+ old_val = stub.send(field)
134
+ if old_val.is_a?(String)
135
+ stub.send("#{field}=", 'string')
136
+ else
137
+ stub.send("#{field}=", old_val + 1)
138
+ end
139
+ @sender.duplicate(stub, @sys_2).should eql nil
140
+ stub.send("#{field}=", old_val)
141
+ end
119
142
  end
120
143
 
121
144
  it "deletes cached summaries that overlap the new jobs" do
122
145
  Bookie::Database::Job.delete_all
123
- sender = Bookie::Sender.new(@config)
124
- user = Bookie::Database::User.first
125
- systems = [
126
- Bookie::Database::System.find_current(sender),
127
- Bookie::Database::System.create!(
128
- :name => 'test',
129
- :system_type => Bookie::Database::SystemType.first,
130
- :start_time => Time.new,
131
- :cores => 1,
132
- :memory => 1000000
133
- )
134
- ]
135
- date_start = Date.new(2012) - 2
136
- date_end = date_start + 4
137
- (date_start .. date_end).each do |date|
138
- systems.each do |system|
139
- sum = Bookie::Database::JobSummary.create!(
140
- :date => date,
141
- :system => system,
142
- :user => user,
143
- :command_name => 'vi',
144
- :num_jobs => 1,
145
- :cpu_time => 1,
146
- :memory_time => 100,
147
- :successful => 1
148
- )
146
+ @sender.send_data('snapshot/torque_large')
147
+ time_min = Bookie::Database::Job.order(:start_time).first.start_time
148
+ time_max = Bookie::Database::Job.order('end_time DESC').first.end_time
149
+ Bookie::Database::Job.delete_all
150
+ @sender.expects(:clear_summaries).with(time_min.to_date, time_max.to_date)
151
+ @sender.send_data('snapshot/torque_large')
152
+ end
153
+
154
+ describe "#clear_summaries" do
155
+ it "deletes cached summaries" do
156
+ Bookie::Database::Job.delete_all
157
+ sender = Bookie::Sender.new(@config)
158
+ sender.send_data('snapshot/torque_large')
159
+
160
+ user = Bookie::Database::User.first
161
+ date_start = Date.new(2012) - 2
162
+ date_end = date_start + 4
163
+ (date_start .. date_end).each do |date|
164
+ [@sys_1, @sys_2, @sys_dummy].each do |system|
165
+ sum = Bookie::Database::JobSummary.create!(
166
+ :date => date,
167
+ :system => system,
168
+ :user => user,
169
+ :command_name => 'vi',
170
+ :num_jobs => 1,
171
+ :cpu_time => 1,
172
+ :memory_time => 100,
173
+ :successful => 1
174
+ )
175
+ end
149
176
  end
150
- end
151
- sender.send_data('snapshot/torque_large')
152
- sums = Bookie::Database::JobSummary.all
153
- sums.length.should eql 9
154
- sums.each do |sum|
155
- if sum.system == systems[0]
156
- sum.date.should_not eql Date.new(2012)
177
+
178
+ sender.send(:clear_summaries, date_start + 1, date_end - 1)
179
+
180
+ sums = Bookie::Database::JobSummary.all
181
+ sums.length.should eql 9
182
+ sums.each do |sum|
183
+ unless sum.system == @sys_dummy
184
+ (date_start + 1 .. date_end - 1).cover?(sum.date).should eql false
185
+ end
157
186
  end
187
+ sums = Bookie::Database::JobSummary.by_date(Date.new(2012))
188
+ sums.count.should eql 1
189
+ sums.first.system.should eql @sys_dummy
190
+ end
191
+ end
192
+
193
+ describe "#undo_send" do
194
+ it "removes the correct entries" do
195
+ Bookie::Database::Job.delete_all
196
+ @sender.send_data('snapshot/torque_large')
197
+ @sender.send_data('snapshot/torque')
198
+ @sender.undo_send('snapshot/torque_large')
199
+
200
+ Bookie::Database::Job.count.should eql 1
201
+ job = Bookie::Database::Job.first
202
+ Bookie::Database::Job.delete_all
203
+ @sender.send_data('snapshot/torque')
204
+ job2 = Bookie::Database::Job.first
205
+ job2.id = job.id
206
+ job2.should eql job
207
+ end
208
+
209
+ it "deletes cached summaries in the affected range" do
210
+ Bookie::Database::Job.delete_all
211
+ @sender.send_data('snapshot/torque_large')
212
+ time_min = Bookie::Database::Job.order(:start_time).first.start_time
213
+ time_max = Bookie::Database::Job.order('end_time DESC').first.end_time
214
+ @sender.expects(:clear_summaries).with(time_min.to_date, time_max.to_date)
215
+ @sender.undo_send('snapshot/torque_large')
158
216
  end
159
- sums = Bookie::Database::JobSummary.by_date(Date.new(2012)).all
160
- sums.length.should eql 1
161
- sums[0].system.should eql systems[1]
162
217
  end
163
218
  end
164
219
 
@@ -186,4 +241,8 @@ describe Bookie::ModelHelpers do
186
241
  djob.memory.should eql @job.memory
187
242
  djob.exit_code.should eql @job.exit_code
188
243
  end
244
+
245
+ it "correctly calculates end time" do
246
+ @job.end_time.should eql @job.start_time + @job.wall_time
247
+ end
189
248
  end
data/spec/spec_helper.rb CHANGED
@@ -52,8 +52,14 @@ end
52
52
  module Helpers
53
53
  extend self
54
54
 
55
+ BASE_TIME = Time.utc(2012)
56
+
57
+ #To get around the 'formal argument cannot be a constant' error
58
+ def base_time
59
+ BASE_TIME
60
+ end
61
+
55
62
  def generate_database
56
- base_time = Time.local(2012)
57
63
  #Create test database
58
64
  groups = {}
59
65
  group_names = ['root', 'default', 'admin', 'admin']
@@ -118,4 +124,12 @@ module Helpers
118
124
  job.save!
119
125
  end
120
126
  end
127
+
128
+ def with_utc
129
+ prev = ENV['TZ']
130
+ ENV['TZ'] = 'UTC'
131
+ yield
132
+ ensure
133
+ ENV['TZ'] = prev
134
+ end
121
135
  end
@@ -74,31 +74,33 @@ describe Bookie::Formatters::Spreadsheet do
74
74
  end
75
75
 
76
76
  it "correctly formats jobs" do
77
- @formatter.print_jobs(@jobs.limit(2).all)
78
- w = @m.worksheet('Details')
79
- w.last_row_index.should eql 2
80
- w.mock_columns.length.should eql Bookie::Formatter::DETAILS_FIELD_LABELS.length
81
- w.mock_columns.each do |col|
82
- col.width.should_not eql nil
77
+ with_utc do
78
+ @formatter.print_jobs(@jobs.limit(2).all)
79
+ w = @m.worksheet('Details')
80
+ w.last_row_index.should eql 2
81
+ w.mock_columns.length.should eql Bookie::Formatter::DETAILS_FIELD_LABELS.length
82
+ w.mock_columns.each do |col|
83
+ col.width.should_not eql nil
84
+ end
85
+ w.row(0).should eql Bookie::Formatter::DETAILS_FIELD_LABELS
86
+ w.row(1).should eql ["root", "root", "test1", "Standalone", "2012-01-01 00:00:00",
87
+ "2012-01-01 01:00:00", "0 weeks, 0 days, 01:00:00", "0 weeks, 0 days, 00:01:40", "200kb (avg)", 'vi', 0]
88
+ w.row(2).should eql ["test", "default", "test1", "Standalone", "2012-01-01 01:00:00",
89
+ "2012-01-01 02:00:00", "0 weeks, 0 days, 01:00:00", "0 weeks, 0 days, 00:01:40", "200kb (avg)", 'emacs', 1]
83
90
  end
84
- w.row(0).should eql Bookie::Formatter::DETAILS_FIELD_LABELS
85
- w.row(1).should eql ["root", "root", "test1", "Standalone", "2012-01-01 00:00:00",
86
- "2012-01-01 01:00:00", "01:00:00", "00:01:40", "200kb (avg)", 'vi', 0]
87
- w.row(2).should eql ["test", "default", "test1", "Standalone", "2012-01-01 01:00:00",
88
- "2012-01-01 02:00:00", "01:00:00", "00:01:40", "200kb (avg)", 'emacs', 1]
89
91
  end
90
92
 
91
93
  it "correctly formats summaries" do
92
- Time.expects(:now).returns(Time.local(2012) + 3600 * 40).at_least_once
94
+ Time.expects(:now).returns(base_time + 40.hours).at_least_once
93
95
  @formatter.print_summary(@jobs, @summaries, Bookie::Database::System)
94
96
  w = @m.worksheet('Summary')
95
97
  w.column(0).width.should_not eql nil
96
98
  w.last_row_index.should eql 6
97
99
  w.mock_rows.should eql [
98
100
  ["Number of jobs", 40],
99
- ["Total CPU time", "01:06:40"],
101
+ ["Total CPU time", "0 weeks, 0 days, 01:06:40"],
100
102
  ["Successful", "50.0000%"],
101
- ["Available CPU time", "140:00:00"],
103
+ ["Available CPU time", "0 weeks, 5 days, 20:00:00"],
102
104
  ["CPU time used", "0.7937%"],
103
105
  ["Available memory (average)", "1750000 kb"],
104
106
  ["Memory used (average)", "0.0114%"],
@@ -34,25 +34,27 @@ describe Bookie::Formatters::Stdout do
34
34
  end
35
35
 
36
36
  it "correctly formats jobs" do
37
+ with_utc do
37
38
  @formatter.print_jobs(@jobs.order(:start_time).limit(2))
38
39
  @formatter.flush
39
40
  @m.buf.should eql <<-eos
40
- User Group System System type Start time End time Wall time CPU time Memory usage Command Exit code
41
- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
42
- root root test1 Standalone 2012-01-01 00:00:00 2012-01-01 01:00:00 01:00:00 00:01:40 200kb (avg) vi 0
43
- test default test1 Standalone 2012-01-01 01:00:00 2012-01-01 02:00:00 01:00:00 00:01:40 200kb (avg) emacs 1
41
+ User Group System System type Start time End time Wall time CPU time Memory usage Command Exit code
42
+ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
43
+ root root test1 Standalone 2012-01-01 00:00:00 2012-01-01 01:00:00 0 weeks, 0 days, 01:00:00 0 weeks, 0 days, 00:01:40 200kb (avg) vi 0
44
+ test default test1 Standalone 2012-01-01 01:00:00 2012-01-01 02:00:00 0 weeks, 0 days, 01:00:00 0 weeks, 0 days, 00:01:40 200kb (avg) emacs 1
44
45
  eos
46
+ end
45
47
  end
46
-
48
+
47
49
  it "correctly formats summaries" do
48
- Time.expects(:now).returns(Time.local(2012) + 36000 * 4).at_least_once
50
+ Time.expects(:now).returns(base_time + 40.hours).at_least_once
49
51
  @formatter.print_summary(@jobs, @summaries, Bookie::Database::System)
50
52
  @formatter.flush
51
53
  @m.buf.should eql <<-eos
52
54
  Number of jobs: 40
53
- Total CPU time: 01:06:40
55
+ Total CPU time: 0 weeks, 0 days, 01:06:40
54
56
  Successful: 50.0000%
55
- Available CPU time: 140:00:00
57
+ Available CPU time: 0 weeks, 5 days, 20:00:00
56
58
  CPU time used: 0.7937%
57
59
  Available memory (average): 1750000 kb
58
60
  Memory used (average): 0.0114%
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bookie_accounting
3
3
  version: !ruby/object:Gem::Version
4
- hash: 23
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 0
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ben Merritt
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-04-13 00:00:00 +02:00
18
+ date: 2013-06-14 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -33,7 +33,7 @@ dependencies:
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency
36
- name: pacct
36
+ name: json
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
39
  none: false
@@ -47,7 +47,7 @@ dependencies:
47
47
  type: :runtime
48
48
  version_requirements: *id002
49
49
  - !ruby/object:Gem::Dependency
50
- name: spreadsheet
50
+ name: mysql2
51
51
  prerelease: false
52
52
  requirement: &id003 !ruby/object:Gem::Requirement
53
53
  none: false
@@ -61,7 +61,7 @@ dependencies:
61
61
  type: :runtime
62
62
  version_requirements: *id003
63
63
  - !ruby/object:Gem::Dependency
64
- name: mocha
64
+ name: pacct
65
65
  prerelease: false
66
66
  requirement: &id004 !ruby/object:Gem::Requirement
67
67
  none: false
@@ -72,10 +72,10 @@ dependencies:
72
72
  segments:
73
73
  - 0
74
74
  version: "0"
75
- type: :development
75
+ type: :runtime
76
76
  version_requirements: *id004
77
77
  - !ruby/object:Gem::Dependency
78
- name: rspec
78
+ name: spreadsheet
79
79
  prerelease: false
80
80
  requirement: &id005 !ruby/object:Gem::Requirement
81
81
  none: false
@@ -86,10 +86,10 @@ dependencies:
86
86
  segments:
87
87
  - 0
88
88
  version: "0"
89
- type: :development
89
+ type: :runtime
90
90
  version_requirements: *id005
91
91
  - !ruby/object:Gem::Dependency
92
- name: sqlite3
92
+ name: bundler
93
93
  prerelease: false
94
94
  requirement: &id006 !ruby/object:Gem::Requirement
95
95
  none: false
@@ -102,6 +102,48 @@ dependencies:
102
102
  version: "0"
103
103
  type: :development
104
104
  version_requirements: *id006
105
+ - !ruby/object:Gem::Dependency
106
+ name: mocha
107
+ prerelease: false
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ type: :development
118
+ version_requirements: *id007
119
+ - !ruby/object:Gem::Dependency
120
+ name: rspec
121
+ prerelease: false
122
+ requirement: &id008 !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ hash: 3
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ type: :development
132
+ version_requirements: *id008
133
+ - !ruby/object:Gem::Dependency
134
+ name: sqlite3
135
+ prerelease: false
136
+ requirement: &id009 !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ hash: 3
142
+ segments:
143
+ - 0
144
+ version: "0"
145
+ type: :development
146
+ version_requirements: *id009
105
147
  description: A simple system to record and query process accounting records
106
148
  email:
107
149
  - blm768@gmail.com
@@ -119,6 +161,7 @@ files:
119
161
  - LICENSE
120
162
  - README.md
121
163
  - Rakefile
164
+ - TODO
122
165
  - bin/bookie-create-tables
123
166
  - bin/bookie-data
124
167
  - bin/bookie-send
@@ -126,6 +169,7 @@ files:
126
169
  - lib/bookie.rb
127
170
  - lib/bookie/config.rb
128
171
  - lib/bookie/database.rb
172
+ - lib/bookie/extensions.rb
129
173
  - lib/bookie/formatter.rb
130
174
  - lib/bookie/formatters/comma_dump.rb
131
175
  - lib/bookie/formatters/spreadsheet.rb
@@ -150,6 +194,7 @@ files:
150
194
  - spec/comma_dump_formatter_spec.rb
151
195
  - spec/config_spec.rb
152
196
  - spec/database_spec.rb
197
+ - spec/extensions_spec.rb
153
198
  - spec/formatter_spec.rb
154
199
  - spec/sender_spec.rb
155
200
  - spec/spec_helper.rb
@@ -195,6 +240,7 @@ test_files:
195
240
  - spec/comma_dump_formatter_spec.rb
196
241
  - spec/config_spec.rb
197
242
  - spec/database_spec.rb
243
+ - spec/extensions_spec.rb
198
244
  - spec/formatter_spec.rb
199
245
  - spec/sender_spec.rb
200
246
  - spec/spec_helper.rb