Improve project generator for CORE "poser"
optionally adds support for rattail/posterior PHP lib
This commit is contained in:
parent
d8f953b11a
commit
8d4f3f8d9b
|
@ -5,6 +5,8 @@ CORE-POS "Poser" project generator
|
|||
|
||||
import os
|
||||
|
||||
import colander
|
||||
|
||||
from rattail.projects import ProjectGenerator
|
||||
|
||||
|
||||
|
@ -14,30 +16,85 @@ class COREPOSPoserProjectGenerator(ProjectGenerator):
|
|||
"""
|
||||
key = 'corepos_poser'
|
||||
|
||||
def make_schema(self, **kwargs):
|
||||
schema = super(COREPOSPoserProjectGenerator, self).make_schema(**kwargs)
|
||||
|
||||
schema.add(colander.SchemaNode(name='organization',
|
||||
typ=colander.String()))
|
||||
|
||||
schema.add(colander.SchemaNode(name='org_slug',
|
||||
typ=colander.String()))
|
||||
|
||||
schema.add(colander.SchemaNode(name='has_office_plugins',
|
||||
typ=colander.Boolean()))
|
||||
|
||||
schema.add(colander.SchemaNode(name='has_lane_plugins',
|
||||
typ=colander.Boolean()))
|
||||
|
||||
schema.add(colander.SchemaNode(name='use_posterior',
|
||||
typ=colander.Boolean()))
|
||||
|
||||
return schema
|
||||
|
||||
def normalize_context(self, context):
|
||||
context = super(COREPOSPoserProjectGenerator, self).normalize_context(context)
|
||||
|
||||
# org_studly_prefix
|
||||
context['org_studly_prefix'] = context['org_slug'].capitalize()
|
||||
|
||||
# requires
|
||||
requires = [('wikimedia/composer-merge-plugin', '^2.1')]
|
||||
if context['use_posterior']:
|
||||
requires.append(('rattail/posterior', '^0.1.1'))
|
||||
context['requires'] = requires
|
||||
|
||||
return context
|
||||
|
||||
def generate_project(self, output, context, **kwargs):
|
||||
|
||||
##############################
|
||||
# project root
|
||||
##############################
|
||||
|
||||
self.generate('gitignore',
|
||||
os.path.join(output, '.gitignore'))
|
||||
|
||||
self.generate('composer.json.mako',
|
||||
os.path.join(output, 'composer.json'),
|
||||
context)
|
||||
|
||||
##############################
|
||||
# office plugins
|
||||
##############################
|
||||
|
||||
office_plugins = os.path.join(output, 'office_plugins')
|
||||
os.makedirs(office_plugins)
|
||||
if context['has_office_plugins']:
|
||||
|
||||
demo_plugin = os.path.join(office_plugins, 'PoserDemo')
|
||||
os.makedirs(demo_plugin)
|
||||
office_plugins = os.path.join(output, 'office_plugins')
|
||||
os.makedirs(office_plugins)
|
||||
|
||||
self.generate('office_plugins/PoserDemo/PoserDemo.php',
|
||||
os.path.join(demo_plugin, 'PoserDemo.php'))
|
||||
plugin_name = f"{context['org_studly_prefix']}Demo"
|
||||
demo_plugin = os.path.join(office_plugins, plugin_name)
|
||||
os.makedirs(demo_plugin)
|
||||
|
||||
self.generate('office_plugins/PoserDemo/PoserDemo.php.mako',
|
||||
os.path.join(demo_plugin, f"{plugin_name}.php"),
|
||||
context)
|
||||
|
||||
self.generate('office_plugins/PoserDemo/PoserDemoTask.php.mako',
|
||||
os.path.join(demo_plugin, f"{plugin_name}Task.php"),
|
||||
context)
|
||||
|
||||
##############################
|
||||
# lane plugins
|
||||
##############################
|
||||
|
||||
lane_plugins = os.path.join(output, 'lane_plugins')
|
||||
os.makedirs(lane_plugins)
|
||||
if context['has_lane_plugins']:
|
||||
|
||||
demo_plugin = os.path.join(lane_plugins, 'PoserDemo')
|
||||
os.makedirs(demo_plugin)
|
||||
lane_plugins = os.path.join(output, 'lane_plugins')
|
||||
os.makedirs(lane_plugins)
|
||||
|
||||
self.generate('lane_plugins/PoserDemo/PoserDemo.php',
|
||||
os.path.join(demo_plugin, 'PoserDemo.php'))
|
||||
demo_plugin = os.path.join(lane_plugins, 'PoserDemo')
|
||||
os.makedirs(demo_plugin)
|
||||
|
||||
self.generate('lane_plugins/PoserDemo/PoserDemo.php',
|
||||
os.path.join(demo_plugin, 'PoserDemo.php'))
|
||||
|
|
29
corporal/projects/corepos_poser/composer.json.mako
Normal file
29
corporal/projects/corepos_poser/composer.json.mako
Normal file
|
@ -0,0 +1,29 @@
|
|||
## -*- coding: utf-8; mode: js; -*-
|
||||
{
|
||||
"name": "${org_slug}/poser",
|
||||
"description": "CORE-POS customizations for ${organization}",
|
||||
"require": {
|
||||
<% count = len(requires) %>
|
||||
% for i, pkg in enumerate(requires, 1):
|
||||
<% package, version = pkg %>
|
||||
"${package}": "${version}"${'' if i == count else ','}
|
||||
% endfor
|
||||
},
|
||||
"extra": {
|
||||
"merge-plugin": {
|
||||
"require": [
|
||||
"../IS4C/composer.json"
|
||||
]
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"component-dir": "../IS4C/fannie/src/javascript/composer-components",
|
||||
"vendor-dir": "../IS4C/vendor",
|
||||
"allow-plugins": {
|
||||
"composer/installers": true,
|
||||
"oomphinc/composer-installers-extender": true,
|
||||
"corepos/composer-installer": true,
|
||||
"wikimedia/composer-merge-plugin": true
|
||||
}
|
||||
}
|
||||
}
|
2
corporal/projects/corepos_poser/gitignore
Normal file
2
corporal/projects/corepos_poser/gitignore
Normal file
|
@ -0,0 +1,2 @@
|
|||
office_plugins/GitStatus
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
<?php
|
||||
/*******************************************************************************
|
||||
|
||||
Copyright 2014 Whole Foods Co-op
|
||||
|
||||
This file is part of IT CORE.
|
||||
|
||||
IT CORE 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
IT CORE 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
|
||||
in the file license.txt along with IT CORE; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
*********************************************************************************/
|
||||
|
||||
/**
|
||||
*/
|
||||
class PoserDemo extends COREPOS\Fannie\API\FanniePlugin
|
||||
{
|
||||
public $plugin_description = 'Plugin to demo Poser customization';
|
||||
public $plugin_settings = array(
|
||||
'Foo' => array('default'=>'Bar', 'label'=>'Foo',
|
||||
'description'=>'Some important foo-related setting'),
|
||||
);
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
## -*- coding: utf-8; mode: php; -*-
|
||||
<?php
|
||||
|
||||
class ${org_studly_prefix}Demo extends COREPOS\Fannie\API\FanniePlugin
|
||||
{
|
||||
public $plugin_description = "Demo plugin for ${organization}";
|
||||
|
||||
public $plugin_settings = [
|
||||
|
||||
% if use_posterior:
|
||||
|
||||
'${org_studly_prefix}DemoTailboneAPIURL' => [
|
||||
'label' => 'Tailbone API URL',
|
||||
'description' => 'Base URL for Tailbone API (usually ends with /api)',
|
||||
],
|
||||
|
||||
'${org_studly_prefix}DemoTailboneAPIToken' => [
|
||||
'label' => 'Tailbone API Token',
|
||||
'description' => 'User auth token for use with Tailbone API',
|
||||
],
|
||||
|
||||
'${org_studly_prefix}DemoTailboneAPIVerifySSL' => [
|
||||
'label' => 'Verify SSL',
|
||||
'description' => 'Validate SSL cert used by Tailbone API?',
|
||||
'options' => [
|
||||
"Yes, validate the SSL cert" => 'true',
|
||||
"No, do not validate the SSL cert (SHOULD ONLY BE USED FOR TESTING!)" => 'false',
|
||||
],
|
||||
'default'=>'true',
|
||||
],
|
||||
|
||||
% else:
|
||||
|
||||
'${org_studly_prefix}Foo' => [
|
||||
'label' => 'Foo',
|
||||
'description'=>'Some important foo setting',
|
||||
'default' => 'bar',
|
||||
],
|
||||
|
||||
% endif
|
||||
|
||||
];
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
## -*- coding: utf-8; mode: php; -*-
|
||||
<?php
|
||||
|
||||
class ${org_studly_prefix}DemoTask extends FannieTask
|
||||
{
|
||||
public $name = "${organization} Demo";
|
||||
|
||||
public $description = 'Demo command that tries to connect to
|
||||
Tailbone API, and reports success/failure.
|
||||
|
||||
NOTE: This task is provided by the ${org_studly_prefix}Demo plugin;
|
||||
please see that for settings to control behavior.';
|
||||
|
||||
public $default_schedule = array(
|
||||
'min' => 0,
|
||||
'hour' => 5,
|
||||
'day' => '*',
|
||||
'month' => '*',
|
||||
'weekday' => '*',
|
||||
);
|
||||
|
||||
public function run()
|
||||
{
|
||||
$this->cronMsg("hello from ${org_studly_prefix}Demo!", FannieLogger::INFO);
|
||||
|
||||
% if use_posterior:
|
||||
|
||||
$settings = $this->config->get('PLUGIN_SETTINGS');
|
||||
|
||||
$url = $settings['PoserDemoTailboneAPIURL'];
|
||||
if (!$url) {
|
||||
$this->cronMsg("must define the Tailbone API URL", FannieLogger::ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
$token = $settings['PoserDemoTailboneAPIToken'];
|
||||
if (!$token) {
|
||||
$this->cronMsg("must define the Tailbone API token", FannieLogger::ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
$verifySSL = $settings['PoserDemoTailboneAPIVerifySSL'] === 'false' ? false : true;
|
||||
|
||||
$posterior = new \Rattail\Posterior\Client($url, $token, $verifySSL);
|
||||
|
||||
try {
|
||||
$response = $posterior->get('/about');
|
||||
} catch (Exception $e) {
|
||||
$this->cronMsg($e, FannieLogger::ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
$body = $response->getBody();
|
||||
$this->cronMsg("response body was: $body", FannieLogger::INFO);
|
||||
print("$body\n");
|
||||
|
||||
% else:
|
||||
|
||||
$this->cronMsg("task is complete!", FannieLogger::INFO);
|
||||
print("task is complete!\n");
|
||||
|
||||
% endif
|
||||
}
|
||||
}
|
|
@ -12,6 +12,38 @@ class GeneratedProjectViewSupplement(ViewSupplement):
|
|||
"""
|
||||
route_prefix = 'generated_projects'
|
||||
|
||||
def configure_form_corepos_poser(self, f):
|
||||
|
||||
f.set_grouping([
|
||||
("Naming", [
|
||||
'organization',
|
||||
'org_slug',
|
||||
]),
|
||||
("Options", [
|
||||
'has_office_plugins',
|
||||
'has_lane_plugins',
|
||||
'use_posterior',
|
||||
]),
|
||||
])
|
||||
|
||||
# organization
|
||||
f.set_helptext('organization', "For use with branding etc.")
|
||||
f.set_default('organization', "Acme Foods Co-op")
|
||||
|
||||
# org_slug
|
||||
f.set_helptext('org_slug', "Short name used for folders etc.")
|
||||
f.set_default('org_slug', 'acmefoods')
|
||||
|
||||
# has_*_plugins
|
||||
f.set_label('has_office_plugins', "Office Plugins")
|
||||
f.set_default('has_office_plugins', True)
|
||||
f.set_label('has_lane_plugins', "Lane Plugins")
|
||||
f.set_default('has_lane_plugins', False)
|
||||
|
||||
# use_posterior
|
||||
f.set_helptext('use_posterior', "Set this if you plan to integrate with Tailbone API")
|
||||
f.set_default('use_posterior', False)
|
||||
|
||||
def configure_form_corporal(self, f):
|
||||
|
||||
f.set_grouping([
|
||||
|
|
Loading…
Reference in a new issue