Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature Request: not schema #105

Open
alturkovic opened this issue Mar 11, 2024 · 6 comments
Open

Feature Request: not schema #105

alturkovic opened this issue Mar 11, 2024 · 6 comments

Comments

@alturkovic
Copy link

Support not schema: https://json-schema.org/understanding-json-schema/reference/combining#not

@alturkovic
Copy link
Author

For an example, generate an odd number between 10-20:

{
  "type": "integer",
  "minimum": 10,
  "allOf": [
    {
      "maximum": 20
    }
  ],
  "not": {
    "allOf": [
      {
        "multipleOf": 2
      }
    ]
  }
}

The example provided is deliberately more complex than it needs to be to show the composing nature of the problem.

@ghandic
Copy link
Owner

ghandic commented Mar 11, 2024

Do you have a proposed solution for this?

@alturkovic
Copy link
Author

alturkovic commented Mar 11, 2024

https://github.com/json-schema-faker/json-schema-faker/blob/d4403ae6cdba2206fe86399900c4095de8db7d2a/src/lib/core/utils.mjs#L350
https://github.com/json-schema-faker/json-schema-faker/blob/d4403ae6cdba2206fe86399900c4095de8db7d2a/src/lib/core/traverse.mjs#L64

It seems like the original author built a new schema and "manually" inversed some of the properties and then replaced the original schema...
For an example, it does not handle multipleOf that I mentioned originally.
I suppose that was meant to be handled in the TODO section lower in the linked method, but I do not think that it is possible for multipleOf since that should be evaluated in the value generator itself since there is no way to "inverse" it (if I am not mistaken?).

Another approach might be to collect all the constraints imposed on a certain value and then generate a value matching all those constraints?
For an example:

  • type must be integer
  • value must be in range 10 .. 20
  • must not be divisible by 2

But I assume that could get very complicated very fast with lots of constraints...

@alturkovic
Copy link
Author

I think that the problem is much bigger than I initially assumed:

def __parse_definition(

The current implementation will only take type into consideration if it encounters that keyword, so valid definitions such as the one below will not work:

{
  "type": "integer",
  "allOf": [
    {
      "minimum": 10
    },
    {
      "maximum": 20
    }
  ]
}

The above should be equivalent to:

{
  "type": "integer",
  "minimum": 10,
  "maximum": 20
}

I think the __parse_definition needs to do some more sofisticated "merging" than it currently does. Unfortunately, I do not know Python to jump in with any PRs...

@ghandic
Copy link
Owner

ghandic commented Mar 11, 2024

I would have thought the above wouldn't be valid without a type in the all of objects.

@alturkovic
Copy link
Author

Yup, that was my assumption also at first, but things are a bit more complicated...
I have tested the schema above with the original JSF and here. Seems to be valid.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants