Skip to content

Commit

Permalink
make flask-scss work with the new pyScss API instead of the old depre…
Browse files Browse the repository at this point in the history
…cated one
  • Loading branch information
bcarlin committed Jul 10, 2015
1 parent b958b54 commit c7d38e6
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 37 deletions.
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -11,3 +11,4 @@ MANIFEST
dist
.coverage
htmlcov/
.venv
4 changes: 3 additions & 1 deletion doc/index.rst
Expand Up @@ -217,9 +217,11 @@ Changes
0.4 (2015/07/09)
~~~~~~~~~~~~~~~~

* Compatibility with python 3.3+
* Fixed partial compilation bug (Vail Gold)
* Fix spelling error in docstring (Tobias Widén)
* comply with Flask import schem (`http://flask.pocoo.org/docs/0.10/extensiondev/`_)
* comply with Flask import scheme (`http://flask.pocoo.org/docs/0.10/extensiondev/`_)
* Makes flask scss work with pyScss new API


0.3 (2013/03/15)
Expand Down
19 changes: 7 additions & 12 deletions flask_scss.py
Expand Up @@ -2,7 +2,7 @@
from __future__ import absolute_import
import os.path as op
import os
import scss as pyScss
from scss.compiler import Compiler
import fnmatch


Expand Down Expand Up @@ -42,16 +42,11 @@ def __init__(self, app, static_dir=None, asset_dir=None, load_paths=None):
self.assets = {}
self.partials = {}

if hasattr(pyScss.config.LOAD_PATHS, 'split'):
pyScss.config.LOAD_PATHS = pyScss.config.LOAD_PATHS.split(',')
load_path_list = [self.asset_dir] \
load_path_list = ([self.asset_dir] if self.asset_dir else []) \
+ (load_paths or app.config.get('SCSS_LOAD_PATHS', []))
for path in load_path_list:
pyScss.config.LOAD_PATHS.append(path)

pyScss.log = app.logger
self.compiler = pyScss.Scss().compile

# pyScss.log = app.logger
self.compiler = Compiler(search_path=load_path_list)
if self.app.testing or self.app.debug:
self.set_hooks()

Expand Down Expand Up @@ -126,6 +121,6 @@ def compile_scss(self, asset, dest_path):
self.app.logger.info("[flask-pyscss] refreshing %s" % (dest_path,))
if not os.path.exists(op.dirname(dest_path)):
os.makedirs(op.dirname(dest_path))
with open(dest_path, 'w') as fo:
with open(asset) as fi:
fo.write(self.compiler(fi.read()))
with open(dest_path, 'w') as file_out:
with open(asset) as file_in:
file_out.write(self.compiler.compile_string(file_in.read()))
61 changes: 39 additions & 22 deletions test_scss.py
Expand Up @@ -6,10 +6,14 @@
import os
import os.path as op
import shutil
from mock import Mock, patch
try:
from unittest.mock import Mock, patch
except ImportError:
from mock import Mock, patch
from flask import Flask
import flask_scss
import time
import pathlib

SCSS_CONTENT = "a { color: red; text-decoration: none; }"

Expand All @@ -36,6 +40,8 @@ def set_layout(self, base=None):

def create_asset_file(self, filename):
filepath = op.join(self.asset_dir, filename)
if not os.path.exists(os.path.dirname(filepath)):
os.makedirs(os.path.dirname(filepath))
with open(filepath, 'w') as f:
f.write(SCSS_CONTENT)
return filepath
Expand Down Expand Up @@ -162,7 +168,6 @@ def test_scss_discovery_is_recursive(self):
self.set_layout()
self.create_asset_file('foo.scss')
asset_scss_dir = op.join(self.test_data, 'assets', 'bar')
os.makedirs(asset_scss_dir)
self.create_asset_file('bar/baz.scss')
scss_inst = flask_scss.Scss(self.app)
scss_inst.discover_scss()
Expand Down Expand Up @@ -208,8 +213,9 @@ def test_update_scss_asset_to_update(self):
#verifies that css file has been modified
self.assertGreater(op.getmtime(css_path), op.getmtime(scss_path))
# verifies that the content of the css file has changed
css_content = open(css_path).read()
self.assertNotEquals(css_content, "nothing")
with open(css_path) as css_file:
css_content = css_file.read()
self.assertNotEqual(css_content, "nothing")

def test_update_scss_nothing_to_update(self):
self.set_layout()
Expand Down Expand Up @@ -258,11 +264,13 @@ def test_update_scss_update_only_changed_scss_files(self):
self.assertGreater(op.getmtime(css_must_be_compiled_path),
op.getmtime(scss_newer_path))

