Source code for rattail.features.handlers
# -*- coding: utf-8; -*-
################################################################################
#
# Rattail -- Retail Software Framework
# Copyright © 2010-2021 Lance Edgar
#
# This file is part of Rattail.
#
# Rattail is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# Rattail. If not, see <http://www.gnu.org/licenses/>.
#
################################################################################
"""
Handler for Generating Features
"""
from __future__ import unicode_literals, absolute_import
import six
import colander
from rattail.app import GenericHandler
from rattail.util import load_entry_points
[docs]
class FeatureHandler(GenericHandler):
"""
Base class for feature handlers.
"""
entry_point_section = 'rattail.features'
[docs]
def all_features(self):
"""
Returns a dict of available features, which are registered via
setuptools entry points.
"""
return load_entry_points(self.entry_point_section)
[docs]
def all_feature_types(self):
"""
Returns a list of available feature type keys.
"""
return list(self.all_features())
[docs]
def iter_features(self):
"""
Iterate over all features.
"""
for factory in six.itervalues(self.all_features()):
yield factory(self.config)
[docs]
def get_feature(self, key):
"""
Returns the specific feature identified by type key.
"""
features = self.all_features()
if key in features:
return features[key](self.config)
def make_schema(self, **kwargs):
class Schema(colander.MappingSchema):
app_prefix = colander.SchemaNode(colander.String())
app_cap_prefix = colander.SchemaNode(colander.String())
return Schema(**kwargs)
def get_defaults(self):
return {
'app_prefix': self.config.app_title().lower(),
'app_cap_prefix': self.config.app_title(),
}
[docs]
def do_generate(self, feature, **kwargs):
"""
Generate code and instructions for new feature.
"""
return feature.generate(**kwargs)