Skip to content
This repository was archived by the owner on Apr 11, 2022. It is now read-only.

Commit b67976f

Browse files
authored
Merge pull request #1253 from NYPL-Simplified/feature/configuration-boolean-values
Add ConfigurationMetadata.to_bool
2 parents bcd1520 + c3defe8 commit b67976f

File tree

2 files changed

+92
-39
lines changed

2 files changed

+92
-39
lines changed

model/configuration.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,24 @@
33
import inspect
44
import json
55
import logging
6-
from abc import abstractmethod, ABCMeta
6+
from abc import ABCMeta, abstractmethod
77
from contextlib import contextmanager
8-
98
from enum import Enum
9+
10+
from constants import DataSourceConstants
1011
from flask_babel import lazy_gettext as _
11-
from sqlalchemy import (
12-
Column,
13-
ForeignKey,
14-
Index,
15-
Integer,
16-
Unicode,
17-
UniqueConstraint,
18-
)
12+
from hasfulltablecache import HasFullTableCache
13+
from library import Library
14+
from sqlalchemy import Column, ForeignKey, Index, Integer, Unicode, UniqueConstraint
1915
from sqlalchemy.ext.hybrid import hybrid_property
2016
from sqlalchemy.orm import relationship
2117
from sqlalchemy.orm.session import Session
2218
from sqlalchemy.sql.expression import and_
2319

24-
from constants import DataSourceConstants
25-
from hasfulltablecache import HasFullTableCache
26-
from library import Library
27-
from . import (
28-
Base,
29-
get_one,
30-
get_one_or_create,
31-
)
32-
from ..config import (
33-
CannotLoadConfiguration,
34-
Configuration,
35-
)
20+
from ..config import CannotLoadConfiguration, Configuration
3621
from ..mirror import MirrorUploader
3722
from ..util.string_helpers import random_string
23+
from . import Base, get_one, get_one_or_create
3824

3925

4026
class ExternalIntegrationLink(Base, HasFullTableCache):
@@ -1310,6 +1296,20 @@ def to_settings(self):
13101296
ConfigurationAttribute.FORMAT.value: self.format
13111297
}
13121298

1299+
@staticmethod
1300+
def to_bool(metadata):
1301+
"""Return a boolean scalar indicating whether the configuration setting
1302+
contains a value that can be treated as True (see ConfigurationSetting.MEANS_YES).
1303+
1304+
:param metadata: ConfigurationMetadata object
1305+
:type metadata: ConfigurationMetadata
1306+
1307+
:return: Boolean scalar indicating
1308+
whether this configuration setting contains a value that can be treated as True
1309+
:rtype: bool
1310+
"""
1311+
return str(metadata).lower() in ConfigurationSetting.MEANS_YES
1312+
13131313

13141314
class ConfigurationGrouping(HasConfigurationSettings):
13151315
"""Base class for all classes containing configuration settings

tests/models/test_configuration.py

Lines changed: 70 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,30 @@
11
# encoding: utf-8
2+
from enum import Enum
3+
24
import pytest
35
import sqlalchemy
4-
from enum import Enum
56
from flask_babel import lazy_gettext as _
6-
from mock import create_autospec, MagicMock
7+
from mock import MagicMock, create_autospec
78
from parameterized import parameterized
89
from sqlalchemy.exc import IntegrityError
910

10-
from ...testing import DatabaseTest
11-
from ...config import (
12-
CannotLoadConfiguration,
13-
Configuration,
14-
)
15-
from ...model import (
16-
create,
17-
get_one,
18-
)
11+
from ...config import CannotLoadConfiguration, Configuration
12+
from ...model import create, get_one
1913
from ...model.collection import Collection
2014
from ...model.configuration import (
21-
ConfigurationSetting,
22-
ExternalIntegration,
23-
ExternalIntegrationLink,
24-
ConfigurationStorage,
2515
ConfigurationAttribute,
26-
ConfigurationMetadata,
16+
ConfigurationAttributeType,
2717
ConfigurationGrouping,
18+
ConfigurationMetadata,
2819
ConfigurationOption,
29-
ConfigurationAttributeType
20+
ConfigurationSetting,
21+
ConfigurationStorage,
22+
ExternalIntegration,
23+
ExternalIntegrationLink,
24+
HasExternalIntegration,
3025
)
3126
from ...model.datasource import DataSource
27+
from ...testing import DatabaseTest
3228

3329

3430
class TestConfigurationSetting(DatabaseTest):
@@ -697,6 +693,21 @@ class TestConfiguration(ConfigurationGrouping):
697693
)
698694

699695

696+
class ConfigurationWithBooleanProperty(ConfigurationGrouping):
697+
boolean_setting = ConfigurationMetadata(
698+
key='boolean_setting',
699+
label='Boolean Setting',
700+
description='Boolean Setting',
701+
type=ConfigurationAttributeType.SELECT,
702+
required=True,
703+
default='true',
704+
options=[
705+
ConfigurationOption('true', 'True'),
706+
ConfigurationOption('false', 'False')
707+
]
708+
)
709+
710+
700711
class TestConfiguration2(ConfigurationGrouping):
701712
setting1 = ConfigurationMetadata(
702713
key='setting1',
@@ -837,3 +848,45 @@ def test_to_settings_considers_explicit_indices(self):
837848
assert settings[1][ConfigurationAttribute.REQUIRED.value] == SETTING1_REQUIRED
838849
assert settings[1][ConfigurationAttribute.DEFAULT.value] == SETTING1_DEFAULT
839850
assert settings[1][ConfigurationAttribute.CATEGORY.value] == SETTING1_CATEGORY
851+
852+
853+
class TestBooleanConfigurationMetadata(DatabaseTest):
854+
@parameterized.expand([
855+
('true', 'true', True),
856+
('t', 't', True),
857+
('yes', 'yes', True),
858+
('y', 'y', True),
859+
(1, 1, False),
860+
('false', 'false', False),
861+
])
862+
def test_configuration_metadata_correctly_recognize_bool_values(self, _, value, expected_result):
863+
"""Ensure that ConfigurationMetadata.to_bool correctly translates different values into boolean (True/False).
864+
865+
:param _: Name of the test case
866+
:type _: str
867+
868+
:param value: Configuration setting's value
869+
:type value: Any
870+
871+
:param expected_result: Expected boolean result
872+
:type expected_result: bool
873+
"""
874+
# Arrange
875+
external_integration = self._external_integration('test')
876+
877+
external_integration_association = create_autospec(spec=HasExternalIntegration)
878+
external_integration_association.external_integration = MagicMock(return_value=external_integration)
879+
880+
configuration_storage = ConfigurationStorage(external_integration_association)
881+
882+
configuration = ConfigurationWithBooleanProperty(configuration_storage, self._db)
883+
884+
# We set a new value using ConfigurationMetadata.__set__
885+
configuration.boolean_setting = value
886+
887+
# Act
888+
# We read the existing value using ConfigurationMetadata.__get__
889+
result = ConfigurationMetadata.to_bool(configuration.boolean_setting)
890+
891+
# Assert
892+
assert expected_result == result

0 commit comments

Comments
 (0)