power_stencil 0.5.0 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/doc/builds.md +10 -1
  3. data/doc/entities.md +51 -42
  4. data/doc/plugins.md +59 -6
  5. data/doc/templates.md +1 -0
  6. data/etc/base_commands_definition.yml +14 -1
  7. data/etc/meta_templates/plugin_seed/etc/plugin_capabilities.yaml +2 -1
  8. data/etc/meta_templates/plugin_seed/psplugin_{entity}.gemspec +3 -1
  9. data/etc/templates/plugin_definition/etc/plugin_capabilities.yaml +2 -1
  10. data/etc/templates/plugin_definition/psplugin_{entity}.gemspec +3 -1
  11. data/lib/power_stencil/command_processors/build.rb +16 -3
  12. data/lib/power_stencil/command_processors/check.rb +12 -0
  13. data/lib/power_stencil/command_processors/create.rb +1 -1
  14. data/lib/power_stencil/command_processors/delete.rb +5 -5
  15. data/lib/power_stencil/command_processors/init.rb +2 -2
  16. data/lib/power_stencil/command_processors/plugin.rb +15 -5
  17. data/lib/power_stencil/command_processors/root.rb +1 -1
  18. data/lib/power_stencil/engine/build_handling.rb +1 -2
  19. data/lib/power_stencil/engine/directory_processor.rb +6 -1
  20. data/lib/power_stencil/engine/entities_definitions.rb +16 -7
  21. data/lib/power_stencil/engine/project_engine.rb +12 -5
  22. data/lib/power_stencil/initializer.rb +4 -7
  23. data/lib/power_stencil/plugins/base.rb +19 -9
  24. data/lib/power_stencil/plugins/capabilities.rb +10 -8
  25. data/lib/power_stencil/plugins/command_line.rb +1 -4
  26. data/lib/power_stencil/plugins/config.rb +1 -5
  27. data/lib/power_stencil/plugins/dsl.rb +24 -5
  28. data/lib/power_stencil/plugins/entity_definitions.rb +15 -0
  29. data/lib/power_stencil/plugins/gem.rb +14 -35
  30. data/lib/power_stencil/plugins/paths.rb +38 -0
  31. data/lib/power_stencil/plugins/require.rb +10 -16
  32. data/lib/power_stencil/plugins/templates.rb +1 -1
  33. data/lib/power_stencil/project/base.rb +12 -0
  34. data/lib/power_stencil/project/config.rb +3 -2
  35. data/lib/power_stencil/project/info.rb +14 -1
  36. data/lib/power_stencil/project/paths.rb +5 -25
  37. data/lib/power_stencil/project/plugins.rb +17 -22
  38. data/lib/power_stencil/system_entity_definitions/all.rb +1 -0
  39. data/lib/power_stencil/system_entity_definitions/entity_override.rb +1 -0
  40. data/lib/power_stencil/system_entity_definitions/entity_project_common.rb +1 -1
  41. data/lib/power_stencil/system_entity_definitions/project_entity.rb +1 -0
  42. data/lib/power_stencil/system_entity_definitions/simple_exec.rb +1 -1
  43. data/lib/power_stencil/system_entity_definitions/source_provider.rb +15 -0
  44. data/lib/power_stencil/utils/gem_utils.rb +22 -2
  45. data/lib/power_stencil/version.rb +1 -1
  46. data/power_stencil.gemspec +1 -1
  47. metadata +7 -5
@@ -0,0 +1,38 @@
1
+ module PowerStencil
2
+ module Plugins
3
+
4
+ module Paths
5
+
6
+ def plugin_path
7
+ case self.type
8
+ when :local
9
+ project.project_local_plugin_path self.name
10
+ when :gem
11
+ gem_spec.gem_dir
12
+ end
13
+ end
14
+
15
+ def plugin_command_line_definition_file
16
+ File.join plugin_path, 'etc', 'command_line.yaml'
17
+ end
18
+
19
+ def plugin_capabilities_definition_file
20
+ File.join plugin_path, 'etc', 'plugin_capabilities.yaml'
21
+ end
22
+
23
+ def plugin_config_specific_file
24
+ File.join plugin_path, 'etc', 'plugin_config.yaml'
25
+ end
26
+
27
+ def plugin_processors_dir
28
+ File.join plugin_path, 'lib', plugin_name, 'processors'
29
+ end
30
+
31
+ def plugin_entities_definitions_dir
32
+ File.join plugin_path, 'etc', plugin_name, 'entities_definitions'
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
@@ -6,7 +6,6 @@ module PowerStencil
6
6
  POST_BUILD_HOOK = :post_build_hook
