power_stencil 0.5.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/.gitlab-ci.yml +2 -0
  3. data/README.md +3 -7
  4. data/doc/builds.md +10 -1
  5. data/doc/entities.md +59 -50
  6. data/doc/images/power-stencil-entity-creation.svg +247 -114
  7. data/doc/plugins.md +49 -1
  8. data/doc/templates.md +23 -18
  9. data/etc/base_commands_definition.yml +28 -1
  10. data/etc/meta_templates/plugin_seed/psplugin_{entity}.gemspec +3 -1
  11. data/etc/power_stencil.yaml +7 -1
  12. data/etc/templates/plugin_definition/psplugin_{entity}.gemspec +3 -1
  13. data/etc/templates/project/.zzzgitignore.erb +8 -3
  14. data/lib/power_stencil.rb +1 -0
  15. data/lib/power_stencil/command_processors/build.rb +16 -3
  16. data/lib/power_stencil/command_processors/check.rb +12 -0
  17. data/lib/power_stencil/command_processors/create.rb +6 -5
  18. data/lib/power_stencil/command_processors/delete.rb +23 -15
  19. data/lib/power_stencil/command_processors/edit.rb +4 -2
  20. data/lib/power_stencil/command_processors/init.rb +2 -2
  21. data/lib/power_stencil/command_processors/plugin.rb +20 -6
  22. data/lib/power_stencil/command_processors/root.rb +1 -1
  23. data/lib/power_stencil/command_processors/shell.rb +10 -3
  24. data/lib/power_stencil/dsl/entities.rb +0 -16
  25. data/lib/power_stencil/engine/build_handling.rb +1 -2
  26. data/lib/power_stencil/engine/directory_processor.rb +6 -1
  27. data/lib/power_stencil/engine/entities_definitions.rb +16 -7
  28. data/lib/power_stencil/engine/entities_handling.rb +1 -1
  29. data/lib/power_stencil/engine/project_engine.rb +6 -10
  30. data/lib/power_stencil/initializer.rb +4 -7
  31. data/lib/power_stencil/plugins/base.rb +18 -9
  32. data/lib/power_stencil/plugins/capabilities.rb +10 -8
  33. data/lib/power_stencil/plugins/command_line.rb +1 -4
  34. data/lib/power_stencil/plugins/config.rb +1 -5
  35. data/lib/power_stencil/plugins/entity_definitions.rb +15 -0
  36. data/lib/power_stencil/plugins/gem.rb +14 -35
  37. data/lib/power_stencil/plugins/paths.rb +38 -0
  38. data/lib/power_stencil/plugins/require.rb +10 -16
  39. data/lib/power_stencil/plugins/templates.rb +3 -3
  40. data/lib/power_stencil/project/base.rb +24 -9
  41. data/lib/power_stencil/project/config.rb +3 -2
  42. data/lib/power_stencil/project/create.rb +23 -2
  43. data/lib/power_stencil/project/git.rb +75 -0
  44. data/lib/power_stencil/project/info.rb +14 -1
  45. data/lib/power_stencil/project/paths.rb +22 -26
  46. data/lib/power_stencil/project/plugins.rb +18 -23
  47. data/lib/power_stencil/project/templates.rb +15 -22
  48. data/lib/power_stencil/system_entity_definitions/all.rb +2 -1
  49. data/lib/power_stencil/system_entity_definitions/buildable.rb +1 -1
  50. data/lib/power_stencil/system_entity_definitions/entity_override.rb +6 -0
  51. data/lib/power_stencil/system_entity_definitions/entity_project_common.rb +13 -5
  52. data/lib/power_stencil/system_entity_definitions/{has_associated_files.rb → entity_templates.rb} +2 -2
  53. data/lib/power_stencil/system_entity_definitions/project_config.rb +1 -1
  54. data/lib/power_stencil/system_entity_definitions/project_entity.rb +7 -0
  55. data/lib/power_stencil/system_entity_definitions/simple_exec.rb +3 -3
  56. data/lib/power_stencil/system_entity_definitions/source_provider.rb +15 -0
  57. data/lib/power_stencil/utils/gem_utils.rb +22 -2
  58. data/lib/power_stencil/version.rb +1 -1
  59. data/power_stencil.gemspec +2 -1
  60. metadata +23 -6
@@ -12,8 +12,10 @@ module PowerStencil
12
12
  def execute
13
13
  targets = targets_from_criteria analyse_extra_params, project.engine.root_universe
14
14
  targets.each do |target|
15
- securely_edit_file target.source_uri do |modified_path, _|
16
- modifications_valid? modified_path, target
15
+ project.track_action_with_git("Edited entity '#{target.as_path}'.") do
16
+ securely_edit_file target.source_uri do |modified_path, _|
17
+ modifications_valid? modified_path, target
18
+ end
17
19
  end
18
20
  end
19
21
  end
@@ -15,9 +15,9 @@ module PowerStencil
15
15
  def execute
16
16
  setup_project_path
17
17
  log_startup_context
18
- puts_and_logs "Creating new project structure in '#{config[:'project-path']}'"
18
+ puts_and_logs "Creating new project structure in '#{config[:'project-path']}'", check_verbose: false
19
19
  PowerStencil::Project::Base.create_project_tree config[:'project-path']
20
- puts_and_logs 'Done.'
20
+ puts_and_logs 'Done.', check_verbose: false
21
21
  end
22
22
 
23
23
  private
@@ -8,6 +8,16 @@ module PowerStencil
8
8
  include PowerStencil::Project::Proxy
9
9
 
10
10
  def execute
11
+
12
+ if config[:install]
13
+ config[:project_plugins].each do |plugin_definition|
14
+ gem_name, gem_req = PowerStencil::Plugins::Base.plugin_definition_to_name_and_req plugin_definition
15
+ specs = PowerStencil::Plugins::Base.install_gem gem_name, gem_req
16
+ spec = specs.first
17
+ puts "Installed plugin '#{spec.name}' (version: #{spec.version})"
18
+ end
19
+ return
20
+ end
11
21
 
12
22
  if config[:list]
13
23
  if project.plugins.empty?
@@ -15,10 +25,10 @@ module PowerStencil
15
25
  else
16
26
  puts "#{project.plugins.size} plugin#{project.plugins.size == 1 ? '' : 's'} found to be used in this project."
17
27
  end
18
- project.plugins.each do |plugin_name, plugin_def|
19
- puts " - #{plugin_name} (in '#{plugin_def.entry_point_path}')"
28
+ project.plugins.each do |_, plugin|
29
+ puts " - #{plugin.name} (in '#{plugin.plugin_path}')"
20
30
  if config[:verbose]
21
- plugin_def.capabilities.each do |name, value|
31
+ plugin.capabilities.each do |name, value|
22
32
  puts " #{name}: #{value}"
23
33
  end
24
34
  end
@@ -33,9 +43,13 @@ module PowerStencil
33
43
  end
34
44
  config.command_line_layer.extra_parameters.each do |plugin_name|
35
45
  begin
36
- target_path = File.join project.project_plugin_path(plugin_name)
37
- project.create_plugin_tree plugin_name, target_path
38
- puts "Generated new plugin '#{plugin_name}'"
46
+ target_path = File.join project.project_local_plugin_path(plugin_name)
47
+ msg = "Generated new local plugin '#{plugin_name}'."
48
+ project.track_action_with_git(msg) do
49
+ project.create_new_local_plugin_tree plugin_name, target_path
50
+ puts_and_logs msg, check_verbose: false
51
+ end
52
+
39
53
  rescue => e
40
54
  msg = "Could not create plugin '#{plugin_name}' because '#{e.message}'"
41
55
  puts msg
@@ -18,7 +18,7 @@ module PowerStencil
18
18
  unless config.command_line_layer.extra_parameters.empty?
19
19
  raise PowerStencil::Error, "Invalid command '#{config.command_line_layer.extra_parameters.first}'"
20
20
  end
21
- puts_and_logs 'No action specified. Exiting...'
21
+ puts_and_logs 'No action specified. Exiting...', check_verbose: false
22
22
  end
23
23
 
24
24
  end
@@ -8,6 +8,7 @@ module PowerStencil
8
8
  include Climatic::Proxy
9
9
  include PowerStencil::Project::Proxy
10
10
 
11
+
11
12
  def execute
12
13
 
13
14
  working_universe = if config[:compiled]
@@ -25,9 +26,15 @@ module PowerStencil
25
26
  puts config[:shell_dsl][:session_greetings]
26
27
  end
27
28
 
