power_stencil 0.4.22 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/doc/plugins.md +269 -18
  3. data/etc/meta_templates/plugin_seed/etc/command_line.yaml +1 -1
  4. data/etc/meta_templates/plugin_seed/etc/plugin_capabilities.yaml +33 -0
  5. data/etc/meta_templates/plugin_seed/etc/templates/{entity}_entity/.copy_ignore +2 -0
  6. data/etc/meta_templates/plugin_seed/etc/templates/{entity}_entity/.subst_ignore +1 -0
  7. data/etc/meta_templates/plugin_seed/etc/templates/{entity}_entity/message.txt +7 -0
  8. data/etc/meta_templates/plugin_seed/lib/{entity}.rb.erb +9 -24
  9. data/etc/meta_templates/plugin_seed/lib/{entity}/dsl/{entity}_dsl.rb.erb +9 -0
  10. data/etc/meta_templates/plugin_seed/lib/{entity}/entity_definitions/{entity}_entity.rb.erb +2 -0
  11. data/etc/meta_templates/plugin_seed/lib/{entity}/{entity}_processor.rb.erb +4 -1
  12. data/etc/templates/plugin_definition/.travis.yml +1 -1
  13. data/etc/templates/plugin_definition/CODE_OF_CONDUCT.md +1 -1
  14. data/etc/templates/plugin_definition/etc/command_line.yaml +1 -1
  15. data/etc/templates/plugin_definition/etc/plugin_capabilities.yaml +33 -0
  16. data/etc/templates/plugin_definition/etc/plugin_config.yaml +1 -1
  17. data/etc/templates/plugin_definition/etc/templates/{entity}_entity/.copy_ignore +2 -0
  18. data/etc/templates/plugin_definition/etc/templates/{entity}_entity/.subst_ignore +1 -0
  19. data/etc/templates/plugin_definition/etc/templates/{entity}_entity/message.txt +7 -0
  20. data/etc/templates/plugin_definition/lib/{entity}.rb.erb +9 -24
  21. data/etc/templates/plugin_definition/lib/{entity}/dsl/{entity}_dsl.rb.erb +9 -0
  22. data/etc/templates/plugin_definition/lib/{entity}/entity_definitions/{entity}_entity.rb.erb +2 -0
  23. data/etc/templates/plugin_definition/lib/{entity}/{entity}_processor.rb.erb +4 -1
  24. data/lib/power_stencil/command_processors/info.rb +0 -3
  25. data/lib/power_stencil/dsl/plugin_generation.rb +9 -0
  26. data/lib/power_stencil/engine/build_handling.rb +12 -7
  27. data/lib/power_stencil/engine/project_engine.rb +13 -9
  28. data/lib/power_stencil/plugins/base.rb +20 -5
  29. data/lib/power_stencil/plugins/build.rb +17 -0
  30. data/lib/power_stencil/plugins/capabilities.rb +24 -15
  31. data/lib/power_stencil/plugins/command_line.rb +13 -1
  32. data/lib/power_stencil/plugins/config.rb +11 -15
  33. data/lib/power_stencil/plugins/dsl.rb +17 -0
  34. data/lib/power_stencil/plugins/entity_definitions.rb +17 -0
  35. data/lib/power_stencil/plugins/require.rb +1 -31
  36. data/lib/power_stencil/plugins/templates.rb +10 -8
  37. data/lib/power_stencil/plugins/type.rb +13 -0
  38. data/lib/power_stencil/project/config.rb +2 -2
  39. data/lib/power_stencil/project/paths.rb +3 -0
  40. data/lib/power_stencil/project/plugins.rb +3 -14
  41. data/lib/power_stencil/utils/secure_require.rb +1 -1
  42. data/lib/power_stencil/version.rb +1 -1
  43. metadata +21 -9
  44. data/lib/power_stencil/plugins/dependencies.rb +0 -32
@@ -0,0 +1,9 @@
1
+ module <%= plugin_module_name %>
2
+ module Dsl
3
+
4
+ module <%= plugin_module_name %>Dsl
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -5,6 +5,8 @@ module <%= plugin_module_name %>
5
5
 
6
6
  entity_type :<%= plugin_name %>_entity
7
7
 
8
+ buildable_by :<%= plugin_name %>
9
+
8
10
  end
9
11
 
10
12
  end
@@ -8,7 +8,10 @@ module <%= plugin_module_name %>
8
8
 
9
9
 
10
10
  def execute
