vop 0.3.5 → 0.3.6
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 +5 -5
- data/.github/workflows/ci.yml +39 -0
- data/.ruby-version +1 -0
- data/Gemfile.lock +34 -47
- data/README.md +118 -16
- data/bin/sidekiq.sh +10 -0
- data/exe/vop +2 -2
- data/lib/core/cache/cache.plugin +0 -0
- data/lib/core/cache/commands/invalidate_cache.rb +9 -0
- data/lib/core/{structure → meta}/commands/list_commands.rb +2 -1
- data/lib/core/meta/commands/list_filters.rb +3 -0
- data/lib/core/meta/commands/list_plugins.rb +3 -0
- data/lib/core/meta/commands/new_plugin.rb +3 -7
- data/lib/core/shell/commands/detail.rb +21 -0
- data/lib/core/shell/commands/edit.rb +5 -2
- data/lib/core/shell/commands/help.rb +1 -1
- data/lib/core/shell/commands/source.rb +10 -4
- data/lib/core/structure/commands/collect_contributions.rb +8 -2
- data/lib/core/structure/commands/generate_entity_commands.rb +19 -10
- data/lib/core/structure/commands/generate_invalidation_commands.rb +19 -9
- data/lib/core/structure/commands/list_contribution_targets.rb +9 -0
- data/lib/core/structure/commands/list_contributors.rb +1 -1
- data/lib/core/structure/structure.plugin +1 -1
- data/lib/vop/objects/chain.rb +6 -3
- data/lib/vop/objects/command.rb +14 -5
- data/lib/vop/objects/command_param.rb +22 -0
- data/lib/vop/objects/entities.rb +8 -8
- data/lib/vop/objects/entity.rb +57 -16
- data/lib/vop/objects/entity_definition.rb +22 -0
- data/lib/vop/objects/plugin.rb +46 -4
- data/lib/vop/objects/request.rb +9 -5
- data/lib/vop/parts/dependency_resolver.rb +0 -4
- data/lib/vop/parts/entity_loader.rb +0 -3
- data/lib/vop/parts/executor.rb +33 -8
- data/lib/vop/parts/plugin_finder.rb +6 -16
- data/lib/vop/search_path.rb +12 -0
- data/lib/vop/shell/shell.rb +134 -87
- data/lib/vop/shell/shell_formatter.rb +32 -17
- data/lib/vop/shell/shell_input_readline.rb +3 -0
- data/lib/vop/shell/shell_input_testable.rb +9 -3
- data/lib/vop/syntax/command_syntax.rb +22 -17
- data/lib/vop/syntax/entity_syntax.rb +21 -6
- data/lib/vop/syntax/plugin_syntax.rb +6 -0
- data/lib/vop/util/pluralizer.rb +9 -1
- data/lib/vop/version.rb +1 -1
- data/lib/vop/vop.rb +70 -44
- data/lib/vop.rb +11 -1
- data/vop.gemspec +8 -6
- metadata +103 -28
- data/lib/core/meta/commands/search_gems_for_plugins.rb +0 -38
- data/lib/core/meta/commands/search_path.rb +0 -6
- data/lib/core/structure/commands/list_plugins.rb +0 -3
- data/lib/vop/util/worker.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 701c7d9de56bad966ff63365cd24f6feecf5f63314b0dfbd480a5890f23a98b8
|
4
|
+
data.tar.gz: 83f8ac7420c3d9a95bb5087c19d70ebaf6ebd228716201588b693f6b89667818
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8acbbc85ce5502380b618116fbe386675c804997e7bb72cd8f81bbec23ed16d06bd7d308dac28d7c3496d7c8f5cdfa0b9a220f9a509815a3629396b695e5ed3a
|
7
|
+
data.tar.gz: ed870d852b55a179bf4cd47d72058eeb111f81c456d5e338af1e086f9596a90021bc83b109dee537b0ea49cdbfa4ce0d931148229e4936b3f08c2b808a504a6b
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-ruby
|
2
|
+
|
3
|
+
name: CI
|
4
|
+
|
5
|
+
on:
|
6
|
+
push:
|
7
|
+
branches:
|
8
|
+
- master
|
9
|
+
- and-tonic
|
10
|
+
pull_request:
|
11
|
+
branches: [ master, and-tonic ]
|
12
|
+
|
13
|
+
jobs:
|
14
|
+
test:
|
15
|
+
runs-on: ubuntu-latest
|
16
|
+
|
17
|
+
services:
|
18
|
+
# https://docs.github.com/en/actions/using-containerized-services/creating-redis-service-containers
|
19
|
+
redis:
|
20
|
+
image: redis
|
21
|
+
# Set health checks to wait until redis has started
|
22
|
+
options: >-
|
23
|
+
--health-cmd "redis-cli ping"
|
24
|
+
--health-interval 10s
|
25
|
+
--health-timeout 5s
|
26
|
+
--health-retries 5
|
27
|
+
ports:
|
28
|
+
- 6379:6379
|
29
|
+
|
30
|
+
steps:
|
31
|
+
- uses: actions/checkout@v3
|
32
|
+
- name: Set up Ruby
|
33
|
+
uses: ruby/setup-ruby@359bebbc29cbe6c87da6bc9ea3bc930432750108
|
34
|
+
with:
|
35
|
+
ruby-version: '3.1'
|
36
|
+
- name: Install dependencies
|
37
|
+
run: bundle install
|
38
|
+
- name: Run tests
|
39
|
+
run: bundle exec rake
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.1.2
|
data/Gemfile.lock
CHANGED
@@ -1,67 +1,54 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vop (0.3.
|
5
|
-
|
6
|
-
|
7
|
-
redis
|
8
|
-
sidekiq
|
4
|
+
vop (0.3.6)
|
5
|
+
byebug
|
6
|
+
json (~> 2.3)
|
9
7
|
terminal-table
|
10
8
|
xml-simple
|
11
9
|
|
12
10
|
GEM
|
13
11
|
remote: https://rubygems.org/
|
14
12
|
specs:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
rspec (3.4.0)
|
29
|
-
rspec-core (~> 3.4.0)
|
30
|
-
rspec-expectations (~> 3.4.0)
|
31
|
-
rspec-mocks (~> 3.4.0)
|
32
|
-
rspec-core (3.4.1)
|
33
|
-
rspec-support (~> 3.4.0)
|
34
|
-
rspec-expectations (3.4.0)
|
13
|
+
byebug (11.1.3)
|
14
|
+
diff-lcs (1.5.0)
|
15
|
+
docile (1.4.0)
|
16
|
+
json (2.7.1)
|
17
|
+
rake (13.1.0)
|
18
|
+
rexml (3.2.6)
|
19
|
+
rspec (3.12.0)
|
20
|
+
rspec-core (~> 3.12.0)
|
21
|
+
rspec-expectations (~> 3.12.0)
|
22
|
+
rspec-mocks (~> 3.12.0)
|
23
|
+
rspec-core (3.12.2)
|
24
|
+
rspec-support (~> 3.12.0)
|
25
|
+
rspec-expectations (3.12.3)
|
35
26
|
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
-
rspec-support (~> 3.
|
37
|
-
rspec-mocks (3.
|
27
|
+
rspec-support (~> 3.12.0)
|
28
|
+
rspec-mocks (3.12.6)
|
38
29
|
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
-
rspec-support (~> 3.
|
40
|
-
rspec-support (3.
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
unicode-display_width (~> 1.1, >= 1.1.1)
|
53
|
-
unicode-display_width (1.3.0)
|
54
|
-
xml-simple (1.1.5)
|
30
|
+
rspec-support (~> 3.12.0)
|
31
|
+
rspec-support (3.12.1)
|
32
|
+
simplecov (0.22.0)
|
33
|
+
docile (~> 1.1)
|
34
|
+
simplecov-html (~> 0.11)
|
35
|
+
simplecov_json_formatter (~> 0.1)
|
36
|
+
simplecov-html (0.12.3)
|
37
|
+
simplecov_json_formatter (0.1.4)
|
38
|
+
terminal-table (3.0.2)
|
39
|
+
unicode-display_width (>= 1.1.1, < 3)
|
40
|
+
unicode-display_width (2.5.0)
|
41
|
+
xml-simple (1.1.9)
|
42
|
+
rexml
|
55
43
|
|
56
44
|
PLATFORMS
|
57
|
-
|
45
|
+
x86_64-linux
|
58
46
|
|
59
47
|
DEPENDENCIES
|
60
|
-
|
61
|
-
rake (~> 10.0)
|
48
|
+
rake
|
62
49
|
rspec (~> 3.0)
|
63
50
|
simplecov
|
64
51
|
vop!
|
65
52
|
|
66
53
|
BUNDLED WITH
|
67
|
-
|
54
|
+
2.4.10
|
data/README.md
CHANGED
@@ -1,25 +1,23 @@
|
|
1
|
+
The vop is a scripting framework.
|
1
2
|
|
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.
|
3
|
+
It organizes ruby scripts as *commands* living in *plugins*, defines and manages *services*, and can be accessed from the command line or a web interface.
|
10
4
|
|
11
5
|
# Installation
|
12
6
|
|
13
7
|
## as a gem:
|
14
8
|
|
15
|
-
|
9
|
+
$ gem install vop
|
10
|
+
|
11
|
+
## from source
|
12
|
+
|
13
|
+
* checkout the following repos from github.com/virtualop: vop, plugins, bundle
|
14
|
+
* install Ruby >= 3.1.2
|
15
|
+
* run `bundle install` in all working copies
|
16
16
|
|
17
17
|
# Usage
|
18
18
|
|
19
19
|
Call `vop` to start the shell.
|
20
20
|
|
21
|
-
Use the tab key for completion, type "help" for more info, `list_plugins` and `list_commands` for an overview.
|
22
|
-
|
23
21
|
# Syntax
|
24
22
|
|
25
23
|
## Plugins
|
@@ -51,27 +49,42 @@ hook :after_execute do |payload|
|
|
51
49
|
end
|
52
50
|
```
|
53
51
|
|
52
|
+
config:
|
53
|
+
```
|
54
|
+
config_param "foo" [, { options }]
|
55
|
+
config_param! "snafoo" [, { options }]
|
56
|
+
```
|
57
|
+
|
58
|
+
accessing plugin config inside command:
|
59
|
+
```
|
60
|
+
run do |plugin|
|
61
|
+
plugin.config["foo"]
|
62
|
+
end
|
63
|
+
```
|
64
|
+
|
54
65
|
## Commands
|
55
66
|
|
56
67
|
...are loaded from the `commands` folder in a plugin.
|
57
68
|
|
58
|
-
|
69
|
+
Minimally, a command needs only a run block:
|
59
70
|
```
|
60
71
|
run { 42 }
|
61
72
|
```
|
62
73
|
|
63
|
-
|
74
|
+
Also, you can use any of these:
|
64
75
|
```
|
65
76
|
description "Roses are red."
|
66
77
|
|
67
78
|
read_only # => cacheable
|
79
|
+
|
80
|
+
dont_log
|
68
81
|
```
|
69
82
|
|
70
|
-
|
83
|
+
A command can define parameters
|
71
84
|
```
|
72
85
|
param "snafoo" # optional
|
73
86
|
param! "snafoo" # mandatory
|
74
|
-
param! :snafoo # entity
|
87
|
+
param! :snafoo # mandatory entity
|
75
88
|
```
|
76
89
|
param syntax:
|
77
90
|
```
|
@@ -106,12 +119,38 @@ run do |machine|
|
|
106
119
|
end
|
107
120
|
```
|
108
121
|
|
122
|
+
There is special handling in place for block parameters.
|
123
|
+
|
124
|
+
Declare one with
|
125
|
+
```
|
126
|
+
block_param
|
127
|
+
```
|
128
|
+
or
|
129
|
+
```
|
130
|
+
block_param!
|
131
|
+
```
|
132
|
+
and a block can be passed to the command like this:
|
133
|
+
```
|
134
|
+
@op.foo do
|
135
|
+
# whatever you need to do
|
136
|
+
end
|
137
|
+
```
|
138
|
+
From inside your command, you can access the block through the parameter called `block`.
|
139
|
+
|
109
140
|
contribute:
|
110
141
|
```
|
111
142
|
contribute to: "other_command" do |params|
|
112
143
|
end
|
113
144
|
```
|
114
145
|
|
146
|
+
collect contributions:
|
147
|
+
```
|
148
|
+
@op.collect_contributions(
|
149
|
+
command_name: "other_command",
|
150
|
+
raw_params: {}
|
151
|
+
)
|
152
|
+
```
|
153
|
+
|
115
154
|
|
116
155
|
show (display options for shell output):
|
117
156
|
```
|
@@ -139,7 +178,18 @@ deploy package: <foo>
|
|
139
178
|
deploy package: [ <foo>, <bar>, <baz> ]
|
140
179
|
```
|
141
180
|
|
142
|
-
install
|
181
|
+
install a virtualop service:
|
182
|
+
```
|
183
|
+
deploy service: "plugin.service"
|
184
|
+
```
|
185
|
+
|
186
|
+
deploy configuration from a template:
|
187
|
+
```
|
188
|
+
deploy template: "foo.conf.erb",
|
189
|
+
to: "/etc/foo/conf.d/foo.conf"
|
190
|
+
```
|
191
|
+
|
192
|
+
install (configuration for) a debian package repository:
|
143
193
|
```
|
144
194
|
deploy repository: {
|
145
195
|
alias: "funny-name",
|
@@ -157,6 +207,58 @@ deploy do |machine|
|
|
157
207
|
end
|
158
208
|
```
|
159
209
|
|
210
|
+
## Entities
|
211
|
+
|
212
|
+
Each entity is a file in the `/entities` subfolder of a plugin.
|
213
|
+
|
214
|
+
A minimal entity is an array of hashes, each with a unique "name" attribute:
|
215
|
+
|
216
|
+
```
|
217
|
+
entity do
|
218
|
+
[
|
219
|
+
{
|
220
|
+
"name" => "foo"
|
221
|
+
}
|
222
|
+
]
|
223
|
+
end
|
224
|
+
```
|
225
|
+
|
226
|
+
Instead of "name", a differing key attribute can be specified with `key`:
|
227
|
+
```
|
228
|
+
key "path"
|
229
|
+
|
230
|
+
entity do
|
231
|
+
[
|
232
|
+
{
|
233
|
+
"path" => "/bin/false"
|
234
|
+
}
|
235
|
+
]
|
236
|
+
end
|
237
|
+
```
|
238
|
+
|
239
|
+
The `on` keyword allows to stack entities onto another, e.g. the `log` entity living on a machine:
|
240
|
+
```
|
241
|
+
key "path"
|
242
|
+
|
243
|
+
on :machine
|
244
|
+
|
245
|
+
entity do |machine|
|
246
|
+
# ...
|
247
|
+
end
|
248
|
+
```
|
249
|
+
A stacked entity (or rather, the list command generated from the entity) automatically has a parameter for the entity it is stacked on - in the log example:
|
250
|
+
```
|
251
|
+
>> logs?
|
252
|
+
|
253
|
+
logs
|
254
|
+
|
255
|
+
syntax:
|
256
|
+
logs <machine>
|
257
|
+
|
258
|
+
parameters:
|
259
|
+
machine
|
260
|
+
```
|
261
|
+
|
160
262
|
# Development
|
161
263
|
|
162
264
|
## required dependencies
|
data/bin/sidekiq.sh
ADDED
data/exe/vop
CHANGED
File without changes
|
@@ -1,4 +1,5 @@
|
|
1
|
-
param "plugin_filter", description: "name of a plugin by which commands should be filtered"
|
1
|
+
param "plugin_filter", description: "name of a plugin by which commands should be filtered",
|
2
|
+
lookup: lambda { @op.list_plugins }
|
2
3
|
|
3
4
|
run do |plugin_filter|
|
4
5
|
result = @op.commands.values
|
@@ -18,25 +18,21 @@ run do |params|
|
|
18
18
|
|
19
19
|
raise "no such path: #{params["path"]}" unless File.exists? params["path"]
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
# a plugin is a directory
|
21
|
+
# create a new plugin: a plugin is a directory
|
24
22
|
plugin_path = File.join(params["path"], params["name"])
|
25
23
|
puts "plugin path : #{plugin_path}"
|
26
24
|
Dir.mkdir(plugin_path)
|
27
25
|
|
28
|
-
# with subfolders for commands and helpers
|
26
|
+
# ...with subfolders for commands and helpers
|
29
27
|
%w|commands helpers|.each do |thing|
|
30
28
|
Dir.mkdir(File.join(plugin_path, thing))
|
31
29
|
end
|
32
30
|
|
33
|
-
# and a metadata file called "<name>.plugin"
|
31
|
+
# ...and a metadata file called "<name>.plugin"
|
34
32
|
plugin_file = params["name"] + ".plugin"
|
35
33
|
full_name = File.join(plugin_path, plugin_file)
|
36
34
|
FileUtils.touch full_name
|
37
35
|
|
38
|
-
# TODO content is [] - should probably be nil, though
|
39
|
-
#puts "content: >>#{params["content"].pretty_inspect}<<"
|
40
36
|
unless params["content"].nil?
|
41
37
|
IO.write(full_name, params["content"])
|
42
38
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
param "index"
|
2
|
+
|
3
|
+
show display_type: :raw
|
4
|
+
|
5
|
+
run do |shell, index|
|
6
|
+
last_result = shell.last_response&.result
|
7
|
+
|
8
|
+
result = if last_result
|
9
|
+
if last_result.is_a?(Array) && index
|
10
|
+
last_result[index.to_i]
|
11
|
+
else
|
12
|
+
last_result
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
if result.is_a? ::Vop::Entity
|
17
|
+
result.data
|
18
|
+
else
|
19
|
+
result
|
20
|
+
end
|
21
|
+
end
|
@@ -2,10 +2,13 @@ param! "name", lookup: lambda { @op.commands.keys }
|
|
2
2
|
|
3
3
|
run do |params, name|
|
4
4
|
has_vim = `which vim`
|
5
|
-
editor = ENV["EDITOR"]
|
5
|
+
editor = ENV["EDITOR"]
|
6
|
+
if editor.nil?
|
7
|
+
editor = "vim" if has_vim
|
8
|
+
end
|
6
9
|
raise "please set the EDITOR environment variable" unless editor
|
7
10
|
|
8
|
-
command_file = @op.commands[name].source[:file_name]
|
11
|
+
command_file = @op.commands[name].source[:file_name]
|
9
12
|
system("#{editor} #{command_file}")
|
10
13
|
|
11
14
|
@op.reset
|
@@ -1,6 +1,7 @@
|
|
1
1
|
param! "name", lookup: lambda { @op.commands.keys + @op.entities.keys + @op.filters.keys }
|
2
|
+
param "numbers", default: true
|
2
3
|
|
3
|
-
run do |name|
|
4
|
+
run do |name, numbers|
|
4
5
|
(source, thing) = if @op.commands.keys.include? name
|
5
6
|
[ :commands, @op.commands[name] ]
|
6
7
|
elsif @op.entities.keys.include? name
|
@@ -13,9 +14,14 @@ run do |name|
|
|
13
14
|
|
14
15
|
result = []
|
15
16
|
result << " "
|
16
|
-
code.lines.each_with_index
|
17
|
-
|
18
|
-
|
17
|
+
code.lines.each_with_index do |line, idx|
|
18
|
+
line.chomp!
|
19
|
+
line = numbers ?
|
20
|
+
"%02d %s" % [idx+1, line] :
|
21
|
+
line
|
22
|
+
|
23
|
+
result << line
|
24
|
+
end
|
19
25
|
result << " "
|
20
26
|
result.join("\n")
|
21
27
|
end
|
@@ -31,11 +31,17 @@ run do |command_name, raw_params|
|
|
31
31
|
contribution = @op.execute(short_name, raw_params)
|
32
32
|
|
33
33
|
if contribution.nil?
|
34
|
-
$logger.
|
34
|
+
$logger.debug "command #{short_name} contributes a nil value"
|
35
35
|
else
|
36
36
|
case display_type
|
37
37
|
when :table
|
38
|
-
|
38
|
+
if contribution.is_a? Array
|
39
|
+
result += contribution
|
40
|
+
else
|
41
|
+
if target.show_options[:display_type] == :table
|
42
|
+
$logger.warn "contribution from #{short_name} is not an Array (but a #{contribution.class}), though the :table display type would imply that (ignoring)"
|
43
|
+
end
|
44
|
+
end
|
39
45
|
when :hash
|
40
46
|
result.merge! contribution
|
41
47
|
end
|
@@ -4,21 +4,23 @@ run do
|
|
4
4
|
result = []
|
5
5
|
|
6
6
|
@op.entities.each do |entity_name, definition|
|
7
|
-
|
8
|
-
$logger.debug "generating entity list command #{list_command_name} (#{definition.plugin.name})"
|
7
|
+
$logger.debug "generating entity list command #{definition.list_command_name} (#{definition.plugin.name})"
|
9
8
|
|
10
9
|
plugin = definition.plugin
|
11
10
|
|
12
|
-
list_command = Command.new(plugin, list_command_name)
|
13
|
-
|
11
|
+
list_command = Command.new(plugin, definition.list_command_name)
|
12
|
+
list_command.read_only = definition.read_only
|
13
|
+
list_command.dont_log = true
|
14
|
+
list_command.show_options = definition.show_options
|
14
15
|
|
15
16
|
if definition.on
|
16
|
-
list_command.add_param(definition.on.to_s, mandatory: true)
|
17
|
+
list_command.add_param(definition.on.to_s, mandatory: true, entity: true)
|
17
18
|
end
|
18
19
|
|
19
20
|
list_command.block = lambda do |params, request, context, plugin|
|
20
21
|
ex = Executor.new(@op)
|
21
22
|
block_param_names = definition.block.parameters.map { |x| x.last }
|
23
|
+
|
22
24
|
payload = ex.prepare_payload(request, context, block_param_names)
|
23
25
|
|
24
26
|
hash_array = definition.block.call(*payload)
|
@@ -31,11 +33,15 @@ run do
|
|
31
33
|
entity_array = []
|
32
34
|
unless hash_array.empty?
|
33
35
|
first = hash_array.first
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
if first.is_a? Entity
|
37
|
+
entity_array = hash_array
|
38
|
+
else
|
39
|
+
unless first.is_a? Hash
|
40
|
+
raise "entity '#{definition.name}' returned unexpected data type : found #{first.class}, expected Hash"
|
41
|
+
end
|
42
|
+
entity_array = hash_array.map do |row|
|
43
|
+
Entity.new(@op, definition, row)
|
44
|
+
end
|
39
45
|
end
|
40
46
|
end
|
41
47
|
|
@@ -43,6 +49,9 @@ run do
|
|
43
49
|
::Vop::Entities.new(entity_array)
|
44
50
|
end
|
45
51
|
end
|
52
|
+
|
53
|
+
list_command.invalidation_block = definition.invalidation_block
|
54
|
+
|
46
55
|
result << list_command
|
47
56
|
end
|
48
57
|
|
@@ -2,26 +2,36 @@ description "all read-only commands get <command>! commands that invalidate auto
|
|
2
2
|
|
3
3
|
run do
|
4
4
|
count = 0
|
5
|
-
|
6
|
-
|
7
|
-
if
|
8
|
-
invalidation_command_name = "#{command.short_name}!"
|
5
|
+
|
6
|
+
def setup_invalidation_command(thing, invalidation_command_name, command_name)
|
7
|
+
if thing.read_only || thing.invalidation_block
|
9
8
|
$logger.debug "generating invalidation command #{invalidation_command_name}"
|
10
9
|
|
11
|
-
invalidation_command = Command.new(
|
12
|
-
invalidation_command.params =
|
10
|
+
invalidation_command = Command.new(thing.plugin, invalidation_command_name)
|
11
|
+
invalidation_command.params = thing.params
|
13
12
|
|
14
13
|
invalidation_command.block = lambda do |params|
|
15
14
|
@op.invalidate_cache(
|
16
|
-
"command" =>
|
15
|
+
"command" => command_name,
|
17
16
|
"raw_params" => params
|
18
17
|
)
|
19
|
-
@op.execute(
|
18
|
+
@op.execute(command_name, params)
|
20
19
|
end
|
21
20
|
|
22
21
|
@op << invalidation_command
|
23
|
-
count += 1
|
24
22
|
end
|
25
23
|
end
|
24
|
+
|
25
|
+
@op.commands.values.each do |command|
|
26
|
+
setup_invalidation_command(command, "#{command.short_name}!", command.short_name)
|
27
|
+
count += 1
|
28
|
+
end
|
29
|
+
|
30
|
+
# not needed at the moment (because entity list commands are generated with an invalidation block)
|
31
|
+
# @op.entities.values.each do |entity|
|
32
|
+
# setup_invalidation_command(entity, "#{entity.list_command_name}!", entity.list_command_name)
|
33
|
+
# count += 1
|
34
|
+
# end
|
35
|
+
|
26
36
|
count
|
27
37
|
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
description "lists the target commands that a given command contributes to (the contributees so to speak)"
|
2
|
+
|
3
|
+
param! "source_command"
|
4
|
+
|
5
|
+
run do |plugin, source_command|
|
6
|
+
registry = plugin.state[:contributions] || {}
|
7
|
+
|
8
|
+
registry.select { |k,v| v.include? source_command.to_s.carefully_pluralize }.keys
|
9
|
+
end
|