ast-tdl 0.0.3 → 0.1.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.
Files changed (8) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +21 -0
  3. data/README.md +49 -30
  4. data/lib/ast.rb +1 -2
  5. data/lib/interval.rb +60 -37
  6. data/lib/session.rb +24 -22
  7. metadata +3 -3
  8. data/lib/classes.rb +0 -148
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: acbbd1f514fbcdc7f7c30925602170f3ebe829f688dbf3e562488f9fc88ed87f
4
- data.tar.gz: 554f179dec696c7d330acb1884aed681f88f1a03923bd4353eef68bd9ddb2b81
3
+ metadata.gz: 7e1cae6b9c56c969808cd16ff2d58ec838db46745cf3f6b9b1eb3583536ad93b
4
+ data.tar.gz: '0841bfa32e170d22ec587d027086ce4816a86d8116627c8f365000010ebd224a'
5
5
  SHA512:
6
- metadata.gz: 2ffa95b47ee68c9091883a974fc84c3c91143594948bd22459a5d462209c877ee9f00919ca1e055b925d8ff35d8f6262f9f40f6e525b4cf9c8931d9827a923ec
7
- data.tar.gz: 995761ca6d201f99b4cf9f3fc061279e5332b197b83161e52fa0792a7af3f1d7f4434f4eef4e3d9e3552fdb87cdda0881dd075d9fc380c07f10339d36b462e78
6
+ metadata.gz: 179ff4d41c5e51f81f2298bd6363fdbd58afe24b729274a4fc50eb04ffacb3eec453726da1817f4995c55d9923d5202e15c1083f5a7e762993fb7aab08edba48
7
+ data.tar.gz: 9e644b6a2f48ec60038a31c503a7d65fbfa4cc8bc89c19f8e9f2da31700f6299794eb292f37cfc2df72b05c9c8d92f8beb420f94c779055761d5fabfe9ca154c
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Iztok Fister Jr.
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 all
13
+ 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 THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Training Description Language (TDL) for Artificial Sport Trainer (AST)
2
+
3
+ ## Motivation
2
4
  ast-dsl is intended to be a small DSL for practical definition and description of sports training that can be automatically or manually defined and used in conjunction with Artificial Sport Trainer.
3
5
 