28
- Pry.start context,
29
- prompt: [proc { config[:shell_dsl][:prompt_level_1] }, proc { config[:shell_dsl][:prompt_level_2] }],
30
- quiet: true
29
+ msg = 'Changes done in PowerStencil shell session.'
30
+ project.track_action_with_git(msg,
31
+ user_validation_required: true,
32
+ validation_message: 'Would you like to commit your changes ?',
33
+ show_files_to_commit: true) do
34
+ Pry.start context,
35
+ prompt: [proc { config[:shell_dsl][:prompt_level_1] }, proc { config[:shell_dsl][:prompt_level_2] }],
36
+ quiet: true
37
+ end
31
38
 
32
39
  end
33
40
 
@@ -31,22 +31,6 @@ module PowerStencil
31
31
  PowerStencil.project.engine.entity type, name, @universe
32
32
  end
33
33
 
34
- # Need to implement a `replace` method which would rename files before...
35
- # def edit_entity(type, name)
36
- # tmp = Object.new
37
- # tmp.extend PowerStencil::Utils::FileEdit
38
- # org = entity(type, name)
39
- # unless org.nil?
40
- # mod = tmp.securely_edit_entity entity(type, name)
41
- # raise PowerStencil::Error "You cannot "
42
- #
43
- #
44
- # universe = org.universe
45
- # universe.delete org
46
- # universe.add mod
47
- # end
48
- # end
49
-
50
34
  def entities(criterion: nil, value: nil, &filter_block)
51
35
  PowerStencil.project.engine.entities @universe, criterion: criterion, value: value, &filter_block
52
36
  end
@@ -39,8 +39,7 @@ module PowerStencil
39
39
  build_entity entity_to_build, build_entity_target_path
40
40
 
41
41
  entity_build_report << 'Ok'
42
- rescue => e
43
- logger.error "Failed building '#{entity_to_build.as_path}' because '#{e.message}' !"
42
+ rescue SyntaxError, StandardError => e
44
43
  entity_build_report << e.message
45
44
  if fail_on_error
46
45
  raise e
@@ -97,7 +97,12 @@ module PowerStencil
97
97
  raise PowerStencil::Error, "File '#{source}' is supposed to be rendered using '#{engine_name}', but seems not to be supported !"
98
98
  end
99
99
  context = running_context universe, main_entry_point: main_entry_point
100
- return send templating_engine_method_name, source, context
100
+ begin
101
+ return send templating_engine_method_name, source, context
102
+ rescue StandardError, SyntaxError => e
103
+ logger.puts_and_logs "Error rendering #{engine_name} template '#{source}'", logs_as: :error, check_verbose: false
104
+ raise e
105
+ end
101
106
  end
102
107
  end
103
108
  logger.warn "File '#{source}' was supposed to be processed but there is no template engine defined ! Applying simple copy."
@@ -7,7 +7,7 @@ module PowerStencil
7
7
 
8
8
  include PowerStencil::Utils::SecureRequire
9
9
 
10
- def require_definition_files(files_or_dirs)
10
+ def require_definition_files(files_or_dirs, source)
11
11
  required_files = []
12
12
  files_or_dirs.each do |file_or_dir|
13
13
  if File.directory? file_or_dir and File.readable? file_or_dir
@@ -21,21 +21,30 @@ module PowerStencil
21
21
  next
22
22
  end
23
23
  # This is a ruby library or there is something wrong
24
- securely_require file_or_dir
25
- # unless securely_require file_or_dir
26
- # logger.warn "While trying to load definition files, found that '#{file_or_dir}' has a problem. Ignored..."
27
- # end
24
+ securely_require_with_entity_class_detection file_or_dir, source
25
+
28
26
  end
29
- required_files.sort!.each {|file| securely_require file, fail_on_error: true}
27
+ required_files.sort!.each { |file| securely_require_with_entity_class_detection file, source }
30
28
  required_files
31
29
  end
32
30
 
33
31
  private
34
32
 
35
33
  def load_system_entities_definition
36
- require_definition_files [SYSTEM_ENTITY_DEFINITION_ENTRY_POINT]
34
+ require_definition_files [SYSTEM_ENTITY_DEFINITION_ENTRY_POINT], PowerStencil
37
35
  end
38
36
 
