foobara 0.0.140 → 0.0.142

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: e9ef91ca57cf88a6ce345e68697517ec5459bfbfda3be8958d2194cc1d46bc75
4
- data.tar.gz: f77080a972b301496787bc4c1c0108e5721ab8364c1c3e818f2541498a4b131a
3
+ metadata.gz: a6defed2fda94d3c5f244f9f24eb9a32f4d06999bc773071dc58667565518499
4
+ data.tar.gz: 98a0f663a38ce6b105f78fbbefdc1e34328654ec54755daa379df824753f3214
5
5
  SHA512:
6
- metadata.gz: 1b3c6ff758814d7706ccdaa3e3da6921929b8b0d2ac9d9404e2033d408af3654ffe96c66448b57c8394a2d144c95979092e1b75e6bd130d9363596fd1a9daae0
7
- data.tar.gz: 7e4eb5c7411d3d02e1b65deca964a82bf0a495936c40613a1820afdada14a031be882d2f28aba5d2a3c43cad54381ed81888b77aa0c52c32c8582a44b9108a27
6
+ metadata.gz: 9c42abcbd62eba3583acfd4345df530ec04efdc18d19773ce1ed5dafa9e0d43d09364b2b45355a22874b2aeaf030d476726cbd214ec1a3626812b2a20c35133f
7
+ data.tar.gz: 7cc3b4e13250e4cc2b3af8468b2f5774861161fcc13972ecc87f17c1682bd8a69170a080b6f9cc72249ff5756d2a7f1ca509dfaeba2ac52bbf9896c8b9a4f3e6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ # [0.0.142] - 2025-08-10
2
+
3
+ - Add LruCache to IsNamespace to speed up lookups
4
+
5
+ # [0.0.141] - 2025-07-31
6
+
7
+ - Fix bug returning a non-strict type declaration in the command connector manifest
8
+ - Support using :attributes as a type to permit anything with symbolizable keys
9
+ - Fix buggy global domain in command connector manifest
10
+
1
11
  # [0.0.140] - 2025-07-25
2
12
 
3
13
  - Support result :array, &block style for declaring result type
@@ -72,11 +72,11 @@ module Foobara
72
72
  possible_errors:,
73
73
  depends_on:,
74
74
  # TODO: allow inputs type to be nil or really any type?
75
- inputs_type: inputs_type&.reference_or_declaration_data || {
75
+ inputs_type: inputs_type&.reference_or_declaration_data || GlobalDomain.foobara_type_from_declaration(
76
76
  type: "::attributes",
77
77
  element_type_declarations: {},
78
78
  required: []
79
- }
79
+ ).declaration_data
80
80
  ).merge(description:)
81
81
 
82
82
  if result_type
@@ -628,7 +628,7 @@ module Foobara
628
628
  fixed_scoped_path = error.scoped_full_path[index..]
629
629
  fixed_scoped_name = fixed_scoped_path.join("::")
630
630
  fixed_scoped_prefix = fixed_scoped_path[..-2]
631
- fixed_parent = [:domain, domain.full_domain_name]
631
+ fixed_parent = [:domain, domain.reference]
632
632
 
