From dedbc5785538b5e10b488dfb44c67df0c083b818 Mon Sep 17 00:00:00 2001 From: Lars Eggert Date: Tue, 9 Nov 2021 11:29:53 +0000 Subject: [PATCH] Remove djangobwr and other bower-related things. - Legacy-Id: 19575 --- djangobwr/__init__.py | 0 djangobwr/finders.py | 10 - djangobwr/management/__init__.py | 0 djangobwr/management/commands/__init__.py | 0 .../management/commands/bower_install.py | 232 ------------------ djangobwr/models.py | 3 - djangobwr/storage.py | 0 docker/Dockerfile | 5 +- ietf/README-BOWER.rst | 33 --- ietf/bower.json | 66 ----- ietf/settings.py | 8 +- ietf/utils/bower_storage.py | 12 - ietf/utils/tests.py | 36 +-- 13 files changed, 3 insertions(+), 402 deletions(-) delete mode 100644 djangobwr/__init__.py delete mode 100644 djangobwr/finders.py delete mode 100644 djangobwr/management/__init__.py delete mode 100644 djangobwr/management/commands/__init__.py delete mode 100644 djangobwr/management/commands/bower_install.py delete mode 100644 djangobwr/models.py delete mode 100644 djangobwr/storage.py delete mode 100644 ietf/README-BOWER.rst delete mode 100644 ietf/bower.json delete mode 100644 ietf/utils/bower_storage.py diff --git a/djangobwr/__init__.py b/djangobwr/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/djangobwr/finders.py b/djangobwr/finders.py deleted file mode 100644 index 16989f7dc..000000000 --- a/djangobwr/finders.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.contrib.staticfiles.finders import AppDirectoriesFinder - -class AppDirectoriesFinderBower(AppDirectoriesFinder): - - def list(self, ignore_patterns): - """ - List all files in all app storages. - """ - ignore_patterns.append("bower_components") - return super(AppDirectoriesFinderBower, self).list(ignore_patterns) diff --git a/djangobwr/management/__init__.py b/djangobwr/management/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/djangobwr/management/commands/__init__.py b/djangobwr/management/commands/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/djangobwr/management/commands/bower_install.py b/djangobwr/management/commands/bower_install.py deleted file mode 100644 index c1a4586e0..000000000 --- a/djangobwr/management/commands/bower_install.py +++ /dev/null @@ -1,232 +0,0 @@ -import os -import sys -import json -import tempfile -import shutil -import hashlib -import glob -import textwrap -from subprocess import call, check_output, CalledProcessError -from optparse import make_option - -import debug # pyflakes:ignore - -from django.core.management.base import BaseCommand -from django.core.files.storage import FileSystemStorage -from django.conf import settings -from django.contrib.staticfiles.finders import BaseStorageFinder, AppDirectoriesFinder - -class BaseDirectoryFinder(BaseStorageFinder): - storage = FileSystemStorage(location=settings.BASE_DIR) - -class Command(BaseCommand): - """ - - This command goes through any static/ directories of installed apps, - and the directories listed in settings.STATICFILES_DIRS. If package - description files for bower, npm, or grunt are found in any of these - locations, it will use the appropriate package manager to install the - listed packages in a temporary folder, using these commands: - - - package.json: npm install - - Gruntfile.js: grunt default - - bower.json: bower install - - It will then extract the distribution files to the location indicated in - settings.COMPONENT_ROOT. - """ - help = textwrap.dedent(__doc__).lstrip() - component_root = getattr(settings, 'COMPONENT_ROOT', os.path.join(settings.STATIC_ROOT, "components")) - - def add_arguments(self, parser): - parser.add_argument('--with-version', dest='with_version', default=False, action='store_true', - help='Create component directories with version numbers') - parser.add_argument('--keep-packages', dest='keep_packages', default=False, action='store_true', - help='Keep the downloaded bower packages, instead of removing them after moving ' - 'distribution files to settings.COMPONENT_ROOT') - - bower_info = {} - overrides = {} - - def npm_install(self, pkg_json_path): - os.chdir(os.path.dirname(pkg_json_path)) - call(['npm', 'install']) - - def grunt_default(self, grunt_js_path): - os.chdir(os.path.dirname(grunt_js_path)) - call(['grunt']) - - def bower_install(self, bower_json_path, dest_dir): - """Runs bower commnand for the passed bower.json path. - - :param bower_json_path: bower.json file to install - :param dest_dir: where the compiled result will arrive - """ - - # Verify that we are able to run bower, in order to give a good error message in the - # case that it's not installed. Do this separately from the 'bower install' call, in - # order not to warn about a missing bower in the case of installation-related errors. - try: - bower_version = check_output(['bower', '--version']).strip() - except OSError as e: - print("Trying to run bower failed -- is it installed? The error was: %s" % e) - exit(1) - except CalledProcessError as e: - print("Checking the bower version failed: %s" % e) - exit(2) - - print("\nBower %s" % bower_version) - print("Installing from %s\n" % bower_json_path) - - # bower args - args = ['bower', 'install', bower_json_path, '--allow-root', - '--verbose', '--config.cwd={}'.format(dest_dir), '-p'] - - # run bower command - call(args) - - def get_bower_info(self, bower_json_path): - if not bower_json_path in self.bower_info: - self.bower_info[bower_json_path] = json.load(open(bower_json_path)) - - def get_bower_main_list(self, bower_json_path, override): - """ - Returns the bower.json main list or empty list. - Applies overrides from the site-wide bower.json. - """ - self.get_bower_info(bower_json_path) - - main_list = self.bower_info[bower_json_path].get('main') - component = self.bower_info[bower_json_path].get('name') - - if (override in self.bower_info - and "overrides" in self.bower_info[override] - and component in self.bower_info[override].get("overrides") - and "main" in self.bower_info[override].get("overrides").get(component)): - main_list = self.bower_info[override].get("overrides").get(component).get("main") - - if isinstance(main_list, list): - return main_list - - if main_list: - return [main_list] - - return [] - - def get_bower_version(self, bower_json_path): - """Returns the bower.json main list or empty list. - """ - self.get_bower_info(bower_json_path) - - return self.bower_info[bower_json_path].get("version") - - def clean_components_to_static_dir(self, bower_dir, override): - print("\nMoving component files to %s\n" % (self.component_root,)) - - for directory in os.listdir(bower_dir): - print("Component: %s" % (directory, )) - - src_root = os.path.join(bower_dir, directory) - - for bower_json in ['bower.json', '.bower.json']: - bower_json_path = os.path.join(src_root, bower_json) - if os.path.exists(bower_json_path): - main_list = self.get_bower_main_list(bower_json_path, override) + ['bower.json'] - version = self.get_bower_version(bower_json_path) - - dst_root = os.path.join(self.component_root, directory) - if self.with_version: - assert not dst_root.endswith(os.sep) - dst_root += "-"+version - - for pattern in filter(None, main_list): - src_pattern = os.path.join(src_root, pattern) - # main_list elements can be fileglob patterns - for src_path in glob.glob(src_pattern): - if not os.path.exists(src_path): - print("Could not find source path: %s" % (src_path, )) - - # Build the destination path - src_part = src_path[len(src_root+'/'):] - if src_part.startswith('dist/'): - src_part = src_part[len('dist/'):] - dst_path = os.path.join(dst_root, src_part) - - # Normalize the paths, for good looks - src_path = os.path.abspath(src_path) - dst_path = os.path.abspath(dst_path) - - # Check if we need to copy the file at all. - if os.path.exists(dst_path): - with open(src_path, 'br') as src: - src_hash = hashlib.sha1(src.read()).hexdigest() - with open(dst_path, 'br') as dst: - dst_hash = hashlib.sha1(dst.read()).hexdigest() - if src_hash == dst_hash: - #print('{0} = {1}'.format(src_path, dst_path)) - continue - - # Make sure dest dir exists. - dst_dir = os.path.dirname(dst_path) - if not os.path.exists(dst_dir): - os.makedirs(dst_dir) - - print(' {0} > {1}'.format(src_path, dst_path)) - shutil.copy(src_path, dst_path) - break - - def handle(self, *args, **options): - - self.with_version = options.get("with_version") - self.keep_packages = options.get("keep_packages") - - temp_dir = getattr(settings, 'BWR_APP_TMP_FOLDER', 'tmp') - temp_dir = os.path.abspath(temp_dir) - - # finders - basefinder = BaseDirectoryFinder() - appfinder = AppDirectoriesFinder() - # Assume bower.json files are to be found in each app directory, - # rather than in the app's static/ subdirectory: - appfinder.source_dir = '.' - - finders = (basefinder, appfinder, ) - - if os.path.exists(temp_dir): - if not self.keep_packages: - sys.stderr.write( - "\nWARNING:\n\n" - " The temporary package installation directory exists, but the --keep-packages\n" - " option has not been given. In order to not delete anything which should be\n" - " kept, %s will not be removed.\n\n" - " Please remove it manually, or use the --keep-packages option to avoid this\n" - " message.\n\n" % (temp_dir,)) - self.keep_packages = True - else: - os.makedirs(temp_dir) - - for finder in finders: - for path in finder.find('package.json', all=True): - self.npm_install(path) - - for finder in finders: - for path in finder.find('Gruntfile.json', all=True): - self.grunt_default(path) - - for finder in finders: - for path in finder.find('bower.json', all=True): - self.get_bower_info(path) - self.bower_install(path, temp_dir) - - bower_dir = os.path.join(temp_dir, 'bower_components') - - # nothing to clean - if not os.path.exists(bower_dir): - print('No components seems to have been found by bower, exiting.') - sys.exit(0) - - self.clean_components_to_static_dir(bower_dir, path) - - if not self.keep_packages: - shutil.rmtree(temp_dir) - diff --git a/djangobwr/models.py b/djangobwr/models.py deleted file mode 100644 index 71a836239..000000000 --- a/djangobwr/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/djangobwr/storage.py b/djangobwr/storage.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/docker/Dockerfile b/docker/Dockerfile index cfeb033ae..b1488eb0e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -77,9 +77,6 @@ RUN dpkg-reconfigure locales && \ update-locale LC_ALL en_US.UTF-8 ENV LC_ALL en_US.UTF-8 -# Install bower -RUN npm install -g bower - # Install idnits ADD https://raw.githubusercontent.com/ietf-tools/idnits-mirror/main/idnits /usr/local/bin/ RUN chmod +rx /usr/local/bin/idnits @@ -131,4 +128,4 @@ COPY docker-init.sh /docker-init.sh RUN chmod +x /docker-init.sh WORKDIR /root/src -ENTRYPOINT ["/docker-init.sh"] +ENTRYPOINT ["/docker-init.sh"] \ No newline at end of file diff --git a/ietf/README-BOWER.rst b/ietf/README-BOWER.rst deleted file mode 100644 index b616a4215..000000000 --- a/ietf/README-BOWER.rst +++ /dev/null @@ -1,33 +0,0 @@ -Handling of External Javascript and CSS Components -================================================== - -The file ``bower.json`` in this direcory is a bower_ file which lists the -external web assets used by the datatracker. - -In order to update the version of a component listed in ``ietf/bower.json``, -or add a new one, you should edit ``bower.json``, and then run the management -command:: - - $ ietf/manage.py bower_install - -That command will fetch the required version of each external component listed -in ``bower.json`` (actually, it will do this for *all* ``bower.json`` files -found in the ``static/`` directories of all ``INSTALLED_APPS`` and the -directories in ``settings.STATICFILES_DIRS``), saving them temporarily under -``.tmp/bower_components/``; it will then extract the relevant ``js`` and -``css`` files and place them in an appropriately named directory under -``static/lib/``. The latter location is controlled by ``COMPONENT_ROOT`` in -``settings.py``. - -(Not surprisingly, you need to have bower_ installed in order to use this -management command.) - -The ``bower_install`` command is not run automatically by ``bin/mkrelease``, -since it needs an updated ``bower.json`` in order to do anything interesting; -and we're not running ``bower update`` since some package releases break -compatibility. So when you're intending to update an external web asset to a -newer version, you need to edit the ``bower.json`` file, run ``manage.py -bower_install``, verify that the new version doesn't break things, and then -commit the new files under ``static\lib\`` and the updated ``bower.json``. - -.. _bower: http://bower.io/ diff --git a/ietf/bower.json b/ietf/bower.json deleted file mode 100644 index 0e198e288..000000000 --- a/ietf/bower.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "name": "datatracker", - "version": "6.0.0", - "ignore": [], - "main": [], - "dependencies": { - "bootstrap-datepicker": "~1", - "d3": "~3", - "font-awesome": "~4", - "fullcalendar": "~4", - "highcharts": "~6", - "js-cookie": "~2", - "jquery": "~1", - "jquery.tablesorter": "~2", - "moment": "~2", - "moment-timezone": "~0", - "select2": "~3", - "select2-bootstrap-css": "~1", - "spin.js": "~2", - "zxcvbn": "~4" - }, - "devDependencies": {}, - "overrides": { - "bootstrap-datepicker": { - "main": [ - "dist/css/bootstrap-datepicker3.min.css", - "dist/js/bootstrap-datepicker.min.js" - ] - }, - "font-awesome": { - "main": [ - "./css/font-awesome.min.css", - "./fonts/*" - ] - }, - "moment": { - "main": [ - "min/moment.min.js" - ] - }, - "tablesorter": { - "main": [ - "dist/js/jquery.tablesorter.combined.min.js", - "dist/css/theme.bootstrap.min.css" - ] - }, - "spin.js": { - "main": "spin.min.js" - }, - "highcharts": { - "main": [ - "highcharts.js", - "highcharts-more.js", - "highstock.js", - "highmaps.js", - "modules/exporting.js", - "modules/export-data.js", - "modules/offline-exporting.js", - "modules/map.js" - ] - }, - "js-cookie": { - "main": "src/js.cookie.js" - } - } -} \ No newline at end of file diff --git a/ietf/settings.py b/ietf/settings.py index 53614017c..a9d60a79a 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -165,16 +165,11 @@ else: STATIC_URL = "https://www.ietf.org/lib/dt/%s/"%__version__ STATIC_ROOT = "/a/www/www6s/lib/dt/%s/"%__version__ -# Destination for components handled by djangobower -COMPONENT_ROOT = BASE_DIR + "/externals/static/" -COMPONENT_URL = STATIC_URL - # List of finder classes that know how to find static files in # various locations. STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'ietf.utils.bower_storage.BowerStorageFinder', ) WSGI_APPLICATION = "ietf.wsgi.application" @@ -442,7 +437,6 @@ INSTALLED_APPS = [ 'corsheaders', 'django_markup', 'django_password_strength', - 'djangobwr', 'form_utils', 'oidc_provider', 'simple_history', @@ -1292,4 +1286,4 @@ if SERVER_MODE != 'production': CSRF_COOKIE_SAMESITE = 'Lax' SESSION_COOKIE_SECURE = False SESSION_COOKIE_SAMESITE = 'Lax' - + \ No newline at end of file diff --git a/ietf/utils/bower_storage.py b/ietf/utils/bower_storage.py deleted file mode 100644 index 72025d3c4..000000000 --- a/ietf/utils/bower_storage.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.core.files.storage import FileSystemStorage -from django.contrib.staticfiles.finders import BaseStorageFinder -from django.conf import settings - -import debug # pyflakes:ignore - -class BowerStorageFinder(BaseStorageFinder): - storage = FileSystemStorage(location=settings.COMPONENT_ROOT, base_url=settings.COMPONENT_URL) - - def find(self, path, all=False): - files = super(BowerStorageFinder, self).find(path, all) - return files diff --git a/ietf/utils/tests.py b/ietf/utils/tests.py index 87ed366a5..1e2ddc946 100644 --- a/ietf/utils/tests.py +++ b/ietf/utils/tests.py @@ -37,7 +37,6 @@ from ietf.group.factories import GroupFactory from ietf.group.models import Group from ietf.person.name import name_parts, unidecode_name from ietf.submit.tests import submission_file -from ietf.utils.bower_storage import BowerStorageFinder from ietf.utils.draft import Draft, getmeta from ietf.utils.log import unreachable, assertion from ietf.utils.mail import send_mail_preformatted, send_mail_text, send_mail_mime, outbox, get_payload_text @@ -390,39 +389,6 @@ class AdminTestCase(TestCase): self.assertContains(r, model._meta.model_name, msg_prefix="There doesn't seem to be any admin API for model %s.models.%s"%(app.__name__,model.__name__,)) -## One might think that the code below would work, but it doesn't ... - -# def list_static_files(path): -# r = Path(settings.STATIC_ROOT) -# p = r / path -# files = list(p.glob('**/*')) -# relfn = [ str(file.relative_to(r)) for file in files ] -# return relfn -# -# class TestBowerStaticFiles(TestCase): -# -# def test_bower_static_file_finder(self): -# from django.templatetags.static import static -# bower_json = os.path.join(settings.BASE_DIR, 'bower.json') -# with open(bower_json) as file: -# bower_info = json.load(file) -# for asset in bower_info["dependencies"]: -# files = list_static_files(asset) -# self.assertGreater(len(files), 0) -# for file in files: -# url = static(file) -# debug.show('url') -# r = self.client.get(url) -# self.assertEqual(r.status_code, 200) - -class TestBowerStaticFiles(TestCase): - - def test_bower_storage_finder(self): - bfs = BowerStorageFinder() - files = bfs.find('.') - self.assertNotEqual(files,[]) - - class DraftTests(TestCase): def setUp(self): @@ -528,4 +494,4 @@ class TestRFC2047Strings(TestCase): ('', ''), ) for encoded_str, unicode in names: - self.assertEqual(unicode, parse_unicode(encoded_str)) + self.assertEqual(unicode, parse_unicode(encoded_str)) \ No newline at end of file