37
+ def securely_require_with_entity_class_detection(entity_definition_file_path, source)
38
+ before = PowerStencil::Engine::EntitiesHandling.all_types
39
+ securely_require entity_definition_file_path, fail_on_error: true
40
+ after = PowerStencil::Engine::EntitiesHandling.all_types
41
+ after.reject { |k, _| before.keys.include? k }
42
+ .each do |_, plugin_entity_class|
43
+ plugin_entity_class.instance_eval do
44
+ @entity_type_source_provider = source
45
+ end
46
+ end
47
+ end
39
48
  end
40
49
 
41
50
  end
@@ -59,7 +59,7 @@ module PowerStencil
59
59
  raise PowerStencil::Error, "Unknown entity type: '#{type}'"
60
60
  end
61
61
  fields[:name] = fields[:name].to_s
62
- res = @available_entities_hash[type.to_sym].new fields: fields, universe: work_universe
62
+ res = @available_entities_hash[type.to_sym].new fields: fields, universe: work_universe, user: user
63
63
  logger.debug "Created new '#{type}': \n#{fields.to_yaml}"
64
64
  work_universe.add res
65
65
  if work_universe == PowerStencil.project.engine.root_universe
@@ -36,7 +36,7 @@ module PowerStencil
36
36
  if Dir.exist? dir and File.readable? dir
37
37
  logger.info 'Loading project specific entity definitions.'
38
38
  $LOAD_PATH << dir
39
- require_definition_files [dir]
39
+ require_definition_files [dir], project
40
40
  end
41
41
  end
42
42
 
@@ -62,24 +62,20 @@ module PowerStencil
62
62
  end
63
63
 
64
64
  def load_project_entities
65
- logger.debug 'Loading project entities - NOT IMPLEMENTED'
66
65
  root_universe.import project.project_entities_path, stop_on_error: false do |new_entity|
67
- process_entity new_entity
66
+ logger.debug "Loaded entity: '#{new_entity.as_path}'"
68
67
  end
69
68
  end
70
69
 
71
70
  def load_user_entities
72
- logger.debug 'Loading user entities - NOT IMPLEMENTED'
73
71
  root_universe.import project.user_entities_path, stop_on_error: false do |new_entity|
74
- process_entity new_entity
72
+ logger.debug "Loaded unversioned entity: '#{new_entity.as_path}'"
73
+ new_entity.instance_eval do
74
+ @is_versioned_entity = false
75
+ end
75
76
  end
76
77
  end
77
78
 
78
- def process_entity(entity)
79
- logger.debug "New entity: '#{entity.name}' (#{entity.type})"
80
- end
81
-
82
-
83
79
  end
84
80
 
85
81
  end
@@ -8,17 +8,15 @@ module PowerStencil
8
8
 
9
9
  include Climatic::Proxy
10
10
 
11
+ def name
12
+ 'PowerStencil core'
13
+ end
14
+
11
15
  def bootstrap(cmd_line_args = ARGV.dup)
12
16
  setup_climatic cmd_line_args
13
17
  logger.debug 'Starting PowerStencil initialization...'
14
18
  setup_system_processors
15
19
  setup_universe_compiler_logger
16
- # @project = try_to_load_project fail_on_error: false
17
- begin
18
- project.setup_templates_for_entities # unless project.nil?
19
- rescue => e
20
- logger.debug PowerStencil::Error.report_error e
21
- end
22
20
  logger.debug 'PowerStencil initialization complete'
23
21
  end
24
22
 
@@ -32,7 +30,6 @@ module PowerStencil
32
30
 
33
31
  def try_to_load_project(fail_on_error: true)
34
32
  PowerStencil::Project::Base.instantiate_from_config config
35
-
36
33
  end
37
34
 
38
35
  def setup_system_processors
@@ -1,3 +1,4 @@
1
+ require 'power_stencil/plugins/paths'
1
2
  require 'power_stencil/plugins/type'
2
3
  require 'power_stencil/plugins/config'
3
4
  require 'power_stencil/plugins/command_line'
@@ -19,6 +20,7 @@ module PowerStencil
19
20
 
20
21
  include Climatic::Proxy
21
22
  include PowerStencil::Plugins::Type
23
+ include PowerStencil::Plugins::Paths
22
24
  include PowerStencil::Plugins::Config
23
25
  include PowerStencil::Plugins::CommandLine
24
26
  include PowerStencil::Plugins::Require
@@ -28,27 +30,34 @@ module PowerStencil
28
30
  include PowerStencil::Plugins::Build
29
31
  include PowerStencil::Plugins::Dsl
30
32
 