css_older_content = open(css_must_not_change_path).read()
with open(css_must_not_change_path) as file_in:
css_older_content = file_in.read()
self.assertEqual(css_older_content, "nothing")

css_newer_content = open(css_must_be_compiled_path).read()
self.assertNotEquals(css_newer_content, "nothing")
with open(css_must_be_compiled_path) as file_in:
css_newer_content = file_in.read()
self.assertNotEqual(css_newer_content, "nothing")

def test_css_is_refreshed_if_partials_are_updated(self):
self.set_layout()
Expand Down Expand Up @@ -298,8 +306,9 @@ def test_css_is_refreshed_if_partials_are_updated(self):
self.assertGreater(op.getmtime(css_must_be_compiled_path),
op.getmtime(scss_partial_path), "not refreshed")

css_newer_content = open(css_must_be_compiled_path).read()
self.assertNotEquals(css_newer_content, "nothing")
with open(css_must_be_compiled_path) as file_in:
css_newer_content = file_in.read()
self.assertNotEqual(css_newer_content, "nothing")

def test_it_sets_up_refresh_hooks_if_application_is_in_test_mode(self):
self.app.testing = True
Expand Down Expand Up @@ -331,30 +340,38 @@ def test_it_does_not_set_up_refresh_hooks_if_application_is_not_in_debug_or_test

def test_it_looks_for_an_app_load_path_settings(self):
self.app.config['SCSS_LOAD_PATHS'].append('foo')
flask_scss.Scss(self.app)
self.assertIn('foo', flask_scss.pyScss.config.LOAD_PATHS)
scss = flask_scss.Scss(self.app)
self.assertIn(pathlib.Path(os.getcwd(), 'foo'),
scss.compiler.search_path)

def test_it_looks_for_an_app_load_path_settings_with_multiple_paths(self):
self.app.config['SCSS_LOAD_PATHS'].append('foo')
self.app.config['SCSS_LOAD_PATHS'].append('bar')
flask_scss.Scss(self.app)
self.assertIn('foo', flask_scss.pyScss.config.LOAD_PATHS)
self.assertIn('bar', flask_scss.pyScss.config.LOAD_PATHS)
paths = ['foo', 'bar']
for path in paths:
self.app.config['SCSS_LOAD_PATHS'].append(path)
scss = flask_scss.Scss(self.app)

for path in paths:
self.assertIn(pathlib.Path(os.getcwd(), path),
scss.compiler.search_path)

def test_app_config_is_overridden_by_local_conf(self):
self.app.config['SCSS_LOAD_PATHS'].append('foo')
flask_scss.Scss(self.app, load_paths=['bar'])
self.assertIn('bar', flask_scss.pyScss.config.LOAD_PATHS)
scss = flask_scss.Scss(self.app, load_paths=['bar'])
self.assertIn(pathlib.Path(os.getcwd(), 'bar'),
scss.compiler.search_path)

def test_app_config_is_overridden_by_local_conf_with_multiple_paths(self):
self.app.config['SCSS_LOAD_PATHS'].append('foo')
flask_scss.Scss(self.app, load_paths=['bar', 'baz'])
self.assertIn('bar', flask_scss.pyScss.config.LOAD_PATHS)
self.assertIn('baz', flask_scss.pyScss.config.LOAD_PATHS)
scss = flask_scss.Scss(self.app, load_paths=['bar', 'baz'])
self.assertIn(pathlib.Path(os.getcwd(), 'bar'),
scss.compiler.search_path)
self.assertIn(pathlib.Path(os.getcwd(), 'baz'),
scss.compiler.search_path)

def test_the_asset_dir_is_in_the_load_path(self):
self.set_layout()
inst = flask_scss.Scss(self.app, load_paths=['bar', 'baz'])
self.assertIn(inst.asset_dir, flask_scss.pyScss.config.LOAD_PATHS)
self.assertIn(pathlib.Path(inst.asset_dir), inst.compiler.search_path)

def test_compile_scss_creates_subfolders_if_necessary(self):
self.set_layout()
Expand Down
6 changes: 4 additions & 2 deletions tox.ini
@@ -1,16 +1,17 @@
[tox]
;envlist = py25,py26,py27
envlist = py26,py27
envlist = py26,py27,py33,py34

[testenv]
setenv=
PATH={envbindir}:$PATH
commands=python -m unittest discover test
commands=python -m unittest test_scss

[testenv:py27]
deps=
mock
nose
pathlib
basepython=/usr/bin/python2.7
commands=
pip freeze
Expand All @@ -21,6 +22,7 @@ deps=
unittest2
mock
nose
pathlib
basepython=/usr/bin/python2.6
commands=
pip freeze
Expand Down

0 comments on commit c7d38e6

Please sign in to comment.