rozi 0.0.7 → 0.1.3

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +255 -0
  3. data/lib/rozi.rb +6 -3
  4. data/lib/rozi/file_wrapper_base.rb +52 -0
  5. data/lib/rozi/module_functions.rb +19 -69
  6. data/lib/rozi/name_search.rb +176 -0
  7. data/lib/rozi/{ozi_functions.rb → shared.rb} +36 -9
  8. data/lib/rozi/tracks.rb +170 -0
  9. data/lib/rozi/version.rb +1 -1
  10. data/lib/rozi/waypoints.rb +315 -0
  11. data/test/rozi/file_wrapper_base_test.rb +29 -0
  12. data/test/rozi/module_functions_test.rb +11 -72
  13. data/test/rozi/name_search_test.rb +248 -0
  14. data/test/rozi/{ozi_functions_test.rb → shared_test.rb} +25 -5
  15. data/test/rozi/tracks_test.rb +105 -0
  16. data/test/rozi/waypoints_test.rb +268 -0
  17. data/test/test_data/expected_output_1.nst +6 -0
  18. data/{test_data → test/test_data}/expected_output_1.plt +9 -9
  19. data/{test_data → test/test_data}/expected_output_1.wpt +7 -7
  20. data/test/test_data/input_1.wpt +6 -0
  21. metadata +128 -34
  22. data/README.rdoc +0 -127
  23. data/lib/rozi/name.rb +0 -23
  24. data/lib/rozi/name_search_text.rb +0 -43
  25. data/lib/rozi/name_search_text_writer.rb +0 -71
  26. data/lib/rozi/track.rb +0 -67
  27. data/lib/rozi/track_point.rb +0 -39
  28. data/lib/rozi/track_writer.rb +0 -50
  29. data/lib/rozi/waypoint.rb +0 -90
  30. data/lib/rozi/waypoint_writer.rb +0 -38
  31. data/test/rozi/name_search_text_test.rb +0 -28
  32. data/test/rozi/name_search_text_writer_test.rb +0 -114
  33. data/test/rozi/track_point_test.rb +0 -32
  34. data/test/rozi/track_test.rb +0 -25
  35. data/test/rozi/track_writer_test.rb +0 -62
  36. data/test/rozi/waypoint_test.rb +0 -31
  37. data/test/rozi/waypoint_writer_test.rb +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c93dcf8497a215662be35fca8e1ac25cf25ece14
4
- data.tar.gz: 1ef88c98d7b713704efc6799b6abc1e8ad74b0df
3
+ metadata.gz: 3ccf96a25f5bebe5718bedc9c7f067e0fbc32c0a
4
+ data.tar.gz: e400fe4c0b3a95ce13b1d5c691d0001c5914a71d
5
5
  SHA512:
