hub_kernel-interface 0.2.0 → 0.4.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: fcf68ba40018916adda2764b12c9b576a9650aa5c3c954fae85e0e59c63a6d32
4
- data.tar.gz: 531acede6b1476e7847f2ede96bafb3cfb2685cb2c30c5fe816f71250f739951
3
+ metadata.gz: 9385ca6b5908cfc7854200c351dd6f6cbe30a90c850d14a7519c4e73a5d2eeeb
4
+ data.tar.gz: 199574b3bc71a071a97670a97dd8ab08747945b45216d1eac24d21f22ffa965a
5
5
  SHA512:
6
- metadata.gz: f9d0f6e042f40f9aece6780b756505ae52047dabe7d64a1e54c893f9508c861a4763d1babfb8dfa766ccb60f39ef6d5e2606b1d0b8114243fbc62f7fdbc1aca4
7
- data.tar.gz: 6d41d5ddbbfa3ce0e315e22604ac85a8312b95ee0cdb19f7bf5b9c60a9a47791f996b74e0dc06b0dc4a6b8a940131f5222cfb343e1722fe4df915edccc1e8d77
6
+ metadata.gz: 96ef67da95a65e5fd1f26c3fc6ef25e9ad0a9fb28a742b03ce2399aefb5360ccddcb4c764c04a2255b685b542a1d612937163b252b47ee7c2eb7cc2888688618
7
+ data.tar.gz: e36173e0a4b7f957323969718216df7c7c0ca5083ba1852ac094c77d75579b9da986e64c8c11c996e4efb139379d77a08862b773f557820f0b1f13532df09fc3
data/README.md CHANGED
@@ -49,11 +49,17 @@ HubKernel::Interface.hubs = [ Supplies, { "money" => Billing::Ledger } ]
49
49
 
50
50
  HubKernel::Interface.find("supplies") # => Supplies
51
51
  HubKernel::Interface.find("money") # => Billing::Ledger
52
+ HubKernel::Interface.served # => { "supplies" => Supplies, "money" => Billing::Ledger }
52
53
  ```
53
54
 
54
55
  The permission check is still asked about a hub served under a chosen name by its own name,
55
56
  such as `ledger:record_spend`.
56
57
 
58
+ An interface gem's boot check runs `HubKernel::Interface.check!`, which raises
59
+ `HubKernel::Interface::UnservableHubError` naming every problem in the served list at once:
60
+ an entry that exposes no methods, two entries that answer at the same name, and each
61
+ problem in a served hub's exposed list.
62
+
57
63
  `Supplies.exposure_problems` names each exposed method the hub has no method for, or lists
58
64
  with values it does not take. `HubKernel::Interface::ExposingHubs.list` holds every hub that
59
65
  declares an exposed method.
@@ -1,5 +1,5 @@
1
1
  module HubKernel
2
2
  module Interface
3
- VERSION = "0.2.0"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -3,13 +3,32 @@ require "hub_kernel/exposes"
3
3
 
4
4
  module HubKernel
5
5
  module Interface
6
+ class UnservableHubError < StandardError; end
7
+
6
8
  singleton_class.attr_writer :hubs
7
9
 
8
10
  def self.hubs = @hubs ||= []
9
11
 
10
- def self.find(name) = served.to_h[name]
12
+ def self.find(name) = served[name]
13
+
14
+ def self.check!
15
+ problems = unexposed_hubs + shared_names + exposure_problems
16
+ raise UnservableHubError, problems.join("\n") if problems.any?
17
+ end
18
+
19
+ def self.unexposed_hubs = served.values.reject { |hub| hub.respond_to?(:exposures) && hub.exposures.any? }.map { |hub| "#{hub.name} exposes no methods to serve" }
20
+
21
+ def self.shared_names
22
+ served_pairs.group_by(&:first).select { |_name, pairs| pairs.size > 1 }.map do |name, pairs|
23
+ "#{pairs.map { |_name, hub| hub.name }.join(" and ")} both answer at #{name}"
24
+ end
25
+ end
26
+
27
+ def self.exposure_problems = served.values.select { |hub| hub.respond_to?(:exposure_problems) }.flat_map(&:exposure_problems)
28
+
29
+ def self.served_pairs = hubs.flat_map { |entry| entry.is_a?(Hash) ? entry.to_a : [ [ entry.name.demodulize.underscore, entry ] ] }
30
+ private_class_method :unexposed_hubs, :shared_names, :exposure_problems, :served_pairs
11
31
 
12
- def self.served = hubs.flat_map { |entry| entry.is_a?(Hash) ? entry.to_a : [ [ entry.name.demodulize.underscore, entry ] ] }
13
- private_class_method :served
32
+ def self.served = served_pairs.to_h
14
33
  end
15
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hub_kernel-interface
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - tylercschneider