Skip to content

Commit b40f764

Browse files
committed
fix(browser): update system to use a settings class for default settings.
1 parent 6a2017f commit b40f764

File tree

4 files changed

+82
-62
lines changed

4 files changed

+82
-62
lines changed

iarp_utils/browser/browsers.py

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
from ..exceptions import ImproperlyConfigured
99
from ..pidfile import PIDFile
10-
from ..system import import_attribute
1110
from .drivers import ChromeDriver, DriverBase, FirefoxDriver
1211
from .exceptions import LoginFailureException
12+
from .settings import settings
1313

1414

1515
try:
@@ -30,16 +30,6 @@ class By:
3030
NAME = None
3131
ID = None
3232

33-
try:
34-
from django.conf import settings
35-
36-
DEFAULT_DRIVER = getattr(settings, 'BROWSER_DEFAULT_DRIVER', 'iarp_utils.browser.drivers.ChromeDriver')
37-
except: # noqa
38-
settings = None
39-
DEFAULT_DRIVER = os.environ.get('BROWSER_DEFAULT_DRIVER', 'iarp_utils.browser.drivers.ChromeDriver')
40-
41-
DEFAULT_DRIVER = import_attribute(DEFAULT_DRIVER)
42-
4333
log = logging.getLogger('iarp_utils.browser.browsers')
4434

4535

@@ -109,7 +99,7 @@ def __init__(self, start_browser=True, global_wait=0, execute_initialize=True,
10999
self.selected_driver_kwargs = kwargs
110100
self.active_driver = None # type: DriverBase
111101

112-
self.selected_driver = selected_driver or DEFAULT_DRIVER
102+
self.selected_driver = selected_driver or settings.DEFAULT_DRIVER
113103

114104
if start_browser:
115105
self.start_browser()

iarp_utils/browser/drivers.py

Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,18 @@
1818
)
1919
from ..system import IS_WINDOWS_OS, get_system_bitness
2020
from . import utils
21+
from .settings import settings
2122

2223

2324
try:
2425
from selenium import webdriver
25-
from selenium.webdriver.remote.webdriver import (
26-
WebDriver as RemoteWebDriver,
27-
)
2826
from selenium.webdriver.chrome.options import Options as _ChromeOptions
2927
from selenium.webdriver.chrome.service import Service as _ChromeService
3028
from selenium.webdriver.firefox.options import Options as _FirefoxOptions
3129
from selenium.webdriver.firefox.service import Service as _FirefoxService
30+
from selenium.webdriver.remote.webdriver import (
31+
WebDriver as RemoteWebDriver,
32+
)
3233
except ImportError:
3334
webdriver = None
3435

@@ -37,33 +38,6 @@
3738
except ImportError:
3839
requests = None
3940

40-
try:
41-
from django.conf import settings
42-
43-
# If this is being used in a django installation, look for the path in settings
44-
# otherwise base the path on BASE_DIR.
45-
DEFAULT_DRIVER_ROOT = getattr(settings, 'BROWSER_DRIVER_DIR', None)
46-
if not DEFAULT_DRIVER_ROOT:
47-
DEFAULT_DRIVER_ROOT = os.path.join(settings.BASE_DIR, 'bin')
48-
49-
DEFAULT_HEADLESS = getattr(settings, 'BROWSER_HEADLESS', None)
50-
DEFAULT_DOWNLOAD_DIRECTORY = getattr(settings, 'BROWSER_DEFAULT_DOWNLOAD_DIRECTORY', None)
51-
52-
WEBDRIVER_IN_PATH = getattr(settings, 'BROWSER_WEBDRIVER_IN_PATH', False)
53-
CHECK_DRIVER_VERSION = getattr(settings, 'BROWSER_CHECK_DRIVER_VERSION', True)
54-
CHECK_DRIVER_VERSION_INTERVAL = getattr(settings, 'BROWSER_CHECK_DRIVER_VERSION_INTERVAL', 24)
55-
USER_AGENT = getattr(settings, 'BROWSER_USER_AGENT', None)
56-
except: # noqa
57-
settings = None
58-
DEFAULT_DRIVER_ROOT = os.environ.get('BROWSER_DRIVER_DIR', 'bin/')
59-
WEBDRIVER_IN_PATH = os.environ.get('BROWSER_WEBDRIVER_IN_PATH', False)
60-
CHECK_DRIVER_VERSION = os.environ.get('BROWSER_CHECK_DRIVER_VERSION', True)
61-
CHECK_DRIVER_VERSION_INTERVAL = os.environ.get('BROWSER_CHECK_DRIVER_VERSION_INTERVAL', 24)
62-
USER_AGENT = os.environ.get('BROWSER_USER_AGENT', None)
63-
DEFAULT_HEADLESS = os.environ.get('BROWSER_HEADLESS', None)
64-
DEFAULT_DOWNLOAD_DIRECTORY = os.environ.get('BROWSER_DEFAULT_DOWNLOAD_DIRECTORY', None)
65-
66-
6741
log = logging.getLogger('iarp_utils.browser.drivers')
6842

