From 5fb56cddadf90af86db1aafd1210456f2793b391 Mon Sep 17 00:00:00 2001
From: Luciano <41302084+Rossi-Luciano@users.noreply.github.com>
Date: Wed, 6 Apr 2022 14:52:14 -0300
Subject: [PATCH] Funding group (#292)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Adiciona a classe FundingGroup

* Adiciona teste para caso em que há 1 found_source e n award_ids

* Adiciona teste para caso em que há 1 found_source e 1 award_id

* Adiciona teste para caso em que há n found_sources e 1 award_ids

* Adiciona teste para caso em que há n found_sources e 1 award_id
---
 packtools/sps/models/funding_group.py |  46 +++++++++
 tests/test_funding_group.py           | 141 ++++++++++++++++++++++++++
 2 files changed, 187 insertions(+)
 create mode 100644 packtools/sps/models/funding_group.py
 create mode 100644 tests/test_funding_group.py

diff --git a/packtools/sps/models/funding_group.py b/packtools/sps/models/funding_group.py
new file mode 100644
index 000000000..2975f9f6f
--- /dev/null
+++ b/packtools/sps/models/funding_group.py
@@ -0,0 +1,46 @@
+import logging
+
+from packtools.sps.utils import xml_utils
+
+
+logger = logging.getLogger(__name__)
+
+
+class FundingGroup:
+    """
+    Class that performs the extraction of values for funding-source and award-id.
+    To return both attributes, award_groups is used.
+    To return only institutions, use funding_sources.
+
+    Parameters
+    ----------
+    xml
+        XML file that contains the attributes of interest.
+
+    Returns
+    -------
+    list
+        Arrangement containing a dictionary that correlates funding-source and award-id or values of one of the attributes.
+    """
+
+    def __init__(self, xml):
+        self._xmltree = xml_utils.get_xml_tree(xml)
+
+    @property
+    def award_groups(self):
+        items = []
+        for node in self._xmltree.xpath(".//funding-group/award-group"):
+            funding_sources = node.xpath("funding-source")
+            award_ids = node.xpath("award-id")
+            d = {}
+            d["funding-source"] = [item.text for item in funding_sources]
+            d["award-id"] = [item.text for item in award_ids]
+            items.append(d)
+        return items
+
+    @property
+    def funding_sources(self):
+        items = []
+        for node in self._xmltree.xpath(".//funding-group/award-group/funding-source"):
+            items.append(node.text)
+        return items
diff --git a/tests/test_funding_group.py b/tests/test_funding_group.py
new file mode 100644
index 000000000..d9f75e157
--- /dev/null
+++ b/tests/test_funding_group.py
@@ -0,0 +1,141 @@
+# coding: utf-8
+from __future__ import unicode_literals
+import unittest
+
+try:
+    from unittest import mock
+except:
+    import mock
+
+from packtools.sps.models.funding_group import FundingGroup
+
+
+class FundingGroupOneFundingSourceNAwardIdTests(unittest.TestCase):
+    def setUp(self):
+        xml = (
+            """
+            <article> 
+                <funding-group>
+                      <award-group>
+                          <funding-source>CNPQ</funding-source>
+                          <award-id>12345</award-id>
+                          <award-id>67890</award-id>
+                      </award-group>
+                      <award-group>
+                          <funding-source>FAPESP</funding-source>
+                          <award-id>23456</award-id>
+                          <award-id>56789</award-id>
+                      </award-group>
+                </funding-group>
+            </article>
+            """
+        )
+        self.funding_group = FundingGroup(xml)
+
+    def test_funding_sources(self):
+        expected = ['CNPQ', 'FAPESP']
+        result = self.funding_group.funding_sources
+        self.assertEqual(expected, result)
+
+    def test_award_groups(self):
+        expected = [
+            {'funding-source': ['CNPQ'], 'award-id': ['12345', '67890']},
+            {'funding-source': ['FAPESP'], 'award-id': ['23456', '56789']},
+        ]
+        result = self.funding_group.award_groups
+        self.assertEqual(expected, result)
+
+
+class FundingGroupOneFundingSourceOneAwardIdTests(unittest.TestCase):
+    def setUp(self):
+        xml = (
+            """
+            <article> 
+                <funding-group>
+                     <award-group>
+                         <funding-source>CNPq</funding-source>
+                         <award-id>1685X6-7</award-id>
+                     </award-group>
+                </funding-group>
+            </article>
+            """
+        )
+        self.funding_group = FundingGroup(xml)
+
+    def test_funding_sources(self):
+        expected = ['CNPq']
+        result = self.funding_group.funding_sources
+        self.assertEqual(expected, result)
+
+    def test_award_groups(self):
+        expected = [
+            {'funding-source': ['CNPq'], 'award-id': ['1685X6-7']}
+        ]
+        result = self.funding_group.award_groups
+        self.assertEqual(expected, result)
+
+
+class FundingGroupNFundingSourceOneAwardIdTests(unittest.TestCase):
+    def setUp(self):
+        xml = (
+            """
+            <article> 
+                <funding-group>
+                    <award-group>
+                        <funding-source>CNPq</funding-source>
+                        <funding-source>FAPESP</funding-source>
+                        <award-id>#09/06953-4</award-id>
+                    </award-group>
+                </funding-group>
+            </article>
+            """
+        )
+        self.funding_group = FundingGroup(xml)
+
+    def test_funding_sources(self):
+        expected = ['CNPq', 'FAPESP']
+        result = self.funding_group.funding_sources
+        self.assertEqual(expected, result)
+
+    def test_award_groups(self):
+        expected = [
+            {'funding-source': ['CNPq', 'FAPESP'], 'award-id': ['#09/06953-4']}
+        ]
+        result = self.funding_group.award_groups
+        self.assertEqual(expected, result)
+
+
+class FundingGroupNFundingSourceOneAwardIdWithFundingStatementTests(unittest.TestCase):
+    def setUp(self):
+        xml = (
+            """
+            <article> 
+                <funding-group>
+                    <award-group>
+                        <funding-source>Coordenação de Aperfeiçoamento de Pessoal de Nível Superior</funding-source>
+                        <funding-source> Fundação de Amparo à Pesquisa do Estado de São Paulo</funding-source>
+                        <award-id>04/08142-0</award-id>
+                    </award-group>
+                    <funding-statement>This study was supported in part by Coordenação
+                    de Aperfeiçoamento de Pessoal de Nível Superior (Capes — Brasília,
+                    Brazil), Fundação de Amparo à Pesquisa do Estado de São Paulo (FAPESP —
+                    Grant no. 04/08142-0; São Paulo, Brazil)</funding-statement>
+                </funding-group>
+            </article>
+            """
+        )
+        self.funding_group = FundingGroup(xml)
+
+    def test_funding_sources(self):
+        expected = ['Coordenação de Aperfeiçoamento de Pessoal de Nível Superior',
+                    ' Fundação de Amparo à Pesquisa do Estado de São Paulo']
+        result = self.funding_group.funding_sources
+        self.assertEqual(expected, result)
+
+    def test_award_groups(self):
+        expected = [
+            {'funding-source': ['Coordenação de Aperfeiçoamento de Pessoal de Nível Superior',
+                                ' Fundação de Amparo à Pesquisa do Estado de São Paulo'], 'award-id': ['04/08142-0']}
+        ]
+        result = self.funding_group.award_groups
+        self.assertEqual(expected, result)