taro 2.1.0 → 2.2.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: c4f35df13466f65caaf120945539ca21fcd2562dc3e79145817c66f75f58c016
4
- data.tar.gz: c3f2af6555b7a3c9f6e81a6ba69f5fceea0663ed6b93c22cfe584f478a2a4b24
3
+ metadata.gz: d73348290387aeef3de0558f6557af6572326043dff427ee295386a12e8bf6a6
4
+ data.tar.gz: 89b0a6c8efae50665d43385b0b4182fba6b07e5f97e933d3add5d0e1ba19f421
5
5
  SHA512:
6
- metadata.gz: c3c7de4bb79a0f78f1060ea32bf65e1da9bf597f09790d95f5c0e09a0fdc175de973aebdc28c39a1aa994dbd0fd41e6be3097508ddfad57474ad774603aac933
7
- data.tar.gz: aad75b1177ff07d1e95415e720076d85734de7ebd185e2503e4fa80fdf8ffba4e2f2cf4df735582ed6e69599cfba413ce901abcd043f178efcf1ec6ef9072054
6
+ metadata.gz: 67a0d0a5d2464c7ec6954143c95311b92b1a4a78041b298449815b1e57340de7091ac89235fd9e674ee1d3e99ed531049e99207ec62498fa94687b7c91956edd
7
+ data.tar.gz: '0768d75380ee9b18de093bebf1952b4eeac1e7965fea8c3a0cb5fbec3ef84ec6a27d5e141a837bf6a0f9d698e5b2ceff9ba2e30a33143edd434ebd25812a933a'
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [2.2.0] - 2025-02-22
4
+
5
+ ### Added
6
+
7
+ - error message when incorrectly chaining `with_cache`
8
+
3
9
  ## [2.1.0] - 2025-02-21
4
10
 
5
11
  ### Added
data/README.md CHANGED
@@ -244,6 +244,27 @@ class ErrorType < ObjectType
244
244
  end
245
245
  ```
246
246
 
247
+ ### Caching
248
+
249
+ Taro provides support for caching. The cache instance can be configured by setting `Taro::Cache.cache_instance`. By default, the railtie will set it to `Rails.cache`.
250
+
251
+ It supports configuring an ad hoc cache when using a render call, e.g.
252
+
253
+ ```ruby
254
+ bike = Bike.find(params[:id])
255
+ BikeType.with_cache(cache_key: bike.cache_key, expires_in: 3.minutes).render(bike)
256
+ ```
257
+
258
+ Or by configuring the cache rule on a per type basis, e.g.
259
+
260
+ ```ruby
261
+ class BikeType < ObjectType
262
+ self.cache_key = ->(bike) { bike.cache_key_with_version }
263
+ self.expires_in = 1.hour
264
+ # ...
265
+ end
266
+ ```
267
+
247
268
  ## FAQ
248
269
 
249
270
  ### How do I render API docs?
@@ -344,30 +365,6 @@ class MyController < ApplicationController
344
365
  end
345
366
  ```
346
367
 
347
- ## Caching
348
-
349
- Taro provides support for caching. The cache instance can be configured by setting `Taro::Cache.cache_instance`. By default, the railtie will set it to `Rails.cache`.
350
-
351
- It supports configuring an add hoc cache when using a render call, e.g.
352
-
353
- ```ruby
354
- bike = Bike.find(params[:id])
355
- BikeType.with_cache(cache_key: bike.cache_key, expires_in: 3.minutes).render(bike)
356
- ```
357
-
358
- Or by configuring the cache rule on a per type bases, e.g.
359
-
360
- ```ruby
361
- class BikeType < ObjectType
362
- # Optional description of BikeType (for the OpenAPI export)
363
- self.desc = 'A bike and all relevant information about it'
364
- self.cache_key = ->(bike) { bike.cache_key_with_version }
365
- self.expires_in = 1.hour
366
-
367
- ...
368
- end
369
- ```
370
-
371
368
  ## Possible future features
372
369
 
373
370
  - warning/raising for undeclared input params (currently they are ignored)
@@ -22,4 +22,5 @@ Taro::Types::BaseType = Struct.new(:object) do
22
22
  extend Taro::Types::Shared::Rendering
23
23
  include Taro::Types::Shared::Caching
