PK cFHdjangobower/__init__.pyPK cFHCdjangobower/finders.pytry: from collections import OrderedDict except ImportError: from ordereddict import OrderedDict from django.contrib.staticfiles.finders import FileSystemFinder from django.core.files.storage import FileSystemStorage from . import conf import os class BowerFinder(FileSystemFinder): """Find static files installed with bower""" def __init__(self, apps=None, *args, **kwargs): self.locations = [] self.storages = OrderedDict() root = self._get_bower_components_location() if root is not None: prefix = '' self.locations.append((prefix, root)) filesystem_storage = FileSystemStorage(location=root) filesystem_storage.prefix = prefix self.storages[root] = filesystem_storage def _get_bower_components_location(self): """ Return the bower components location, or None if one does not exist. """ # Bower 0.10 changed the default folder from 'components' to 'bower_components'. # Try 'bower_components' first, then fall back to trying 'components'. for name in ['bower_components', 'components']: path = os.path.join(conf.COMPONENTS_ROOT, name) if os.path.exists(path): return path PK cFH#8djangobower/shortcuts.pyimport os, sys def is_executable(path): """Check file is executable""" if sys.platform == 'win32': executable = os.access(path, os.X_OK) or path.lower().endswith(".cmd") return os.path.isfile(path) and executable return os.path.isfile(path) and os.access(path, os.X_OK) def which(program): """ Find by path and check exists. Analog of unix `which` command. """ path, name = os.path.split(program) if path: if is_executable(program): return program else: for path in os.environ["PATH"].split(os.pathsep): path = path.strip('"') exe_file = os.path.join(path, program) if is_executable(exe_file): return exe_file return None PK cFHb djangobower/bower.pyfrom . import conf, shortcuts, exceptions import os import subprocess import sys import json class BowerAdapter(object): """Adapter for working with bower""" def __init__(self, bower_path, components_root): self._bower_path = bower_path self._components_root = components_root def is_bower_exists(self): """Check is bower exists""" if shortcuts.is_executable(self._bower_path)\ or shortcuts.which(self._bower_path): return True else: return False def create_components_root(self): """Create components root if need""" if not os.path.exists(self._components_root): os.makedirs(self._components_root) def call_bower(self, args): """Call bower with a list of args""" proc = subprocess.Popen( [self._bower_path] + list(args), cwd=self._components_root) proc.wait() def install(self, packages, *options): """Install packages from bower""" self.call_bower(['install'] + list(options) + list(packages)) def _accumulate_dependencies(self, data): """Accumulate dependencies""" for name, params in data['dependencies'].items(): meta = params.get('pkgMeta', {}) version = meta.get( 'version', meta.get('_resolution', {}).get('commit', ''), ) if version: full_name = '{0}#{1}'.format(name, version) else: full_name = name self._packages.append(full_name) self._accumulate_dependencies(params) def _parse_package_names(self, output): """Get package names in bower >= 1.0""" data = json.loads(output) self._packages = [] self._accumulate_dependencies(data) return self._packages def freeze(self): """Yield packages with versions list""" proc = subprocess.Popen( [self._bower_path, 'list', '--json', '--offline', '--no-color'], cwd=conf.COMPONENTS_ROOT, stdout=subprocess.PIPE, ) outs, errs = proc.communicate() output = outs.decode(sys.getfilesystemencoding()) try: packages = self._parse_package_names(output) except ValueError: raise exceptions.LegacyBowerVersionNotSupported() return iter(set(packages)) bower_adapter = BowerAdapter(conf.BOWER_PATH, conf.COMPONENTS_ROOT) PK cFHk !djangobower/context_processors.py# -*- coding: utf-8 -*- import os.path import json import six from django.conf import settings from django.utils.datastructures import OrderedSet def read_mains(): for component in settings.BOWER_INSTALLED_APPS: try: with open(os.path.join( settings.BOWER_COMPONENTS_ROOT, 'bower_components', component, 'bower.json')) as bower_json: main = json.load(bower_json).get('main') if isinstance(main, six.string_types): yield '%s/%s' % (component, main) elif isinstance(main, list): for m in main: yield '%s/%s' % (component, m) except FileNotFoundError: continue def bower_components(request): return { 'bower_components': OrderedSet([main for main in read_mains()]), } PK cFH#Cqdjangobower/conf.py# -*- coding: utf-8 -*- import os import sys from django.conf import settings __all__ = ['COMPONENTS_ROOT', 'BOWER_PATH'] COMPONENTS_ROOT = getattr(settings, 'BOWER_COMPONENTS_ROOT', os.path.abspath(os.path.dirname(__name__))) if sys.platform == 'win32': default_bower_path = os.path.join(os.getenv("APPDATA"), 'npm', 'bower.cmd') else: default_bower_path = 'bower' BOWER_PATH = getattr(settings, 'BOWER_PATH', default_bower_path) PK cFHQyydjangobower/test_settings.pyimport os TEST_PROJECT_ROOT = os.path.abspath( os.environ.get('TEST_PROJECT_ROOT', '/tmp/'), ) BASE_DIR = TEST_PROJECT_ROOT BOWER_COMPONENTS_ROOT = os.path.join(TEST_PROJECT_ROOT, 'bower_components') STATIC_ROOT = os.path.join(TEST_PROJECT_ROOT, 'bower_static') STATIC_URL = '/static/' BOWER_INSTALLED_APPS = ( 'jquery#1.9', 'underscore', ) SECRET_KEY = 'iamdjangobower' INSTALLED_APPS = ( 'djangobower', ) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } PK cFHdjangobower/models.pyPK cFH""djangobower/exceptions.pyfrom django.core.management.base import CommandError class BowerNotInstalled(CommandError): """Custom command error""" def __init__(self): super(BowerNotInstalled, self).__init__( "Bower not installed, read instruction here - http://bower.io/", ) class LegacyBowerVersionNotSupported(CommandError): """Custom command error""" def __init__(self): super(LegacyBowerVersionNotSupported, self).__init__( "Legacy bower versions not supported, please install bower 1.0+", ) PK cFHs<<djangobower/tests/base.pyfrom django.conf import settings from django.test import TestCase from django.test.utils import override_settings from ..bower import bower_adapter import os import shutil try: TEST_COMPONENTS_ROOT = os.path.join( settings.TEST_PROJECT_ROOT, 'bower_components', ) except AttributeError: TEST_COMPONENTS_ROOT = '/tmp/bower_components/' @override_settings(BOWER_COMPONENTS_ROOT=TEST_COMPONENTS_ROOT) class BaseBowerCase(TestCase): """Base bower test case""" def setUp(self): bower_adapter.create_components_root() def tearDown(self): self._remove_components_root() def _remove_components_root(self): """Remove components root if exists""" if os.path.exists(TEST_COMPONENTS_ROOT): shutil.rmtree(TEST_COMPONENTS_ROOT) def assertCountEqual(self, *args, **kwargs): """Add python 2 support""" if hasattr(self, 'assertItemsEqual'): return self.assertItemsEqual(*args, **kwargs) else: return super(BaseBowerCase, self).assertCountEqual(*args, **kwargs) PK cFH966djangobower/tests/__init__.pyfrom .test_bower import * from .test_finders import * PK cFH7? !djangobower/tests/test_finders.pyfrom django.core.files.storage import FileSystemStorage from django.test import TestCase from ..bower import bower_adapter from ..finders import BowerFinder from .. import conf from .base import BaseBowerCase import os import os.path import shutil class _MakeDirsTestCase(TestCase): """ Helper to create and clean up test directories. """ def setUp(self): super(_MakeDirsTestCase, self).setUp() self.created = [] def tearDown(self): super(_MakeDirsTestCase, self).tearDown() for name in self.created: if os.path.exists(name): shutil.rmtree(name) def makedirs(self, name): """ Wrap os.makedirs() to delete the created directory on teardown. """ os.makedirs(name) self.created.append(name) class SimpleBowerFinderCase(_MakeDirsTestCase): """ Simple BowerFinder tests, without any packages installed. """ def test_list_nonexistent(self): """ When no Bower folder exists, just gracefully find nothing. """ finder = BowerFinder() self.assertEqual(finder.locations, []) self.assertEqual(finder.storages, {}) def test_list_existent(self, leaf_name='bower_components'): """ If 'bower_components' exists, use it to to find files. """ root = os.path.join(conf.COMPONENTS_ROOT, leaf_name) self.makedirs(root) finder = BowerFinder() self.assertEqual(finder.locations, [('', root)]) self.assertEqual(set(finder.storages.keys()), set([root])) storage = finder.storages[root] self.assertIsInstance(storage, FileSystemStorage) self.assertEqual(storage.prefix, '') self.assertEqual(storage.location, root) def test_list_old_path(self): """ If only the old 'components' folder exists, use it instead. """ self.test_list_existent(leaf_name='components') def test_list_both(self): """ If both folders exist, only 'bower_components' should be used. """ self.makedirs(os.path.join(conf.COMPONENTS_ROOT, 'components')) self.test_list_existent(leaf_name='bower_components') class BowerFinderCase(BaseBowerCase): """Test finding installed with bower files""" def setUp(self): super(BowerFinderCase, self).setUp() bower_adapter.install(['jquery#1.9']) self.finder = BowerFinder() def test_find(self): """Test staticfinder find""" test_path = os.path.join('jquery', 'jquery.min.js') path = self.finder.find(test_path) self.assertEqual(path, os.path.join( conf.COMPONENTS_ROOT, 'bower_components', test_path, )) def test_list(self): """Test staticfinder list""" test_path = os.path.join('jquery', 'jquery.min.js') result = self.finder.list([]) matched = [ part for part in result if part[0] == test_path ] self.assertEqual(len(matched), 1) PK cFHM.djangobower/tests/test_bower.pyfrom django.core.management import call_command from django.conf import settings from django.test import TestCase from six import StringIO from mock import MagicMock from ..bower import bower_adapter, BowerAdapter from .. import conf from .base import BaseBowerCase, TEST_COMPONENTS_ROOT import os import shutil class BowerAdapterCase(TestCase): """ BowerAdapter regression tests. """ def test_create_components_root_subdirs(self): """ create_components_root() creates missing intermediate directories. """ if os.path.exists(TEST_COMPONENTS_ROOT): shutil.rmtree(TEST_COMPONENTS_ROOT) subdir = os.path.join(TEST_COMPONENTS_ROOT, 'sub', 'dir') adapter = BowerAdapter(conf.BOWER_PATH, subdir) adapter.create_components_root() self.assertTrue(os.path.exists(subdir)) shutil.rmtree(TEST_COMPONENTS_ROOT) class BowerInstallCase(BaseBowerCase): """Test case for bower_install management command""" def setUp(self): super(BowerInstallCase, self).setUp() self.apps = settings.BOWER_INSTALLED_APPS self._original_install = bower_adapter.install bower_adapter.install = MagicMock() def tearDown(self): super(BowerInstallCase, self).tearDown() bower_adapter.install = self._original_install def test_create_components_root(self): """Test create components root""" self._remove_components_root() call_command('bower_install') self.assertTrue(os.path.exists(TEST_COMPONENTS_ROOT)) def test_install(self): """Test install bower packages""" call_command('bower_install') bower_adapter.install.assert_called_once_with(self.apps) class BowerFreezeCase(BaseBowerCase): """Case for bower freeze""" def setUp(self): super(BowerFreezeCase, self).setUp() bower_adapter.install(['jquery#1.9']) bower_adapter.install(['backbone']) bower_adapter.install(['underscore']) bower_adapter.install(['typeahead.js']) bower_adapter.install(['backbone-tastypie']) def test_freeze(self): """Test freeze""" installed = [ package.split('#')[0] for package in bower_adapter.freeze() ] self.assertCountEqual(installed, [ 'backbone', 'jquery', 'typeahead.js', 'underscore', 'backbone-tastypie', ]) def test_no_newline_in_freeze(self): """Test no newline in freezee""" installed = bower_adapter.freeze() for package in installed: self.assertNotIn('\n', package) def test_management_command(self): """Test freeze management command""" stdout = StringIO() call_command('bower_freeze', stdout=stdout) stdout.seek(0) output = stdout.read() self.assertIn('BOWER_INSTALLED_APPS', output) self.assertIn('backbone', output) class BowerExistsCase(BaseBowerCase): """ Test bower exists checker. This case need bower to be installed. """ def setUp(self): super(BowerExistsCase, self).setUp() self._original_exists = bower_adapter.is_bower_exists def tearDown(self): super(BowerExistsCase, self).tearDown() bower_adapter.is_bower_exists = self._original_exists def test_if_exists(self): """Test if bower exists""" self.assertTrue(bower_adapter.is_bower_exists()) def test_if_not_exists(self): """Test if bower not exists""" adapter = BowerAdapter('/not/exists/path', TEST_COMPONENTS_ROOT) self.assertFalse(adapter.is_bower_exists()) def _mock_exists_check(self): """Make exists check return false""" bower_adapter.is_bower_exists = MagicMock() bower_adapter.is_bower_exists.return_value = False class BowerCommandCase(BaseBowerCase): """Test case for ./manage.py bower something command""" def setUp(self): super(BowerCommandCase, self).setUp() self.apps = settings.BOWER_INSTALLED_APPS self._mock_bower_adapter() def _mock_bower_adapter(self): self._original_install = bower_adapter.install bower_adapter.install = MagicMock() self._orig_call = bower_adapter.call_bower bower_adapter.call_bower = MagicMock() self._orig_freeze = bower_adapter.freeze bower_adapter.freeze = MagicMock() def tearDown(self): super(BowerCommandCase, self).tearDown() bower_adapter.install = self._original_install bower_adapter.call_bower = self._orig_call bower_adapter.freeze = self._orig_freeze def test_install_without_params(self): """Test that bower install without param identical with bower_install """ call_command('bower', 'install') bower_adapter.install.assert_called_once_with( self.apps) def test_install_with_params(self): """Test bower install """ call_command('bower', 'install', 'jquery') bower_adapter.call_bower.assert_called_once_with( ('install', 'jquery')) def test_freeze(self): """Test bower freeze command""" call_command('bower', 'freeze') bower_adapter.freeze.assert_called_once_with() def test_call_to_bower(self): """Test simple call to bower""" call_command('bower', 'update') bower_adapter.call_bower.assert_called_once_with( ('update',)) PK cFHD(Adjangobower/management/base.pyfrom pprint import pformat from django.core.management.base import BaseCommand from django.conf import settings from ..bower import bower_adapter from ..exceptions import BowerNotInstalled class BaseBowerCommand(BaseCommand): """Base management command with bower support""" requires_system_checks = False def handle(self, *args, **options): self._check_bower_exists() bower_adapter.create_components_root() def _check_bower_exists(self): """Check bower exists or raise exception""" if not bower_adapter.is_bower_exists(): raise BowerNotInstalled() def _install(self, args): bower_adapter.install(settings.BOWER_INSTALLED_APPS, *args) def _freeze(self): packages = list(bower_adapter.freeze()) packages.sort() output = 'BOWER_INSTALLED_APPS = {0}'.format( pformat(packages), ) self.stdout.write(output) PK cFH"djangobower/management/__init__.pyPK cFH+djangobower/management/commands/__init__.pyPK cFHY\`~~(djangobower/management/commands/bower.pyfrom ...bower import bower_adapter from ..base import BaseBowerCommand class Command(BaseBowerCommand): args = 'command' help = 'Call bower in components root ({0}).'.format( bower_adapter._components_root) def handle(self, *args, **options): super(Command, self).handle(*args, **options) if self._is_single_command('install', args): self._install([]) elif self._is_single_command('freeze', args): self._freeze() else: bower_adapter.call_bower(args) def _is_single_command(self, name, args): return len(args) == 1 and args[0] == name PK cFH}hh0djangobower/management/commands/bower_install.pyfrom optparse import make_option from ..base import BaseBowerCommand class Command(BaseBowerCommand): help = 'Install bower apps' option_list = BaseBowerCommand.option_list + ( make_option('-F', action='store_true', dest='force', default=False, help='Force installation of latest package version on conflict'), ) def handle(self, *args, **options): super(Command, self).handle(*args, **options) if options.get('force') == True: args = args + ("-F", ) self._install(args) PK cFHe/djangobower/management/commands/bower_freeze.pyfrom ..base import BaseBowerCommand class Command(BaseBowerCommand): help = 'Freeze bower apps' def handle(self, *args, **options): super(Command, self).handle(*args, **options) self._freeze() PK cFHuh$djangobower/templatetags/__init__.py# -*- coding: utf-8 -*- PK cFHXTuͻ!djangobower/templatetags/bower.py# -*- coding: utf-8 -*- from __future__ import unicode_literals import os.path from django import template from django.templatetags import static register = template.Library() style_template = template.Template( """{% for filename in files %} {% endfor %}""" ) script_template = template.Template( """{% for filename in files %} {% endfor %}""" ) def tags(context, args, type): components = ( [arg for arg in args if arg in context['bower_components']] if args else context['bower_components'] ) files = [] for component in components: files.append(component) context['bower_components'].remove(component) return {'files': [ static.static(f) for f in files if os.path.splitext(f)[1][1:] == type ]} @register.inclusion_tag(style_template, takes_context=True) def bower_styles(context, *args): return tags(context, args, 'css') @register.inclusion_tag(script_template, takes_context=True) def bower_scripts(context, *args): return tags(context, args, 'js') PK7cFHz?i i ,django_bower-5.1.0.dist-info/DESCRIPTION.rstDjango-bower ============ .. image:: https://travis-ci.org/nvbn/django-bower.png :alt: Build Status :target: https://travis-ci.org/nvbn/django-bower .. image:: https://coveralls.io/repos/nvbn/django-bower/badge.png?branch=develop :alt: Coverage Status :target: https://coveralls.io/r/nvbn/django-bower .. image:: https://pypip.in/v/django-bower/badge.png :target: https://crate.io/packages/django-bower/ .. image:: https://pypip.in/d/django-bower/badge.png :target: https://crate.io/packages/django-bower/ Easy way to use `bower `_ with your `Django `_ project. Bower is a package manager for the web. It offers a generic, unopinionated solution to the problem of front-end package management, while exposing the package dependency model via an API that can be consumed by a more opinionated build stack. There are no system wide dependencies, no dependencies are shared between different apps, and the dependency tree is flat. Read full documentation on `read-the-docs `_. Installation ------------ Install django-bower package: .. code-block:: bash pip install django-bower Add django-bower to `INSTALLED_APPS` in your settings: .. code-block:: python 'djangobower', Add staticfinder to `STATICFILES_FINDERS`: .. code-block:: python 'djangobower.finders.BowerFinder', Specify path to components root (you need to use an absolute path): .. code-block:: python BOWER_COMPONENTS_ROOT = '/PROJECT_ROOT/components/' If you need, you can manually set the path to bower: .. code-block:: python BOWER_PATH = '/usr/bin/bower' You can see an example settings file in `example project `_. Usage ----- Specify `BOWER_INSTALLED_APPS` in settings, like: .. code-block:: python BOWER_INSTALLED_APPS = ( 'jquery#1.9', 'underscore', ) Download bower packages with the management command: .. code-block:: bash ./manage.py bower install Add scripts in the template, like: .. code-block:: html+django {% load static %} In production you need to call `bower install` before `collectstatic`: .. code-block:: bash ./manage.py bower install ./manage.py collectstatic If you need to pass arguments to bower, like `--allow-root`, use: .. code-block:: bash ./manage.py bower install -- --allow-root You can use `bower freeze` to receive `BOWER_INSTALLED_APPS` with fixed current versions: .. code-block:: bash ./manage.py bower freeze You can call bower commands like `info` and `update` with: .. code-block:: bash ./manage.py bower info backbone ./manage.py bower update Python 3 support ---------------- django-bower supports python 3.3+ PK7cFHb%%-django_bower-5.1.0.dist-info/entry_points.txt # -*- Entry points: -*- PK7cFHsyy*django_bower-5.1.0.dist-info/metadata.json{"classifiers": ["Framework :: Django", "Programming Language :: JavaScript", "Programming Language :: Python", "Programming Language :: Python :: 3"], "extensions": {"python.details": {"contacts": [{"email": "nvbn.rm@gmail.com", "name": "Vladimir Iakovlev", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst"}, "project_urls": {"Home": "https://github.com/nvbn/django-bower"}}}, "extras": [], "generator": "bdist_wheel (0.26.0)", "license": "BSD", "metadata_version": "2.0", "name": "django-bower", "run_requires": [{"requires": ["django", "six"]}], "summary": "Integrate django with bower", "version": "5.1.0"}PK7cFH; *django_bower-5.1.0.dist-info/top_level.txtdjangobower PK7cFH2%django_bower-5.1.0.dist-info/zip-safe PK7cFH}\\"django_bower-5.1.0.dist-info/WHEELWheel-Version: 1.0 Generator: bdist_wheel (0.26.0) Root-Is-Purelib: true Tag: py3-none-any PK7cFHB[,# # %django_bower-5.1.0.dist-info/METADATAMetadata-Version: 2.0 Name: django-bower Version: 5.1.0 Summary: Integrate django with bower Home-page: https://github.com/nvbn/django-bower Author: Vladimir Iakovlev Author-email: nvbn.rm@gmail.com License: BSD Platform: UNKNOWN Classifier: Framework :: Django Classifier: Programming Language :: JavaScript Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Requires-Dist: django Requires-Dist: six Django-bower ============ .. image:: https://travis-ci.org/nvbn/django-bower.png :alt: Build Status :target: https://travis-ci.org/nvbn/django-bower .. image:: https://coveralls.io/repos/nvbn/django-bower/badge.png?branch=develop :alt: Coverage Status :target: https://coveralls.io/r/nvbn/django-bower .. image:: https://pypip.in/v/django-bower/badge.png :target: https://crate.io/packages/django-bower/ .. image:: https://pypip.in/d/django-bower/badge.png :target: https://crate.io/packages/django-bower/ Easy way to use `bower `_ with your `Django `_ project. Bower is a package manager for the web. It offers a generic, unopinionated solution to the problem of front-end package management, while exposing the package dependency model via an API that can be consumed by a more opinionated build stack. There are no system wide dependencies, no dependencies are shared between different apps, and the dependency tree is flat. Read full documentation on `read-the-docs `_. Installation ------------ Install django-bower package: .. code-block:: bash pip install django-bower Add django-bower to `INSTALLED_APPS` in your settings: .. code-block:: python 'djangobower', Add staticfinder to `STATICFILES_FINDERS`: .. code-block:: python 'djangobower.finders.BowerFinder', Specify path to components root (you need to use an absolute path): .. code-block:: python BOWER_COMPONENTS_ROOT = '/PROJECT_ROOT/components/' If you need, you can manually set the path to bower: .. code-block:: python BOWER_PATH = '/usr/bin/bower' You can see an example settings file in `example project `_. Usage ----- Specify `BOWER_INSTALLED_APPS` in settings, like: .. code-block:: python BOWER_INSTALLED_APPS = ( 'jquery#1.9', 'underscore', ) Download bower packages with the management command: .. code-block:: bash ./manage.py bower install Add scripts in the template, like: .. code-block:: html+django {% load static %} In production you need to call `bower install` before `collectstatic`: .. code-block:: bash ./manage.py bower install ./manage.py collectstatic If you need to pass arguments to bower, like `--allow-root`, use: .. code-block:: bash ./manage.py bower install -- --allow-root You can use `bower freeze` to receive `BOWER_INSTALLED_APPS` with fixed current versions: .. code-block:: bash ./manage.py bower freeze You can call bower commands like `info` and `update` with: .. code-block:: bash ./manage.py bower info backbone ./manage.py bower update Python 3 support ---------------- django-bower supports python 3.3+ PK7cFH #django_bower-5.1.0.dist-info/RECORDdjango_bower-5.1.0.dist-info/DESCRIPTION.rst,sha256=dxtTfbfXv1LIuSOrACkFQgg6-fXBFu_nsBrUB4B45bI,2921 django_bower-5.1.0.dist-info/METADATA,sha256=DFVUjhEkj_upH5h4m0GDtQpuNx39zzo1TsSmjTpRMC8,3363 django_bower-5.1.0.dist-info/RECORD,, django_bower-5.1.0.dist-info/WHEEL,sha256=zX7PHtH_7K-lEzyK75et0UBa3Bj8egCBMXe1M4gc6SU,92 django_bower-5.1.0.dist-info/entry_points.txt,sha256=FjKvgvGyIyqokCxiGIVCvaGmkWcXwEXZ8W6zk1mtvZQ,37 django_bower-5.1.0.dist-info/metadata.json,sha256=L-MoBbq6AkKXOulhvSO94e8_NbiDSE2wkfYqn1J-G9k,633 django_bower-5.1.0.dist-info/top_level.txt,sha256=DfsRmE_NDZPsjTXcSwcspLPJKdl0FnnpjT3-y7pLGSs,12 django_bower-5.1.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 djangobower/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 djangobower/bower.py,sha256=spdsy2tDPzhEBA9a-mU6DW7qsDYp3wHh0lWWV3DVClY,2497 djangobower/conf.py,sha256=gTaxyYmzix_ufD8BTAYbZxcDbeBMmtz7wG7pe1L0gyY,443 djangobower/context_processors.py,sha256=fR1CjNPzA-msWG13625tjbWUEhTLvy3kJOqJFfgaGDY,921 djangobower/exceptions.py,sha256=FCiwIWtr26NhwCuS7lBkwhuKz5M-iTBibmNGHZtQPZo,546 djangobower/finders.py,sha256=Bc4EJWOTOgymU28dETF832jVo9eYj70R7iuthTx6Z_4,1283 djangobower/models.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 djangobower/shortcuts.py,sha256=bv-ebwqLgsWXUAabaxb7xLavlcYOhk_RZE80Xwtf0K8,767 djangobower/test_settings.py,sha256=iq6gS_grb9jsTGoka0Z3jqwFJ9Ye89CMJ9wUaHk8HBg,633 djangobower/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 djangobower/management/base.py,sha256=b_ubBMvszhdnHRZuAqzrmO0KexCMVjr5AenBjx8Bt2w,938 djangobower/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 djangobower/management/commands/bower.py,sha256=U0Di3eWr9TwCoYI3qJxeZQIBBuPJFoerorJ76o_8rrs,638 djangobower/management/commands/bower_freeze.py,sha256=_1nlOCpZOrLH06MFbneBE5wuhFUii_d5bN7aDVdyH5g,220 djangobower/management/commands/bower_install.py,sha256=2vOqb0YtrShjdwEjx35sKQ8vC89I4NAf9umPVNO96GY,616 djangobower/templatetags/__init__.py,sha256=iwhKnzeBJLKxpRVjvzwiRE63_zNpIBfaKLITauVph-0,24 djangobower/templatetags/bower.py,sha256=6Cy813hxf8NMk8sF6CX2P8spmclpCruPoTn3hQc5HQQ,1211 djangobower/tests/__init__.py,sha256=OztnzqrgERLuFposfjIKAF1gNJtCOLUgEhBlL-Greqc,54 djangobower/tests/base.py,sha256=Tl7o-aJ3frKl_WmcxNbSHfmg3Vw41_p1iZyazkqs3jM,1084 djangobower/tests/test_bower.py,sha256=gHiaXShJ8umUPLN3u3KEVI-d_-nBNrpeK8vF_HasTLY,5532 djangobower/tests/test_finders.py,sha256=1H_fMAmBFkhOnjvP8rSW4vUSDcRtQaLGQQpX9No8c-Q,3051 PK cFHdjangobower/__init__.pyPK cFHC5djangobower/finders.pyPK cFH#8ldjangobower/shortcuts.pyPK cFHb djangobower/bower.pyPK cFHk !djangobower/context_processors.pyPK cFH#Cqldjangobower/conf.pyPK cFHQyyXdjangobower/test_settings.pyPK cFH djangobower/models.pyPK cFH"">djangobower/exceptions.pyPK cFHs<<djangobower/tests/base.pyPK cFH966 "djangobower/tests/__init__.pyPK cFH7? !{"djangobower/tests/test_finders.pyPK cFHM..djangobower/tests/test_bower.pyPK cFHD(A~Ddjangobower/management/base.pyPK cFH"dHdjangobower/management/__init__.pyPK cFH+Hdjangobower/management/commands/__init__.pyPK cFHY\`~~(Hdjangobower/management/commands/bower.pyPK cFH}hh0Kdjangobower/management/commands/bower_install.pyPK cFHe/gNdjangobower/management/commands/bower_freeze.pyPK cFHuh$Odjangobower/templatetags/__init__.pyPK cFHXTuͻ!Odjangobower/templatetags/bower.pyPK7cFHz?i i ,Tdjango_bower-5.1.0.dist-info/DESCRIPTION.rstPK7cFHb%%-`django_bower-5.1.0.dist-info/entry_points.txtPK7cFHsyy*adjango_bower-5.1.0.dist-info/metadata.jsonPK7cFH; *cdjango_bower-5.1.0.dist-info/top_level.txtPK7cFH2%ddjango_bower-5.1.0.dist-info/zip-safePK7cFH}\\"`ddjango_bower-5.1.0.dist-info/WHEELPK7cFHB[,# # %ddjango_bower-5.1.0.dist-info/METADATAPK7cFH #brdjango_bower-5.1.0.dist-info/RECORDPK|