6
+ ## Feature diagram
7
+ ![scheme](https://user-images.githubusercontent.com/73126820/177509075-977b2e18-ebb7-40ce-9af9-ed7715717bf3.png)
8
+
4
9
  ## Installation
5
10
  $ gem install ast-tdl
6
11
 
@@ -9,40 +14,54 @@ Training Description Language (TDL) is implemented in Ruby. Currently, the descr
9
14
 
10
15
  ## Examples
11
16
  ```ruby
12
- EasyTraining = Ast.build :Monday do
13
- session("Short swimming session today") {
14
- sport :"swim"
15
- info :"Very easy training"
16
- average_heart_rate :"130"
17
- total_duration :"30"
18
- }
19
-
20
- session("Bike ride") {
21
- sport :"bike"
22
- info :"Endurance ride with intervals"
23
- average_heart_rate :"140"
24
- total_duration :"250"
25
- }
26
-
27
- interval("Number 1") {
28
- sport :"swim"
29
- info :"Moderate"
30
- average_heart_rate :"160"
31
- total_duration :"5"
32
- average_heart_rate_rest :"90"
33
- total_duration_rest :"2"
34
- }
17
+ Ast.build('My first training') do
18
+ session('Short swimming session') do
19
+ sport :swim
20
+ info :"Very easy training"
21
+ average_heart_rate :"130"
22
+ total_duration :"30"
23
+ end
24
+
25
+ session('Bike ride') do
26
+ sport :cycling
27
+ info :"Endurance ride with intervals"
28
+ average_heart_rate :"140"
29
+ total_duration :"120"
30
+ end
31
+
32
+ interval('Sample interval') do
33
+ sport :cycling
34
+ info :Moderate
35
+ speed_duration :"5"
36
+ recovery_duration :"5"
37
+ speed_heart_rate :"180"
38
+ recovery_heart_rate :"90"
39
+ repetitions :"10"
40
+ end
35
41
  end
36
42
  ```
37
43
 
38
44
  ### Session
39
45
  ```ruby
40
- session("Short swimming session today") {
41
- sport :"swim"
42
- info :"Very easy training"
43
- average_heart_rate :"130"
44
- total_duration :"30"
45
- }
46
+ session('Bike ride') do
47
+ sport :cycling
48
+ info :"Endurance ride with intervals"
49
+ average_heart_rate :"140"
50
+ total_duration :"120"
51
+ end
52
+ ```
53
+
54
+ ### Interval
55
+ ```ruby
56
+ interval('Sample interval') do
57
+ sport :cycling
58
+ info :Moderate
59
+ speed_duration :"5"
60
+ recovery_duration :"5"
61
+ speed_heart_rate :"180"
62
+ recovery_heart_rate :"90"
63
+ repetitions :"10"
64
+ end
46
65
  ```
47
66
 
48
67
  ## License
@@ -53,4 +72,4 @@ This framework is provided as-is, and there are no guarantees that it fits your
53
72
 
54
73
  ## References
55
74
 
56
- Fister Jr, I., Fister, I., Iglesias, A., Galvez, A., Deb, S., & Fister, D. (2021). On deploying the Artificial Sport Trainer into practice. arXiv preprint [arXiv:2109.13334](https://arxiv.org/abs/2109.13334).
75
+ Fister Jr, I., Fister, I., Iglesias, A., Galvez, A., Deb, S., & Fister, D. (2021). On deploying the Artificial Sport Trainer into practice. arXiv preprint [arXiv:2109.13334](https://arxiv.org/abs/2109.13334).
data/lib/ast.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'json'
4
- require_relative 'classes'
5
4
  require_relative 'interval'
6
5
  require_relative 'session'
7
6
 
@@ -69,7 +68,7 @@ module Ast
69
68
  session: @session.collect(&:to_hash),
70
69
  interval: @interval.collect(&:to_hash)
71
70
  }
72
- training_json.to_json
71
+ JSON.pretty_generate(training_json)
73
72
  end
74
73
 
75
74
  ##
data/lib/interval.rb CHANGED
@@ -7,81 +7,104 @@ class Interval
7
7
  # Initialization method for the +Interval+ class.
8
8
  # Params:
9
9
  # +name+:: the name of the interval
10
- def initialize(_name)
11
- @name = []
12
- @sport = []
13
- @info = []
14
- @average_heart_rate = []
15
- @total_duration = []
16
- @average_heart_rate_rest = []
17
- @total_duration_rest = []
10
+ def initialize(name)
11
+ @name = name
12
+ @sport = ''
13
+ @info = ''
14
+ @speed_duration = 0
15
+ @recovery_duration = 0
16
+ @speed_heart_rate = 0
17
+ @recovery_heart_rate = 0
18
+ @repetitions = 0
19
+ @type = ''
18
20
  end
19
21
 
20
22
  ##
21
- # Building a new Sport object.
23
+ # Adding a sport to the object.
22
24
  # Params:
23
25
  # +type+:: the type of the sport
24
26
  def sport(type)
25
- @sport << Sport.new(type)
27
+ @sport = type
26
28
  end
27
29
 
28
30
  ##
29
- # Building a new Info object.
31
+ # Adding an info message to the object.
30
32
  # Params:
31
33
  # +message+:: the info message
32
34
  def info(message)
33
- @info << Info.new(message)
35
+ @info = message
34
36
  end
35
37
 
36
38
  ##
37
- # Building a new AverageHeartRate object.
39
+ # Adding a speed duration of an interval to the object.
38
40
  # Params:
39
- # +heart_rate+:: the average heart rate in bpm
40
- def average_heart_rate(heart_rate)
41
- @average_heart_rate << AverageHeartRate.new(heart_rate)
41
+ # +speed_duration+:: the duration of the speed segment in minutes
42
+ def speed_duration(speed_duration)
43
+ @speed_duration = speed_duration.to_s.to_i
42
44
  end
43
45
 
44
46
  ##
45
- # Building a new TotalDuration object.
47
+ # Adding a recovery duration of an interval to the object.
46
48
  # Params:
47
- # +duration+:: the duration in seconds
48
- def total_duration(duration)
49
- @total_duration << TotalDuration.new(duration)
49
+ # +recovery_duration+:: the duration of the recovery segment in minutes
50
+ def recovery_duration(recovery_duration)
51
+ @recovery_duration = recovery_duration.to_s.to_i
50
52
  end
51
53
 
52
54
  ##
53
- # Building a new AverageHeartRateRest object.
55
+ # Adding a speed heart rate of an interval to the object.
54
56
  # Params:
55
- # +heart_rate_rest+:: the average rest heart rate in bpm
56
- def average_heart_rate_rest(heart_rate_rest)
57
- @average_heart_rate_rest << AverageHeartRateRest.new(heart_rate_rest)
57
+ # +speed_heart_rate+:: the average speed heart rate in bpm
58
+ def speed_heart_rate(speed_heart_rate)
59
+ @speed_heart_rate = speed_heart_rate.to_s.to_i
58
60
  end
59
61
 
60
62
  ##
61
- # Building a new TotalDurationRest object.
63
+ # Adding a recovery heart rate of an interval to the object.
62
64
  # Params:
63
- # +duration rest+:: the rest duration in seconds
64
- def total_duration_rest(duration_rest)
65
- @total_duration_rest << TotalDurationRest.new(duration_rest)
65
+ # +recovery_heart_rate+:: the average speed heart rate in bpm
66
+ def recovery_heart_rate(recovery_heart_rate)
67
+ @recovery_heart_rate = recovery_heart_rate.to_s.to_i
68
+ end
69
+
70
+ ##
71
+ # Adding a number of repetitions to the object.
72
+ # Params:
73
+ # +repetitions+:: number of interval repetitions
74
+ def repetitions(repetitions)
75
+ @repetitions = repetitions.to_s.to_i
76
+ end
77
+
78
+ ##
79
+ # Adding an interval type to the object.
80
+ # Params:
81
+ # +type+:: interval type
82
+ def type(type)
83
+ @type = type
66
84
  end
67
85
 
68
86
  ##
69
87
  # Converting an interval to a string.
70
88
  def to_s
71
- "#{@sport[0].type} #{@info[0].message}"
89
+ "#{@sport} #{@info}"
72
90
  end
73
91
 
74
92
  ##
75
93
  # Converting an interval to a JSON-ized string.
76
94
  def to_hash
77
- {
78
- name: @name.collect(&:to_hash),
79
- sport: @sport.collect(&:to_hash),
80
- info: @info.collect(&:to_hash),
81
- average_heart_rate: @average_heart_rate.collect(&:to_hash),
82
- total_duration: @total_duration.collect(&:to_hash),
83
- average_heart_rate_rest: @average_heart_rate_rest.collect(&:to_hash),
84
- total_duration_rest: @total_duration_rest.collect(&:to_hash),
95
+ hash = {
96
+ name: @name,
97
+ sport: @sport,
98
+ info: @info,
99
+ speed_duration: @speed_duration,
100
+ recovery_duration: @recovery_duration,
101
+ speed_heart_rate: @speed_heart_rate,
102
+ recovery_heart_rate: @recovery_heart_rate,
103
+ repetitions: @repetitions,
104
+ type: @type
85
105
  }
106
+
107
+ hash[:info] = @info if @info
108
+ hash
86
109
  end
87
110
  end
data/lib/session.rb CHANGED
@@ -7,61 +7,63 @@ class Session
7
7
  # Initialization method for the +Session+ class.
8
8
  # Params:
9
9
  # +name+:: the name of the session
10
- def initialize(_name)
11
- @name = []
12
- @sport = []
13
- @info = []
14
- @average_heart_rate = []
15
- @total_duration = []
10
+ def initialize(name)
11
+ @name = name
12
+ @sport = ''
13
+ @info = ''
14
+ @average_heart_rate = 0
15
+ @total_duration = 0
16
16
  end
17
17
 
18
18
  ##
19
- # Building a new Sport object.
19
+ # Adding a sport type to the object.
20
20
  # Params:
21
21
  # +type+:: the type of the sport
22
22
  def sport(type)
23
- @sport << Sport.new(type)
23
+ @sport = type
24
24
  end
25
25
 
26
26
  ##
27
- # Building a new Info object.
27
+ # Adding a message to the object.
28
28
  # Params:
29
29
  # +message+:: the info message
30
30
  def info(message)
31
- @info << Info.new(message)
31
+ @info = message
32
32
  end
33
33
 
34
34
  ##
35
- # Building a new AverageHeartRate object.
35
+ # Adding an average heart rate to the object.
36
36
  # Params:
37
37
  # +heart_rate+:: the average heart rate in bpm
38
38
  def average_heart_rate(heart_rate)
39
- @average_heart_rate << AverageHeartRate.new(heart_rate)
39
+ @average_heart_rate = heart_rate.to_s.to_i
40
40
  end
41
41
 
42
42
  ##
43
- # Building a new TotalDuration object.
43
+ # Adding a total duration to the object.
44
44
  # Params:
45
- # +duration+:: the duration in seconds
45
+ # +duration+:: the duration in minutes
46
46
  def total_duration(duration)
47
- @total_duration << TotalDuration.new(duration)
47
+ @total_duration = duration.to_s.to_i
48
48
  end
49
49
 
50
50
  ##
51
51
  # Converting a session to a string.
52
52
  def to_s
53
- "#{@sport[0].type} #{@info[0].message}"
53
+ "#{@sport} #{@info}"
54
54
  end
55
55
 
56
56
  ##
57
57
  # Converting a session to a JSON-ized string.
58
58
  def to_hash
59
- {
60
- name: @name.collect(&:to_hash),
61
- sport: @sport.collect(&:to_hash),
62
- info: @info.collect(&:to_hash),
63
- average_heart_rate: @average_heart_rate.collect(&:to_hash),
64
- total_duration: @total_duration.collect(&:to_hash),
59
+ hash = {
60
+ name: @name,
61
+ sport: @sport,
62
+ average_heart_rate: @average_heart_rate,
63
+ total_duration: @total_duration,
65
64
  }
65
+
66
+ hash[:info] = @info if @info != ''
67
+ hash
66
68
  end
67
69
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ast-tdl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - firefly-cpp
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-23 00:00:00.000000000 Z
12
+ date: 2022-07-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -19,10 +19,10 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - LICENSE
22
23
  - README.md
23
24
  - lib/ast-tdl.rb
24
25
  - lib/ast.rb
25
- - lib/classes.rb
26
26
  - lib/interval.rb
27
27
  - lib/session.rb
28
28
  homepage: https://github.com/firefly-cpp/ast-tdl
data/lib/classes.rb DELETED
@@ -1,148 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'json'
4
-
5
- ##
6
- # This class represents a sport with a type.
7
- class Sport
8
- # The type of a sport.
9
- attr_reader :type
10
-
11
- ##
12
- # Initialization method for the +Sport+ class.
13
- # Params:
14
- # +type+:: the type of the sport
15
- def initialize(type)
16
- @type = type
17
- end
18
-
19
- ##
20
- # Converting +Sport+ class to a hash.
21
- def to_hash
22
- {
23
- type: @type
24
- }
25
- end
26
- end
27
-
28
- ##
29
- # This class represents information with a message.
30
- class Info
31
- # The info message.
32
- attr_reader :message
33
-
34
- ##
35
- # Initialization method for the +Info+ class.
36
- # Params:
37
- # +message+:: the info message
38
- def initialize(message)
39
- @message = message
40
- end
41
-
42
- ##
43
- # Converting +Info+ class to a hash.
44
- def to_hash
45
- {
46
- message: @message
47
- }
48
- end
49
- end
50
-
51
- ##
52
- # This class represents an average heart rate.
53
- class AverageHeartRate
54
- # An average heart rate.
55
- attr_reader :heart_rate
56
-
57
- ##
58
- # Initialization method for the +AverageHeartRate+ class.
59
- # Params:
60
- # +heart_rate+:: the average heart rate
61
- def initialize(heart_rate)
62
- heart_rate = heart_rate.to_s.to_i
63
- raise ArgumentError, 'Maximum heart rate is 220.' if heart_rate > 220
64
-
65
- @heart_rate = heart_rate
66
- end
67
-
68
- ##
69
- # Converting +AverageHeartRate+ class to a hash.
70
- def to_hash
71
- {
72
- average_hr: @heart_rate
73
- }
74
- end
75
- end
76
-
77
- ##
78
- # This class represents a total duration of a session or an interval.
79
- class TotalDuration
80
- # The total duration in seconds.
81
- attr_reader :duration
82
-
83
- ##
84
- # Initialization method for the +TotalDuration+ class.
85
- # Params:
86
- # +duration+:: the total duration
87
- def initialize(duration)
88
- @duration = duration
89
- end
90
-
91
- ##
92
- # Converting +TotalDuration+ class to a hash.
93
- def to_hash
94
- {
95
- duration: @duration
96
- }
97
- end
98
- end
99
-
100
- ##
101
- # This class represents an average heart rate in the resting period.
102
- class AverageHeartRateRest
103
- # The average rest heart rate.
104
- attr_reader :average_heart_rate_rest
105
-
106
- ##
107
- # Initialization method for the +AverageHeartRateRest+ class.
108
- # Params:
109
- # +average_heart_rate_rest+:: the average heart rate
110
- def initialize(average_heart_rate_rest)
111
- average_heart_rate_rest = average_heart_rate_rest.to_s.to_i
112
- raise ArgumentError, 'Maximum heart rate is 220.' if average_heart_rate_rest > 220
113
-
114
- @average_heart_rate_rest = average_heart_rate_rest
115
- end
116
-
117
- ##
118
- # Converting +AverageHeartRateRest+ class to a hash.
119
- def to_hash
120
- {
121
- average_heart_rate_rest: @average_heart_rate_rest
122
- }
123
- end
124
- end
125
-
126
- ##
127
- # This class represents a total duration of a session or an
128
- # interval in the resting period.
129
- class TotalDurationRest
130
- # The total duration in seconds.
131
- attr_reader :total_duration_rest
132
-
133
- ##
134
- # Initialization method for the +TotalDurationRest+ class.
135
- # Params:
136
- # +total_duration_rest+:: the total rest duration
137
- def initialize(total_duration_rest)
138
- @total_duration_rest = total_duration_rest
139
- end
140
-
141
- ##
142
- # Converting +TotalDurationRest+ class to a hash.
143
- def to_hash
144
- {
145
- total_duration_rest: @total_duration_rest
146
- }
147
- end
148
- end