11
- puts '<%= main_entry_point.upcase %> PLUGIN WAZ HERE'
11
+ hello_message = '<%= main_entry_point.upcase %> PLUGIN WAZ HERE !!'
12
+ # You have full access to the configuration and command line options within the plugin !
13
+ hello_message = 'HI, ' + hello_message if config[:hello]
14
+ puts hello_message
12
15
  end
13
16
 
14
17
 
@@ -4,4 +4,4 @@ language: ruby
4
4
  cache: bundler
5
5
  rvm:
6
6
  - 2.3.1
7
- before_install: gem install bundler -v 2.0.2
7
+ before_install: gem install bundler -v 2.0.1
@@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
55
55
  ## Enforcement
56
56
 
57
57
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
- reported by contacting the project team at lbnetid+gh@gmail.com. All
58
+ reported by contacting the project team at lbnetid+rb@gmail.com. All
59
59
  complaints will be reviewed and investigated and will result in a response that
60
60
  is deemed necessary and appropriate to the circumstances. The project team is
61
61
  obligated to maintain confidentiality with regard to the reporter of an incident.
@@ -9,4 +9,4 @@
9
9
  :options:
10
10
  hello:
11
11
  :type: bool
12
- :summary: Just a hello flag.
12
+ :summary: Just a useless hello flag.
@@ -0,0 +1,33 @@
1
+ ---
2
+ # This file defines the capabilities exposed by the plugin. This file is mandatory
3
+ # for a plugin to be considered as valid.
4
+
5
+ # Define the main module of the plugin. In this module you can define the build method
6
+ # if the plugin exposes a build (actually a post build hook occurring after the files
7
+ # are "detemplatized")
8
+ :plugin_module: <%= plugin_module_name %>
9
+
10
+ # In the processors defined in the hereunder hash you map a subcommand with the processor
11
+ # that will handle it. A plugin can define as many subcommands as needed, or none...
12
+ # Hash keys should match sub-commands declared in the `command_line.yaml` file and processor
13
+ # classes should expose an `execute` method.
14
+ :processors:
15
+ <%= plugin_name %>: <%= plugin_module_name %>::Processor
16
+
17
+ # This is the name of the method called after the files are detemplatized. This method has
18
+ # to be a module method in the `plugin_module` module.
19
+ :build: post_build_hook
20
+
21
+ # If a dsl module is declared it will be injected in the DSL available in the shell or templates
22
+ :dsl: null
23
+
24
+ # These are the files (array) defining entity types. These files should not be already
25
+ # required by the plugin as they will be required by the framework when needed.
26
+ :entity_definitions:
27
+ - <%= plugin_name %>/entity_definitions/<%= plugin_name %>_entity
28
+
29
+ # A list of root directories where you can find templates in directories named from the
30
+ # entity types they are attached to.
31
+ :templates:
32
+ - etc/templates
33
+
@@ -25,4 +25,4 @@
25
25
  # :customizations:
26
26
  # :my_custom_entity:
27
27
  # :shape: circle
28
- # :fillcolor: red
28
+ # :fillcolor: red
@@ -0,0 +1,7 @@
1
+
2
+ This message has been generated on the <%= erb_insert 'Time.now' %>
3
+ This is an example of what you can do, and how much PowerStencil is customizable ! Check the plugin generated code and
4
+ taylor it to your needs...
5
+
6
+ This text is the result of a full build process of the entity '<%= erb_insert 'build_target.as_path' %>' by the plugin '<%= erb_insert 'build_target.buildable_by' %>'.
7
+
@@ -1,34 +1,19 @@
1
1
  require '<%= plugin_name %>/version'
2
2
  require '<%= plugin_name %>/plugin_helper'
3
3
  require '<%= plugin_name %>/<%= plugin_name %>_processor'
4
+ require '<%= plugin_name %>/dsl/<%= plugin_name %>_dsl'
4
5
 
5
6
  module <%= plugin_module_name %>
6
7
 
