Skip to content

Commit 388c6fc

Browse files
committed
move semester and year period generators with associated bundles and tests
1 parent 94f995b commit 388c6fc

18 files changed

Lines changed: 137 additions & 75 deletions

lib/period.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ library period;
1818

1919
import 'src/enums/enums.dart' show PeriodGenerator;
2020
import 'src/period_generators/period_generators.dart';
21+
import 'src/period_generators/semester_generator.dart';
22+
import 'src/period_generators/year_generator.dart';
2123
import 'src/periods/periods.dart';
2224

2325
export 'src/enums/enums.dart' show Month, PeriodGenerator, Week, Weekday;

lib/src/enums/period_generator.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import '../period_generators/period_generators.dart';
2+
import '../period_generators/semester_generator.dart';
3+
import '../period_generators/year_generator.dart';
24
import '../periods/periods.dart';
35

46
/// An enumeration of the different period generators implemented in this
Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import 'package:equatable/equatable.dart';
21
import 'package:meta/meta.dart';
3-
import 'package:time/time.dart';
42

53
import '../enums/enums.dart';
64
import '../periods/periods.dart';
@@ -10,8 +8,10 @@ import 'hour_generator.dart';
108
import 'minute_generator.dart';
119
import 'month_generator.dart';
1210
import 'second_generator.dart';
11+
import 'semester_generator.dart';
1312
import 'trimester_generator.dart';
1413
import 'week_generator.dart';
14+
import 'year_generator.dart';
1515

1616
/// A mixin for generating period types.
1717
///
@@ -50,57 +50,3 @@ mixin PeriodGeneratorMixin<T extends Period> {
5050
return newPeriod == period;
5151
}
5252
}
53-
54-
/// A class that implements a generator of a period type of a semester.
55-
class SemesterGenerator
56-
with PeriodGeneratorMixin<SemesterPeriod>, EquatableMixin {
57-
/// A class that implements a generator of a period type of a semester.
58-
const SemesterGenerator();
59-
60-
@override
61-
SemesterPeriod of(DateTime date) {
62-
final julyFirst = date.copyWith(month: DateTime.july, day: 1).date;
63-
if (date.isBefore(julyFirst)) {
64-
return SemesterPeriod(
65-
start: date.firstDayOfYear.date,
66-
end: julyFirst.subtract(const Duration(microseconds: 1)),
67-
);
68-
}
69-
return SemesterPeriod(
70-
start: julyFirst,
71-
end: date.lastDayOfYear.endOfDay,
72-
);
73-
}
74-
75-
@override
76-
// ignore: hash_and_equals, overridden in EquatableMixin
77-
bool operator ==(Object other) {
78-
return (super == other) || (other is SemesterGenerator);
79-
}
80-
81-
@override
82-
List<Object?> get props => [];
83-
}
84-
85-
/// A class that implements a generator of a period type of a year.
86-
class YearGenerator with PeriodGeneratorMixin<YearPeriod>, EquatableMixin {
87-
/// A class that implements a generator of a period type of a year.
88-
const YearGenerator();
89-
90-
@override
91-
YearPeriod of(DateTime date) {
92-
return YearPeriod(
93-
start: date.firstDayOfYear.date,
94-
end: date.lastDayOfYear.endOfDay,
95-
);
96-
}
97-
98-
@override
99-
// ignore: hash_and_equals, overridden in EquatableMixin
100-
bool operator ==(Object other) {
101-
return (super == other) || (other is YearGenerator);
102-
}
103-
104-
@override
105-
List<Object?> get props => [];
106-
}

