diff --git a/day_generator.dart b/day_generator.dart index 8498e58..a6b9ae8 100644 --- a/day_generator.dart +++ b/day_generator.dart @@ -1,12 +1,16 @@ import 'dart:async'; import 'dart:io'; +import 'package:meta/meta.dart'; + import 'tool/session_token.dart'; +const year = '2024'; + /// Small Program to be used to generate files and boilerplate for a given day.\ /// Call with `dart run day_generator.dart ` +/// If no day is given, the user will be prompted to enter one, with the current AOC day suggested if applicable. void main(List args) async { - const year = '2023'; final session = getSessionToken(); if (args.length > 1) { @@ -18,15 +22,12 @@ void main(List args) async { // input through terminal if (args.isEmpty) { - print('Please enter a day for which to generate files'); - final input = stdin.readLineSync(); - if (input == null) { - print('No input given, exiting'); + final day = _promptDay(); + if (day == null) { + print('No day given, exiting'); return; } - // pad day number to have 2 digits - dayNumber = int.parse(input).toString().padLeft(2, '0'); - // input from CLI call + dayNumber = day; } else { dayNumber = int.parse(args[0]!).toString().padLeft(2, '0'); } @@ -98,6 +99,38 @@ You can do so by deleting the file at $sessionTokenPath and restarting the gener print('All set, Good luck!'); } +/// Prompts the user to enter a day for which to generate files. +/// If the current day is during the advent of code period, it will be suggested. +String? _promptDay() { + final currentDay = getCurrentAocDay(); + var prompt = 'Please enter a day for which to generate files'; + String? defaultDay; + if (currentDay != null) { + defaultDay = currentDay.toString().padLeft(2, '0'); + prompt += ' ($defaultDay)'; + } + print(prompt); + final input = stdin.readLineSync(); + if (input == null || input.isEmpty) { + return defaultDay; + } else { + return int.parse(input).toString().padLeft(2, '0'); + } +} + +/// Returns the current day of the advent of code calendar, if there is one. +/// The AOC days start at midnight EST from December 1st to December 25th. +@visibleForTesting +int? getCurrentAocDay([DateTime? now]) { + final startDay = DateTime.parse('$year-12-01T05:00:00Z'); + final endDay = DateTime.parse('$year-12-26T05:00:00Z'); + now ??= DateTime.now().toUtc(); + if (now.isAfter(startDay) && now.isBefore(endDay)) { + return now.difference(startDay).inDays + 1; + } + return null; +} + String _dayTemplate(String dayNumber) { return ''' import '../utils/index.dart'; diff --git a/pubspec.lock b/pubspec.lock index 564642e..4dec22a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,90 +5,95 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "36a321c3d2cbe01cbcb3540a87b8843846e0206df3e691fa7b23e19e78de6d49" + sha256: "45cfa8471b89fb6643fe9bf51bd7931a76b8f5ec2d65de4fb176dba8d4f22c77" url: "https://pub.dev" source: hosted - version: "65.0.0" + version: "73.0.0" + _macros: + dependency: transitive + description: dart + source: sdk + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: dfe03b90ec022450e22513b5e5ca1f01c0c01de9c3fba2f7fd233cb57a6b9a07 + sha256: "4959fec185fe70cce007c57e9ab6983101dbe593d2bf8bbfb4453aaec0cf470a" url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.8.0" args: dependency: transitive description: name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.6.0" async: dependency: transitive description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" collection: dependency: "direct main" description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.1.2" coverage: dependency: transitive description: name: coverage - sha256: "595a29b55ce82d53398e1bcc2cba525d7bd7c59faeb2d2540e9d42c390cfeeeb" + sha256: "4b03e11f6d5b8f6e5bb5e9f7889a56fe6c5cbe942da5378ea4d4d7f73ef9dfe5" url: "https://pub.dev" source: hosted - version: "1.6.4" + version: "1.11.0" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.6" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.1" frontend_server_client: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" glob: dependency: transitive description: @@ -109,10 +114,10 @@ packages: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.1" io: dependency: transitive description: @@ -125,50 +130,58 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.1" json_annotation: dependency: transitive description: name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "4.9.0" logging: dependency: transitive description: name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 + url: "https://pub.dev" + source: hosted + version: "1.3.0" + macros: + dependency: transitive + description: + name: macros + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "0.1.2-main.4" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" meta: dependency: "direct main" description: name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.16.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.0" node_preamble: dependency: transitive description: @@ -189,10 +202,10 @@ packages: dependency: transitive description: name: path - sha256: "2ad4cddff7f5cc0e2d13069f2a3f7a73ca18f66abd6f5ecf215219cdb3638edb" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" pool: dependency: transitive description: @@ -213,18 +226,18 @@ packages: dependency: "direct main" description: name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 + sha256: ea0b925899e64ecdfbf9c7becb60d5b50e706ade44a85b2363be2a22d88117d2 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" shelf: dependency: transitive description: name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: @@ -237,26 +250,26 @@ packages: dependency: transitive description: name: shelf_static - sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.3" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "2.0.1" source_map_stack_trace: dependency: transitive description: name: source_map_stack_trace - sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" source_maps: dependency: transitive description: @@ -277,10 +290,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: f8d9f247e2f9f90e32d1495ff32dac7e4ae34ffa7194c5ff8fcc0fd0e52df774 + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" stream_channel: dependency: transitive description: @@ -293,10 +306,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "0bd04f5bb74fcd6ff0606a888a30e917af9bd52820b178eaa464beb11dca84b6" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.4.0" term_glyph: dependency: transitive description: @@ -309,26 +322,26 @@ packages: dependency: "direct main" description: name: test - sha256: a1f7595805820fcc05e5c52e3a231aedd0b72972cb333e8c738a8b1239448b6f + sha256: f2a018e2baa6fce7c8daa55b8bdf4b3d7d165f82caac269e4cbe5edd666c0e4c url: "https://pub.dev" source: hosted - version: "1.24.9" + version: "1.25.9" test_api: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - sha256: a757b14fc47507060a162cc2530d9a4a2f92f5100a952c7443b5cad5ef5b106a + sha256: "60ff490bb383858015df7b7a0d883301a426edf9033989f55f091d91efb9dfaf" url: "https://pub.dev" source: hosted - version: "0.5.9" + version: "0.6.6" timing: dependency: "direct main" description: @@ -341,10 +354,10 @@ packages: dependency: transitive description: name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.4.0" very_good_analysis: dependency: "direct main" description: @@ -357,10 +370,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "14.3.1" watcher: dependency: transitive description: @@ -369,14 +382,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web_socket: + dependency: transitive + description: + name: web_socket + sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" + url: "https://pub.dev" + source: hosted + version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "3.0.1" webkit_inspection_protocol: dependency: transitive description: @@ -394,4 +423,4 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.0.0 <4.0.0" + dart: ">=3.5.0 <4.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 634e439..df6c774 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,10 +3,11 @@ version: 1.0.0 environment: sdk: ">=3.0.0 <4.0.0" + dependencies: collection: ^1.18.0 meta: ^1.11.0 quiver: ^3.2.1 - test: ^1.24.9 + test: ^1.25.9 timing: ^1.0.1 - very_good_analysis: ^5.1.0 + very_good_analysis: ^5.1.0 \ No newline at end of file diff --git a/test/day_generator_test.dart b/test/day_generator_test.dart new file mode 100644 index 0000000..be5bdc6 --- /dev/null +++ b/test/day_generator_test.dart @@ -0,0 +1,44 @@ +import 'package:test/test.dart'; + +import '../day_generator.dart'; + +void main() { + group('DayGenerator', () { + group('getCurrentAocDay', () { + test('should return the current day during the aoc period', () { + // noon December 1st CET + final now = DateTime.parse('2024-12-08T12:00:00+0100'); + + final result = getCurrentAocDay(now); + + expect(result, 8); + }); + + test('should return null if the current day is before the aoc period', + () { + // noon November 30th CET + final dayBefore = DateTime.parse('2024-11-30T12:00:00+0100'); + final rightBeforeStart = DateTime.parse('2024-11-30T23:59:00-0500'); + + expect(getCurrentAocDay(dayBefore), null); + expect(getCurrentAocDay(rightBeforeStart), null); + }); + + test('should return 1 if the current day is the first day of aoc', () { + final rightAfterStart = DateTime.parse('2024-12-01T00:01:00-0500'); + final rightBeforeNextDay = DateTime.parse('2024-12-01T23:59:00-0500'); + + expect(getCurrentAocDay(rightAfterStart), 1); + expect(getCurrentAocDay(rightBeforeNextDay), 1); + }); + + test('should return 25 if the current day is the last day of aoc', () { + final rightAfterEnd = DateTime.parse('2024-12-25T00:01:00-0500'); + final dayAfterEnd = DateTime.parse('2024-12-26T00:01:00-0500'); + + expect(getCurrentAocDay(rightAfterEnd), 25); + expect(getCurrentAocDay(dayAfterEnd), null); + }); + }); + }); +}