7
- extend PowerStencil::Utils::SecureRequire
8
- extend <%= plugin_module_name %>::PluginHelper
9
-
10
- REQUIRED_PLUGINS = []
11
-
12
- def self.setup_processors
13
- clm = PowerStencil.command_line_manager
14
- clm.register_processor clm.command_by_alias('<%= main_entry_point %>'), <%= plugin_module_name %>::Processor.new
15
- end
16
-
17
- def self.setup_entity_definitions
18
- PowerStencil.logger.info 'Setting up <%= main_entry_point %> plugin entities'
19
- securely_require '<%= plugin_name %>/entity_definitions/<%= plugin_name %>_entity', fail_on_error: true
20
- end
21
-
22
- def self.setup_plugin_templates
23
- Dir.entries(plugin_templates_path).reject { |e| %w(. ..).include? e }.each do |entry|
24
- template_path = File.join(plugin_templates_path, entry)
25
- if Dir.exist? template_path
26
- PowerStencil.project.register_template_path_for_type entry.to_sym, template_path
27
- end
8
+ def self.post_build_hook(built_entity, generated_files_path)
9
+ # This is an example of what you could do after files are generated, ie pretty much anything...
10
+ case built_entity.type
11
+ when :<%= plugin_name %>_entity
12
+ generated_file = File.join generated_files_path, 'message.txt'
13
+ puts File.readlines(generated_file)
14
+ else
15
+ raise PowerStencil::Error, 'Plugin <%= plugin_name %> doesnt know how handle the build of a <%= plugin_name %>_entity entity type !'
28
16
  end
29
17
  end
30
18
 
31
19
  end
32
-
33
- # All plugins have to be in the PowerStencil::Plugin namespace !
34
- PowerStencil::Plugin::<%= plugin_module_name %> = <%= plugin_module_name %>
@@ -0,0 +1,9 @@
1
+ module <%= plugin_module_name %>
2
+ module Dsl
3
+
4
+ module <%= plugin_module_name %>Dsl
5
+
6
+ end
7
+
8
+ end
9
+ end
@@ -5,6 +5,8 @@ module <%= plugin_module_name %>
5
5
 
6
6
  entity_type :<%= plugin_name %>_entity
7
7
 
8
+ buildable_by :<%= plugin_name %>
9
+
8
10
  end
9
11
 
10
12
  end
@@ -8,7 +8,10 @@ module <%= plugin_module_name %>
8
8
 
9
9
 
10
10
  def execute
11
- puts '<%= main_entry_point.upcase %> PLUGIN WAZ HERE'
11
+ hello_message = '<%= main_entry_point.upcase %> PLUGIN WAZ HERE !!'
12
+ # You have full access to the configuration and command line options within the plugin !
13
+ hello_message = 'HI, ' + hello_message if config[:hello]
14
+ puts hello_message
12
15
  end
13
16
 
14
17
 
@@ -20,9 +20,6 @@ module PowerStencil
20
20
  puts '-' * 80
21
21
  puts ' Plugins:'
22
22
  project.plugins.each do |plugin_name, plugin|
23
- if plugin.has_dependencies?
24
- puts " --> Plugin '#{plugin_name}' depends on plugin#{plugin.declared_dependencies.size > 1 ? 's' : ''}: '#{plugin.declared_dependencies.join ', '}'"
25
- end
26
23
  puts " --> Plugin '#{plugin_name}' has following capabilities:"
27
24
  puts(project.plugin_report(plugin_name, plugin).map { |p| ' - %s' % [p] })
28
25
  end
@@ -11,6 +11,15 @@ module PowerStencil
11
11
  plugin_name.camelize
12
12
  end
13
13
 
14
+ def erb_code(ruby_code_str, skip_line = true)
15
+ end_char = skip_line ? '-' : ''
16
+ '%s %s %s%s' % ['<%', ruby_code_str, end_char, '%>']
17
+ end
18
+
19
+ def erb_insert(ruby_code_str)
20
+ '%s %s %s' % ['<%=', ruby_code_str, '%>']
21
+ end
22
+
14
23
  end
15
24
 
16
25
  end
@@ -36,8 +36,8 @@ module PowerStencil
36
36
  File.join build_target_path, entity_to_build.as_path.tr('/', '_')
37
37
  end
38
38
 
39
- puts_and_logs "De-templating files for '#{entity_to_build.as_path}' into '#{build_entity_target_path}'"
40
39
  build_entity entity_to_build, build_entity_target_path
40
+
41
41
  entity_build_report << 'Ok'
42
42
  rescue => e
43
43
  logger.error "Failed building '#{entity_to_build.as_path}' because '#{e.message}' !"
@@ -96,21 +96,26 @@ module PowerStencil
96
96
 
97
97
 
98
98
  def build_entity(entity_to_build, target_path)
99
- logger.info "Building #{entity_to_build.as_path} in '#{target_path}'"
100
- render_source entity_to_build.templates_path, target_path, main_entry_point: entity_to_build.as_path
101
- logger.info "Detemplatized filed generated in '#{target_path}'"
102
- manage_build_links target_path
103
- target_plugin_name = entity_to_build.buildable_by
99
+ target_plugin_name = entity_to_build.buildable_by.to_s
100
+ default_build entity_to_build, target_path
101
+
104
102
  if target_plugin_name.empty?
105
103
  post_build_hook entity_to_build, target_path