7
7
 
8
8
  include PowerStencil::Utils::SecureRequire
9
- include PowerStencil::Utils::GemUtils
10
9
 
11
10
  private
12
11
 
@@ -15,21 +14,16 @@ module PowerStencil
15
14
  end
16
15
 
17
16
  def require_entry_point
18
- if is_available_gem? name
19
- logger.debug "Plugin '#{name}' is actually a Ruby Gem."
20
- raise "Plugin (#{name}) provided as a Ruby gem is not yet supported !"
21
- else
22
- @entry_point_path = File.join project.project_plugin_path(name), 'lib', "#{name.underscore}.rb"
23
- logger.debug "Plugin '#{name}' is provided locally: '#{entry_point_path}'"
24
- plugin_root_path = File.dirname(entry_point_path)
25
- begin
26
- $LOAD_PATH << plugin_root_path
27
- securely_require entry_point_path unless plugin_definition[:plugin_module].nil?
28
- rescue LoadError => e
29
- logger.warn "As plugin '#{name}' code is invalid, removing '#{plugin_root_path}' from LOAD_PATH"
30
- $LOAD_PATH.delete plugin_root_path
31
- end
32
-
17
+ @entry_point_path = File.join plugin_path, 'lib', "#{name.underscore}.rb"
18
+ logger.debug "Plugin '#{name}' entry point: '#{entry_point_path}'"
19
+ plugin_root_path = File.dirname(entry_point_path)
20
+ begin
21
+ $LOAD_PATH << plugin_root_path
22
+ securely_require entry_point_path unless plugin_definition[:plugin_module].nil?
23
+ rescue LoadError => e
24
+ @entry_point_path = nil
25
+ logger.warn "As plugin '#{name}' code is invalid, removing '#{plugin_root_path}' from LOAD_PATH"
26
+ $LOAD_PATH.delete plugin_root_path
33
27
  end
34
28
  end
35
29
 
@@ -7,7 +7,7 @@ module PowerStencil
7
7
  return unless capabilities[:templates]
8
8
  logger.info "Loading '#{self.name}' plugin templates..."
9
9
  plugin_definition[:templates].each do |templates_path|
10
- plugin_templates_path = File.join self.path, templates_path
10
+ plugin_templates_path = File.join self.plugin_path, templates_path
11
11
  Dir.entries(plugin_templates_path).reject { |e| %w(. ..).include? e }.each do |entry|
12
12
  template_path = File.join(plugin_templates_path, entry)
13
13
  if Dir.exist? template_path
@@ -34,6 +34,10 @@ module PowerStencil
34
34
 
35
35
  attr_reader :engine, :entity_engine
36
36
 
37
+ def name
38
+ File.dirname project_config_root
39
+ end
40
+
37
41
  def initialize(search_from_path: Dir.pwd)
38
42
  initialize_paths search_from_path
39
43
  load_project_specific_config
@@ -41,11 +45,19 @@ module PowerStencil
41
45
  bootstrap_plugins
42
46
  build_engines
43
47
  register_system_templates
48
+ register_plugins_templates
44
49
  register_project_templates
45
50
  end
46
51
 
47
52
  private
48
53
 
54
+ def register_plugins_templates
55
+ plugins.each do |_, plugin|
56
+ plugin.register_plugin_templates
57
+ end
58
+ end
59
+
60
+
49
61
  def register_project_templates
50
62
  dir = project_templates_path
51
63
  if Dir.exist? dir and File.readable? dir
@@ -21,8 +21,9 @@ module PowerStencil
21
21
  end
22
22
 
23
23
 
24
- def add_plugin_config(plugin_name)
25
- yaml_file = plugin_config_specific_file plugin_name
24
+ def add_plugin_config(plugin)
25
+ plugin_name = plugin.name
26
+ yaml_file = plugin.plugin_config_specific_file
26
27
  priority = if priority.nil?
27
28
  PLUGIN_CONFIG_PRIORITY_MIN
28
29
  else
@@ -60,7 +60,20 @@ module PowerStencil
60
60
  .sort{ |a,b| a.first <=> b.first }
61
61
  .each do |type, klass|
62
62
  msg = "Type '#{type}' --> #{klass}"
