- Upgrade and fix versions for dependencies - Use the typogrify package on pypi - Fix tests that break because of the upgrades - Bump versionmain
@@ -1,4 +1,10 @@ | |||
Version 0.8.5a14 | |||
Version 0.8.5a16 | |||
============================================================ | |||
* Upgrade dependencies and setup for 0.8.5 | |||
* Bug fix: Use the released version of typogrify. (Issue #193) | |||
Version 0.8.5a15 | |||
============================================================ | |||
* Bug Fix: Fixed stylus `indent` issues with empty files. (Issue #161) | |||
@@ -1,4 +1,4 @@ | |||
Version 0.8.5a14 | |||
Version 0.8.5a16 | |||
A brand new **hyde** | |||
==================== | |||
@@ -1,16 +1,6 @@ | |||
commando==0.1.1a | |||
PyYAML==3.09 | |||
Markdown==2.0.3 | |||
MarkupSafe==0.11 | |||
pygments | |||
smartypants==1.6.0.3 | |||
-e git://github.com/hyde/typogrify.git#egg=typogrify | |||
Jinja2==2.5.5 | |||
pyquery==0.6.1 | |||
unittest2==0.5.1 | |||
mock==0.7.0b4 | |||
nose==1.0.0 | |||
pep8==0.6.1 | |||
pylint==0.22.0 | |||
pysmell==0.7.3 | |||
-r requirements.txt | |||
pyquery | |||
docutils | |||
mock | |||
nose | |||
PIL |
@@ -2,50 +2,26 @@ | |||
""" | |||
Implements the hyde entry point commands | |||
""" | |||
from commando import * | |||
from commando import ( | |||
Application, | |||
command, | |||
store, | |||
subcommand, | |||
true, | |||
version | |||
) | |||
from hyde.exceptions import HydeException | |||
from hyde.fs import FS, File, Folder | |||
from hyde.fs import FS, Folder | |||
from hyde.layout import Layout, HYDE_DATA | |||
from hyde.model import Config | |||
from hyde.site import Site | |||
from hyde.version import __version__ | |||
from hyde.util import getLoggerWithConsoleHandler | |||
import codecs | |||
import os | |||
import sys | |||
import yaml | |||
HYDE_LAYOUTS = "HYDE_LAYOUTS" | |||
logger = getLoggerWithConsoleHandler('hyde') | |||
class Engine(Application): | |||
""" | |||
The Hyde Application | |||
""" | |||
def __init__(self, raise_exceptions=False): | |||
self.raise_exceptions = raise_exceptions | |||
super(Engine, self).__init__() | |||
def run(self, args=None): | |||
""" | |||
The engine entry point. | |||
""" | |||
# Catch any errors thrown and log the message. | |||
try: | |||
super(Engine, self).run(args) | |||
except HydeException, he: | |||
if self.raise_exceptions: | |||
raise | |||
elif self.__parser__: | |||
self.__parser__.error(he.message) | |||
else: | |||
logger.error(he.message) | |||
return -1 | |||
@command(description='hyde - a python static website generator', | |||
epilog='Use %(prog)s {command} -h to get help on individual commands') | |||
@@ -60,7 +36,7 @@ class Engine(Application): | |||
""" | |||
if args.verbose: | |||
import logging | |||
logger.setLevel(logging.DEBUG) | |||
self.logger.setLevel(logging.DEBUG) | |||
sitepath = Folder(args.sitepath).fully_expanded_path | |||
return Folder(sitepath) | |||
@@ -83,7 +59,7 @@ class Engine(Application): | |||
"The given site path [%s] already contains a hyde site." | |||
" Use -f to overwrite." % sitepath) | |||
layout = Layout.find_layout(args.layout) | |||
logger.info( | |||
self.logger.info( | |||
"Creating site at [%s] with layout [%s]" % (sitepath, layout)) | |||
if not layout or not layout.exists: | |||
raise HydeException( | |||
@@ -92,7 +68,7 @@ class Engine(Application): | |||
" has been setup properly if you are using custom path for" | |||
" layouts" % HYDE_DATA) | |||
layout.copy_contents_to(args.sitepath) | |||
logger.info("Site creation complete") | |||
self.logger.info("Site creation complete") | |||
@subcommand('gen', help='Generate the site') | |||
@store('-c', '--config-path', default='site.yaml', dest='config', | |||
@@ -112,11 +88,11 @@ class Engine(Application): | |||
gen = Generator(site) | |||
incremental = True | |||
if args.regen: | |||
logger.info("Regenerating the site...") | |||
self.logger.info("Regenerating the site...") | |||
incremental = False | |||
gen.generate_all(incremental=incremental) | |||
logger.info("Generation complete.") | |||
self.logger.info("Generation complete.") | |||
@subcommand('serve', help='Serve the website') | |||
@store('-a', '--address', default='localhost', dest='address', | |||
@@ -134,17 +110,16 @@ class Engine(Application): | |||
the entire site or specific files based on ths request. | |||
""" | |||
sitepath = self.main(args) | |||
config_file = sitepath.child(args.config) | |||
site = self.make_site(sitepath, args.config, args.deploy) | |||
from hyde.server import HydeWebServer | |||
server = HydeWebServer(site, args.address, args.port) | |||
logger.info("Starting webserver at [%s]:[%d]", args.address, args.port) | |||
self.logger.info("Starting webserver at [%s]:[%d]", args.address, args.port) | |||
try: | |||
server.serve_forever() | |||
except KeyboardInterrupt, SystemExit: | |||
logger.info("Received shutdown request. Shutting down...") | |||
except (KeyboardInterrupt, SystemExit): | |||
self.logger.info("Received shutdown request. Shutting down...") | |||
server.shutdown() | |||
logger.info("Server successfully stopped") | |||
self.logger.info("Server successfully stopped") | |||
exit() | |||
@subcommand('publish', help='Publish the website') | |||
@@ -9,7 +9,6 @@ import re | |||
import itertools | |||
from urllib import quote, unquote | |||
from hyde.fs import File, Folder | |||
from hyde.model import Expando | |||
from hyde.template import HtmlWrap, Template | |||
from hyde.util import getLoggerWithNullHandler | |||
@@ -693,12 +692,12 @@ class Jinja2Template(Template): | |||
self.env.extend(config=config) | |||
try: | |||
from typogrify.templatetags import jinja2_filters | |||
from typogrify.templatetags import jinja_filters | |||
except ImportError: | |||
jinja2_filters = False | |||
jinja_filters = False | |||
if jinja2_filters: | |||
jinja2_filters.register(self.env) | |||
if jinja_filters: | |||
jinja_filters.register(self.env) | |||
def clear_caches(self): | |||
""" | |||
@@ -0,0 +1,45 @@ | |||
Requirements | |||
============ | |||
All the python requirements are enumerated in dev-req.txt. You can install them | |||
with: | |||
:: | |||
pip install -r dev-req.txt | |||
Apart from these requirements the following are required by plugins if you | |||
choose to run the corresponding tests. Some of the comands use the Mac OS X | |||
package manager `homebrew` - please use the package manager corresponding to | |||
your operating system. | |||
:: | |||
# stylus | |||
npm install -g stylus | |||
#uglifyjs | |||
npm install -g uglify-js | |||
#asciidoc | |||
brew install asciidoc | |||
cd /usr/local/Cellar/asciidoc/8.6.8/bin | |||
curl -O https://asciidoc.googlecode.com/hg/asciidocapi.py | |||
#optipng | |||
brew install optipng | |||
Ensure that `asciidoc`_ python api is available in the python path. | |||
For example: | |||
:: | |||
export PYTHONPATH=/usr/local/Cellar/asciidoc/8.6.8/bin:$PYTHONPATH | |||
Run the tests | |||
============= | |||
:: | |||
nosetests hyde/tests |
@@ -5,7 +5,6 @@ Use nose | |||
`$ nosetests` | |||
""" | |||
from hyde.fs import File, Folder | |||
from hyde.model import Expando | |||
from hyde.generator import Generator | |||
from hyde.site import Site | |||
@@ -4,7 +4,6 @@ Use nose | |||
`$ pip install nose` | |||
`$ nosetests` | |||
""" | |||
from hyde.ext.plugins.meta import MetaPlugin | |||
from hyde.fs import File, Folder | |||
from hyde.generator import Generator | |||
from hyde.site import Site | |||
@@ -72,8 +71,8 @@ Heading 2 | |||
text = target.read_all() | |||
q = PyQuery(text) | |||
assert q("h1").length == 2 | |||
assert q("h1:eq(0)").text().strip() == "Heading 1" | |||
assert q("h1:eq(1)").text().strip() == "Heading 2" | |||
assert q("h1:nth-child(1)").text().strip() == "Heading 1" | |||
assert q("h1:nth-child(2)").text().strip() == "Heading 2" | |||
def test_can_load_front_matter(self): | |||
d = {'title': 'A nice title', | |||
@@ -4,13 +4,11 @@ Use nose | |||
`$ pip install nose` | |||
`$ nosetests` | |||
""" | |||
from hyde.fs import File, Folder | |||
from hyde.fs import File | |||
from hyde.generator import Generator | |||
from hyde.model import Expando | |||
from hyde.site import Site | |||
from hyde.tests.util import assert_html_equals | |||
import yaml | |||
TEST_SITE = File(__file__).parent.parent.child_folder('_test') | |||
@@ -86,8 +84,8 @@ class TestTagger(object): | |||
assert q | |||
assert q('li').length == 2 | |||
assert q('li a:first-child').attr('href') == '/blog/another-sad-post.html' | |||
assert q('li a:eq(1)').attr('href') == '/blog/sad-post.html' | |||
assert q('li:nth-child(1) a').attr('href') == '/blog/another-sad-post.html' | |||
assert q('li:nth-child(2) a').attr('href') == '/blog/sad-post.html' | |||
q = PyQuery(File(tags_folder.child('happy.html')).read_all()) | |||
assert q | |||
@@ -105,9 +103,9 @@ class TestTagger(object): | |||
assert q | |||
assert q('li').length == 3 | |||
assert q('li a:eq(0)').attr('href') == '/blog/happy-post.html' | |||
assert q('li a:eq(1)').attr('href') == '/blog/angry-post.html' | |||
assert q('li a:eq(2)').attr('href') == '/blog/sad-post.html' | |||
assert q('li:nth-child(1) a').attr('href') == '/blog/happy-post.html' | |||
assert q('li:nth-child(2) a').attr('href') == '/blog/angry-post.html' | |||
assert q('li:nth-child(3) a').attr('href') == '/blog/sad-post.html' | |||
q = PyQuery(File(tags_folder.child('events.html')).read_all()) | |||
assert q | |||
@@ -8,7 +8,7 @@ Use nose | |||
from hyde.engine import Engine | |||
from hyde.exceptions import HydeException | |||
from hyde.fs import FS, File, Folder | |||
from hyde.fs import File, Folder | |||
from hyde.layout import Layout | |||
from nose.tools import raises, with_setup, nottest | |||
@@ -8,19 +8,17 @@ Some code borrowed from rwbench.py from the jinja2 examples | |||
""" | |||
from datetime import datetime | |||
from hyde.ext.templates.jinja import Jinja2Template | |||
from hyde.fs import File, Folder | |||
from hyde.fs import File | |||
from hyde.site import Site | |||
from hyde.generator import Generator | |||
from hyde.model import Config | |||
import jinja2 | |||
from jinja2.utils import generate_lorem_ipsum | |||
from random import choice, randrange | |||
from util import assert_html_equals | |||
import yaml | |||
from pyquery import PyQuery | |||
from nose.tools import raises, nottest, with_setup | |||
from nose.tools import nottest | |||
ROOT = File(__file__).parent | |||
JINJA2 = ROOT.child_folder('templates/jinja2') | |||
@@ -138,35 +136,14 @@ def test_asciidoc(): | |||
t = Jinja2Template(JINJA2.path) | |||
t.configure(None) | |||
html = t.render(source, {}).strip() | |||
expected_output=""" | |||
<hr> | |||
<h2><a name="_heading_2"></a>Heading 2</h2> | |||
<ul> | |||
<li> | |||
<p> | |||
test1 | |||
</p> | |||
</li> | |||
<li> | |||
<p> | |||
test2 | |||
</p> | |||
</li> | |||
<li> | |||
<p> | |||
test3 | |||
</p> | |||
</li> | |||
</ul> | |||
""" | |||
assert html | |||
q = PyQuery(html) | |||
assert q | |||
assert q("li").length == 3 | |||
assert q("li:eq(0)").text().strip() == "test1" | |||
assert q("li:eq(1)").text().strip() == "test2" | |||
assert q("li:eq(2)").text().strip() == "test3" | |||
assert q("li:nth-child(1)").text().strip() == "test1" | |||
assert q("li:nth-child(2)").text().strip() == "test2" | |||
assert q("li:nth-child(3)").text().strip() == "test3" | |||
def test_markdown(): | |||
source = """ | |||
@@ -242,7 +219,7 @@ def test_markdown_with_extensions(): | |||
t.configure(s) | |||
t.env.filters['dateformat'] = dateformat | |||
html = t.render(source, {}).strip() | |||
assert html == u'<h3 id="heading_3">Heading 3</h3>' | |||
assert html == u'<h3 id="heading-3">Heading 3</h3>' | |||
def test_markdown_with_sourcecode(): | |||
source = """ | |||
@@ -292,7 +269,7 @@ def test_line_statements(): | |||
t.configure(s) | |||
t.env.filters['dateformat'] = dateformat | |||
html = t.render(source, {}).strip() | |||
assert html == u'<h3 id="heading_3">Heading 3</h3>' | |||
assert html == u'<h3 id="heading-3">Heading 3</h3>' | |||
def test_line_statements_with_config(): | |||
source = """ | |||
@@ -315,7 +292,7 @@ def test_line_statements_with_config(): | |||
t.configure(s) | |||
t.env.filters['dateformat'] = dateformat | |||
html = t.render(source, {}).strip() | |||
assert html == u'<h3 id="heading_3">Heading 3</h3>' | |||
assert html == u'<h3 id="heading-3">Heading 3</h3>' | |||
TEST_SITE = File(__file__).parent.child_folder('_test') | |||
@@ -378,7 +355,6 @@ class TestJinjaTemplate(object): | |||
def test_line_statements_with_blocks(self): | |||
site = Site(TEST_SITE) | |||
JINJA2.copy_contents_to(site.content.source) | |||
inc = File(TEST_SITE.child('content/inc.md')) | |||
text = """ | |||
{% extends 'index.html' %} | |||
$$$ block body | |||
@@ -3,4 +3,4 @@ | |||
Handles hyde version | |||
TODO: Use fabric like versioning scheme | |||
""" | |||
__version__ = '0.8.5a15' | |||
__version__ = '0.8.5a16' |
@@ -1,8 +1,7 @@ | |||
argparse | |||
commando | |||
PyYAML | |||
Markdown | |||
MarkupSafe | |||
smartypants | |||
-e git://github.com/hyde/typogrify.git#egg=typogrify | |||
Jinja2 | |||
commando==0.3.2a | |||
PyYAML==3.10 | |||
Markdown==2.3.1 | |||
MarkupSafe==0.15 | |||
Pygments==1.6 | |||
typogrify==2.0.0 | |||
Jinja2==2.6 |
@@ -114,21 +114,18 @@ setup(name=PROJECT, | |||
author_email='lakshmi.vyas@gmail.com', | |||
url='http://hyde.github.com', | |||
packages=find_packages(), | |||
dependency_links=[ | |||
"https://github.com/hyde/typogrify/tarball/hyde-setup#egg=typogrify-hyde" | |||
], | |||
requires=['python (>= 2.7)'], | |||
install_requires=( | |||
'argparse', | |||
'commando', | |||
'jinja2', | |||
'pyYAML', | |||
'markdown', | |||
'smartypants', | |||
'pygments', | |||
'typogrify-hyde' | |||
'commando==0.3.2a', | |||
'PyYAML==3.10', | |||
'Markdown==2.3.1', | |||
'MarkupSafe==0.15', | |||
'Pygments==1.6', | |||
'typogrify==2.0.0', | |||
'Jinja2==2.6' | |||
), | |||
tests_require=( | |||
'nose', | |||
'nose', 'mock' | |||
), | |||
test_suite='nose.collector', | |||
include_package_data = True, | |||