Skip to content

Commit

Permalink
feat: #379 - added packaging_text_XX (#380)
Browse files Browse the repository at this point in the history
Impacted files:
* `api_getProduct_test.dart`: added "packaging text in languages" test
* `Product.dart`: added packaging text language field and code; refactored
* `Product.g.dart`: generated
* `ProductFields.dart`: added packaging text language fields
* `ProductHelper.dart`: added packaging text language code
  • Loading branch information
monsieurtanuki committed Feb 5, 2022
1 parent 3bc5828 commit cf492c5
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 26 deletions.
79 changes: 53 additions & 26 deletions lib/model/Product.dart
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,12 @@ class Product extends JsonObject {
String? packaging;
@JsonKey(name: 'packaging_tags', includeIfNull: false)
List<String>? packagingTags;
@JsonKey(
name: 'packaging_text_in_languages',
fromJson: LanguageHelper.fromJsonStringMap,
toJson: LanguageHelper.toJsonStringMap,
includeIfNull: false)
Map<OpenFoodFactsLanguage, String>? packagingTextInLanguages;

@JsonKey(name: 'misc', includeIfNull: false)
List<String>? miscTags;
Expand Down Expand Up @@ -425,41 +431,36 @@ class Product extends JsonObject {
// We store those values in a more structured maps like
// [productNameInLanguages].
if (key == ProductField.NAME_ALL_LANGUAGES.key) {
final langs = json[key];
if (langs is Map<String, dynamic>) {
final Map<OpenFoodFactsLanguage, String>? localized =
_getLocalizedStrings(json[key]);
if (localized != null) {
result.productNameInLanguages ??= {};
for (final langValuePair in langs.entries) {
final lang = LanguageHelper.fromJson(langValuePair.key);
if (lang == OpenFoodFactsLanguage.UNDEFINED) {
continue;
}
final value = langValuePair.value;
result.productNameInLanguages![lang] = value.toString();
}
result.productNameInLanguages!.addAll(localized);
}
} else if (key == ProductField.INGREDIENTS_TEXT_ALL_LANGUAGES.key) {
final langs = json[key];
if (langs is Map<String, dynamic>) {
final Map<OpenFoodFactsLanguage, String>? localized =
_getLocalizedStrings(json[key]);
if (localized != null) {
result.ingredientsTextInLanguages ??= {};
for (final langValuePair in langs.entries) {
final lang = LanguageHelper.fromJson(langValuePair.key);
if (lang == OpenFoodFactsLanguage.UNDEFINED) {
continue;
}
final value = langValuePair.value;
result.ingredientsTextInLanguages![lang] = value.toString();
}
result.ingredientsTextInLanguages!.addAll(localized);
}
} else if (key == ProductField.PACKAGING_TEXT_ALL_LANGUAGES.key) {
final Map<OpenFoodFactsLanguage, String>? localized =
_getLocalizedStrings(json[key]);
if (localized != null) {
result.packagingTextInLanguages ??= {};
result.packagingTextInLanguages!.addAll(localized);
}
} else if (key.startsWith(ProductField.NAME_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.NAME_IN_LANGUAGES.key);
if (lang != OpenFoodFactsLanguage.UNDEFINED) {
result.productNameInLanguages ??= {};
result.productNameInLanguages![lang] = json[key];
}
} else if (key
.startsWith(ProductField.CATEGORIES_TAGS_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.CATEGORIES_TAGS_IN_LANGUAGES.key);
final values = _jsonValueToList(json[key]);
if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
Expand All @@ -468,7 +469,7 @@ class Product extends JsonObject {
}
} else if (key
.startsWith(ProductField.INGREDIENTS_TAGS_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.INGREDIENTS_TAGS_IN_LANGUAGES.key);
final values = _jsonValueToList(json[key]);
if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
Expand All @@ -486,15 +487,15 @@ class Product extends JsonObject {
result.imagesFreshnessInLanguages![lang] = values;
}
} else if (key.startsWith(ProductField.LABELS_TAGS_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.LABELS_TAGS_IN_LANGUAGES.key);
final values = _jsonValueToList(json[key]);
if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
result.labelsTagsInLanguages ??= {};
result.labelsTagsInLanguages![lang] = values;
}
} else if (key.startsWith(ProductField.COUNTRIES_TAGS_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.COUNTRIES_TAGS_IN_LANGUAGES.key);
final values = _jsonValueToList(json[key]);
if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
Expand All @@ -503,13 +504,39 @@ class Product extends JsonObject {
}
} else if (key
.startsWith(ProductField.INGREDIENTS_TEXT_IN_LANGUAGES.key)) {
OpenFoodFactsLanguage lang =
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.INGREDIENTS_TEXT_IN_LANGUAGES.key);
if (lang != OpenFoodFactsLanguage.UNDEFINED) {
result.ingredientsTextInLanguages ??= {};
result.ingredientsTextInLanguages![lang] = json[key];
}
} else if (key.startsWith(ProductField.PACKAGING_TEXT_IN_LANGUAGES.key)) {
final OpenFoodFactsLanguage lang =
_langFrom(key, ProductField.PACKAGING_TEXT_IN_LANGUAGES.key);
if (lang != OpenFoodFactsLanguage.UNDEFINED) {
result.packagingTextInLanguages ??= {};
result.packagingTextInLanguages![lang] = json[key];
}
}
}
return result;
}