63
- msg << " (template-template path: '#{entity_type_templates[type]}')" unless entity_type_templates[type].nil?
63
+
64
+ source_provider = klass.entity_type_source_provider
65
+ source_provider_display = if source_provider == PowerStencil
66
+ "'#{source_provider.name}'"
67
+ elsif source_provider == self
68
+ "project '#{source_provider.name}'"
69
+ elsif source_provider.is_a? PowerStencil::Plugins::Base
70
+ "plugin '#{source_provider.name}'"
71
+ else
72
+ raise PowerStencil::Error, "Unidentified source provider for #{klass} !"
73
+ end
74
+
75
+ msg << " (provided by #{source_provider_display})"
76
+ msg << " template-template path: '#{entity_type_templates[type]}'" unless entity_type_templates[type].nil?
64
77
  report << msg
65
78
  end
66
79
  report
@@ -35,10 +35,14 @@ module PowerStencil
35
35
  File.join PowerStencil::Project::Paths.system_templates_path, entity_type.to_s
36
36
  end
37
37
 
38
- def project_plugins_path
38
+ def project_local_plugins_path
39
39
  File.join project_config_root, PowerStencil.config[:project_plugins_directory_name]
40
40
  end
41
41
 
42
+ def project_local_plugin_path(plugin_name)
43
+ File.join project_local_plugins_path, plugin_name
44
+ end
45
+
42
46
  def project_templates_path
43
47
  File.join project_config_root, PowerStencil.config[:project_templates_directory_name]
44
48
  end
@@ -47,30 +51,6 @@ module PowerStencil
47
51
  File.join project_config_root, PowerStencil.config[:project_entity_definitions_directory_name]
48
52
  end
49
53
 
50
- def project_plugin_path(plugin_name)
51
- File.join project_plugins_path, plugin_name
52
- end
53
-
54
- def plugin_capabilities_definition_file(plugin_name)
55
- File.join project_plugin_path(plugin_name), 'etc', 'plugin_capabilities.yaml'
56
- end
57
-
58
- def plugin_commands_line_definition_file(plugin_name)
59
- File.join project_plugin_path(plugin_name), 'etc', 'command_line.yaml'
60
- end
61
-
62
- def plugin_config_specific_file(plugin_name)
63
- File.join project_plugin_path(plugin_name), 'etc', 'plugin_config.yaml'
64
- end
65
-
66
- def plugin_processors_dir(plugin_name)
67
- File.join project_plugin_path(plugin_name), 'lib', plugin_name, 'processors'
68
- end
69
-
70
- def plugin_entities_definitions_dir(plugin_name)
71
- File.join project_plugin_path(plugin_name), 'etc', plugin_name, 'entities_definitions'
72
- end
73
-
74
54
  def project_entity_path(entity)
75
55
  File.join project_entities_path, entity.type.to_s, "#{entity.name}.yaml"
76
56
  end
@@ -7,7 +7,7 @@ module PowerStencil
7
7
  @plugins ||= {}
8
8
  end
9
9
 
10
- def create_plugin_tree(plugin_name, new_plugin_path, overwrite_files: false)
10
+ def create_new_local_plugin_tree(plugin_name, new_plugin_path, overwrite_files: false)
11
11
  raise PowerStencil::Error, "Plugin '#{plugin_name}' already exists !" if plugins.keys.include? plugin_name
12
12
  raise PowerStencil::Error, "Invalid plugin name '#{plugin_name}'" if (plugin_name.underscore =~ /^[_[:lower:]][_[:alnum:]]*$/).nil?
13
13
  entity_engine.dsl = PowerStencil::Dsl::PluginGeneration
@@ -21,6 +21,7 @@ module PowerStencil
21
21
  private
22
22
 
23
23
  def bootstrap_plugins
24
+ @plugins = {}
24
25
  initialize_gem_plugins
25
26
  initialize_local_plugins
26
27
  command_line_manager.definition_hash_to_commands
@@ -31,45 +32,39 @@ module PowerStencil
31
32
  end
32
33
  end
33
34
 
34
-
35
35
  def initialize_gem_plugins
36
- # PowerStencil::logger.warn 'Gem plugins not yet supported ! Skipping...'
37
36
  if config[:project_plugins].empty?
38
- PowerStencil.logger.info "No gem plugin found in '#{project_plugins_path}'"
37
+ PowerStencil.logger.info 'No gem plugin found in project'
39
38
  return
40
39
  end
41
40
  config[:project_plugins].each do |plugin_definition|
