tac_scribe 0.5.0 → 0.7.1
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +14 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +24 -1
- data/db/001_create_unit_table.rb +1 -0
- data/exe/tac_scribe +1 -1
- data/lib/tac_scribe/cache.rb +38 -9
- data/lib/tac_scribe/daemon.rb +27 -10
- data/lib/tac_scribe/datastore.rb +7 -0
- data/lib/tac_scribe/event_processor.rb +31 -8
- data/lib/tac_scribe/event_queue.rb +3 -3
- data/lib/tac_scribe/version.rb +1 -1
- data/tac_scribe.gemspec +6 -0
- metadata +62 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '099cde73f8075ae6ce15559bb91931382992c4182f78656beab7846adb7a7ba4'
|
4
|
+
data.tar.gz: ffd9790d498398f6bb4777d50fecb2aeb426af5484d766be55c3f04aa18934cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74ff0905ea7250214c73287bd17b85d82002c3bcaa74c13618a7887a20298ba0b4e0f2b54476a4cc36f0f2d579dced61c63b345e4fbe4892de91ac235343c16d
|
7
|
+
data.tar.gz: 607fb4c5f77035783ec06fe0382aad023d45e26c3b08dc163a2293e957a3937c298107dd80613dc74b5e21d04283fa557bdbcfddee4fd9bf179c068a844d8a5f
|
data/.rubocop.yml
CHANGED
@@ -14,7 +14,10 @@ Metrics/BlockLength:
|
|
14
14
|
# There isn't much sense breaking up the OptionParser block since splitting
|
15
15
|
# into db and tacview option methods will just break the method length cop
|
16
16
|
# and splitting further doesn't aid readability
|
17
|
-
- exe/
|
17
|
+
- exe/tac_scribe
|
18
|
+
# Cannot really avoid this
|
19
|
+
- tac_scribe.gemspec
|
20
|
+
|
18
21
|
Metrics/MethodLength:
|
19
22
|
Exclude:
|
20
23
|
# Breaking up the initializer doesn't really do much for readability
|
@@ -29,3 +32,13 @@ Style/GlobalVars:
|
|
29
32
|
Exclude:
|
30
33
|
# Using a global variable makes it available to the Pry console
|
31
34
|
- bin/console
|
35
|
+
AllCops:
|
36
|
+
Exclude:
|
37
|
+
# These files will need a MAJOR refactoring to get rid of these warnings
|
38
|
+
- lib/tac_scribe/cache.rb
|
39
|
+
- lib/tac_scribe/datastore.rb
|
40
|
+
- lib/tac_scribe/daemon.rb
|
41
|
+
ClassVars:
|
42
|
+
Exclude:
|
43
|
+
# We are fine with this and understand the risks. We are not inheriting.
|
44
|
+
- lib/tac_scribe/event_processor.rb
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.7.0
|
data/CHANGELOG.md
CHANGED
@@ -4,7 +4,30 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
5
5
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
-
## [
|
7
|
+
## [0.7.1]
|
8
|
+
### Changed
|
9
|
+
- Fixed issue where "name" fields were not being populated
|
10
|
+
if airfields were not being loaded first
|
11
|
+
|
12
|
+
## [0.7.0]
|
13
|
+
### Changed
|
14
|
+
- Synced Lat/Lon calculations with DCS and fixed issue where
|
15
|
+
calculations were incorrect if only one value was updated
|
16
|
+
|
17
|
+
## [0.6.2]
|
18
|
+
### Changed
|
19
|
+
- Fixed typo causing app to fail
|
20
|
+
|
21
|
+
## [0.6.1]
|
22
|
+
### Changed
|
23
|
+
- Test build for gem issue
|
24
|
+
|
25
|
+
## [0.6.0]
|
26
|
+
### Added
|
27
|
+
- Calculates and stores speed of units
|
28
|
+
|
29
|
+
### Fixed
|
30
|
+
- Made more robust against failures and more logging messages
|
8
31
|
|
9
32
|
## [0.5.0]
|
10
33
|
### Changed
|
data/db/001_create_unit_table.rb
CHANGED
data/exe/tac_scribe
CHANGED
@@ -52,7 +52,7 @@ OptionParser.new do |opts|
|
|
52
52
|
'Postgresql server port (Default: 5432)') do |v|
|
53
53
|
options[:db_port] = v
|
54
54
|
end
|
55
|
-
opts.on('-u', '--db-
|
55
|
+
opts.on('-u', '--db-user=username',
|
56
56
|
'Postgresql username (Required)') do |v|
|
57
57
|
options[:db_user] = v
|
58
58
|
end
|
data/lib/tac_scribe/cache.rb
CHANGED
@@ -5,8 +5,11 @@ require 'sequel'
|
|
5
5
|
require 'sequel-postgis-georuby'
|
6
6
|
require 'singleton'
|
7
7
|
require 'concurrent-ruby'
|
8
|
+
require 'haversine'
|
8
9
|
|
9
10
|
module TacScribe
|
11
|
+
# The in-memory cache that is updated by events in real-time before the data
|
12
|
+
# is synced to the DB
|
10
13
|
class Cache
|
11
14
|
include Singleton
|
12
15
|
include GeoRuby::SimpleFeatures
|
@@ -35,22 +38,25 @@ module TacScribe
|
|
35
38
|
object.delete(key)
|
36
39
|
end
|
37
40
|
|
41
|
+
# https://wiki.hoggitworld.com/view/DCS_singleton_coalition
|
38
42
|
if object[:coalition]
|
39
43
|
object[:coalition] = case object[:coalition]
|
40
|
-
when '
|
41
|
-
0
|
42
|
-
when 'Enemies'
|
43
|
-
1
|
44
|
-
else
|
44
|
+
when 'Enemies' # Enemies is Bluefor
|
45
45
|
2
|
46
|
+
when 'Allies' # Allies is Redfor
|
47
|
+
1
|
48
|
+
else # Neutral
|
49
|
+
0
|
46
50
|
end
|
47
51
|
end
|
48
52
|
|
49
53
|
if cache_object
|
50
54
|
object[:heading] = calculate_heading(cache_object, object)
|
55
|
+
object[:speed] = calculate_speed(cache_object, object)
|
51
56
|
cache_object.merge!(object)
|
52
57
|
else
|
53
58
|
object[:heading] = -1
|
59
|
+
object[:speed] = 0
|
54
60
|
cache_object = object
|
55
61
|
end
|
56
62
|
|
@@ -75,9 +81,11 @@ module TacScribe
|
|
75
81
|
def delete_object(id)
|
76
82
|
@@cache[id][:deleted] = true if @@cache[id]
|
77
83
|
end
|
78
|
-
|
84
|
+
|
79
85
|
def clear
|
80
86
|
@@cache.clear
|
87
|
+
self.reference_latitude = nil
|
88
|
+
self.reference_longitude = nil
|
81
89
|
end
|
82
90
|
|
83
91
|
private
|
@@ -95,20 +103,25 @@ module TacScribe
|
|
95
103
|
longitude = if object.key?(:longitude)
|
96
104
|
object[:longitude]
|
97
105
|
else
|
98
|
-
cache_object[:position].
|
106
|
+
cache_object[:position].x
|
99
107
|
end
|
100
108
|
|
101
109
|
latitude = if object.key?(:latitude)
|
102
110
|
object[:latitude]
|
103
111
|
else
|
104
|
-
cache_object[:position].
|
112
|
+
cache_object[:position].y
|
105
113
|
end
|
106
114
|
|
115
|
+
# This "Point" class is not lat/long aware which is why we are
|
116
|
+
# flipping things up here because when it converts to SQL we need
|
117
|
+
# the long to be first since that is what postgresql expects.
|
107
118
|
Point.from_x_y(longitude, latitude)
|
108
119
|
end
|
109
120
|
|
110
121
|
def calculate_heading(cache_object, object)
|
111
|
-
|
122
|
+
if cache_object[:position] == object[:position]
|
123
|
+
return cache_object[:heading]
|
124
|
+
end
|
112
125
|
|
113
126
|
begin
|
114
127
|
cache_object[:position].bearing_to(object[:position]).to_i
|
@@ -118,5 +131,21 @@ module TacScribe
|
|
118
131
|
puts 'New Position: ' + object[:position].inspect
|
119
132
|
end
|
120
133
|
end
|
134
|
+
|
135
|
+
def calculate_speed(cache_object, object)
|
136
|
+
time = object[:game_time] - cache_object[:game_time]
|
137
|
+
|
138
|
+
start_point = cache_object[:position]
|
139
|
+
end_point = object[:position]
|
140
|
+
|
141
|
+
# Because of the above issues with Point and Lat/Lon
|
142
|
+
# the values are reverse here :(
|
143
|
+
distance = Haversine.distance(start_point.y, start_point.x,
|
144
|
+
end_point.y, end_point.x).to_meters
|
145
|
+
|
146
|
+
speed = distance / time
|
147
|
+
|
148
|
+
speed.to_i
|
149
|
+
end
|
121
150
|
end
|
122
151
|
end
|
data/lib/tac_scribe/daemon.rb
CHANGED
@@ -31,7 +31,7 @@ module TacScribe
|
|
31
31
|
|
32
32
|
@populate_airfields = populate_airfields
|
33
33
|
@thread_count = thread_count
|
34
|
-
@threads =
|
34
|
+
@threads = {}
|
35
35
|
@whitelist = Set.new(IO.read(whitelist).split) if whitelist
|
36
36
|
|
37
37
|
@client = TacviewClient::Client.new(
|
@@ -50,7 +50,7 @@ module TacScribe
|
|
50
50
|
# for example
|
51
51
|
def start_processing
|
52
52
|
loop do
|
53
|
-
|
53
|
+
puts 'Starting processing loop'
|
54
54
|
@event_queue.clear
|
55
55
|
Datastore.instance.truncate_table
|
56
56
|
Cache.instance.clear
|
@@ -58,23 +58,36 @@ module TacScribe
|
|
58
58
|
start_db_sync_thread
|
59
59
|
start_reporting_thread
|
60
60
|
populate_airfields if @populate_airfields
|
61
|
+
@threads.each_pair do |key, _value|
|
62
|
+
puts "#{key} thread started"
|
63
|
+
end
|
61
64
|
@client.connect
|
65
|
+
# If this code is executed it means we have been disconnected without
|
66
|
+
# exceptions. We will still sleep to stop a retry storm. Just not as
|
67
|
+
# long.
|
68
|
+
puts "Disconnected from Tacview"
|
69
|
+
kill_threads
|
70
|
+
sleep 10
|
62
71
|
# Rescuing reliably from Net::HTTP is a complete bear so rescue
|
63
72
|
# StandardError. It ain't pretty but it is reliable. We will puts
|
64
73
|
# the exception just in case
|
65
74
|
# https://stackoverflow.com/questions/5370697/what-s-the-best-way-to-handle-exceptions-from-nethttp
|
66
75
|
rescue StandardError => e
|
76
|
+
puts 'Exception in processing loop'
|
67
77
|
puts e.message
|
68
78
|
puts e.backtrace
|
79
|
+
kill_threads
|
69
80
|
sleep 30
|
70
81
|
next
|
71
82
|
end
|
72
83
|
end
|
73
84
|
|
74
85
|
def kill_threads
|
75
|
-
|
76
|
-
|
77
|
-
|
86
|
+
puts 'Killing Threads'
|
87
|
+
@threads.each_pair do |key, thread|
|
88
|
+
puts "Killing #{key} thread"
|
89
|
+
thread.kill
|
90
|
+
thread.join
|
78
91
|
end
|
79
92
|
end
|
80
93
|
|
@@ -87,7 +100,7 @@ module TacScribe
|
|
87
100
|
@event_processor.start
|
88
101
|
end
|
89
102
|
event_processor_thread.name = 'Event Processor'
|
90
|
-
@threads
|
103
|
+
@threads[:processing] = event_processor_thread
|
91
104
|
end
|
92
105
|
|
93
106
|
def start_db_sync_thread
|
@@ -96,16 +109,19 @@ module TacScribe
|
|
96
109
|
sleep 1
|
97
110
|
deleted = Datastore.instance.write_objects(Cache.instance.data.values)
|
98
111
|
deleted.each { |id| Cache.instance.data.delete(id) }
|
112
|
+
rescue StandardError
|
113
|
+
next
|
99
114
|
end
|
100
115
|
end
|
101
116
|
db_write_thread.name = 'Database Writing'
|
102
|
-
@threads
|
117
|
+
@threads[:database] = db_write_thread
|
103
118
|
end
|
104
119
|
|
105
120
|
def start_reporting_thread
|
106
121
|
return unless @verbose_logging
|
107
122
|
|
108
123
|
reporting_thread = Thread.new do
|
124
|
+
sleep 5
|
109
125
|
loop do
|
110
126
|
puts "#{Time.now.strftime('%FT%T')}\t" \
|
111
127
|
"Events Incoming: #{@event_queue.events_written}\t" \
|
@@ -123,11 +139,12 @@ module TacScribe
|
|
123
139
|
end
|
124
140
|
end
|
125
141
|
reporting_thread.name = 'Reporting'
|
126
|
-
@threads
|
142
|
+
@threads[:reporting] = reporting_thread
|
127
143
|
end
|
128
144
|
|
129
145
|
def populate_airfields
|
130
|
-
json = File.read(File.join(File.dirname(__FILE__),
|
146
|
+
json = File.read(File.join(File.dirname(__FILE__),
|
147
|
+
'../../data/airfields.json'))
|
131
148
|
airfields = JSON.parse(json)
|
132
149
|
airfields.each_with_index do |airfield, i|
|
133
150
|
@event_queue.update_object(
|
@@ -137,7 +154,7 @@ module TacScribe
|
|
137
154
|
altitude: BigDecimal(airfield['alt'].to_s),
|
138
155
|
type: 'Ground+Static+Aerodrome',
|
139
156
|
name: airfield['name'],
|
140
|
-
coalition:
|
157
|
+
coalition: 0 # Neutral
|
141
158
|
)
|
142
159
|
end
|
143
160
|
end
|
data/lib/tac_scribe/datastore.rb
CHANGED
@@ -53,11 +53,18 @@ module TacScribe
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def write_objects(objects)
|
56
|
+
objects = objects.map do |object|
|
57
|
+
obj = object.clone
|
58
|
+
obj.delete(:game_time)
|
59
|
+
obj
|
60
|
+
end
|
61
|
+
|
56
62
|
@db[:units].insert_conflict(
|
57
63
|
constraint: :units_pkey,
|
58
64
|
update: { position: Sequel[:excluded][:position],
|
59
65
|
altitude: Sequel[:excluded][:altitude],
|
60
66
|
heading: Sequel[:excluded][:heading],
|
67
|
+
speed: Sequel[:excluded][:speed],
|
61
68
|
updated_at: Sequel[:excluded][:updated_at],
|
62
69
|
deleted: Sequel[:excluded][:deleted] }
|
63
70
|
)
|
@@ -23,11 +23,12 @@ module TacScribe
|
|
23
23
|
|
24
24
|
def start
|
25
25
|
loop do
|
26
|
-
wrapped_event = @event_queue.
|
26
|
+
wrapped_event = @event_queue.shift
|
27
27
|
process_event(wrapped_event)
|
28
28
|
rescue StandardError => e
|
29
29
|
puts wrapped_event
|
30
30
|
puts e.inspect
|
31
|
+
puts e.backtrace
|
31
32
|
next
|
32
33
|
end
|
33
34
|
end
|
@@ -38,6 +39,10 @@ module TacScribe
|
|
38
39
|
update_object(wrapped_event[:event], wrapped_event[:time])
|
39
40
|
when :delete_object
|
40
41
|
delete_object(wrapped_event[:object_id])
|
42
|
+
when :set_latitude
|
43
|
+
update_latitude wrapped_event[:value]
|
44
|
+
when :set_longitude
|
45
|
+
update_longitude wrapped_event[:value]
|
41
46
|
end
|
42
47
|
end
|
43
48
|
|
@@ -60,20 +65,31 @@ module TacScribe
|
|
60
65
|
# format.
|
61
66
|
# @option event [BigDecimal] :altitude The object altitude above sea level
|
62
67
|
# in meters to 1 decimal place.
|
63
|
-
def update_object(event,
|
68
|
+
def update_object(event, time)
|
69
|
+
return if ignore_unit?(event)
|
70
|
+
|
71
|
+
# Hack to make sure the :name field is present so that it is included
|
72
|
+
# in the SQL
|
73
|
+
event[:name] = "" unless event.has_key?(:name)
|
74
|
+
event[:game_time] = time
|
75
|
+
|
76
|
+
self.events_processed += 1
|
77
|
+
@cache.write_object(event)
|
78
|
+
end
|
79
|
+
|
80
|
+
def ignore_unit?(event)
|
64
81
|
if @@ignored_units.include?(event[:object_id])
|
65
82
|
self.events_ignored += 1
|
66
|
-
return
|
83
|
+
return true
|
67
84
|
end
|
68
85
|
|
69
86
|
if @whitelist && event[:type] && !@whitelist.include?(event[:type])
|
70
87
|
@@ignored_units << event[:object_id]
|
71
88
|
self.events_ignored += 1
|
72
|
-
return
|
89
|
+
return true
|
73
90
|
end
|
74
91
|
|
75
|
-
|
76
|
-
@cache.write_object(event)
|
92
|
+
false
|
77
93
|
end
|
78
94
|
|
79
95
|
# Process a delete event for an object
|
@@ -81,12 +97,19 @@ module TacScribe
|
|
81
97
|
# @param id [String] A hexadecimal number representing the object ID
|
82
98
|
def delete_object(id)
|
83
99
|
if @@ignored_units.delete?(id)
|
84
|
-
self.events_processed += 1
|
85
100
|
nil
|
86
101
|
else
|
87
|
-
self.events_processed += 1
|
88
102
|
@cache.delete_object(id)
|
89
103
|
end
|
104
|
+
self.events_processed += 1
|
105
|
+
end
|
106
|
+
|
107
|
+
def update_latitude(value)
|
108
|
+
Cache.instance.reference_latitude = value
|
109
|
+
end
|
110
|
+
|
111
|
+
def update_longitude(value)
|
112
|
+
Cache.instance.reference_longitude = value
|
90
113
|
end
|
91
114
|
end
|
92
115
|
end
|
@@ -21,7 +21,7 @@ module TacScribe
|
|
21
21
|
@events.size
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
24
|
+
def shift
|
25
25
|
@events.shift
|
26
26
|
end
|
27
27
|
|
@@ -71,9 +71,9 @@ module TacScribe
|
|
71
71
|
def set_property(property:, value:)
|
72
72
|
case property
|
73
73
|
when 'ReferenceLatitude'
|
74
|
-
|
74
|
+
@events << { type: :set_latitude, value: BigDecimal(value) }
|
75
75
|
when 'ReferenceLongitude'
|
76
|
-
|
76
|
+
@events << { type: :set_longitude, value: BigDecimal(value) }
|
77
77
|
when 'ReferenceTime'
|
78
78
|
@reference_time = @time = Time.parse(value)
|
79
79
|
end
|
data/lib/tac_scribe/version.rb
CHANGED
data/tac_scribe.gemspec
CHANGED
@@ -4,6 +4,8 @@ lib = File.expand_path('lib', __dir__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
require 'tac_scribe/version'
|
6
6
|
|
7
|
+
puts "RUBY_PLATFORM = #{RUBY_PLATFORM}"
|
8
|
+
|
7
9
|
Gem::Specification.new do |spec|
|
8
10
|
spec.name = 'tac_scribe'
|
9
11
|
spec.version = TacScribe::VERSION
|
@@ -24,6 +26,8 @@ Gem::Specification.new do |spec|
|
|
24
26
|
|
25
27
|
spec.metadata['yard.run'] = 'yri'
|
26
28
|
|
29
|
+
spec.platform = RUBY_PLATFORM == 'java' ? 'java' : 'ruby'
|
30
|
+
|
27
31
|
if RUBY_PLATFORM == 'java'
|
28
32
|
spec.add_dependency 'activerecord-jdbcpostgresql-adapter'
|
29
33
|
else
|
@@ -36,6 +40,7 @@ Gem::Specification.new do |spec|
|
|
36
40
|
# of an API breaking change are higher then normal. Therefore lock the
|
37
41
|
# version
|
38
42
|
spec.add_dependency 'concurrent-ruby', '~>1.1.5'
|
43
|
+
spec.add_dependency 'haversine', '~>0.3'
|
39
44
|
spec.add_dependency 'sequel-postgis-georuby', '0.1.2'
|
40
45
|
spec.add_dependency 'tacview_client', '~>0.1'
|
41
46
|
|
@@ -45,4 +50,5 @@ Gem::Specification.new do |spec|
|
|
45
50
|
spec.add_development_dependency 'rubocop', '~>0.73'
|
46
51
|
spec.add_development_dependency 'simplecov', '~>0.17'
|
47
52
|
spec.add_development_dependency 'yard', '~>0.9'
|
53
|
+
spec.add_development_dependency 'pry-byebug', '~>3.9'
|
48
54
|
end
|
metadata
CHANGED
@@ -1,183 +1,211 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tac_scribe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeffrey Jones
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
+
name: pg
|
14
15
|
requirement: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
|
-
- - "
|
17
|
+
- - "~>"
|
17
18
|
- !ruby/object:Gem::Version
|
18
|
-
version: '
|
19
|
-
name: activerecord-jdbcpostgresql-adapter
|
20
|
-
prerelease: false
|
19
|
+
version: '1.1'
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
+
name: georuby
|
28
29
|
requirement: !ruby/object:Gem::Requirement
|
29
30
|
requirements:
|
30
31
|
- - "~>"
|
31
32
|
- !ruby/object:Gem::Version
|
32
33
|
version: '2.5'
|
33
|
-
name: georuby
|
34
|
-
prerelease: false
|
35
34
|
type: :runtime
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '2.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
+
name: sequel
|
42
43
|
requirement: !ruby/object:Gem::Requirement
|
43
44
|
requirements:
|
44
45
|
- - "~>"
|
45
46
|
- !ruby/object:Gem::Version
|
46
47
|
version: '5.22'
|
47
|
-
name: sequel
|
48
|
-
prerelease: false
|
49
48
|
type: :runtime
|
49
|
+
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.22'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
+
name: concurrent-ruby
|
56
57
|
requirement: !ruby/object:Gem::Requirement
|
57
58
|
requirements:
|
58
59
|
- - "~>"
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: 1.1.5
|
61
|
-
name: concurrent-ruby
|
62
|
-
prerelease: false
|
63
62
|
type: :runtime
|
63
|
+
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.1.5
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
+
name: haversine
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.3'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.3'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: sequel-postgis-georuby
|
70
85
|
requirement: !ruby/object:Gem::Requirement
|
71
86
|
requirements:
|
72
87
|
- - '='
|
73
88
|
- !ruby/object:Gem::Version
|
74
89
|
version: 0.1.2
|
75
|
-
name: sequel-postgis-georuby
|
76
|
-
prerelease: false
|
77
90
|
type: :runtime
|
91
|
+
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
80
94
|
- - '='
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: 0.1.2
|
83
97
|
- !ruby/object:Gem::Dependency
|
98
|
+
name: tacview_client
|
84
99
|
requirement: !ruby/object:Gem::Requirement
|
85
100
|
requirements:
|
86
101
|
- - "~>"
|
87
102
|
- !ruby/object:Gem::Version
|
88
103
|
version: '0.1'
|
89
|
-
name: tacview_client
|
90
|
-
prerelease: false
|
91
104
|
type: :runtime
|
105
|
+
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0.1'
|
97
111
|
- !ruby/object:Gem::Dependency
|
112
|
+
name: bundler
|
98
113
|
requirement: !ruby/object:Gem::Requirement
|
99
114
|
requirements:
|
100
115
|
- - "~>"
|
101
116
|
- !ruby/object:Gem::Version
|
102
117
|
version: '2.0'
|
103
|
-
name: bundler
|
104
|
-
prerelease: false
|
105
118
|
type: :development
|
119
|
+
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
122
|
- - "~>"
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '2.0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
112
127
|
requirement: !ruby/object:Gem::Requirement
|
113
128
|
requirements:
|
114
129
|
- - "~>"
|
115
130
|
- !ruby/object:Gem::Version
|
116
131
|
version: '10.0'
|
117
|
-
name: rake
|
118
|
-
prerelease: false
|
119
132
|
type: :development
|
133
|
+
prerelease: false
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
121
135
|
requirements:
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '10.0'
|
125
139
|
- !ruby/object:Gem::Dependency
|
140
|
+
name: rspec
|
126
141
|
requirement: !ruby/object:Gem::Requirement
|
127
142
|
requirements:
|
128
143
|
- - "~>"
|
129
144
|
- !ruby/object:Gem::Version
|
130
145
|
version: '3.8'
|
131
|
-
name: rspec
|
132
|
-
prerelease: false
|
133
146
|
type: :development
|
147
|
+
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '3.8'
|
139
153
|
- !ruby/object:Gem::Dependency
|
154
|
+
name: rubocop
|
140
155
|
requirement: !ruby/object:Gem::Requirement
|
141
156
|
requirements:
|
142
157
|
- - "~>"
|
143
158
|
- !ruby/object:Gem::Version
|
144
159
|
version: '0.73'
|
145
|
-
name: rubocop
|
146
|
-
prerelease: false
|
147
160
|
type: :development
|
161
|
+
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '0.73'
|
153
167
|
- !ruby/object:Gem::Dependency
|
168
|
+
name: simplecov
|
154
169
|
requirement: !ruby/object:Gem::Requirement
|
155
170
|
requirements:
|
156
171
|
- - "~>"
|
157
172
|
- !ruby/object:Gem::Version
|
158
173
|
version: '0.17'
|
159
|
-
name: simplecov
|
160
|
-
prerelease: false
|
161
174
|
type: :development
|
175
|
+
prerelease: false
|
162
176
|
version_requirements: !ruby/object:Gem::Requirement
|
163
177
|
requirements:
|
164
178
|
- - "~>"
|
165
179
|
- !ruby/object:Gem::Version
|
166
180
|
version: '0.17'
|
167
181
|
- !ruby/object:Gem::Dependency
|
182
|
+
name: yard
|
168
183
|
requirement: !ruby/object:Gem::Requirement
|
169
184
|
requirements:
|
170
185
|
- - "~>"
|
171
186
|
- !ruby/object:Gem::Version
|
172
187
|
version: '0.9'
|
173
|
-
name: yard
|
174
|
-
prerelease: false
|
175
188
|
type: :development
|
189
|
+
prerelease: false
|
176
190
|
version_requirements: !ruby/object:Gem::Requirement
|
177
191
|
requirements:
|
178
192
|
- - "~>"
|
179
193
|
- !ruby/object:Gem::Version
|
180
194
|
version: '0.9'
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: pry-byebug
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - "~>"
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '3.9'
|
202
|
+
type: :development
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - "~>"
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '3.9'
|
181
209
|
description: Write Tacview data to PostGIS database
|
182
210
|
email:
|
183
211
|
- jeff@jones.be
|
@@ -219,7 +247,7 @@ licenses:
|
|
219
247
|
- AGPL-3.0-or-later
|
220
248
|
metadata:
|
221
249
|
yard.run: yri
|
222
|
-
post_install_message:
|
250
|
+
post_install_message:
|
223
251
|
rdoc_options: []
|
224
252
|
require_paths:
|
225
253
|
- lib
|
@@ -234,9 +262,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
262
|
- !ruby/object:Gem::Version
|
235
263
|
version: '0'
|
236
264
|
requirements: []
|
237
|
-
|
238
|
-
|
239
|
-
signing_key:
|
265
|
+
rubygems_version: 3.1.2
|
266
|
+
signing_key:
|
240
267
|
specification_version: 4
|
241
268
|
summary: Write Tacview data to PostGIS database
|
242
269
|
test_files: []
|