static Map<OpenFoodFactsLanguage, String>? _getLocalizedStrings(
final dynamic langs,
) {
Map<OpenFoodFactsLanguage, String>? result;
if (!langs is Map<String, dynamic>) {
return result;
}
for (final langValuePair in langs.entries) {
final lang = LanguageHelper.fromJson(langValuePair.key);
if (lang == OpenFoodFactsLanguage.UNDEFINED) {
continue;
}
final value = langValuePair.value;
result ??= <OpenFoodFactsLanguage, String>{};
result[lang] = value.toString();
}
return result;
}
Expand Down
4 changes: 4 additions & 0 deletions lib/model/Product.g.dart

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

5 changes: 5 additions & 0 deletions lib/utils/ProductFields.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ enum ProductField {
LABELS_TAGS_IN_LANGUAGES,
PACKAGING,
PACKAGING_TAGS,
PACKAGING_TEXT_IN_LANGUAGES,
PACKAGING_TEXT_ALL_LANGUAGES,
MISC_TAGS,
STATES_TAGS,
TRACES_TAGS,
Expand Down Expand Up @@ -105,6 +107,8 @@ extension ProductFieldExtension on ProductField {
ProductField.INGREDIENTS_TEXT: 'ingredients_text',
ProductField.INGREDIENTS_TEXT_IN_LANGUAGES: 'ingredients_text_',
ProductField.INGREDIENTS_TEXT_ALL_LANGUAGES: 'ingredients_text_languages',
ProductField.PACKAGING_TEXT_IN_LANGUAGES: 'packaging_text_',
ProductField.PACKAGING_TEXT_ALL_LANGUAGES: 'packaging_text_languages',
ProductField.NUTRIMENT_ENERGY_UNIT: 'nutriment_energy_unit',
ProductField.NUTRIMENT_DATA_PER: 'nutrition_data_per',
ProductField.NUTRISCORE: 'nutrition_grade_fr',
Expand Down Expand Up @@ -149,6 +153,7 @@ List<String> convertFieldsToStrings(
ProductField.NAME_IN_LANGUAGES,
ProductField.COUNTRIES_TAGS_IN_LANGUAGES,
ProductField.INGREDIENTS_TEXT_IN_LANGUAGES,
ProductField.PACKAGING_TEXT_IN_LANGUAGES,
ProductField.INGREDIENTS_TAGS_IN_LANGUAGES,
ProductField.IMAGES_FRESHNESS_IN_LANGUAGES,
];
Expand Down
4 changes: 4 additions & 0 deletions lib/utils/ProductHelper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ class ProductHelper {
product.ingredientsTextInLanguages![language] =
source['ingredients_text_${language.code}'];

product.packagingTextInLanguages ??= {};
product.packagingTextInLanguages![language] =
source['packaging_text_${language.code}'];

product.productNameInLanguages = {};
product.productNameInLanguages![language] =
source['product_name_${language.code}'];
Expand Down
25 changes: 25 additions & 0 deletions test/api_getProduct_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,31 @@ void main() {
expect(result.product!.countries, 'United States');
});

test('get packaging text in languages (Coca-Cola)', () async {
const String barcode = '5449000000996';
const List<OpenFoodFactsLanguage> languages = [
OpenFoodFactsLanguage.ENGLISH,
OpenFoodFactsLanguage.FRENCH,
];

final ProductQueryConfiguration configurations =
ProductQueryConfiguration(
barcode,
languages: languages,
fields: [ProductField.PACKAGING_TEXT_IN_LANGUAGES],
);
final ProductResult result = await OpenFoodAPIClient.getProduct(
configurations,
user: TestConstants.TEST_USER,
);
expect(result.status, 1);
expect(result.product, isNotNull);
expect(result.product!.packagingTextInLanguages, isNotNull);
for (final OpenFoodFactsLanguage language in languages) {
expect(result.product!.packagingTextInLanguages![language], isNotNull);
}
});

test('check alcohol data', () async {
const String barcode = '3119780259625';

Expand Down

0 comments on commit cf492c5

Please sign in to comment.