106
104
  else
107
105
  target_plugin = project.plugins[target_plugin_name]
108
106
  raise PowerStencil::Error, "Could not find plugin '#{target_plugin_name}' !" if target_plugin.nil?
109
107
  raise PowerStencil::Error, "Plugin '#{target_plugin_name}' has no build capability !" unless target_plugin.capabilities[:build]
110
- target_plugin.plugin_module.send PowerStencil::Plugins::Require::POST_BUILD_HOOK, entity_to_build, target_path
108
+ target_plugin.post_build_hook entity_to_build, target_path
111
109
  end
112
110
  end
113
111
 
112
+ def default_build(entity_to_build, target_path)
113
+ logger.info "Building #{entity_to_build.as_path} in '#{target_path}'"
114
+ render_source entity_to_build.templates_path, target_path, main_entry_point: entity_to_build.as_path
115
+ logger.info "Detemplatized filed generated in '#{target_path}'"
116
+ manage_build_links target_path
117
+ end
118
+
114
119
  def post_build_hook(entity_to_build, files_path)
115
120
  case entity_to_build.type
116
121
  when :simple_exec
@@ -17,6 +17,7 @@ module PowerStencil
17
17
  @project = project
18
18
  load_system_entities_definition
19
19
  load_plugins_entities_definition
20
+ load_plugins_dsl_definition
20
21
  load_project_entities_definition
21
22
  load_entities
22
23
  end
@@ -32,15 +33,6 @@ module PowerStencil
32
33
  end
33
34
  end
34
35
 
35
- def load_plugins_entities_definition
36
- project.plugins.each do |plugin_name, plugin|
37
- if plugin.capabilities[:entity_definitions]
38
- logger.info "Loading entity definitions for plugin '#{plugin_name}'."
39
- plugin.plugin_module.send PowerStencil::Plugins::Require::SETUP_ENTITY_DEFINITIONS_CALLBACK
40
- end
41
- end
42
- end
43
-
44
36
  def load_entities
45
37
  root_universe.clear
46
38
  load_system_entities
@@ -50,6 +42,18 @@ module PowerStencil
50
42
 
51
43
  private
52
44
 
45
+ def load_plugins_entities_definition
46
+ project.plugins.each do |_, plugin|
47
+ plugin.require_plugin_entity_definitions if plugin.capabilities[:entity_definitions]
48
+ end
49
+ end
50
+
51
+ def load_plugins_dsl_definition
52
+ project.plugins.each do |_, plugin|
53
+ plugin.require_plugin_dsl if plugin.capabilities[:dsl]
54
+ end
55
+ end
56
+
53
57
  def load_project_entities
54
58
  logger.debug 'Loading project entities - NOT IMPLEMENTED'
55
59
  root_universe.import project.project_entities_path, stop_on_error: false do |new_entity|
@@ -1,10 +1,13 @@
1
- require 'power_stencil/plugins/dependencies'
1
+ require 'power_stencil/plugins/type'
2
2
  require 'power_stencil/plugins/config'
3
3
  require 'power_stencil/plugins/command_line'
4
+ require 'power_stencil/plugins/entity_definitions'
4
5
  require 'power_stencil/plugins/templates'
5
6
  require 'power_stencil/plugins/require'
6
7
  require 'power_stencil/plugins/capabilities'
7
8
  require 'power_stencil/plugins/gem'
9
+ require 'power_stencil/plugins/build'
10
+ require 'power_stencil/plugins/dsl'
8
11
 
9
12
  module PowerStencil
10
13
 
@@ -15,19 +18,23 @@ module PowerStencil
15
18
  extend PowerStencil::Plugins::Gem
16
19
 
17
20
  include Climatic::Proxy
18
- include PowerStencil::Plugins::Dependencies
21
+ include PowerStencil::Plugins::Type
19
22
  include PowerStencil::Plugins::Config
20
23
  include PowerStencil::Plugins::CommandLine
21
24
  include PowerStencil::Plugins::Require
22
25
  include PowerStencil::Plugins::Capabilities
26
+ include PowerStencil::Plugins::EntityDefinitions
23
27
  include PowerStencil::Plugins::Templates
28
+ include PowerStencil::Plugins::Build
24
29
 
25
30
  attr_reader :name, :version, :entry_point_path
26
31
 
27
- def initialize(name, project)
32
+ def initialize(name, project, type = :local)
28
33
  @name = name
29
34
  @project = project
30
35
  @version = PowerStencil::Utils::SemanticVersion.new '0.0.0-not-specified'
