power_stencil 0.8.9 → 0.8.14
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.
- checksums.yaml +4 -4
- data/etc/meta_templates/plugin_seed/README.md +118 -0
- data/etc/meta_templates/plugin_seed/psplugin_{entity}.gemspec +20 -5
- data/etc/meta_templates/plugin_seed/spec/spec_helper.rb +15 -0
- data/etc/meta_templates/plugin_seed/spec/{entity}_spec.rb +10 -0
- data/etc/power_stencil.yaml +1 -0
- data/etc/templates/plugin_definition/README.md +95 -20
- data/etc/templates/plugin_definition/psplugin_{entity}.gemspec +20 -5
- data/etc/templates/plugin_definition/spec/spec_helper.rb +2 -1
- data/etc/templates/plugin_definition/spec/{entity}_spec.rb +4 -3
- data/etc/templates/zsh_command_line_completion/_power_stencil.sh.erb +18 -8
- data/lib/power_stencil.rb +4 -0
- data/lib/power_stencil/command_processors/adm.rb +29 -1
- data/lib/power_stencil/dsl/completion.rb +37 -0
- data/lib/power_stencil/dsl/plugin_generation.rb +4 -0
- data/lib/power_stencil/engine/build_handling.rb +5 -0
- data/lib/power_stencil/engine/directory_processor.rb +18 -1
- data/lib/power_stencil/engine/entities_handling.rb +2 -2
- data/lib/power_stencil/initializer.rb +13 -2
- data/lib/power_stencil/plugins/command_line.rb +3 -1
- data/lib/power_stencil/project/completion.rb +3 -5
- data/lib/power_stencil/ultra_command_line/command_line_manager.rb +35 -0
- data/lib/power_stencil/ultra_command_line/option_definition.rb +5 -0
- data/lib/power_stencil/ultra_command_line/providers_manager.rb +21 -0
- data/lib/power_stencil/ultra_command_line/sub_command.rb +12 -0
- data/lib/power_stencil/utils/completion.rb +19 -9
- data/lib/power_stencil/version.rb +1 -1
- data/power_stencil.gemspec +1 -1
- metadata +18 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 953c643a9a919791eeb8dc12c8e725c2a8ab80c6
|
4
|
+
data.tar.gz: 8231bae8f9f3d2fe16987b758ffcc8e22be3f295
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dfede811fa8dc0efc67e158abf08e93aac47fb327c6642fff344d6caa0bb7b908443ad31bc229c9b165ab3868c1f311adb63c7d24d168e5fbef98b09495634a4
|
7
|
+
data.tar.gz: 1b962bde64576cc9cb8a20f272a048289e42caf212d4fa63814c778fb672e1b0e137ff3dcedb3ecfab6a30488942f1db37e26eceb8b2e687a39156ec13419268
|
@@ -0,0 +1,118 @@
|
|
1
|
+
<% gem_name = "psplugin_#{ plugin_name}" -%>
|
2
|
+
<%= plugin_title_name %>
|
3
|
+
<%= '=' * plugin_title_name.size %>
|
4
|
+
|
5
|
+
[](https://rubygems.org/gems/<%= gem_name %>) [](https://gitlab.com/tools4devops/psplugins/<%= gem_name %>/commits/master)
|
6
|
+
|
7
|
+
[PowerStencil] is the Swiss-army knife templating workflow for developers and ops.
|
8
|
+
|
9
|
+
`<%= plugin_title_name %>` is a [PowerStencil] plugin.
|
10
|
+
|
11
|
+
See [official website][PowerStencil site].
|
12
|
+
|
13
|
+
|
14
|
+
<!-- TOC -->
|
15
|
+
|
16
|
+
- [What is a PowerStencil plugin ?](#what-is-a-powerstencil-plugin-)
|
17
|
+
- [Using this plugin in your `PowerStencil` projects](#using-this-plugin-in-your-powerstencil-projects)
|
18
|
+
- [Goal of this plugin](#goal-of-this-plugin)
|
19
|
+
- [Plugin capabilities](#plugin-capabilities)
|
20
|
+
- [Config](#config)
|
21
|
+
- [Subcommands and options](#subcommands-and-options)
|
22
|
+
- [Post-build actions](#post-build-actions)
|
23
|
+
- [DSL in templates and in `power_stencil shell`](#dsl-in-templates-and-in-power_stencil-shell)
|
24
|
+
- [Entity types](#entity-types)
|
25
|
+
- [Templates-templates](#templates-templates)
|
26
|
+
- [Contributing](#contributing)
|
27
|
+
- [License](#license)
|
28
|
+
- [Code of Conduct](#code-of-conduct)
|
29
|
+
|
30
|
+
<!-- /TOC -->
|
31
|
+
|
32
|
+
# What is a PowerStencil plugin ?
|
33
|
+
|
34
|
+
A `PowerStencil` plugin can be used in the context of a `PowerStencil` project and bring extra features to a standard project.
|
35
|
+
|
36
|
+
If you don't know what `PowerStencil` is made for, you may read [the documentation][PowerStencil] first.
|
37
|
+
|
38
|
+
Features provided by a plugin can be:
|
39
|
+
|
40
|
+
* Extra config.
|
41
|
+
* Extra subcommands or options added to the `power_stencil` command-line.
|
42
|
+
* Extra post-build actions.
|
43
|
+
* Extra DSL methods available in templates and in `power_stencil shell`.
|
44
|
+
* Extra entity types.
|
45
|
+
* Extra templates-templates.
|
46
|
+
|
47
|
+
# Using this plugin in your `PowerStencil` projects
|
48
|
+
|
49
|
+
To use this plugin within your `PowerStencil` project, you need to:
|
50
|
+
|
51
|
+
* be within a `PowerStencil` project :wink:.
|
52
|
+
* declare this plugin in the project configuration (from the root of your project in the `.ps_project/versioned-config.yaml` file).
|
53
|
+
|
54
|
+
In this yaml configuration file, you just have to add a new entry in the `:project_plugins` array or simply create it if it is not yet existing:
|
55
|
+
|
56
|
+
```yaml
|
57
|
+
:project_plugins:
|
58
|
+
- <%= gem_name %>
|
59
|
+
```
|
60
|
+
If this plugin is not already present on your machine, you may have to download it:
|
61
|
+
|
62
|
+
$ power_stencil plugin --install
|
63
|
+
|
64
|
+
And then you may see information about the plugin by running:
|
65
|
+
|
66
|
+
* `power_stencil info` in the plugins section.
|
67
|
+
* `power_stencil plugin --list -v`
|
68
|
+
|
69
|
+
# Goal of this plugin
|
70
|
+
|
71
|
+
# Plugin capabilities
|
72
|
+
|
73
|
+
This plugin provides the following features:
|
74
|
+
|
75
|
+
## Config
|
76
|
+
|
77
|
+
## Subcommands and options
|
78
|
+
|
79
|
+
## Post-build actions
|
80
|
+
|
81
|
+
## DSL in templates and in `power_stencil shell`
|
82
|
+
|
83
|
+
## Entity types
|
84
|
+
|
85
|
+
## Templates-templates
|
86
|
+
|
87
|
+
|
88
|
+
# Contributing
|
89
|
+
|
90
|
+
Bug reports and pull requests are welcome on Gitlab at https://gitlab.com/tools4devops/psplugins/<%= plugin_name %>/issues. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
91
|
+
|
92
|
+
## License
|
93
|
+
|
94
|
+
The gem is available as open source under the terms of the [MIT License].
|
95
|
+
|
96
|
+
## Code of Conduct
|
97
|
+
|
98
|
+
Everyone interacting in the PowerStencil project’s codebase, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct].
|
99
|
+
|
100
|
+
<!-- End of Document -->
|
101
|
+
|
102
|
+
<!-- Pages -->
|
103
|
+
[code of conduct]: CODE_OF_CONDUCT.md
|
104
|
+
|
105
|
+
<!-- Code links -->
|
106
|
+
|
107
|
+
<!-- Illustrations -->
|
108
|
+
[simple-flow-image]: doc/images/power-stencil-simple-flow.svg
|
109
|
+
|
110
|
+
<!-- External links -->
|
111
|
+
[MIT License]: http://opensource.org/licenses/MIT "The MIT license"
|
112
|
+
[ERB]: https://ruby-doc.org/stdlib-2.6.3/libdoc/erb/rdoc/ERB.html "Quick ERB description"
|
113
|
+
[Haml]: http://haml.info/ "The templating engine for XML-like documents"
|
114
|
+
[Ruby]: https://www.ruby-lang.org "The powerful Ruby language"
|
115
|
+
[Rails]: https://rubyonrails.org/ "The Ruby on Rails framework"
|
116
|
+
[PowerStencil site]: https://powerstencil.brizone.org "Official PowerStencil website"
|
117
|
+
[PowerStencil]: https://gitlab.com/tools4devops/power_stencil/blob/master/README.md "PowerStencil documentation"
|
118
|
+
[PowerStencil plugins]: https://gitlab.com/tools4devops/power_stencil/blob/master/doc/plugins.md "PowerStencil plugins documentation"
|
@@ -12,13 +12,27 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.summary = %q{<%= plugin_name %> is a plugin for the PowerStencil framework.}
|
13
13
|
spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
14
|
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
15
|
-
spec.license =
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
17
|
+
# Change this and following metadata if you don't want your plugin to be an "official" PowerStencil plugin.
|
18
|
+
# ie deployed to https://gitlab.com/tools4devops/psplugins
|
19
|
+
source_code_uri = 'https://gitlab.com/tools4devops/psplugins/<%= plugin_name %>'
|
20
|
+
|
21
|
+
# Gem metadata
|
19
22
|
if spec.respond_to?(:metadata)
|
23
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
24
|
+
# to allow pushing to a single host or delete this line to allow pushing to any host.
|
20
25
|
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
21
|
-
|
26
|
+
|
27
|
+
# Nice link to your home page on rubygems.org
|
28
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
29
|
+
|
30
|
+
# You have to probably change this if you don't deploy to gitlab
|
31
|
+
spec.metadata['bug_tracker_uri'] = "#{source_code_uri}/issues"
|
32
|
+
spec.metadata['documentation_uri'] = "#{source_code_uri}/blob/master/README.md"
|
33
|
+
spec.metadata['source_code_uri'] = source_code_uri
|
34
|
+
|
35
|
+
# This metadata is mandatory for a PowerStencil plugin !!
|
22
36
|
spec.metadata['plugin_name'] = '<%= plugin_name %>'
|
23
37
|
else
|
24
38
|
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes and PowerStencil plugin mechanism !'
|
@@ -31,8 +45,9 @@ Gem::Specification.new do |spec|
|
|
31
45
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
46
|
spec.require_paths = ['lib']
|
33
47
|
|
34
|
-
spec.add_development_dependency 'bundler'
|
48
|
+
spec.add_development_dependency 'bundler'
|
35
49
|
spec.add_development_dependency 'rake', '~> 10.0'
|
36
50
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
37
51
|
spec.add_development_dependency 'power_stencil', "~> <%= PowerStencil::VERSION %>"
|
52
|
+
|
38
53
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
require 'power_stencil'
|
3
|
+
require "<%= plugin_name %>"
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# Enable flags like --only-failures and --next-failure
|
7
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
8
|
+
|
9
|
+
# Disable RSpec exposing methods globally on `Module` and `main`
|
10
|
+
config.disable_monkey_patching!
|
11
|
+
|
12
|
+
config.expect_with :rspec do |c|
|
13
|
+
c.syntax = :expect
|
14
|
+
end
|
15
|
+
end
|
data/etc/power_stencil.yaml
CHANGED
@@ -1,43 +1,118 @@
|
|
1
|
-
#
|
1
|
+
<% gem_name = "psplugin_#{ plugin_name}" -%>
|
2
|
+
<%= plugin_title_name %>
|
3
|
+
<%= '=' * plugin_title_name.size %>
|
2
4
|
|
3
|
-
|
5
|
+
[](https://rubygems.org/gems/<%= gem_name %>) [](https://gitlab.com/tools4devops/psplugins/<%= gem_name %>/commits/master)
|
4
6
|
|
5
|
-
|
7
|
+
[PowerStencil] is the Swiss-army knife templating workflow for developers and ops.
|
6
8
|
|
7
|
-
|
9
|
+
`<%= plugin_title_name %>` is a [PowerStencil] plugin.
|
8
10
|
|
9
|
-
|
11
|
+
See [official website][PowerStencil site].
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
+
|
14
|
+
<!-- TOC -->
|
15
|
+
|
16
|
+
- [What is a PowerStencil plugin ?](#what-is-a-powerstencil-plugin-)
|
17
|
+
- [Using this plugin in your `PowerStencil` projects](#using-this-plugin-in-your-powerstencil-projects)
|
18
|
+
- [Goal of this plugin](#goal-of-this-plugin)
|
19
|
+
- [Plugin capabilities](#plugin-capabilities)
|
20
|
+
- [Config](#config)
|
21
|
+
- [Subcommands and options](#subcommands-and-options)
|
22
|
+
- [Post-build actions](#post-build-actions)
|
23
|
+
- [DSL in templates and in `power_stencil shell`](#dsl-in-templates-and-in-power_stencil-shell)
|
24
|
+
- [Entity types](#entity-types)
|
25
|
+
- [Templates-templates](#templates-templates)
|
26
|
+
- [Contributing](#contributing)
|
27
|
+
- [License](#license)
|
28
|
+
- [Code of Conduct](#code-of-conduct)
|
29
|
+
|
30
|
+
<!-- /TOC -->
|
31
|
+
|
32
|
+
# What is a PowerStencil plugin ?
|
33
|
+
|
34
|
+
A `PowerStencil` plugin can be used in the context of a `PowerStencil` project and bring extra features to a standard project.
|
35
|
+
|
36
|
+
If you don't know what `PowerStencil` is made for, you may read [the documentation][PowerStencil] first.
|
37
|
+
|
38
|
+
Features provided by a plugin can be:
|
39
|
+
|
40
|
+
* Extra config.
|
41
|
+
* Extra subcommands or options added to the `power_stencil` command-line.
|
42
|
+
* Extra post-build actions.
|
43
|
+
* Extra DSL methods available in templates and in `power_stencil shell`.
|
44
|
+
* Extra entity types.
|
45
|
+
* Extra templates-templates.
|
46
|
+
|
47
|
+
# Using this plugin in your `PowerStencil` projects
|
48
|
+
|
49
|
+
To use this plugin within your `PowerStencil` project, you need to:
|
50
|
+
|
51
|
+
* be within a `PowerStencil` project :wink:.
|
52
|
+
* declare this plugin in the project configuration (from the root of your project in the `.ps_project/versioned-config.yaml` file).
|
53
|
+
|
54
|
+
In this yaml configuration file, you just have to add a new entry in the `:project_plugins` array or simply create it if it is not yet existing:
|
55
|
+
|
56
|
+
```yaml
|
57
|
+
:project_plugins:
|
58
|
+
- <%= gem_name %>
|
13
59
|
```
|
60
|
+
If this plugin is not already present on your machine, you may have to download it:
|
61
|
+
|
62
|
+
$ power_stencil plugin --install
|
63
|
+
|
64
|
+
And then you may see information about the plugin by running:
|
65
|
+
|
66
|
+
* `power_stencil info` in the plugins section.
|
67
|
+
* `power_stencil plugin --list -v`
|
68
|
+
|
69
|
+
# Goal of this plugin
|
14
70
|
|
15
|
-
|
71
|
+
# Plugin capabilities
|
16
72
|
|
17
|
-
|
73
|
+
This plugin provides the following features:
|
18
74
|
|
19
|
-
|
75
|
+
## Config
|
20
76
|
|
21
|
-
|
77
|
+
## Subcommands and options
|
22
78
|
|
23
|
-
##
|
79
|
+
## Post-build actions
|
24
80
|
|
25
|
-
|
81
|
+
## DSL in templates and in `power_stencil shell`
|
26
82
|
|
27
|
-
##
|
83
|
+
## Entity types
|
28
84
|
|
29
|
-
|
85
|
+
## Templates-templates
|
30
86
|
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
87
|
|
33
|
-
|
88
|
+
# Contributing
|
34
89
|
|
35
|
-
Bug reports and pull requests are welcome on
|
90
|
+
Bug reports and pull requests are welcome on Gitlab at https://gitlab.com/tools4devops/psplugins/<%= plugin_name %>/issues. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
91
|
|
37
92
|
## License
|
38
93
|
|
39
|
-
The gem is available as open source under the terms of the [MIT License]
|
94
|
+
The gem is available as open source under the terms of the [MIT License].
|
40
95
|
|
41
96
|
## Code of Conduct
|
42
97
|
|
43
|
-
Everyone interacting in the
|
98
|
+
Everyone interacting in the PowerStencil project’s codebase, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct].
|
99
|
+
|
100
|
+
<!-- End of Document -->
|
101
|
+
|
102
|
+
<!-- Pages -->
|
103
|
+
[code of conduct]: CODE_OF_CONDUCT.md
|
104
|
+
|
105
|
+
<!-- Code links -->
|
106
|
+
|
107
|
+
<!-- Illustrations -->
|
108
|
+
[simple-flow-image]: doc/images/power-stencil-simple-flow.svg
|
109
|
+
|
110
|
+
<!-- External links -->
|
111
|
+
[MIT License]: http://opensource.org/licenses/MIT "The MIT license"
|
112
|
+
[ERB]: https://ruby-doc.org/stdlib-2.6.3/libdoc/erb/rdoc/ERB.html "Quick ERB description"
|
113
|
+
[Haml]: http://haml.info/ "The templating engine for XML-like documents"
|
114
|
+
[Ruby]: https://www.ruby-lang.org "The powerful Ruby language"
|
115
|
+
[Rails]: https://rubyonrails.org/ "The Ruby on Rails framework"
|
116
|
+
[PowerStencil site]: https://powerstencil.brizone.org "Official PowerStencil website"
|
117
|
+
[PowerStencil]: https://gitlab.com/tools4devops/power_stencil/blob/master/README.md "PowerStencil documentation"
|
118
|
+
[PowerStencil plugins]: https://gitlab.com/tools4devops/power_stencil/blob/master/doc/plugins.md "PowerStencil plugins documentation"
|
@@ -12,13 +12,27 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.summary = %q{<%= plugin_name %> is a plugin for the PowerStencil framework.}
|
13
13
|
spec.description = %q{TODO: Write a longer description or delete this line.}
|
14
14
|
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
15
|
-
spec.license =
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
17
|
+
# Change this and following metadata if you don't want your plugin to be an "official" PowerStencil plugin.
|
18
|
+
# ie deployed to https://gitlab.com/tools4devops/psplugins
|
19
|
+
source_code_uri = 'https://gitlab.com/tools4devops/psplugins/<%= plugin_name %>'
|
20
|
+
|
21
|
+
# Gem metadata
|
19
22
|
if spec.respond_to?(:metadata)
|
23
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
24
|
+
# to allow pushing to a single host or delete this line to allow pushing to any host.
|
20
25
|
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
|
21
|
-
|
26
|
+
|
27
|
+
# Nice link to your home page on rubygems.org
|
28
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
29
|
+
|
30
|
+
# You have to probably change this if you don't deploy to gitlab
|
31
|
+
spec.metadata['bug_tracker_uri'] = "#{source_code_uri}/issues"
|
32
|
+
spec.metadata['documentation_uri'] = "#{source_code_uri}/blob/master/README.md"
|
33
|
+
spec.metadata['source_code_uri'] = source_code_uri
|
34
|
+
|
35
|
+
# This metadata is mandatory for a PowerStencil plugin !!
|
22
36
|
spec.metadata['plugin_name'] = '<%= plugin_name %>'
|
23
37
|
else
|
24
38
|
raise 'RubyGems 2.0 or newer is required to protect against public gem pushes and PowerStencil plugin mechanism !'
|
@@ -31,8 +45,9 @@ Gem::Specification.new do |spec|
|
|
31
45
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
46
|
spec.require_paths = ['lib']
|
33
47
|
|
34
|
-
spec.add_development_dependency 'bundler'
|
48
|
+
spec.add_development_dependency 'bundler'
|
35
49
|
spec.add_development_dependency 'rake', '~> 10.0'
|
36
50
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
37
51
|
spec.add_development_dependency 'power_stencil', "~> <%= PowerStencil::VERSION %>"
|
52
|
+
|
38
53
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
RSpec.describe <%= plugin_module_name %> do
|
2
|
-
it
|
2
|
+
it 'has a version number' do
|
3
3
|
expect(<%= plugin_module_name %>::VERSION).not_to be nil
|
4
4
|
end
|
5
5
|
|
6
|
-
it
|
7
|
-
|
6
|
+
it 'does something useful' do
|
7
|
+
pending 'Tests implementation'
|
8
|
+
RSpec.fail
|
8
9
|
end
|
9
10
|
end
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
# zsh shell completion script for <%= script_name %>
|
4
4
|
# To regenerate this file: '<%= script_name %> adm --zsh-completion'
|
5
|
-
# Generated
|
5
|
+
# Generated<%= timestamp %> by <%= script_name %> v<%= PowerStencil::VERSION %>
|
6
6
|
|
7
|
-
<% commands =
|
8
|
-
_<%= script_name %>() {
|
7
|
+
<% commands = context_commands -%>
|
8
|
+
_<%= script_name %>_first_level() {
|
9
9
|
local cmd
|
10
10
|
local <%= script_name %>_sub_commands
|
11
11
|
<%= script_name %>_sub_commands=(<%= commands.reject { |c| c.name.empty? }.sort { |a,b| a.name <=> b.name }.map(&:name).join ' ' %>)
|
@@ -21,7 +21,7 @@ _<%= script_name %>() {
|
|
21
21
|
(( $+functions[_<%= script_name %>_cmd_$cmd] )) && _<%= script_name %>_cmd_$cmd
|
22
22
|
else
|
23
23
|
_values : \
|
24
|
-
<%= continued_multilines(root_command
|
24
|
+
<%= continued_multilines(context_options(root_command commands).sort { |a,b| a.name <=> b.name }.map {|o| option_representation o}, number_spaces: 10) %>
|
25
25
|
fi
|
26
26
|
else
|
27
27
|
_values : \
|
@@ -33,7 +33,7 @@ _<%= script_name %>() {
|
|
33
33
|
<% end -%>
|
34
34
|
<%= command_representation command %> \
|
35
35
|
<% end -%>
|
36
|
-
<%= continued_multilines(root_command.
|
36
|
+
<%= continued_multilines(context_options(root_command).sort { |a,b| a.name <=> b.name }.map {|o| option_representation o}, number_spaces: 8) %>
|
37
37
|
fi
|
38
38
|
}
|
39
39
|
|
@@ -46,7 +46,7 @@ _<%= script_name %>_cmd_<%= command.name %>() {
|
|
46
46
|
_arguments -s : \
|
47
47
|
<%
|
48
48
|
command_param = default_command_param_type command
|
49
|
-
options_lines = command.
|
49
|
+
options_lines = context_options(command).sort { |a,b| a.name <=> b.name }.map {|o| option_representation o}
|
50
50
|
options_lines << command_param unless command_param.empty?
|
51
51
|
-%>
|
52
52
|
<%= continued_multilines(options_lines) %>
|
@@ -124,5 +124,15 @@ _power_stencil_do_nothing() {
|
|
124
124
|
return 1
|
125
125
|
}
|
126
126
|
|
127
|
-
|
128
|
-
_<%= script_name %>
|
127
|
+
|
128
|
+
_<%= script_name %>() {
|
129
|
+
if $( _within_power_stencil_project ); then
|
130
|
+
local project_root=$( _power_stencil_project_root )
|
131
|
+
if [ -f "${project_root}/.ps_project/<%= PowerStencil.config[:completion_target][:zsh][:project_completion_filename] %>" ]; then
|
132
|
+
. "${project_root}/.ps_project/<%= PowerStencil.config[:completion_target][:zsh][:project_completion_filename] %>"
|
133
|
+
fi
|
134
|
+
else
|
135
|
+
. "<%= File.expand_path(File.join PowerStencil.config[:completion_target][:zsh][:completion_dir], "_#{script_name}") %>"
|
136
|
+
fi
|
137
|
+
_<%= script_name %>_first_level "$@"
|
138
|
+
}
|
data/lib/power_stencil.rb
CHANGED
@@ -5,6 +5,10 @@ require 'dir_glob_ignore'
|
|
5
5
|
|
6
6
|
$DO_NOT_AUTOSTART_CLIMATIC=true
|
7
7
|
require 'climatic'
|
8
|
+
require 'power_stencil/ultra_command_line/command_line_manager'
|
9
|
+
require 'power_stencil/ultra_command_line/providers_manager'
|
10
|
+
require 'power_stencil/ultra_command_line/option_definition'
|
11
|
+
require 'power_stencil/ultra_command_line/sub_command'
|
8
12
|
|
9
13
|
require 'power_stencil/error'
|
10
14
|
require 'power_stencil/utils/os'
|
@@ -12,7 +12,35 @@ module PowerStencil
|
|
12
12
|
def execute
|
13
13
|
|
14
14
|
if config[:'zsh-completion']
|
15
|
-
|
15
|
+
target_dir = File.expand_path config[:completion_target][:zsh][:completion_dir]
|
16
|
+
script_name = 'power_stencil'
|
17
|
+
user_completion_script = File.join target_dir, "_#{script_name}"
|
18
|
+
begin
|
19
|
+
current_dir = Dir.pwd
|
20
|
+
Dir.mktmpdir 'completion_generation' do |tmpdir|
|
21
|
+
Dir.chdir tmpdir
|
22
|
+
generate_zsh_completion script_name, user_completion_script, false
|
23
|
+
end
|
24
|
+
ensure
|
25
|
+
Dir.chdir current_dir
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
project
|
30
|
+
shortname_project_completion_script = File.join config[:default_config_directory_name], config[:completion_target][:zsh][:project_completion_filename]
|
31
|
+
project.track_action_with_git("Adding project specific zsh completion file: '#{ shortname_project_completion_script }'.") do
|
32
|
+
project_completion_script = File.join project.project_config_root, config[:completion_target][:zsh][:project_completion_filename]
|
33
|
+
generate_zsh_completion script_name, project_completion_script, true
|
34
|
+
puts_and_logs "A specific completion has been generated for this project in '#{project_completion_script}'.", check_verbose: false
|
35
|
+
end
|
36
|
+
rescue
|
37
|
+
# Do not check errors. This is just to load project config...
|
38
|
+
logger.debug "Outside of a PowerStencil project... Not generating zsh project completion."
|
39
|
+
end
|
40
|
+
puts_and_logs "zsh global auto_completion has been installed in '#{user_completion_script}'.", check_verbose: false
|
41
|
+
puts
|
42
|
+
puts "You should ensure you have something like 'fpath=(#{target_dir} $fpath)' in your ~/.zshrc file..."
|
43
|
+
puts 'You may have to relog for changes to be applied.'
|
16
44
|
return
|
17
45
|
end
|
18
46
|
|
@@ -5,15 +5,52 @@ module PowerStencil
|
|
5
5
|
|
6
6
|
class << self
|
7
7
|
attr_accessor :script_name
|
8
|
+
attr_accessor :generating_project_completion
|
8
9
|
end
|
9
10
|
|
10
11
|
attr_reader :encountered_types
|
11
12
|
|
13
|
+
def timestamp
|
14
|
+
if generating_user_completion?
|
15
|
+
" on the #{Time.now}"
|
16
|
+
else
|
17
|
+
''
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
12
21
|
def initialize(universe)
|
13
22
|
super
|
14
23
|
@encountered_types = {}
|
15
24
|
end
|
16
25
|
|
26
|
+
def generating_project_completion?
|
27
|
+
self.class.generating_project_completion
|
28
|
+
end
|
29
|
+
|
30
|
+
def generating_user_completion?
|
31
|
+
!self.class.generating_project_completion
|
32
|
+
end
|
33
|
+
|
34
|
+
def context_commands
|
35
|
+
if generating_user_completion?
|
36
|
+
PowerStencil.command_line_manager.commands.select do |command|
|
37
|
+
command.providers.include? PowerStencil
|
38
|
+
end
|
39
|
+
else
|
40
|
+
PowerStencil.command_line_manager.commands
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def context_options(command)
|
45
|
+
if generating_user_completion?
|
46
|
+
command.options.select do |option|
|
47
|
+
option.providers.include? PowerStencil
|
48
|
+
end
|
49
|
+
else
|
50
|
+
command.options
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
17
54
|
def script_name
|
18
55
|
self.class.script_name
|
19
56
|
end
|
@@ -95,8 +95,11 @@ module PowerStencil
|
|
95
95
|
|
96
96
|
|
97
97
|
def build_entity(entity_to_build, target_path)
|
98
|
+
initial_directory = Dir.pwd
|
98
99
|
target_plugin_name = entity_to_build.buildable_by.to_s
|
99
100
|
default_build entity_to_build, target_path
|
101
|
+
# Post processing executed from generated directory (#11)
|
102
|
+
Dir.chdir target_path
|
100
103
|
|
101
104
|
if target_plugin_name.empty?
|
102
105
|
post_build_hook entity_to_build, target_path
|
@@ -106,6 +109,8 @@ module PowerStencil
|
|
106
109
|
raise PowerStencil::Error, "Plugin '#{target_plugin_name}' has no build capability !" unless target_plugin.capabilities[:build]
|
107
110
|
target_plugin.post_build_hook entity_to_build, target_path
|
108
111
|
end
|
112
|
+
ensure
|
113
|
+
Dir.chdir initial_directory
|
109
114
|
end
|
110
115
|
|
111
116
|
def default_build(entity_to_build, target_path)
|
@@ -30,10 +30,27 @@ module PowerStencil
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
ensure
|
33
|
-
@
|
33
|
+
@files_not_to_rename = nil
|
34
34
|
@files_not_to_render = nil
|
35
35
|
end
|
36
36
|
|
37
|
+
|
38
|
+
def render_single_template_file(source_template, destination_file, main_entry_point: nil)
|
39
|
+
compiled_universe = root_universe.compile scenario: config[:scenario]
|
40
|
+
puts_and_logs 'Entities analysis completed.'
|
41
|
+
|
42
|
+
logger.info 'Generating target file...'
|
43
|
+
|
44
|
+
process_file source_template, destination_file,
|
45
|
+
compiled_universe,
|
46
|
+
overwrite_files: true,
|
47
|
+
main_entry_point: main_entry_point
|
48
|
+
ensure
|
49
|
+
@files_not_to_rename = nil
|
50
|
+
@files_not_to_render = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
|
37
54
|
private
|
38
55
|
|
39
56
|
def detemplatized_file_name(filename, replacement_text)
|
@@ -34,11 +34,11 @@ module PowerStencil
|
|
34
34
|
@available_entities_hash.keys
|
35
35
|
end
|
36
36
|
|
37
|
-
def entity(type, name, universe)
|
37
|
+
def entity(type, name, universe = self.root_universe)
|
38
38
|
universe.get_entity type, name
|
39
39
|
end
|
40
40
|
|
41
|
-
def entities(universe, criterion: nil, value: nil, &filter_block)
|
41
|
+
def entities(universe = self.root_universe, criterion: nil, value: nil, &filter_block)
|
42
42
|
universe.get_entities criterion: criterion, value: value, &filter_block
|
43
43
|
end
|
44
44
|
|
@@ -17,6 +17,7 @@ module PowerStencil
|
|
17
17
|
logger.debug 'Starting PowerStencil initialization...'
|
18
18
|
setup_system_processors
|
19
19
|
setup_universe_compiler_logger
|
20
|
+
try_to_load_project fail_on_error: false
|
20
21
|
logger.debug 'PowerStencil initialization complete'
|
21
22
|
end
|
22
23
|
|
@@ -29,7 +30,12 @@ module PowerStencil
|
|
29
30
|
include PowerStencil::Utils::FileHelper
|
30
31
|
|
31
32
|
def try_to_load_project(fail_on_error: true)
|
32
|
-
|
33
|
+
begin
|
34
|
+
PowerStencil::Project::Base.instantiate_from_config config
|
35
|
+
rescue => e
|
36
|
+
raise e if fail_on_error
|
37
|
+
end
|
38
|
+
|
33
39
|
end
|
34
40
|
|
35
41
|
def setup_system_processors
|
@@ -49,14 +55,19 @@ module PowerStencil
|
|
49
55
|
describe: PowerStencil::CommandProcessors::Describe,
|
50
56
|
adm: PowerStencil::CommandProcessors::Adm
|
51
57
|
}.each do |command_name, processor|
|
52
|
-
|
58
|
+
command = command_line_manager.command_by_alias(command_name)
|
59
|
+
command_line_manager.register_processor command,
|
53
60
|
processor.new
|
61
|
+
command.add_provider self
|
54
62
|
end
|
55
63
|
end
|
56
64
|
|
57
65
|
def setup_climatic(cmd_line_args)
|
58
66
|
mngr = Climatic::ConfigLayers::CommandLineLayer.build_command_line_manager base_commands_definition_file
|
59
67
|
Climatic.bootstrap cmd_line_args: cmd_line_args, command_manager: mngr
|
68
|
+
mngr.commands.each do |command|
|
69
|
+
command.add_provider PowerStencil
|
70
|
+
end
|
60
71
|
begin
|
61
72
|
# Fix command line layer priority to allow a bigger number of plugins
|
62
73
|
config.command_line_layer.priority = 999
|
@@ -10,7 +10,9 @@ module PowerStencil
|
|
10
10
|
clm = PowerStencil.command_line_manager
|
11
11
|
plugin_definition[:processors].each do |processors_name, processor|
|
12
12
|
processor_class = Object.const_get processor
|
13
|
-
|
13
|
+
command = clm.command_by_alias(processors_name)
|
14
|
+
clm.register_processor command, processor_class.new
|
15
|
+
command.add_provider self
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
@@ -6,17 +6,15 @@ module PowerStencil
|
|
6
6
|
def query_for_completion(query_type)
|
7
7
|
case query_type
|
8
8
|
when :entities
|
9
|
-
engine.entities
|
9
|
+
engine.entities.map(&:as_path).sort
|
10
10
|
when :'entity-types'
|
11
11
|
engine.available_entity_types.sort
|
12
12
|
when :scenario
|
13
|
-
engine.entities(
|
13
|
+
engine.entities(criterion: :by_type, value: :entity_override) do |entity|
|
14
14
|
!entity.scenario.nil? and !entity.scenario.empty?
|
15
15
|
end.map(&:scenario).sort.uniq
|
16
16
|
when :buildable
|
17
|
-
engine.entities(
|
18
|
-
entity.buildable?
|
19
|
-
end.map(&:as_path).sort
|
17
|
+
engine.entities(&:buildable?).map(&:as_path).sort
|
20
18
|
else
|
21
19
|
raise PowerStencil::Error, "'#{query_type}' is not a valid query type for completion !"
|
22
20
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class UltraCommandLine::Manager::Base
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def add_provider_for(command_or_option, provider)
|
6
|
+
providers = providers_for command_or_option
|
7
|
+
providers << provider unless providers.include? provider
|
8
|
+
end
|
9
|
+
|
10
|
+
def providers_for(command_or_option)
|
11
|
+
default_command_data = {options: {}, providers: []}
|
12
|
+
case command_or_option
|
13
|
+
when UltraCommandLine::Commands::SubCommand
|
14
|
+
sc = command_or_option
|
15
|
+
internal_provider_mapping[sc.name] ||= default_command_data
|
16
|
+
internal_provider_mapping[sc.name][:providers]
|
17
|
+
when UltraCommandLine::Commands::OptionDefinition
|
18
|
+
sco = command_or_option
|
19
|
+
internal_provider_mapping[sco.sub_command.name] ||= default_command_data
|
20
|
+
internal_provider_mapping[sco.sub_command.name][:options][sco.name] ||= []
|
21
|
+
internal_provider_mapping[sco.sub_command.name][:options][sco.name]
|
22
|
+
else
|
23
|
+
raise PowerStencil::Error, "Invalid command or option"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# private
|
28
|
+
|
29
|
+
def internal_provider_mapping
|
30
|
+
@internal_provider_mapping ||= {}
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module PowerStencil
|
2
|
+
module UltraCommandLine
|
3
|
+
|
4
|
+
module ProvidersManager
|
5
|
+
|
6
|
+
def providers_manager
|
7
|
+
PowerStencil.command_line_manager.class
|
8
|
+
end
|
9
|
+
|
10
|
+
def providers
|
11
|
+
providers_manager.providers_for self
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_provider(provider)
|
15
|
+
providers_manager.add_provider_for self, provider
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -3,24 +3,34 @@ module PowerStencil
|
|
3
3
|
|
4
4
|
module Completion
|
5
5
|
|
6
|
-
|
6
|
+
class FakeIgnoreList
|
7
|
+
attr_accessor :return_value
|
8
|
+
def ignore_file?(file)
|
9
|
+
return_value
|
10
|
+
end
|
11
|
+
end
|
7
12
|
|
8
|
-
|
13
|
+
include PowerStencil::Utils::DirectoryProcessor
|
9
14
|
|
10
|
-
|
11
|
-
config.executable_gem_layer[:file_renaming_patterns] = {'(.+)_power_stencil.sh.erb' => '\1_power_stencil' }
|
15
|
+
def generate_zsh_completion(script_name, target_file, generating_project_completion)
|
12
16
|
|
13
|
-
target_dir = File.expand_path config[:completion_target][:zsh][:completion_dir]
|
14
17
|
source_dir = File.join PowerStencil::Project::Paths.system_templates_templates_path, 'zsh_command_line_completion'
|
18
|
+
source_template = File.join source_dir, '_power_stencil.sh.erb'
|
15
19
|
|
16
20
|
engine = PowerStencil::Engine::InitEngine.new
|
17
21
|
engine.dsl = PowerStencil::Dsl::Completion
|
18
22
|
engine.dsl.script_name = script_name
|
19
|
-
engine.
|
23
|
+
engine.dsl.generating_project_completion = generating_project_completion
|
24
|
+
|
25
|
+
engine.instance_eval do
|
26
|
+
@files_not_to_rename = FakeIgnoreList.new
|
27
|
+
files_not_to_rename.return_value = true
|
28
|
+
@files_not_to_render = FakeIgnoreList.new
|
29
|
+
files_not_to_render.return_value = false
|
30
|
+
end
|
31
|
+
|
32
|
+
engine.render_single_template_file source_template, target_file
|
20
33
|
|
21
|
-
puts_and_logs "zsh auto_completion has been installed in '#{File.join target_dir, "_#{script_name}"}'.", check_verbose: false
|
22
|
-
puts "You should ensure you have something like 'fpath=(#{target_dir} $fpath)' in your ~/.zshrc file..."
|
23
|
-
puts 'You may have to relog for changes to be applied.'
|
24
34
|
end
|
25
35
|
|
26
36
|
end
|
data/power_stencil.gemspec
CHANGED
@@ -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.
|
28
|
+
spec.add_dependency 'climatic', '~> 0.2.34'
|
29
29
|
spec.add_dependency 'dir_glob_ignore', '~> 0.3'
|
30
30
|
spec.add_dependency 'universe_compiler', '~> 0.5.5'
|
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.8.
|
4
|
+
version: 0.8.14
|
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-11-
|
11
|
+
date: 2019-11-09 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.
|
61
|
+
version: 0.2.34
|
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.
|
68
|
+
version: 0.2.34
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: dir_glob_ignore
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- doc/plugins.md
|
155
155
|
- doc/templates.md
|
156
156
|
- etc/base_commands_definition.yml
|
157
|
+
- etc/meta_templates/plugin_seed/README.md
|
157
158
|
- etc/meta_templates/plugin_seed/etc/command_line.yaml
|
158
159
|
- etc/meta_templates/plugin_seed/etc/plugin_capabilities.yaml
|
159
160
|
- etc/meta_templates/plugin_seed/etc/plugin_config.yaml
|
@@ -168,6 +169,8 @@ files:
|
|
168
169
|
- etc/meta_templates/plugin_seed/lib/{entity}/version.rb.erb
|
169
170
|
- etc/meta_templates/plugin_seed/lib/{entity}/{entity}_processor.rb.erb
|
170
171
|
- etc/meta_templates/plugin_seed/psplugin_{entity}.gemspec
|
172
|
+
- etc/meta_templates/plugin_seed/spec/spec_helper.rb
|
173
|
+
- etc/meta_templates/plugin_seed/spec/{entity}_spec.rb
|
171
174
|
- etc/power_stencil.yaml
|
172
175
|
- etc/templates/plugin_definition/.gitignore
|
173
176
|
- etc/templates/plugin_definition/.rspec
|
@@ -279,6 +282,10 @@ files:
|
|
279
282
|
- lib/power_stencil/system_entity_definitions/project_entity.rb
|
280
283
|
- lib/power_stencil/system_entity_definitions/simple_exec.rb
|
281
284
|
- lib/power_stencil/system_entity_definitions/source_provider.rb
|
285
|
+
- lib/power_stencil/ultra_command_line/command_line_manager.rb
|
286
|
+
- lib/power_stencil/ultra_command_line/option_definition.rb
|
287
|
+
- lib/power_stencil/ultra_command_line/providers_manager.rb
|
288
|
+
- lib/power_stencil/ultra_command_line/sub_command.rb
|
282
289
|
- lib/power_stencil/utils/completion.rb
|
283
290
|
- lib/power_stencil/utils/directory_processor.rb
|
284
291
|
- lib/power_stencil/utils/file_edit.rb
|
@@ -299,12 +306,13 @@ metadata:
|
|
299
306
|
documentation_uri: https://gitlab.com/tools4devops/power_stencil/blob/master/README.md
|
300
307
|
source_code_uri: https://gitlab.com/tools4devops/power_stencil
|
301
308
|
homepage_uri: https://powerstencil.brizone.org/
|
302
|
-
post_install_message: "\nThank you for installing PowerStencil 0.8.
|
303
|
-
line you can run `power_stencil --help`\nIf your shell is not completing
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
309
|
+
post_install_message: "\nThank you for installing PowerStencil 0.8.14 !\nFrom the
|
310
|
+
command line you can run `power_stencil --help`\nIf your shell is not completing
|
311
|
+
the command:\n If you use rbenv: `rbenv rehash`\n If you use zsh : `rehash`\n\nOfficial
|
312
|
+
Website : https://powerstencil.brizone.org/\nFull documentation here :
|
313
|
+
https://gitlab.com/tools4devops/power_stencil/blob/master/README.md\nFeel free to
|
314
|
+
report issues: https://gitlab.com/tools4devops/power_stencil/issues\n\nType 'power_stencil
|
315
|
+
adm --zsh-completion' to install auto-completion for zsh.\n\n "
|
308
316
|
rdoc_options: []
|
309
317
|
require_paths:
|
310
318
|
- lib
|