From 7e7bf46892230408bb076eaf410c6cbbb29a903f Mon Sep 17 00:00:00 2001
From: Massimiliano Adamo <maxadamo@gmail.com>
Date: Wed, 26 Apr 2023 18:24:10 +0200
Subject: [PATCH] add parameter to supply the number of months

---
 sq_projects_list.py | 103 +++++++++++++++++++++++++++++---------------
 1 file changed, 68 insertions(+), 35 deletions(-)

diff --git a/sq_projects_list.py b/sq_projects_list.py
index 8afdbf7..0786351 100755
--- a/sq_projects_list.py
+++ b/sq_projects_list.py
@@ -1,17 +1,38 @@
 #!/usr/bin/env python3
-"""
-This script will list all projects in SonarQube
-and sort them by last analysis date
+"""Filter JSON data based on the last_analysis_date.
+
+Usage:
+    filter_json.py --months=<n>
+
+Options:
+    --months=<n>   Show only projects with last_analysis_date less than n months ago.
 """
 import os
 import json
 import configparser
 import requests
+import datetime
+from docopt import docopt
+
 
-sq_ini = os.path.expanduser('~/.config/sonarqube.ini')
+def filter_data(data, months):
+    filtered_data = []
+    for item in data:
+        date_str = item['last_analysis_date']
+        date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S%z')
+        months_diff = (datetime.datetime.now(date_obj.tzinfo) - date_obj) // datetime.timedelta(days=30)
+        if months_diff > months:
+            filtered_data.append(item)
+    return filtered_data
 
-if not os.path.isfile(sq_ini):
-    print(f'''
+
+if __name__ == '__main__':
+    # parse the command line arguments using docopt
+    args = docopt(__doc__)
+    sq_ini = os.path.expanduser('~/.config/sonarqube.ini')
+
+    if not os.path.isfile(sq_ini):
+        print(f'''
 Config file not found
 Please create the config file {sq_ini}
 with the following content:
@@ -21,41 +42,53 @@ token = <your token>
 
 You can generate a token in SonarQube under My Account > Security
 ''')
-    os.sys.exit(1)
+        os.sys.exit(1)
+
+    config = configparser.RawConfigParser()
+    config.read(sq_ini)
+    sq_token = config.get('sq', 'token')
 
-config = configparser.RawConfigParser()
-config.read(sq_ini)
-sq_token = config.get('sq', 'token')
+    session = requests.Session()
+    session.auth = (sq_token, '')
+    req = session.get(
+        'https://sonarqube.software.geant.org/api/projects/search')
 
-session = requests.Session()
-session.auth = (sq_token, '')
-req = session.get('https://sonarqube.software.geant.org/api/projects/search')
+    if req.status_code == 401:
+        print('Error: Invalid token')
+        os.sys.exit(1)
 
-if req.status_code == 401:
-    print('Error: Invalid token')
-    os.sys.exit(1)
+    if req.status_code != 200:
+        print(f'Error: HTTP status code is {req.status_code}')
+        os.sys.exit(1)
 
-if req.status_code != 200:
-    print(f'Error: HTTP status code is {req.status_code}')
-    os.sys.exit(1)
+    proj_list = req.json()['components']
+    final_list = []
 
+    for project in proj_list:
+        if 'lastAnalysisDate' in project:
+            final_list.append({
+                'project_name': project['name'],
+                'last_analysis_date': project['lastAnalysisDate']
+            })
+        else:
+            final_list.append({
+                'project_name': project['name'],
+                'last_analysis_date': '1970-01-01T01:00:00+0200'
+            })
 
-proj_list = req.json()['components']
-final_list = []
+    months = int(args['--months'])
+    # filter the data based on the last_analysis_date
+    filtered_list = filter_data(final_list, int(months))
 
-for project in proj_list:
-    if 'lastAnalysisDate' in project:
-        final_list.append({
-            'project_name': project['name'],
-            'last_analysis_date': project['lastAnalysisDate']
-        })
-    else:
-        final_list.append({
-            'project_name': project['name'],
-            'last_analysis_date': '1970-01-01T01:00:00+0200'
-        })
+    sorted_projects = sorted(
+        filtered_list, key=lambda d: d['last_analysis_date']
+    )
+    pretty = json.dumps(sorted_projects, indent=4)
 
-sorted_projects = sorted(final_list, key=lambda d: d['last_analysis_date'])
-pretty = json.dumps(sorted_projects, indent=4)
+    print(pretty)
 
-print(pretty)
+    print('')
+    print(f'Number of projects: {len(sorted_projects)}')
+    print(
+        f'This is a list of projects that have not been analyzed in the last {months} months.')
+    print('')
-- 
GitLab