toji 2.13.0 → 2.17.0
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/example/example_core.rb +224 -39
- data/lib/toji/calendar.rb +2 -2
- data/lib/toji/calendar/date_row.rb +2 -2
- data/lib/toji/ingredient/alcohol.rb +1 -1
- data/lib/toji/ingredient/base.rb +3 -2
- data/lib/toji/ingredient/koji.rb +2 -2
- data/lib/toji/ingredient/lactic_acid.rb +1 -1
- data/lib/toji/ingredient/rice.rb +10 -9
- data/lib/toji/ingredient/tanekoji.rb +3 -3
- data/lib/toji/ingredient/water.rb +3 -3
- data/lib/toji/ingredient/yeast.rb +4 -3
- data/lib/toji/product.rb +9 -15
- data/lib/toji/product/schedule_factory.rb +23 -9
- data/lib/toji/progress/base_state.rb +2 -5
- data/lib/toji/progress/graph/ab.rb +2 -2
- data/lib/toji/progress/koji_state.rb +5 -5
- data/lib/toji/progress/moromi_progress.rb +1 -1
- data/lib/toji/progress/moromi_state.rb +11 -11
- data/lib/toji/progress/moto_state.rb +8 -8
- data/lib/toji/progress/progress.rb +8 -7
- data/lib/toji/progress/state.rb +14 -1
- data/lib/toji/recipe.rb +5 -7
- data/lib/toji/recipe/ab_expect.rb +2 -2
- data/lib/toji/recipe/action.rb +2 -2
- data/lib/toji/recipe/step.rb +15 -6
- data/lib/toji/schedule/action_schedule.rb +1 -1
- data/lib/toji/schedule/base.rb +3 -3
- data/lib/toji/schedule/rice_schedule.rb +3 -3
- data/lib/toji/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfa76ef9b8f8a73ea20b84bf68c9480a1664888c08fb2d541cdfd6023b4f93a3
|
4
|
+
data.tar.gz: ce4f2d927d653d20a541d21a98954d27c70eba6e67022355e8cf9d887ca2842b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 134dfc5763d67f9dda33917ad51dfb923631e503e296ab97eea6733fb809b656d73d702263a6a3b565b27a9ac3594d1fd1b3f7599259947098b0a36a7ce86f33
|
7
|
+
data.tar.gz: bd02c83d17c87aabfb3f24cc6386d48f7cc562dd61f5d66a75615dae70b93c100779e55772f7a821eae6ad6abc15c6c1e6dfc1ea51ab242ad84efd1459e13096
|
data/example/example_core.rb
CHANGED
@@ -8,8 +8,12 @@ module Example
|
|
8
8
|
include Toji::Product
|
9
9
|
include Toji::Product::ScheduleFactory
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
attr_reader :name
|
12
|
+
attr_reader :recipe
|
13
|
+
attr_reader :base_date
|
14
|
+
|
15
|
+
attr_reader :description
|
16
|
+
attr_reader :color
|
13
17
|
|
14
18
|
def initialize(id, name, description, recipe, base_date, color=nil)
|
15
19
|
@id = id
|
@@ -86,7 +90,18 @@ module Example
|
|
86
90
|
class Step
|
87
91
|
include Toji::Recipe::Step
|
88
92
|
|
89
|
-
|
93
|
+
attr_reader :index
|
94
|
+
attr_reader :subindex
|
95
|
+
attr_accessor :kojis
|
96
|
+
attr_accessor :kakes
|
97
|
+
attr_accessor :waters
|
98
|
+
attr_accessor :lactic_acids
|
99
|
+
attr_accessor :alcohols
|
100
|
+
attr_accessor :yeasts
|
101
|
+
|
102
|
+
def initialize(index:, subindex:, kojis: [], kakes: [], waters: [], lactic_acids: [], alcohols: [], yeasts: [])
|
103
|
+
@index = index
|
104
|
+
@subindex = subindex
|
90
105
|
@kojis = kojis
|
91
106
|
@kakes = kakes
|
92
107
|
@waters = waters
|
@@ -108,6 +123,18 @@ module Example
|
|
108
123
|
class Koji
|
109
124
|
include Toji::Ingredient::Koji
|
110
125
|
|
126
|
+
attr_accessor :weight
|
127
|
+
attr_reader :brand
|
128
|
+
attr_reader :polishing_ratio
|
129
|
+
attr_reader :made_in
|
130
|
+
attr_reader :year
|
131
|
+
attr_reader :soaking_ratio
|
132
|
+
attr_reader :steaming_ratio
|
133
|
+
attr_reader :cooling_ratio
|
134
|
+
attr_reader :tanekojis
|
135
|
+
attr_reader :dekoji_ratio
|
136
|
+
attr_reader :interval_days
|
137
|
+
|
111
138
|
def initialize(weight:, brand:, polishing_ratio:, made_in:, year:, soaking_ratio:, steaming_ratio:, cooling_ratio:, tanekojis:, dekoji_ratio:, interval_days:)
|
112
139
|
@weight = weight
|
113
140
|
@brand = brand
|
@@ -150,6 +177,8 @@ module Example
|
|
150
177
|
include Toji::Ingredient::Tanekoji
|
151
178
|
|
152
179
|
attr_accessor :koji
|
180
|
+
attr_reader :brand
|
181
|
+
attr_reader :ratio
|
153
182
|
|
154
183
|
def initialize(koji: nil, brand:, ratio:)
|
155
184
|
@brand = brand
|
@@ -165,6 +194,16 @@ module Example
|
|
165
194
|
class Kake
|
166
195
|
include Toji::Ingredient::Kake
|
167
196
|
|
197
|
+
attr_accessor :weight
|
198
|
+
attr_reader :brand
|
199
|
+
attr_reader :polishing_ratio
|
200
|
+
attr_reader :made_in
|
201
|
+
attr_reader :year
|
202
|
+
attr_reader :soaking_ratio
|
203
|
+
attr_reader :steaming_ratio
|
204
|
+
attr_reader :cooling_ratio
|
205
|
+
attr_reader :interval_days
|
206
|
+
|
168
207
|
def initialize(weight:, brand:, polishing_ratio:, made_in:, year:, soaking_ratio:, steaming_ratio:, cooling_ratio:, interval_days:)
|
169
208
|
@weight = weight
|
170
209
|
@brand = brand
|
@@ -181,6 +220,10 @@ module Example
|
|
181
220
|
class Water
|
182
221
|
include Toji::Ingredient::Water
|
183
222
|
|
223
|
+
attr_accessor :weight
|
224
|
+
attr_reader :calcium_hardness
|
225
|
+
attr_reader :magnesium_hardness
|
226
|
+
|
184
227
|
def initialize(weight:)
|
185
228
|
@weight = weight
|
186
229
|
end
|
@@ -189,6 +232,8 @@ module Example
|
|
189
232
|
class LacticAcid
|
190
233
|
include Toji::Ingredient::LacticAcid
|
191
234
|
|
235
|
+
attr_accessor :weight
|
236
|
+
|
192
237
|
def initialize(weight:)
|
193
238
|
@weight = weight
|
194
239
|
end
|
@@ -197,6 +242,8 @@ module Example
|
|
197
242
|
class Alcohol
|
198
243
|
include Toji::Ingredient::Alcohol
|
199
244
|
|
245
|
+
attr_accessor :weight
|
246
|
+
|
200
247
|
def initialize(weight:)
|
201
248
|
@weight = weight
|
202
249
|
end
|
@@ -205,6 +252,10 @@ module Example
|
|
205
252
|
class Yeast
|
206
253
|
include Toji::Ingredient::Yeast
|
207
254
|
|
255
|
+
attr_accessor :weight
|
256
|
+
attr_reader :unit
|
257
|
+
attr_reader :brand
|
258
|
+
|
208
259
|
def initialize(weight:)
|
209
260
|
@weight = weight
|
210
261
|
end
|
@@ -214,22 +265,48 @@ module Example
|
|
214
265
|
class Action
|
215
266
|
include Toji::Recipe::Action
|
216
267
|
|
268
|
+
attr_reader :type
|
269
|
+
attr_reader :interval_days
|
270
|
+
|
217
271
|
def initialize(type:, interval_days:)
|
218
272
|
@type = type
|
219
273
|
@interval_days = interval_days
|
220
274
|
end
|
221
275
|
end
|
222
276
|
|
277
|
+
class AbExpect
|
278
|
+
include Toji::Recipe::AbExpect
|
279
|
+
|
280
|
+
attr_reader :alcohol
|
281
|
+
attr_reader :nihonshudo
|
282
|
+
|
283
|
+
def initialize(alcohol:, nihonshudo:)
|
284
|
+
@alcohol = alcohol
|
285
|
+
@nihonshudo = nihonshudo
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
223
289
|
|
224
290
|
class Recipe
|
225
291
|
include Toji::Recipe
|
226
292
|
|
227
|
-
|
293
|
+
attr_reader :steps
|
294
|
+
attr_reader :actions
|
295
|
+
attr_reader :ab_coef
|
296
|
+
attr_reader :ab_expects
|
297
|
+
|
298
|
+
def initialize(steps:, actions:, ab_coef:, ab_expects:)
|
228
299
|
@steps = steps
|
300
|
+
@actions = actions
|
301
|
+
@ab_coef = ab_coef
|
302
|
+
@ab_expects = ab_expects
|
229
303
|
end
|
230
304
|
|
231
305
|
def initialize_copy(obj)
|
232
306
|
@steps = obj.steps.deep_dup
|
307
|
+
@actions = obj.actions.deep_dup
|
308
|
+
@ab_coef = obj.ab_coef.dup
|
309
|
+
@ab_expects = obj.ab_expects.deep_dup
|
233
310
|
end
|
234
311
|
|
235
312
|
# 乳酸は汲水100L当たり比重1.21の乳酸(90%乳酸と称される)を650〜720ml添加する。
|
@@ -242,8 +319,10 @@ module Example
|
|
242
319
|
# 酒造教本による標準型仕込配合
|
243
320
|
# 出典: 酒造教本 P97
|
244
321
|
sokujo_textbook: new(
|
245
|
-
[
|
322
|
+
steps: [
|
246
323
|
Step.new(
|
324
|
+
index: 0,
|
325
|
+
subindex: 0,
|
247
326
|
kojis: [
|
248
327
|
Koji.new(
|
249
328
|
weight: 20,
|
@@ -294,6 +373,8 @@ module Example
|
|
294
373
|
]
|
295
374
|
),
|
296
375
|
Step.new(
|
376
|
+
index: 1,
|
377
|
+
subindex: 0,
|
297
378
|
kojis: [
|
298
379
|
Koji.new(
|
299
380
|
weight: 40,
|
@@ -334,6 +415,8 @@ module Example
|
|
334
415
|
],
|
335
416
|
),
|
336
417
|
Step.new(
|
418
|
+
index: 2,
|
419
|
+
subindex: 0,
|
337
420
|
kojis: [
|
338
421
|
Koji.new(
|
339
422
|
weight: 60,
|
@@ -374,6 +457,8 @@ module Example
|
|
374
457
|
],
|
375
458
|
),
|
376
459
|
Step.new(
|
460
|
+
index: 3,
|
461
|
+
subindex: 0,
|
377
462
|
kojis: [
|
378
463
|
Koji.new(
|
379
464
|
weight: 80,
|
@@ -414,6 +499,8 @@ module Example
|
|
414
499
|
],
|
415
500
|
),
|
416
501
|
Step.new(
|
502
|
+
index: 4,
|
503
|
+
subindex: 0,
|
417
504
|
kakes: [
|
418
505
|
Kake.new(
|
419
506
|
weight: 80,
|
@@ -433,13 +520,32 @@ module Example
|
|
433
520
|
),
|
434
521
|
],
|
435
522
|
),
|
436
|
-
].map(&:freeze).freeze
|
523
|
+
].map(&:freeze).freeze,
|
524
|
+
actions: [
|
525
|
+
Action.new(
|
526
|
+
type: :squeeze,
|
527
|
+
interval_days: 50,
|
528
|
+
),
|
529
|
+
].map(&:freeze).freeze,
|
530
|
+
ab_coef: 1.4,
|
531
|
+
ab_expects: [
|
532
|
+
AbExpect.new(
|
533
|
+
alcohol: 15.0,
|
534
|
+
nihonshudo: 0.0,
|
535
|
+
),
|
536
|
+
AbExpect.new(
|
537
|
+
alcohol: 16.0,
|
538
|
+
nihonshudo: 3.0,
|
539
|
+
),
|
540
|
+
].map(&:freeze).freeze,
|
437
541
|
).freeze,
|
438
542
|
# 灘における仕込配合の平均値
|
439
543
|
# 出典: http://www.nada-ken.com/main/jp/index_shi/234.html
|
440
544
|
sokujo_nada: new(
|
441
|
-
[
|
545
|
+
steps: [
|
442
546
|
Step.new(
|
547
|
+
index: 0,
|
548
|
+
subindex: 0,
|
443
549
|
kojis: [
|
444
550
|
Koji.new(
|
445
551
|
weight: 47,
|
@@ -490,6 +596,8 @@ module Example
|
|
490
596
|
],
|
491
597
|
),
|
492
598
|
Step.new(
|
599
|
+
index: 1,
|
600
|
+
subindex: 0,
|
493
601
|
kojis: [
|
494
602
|
Koji.new(
|
495
603
|
weight: 99,
|
@@ -530,6 +638,8 @@ module Example
|
|
530
638
|
],
|
531
639
|
),
|
532
640
|
Step.new(
|
641
|
+
index: 2,
|
642
|
+
subindex: 0,
|
533
643
|
kojis: [
|
534
644
|
Koji.new(
|
535
645
|
weight: 143,
|
@@ -570,6 +680,8 @@ module Example
|
|
570
680
|
],
|
571
681
|
),
|
572
682
|
Step.new(
|
683
|
+
index: 3,
|
684
|
+
subindex: 0,
|
573
685
|
kojis: [
|
574
686
|
Koji.new(
|
575
687
|
weight: 165,
|
@@ -610,19 +722,40 @@ module Example
|
|
610
722
|
],
|
611
723
|
),
|
612
724
|
Step.new(
|
725
|
+
index: 4,
|
726
|
+
subindex: 0,
|
613
727
|
alcohols: [
|
614
728
|
Alcohol.new(
|
615
729
|
weight: 900,
|
616
730
|
),
|
617
731
|
],
|
618
732
|
),
|
619
|
-
].map(&:freeze).freeze
|
733
|
+
].map(&:freeze).freeze,
|
734
|
+
actions: [
|
735
|
+
Action.new(
|
736
|
+
type: :squeeze,
|
737
|
+
interval_days: 50,
|
738
|
+
),
|
739
|
+
].map(&:freeze).freeze,
|
740
|
+
ab_coef: 1.4,
|
741
|
+
ab_expects: [
|
742
|
+
AbExpect.new(
|
743
|
+
alcohol: 15.0,
|
744
|
+
nihonshudo: 0.0,
|
745
|
+
),
|
746
|
+
AbExpect.new(
|
747
|
+
alcohol: 16.0,
|
748
|
+
nihonshudo: 3.0,
|
749
|
+
),
|
750
|
+
].map(&:freeze).freeze,
|
620
751
|
).freeze,
|
621
752
|
# 簡易酒母省略仕込
|
622
753
|
# 出典: https://www.jstage.jst.go.jp/article/jbrewsocjapan1915/60/11/60_11_999/_article/-char/ja/
|
623
754
|
simple_sokujo_himeno: new(
|
624
|
-
[
|
755
|
+
steps: [
|
625
756
|
Step.new(
|
757
|
+
index: 0,
|
758
|
+
subindex: 0,
|
626
759
|
kojis: [
|
627
760
|
Koji.new(
|
628
761
|
weight: 70,
|
@@ -644,17 +777,6 @@ module Example
|
|
644
777
|
),
|
645
778
|
],
|
646
779
|
kakes: [
|
647
|
-
Kake.new(
|
648
|
-
weight: 0,
|
649
|
-
brand: :yamadanishiki,
|
650
|
-
polishing_ratio: 0.55,
|
651
|
-
made_in: :hyogo,
|
652
|
-
year: 2020,
|
653
|
-
soaking_ratio: 0.33,
|
654
|
-
steaming_ratio: 0.41,
|
655
|
-
cooling_ratio: 0.33,
|
656
|
-
interval_days: 6,
|
657
|
-
),
|
658
780
|
],
|
659
781
|
waters: [
|
660
782
|
Water.new(
|
@@ -673,25 +795,9 @@ module Example
|
|
673
795
|
],
|
674
796
|
),
|
675
797
|
Step.new(
|
798
|
+
index: 1,
|
799
|
+
subindex: 0,
|
676
800
|
kojis: [
|
677
|
-
Koji.new(
|
678
|
-
weight: 0,
|
679
|
-
brand: :yamadanishiki,
|
680
|
-
polishing_ratio: 0.55,
|
681
|
-
made_in: :hyogo,
|
682
|
-
year: 2020,
|
683
|
-
soaking_ratio: 0.33,
|
684
|
-
steaming_ratio: 0.41,
|
685
|
-
cooling_ratio: 0.33,
|
686
|
-
tanekojis: [
|
687
|
-
Tanekoji.new(
|
688
|
-
brand: :byakuya,
|
689
|
-
ratio: 0.001,
|
690
|
-
),
|
691
|
-
],
|
692
|
-
dekoji_ratio: 0.18,
|
693
|
-
interval_days: 0,
|
694
|
-
),
|
695
801
|
],
|
696
802
|
kakes: [
|
697
803
|
Kake.new(
|
@@ -713,6 +819,8 @@ module Example
|
|
713
819
|
],
|
714
820
|
),
|
715
821
|
Step.new(
|
822
|
+
index: 2,
|
823
|
+
subindex: 0,
|
716
824
|
kojis: [
|
717
825
|
Koji.new(
|
718
826
|
weight: 100,
|
@@ -753,6 +861,8 @@ module Example
|
|
753
861
|
],
|
754
862
|
),
|
755
863
|
Step.new(
|
864
|
+
index: 3,
|
865
|
+
subindex: 0,
|
756
866
|
kojis: [
|
757
867
|
Koji.new(
|
758
868
|
weight: 110,
|
@@ -793,13 +903,32 @@ module Example
|
|
793
903
|
],
|
794
904
|
),
|
795
905
|
Step.new(
|
906
|
+
index: 4,
|
907
|
+
subindex: 0,
|
796
908
|
waters: [
|
797
909
|
Water.new(
|
798
910
|
weight: 255,
|
799
911
|
),
|
800
912
|
],
|
801
913
|
),
|
802
|
-
].map(&:freeze).freeze
|
914
|
+
].map(&:freeze).freeze,
|
915
|
+
actions: [
|
916
|
+
Action.new(
|
917
|
+
type: :squeeze,
|
918
|
+
interval_days: 50,
|
919
|
+
),
|
920
|
+
].map(&:freeze).freeze,
|
921
|
+
ab_coef: 1.4,
|
922
|
+
ab_expects: [
|
923
|
+
AbExpect.new(
|
924
|
+
alcohol: 15.0,
|
925
|
+
nihonshudo: 0.0,
|
926
|
+
),
|
927
|
+
AbExpect.new(
|
928
|
+
alcohol: 16.0,
|
929
|
+
nihonshudo: 3.0,
|
930
|
+
),
|
931
|
+
].map(&:freeze).freeze,
|
803
932
|
).freeze,
|
804
933
|
}.freeze
|
805
934
|
end
|
@@ -808,6 +937,12 @@ module Example
|
|
808
937
|
class KojiSchedule
|
809
938
|
include Toji::Schedule::KojiSchedule
|
810
939
|
|
940
|
+
attr_reader :product
|
941
|
+
attr_reader :date
|
942
|
+
|
943
|
+
attr_reader :step_indexes
|
944
|
+
attr_reader :expect
|
945
|
+
|
811
946
|
def initialize(product:, date:, step_indexes:, expect:)
|
812
947
|
@product = product
|
813
948
|
@date = date
|
@@ -819,6 +954,12 @@ module Example
|
|
819
954
|
class KakeSchedule
|
820
955
|
include Toji::Schedule::KakeSchedule
|
821
956
|
|
957
|
+
attr_reader :product
|
958
|
+
attr_reader :date
|
959
|
+
|
960
|
+
attr_reader :step_indexes
|
961
|
+
attr_reader :expect
|
962
|
+
|
822
963
|
def initialize(product:, date:, step_indexes:, expect:)
|
823
964
|
@product = product
|
824
965
|
@date = date
|
@@ -830,6 +971,12 @@ module Example
|
|
830
971
|
class ActionSchedule
|
831
972
|
include Toji::Schedule::ActionSchedule
|
832
973
|
|
974
|
+
attr_reader :product
|
975
|
+
attr_reader :date
|
976
|
+
attr_reader :type
|
977
|
+
|
978
|
+
attr_reader :index_index
|
979
|
+
|
833
980
|
def initialize(product:, date:, type:, action_index:)
|
834
981
|
@product = product
|
835
982
|
@date = date
|
@@ -872,6 +1019,16 @@ module Example
|
|
872
1019
|
class KojiState
|
873
1020
|
include Toji::Progress::KojiState
|
874
1021
|
|
1022
|
+
attr_accessor :progress
|
1023
|
+
attr_accessor :time
|
1024
|
+
attr_accessor :mark
|
1025
|
+
|
1026
|
+
attr_accessor :temps
|
1027
|
+
attr_accessor :preset_temp
|
1028
|
+
attr_accessor :room_temp
|
1029
|
+
attr_accessor :room_psychrometry
|
1030
|
+
attr_accessor :note
|
1031
|
+
|
875
1032
|
def self.create(args)
|
876
1033
|
new.tap {|s|
|
877
1034
|
s.progress = args[:progress]
|
@@ -901,6 +1058,19 @@ module Example
|
|
901
1058
|
class MotoState
|
902
1059
|
include Toji::Progress::MotoState
|
903
1060
|
|
1061
|
+
attr_accessor :progress
|
1062
|
+
attr_accessor :time
|
1063
|
+
attr_accessor :mark
|
1064
|
+
|
1065
|
+
attr_accessor :temps
|
1066
|
+
attr_accessor :preset_temp
|
1067
|
+
attr_accessor :room_temp
|
1068
|
+
attr_accessor :room_psychrometry
|
1069
|
+
attr_accessor :baume
|
1070
|
+
attr_accessor :acid
|
1071
|
+
attr_accessor :warmings
|
1072
|
+
attr_accessor :note
|
1073
|
+
|
904
1074
|
def self.create(args)
|
905
1075
|
new.tap {|s|
|
906
1076
|
s.progress = args[:progress]
|
@@ -936,6 +1106,21 @@ module Example
|
|
936
1106
|
include Toji::Progress::MoromiState
|
937
1107
|
include Toji::Progress::State::BaumeToNihonshudo
|
938
1108
|
|
1109
|
+
attr_accessor :progress
|
1110
|
+
attr_accessor :time
|
1111
|
+
attr_accessor :mark
|
1112
|
+
|
1113
|
+
attr_accessor :temps
|
1114
|
+
attr_accessor :preset_temp
|
1115
|
+
attr_accessor :room_temp
|
1116
|
+
attr_accessor :room_psychrometry
|
1117
|
+
attr_accessor :baume
|
1118
|
+
attr_accessor :acid
|
1119
|
+
attr_accessor :amino_acid
|
1120
|
+
attr_accessor :alcohol
|
1121
|
+
attr_accessor :warmings
|
1122
|
+
attr_accessor :note
|
1123
|
+
|
939
1124
|
def self.create(args)
|
940
1125
|
new.tap {|s|
|
941
1126
|
s.progress = args[:progress]
|
data/lib/toji/calendar.rb
CHANGED
@@ -32,8 +32,8 @@ module Toji
|
|
32
32
|
kake_schedules = @products.map{|product| product.kake_schedules}.flatten
|
33
33
|
schedules = koji_schedules + kake_schedules
|
34
34
|
|
35
|
-
koji_len = koji_schedules.map{|schedule| schedule.step_indexes.first}.max + 1
|
36
|
-
kake_len = kake_schedules.map{|schedule| schedule.step_indexes.first}.max + 1
|
35
|
+
koji_len = koji_schedules.map{|schedule| schedule.step_indexes.first[:index]}.max + 1
|
36
|
+
kake_len = kake_schedules.map{|schedule| schedule.step_indexes.first[:index]}.max + 1
|
37
37
|
min_date = schedules.map(&:date).min
|
38
38
|
max_date = schedules.map(&:date).max
|
39
39
|
|
@@ -14,11 +14,11 @@ module Toji
|
|
14
14
|
def <<(schedule)
|
15
15
|
case schedule.rice_type
|
16
16
|
when :koji
|
17
|
-
index = schedule.step_indexes.first
|
17
|
+
index = schedule.step_indexes.first[:index]
|
18
18
|
@kojis[index] ||= DateColumn.new
|
19
19
|
@kojis[index] << schedule
|
20
20
|
when :kake
|
21
|
-
index = schedule.step_indexes.first
|
21
|
+
index = schedule.step_indexes.first[:index]
|
22
22
|
@kakes[index] ||= DateColumn.new
|
23
23
|
@kakes[index] << schedule
|
24
24
|
end
|
data/lib/toji/ingredient/base.rb
CHANGED
data/lib/toji/ingredient/koji.rb
CHANGED
@@ -4,14 +4,14 @@ module Toji
|
|
4
4
|
include Rice
|
5
5
|
|
6
6
|
# 種麹 (has_many: Toji::Ingredient::Tanekoji)
|
7
|
-
|
7
|
+
# @dynamic tanekojis
|
8
8
|
|
9
9
|
# 出麹歩合
|
10
10
|
#
|
11
11
|
# 出麹歩合17〜19%のものが麹菌の繁殖のほどよい麹である
|
12
12
|
#
|
13
13
|
# 出典: 酒造教本 P67
|
14
|
-
|
14
|
+
# @dynamic dekoji_ratio
|
15
15
|
|
16
16
|
def dekoji
|
17
17
|
weight + weight * dekoji_ratio
|
data/lib/toji/ingredient/rice.rb
CHANGED
@@ -4,20 +4,21 @@ module Toji
|
|
4
4
|
include Base
|
5
5
|
|
6
6
|
# 白米
|
7
|
-
|
7
|
+
# @dynamic weight
|
8
|
+
# @dynamic weight=
|
8
9
|
|
9
10
|
# 品種、精米歩合、産地、年度
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
# @dynamic brand
|
12
|
+
# @dynamic polishing_ratio
|
13
|
+
# @dynamic made_in
|
14
|
+
# @dynamic year
|
14
15
|
|
15
16
|
# 浸漬米吸水率
|
16
17
|
#
|
17
18
|
# 標準的な白米吸水率は掛米で30〜35%、麹米で33%前後で許容範囲はかなり狭い
|
18
19
|
#
|
19
20
|
# 出典: 酒造教本 P38
|
20
|
-
|
21
|
+
# @dynamic soaking_ratio
|
21
22
|
|
22
23
|
def soaked
|
23
24
|
weight + weight * soaking_ratio
|
@@ -30,7 +31,7 @@ module Toji
|
|
30
31
|
# 蒸米吸水率は麹米及び酒母米で41〜43%、掛米は39〜40%で、吟醸造りの場合は数%低い
|
31
32
|
#
|
32
33
|
# 出典: 酒造教本 P48
|
33
|
-
|
34
|
+
# @dynamic steaming_ratio
|
34
35
|
|
35
36
|
def steamed
|
36
37
|
weight + weight * steaming_ratio
|
@@ -43,14 +44,14 @@ module Toji
|
|
43
44
|
#
|
44
45
|
# 麹を造るのに適した蒸米は、引込時の吸水率が33%を理想とし、許容幅はプラスマイナス1%である
|
45
46
|
# 出典: 酒造教本 P59
|
46
|
-
|
47
|
+
# @dynamic cooling_ratio
|
47
48
|
|
48
49
|
def cooled
|
49
50
|
weight + weight * cooling_ratio
|
50
51
|
end
|
51
52
|
|
52
53
|
# Product.base_dateからの日数差
|
53
|
-
|
54
|
+
# @dynamic interval_days
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
@@ -4,10 +4,10 @@ module Toji
|
|
4
4
|
include Base
|
5
5
|
|
6
6
|
# 麹 (belongs_to: Toji::Ingredient::Koji)
|
7
|
-
|
7
|
+
# @dynamic koji
|
8
8
|
|
9
9
|
# 種麹の種類
|
10
|
-
|
10
|
+
# @dynamic brand
|
11
11
|
|
12
12
|
# 種麹
|
13
13
|
#
|
@@ -15,7 +15,7 @@ module Toji
|
|
15
15
|
# 突き破精麹を造るには、種麹の量を麹米100kgあたり種麹80gとする
|
16
16
|
#
|
17
17
|
# 出典: 酒造教本 P66
|
18
|
-
|
18
|
+
# @dynamic ratio
|
19
19
|
|
20
20
|
def weight
|
21
21
|
koji.weight * ratio
|
@@ -4,11 +4,11 @@ module Toji
|
|
4
4
|
include Base
|
5
5
|
|
6
6
|
# 汲水
|
7
|
-
|
7
|
+
# @dynamic weight
|
8
8
|
|
9
9
|
# 硬度
|
10
|
-
|
11
|
-
|
10
|
+
# @dynamic calcium_hardness
|
11
|
+
# @dynamic magnesium_hardness
|
12
12
|
|
13
13
|
def group_key
|
14
14
|
[calcium_hardness, magnesium_hardness].join(":")
|
@@ -4,13 +4,14 @@ module Toji
|
|
4
4
|
include Base
|
5
5
|
|
6
6
|
# 酵母
|
7
|
-
|
7
|
+
# @dynamic weight
|
8
|
+
# @dynamic weight=
|
8
9
|
|
9
10
|
# 単位 (ex: ampoule, gram, ml)
|
10
|
-
|
11
|
+
# @dynamic unit
|
11
12
|
|
12
13
|
# 酵母名、協会酵母番号
|
13
|
-
|
14
|
+
# @dynamic brand
|
14
15
|
|
15
16
|
def group_key
|
16
17
|
[brand, unit].join(":")
|
data/lib/toji/product.rb
CHANGED
@@ -2,20 +2,14 @@ require 'toji/product/schedule_factory'
|
|
2
2
|
|
3
3
|
module Toji
|
4
4
|
module Product
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
koji_schedules + kake_schedules
|
15
|
-
end
|
16
|
-
|
17
|
-
def schedules
|
18
|
-
rice_schedules + action_schedules
|
19
|
-
end
|
5
|
+
# @dynamic name
|
6
|
+
# @dynamic recipe
|
7
|
+
# @dynamic base_date
|
8
|
+
|
9
|
+
# @dynamic koji_schedules
|
10
|
+
# @dynamic kake_schedules
|
11
|
+
# @dynamic action_schedules
|
12
|
+
# @dynamic rice_schedules
|
13
|
+
# @dynamic schedules
|
20
14
|
end
|
21
15
|
end
|
@@ -15,10 +15,13 @@ module Toji
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def koji_schedules
|
18
|
-
recipe.steps.
|
18
|
+
recipe.steps.inject([]) {|result, step|
|
19
19
|
step.kojis&.each {|koji|
|
20
20
|
result << {
|
21
|
-
step_index:
|
21
|
+
step_index: {
|
22
|
+
index: step.index,
|
23
|
+
subindex: step.subindex,
|
24
|
+
},
|
22
25
|
date: base_date.next_day(koji.interval_days),
|
23
26
|
koji: koji,
|
24
27
|
}
|
@@ -28,20 +31,23 @@ module Toji
|
|
28
31
|
0<schedule[:koji]&.weight.to_f
|
29
32
|
}.group_by {|schedule|
|
30
33
|
[schedule[:date], schedule[:koji].group_key]
|
31
|
-
}.map {|(date,
|
34
|
+
}.map {|(date, _group_key), schedules|
|
32
35
|
create_koji_schedule(
|
33
36
|
date: date,
|
34
|
-
step_indexes: schedules.map {|schedule| schedule[:step_index]}.
|
37
|
+
step_indexes: schedules.map {|schedule| schedule[:step_index]}.sort_by {|x| [x[:index], x[:subindex]]},
|
35
38
|
kojis: schedules.map{|schedule| schedule[:koji]},
|
36
39
|
)
|
37
40
|
}
|
38
41
|
end
|
39
42
|
|
40
43
|
def kake_schedules
|
41
|
-
recipe.steps.
|
44
|
+
recipe.steps.inject([]) {|result, step|
|
42
45
|
step.kakes&.each {|kake|
|
43
46
|
result << {
|
44
|
-
step_index:
|
47
|
+
step_index: {
|
48
|
+
index: step.index,
|
49
|
+
subindex: step.subindex,
|
50
|
+
},
|
45
51
|
date: base_date.next_day(kake.interval_days),
|
46
52
|
kake: kake,
|
47
53
|
}
|
@@ -50,11 +56,11 @@ module Toji
|
|
50
56
|
}.select {|schedule|
|
51
57
|
0<schedule[:kake]&.weight.to_f
|
52
58
|
}.group_by {|schedule|
|
53
|
-
[schedule[:date], schedule[:kake].group_key]
|
54
|
-
}.map {|(date,
|
59
|
+
[schedule[:date], schedule[:kake].group_key, schedule[:step_index]]
|
60
|
+
}.map {|(date, _group_key, _step_index), schedules|
|
55
61
|
create_kake_schedule(
|
56
62
|
date: date,
|
57
|
-
step_indexes: schedules.map {|schedule| schedule[:step_index]}.
|
63
|
+
step_indexes: schedules.map {|schedule| schedule[:step_index]}.sort_by {|x| [x[:index], x[:subindex]]},
|
58
64
|
kakes: schedules.map{|schedule| schedule[:kake]},
|
59
65
|
)
|
60
66
|
}
|
@@ -69,6 +75,14 @@ module Toji
|
|
69
75
|
)
|
70
76
|
}
|
71
77
|
end
|
78
|
+
|
79
|
+
def rice_schedules
|
80
|
+
koji_schedules + kake_schedules
|
81
|
+
end
|
82
|
+
|
83
|
+
def schedules
|
84
|
+
rice_schedules + action_schedules
|
85
|
+
end
|
72
86
|
end
|
73
87
|
end
|
74
88
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Toji
|
2
2
|
module Progress
|
3
3
|
module BaseState
|
4
|
+
include State
|
5
|
+
|
4
6
|
REQUIRED_KEYS = [
|
5
7
|
:time,
|
6
8
|
:elapsed_time,
|
@@ -10,11 +12,6 @@ module Toji
|
|
10
12
|
:mark,
|
11
13
|
].freeze
|
12
14
|
|
13
|
-
attr_accessor :progress
|
14
|
-
|
15
|
-
attr_accessor :time
|
16
|
-
attr_accessor :mark
|
17
|
-
|
18
15
|
def elapsed_time
|
19
16
|
time - progress.base_time
|
20
17
|
end
|
@@ -58,13 +58,13 @@ module Toji
|
|
58
58
|
def min_baume
|
59
59
|
@actuals.map {|moromi, name|
|
60
60
|
moromi.states.map(&:baume).compact.min
|
61
|
-
}.compact.min || 0
|
61
|
+
}.compact.min || 0.0
|
62
62
|
end
|
63
63
|
|
64
64
|
def max_baume
|
65
65
|
@actuals.map {|moromi, name|
|
66
66
|
moromi.states.map(&:baume).compact.max
|
67
|
-
}.compact.max || 0
|
67
|
+
}.compact.max || 0.0
|
68
68
|
end
|
69
69
|
|
70
70
|
def plot
|
@@ -12,12 +12,12 @@ module Toji
|
|
12
12
|
:note,
|
13
13
|
].freeze
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
# @dynamic temps
|
16
|
+
# @dynamic preset_temp
|
17
|
+
# @dynamic room_temp
|
18
|
+
# @dynamic room_psychrometry
|
19
19
|
|
20
|
-
|
20
|
+
# @dynamic note
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -22,19 +22,19 @@ module Toji
|
|
22
22
|
:note,
|
23
23
|
].freeze
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
# @dynamic temps
|
26
|
+
# @dynamic preset_temp
|
27
|
+
# @dynamic room_temp
|
28
|
+
# @dynamic room_psychrometry
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
# @dynamic baume
|
31
|
+
# @dynamic nihonshudo
|
32
|
+
# @dynamic acid
|
33
|
+
# @dynamic amino_acid
|
34
|
+
# @dynamic alcohol
|
35
35
|
|
36
|
-
|
37
|
-
|
36
|
+
# @dynamic warmings
|
37
|
+
# @dynamic note
|
38
38
|
|
39
39
|
def moromi_day
|
40
40
|
_tome_day = progress.moromi_tome_day
|
@@ -16,16 +16,16 @@ module Toji
|
|
16
16
|
:note,
|
17
17
|
].freeze
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
# @dynamic temps
|
20
|
+
# @dynamic preset_temp
|
21
|
+
# @dynamic room_temp
|
22
|
+
# @dynamic room_psychrometry
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
# @dynamic baume
|
25
|
+
# @dynamic acid
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
# @dynamic warmings
|
28
|
+
# @dynamic note
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -1,15 +1,16 @@
|
|
1
1
|
module Toji
|
2
2
|
module Progress
|
3
3
|
module Progress
|
4
|
-
|
5
|
-
|
4
|
+
# @dynamic states
|
5
|
+
# @dynamic date_line
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
# @dynamic base_time
|
8
|
+
# @dynamic day_offset
|
9
|
+
# @dynamic days
|
10
|
+
# @dynamic day_labels
|
11
11
|
|
12
|
-
|
12
|
+
# @dynamic all_keys
|
13
|
+
# @dynamic has_keys
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
data/lib/toji/progress/state.rb
CHANGED
@@ -3,7 +3,20 @@ require 'toji/progress/state/nihonshudo_to_baume'
|
|
3
3
|
|
4
4
|
module Toji
|
5
5
|
module Progress
|
6
|
-
module
|
6
|
+
module State
|
7
|
+
# @dynamic progress
|
8
|
+
# @dynamic progress=
|
9
|
+
|
10
|
+
# @dynamic time
|
11
|
+
# @dynamic time=
|
12
|
+
# @dynamic mark
|
13
|
+
# @dynamic mark=
|
14
|
+
|
15
|
+
# @dynamic elapsed_time
|
16
|
+
# @dynamic elapsed_time_with_offset
|
17
|
+
# @dynamic day
|
18
|
+
# @dynamic day_label
|
19
|
+
# @dynamic display_time
|
7
20
|
end
|
8
21
|
end
|
9
22
|
end
|
data/lib/toji/recipe.rb
CHANGED
@@ -4,15 +4,13 @@ require 'toji/recipe/ab_expect'
|
|
4
4
|
|
5
5
|
module Toji
|
6
6
|
module Recipe
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
attr_reader :ab_coef
|
12
|
-
attr_reader :ab_expects
|
7
|
+
# @dynamic steps
|
8
|
+
# @dynamic actions
|
9
|
+
# @dynamic ab_coef
|
10
|
+
# @dynamic ab_expects
|
13
11
|
|
14
12
|
def scale_rice_total(rice_total)
|
15
|
-
ratio = rice_total / steps.map(&:rice_total).sum
|
13
|
+
ratio = rice_total.to_f / steps.map(&:rice_total).sum
|
16
14
|
scale(ratio)
|
17
15
|
end
|
18
16
|
|
data/lib/toji/recipe/action.rb
CHANGED
data/lib/toji/recipe/step.rb
CHANGED
@@ -1,12 +1,21 @@
|
|
1
1
|
module Toji
|
2
2
|
module Recipe
|
3
3
|
module Step
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
# @dynamic index
|
5
|
+
# @dynamic subindex
|
6
|
+
|
7
|
+
# @dynamic kojis
|
8
|
+
# @dynamic kojis=
|
9
|
+
# @dynamic kakes
|
10
|
+
# @dynamic kakes=
|
11
|
+
# @dynamic waters
|
12
|
+
# @dynamic waters=
|
13
|
+
# @dynamic lactic_acids
|
14
|
+
# @dynamic lactic_acids=
|
15
|
+
# @dynamic alcohols
|
16
|
+
# @dynamic alcohols=
|
17
|
+
# @dynamic yeasts
|
18
|
+
# @dynamic yeasts=
|
10
19
|
|
11
20
|
# 麹米
|
12
21
|
def koji_total
|
data/lib/toji/schedule/base.rb
CHANGED
data/lib/toji/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: toji
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.17.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshida Tetsuya
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-12-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -194,7 +194,7 @@ metadata:
|
|
194
194
|
homepage_uri: https://github.com/yoshida-eth0/ruby-toji
|
195
195
|
source_code_uri: https://github.com/yoshida-eth0/ruby-toji
|
196
196
|
changelog_uri: https://github.com/yoshida-eth0/ruby-toji
|
197
|
-
post_install_message:
|
197
|
+
post_install_message:
|
198
198
|
rdoc_options: []
|
199
199
|
require_paths:
|
200
200
|
- lib
|
@@ -209,8 +209,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
209
|
- !ruby/object:Gem::Version
|
210
210
|
version: '0'
|
211
211
|
requirements: []
|
212
|
-
rubygems_version: 3.1
|
213
|
-
signing_key:
|
212
|
+
rubygems_version: 3.2.0.rc.1
|
213
|
+
signing_key:
|
214
214
|
specification_version: 4
|
215
215
|
summary: Management tools for brewing japanese sake.
|
216
216
|
test_files: []
|