lib/src/period_generators/period_generators.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ export 'minute_generator.dart';
55
export 'month_generator.dart';
66
export 'period_generator_mixin.dart';
77
export 'second_generator.dart';
8+
export 'semester_generator.dart';
89
export 'trimester_generator.dart';
910
export 'week_generator.dart';
11+
export 'year_generator.dart';
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:time/time.dart';
3+
import '../periods/periods.dart';
4+
import 'period_generator_mixin.dart';
5+
6+
/// A class that implements a generator of a period type of a semester.
7+
class SemesterGenerator
8+
with PeriodGeneratorMixin<SemesterPeriod>, EquatableMixin {
9+
/// A class that implements a generator of a period type of a semester.
10+
const SemesterGenerator();
11+
12+
@override
13+
SemesterPeriod of(DateTime date) {
14+
final julyFirst = date.copyWith(month: DateTime.july, day: 1).date;
15+
if (date.isBefore(julyFirst)) {
16+
return SemesterPeriod(
17+
start: date.firstDayOfYear.date,
18+
end: julyFirst.subtract(const Duration(microseconds: 1)),
19+
);
20+
}
21+
return SemesterPeriod(
22+
start: julyFirst,
23+
end: date.lastDayOfYear.endOfDay,
24+
);
25+
}
26+
27+
@override
28+
// ignore: hash_and_equals, overridden in EquatableMixin
29+
bool operator ==(Object other) {
30+
return (super == other) ||
31+
(other is SemesterGenerator) && props == other.props;
32+
}
33+
34+
@override
35+
List<Object?> get props => [];
36+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:equatable/equatable.dart';
2+
import 'package:time/time.dart';
3+
import '../periods/periods.dart';
4+
import 'period_generator_mixin.dart';
5+
6+
/// A class that implements a generator of a period type of a year.
7+
class YearGenerator with PeriodGeneratorMixin<YearPeriod>, EquatableMixin {
8+
/// A class that implements a generator of a period type of a year.
9+
const YearGenerator();
10+
11+
@override
12+
YearPeriod of(DateTime date) {
13+
return YearPeriod(
14+
start: date.firstDayOfYear.date,
15+
end: date.lastDayOfYear.endOfDay,
16+
);
17+
}
18+
19+
@override
20+
// ignore: hash_and_equals, overridden in EquatableMixin
21+
bool operator ==(Object other) {
22+
return (super == other) || (other is YearGenerator) && props == other.props;
23+
}
24+
25+
@override
26+
List<Object?> get props => [];
27+
}

lib/src/periods/semester_period.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import 'package:time/time.dart';
22

33
import '../extensions/extensions.dart';
4-
import '../period_generators/month_generator.dart';
54
import '../period_generators/period_generators.dart';
6-
import 'month_period.dart';
7-
import 'month_period_bundle.dart';
5+
import 'trimester_period.dart';
6+
import 'trimester_period_bundle.dart';
87

98
/// A class that implements a period type of a semester.
10-
class SemesterPeriod extends MonthPeriodBundle {
9+
class SemesterPeriod extends TrimesterPeriodBundle {
1110
/// A class that implements a period type of a semester.
1211
SemesterPeriod({required super.start, required super.end})
1312
: assert(
@@ -39,14 +38,14 @@ class SemesterPeriod extends MonthPeriodBundle {
3938
}
4039

4140
@override
42-
List<MonthPeriod> get months {
43-
const generator = MonthGenerator();
44-
final months = <MonthPeriod>[];
41+
List<TrimesterPeriod> get trimesters {
42+
const generator = TrimesterGenerator();
43+
final trimesters = <TrimesterPeriod>[];
4544
var last = generator.of(start);
4645
while (last.start.isBefore(end)) {
47-
months.add(last);
46+
trimesters.add(last);
4847
last = generator.after(last);
4948
}
50-
return months;
49+
return trimesters;
5150
}
5251
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import 'semester_period.dart';
2+
import 'trimester_period.dart';
3+
import 'trimester_period_bundle.dart';
4+
5+
/// {@template semesterPeriodBundle}
6+
/// A base class that represents a bundle of semesters.
7+
/// {@endtemplate}
8+
abstract class SemesterPeriodBundle extends TrimesterPeriodBundle {
9+
/// {@macro semesterPeriodBundle}
10+
SemesterPeriodBundle({required super.start, required super.end});
11+
12+
/// Returns the list of semesters in this bundle.
13+
List<SemesterPeriod> get semesters;
14+
15+
@override
16+
List<TrimesterPeriod> get trimesters =>
17+
semesters.expand((s) => s.trimesters).toList();
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import 'month_period.dart';
2+
import 'month_period_bundle.dart';
3+
import 'trimester_period.dart';
4+
5+
/// {@template trimesterPeriodBundle}
6+
/// A base class that represents a bundle of trimesters.
7+
/// {@endtemplate}
8+
abstract class TrimesterPeriodBundle extends MonthPeriodBundle {
9+
/// {@macro trimesterPeriodBundle}
10+
TrimesterPeriodBundle({required super.start, required super.end});
11+
12+
/// Returns the list of trimesters in this bundle.
13+
List<TrimesterPeriod> get trimesters;
14+
15+
@override
16+
List<MonthPeriod> get months => trimesters.expand((t) => t.months).toList();
17+
}

lib/src/periods/year_period.dart

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
import 'package:time/time.dart';
22

33
import '../extensions/extensions.dart';
4-
import '../period_generators/month_generator.dart';
5-
import '../period_generators/period_generators.dart';
6-
import 'month_period.dart';
7-
import 'month_period_bundle.dart';
4+
import '../period_generators/semester_generator.dart';
5+
import 'semester_period.dart';
6+
import 'semester_period_bundle.dart';
87

98
/// A class that implements a period type of a year.
10-
class YearPeriod extends MonthPeriodBundle {
9+
class YearPeriod extends SemesterPeriodBundle {
1110
/// A class that implements a period type of a year.
1211
YearPeriod({required super.start, required super.end})
1312
: assert(
@@ -42,14 +41,14 @@ class YearPeriod extends MonthPeriodBundle {
4241
}
4342

4443
@override
45-
List<MonthPeriod> get months {
46-
const generator = MonthGenerator();
47-
final months = <MonthPeriod>[];
44+
List<SemesterPeriod> get semesters {
45+
const generator = SemesterGenerator();
46+
final trimesters = <SemesterPeriod>[];
4847
var last = generator.of(start);
4948
while (last.start.isBefore(end)) {
50-
months.add(last);
49+
trimesters.add(last);
5150
last = generator.after(last);
5251
}
53-
return months;
52+
return trimesters;
5453
}
5554
}

0 commit comments

Comments
 (0)