Skip to content

Commit 922fe89

Browse files
authored
Merge pull request #264 from IFCA-Advanced-Computing/feature/module_structure
Move current code to a Python package structure
2 parents ef0ae8f + 0f2bca0 commit 922fe89

File tree

56 files changed

+337
-343
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+337
-343
lines changed

.gitignore

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
#
2-
## FAIR-eva
3-
#
4-
config.ini
5-
61
#
72
## Python
83
#

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ Running:
66

77
.. code-block:: bash
88
9-
$ ./fair.py
9+
$ fair-eva
1010
1111
Now open your browser and go to http://localhost:9090/v1.0/ui/ to see the Swagger UI.

api/__init__.py

Lines changed: 0 additions & 1 deletion
This file was deleted.

fair.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

fair_eva/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
#!/usr/bin/env python3
2+
3+
import connexion
4+
from connexion.resolver import RestyResolver
5+
6+
7+
def main():
8+
app = connexion.FlaskApp(__name__)
9+
app.add_api(
10+
"fair-api.yaml",
11+
arguments={"title": "FAIR evaluator"},
12+
resolver=RestyResolver("fair_eva.api"),
13+
)
14+
app.run(port=9090)

fair_eva/__main__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from . import main
2+
3+
if __name__ == "__main__":
4+
main()

fair_eva/api/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import fair_eva.api.rda # noqa
Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import ast
2+
import configparser
23
import csv
34
import gettext
45
import logging
@@ -8,12 +9,13 @@
89
import xml.etree.ElementTree as ET
910
from abc import ABC, abstractmethod
1011
from functools import wraps
12+
from importlib.resources import read_text
1113

1214
import idutils
1315
import pandas as pd
1416
import requests
1517

16-
import api.utils as ut
18+
import fair_eva.api.utils as ut
1719

1820
logger = logging.getLogger("api.plugin.evaluation_steps")
1921

@@ -92,13 +94,25 @@ def __init__(
9294
self, item_id, api_endpoint=None, lang="en", config=None, name=None, **kwargs
9395
):
9496
self.item_id = item_id
95-
self.api_endpoint = api_endpoint
9697
self.lang = lang
9798
self.config = config
9899
self.name = name
99100
self.metadata = None
100101
self.cvs = []
101102

103+
# API endpoint
104+
self.api_endpoint = api_endpoint
105+
if not self.api_endpoint:
106+
try:
107+
self.api_endpoint = self.config.get("Generic", "endpoint")
108+
except configparser.NoOptionError as e:
109+
raise (e)
110+
else:
111+
logger.debug(
112+
"API endpoint not passed as input argument, getting it from configuration: %s"
113+
% self.api_endpoint
114+
)
115+
102116
# Config attributes
103117
self.identifier_term = ast.literal_eval(
104118
self.config[self.name]["identifier_term"]
@@ -119,41 +133,15 @@ def __init__(
119133
self.terms_relations = ast.literal_eval(
120134
self.config[self.name]["terms_relations"]
121135
)
122-
self.metadata_access_manual = ast.literal_eval(
123-
self.config[self.name]["metadata_access_manual"]
124-
)
125-
self.data_access_manual = ast.literal_eval(
126-
self.config[self.name]["data_access_manual"]
127-
)
128136
self.terms_access_protocols = ast.literal_eval(
129137
self.config[self.name]["terms_access_protocols"]
130138
)
131-
132-
# self.vocabularies = ast.literal_eval(self.config[self.name]["vocabularies"])
133-
134-
self.dict_vocabularies = ast.literal_eval(
135-
self.config[self.name]["dict_vocabularies"]
136-
)
137-
138-
self.vocabularies = list(self.dict_vocabularies.keys())
139139
self.metadata_standard = ast.literal_eval(
140140
self.config[self.name]["metadata_standard"]
141141
)
142-
143-
self.metadata_authentication = ast.literal_eval(
144-
self.config[self.name]["metadata_authentication"]
145-
)
146-
self.metadata_persistence = ast.literal_eval(
147-
self.config[self.name]["metadata_persistence"]
148-
)
149-
self.terms_vocabularies = ast.literal_eval(
150-
self.config[self.name]["terms_vocabularies"]
151-
)
152-
153142
self.fairsharing_username = ast.literal_eval(
154143
self.config["fairsharing"]["username"]
155144
)
156-
157145
self.fairsharing_password = ast.literal_eval(
158146
self.config["fairsharing"]["password"]
159147
)
@@ -169,6 +157,29 @@ def __init__(
169157
global _
170158
_ = self.translation()
171159

160+
@staticmethod
161+
def load_config(plugin_path, fail_if_no_config=True):
162+
"""Find the path to a data file."""
163+
config = configparser.ConfigParser()
164+
try:
165+
config.read_string(read_text("fair_eva", "config.ini"))
166+
config.read_string(read_text(plugin_path, "config.ini"))
167+
except FileNotFoundError as e:
168+
logging.error("Could not load config file: %s" % str(e))
169+
if fail_if_no_config:
170+
raise (e)
171+
except configparser.MissingSectionHeaderError as e:
172+
message = "Bad INI format in main and/or plugin's configuration files"
173+
logging.error(message)
174+
logging.debug(e)
175+
error = {"code": 500, "message": "%s" % message}
176+
logging.debug("Returning API response: %s" % error)
177+
return json.dumps(error), 500
178+
else:
179+
logging.debug("Successfully loaded main & plugin's configuration files")
180+
181+
return config
182+
172183
def translation(self):
173184
# Translations
174185
t = gettext.translation(
@@ -1598,7 +1609,7 @@ def rda_r1_1_02m(self, license_list=[], machine_readable=False, **kwargs):
15981609
terms_license_list = terms_license["list"]
15991610
terms_license_metadata = terms_license["metadata"]
16001611

1601-
if not license_list:
1612+
if license_list is None or len(license_list) == 0:
16021613
license_list = terms_license_metadata.text_value.values
16031614

16041615
license_num = len(license_list)

0 commit comments

Comments
 (0)