From 3f10edb5336b72d31954094c968b168c34362548 Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Sun, 22 Mar 2020 22:45:50 +0100 Subject: [PATCH] Remove useless files from upstream --- .github/workflows/main.yml | 28 -- fabfile.py | 76 --- tests/content/article_with_cover_image.rst | 7 - .../content/article_with_http_cover_image.rst | 7 - tests/content/article_with_og_image.rst | 7 - tests/content/article_without_cover.rst | 6 - tests/content/assets/css/myblog.css | 0 tests/content/assets/favicon.ico | 0 tests/content/assets/images/article_cover.jpg | 1 - .../assets/images/arul_author_cover.jpg | 1 - tests/content/assets/images/avatar.png | Bin 3684 -> 0 bytes .../assets/images/bar_category_cover.jpg | 1 - tests/content/assets/images/bar_tag_cover.jpg | 1 - tests/content/assets/images/cover.jpg | Bin 26162 -> 0 bytes .../assets/images/foo_category_cover.jpg | 1 - tests/content/assets/images/foo_tag_cover.jpg | 1 - tests/content/assets/images/header_cover.jpg | 1 - tests/content/assets/images/og_cover.jpg | 1 - tests/content/assets/images/page_cover.jpg | 1 - .../assets/images/raj_author_cover.jpg | 1 - tests/content/assets/robots.txt | 0 tests/content/pages/page_with_cover_image.rst | 7 - .../pages/page_with_http_cover_image.rst | 7 - tests/content/pages/page_with_og_image.rst | 7 - .../pages/page_without_cover_image.rst | 6 - tests/default_conf.py | 139 ------ tests/requirements.txt | 3 - tests/support.py | 334 ------------- tests/test_author_bio.py | 44 -- tests/test_coverimages.py | 471 ------------------ tests/unittest.cfg | 3 - 31 files changed, 1162 deletions(-) delete mode 100644 .github/workflows/main.yml delete mode 100644 fabfile.py delete mode 100644 tests/content/article_with_cover_image.rst delete mode 100644 tests/content/article_with_http_cover_image.rst delete mode 100644 tests/content/article_with_og_image.rst delete mode 100644 tests/content/article_without_cover.rst delete mode 100644 tests/content/assets/css/myblog.css delete mode 100644 tests/content/assets/favicon.ico delete mode 120000 tests/content/assets/images/article_cover.jpg delete mode 120000 tests/content/assets/images/arul_author_cover.jpg delete mode 100644 tests/content/assets/images/avatar.png delete mode 120000 tests/content/assets/images/bar_category_cover.jpg delete mode 120000 tests/content/assets/images/bar_tag_cover.jpg delete mode 100644 tests/content/assets/images/cover.jpg delete mode 120000 tests/content/assets/images/foo_category_cover.jpg delete mode 120000 tests/content/assets/images/foo_tag_cover.jpg delete mode 120000 tests/content/assets/images/header_cover.jpg delete mode 120000 tests/content/assets/images/og_cover.jpg delete mode 120000 tests/content/assets/images/page_cover.jpg delete mode 120000 tests/content/assets/images/raj_author_cover.jpg delete mode 100644 tests/content/assets/robots.txt delete mode 100644 tests/content/pages/page_with_cover_image.rst delete mode 100644 tests/content/pages/page_with_http_cover_image.rst delete mode 100644 tests/content/pages/page_with_og_image.rst delete mode 100644 tests/content/pages/page_without_cover_image.rst delete mode 100644 tests/default_conf.py delete mode 100644 tests/requirements.txt delete mode 100644 tests/support.py delete mode 100644 tests/test_author_bio.py delete mode 100644 tests/test_coverimages.py delete mode 100644 tests/unittest.cfg diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 6b66959..0000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Python package - -on: [push] - -jobs: - build: - - runs-on: ubuntu-18.04 - strategy: - max-parallel: 4 - matrix: - python-version: [2.7, 3.5, 3.6, 3.7] - - steps: - - uses: actions/checkout@v1 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -r tests/requirements.txt - pelican-themes -i ../attila - - name: Test with pytest - run: | - cd tests - pytest diff --git a/fabfile.py b/fabfile.py deleted file mode 100644 index 8e65c3e..0000000 --- a/fabfile.py +++ /dev/null @@ -1,76 +0,0 @@ -from fabric.api import * -import fabric.contrib.project as project -import os -import shutil -import sys -import SocketServer - -from pelican.server import ComplexHTTPRequestHandler - -# Local path configuration (can be absolute or relative to fabfile) -env.deploy_path = 'output' -DEPLOY_PATH = env.deploy_path - -# Remote server configuration -production = 'root@localhost:22' -dest_path = '/var/www' - -# Rackspace Cloud Files configuration settings -env.cloudfiles_username = 'my_rackspace_username' -env.cloudfiles_api_key = 'my_rackspace_api_key' -env.cloudfiles_container = 'my_cloudfiles_container' - -# Github Pages configuration -env.github_pages_branch = "gh-pages" - -# Port for `serve` -PORT = 8000 - -def clean(): - """Remove generated files""" - if os.path.isdir(DEPLOY_PATH): - shutil.rmtree(DEPLOY_PATH) - os.makedirs(DEPLOY_PATH) - -def build(): - """Build local version of site""" - local('asciidoctor -D {deploy_path} *.adoc'.format(**env)) - local('cp *.png {deploy_path}'.format(**env)) - local('mv {deploy_path}/README.html {deploy_path}/index.html'.format(**env)) - -def rebuild(): - """`clean` then `build`""" - clean() - build() - -def serve(): - """Serve site at http://localhost:8000/""" - os.chdir(env.deploy_path) - - class AddressReuseTCPServer(SocketServer.TCPServer): - allow_reuse_address = True - - server = AddressReuseTCPServer(('', PORT), ComplexHTTPRequestHandler) - - sys.stderr.write('Serving on port {0} ...\n'.format(PORT)) - server.serve_forever() - -def reserve(): - """`build`, then `serve`""" - build() - serve() - -def cf_upload(): - """Publish to Rackspace Cloud Files""" - rebuild() - with lcd(DEPLOY_PATH): - local('swift -v -A https://auth.api.rackspacecloud.com/v1.0 ' - '-U {cloudfiles_username} ' - '-K {cloudfiles_api_key} ' - 'upload -c {cloudfiles_container} .'.format(**env)) - -def gh_pages(): - """Publish to GitHub Pages""" - rebuild() - local("ghp-import -b {github_pages_branch} {deploy_path}".format(**env)) - local("git push origin {github_pages_branch}".format(**env)) \ No newline at end of file diff --git a/tests/content/article_with_cover_image.rst b/tests/content/article_with_cover_image.rst deleted file mode 100644 index 9a07b89..0000000 --- a/tests/content/article_with_cover_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: With Cover Images -:date: 2018-04-29 00:45 -:author: arul -:category: foo -:tags: footag -:slug: with-cover-images -:cover: /assets/images/article_cover.jpg diff --git a/tests/content/article_with_http_cover_image.rst b/tests/content/article_with_http_cover_image.rst deleted file mode 100644 index 2dcd3d9..0000000 --- a/tests/content/article_with_http_cover_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: With Cover Images -:date: 2018-04-29 00:45 -:author: arul -:category: foo -:tags: footag -:slug: with-http-cover-images -:cover: http://example.com/cover.jpg diff --git a/tests/content/article_with_og_image.rst b/tests/content/article_with_og_image.rst deleted file mode 100644 index 56e8d0f..0000000 --- a/tests/content/article_with_og_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: With OG Cover Images -:date: 2018-04-29 00:59 -:author: raj -:category: bar -:tags: bartag -:slug: with-og-cover-images -:og_image: /assets/images/og_cover.jpg \ No newline at end of file diff --git a/tests/content/article_without_cover.rst b/tests/content/article_without_cover.rst deleted file mode 100644 index 4e5c002..0000000 --- a/tests/content/article_without_cover.rst +++ /dev/null @@ -1,6 +0,0 @@ -:title: Without Cover Images -:date: 2018-04-29 00:55 -:author: arul -:category: foo -:tags: footag -:slug: without-cover-images diff --git a/tests/content/assets/css/myblog.css b/tests/content/assets/css/myblog.css deleted file mode 100644 index e69de29..0000000 diff --git a/tests/content/assets/favicon.ico b/tests/content/assets/favicon.ico deleted file mode 100644 index e69de29..0000000 diff --git a/tests/content/assets/images/article_cover.jpg b/tests/content/assets/images/article_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/article_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/arul_author_cover.jpg b/tests/content/assets/images/arul_author_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/arul_author_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/avatar.png b/tests/content/assets/images/avatar.png deleted file mode 100644 index bb2db0c1a9a8bbb33255d36c9f6fb8cdc4419f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3684 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 MEG`LWYpb9C*{l}C`v3p{ diff --git a/tests/content/assets/images/foo_category_cover.jpg b/tests/content/assets/images/foo_category_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/foo_category_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/foo_tag_cover.jpg b/tests/content/assets/images/foo_tag_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/foo_tag_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/header_cover.jpg b/tests/content/assets/images/header_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/header_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/og_cover.jpg b/tests/content/assets/images/og_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/og_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/page_cover.jpg b/tests/content/assets/images/page_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/page_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/images/raj_author_cover.jpg b/tests/content/assets/images/raj_author_cover.jpg deleted file mode 120000 index 22ce499..0000000 --- a/tests/content/assets/images/raj_author_cover.jpg +++ /dev/null @@ -1 +0,0 @@ -cover.jpg \ No newline at end of file diff --git a/tests/content/assets/robots.txt b/tests/content/assets/robots.txt deleted file mode 100644 index e69de29..0000000 diff --git a/tests/content/pages/page_with_cover_image.rst b/tests/content/pages/page_with_cover_image.rst deleted file mode 100644 index 5e24538..0000000 --- a/tests/content/pages/page_with_cover_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: Page With Cover Images -:date: 2018-04-29 00:45 -:author: arul -:category: foo -:tags: footag -:slug: page-with-cover-images -:cover: assets/images/page_cover.jpg diff --git a/tests/content/pages/page_with_http_cover_image.rst b/tests/content/pages/page_with_http_cover_image.rst deleted file mode 100644 index 7512243..0000000 --- a/tests/content/pages/page_with_http_cover_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: Page With Cover Images -:date: 2018-04-29 00:45 -:author: arul -:category: foo -:tags: footag -:slug: page-with-http-cover-images -:cover: http://example.com/page-cover.jpg diff --git a/tests/content/pages/page_with_og_image.rst b/tests/content/pages/page_with_og_image.rst deleted file mode 100644 index 3f06ff2..0000000 --- a/tests/content/pages/page_with_og_image.rst +++ /dev/null @@ -1,7 +0,0 @@ -:title: Page With OG Cover Images -:date: 2018-04-29 00:59 -:author: raj -:category: bar -:tags: bartag -:slug: page-with-og-cover-images -:og_image: assets/images/og_cover.jpg \ No newline at end of file diff --git a/tests/content/pages/page_without_cover_image.rst b/tests/content/pages/page_without_cover_image.rst deleted file mode 100644 index 296d172..0000000 --- a/tests/content/pages/page_without_cover_image.rst +++ /dev/null @@ -1,6 +0,0 @@ -:title: Page Without Cover Images -:date: 2018-04-29 00:55 -:author: arul -:category: foo -:tags: footag -:slug: page-without-cover-images diff --git a/tests/default_conf.py b/tests/default_conf.py deleted file mode 100644 index 0ea4d20..0000000 --- a/tests/default_conf.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- # -from __future__ import unicode_literals - -AUTHOR = u'Zutrinken' -SITENAME = u'Attila Demo' -SITESUBTITLE = u'Blog description here.' -SITEURL = '' - -PATH = 'content' - -DEFAULT_DATE = 'fs' - -DEFAULT_DATE_FORMAT = '%d %b %Y' - -TIMEZONE = 'Asia/Calcutta' - -DEFAULT_LANG = u'en' - -# Feed generation is usually not desired when developing -FEED_ALL_ATOM = None -CATEGORY_FEED_ATOM = None -TRANSLATION_FEED_ATOM = None -AUTHOR_FEED_ATOM = None -AUTHOR_FEED_RSS = None - -# Blogroll -LINKS = (('Pelican', 'http://getpelican.com/'), - ('Python.org', 'http://python.org/'), - ('Jinja2', 'http://jinja.pocoo.org/'), - ('You can modify those links in your config file', '#'),) - -# Social widget -SOCIAL = (('Facebook', 'http://facebook.com/arulraj.net'), - ('Twitter', 'http://twitter.com/arulrajnet') - ) - -# Pagination -DEFAULT_PAGINATION = 3 -PAGINATION_PATTERNS = ( - (1, '{base_name}/', '{base_name}/index.html'), - (2, '{base_name}/page/{number}/', '{base_name}/page/{number}/index.html'), -) - -# Uncomment following line if you want document-relative URLs when developing -#RELATIVE_URLS = True - -STATIC_PATHS = ['assets'] - -EXTRA_PATH_METADATA = { - 'assets/robots.txt': {'path': 'robots.txt'}, - 'assets/favicon.ico': {'path': 'favicon.ico'}, - 'assets/CNAME': {'path': 'CNAME'} -} - -# Post and Pages path -ARTICLE_URL = '{date:%Y}/{date:%m}/{slug}.html' -ARTICLE_SAVE_AS = '{date:%Y}/{date:%m}/{slug}.html' -PAGE_URL = 'pages/{slug}/' -PAGE_SAVE_AS = 'pages/{slug}/index.html' -YEAR_ARCHIVE_SAVE_AS = '{date:%Y}/index.html' -MONTH_ARCHIVE_SAVE_AS = '{date:%Y}/{date:%m}/index.html' - -# Tags and Category path -CATEGORY_URL = 'category/{slug}' -CATEGORY_SAVE_AS = 'category/{slug}/index.html' -CATEGORIES_SAVE_AS = 'catgegories.html' -TAG_URL = 'tag/{slug}' -TAG_SAVE_AS = 'tag/{slug}/index.html' -TAGS_SAVE_AS = 'tags.html' - -# Author -AUTHOR_URL = 'author/{slug}' -AUTHOR_SAVE_AS = 'author/{slug}/index.html' -AUTHORS_SAVE_AS = 'authors.html' - -### Plugins - -# PLUGIN_PATHS = [ -# 'pelican-plugins' -# ] - -# PLUGINS = [ -# 'sitemap', -# 'neighbors', -# 'assets' -# ] - -# Sitemap -SITEMAP = { - 'format': 'xml', - 'priorities': { - 'articles': 0.5, - 'indexes': 0.5, - 'pages': 0.5 - }, - 'changefreqs': { - 'articles': 'monthly', - 'indexes': 'daily', - 'pages': 'monthly' - } -} - -# Comments -DISQUS_SITENAME = "attilademo" - -# Analytics -GOOGLE_ANALYTICS = "UA-3546274-12" - -THEME = 'attila' - -### Theme specific settings - -COLOR_SCHEME_CSS = 'github.css' - -CSS_OVERRIDE = ['assets/css/myblog.css'] - -# Jinja config - Pelican 4 -JINJA_ENVIRONMENT = { - 'extensions' :[ - 'jinja2.ext.loopcontrols', - 'jinja2.ext.i18n', - 'jinja2.ext.with_', - 'jinja2.ext.do' - ] -} - -JINJA_FILTERS = {'max': max} - -# AUTHORS_BIO = { -# "arul": { -# "name": "Arul", -# "cover": "assets/images/avatar.png", -# "image": "assets/images/arul_author_cover.jpg", -# "website": "http://blog.arulraj.net", -# "location": "Chennai", -# "bio": "This is the place for a small biography with max 200 characters. Well, now 100 are left. Cool, hugh?" -# } -# } diff --git a/tests/requirements.txt b/tests/requirements.txt deleted file mode 100644 index 9e4c123..0000000 --- a/tests/requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pelican -BeautifulSoup4 -pytest diff --git a/tests/support.py b/tests/support.py deleted file mode 100644 index 610af54..0000000 --- a/tests/support.py +++ /dev/null @@ -1,334 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import print_function, unicode_literals - -import locale -import logging -import os -import re -import subprocess -import sys -import unittest -from contextlib import contextmanager -from functools import wraps -from logging.handlers import BufferingHandler -from os.path import abspath, dirname, join -from shutil import rmtree -from tempfile import mkdtemp - -from six import StringIO - -from pelican.contents import Article -from pelican.settings import (DEFAULT_CONFIG, read_settings) - -__all__ = ['get_article', 'unittest', ] - - -@contextmanager -def temporary_folder(): - """creates a temporary folder, return it and delete it afterwards. - - This allows to do something like this in tests: - - >>> with temporary_folder() as d: - # do whatever you want - """ - tempdir = mkdtemp() - try: - yield tempdir - finally: - rmtree(tempdir) - - -def isplit(s, sep=None): - """Behaves like str.split but returns a generator instead of a list. - - >>> list(isplit('\tUse the force\n')) == '\tUse the force\n'.split() - True - >>> list(isplit('\tUse the force\n')) == ['Use', 'the', 'force'] - True - >>> (list(isplit('\tUse the force\n', "e")) - == '\tUse the force\n'.split("e")) - True - >>> list(isplit('Use the force', "e")) == 'Use the force'.split("e") - True - >>> list(isplit('Use the force', "e")) == ['Us', ' th', ' forc', ''] - True - - """ - sep, hardsep = r'\s+' if sep is None else re.escape(sep), sep is not None - exp, pos, length = re.compile(sep), 0, len(s) - while True: - m = exp.search(s, pos) - if not m: - if pos < length or hardsep: - # ^ mimic "split()": ''.split() returns [] - yield s[pos:] - break - start = m.start() - if pos < start or hardsep: - # ^ mimic "split()": includes trailing empty string - yield s[pos:start] - pos = m.end() - - -def mute(returns_output=False): - """Decorate a function that prints to stdout, intercepting the output. - If "returns_output" is True, the function will return a generator - yielding the printed lines instead of the return values. - - The decorator literally hijack sys.stdout during each function - execution, so be careful with what you apply it to. - - >>> def numbers(): - print "42" - print "1984" - ... - >>> numbers() - 42 - 1984 - >>> mute()(numbers)() - >>> list(mute(True)(numbers)()) - ['42', '1984'] - - """ - - def decorator(func): - - @wraps(func) - def wrapper(*args, **kwargs): - - saved_stdout = sys.stdout - sys.stdout = StringIO() - - try: - out = func(*args, **kwargs) - if returns_output: - out = isplit(sys.stdout.getvalue().strip()) - finally: - sys.stdout = saved_stdout - - return out - - return wrapper - - return decorator - - -def get_article(title, slug, content, lang, extra_metadata=None): - metadata = {'slug': slug, 'title': title, 'lang': lang} - if extra_metadata is not None: - metadata.update(extra_metadata) - return Article(content, metadata=metadata) - - -def skipIfNoExecutable(executable): - """Skip test if `executable` is not found - - Tries to run `executable` with subprocess to make sure it's in the path, - and skips the tests if not found (if subprocess raises a `OSError`). - """ - - with open(os.devnull, 'w') as fnull: - try: - res = subprocess.call(executable, stdout=fnull, stderr=fnull) - except OSError: - res = None - - if res is None: - return unittest.skip('{0} executable not found'.format(executable)) - - return lambda func: func - - -def module_exists(module_name): - """Test if a module is importable.""" - - try: - __import__(module_name) - except ImportError: - return False - else: - return True - - -def locale_available(locale_): - old_locale = locale.setlocale(locale.LC_TIME) - - try: - locale.setlocale(locale.LC_TIME, str(locale_)) - except locale.Error: - return False - else: - locale.setlocale(locale.LC_TIME, old_locale) - return True - - -def get_settings(**kwargs): - """Provide tweaked setting dictionaries for testing - - Set keyword arguments to override specific settings. - """ - settings = DEFAULT_CONFIG.copy() - for key, value in kwargs.items(): - settings[key] = value - return settings - -def get_my_settings(**kwargs): - PATH = abspath(dirname(__file__)) - default_conf = join(PATH, 'default_conf.py') - settings = read_settings(default_conf) - for key, value in kwargs.items(): - settings[key] = value - return settings - - -class LogCountHandler(BufferingHandler): - """Capturing and counting logged messages.""" - - def __init__(self, capacity=1000): - logging.handlers.BufferingHandler.__init__(self, capacity) - - def count_logs(self, msg=None, level=None): - return len([ - l - for l - in self.buffer - if (msg is None or re.match(msg, l.getMessage())) and - (level is None or l.levelno == level) - ]) - - -class LoggedTestCase(unittest.TestCase): - """A test case that captures log messages.""" - - def setUp(self): - super(LoggedTestCase, self).setUp() - self._logcount_handler = LogCountHandler() - logging.getLogger().addHandler(self._logcount_handler) - - def tearDown(self): - logging.getLogger().removeHandler(self._logcount_handler) - super(LoggedTestCase, self).tearDown() - - def assertLogCountEqual(self, count=None, msg=None, **kwargs): - actual = self._logcount_handler.count_logs(msg=msg, **kwargs) - self.assertEqual( - actual, count, - msg='expected {} occurrences of {!r}, but found {}'.format( - count, msg, actual)) - -from bs4 import BeautifulSoup -from pelican.generators import (ArticlesGenerator, Generator, PagesGenerator, - PelicanTemplateNotFound, StaticGenerator, - TemplatePagesGenerator) -from pelican.readers import RstReader -from pelican.writers import Writer -from pelican.contents import (Article, Page) - -CUR_DIR = os.path.dirname(__file__) -CONTENT_DIR = os.path.join(CUR_DIR, 'content') -OUTPUT_DIR = os.path.join(CUR_DIR, 'output') - -class BaseTest(object): - - def __init__(self): - self.initSettings() - - def initSettings(self): - self.old_locale = locale.setlocale(locale.LC_ALL) - locale.setlocale(locale.LC_ALL, str('C')) - self.settings = get_my_settings() - self.settings['THEME'] = "../" - self.settings['filenames'] = {} - self.reader = RstReader(self.settings) - self.writer = Writer("output", self.settings) - - def gen_article_and_html_from_rst(self, rstPath): - content, metadata = self.reader.read(rstPath) - article = Article(content=content, metadata=metadata) - context = self.settings.copy() - context['generated_content'] = {} - context['static_links'] = set() - context['static_content'] = {} - context['localsiteurl'] = self.settings['SITEURL'] - generator = ArticlesGenerator( context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) - generator.generate_context() - f = lambda a: True if (a.slug == article.slug) else False - result = list(filter(f, generator.context["articles"]))[0] - self.writer.write_file( - result.save_as, generator.get_template('article'), - generator.context, article=result) - soup = BeautifulSoup(open("./"+self.writer.output_path+'/'+result.save_as), "html.parser") - return (result, soup) - - def gen_page_and_html_from_rst(self, rstPath): - content, metadata = self.reader.read(rstPath) - page = Page(content=content, metadata=metadata) - context = self.settings.copy() - context['generated_content'] = {} - context['static_links'] = set() - context['static_content'] = {} - context['localsiteurl'] = self.settings['SITEURL'] - generator = PagesGenerator( context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) - generator.generate_context() - f = lambda a: True if (a.slug == page.slug) else False - result = list(filter(f, generator.context["pages"]))[0] - self.writer.write_file( - result.save_as, generator.get_template('page'), - generator.context, page=result) - soup = BeautifulSoup(open("./"+self.writer.output_path+'/'+result.save_as), "html.parser") - return (result, soup) - - def gen_tag_and_html_from_name(self, name): - context = self.settings.copy() - context['generated_content'] = {} - context['static_links'] = set() - context['static_content'] = {} - context['localsiteurl'] = self.settings['SITEURL'] - generator = ArticlesGenerator( context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) - generator.generate_context() - generator.generate_tags(self.writer.write_file) - selectedTag = None - - for tag, articles in generator.tags.items(): - if tag.name == name: - selectedTag = tag - - soup = BeautifulSoup(open("./"+self.writer.output_path+'/'+selectedTag.save_as), "html.parser") - return (selectedTag, soup) - - def gen_category_and_html_from_name(self, name): - context = self.settings.copy() - context['generated_content'] = {} - context['static_links'] = set() - context['static_content'] = {} - context['localsiteurl'] = self.settings['SITEURL'] - generator = ArticlesGenerator( context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) - generator.generate_context() - generator.generate_categories(self.writer.write_file) - selectedCategory = None - - for category, articles in generator.categories: - if category.name == name: - selectedCategory = category - - soup = BeautifulSoup(open("./"+self.writer.output_path+'/'+selectedCategory.save_as), "html.parser") - return (selectedCategory, soup) - - def gen_author_and_html_from_name(self, name): - context = self.settings.copy() - context['generated_content'] = {} - context['static_links'] = set() - context['static_content'] = {} - context['localsiteurl'] = self.settings['SITEURL'] - generator = ArticlesGenerator( context=context, settings=self.settings, path=CONTENT_DIR, theme=self.settings['THEME'], output_path=OUTPUT_DIR) - generator.generate_context() - generator.generate_authors(self.writer.write_file) - selectedAuthor = None - - for author, articles in generator.authors: - if author.name == name: - selectedAuthor = author - - soup = BeautifulSoup(open("./"+self.writer.output_path+'/'+selectedAuthor.save_as), "html.parser") - return (selectedAuthor, soup) \ No newline at end of file diff --git a/tests/test_author_bio.py b/tests/test_author_bio.py deleted file mode 100644 index 02c3735..0000000 --- a/tests/test_author_bio.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import locale -from shutil import copy, rmtree - -from support import (get_my_settings, unittest, BaseTest, CUR_DIR, CONTENT_DIR, OUTPUT_DIR) - -def tearDownModule(): - print("teardown module") - try: - rmtree(OUTPUT_DIR) - except OSError as e: - print ("Error: %s - %s." % (e.filename,e.strerror)) - -class AuthorSocialLinksTest(unittest.TestCase, BaseTest): - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_linkedin_link(self): - authorName = "raj" - self.settings['AUTHORS_BIO'] = { - authorName: { - 'cover': "http://examble.com/cover.jpg", - 'linkedin': "mylinkedinname" - } - } - rstPath="content/article_with_og_image.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="span", attrs={"class": "post-author-linkedin"}) - # Assertion - self.assertTrue("https://www.linkedin.com/in/mylinkedinname" in str(selected)) - - result, soup = self.gen_author_and_html_from_name(authorName) - selected = soup.find(name="span", attrs={"class": "post-author-linkedin"}) - # Assertion - self.assertTrue("https://www.linkedin.com/in/mylinkedinname" in str(selected)) - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/tests/test_coverimages.py b/tests/test_coverimages.py deleted file mode 100644 index 7c0405c..0000000 --- a/tests/test_coverimages.py +++ /dev/null @@ -1,471 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals - -import locale -from shutil import copy, rmtree - -from support import (get_my_settings, unittest, BaseTest, CUR_DIR, CONTENT_DIR, OUTPUT_DIR) - -def setUpModule(): - print("setup module") - -def tearDownModule(): - print("teardown module") - try: - rmtree(OUTPUT_DIR) - except OSError as e: - print ("Error: %s - %s." % (e.filename,e.strerror)) - -class ArticleCoverImageTest(unittest.TestCase, BaseTest): - - @classmethod - def setUpClass(cls): - print("setUpClass") - - @classmethod - def tearDownClass(cls): - print("tearDownClass") - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_article_cover(self): - self.settings['SITEURL']="http://www.example.com" - rstPath="content/article_with_cover_image.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+result.cover in selected["style"]) - - def test_article_header_cover(self): - self.settings['HEADER_COVER']='/assets/images/header_cover.jpg' - rstPath="content/article_without_cover.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVER'] in selected["style"]) - - def test_article_header_http_cover(self): - self.settings['HEADER_COVER']='http://example.com/cover.jpg' - rstPath="content/article_without_cover.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVER'] in selected["style"]) - - def test_article_theme_cover(self): - rstPath="content/article_without_cover.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(id="post-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_article_header_color(self): - self.settings['HEADER_COLOR']='blue' - rstPath="content/article_without_cover.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COLOR'] in selected["style"]) - - def test_article_http_cover(self): - rstPath="content/article_with_http_cover_image.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(result.cover in selected["style"]) - - def test_article_og_cover(self): - rstPath="content/article_with_og_image.rst" - result, soup = self.gen_article_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(result.og_image in selected["style"]) - -class PageCoverImageTest(unittest.TestCase, BaseTest): - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_page_cover(self): - self.settings['SITEURL']="http://www.example.com" - rstPath="content/pages/page_with_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+result.cover in selected["style"]) - - def test_page_header_cover(self): - self.settings['HEADER_COVER']='/assets/images/header_cover.jpg' - rstPath="content/pages/page_without_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVER'] in selected["style"]) - - def test_page_header_http_cover(self): - self.settings['HEADER_COVER']='http://example.com/cover.jpg' - rstPath="content/pages/page_without_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVER'] in selected["style"]) - - def test_page_theme_cover(self): - rstPath="content/pages/page_without_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(id="post-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_page_header_color(self): - self.settings['HEADER_COLOR']='blue' - rstPath="content/pages/page_without_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COLOR'] in selected["style"]) - - def test_page_http_cover(self): - rstPath="content/pages/page_with_http_cover_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(result.cover in selected["style"]) - - def test_page_og_cover(self): - rstPath="content/pages/page_with_og_image.rst" - result, soup = self.gen_page_and_html_from_rst(rstPath) - selected = soup.find(name="div", attrs={"class": "post-cover cover"}) - # Assertion - self.assertTrue(result.og_image in selected["style"]) - -class TagCoverImageTest(unittest.TestCase, BaseTest): - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_footag_theme_cover(self): - result, soup = self.gen_tag_and_html_from_name("footag") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_footag_cover(self): - tagName = "footag" - self.settings['HEADER_COVERS_BY_TAG'] = { - tagName: "/assets/images/foo_tag_cover.jpg" - } - result, soup = self.gen_tag_and_html_from_name(tagName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVERS_BY_TAG'][tagName] in selected["style"]) - - def test_footag_http_cover(self): - tagName = "footag" - self.settings['HEADER_COVERS_BY_TAG'] = { - tagName: "http://examble.com/cover.jpg" - } - result, soup = self.gen_tag_and_html_from_name(tagName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVERS_BY_TAG'][tagName] in selected["style"]) - - def test_footag_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_tag_and_html_from_name("footag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_footag_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_tag_and_html_from_name("footag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_footag_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_tag_and_html_from_name("footag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - - def test_bartag_theme_cover(self): - result, soup = self.gen_tag_and_html_from_name("bartag") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_bartag_cover(self): - tagName = "bartag" - self.settings['HEADER_COVERS_BY_TAG'] = { - tagName: "/assets/images/bar_tag_cover.jpg" - } - result, soup = self.gen_tag_and_html_from_name(tagName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVERS_BY_TAG'][tagName] in selected["style"]) - - def test_bartag_http_cover(self): - tagName = "bartag" - self.settings['HEADER_COVERS_BY_TAG'] = { - tagName: "http://examble.com/cover.jpg" - } - result, soup = self.gen_tag_and_html_from_name(tagName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVERS_BY_TAG'][tagName] in selected["style"]) - - def test_bartag_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_tag_and_html_from_name("bartag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_bartag_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_tag_and_html_from_name("bartag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_bartag_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_tag_and_html_from_name("bartag") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - - -class CategoryCoverImageTest(unittest.TestCase, BaseTest): - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_foo_theme_cover(self): - result, soup = self.gen_category_and_html_from_name("foo") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_foo_cover(self): - categoryName = "foo" - self.settings['HEADER_COVERS_BY_CATEGORY'] = { - categoryName: "/assets/images/foo_category_cover.jpg" - } - result, soup = self.gen_category_and_html_from_name(categoryName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVERS_BY_CATEGORY'][categoryName] in selected["style"]) - - def test_foo_http_cover(self): - categoryName = "foo" - self.settings['HEADER_COVERS_BY_CATEGORY'] = { - categoryName: "http://examble.com/cover.jpg" - } - result, soup = self.gen_category_and_html_from_name(categoryName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVERS_BY_CATEGORY'][categoryName] in selected["style"]) - - def test_foo_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_category_and_html_from_name("foo") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_foo_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_category_and_html_from_name("foo") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_foo_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_category_and_html_from_name("foo") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - - def test_bar_theme_cover(self): - result, soup = self.gen_category_and_html_from_name("bar") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_bar_cover(self): - categoryName = "bar" - self.settings['HEADER_COVERS_BY_CATEGORY'] = { - categoryName: "/assets/images/bar_category_cover.jpg" - } - result, soup = self.gen_category_and_html_from_name(categoryName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['HEADER_COVERS_BY_CATEGORY'][categoryName] in selected["style"]) - - def test_bar_http_cover(self): - categoryName = "bar" - self.settings['HEADER_COVERS_BY_CATEGORY'] = { - categoryName: "http://examble.com/cover.jpg" - } - result, soup = self.gen_category_and_html_from_name(categoryName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['HEADER_COVERS_BY_CATEGORY'][categoryName] in selected["style"]) - - def test_bar_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_category_and_html_from_name("bar") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_bar_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_category_and_html_from_name("bar") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_bar_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_category_and_html_from_name("bar") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - -class AuthorCoverImageTest(unittest.TestCase, BaseTest): - - def setUp(self): - self.initSettings() - - def tearDown(self): - locale.setlocale(locale.LC_ALL, self.old_locale) - - def test_arul_theme_cover(self): - result, soup = self.gen_author_and_html_from_name("arul") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_arul_cover(self): - authorName = "arul" - self.settings['AUTHORS_BIO'] = { - authorName: { - 'cover': "/assets/images/arul_author_cover.jpg" - } - } - result, soup = self.gen_author_and_html_from_name(authorName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['AUTHORS_BIO'][authorName]['cover'] in selected["style"]) - - def test_arul_http_cover(self): - authorName = "arul" - self.settings['AUTHORS_BIO'] = { - authorName: { - 'cover': "http://examble.com/cover.jpg" - } - } - result, soup = self.gen_author_and_html_from_name(authorName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['AUTHORS_BIO'][authorName]['cover'] in selected["style"]) - - def test_arul_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_author_and_html_from_name("arul") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_arul_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_author_and_html_from_name("arul") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_arul_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_author_and_html_from_name("arul") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - - def test_raj_theme_cover(self): - result, soup = self.gen_author_and_html_from_name("raj") - selected = soup.find(id="blog-header") - # Assertion - self.assertTrue("class" not in selected) - - def test_raj_cover(self): - authorName = "raj" - self.settings['AUTHORS_BIO'] = { - authorName: { - 'cover': "/assets/images/raj_author_cover.jpg" - } - } - result, soup = self.gen_author_and_html_from_name(authorName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings['AUTHORS_BIO'][authorName]['cover'] in selected["style"]) - - def test_raj_http_cover(self): - authorName = "raj" - self.settings['AUTHORS_BIO'] = { - authorName: { - 'cover': "http://examble.com/cover.jpg" - } - } - result, soup = self.gen_author_and_html_from_name(authorName) - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['AUTHORS_BIO'][authorName]['cover'] in selected["style"]) - - def test_raj_header_cover(self): - self.settings['SITEURL'] = "http://example.com" - self.settings["HEADER_COVER"] = "/assets/images/header_cover.jpg" - result, soup = self.gen_author_and_html_from_name("raj") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings['SITEURL']+'/'+self.settings["HEADER_COVER"] in selected["style"]) - - def test_raj_header_http_cover(self): - self.settings["HEADER_COVER"] = "http://example.com/cover.jpg" - result, soup = self.gen_author_and_html_from_name("raj") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COVER"] in selected["style"]) - - def test_raj_header_color(self): - self.settings["HEADER_COLOR"] = "red" - result, soup = self.gen_author_and_html_from_name("raj") - selected = soup.find(name="div", attrs={"class": "blog-cover cover"}) - # Assertion - self.assertTrue(self.settings["HEADER_COLOR"] in selected["style"]) - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/tests/unittest.cfg b/tests/unittest.cfg deleted file mode 100644 index 9aa593f..0000000 --- a/tests/unittest.cfg +++ /dev/null @@ -1,3 +0,0 @@ -[debugger] -always-on = True -errors-only = False \ No newline at end of file