Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • android/org.benoitharrault.sortgame
1 result
Select Git revision
Show changes
Commits on Source (4)
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
app.versionName=0.0.18
app.versionCode=18
app.versionName=0.0.20
app.versionCode=20
Add script to manage data, improve dataset.
Improve data and management script.
Ajout d'un script de gestion des données, compléments sur le jeu de données.
Améliorations des données et du script de gestion.
......@@ -71,9 +71,9 @@ class GameData {
"mapping": {
"items": {
"ABEILLE": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte"],
"na": ["liquide"]
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": []
},
"AMPOULE": {
"is": ["artificiel", "inerte", "solide"],
......@@ -81,8 +81,8 @@ class GameData {
"na": []
},
"ARBRE": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "inerte", "liquide"],
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": []
},
"ASPIRATEUR": {
......@@ -96,13 +96,13 @@ class GameData {
"na": []
},
"BANANE": {
"is": ["solide", "vivant"],
"isnot": ["gazeux", "inerte", "liquide"],
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": []
},
"BERCEAU": {
"is": ["artificiel", "inerte"],
"isnot": ["liquide", "naturel", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"BONBON": {
......@@ -116,23 +116,23 @@ class GameData {
"na": []
},
"BROUETTE": {
"is": ["artificiel", "inerte"],
"isnot": ["liquide", "naturel", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"CAFETIÈRE": {
"is": ["inerte"],
"isnot": ["liquide", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"CANARD": {
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["liquide"]
"na": []
},
"CASQUETTE": {
"is": ["artificiel", "inerte"],
"isnot": ["liquide", "naturel", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"CHAISE": {
......@@ -156,9 +156,9 @@ class GameData {
"na": ["liquide", "solide"]
},
"CONFITURE": {
"is": ["inerte", "solide"],
"isnot": ["gazeux", "liquide", "vivant"],
"na": ["liquide"]
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"CORDE": {
"is": ["artificiel", "inerte", "solide"],
......@@ -176,14 +176,14 @@ class GameData {
"na": []
},
"FENÊTRE": {
"is": ["artificiel", "inerte"],
"isnot": ["naturel", "vivant"],
"na": ["liquide"]
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"FOURMI": {
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["liquide"]
"na": []
},
"FUSÉE": {
"is": ["artificiel", "inerte", "solide"],
......@@ -191,18 +191,18 @@ class GameData {
"na": []
},
"GOURDE": {
"is": ["artificiel", "solide"],
"isnot": ["gazeux", "liquide", "naturel"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"GUÊPE": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "inerte"],
"na": ["liquide"]
"na": ["gazeux", "liquide", "solide"]
},
"HÉLICOPTÈRE": {
"is": ["artificiel", "inerte"],
"isnot": ["gazeux", "naturel", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"KANGOUROU": {
......@@ -218,11 +218,11 @@ class GameData {
"LICORNE": {
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["naturel"]
"na": []
},
"LIVRE": {
"is": ["artificiel"],
"isnot": ["liquide", "naturel"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"MAISON": {
......@@ -231,28 +231,28 @@ class GameData {
"na": []
},
"MOUCHE": {
"is": ["naturel"],
"isnot": ["artificiel"],
"na": ["liquide"]
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte"],
"na": ["liquide", "solide"]
},
"NOEUD": {
"is": ["inerte"],
"isnot": ["liquide", "vivant"],
"na": ["artificiel", "solide"]
"is": ["artificiel", "inerte"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": ["solide"]
},
"ORAGE": {
"is": ["inerte", "naturel"],
"isnot": ["artificiel", "vivant"],
"isnot": ["artificiel", "gazeux", "liquide", "vivant"],
"na": ["solide"]
},
"OURS": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte"],
"na": ["liquide"]
"na": ["liquide", "solide"]
},
"PAPILLON": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["solide"]
},
"PEIGNE": {
......@@ -271,7 +271,7 @@ class GameData {
"na": []
},
"PIZZA": {
"is": ["artificiel", "inerte"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
......@@ -286,19 +286,19 @@ class GameData {
"na": ["liquide", "solide"]
},
"PUZZLE": {
"is": ["artificiel", "inerte"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"PÊCHE": {
"is": ["naturel", "vivant"],
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": []
},
"REQUIN": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "inerte"],
"na": []
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["solide"]
},
"ROSE": {
"is": ["naturel", "solide", "vivant"],
......@@ -311,19 +311,19 @@ class GameData {
"na": []
},
"SANGLIER": {
"is": ["naturel"],
"isnot": ["artificiel", "gazeux"],
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["solide"]
},
"SAVON": {
"is": ["artificiel", "inerte"],
"isnot": ["naturel", "vivant"],
"isnot": ["gazeux", "naturel", "vivant"],
"na": ["liquide", "solide"]
},
"SINGE": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "inerte"],
"na": []
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["solide"]
},
"STADE": {
"is": ["artificiel", "inerte", "solide"],
......@@ -348,17 +348,17 @@ class GameData {
"TORTUE": {
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["liquide"]
"na": []
},
"TROMPETTE": {
"is": ["inerte", "solide"],
"isnot": ["gazeux", "liquide", "vivant"],
"is": ["artificiel", "inerte", "solide"],
"isnot": ["gazeux", "liquide", "naturel", "vivant"],
"na": []
},
"VACHE": {
"is": ["naturel", "solide", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["liquide"]
"na": []
},
"VOILIER": {
"is": ["artificiel", "inerte", "solide"],
......@@ -367,7 +367,7 @@ class GameData {
},
"ZÈBRE": {
"is": ["naturel", "vivant"],
"isnot": ["artificiel", "gazeux", "inerte"],
"isnot": ["artificiel", "gazeux", "inerte", "liquide"],
"na": ["solide"]
}
}
......
......@@ -3,7 +3,7 @@ description: A sorting game application.
publish_to: 'none'
version: 0.0.18+18
version: 0.0.20+20
environment:
sdk: '^3.0.0'
......
{
"categories": [
"artificiel",
"gazeux",
"inerte",
"liquide",
"naturel",
"solide",
"vivant"
],
"exclusions": [
[
"liquide",
"solide",
"gazeux"
],
[
"inerte",
"vivant"
],
[
"naturel",
"artificiel"
]
],
"items": [
"ABEILLE",
"AMPOULE",
"ARBRE",
"ASPIRATEUR",
"BALAI",
"BANANE",
"BERCEAU",
"BONBON",
"BOUGIE",
"BROUETTE",
"CAFETIÈRE",
"CANARD",
"CASQUETTE",
"CHAISE",
"CHAUSSURE",
"CINTRE",
"COCCINELLE",
"CONFITURE",
"CORDE",
"CROCODILE",
"DROMADAIRE",
"FENÊTRE",
"FOURMI",
"FUSÉE",
"GOURDE",
"GUÊPE",
"HÉLICOPTÈRE",
"KANGOUROU",
"LAMPE",
"LICORNE",
"LIVRE",
"MAISON",
"MOUCHE",
"NOEUD",
"ORAGE",
"OURS",
"PAPILLON",
"PEIGNE",
"PENDULE",
"PIANO",
"PIZZA",
"POMME",
"POULET",
"PUZZLE",
"PÊCHE",
"REQUIN",
"ROSE",
"SAC À DOS",
"SANGLIER",
"SAVON",
"SINGE",
"STADE",
"TABOURET",
"TARTINE",
"TIROIR",
"TORTUE",
"TROMPETTE",
"VACHE",
"VOILIER",
"ZÈBRE"
],
"mapping": {
"items": {
"ABEILLE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"AMPOULE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"ARBRE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"ASPIRATEUR": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"BALAI": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"BANANE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"BERCEAU": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"BONBON": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"BOUGIE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"BROUETTE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CAFETIÈRE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CANARD": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"CASQUETTE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CHAISE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CHAUSSURE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CINTRE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"COCCINELLE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte"
],
"na": [
"liquide",
"solide"
]
},
"CONFITURE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CORDE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"CROCODILE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte"
],
"na": [
"liquide",
"solide"
]
},
"DROMADAIRE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"FENÊTRE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"FOURMI": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"FUSÉE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"GOURDE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"GUÊPE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"inerte"
],
"na": [
"gazeux",
"liquide",
"solide"
]
},
"HÉLICOPTÈRE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"KANGOUROU": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"LAMPE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"LICORNE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"LIVRE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"MAISON": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"MOUCHE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte"
],
"na": [
"liquide",
"solide"
]
},
"NOEUD": {
"is": [
"artificiel",
"inerte"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": [
"solide"
]
},
"ORAGE": {
"is": [
"inerte",
"naturel"
],
"isnot": [
"artificiel",
"gazeux",
"liquide",
"vivant"
],
"na": [
"solide"
]
},
"OURS": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte"
],
"na": [
"liquide",
"solide"
]
},
"PAPILLON": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": [
"solide"
]
},
"PEIGNE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"PENDULE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"PIANO": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"PIZZA": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"POMME": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"POULET": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte"
],
"na": [
"liquide",
"solide"
]
},
"PUZZLE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"PÊCHE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"REQUIN": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": [
"solide"
]
},
"ROSE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"SAC À DOS": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"SANGLIER": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": [
"solide"
]
},
"SAVON": {
"is": [
"artificiel",
"inerte"
],
"isnot": [
"gazeux",
"naturel",
"vivant"
],
"na": [
"liquide",
"solide"
]
},
"SINGE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": [
"solide"
]
},
"STADE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"TABOURET": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"TARTINE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"TIROIR": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"TORTUE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"TROMPETTE": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"VACHE": {
"is": [
"naturel",
"solide",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": []
},
"VOILIER": {
"is": [
"artificiel",
"inerte",
"solide"
],
"isnot": [
"gazeux",
"liquide",
"naturel",
"vivant"
],
"na": []
},
"ZÈBRE": {
"is": [
"naturel",
"vivant"
],
"isnot": [
"artificiel",
"gazeux",
"inerte",
"liquide"
],
"na": [
"solide"
]
}
}
}
}
<?php
function dump(string $string)
{
echo $string . PHP_EOL;
}
function write_data(array $data, string $filename)
{
\file_put_contents($filename, \json_encode($data));
}
function array_clean(array $array)
{
$output = \array_unique($array);
\sort($output);
return $output;
}
function ask(string $prompt)
{
dump($prompt);
$input = \rtrim(\fgets(STDIN));
return $input;
}
function find_missing_associations(array $mappingItems, array $categories, array $items)
{
$missing = [];
foreach ($items as $item) {
$set = \array_merge(
$mappingItems[$item]['is'],
$mappingItems[$item]['isnot'],
$mappingItems[$item]['na'],
);
foreach ($categories as $category) {
if (!\in_array($category, $set)) {
$missing[] = [
'item' => $item,
'category' => $category,
];
}
}
}
return $missing;
}
function find_exclusions(array $exclusions, string $searchedCategory)
{
$output = [];
foreach ($exclusions as $exclusionSet) {
if (\is_array($exclusionSet) && \in_array($searchedCategory, $exclusionSet)) {
foreach ($exclusionSet as $candidate) {
if ($candidate !== $searchedCategory) {
$output[] = $candidate;
}
}
}
}
return $output;
}
function clean_item_mappings(array $itemMappings)
{
$itemMappings['is'] = array_clean($itemMappings['is']);
$itemMappings['isnot'] = array_clean($itemMappings['isnot']);
$itemMappings['na'] = array_clean($itemMappings['na']);
// remove duplicates
$itemMappings['is'] = array_clean($itemMappings['is']);
$tmpArray = [];
foreach (array_clean($itemMappings['isnot']) as $itemIsNot) {
if (!\in_array($itemIsNot, $itemMappings['is'])) {
$tmpArray[] = $itemIsNot;
}
}
$itemMappings['isnot'] = $tmpArray;
$tmpArray = [];
foreach (array_clean($itemMappings['na']) as $itemNa) {
if (!\in_array($itemNa, $itemMappings['is']) && !\in_array($itemNa, $itemMappings['isnot'])) {
$tmpArray[] = $itemNa;
}
}
$itemMappings['na'] = $tmpArray;
return $itemMappings;
}
if ($argc != 2) {
dump('Need data json file as parameter.');
die;
}
$jsonDataFile = $argv[1];
$data = [];
if (is_file($jsonDataFile)) {
$data = \json_decode(\file_get_contents($jsonDataFile), true);
}
if (!is_writable($jsonDataFile)) {
dump('Output data json file is not writable.');
die;
}
$categories = (\array_key_exists('categories', $data) && \is_array($data['categories'])) ? $data['categories'] : [];;
$items = (\array_key_exists('items', $data) && \is_array($data['items'])) ? $data['items'] : [];;
// Manage categories exclusions
$exclusions = (\array_key_exists('exclusions', $data) && \is_array($data['exclusions'])) ? $data['exclusions'] : [];
// Merge categories with categories found in exclusions
foreach ($exclusions as $exclusionSet) {
foreach ($exclusionSet as $category) {
$categories[] = $category;
}
}
$categories = array_clean($categories);
$items = array_clean($items);
$data['categories'] = $categories;
$data['items'] = $items;
$data['exclusions'] = $exclusions;
dump('');
dump('Found ' . \count($categories) . ' unique categories.');
dump('Found ' . \count($items) . ' unique items.');
dump('Found ' . \count($exclusions) . ' exclusions sets.');
// Get/init mapping data
$mapping = (\array_key_exists('mapping', $data) && \is_array($data['mapping'])) ? $data['mapping'] : [];
$mappingItems = (\array_key_exists('items', $mapping) && \is_array($mapping['items'])) ? $mapping['items'] : [];
foreach ($items as $item) {
if (!\array_key_exists($item, $mappingItems)) {
$mappingItems[$item] = [];
}
if (!\array_key_exists('is', $mappingItems[$item]) || !\is_array($mappingItems[$item])) {
$mappingItems[$item]['is'] = [];
}
if (!\array_key_exists('isnot', $mappingItems[$item]) || !\is_array($mappingItems[$item])) {
$mappingItems[$item]['isnot'] = [];
}
if (!\array_key_exists('na', $mappingItems[$item]) || !\is_array($mappingItems[$item])) {
$mappingItems[$item]['na'] = [];
}
$mappingItems[$item] = clean_item_mappings($mappingItems[$item]);
}
// TODO: Should check/add unkown items from current mapping
\ksort($mappingItems);
$data['mapping'] = [
'items' => $mappingItems,
];
function showCategories($categories)
{
dump(\join("\n", $categories));
}
function showItems($items)
{
dump(\join("\n", $items));
}
function showExclusions($exclusions)
{
foreach ($exclusions as $exclusionSet) {
dump(\join(', ', $exclusionSet));
}
}
function showMappings($mappingItems)
{
$columnsWidths = [
'items' => 0,
];
$items = \array_keys($mappingItems);
$categories = [];
foreach ($mappingItems as $item => $mapping) {
if ($columnsWidths['items'] < \mb_strlen($item)) {
$columnsWidths['items'] = \mb_strlen($item);
}
foreach (\array_merge($mapping['is'], $mapping['isnot'], $mapping['na']) as $category) {
if (!\in_array($category, $categories)) {
$categories[] = $category;
if (!\array_key_exists($category, $columnsWidths)) {
$columnsWidths[$category] = 0;
}
if ($columnsWidths[$category] < \mb_strlen($category)) {
$columnsWidths[$category] = \mb_strlen($category);
}
}
}
}
$strIs = '✅';
$strIsNot = '❌';
$strNa = '⛔';
// separator
$line = [
\mb_str_pad('', $columnsWidths['items'], '-', STR_PAD_BOTH),
];
foreach ($categories as $category) {
$line[] = \mb_str_pad('', $columnsWidths[$category], '-', STR_PAD_BOTH);
}
dump('--' . \join('---', $line) . '--');
// header
$line = [
\mb_str_pad('', $columnsWidths['items'], ' ', STR_PAD_BOTH),
];
foreach ($categories as $category) {
$line[] = \mb_str_pad($category, $columnsWidths[$category], ' ', STR_PAD_BOTH);
}
dump('| ' . \join(' | ', $line) . ' |');
// separator
$line = [
\mb_str_pad('', $columnsWidths['items'], '-', STR_PAD_BOTH),
];
foreach ($categories as $category) {
$line[] = \mb_str_pad('', $columnsWidths[$category], '-', STR_PAD_BOTH);
}
dump('|-' . \join('-|-', $line) . '-|');
foreach ($items as $item) {
$line = [
\mb_str_pad($item, $columnsWidths['items'], ' ', STR_PAD_RIGHT),
];
foreach ($categories as $category) {
$value = '';
if (\in_array($category, $mappingItems[$item]['is'])) {
$value = $strIs;
} elseif (\in_array($category, $mappingItems[$item]['isnot'])) {
$value = $strIsNot;
} elseif (\in_array($category, $mappingItems[$item]['na'])) {
$value = $strNa;
}
$line[] = \mb_str_pad($value, $columnsWidths[$category], ' ', STR_PAD_BOTH);
}
dump('| ' . \join(' | ', $line) . ' |');
}
// separator
$line = [
\mb_str_pad('', $columnsWidths['items'], '-', STR_PAD_BOTH),
];
foreach ($categories as $category) {
$line[] = \mb_str_pad('', $columnsWidths[$category], '-', STR_PAD_BOTH);
}
dump('--' . \join('---', $line) . '--');
}
function editMappings($mappingItems, $categories, $items, $exclusions)
{
// Set missing associations
$exitEditMappings = false;
$missing = find_missing_associations($mappingItems, $categories, $items);
while ((\count($missing) !== 0) && ($exitEditMappings === false)) {
dump('');
dump('Missing associations: ' . \count($missing));
dump('');
$picked = $missing[mt_rand(0, \count($missing) - 1)];
$item = $picked['item'];
$category = $picked['category'];
$question = 'Is "' . $item . '" can be categorised as "' . $category . '"?';
$ex = find_exclusions($exclusions, $category);
if (\count($ex) !== 0) {
$question .= ' (and apply accordingly to "' . join('" and "', $ex) . '")';
}
dump($question);
$answer = ask('1: yes ; 2: no ; 3: n/a ; 0: exit');
switch ($answer) {
case '0':
$exitEditMappings = true;
break;
case '1':
dump(' -> "' . $item . '" is "' . $category . '"');
$mappingItems[$item]['is'][] = $category;
// apply "is not" to each other
foreach ($ex as $exclusion) {
dump(' -> "' . $item . '" is not "' . $exclusion . '"');
$mappingItems[$item]['isnot'][] = $exclusion;
}
break;
case '2':
dump(' -> "' . $item . '" is not "' . $category . '"');
$mappingItems[$item]['isnot'][] = $category;
// apply "is" only if one exclusion
if (\count($ex) === 1) {
foreach ($ex as $exclusion) {
dump(' -> "' . $item . '" is "' . $exclusion . '"');
$mappingItems[$item]['is'][] = $exclusion;
}
}
break;
case '3':
dump(' -> "' . $item . '" does not apply as "is or is not" "' . $category . '"');
$mappingItems[$item]['na'][] = $category;
foreach ($ex as $exclusion) {
dump(' -> "' . $item . '" does not apply as "is or is not" "' . $category . '"');
$mappingItems[$item]['na'][] = $category;
}
break;
default:
dump('wut? skipping...');
break;
}
$mappingItems[$item] = clean_item_mappings($mappingItems[$item]);
$missing = find_missing_associations($mappingItems, $categories, $items);
}
return $mappingItems;
}
// Main loop
$exitMainLoop = false;
while ($exitMainLoop === false) {
dump('');
$missing = find_missing_associations($mappingItems, $categories, $items);
$menu = [
'0: exit',
'',
'1: show categories (' . \count($categories) . ' found)',
'2: show items (' . \count($items) . ' found)',
'3: show exclusions (' . \count($exclusions) . ' found)',
'4: show mappings (' . \count($mappingItems) . ' found)',
'',
'5: complete mappings (' . \count($missing) . ' missing)',
];
$answer = ask(\join("\n", $menu));
switch ($answer) {
case '0':
$exitMainLoop = true;
break;
case '1':
showCategories($categories);
break;
case '2':
showItems($items);
break;
case '3':
showExclusions($exclusions);
break;
case '4':
showMappings($mappingItems);
break;
case '5':
$data['mapping']['items'] = editMappings($mappingItems, $categories, $items, $exclusions);
break;
default:
break;
}
}
write_data($data, $jsonDataFile);
echo "ok, done." . PHP_EOL;
#!/usr/bin/env bash
command -v jq >/dev/null 2>&1 || { echo >&2 "I require jq (json parser) but it's not installed. Aborting."; exit 1; }
CURRENT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
BASE_DIR="$(dirname "${CURRENT_DIR}")"
DATA_FILE="${CURRENT_DIR}/data.json"
touch "${DATA_FILE}"
# backup current file
# NOW="$(date '+%Y%m%d_%H%M%S')"
# cp "${DATA_FILE}" "${DATA_FILE}.bak_${NOW}.json"
cd "${CURRENT_DIR}"
php manage_data.php "${DATA_FILE}"
# format json file
cat "${DATA_FILE}" | jq >"${DATA_FILE}.tmp"
mv "${DATA_FILE}.tmp" "${DATA_FILE}"
# inject json file in app code
GAME_DATA_DART_FILE="${BASE_DIR}/lib/data/game_data.dart"
echo "class GameData {" >"${GAME_DATA_DART_FILE}"
echo " static const Map<String, dynamic> data = $(cat "${DATA_FILE}");" >>"${GAME_DATA_DART_FILE}"
echo "}" >>"${GAME_DATA_DART_FILE}"
# cat "${DATA_FILE}"
\ No newline at end of file