Compare commits

...

8 commits

Author SHA1 Message Date
Aljoscha Grebe
5c77a3d2e7
Merge 543242cdf3 into 2206622726 2025-07-21 22:18:33 +02:00
Eugene Burmakin
2206622726 Release 0.30.0 2025-07-21 20:35:43 +02:00
Eugene Burmakin
9bcd522e25 Update specs 2025-07-21 20:22:18 +02:00
Eugene Burmakin
6a6c3c938f Fix distance calculation 2025-07-21 19:00:28 +02:00
Eugene Burmakin
59a4d760bf Fix owntracks points creation 2025-07-21 18:59:13 +02:00
Aljoscha Grebe
543242cdf3
remove useless assignments 2025-07-15 12:48:26 +02:00
Aljoscha Grebe
e5f52a6125
escape all strings is entrypoints 2025-07-15 12:48:07 +02:00
Aljoscha Grebe
8bfce7ccb6
fix: use exec in entrypoints to ensure bundler receives signals 2025-07-15 12:43:01 +02:00
11 changed files with 51 additions and 35 deletions

View file

@ -1 +1 @@
0.29.2
0.30.0

View file

@ -5,7 +5,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
# [0.29.2] - 2025-07-12
# [0.30.0] - 2025-07-21
⚠️ If you were using RC, please run the following commands in the console, otherwise read on. ⚠️
@ -73,6 +73,8 @@ end
- Swagger documentation is now valid again.
- Invalid owntracks points are now ignored.
- An older Owntrack's .rec format is now also supported.
- Course and course accuracy are now rounded to 8 decimal places to fix the issue with points creation.
# [0.29.1] - 2025-07-02

View file

@ -36,17 +36,17 @@ class MapController < ApplicationController
end
def calculate_distance
total_distance_meters = 0
total_distance = 0
@coordinates.each_cons(2) do
distance_km = Geocoder::Calculations.distance_between(
[_1[0], _1[1]], [_2[0], _2[1]], units: :km
)
total_distance_meters += distance_km
total_distance += distance_km
end
total_distance_meters.round
total_distance.round
end
def parsed_start_at

View file

@ -9,8 +9,12 @@ class OwnTracks::RecParser
def call
file.split("\n").map do |line|
# Try tab-separated first, then fall back to whitespace-separated
parts = line.split("\t")
# If tab splitting didn't work (only 1 part), try whitespace splitting
parts = line.split(/\s+/) if parts.size == 1
Oj.load(parts[2]) if parts.size > 2 && parts[1].strip == '*'
end.compact
end

View file

@ -10,18 +10,11 @@ echo "⚠️ Starting Sidekiq in $RAILS_ENV environment ⚠️"
# Parse DATABASE_URL if present, otherwise use individual variables
if [ -n "$DATABASE_URL" ]; then
# Extract components from DATABASE_URL
DATABASE_HOST=$(echo $DATABASE_URL | awk -F[@/] '{print $4}')
DATABASE_PORT=$(echo $DATABASE_URL | awk -F[@/:] '{print $5}')
DATABASE_USERNAME=$(echo $DATABASE_URL | awk -F[:/@] '{print $4}')
DATABASE_PASSWORD=$(echo $DATABASE_URL | awk -F[:/@] '{print $5}')
DATABASE_NAME=$(echo $DATABASE_URL | awk -F[@/] '{print $5}')
else
# Use existing environment variables
DATABASE_HOST=${DATABASE_HOST}
DATABASE_PORT=${DATABASE_PORT}
DATABASE_USERNAME=${DATABASE_USERNAME}
DATABASE_PASSWORD=${DATABASE_PASSWORD}
DATABASE_NAME=${DATABASE_NAME}
DATABASE_HOST="$(echo "$DATABASE_URL" | awk -F[@/] '{print $4}')"
DATABASE_PORT="$(echo "$DATABASE_URL" | awk -F[@/:] '{print $5}')"
DATABASE_USERNAME="$(echo "$DATABASE_URL" | awk -F[:/@] '{print $4}')"
DATABASE_PASSWORD="$(echo "$DATABASE_URL" | awk -F[:/@] '{print $5}')"
DATABASE_NAME="$(echo "$DATABASE_URL" | awk -F[@/] '{print $5}')"
fi
# Wait for the database to become available
@ -33,4 +26,4 @@ done
echo "✅ PostgreSQL is ready!"
# run sidekiq
bundle exec sidekiq
exec bundle exec sidekiq

View file

