fit_kit 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cfc4c2435b6e655fe41d4e467e373b5b282eaab6f738922d1d5a93721c8adaaa
4
+ data.tar.gz: a1ab87078789a8e83fc13d9f2ee39bf4e060d35f2b290adbadd95e4def05afcf
5
+ SHA512:
6
+ metadata.gz: 2c25a7c3cb74581d959c406c89fa8a1df686c7632e52c52cab58c3b3a9bd1771e90ef7b0d2c67ae386e21a12d45eed52759dd951bc14b8b2a8622877d88d095c
7
+ data.tar.gz: bc93a12200a50dd2d7cdaf4e9eaf165a7308ca59e83640ac26cd4b701305cda9a9b0e7908b885a7d55d4ec1281c5dc62db0b5ffbd57705ff1f8153c4ddb1ce4e
data/.standard.yml ADDED
@@ -0,0 +1,3 @@
1
+ # For available configuration options, see:
2
+ # https://github.com/standardrb/standard
3
+ ruby_version: 3.0
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2024-10-14
4
+
5
+ - Initial release
@@ -0,0 +1,132 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the overall
26
+ community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official email address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ [INSERT CONTACT METHOD].
64
+ All complaints will be reviewed and investigated promptly and fairly.
65
+
66
+ All community leaders are obligated to respect the privacy and security of the
67
+ reporter of any incident.
68
+
69
+ ## Enforcement Guidelines
70
+
71
+ Community leaders will follow these Community Impact Guidelines in determining
72
+ the consequences for any action they deem in violation of this Code of Conduct:
73
+
74
+ ### 1. Correction
75
+
76
+ **Community Impact**: Use of inappropriate language or other behavior deemed
77
+ unprofessional or unwelcome in the community.
78
+
79
+ **Consequence**: A private, written warning from community leaders, providing
80
+ clarity around the nature of the violation and an explanation of why the
81
+ behavior was inappropriate. A public apology may be requested.
82
+
83
+ ### 2. Warning
84
+
85
+ **Community Impact**: A violation through a single incident or series of
86
+ actions.
87
+
88
+ **Consequence**: A warning with consequences for continued behavior. No
89
+ interaction with the people involved, including unsolicited interaction with
90
+ those enforcing the Code of Conduct, for a specified period of time. This
91
+ includes avoiding interactions in community spaces as well as external channels
92
+ like social media. Violating these terms may lead to a temporary or permanent
93
+ ban.
94
+
95
+ ### 3. Temporary Ban
96
+
97
+ **Community Impact**: A serious violation of community standards, including
98
+ sustained inappropriate behavior.
99
+
100
+ **Consequence**: A temporary ban from any sort of interaction or public
101
+ communication with the community for a specified period of time. No public or
102
+ private interaction with the people involved, including unsolicited interaction
103
+ with those enforcing the Code of Conduct, is allowed during this period.
104
+ Violating these terms may lead to a permanent ban.
105
+
106
+ ### 4. Permanent Ban
107
+
108
+ **Community Impact**: Demonstrating a pattern of violation of community
109
+ standards, including sustained inappropriate behavior, harassment of an
110
+ individual, or aggression toward or disparagement of classes of individuals.
111
+
112
+ **Consequence**: A permanent ban from any sort of public interaction within the
113
+ community.
114
+
115
+ ## Attribution
116
+
117
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118
+ version 2.1, available at
119
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120
+
121
+ Community Impact Guidelines were inspired by
122
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123
+
124
+ For answers to common questions about this code of conduct, see the FAQ at
125
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126
+ [https://www.contributor-covenant.org/translations][translations].
127
+
128
+ [homepage]: https://www.contributor-covenant.org
129
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130
+ [Mozilla CoC]: https://github.com/mozilla/diversity
131
+ [FAQ]: https://www.contributor-covenant.org/faq
132
+ [translations]: https://www.contributor-covenant.org/translations
data/Cargo.lock ADDED
@@ -0,0 +1,553 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ version = 3
4
+
5
+ [[package]]
6
+ name = "aho-corasick"
7
+ version = "1.1.3"
8
+ source = "registry+https://github.com/rust-lang/crates.io-index"
9
+ checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
10
+ dependencies = [
11
+ "memchr",
12
+ ]
13
+
14
+ [[package]]
15
+ name = "android-tzdata"
16
+ version = "0.1.1"
17
+ source = "registry+https://github.com/rust-lang/crates.io-index"
18
+ checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
19
+
20
+ [[package]]
21
+ name = "android_system_properties"
22
+ version = "0.1.5"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
25
+ dependencies = [
26
+ "libc",
27
+ ]
28
+
29
+ [[package]]
30
+ name = "autocfg"
31
+ version = "1.4.0"
32
+ source = "registry+https://github.com/rust-lang/crates.io-index"
33
+ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
34
+
35
+ [[package]]
36
+ name = "bindgen"
37
+ version = "0.69.5"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088"
40
+ dependencies = [
41
+ "bitflags",
42
+ "cexpr",
43
+ "clang-sys",
44
+ "itertools",
45
+ "lazy_static",
46
+ "lazycell",
47
+ "proc-macro2",
48
+ "quote",
49
+ "regex",
50
+ "rustc-hash",
51
+ "shlex",
52
+ "syn",
53
+ ]
54
+
55
+ [[package]]
56
+ name = "bitflags"
57
+ version = "2.6.0"
58
+ source = "registry+https://github.com/rust-lang/crates.io-index"
59
+ checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de"
60
+
61
+ [[package]]
62
+ name = "bumpalo"
63
+ version = "3.16.0"
64
+ source = "registry+https://github.com/rust-lang/crates.io-index"
65
+ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
66
+
67
+ [[package]]
68
+ name = "cc"
69
+ version = "1.1.30"
70
+ source = "registry+https://github.com/rust-lang/crates.io-index"
71
+ checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945"
72
+ dependencies = [
73
+ "shlex",
74
+ ]
75
+
76
+ [[package]]
77
+ name = "cexpr"
78
+ version = "0.6.0"
79
+ source = "registry+https://github.com/rust-lang/crates.io-index"
80
+ checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
81
+ dependencies = [
82
+ "nom",
83
+ ]
84
+
85
+ [[package]]
86
+ name = "cfg-if"
87
+ version = "1.0.0"
88
+ source = "registry+https://github.com/rust-lang/crates.io-index"
89
+ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
90
+
91
+ [[package]]
92
+ name = "chrono"
93
+ version = "0.4.38"
94
+ source = "registry+https://github.com/rust-lang/crates.io-index"
95
+ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
96
+ dependencies = [
97
+ "android-tzdata",
98
+ "iana-time-zone",
99
+ "js-sys",
100
+ "num-traits",
101
+ "serde",
102
+ "wasm-bindgen",
103
+ "windows-targets",
104
+ ]
105
+
106
+ [[package]]
107
+ name = "clang-sys"
108
+ version = "1.8.1"
109
+ source = "registry+https://github.com/rust-lang/crates.io-index"
110
+ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
111
+ dependencies = [
112
+ "glob",
113
+ "libc",
114
+ "libloading",
115
+ ]
116
+
117
+ [[package]]
118
+ name = "core-foundation-sys"
119
+ version = "0.8.7"
120
+ source = "registry+https://github.com/rust-lang/crates.io-index"
121
+ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
122
+
123
+ [[package]]
124
+ name = "either"
125
+ version = "1.13.0"
126
+ source = "registry+https://github.com/rust-lang/crates.io-index"
127
+ checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
128
+
129
+ [[package]]
130
+ name = "fit_kit"
131
+ version = "0.1.0"
132
+ dependencies = [
133
+ "fitparser",
134
+ "magnus",
135
+ ]
136
+
137
+ [[package]]
138
+ name = "fitparser"
139
+ version = "0.7.0"
140
+ source = "registry+https://github.com/rust-lang/crates.io-index"
141
+ checksum = "3c57b6c1de15f92aa2846a6286eefc115637405a4298eea11a65799aa4ce4177"
142
+ dependencies = [
143
+ "chrono",
144
+ "nom",
145
+ "serde",
146
+ ]
147
+
148
+ [[package]]
149
+ name = "glob"
150
+ version = "0.3.1"
151
+ source = "registry+https://github.com/rust-lang/crates.io-index"
152
+ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
153
+
154
+ [[package]]
155
+ name = "iana-time-zone"
156
+ version = "0.1.61"
157
+ source = "registry+https://github.com/rust-lang/crates.io-index"
158
+ checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220"
159
+ dependencies = [
160
+ "android_system_properties",
161
+ "core-foundation-sys",
162
+ "iana-time-zone-haiku",
163
+ "js-sys",
164
+ "wasm-bindgen",
165
+ "windows-core",
166
+ ]
167
+
168
+ [[package]]
169
+ name = "iana-time-zone-haiku"
170
+ version = "0.1.2"
171
+ source = "registry+https://github.com/rust-lang/crates.io-index"
172
+ checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
173
+ dependencies = [
174
+ "cc",
175
+ ]
176
+
177
+ [[package]]
178
+ name = "itertools"
179
+ version = "0.12.1"
180
+ source = "registry+https://github.com/rust-lang/crates.io-index"
181
+ checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
182
+ dependencies = [
183
+ "either",
184
+ ]
185
+
186
+ [[package]]
187
+ name = "js-sys"
188
+ version = "0.3.72"
189
+ source = "registry+https://github.com/rust-lang/crates.io-index"
190
+ checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9"
191
+ dependencies = [
192
+ "wasm-bindgen",
193
+ ]
194
+
195
+ [[package]]
196
+ name = "lazy_static"
197
+ version = "1.5.0"
198
+ source = "registry+https://github.com/rust-lang/crates.io-index"
199
+ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
200
+
201
+ [[package]]
202
+ name = "lazycell"
203
+ version = "1.3.0"
204
+ source = "registry+https://github.com/rust-lang/crates.io-index"
205
+ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
206
+
207
+ [[package]]
208
+ name = "libc"
209
+ version = "0.2.159"
210
+ source = "registry+https://github.com/rust-lang/crates.io-index"
211
+ checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
212
+
213
+ [[package]]
214
+ name = "libloading"
215
+ version = "0.8.5"
216
+ source = "registry+https://github.com/rust-lang/crates.io-index"
217
+ checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
218
+ dependencies = [
219
+ "cfg-if",
220
+ "windows-targets",
221
+ ]
222
+
223
+ [[package]]
224
+ name = "log"
225
+ version = "0.4.22"
226
+ source = "registry+https://github.com/rust-lang/crates.io-index"
227
+ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
228
+
229
+ [[package]]
230
+ name = "magnus"
231
+ version = "0.6.4"
232
+ source = "registry+https://github.com/rust-lang/crates.io-index"
233
+ checksum = "b1597ef40aa8c36be098249e82c9a20cf7199278ac1c1a1a995eeead6a184479"
234
+ dependencies = [
235
+ "magnus-macros",
236
+ "rb-sys",
237
+ "rb-sys-env",
238
+ "seq-macro",
239
+ ]
240
+
241
+ [[package]]
242
+ name = "magnus-macros"
243
+ version = "0.6.0"
244
+ source = "registry+https://github.com/rust-lang/crates.io-index"
245
+ checksum = "5968c820e2960565f647819f5928a42d6e874551cab9d88d75e3e0660d7f71e3"
246
+ dependencies = [
247
+ "proc-macro2",
248
+ "quote",
249
+ "syn",
250
+ ]
251
+
252
+ [[package]]
253
+ name = "memchr"
254
+ version = "2.7.4"
255
+ source = "registry+https://github.com/rust-lang/crates.io-index"
256
+ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
257
+
258
+ [[package]]
259
+ name = "minimal-lexical"
260
+ version = "0.2.1"
261
+ source = "registry+https://github.com/rust-lang/crates.io-index"
262
+ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
263
+
264
+ [[package]]
265
+ name = "nom"
266
+ version = "7.1.3"
267
+ source = "registry+https://github.com/rust-lang/crates.io-index"
268
+ checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
269
+ dependencies = [
270
+ "memchr",
271
+ "minimal-lexical",
272
+ ]
273
+
274
+ [[package]]
275
+ name = "num-traits"
276
+ version = "0.2.19"
277
+ source = "registry+https://github.com/rust-lang/crates.io-index"
278
+ checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
279
+ dependencies = [
280
+ "autocfg",
281
+ ]
282
+
283
+ [[package]]
284
+ name = "once_cell"
285
+ version = "1.20.2"
286
+ source = "registry+https://github.com/rust-lang/crates.io-index"
287
+ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
288
+
289
+ [[package]]
290
+ name = "proc-macro2"
291
+ version = "1.0.87"
292
+ source = "registry+https://github.com/rust-lang/crates.io-index"
293
+ checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
294
+ dependencies = [
295
+ "unicode-ident",
296
+ ]
297
+
298
+ [[package]]
299
+ name = "quote"
300
+ version = "1.0.37"
301
+ source = "registry+https://github.com/rust-lang/crates.io-index"
302
+ checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
303
+ dependencies = [
304
+ "proc-macro2",
305
+ ]
306
+
307
+ [[package]]
308
+ name = "rb-sys"
309
+ version = "0.9.102"
310
+ source = "registry+https://github.com/rust-lang/crates.io-index"
311
+ checksum = "df4dec4b1d304c3b308a2cd86b1216ea45dd4361f4e9fa056f108332d0a450c1"
312
+ dependencies = [
313
+ "rb-sys-build",
314
+ ]
315
+
316
+ [[package]]
317
+ name = "rb-sys-build"
318
+ version = "0.9.102"
319
+ source = "registry+https://github.com/rust-lang/crates.io-index"
320
+ checksum = "1d71de3e29d174b8fb17b5d4470f27d7aa2605f8a9d05fda0d3aeff30e05a570"
321
+ dependencies = [
322
+ "bindgen",
323
+ "lazy_static",
324
+ "proc-macro2",
325
+ "quote",
326
+ "regex",
327
+ "shell-words",
328
+ "syn",
329
+ ]
330
+
331
+ [[package]]
332
+ name = "rb-sys-env"
333
+ version = "0.1.2"
334
+ source = "registry+https://github.com/rust-lang/crates.io-index"
335
+ checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
336
+
337
+ [[package]]
338
+ name = "regex"
339
+ version = "1.11.0"
340
+ source = "registry+https://github.com/rust-lang/crates.io-index"
341
+ checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8"
342
+ dependencies = [
343
+ "aho-corasick",
344
+ "memchr",
345
+ "regex-automata",
346
+ "regex-syntax",
347
+ ]
348
+
349
+ [[package]]
350
+ name = "regex-automata"
351
+ version = "0.4.8"
352
+ source = "registry+https://github.com/rust-lang/crates.io-index"
353
+ checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3"
354
+ dependencies = [
355
+ "aho-corasick",
356
+ "memchr",
357
+ "regex-syntax",
358
+ ]
359
+
360
+ [[package]]
361
+ name = "regex-syntax"
362
+ version = "0.8.5"
363
+ source = "registry+https://github.com/rust-lang/crates.io-index"
364
+ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
365
+
366
+ [[package]]
367
+ name = "rustc-hash"
368
+ version = "1.1.0"
369
+ source = "registry+https://github.com/rust-lang/crates.io-index"
370
+ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
371
+
372
+ [[package]]
373
+ name = "seq-macro"
374
+ version = "0.3.5"
375
+ source = "registry+https://github.com/rust-lang/crates.io-index"
376
+ checksum = "a3f0bf26fd526d2a95683cd0f87bf103b8539e2ca1ef48ce002d67aad59aa0b4"
377
+
378
+ [[package]]
379
+ name = "serde"
380
+ version = "1.0.210"
381
+ source = "registry+https://github.com/rust-lang/crates.io-index"
382
+ checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
383
+ dependencies = [
384
+ "serde_derive",
385
+ ]
386
+
387
+ [[package]]
388
+ name = "serde_derive"
389
+ version = "1.0.210"
390
+ source = "registry+https://github.com/rust-lang/crates.io-index"
391
+ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
392
+ dependencies = [
393
+ "proc-macro2",
394
+ "quote",
395
+ "syn",
396
+ ]
397
+
398
+ [[package]]
399
+ name = "shell-words"
400
+ version = "1.1.0"
401
+ source = "registry+https://github.com/rust-lang/crates.io-index"
402
+ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde"
403
+
404
+ [[package]]
405
+ name = "shlex"
406
+ version = "1.3.0"
407
+ source = "registry+https://github.com/rust-lang/crates.io-index"
408
+ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
409
+
410
+ [[package]]
411
+ name = "syn"
412
+ version = "2.0.79"
413
+ source = "registry+https://github.com/rust-lang/crates.io-index"
414
+ checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
415
+ dependencies = [
416
+ "proc-macro2",
417
+ "quote",
418
+ "unicode-ident",
419
+ ]
420
+
421
+ [[package]]
422
+ name = "unicode-ident"
423
+ version = "1.0.13"
424
+ source = "registry+https://github.com/rust-lang/crates.io-index"
425
+ checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
426
+
427
+ [[package]]
428
+ name = "wasm-bindgen"
429
+ version = "0.2.95"
430
+ source = "registry+https://github.com/rust-lang/crates.io-index"
431
+ checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e"
432
+ dependencies = [
433
+ "cfg-if",
434
+ "once_cell",
435
+ "wasm-bindgen-macro",
436
+ ]
437
+
438
+ [[package]]
439
+ name = "wasm-bindgen-backend"
440
+ version = "0.2.95"
441
+ source = "registry+https://github.com/rust-lang/crates.io-index"
442
+ checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358"
443
+ dependencies = [
444
+ "bumpalo",
445
+ "log",
446
+ "once_cell",
447
+ "proc-macro2",
448
+ "quote",
449
+ "syn",
450
+ "wasm-bindgen-shared",
451
+ ]
452
+
453
+ [[package]]
454
+ name = "wasm-bindgen-macro"
455
+ version = "0.2.95"
456
+ source = "registry+https://github.com/rust-lang/crates.io-index"
457
+ checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56"
458
+ dependencies = [
459
+ "quote",
460
+ "wasm-bindgen-macro-support",
461
+ ]
462
+
463
+ [[package]]
464
+ name = "wasm-bindgen-macro-support"
465
+ version = "0.2.95"
466
+ source = "registry+https://github.com/rust-lang/crates.io-index"
467
+ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68"
468
+ dependencies = [
469
+ "proc-macro2",
470
+ "quote",
471
+ "syn",
472
+ "wasm-bindgen-backend",
473
+ "wasm-bindgen-shared",
474
+ ]
475
+
476
+ [[package]]
477
+ name = "wasm-bindgen-shared"
478
+ version = "0.2.95"
479
+ source = "registry+https://github.com/rust-lang/crates.io-index"
480
+ checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d"
481
+
482
+ [[package]]
483
+ name = "windows-core"
484
+ version = "0.52.0"
485
+ source = "registry+https://github.com/rust-lang/crates.io-index"
486
+ checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
487
+ dependencies = [
488
+ "windows-targets",
489
+ ]
490
+
491
+ [[package]]
492
+ name = "windows-targets"
493
+ version = "0.52.6"
494
+ source = "registry+https://github.com/rust-lang/crates.io-index"
495
+ checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
496
+ dependencies = [
497
+ "windows_aarch64_gnullvm",
498
+ "windows_aarch64_msvc",
499
+ "windows_i686_gnu",
500
+ "windows_i686_gnullvm",
501
+ "windows_i686_msvc",
502
+ "windows_x86_64_gnu",
503
+ "windows_x86_64_gnullvm",
504
+ "windows_x86_64_msvc",
505
+ ]
506
+
507
+ [[package]]
508
+ name = "windows_aarch64_gnullvm"
509
+ version = "0.52.6"
510
+ source = "registry+https://github.com/rust-lang/crates.io-index"
511
+ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
512
+
513
+ [[package]]
514
+ name = "windows_aarch64_msvc"
515
+ version = "0.52.6"
516
+ source = "registry+https://github.com/rust-lang/crates.io-index"
517
+ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
518
+
519
+ [[package]]
520
+ name = "windows_i686_gnu"
521
+ version = "0.52.6"
522
+ source = "registry+https://github.com/rust-lang/crates.io-index"
523
+ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
524
+
525
+ [[package]]
526
+ name = "windows_i686_gnullvm"
527
+ version = "0.52.6"
528
+ source = "registry+https://github.com/rust-lang/crates.io-index"
529
+ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
530
+
531
+ [[package]]
532
+ name = "windows_i686_msvc"
533
+ version = "0.52.6"
534
+ source = "registry+https://github.com/rust-lang/crates.io-index"
535
+ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
536
+
537
+ [[package]]
538
+ name = "windows_x86_64_gnu"
539
+ version = "0.52.6"
540
+ source = "registry+https://github.com/rust-lang/crates.io-index"
541
+ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
542
+
543
+ [[package]]
544
+ name = "windows_x86_64_gnullvm"
545
+ version = "0.52.6"
546
+ source = "registry+https://github.com/rust-lang/crates.io-index"
547
+ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
548
+
549
+ [[package]]
550
+ name = "windows_x86_64_msvc"
551
+ version = "0.52.6"
552
+ source = "registry+https://github.com/rust-lang/crates.io-index"
553
+ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
data/Cargo.toml ADDED
@@ -0,0 +1,7 @@
1
+ # This Cargo.toml is here to let externals tools (IDEs, etc.) know that this is
2
+ # a Rust project. Your extensions dependencies should be added to the Cargo.toml
3
+ # in the ext/ directory.
4
+
5
+ [workspace]
6
+ members = ["./ext/fit_kit"]
7
+ resolver = "2"
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2024 29decibel
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # FitKit
2
+
3
+ `fit_kit` is a small ruby gem wraps Rust's crate [fitparse-rs](https://github.com/stadelmanma/fitparse-rs) to provide effecient and fast Garmin fit files parsing.
4
+
5
+ ## Installation
6
+
7
+ Install the gem and add to the application's Gemfile by executing:
8
+
9
+ $ bundle add fit_kit
10
+
11
+ If bundler is not being used to manage dependencies, install the gem by executing:
12
+
13
+ $ gem install fit_kit
14
+
15
+ ## Usage
16
+
17
+ ```ruby
18
+ test_fit_file = File.join(Dir.pwd, "example.fit")
19
+ fit_data_records = ::FitKit.parse_fit_file(test_fit_file)
20
+ # [RFitDataRecord, RFitDataRecord, RFitDataRecord ...]
21
+ ```
22
+
23
+ ## Contributing
24
+
25
+ Bug reports and pull requests are welcome on GitHub at https://github.com/29decibel/fit_kit. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/29decibel/fit_kit/blob/main/CODE_OF_CONDUCT.md).
26
+
27
+ ## License
28
+
29
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
30
+
31
+ ## Code of Conduct
32
+
33
+ Everyone interacting in the FitKit project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/29decibel/fit_kit/blob/main/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "minitest/test_task"
5
+
6
+ Minitest::TestTask.create
7
+
8
+ require "standard/rake"
9
+
10
+ require "rb_sys/extensiontask"
11
+
12
+ task build: :compile
13
+
14
+ GEMSPEC = Gem::Specification.load("fit_kit.gemspec")
15
+
16
+ RbSys::ExtensionTask.new("fit_kit", GEMSPEC) do |ext|
17
+ ext.lib_dir = "lib/fit_kit"
18
+ end
19
+
20
+ task default: %i[compile test standard]
@@ -0,0 +1,14 @@
1
+ [package]
2
+ name = "fit_kit"
3
+ version = "0.1.0"
4
+ edition = "2021"
5
+ authors = ["29decibel <m@idots.me>"]
6
+ license = "MIT"
7
+ publish = false
8
+
9
+ [lib]
10
+ crate-type = ["cdylib"]
11
+
12
+ [dependencies]
13
+ fitparser = "0.7.0"
14
+ magnus = { version = "0.6.2" }
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mkmf"
4
+ require "rb_sys/mkmf"
5
+
6
+ create_rust_makefile("fit_kit/fit_kit")
@@ -0,0 +1,113 @@
1
+ use fitparser::{self, FitDataField, FitDataRecord, Value};
2
+ use magnus::{function, method, prelude::*, Error, IntoValue, RArray, Ruby};
3
+ use std::fs::File;
4
+
5
+ ///////////////////////// RFitDataField ///////////////////////////
6
+ // define a wrapper ruby class for FitDataField
7
+ #[magnus::wrap(class = "RFitDataField")]
8
+ struct RFitDataField(FitDataField);
9
+
10
+ // recursive method to turn Fit value into magnus::Value
11
+ fn value_to_rb_value(value: &Value) -> magnus::Value {
12
+ match value {
13
+ Value::Timestamp(t) => t.timestamp().into_value(),
14
+ Value::SInt8(i) => i.into_value(),
15
+ Value::UInt8(u) => u.into_value(),
16
+ Value::SInt16(i) => i.into_value(),
17
+ Value::UInt16(u) => u.into_value(),
18
+ Value::SInt32(i) => i.into_value(),
19
+ Value::UInt32(u) => u.into_value(),
20
+ Value::String(s) => s.clone().into_value(),
21
+ Value::Float32(f) => f.into_value(),
22
+ Value::Float64(f) => f.into_value(),
23
+ Value::UInt8z(u) => u.into_value(),
24
+ Value::UInt16z(u) => u.into_value(),
25
+ Value::UInt32z(u) => u.into_value(),
26
+ Value::Byte(b) => b.into_value(),
27
+ Value::SInt64(i) => i.into_value(),
28
+ Value::UInt64(u) => u.into_value(),
29
+ Value::UInt64z(u) => u.into_value(),
30
+ Value::Enum(e) => e.into_value(),
31
+ Value::Array(arr) => {
32
+ let rb_array = RArray::new();
33
+ for value in arr {
34
+ rb_array.push(value_to_rb_value(value)).unwrap();
35
+ }
36
+ rb_array.into_value()
37
+ }
38
+ }
39
+ }
40
+
41
+ impl RFitDataField {
42
+ fn name(&self) -> String {
43
+ self.0.name().to_string()
44
+ }
45
+
46
+ fn value(&self) -> magnus::Value {
47
+ value_to_rb_value(self.0.value())
48
+ }
49
+ }
50
+
51
+ ///////////////////////// RFitDataRecord ///////////////////////////
52
+ #[magnus::wrap(class = "RFitDataRecord")]
53
+ struct RFitDataRecord(FitDataRecord);
54
+
55
+ impl RFitDataRecord {
56
+ fn kind(&self) -> String {
57
+ self.0.kind().to_string()
58
+ }
59
+
60
+ fn fields(&self) -> RArray {
61
+ let array = RArray::new();
62
+ for field in self.0.fields() {
63
+ array.push(RFitDataField(field.clone())).unwrap();
64
+ }
65
+ array
66
+ }
67
+ }
68
+
69
+ // Here we define two ruby classes
70
+ // RFitDataRecord and RFitDataField
71
+ fn define_ruby_classes(ruby: &Ruby) -> Result<(), magnus::Error> {
72
+ let class = ruby.define_class("RFitDataField", ruby.class_object())?;
73
+
74
+ // define bunch of methods
75
+ class.define_method("name", method!(RFitDataField::name, 0))?;
76
+ class.define_method("value", method!(RFitDataField::value, 0))?;
77
+
78
+ // definie the the other one here
79
+ let data_record_class = ruby.define_class("RFitDataRecord", ruby.class_object())?;
80
+ data_record_class.define_method("kind", method!(RFitDataRecord::kind, 0))?;
81
+ data_record_class.define_method("fields", method!(RFitDataRecord::fields, 0))?;
82
+
83
+ Ok(())
84
+ }
85
+
86
+ fn parse_fit_file(file_path: String) -> Result<RArray, magnus::Error> {
87
+ let mut fp = File::open(file_path)
88
+ .map_err(|e| Error::new(Ruby::get().unwrap().exception_io_error(), e.to_string()))?;
89
+ let data = fitparser::from_reader(&mut fp).map_err(|e| {
90
+ Error::new(
91
+ Ruby::get().unwrap().exception_runtime_error(),
92
+ e.to_string(),
93
+ )
94
+ })?;
95
+
96
+ // finally we have the result array of record
97
+ let array = RArray::new();
98
+ for record in data {
99
+ array.push(RFitDataRecord(record)).unwrap();
100
+ }
101
+
102
+ Ok(array)
103
+ }
104
+
105
+ #[magnus::init]
106
+ fn init(ruby: &Ruby) -> Result<(), Error> {
107
+ let module = ruby.define_module("FitKit")?;
108
+ let _ = define_ruby_classes(&ruby);
109
+
110
+ module.define_singleton_method("parse_fit_file", function!(parse_fit_file, 1))?;
111
+
112
+ Ok(())
113
+ }
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FitKit
4
+ VERSION = "0.1.0"
5
+ end
data/lib/fit_kit.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "fit_kit/version"
4
+ require_relative "fit_kit/fit_kit"
5
+
6
+ module FitKit
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
data/sig/fit_kit.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module FitKit
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fit_kit
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - 29decibel
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-10-15 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Garmin fit file parser wrapping Rust crate fitparse_rs.
14
+ email:
15
+ - m@idots.me
16
+ executables: []
17
+ extensions:
18
+ - ext/fit_kit/Cargo.toml
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ".standard.yml"
22
+ - CHANGELOG.md
23
+ - CODE_OF_CONDUCT.md
24
+ - Cargo.lock
25
+ - Cargo.toml
26
+ - LICENSE.txt
27
+ - README.md
28
+ - Rakefile
29
+ - ext/fit_kit/Cargo.toml
30
+ - ext/fit_kit/extconf.rb
31
+ - ext/fit_kit/src/lib.rs
32
+ - lib/fit_kit.rb
33
+ - lib/fit_kit/version.rb
34
+ - sig/fit_kit.rbs
35
+ homepage: https://github.com/29decibel/fit_kit
36
+ licenses:
37
+ - MIT
38
+ metadata:
39
+ allowed_push_host: https://rubygems.org
40
+ homepage_uri: https://github.com/29decibel/fit_kit
41
+ source_code_uri: https://github.com/29decibel/fit_kit
42
+ changelog_uri: https://github.com/29decibel/fit_kit/CHANGELOG.md
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: 3.0.0
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 3.3.11
57
+ requirements: []
58
+ rubygems_version: 3.5.16
59
+ signing_key:
60
+ specification_version: 4
61
+ summary: Ruby gem to parse Garmin fit file.
62
+ test_files: []