24
24
  include Taro::Types::Shared::Errors
25
+ include Taro::Types::Shared::TypeClass
25
26
  end
@@ -3,6 +3,7 @@ require_relative 'field_validation'
3
3
  Taro::Types::Field = Data.define(:name, :type, :null, :method, :default, :enum, :defined_at, :desc, :deprecated) do
4
4
  include Taro::Types::FieldValidation
5
5
  include Taro::Types::Shared::Errors
6
+ include Taro::Types::Shared::TypeClass
6
7
 
7
8
  def initialize(name:, type:, null:, method: name, default: Taro::None, enum: nil, defined_at: nil, desc: nil, deprecated: nil)
8
9
  enum = coerce_to_enum(enum)
@@ -7,7 +7,7 @@ module Taro::Types::Shared::Caching
7
7
 
8
8
  def self.included(klass)
9
9
  klass.extend(ClassMethods)
10
- klass.singleton_class.attr_accessor :expires_in, :without_cache
10
+ klass.singleton_class.attr_accessor :expires_in
11
11
  klass.singleton_class.attr_reader :cache_key
12
12
  end
13
13
 
@@ -23,7 +23,8 @@ module Taro::Types::Shared::Caching
23
23
  klass = dup
24
24
  klass.cache_key = cache_key.is_a?(Proc) ? cache_key : ->(_) { cache_key }
25
25
  klass.expires_in = expires_in
26
- klass.without_cache = self
26
+ this = self
27
+ klass.define_singleton_method(:type_class) { this }
27
28
  klass
28
29
  end
29
30
  end
@@ -35,9 +35,11 @@ module Taro::Types::Shared::DerivedTypes
35
35
 
36
36
  root.define_singleton_method(method_name) do
37
37
  derived_types[type] ||= begin
38
- type_class = Taro::Types::Coercion.call(type:)
39
- new_type = Class.new(type_class)
40
- new_type.define_name("#{self.name}.#{method_name}")
38
+ name || raise(Taro::ArgumentError, 'Cannot derive from anonymous type')
39
+
40
+ coerced_type = Taro::Types::Coercion.call(type:)
41
+ new_type = Class.new(coerced_type)
42
+ new_type.define_name("#{name}.#{method_name}")
41
43
  new_type.derive_from(self)
42
44
  new_type
43
45
  end
@@ -5,7 +5,7 @@ module Taro::Types::Shared::Rendering
5
5
  result = Taro::Cache.call(object, **cache_attrs) do
6
6
  new(object).cached_coerce_response
7
7
  end
8
- self.last_render = [self.without_cache || self, result.__id__]
8
+ self.last_render = [type_class, result.__id__]
9
9
  result
10
10
  end
11
11
 
@@ -0,0 +1,12 @@
1
+ # `type_class` is a convenience method to get the type class of types,
2
+ # of with_cache-types, of type instances, and of fields in the same way.
3
+ module Taro::Types::Shared::TypeClass
4
+ def self.included(klass)
5
+ if klass.instance_methods.include?(:type) # Field
6
+ klass.alias_method :type_class, :type
7
+ else # BaseType
8
+ klass.singleton_class.alias_method :type_class, :itself
9
+ klass.alias_method :type_class, :class
10
+ end
11
+ end
12
+ end
data/lib/taro/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # :nocov:
2
2
  module Taro
3
- VERSION = "2.1.0"
3
+ VERSION = "2.2.0"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taro
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2025-02-21 00:00:00.000000000 Z
12
+ date: 2025-02-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -117,6 +117,7 @@ files:
117
117
  - lib/taro/types/shared/openapi_type.rb
118
118
  - lib/taro/types/shared/pattern.rb
119
119
  - lib/taro/types/shared/rendering.rb
120
+ - lib/taro/types/shared/type_class.rb
120
121
  - lib/taro/version.rb
121
122
  - tasks/benchmark.rake
122
123
  - tasks/benchmark_1kb.json
@@ -143,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
143
144
  - !ruby/object:Gem::Version
144
145
  version: '0'
145
146
  requirements: []
146
- rubygems_version: 3.5.16
147
+ rubygems_version: 3.5.22
147
148
  signing_key:
148
149
  specification_version: 4
149
150
  summary: Typed Api using Ruby Objects.