6943

@@ -76,7 +50,7 @@ def download_and_extract_zip_file(url, local_zip_file, extracting_file, **kwargs
7650
extract_zip_single_file(
7751
zip_file=local_zip_file,
7852
file_to_extract=extracting_file,
79-
folder_to_extract_to=DEFAULT_DRIVER_ROOT,
53+
folder_to_extract_to=settings.EXECUTABLE_ROOT,
8054
log=log,
8155
**kwargs
8256
)
@@ -85,7 +59,7 @@ def download_and_extract_zip_file(url, local_zip_file, extracting_file, **kwargs
8559
extract_tar_single_file(
8660
tar_file=local_zip_file,
8761
file_to_extract=extracting_file,
88-
folder_to_extract_to=DEFAULT_DRIVER_ROOT,
62+
folder_to_extract_to=settings.EXECUTABLE_ROOT,
8963
log=log,
9064
**kwargs
9165
)
@@ -101,17 +75,18 @@ def __init__(self, **kwargs):
10175
if webdriver is None:
10276
raise ImproperlyConfigured('selenium is required for iarp_utils.browser to operate. pip install selenium')
10377

104-
self.headless = bool(kwargs.get('headless', DEFAULT_HEADLESS))
105-
self._download_directory = kwargs.get('download_directory', DEFAULT_DOWNLOAD_DIRECTORY)
106-
self.user_agent = kwargs.get('user_agent', USER_AGENT)
78+
self.headless = bool(kwargs.get('headless', settings.HEADLESS))
79+
self._download_directory = kwargs.get('download_directory', settings.DOWNLOAD_DIRECTORY)
80+
self.user_agent = kwargs.get('user_agent', settings.USER_AGENT)
10781
self.latest_version = None
10882
self._browser = None
10983

11084
# Whether or not we should check driver version before running the browser.
111-
self._check_driver_version = kwargs.get('check_driver_version', CHECK_DRIVER_VERSION)
85+
self._check_driver_version = kwargs.get('check_driver_version', settings.CHECK_DRIVER_VERSION)
11286

11387
# How often (in hours) to check if the driver version needs updating
114-
self._check_driver_version_interval = kwargs.get('check_driver_version_interval', CHECK_DRIVER_VERSION_INTERVAL)
88+
self._check_driver_version_interval = kwargs.get('check_driver_version_interval',
89+
settings.CHECK_DRIVER_VERSION_INTERVAL)
11590

11691
@property
11792
def webdriver(self):
@@ -139,7 +114,7 @@ def get_driver_options(self):
139114
def get_driver_service(self):
140115
service = self.service_class()
141116

142-
if not WEBDRIVER_IN_PATH:
117+
if not settings.WEBDRIVER_IN_PATH:
143118

144119
try:
145120
binary = self.binary_location()
@@ -174,11 +149,11 @@ def _check_driver_version_allowed(self):
174149
log.debug('webdriver check: not checking due to check_driver_version=False')
175150
return False
176151

177-
if WEBDRIVER_IN_PATH:
152+
if settings.WEBDRIVER_IN_PATH:
178153
log.debug('webdriver check: not checking due to WEBDRIVER_IN_PATH=True')
179154
return False
180155

181-
dt_file = os.path.join(DEFAULT_DRIVER_ROOT, 'check_driver_version.json')
156+
dt_file = os.path.join(settings.EXECUTABLE_ROOT, 'check_driver_version.json')
182157
driver_name = type(self).__name__
183158

184159
try:
@@ -254,17 +229,14 @@ def binary_location(self):
254229

255230
filename = self.driver
256231

257-
root_driver = os.path.join(DEFAULT_DRIVER_ROOT, filename)
232+
root_driver = os.path.join(settings.EXECUTABLE_ROOT, filename)
258233
if os.path.isfile(root_driver):
259234
log.debug(f'{self.__class__.__name__} binary located at default {root_driver}')
260235
return root_driver
261236

262237
for root in ['bin/', '', 'setup/', 'setup/bin/']:
263238

264-
try:
265-
root_driver = os.path.join(settings.BASE_DIR, root, filename)
266-
except AttributeError:
267-
root_driver = os.path.join(root, filename)
239+
root_driver = os.path.join(root, filename)
268240

269241
if os.path.isfile(root_driver):
270242
log.debug(f'{self.__class__.__name__} binary located at {root_driver}')
@@ -356,7 +328,7 @@ def get_driver_version(self):
356328
def check_driver_version(self):
357329
""" Check to ensure the local chromedriver being used is valid for the chrome installation. """
358330

359-
if WEBDRIVER_IN_PATH:
331+
if settings.WEBDRIVER_IN_PATH:
360332
log.debug(f'{self.__class__.__name__} version checks: not checking due to WEBDRIVER_IN_PATH=True')
361333
return
362334
if not requests:
@@ -413,7 +385,7 @@ def check_driver_version(self):
413385
file_url = f'{root_url}{self.latest_version}/{zip_file_name}'
414386
log.debug(f'{self.__class__.__name__} version check: downloading {file_url}')
415387
log.debug(f'{self.__class__.__name__} version check: to {local_zip_file} extracting '
416-
f'{self.driver} to {DEFAULT_DRIVER_ROOT}')
388+
f'{self.driver} to {settings.EXECUTABLE_ROOT}')
417389

418390
download_and_extract_zip_file(
419391
url=file_url,
@@ -459,7 +431,7 @@ def get_driver_version(self):
459431
def check_driver_version(self):
460432
""" Check to ensure the local geckodriver being used is valid for the firefox installation. """
461433

462-
if WEBDRIVER_IN_PATH:
434+
if settings.WEBDRIVER_IN_PATH:
463435
log.debug('FirefoxDriver version checks: not checking due to WEBDRIVER_IN_PATH=True')
464436
return
465437
if not requests:
@@ -509,7 +481,7 @@ def check_driver_version(self):
509481
file_url = dl['browser_download_url']
510482
log.debug(f'FirefoxDriver version check: downloading {file_url}')
511483
log.debug(f'FirefoxDriver version check: to {local_zip_file} extracting '
512-
f'{self.driver} to {DEFAULT_DRIVER_ROOT}')
484+
f'{self.driver} to {settings.EXECUTABLE_ROOT}')
513485

514486
download_and_extract_zip_file(
515487
url=file_url,

iarp_utils/browser/settings.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import os
2+
3+
from ..system import import_attribute
4+
5+
6+
try:
7+
from django.conf import settings as _django_settings
8+
except: # noqa
9+
_django_settings = None
10+
11+
12+
class Settings(object):
13+
14+
def _setting(self, name, default=None):
15+
name = f'BROWSER_{name}'
16+
try:
17+
return getattr(_django_settings, name)
18+
except: # noqa
19+
pass
20+
return os.environ.get(name, default)
21+
22+
@property
23+
def DEFAULT_DRIVER(self):
24+
return import_attribute(self._setting('DEFAULT_DRIVER', 'iarp_utils.browser.drivers.FirefoxDriver'))
25+
26+
@property
27+
def EXECUTABLE_ROOT(self):
28+
exe = self._setting('DRIVER_DIR')
29+
if not exe:
30+
exe = self._setting('EXECUTABLE_ROOT')
31+
return exe or 'bin/'
32+
33+
@property
34+
def WEBDRIVER_IN_PATH(self):
35+
return bool(self._setting('WEBDRIVER_IN_PATH', False))
36+
37+
@property
38+
def CHECK_DRIVER_VERSION(self):
39+
return bool(self._setting('CHECK_DRIVER_VERSION', True))
40+
41+
@property
42+
def CHECK_DRIVER_VERSION_INTERVAL(self):
43+
return int(self._setting('CHECK_DRIVER_VERSION_INTERVAL', 24))
44+
45+
@property
46+
def USER_AGENT(self):
47+
return self._setting('USER_AGENT')
48+
49+
@property
50+
def DOWNLOAD_DIRECTORY(self):
51+
return self._setting('DOWNLOAD_DIRECTORY')
52+
53+
@property
54+
def HEADLESS(self):
55+
return bool(self._setting('BROWSER_HEADLESS'))
56+
57+
58+
settings = Settings()

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ Otherwise add them to `os.environ.setdefault('option name here', '')`
2525
* ChromeDriver
2626
* FirefoxDriver
2727

28-
* `BROWSER_DRIVER_DIR` (="bin/")
28+
* `BROWSER_EXECUTABLE_ROOT` (="bin/")
2929
* Specifies the default location to find webdrivers
3030

3131
* `BROWSER_HEADLESS` (=False)

0 commit comments

Comments
 (0)