ogn_client-ruby 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02438399c35649b6367b7c29b764915182edc72b
4
- data.tar.gz: c1d8d0cccae554f55cb74b9944dbcfe91a6a1ea0
3
+ metadata.gz: 4a6d60e5f26f6b6c18c2e1f6e4aba695901e5473
4
+ data.tar.gz: 75e00d14055934f85c66acdd1c7046173425aeba
5
5
  SHA512:
6
- metadata.gz: 102a7568799ecdbacb814fc7f5ab956a780ef237748f47e4bf4fcca6eedcf1bc11ea299b204a8a4d69da93e66d3f3e9ef4af0f6d55cb1937ca515e38ddc5e458
7
- data.tar.gz: d9b989f3a32cc8b8c3316afa9a4d48391dee7de676326214a759eb76927f40c856e2008e792449a5df790c19cc605f6909a939631f450af22e404b7f0d3fb7fb
6
+ metadata.gz: 1c1e7c3788ab24ead12e31e5cc67bd0a3a9b12cfef99885dd16cef31d5a780faf1e7f860f7d2efdbf958085904bd36d0ee7031493e15ae89624fce0cf321b8f7
7
+ data.tar.gz: fb2171f7a02881b8a12c160271172c9bb515e35b7498320ffa9f5ae624cd7baf31dbc0ff51d2f9ae96c2c13d0d88721a93cbf7e0669e1288ad8b8229241dd564
@@ -1 +1 @@
1
- ruby-2.2.3
1
+ ruby-2.3.0
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  language: ruby
3
3
  rvm:
4
- - 2.2.3
5
- - 2.1.7
6
- before_install: gem install bundler -v 1.10.6
4
+ - 2.3.1
5
+ - 2.2.5
6
+ - 2.1.10
7
+ before_install: gem install bundler -v 1.13.2
@@ -1,5 +1,27 @@
1
+ ## 0.1.2
2
+
3
+ * support for receiver versions <= 0.2.5
4
+ * faster message parsing
5
+ * new sender and receiver attributes
6
+ * `Sender#power`
7
+ * `Receiver#voltage`
8
+ * `Receiver#amperage`
9
+ * `Receiver#senders`
10
+ * `Receiver#senders_visible`
11
+ * `Receiver#senders_invisible`
12
+ * `Receiver#voltage`
13
+ * `Receiver#senders_signal`
14
+ * `Receiver#senders_messages`
15
+ * `Receiver#good_and_bad_senders`
16
+ * `Receiver#good_senders`
17
+ * `Receiver#bad_senders`
18
+ * renamed receiver attributes
19
+ * `Receiver#manual_correction` -> `Receiver#rf_correction_manual`
20
+ * `Receiver#automatic_correction` -> `Receiver#rf_correction_automatic`
21
+
1
22
  ## 0.1.1
2
23
 
24
+ * supported receiver versions <= 0.2.4
3
25
  * remove debug support and raise errors instead
4
26
  * convert raw messages to UTF-8 before parsing
5
27
  * new sender and receiver attributes
@@ -12,7 +34,6 @@
12
34
  * renamed message attribute
13
35
  * `Message#speed` -> `Message#ground_speed`
14
36
  * verification of supported receiver version
15
- * supported receiver versions <= 0.2.5
16
37
 
17
38
  ## 0.1.0
