hub_kernel-api 0.7.0 → 0.9.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 012cd9631dd8925bcd3d6982acc076ee8ade6a159dbca527d3618ba4ff80eec4
4
- data.tar.gz: 98850fb2e56aca0a182d1f70adc2deedb440e9b54f0f188e321a2738034d8991
3
+ metadata.gz: db1ce3a434c4f5c216ee183a431c31b983481255e1b277d74b061e9c6fbd57bd
4
+ data.tar.gz: 2e70a8aa06c9602d9b30cc9b9946bd432b5f58fefb54368e05829f4f4b20f66d
5
5
  SHA512:
6
- metadata.gz: b2e7fc3101f127f70f515be313c0532efd5a64bce8f568dc693fa2e7e3a962dad5703ea5a295e3020cc56b644fc283854a140ac24d7f588d891227b30934bf70
7
- data.tar.gz: 67b21cabf1dd75ad74c7c97a3d908432a7c508c5fd39b13a3108a63ede102b8864fc4dde26c47f6da666dbdd3234351e764a3d1d0f6431d4275fc94f7dbb12e9
6
+ metadata.gz: d872502bd39dd53ccad7391f327c1184aad52334ee0779d6f1491d1fb336118d0f0ee34f93164f70c0dda48a480b890173a46c500ef0731971ecb41ee4b79793
7
+ data.tar.gz: 5c372f040e56f64de05b83f1752928083105cfae076c20dd1ad09850152a990d918698e51cdd20c55c6495bc8890f79ec4b59557e2561306dc0dcae28a3cc162
data/README.md CHANGED
@@ -22,11 +22,20 @@ Rails.application.config.to_prepare do
22
22
  end
