natour 0.7.0 → 0.9.0

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.
@@ -1,7 +1,7 @@
1
+ require 'date'
2
+ require 'duration'
1
3
  require 'fit4ruby'
2
4
  require 'nokogiri'
3
- require 'duration'
4
- require 'date'
5
5
  require 'time'
6
6
 
7
7
  module Natour
@@ -1,6 +1,6 @@
1
+ require 'duration'
1
2
  require 'fileutils'
2
3
  require 'pathname'
3
- require 'duration'
4
4
  require 'time'
5
5
 
6
6
  module Natour
@@ -1,5 +1,5 @@
1
- require 'nokogiri'
2
1
  require 'duration'
2
+ require 'nokogiri'
3
3
  require 'timeliness'
4
4
 
5
5
  module Natour
data/lib/natour/image.rb CHANGED
@@ -1,7 +1,7 @@
1
- require 'vips'
2
- require 'timeliness'
3
1
  require 'fileutils'
4
2
  require 'pathname'
3
+ require 'timeliness'
4
+ require 'vips'
5
5
 
6
6
  module Natour
7
7
  class Image
@@ -1,31 +1,40 @@
1
- require 'fileutils'
2
- require 'pathname'
3
- require 'webrick'
4
1
  require 'concurrent'
5
2
  require 'ferrum'
3
+ require 'fileutils'
4
+ require 'pathname'
6
5
  require 'uri'
6
+ require 'webrick'
7
+ require 'webrick/https'
7
8
 
8
9
  module Natour
9
10
  class MapGeoAdmin
10
11
  def initialize(port: 0)
11
- @doc_root = Dir.mktmpdir
12
+ @doc_root = Pathname(Dir.mktmpdir)
12
13
  FileUtils.cp_r("#{__dir__}/data/js", @doc_root)
13
14
  event = Concurrent::Event.new
14
- @server = WEBrick::HTTPServer.new(
15
- StartCallback: -> { event.set },
16
- Logger: WEBrick::Log.new(File.open(File::NULL, 'w')),
17
- AccessLog: [],
18
- DocumentRoot: @doc_root,
19
- BindAddress: 'localhost',
20
- Port: port
21
- )
15
+ @server = StdoutUtils.suppress_output do
16
+ WEBrick::HTTPServer.new(
17
+ StartCallback: -> { event.set },
18
+ Logger: WEBrick::Log.new(File.open(File::NULL, 'w')),
19
+ AccessLog: [],
20
+ DocumentRoot: @doc_root,
21
+ BindAddress: 'localhost',
22
+ Port: port,
23
+ SSLEnable: true,
24
+ SSLCertName: [%w[CN localhost]]
25
+ )
26
+ end
22
27
  @server.mount('/map', MapServlet)
23
28
  @thread = Thread.new { @server.start }
24
29
  event.wait
25
30
  @browser = Ferrum::Browser.new(
26
31
  slowmo: 2.0,
32
+ timout: 30,
27
33
  window_size: [5000, 5000],
28
- browser_options: { 'no-sandbox': nil }
34
+ browser_options: {
35
+ 'no-sandbox': nil,
36
+ 'ignore-certificate-errors': nil
37
+ }
29
38
  )
30
39
  end
31
40
 
@@ -36,21 +45,28 @@ module Natour
36
45
  FileUtils.remove_entry(@doc_root)
37
46
  end
38
47
 
39
- def save_image(filename, tracks: [], layers: [], size: [1200, 900])
40
- FileUtils.cp(tracks, @doc_root)
41
- FileUtils.mkdir_p(Pathname(filename).dirname)
42
- uri = URI("http://#{@server[:BindAddress]}:#{@server[:Port]}/map")
48
+ def save_image(filename, overwrite: false, gps_files: [], gps_colors: [], map_layers: [], image_size: [1200, 900])
49
+ FileUtils.cp(gps_files, @doc_root)
50
+ uri = URI("https://#{@server[:BindAddress]}:#{@server[:Port]}/map")
43
51
  uri.query = URI.encode_www_form(
44
- tracks: tracks.map { |track| Pathname(track).basename }.join(','),
45
- layers: layers.join(','),
46
- size: size.map { |dim| dim.is_a?(String) ? dim : "#{dim}px" }.join(',')
52
+ 'gps-files': gps_files.map { |gps_file| Pathname(gps_file).basename }.join(','),
53
+ 'gps-colors': gps_colors.join(','),
54
+ 'map-layers': map_layers.join(','),
55
+ 'map-size': image_size.map { |dim| dim.is_a?(String) ? dim : "#{dim}px" }.join(',')
47
56
  )
48
57
  @browser.goto(uri)
58
+ tmp_filename = @doc_root.join(Pathname(filename).basename)
49
59
  @browser.screenshot(
50
- path: filename,
60
+ path: tmp_filename,
51
61
  quality: 100,
52
62
  selector: '.map'
53
63
  )
64
+ FileUtils.mkdir_p(Pathname(filename).dirname)
65
+ mode = File::WRONLY | File::CREAT | File::TRUNC | File::BINARY
66
+ mode |= File::EXCL unless overwrite
67
+ File.open(filename, mode) do |file|
68
+ file.write(File.read(tmp_filename, mode: 'rb'))
69
+ end
54
70
  end
55
71
 
56
72
  def self.open(*args)
@@ -66,11 +82,13 @@ module Natour
66
82
  def do_GET(request, response) # rubocop:disable Naming/MethodName
67
83
  raise WEBrick::HTTPStatus::NotFound unless request.path == '/map'
68
84
 
69
- tracks = request.query.fetch('tracks', '').split(',')
70
- layers = request.query.fetch('layers', '').split(',')
71
- layers.unshift('ch.swisstopo.pixelkarte-farbe')
85
+ files = request.query.fetch('gps-files', '').split(',')
86
+ colors = request.query.fetch('gps-colors', '').split(',')
87
+ (files.size - colors.size).times { colors << (colors.last || 'blueviolet') }
88
+ layers = ['ch.swisstopo.pixelkarte-farbe']
89
+ layers |= request.query.fetch('map-layers', '').split(',')
72
90
 
73
- width, height = request.query.fetch('size', '').split(',')
91
+ width, height = request.query.fetch('map-size', '').split(',')
74
92
  raise WEBrick::HTTPStatus::BadRequest unless width && height
75
93
 
76
94
  doc = []
@@ -81,36 +99,77 @@ module Natour
81
99
  doc << '<script src="js/loader.js"></script>'
82
100
  doc << '<script type="text/javascript">'
83
101
  doc << ' $(function() {'
84
- doc << ' var map = new ga.Map({'
102
+ doc << ' let map = new ga.Map({'
85
103
  doc << ' controls: [],'
86
104
  doc << ' target: "map",'
87
105
  doc << ' view: new ol.View()'
88
106
  doc << ' })'
89
- doc << " var layers = [#{layers.map { |layer| "\"#{layer}\"" }.join(', ')}]"
107
+ doc << " let layers = [#{layers.map { |layer| "\"#{layer}\"" }.join(', ')}]"
90
108
  doc << ' layers.forEach(function(layer) {'
91
109
  doc << ' map.addLayer(ga.layer.create(layer))'
92
110
  doc << ' })'
93
- doc << " var tracks = [#{tracks.map { |track| "\"#{track}\"" }.join(', ')}]"
94
- doc << ' tracks = tracks.map(function(track) {'
95
- doc << ' return new ol.layer.Vector({'
96
- doc << ' source: new ol.source.Vector({'
97
- doc << ' format: new ol.format.GPX(),'
98
- doc << ' url: track'
111
+ doc << ' let getStyles = function(color) {'
112
+ doc << ' return {'
113
+ doc << ' "Point": new ol.style.Style({'
114
+ doc << ' image: new ol.style.Circle({'
115
+ doc << ' fill: new ol.style.Fill({'
116
+ doc << ' color: function() {'
117
+ doc << ' let [r, g, b, a] = ol.color.asArray(color)'
118
+ doc << ' a = 0.3'
119
+ doc << ' return ol.color.asString([r, g, b, a])'
120
+ doc << ' }()'
121
+ doc << ' }),'
122
+ doc << ' radius: 6,'
123
+ doc << ' stroke: new ol.style.Stroke({'
124
+ doc << ' color: color,'
125
+ doc << ' width: 1.5'
126
+ doc << ' })'
127
+ doc << ' })'
128
+ doc << ' }),'
129
+ doc << ' "LineString": new ol.style.Style({'
130
+ doc << ' stroke: new ol.style.Stroke({'
131
+ doc << ' color: color,'
132
+ doc << ' width: 3'
133
+ doc << ' })'
99
134
  doc << ' }),'
100
- doc << ' style: new ol.style.Style({'
135
+ doc << ' "MultiLineString": new ol.style.Style({'
101
136
  doc << ' stroke: new ol.style.Stroke({'
102
- doc << ' color: "blueviolet",'
137
+ doc << ' color: color,'
103
138
  doc << ' width: 3'
104
139
  doc << ' })'
105
140
  doc << ' })'
141
+ doc << ' }'
142
+ doc << ' }'
143
+ doc << " let sources = [#{files.zip(colors)
144
+ .map { |file, color| "{ file: \"#{file}\", color: \"#{color}\" }" }
145
+ .join(', ')}]"
146
+ doc << ' let vectors = sources.map(function(source) {'
147
+ doc << ' return new ol.layer.Vector({'
148
+ doc << ' source: new ol.source.Vector({'
149
+ doc << ' format: function() {'
150
+ doc << ' if (source.file.endsWith(".gpx")) {'
151
+ doc << ' return new ol.format.GPX()'
152
+ doc << ' } else if (source.file.endsWith(".kml")) {'
153
+ doc << ' return new ol.format.KML({'
154
+ doc << ' extractStyles: false'
155
+ doc << ' })'
156
+ doc << ' } else {'
157
+ doc << ' return null'
158
+ doc << ' }'
159
+ doc << ' }(),'
160
+ doc << ' url: source.file'
161
+ doc << ' }),'
162
+ doc << ' style: function(feature) {'
163
+ doc << ' return getStyles(source.color)[feature.getGeometry().getType()]'
164
+ doc << ' }'
106
165
  doc << ' })'
107
166
  doc << ' })'
108
- doc << ' tracks.forEach(function(track) {'
109
- doc << ' map.addLayer(track)'
110
- doc << ' track.getSource().on("change", function(evt) {'
111
- doc << ' var extent = ol.extent.createEmpty()'
112
- doc << ' tracks.forEach(function(track) {'
113
- doc << ' ol.extent.extend(extent, track.getSource().getExtent())'
167
+ doc << ' vectors.forEach(function(vector) {'
168
+ doc << ' map.addLayer(vector)'
169
+ doc << ' vector.getSource().on("change", function(evt) {'
170
+ doc << ' let extent = ol.extent.createEmpty()'
171
+ doc << ' vectors.forEach(function(vector) {'
172
+ doc << ' ol.extent.extend(extent, vector.getSource().getExtent())'
114
173
  doc << ' })'
115
174
  doc << ' map.getView().fit(extent, map.getSize())'
116
175
  doc << ' })'
@@ -1,7 +1,7 @@
1
- require 'uri'
1
+ require 'json'
2
2
  require 'net/http'
3
3
  require 'openssl'
4
- require 'json'
4
+ require 'uri'
5
5
 
6
6
  module Natour
7
7
  class PublicTransport
data/lib/natour/report.rb CHANGED
@@ -29,7 +29,7 @@ module Natour
29
29
  @arrival_point = arrival_point
30
30
  end
31
31
 
32
- def self.load_directory(dir, track_formats: %i[gpx fit], create_map: true, map_layers: [])
32
+ def self.load_directory(dir, track_formats: %i[gpx fit], create_map: true, overwrite_map: false, map_layers: [])
33
33
  Dir.chdir(dir) do
34
34
  path = Pathname(dir)
35
35
  title = Pathname.pwd.basename.to_s.encode('utf-8')
@@ -61,7 +61,7 @@ module Natour
61
61
  track = Pathname(tmp_dir).join(gps_track.path).sub_ext('.gpx')
62
62
  gps_track.save_gpx(track, overwrite: true)
63
63
  filename = Pathname(gps_track.path).sub_ext('.jpg')
64
- map.save_image(filename, tracks: [track], layers: map_layers)
64
+ map.save_image(filename, overwrite: overwrite_map, gps_files: [track], map_layers: map_layers)
65
65
  Image.load_file(filename.to_s)
66
66
  end
67
67
  end
@@ -0,0 +1,11 @@
1
+ module Natour
2
+ module BooleanUtils
3
+ module_function
4
+
5
+ def to_boolean(value, default_value: false)
6
+ return !!value unless value.nil?
7
+
8
+ !!default_value
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module Natour
2
+ module ErrnoUtils
3
+ module_function
4
+
5
+ def split_message(error)
6
+ error.message.split(/ @ | - /, 3)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Natour
4
+ VERSION = '0.9.0'
5
+ end
data/lib/natour.rb CHANGED
@@ -1,18 +1,21 @@
1
- require 'natour/utils/botanical_name_utils'
2
- require 'natour/utils/date_utils'
3
- require 'natour/utils/stdout_utils'
4
- require 'natour/convert'
5
- require 'natour/create'
6
- require 'natour/asciinurse'
7
- require 'natour/config'
8
- require 'natour/gps_track'
9
- require 'natour/gps_track_point'
10
- require 'natour/gpx_file'
11
- require 'natour/fit_file'
12
- require 'natour/image'
13
- require 'natour/map_geo_admin'
14
- require 'natour/public_transport'
15
- require 'natour/report'
16
- require 'natour/species'
17
- require 'natour/species_list'
18
- require 'natour/station'
1
+ require_relative 'natour/utils/boolean_utils'
2
+ require_relative 'natour/utils/botanical_name_utils'
3
+ require_relative 'natour/utils/date_utils'
4
+ require_relative 'natour/utils/errno_utils'
5
+ require_relative 'natour/utils/stdout_utils'
6
+ require_relative 'natour/asciinurse'
7
+ require_relative 'natour/config'
8
+ require_relative 'natour/convert_report'
9
+ require_relative 'natour/create_reports'
10
+ require_relative 'natour/gps_track'
11
+ require_relative 'natour/gps_track_point'
12
+ require_relative 'natour/gpx_file'
13
+ require_relative 'natour/fit_file'
14
+ require_relative 'natour/image'
15
+ require_relative 'natour/map_geo_admin'
16
+ require_relative 'natour/public_transport'
17
+ require_relative 'natour/report'
18
+ require_relative 'natour/species'
19
+ require_relative 'natour/species_list'
20
+ require_relative 'natour/station'
21
+ require_relative 'natour/version'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: natour
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Gysi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-14 00:00:00.000000000 Z
11
+ date: 2022-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: asciidoctor
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: clamp
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: concurrent-ruby
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +66,20 @@ dependencies:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
68
  version: '1.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: deep_merge
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.2'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: ferrum
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -192,8 +220,8 @@ files:
192
220
  - lib/natour.rb
193
221
  - lib/natour/asciinurse.rb
194
222
  - lib/natour/config.rb
195
- - lib/natour/convert.rb
196
- - lib/natour/create.rb
223
+ - lib/natour/convert_report.rb
224
+ - lib/natour/create_reports.rb
197
225
  - lib/natour/data/fonts/dejavuserifcondensed-bold.ttf
198
226
  - lib/natour/data/fonts/dejavuserifcondensed-bold_italic.ttf
199
227
  - lib/natour/data/fonts/dejavuserifcondensed-italic.ttf
@@ -213,9 +241,12 @@ files:
213
241
  - lib/natour/species.rb
214
242
  - lib/natour/species_list.rb
215
243
  - lib/natour/station.rb
244
+ - lib/natour/utils/boolean_utils.rb
216
245
  - lib/natour/utils/botanical_name_utils.rb
217
246
  - lib/natour/utils/date_utils.rb
247
+ - lib/natour/utils/errno_utils.rb
218
248
  - lib/natour/utils/stdout_utils.rb
249
+ - lib/natour/version.rb
219
250
  homepage: https://github.com/simongysi/natour
220
251
  licenses:
221
252
  - MIT
@@ -238,8 +269,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
238
269
  - !ruby/object:Gem::Version
239
270
  version: '0'
240
271
  requirements: []
241
- rubygems_version: 3.0.3
272
+ rubygems_version: 3.3.7
242
273
  signing_key:
243
274
  specification_version: 4
244
- summary: natour provides an application and a library for reports on nature activities
275
+ summary: natour provides an application and a library to document nature activities.
245
276
  test_files: []