Skip to content

Commit

Permalink
feat: #605 - taxonomy - support of packaging materials and shapes (#610)
Browse files Browse the repository at this point in the history
New files:
* `api_getTaxonomyPackagingMaterialsServer_test.dart`: server tests around Packaging Material Taxonomy
* `api_getTaxonomyPackagingShapesServer_test.dart`: server tests around Packaging Shape Taxonomy
* `TaxonomyPackagingMaterial.dart`: Packaging Material Taxonomy classes
* `TaxonomyPackagingMaterial.g.dart`: generated
* `TaxonomyPackagingShape.dart`: Packaging Shape Taxonomy classes
* `TaxonomyPackagingShape.g.dart`: generated

Impacted files:
* `api_get_autocompleted_suggestions_test.dart`: added suggestion tests for packaging materials and shapes
* `openfoodfacts.dart`: added methods `getTaxonomyPackagingMaterials` and `getTaxonomyPackagingShapes`
* `TagType.dart`: added field types for packaging materials and shapes
  • Loading branch information
monsieurtanuki committed Nov 7, 2022
1 parent bfe0f11 commit 43f83a9
Show file tree
Hide file tree
Showing 9 changed files with 924 additions and 1 deletion.
122 changes: 122 additions & 0 deletions lib/model/TaxonomyPackagingMaterial.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import 'package:json_annotation/json_annotation.dart';
import 'package:openfoodfacts/interface/JsonObject.dart';
import 'package:openfoodfacts/model/OffTagged.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:openfoodfacts/utils/CountryHelper.dart';
import 'package:openfoodfacts/utils/TaxonomyQueryConfiguration.dart';
import 'package:openfoodfacts/utils/TagType.dart';

part 'TaxonomyPackagingMaterial.g.dart';

/// Fields of a [TaxonomyPackagingMaterial]
enum TaxonomyPackagingMaterialField implements OffTagged {
ALL(offTag: 'all'),
NAME(offTag: 'name'),
SYNONYMS(offTag: 'synonyms'),
CHILDREN(offTag: 'children'),
PARENTS(offTag: 'parents');

const TaxonomyPackagingMaterialField({required this.offTag});

@override
final String offTag;
}

/// A JSON-serializable version of a Packaging Material taxonomy result.
///
/// See [OpenFoodAPIClient.getTaxonomy] for more details on how to retrieve one
/// of these.
@JsonSerializable()
class TaxonomyPackagingMaterial extends JsonObject {
TaxonomyPackagingMaterial();

factory TaxonomyPackagingMaterial.fromJson(Map<String, dynamic> json) =>
_$TaxonomyPackagingMaterialFromJson(json);

@override
Map<String, dynamic> toJson() => _$TaxonomyPackagingMaterialToJson(this);

/// Standard localized name.
@JsonKey(fromJson: LanguageHelper.fromJsonStringMap, includeIfNull: false)
Map<OpenFoodFactsLanguage, String>? name;

/// Localized synonyms of the name.
@JsonKey(fromJson: LanguageHelper.fromJsonStringMapList, includeIfNull: false)
Map<OpenFoodFactsLanguage, List<String>>? synonyms;

/// Children.
@JsonKey(includeIfNull: false)
List<String>? children;

/// Parents.
@JsonKey(includeIfNull: false)
List<String>? parents;

@override
String toString() => toJson().toString();
}

/// Configuration for packaging materials API query.
class TaxonomyPackagingMaterialQueryConfiguration
extends TaxonomyQueryConfiguration<TaxonomyPackagingMaterial,
TaxonomyPackagingMaterialField> {
/// Configuration to get the packaging materials that match the [tags].
TaxonomyPackagingMaterialQueryConfiguration({
required List<String> tags,
List<OpenFoodFactsLanguage>? languages,
OpenFoodFactsCountry? country,
List<TaxonomyPackagingMaterialField> fields = const [],
List<Parameter> additionalParameters = const [],
bool includeChildren = false,
}) : super(
TagType.PACKAGING_MATERIALS,
tags,
languages: languages,
country: country,
includeChildren: includeChildren,
fields: fields,
additionalParameters: additionalParameters,
);

TaxonomyPackagingMaterialQueryConfiguration.roots({
List<OpenFoodFactsLanguage>? languages,
OpenFoodFactsCountry? country,
List<TaxonomyPackagingMaterialField> fields = const [],
List<Parameter> additionalParameters = const [],
bool includeChildren = false,
}) : super.roots(
TagType.PACKAGING_MATERIALS,
languages: languages,
country: country,
includeChildren: includeChildren,
fields: fields,
additionalParameters: additionalParameters,
);

@override
Map<String, TaxonomyPackagingMaterial> convertResults(dynamic jsonData) {
if (jsonData is! Map<String, dynamic>) {
return const {};
}
return jsonData
.map<String, TaxonomyPackagingMaterial>((String key, dynamic taxonomy) {
if (taxonomy is! Map<String, dynamic>) {
assert(false, 'Received JSON Packaging Material is not a Map');
return MapEntry(key, TaxonomyPackagingMaterial.fromJson({}));
}
return MapEntry(key, TaxonomyPackagingMaterial.fromJson(taxonomy));
});
}

@override
Set<TaxonomyPackagingMaterialField> get ignoredFields =>
const {TaxonomyPackagingMaterialField.ALL};

@override
Iterable<String> convertFieldsToStrings(
Iterable<TaxonomyPackagingMaterialField> fields) =>
fields
.where((TaxonomyPackagingMaterialField field) =>
!ignoredFields.contains(field))
.map<String>((TaxonomyPackagingMaterialField field) => field.offTag);
}
230 changes: 230 additions & 0 deletions lib/model/TaxonomyPackagingMaterial.g.dart

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

Loading

0 comments on commit 43f83a9

Please sign in to comment.