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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 485c9e87c957fd0e66db7cc762a36283baa2c4852546008b2d4dbd5e2372a53a
4
- data.tar.gz: 95576f042c7455ac1e5b87bcab21d6a5ff555d8f67a83b4c7cd2531b56f696c1
3
+ metadata.gz: '099cde73f8075ae6ce15559bb91931382992c4182f78656beab7846adb7a7ba4'
4
+ data.tar.gz: ffd9790d498398f6bb4777d50fecb2aeb426af5484d766be55c3f04aa18934cb
5
5
  SHA512:
6
- metadata.gz: 1aefe11c62a16ac70377bc48f262b699f2aebb4c38480bbe677b1490e5d14320c0e213d1976e0b4a477e1687e24b8bccae1b9a7f111bdaaeca1c0ebba63f9d62
7
- data.tar.gz: 2d54201ba482399aafd29a4633b3b7361220457e85e8aae0447be8920191fc708e3582617affe5176d6bacd6682688c73e315772e094a71ada60af1101b6a2f5
6
+ metadata.gz: 74ff0905ea7250214c73287bd17b85d82002c3bcaa74c13618a7887a20298ba0b4e0f2b54476a4cc36f0f2d579dced61c63b345e4fbe4892de91ac235343c16d
7
+ data.tar.gz: 607fb4c5f77035783ec06fe0382aad023d45e26c3b08dc163a2293e957a3937c298107dd80613dc74b5e21d04283fa557bdbcfddee4fd9bf179c068a844d8a5f
@@ -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/start_scribe
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
@@ -1 +1 @@
1
- ruby-2.6.3
1
+ ruby-2.7.0
@@ -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
- ## [Unreleased]
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
@@ -12,6 +12,7 @@ Sequel.migration do
12
12
  String :group, null: true
13
13
  Integer :coalition
14
14
  Integer :heading
15
+ Integer :speed
15
16
  Time :updated_at
16
17
  Boolean :deleted
17
18
  # TODO: GIST Index on the position
@@ -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-username=username',
55
+ opts.on('-u', '--db-user=username',
56
56
  'Postgresql username (Required)') do |v|
57
57
  options[:db_user] = v
58
58
  end
@@ -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 'Allies'
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].y
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].x
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
- return cache_object[:heading] if cache_object[:position] == object[:position]
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
@@ -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
- kill_threads
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
- @threads.each do |thr|
76
- thr.kill
77
- thr.join
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 << event_processor_thread
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 << db_write_thread
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 << reporting_thread
142
+ @threads[:reporting] = reporting_thread
127
143
  end
128
144
 
129
145
  def populate_airfields
130
- json = File.read(File.join(File.dirname(__FILE__), '../../data/airfields.json'))
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: 2
157
+ coalition: 0 # Neutral
141
158
  )
142
159
  end
143
160
  end
@@ -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.get_event
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, _time)
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
- self.events_processed += 1
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 get_event
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
- Cache.instance.reference_latitude = BigDecimal(value)
74
+ @events << { type: :set_latitude, value: BigDecimal(value) }
75
75
  when 'ReferenceLongitude'
76
- Cache.instance.reference_longitude = BigDecimal(value)
76
+ @events << { type: :set_longitude, value: BigDecimal(value) }
77
77
  when 'ReferenceTime'
78
78
  @reference_time = @time = Time.parse(value)
79
79
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TacScribe
4
- VERSION = '0.5.0'
4
+ VERSION = '0.7.1'
5
5
  end
@@ -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.5.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-03-17 00:00:00.000000000 Z
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: '0'
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: '0'
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
- rubyforge_project:
238
- rubygems_version: 2.7.6
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: []