Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions HISTORY.rst → CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,19 @@
History
=======

1.3.2 (unreleased)
2.0.0 (unreleased)
------------------

- No changes yet.
- Factory configuration and macro registration is no longer done automatically due to the dual-theme feature.
It must be configured in your code using `yafowil.bootstrap`.
In order to do so do `from yafowil.bootstrap import configure_factory`.
Next call it with the name of the desired theme `configure_factory('bootstrap3')`.
[jensens]

- Add support for Bootstrap 4 using theme `bootstrap4`.
The Bootstrap 3 theme is still available as `bootstrap3`.
Latter is provided a fallback as `bootstrap` too (will be removed in future versions).
[jensens, agitator]

1.3.1 (2017-11-13)
------------------
Expand Down
12 changes: 11 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
This is the **bootstrap styles integration** for for `YAFOWIL
This is the **bootstrap styles integration** for for `YAFOWIL
<http://pypi.python.org/pypi/yafowil>`_ - Yet Another Form Widget Library.

This package provides themes for `Bootstrap 3 <https://getbootstrap.com/docs/3.3/>`_ and `Bootstrap 4 <https://getbootstrap.com/>`_

In order to select one of the themes, `configure_factory` must be called with the desired theme name:

::

from yafowil.bootstrap import configure_factory

configure_factory('bootstrap4')


Detailed Documentation
======================
Expand Down
24 changes: 24 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[check-manifest]
ignore =
*.cfg
.coveragerc
.editorconfig
.gitattributes

[isort]
force_alphabetical_sort = True
force_grid_wrap=0
force_single_line = True
include_trailing_comma=True
line_length = 200
lines_after_imports = 2
multi_line_output=3
not_skip = __init__.py
use_parentheses=True

[flake8]
exclude = bootstrap.py,docs,*.egg.,omelette
max-complexity = 15

[zest.releaser]
create-wheel = yes
54 changes: 25 additions & 29 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,49 +1,45 @@
from setuptools import find_packages
from setuptools import setup

import os


version = '1.3.2.dev0'
shortdesc = 'Bootstrap Styles for YAFOWIL'
longdesc = open(os.path.join(os.path.dirname(__file__), 'README.rst')).read()
longdesc += open(os.path.join(os.path.dirname(__file__), 'HISTORY.rst')).read()
longdesc += open(os.path.join(os.path.dirname(__file__), 'LICENSE.rst')).read()
tests_require = ['yafowil[test]']
version = "2.0.0.dev0"
shortdesc = "Bootstrap Styles for YAFOWIL"
longdesc = open(os.path.join(os.path.dirname(__file__), "README.rst")).read()
longdesc += open(os.path.join(os.path.dirname(__file__), "CHANGES.rst")).read()
longdesc += open(os.path.join(os.path.dirname(__file__), "LICENSE.rst")).read()
tests_require = ["yafowil[test]"]


setup(
name='yafowil.bootstrap',
name="yafowil.bootstrap",
version=version,
description=shortdesc,
long_description=longdesc,
classifiers=[
'Environment :: Web Environment',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
'License :: OSI Approved :: BSD License',
"Environment :: Web Environment",
"Operating System :: OS Independent",
"Programming Language :: Python",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
"License :: OSI Approved :: BSD License",
],
keywords='',
author='BlueDynamics Alliance',
author_email='[email protected]',
url=u'https://github.com/bluedynamics/yafowil.bootstrap',
license='Simplified BSD',
packages=find_packages('src'),
package_dir = {'': 'src'},
namespace_packages=['yafowil'],
keywords="",
author="BlueDynamics Alliance",
author_email="[email protected]",
url=u"https://github.com/bluedynamics/yafowil.bootstrap",
license="Simplified BSD",
packages=find_packages("src"),
package_dir={"": "src"},
namespace_packages=["yafowil"],
include_package_data=True,
zip_safe=False,
install_requires=[
'setuptools',
'yafowil>1.99',
],
install_requires=["setuptools", "yafowil>2.2.99",],
tests_require=tests_require,
extras_require = dict(
test=tests_require,
),
extras_require=dict(test=tests_require,),
test_suite="yafowil.bootstrap.tests.test_suite",
entry_points="""
[yafowil.plugin]
register = yafowil.bootstrap:register
configure = yafowil.bootstrap:configure
""")
""",
)
2 changes: 1 addition & 1 deletion src/yafowil/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__import__('pkg_resources').declare_namespace(__name__)
__import__("pkg_resources").declare_namespace(__name__)
76 changes: 51 additions & 25 deletions src/yafowil/bootstrap/__init__.py
Original file line number Diff line number Diff line change
@@ -1,36 +1,62 @@
from . import bs3
from . import bs4
from yafowil.base import factory
from yafowil.bootstrap.common import configure_factory
from yafowil.bootstrap.common import register_macros
from yafowil.utils import entry_point

import os


resourcedir = os.path.join(os.path.dirname(__file__), 'resources')
js = [{
'group': 'bootstrap.dependencies',
'resource': 'js/bootstrap.js',
'order': 20,
}]
css = [{
'group': 'bootstrap.dependencies',
'resource': 'css/bootstrap.css',
'order': 10,
}, {
'group': 'bootstrap.dependencies',
'resource': 'css/bootstrap-theme.css',
'order': 11,
}]
resourcedir_bs3 = os.path.join(os.path.dirname(__file__), "resources/bs3")
resourcedir_bs4 = os.path.join(os.path.dirname(__file__), "resources/bs4")

js_bs3 = [
{"group": "bootstrap.dependencies", "resource": "js/bootstrap.js", "order": 20,}
]
css_bs3 = [
{"group": "bootstrap.dependencies", "resource": "css/bootstrap.css", "order": 10,},
{
"group": "bootstrap.dependencies",
"resource": "css/bootstrap-theme.css",
"order": 11,
},
]

js_bs4 = [
{"group": "bootstrap.dependencies", "resource": "js/bootstrap.js", "order": 20,}
]
css_bs4 = [
{"group": "bootstrap.dependencies", "resource": "css/bootstrap.css", "order": 10,}
]


@entry_point(order=20)
def register():
factory.register_theme('bootstrap', 'yafowil.bootstrap',
resourcedir, js=js, css=css)
# Bootstrap 3
factory.register_theme(
"bootstrap3", "yafowil.bootstrap", resourcedir_bs3, js=js_bs3, css=css_bs3
)
# BBB Bootstrap 3 - remove in next major release
factory.register_theme(
"bootstrap", "yafowil.bootstrap", resourcedir_bs3, js=js_bs3, css=css_bs3
)
# Bootstrap 4
factory.register_theme(
"bootstrap4", "yafowil.bootstrap", resourcedir_bs4, js=js_bs4, css=css_bs4
)


@entry_point(order=20)
def configure():
# only configure factory if not suppressed explicit
if not os.environ.get('TESTRUN_MARKER'):
configure_factory()
register_macros()
def configure_factory(theme):
"""Configure the Yafowil factory with theme specific macros and defaults.
"""
if theme == "bootstrap3":
baseline = bs3
elif theme == "bootstrap4":
baseline = bs4
else:
raise ValueError("'theme' parameter must be one of: bootstrap3, bootstrap4")
if os.environ.get("TESTRUN_MARKER"):
# skip for testing
# only configure factory if not suppressed explicit
return
baseline.configure_factory()
baseline.register_macros()
99 changes: 99 additions & 0 deletions src/yafowil/bootstrap/bs3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
from yafowil.base import factory


def bs_field_class(widget, data):
if data.errors:
return "form-group has-error"
return "form-group"


def configure_factory():
# set theme
factory.theme = "bootstrap"

# common defaults
factory.defaults["text.class"] = "text form-control"

factory.defaults["textarea.class"] = "textarea form-control"

factory.defaults["lines.class"] = "lines form-control"

factory.defaults["password.class"] = "password form-control"

factory.defaults["select.class"] = "select"
factory.defaults["select.block_class"] = "form-control"
factory.defaults["select.radio_wrapper_class"] = "radio"
factory.defaults["select.checkbox_wrapper_class"] = "checkbox"

factory.defaults["submit.class"] = "btn btn-default"

factory.defaults["email.class"] = "email form-control"

factory.defaults["url.class"] = "url form-control"

factory.defaults["search.class"] = "search form-control"

factory.defaults["number.class"] = "number form-control"

factory.defaults["label.class"] = "control-label"

factory.defaults["field.class"] = bs_field_class

factory.defaults["error.position"] = "after"
factory.defaults["error.tag"] = "span"
factory.defaults["error.class"] = "help-block"
factory.defaults["error.message_class"] = "text-danger"

factory.defaults["help.position"] = "after"
factory.defaults["help.tag"] = "p"
factory.defaults["help.class"] = "help-block"

# yafowil.widget.array
factory.defaults["array.table_class"] = "table table-condensed"

# yafowil.widget.autocomplete
factory.defaults["autocomplete.class"] = "autocomplete form-control"

# yafowil.widget.chosen
factory.defaults["chosen.class"] = "chosen form-control"

# yafowil.widget.datetime
factory.defaults["datetime.datepicker_class"] = "datepicker form-control"
factory.defaults["datetime.timepicker_class"] = "timepicker form-control"
factory.defaults["time.timepicker_class"] = "timepicker form-control"

# yafowil.widget.dict
factory.defaults["dict.table_class"] = "dictwidget table table-condensed"
factory.defaults["dict.key_class"] = "form-control"
factory.defaults["dict.value_class"] = "form-control"

# yafowil.widget.wysihtml5
factory.defaults["wysihtml5.class"] = "wysihtml5 form-control"


def register_macros():
# common
factory.register_macro("form", "form", {"form.class": "form-horizontal",})
factory.register_macro(
"field",
"field:label:div:help:error",
{"label.class_add": "col-sm-2", "div.class_add": "col-sm-10",},
)
factory.register_macro(
"button", "submit", {"submit.class": "btn", "submit.class_add": "btn-default",}
)

# yafowil.widget.array
factory.register_macro(
"array",
"field:label:help:error:array",
{
"array.label": " ",
"field.class": bs_field_class,
"label.class_add": "col-sm-2",
"array.class_add": "col-sm-10",
"help.class_add": "col-sm-offset-2 col-sm-10",
"error.class_add": "col-sm-offset-2 col-sm-10",
},
)
factory.register_macro("arrayfield", "field:label:help:error", {})
Loading