42
- plugin_name, plugin_requirements = case plugin_definition
43
- when String
44
- [plugin_definition, '']
45
- when Hash
46
- [plugin_definition.keys.first, plugin_definition.values.first]
47
- end
48
- unless PowerStencil::Plugins::Base.gem_locally_installed? plugin_name, plugin_requirements
49
- PowerStencil::Plugins::Base.install_gem plugin_name, plugin_requirements
50
- end
41
+
42
+ (gem_name, gem_req) = PowerStencil::Plugins::Base.plugin_definition_to_name_and_req plugin_definition
43
+ raise PowerStencil::Error, "Plugin '#{gem_name}' already exists !" unless plugins[gem_name].nil?
44
+
45
+ plugins[gem_name] = PowerStencil::Plugins::Base.new(gem_name, self, type: :gem, gem_req: gem_req)
51
46
  end
52
47
  end
53
48
 
54
49
  def initialize_local_plugins
55
- unless File.directory? project_plugins_path
56
- PowerStencil.logger.info "No local plugin found in '#{project_plugins_path}'"
50
+ unless File.directory? project_local_plugins_path
51
+ PowerStencil.logger.info "No local plugin found in '#{project_local_plugins_path}'"
57
52
  return
58
53
  end
59
54
 
60
- candidates = Dir.entries(project_plugins_path)
61
- .select { |e| File.directory? File.join(project_plugins_path, e) }
62
- .reject { |d| %w(. ..).include? d }
63
- @plugins = {}
64
- candidates.each do |candidate|
55
+ Dir.entries(project_local_plugins_path)
56
+ .select { |e| File.directory? File.join(project_local_plugins_path, e) }
57
+ .reject { |d| %w(. ..).include? d }
58
+ .each do |candidate|
65
59
  begin
66
60
  raise PowerStencil::Error, "Plugin '#{candidate}' already exists !" unless plugins[candidate].nil?
67
61
  plugins[candidate] = PowerStencil::Plugins::Base.new(candidate, self)
68
62
  rescue PowerStencil::Error => pse
69
- PowerStencil.logger.debug pse.message
70
- PowerStencil.logger.error "Discarding invalid plugin '#{candidate}'."
63
+ logger.puts_and_logs pse.message, logs_as: :error
64
+ logger.puts_and_logs "Discarding invalid plugin '#{candidate}'.", logs_as: :error
71
65
  end
72
66
  end
67
+
73
68
  end
74
69
 
75
70
  end
@@ -3,6 +3,7 @@
3
3
 
4
4
  require 'power_stencil/system_entity_definitions/non_persistent'
5
5
  require 'power_stencil/system_entity_definitions/has_associated_files'
6
+ require 'power_stencil/system_entity_definitions/source_provider'
6
7
  require 'power_stencil/system_entity_definitions/buildable'
7
8
  require 'power_stencil/system_entity_definitions/entity_project_common'
8
9
 
@@ -1,5 +1,6 @@
1
1
  class UniverseCompiler::Entity::Override
2
2
 
3
+ extend PowerStencil::SystemEntityDefinitions::SourceProvider
3
4
  extend PowerStencil::SystemEntityDefinitions::Buildable
4
5
  include PowerStencil::SystemEntityDefinitions::EntityProjectCommon
5
6
 
@@ -3,7 +3,7 @@ module PowerStencil
3
3
 
4
4
  module EntityProjectCommon
5
5
 
6
- def save(uri = source_uri, raise_error: true, force_save: false, force_files_generation: false )
6
+ def save(uri = source_uri, raise_error: true, force_save: false, force_files_generation: false )
7
7
  super(source_uri, raise_error: raise_error, force_save: force_save)
8
8
  unless PowerStencil.project.entity_type_templates[type].nil?
9
9
  PowerStencil.project.generate_entity_dir_for_entity self, force: force_files_generation
@@ -3,6 +3,7 @@ module PowerStencil
3
3
 
4
4
  class ProjectEntity < UniverseCompiler::Entity::Base
5
5
 
6
+ extend PowerStencil::SystemEntityDefinitions::SourceProvider
6
7
  extend PowerStencil::SystemEntityDefinitions::Buildable
7
8
  include PowerStencil::SystemEntityDefinitions::EntityProjectCommon
8
9
 
@@ -9,7 +9,7 @@ module PowerStencil
9
9
 
10
10
  entity_type :simple_exec
11
11
 
12
- buildable_by ''
12
+ buildable
13
13
 
14
14
  has_one :process_descriptor, name: :post_process
15
15
  not_null :post_process