18
39
 
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
  [![Continuous Integration](https://img.shields.io/travis/svoop/ogn_client-ruby/master.svg?style=flat)](https://travis-ci.org/svoop/ogn_client-ruby)
3
3
  [![Code Climate](https://img.shields.io/codeclimate/github/svoop/ogn_client-ruby.svg?style=flat)](https://codeclimate.com/github/svoop/ogn_client-ruby)
4
4
  [![Gitter](https://img.shields.io/gitter/room/svoop/ogn_client-ruby.svg?style=flat)](https://gitter.im/svoop/ogn_client-ruby)
5
+ [![Donorbox](https://img.shields.io/badge/donate-on donorbox-yellow.svg)](https://donorbox.org/bitcetera-ogn_client-ruby)
5
6
 
6
7
  # ogn_client-ruby
7
8
 
@@ -10,7 +11,7 @@
10
11
  * Author: [Sven Schwyn](http://bitcetera.com)
11
12
  * Homepage: https://github.com/svoop/ogn_client-ruby
12
13
 
13
- :loudspeaker: A word from the shameless commerce division: Looking for a freelance Ruby developer? Contact Sven on http://bitcetera.com
14
+ :loudspeaker: A word from the shameless commerce division: Looking for a freelance Ruby developer? Surf to http://bitcetera.com and contact Sven. Or [show your support with a donation](https://donorbox.org/bitcetera-ogn_client-ruby). Yes, we do sponsored features, too.
14
15
 
15
16
  ## Installation
16
17
 
@@ -69,14 +70,15 @@ Attributes:
69
70
  * **altitude** - WGS84 meters above mean see level QNH
70
71
  * **heading** - degrees from 1 to 360
71
72
  * **ground_speed** - kilometers per hour
72
- * **stealth_mode** - boolean (should always be false)
73
- * **no_tracking** - boolean
74
73
  * **sender_type** - see [SENDER_TYPES](https://github.com/svoop/ogn_client-ruby/blob/master/lib/ogn_client/messages/sender.rb)
75
74
  * **address_type** - see [ADDRESS_TYPES](https://github.com/svoop/ogn_client-ruby/blob/master/lib/ogn_client/messages/sender.rb)
76
75
  * **id** - device ID
76
+ * **stealth_mode** - boolean (should always be false)
77
+ * **no_tracking** - boolean
78
+ * **flight_level** - 100 feet QNE
77
79
  * **climb_rate** - meters per second
78
80
  * **turn_rate** - revolutions per minute
79
- * **flight_level** - 100 feet QNE
81
+ * **power** - power ratio in dBm
80
82
  * **signal** - signal to noise ratio in decibel
81
83
  * **errors** - number of CRC errors
82
84
  * **frequency_offset** - kilohertz
@@ -107,7 +109,20 @@ Attributes:
107
109
  * **ram_total** - megabytes
108
110
  * **ntp_offset** - milliseconds
109
111
  * **ntp_correction** - parts-per-million
112
+ * **voltage** - board voltage in V
113
+ * **amperage** - board amperage in A
114
+ * **rf_correction_manual** - manual frequency correction as per configuration
115
+ * **rf_correction_automatic** - automatic frequency correction based on GSM
116
+ * **senders** - number of senders received within the last hour
117
+ * **visible_senders** - number of visible senders withint the last hour
118
+ * **invisible_senders** - number of invisible senders ("no-track" on device or "invisible" in database)
110
119
  * **signal** - signal-to-noise ratio in decibel
120
+ * **senders_signal** - average signal-to-noise ratio across all senders
121
+ * **senders_messages** - number of messages analyzed to calculate the above
122
+ * **good_senders_signal** - average signal-to-noise ratio in decibel of good senders (transmitting properly) within the last 24 hours
123
+ * **good_and_bad_senders** - number of good and bad senders within the last 24 hours
124
+ * **good_senders** - number of good senders (transmitting properly) within the last 24 hours
125
+ * **bad_senders** - number of bad senders (not transmitting properly) within the last 24 hours
111
126
 
112
127
  #### OGNClient::Comment
113
128
 
@@ -126,15 +141,21 @@ The following domain specific errors may be raised:
126
141
  They all inherit from `OGNClient::Error`. An fault-tolerant subscription could therefore look as follows:
127
142
 
128
143
  ```ruby
144
+ require 'ogn_client'
145
+
129
146
  logger = Logger.new('/tmp/ogn_client.log')
130
- OGNClient::APRS.start(callsign: 'ROCT', filter: 'r/33/-97/200') do |aprs|
131
- loop do
132
- begin
133
- message = OGNClient::Message.parse aprs.gets
134
- rescue OGNClient::Error => error
135
- logger.error error.message
147
+ options = { callsign: 'ROCT', filter: 'r/47/2/500' }
148
+ loop do
149
+ OGNClient::APRS.start(options) do |aprs|
150
+ while raw = aprs.gets
151
+ begin
152
+ message = OGNClient::Message.parse aprs.gets
153
+ rescue OGNClient::Error => error
154
+ logger.error error.message
155
+ next
156
+ end
157
+ puts message.raw # do more interesting stuff here
136
158
  end
137
- puts message.raw
138
159
  end
139
160
  end
140
161
  ```
@@ -143,7 +164,9 @@ end
143
164
 
144
165
  * Look for developers and users on [Gitter](https://gitter.im/svoop/ogn_client-ruby).
145
166
  * Ask your questions on [Stackoverflow](https://stackoverflow.com/questions/ask?tags=ogn_client-ruby,ruby,gem).
146
- * Bug reports and pull requests are welcome on [GitHub](https://github.com/svoop/ogn_client-ruby).
167
+ * Annotated source code on [omniref](https://www.omniref.com/repositories/svoop/ogn_client-ruby)
168
+ * Bug reports, feature and pull requests are welcome on [GitHub](https://github.com/svoop/ogn_client-ruby).
169
+ * [Donations with Stripe or PayPal](https://donorbox.org/bitcetera-ogn_client-ruby) are welcome as well. If you prefer to sponsor a feature, please create an issue on [GitHub](https://github.com/svoop/ogn_client-ruby) first and state your intentions.
147
170
 
148
171
  ## Development
149
172
 
@@ -32,6 +32,7 @@ module OGNClient
32
32
  def start
33
33
  @socket = TCPSocket.open SERVER, @port
34
34
  @socket.puts handshake
35
+ @socket.flush
35
36
  if block_given?
36
37
  begin
37
38
  return yield(@socket)
@@ -22,13 +22,12 @@ module OGNClient
22
22
  class Message
23
23
 
24
24
  POSITION_PATTERN = %r(^
25
- (?<callsign>\w+?)>APRS,.+?,
26
- (?<receiver>\w+):/
25
+ (?<callsign>.+?)>APRS,(?:.+?,){1,2}
26
+ (?<receiver>.+?):[/>]
27
27
  (?<time>\d{6})h
28
- (?<latitude>\d{4}\.\d{2}[NS]).
29
- (?<longitude>\d{5}\.\d{2}[EW]).
30
- (?:(?<heading>\d{3})/(?<ground_speed>\d{3}))?.*?
31
- /A=(?<altitude>\d{6})\s
28
+ (?:(?<latitude>\d{4}\.\d{2}[NS]).(?<longitude>\d{5}\.\d{2}[EW]).)?
29
+ (?:(?<heading>\d{3})/(?<ground_speed>\d{3}))?
30
+ (?:/A=(?<altitude>\d{6}))?\s+
32
31
  (?:!W((?<latitude_enhancement>\d)(?<longitude_enhancement>\d))!)?
33
32
  )x
34
33
 
@@ -47,7 +46,8 @@ module OGNClient
47
46
  raw = raw.chomp.force_encoding('ASCII-8BIT').encode('UTF-8')
48
47
  OGNClient::Sender.new.send(:parse, raw) ||
49
48
  OGNClient::Receiver.new.send(:parse, raw) ||
50
- OGNClient::Comment.new.send(:parse, raw)
49
+ OGNClient::Comment.new.send(:parse, raw) ||
50
+ fail(OGNClient::MessageError, "message payload parsing failed: `#{raw}'")
51
51
  end
52
52
 
53
53
  def to_s
@@ -58,16 +58,16 @@ module OGNClient
58
58
 
59
59
  def parse(raw)
60
60
  @raw = raw
61
- @raw.match(POSITION_PATTERN) do |match|
61
+ raw.match POSITION_PATTERN do |match|
62
62
  %i(callsign receiver time altitude).each do |attr|
63
- send "#{attr}=", match[attr]
63
+ send("#{attr}=", match[attr]) if match[attr]
64
64
  end
65
65
  self.heading = match[:heading] if match[:heading] && match[:heading] != '000'
66
66
  self.ground_speed = match[:ground_speed] if match[:ground_speed] && match[:heading] != '000'
67
- self.longitude = [match[:longitude], match[:longitude_enhancement]]
68
- self.latitude = [match[:latitude], match[:latitude_enhancement]]
67
+ self.longitude = [match[:longitude], match[:longitude_enhancement]] if match[:longitude]
68
+ self.latitude = [match[:latitude], match[:latitude_enhancement]] if match[:latitude]
69
69
  self
70
- end || fail(OGNClient::MessageError, "message parsing failed: `#{@raw}'")
70
+ end or fail(OGNClient::MessageError, "message position parsing failed: `#{@raw}'")
71
71
  self
72
72
  end
73
73
 
@@ -11,7 +11,7 @@ module OGNClient
11
11
  private
12
12
 
13
13
  def parse(raw)
14
- @raw = raw
14
+ @raw ||= raw
15
15
  @raw.match COMMENT_PATTERN do |match|
16
16
  self.comment = match[:comment]
17
17
  self
@@ -9,38 +9,63 @@ module OGNClient
9
9
  \s)?
10
10
  CPU:(?<cpu_load>[\d.]+)\s
11
11
  RAM:(?<ram_free>[\d.]+)/(?<ram_total>[\d.]+)MB\s
12
- NTP:(?<ntp_offset>[\d.]+)ms/(?<ntp_correction>[+-][\d.]+)ppm\s?
12
+ NTP:(?<ntp_offset>[\d.]+)ms/(?<ntp_correction>[+-][\d.]+)ppm\s
13
+ (?:(?<voltage>[\d.]+)V\s)?
14
+ (?:(?<amperage>[\d.]+)A\s)?
13
15
  (?:(?<cpu_temperature>[+-][\d.]+)C\s*)?
16
+ (?:(?<visible_senders>\d+)/(?<senders>\d+)Acfts\[1h\]\s*)?
14
17
  (?:RF:
15
18
  (?:
16
- (?<manual_correction>[+-][\d]+)
17
- (?<automatic_correction>[+-][\d.]+)ppm/
19
+ (?<rf_correction_manual>[+-][\d]+)
20
+ (?<rf_correction_automatic>[+-][\d.]+)ppm/
18
21
  )?
19
22
  (?<signal>[+-][\d.]+)dB
23
+ (?:/(?<senders_signal>[+-][\d.]+)dB@10km\[(?<senders_messages>\d+)\])?
24
+ (?:/(?<good_senders_signal>[+-][\d.]+)dB@10km\[(?<good_senders>\d+)/(?<good_and_bad_senders>\d+)\])?
20
25
  )?
21
26
  $)x
22
27
 
23
28
  SUPPORTED_RECEIVER_VERSION = Gem::Version.new('0.2.5')
24
29
 
25
- attr_reader :version # software version as #<Gem::Version "major.minor.patch">
26
- attr_reader :platform # e.g. "ARM"
27
- attr_reader :cpu_load # as reported by "uptime"
28
- attr_reader :cpu_temperature # degrees celsius
29
- attr_reader :ram_free # megabytes
30
- attr_reader :ram_total # megabytes
31
- attr_reader :ntp_offset # milliseconds
32
- attr_reader :ntp_correction # parts-per-million
33
- attr_reader :manual_correction # as per configuration
34
- attr_reader :automatic_correction # based on GSM
35
- attr_reader :signal # signal-to-noise ratio in decibel
30
+ attr_reader :version # software version as #<Gem::Version "major.minor.patch">
31
+ attr_reader :platform # e.g. "ARM"
32
+ attr_reader :cpu_load # as reported by "uptime"
33
+ attr_reader :cpu_temperature # degrees celsius
34
+ attr_reader :ram_free # megabytes
35
+ attr_reader :ram_total # megabytes
36
+ attr_reader :ntp_offset # milliseconds
37
+ attr_reader :ntp_correction # parts-per-million
38
+ attr_reader :voltage # board voltage in V
39
+ attr_reader :amperage # board amperage in A
40
+ attr_reader :rf_correction_manual # as per configuration
41
+ attr_reader :rf_correction_automatic # based on GSM
42
+ attr_reader :senders # number of senders within the last hour
43
+ attr_reader :visible_senders # number of visible senders within the last hour
44
+ attr_reader :signal # signal-to-noise ratio in decibel
45
+ attr_reader :senders_signal # average signal-to-noise ratio in decibel across all senders
46
+ attr_reader :senders_messages # number of messages analyzed to calculate the above
47
+ attr_reader :good_senders_signal # average signal-to-noise ratio in decibel of good senders (transmitting properly) within the last 24 hours
48
+ attr_reader :good_and_bad_senders # number of good and bad senders within the last 24 hours
49
+ attr_reader :good_senders # number of good senders (transmitting properly) within the last 24 hours
50
+
51
+ def invisible_senders
52
+ senders - visible_senders
53
+ rescue
54
+ nil
55
+ end
56
+
57
+ def bad_senders
58
+ good_and_bad_senders - good_senders
59
+ rescue
60
+ nil
61
+ end
36
62
 
37
63
  private
38
64
 
39
65
  def parse(raw)
40
- @raw = raw
41
- @raw.match RECEIVER_PATTERN do |match|
42
- return unless super
43
- %i(version platform cpu_load cpu_temperature ram_free ram_total ntp_offset ntp_correction manual_correction automatic_correction signal).each do |attr|
66
+ raw.match RECEIVER_PATTERN do |match|
67
+ super unless @raw
68
+ %i(version platform cpu_load cpu_temperature ram_free ram_total ntp_offset ntp_correction voltage amperage rf_correction_manual rf_correction_automatic senders visible_senders signal senders_signal senders_messages good_senders_signal good_and_bad_senders good_senders).each do |attr|
44
69
  send("#{attr}=", match[attr]) if match[attr]
45
70
  end
46
71
  self
@@ -81,18 +106,54 @@ module OGNClient
81
106
  @ntp_correction = raw.to_f.round(2)
82
107
  end
83
108
 
84
- def manual_correction=(raw)
85
- @manual_correction = raw.to_i
109
+ def voltage=(raw)
110
+ @voltage = raw.to_f.round(3)
111
+ end
112
+
113
+ def amperage=(raw)
114
+ @amperage = raw.to_f.round(3)
115
+ end
116
+
117
+ def rf_correction_manual=(raw)
118
+ @rf_correction_manual = raw.to_i
119
+ end
120
+
121
+ def rf_correction_automatic=(raw)
122
+ @rf_correction_automatic = raw.to_f.round(1)
123
+ end
124
+
125
+ def senders=(raw)
126
+ @senders = raw.to_i
86
127
  end
87
128
 
88
- def automatic_correction=(raw)
89
- @automatic_correction = raw.to_f.round(1)
129
+ def visible_senders=(raw)
130
+ @visible_senders = raw.to_i
90
131
  end
91
132
 
92
133
  def signal=(raw)
93
134
  @signal = raw.to_f.round(3)
94
135
  end
95
136
 
137
+ def senders_signal=(raw)
138
+ @senders_signal = raw.to_f.round(3)
139
+ end
140
+
141
+ def senders_messages=(raw)
142
+ @senders_messages = raw.to_i
143
+ end
144
+
145
+ def good_senders_signal=(raw)
146
+ @good_senders_signal = raw.to_f.round(3)
147
+ end
148
+
149
+ def good_and_bad_senders=(raw)
150
+ @good_and_bad_senders = raw.to_i
151
+ end
152
+
153
+ def good_senders=(raw)
154
+ @good_senders = raw.to_i
155
+ end
156
+
96
157
  end
97
158
 
98
159
  end
@@ -14,6 +14,7 @@ module OGNClient
14
14
  (?:s(?<flarm_software_version>[\d.]+)\s?)?
15
15
  (?:h(?<flarm_hardware_version>[\dA-F]{2})\s?)?
16
16
  (?:r(?<flarm_id>[\dA-F]+)\s?)?
17
+ (?:(?<power>[+-][\d.]+)dBm\s?)?
17
18
  (?:hear(?<proximity>.+))?
18
19
  $)x
19
20
 
@@ -41,14 +42,15 @@ module OGNClient
41
42
  3 => :ogn
42
43
  }
43
44
 
44
- attr_reader :stealth_mode # boolean
45
- attr_reader :no_tracking # boolean
46
45
  attr_reader :sender_type # see SENDER_TYPES
47
46
  attr_reader :address_type # see ADDRESS_TYPES
48
47
  attr_reader :id # device ID
48
+ attr_reader :stealth_mode # boolean
49
+ attr_reader :no_tracking # boolean
50
+ attr_reader :flight_level # 100 feet QNE
49
51
  attr_reader :climb_rate # meters per second
50
52
  attr_reader :turn_rate # revolutions per minute
51
- attr_reader :flight_level # 100 feet QNE
53
+ attr_reader :power # power ratio in dBm
52
54
  attr_reader :signal # signal to noise ratio in decibel
53
55
  attr_reader :errors # number of CRC errors
54
56
  attr_reader :frequency_offset # kilohertz
@@ -61,10 +63,9 @@ module OGNClient
61
63
  private
62
64
 
63
65
  def parse(raw)
64
- @raw = raw
65
- @raw.match SENDER_PATTERN do |match|
66
- return unless super
67
- %i(details id climb_rate turn_rate flight_level signal errors frequency_offset gps_accuracy flarm_software_version flarm_hardware_version flarm_id proximity).each do |attr|
66
+ raw.match SENDER_PATTERN do |match|
67
+ super unless @raw
68
+ %i(details id flight_level climb_rate turn_rate power signal errors frequency_offset gps_accuracy flarm_software_version flarm_hardware_version flarm_id proximity).each do |attr|
68
69
  send("#{attr}=", match[attr]) if match[attr]
69
70
  end
70
71
  # NOTE: [@svoop] [ruby21] workaround necessary until support for ruby21 is removed
@@ -86,6 +87,10 @@ module OGNClient
86
87
  @id = raw
87
88
  end
88
89
 
90
+ def flight_level=(raw)
91
+ @flight_level = raw.to_f.round(2)
92
+ end
93
+
89
94
  def climb_rate=(raw)
90
95
  @climb_rate = (raw.to_i / 60.0 / 3.2808).round(1)
91
96
  end
@@ -94,8 +99,8 @@ module OGNClient
94
99
  @turn_rate = (raw.to_i / 4.0).round(1)
95
100
  end
96
101
 
97
- def flight_level=(raw)
98
- @flight_level = raw.to_f.round(2)
102
+ def power=(raw)
103
+ @power = raw.to_f.round(3)
99
104
  end
100
105
 
101
106
  def signal=(raw)
@@ -1,3 +1,3 @@
1
1
  module OGNClient
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "0.1.2".freeze
3
3
  end
@@ -1,18 +1,29 @@
1
+ require 'ogn_client'
1
2
 
2
3
  namespace :test do
3
4
 
5
+ desc "Receive and dump real-time APRS messages"
6
+ task :receiver do
7
+ OGNClient::APRS.start(callsign: "ROCT-#{rand(100)}") do |aprs|
8
+ loop do
9
+ print aprs.gets
10
+ end
11
+ end
12
+ end
13
+
4
14
  desc "Parse real-time APRS messages and test the parser"
5
15
  task :parser do
6
- require 'ogn_client'
7
- OGNClient::APRS.start(callsign: 'ROCT') do |aprs|
8
- loop do
9
- print '.'
10
- raw = aprs.gets
11
- begin
12
- OGNClient::Message.parse raw
13
- rescue OGNClient::Error => error
14
- puts
15
- warn "WARNING: #{error.message}"
16
+ callsign = "ROCT-#{rand(100)}"
17
+ loop do
18
+ OGNClient::APRS.start(callsign: callsign) do |aprs|
19
+ while raw = aprs.gets do
20
+ print '.'
21
+ begin
22
+ OGNClient::Message.parse raw
23
+ rescue OGNClient::Error => error
24
+ puts
25
+ warn "WARNING: #{error.message}"
26
+ end
16
27
  end
17
28
  end
18
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ogn_client-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sven Schwyn
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-12-07 00:00:00.000000000 Z
11
+ date: 2016-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -146,9 +146,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  version: '0'
147
147
  requirements: []
148
148
  rubyforge_project:
149
- rubygems_version: 2.4.5.1
149
+ rubygems_version: 2.5.1
150
150
  signing_key:
151
151
  specification_version: 4
152
152
  summary: Subscriber and parser for APRS messages from OGN
153
153
  test_files: []
154
- has_rdoc: