natour 0.7.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []