foobara 0.0.8 → 0.0.10
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/CHANGELOG.md +8 -0
- data/projects/command/src/transformed_command.rb +2 -2
- data/projects/command_connectors/lib/foobara/command_connectors.rb +1 -1
- data/projects/command_connectors/src/{commands → command_connector/commands}/describe.rb +2 -6
- data/projects/command_connectors/src/{commands → command_connector/commands}/list_commands.rb +1 -1
- data/projects/command_connectors/src/{commands → command_connector/commands}/ping.rb +1 -1
- data/projects/command_connectors/src/{commands → command_connector/commands}/query_git_commit_info.rb +1 -1
- data/projects/command_connectors/src/{request.rb → command_connector/request.rb} +24 -13
- data/projects/command_connectors/src/{response.rb → command_connector/response.rb} +1 -1
- data/projects/command_connectors/src/command_connector.rb +29 -20
- data/projects/command_connectors/src/command_registry.rb +4 -0
- data/projects/domain/src/domain_module_extension.rb +2 -0
- data/projects/domain/src/module_extension.rb +2 -2
- metadata +9 -37
- data/projects/command_connectors_http/lib/foobara/command_connectors_http.rb +0 -6
- data/projects/command_connectors_http/src/http/commands/get_options.rb +0 -16
- data/projects/command_connectors_http/src/http/commands/help/presenter/command.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/domain.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/entity.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/error.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/model.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/organization.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/processor.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/processor_class.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/root.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter/type.rb +0 -14
- data/projects/command_connectors_http/src/http/commands/help/presenter.rb +0 -178
- data/projects/command_connectors_http/src/http/commands/help/templates/command.html.erb +0 -11
- data/projects/command_connectors_http/src/http/commands/help/templates/domain.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help/templates/entity.html.erb +0 -11
- data/projects/command_connectors_http/src/http/commands/help/templates/error.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help/templates/model.html.erb +0 -8
- data/projects/command_connectors_http/src/http/commands/help/templates/organization.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help/templates/processor.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help/templates/processor_class.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help/templates/root.html.erb +0 -3
- data/projects/command_connectors_http/src/http/commands/help/templates/type.html.erb +0 -1
- data/projects/command_connectors_http/src/http/commands/help.rb +0 -98
- data/projects/command_connectors_http/src/http/request.rb +0 -98
- data/projects/command_connectors_http/src/http/response.rb +0 -14
- data/projects/command_connectors_http/src/http.rb +0 -93
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7077a308e6717ee928b02783aa216a17eadda9f29f1f5a831449a038ac0e864
|
4
|
+
data.tar.gz: 387d8d37306f936d9be1eda46ba150b8de93fc14ee5ef6e2780466200fa48abd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b503fc97d9d287cffc3fd70a70de32ad158e6aebd41a1fcb1700a6bbdd1fde1b6f2e07431d7cd58afe57e4225b265107e746a627a12fb84c38f410c13d3ba342
|
7
|
+
data.tar.gz: f2e2efc432d279ae402f90dd57039a25dda7e4728fc1ff7be1c7882de37890737070beac97584cb9bafa7479d8e9fb9f9aa012e43865ddc033357b9bebaafa57
|
data/CHANGELOG.md
CHANGED
@@ -442,9 +442,9 @@ module Foobara
|
|
442
442
|
end
|
443
443
|
end
|
444
444
|
|
445
|
-
def method_missing(method_name,
|
445
|
+
def method_missing(method_name, ...)
|
446
446
|
if command.respond_to?(method_name)
|
447
|
-
command.send(method_name,
|
447
|
+
command.send(method_name, ...)
|
448
448
|
else
|
449
449
|
# :nocov:
|
450
450
|
super
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Foobara
|
2
|
-
|
2
|
+
class CommandConnector
|
3
3
|
module Commands
|
4
4
|
class Describe < Foobara::Command
|
5
5
|
inputs manifestable: :duck,
|
@@ -24,11 +24,7 @@ module Foobara
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def stamp_request_metadata
|
27
|
-
manifest[:metadata] = {
|
28
|
-
# TODO: why is this here instead of in Http ??
|
29
|
-
url: request.url,
|
30
|
-
when: Time.now
|
31
|
-
}
|
27
|
+
manifest[:metadata] = { when: Time.now }
|
32
28
|
end
|
33
29
|
end
|
34
30
|
end
|
@@ -1,21 +1,32 @@
|
|
1
1
|
module Foobara
|
2
|
-
|
2
|
+
class CommandConnector
|
3
3
|
class Request
|
4
4
|
include TruncatedInspect
|
5
5
|
|
6
6
|
# TODO: this feels like a smell of some sort...
|
7
|
-
attr_accessor :command_class,
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
attr_accessor :command_class,
|
8
|
+
:command,
|
9
|
+
:error,
|
10
|
+
:command_connector,
|
11
|
+
:serializers,
|
12
|
+
:inputs,
|
13
|
+
:full_command_name,
|
14
|
+
:action
|
15
|
+
|
16
|
+
def initialize(**opts)
|
17
|
+
valid_keys = %i[inputs full_command_name action]
|
18
|
+
|
19
|
+
invalid_keys = opts.keys - valid_keys
|
20
|
+
|
21
|
+
unless invalid_keys.empty?
|
22
|
+
# :nocov:
|
23
|
+
raise ArgumentError, "invalid keys: #{invalid_keys} expected only #{valid_keys}"
|
24
|
+
# :nocov:
|
25
|
+
end
|
14
26
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
# :nocov:
|
27
|
+
self.inputs = opts[:inputs] if opts.key?(:inputs)
|
28
|
+
self.action = opts[:action] if opts.key?(:action)
|
29
|
+
self.full_command_name = opts[:full_command_name] if opts.key?(:full_command_name)
|
19
30
|
end
|
20
31
|
|
21
32
|
def serializer
|
@@ -74,7 +85,7 @@ module Foobara
|
|
74
85
|
when Value::Processor
|
75
86
|
object
|
76
87
|
when ::Symbol, ::String
|
77
|
-
klass = Serializer.serializer_from_symbol(object)
|
88
|
+
klass = Foobara::CommandConnectors::Serializer.serializer_from_symbol(object)
|
78
89
|
|
79
90
|
unless klass
|
80
91
|
# :nocov:
|
@@ -78,6 +78,16 @@ module Foobara
|
|
78
78
|
class NoTypeFoundError < NotFoundError; end
|
79
79
|
class NoCommandOrTypeFoundError < NotFoundError; end
|
80
80
|
|
81
|
+
class << self
|
82
|
+
def find_builtin_command_class(command_class_name)
|
83
|
+
Util.find_constant_through_class_hierarchy(self, "Commands::#{command_class_name}")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def find_builtin_command_class(command_class_name)
|
88
|
+
self.class.find_builtin_command_class(command_class_name)
|
89
|
+
end
|
90
|
+
|
81
91
|
foobara_delegate :add_default_inputs_transformer,
|
82
92
|
:add_default_result_transformer,
|
83
93
|
:add_default_errors_transformer,
|
@@ -126,7 +136,7 @@ module Foobara
|
|
126
136
|
# :nocov:
|
127
137
|
end
|
128
138
|
|
129
|
-
command_class =
|
139
|
+
command_class = find_builtin_command_class("Describe")
|
130
140
|
full_command_name = command_class.full_command_name
|
131
141
|
|
132
142
|
inputs = { manifestable:, request: }
|
@@ -141,7 +151,7 @@ module Foobara
|
|
141
151
|
# :nocov:
|
142
152
|
end
|
143
153
|
|
144
|
-
command_class =
|
154
|
+
command_class = find_builtin_command_class("Describe")
|
145
155
|
full_command_name = command_class.full_command_name
|
146
156
|
|
147
157
|
inputs = { manifestable: transformed_command_class, request: }
|
@@ -156,49 +166,41 @@ module Foobara
|
|
156
166
|
# :nocov:
|
157
167
|
end
|
158
168
|
|
159
|
-
command_class =
|
169
|
+
command_class = find_builtin_command_class("Describe")
|
160
170
|
full_command_name = command_class.full_command_name
|
161
171
|
|
162
172
|
inputs = { manifestable: type, request: }
|
163
173
|
transformed_command_class = transformed_command_from_name(full_command_name) ||
|
164
174
|
transform_command_class(command_class)
|
165
175
|
when "manifest"
|
166
|
-
command_class =
|
176
|
+
command_class = find_builtin_command_class("Describe")
|
167
177
|
full_command_name = command_class.full_command_name
|
168
178
|
|
169
179
|
inputs = { manifestable: self, request: }
|
170
180
|
transformed_command_class = transformed_command_from_name(full_command_name) ||
|
171
181
|
transform_command_class(command_class)
|
172
182
|
when "ping"
|
173
|
-
command_class =
|
183
|
+
command_class = find_builtin_command_class("Ping")
|
174
184
|
full_command_name = command_class.full_command_name
|
175
185
|
|
176
186
|
transformed_command_class = transformed_command_from_name(full_command_name) ||
|
177
187
|
transform_command_class(command_class)
|
178
188
|
when "query_git_commit_info"
|
179
189
|
# TODO: this feels out of control... should just accomplish this through run I think instead. Same with ping.
|
180
|
-
command_class =
|
190
|
+
command_class = find_builtin_command_class("QueryGitCommitInfo")
|
181
191
|
full_command_name = command_class.full_command_name
|
182
192
|
|
183
193
|
transformed_command_class = transformed_command_from_name(full_command_name) ||
|
184
194
|
transform_command_class(command_class)
|
185
195
|
when "help"
|
186
|
-
command_class =
|
196
|
+
command_class = find_builtin_command_class("Help")
|
187
197
|
full_command_name = command_class.full_command_name
|
188
198
|
|
189
199
|
inputs = { request: }
|
190
200
|
transformed_command_class = transformed_command_from_name(full_command_name) ||
|
191
201
|
transform_command_class(command_class)
|
192
202
|
when "list"
|
193
|
-
|
194
|
-
command_class = if mod.const_defined?(:ListCommands)
|
195
|
-
# TODO: test this
|
196
|
-
# :nocov:
|
197
|
-
mod::ListCommands
|
198
|
-
# :nocov:
|
199
|
-
else
|
200
|
-
CommandConnectors::Commands::ListCommands
|
201
|
-
end
|
203
|
+
command_class = find_builtin_command_class("ListCommands")
|
202
204
|
|
203
205
|
full_command_name = command_class.full_command_name
|
204
206
|
|
@@ -226,10 +228,17 @@ module Foobara
|
|
226
228
|
command_registry.create_exposed_command_without_domain(klass).transformed_command_class
|
227
229
|
end
|
228
230
|
|
229
|
-
def request_to_response(
|
230
|
-
|
231
|
-
|
232
|
-
|
231
|
+
def request_to_response(request)
|
232
|
+
command = request.command
|
233
|
+
outcome = command.outcome
|
234
|
+
|
235
|
+
status = outcome.success? ? 0 : 1
|
236
|
+
|
237
|
+
# TODO: feels awkward to call this here... Maybe use result/errors transformers instead??
|
238
|
+
# Or call the serializer here??
|
239
|
+
body = command.respond_to?(:serialize_result) ? command.serialize_result : request.response_body
|
240
|
+
|
241
|
+
self.class::Response.new(request:, status:, body:)
|
233
242
|
end
|
234
243
|
|
235
244
|
def initialize(authenticator: nil, default_serializers: nil)
|
@@ -104,6 +104,8 @@ module Foobara
|
|
104
104
|
break if child.foobara_domain?
|
105
105
|
|
106
106
|
break if child.foobara_organization?
|
107
|
+
|
108
|
+
# TODO: unclear why we need this check, hmmm, figure it out and document it (or delete if not needed)
|
107
109
|
break if child.constants(false).any? do |constant|
|
108
110
|
value = child.const_get(constant)
|
109
111
|
|
@@ -15,8 +15,6 @@ module Foobara
|
|
15
15
|
# :nocov:
|
16
16
|
end
|
17
17
|
|
18
|
-
include(DomainModuleExtension)
|
19
|
-
|
20
18
|
unless is_a?(Namespace::IsNamespace)
|
21
19
|
foobara_namespace!
|
22
20
|
foobara_autoset_namespace!(default_namespace: Foobara::GlobalOrganization)
|
@@ -28,6 +26,8 @@ module Foobara
|
|
28
26
|
self.foobara_parent_namespace = parent
|
29
27
|
end
|
30
28
|
|
29
|
+
include(DomainModuleExtension)
|
30
|
+
|
31
31
|
children = foobara_children
|
32
32
|
children = children.sort_by { |child| child.scoped_path.size }
|
33
33
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foobara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miles Georgi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: foobara-util
|
@@ -137,17 +137,17 @@ files:
|
|
137
137
|
- projects/command/src/transformed_command.rb
|
138
138
|
- projects/command_connectors/lib/foobara/command_connectors.rb
|
139
139
|
- projects/command_connectors/src/command_connector.rb
|
140
|
+
- projects/command_connectors/src/command_connector/commands/describe.rb
|
141
|
+
- projects/command_connectors/src/command_connector/commands/list_commands.rb
|
142
|
+
- projects/command_connectors/src/command_connector/commands/ping.rb
|
143
|
+
- projects/command_connectors/src/command_connector/commands/query_git_commit_info.rb
|
144
|
+
- projects/command_connectors/src/command_connector/request.rb
|
145
|
+
- projects/command_connectors/src/command_connector/response.rb
|
140
146
|
- projects/command_connectors/src/command_registry.rb
|
141
147
|
- projects/command_connectors/src/command_registry/allowed_rule.rb
|
142
148
|
- projects/command_connectors/src/command_registry/exposed_command.rb
|
143
149
|
- projects/command_connectors/src/command_registry/exposed_domain.rb
|
144
150
|
- projects/command_connectors/src/command_registry/exposed_organization.rb
|
145
|
-
- projects/command_connectors/src/commands/describe.rb
|
146
|
-
- projects/command_connectors/src/commands/list_commands.rb
|
147
|
-
- projects/command_connectors/src/commands/ping.rb
|
148
|
-
- projects/command_connectors/src/commands/query_git_commit_info.rb
|
149
|
-
- projects/command_connectors/src/request.rb
|
150
|
-
- projects/command_connectors/src/response.rb
|
151
151
|
- projects/command_connectors/src/serializer.rb
|
152
152
|
- projects/command_connectors/src/serializers/aggregate_serializer.rb
|
153
153
|
- projects/command_connectors/src/serializers/atomic_serializer.rb
|
@@ -160,33 +160,6 @@ files:
|
|
160
160
|
- projects/command_connectors/src/serializers/yaml_serializer.rb
|
161
161
|
- projects/command_connectors/src/transformers/auth_errors_transformer.rb
|
162
162
|
- projects/command_connectors/src/transformers/load_aggregates_pre_commit_transformer.rb
|
163
|
-
- projects/command_connectors_http/lib/foobara/command_connectors_http.rb
|
164
|
-
- projects/command_connectors_http/src/http.rb
|
165
|
-
- projects/command_connectors_http/src/http/commands/get_options.rb
|
166
|
-
- projects/command_connectors_http/src/http/commands/help.rb
|
167
|
-
- projects/command_connectors_http/src/http/commands/help/presenter.rb
|
168
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/command.rb
|
169
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/domain.rb
|
170
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/entity.rb
|
171
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/error.rb
|
172
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/model.rb
|
173
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/organization.rb
|
174
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/processor.rb
|
175
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/processor_class.rb
|
176
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/root.rb
|
177
|
-
- projects/command_connectors_http/src/http/commands/help/presenter/type.rb
|
178
|
-
- projects/command_connectors_http/src/http/commands/help/templates/command.html.erb
|
179
|
-
- projects/command_connectors_http/src/http/commands/help/templates/domain.html.erb
|
180
|
-
- projects/command_connectors_http/src/http/commands/help/templates/entity.html.erb
|
181
|
-
- projects/command_connectors_http/src/http/commands/help/templates/error.html.erb
|
182
|
-
- projects/command_connectors_http/src/http/commands/help/templates/model.html.erb
|
183
|
-
- projects/command_connectors_http/src/http/commands/help/templates/organization.html.erb
|
184
|
-
- projects/command_connectors_http/src/http/commands/help/templates/processor.html.erb
|
185
|
-
- projects/command_connectors_http/src/http/commands/help/templates/processor_class.html.erb
|
186
|
-
- projects/command_connectors_http/src/http/commands/help/templates/root.html.erb
|
187
|
-
- projects/command_connectors_http/src/http/commands/help/templates/type.html.erb
|
188
|
-
- projects/command_connectors_http/src/http/request.rb
|
189
|
-
- projects/command_connectors_http/src/http/response.rb
|
190
163
|
- projects/common/lib/foobara/common.rb
|
191
164
|
- projects/common/src/data_path.rb
|
192
165
|
- projects/common/src/error.rb
|
@@ -395,7 +368,6 @@ require_paths:
|
|
395
368
|
- "./projects/callback/lib"
|
396
369
|
- "./projects/command/lib"
|
397
370
|
- "./projects/command_connectors/lib"
|
398
|
-
- "./projects/command_connectors_http/lib"
|
399
371
|
- "./projects/common/lib"
|
400
372
|
- "./projects/concerns/lib"
|
401
373
|
- "./projects/delegate/lib"
|
@@ -427,7 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
427
399
|
- !ruby/object:Gem::Version
|
428
400
|
version: '0'
|
429
401
|
requirements: []
|
430
|
-
rubygems_version: 3.
|
402
|
+
rubygems_version: 3.5.22
|
431
403
|
signing_key:
|
432
404
|
specification_version: 4
|
433
405
|
summary: Implements command pattern for encapsulating and managing domain complexity
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Foobara
|
2
|
-
module CommandConnectors
|
3
|
-
class Http < CommandConnector
|
4
|
-
module Commands
|
5
|
-
# TODO: this is a bit of a hack, just a total no-op... shouldn't really need this command at all ideally
|
6
|
-
class GetOptions < Foobara::Command
|
7
|
-
result :string
|
8
|
-
|
9
|
-
def execute
|
10
|
-
""
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,178 +0,0 @@
|
|
1
|
-
require_relative "presenter/command"
|
2
|
-
require_relative "presenter/entity"
|
3
|
-
require_relative "presenter/error"
|
4
|
-
require_relative "presenter/model"
|
5
|
-
require_relative "presenter/organization"
|
6
|
-
require_relative "presenter/domain"
|
7
|
-
require_relative "presenter/processor"
|
8
|
-
require_relative "presenter/processor_class"
|
9
|
-
require_relative "presenter/root"
|
10
|
-
require_relative "presenter/type"
|
11
|
-
|
12
|
-
module Foobara
|
13
|
-
module CommandConnectors
|
14
|
-
class Http < CommandConnector
|
15
|
-
module Commands
|
16
|
-
class Help < Command
|
17
|
-
class Presenter
|
18
|
-
class << self
|
19
|
-
def for(manifest)
|
20
|
-
case manifest
|
21
|
-
when Manifest::RootManifest
|
22
|
-
Presenter::Root
|
23
|
-
when Manifest::Command
|
24
|
-
Presenter::Command
|
25
|
-
when Manifest::Entity
|
26
|
-
Presenter::Entity
|
27
|
-
when Manifest::Model
|
28
|
-
Presenter::Model
|
29
|
-
when Manifest::Type
|
30
|
-
Presenter::Type
|
31
|
-
when Manifest::Error
|
32
|
-
Presenter::Error
|
33
|
-
when Manifest::Domain
|
34
|
-
Presenter::Domain
|
35
|
-
when Manifest::Organization
|
36
|
-
Presenter::Organization
|
37
|
-
when Manifest::Processor
|
38
|
-
Presenter::Processor
|
39
|
-
when Manifest::ProcessorClass
|
40
|
-
Presenter::ProcessorClass
|
41
|
-
else
|
42
|
-
# :nocov:
|
43
|
-
raise "No presenter found for #{manifest.path}"
|
44
|
-
# :nocov:
|
45
|
-
end.new(manifest)
|
46
|
-
end
|
47
|
-
|
48
|
-
def template_symbol
|
49
|
-
Util.underscore(Util.non_full_name(self))
|
50
|
-
end
|
51
|
-
|
52
|
-
def template_path
|
53
|
-
template_path = File.join(
|
54
|
-
__dir__,
|
55
|
-
"templates",
|
56
|
-
"#{template_symbol}.html.erb"
|
57
|
-
)
|
58
|
-
Pathname.new(template_path).cleanpath.to_s
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
attr_accessor :manifest
|
63
|
-
|
64
|
-
def initialize(manifest)
|
65
|
-
self.manifest = manifest
|
66
|
-
end
|
67
|
-
|
68
|
-
def render_html_list(data, skip_wrapper: false)
|
69
|
-
html = ""
|
70
|
-
|
71
|
-
case data
|
72
|
-
when ::Hash
|
73
|
-
html << "<ul>" unless skip_wrapper
|
74
|
-
data.each do |key, value|
|
75
|
-
html << "<li>#{key}"
|
76
|
-
html << "<ul>"
|
77
|
-
html << render_html_list(value, skip_wrapper: true)
|
78
|
-
html << "</ul>"
|
79
|
-
html << "</li>"
|
80
|
-
end
|
81
|
-
html << "</ul>" unless skip_wrapper
|
82
|
-
when ::Array
|
83
|
-
html << "<ul>" unless skip_wrapper
|
84
|
-
data.each do |item|
|
85
|
-
html << render_html_list(item)
|
86
|
-
end
|
87
|
-
html << "</ul>" unless skip_wrapper
|
88
|
-
when Manifest::Attributes
|
89
|
-
html << "<ul>" unless skip_wrapper
|
90
|
-
data.relevant_manifest.each_pair do |key, value|
|
91
|
-
if key.to_s == "type"
|
92
|
-
next
|
93
|
-
end
|
94
|
-
|
95
|
-
if key.to_s == "element_type_declarations"
|
96
|
-
key = :attributes
|
97
|
-
value = data.attribute_declarations
|
98
|
-
end
|
99
|
-
html << "<li>#{key}"
|
100
|
-
html << "<ul>"
|
101
|
-
html << render_html_list(value, skip_wrapper: true)
|
102
|
-
html << "</ul>"
|
103
|
-
html << "</li>"
|
104
|
-
end
|
105
|
-
html << "</ul>" unless skip_wrapper
|
106
|
-
when Manifest::Array
|
107
|
-
html << "<ul>" unless skip_wrapper
|
108
|
-
data.relevant_manifest.each_pair do |key, value|
|
109
|
-
next if key == :element_type_declaration
|
110
|
-
|
111
|
-
if key.to_s == "type"
|
112
|
-
value = root_manifest.lookup_path(key, value)
|
113
|
-
end
|
114
|
-
html << "<li>#{key}"
|
115
|
-
html << "<ul>"
|
116
|
-
html << render_html_list(value, skip_wrapper: true)
|
117
|
-
html << "</ul>"
|
118
|
-
html << "</li>"
|
119
|
-
end
|
120
|
-
html << render_html_list({ element_type: data.element_type }, skip_wrapper: true)
|
121
|
-
html << "</ul>" unless skip_wrapper
|
122
|
-
when Manifest::TypeDeclaration
|
123
|
-
html << "<ul>" unless skip_wrapper
|
124
|
-
data.relevant_manifest.each_pair do |key, value|
|
125
|
-
if key.to_s == "type"
|
126
|
-
value = root_manifest.lookup_path(key, value)
|
127
|
-
end
|
128
|
-
html << "<li>#{key}"
|
129
|
-
html << "<ul>"
|
130
|
-
html << render_html_list(value, skip_wrapper: true)
|
131
|
-
html << "</ul>"
|
132
|
-
html << "</li>"
|
133
|
-
end
|
134
|
-
html << "</ul>" unless skip_wrapper
|
135
|
-
when Manifest::Type, Manifest::Command, Manifest::Error
|
136
|
-
html << foobara_reference_link(data)
|
137
|
-
when Manifest::PossibleError
|
138
|
-
html << render_html_list(data.error)
|
139
|
-
else
|
140
|
-
html << "<li>#{data}</li>"
|
141
|
-
end
|
142
|
-
|
143
|
-
html
|
144
|
-
end
|
145
|
-
|
146
|
-
def foobara_reference_link(manifest)
|
147
|
-
path = "/help/#{manifest.reference}"
|
148
|
-
|
149
|
-
"<a href=\"#{path}\">#{manifest.reference.split("::").last}</a>"
|
150
|
-
end
|
151
|
-
|
152
|
-
def root_manifest
|
153
|
-
@root_manifest ||= Manifest::RootManifest.new(manifest.root_manifest)
|
154
|
-
end
|
155
|
-
|
156
|
-
def template_path
|
157
|
-
self.class.template_path
|
158
|
-
end
|
159
|
-
|
160
|
-
def method_missing(method_name, *, &)
|
161
|
-
if manifest.respond_to?(method_name)
|
162
|
-
manifest.send(method_name, *, &)
|
163
|
-
else
|
164
|
-
# :nocov:
|
165
|
-
super
|
166
|
-
# :nocov:
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def respond_to_missing?(method_name, include_private = false)
|
171
|
-
manifest.respond_to?(method_name, include_private)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_domain_name %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_error_name %>
|
data/projects/command_connectors_http/src/http/commands/help/templates/organization.html.erb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_organization_name %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_processor_name %>
|
data/projects/command_connectors_http/src/http/commands/help/templates/processor_class.html.erb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_processor_class_name %>
|
@@ -1 +0,0 @@
|
|
1
|
-
<%= full_type_name %>
|
@@ -1,98 +0,0 @@
|
|
1
|
-
module Foobara
|
2
|
-
module CommandConnectors
|
3
|
-
class Http < CommandConnector
|
4
|
-
module Commands
|
5
|
-
class Help < Command
|
6
|
-
description "Will extract items from the request to help with. Assumes the help is desired in HTML format"
|
7
|
-
inputs request: Request
|
8
|
-
result :string
|
9
|
-
possible_error CommandConnector::NotFoundError
|
10
|
-
|
11
|
-
def execute
|
12
|
-
load_manifest
|
13
|
-
determine_object_to_help_with
|
14
|
-
build_presenter
|
15
|
-
load_template
|
16
|
-
generate_html_from_template
|
17
|
-
set_header_to_html
|
18
|
-
|
19
|
-
html
|
20
|
-
end
|
21
|
-
|
22
|
-
attr_accessor :raw_manifest, :root_manifest, :object_to_help_with, :template, :html, :presenter
|
23
|
-
|
24
|
-
def load_manifest
|
25
|
-
self.raw_manifest = command_connector.foobara_manifest
|
26
|
-
self.root_manifest = Manifest::RootManifest.new(raw_manifest)
|
27
|
-
end
|
28
|
-
|
29
|
-
def determine_object_to_help_with(mode: Namespace::LookupMode::ABSOLUTE)
|
30
|
-
arg = request.argument
|
31
|
-
|
32
|
-
if arg
|
33
|
-
result = command_connector.command_registry.foobara_lookup(arg, mode:)
|
34
|
-
|
35
|
-
if result
|
36
|
-
self.object_to_help_with = result
|
37
|
-
else
|
38
|
-
result = GlobalOrganization.foobara_lookup(arg, mode:)
|
39
|
-
|
40
|
-
if result && root_manifest.contains?(result.foobara_manifest_reference,
|
41
|
-
result.scoped_category)
|
42
|
-
self.object_to_help_with = result
|
43
|
-
elsif mode == Namespace::LookupMode::ABSOLUTE
|
44
|
-
determine_object_to_help_with(mode: Namespace::LookupMode::GENERAL)
|
45
|
-
elsif mode == Namespace::LookupMode::GENERAL
|
46
|
-
determine_object_to_help_with(mode: Namespace::LookupMode::RELAXED)
|
47
|
-
else
|
48
|
-
# TODO: add an input error instead for missing record to trigger 404
|
49
|
-
add_runtime_error(CommandConnector::NotFoundError.new(arg))
|
50
|
-
end
|
51
|
-
end
|
52
|
-
else
|
53
|
-
self.object_to_help_with = root_manifest
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def build_presenter
|
58
|
-
self.presenter = Help::Presenter.for(manifest_to_help_with)
|
59
|
-
end
|
60
|
-
|
61
|
-
def template_path
|
62
|
-
presenter.template_path
|
63
|
-
end
|
64
|
-
|
65
|
-
def load_template
|
66
|
-
template_body = File.read(template_path)
|
67
|
-
|
68
|
-
erb = ERB.new(template_body)
|
69
|
-
erb.filename = template_path
|
70
|
-
|
71
|
-
self.template = erb
|
72
|
-
end
|
73
|
-
|
74
|
-
def generate_html_from_template
|
75
|
-
self.html = template.result(presenter.instance_eval { binding })
|
76
|
-
end
|
77
|
-
|
78
|
-
def set_header_to_html
|
79
|
-
request.response_headers ||= {}
|
80
|
-
request.response_headers = request.response_headers.merge("content-type" => "text/html")
|
81
|
-
end
|
82
|
-
|
83
|
-
def manifest_to_help_with
|
84
|
-
@manifest_to_help_with ||= if object_to_help_with.is_a?(Manifest::BaseManifest)
|
85
|
-
object_to_help_with
|
86
|
-
else
|
87
|
-
root_manifest.lookup(object_to_help_with.foobara_manifest_reference)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def command_connector
|
92
|
-
request.command_connector
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,98 +0,0 @@
|
|
1
|
-
require "uri"
|
2
|
-
|
3
|
-
module Foobara
|
4
|
-
module CommandConnectors
|
5
|
-
class Http < CommandConnector
|
6
|
-
class Request < CommandConnectors::Request
|
7
|
-
attr_accessor :path,
|
8
|
-
:method,
|
9
|
-
:headers,
|
10
|
-
:query_string,
|
11
|
-
:body,
|
12
|
-
:scheme,
|
13
|
-
:host,
|
14
|
-
:port,
|
15
|
-
:cookies,
|
16
|
-
:remote_ip,
|
17
|
-
:response_headers
|
18
|
-
|
19
|
-
def initialize(
|
20
|
-
path:,
|
21
|
-
method: nil,
|
22
|
-
headers: {},
|
23
|
-
query_string: "",
|
24
|
-
body: "",
|
25
|
-
scheme: nil,
|
26
|
-
host: nil,
|
27
|
-
port: nil,
|
28
|
-
cookies: nil,
|
29
|
-
remote_ip: nil
|
30
|
-
)
|
31
|
-
self.path = path
|
32
|
-
self.method = method
|
33
|
-
self.headers = headers
|
34
|
-
self.query_string = query_string
|
35
|
-
self.body = body
|
36
|
-
self.scheme = scheme
|
37
|
-
self.host = host
|
38
|
-
self.port = port
|
39
|
-
self.cookies = cookies
|
40
|
-
self.remote_ip = remote_ip
|
41
|
-
|
42
|
-
super()
|
43
|
-
end
|
44
|
-
|
45
|
-
def url
|
46
|
-
URI::Generic.build(
|
47
|
-
scheme:,
|
48
|
-
host:,
|
49
|
-
port:,
|
50
|
-
path:,
|
51
|
-
query: query_string.nil? || query_string.empty? ? nil : query_string
|
52
|
-
).to_s
|
53
|
-
end
|
54
|
-
|
55
|
-
def inputs
|
56
|
-
@inputs ||= parsed_body.merge(parsed_query_string)
|
57
|
-
end
|
58
|
-
|
59
|
-
def full_command_name
|
60
|
-
unless defined?(@full_command_name)
|
61
|
-
set_action_and_command_name
|
62
|
-
end
|
63
|
-
|
64
|
-
@full_command_name
|
65
|
-
end
|
66
|
-
|
67
|
-
def parsed_body
|
68
|
-
body.empty? ? {} : JSON.parse(body)
|
69
|
-
end
|
70
|
-
|
71
|
-
def parsed_query_string
|
72
|
-
if query_string.nil? || query_string.empty?
|
73
|
-
{}
|
74
|
-
else
|
75
|
-
# TODO: override this in rack connector to use better rack utils
|
76
|
-
CGI.parse(query_string).transform_values!(&:first)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def action
|
81
|
-
unless defined?(@action)
|
82
|
-
set_action_and_command_name
|
83
|
-
end
|
84
|
-
|
85
|
-
@action
|
86
|
-
end
|
87
|
-
|
88
|
-
def argument
|
89
|
-
path.split("/")[2]
|
90
|
-
end
|
91
|
-
|
92
|
-
def set_action_and_command_name
|
93
|
-
@action, @full_command_name = path[1..].split("/")
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
module Foobara
|
2
|
-
module CommandConnectors
|
3
|
-
class Http < CommandConnector
|
4
|
-
include TruncatedInspect
|
5
|
-
|
6
|
-
def request_to_command(context)
|
7
|
-
if context.method == "OPTIONS"
|
8
|
-
# TODO: this feels a bit hacky and like overkill...
|
9
|
-
return Foobara::CommandConnectors::Http::Commands::GetOptions.new
|
10
|
-
end
|
11
|
-
|
12
|
-
command = super
|
13
|
-
|
14
|
-
if context.action == "help"
|
15
|
-
# Let's unwrap the transformed command to avoid serialization
|
16
|
-
# TODO: maybe instead register Help without serializers?
|
17
|
-
command = command.command
|
18
|
-
end
|
19
|
-
|
20
|
-
command
|
21
|
-
end
|
22
|
-
|
23
|
-
# TODO: eliminate passing the command here...
|
24
|
-
def request_to_response(request)
|
25
|
-
command = request.command
|
26
|
-
outcome = command.outcome
|
27
|
-
|
28
|
-
# TODO: feels awkward to call this here... Maybe use result/errors transformers instead??
|
29
|
-
# Or call the serializer here??
|
30
|
-
body = command.respond_to?(:serialize_result) ? command.serialize_result : outcome.result
|
31
|
-
|
32
|
-
status = if outcome.success?
|
33
|
-
200
|
34
|
-
else
|
35
|
-
errors = outcome.errors
|
36
|
-
|
37
|
-
if errors.size == 1
|
38
|
-
error = errors.first
|
39
|
-
|
40
|
-
case error
|
41
|
-
when CommandConnector::UnknownError
|
42
|
-
500
|
43
|
-
when CommandConnector::NotFoundError, Foobara::Entity::NotFoundError
|
44
|
-
# TODO: we should not be coupled to Entities here...
|
45
|
-
body ||= "Not found"
|
46
|
-
404
|
47
|
-
when CommandConnector::UnauthenticatedError
|
48
|
-
401
|
49
|
-
when CommandConnector::NotAllowedError
|
50
|
-
403
|
51
|
-
end
|
52
|
-
end || 422
|
53
|
-
end
|
54
|
-
|
55
|
-
headers = headers_for(request)
|
56
|
-
|
57
|
-
Response.new(status:, headers:, body:, request:)
|
58
|
-
end
|
59
|
-
|
60
|
-
def headers_for(request)
|
61
|
-
response_headers = request.response_headers
|
62
|
-
|
63
|
-
if response_headers.nil? || !response_headers.key?("content-type")
|
64
|
-
if request.command.respond_to?(:serialize_result)
|
65
|
-
# TODO: we should ask the request this not the command.
|
66
|
-
if request.command.serializers.include?(Serializers::JsonSerializer)
|
67
|
-
response_headers = (response_headers || {}).merge("content-type" => "application/json")
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
if response_headers
|
73
|
-
static_headers.merge(response_headers)
|
74
|
-
else
|
75
|
-
static_headers.dup
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
private
|
80
|
-
|
81
|
-
def static_headers
|
82
|
-
@static_headers ||= ENV.each_with_object({}) do |(key, value), headers|
|
83
|
-
match = key.match(/\AFOOBARA_HTTP_RESPONSE_HEADER_(.*)\z/)
|
84
|
-
|
85
|
-
if match
|
86
|
-
header_name = match[1].downcase.tr("_", "-")
|
87
|
-
headers[header_name] = value
|
88
|
-
end
|
89
|
-
end.freeze
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|