eunomia_gen 0.1.2 → 0.1.3

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: ce3812f21ae68491bad7b999532be18d0143842ed6d8a39b81843ec504594f5d
4
- data.tar.gz: e951235481722af38a3519ccd188a56d78ea48c5060e4c10e8cac62b7f427151
3
+ metadata.gz: 248b5e7d766840c8b4f4410659e934c288d9f3c6098d76bd9496b7b30c142c63
4
+ data.tar.gz: 4d7db04e1470bfe4834dd40ac2fe661e14badfcd6f8ca060a6e456b27897f862
5
5
  SHA512:
6
- metadata.gz: f433f2fa2f1d3ffafd4c3ce4416c03409a8c6128870086f805d7a9b92b72f8ffdba46ab8cf57189f379f04604fcd7436a05b268cb37a96ee0f2143053011b0d6
7
- data.tar.gz: 6a14ec1008753b70930ca35f5ee67cc792f69b06b6412765993f97366446c194e4f1a49156b6ef5533ed03334da7eee1e6c3a059c5a0c843416a9de2c195ad6f
6
+ metadata.gz: cb7e64a5fd66e8098c4a327f7e5f28ae7972e4619b8b1b31bf732cb1302b45ab7d571f81b0d8c27b4cdaefc28c34cbf7806a9f133137d44da8e295eaaf09fda6
7
+ data.tar.gz: a122b89d072665edf883571ba0b4be02e7be961121f2cb0b2482a7567b07265b69df6701d138a9a752463468c133048a4fd641d3f59ffdf3cfaa108b4a4ef929
@@ -11,6 +11,7 @@ module Eunomia
11
11
  :meta,
12
12
  :functions,
13
13
  :tags,
14
+ :item_tags,
14
15
  :items,
15
16
  :selector,
16
17
  :sep
@@ -21,6 +22,7 @@ module Eunomia
21
22
  @alts = hash_field(hsh, :alts)
22
23
  @meta = meta_field(hsh)
23
24
  @tags = tags_field(hsh)
25
+ @item_tags = Set.new
24
26
  @selector = Eunomia::Selector.new(field_or_nil(hsh, :rng))
25
27
  @items = items_from(hsh)
26
28
  raise "Generators must have items" if @items.empty?
@@ -29,6 +31,9 @@ module Eunomia
29
31
  def items_from(hsh)
30
32
  list_field(hsh, :items).map do |item|
31
33
  item = { segments: item } if item.is_a?(String)
34
+ item_tags = item.fetch(:tags, [])
35
+ item_tags = [item_tags] unless item_tags.is_a?(Enumerable)
36
+ @item_tags += item_tags
32
37
  Eunomia::Item.new(@key, item, @tags)
33
38
  end
34
39
  end
@@ -44,7 +49,7 @@ module Eunomia
44
49
  def filter(tags)
45
50
  return items if tags.empty?
46
51
 
47
- items.select { |item| (tags - item.tags).empty? }
52
+ items.select { |item| item.match_tags?(tags) || item.match_tags?(item_tags) }
48
53
  end
49
54
 
50
55
  def generate(request)
data/lib/eunomia/item.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Eunomia
4
+ # Item represents a single selectable row of a generator.
4
5
  class Item
5
6
  include Eunomia::HashHelpers
6
7
 
@@ -17,13 +18,25 @@ module Eunomia
17
18
  @key = key
18
19
  @weight = int_field(hsh, :weight).clamp(1, 1000)
19
20
  @value = int_field(hsh, :value).clamp(0, 1_000_000)
20
- @tags = tags_field(hsh)
21
- @tags += add_tags if add_tags
22
21
  @alts = alts_field(hsh)
23
22
  @meta = meta_field(hsh)
24
23
  @functions = list_field(hsh, :functions)
25
24
  @segments = scan(field_or_raise(hsh, :segments)).flatten
26
- raise "Items must have segments" if @segments.empty?
25
+ @tags = tags_field(hsh)
26
+ @tags += add_tags if add_tags
27
+ @available_tags = nil
28
+ end
29
+
30
+ def available_tags
31
+ @available_tags ||= begin
32
+ s = Set.new
33
+ refs = segments.filter { |seg| seg.is_a?(Eunomia::Reference) }
34
+ unless refs.empty?
35
+ s = refs[0].item_tags
36
+ refs[1..].each { |ref| s &= ref.item_tags }
37
+ end
38
+ s
39
+ end
27
40
  end
28
41
 
29
42
  def scan(obj)
@@ -33,6 +46,12 @@ module Eunomia
33
46
  obj.map { |e| Eunomia::Segment.build(e) }.flatten
34
47
  end
35
48
 
49
+ def match_tags?(tags)
50
+ return true if tags.nil? || tags.empty?
51
+
52
+ true if (tags - self.tags).empty?
53
+ end
54
+
36
55
  def alt_for(key, segment)
37
56
  return segment unless key
38
57
  return segment unless alts[key]
@@ -26,11 +26,19 @@ module Eunomia
26
26
  !label.nil?
27
27
  end
28
28
 
29
+ def generator
30
+ @generator ||= Eunomia.lookup(key)
31
+ end
32
+
33
+ def item_tags
34
+ generator.item_tags
35
+ end
36
+
29
37
  def generate(request)
30
38
  return Eunomia::Element.new(request.constants[lookup]) if request.constants.key?(lookup)
31
39
 
32
40
  request.increase_depth
33
- Eunomia.generate(key, request)
41
+ generator.generate(request)
34
42
  end
35
43
 
36
44
  def lookup
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Eunomia
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eunomia_gen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - G Palmer