31
- attr_reader :name, :version, :entry_point_path
33
+ attr_reader :name, :version, :entry_point_path, :gem_spec
32
34
 
33
- def initialize(name, project, type = :local)
35
+ def initialize(name, project, type: :local, gem_req: nil)
34
36
  @name = name
35
37
  @project = project
36
38
  @version = PowerStencil::Utils::SemanticVersion.new '0.0.0-not-specified'
37
39
  raise PowerStencil::Error, "Invalid plugin type (#{type}) for plugin '#{name}'" unless PLUGIN_TYPES.include? type
38
40
  @type = type
41
+ case type
42
+ when :gem
43
+ logger.debug "Plugin '#{name}' is provided as a Gem."
44
+ @gem_spec = PowerStencil::Plugins::Base.find_locally_installed_gem_spec name, gem_req
45
+ raise PowerStencil::Error, "Cannot find plugin '#{name}'. Try 'power_stencil plugin --install'" if gem_spec.nil?
46
+ raise PowerStencil::Error, "Invalid plugin '#{name}' ! Missing metadata 'plugin_name' in spec !" if gem_spec.metadata['plugin_name'].nil?
47
+ logger.debug "Plugin '#{name}' real name is '#{gem_spec.metadata['plugin_name']}'."
48
+ @name = gem_spec.metadata['plugin_name']
49
+ when :local
50
+ logger.debug "Plugin '#{name}' is provided locally by the project."
51
+ else
52
+ raise PowerStencil::Error, "Unsupported plugin type (#{type}) for plugin '#{name}' !"
53
+ end
54
+
39
55
  logger.debug "Loading plugin '#{name}'..."
40
56
  setup_plugin
41
57
  logger.info "Plugin '#{name}' successfully available"
42
58
  logger.debug "Plugin '#{name}' has following capabilities: #{capabilities.inspect}"
43
59
  end
44
60
 
45
- def path
46
- case type
47
- when :local
48
- project.project_plugin_path(name)
49
- end
50
- end
51
-
52
61
  def plugin_module
53
62
  Object.const_get plugin_definition[:plugin_module]
54
63
  end
@@ -9,10 +9,6 @@ module PowerStencil
9
9
 
10
10
  attr_reader :plugin_definition
11
11
 
12
- def plugin_capabilities_definition_file
13
- project.plugin_capabilities_definition_file self.name
14
- end
15
-
16
12
  def capabilities
17
13
  @capabilities ||= CAPABILITIES.dup.zip([false] * CAPABILITIES.size).to_h
18
14
  end
@@ -24,11 +20,17 @@ module PowerStencil
24
20
  unless File.exists? yaml_file and File.file? yaml_file and File.readable? yaml_file
25
21
  raise PowerStencil::Error, "Plugin '#{self.name}' has no definition file !"
26
22
  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
23
+ logger.debug "Loading plugin '#{self.name}' capabilities..."
24
+ begin
25
+ @plugin_definition = yaml_file_to_hash yaml_file
26
+ %i(processors entity_definitions templates build dsl).each do |capability|
27
+ unless plugin_definition[capability].nil? or plugin_definition[capability].empty?
28
+ capabilities[capability] = true
29
+ end
31
30
  end
31
+ rescue => e
32
+ logger.debug PowerStencil::Error.report_error(e)
33
+ raise PowerStencil::Error, "Invalid plugin capabilities file '#{yaml_file}' for plugin '#{self.name}'"
32
34
  end
33
35
 
34
36
  end
@@ -5,9 +5,6 @@ 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
8
 
12
9
  def register_processors
13
10
  plugin_definition[:processors].each do |processors_name, processor|
@@ -20,7 +17,7 @@ module PowerStencil
20
17
  private
21
18
 
22
19
  def load_yaml_command_definition
23
- yaml_file = plugin_commands_line_definition_file
20
+ yaml_file = plugin_command_line_definition_file
24
21
  if File.exists? yaml_file and File.file? yaml_file and File.readable? yaml_file
25
22
  logger.info "Adding extra command line definition for '#{name}' plugin..."
26
23
  @plugin_command_line_modifier = project.yaml_file_to_hash yaml_file
@@ -3,17 +3,13 @@ module PowerStencil
3
3
 
4
4
  module Config
5
5
 
6
- def plugin_config_specific_file
7
- project.plugin_config_specific_file self.name
8
- end
9
-
10
6
  private
