Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

* Your contribution here
- [#18](https://github.com/numbata/grape-oas/pull/18): Support for range in size? predicate `required(:tags).value(:array, size?: 1..10).each(:string)`
- [#19](https://github.com/numbata/grape-oas/pull/19): Temporary disable memory profiler workflow for PRs [@numbata](https://github.com/numbata).

## [1.0.2] - 2025-12-15
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ def extract_numeric(arg)
def extract_range(arg)
return arg if arg.is_a?(Range)
return arg[1] if arg.is_a?(Array) && arg.first == :range
return arg[1] if arg.is_a?(Array) && arg.first == :size && arg[1].is_a?(Range)

nil
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,10 +97,17 @@ def apply_pattern(args)
end

def handle_size(name, args)
min_val = ArgumentExtractor.extract_numeric(args[0])
max_val = ArgumentExtractor.extract_numeric(args[1]) if name == :size?
constraints.min_size = min_val if min_val
constraints.max_size = max_val if max_val
rng = ArgumentExtractor.extract_range(args.first)

if rng
constraints.min_size = rng.begin if rng.begin
constraints.max_size = rng.max if rng.end
else
min_val = ArgumentExtractor.extract_numeric(args[0])
max_val = ArgumentExtractor.extract_numeric(args[1]) if name == :size?
constraints.min_size = min_val if min_val
constraints.max_size = max_val if max_val
end
end

def handle_range(args)
Expand Down
18 changes: 18 additions & 0 deletions test/grape_oas/introspectors/dry_introspector_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,24 @@ def test_each_array_predicates_apply_to_array_not_items
assert_equal "string", tags.items.type
end

def test_size_range_predicate_sets_min_and_max_size
contract = Dry::Schema.Params do
required(:tags).value(:array, size?: 1..10).each(:string)
Comment thread
slbug marked this conversation as resolved.
required(:labels).value(:array, size?: 1...10).each(:string)
end

schema = processor.build(contract)
tags = schema.properties["tags"]

assert_equal 1, tags.min_items
assert_equal 10, tags.max_items

labels = schema.properties["labels"]

assert_equal 1, labels.min_items
assert_equal 9, labels.max_items
end

def test_excluded_values_and_numeric_bounds
contract = Dry::Schema.Params do
required(:score).filled(:integer, excluded_from?: [5], gteq?: 1, lteq?: 10)
Expand Down