git-fit 0.1.1 → 0.4.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/git-fit.rb +42 -0
- data/lib/git_fit/cli/export.rb +25 -0
- data/lib/git_fit/cli.rb +47 -0
- data/lib/git_fit/db/activity.rb +15 -0
- data/lib/git_fit/db/cli.rb +16 -0
- data/lib/git_fit/db/connection.rb +27 -0
- data/lib/git_fit/export/defaults.rb +29 -0
- data/lib/git_fit/export/json.rb +112 -0
- data/lib/git_fit/export.rb +7 -0
- data/lib/git_fit/fit/decoder.rb +27 -0
- data/lib/git_fit/fit.rb +1 -0
- data/lib/git_fit/geo/coord_transform.rb +101 -0
- data/lib/git_fit/geo/polyline.rb +78 -0
- data/lib/git_fit/geo.rb +7 -0
- data/lib/git_fit/parser/base.rb +128 -0
- data/lib/git_fit/parser/fit.rb +69 -0
- data/lib/git_fit/parser/gpx.rb +80 -0
- data/lib/git_fit/parser/tcx.rb +89 -0
- data/lib/git_fit/parser.rb +9 -0
- data/lib/git_fit/privacy/polyline_filter.rb +79 -0
- data/lib/git_fit/source/base.rb +155 -0
- data/lib/git_fit/source/tally.rb +55 -0
- data/lib/git_fit/source.rb +7 -0
- data/lib/git_fit/sport_mapper.rb +80 -0
- data/lib/git_fit/timezone/resolver.rb +20 -0
- data/lib/git_fit/version.rb +1 -1
- metadata +94 -1
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module GitFit
|
|
2
|
+
module SportMapper
|
|
3
|
+
ALIASES = {
|
|
4
|
+
"running" => "run", "trailrun" => "run", "trail_run" => "run",
|
|
5
|
+
"virtualrun" => "run", "virtual_run" => "run",
|
|
6
|
+
"indoorrun" => "run", "indoor_run" => "run",
|
|
7
|
+
"cycling" => "ride", "biking" => "ride",
|
|
8
|
+
"mountainbike" => "ride", "gravelride" => "ride", "ebikeride" => "ride",
|
|
9
|
+
"virtualride" => "ride", "virtual_ride" => "ride",
|
|
10
|
+
"indoor_ride" => "ride", "indoorride" => "ride",
|
|
11
|
+
"hiking" => "hike",
|
|
12
|
+
"walking" => "walk",
|
|
13
|
+
"swimming" => "swim",
|
|
14
|
+
"skiing" => "ski", "backcountryski" => "ski", "nordicski" => "ski",
|
|
15
|
+
"strengthtraining" => "workout"
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
KEYWORDS = [
|
|
19
|
+
[/\b(?:run|jog|sprint|marathon)\w*\b/i, "run"],
|
|
20
|
+
[/\b(?:ride|cycl|bike|mountain\.?bike|gravel|ebike)\w*\b/i, "ride"],
|
|
21
|
+
[/\b(?:hike|climb|mountaineer|trek)\w*\b/i, "hike"],
|
|
22
|
+
[/\b(?:walk|stroll)\w*\b/i, "walk"],
|
|
23
|
+
[/\b(?:swim|pool|laps?)\w*\b/i, "swim"],
|
|
24
|
+
[/\b(?:ski|snowboard|nordic)\w*\b/i, "ski"],
|
|
25
|
+
[/\b(?:workout|train|gym|fitness|yoga|pilates|crossfit|elliptical|strength)\w*\b/i, "workout"]
|
|
26
|
+
].freeze
|
|
27
|
+
|
|
28
|
+
LEV_REFERENCES = %w[
|
|
29
|
+
running run trailrun trail_run virtualrun virtual_run indoorrun indoor_run
|
|
30
|
+
cycling ride biking mountainbike gravelride ebikeride
|
|
31
|
+
virtualride virtual_ride indoor_ride indoorride
|
|
32
|
+
hiking hike walking walk swimming swim skiing ski
|
|
33
|
+
workout strengthtraining training elliptical cardio functional
|
|
34
|
+
].freeze
|
|
35
|
+
|
|
36
|
+
LEV_THRESHOLD = 3
|
|
37
|
+
|
|
38
|
+
def self.canonicalize(str)
|
|
39
|
+
return "other" if str.nil? || str.empty?
|
|
40
|
+
key = str.to_s.downcase.strip
|
|
41
|
+
return ALIASES[key] if ALIASES.key?(key)
|
|
42
|
+
KEYWORDS.each { |regex, sport| return sport if regex.match?(str) }
|
|
43
|
+
best = lev_match(key)
|
|
44
|
+
return best if best
|
|
45
|
+
"other"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def self.lev_match(str)
|
|
49
|
+
best = nil
|
|
50
|
+
best_dist = Float::INFINITY
|
|
51
|
+
LEV_REFERENCES.each do |ref|
|
|
52
|
+
dist = levenshtein(str, ref)
|
|
53
|
+
if dist < best_dist
|
|
54
|
+
best_dist = dist
|
|
55
|
+
best = ref
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
return nil if best_dist > LEV_THRESHOLD
|
|
59
|
+
ALIASES[best] || best
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.levenshtein(a, b)
|
|
63
|
+
n, m = a.length, b.length
|
|
64
|
+
return m if n == 0
|
|
65
|
+
return n if m == 0
|
|
66
|
+
cur = (0..m).to_a
|
|
67
|
+
(1..n).each do |i|
|
|
68
|
+
prev = cur[0]
|
|
69
|
+
cur[0] = i
|
|
70
|
+
(1..m).each do |j|
|
|
71
|
+
tmp = cur[j]
|
|
72
|
+
cost = a[i - 1] == b[j - 1] ? 0 : 1
|
|
73
|
+
cur[j] = [cur[j] + 1, cur[j - 1] + 1, prev + cost].min
|
|
74
|
+
prev = tmp
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
cur[m]
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require "timezone_finder"
|
|
2
|
+
|
|
3
|
+
module GitFit
|
|
4
|
+
module Timezone
|
|
5
|
+
class Resolver
|
|
6
|
+
def initialize(config, finder: nil)
|
|
7
|
+
default = config.is_a?(Hash) ? config.dig("system", "timezone") : config
|
|
8
|
+
@finder = finder || TimezoneFinder.create
|
|
9
|
+
@default = default || "Asia/Shanghai"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def resolve(lat, lng)
|
|
13
|
+
return @default unless lat && lng
|
|
14
|
+
tz = @finder.timezone_at(lat: lat.to_f, lng: lng.to_f)
|
|
15
|
+
tz = nil if tz.is_a?(String) && tz.empty?
|
|
16
|
+
tz || @default
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/git_fit/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: git-fit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Lax
|
|
@@ -23,6 +23,76 @@ dependencies:
|
|
|
23
23
|
- - "~>"
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: '1.3'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: sequel
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '5.0'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '5.0'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: sqlite3
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '2.0'
|
|
47
|
+
type: :runtime
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '2.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: nokogiri
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - "~>"
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '1.16'
|
|
61
|
+
type: :runtime
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - "~>"
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.16'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: mini_racer
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - "~>"
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '0.12'
|
|
75
|
+
type: :runtime
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - "~>"
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0.12'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: timezone_finder
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '1.5'
|
|
89
|
+
type: :runtime
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '1.5'
|
|
26
96
|
description: A git extension CLI for aggregating, managing, and exporting fitness
|
|
27
97
|
activity data from multiple sources (Garmin, Strava, Keep, etc.)
|
|
28
98
|
email:
|
|
@@ -35,10 +105,33 @@ files:
|
|
|
35
105
|
- exe/git-fit
|
|
36
106
|
- lib/git-fit.rb
|
|
37
107
|
- lib/git_fit/cli.rb
|
|
108
|
+
- lib/git_fit/cli/export.rb
|
|
38
109
|
- lib/git_fit/config.rb
|
|
39
110
|
- lib/git_fit/config_template.rb
|
|
111
|
+
- lib/git_fit/db/activity.rb
|
|
112
|
+
- lib/git_fit/db/cli.rb
|
|
113
|
+
- lib/git_fit/db/connection.rb
|
|
114
|
+
- lib/git_fit/export.rb
|
|
115
|
+
- lib/git_fit/export/defaults.rb
|
|
116
|
+
- lib/git_fit/export/json.rb
|
|
117
|
+
- lib/git_fit/fit.rb
|
|
118
|
+
- lib/git_fit/fit/decoder.rb
|
|
119
|
+
- lib/git_fit/geo.rb
|
|
120
|
+
- lib/git_fit/geo/coord_transform.rb
|
|
121
|
+
- lib/git_fit/geo/polyline.rb
|
|
122
|
+
- lib/git_fit/parser.rb
|
|
123
|
+
- lib/git_fit/parser/base.rb
|
|
124
|
+
- lib/git_fit/parser/fit.rb
|
|
125
|
+
- lib/git_fit/parser/gpx.rb
|
|
126
|
+
- lib/git_fit/parser/tcx.rb
|
|
127
|
+
- lib/git_fit/privacy/polyline_filter.rb
|
|
128
|
+
- lib/git_fit/source.rb
|
|
129
|
+
- lib/git_fit/source/base.rb
|
|
130
|
+
- lib/git_fit/source/tally.rb
|
|
131
|
+
- lib/git_fit/sport_mapper.rb
|
|
40
132
|
- lib/git_fit/sync/base.rb
|
|
41
133
|
- lib/git_fit/sync/strava.rb
|
|
134
|
+
- lib/git_fit/timezone/resolver.rb
|
|
42
135
|
- lib/git_fit/version.rb
|
|
43
136
|
homepage: https://github.com/Lax/git-fit
|
|
44
137
|
licenses:
|