633
633
  error.relevant_manifest.merge(
634
634
  parent: fixed_parent,
@@ -27,7 +27,7 @@ module Foobara
27
27
 
28
28
  def error_array
29
29
  # :nocov:
30
- warn "DEPRECATED: Do not call ErrorCollection#errors instead just use the collection directly."
30
+ warn "DEPRECATED: Do not call ErrorCollection#error_array instead just use the collection directly."
31
31
  self
32
32
  # :nocov:
33
33
  end
@@ -3,7 +3,7 @@ require_relative "type_declaration"
3
3
  module Foobara
4
4
  module Manifest
5
5
  class Attributes < TypeDeclaration
6
- optional_keys :required, :defaults
6
+ optional_keys :required, :defaults, :element_type_declarations
7
7
 
8
8
  alias attributes_manifest relevant_manifest
9
9
 
@@ -19,6 +19,10 @@ module Foobara
19
19
  DataPath.value_at([:defaults, attribute_name], attributes_manifest)
20
20
  end
21
21
 
22
+ def has_attribute_declarations?
23
+ !element_type_declarations.nil?
24
+ end
25
+
22
26
  def attribute_declarations
23
27
  element_type_declarations.keys.to_h do |attribute_name|
24
28
  [
@@ -3,6 +3,16 @@ require_relative "scoped"
3
3
  module Foobara
4
4
  class Namespace
5
5
  module IsNamespace
6
+ class << self
7
+ def lru_cache
8
+ @lru_cache ||= Foobara::LruCache.new(100)
9
+ end
10
+
11
+ def clear_lru_cache!
12
+ @lru_cache = nil
13
+ end
14
+ end
15
+
6
16
  include Scoped
7
17
 
8
18
  def scoped_clear_caches
@@ -90,6 +100,8 @@ module Foobara
90
100
 
91
101
  def foobara_register(scoped)
92
102
  foobara_registry.register(scoped)
103
+
104
+ IsNamespace.clear_lru_cache!
93
105
  # awkward??
94
106
  scoped.scoped_namespace = self
95
107
 
@@ -108,6 +120,8 @@ module Foobara
108
120
  foobara_registry.unregister(scoped)
109
121
  foobara_children.delete(scoped)
110
122
  scoped.scoped_namespace = nil
123
+
124
+ IsNamespace.clear_lru_cache!
111
125
  end
112
126
 
113
127
  def foobara_unregister_all
@@ -116,17 +130,30 @@ module Foobara
116
130
  end
117
131
  end
118
132
 
133
+ def lru_cache
134
+ IsNamespace.lru_cache
135
+ end
136
+
119
137
  def foobara_lookup(
120
138
  path,
121
139
  filter: nil,
122
140
  mode: LookupMode::GENERAL,
123
- visited: Set.new,
141
+ visited: nil,
124
142
  initial: true
125
143
  )
144
+ # TODO: make it so this is only necessary when initial
126
145
  path = Namespace.to_registry_path(path)
127
146
  visited_key = [path, mode, initial, self]
128
- return nil if visited.include?(visited_key)
129
147
 
148
+ if initial
149
+ lru_key = [path, mode, self, filter]
150
+ found, value = lru_cache.get(lru_key)
151
+ return value if found
152
+ end
153
+
154
+ return nil if visited&.include?(visited_key)
155
+
156
+ visited ||= Set.new
130
157
  visited << visited_key
131
158
 
132
159
  LookupMode.validate!(mode)
@@ -139,7 +166,13 @@ module Foobara
139
166
  visited:,
140
167
  initial: false
141
168
  )
142
- return scoped if scoped
169
+ if scoped
170
+ if initial
171
+ lru_cache.set_if_missing(lru_key, scoped)
172
+ end
173
+
174
+ return scoped
175
+ end
143
176
 
144
177
  candidates = foobara_children.map do |namespace|
145
178
  namespace.foobara_lookup(path, filter:, mode:, visited:, initial: false)
@@ -152,8 +185,14 @@ module Foobara
152
185
  # :nocov:
153
186
  end
154
187
 
155
- return candidates.first ||
156
- foobara_parent_namespace&.foobara_lookup(path, filter:, mode:, visited:, initial: false)
188
+ scoped = candidates.first ||
189
+ foobara_parent_namespace&.foobara_lookup(path, filter:, mode:, visited:, initial: false)
190
+
191
+ if initial
192
+ lru_cache.set_if_missing(lru_key, scoped)
193
+ end
194
+
195
+ return scoped
157
196
  end
158
197
 
159
198
  if path[0] == ""
@@ -171,11 +210,19 @@ module Foobara
171
210
  partial = foobara_registry.lookup(path, filter)
172
211
 
173
212
  if mode == LookupMode::DIRECT
213
+ if initial
214
+ lru_cache.set_if_missing(lru_key, partial)
215
+ end
216
+
174
217
  return partial
175
218
  end
176
219
 
177
220
  if partial
178
221
  if partial.scoped_path == path
222
+ if initial
223
+ lru_cache.set_if_missing(lru_key, partial)
224
+ end
225
+
179
226
  return partial
180
227
  end
181
228
  end
@@ -187,18 +234,39 @@ module Foobara
187
234
  end
188
235
 
189
236
  scoped = _lookup_in(path, to_consider, filter:, visited:)
190
- return scoped if scoped
237
+
238
+ if scoped
239
+ if initial
240
+ lru_cache.set_if_missing(lru_key, scoped)
241
+ end
242
+
243
+ return scoped
244
+ end
191
245
 
192
246
  if [LookupMode::GENERAL, LookupMode::STRICT].include?(mode) && foobara_parent_namespace
193
247
  scoped = foobara_parent_namespace.foobara_lookup(
194
248
  path, filter:, mode: LookupMode::STRICT, visited:, initial: false
195
249
  )
196
- return scoped if scoped
250
+
251
+ if scoped
252
+ if initial
253
+ lru_cache.set_if_missing(lru_key, scoped)
254
+ end
255
+
256
+ return scoped
257
+ end
197
258
  end
198
259
 
199
260
  if mode == LookupMode::GENERAL
200
261
  scoped = _lookup_in(path, foobara_depends_on_namespaces, filter:, visited:)
201
- return scoped if scoped
262
+
263
+ if scoped
264
+ if initial
265
+ lru_cache.set_if_missing(lru_key, scoped)
266
+ end
267
+
268
+ return scoped
269
+ end
202
270
  end
203
271
 
204
272
  to_consider = case mode
@@ -219,7 +287,14 @@ module Foobara
219
287
  end
220
288
 
221
289
  scoped = candidates.first || partial
222
- return scoped if scoped
290
+
291
+ if scoped
292
+ if initial
293
+ lru_cache.set_if_missing(lru_key, scoped)
294
+ end
295
+
296
+ return scoped
297
+ end
223
298
 
224
299
  # As a last resort we'll see if we're trying to fetch a builtin type from a different namespace
225
300
  # TODO: these lookup modes are really confusing and were designed prior to having multiple root
@@ -228,6 +303,7 @@ module Foobara
228
303
  scoped = Namespace.global.foobara_lookup(path, filter:, mode: LookupMode::ABSOLUTE, visited:, initial: false)
229
304
 
230
305
  if scoped.is_a?(Types::Type) && scoped.builtin?
306
+ lru_cache.set_if_missing(lru_key, scoped)
231
307
  scoped
232
308
  end
233
309
  end
@@ -7,11 +7,10 @@ module Foobara
7
7
  class ShortTypeNameDesugarizer < TypeDeclarations::Desugarizer
8
8
  def applicable?(sugary_type_declaration)
9
9
  return false if TypeDeclarations.strict_stringified? || TypeDeclarations.strict?
10
+ return false unless sugary_type_declaration.is_a?(::Hash)
10
11
 
11
12
  sugary_type_declaration = sugary_type_declaration.dup
12
13
 
13
- return false unless sugary_type_declaration.is_a?(::Hash)
14
-
15
14
  sugary_type_declaration = normalize_type(sugary_type_declaration)
16
15
 
17
16
  if sugary_type_declaration.key?(:type) &&
@@ -4,6 +4,13 @@ module Foobara
4
4
  module TypeDeclarations
5
5
  module SensitiveTypeRemovers
6
6
  class Attributes < SensitiveTypeRemover
7
+ def applicable?(strict_type_declaration)
8
+ return false unless super
9
+
10
+ element_type_declarations = strict_type_declaration[:element_type_declarations]
11
+ element_type_declarations && !element_type_declarations.empty?
12
+ end
13
+
7
14
  def transform(strict_type_declaration)
8
15
  to_change = {}
9
16
  to_remove = []
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foobara
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.140
4
+ version: 0.0.142
5
5
  platform: ruby
6
6
  authors:
7
7
  - Miles Georgi
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-07-25 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: bigdecimal
@@ -27,44 +27,44 @@ dependencies:
27
27
  name: foobara-lru-cache
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.0.2
32
+ version: 2.0.0
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.0.2
39
+ version: 2.0.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: foobara-util
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
- - - ">="
44
+ - - "<"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.0.0
46
+ version: 2.0.0
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "<"
52
52
  - !ruby/object:Gem::Version
53
- version: 1.0.0
53
+ version: 2.0.0
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: inheritable-thread-vars
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - "~>"
58
+ - - "<"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.0.1
60
+ version: 2.0.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - "~>"
65
+ - - "<"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.0.1
67
+ version: 2.0.0
68
68
  description: A command-centric and discoverable software framework with a focus on
69
69
  domain concepts and abstracting away integration code
70
70
  email:
@@ -535,7 +535,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
535
535
  - !ruby/object:Gem::Version
536
536
  version: '0'
537
537
  requirements: []
538
- rubygems_version: 3.6.2
538
+ rubygems_version: 3.6.9
539
539
  specification_version: 4
540
540
  summary: A command-centric and discoverable software framework with a focus on domain
541
541
  concepts and abstracting away integration code