36
+ raise PowerStencil::Error, "Invalid plugin type (#{type}) for plugin '#{name}'" unless PLUGIN_TYPES.include? type
37
+ @type = type
31
38
  logger.debug "Loading plugin '#{name}'..."
32
39
  setup_plugin
33
40
  logger.info "Plugin '#{name}' successfully available"
@@ -35,7 +42,14 @@ module PowerStencil
35
42
  end
36
43
 
37
44
  def path
38
- project.project_plugin_path(name)
45
+ case type
46
+ when :local
47
+ project.project_plugin_path(name)
48
+ end
49
+ end
50
+
51
+ def plugin_module
52
+ Object.const_get plugin_definition[:plugin_module]
39
53
  end
40
54
 
41
55
  private
@@ -43,9 +57,10 @@ module PowerStencil
43
57
  attr_reader :project
44
58
 
45
59
  def setup_plugin
46
- require_entry_point
60
+ load_capabilities
47
61
  load_plugin_specific_config
48
62
  load_yaml_command_definition
63
+ require_entry_point
49
64
  end
50
65
 
51
66
  end
@@ -0,0 +1,17 @@
1
+ module PowerStencil
2
+ module Plugins
3
+
4
+ module Build
5
+
6
+ def post_build_hook(*args)
7
+ build_method_name = plugin_definition[:build]
8
+ msg = "Plugin '#{self.name}' doesn't contain the '#{build_method_name}' method in the '#{plugin_definition[:plugin_module]}' module. Cannot build !"
9
+ raise PowerStencil::Error, msg unless plugin_module.respond_to? build_method_name
10
+ plugin_module.send build_method_name, *args
11
+ end
12
+
13
+ end
14
+
15
+ end
16
+ end
17
+
@@ -3,25 +3,34 @@ module PowerStencil
3
3
 
4
4
  module Capabilities
5
5
 
6
- DEFAULT_CAPABILITIES = {
7
- command_line: false,
8
- local_config: false,
9
- processors: false,
10
- build: false,
11
- dsl: false,
12
- entity_definitions: false,
13
- code: false,
14
- version: false,
15
- templates: false
16
- }.freeze
6
+ include PowerStencil::Utils::FileHelper
7
+
8
+ CAPABILITIES = %i(config command_line processors build dsl entity_definitions templates).freeze
9
+
10
+ attr_reader :plugin_definition
11
+
12
+ def plugin_capabilities_definition_file
13
+ project.plugin_capabilities_definition_file self.name
14
+ end
17
15
 
18
16
  def capabilities
19
- @capabilities ||= DEFAULT_CAPABILITIES.dup
17
+ @capabilities ||= CAPABILITIES.dup.zip([false] * CAPABILITIES.size).to_h
20
18
  end
21
19
 
22
- def valid?
23
- capabilities.keys.each {|cap_name| return true if capabilities[cap_name]}
24
- false
20
+ private
21
+
22
+ def load_capabilities
23
+ yaml_file = plugin_capabilities_definition_file
24
+ unless File.exists? yaml_file and File.file? yaml_file and File.readable? yaml_file
25
+ raise PowerStencil::Error, "Plugin '#{self.name}' has no definition file !"
26
+ end
27
+ @plugin_definition = yaml_file_to_hash yaml_file
28
+ %i(processors entity_definitions templates build dsl).each do |capability|
29
+ unless plugin_definition[capability].nil? or plugin_definition[capability].empty?
30
+ capabilities[capability] = true
31
+ end
32
+ end
33
+
25
34
  end
26
35
 
27
36
  end
@@ -5,10 +5,22 @@ module PowerStencil
5
5
 
6
6
  attr_reader :plugin_command_line_modifier
7
7
 
8
+ def plugin_commands_line_definition_file
9
+ project.plugin_commands_line_definition_file self.name
10
+ end
11
+
12
+ def register_processors
13
+ plugin_definition[:processors].each do |processors_name, processor|
14
+ clm = PowerStencil.command_line_manager
15
+ processor_class = Object.const_get processor
16
+ clm.register_processor clm.command_by_alias(processors_name), processor_class.new
17
+ end
18
+ end
19
+
8
20
  private
9
21
 
10
22
  def load_yaml_command_definition
11
- yaml_file = project.plugin_commands_line_definition_file name
23
+ yaml_file = plugin_commands_line_definition_file
12
24
  if File.exists? yaml_file and File.file? yaml_file and File.readable? yaml_file
13
25
  logger.info "Adding extra command line definition for '#{name}' plugin..."
14
26
  @plugin_command_line_modifier = project.yaml_file_to_hash yaml_file