6
- metadata.gz: 838874d53cd4e1390539cd9fad0e60b1ec900b3878942edc330b1b5ab139d81d71939f50169b6e3dac97ce0e5fa02620e9a0bf6dde288efc617d1cf64c4dea46
7
- data.tar.gz: f4081e83c5162bc94c2e35d1adad3719bda1e54664a1c7a117550955aa6e0c424fb984ad5c7496c5631acc922f5bd66877e781920efc627eca60927415c9d068
6
+ metadata.gz: 2b407b84881ab7bf52db3fbefb684a8bcab2472ea8cab3f3c666800efcf0da9fb46efbbd21822cedb18d1e25ad167730e99429249e6596b98b8c017546112649
7
+ data.tar.gz: 0641fde6d7cde525057f6c9ed56f23d01487282ddddfee01c735965e438a16e06c1cd92346a7db7afe007eea0c8000495471a4c08eaa568a8448fe58c96633c4
@@ -0,0 +1,255 @@
1
+
2
+ [![Rubygems][rubygems-badge]][rubygems]
3
+ [![API Documentation][yard-badge]][docs]
4
+
5
+ # Rozi
6
+
7
+ Rozi is a Ruby gem for working with all Ozi Explorer file formats. Currently
8
+ the implemented functionality is:
9
+
10
+ - Creating and writing waypoints to files (.wpt)
11
+ - Reading waypoints from files
12
+ - Creating and writing tracks to files (.plt)
13
+ - Creating Name Search Text files (.nst)
14
+
15
+ ## Files
16
+
17
+ Text based file formats read by Ozi Explorer should be encoded as ISO-8859-1 and
18
+ use CRLF line endings (`\r\n`). Rozi will handle this for you, as long as you
19
+ use the methods that accept file paths. Rozi internally uses the
20
+ [`Rozi.open_file`][Rozi.open_file] function, which creates and returns (or
21
+ yields) a `File` instance with the correct encoding settings for both reading
22
+ and writing Ozi Explorer file formats.
23
+
24
+ Example:
25
+
26
+ ```ruby
27
+ Rozi.open_file("file_path.wpt", "w") { |file|
28
+ file.write("Østre aker\n") # Writes "Østre aker\r\n" in ISO-8859-1
29
+ }
30
+
31
+ Rozi.open_file("file_path.wpt", "r") { |file|
32
+ file.read # Reads "Østre aker\n" as UTF-8
33
+ }
34
+ ```
35
+
36
+ ## Datums
37
+
38
+ Rozi performs input validation on datums. If you try to set the datum property
39
+ of an object to a datum that isn't supported by Ozi Explorer, Rozi will raise an
40
+ exception. The constant [`Rozi::DATUMS`][Rozi::DATUMS] contains all datums that
41
+ Ozi Explorer supports.
42
+
43
+ ## Colors
44
+
45
+ Any time you set colors in Rozi, you can either use the three-byte integer
46
+ representation that Ozi Explorer expects, or you can use a hex string like
47
+ "RRGGBB" and Rozi will convert it for you. Example:
48
+
49
+ ```ruby
50
+ # Identical
51
+ Rozi::Waypoint.new(bg_color: "ABCDEF")
52
+ Rozi::Waypoint.new(bg_color: 0xEFCDAB)
53
+ Rozi::Waypoint.new(bg_color: 15715755)
54
+ ```
55
+
56
+ ## Creating waypoint files
57
+
58
+ Rozi defines a `WaypointFile` class, which mimics the standard library `File`
59
+ class. The waypoint file class has two important methods:
60
+
61
+ - [`#write_properties`][Rozi::WaypointFile#write_properties]
62
+ - [`#write_waypoint`][Rozi::WaypointFile#write_waypoint]
63
+
64
+ The waypoint file "properties" are the file-wide data contained in the top 4
65
+ lines of the file. In the case of waypoint files, that's just the waypoint file
66
+ version and the geodetic datum.
67
+
68
+ To write file properties, the file *must be empty*. Here's an example:
69
+
70
+ ```ruby
71
+ properties = Rozi::WaypointFileProperties.new(version: "1.1", datum: "WGS 84")
72
+
73
+ wpt = Rozi::WaypointFile.open("/path/to/file.wpt", "w")
74
+ wpt.write_properties(properties)
75
+ ```
76
+
77
+ The properties displayed here happens to be the defaults for Rozi, so you can
78
+ skip this step if they work for you. When writing the first waypoint, the
79
+ default properties will be added first.
80
+
81
+ Here's how you write waypoints:
82
+
83
+ ```ruby
84
+ wpt = Rozi::WaypointFile.open("/path/to/file.wpt", "w")
85
+
86
+ wpt.write_waypoint Rozi::Waypoint.new(
87
+ name: "Foo", latitude: 12.34, longitude: 56.78
88
+ )
89
+ wpt.write_waypoint Rozi::Waypoint.new(
90
+ name: "Bar", latitude: 12.34, longitude: 56.78
91
+ )
92
+
93
+ wpt.close
94
+ ```
95
+
96
+ Alternatively, you can use a block for `WaypointFile.open`, just like with
97
+ `File.open`:
98
+
99
+ ```ruby
100
+ Rozi::WaypointFile.open("/path/to/file.wpt", "w") { |wpt|
101
+ # ...
102
+ }
103
+ ```
104
+
105
+ Rozi also provides the function `Rozi.write_waypoints` for opening a file,
106
+ writing properties, writing waypoints and closing the file in one step. Example:
107
+
108
+ ```ruby
109
+ waypoints = [
110
+ Rozi::Waypoint.new(name: "Foo", latitude: 12.34, longitude: 56.78),
111
+ Rozi::Waypoint.new(name: "Bar", latitude: 12.34, longitude: 56.78)
112
+ ]
113
+
114
+ Rozi.write_waypoints(waypoints, "/path/to/file.wpt", datum: "WGS 84")
115
+ ```
116
+
117
+ WGS 84 is the default datum, so specifying it is unnecessary, but it illustrates
118
+ how waypoint file properties can be set using keyword arguments.
119
+
120
+ See:
121
+
122
+ - [`Rozi.write_waypoints`][Rozi.write_waypoints]
123
+ - [`Rozi::WaypointFileProperties`][Rozi::WaypointFileProperties]
124
+ - [`Rozi::Waypoint`][Rozi::Waypoint]
125
+ - [`Rozi::WaypointFile`][Rozi::WaypointFile]
126
+
127
+ ## Reading waypoint files
128
+
129
+ Reading waypoints from waypoint files is even easier than writing them:
130
+
131
+ ```ruby
132
+ wpt = Rozi::WaypointFile.open("/path/to/file.wpt", "r")
133
+
134
+ properties = wpt.read_properties
135
+
136
+ # The most basic reading method
137
+ first_waypoint = wpt.read_waypoint
138
+ second_waypoint = wpt.read_waypoint
139
+
140
+ # Iterating over all the waypoints in the file
141
+ wpt.each_waypoint { |waypoint|
142
+ puts "#{waypoint.name} - #{waypoint.latitude},#{waypoint.longitude}"
143
+ }
144
+
145
+ # Reading all waypoints into an array
146
+ waypoints = wpt.each_waypoint.to_a
147
+ ```
148
+
149
+ See:
150
+
151
+ - [`Rozi::WaypointFile`][Rozi::WaypointFile]
152
+
153
+ ## Creating track files
154
+
155
+ Creating track files is very similar to creating waypoint files. Instead of the
156
+ `WaypointFile` class, you use the `TrackFile` class. Instead of writing
157
+ `Waypoint` objects, you write `TrackPoint` objects. Instead of using
158
+ `WaypointFileProperties`, you use `TrackProperties`.
159
+
160
+ One thing to note about track files is that the file-wide properties contain a
161
+ lot more information. They contain the track color, track width, track
162
+ description and much more. See [`Rozi::TrackProperties`][Rozi::TrackProperties]
163
+ for more information.
164
+
165
+ Rozi also has a `Rozi.write_waypoints` equivalent for writing tracks:
166
+
167
+ ```ruby
168
+ track_points = [
169
+ Rozi::TrackPoint(latitude: 12.34, longitude: 56.78),
170
+ Rozi::TrackPoint(latitude: 23.45, longitude: 67.89)
171
+ ]
172
+
173
+ Rozi.write_track(track_points, "/path/to/file.plt", color: "FF0000")
174
+ ```
175
+
176
+ See:
177
+
178
+ - [`Rozi.write_track`][Rozi.write_track]
179
+ - [`Rozi::TrackProperties`][Rozi::TrackProperties]
180
+ - [`Rozi::TrackPoint`][Rozi::TrackPoint]
181
+ - [`Rozi::TrackFile`][Rozi::TrackFile]
182
+
183
+ ## Creating name search text files
184
+
185
+ See [Ozi Explorer: Name Search][name-search] for information about Name Search.
186
+ An NST file has to be converted into a Name Database using the ["Name Search
187
+ Creator"][name-search-creator] tool before they can be used by Ozi Explorer.
188
+
189
+ Rozi aims to be consistent and intuitive, so creating NST files is pretty much
190
+ the exact same process as creating waypoint files and track files:
191
+
192
+ ```ruby
193
+ properties = Rozi::NameSearchProperties.new(
194
+ datum: "WGS 84", comment: "Generated by Rozi!"
195
+ )
196
+
197
+ nst = Rozi::NameSearchTextFile.open("/path/to/file.nst", "w")
198
+
199
+ nst.write_properties(properties)
200
+ nst.write_name Rozi::Name.new(name: "Foo", latitude: 12.34, longitude: 56.78)
201
+ nst.write_name Rozi::Name.new(name: "Bar", latitude: 23.45, longitude: 67.89)
202
+
203
+ nst.close
204
+ ```
205
+
206
+ Or using the module function:
207
+
208
+ ```ruby
209
+ names = [
210
+ Rozi::Name.new(name: "Foo", latitude: 12.34, longitude: 56.78),
211
+ Rozi::Name.new(name: "Bar", latitude: 23.45, longitude: 67.89)
212
+ ]
213
+
214
+ Rozi.write_nst(
215
+ names, "/path/to/file.nst", datum: "WGS 84", comment: "Generated by Rozi!"
216
+ )
217
+ ```
218
+
219
+ See:
220
+
221
+ - [`Rozi.write_nst`][Rozi.write_nst]
222
+ - [`Rozi::NameSearchProperties`][Rozi::NameSearchProperties]
223
+ - [`Rozi::Name`][Rozi::Name]
224
+ - [`Rozi::NameSearchFile`][Rozi::NameSearchFile]
225
+
226
+
227
+
228
+ [rubygems]: https://rubygems.org/gems/rozi
229
+ [docs]: http://www.rubydoc.info/gems/rozi
230
+ [rubygems-badge]: https://badge.fury.io/rb/rozi.svg
231
+ [yard-badge]: http://b.repl.ca/v1/yard-docs-blue.png
232
+
233
+ [name-search]: http://www.oziexplorer3.com/namesearch/wnamesrch.html
234
+ [name-search-creator]: http://www.oziexplorer3.com/namesearch/namesearch_setup.exe
235
+
236
+ [Rozi.open_file]: http://www.rubydoc.info/gems/rozi/Rozi#open_file-class_method
237
+
238
+ [Rozi::DATUMS]: http://www.rubydoc.info/gems/rozi/Rozi#DATUMS-constant
239
+
240
+ [Rozi::WaypointFile#write_properties]: http://www.rubydoc.info/gems/rozi/Rozi/WaypointFile#write_properties-instance_method
241
+ [Rozi::WaypointFile#write_waypoint]: http://www.rubydoc.info/gems/rozi/Rozi/WaypointFile#write_waypoint-instance_method
242
+ [Rozi.write_waypoints]: http://www.rubydoc.info/gems/rozi/Rozi#write_waypoints-class_method
243
+ [Rozi::WaypointFileProperties]: http://www.rubydoc.info/gems/rozi/Rozi/WaypointFileProperties
244
+ [Rozi::Waypoint]: http://www.rubydoc.info/gems/rozi/Rozi/Waypoint
245
+ [Rozi::WaypointFile]: http://www.rubydoc.info/gems/rozi/Rozi/WaypointFile
246
+
247
+ [Rozi.write_track]: http://www.rubydoc.info/gems/rozi/Rozi#write_track-class_method
248
+ [Rozi::TrackProperties]: http://www.rubydoc.info/gems/rozi/Rozi/TrackProperties
249
+ [Rozi::TrackPoint]: http://www.rubydoc.info/gems/rozi/Rozi/TrackPoint
250
+ [Rozi::TrackFile]: http://www.rubydoc.info/gems/rozi/Rozi/TrackFile
251
+
252
+ [Rozi.write_nst]: http://www.rubydoc.info/gems/rozi/Rozi#write_nst-class_method
253
+ [Rozi::NameSearchProperties]: http://www.rubydoc.info/gems/rozi/Rozi/NameSearchProperties
254
+ [Rozi::Name]: http://www.rubydoc.info/gems/rozi/Rozi/Name
255
+ [Rozi::NameSearchFile]: http://www.rubydoc.info/gems/rozi/Rozi/NameSearchFile
@@ -1,13 +1,16 @@
1
1
 
2
+ require "datastruct"
3
+
2
4
  module Rozi
5
+ extend self
3
6
 
4
- PROJECT_DIR = File.expand_path("../", File.dirname(__FILE__))
7
+ ROOT = File.expand_path("../", File.dirname(__FILE__))
5
8
 
6
9
  ##
7
10
  # Loads all ruby files under lib/rozi. Called automatically when requiring
8
11
  # "rozi.rb".
9
12
  #
10
- def self.require_lib!
13
+ def require_lib
11
14
  this_dir = File.absolute_path(File.dirname(__FILE__))
12
15
  source_files = Dir[File.join(this_dir, "rozi/**/*.rb")]
13
16
 
@@ -17,4 +20,4 @@ module Rozi
17
20
  end
18
21
  end
19
22
 
20
- Rozi.require_lib!()
23
+ Rozi.require_lib
@@ -0,0 +1,52 @@
1
+
2
+ module Rozi
3
+ ##
4
+ # Base class for classes that wrap file objects
5
+ #
6
+ class FileWrapperBase
7
+ attr_accessor :file
8
+
9
+ ##
10
+ # Behaves like +File#open+, but returns/yields a {WaypointFile} object
11
+ #
12
+ def self.open(file_path, mode="r")
13
+ file = Rozi.open_file(file_path, mode)
14
+ wrapper = self.new(file)
15
+
16
+ if block_given?
17
+ begin
18
+ return yield wrapper
19
+ ensure
20
+ wrapper.close unless wrapper.closed?
21
+ end
22
+ else
23
+ return wrapper
24
+ end
25
+ end
26
+
27
+ def initialize(file)
28
+ @file = file
29
+ end
30
+
31
+ ##
32
+ # @return [nil]
33
+ #
34
+ def close
35
+ @file.close
36
+ end
37
+
38
+ ##
39
+ # @return [Boolean]
40
+ #
41
+ def closed?
42
+ @file.closed?
43
+ end
44
+
45
+ ##
46
+ # @return [nil]
47
+ #
48
+ def rewind
49
+ @file.rewind
50
+ end
51
+ end
52
+ end
@@ -1,30 +1,37 @@
1
1
 
2
2
  module Rozi
3
-
4
3
  module_function
5
4
 
6
5
  ##
7
- # Opens a file handle with the correct settings for writing an Ozi Explorer
8
- # file format.
6
+ # Opens a file with the correct settings for usage with Ozi Explorer
7
+ #
8
+ # The file instance has UTF-8 internal encoding and ISO-8859-1 external
9
+ # encoding. When writing, all line endings are converted to CRLF. When
10
+ # reading, all line endings are converted to LF.
9
11
  #
10
- # @overload open_file_for_writing(path)
12
+ # @overload open_file(path, mode="r")
11
13
  #
12
14
  # @param [String] path
13
15
  # @return [File]
14
16
  #
15
- # @overload open_file_for_writing(path)
17
+ # @overload open_file(path, mode="r")
16
18
  #
17
- # Can be called with a block, just file +File.open+.
19
+ # Can be called with a block, just like file +File.open+.
18
20
  #
19
21
  # @yieldparam [File] file
20
22
  # @return [void]
21
23
  #
22
- def open_file_for_writing(path)
23
- file = File.open(path, "w")
24
- file.set_encoding(
25
- "ISO-8859-1", "UTF-8",
26
- crlf_newline: true, undef: :replace, replace: "?"
27
- )
24
+ def open_file(path, mode="r")
25
+ file = File.open(path, mode)
26
+ opts = {undef: :replace, replace: "?"}
27
+
28
+ if mode.include? "w"
29
+ opts[:crlf_newline] = true
30
+ else
31
+ opts[:universal_newline] = true
32
+ end
33
+
34
+ file.set_encoding("ISO-8859-1", "UTF-8", opts)
28
35
 
29
36
  if block_given?
30
37
  yield file
@@ -35,61 +42,4 @@ module Rozi
35
42
  return file
36
43
  end
37
44
  end
38
-
39
- ##
40
- # Writes an array of waypoints to a file.
41
- #
42
- # @see Rozi::WaypointWriter#write
43
- #
44
- def write_waypoints(waypoints, file)
45
- @@wpt_writer ||= WaypointWriter.new
46
-
47
- if file.is_a? String
48
- open_file_for_writing(file) { |f|
49
- @@wpt_writer.write(waypoints, f)
50
- }
51
- else
52
- @@wpt_writer.write(waypoints, file)
53
- end
54
-
55
- return nil
56
- end
57
-
58
- ##
59
- # Writes a track to a file.
60
- #
61
- # @see Rozi::TrackWriter#write
62
- #
63
- def write_track(track, file)
64
- @@track_writer ||= TrackWriter.new
65
-
66
- if file.is_a? String
67
- open_file_for_writing(file) { |f|
68
- @@track_writer.write(track, f)
69
- }
70
- else
71
- @@track_writer.write(track, file)
72
- end
73
-
74
- return nil
75
- end
76
-
77
- ##
78
- # Writes a {Rozi::NameSearchText} object to a file.
79
- #
80
- # @see Rozi::NameSearchTextWriter#write
81
- #
82
- def write_nst(nst, file)
83
- @@nst_writer ||= NameSearchTextWriter.new
84
-
85
- if file.is_a? String
86
- open_file_for_writing(file) { |f|
87
- @@nst_writer.write(nst, f)
88
- }
89
- else
90
- @@nst_writer.write(nst, file)
91
- end
92
-
93
- return nil
94
- end
95
45
  end