vop 0.3.1 → 0.3.4
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/.gitignore +2 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +34 -33
- data/README.md +184 -2
- data/bin/console +17 -0
- data/bin/setup +8 -0
- data/bin/vop.sh +6 -2
- data/exe/vop +3 -25
- data/lib/boot.rb +3 -0
- data/lib/core/meta/commands/new_command.rb +1 -0
- data/lib/core/meta/commands/new_plugin.rb +47 -0
- data/lib/core/meta/commands/search_gems_for_plugins.rb +38 -0
- data/lib/core/meta/commands/search_path.rb +6 -0
- data/lib/core/meta/commands/set.rb +12 -0
- data/lib/core/meta/commands/show.rb +6 -0
- data/lib/core/meta/commands/show_config.rb +9 -0
- data/lib/core/meta/commands/who_provides.rb +6 -0
- data/lib/core/meta/meta.plugin +1 -0
- data/lib/core/shell/commands/change_loglevel.rb +6 -0
- data/lib/{vop/plugins/core → core/shell}/commands/clear_context.rb +0 -0
- data/lib/core/shell/commands/edit.rb +12 -0
- data/lib/core/shell/commands/help.rb +49 -0
- data/lib/core/shell/commands/reset.rb +4 -0
- data/lib/{vop/plugins/core → core/shell}/commands/show_context.rb +0 -0
- data/lib/core/shell/commands/source.rb +21 -0
- data/lib/{vop/plugins/core/helpers/plugin_loader/plugin_syntax.rb → core/shell/shell.plugin} +0 -0
- data/lib/core/structure/commands/collect_contributions.rb +46 -0
- data/lib/core/structure/commands/disable_contributor.rb +16 -0
- data/lib/core/structure/commands/generate_entity_commands.rb +52 -0
- data/lib/core/structure/commands/generate_invalidation_commands.rb +26 -0
- data/lib/core/structure/commands/list_commands.rb +11 -0
- data/lib/core/structure/commands/list_contributors.rb +10 -0
- data/lib/core/structure/commands/list_entities.rb +3 -0
- data/lib/core/structure/commands/list_plugins.rb +3 -0
- data/lib/core/structure/commands/register_contributor.rb +14 -0
- data/lib/core/structure/structure.plugin +4 -0
- data/lib/vop/objects/chain.rb +25 -0
- data/lib/vop/objects/command.rb +86 -0
- data/lib/vop/objects/command_param.rb +39 -0
- data/lib/vop/objects/entities.rb +21 -0
- data/lib/vop/objects/entity.rb +75 -0
- data/lib/vop/objects/entity_definition.rb +33 -0
- data/lib/vop/objects/filter.rb +48 -0
- data/lib/vop/objects/plugin.rb +208 -0
- data/lib/vop/objects/request.rb +73 -0
- data/lib/vop/objects/response.rb +17 -0
- data/lib/vop/objects/thing_with_params.rb +17 -0
- data/lib/vop/{command_loader.rb → parts/command_loader.rb} +8 -12
- data/lib/vop/parts/dependency_resolver.rb +56 -0
- data/lib/vop/parts/entity_loader.rb +46 -0
- data/lib/vop/parts/executor.rb +155 -0
- data/lib/vop/parts/filter_loader.rb +41 -0
- data/lib/vop/parts/plugin_finder.rb +46 -0
- data/lib/vop/parts/plugin_loader.rb +72 -0
- data/lib/vop/shell/shell.rb +221 -0
- data/lib/vop/shell/shell_formatter.rb +110 -0
- data/lib/vop/shell/shell_input.rb +14 -0
- data/lib/vop/shell/shell_input_readline.rb +20 -0
- data/lib/vop/shell/shell_input_testable.rb +27 -0
- data/lib/vop/syntax/command_syntax.rb +90 -0
- data/lib/vop/syntax/entity_syntax.rb +35 -0
- data/lib/vop/syntax/filter_syntax.rb +11 -0
- data/lib/vop/syntax/plugin_syntax.rb +55 -0
- data/lib/vop/util/errors.rb +45 -0
- data/lib/vop/util/pluralizer.rb +26 -0
- data/lib/vop/util/worker.rb +24 -0
- data/lib/vop/version.rb +1 -1
- data/lib/vop/vop.rb +216 -0
- data/lib/vop.rb +16 -229
- data/vop.gemspec +18 -15
- metadata +95 -63
- data/bin/vop.rb +0 -28
- data/lib/vop/command.rb +0 -168
- data/lib/vop/entity.rb +0 -61
- data/lib/vop/loader.rb +0 -35
- data/lib/vop/plugin.rb +0 -141
- data/lib/vop/plugin_loader.rb +0 -88
- data/lib/vop/plugins/core/commands/collect_contributions.rb +0 -31
- data/lib/vop/plugins/core/commands/edit.rb +0 -12
- data/lib/vop/plugins/core/commands/help.rb +0 -38
- data/lib/vop/plugins/core/commands/identity.rb +0 -4
- data/lib/vop/plugins/core/commands/list_contributors.rb +0 -8
- data/lib/vop/plugins/core/commands/list_entities.rb +0 -3
- data/lib/vop/plugins/core/commands/pry.rb +0 -9
- data/lib/vop/plugins/core/commands/reset.rb +0 -5
- data/lib/vop/plugins/core/commands/source.rb +0 -5
- data/lib/vop/plugins/core/commands/system_call.rb +0 -5
- data/lib/vop/plugins/core/core.plugin +0 -4
- data/lib/vop/plugins/core/helpers/command_loader/command_syntax.rb +0 -45
- data/lib/vop/plugins/core/helpers/command_loader/contributions.rb +0 -28
- data/lib/vop/plugins/core/helpers/command_loader/entities.rb +0 -57
- data/lib/vop/plugins/core/helpers/helper.rb +0 -3
- data/lib/vop/plugins/meta/commands/add_search_path.rb +0 -6
- data/lib/vop/plugins/meta/commands/delete_plugin.rb +0 -13
- data/lib/vop/plugins/meta/commands/list_commands.rb +0 -17
- data/lib/vop/plugins/meta/commands/list_plugins.rb +0 -8
- data/lib/vop/plugins/meta/commands/new_command.rb +0 -14
- data/lib/vop/plugins/meta/commands/new_plugin.rb +0 -25
- data/lib/vop/plugins/meta/commands/show_search_path.rb +0 -3
- data/lib/vop/plugins/meta/commands/who_provides.rb +0 -5
- data/lib/vop/plugins/meta/meta.plugin +0 -1
- data/lib/vop/plugins/ssh/commands/scp.rb +0 -11
- data/lib/vop/plugins/ssh/commands/ssh.rb +0 -19
- data/lib/vop/plugins/ssh/ssh.plugin +0 -1
- data/lib/vop/shell/backend.rb +0 -28
- data/lib/vop/shell/base_shell.rb +0 -112
- data/lib/vop/shell/formatter.rb +0 -46
- data/lib/vop/shell/vop_shell_backend.rb +0 -257
- data/lib/vop/shell.rb +0 -52
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 671eba569f41b30868a8026134138d13399d3d5e
|
|
4
|
+
data.tar.gz: 5791e1031450edc74942ddc3b388ba8c27521c87
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2e216682fe3dce4eedbec94ff3d4073084652b405747383085430b16d8abebf0e1b20ecaff2632591592de142db52c34dd98103b27ef31a9df84df2135138549
|
|
7
|
+
data.tar.gz: 62a72d94b60acd3f92dd0d5da33cbc3b14ee02aecb3380a365c5c5d2bffd8400d0adf96962d19474620d0977a52a6b6a687aca3f10203be1d67a77ced488c6bd
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,37 +1,30 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
vop (0.3.
|
|
5
|
-
activesupport
|
|
6
|
-
docopt
|
|
4
|
+
vop (0.3.4)
|
|
7
5
|
net-scp
|
|
8
6
|
net-ssh
|
|
9
|
-
|
|
7
|
+
redis
|
|
8
|
+
sidekiq
|
|
10
9
|
terminal-table
|
|
10
|
+
xml-simple
|
|
11
11
|
|
|
12
12
|
GEM
|
|
13
|
-
remote:
|
|
13
|
+
remote: https://rubygems.org/
|
|
14
14
|
specs:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
i18n (~> 0.7)
|
|
18
|
-
minitest (~> 5.1)
|
|
19
|
-
tzinfo (~> 1.1)
|
|
20
|
-
coderay (1.1.1)
|
|
21
|
-
concurrent-ruby (1.0.2)
|
|
15
|
+
concurrent-ruby (1.0.5)
|
|
16
|
+
connection_pool (2.2.1)
|
|
22
17
|
diff-lcs (1.2.5)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
method_source (0.8.2)
|
|
26
|
-
minitest (5.10.1)
|
|
18
|
+
docile (1.1.5)
|
|
19
|
+
json (1.8.6)
|
|
27
20
|
net-scp (1.2.1)
|
|
28
21
|
net-ssh (>= 2.6.5)
|
|
29
|
-
net-ssh (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
net-ssh (4.2.0)
|
|
23
|
+
rack (2.0.3)
|
|
24
|
+
rack-protection (2.0.0)
|
|
25
|
+
rack
|
|
26
|
+
rake (10.5.0)
|
|
27
|
+
redis (4.0.1)
|
|
35
28
|
rspec (3.4.0)
|
|
36
29
|
rspec-core (~> 3.4.0)
|
|
37
30
|
rspec-expectations (~> 3.4.0)
|
|
@@ -45,22 +38,30 @@ GEM
|
|
|
45
38
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
46
39
|
rspec-support (~> 3.4.0)
|
|
47
40
|
rspec-support (3.4.1)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
41
|
+
sidekiq (5.0.5)
|
|
42
|
+
concurrent-ruby (~> 1.0)
|
|
43
|
+
connection_pool (~> 2.2, >= 2.2.0)
|
|
44
|
+
rack-protection (>= 1.5.0)
|
|
45
|
+
redis (>= 3.3.4, < 5)
|
|
46
|
+
simplecov (0.11.2)
|
|
47
|
+
docile (~> 1.1.0)
|
|
48
|
+
json (~> 1.8)
|
|
49
|
+
simplecov-html (~> 0.10.0)
|
|
50
|
+
simplecov-html (0.10.0)
|
|
51
|
+
terminal-table (1.8.0)
|
|
52
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
|
53
|
+
unicode-display_width (1.3.0)
|
|
54
|
+
xml-simple (1.1.5)
|
|
55
55
|
|
|
56
56
|
PLATFORMS
|
|
57
57
|
ruby
|
|
58
58
|
|
|
59
59
|
DEPENDENCIES
|
|
60
|
-
bundler (~> 1.
|
|
61
|
-
rake
|
|
62
|
-
rspec
|
|
60
|
+
bundler (~> 1.15)
|
|
61
|
+
rake (~> 10.0)
|
|
62
|
+
rspec (~> 3.0)
|
|
63
|
+
simplecov
|
|
63
64
|
vop!
|
|
64
65
|
|
|
65
66
|
BUNDLED WITH
|
|
66
|
-
1.
|
|
67
|
+
1.16.0
|
data/README.md
CHANGED
|
@@ -1,2 +1,184 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
The vop is a systems automation scripting framework.
|
|
4
|
+
|
|
5
|
+
It organizes (ruby) scripts into commands living in plugins, defines services that can be installed and managed, and comes with a shell and a web interface.
|
|
6
|
+
|
|
7
|
+
# Status: WIP
|
|
8
|
+
|
|
9
|
+
This is work in progress. Do not assume everything you read to be totally accurate and/or stable.
|
|
10
|
+
|
|
11
|
+
# Installation
|
|
12
|
+
|
|
13
|
+
## as a gem:
|
|
14
|
+
|
|
15
|
+
$ gem install vop
|
|
16
|
+
|
|
17
|
+
# Usage
|
|
18
|
+
|
|
19
|
+
Call `vop` to start the shell.
|
|
20
|
+
|
|
21
|
+
Use the tab key for completion, type "help" for more info, `list_plugins` and `list_commands` for an overview.
|
|
22
|
+
|
|
23
|
+
# Syntax
|
|
24
|
+
|
|
25
|
+
## Plugins
|
|
26
|
+
|
|
27
|
+
Minimally, a plugin is a folder containing a file called "<name>.plugin". An empty file will do.
|
|
28
|
+
|
|
29
|
+
optional:
|
|
30
|
+
```
|
|
31
|
+
description "really nice plugin, this one"
|
|
32
|
+
|
|
33
|
+
auto_load false # default is true
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
dependencies:
|
|
37
|
+
```
|
|
38
|
+
depends_on :other_plugin
|
|
39
|
+
depends_on [ :many, :other, :plugins ]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
hooks:
|
|
43
|
+
```
|
|
44
|
+
hook :before_execute do |payload|
|
|
45
|
+
request = payload[:request]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
hook :after_execute do |payload|
|
|
49
|
+
request = payload[:request]
|
|
50
|
+
response = payload[:response]
|
|
51
|
+
end
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Commands
|
|
55
|
+
|
|
56
|
+
...are loaded from the `commands` folder in a plugin.
|
|
57
|
+
|
|
58
|
+
minimal:
|
|
59
|
+
```
|
|
60
|
+
run { 42 }
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
optional:
|
|
64
|
+
```
|
|
65
|
+
description "Roses are red."
|
|
66
|
+
|
|
67
|
+
read_only # => cacheable
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
defining param(eter)s:
|
|
71
|
+
```
|
|
72
|
+
param "snafoo" # optional
|
|
73
|
+
param! "snafoo" # mandatory
|
|
74
|
+
param! :snafoo # entity
|
|
75
|
+
```
|
|
76
|
+
param syntax:
|
|
77
|
+
```
|
|
78
|
+
param[!] ( "name" | :entity ) [, {option: value}]
|
|
79
|
+
```
|
|
80
|
+
full example:
|
|
81
|
+
```
|
|
82
|
+
param! "foo",
|
|
83
|
+
description: "it's the foo.",
|
|
84
|
+
multi: true,
|
|
85
|
+
default: [ "snafoo", "footoristic", "foofoo", "foolosophy" ],
|
|
86
|
+
default_param: true,
|
|
87
|
+
lookup: lambda { |params| %w|string array| }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
to access param values, use the `params` hash or named block variables:
|
|
91
|
+
```
|
|
92
|
+
param "foo"
|
|
93
|
+
param "not_really"
|
|
94
|
+
|
|
95
|
+
run do |params, not_really|
|
|
96
|
+
puts params["foo"] unless not_really
|
|
97
|
+
end
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
entity parameters are resolved from the specified key to the entity:
|
|
101
|
+
```
|
|
102
|
+
param :machine
|
|
103
|
+
|
|
104
|
+
run do |machine|
|
|
105
|
+
puts machine.name
|
|
106
|
+
end
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
contribute:
|
|
110
|
+
```
|
|
111
|
+
contribute to: "other_command" do |params|
|
|
112
|
+
end
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
show (display options for shell output):
|
|
117
|
+
```
|
|
118
|
+
show columns: ["name", "number"]
|
|
119
|
+
show sort: false
|
|
120
|
+
show display_type: :raw
|
|
121
|
+
```
|
|
122
|
+
`display_type` can be any of:
|
|
123
|
+
```
|
|
124
|
+
:data
|
|
125
|
+
:raw
|
|
126
|
+
:table
|
|
127
|
+
:list
|
|
128
|
+
:hash
|
|
129
|
+
```
|
|
130
|
+
(see [`shell/formatter.rb`](https://github.com/virtualop/vop/blob/master/lib/vop/parts/shell_formatter.rb))
|
|
131
|
+
|
|
132
|
+
## Services
|
|
133
|
+
|
|
134
|
+
Plugin folder: `services`
|
|
135
|
+
|
|
136
|
+
install one or multiple OS packages:
|
|
137
|
+
```
|
|
138
|
+
deploy package: <foo>
|
|
139
|
+
deploy package: [ <foo>, <bar>, <baz> ]
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
install (configuration for) a package repository:
|
|
143
|
+
```
|
|
144
|
+
deploy repository: {
|
|
145
|
+
alias: "funny-name",
|
|
146
|
+
url: "https://package.repository.somewhere.xxx",
|
|
147
|
+
dist: "stable/",
|
|
148
|
+
key: "https://download.somewhere.xxx/the.gpg.key"
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
run arbitrary vop or ruby code during deployment of a service:
|
|
153
|
+
```
|
|
154
|
+
deploy do |machine|
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
end
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
# Development
|
|
161
|
+
|
|
162
|
+
## required dependencies
|
|
163
|
+
|
|
164
|
+
* (to checkout sources: git)
|
|
165
|
+
* ruby + headers (e.g. packages `ruby` and `ruby-dev` on Ubuntu)
|
|
166
|
+
* bundler (`gem install bundler`)
|
|
167
|
+
|
|
168
|
+
## setup
|
|
169
|
+
After checking out the repo, run `bin/setup` to install (gem) dependencies.
|
|
170
|
+
Then, run `bundle exec rake spec` to run the tests.
|
|
171
|
+
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
|
172
|
+
|
|
173
|
+
To start the vop from the checked out sources, set the environment variable `VOP_DEV_MODE` to any value, e.g. like this:
|
|
174
|
+
```
|
|
175
|
+
export VOP_DEV_MODE=1
|
|
176
|
+
```
|
|
177
|
+
and then run `exe/vop`.
|
|
178
|
+
|
|
179
|
+
### packaging
|
|
180
|
+
To install the vop from source as a 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).
|
|
181
|
+
|
|
182
|
+
# Contributing
|
|
183
|
+
|
|
184
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/virtualop/vop.
|
data/bin/console
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require "bundler/setup"
|
|
4
|
+
require "vop"
|
|
5
|
+
|
|
6
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
|
7
|
+
# with your gem easier. You can also use a different console, if you like.
|
|
8
|
+
|
|
9
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
10
|
+
# require "pry"
|
|
11
|
+
# Pry.start
|
|
12
|
+
|
|
13
|
+
@op = Vop.boot
|
|
14
|
+
puts "A Vop instance is available in @op."
|
|
15
|
+
|
|
16
|
+
require "irb"
|
|
17
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
data/bin/vop.sh
CHANGED
data/exe/vop
CHANGED
|
@@ -1,28 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "vop"
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
require 'vop/shell'
|
|
8
|
-
require 'docopt'
|
|
9
|
-
require 'pp'
|
|
10
|
-
|
|
11
|
-
begin
|
|
12
|
-
shell = Vop::Shell::setup()
|
|
13
|
-
if shell.options["--execute"]
|
|
14
|
-
last_response = shell.execute(shell.options["--execute"])
|
|
15
|
-
else
|
|
16
|
-
last_response = shell.run_cli
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# TODO exit_status = last_response && last_response.status == Vop.Status::OK ? 0 : 1
|
|
20
|
-
exit 0
|
|
21
|
-
rescue => detail
|
|
22
|
-
if detail.is_a? Docopt::Exit
|
|
23
|
-
puts detail.message
|
|
24
|
-
else
|
|
25
|
-
$stderr.puts "error : #{detail.message}\n#{detail.backtrace[0..9].join("\n")}"
|
|
26
|
-
exit 42
|
|
27
|
-
end
|
|
28
|
-
end
|
|
5
|
+
@op = Vop.boot()
|
|
6
|
+
Vop::Shell.run(@op)
|
data/lib/boot.rb
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
run { 42 }
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
param! "name"
|
|
2
|
+
param "path"
|
|
3
|
+
param "content"
|
|
4
|
+
|
|
5
|
+
require "fileutils"
|
|
6
|
+
|
|
7
|
+
run do |params|
|
|
8
|
+
unless params["path"]
|
|
9
|
+
# try to find a writable plugin directory
|
|
10
|
+
first_non_usr = @op.plugin_locations.select { |location| not location.start_with? "/usr" }.first
|
|
11
|
+
if first_non_usr.nil?
|
|
12
|
+
raise "no writable plugin location found"
|
|
13
|
+
else
|
|
14
|
+
$logger.info "new_plugin defaulting to first writable plugin location #{first_non_usr}"
|
|
15
|
+
params["path"] = first_non_usr
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
raise "no such path: #{params["path"]}" unless File.exists? params["path"]
|
|
20
|
+
|
|
21
|
+
pp params
|
|
22
|
+
|
|
23
|
+
# a plugin is a directory
|
|
24
|
+
plugin_path = File.join(params["path"], params["name"])
|
|
25
|
+
puts "plugin path : #{plugin_path}"
|
|
26
|
+
Dir.mkdir(plugin_path)
|
|
27
|
+
|
|
28
|
+
# with subfolders for commands and helpers
|
|
29
|
+
%w|commands helpers|.each do |thing|
|
|
30
|
+
Dir.mkdir(File.join(plugin_path, thing))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# and a metadata file called "<name>.plugin"
|
|
34
|
+
plugin_file = params["name"] + ".plugin"
|
|
35
|
+
full_name = File.join(plugin_path, plugin_file)
|
|
36
|
+
FileUtils.touch full_name
|
|
37
|
+
|
|
38
|
+
# TODO content is [] - should probably be nil, though
|
|
39
|
+
#puts "content: >>#{params["content"].pretty_inspect}<<"
|
|
40
|
+
unless params["content"].nil?
|
|
41
|
+
IO.write(full_name, params["content"])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
$logger.info "created new plugin file #{plugin_file}"
|
|
45
|
+
|
|
46
|
+
@op.reset
|
|
47
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "find"
|
|
3
|
+
require "digest"
|
|
4
|
+
|
|
5
|
+
contribute to: "search_path" do |params|
|
|
6
|
+
gem_list = `gem list`.split("\n")
|
|
7
|
+
candidates = gem_list.select { |x| x =~ /vop-\w+/ }
|
|
8
|
+
|
|
9
|
+
# TODO cache which gems have already been inspected
|
|
10
|
+
# checksum = Digest::MD5.new
|
|
11
|
+
# candidates.map do |candidate|
|
|
12
|
+
# checksum << [ candidate.name, candidate.version ].join(":")
|
|
13
|
+
# end
|
|
14
|
+
# puts "gemspec md5 : #{checksum.hexdigest}"
|
|
15
|
+
|
|
16
|
+
result = []
|
|
17
|
+
|
|
18
|
+
candidates.each do |candidate|
|
|
19
|
+
$logger.debug "inspecting #{candidate}"
|
|
20
|
+
|
|
21
|
+
matched = /(.+?)\s+\([\d\.]+\)/.match(candidate)
|
|
22
|
+
unless matched
|
|
23
|
+
$logger.warn("unexpected line format : #{candidate}")
|
|
24
|
+
next
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
name = matched.captures.first
|
|
28
|
+
version = matched.captures.last
|
|
29
|
+
|
|
30
|
+
contents = `gem contents #{name}`.split("\n")
|
|
31
|
+
|
|
32
|
+
plugin_files = contents.grep /\.plugin$/
|
|
33
|
+
result += plugin_files.map do |file_name|
|
|
34
|
+
file_name.split("/")[0..-2].join("/")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
result
|
|
38
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
depends_on :structure
|
|
File without changes
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
param! "name", lookup: lambda { @op.commands.keys }
|
|
2
|
+
|
|
3
|
+
run do |params, name|
|
|
4
|
+
has_vim = `which vim`
|
|
5
|
+
editor = ENV["EDITOR"] || "vim" if has_vim
|
|
6
|
+
raise "please set the EDITOR environment variable" unless editor
|
|
7
|
+
|
|
8
|
+
command_file = @op.commands[name].source[:file_name]
|
|
9
|
+
system("#{editor} #{command_file}")
|
|
10
|
+
|
|
11
|
+
@op.reset
|
|
12
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
param! "name",
|
|
2
|
+
description: "a command for which help should be displayed",
|
|
3
|
+
lookup: lambda { |params| @op.list_commands.split }
|
|
4
|
+
|
|
5
|
+
run do |params, name|
|
|
6
|
+
command = @op.commands[params["name"]]
|
|
7
|
+
if command.nil?
|
|
8
|
+
raise "no such command : #{name}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
puts
|
|
12
|
+
puts command.name
|
|
13
|
+
|
|
14
|
+
if command.description
|
|
15
|
+
puts " #{command.description}"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
puts
|
|
19
|
+
puts "syntax:"
|
|
20
|
+
|
|
21
|
+
minimal_syntax = command.short_name
|
|
22
|
+
maximal_syntax = command.short_name
|
|
23
|
+
command.params.each do |p|
|
|
24
|
+
example = if p == command.default_param
|
|
25
|
+
"<#{p.name}>"
|
|
26
|
+
else
|
|
27
|
+
"#{p.name}=<#{p.name}>"
|
|
28
|
+
end
|
|
29
|
+
minimal_syntax << " #{example}" if p.options[:mandatory]
|
|
30
|
+
maximal_syntax << " #{example}"
|
|
31
|
+
end
|
|
32
|
+
puts " #{minimal_syntax}"
|
|
33
|
+
puts " #{maximal_syntax}" unless minimal_syntax == maximal_syntax
|
|
34
|
+
|
|
35
|
+
if command.params.size > 0
|
|
36
|
+
puts
|
|
37
|
+
puts "parameters:"
|
|
38
|
+
max_param_length = command.params.map { |p| p.name.length }.max
|
|
39
|
+
command.params.each do |p|
|
|
40
|
+
default_text = ""
|
|
41
|
+
if p.options.key? :default
|
|
42
|
+
default_text += " (default: #{p.options[:default]})"
|
|
43
|
+
end
|
|
44
|
+
puts " %-#{max_param_length}s\t%s\t%s" % [p.name, p.options[:description], default_text]
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
nil
|
|
49
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
param! "name", lookup: lambda { @op.commands.keys + @op.entities.keys + @op.filters.keys }
|
|
2
|
+
|
|
3
|
+
run do |name|
|
|
4
|
+
(source, thing) = if @op.commands.keys.include? name
|
|
5
|
+
[ :commands, @op.commands[name] ]
|
|
6
|
+
elsif @op.entities.keys.include? name
|
|
7
|
+
[ :entities, @op.entities[name] ]
|
|
8
|
+
elsif @op.filters.keys.include? name
|
|
9
|
+
[ :filters, @op.filters[name] ]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
code = thing.source[:code]
|
|
13
|
+
|
|
14
|
+
result = []
|
|
15
|
+
result << " "
|
|
16
|
+
code.lines.each_with_index { |line, idx|
|
|
17
|
+
result << "%02d %s" % [idx+1, line.chomp]
|
|
18
|
+
}
|
|
19
|
+
result << " "
|
|
20
|
+
result.join("\n")
|
|
21
|
+
end
|
data/lib/{vop/plugins/core/helpers/plugin_loader/plugin_syntax.rb → core/shell/shell.plugin}
RENAMED
|
File without changes
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
description "This is called by a command accepting contributions - it calls all contributors and merges the result"
|
|
2
|
+
|
|
3
|
+
param! "command_name", default_param: true
|
|
4
|
+
param "raw_params", default: {}
|
|
5
|
+
|
|
6
|
+
run do |command_name, raw_params|
|
|
7
|
+
contributors = @op.list_contributors(command_name: command_name)
|
|
8
|
+
|
|
9
|
+
target_name = command_name.split(".").last
|
|
10
|
+
target = @op.commands[target_name]
|
|
11
|
+
|
|
12
|
+
if target.nil?
|
|
13
|
+
raise "contribution target #{target_name} not found"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
display_type = target.show_options[:display_type] || :table
|
|
17
|
+
|
|
18
|
+
result = case display_type
|
|
19
|
+
when :table
|
|
20
|
+
[]
|
|
21
|
+
when :hash
|
|
22
|
+
{}
|
|
23
|
+
else
|
|
24
|
+
raise "contributions not implemented for display_type #{display_type}"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
contributors.each do |contributor_name|
|
|
28
|
+
short_name = contributor_name.split(".").last
|
|
29
|
+
contributor = @op.commands[short_name]
|
|
30
|
+
|
|
31
|
+
contribution = @op.execute(short_name, raw_params)
|
|
32
|
+
|
|
33
|
+
if contribution.nil?
|
|
34
|
+
$logger.warn "command #{short_name} contributes a nil value"
|
|
35
|
+
else
|
|
36
|
+
case display_type
|
|
37
|
+
when :table
|
|
38
|
+
result += contribution
|
|
39
|
+
when :hash
|
|
40
|
+
result.merge! contribution
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
result
|
|
46
|
+
end
|