[Replicant] [replicant-scripts][PATCH 1/2] wikidata: Start using internal data model

Denis 'GNUtoo' Carikli GNUtoo at cyberdimension.org
Thu Mar 19 17:18:05 UTC 2020


Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo at cyberdimension.org>
---
 data/wikidata/devices.py | 39 +++++++++++++++++++++++++++++----------
 1 file changed, 29 insertions(+), 10 deletions(-)

diff --git a/data/wikidata/devices.py b/data/wikidata/devices.py
index 50a9d21..87d2bb8 100755
--- a/data/wikidata/devices.py
+++ b/data/wikidata/devices.py
@@ -37,18 +37,26 @@ def is_a_smartphone_or_tablet_model(page):
             return True
     return False
 
-def list_all_compatible_devices(replicant_page):
-    replicant_versions = replicant_page["claims"]["P348"]
-    for replicant_version in replicant_versions:
-        print("Replicant {}:".format(replicant_version.getTarget()))
-        compatible_variants = replicant_version.toJSON().get('qualifiers', {}).get('P400', [])
+def get_all_compatible_devices(replicant_page):
+    # Example: {'6.0 0004': { 'GT-I9300': { 'device_name' : 'Galaxy SIII'}}}
+    results = {}
+
+    replicant_versions_data = replicant_page["claims"]["P348"]
+    for replicant_version_data in replicant_versions_data:
+        replicant_version = replicant_version_data.getTarget()
+        if replicant_version not in results:
+            results[replicant_version] = {}
+
+        compatible_variants = replicant_version_data.toJSON().get('qualifiers', {}).get('P400', [])
         for compatible_variant in compatible_variants:
             variant_version_id = "Q" + str(compatible_variant['datavalue']['value']['numeric-id'])
             variant_page = pywikibot.ItemPage(repo, variant_version_id).get()
             variant_name = variant_page['labels']['en']
 
+            if variant_name not in results[replicant_version]:
+                results[replicant_version][variant_name] = {}
+
             # Try to find the associated device model name
-            model_name = None
             variant_superclasses = variant_page["claims"]["P279"]
             # Check if the superclass is an instance of smartphone
             for variant_superclass in variant_superclasses:
@@ -58,14 +66,25 @@ def list_all_compatible_devices(replicant_page):
                     nr_model_instances += 1
                     assert (nr_model_instances <= 1), "Multiple smartphone mode instances"
                     model_name = variant_superclass_page['labels']['en']
+                    if model_name not in results[replicant_version][variant_name]:
+                        results[replicant_version][variant_name]['device_name'] = model_name
+    return results
+
+def print_compatible_devices(data):
+    # Example: {'6.0 0004': { 'GT-I9300': { 'device_name' : 'Galaxy SIII'}}}
 
-            if model_name:
-                print("- {} ({})".format(model_name, variant_name))
+    for replicant_version in data.keys():
+        print("Replicant {}:".format(replicant_version))
+        for variant in data[replicant_version].keys():
+            device_name = data[replicant_version][variant].get('device_name', None)
+            if device_name:
+                print("- {} ({})".format(device_name, variant))
             else:
-                print("- {}".format(variant_name))
+                print("- {}".format(variant))
 
 wikidata = pywikibot.Site("wikidata", "wikidata")
 repo = wikidata.data_repository()
 replicant_id = "Q7314062"
 replicant_page = pywikibot.ItemPage(repo, replicant_id).get()
-list_all_compatible_devices(replicant_page)
+replicant_versions_data = get_all_compatible_devices(replicant_page)
+print_compatible_devices(replicant_versions_data)
-- 
2.25.2



More information about the Replicant mailing list