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

feat: Add contrains handling for stubs generator. #36

Closed
Masara opened this issue Nov 14, 2023 · 8 comments
Closed

feat: Add contrains handling for stubs generator. #36

Masara opened this issue Nov 14, 2023 · 8 comments
Assignees
Labels
enhancement 💡 New feature or request

Comments

@Masara
Copy link
Contributor

Masara commented Nov 14, 2023

Is your feature request related to a problem?

Currently code with contrains is not handled during the stubs generation. If possible, this feature should be added (Python only supports upper bound contrains).

Desired solution

# Python
class ClassA[T: str]:
	...
// Stubs
class ClassA<T> where {T sub String} {
	...
}

Additional Context (optional)

@Masara Masara added the enhancement 💡 New feature or request label Nov 14, 2023
@Masara Masara self-assigned this Nov 17, 2023
@Masara Masara moved this from Backlog to In Progress in Library Analysis Nov 17, 2023
@Masara Masara moved this from In Progress to 🧱 Blocked in Library Analysis Nov 17, 2023
@Masara
Copy link
Contributor Author

Masara commented Nov 20, 2023

@lars-reimann It seems that Mypy is unable to parse constrains of the form

class A[T: str]: ...

I found the mypy module constraints.py, but there another form of constrain definition is explained:

class Constraint:
    """A representation of a type constraint.

    It can be either T <: type or T :> type (T is a type variable).
    """
   ...

But it seems like it is just an internal constrains solver, not a parser we could use.

@lars-reimann
Copy link
Member

lars-reimann commented Nov 20, 2023

Can it handle the old syntax?

from typing import Generic, TypeVar

_T_co = TypeVar("_T_co", covariant=True, bound=str)

class ClassA(Generic[_T_co]):
    def method1(self) -> _T_co:
        ...

@Masara
Copy link
Contributor Author

Masara commented Nov 20, 2023

@lars-reimann Yes, mypy can handle this syntax. I will create a parser for this syntax.
How would invariance be defined? Like this:

_T_in = TypeVar("_T_in", str, int)

?

@lars-reimann
Copy link
Member

Probably, yes. Regarding this issue, I was rather looking at the bound=str part, though.

@Masara
Copy link
Contributor Author

Masara commented Nov 20, 2023

@lars-reimann So, if we parse this code:

_T_co = TypeVar("_T_co", covariant=True, bound=str)
_T_con = TypeVar("_T_con", contravariant=True, bound=int)


class ClassA(Generic[_T_co, _T_con]):
        ...

would it result in these stubs

class ClassA where {
    PythonName("_T_co") TCo sub str,
    PythonName("_T_con") TCon super int
}

?

And invariance is not of importance for us, since its the standard case?

@lars-reimann
Copy link
Member

lars-reimann commented Nov 20, 2023

No, the stubs would be

class ClassA<out TCo, in TCon> where {
    TCo sub String,
    TCon super Int
}
  • You first have to declare the type parameters (in the <> after the class name).
  • You have to add the variance to the declared type parameters - in for contravariance, out for covariant. For invariant type parameters, you write neither in nor out.
  • In the constraint you have to translate the primitive type like str or int to their equivalent Safe-DS type.
  • You can omit the @PythonName in this case, since we handle all type checking in Safe-DS and don't have to translate the type parameters back to Python.

@Masara
Copy link
Contributor Author

Masara commented Nov 20, 2023

@lars-reimann Could you also give me an example of a class with constructor parameters? I dont quite know at which place the curved brackets would be append.

@lars-reimann
Copy link
Member

lars-reimann commented Nov 20, 2023

The v0.3.0 release of the VS Code extension has snippets. The class snippet generates the skeleton of a class:

image

Slightly reformatted & without a superclass:

class MyClass<>() where {
    // ...
} {
   // ...
}

Parameters are added inside the ().