@ -10,18 +10,11 @@ echo "⚠️ Starting Rails environment: $RAILS_ENV ⚠️"
# Parse DATABASE_URL if present, otherwise use individual variables
if [ -n "$DATABASE_URL" ]; then
# Extract components from DATABASE_URL
DATABASE_HOST=$(echo $DATABASE_URL | awk -F[@/] '{print $4}')
DATABASE_PORT=$(echo $DATABASE_URL | awk -F[@/:] '{print $5}')
DATABASE_USERNAME=$(echo $DATABASE_URL | awk -F[:/@] '{print $4}')
DATABASE_PASSWORD=$(echo $DATABASE_URL | awk -F[:/@] '{print $5}')
DATABASE_NAME=$(echo $DATABASE_URL | awk -F[@/] '{print $5}')
else
# Use existing environment variables
DATABASE_HOST=${DATABASE_HOST}
DATABASE_PORT=${DATABASE_PORT}
DATABASE_USERNAME=${DATABASE_USERNAME}
DATABASE_PASSWORD=${DATABASE_PASSWORD}
DATABASE_NAME=${DATABASE_NAME}
DATABASE_HOST="$(echo "$DATABASE_URL" | awk -F[@/] '{print $4}')"
DATABASE_PORT="$(echo "$DATABASE_URL" | awk -F[@/:] '{print $5}')"
DATABASE_USERNAME="$(echo "$DATABASE_URL" | awk -F[:/@] '{print $4}')"
DATABASE_PASSWORD="$(echo "$DATABASE_URL" | awk -F[:/@] '{print $5}')"
DATABASE_NAME="$(echo "$DATABASE_URL" | awk -F[@/] '{print $5}')"
fi
# Export main database variables to ensure they're available
@ -32,7 +25,7 @@ export DATABASE_PASSWORD
export DATABASE_NAME
# Remove pre-existing puma/passenger server.pid
rm -f $APP_PATH/tmp/pids/server.pid
rm -f "$APP_PATH/tmp/pids/server.pid"
# Function to check and create a PostgreSQL database
create_database() {
@ -75,4 +68,4 @@ echo "Running seeds..."
bundle exec rails db:seed
# run passed commands
bundle exec ${@}
exec bundle exec "${@}"

View file

@ -13,7 +13,7 @@ FactoryBot.define do
settings do
{
'route_opacity' => '50',
'route_opacity' => 60,
'meters_between_routes' => '500',
'minutes_between_routes' => '30',
'fog_of_war_meters' => '100',

View file

@ -0,0 +1,10 @@
2023-02-20T18:46:22Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918783,"lat":22.0687934,"lon":24.7941786,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918782,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:25Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":13,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918785,"lat":22.0687967,"lon":24.7941813,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918785,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:25Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":13,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918790,"lat":22.0687967,"lon":24.7941813,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918785,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:35Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918795,"lat":22.0687906,"lon":24.794195,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918795,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:40Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918800,"lat":22.0687967,"lon":24.7941859,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918800,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:45Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918805,"lat":22.0687946,"lon":24.7941883,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918805,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:50Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918810,"lat":22.0687912,"lon":24.7941837,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918810,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:55Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918815,"lat":22.0687927,"lon":24.794186,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918815,"vac":0,"vel":0,"_http":true}
2023-02-20T18:46:55Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918815,"lat":22.0687937,"lon":24.794186,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918815,"vac":0,"vel":0,"_http":true}
2023-02-20T18:47:00Z * {"_type":"location","BSSID":"6c:c4:9f:e0:bb:b1","SSID":"WiFi","acc":14,"alt":136,"batt":38,"bs":1,"conn":"w","created_at":1676918820,"lat":22.0687937,"lon":24.794186,"m":2,"tid":"l6","topic":"owntracks/pixel6/pixel99","tst":1676918820,"vac":0,"vel":0,"_http":true}

View file

@ -92,7 +92,7 @@ RSpec.describe TrackSerializer do
let(:track) { create(:track, user: user, original_path: 'LINESTRING(0 0, 1 1, 2 2)') }
it 'converts geometry to WKT string format' do
expect(serialized_track[:original_path]).to eq('LINESTRING (0 0, 1 1, 2 2)')
expect(serialized_track[:original_path]).to match(/LINESTRING \(0(\.0)? 0(\.0)?, 1(\.0)? 1(\.0)?, 2(\.0)? 2(\.0)?\)/)
expect(serialized_track[:original_path]).to be_a(String)
end
end

View file

@ -78,5 +78,19 @@ RSpec.describe OwnTracks::Importer do
expect(Point.first.velocity).to eq('1.4')
end
end
context 'when file is old' do
let(:file_path) { Rails.root.join('spec/fixtures/files/owntracks/2023-02_old.rec') }
it 'creates points' do
expect { parser }.to change { Point.count }.by(9)
end
it 'correctly writes attributes' do
parser
point = Point.first
end
end
end
end

View file

@ -447,7 +447,7 @@ RSpec.describe 'Map Interaction', type: :system do
# Find and update route opacity
within('.leaflet-settings-panel') do
opacity_input = find('#route-opacity')
expect(opacity_input.value).to eq('50') # Default value
expect(opacity_input.value).to eq('60') # Default value
# Change opacity to 80%
opacity_input.fill_in(with: '80')