simple-trail 0.2.6 → 0.3.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/lib/simple_trail/parser/base.rb +26 -0
- data/lib/simple_trail/parser/extract_points.rb +18 -0
- data/lib/simple_trail/parser/gpx.rb +1 -21
- data/lib/simple_trail/parser/gpx_string.rb +21 -0
- data/lib/simple_trail/parser/validate_gpx.rb +16 -0
- data/lib/simple_trail/parser/validate_gpx_string.rb +15 -0
- data/lib/simple_trail.rb +5 -0
- data/simple-trail.gemspec +2 -1
- data/spec/examples/not_a_gpx.gpx +121 -0
- data/spec/parser/gpx_string_spec.rb +37 -0
- data/spec/parser/validate_gpx_spec.rb +15 -0
- data/spec/parser/validate_gpx_string_spec.rb +15 -0
- metadata +15 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80b11153dae6617beaa321a66212e18b3d2f10aa986cbaccc07904faa15be4dd
|
4
|
+
data.tar.gz: a40a3b05bb2538c74f53185b5f2f5addc6932f14708e92d256be68ce26f21f7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 138f814cd98017dcd61aef761afc5c4a6ea1c21f426052ca56ed987928ce028e0d6da82e2aa13c2cdc03d41f93b9685fbfb0aa1dafc828b23357a758c8167bd0
|
7
|
+
data.tar.gz: c81fb032d0e916da5624407741055741e50bc955d146b69599ac7a5270787bb41f02c4b7642d966a4e6c1fde8a56defb6134283593b9dedfdfee7410df61e72e
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Parser
|
3
|
+
class Base
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def extract_points
|
8
|
+
points_reader = ExtractPoints.new(@parsed_file)
|
9
|
+
points_reader.read_points
|
10
|
+
@points = points_reader.points
|
11
|
+
@simplified_points = points_reader.simplified_points
|
12
|
+
end
|
13
|
+
|
14
|
+
def extract_pois
|
15
|
+
@points_of_interests = @parsed_file[:wpt]
|
16
|
+
end
|
17
|
+
|
18
|
+
def extract_data
|
19
|
+
metadata = @parsed_file[:metadata]
|
20
|
+
{
|
21
|
+
name: metadata[:name],
|
22
|
+
author: metadata[:author][:name]
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
class ExtractPoints
|
5
|
+
attr_reader :simplified_points, :points
|
6
|
+
|
7
|
+
def initialize(parsed_file)
|
8
|
+
@parsed_file = parsed_file
|
9
|
+
end
|
10
|
+
|
11
|
+
def read_points
|
12
|
+
segments = @parsed_file.dig(:trk, :trkseg)
|
13
|
+
@points = segments.is_a?(Array) ? segments.map { |seg| seg[:trkpt] }.flatten : segments[:trkpt]
|
14
|
+
@simplified_points = @points.map { |point| point.select { |key, _| [:lon, :lat].include? key } }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Parser
|
4
|
-
class Gpx
|
4
|
+
class Gpx < Base
|
5
5
|
attr_reader :simplified_points, :points, :points_of_interests, :parsed_file
|
6
6
|
|
7
7
|
def initialize(filename)
|
@@ -19,25 +19,5 @@ module Parser
|
|
19
19
|
def meta
|
20
20
|
@meta ||= extract_data
|
21
21
|
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def extract_points
|
26
|
-
segments = @parsed_file.dig(:trk, :trkseg)
|
27
|
-
@points = segments.is_a?(Array) ? segments.map { |seg| seg[:trkpt] }.flatten : segments[:trkpt]
|
28
|
-
@simplified_points = @points.map { |point| point.select { |key, _| [:lon, :lat].include? key } }
|
29
|
-
end
|
30
|
-
|
31
|
-
def extract_pois
|
32
|
-
@points_of_interests = @parsed_file[:wpt]
|
33
|
-
end
|
34
|
-
|
35
|
-
def extract_data
|
36
|
-
metadata = @parsed_file[:metadata]
|
37
|
-
{
|
38
|
-
name: metadata[:name],
|
39
|
-
author: metadata[:author][:name]
|
40
|
-
}
|
41
|
-
end
|
42
22
|
end
|
43
23
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Parser
|
3
|
+
class GpxString < Base
|
4
|
+
attr_reader :simplified_points, :points, :points_of_interests, :parsed_file
|
5
|
+
|
6
|
+
def initialize(file_content)
|
7
|
+
@file_content = file_content
|
8
|
+
end
|
9
|
+
|
10
|
+
def read
|
11
|
+
@parsed_file = XmlHasher.parse(@file_content)[:gpx]
|
12
|
+
fail unless @parsed_file
|
13
|
+
extract_points
|
14
|
+
extract_pois
|
15
|
+
end
|
16
|
+
|
17
|
+
def meta
|
18
|
+
@meta ||= extract_data
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
class ValidateGpx < Base
|
5
|
+
def initialize(filename)
|
6
|
+
@filename = filename
|
7
|
+
end
|
8
|
+
|
9
|
+
def validate_basics?
|
10
|
+
file = File.new(@filename)
|
11
|
+
@parsed_file = XmlHasher.parse(file)[:gpx]
|
12
|
+
|
13
|
+
!@parsed_file.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Parser
|
4
|
+
class ValidateGpxString < Base
|
5
|
+
def initialize(file_content)
|
6
|
+
@file_content = file_content
|
7
|
+
end
|
8
|
+
|
9
|
+
def validate_basics?
|
10
|
+
@parsed_file = XmlHasher.parse(@file_content)[:gpx]
|
11
|
+
|
12
|
+
!@parsed_file.nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/simple_trail.rb
CHANGED
@@ -3,7 +3,12 @@
|
|
3
3
|
require 'geokit'
|
4
4
|
require 'xmlhasher'
|
5
5
|
|
6
|
+
require File.expand_path('simple_trail/parser/base', __dir__)
|
6
7
|
require File.expand_path('simple_trail/parser/gpx', __dir__)
|
8
|
+
require File.expand_path('simple_trail/parser/gpx_string', __dir__)
|
9
|
+
require File.expand_path('simple_trail/parser/extract_points', __dir__)
|
10
|
+
require File.expand_path('simple_trail/parser/validate_gpx', __dir__)
|
11
|
+
require File.expand_path('simple_trail/parser/validate_gpx_string', __dir__)
|
7
12
|
require File.expand_path('simple_trail/manipulation/statistics', __dir__)
|
8
13
|
require File.expand_path('simple_trail/manipulation/straightener', __dir__)
|
9
14
|
require File.expand_path('simple_trail/manipulation/unifier', __dir__)
|
data/simple-trail.gemspec
CHANGED
@@ -5,12 +5,13 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'simple-trail'
|
8
|
-
s.version = '0.
|
8
|
+
s.version = '0.3.1'
|
9
9
|
s.date = '2020-08-03'
|
10
10
|
s.summary = 'Readind and manipulating GPX and other trail representation file'
|
11
11
|
s.description = 'Optimazing and manipulating GPX file data. For my private purposes mostly'
|
12
12
|
s.authors = ['Staszek Zawadzki']
|
13
13
|
s.email = 'st.zawadzki@gmail.com'
|
14
|
+
s.homepage = 'https://github.com/PadawanBreslau/simple-trail'
|
14
15
|
|
15
16
|
s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
16
17
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
@@ -0,0 +1,121 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<catalog>
|
3
|
+
<book id="bk101">
|
4
|
+
<author>Gambardella, Matthew</author>
|
5
|
+
<title>XML Developer's Guide</title>
|
6
|
+
<genre>Computer</genre>
|
7
|
+
<price>44.95</price>
|
8
|
+
<publish_date>2000-10-01</publish_date>
|
9
|
+
<description>An in-depth look at creating applications
|
10
|
+
with XML.</description>
|
11
|
+
</book>
|
12
|
+
<book id="bk102">
|
13
|
+
<author>Ralls, Kim</author>
|
14
|
+
<title>Midnight Rain</title>
|
15
|
+
<genre>Fantasy</genre>
|
16
|
+
<price>5.95</price>
|
17
|
+
<publish_date>2000-12-16</publish_date>
|
18
|
+
<description>A former architect battles corporate zombies,
|
19
|
+
an evil sorceress, and her own childhood to become queen
|
20
|
+
of the world.</description>
|
21
|
+
</book>
|
22
|
+
<book id="bk103">
|
23
|
+
<author>Corets, Eva</author>
|
24
|
+
<title>Maeve Ascendant</title>
|
25
|
+
<genre>Fantasy</genre>
|
26
|
+
<price>5.95</price>
|
27
|
+
<publish_date>2000-11-17</publish_date>
|
28
|
+
<description>After the collapse of a nanotechnology
|
29
|
+
society in England, the young survivors lay the
|
30
|
+
foundation for a new society.</description>
|
31
|
+
</book>
|
32
|
+
<book id="bk104">
|
33
|
+
<author>Corets, Eva</author>
|
34
|
+
<title>Oberon's Legacy</title>
|
35
|
+
<genre>Fantasy</genre>
|
36
|
+
<price>5.95</price>
|
37
|
+
<publish_date>2001-03-10</publish_date>
|
38
|
+
<description>In post-apocalypse England, the mysterious
|
39
|
+
agent known only as Oberon helps to create a new life
|
40
|
+
for the inhabitants of London. Sequel to Maeve
|
41
|
+
Ascendant.</description>
|
42
|
+
</book>
|
43
|
+
<book id="bk105">
|
44
|
+
<author>Corets, Eva</author>
|
45
|
+
<title>The Sundered Grail</title>
|
46
|
+
<genre>Fantasy</genre>
|
47
|
+
<price>5.95</price>
|
48
|
+
<publish_date>2001-09-10</publish_date>
|
49
|
+
<description>The two daughters of Maeve, half-sisters,
|
50
|
+
battle one another for control of England. Sequel to
|
51
|
+
Oberon's Legacy.</description>
|
52
|
+
</book>
|
53
|
+
<book id="bk106">
|
54
|
+
<author>Randall, Cynthia</author>
|
55
|
+
<title>Lover Birds</title>
|
56
|
+
<genre>Romance</genre>
|
57
|
+
<price>4.95</price>
|
58
|
+
<publish_date>2000-09-02</publish_date>
|
59
|
+
<description>When Carla meets Paul at an ornithology
|
60
|
+
conference, tempers fly as feathers get ruffled.</description>
|
61
|
+
</book>
|
62
|
+
<book id="bk107">
|
63
|
+
<author>Thurman, Paula</author>
|
64
|
+
<title>Splish Splash</title>
|
65
|
+
<genre>Romance</genre>
|
66
|
+
<price>4.95</price>
|
67
|
+
<publish_date>2000-11-02</publish_date>
|
68
|
+
<description>A deep sea diver finds true love twenty
|
69
|
+
thousand leagues beneath the sea.</description>
|
70
|
+
</book>
|
71
|
+
<book id="bk108">
|
72
|
+
<author>Knorr, Stefan</author>
|
73
|
+
<title>Creepy Crawlies</title>
|
74
|
+
<genre>Horror</genre>
|
75
|
+
<price>4.95</price>
|
76
|
+
<publish_date>2000-12-06</publish_date>
|
77
|
+
<description>An anthology of horror stories about roaches,
|
78
|
+
centipedes, scorpions and other insects.</description>
|
79
|
+
</book>
|
80
|
+
<book id="bk109">
|
81
|
+
<author>Kress, Peter</author>
|
82
|
+
<title>Paradox Lost</title>
|
83
|
+
<genre>Science Fiction</genre>
|
84
|
+
<price>6.95</price>
|
85
|
+
<publish_date>2000-11-02</publish_date>
|
86
|
+
<description>After an inadvertant trip through a Heisenberg
|
87
|
+
Uncertainty Device, James Salway discovers the problems
|
88
|
+
of being quantum.</description>
|
89
|
+
</book>
|
90
|
+
<book id="bk110">
|
91
|
+
<author>O'Brien, Tim</author>
|
92
|
+
<title>Microsoft .NET: The Programming Bible</title>
|
93
|
+
<genre>Computer</genre>
|
94
|
+
<price>36.95</price>
|
95
|
+
<publish_date>2000-12-09</publish_date>
|
96
|
+
<description>Microsoft's .NET initiative is explored in
|
97
|
+
detail in this deep programmer's reference.</description>
|
98
|
+
</book>
|
99
|
+
<book id="bk111">
|
100
|
+
<author>O'Brien, Tim</author>
|
101
|
+
<title>MSXML3: A Comprehensive Guide</title>
|
102
|
+
<genre>Computer</genre>
|
103
|
+
<price>36.95</price>
|
104
|
+
<publish_date>2000-12-01</publish_date>
|
105
|
+
<description>The Microsoft MSXML3 parser is covered in
|
106
|
+
detail, with attention to XML DOM interfaces, XSLT processing,
|
107
|
+
SAX and more.</description>
|
108
|
+
</book>
|
109
|
+
<book id="bk112">
|
110
|
+
<author>Galos, Mike</author>
|
111
|
+
<title>Visual Studio 7: A Comprehensive Guide</title>
|
112
|
+
<genre>Computer</genre>
|
113
|
+
<price>49.95</price>
|
114
|
+
<publish_date>2001-04-16</publish_date>
|
115
|
+
<description>Microsoft Visual Studio 7 is explored in depth,
|
116
|
+
looking at how Visual Basic, Visual C++, C#, and ASP+ are
|
117
|
+
integrated into a comprehensive development
|
118
|
+
environment.</description>
|
119
|
+
</book>
|
120
|
+
</catalog>
|
121
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Parser::GpxString do
|
6
|
+
it 'reads the file' do
|
7
|
+
gpx_parser = described_class.new(File.new('./spec/examples/test_1.gpx').read)
|
8
|
+
expect { gpx_parser.read }.not_to raise_error
|
9
|
+
expect(gpx_parser.parsed_file).not_to be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'reads metadata' do
|
13
|
+
gpx_parser = described_class.new(File.new('./spec/examples/test_1.gpx').read)
|
14
|
+
gpx_parser.read
|
15
|
+
|
16
|
+
expect(gpx_parser.meta[:author]).to eq 'choosen'
|
17
|
+
expect(gpx_parser.meta[:name]).to eq '06.06.2020 18:56'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'reads points simplified/all' do
|
21
|
+
gpx_parser = described_class.new(File.new('./spec/examples/test_1.gpx').read)
|
22
|
+
gpx_parser.read
|
23
|
+
expect(gpx_parser.points.size).to eq 190
|
24
|
+
expect(gpx_parser.points.size).to eq gpx_parser.simplified_points.size
|
25
|
+
|
26
|
+
random_index = rand(gpx_parser.points.size)
|
27
|
+
expect(gpx_parser.points[random_index][:lat]).to eq gpx_parser.simplified_points[random_index][:lat]
|
28
|
+
expect(gpx_parser.points[random_index][:lon]).to eq gpx_parser.simplified_points[random_index][:lon]
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'reads file with segments' do
|
32
|
+
gpx_parser = described_class.new(File.new('./spec/examples/test_with_segments.gpx').read)
|
33
|
+
expect { gpx_parser.read }.not_to raise_error
|
34
|
+
|
35
|
+
expect(gpx_parser.points.size).to eq 355
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Parser::ValidateGpx do
|
6
|
+
it 'validates a proper file' do
|
7
|
+
gpx_validator = described_class.new('./spec/examples/test_1.gpx')
|
8
|
+
expect(gpx_validator.validate_basics?).to be(true)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns false if improper file' do
|
12
|
+
gpx_validator = described_class.new('./spec/examples/not_a_gpx.gpx')
|
13
|
+
expect(gpx_validator.validate_basics?).to be(false)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Parser::ValidateGpxString do
|
6
|
+
it 'validates the string' do
|
7
|
+
gpx_validator = described_class.new(File.new('./spec/examples/test_1.gpx').read)
|
8
|
+
expect(gpx_validator.validate_basics?).to be(true)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'returns false if improper file' do
|
12
|
+
gpx_validator = described_class.new(File.new('./spec/examples/not_a_gpx.gpx').read)
|
13
|
+
expect(gpx_validator.validate_basics?).to be(false)
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-trail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Staszek Zawadzki
|
@@ -96,10 +96,16 @@ files:
|
|
96
96
|
- lib/simple_trail/manipulation/statistics.rb
|
97
97
|
- lib/simple_trail/manipulation/straightener.rb
|
98
98
|
- lib/simple_trail/manipulation/unifier.rb
|
99
|
+
- lib/simple_trail/parser/base.rb
|
100
|
+
- lib/simple_trail/parser/extract_points.rb
|
99
101
|
- lib/simple_trail/parser/gpx.rb
|
102
|
+
- lib/simple_trail/parser/gpx_string.rb
|
103
|
+
- lib/simple_trail/parser/validate_gpx.rb
|
104
|
+
- lib/simple_trail/parser/validate_gpx_string.rb
|
100
105
|
- simple-trail.gemspec
|
101
106
|
- spec/examples/gss20-full-official.gpx
|
102
107
|
- spec/examples/kbl.gpx
|
108
|
+
- spec/examples/not_a_gpx.gpx
|
103
109
|
- spec/examples/pois.gpx
|
104
110
|
- spec/examples/test-xxl.gpx
|
105
111
|
- spec/examples/test_1.gpx
|
@@ -124,8 +130,11 @@ files:
|
|
124
130
|
- spec/manipulation/unifier_spec.rb
|
125
131
|
- spec/parser/gpx_poi_spec.rb
|
126
132
|
- spec/parser/gpx_spec.rb
|
133
|
+
- spec/parser/gpx_string_spec.rb
|
134
|
+
- spec/parser/validate_gpx_spec.rb
|
135
|
+
- spec/parser/validate_gpx_string_spec.rb
|
127
136
|
- spec/spec_helper.rb
|
128
|
-
homepage:
|
137
|
+
homepage: https://github.com/PadawanBreslau/simple-trail
|
129
138
|
licenses:
|
130
139
|
- MIT
|
131
140
|
metadata: {}
|
@@ -151,6 +160,7 @@ summary: Readind and manipulating GPX and other trail representation file
|
|
151
160
|
test_files:
|
152
161
|
- spec/examples/gss20-full-official.gpx
|
153
162
|
- spec/examples/kbl.gpx
|
163
|
+
- spec/examples/not_a_gpx.gpx
|
154
164
|
- spec/examples/pois.gpx
|
155
165
|
- spec/examples/test-xxl.gpx
|
156
166
|
- spec/examples/test_1.gpx
|
@@ -175,4 +185,7 @@ test_files:
|
|
175
185
|
- spec/manipulation/unifier_spec.rb
|
176
186
|
- spec/parser/gpx_poi_spec.rb
|
177
187
|
- spec/parser/gpx_spec.rb
|
188
|
+
- spec/parser/gpx_string_spec.rb
|
189
|
+
- spec/parser/validate_gpx_spec.rb
|
190
|
+
- spec/parser/validate_gpx_string_spec.rb
|
178
191
|
- spec/spec_helper.rb
|