Skip to content

Commit

Permalink
feat: MusicRepository (#5)
Browse files Browse the repository at this point in the history
  • Loading branch information
jneschisi authored Jul 29, 2024
1 parent 2eb4451 commit 712b68d
Show file tree
Hide file tree
Showing 17 changed files with 347 additions and 0 deletions.
44 changes: 44 additions & 0 deletions packages/music_repository/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# VSCode related
.vscode/*

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
pubspec.lock

# Web related
lib/generated_plugin_registrant.dart

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Test related
coverage
67 changes: 67 additions & 0 deletions packages/music_repository/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# Music Repository

[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason)
[![License: MIT][license_badge]][license_link]

Repository of music tracks

## Installation 💻

**❗ In order to start using Music Repository you must have the [Flutter SDK][flutter_install_link] installed on your machine.**

Install via `flutter pub add`:

```sh
dart pub add music_repository
```

---

## Continuous Integration 🤖

Music Repository comes with a built-in [GitHub Actions workflow][github_actions_link] powered by [Very Good Workflows][very_good_workflows_link] but you can also add your preferred CI/CD solution.

Out of the box, on each pull request and push, the CI `formats`, `lints`, and `tests` the code. This ensures the code remains consistent and behaves correctly as you add functionality or make changes. The project uses [Very Good Analysis][very_good_analysis_link] for a strict set of analysis options used by our team. Code coverage is enforced using the [Very Good Workflows][very_good_coverage_link].

---

## Running Tests 🧪

For first time users, install the [very_good_cli][very_good_cli_link]:

```sh
dart pub global activate very_good_cli
```

To run all unit tests:

```sh
very_good test --coverage
```

To view the generated coverage report you can use [lcov](https://github.com/linux-test-project/lcov).

```sh
# Generate Coverage Report
genhtml coverage/lcov.info -o coverage/

# Open Coverage Report
open coverage/index.html
```

[flutter_install_link]: https://docs.flutter.dev/get-started/install
[github_actions_link]: https://docs.github.com/en/actions/learn-github-actions
[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
[license_link]: https://opensource.org/licenses/MIT
[logo_black]: https://raw.githubusercontent.com/VGVentures/very_good_brand/main/styles/README/vgv_logo_black.png#gh-light-mode-only
[logo_white]: https://raw.githubusercontent.com/VGVentures/very_good_brand/main/styles/README/vgv_logo_white.png#gh-dark-mode-only
[mason_link]: https://github.com/felangel/mason
[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg
[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis
[very_good_cli_link]: https://pub.dev/packages/very_good_cli
[very_good_coverage_link]: https://github.com/marketplace/actions/very-good-coverage
[very_good_ventures_link]: https://verygood.ventures
[very_good_ventures_link_light]: https://verygood.ventures#gh-light-mode-only
[very_good_ventures_link_dark]: https://verygood.ventures#gh-dark-mode-only
[very_good_workflows_link]: https://github.com/VeryGoodOpenSource/very_good_workflows
1 change: 1 addition & 0 deletions packages/music_repository/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include: package:very_good_analysis/analysis_options.6.0.0.yaml
20 changes: 20 additions & 0 deletions packages/music_repository/coverage_badge.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 44 additions & 0 deletions packages/music_repository/lib/gen/assets.gen.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions packages/music_repository/lib/music_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/// Repository of music tracks
library;

export 'src/model/model.dart';
export 'src/music_repository.dart';
1 change: 1 addition & 0 deletions packages/music_repository/lib/src/model/model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export 'music_track.dart';
29 changes: 29 additions & 0 deletions packages/music_repository/lib/src/model/music_track.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:equatable/equatable.dart';

/// {@template music_track}
/// Contains information about a music track.
/// {@endtemplate}
class MusicTrack extends Equatable {
/// {@macro music_track}
const MusicTrack({
required this.index,
required this.title,
required this.artist,
required this.path,
});

/// The index of the track in the playlist.
final int index;

/// The title of the track.
final String title;

/// The author of the track.
final String artist;

/// The path to the track file.
final String path;

@override
List<Object?> get props => [index, title, artist, path];
}
48 changes: 48 additions & 0 deletions packages/music_repository/lib/src/music_repository.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import 'package:music_repository/gen/assets.gen.dart';
import 'package:music_repository/music_repository.dart';

/// {@template music_repository}
/// Repository of music tracks
/// {@endtemplate}
class MusicRepository {
/// {@macro music_repository}
MusicRepository();

/// Returns the list of available music tracks.
List<MusicTrack> getTracks() {
const basePath = 'packages/music_repository/';
final tracks = Assets.lib.tracks;
return [
MusicTrack(
index: 0,
title: 'Arpent',
artist: 'Kevin MacLead',
path: basePath + tracks.arpent,
),
MusicTrack(
index: 1,
title: 'Groovin',
artist: 'Bryan Boyko',
path: basePath + tracks.groovin,
),
MusicTrack(
index: 2,
title: 'Motions',
artist: 'Rafael Krux',
path: basePath + tracks.motions,
),
MusicTrack(
index: 3,
title: 'Trip Up North',
artist: 'Bryan Teoh',
path: basePath + tracks.tripUpNorth,
),
MusicTrack(
index: 4,
title: 'Windy Old Weather',
artist: 'Kevin MacLead',
path: basePath + tracks.windyOldWeather,
),
];
}
}
Binary file added packages/music_repository/lib/tracks/Arpent.mp3
Binary file not shown.
Binary file added packages/music_repository/lib/tracks/Groovin.mp3
Binary file not shown.
Binary file added packages/music_repository/lib/tracks/Motions.mp3
Binary file not shown.
Binary file not shown.
Binary file not shown.
26 changes: 26 additions & 0 deletions packages/music_repository/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: music_repository
description: Repository of music tracks
version: 0.1.0+1
publish_to: none

environment:
sdk: ^3.4.0
flutter: ^3.22.0

dependencies:
equatable: ^2.0.5
flutter:
sdk: flutter
just_audio: ^0.9.37

dev_dependencies:
build_runner: ^2.4.11
flutter_gen_runner: ^5.6.0
flutter_test:
sdk: flutter
mocktail: ^1.0.4
very_good_analysis: ^6.0.0

flutter:
assets:
- lib/tracks/
46 changes: 46 additions & 0 deletions packages/music_repository/test/src/model/music_track_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// ignore_for_file: prefer_const_constructors

import 'package:flutter_test/flutter_test.dart';
import 'package:music_repository/music_repository.dart';

void main() {
group('MusicTrack', () {
group('supports instance comparison', () {
test('with equal instances', () {
expect(
MusicTrack(
index: 0,
title: 'title',
artist: 'artist',
path: 'path',
),
MusicTrack(
index: 0,
title: 'title',
artist: 'artist',
path: 'path',
),
);
});

test('with non-equal instances', () {
expect(
MusicTrack(
index: 0,
title: 'title',
artist: 'artist',
path: 'path',
),
isNot(
MusicTrack(
index: 1,
title: 'title1',
artist: 'artist1',
path: 'path1',
),
),
);
});
});
});
}
16 changes: 16 additions & 0 deletions packages/music_repository/test/src/music_repository_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// ignore_for_file: prefer_const_constructors

import 'package:flutter_test/flutter_test.dart';
import 'package:music_repository/music_repository.dart';

void main() {
group('MusicRepository', () {
test('can be instantiated', () {
expect(MusicRepository(), isNotNull);
});

test('getTracks returns a list of [MusicTrack]', () {
expect(MusicRepository().getTracks(), isA<List<MusicTrack>>());
});
});
}

0 comments on commit 712b68d

Please sign in to comment.