@@ -0,0 +1,15 @@
1
+ module PowerStencil
2
+ module SystemEntityDefinitions
3
+
4
+ module SourceProvider
5
+
6
+ DEFAULT_PROVIDER = PowerStencil
7
+
8
+ def entity_type_source_provider
9
+ @entity_type_source_provider ||= DEFAULT_PROVIDER
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+ end
@@ -3,8 +3,28 @@ module PowerStencil
3
3
 
4
4
  module GemUtils
5
5
 
6
- def is_available_gem?(gem_name)
7
- false
6
+ def plugin_definition_to_name_and_req(plugin_definition)
7
+ md = plugin_definition.match /^\s*([^\s]+)\s*,?\s*(.+)?\s*$/
8
+ if md.nil?
9
+ raise PowerStencil::Error, "Invalid plugin_definition '#{plugin_definition}'"
10
+ end
11
+ gem_name = md[1]
12
+ gem_req = if md[2].nil? or md[2].empty?
13
+ ::Gem::Requirement.default
14
+ else
15
+ ::Gem::Requirement.create md[2]
16
+ end
17
+ [gem_name, gem_req]
18
+ end
19
+
20
+ def find_gemspec_manually(gem_name)
21
+ gem_spec_files = []
22
+ ::Gem::Specification.dirs.each do |dir|
23
+ Dir.glob(File.join(dir, "#{gem_name}-*.*.*.gemspec")) do |file|
24
+ gem_spec_files << file
25
+ end
26
+ end
27
+ gem_spec_files.map { |file| ::Gem::Specification.load file }
8
28
  end
9
29
 
10
30
  end
@@ -1,3 +1,3 @@
1
1
  module PowerStencil
2
- VERSION = '0.5.0'.freeze
2
+ VERSION = '0.6.3'.freeze
3
3
  end
@@ -25,7 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency 'rake', '~> 10.0'
26
26
  spec.add_development_dependency 'rspec', '~> 3.0'
27
27
 
28
- spec.add_dependency 'climatic', '~> 0.2.29'
28
+ spec.add_dependency 'climatic', '~> 0.2.30'
29
29
  spec.add_dependency 'dir_glob_ignore', '~> 0.3'
30
30
  spec.add_dependency 'universe_compiler', '~> 0.5.1'
31
31
  spec.add_dependency 'pry'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: power_stencil
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent Briais
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-24 00:00:00.000000000 Z
11
+ date: 2019-10-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.2.29
61
+ version: 0.2.30
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.2.29
68
+ version: 0.2.30
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: dir_glob_ignore
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -233,6 +233,7 @@ files:
233
233
  - lib/power_stencil/plugins/dsl.rb
234
234
  - lib/power_stencil/plugins/entity_definitions.rb
235
235
  - lib/power_stencil/plugins/gem.rb
236
+ - lib/power_stencil/plugins/paths.rb
236
237
  - lib/power_stencil/plugins/require.rb
237
238
  - lib/power_stencil/plugins/templates.rb
238
239
  - lib/power_stencil/plugins/type.rb
@@ -256,6 +257,7 @@ files:
256
257
  - lib/power_stencil/system_entity_definitions/project_config.rb
257
258
  - lib/power_stencil/system_entity_definitions/project_entity.rb
258
259
  - lib/power_stencil/system_entity_definitions/simple_exec.rb
260
+ - lib/power_stencil/system_entity_definitions/source_provider.rb
259
261
  - lib/power_stencil/utils/directory_processor.rb
260
262
  - lib/power_stencil/utils/file_edit.rb
261
263
  - lib/power_stencil/utils/file_helper.rb
@@ -274,7 +276,7 @@ metadata:
274
276
  documentation_uri: https://gitlab.com/tools4devops/power_stencil/blob/master/README.md
275
277
  source_code_uri: https://gitlab.com/tools4devops/power_stencil
276
278
  homepage_uri: https://powerstencil.brizone.org/
277
- post_install_message: "\nThank you for installing PowerStencil 0.5.0 !\nFrom the command
279
+ post_install_message: "\nThank you for installing PowerStencil 0.6.3 !\nFrom the command
278
280
  line you can run `power_stencil --help`\nIf your shell is not completing the command:\n
279
281
  \ If you use rbenv: `rbenv rehash`\n If you use zsh : `rehash`\n\nOfficial Website
280
282
  \ : https://powerstencil.brizone.org/\nFull documentation here : https://gitlab.com/tools4devops/power_stencil/blob/master/README.md\nFeel