bookie_accounting 1.0.0 → 1.1.0

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.
@@ -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