Masara added a commit that referenced this issue Nov 20, 2023
@Masara Masara moved this from 🧱 Blocked to ✔️ Done in Library Analysis Nov 20, 2023
@Masara Masara closed this as completed Nov 20, 2023
lars-reimann pushed a commit that referenced this issue Jun 1, 2024
Bumps [mkdocs-glightbox](https://github.com/Blueswen/mkdocs-glightbox)
from 0.3.7 to 0.4.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Blueswen/mkdocs-glightbox/releases">mkdocs-glightbox's
releases</a>.</em></p>
<blockquote>
<h2>mkdocs-glightbox-0.4.0</h2>
<ul>
<li>Supported manual mode (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/29">#29</a>)</li>
<li>Allow calling lightbox methods from other places (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/34">#34</a>)</li>
<li>Added id to appended script tag (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/38">#38</a>)</li>
<li>Access theme attribute directly (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/40">#40</a>)</li>
<li>Better JavaScript Error Handling (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/36">#36</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/blueswen/mkdocs-glightbox/blob/main/CHANGELOG">mkdocs-glightbox's
changelog</a>.</em></p>
<blockquote>
<p>mkdocs-glightbox-0.4.0 (2023-05-06)</p>
<pre><code>* Supported manual mode
([#29](blueswen/mkdocs-glightbox#29))
* Allow calling lightbox methods from other places
([#34](blueswen/mkdocs-glightbox#34))
* Added id to appended script tag
([#38](blueswen/mkdocs-glightbox#38))
* Access theme attribute directly
([#40](blueswen/mkdocs-glightbox#40))
* Better JavaScript Error Handling
([#36](blueswen/mkdocs-glightbox#36))
</code></pre>
<p>mkdocs-glightbox-0.3.7 (2023-01-24)</p>
<pre><code>* Supported custom background and shadow
([#27](blueswen/mkdocs-glightbox#27))
</code></pre>
<p>mkdocs-glightbox-0.3.6 (2023-12-30)</p>
<pre><code>* Modified width default to auto prevent zooming large image
bug ([#21](blueswen/mkdocs-glightbox#21))
* Supported only enable glightbox with on-glb class in given page
([#28](blueswen/mkdocs-glightbox#28))
</code></pre>
<p>mkdocs-glightbox-0.3.5 (2023-11-18)</p>
<pre><code>* Supported compatibility with the privacy plugin of Material
for MkDocs insiders
([#25](blueswen/mkdocs-glightbox#25))
</code></pre>
<p>mkdocs-glightbox-0.3.4 (2023-04-25)</p>
<pre><code>* Fixed regex bug: quote issue and empty alt issue
([#14](blueswen/mkdocs-glightbox#14)
[#19](blueswen/mkdocs-glightbox#19))
</code></pre>
<p>mkdocs-glightbox-0.3.3 (2023-04-20)</p>
<pre><code>* Refactored processing logic with regex
([#14](blueswen/mkdocs-glightbox#14))
</code></pre>
<p>mkdocs-glightbox-0.3.2 (2023-03-19)</p>
<pre><code>* Supported image without extension
([#13](blueswen/mkdocs-glightbox#13))
</code></pre>
<p>mkdocs-glightbox-0.3.1 (2022-11-22)</p>
<pre><code>* Supported lightbox slide effect customization
([#8](blueswen/mkdocs-glightbox#8))
* Supported synchronized lightbox caption dark mode with Material for
MkDocs ([#7](blueswen/mkdocs-glightbox#7))
* Supported glightbox built-in gallery feature
([#11](blueswen/mkdocs-glightbox#11))
* Supported skip image in the anchor tag
</code></pre>
<p>mkdocs-glightbox-0.3.0 (2022-09-29)</p>
<pre><code>* Fixed width and height setting in config not working bug
* Supported specific skip class
([#5](blueswen/mkdocs-glightbox#5))
* Supported glightbox built-in caption with title and description
([#4](blueswen/mkdocs-glightbox#4))
* Fixed page jitter when lightbox closing issue using Material for
MkDocs
* Add white background for lightbox images to prevent the displaying
issue of the transparent image on black background
</code></pre>
<p>mkdocs-glightbox-0.2.1 (2022-08-10)</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/7f68f19556c8d91eb45bed2f5e3b93f9d0b4e591"><code>7f68f19</code></a>
v0.4.0</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/1409b0de89bd0aa930bbee0c2aa801c8b3391137"><code>1409b0d</code></a>
Add manual mode</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/e5ce7c9214f2de3647cbb1c9a1ec67bd82b387f9"><code>e5ce7c9</code></a>
Add search plugin note</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/d7747e7e1e58e8fe5868f38292bbb6a65f5ac902"><code>d7747e7</code></a>
Merge pull request <a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/29">#29</a>
from michalfapso/main</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/6895d4eb60ef383530f8a807bec19404342a74c3"><code>6895d4e</code></a>
Add test case</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/dc38a6c042da9dcf949a594940f312cfbf5cc1ae"><code>dc38a6c</code></a>
try catch prevent Uncaught TypeError (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/36">#36</a>)</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/7d2c0ab4b214759f7ab22ab9e775c609718ad061"><code>7d2c0ab</code></a>
access theme attribute directly (<a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/40">#40</a>)</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/b0b63f8fa2bfbd14812c95b466af180e34db2cc4"><code>b0b63f8</code></a>
Merge pull request <a
href="https://redirect.github.com/Blueswen/mkdocs-glightbox/issues/34">#34</a>
from AndBondStyle/main</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/8e652652429851d18a0c920ca1ddcbf12ab71fdf"><code>8e65265</code></a>
update validation condition</li>
<li><a
href="https://github.com/blueswen/mkdocs-glightbox/commit/4963fdb93c4f483827bcab10c5289452068e1fb5"><code>4963fdb</code></a>
Merge branch 'main' into main</li>
<li>Additional commits viewable in <a
href="https://github.com/Blueswen/mkdocs-glightbox/compare/v0.3.7...v0.4.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=mkdocs-glightbox&package-manager=pip&previous-version=0.3.7&new-version=0.4.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement 💡 New feature or request
Projects
Status: ✔️ Done
Development

No branches or pull requests

2 participants