11
7
 
12
8
  def load_plugin_specific_config
13
9
  yaml_file = plugin_config_specific_file
14
10
  if File.exists? yaml_file and File.file? yaml_file and File.readable? yaml_file
15
11
  logger.info "Found plugin specific config in plugin '#{self.name}'. Attempting to load..."
16
- project.add_plugin_config self.name
12
+ project.add_plugin_config self
17
13
  capabilities[:config] = true
18
14
  end
19
15
  rescue => e
@@ -6,9 +6,24 @@ module PowerStencil
6
6
  def require_plugin_entity_definitions
7
7
  return unless capabilities[:entity_definitions]
8
8
  logger.info "Requiring '#{self.name}' plugin entity definitions..."
9
+ securely_require_with_entity_class_detection
10
+ end
11
+
12
+
13
+ private
14
+
15
+ def securely_require_with_entity_class_detection
16
+ before = PowerStencil::Engine::EntitiesHandling.all_types
9
17
  plugin_definition[:entity_definitions].each do |entity_definition_file_path|
10
18
  securely_require entity_definition_file_path, fail_on_error: true
11
19
  end
20
+ after = PowerStencil::Engine::EntitiesHandling.all_types
21
+ after.reject { |k, _| before.keys.include? k }.each do |_, plugin_entity_class|
22
+ plugin = self
23
+ plugin_entity_class.instance_eval do
24
+ @entity_type_source_provider = plugin
25
+ end
26
+ end
12
27
  end
13
28
 
14
29
  end
@@ -5,50 +5,29 @@ module PowerStencil
5
5
 
6
6
  module Gem
7
7
 
8
+ include PowerStencil::Utils::GemUtils
9
+
8
10
  NO_DOC = %w(--no-document).freeze
9
11
 
10
- def gem_locally_installed?(plugin_name, plugin_requirements)
11
- get_spec(plugin_name, plugin_requirements).nil? ? false : true
12
- end
13
12
 
13
+ def is_available_gem?(gem_name)
14
14
 
15
- def install_gem(plugin_name, plugin_requirements)
16
- cmd = ::Gem::Commands::InstallCommand.new
17
- opts = [plugin_name]
18
- opts << plugin_requirements unless plugin_requirements.empty?
19
- opts.concat NO_DOC
20
- cmd.handle_options opts
21
- PowerStencil.logger.debug "Installing plugin '#{plugin_name}'..."
22
- cmd.execute
23
- PowerStencil.logger.debug "Plugin '#{plugin_name}' successfully installed."
24
- rescue ::Gem::SystemExitException => e
25
- PowerStencil.logger.warn PowerStencil::Error.report_error(e)
26
15
  end
27
16
 
17
+ def install_gem(plugin_name, plugin_requirements)
18
+ ::Gem.install plugin_name, plugin_requirements
19
+ end
28
20
 
29
21
 
30
- private
31
-
32
- def get_spec(plugin_name, plugin_requirements)
33
- candidates = ::Gem::Specification.find_all_by_name plugin_name
34
- if candidates.empty?
35
- PowerStencil.logger.debug "Could not find required plugin '#{plugin_name}'"
36
- return nil
37
- end
38
-
39
- req = if plugin_requirements.nil? or plugin_requirements.empty?
40
- ::Gem::Requirement::DefaultRequirement
41
- else
42
- ::Gem::Requirement.create plugin_requirements
43
- end
44
-
45
- selected = candidates.select {|candidate| req.satisfied_by? candidate.version}.sort {|a, b| a.version <=> b.version}
46
- if candidates.empty?
47
- PowerStencil.logger.debug "Could not find required plugin '#{plugin_name}'"
48
- return nil
49
- end
50
- selected.last
51
22
 
23
+ def find_locally_installed_gem_spec(gem_name, gem_requirements = ::Gem::Requirement.default)
24
+ # Normal method to find gem_spec doesn't work in the context of bundler !!
25
+ # candidates = ::Gem::Specification.find_all_by_name gem_name
26
+ candidates = find_gemspec_manually(gem_name)
27
+ .select {|candidate| gem_requirements.satisfied_by? candidate.version}
28
+ .sort {|a, b| a.version <=> b.version}
29
+ PowerStencil.logger.error "Could not find required plugin '#{gem_name}'" if candidates.empty?
30
+ candidates.last
52
31
  end
53
32
 
54
33
  end