postrunner 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +0 -10
- data/lib/postrunner.rb +5 -1
- data/lib/postrunner/ActivitiesDB.rb +10 -20
- data/lib/postrunner/ActivitySummary.rb +5 -0
- data/lib/postrunner/ChartView.rb +48 -13
- data/lib/postrunner/DeviceList.rb +2 -0
- data/lib/postrunner/Main.rb +33 -1
- data/lib/postrunner/MonitoringDB.rb +50 -0
- data/lib/postrunner/RuntimeConfig.rb +1 -0
- data/lib/postrunner/version.rb +1 -1
- data/postrunner.gemspec +2 -1
- data/spec/ActivitySummary_spec.rb +1 -1
- data/spec/FlexiTable_spec.rb +1 -0
- data/spec/PostRunner_spec.rb +2 -1
- data/spec/View_spec.rb +1 -0
- data/spec/spec_helper.rb +10 -1
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dd09a8e49b1feea3d264427dae30981cb842f22
|
4
|
+
data.tar.gz: e9ec20c4cf98828275ab8f82d1230101dd35af53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe3df33c0cc4ae5bf687a365368cc1b969d9b754776097bccc70d134aed86ab6e933896579557a51a1ea3cd59eb7a57b4da861abf2d822e4d865474e3253978
|
7
|
+
data.tar.gz: 97f348e3b2f6faa5ebda4b7cce5517f7f1bf9dafa5d75b006e875a8490dca8963570c2042428783e99ef52b49d1b17b419f372e32c6fe627fbbb7e5872366b8b
|
data/Rakefile
CHANGED
@@ -1,16 +1,6 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rspec/core/rake_task"
|
3
3
|
|
4
|
-
# Add the include path for the fit4ruby library. We assume it is located in
|
5
|
-
# the same directory as the postrunner directory.
|
6
|
-
fit4ruby = File.realpath(File.join(File.dirname(__FILE__), '..',
|
7
|
-
'fit4ruby', 'lib'))
|
8
|
-
if ENV['RUBYLIB']
|
9
|
-
ENV['RUBYLIB'] += ":#{fit4ruby}"
|
10
|
-
else
|
11
|
-
ENV['RUBYLIB'] = fit4ruby
|
12
|
-
end
|
13
|
-
|
14
4
|
RSpec::Core::RakeTask.new
|
15
5
|
|
16
6
|
task :default => :spec
|
data/lib/postrunner.rb
CHANGED
@@ -10,7 +10,11 @@
|
|
10
10
|
# published by the Free Software Foundation.
|
11
11
|
#
|
12
12
|
|
13
|
-
|
13
|
+
# Some dependencies may not be installed as Ruby Gems but as local sources.
|
14
|
+
# Add them to the LOAD_PATH.
|
15
|
+
%w( fit4ruby perobs ).each do |lib_dir|
|
16
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', lib_dir, 'lib'))
|
17
|
+
end
|
14
18
|
$:.unshift(File.dirname(__FILE__))
|
15
19
|
|
16
20
|
require 'postrunner/Main'
|
@@ -89,36 +89,26 @@ module PostRunner
|
|
89
89
|
# @param fit_file [String] Name of the FIT file.
|
90
90
|
# @return [TrueClass or FalseClass] True if the file could be added. False
|
91
91
|
# otherwise.
|
92
|
-
def add(
|
93
|
-
|
94
|
-
if @activities.find { |a| a.fit_file == base_fit_file }
|
95
|
-
Log.debug "Activity #{fit_file} is already included in the archive"
|
96
|
-
return false
|
97
|
-
end
|
92
|
+
def add(fit_file_name, fit_activity)
|
93
|
+
base_fit_file_name = File.basename(fit_file_name)
|
98
94
|
|
99
|
-
if
|
100
|
-
Log.debug "Activity #{
|
95
|
+
if @activities.find { |a| a.fit_file == base_fit_file_name }
|
96
|
+
Log.debug "Activity #{fit_file_name} is already included in the archive"
|
101
97
|
return false
|
102
98
|
end
|
103
99
|
|
104
|
-
|
105
|
-
|
106
|
-
rescue Fit4Ruby::Error
|
107
|
-
Log.error $!
|
108
|
-
return false
|
109
|
-
end
|
110
|
-
unless fit_activity
|
111
|
-
Log.error "#{fit_file} does not contain any activity records"
|
100
|
+
if File.exists?(File.join(@fit_dir, base_fit_file_name))
|
101
|
+
Log.debug "Activity #{fit_file_name} has been deleted before"
|
112
102
|
return false
|
113
103
|
end
|
114
104
|
|
115
105
|
begin
|
116
|
-
FileUtils.cp(
|
106
|
+
FileUtils.cp(fit_file_name, @fit_dir)
|
117
107
|
rescue StandardError
|
118
|
-
Log.fatal "Cannot copy #{
|
108
|
+
Log.fatal "Cannot copy #{fit_file_name} into #{@fit_dir}: #{$!}"
|
119
109
|
end
|
120
110
|
|
121
|
-
@activities << (activity = Activity.new(self,
|
111
|
+
@activities << (activity = Activity.new(self, base_fit_file_name,
|
122
112
|
fit_activity))
|
123
113
|
@activities.sort! do |a1, a2|
|
124
114
|
a2.timestamp <=> a1.timestamp
|
@@ -140,7 +130,7 @@ module PostRunner
|
|
140
130
|
end
|
141
131
|
|
142
132
|
sync
|
143
|
-
Log.info "#{
|
133
|
+
Log.info "#{fit_file_name} successfully added to archive"
|
144
134
|
|
145
135
|
true
|
146
136
|
end
|
@@ -54,6 +54,11 @@ module PostRunner
|
|
54
54
|
t.row([ 'Distance:',
|
55
55
|
local_value(session, 'total_distance', '%.2f %s',
|
56
56
|
{ :metric => 'km', :statute => 'mi'}) ])
|
57
|
+
if session.has_geo_data?
|
58
|
+
t.row([ 'GPS Data based Distance:',
|
59
|
+
local_value(@fit_activity, 'total_gps_distance', '%.2f %s',
|
60
|
+
{ :metric => 'km', :statute => 'mi'}) ])
|
61
|
+
end
|
57
62
|
t.row([ 'Time:', secsToHMS(session.total_timer_time) ])
|
58
63
|
if @activity.sport == 'running' || @activity.sport == 'multisport'
|
59
64
|
t.row([ 'Avg. Pace:', pace(session, 'avg_speed') ])
|
data/lib/postrunner/ChartView.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#!/usr/bin/env ruby -w
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
2
3
|
#
|
3
4
|
# = ChartView.rb -- PostRunner - Manage the data from your Garmin sport devices.
|
4
5
|
#
|
@@ -176,8 +177,9 @@ EOT
|
|
176
177
|
else
|
177
178
|
value = (value * 3600.0 * 1000).to_i
|
178
179
|
end
|
180
|
+
min_value = 0.0
|
179
181
|
else
|
180
|
-
min_value = value if
|
182
|
+
min_value = value if (min_value.nil? || min_value > value)
|
181
183
|
end
|
182
184
|
data_set << [ ((r.timestamp.to_i - start_time) * 1000).to_i, value ]
|
183
185
|
end
|
@@ -190,18 +192,19 @@ EOT
|
|
190
192
|
s << data_set.map do |set|
|
191
193
|
"[ #{set[0]}, #{set[1] ? set[1] : 'null'} ]"
|
192
194
|
end.join(', ')
|
195
|
+
s << "];\n"
|
196
|
+
|
197
|
+
s << lap_marks(start_time)
|
193
198
|
|
194
199
|
chart_id = "#{field}_chart"
|
195
200
|
s << <<"EOT"
|
196
|
-
|
197
|
-
|
198
|
-
$.plot(\"##{chart_id}\",
|
201
|
+
var plot = $.plot(\"##{chart_id}\",
|
199
202
|
[ { data: #{field}_data,
|
200
203
|
#{color ? "color: \"#{color}\"," : ''}
|
201
204
|
lines: { show: true#{field == 'pace' ? '' :
|
202
205
|
', fill: true'} } } ],
|
203
206
|
{ xaxis: { mode: "time" },
|
204
|
-
grid: { hoverable: true }
|
207
|
+
grid: { markings: lap_marks, hoverable: true }
|
205
208
|
EOT
|
206
209
|
if field == 'pace'
|
207
210
|
s << ", yaxis: { mode: \"time\",\n" +
|
@@ -212,6 +215,7 @@ EOT
|
|
212
215
|
s << ", yaxis: { min: #{0.9 * min_value} }"
|
213
216
|
end
|
214
217
|
s << "});\n"
|
218
|
+
s << lap_mark_labels(chart_id, start_time)
|
215
219
|
s << hover_function(chart_id, y_label, select_unit(unit)) + "\n"
|
216
220
|
end
|
217
221
|
|
@@ -233,11 +237,11 @@ EOT
|
|
233
237
|
# Find the right set by looking at the maximum allowed values for each
|
234
238
|
# color.
|
235
239
|
colors.each.with_index do |col_max_value, i|
|
236
|
-
col,
|
237
|
-
if
|
238
|
-
# A
|
239
|
-
# allowed range for this set, so add the value as x/y pair
|
240
|
-
# set.
|
240
|
+
col, range_max_value = col_max_value
|
241
|
+
if range_max_value.nil? || value < range_max_value
|
242
|
+
# A range_max_value of nil means all values allowed. The value is
|
243
|
+
# in the allowed range for this set, so add the value as x/y pair
|
244
|
+
# to the set.
|
241
245
|
x_val = (r.timestamp.to_i - start_time) * 1000
|
242
246
|
data_sets[i] << [ x_val, r.get_as(field, select_unit(unit)) ]
|
243
247
|
# Abort the color loop since we've found the right set already.
|
@@ -260,8 +264,10 @@ EOT
|
|
260
264
|
s << " ];\n"
|
261
265
|
end
|
262
266
|
|
267
|
+
s << lap_marks(start_time)
|
268
|
+
|
263
269
|
chart_id = "#{field}_chart"
|
264
|
-
s << "$.plot(\"##{chart_id}\", [\n"
|
270
|
+
s << "var plot = $.plot(\"##{chart_id}\", [\n"
|
265
271
|
s << data_sets.map do |index, ds|
|
266
272
|
"{ data: #{field}_data_#{index},\n" +
|
267
273
|
" color: \"#{colors[index][0]}\",\n" +
|
@@ -269,7 +275,8 @@ EOT
|
|
269
275
|
" fill: true, radius: 2 } }"
|
270
276
|
end.join(', ')
|
271
277
|
s << "], { xaxis: { mode: \"time\" },
|
272
|
-
grid: { hoverable: true } });\n"
|
278
|
+
grid: { markings: lap_marks, hoverable: true } });\n"
|
279
|
+
s << lap_mark_labels(chart_id, start_time)
|
273
280
|
s << hover_function(chart_id, y_label, select_unit(unit))
|
274
281
|
|
275
282
|
s
|
@@ -302,6 +309,34 @@ EOT
|
|
302
309
|
EOT
|
303
310
|
end
|
304
311
|
|
312
|
+
def lap_marks(start_time)
|
313
|
+
# Use vertical lines to mark the end of each lap.
|
314
|
+
s = "var lap_marks = [\n"
|
315
|
+
s += @activity.fit_activity.laps.map do |lap|
|
316
|
+
x = ((lap.timestamp.to_i - start_time) * 1000).to_i
|
317
|
+
"\n { color: \"#666\", lineWidth: 1, " +
|
318
|
+
"xaxis: { from: #{x} , to: #{x} } }"
|
319
|
+
end.join(",\n")
|
320
|
+
s + "];\n"
|
321
|
+
end
|
322
|
+
|
323
|
+
def lap_mark_labels(chart_id, start_time)
|
324
|
+
# Mark the vertical lap marks with the number of the lap right to the
|
325
|
+
# left at the top end of the line.
|
326
|
+
s = ''
|
327
|
+
@activity.fit_activity.laps[0..-2].each do |lap|
|
328
|
+
x = ((lap.timestamp.to_i - start_time) * 1000).to_i
|
329
|
+
s += "$(\"##{chart_id}\").append(" +
|
330
|
+
"\"<div style='position:absolute;" +
|
331
|
+
"left:\" + (plot.pointOffset({x: #{x}, y: 0}).left - 18) + \"px;" +
|
332
|
+
"top:7px;width:16px;" +
|
333
|
+
"text-align:right;" +
|
334
|
+
"color:#666;font-size:smaller'>" +
|
335
|
+
"#{lap.message_index + 1}</div>\");\n"
|
336
|
+
end
|
337
|
+
s
|
338
|
+
end
|
339
|
+
|
305
340
|
end
|
306
341
|
|
307
342
|
end
|
@@ -66,6 +66,8 @@ module PostRunner
|
|
66
66
|
end
|
67
67
|
if (type = device.device_type)
|
68
68
|
rename = { 'heart_rate' => 'Heart Rate Sensor',
|
69
|
+
'barometric_pressure' => 'Barometer',
|
70
|
+
'position' => 'GPS',
|
69
71
|
'stride_speed_distance' => 'Footpod',
|
70
72
|
'running_dynamics' => 'Running Dynamics' }
|
71
73
|
type = rename[type] if rename.include?(type)
|
data/lib/postrunner/Main.rb
CHANGED
@@ -13,10 +13,12 @@
|
|
13
13
|
require 'optparse'
|
14
14
|
require 'logger'
|
15
15
|
require 'fit4ruby'
|
16
|
+
require 'perobs'
|
16
17
|
|
17
18
|
require 'postrunner/version'
|
18
19
|
require 'postrunner/RuntimeConfig'
|
19
20
|
require 'postrunner/ActivitiesDB'
|
21
|
+
require 'postrunner/MonitoringDB'
|
20
22
|
require 'postrunner/EPO_Downloader'
|
21
23
|
|
22
24
|
module PostRunner
|
@@ -36,11 +38,13 @@ module PostRunner
|
|
36
38
|
@attribute = nil
|
37
39
|
@value = nil
|
38
40
|
@activities = nil
|
41
|
+
@monitoring = nil
|
39
42
|
@db_dir = File.join(ENV['HOME'], '.postrunner')
|
40
43
|
|
41
44
|
return if (args = parse_options(args)).nil?
|
42
45
|
|
43
46
|
@cfg = RuntimeConfig.new(@db_dir)
|
47
|
+
@db = PEROBS::Store.new(File.join(@db_dir, 'database'))
|
44
48
|
execute_command(args)
|
45
49
|
end
|
46
50
|
|
@@ -188,6 +192,7 @@ EOT
|
|
188
192
|
|
189
193
|
def execute_command(args)
|
190
194
|
@activities = ActivitiesDB.new(@db_dir, @cfg)
|
195
|
+
@monitoring = MonitoringDB.new(@db, @cfg)
|
191
196
|
handle_version_update
|
192
197
|
|
193
198
|
case (cmd = args.shift)
|
@@ -301,17 +306,44 @@ EOT
|
|
301
306
|
end
|
302
307
|
end
|
303
308
|
|
309
|
+
# Process a single FIT file according to the given command.
|
310
|
+
# @param file [String] File name of a FIT file
|
311
|
+
# @param command [Symbol] Processing instruction
|
312
|
+
# @return [TrueClass, FalseClass] true if command was successful, false
|
313
|
+
# otherwise
|
304
314
|
def process_file(file, command)
|
305
315
|
case command
|
306
316
|
when :check, :dump
|
307
317
|
read_fit_file(file)
|
308
318
|
when :import
|
309
|
-
|
319
|
+
import_fit_file(file)
|
310
320
|
else
|
311
321
|
Log.fatal("Unknown file command #{command}")
|
312
322
|
end
|
313
323
|
end
|
314
324
|
|
325
|
+
# Import the given FIT file.
|
326
|
+
# @param fit_file_name [String] File name of the FIT file
|
327
|
+
# @return [TrueClass, FalseClass] true if file was successfully imported,
|
328
|
+
# false otherwise
|
329
|
+
def import_fit_file(fit_file_name)
|
330
|
+
begin
|
331
|
+
fit_entity = Fit4Ruby.read(fit_file_name)
|
332
|
+
rescue Fit4Ruby::Error
|
333
|
+
Log.error $!
|
334
|
+
return false
|
335
|
+
end
|
336
|
+
|
337
|
+
if fit_entity.is_a?(Fit4Ruby::Activity)
|
338
|
+
return @activities.add(fit_file_name, fit_entity)
|
339
|
+
elsif fit_entity.is_a?(Fit4Ruby::Monitoring_B)
|
340
|
+
return @monitoring.add(fit_file_name, fit_entity)
|
341
|
+
else
|
342
|
+
Log.error "#{fit_file_name} is not a recognized FIT file"
|
343
|
+
return false
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
315
347
|
def process_activity(activity, command)
|
316
348
|
case command
|
317
349
|
when :check
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby -w
|
2
|
+
# encoding: UTF-8
|
3
|
+
#
|
4
|
+
# = MonitoringDB.rb -- PostRunner - Manage the data from your Garmin sport devices.
|
5
|
+
#
|
6
|
+
# Copyright (c) 2014, 2015 by Chris Schlaeger <cs@taskjuggler.org>
|
7
|
+
#
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
9
|
+
# it under the terms of version 2 of the GNU General Public License as
|
10
|
+
# published by the Free Software Foundation.
|
11
|
+
#
|
12
|
+
|
13
|
+
module PostRunner
|
14
|
+
|
15
|
+
class MonitoringDB
|
16
|
+
|
17
|
+
def initialize(store, cfg)
|
18
|
+
@store = store
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(fit_file_name, fit_monitoring_b)
|
22
|
+
start_time = fit_monitoring_b.monitoring_infos[0].timestamp
|
23
|
+
|
24
|
+
fit_monitoring_b.monitorings.each do |monitoring|
|
25
|
+
if (cati = monitoring.current_activity_type_intensity)
|
26
|
+
data.activity_type = decode_activity_type(cati & 0x1F)
|
27
|
+
data.intensity = (cati >> 5) & 0x7
|
28
|
+
#puts "#{monitoring.timestamp}: #{decode_activity_type(cati & 0x1F)}" +
|
29
|
+
# " #{(cati >> 5) & 0x7}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def decode_activity_type(activity_type)
|
37
|
+
types = [ :generic, :running, :cycling, :transition,
|
38
|
+
:fitness_equipment, :swimming, :walking, :unknown7,
|
39
|
+
:resting, :unknown9 ]
|
40
|
+
if (decoded_type = types[activity_type])
|
41
|
+
decoded_type
|
42
|
+
else
|
43
|
+
Log.error "Unknown activity type #{activity_type}"
|
44
|
+
:generic
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
data/lib/postrunner/version.rb
CHANGED
data/postrunner.gemspec
CHANGED
@@ -19,7 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
spec.required_ruby_version = '>=2.0'
|
21
21
|
|
22
|
-
spec.add_dependency 'fit4ruby', '~> 0.0.
|
22
|
+
spec.add_dependency 'fit4ruby', '~> 0.0.7'
|
23
|
+
spec.add_dependency 'perobs', '~> 1.0.0'
|
23
24
|
spec.add_dependency 'nokogiri', '~> 1.6'
|
24
25
|
|
25
26
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
data/spec/FlexiTable_spec.rb
CHANGED
data/spec/PostRunner_spec.rb
CHANGED
@@ -12,8 +12,8 @@
|
|
12
12
|
|
13
13
|
require 'fileutils'
|
14
14
|
|
15
|
-
require 'postrunner/Main'
|
16
15
|
require 'spec_helper'
|
16
|
+
require 'postrunner/Main'
|
17
17
|
|
18
18
|
describe PostRunner::Main do
|
19
19
|
|
@@ -38,6 +38,7 @@ describe PostRunner::Main do
|
|
38
38
|
FileUtils.rm_rf(@db_dir)
|
39
39
|
FileUtils.rm_rf('FILE1.FIT')
|
40
40
|
FileUtils.rm_rf('FILE2.FIT')
|
41
|
+
FileUtils::rm_rf('icons')
|
41
42
|
end
|
42
43
|
|
43
44
|
it 'should abort without arguments' do
|
data/spec/View_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -10,6 +10,12 @@
|
|
10
10
|
# published by the Free Software Foundation.
|
11
11
|
#
|
12
12
|
|
13
|
+
# Some dependencies may not be installed as Ruby Gems but as local sources.
|
14
|
+
# Add them and the postrunner dir to the LOAD_PATH.
|
15
|
+
%w( postrunner fit4ruby perobs ).each do |lib_dir|
|
16
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', lib_dir, 'lib'))
|
17
|
+
end
|
18
|
+
|
13
19
|
def create_fit_file(name, date, duration_minutes = 30)
|
14
20
|
Fit4Ruby.write(name, create_fit_activity(date, duration_minutes))
|
15
21
|
end
|
@@ -29,6 +35,7 @@ def create_fit_activity(date, duration_minutes)
|
|
29
35
|
:device_index => 0 })
|
30
36
|
a.new_device_info({ :timestamp => ts, :manufacturer => 'garmin',
|
31
37
|
:device_index => 1, :battery_status => 'ok' })
|
38
|
+
laps = 0
|
32
39
|
0.upto((a.total_timer_time / 60) - 1) do |mins|
|
33
40
|
a.new_record({
|
34
41
|
:timestamp => ts,
|
@@ -47,7 +54,9 @@ def create_fit_activity(date, duration_minutes)
|
|
47
54
|
})
|
48
55
|
|
49
56
|
if mins > 0 && mins % 5 == 0
|
50
|
-
a.new_lap({ :timestamp => ts, :sport => 'running'
|
57
|
+
a.new_lap({ :timestamp => ts, :sport => 'running',
|
58
|
+
:message_index => laps })
|
59
|
+
laps += 1
|
51
60
|
end
|
52
61
|
ts += 60
|
53
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postrunner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Schlaeger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fit4ruby
|
@@ -16,14 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.
|
19
|
+
version: 0.0.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.
|
26
|
+
version: 0.0.7
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: perobs
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.0.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: nokogiri
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,6 +139,7 @@ files:
|
|
125
139
|
- lib/postrunner/FlexiTable.rb
|
126
140
|
- lib/postrunner/HTMLBuilder.rb
|
127
141
|
- lib/postrunner/Main.rb
|
142
|
+
- lib/postrunner/MonitoringDB.rb
|
128
143
|
- lib/postrunner/NavButtonRow.rb
|
129
144
|
- lib/postrunner/PagingButtons.rb
|
130
145
|
- lib/postrunner/PersonalRecords.rb
|