23
23
  ```
24
24
 
25
+ When `HubKernel::Api.person_method` or `HubKernel::Api.account_method` is not set, the JSON
26
+ API uses `HubKernel::Interface.person_method` or `HubKernel::Interface.account_method`, so a
27
+ host that also serves hub_kernel-mcp can name the caller once in hub_kernel-interface. The
28
+ JSON API's own setting is used when it is set.
29
+
25
30
  `HubKernel::Api.check!` raises `HubKernel::Api::UnservableHubError` when a served entry
26
31
  exposes no methods, when two served hubs answer at the same address, or when a served
27
32
  hub's exposed list has a problem, naming each. Inside `to_prepare` it runs again after
28
33
  every code reload.
29
34
 
35
+ `HubKernel::Api.hubs` reads and writes hub_kernel-interface's one served list,
36
+ `HubKernel::Interface.hubs`, so every interface gem in the host, such as hub_kernel-mcp,
37
+ serves the same hubs at the same names. The list is set once, through either gem.
38
+
30
39
  The base controller's own sign-in runs before every call. The permission check and account
31
40
  scope must also be set, `HubKernel::Authz.check` and `HubKernel::Context.scope`, as
32
41
  hub_kernel-interface's readme describes. Mount the engine:
@@ -8,8 +8,8 @@ module HubKernel
8
8
 
9
9
  def answer
10
10
  raise ActionController::RoutingError, "Not found" unless asked_with_the_right_verb?
11
- return refuse_unlisted_values if unlisted_values.any?
12
11
 
12
+ HubKernel::Interface::CallReasons.refuse_unlisted_values(hub, params[:name], values: values, person: caller_person, account: caller_account)
13
13
  render json: { answer: hub.call_exposed(params[:name], values: values, person: caller_person, account: caller_account) }
14
14
  end
15
15
 
@@ -17,23 +17,11 @@ module HubKernel
17
17
 
18
18
  def asked_with_the_right_verb? = hub.exposed(params[:name])&.writes == request.post?
19
19
 
20
- def refuse_unlisted_values
21
- raise HubKernel::NotAllowed unless permitted?
22
-
23
- refused(HubKernel::Refused.new("#{params[:name]} does not take #{unlisted_values.join(", ")}"))
24
- end
25
-
26
- def permitted? = hub.exposures_for(person: caller_person, account: caller_account).any? { |exposure| exposure.name.to_s == params[:name] }
27
-
28
- def unlisted_values = values.keys - hub.exposed(params[:name]).takes
29
-
30
20
  def values = request.query_parameters.merge(request.request_parameters).deep_symbolize_keys
31
21
 
32
22
  def refused(refusal) = render(json: { error: refusal.message }, status: :unprocessable_content)
33
23
 
34
- def missing_record(missing)
35
- render json: { error: "No #{missing.model.demodulize.underscore.humanize(capitalize: false)} has the id #{missing.id}" }, status: :not_found
36
- end
24
+ def missing_record(missing) = render(json: { error: HubKernel::Interface::CallReasons.missing_record(missing) }, status: :not_found)
37
25
  end
38
26
  end
39
27
  end
@@ -7,9 +7,9 @@ module HubKernel
7
7
 
8
8
  def hub = @hub ||= HubKernel::Api.find(params[:hub]) || raise(ActionController::RoutingError, "Not found")
9
9
 
10
- def caller_person = send(HubKernel::Api.person_method)
10
+ def caller_person = send(HubKernel::Api.person_method || HubKernel::Interface.person_method)
11
11
 
12
- def caller_account = send(HubKernel::Api.account_method)
12
+ def caller_account = send(HubKernel::Api.account_method || HubKernel::Interface.account_method)
13
13
 
14
14
  def not_found = render(json: { error: "Not found" }, status: :not_found)
15
15
  end
@@ -1,5 +1,5 @@
1
1
  module HubKernel
2
2
  module Api
3
- VERSION = "0.7.0"
3
+ VERSION = "0.9.0"
4
4
  end
5
5
  end
@@ -4,33 +4,20 @@ require "hub_kernel/api/engine"
4
4
 
5
5
  module HubKernel
6
6
  module Api
7
- class UnservableHubError < StandardError; end
7
+ UnservableHubError = HubKernel::Interface::UnservableHubError
8
8
 
9
- mattr_accessor :hubs, default: []
10
9
  mattr_accessor :base_controller, default: "ActionController::API"
11
10
  mattr_accessor :person_method
12
11
  mattr_accessor :account_method
13
12
 
14
- def self.find(name) = addresses[name]
13
+ def self.hubs = HubKernel::Interface.hubs
15
14
 
16
- def self.check!
17
- problems = unexposed_hubs + shared_addresses + exposure_problems
18
- raise UnservableHubError, problems.join("\n") if problems.any?
15
+ def self.hubs=(hubs)
16
+ HubKernel::Interface.hubs = hubs
19
17
  end
20
18
 
21
- def self.addresses = served.to_h
19
+ def self.find(name) = HubKernel::Interface.find(name)
22
20
 
23
- def self.served = hubs.flat_map { |entry| entry.is_a?(Hash) ? entry.to_a : [ [ entry.name.demodulize.underscore, entry ] ] }
24
-
25
- def self.unexposed_hubs = served.map(&:last).reject { |hub| hub.respond_to?(:exposures) }.map { |hub| "#{hub.name} exposes no methods to serve" }
26
-
27
- def self.shared_addresses
28
- served.group_by(&:first).select { |_address, entries| entries.size > 1 }.map do |address, entries|
29
- "#{entries.map { |_address, hub| hub.name }.join(" and ")} both answer at #{address}"
30
- end
31
- end
32
-
33
- def self.exposure_problems = served.map(&:last).select { |hub| hub.respond_to?(:exposure_problems) }.flat_map(&:exposure_problems)
34
- private_class_method :served, :unexposed_hubs, :shared_addresses, :exposure_problems
21
+ def self.check! = HubKernel::Interface.check!
35
22
  end
36
23
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hub_kernel-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tylercschneider
@@ -29,14 +29,14 @@ dependencies:
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: '0.3'
32
+ version: '0.9'
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '0.3'
39
+ version: '0.9'
40
40
  description: 'hub_kernel-api gives any hub built on hub_kernel a JSON API: the host
41
41
  lists the hubs it serves, and every call goes through the host''s sign-in, permission
42
42
  check and account scope.'