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

Node-tree based parameter structure in instruments #773

Open
AdriaanRol opened this issue Sep 30, 2017 · 13 comments
Open

Node-tree based parameter structure in instruments #773

AdriaanRol opened this issue Sep 30, 2017 · 13 comments

Comments

@AdriaanRol
Copy link
Contributor

@jenshnielsen @WilliamHPNielsen
As discussed with @alan-geller and @sohailc .
Any work on this requires #600 to be merged (@nulinspiratie) .
Can be seen as a generalization of channel parameters (#640 #641 ) @spauka .
Relevant for future DCL QuTech drivers @nyxus .

I would like to propose supporting a node/tree based structure for parameters in an instrument.
This is motivated by the need to group certain parameters on a more generic level than channels.

Motivation

A concrete example would an instrument like the AWG5014 that has a parameter ch1_m1_high (channel 1 marker 1 high). It would be convenient to group parameters in a node structure. This would mean that instead of using underscores in the name of the parameter the instrument would have nodes with attributes, so ch1_m1_high would become ch1.m1.high.

Such a grouping of parameters would have several advantages.

  • Autocomplete of large instruments would be more managable and would immediately show the relevant groups of parameters to a user.
  • Possible to natively match structure that exists in many instruments (see e.g., colon separated commands in VISA protocols and the Zurich Instruments python API).
  • Possible to add documentation to nodes or groups of parameters.
  • Provides structure to datafiles (where snapshots are saved).
  • Provides structure that can be used in instrument monitoring capabilities.
  • I think this is simpler to understand than the Channel parameter (that does not work as per comment in Parameter improvements #600 ). This argument requires reading the section below.

Proposed implementation/required changes

To make the node based parameters work changes are required to the following methods

  • add_parameter
  • snapshot
  • print_readable_snapshot
  • datasaving/loading -> especially urgent as that is currently being redesigned.
  • A new parameter_node object.
  • Instrument.get and Instrument.set

I will now go over these points individually.

add_parameter

The Instrument.add_parameter method would need to support adding parameters to nodes in a simple way. I would propose only changing the way the name argument of the add_parameter method works.
The name would be split based on the period . character (as conventional in python), the last part of the name would be the name of the parameter. Anything before that corresponds to a node.
The example of pseudo code below shows how it should work

ins.add_parameter(name='ch1.m1.high', **kwargs) 
 -> separate string based on period "." character

 -> check if ch1 exists as a parameter in the instrument. 
           -> if ch1 does not exist, create a "node" 
           -> if ch1 is a regular parameter raise exception 
           -> if ch1 is a node parameter continue 
           -> recursively call this "add_node" part until you get to the `parameter` "high", there add the parameter as it is done now. 

snapshot

Support a nested structure for the dictionary that contains the parameter nodes with parameters in them.

print_readable_snapshot

Preserve the nesting in a readable way. To give an example I give below (part of) a snapshot of our VectorSwitchMatrix and how it could look using a nested structure.

VSM:
	parameter      value
--------------------------------------------------------------------------------
IDN             :	{'driver': "<class 'pycqed.instrument_drivers.physical_inst...
in1_out1_att    :	14
in1_out1_phase  :	0
in1_out1_switch :	EXT
in1_out2_att    :	11
in1_out2_phase  :	90
in1_out2_switch :	EXT
in2_out1_att    :	11
in2_out1_phase  :	0
... # cut short for example
mode            :	raw

Example using the node-tree structure (I couldn't get the alignment to work on github but you get the idea).

VSM:
	parameter      value
--------------------------------------------------------------------------------
IDN                  :	{'driver': "<class 'pycqed.instrument_drivers.physical_inst...
in1
    out1
         att         :	14
         phase      :	0
         switch     :	EXT
    out2
          att       :	11
          phase     :	90
          switch    :	EXT
in2
    out1
        att          :	11
        phase       :	0
... # cut short for example
mode                 :	raw

Note that the indents used here to indicate the groups are also natural folding levels in any kind of interactive monitor.

datasaving/loading

Datasaving should already support saving of snapshots as a JSON like dict (or in hdf5 as we are using). Extending this to nested dicts should not be a problem. Ofcourse this should also be taken into consideration for the future database formats but I don't see fundamental problems here.

ParameterNode object

A new node class has to be made that can be added to an instrument as a parameter but can contain parameters itself. This object should not be very difficult to make but should support the following methods.

  • snapshot -> returning the snapshot of the nodes and parameters it contains (this ensures that the higher level snapshots remain working).
  • get/set -> see below for how instrument get/set should work.
    I'm not sure if a node is more like an instrument (something that can contain parameters) or like a parameter (it can be get/set and is added to an instrument).

Instrument get/set

The get/set methods should support nested extraction of values. To give an example.
VSM.get('in1.out1.att) should return the nested value.

Fancy extensions to get/set

Above I have described the basic idea and functionality that I would like. When working this out it is only natural to think of how the get/set could be made more powerful. I consider this beyond the scope of an initial implementation but as we ( @alan-geller , @sohailc ) discussed them and they could be quite powerful I think it is worth mentioning.

  • allow asterix * character in get/set commands, setting a value to all parameters that match the description e.g., VSM.set('in*.out*.switch, 'OFF') to set all switches to off. Similarly use it to get all values that match the description. I would say that the return format should then be a dict containing the full parameter names (including parent nodes) as keys and the return values as values.
  • Allow setting using a list or dict of values. An example would be `VSM.set('in1.out*.att', [0, 2]) in which case the 0 and 2 values are mapped to out1 and out2 respectively (sorted alphabetically). Note that it is important ot use a list type here as the parameters are not guaranteed to be single valued.
@jenshnielsen
Copy link
Collaborator

You are aware that we already have channels that can be nested arbitrarily deep? They are already used in several instruments

@jenshnielsen
Copy link
Collaborator

Sorry the above is bit short I’m away from my computer with only a phone but you can have a look at the qdac, keysight waveform generator, or keithley source meter drivers as examples. Any feedback on what that interface is missing is very wellcome

@Dominik-Vogel
Copy link
Contributor

@jenshnielsen as far as I can judge it as a newbie in qcodes is this node feature by @AdriaanRol complementary to the existing channels in the sense that while channels are great for homogeneous parameter structures, nodes are great for inhomogeneous parameters. By this I mean that a channel offers a lot of comfort for e.g. an oscilloscope with four channels that all behave in the same way. For the implementation of an instrument with "channels" that share no structure one would have to chose between creating specialized channel classes or to have all the parameters living at the root level.
I think the nodes concept could offer a great third option, that allows for the structuring of the parameters without the need for creating all the nested channel objects.

@spauka
Copy link
Contributor

spauka commented Oct 1, 2017

Hey, so I think some of what you are proposing to add is possible, though with a slightly different implementation. What I implemented for channels was this idea of submodules, which were just snapshottable (Metadatable) objects that could be referenced as part of an instrument. ChannelLists fit this definition. Since they only need to be snapshottable, they can be used to implement this nested structure.

As an example of what is currently possible, a skeleton for an SMU with source and measure broken out would look like:

class SourceUnit(InstrumentChannel):
   def __init__(self, parent, name):
      super().__init__(parent, name)
      self.add_parameter("voltage",...)
      self.add_parameter("range",...)
      ...

class MeasureUnit(InstrumentChannel):
   def __init__(self, parent, name):
      super().__init__(parent, name)
      self.add_parameter("voltage",...)
      self.add_parameter("resistance",...)
      ...

class SourceMeasureUnit(VisaInstrument):
   def __init__(self, name, address, **kwargs):
      super().__init__(name, address, **kwargs)
      source = SourceUnit(self, "source")
      measure = MeasureUnit(self, "measure")
      self.add_submodule('source', source)
      self.add_submodule('measure', measure)

which can be accessed like:

>>> smu = SourceMeasureUnit("smu",...)
>>> smu.source.voltage.set(1)
>>> smu.measure.voltage.get()
1.001

As I read it this is how a ParameterNode might work? It may make sense to only do things this way, rather than extend add_parameter, just as a way of tidying up the __init__ function and enforcing logical groupings of parameters in code.

For an example in the wild, I've got an extended Yoko GS200 driver which I have been meaning to pull in here: https://github.com/spauka/Qcodes/blob/device-dev/qcodes/instrument_drivers/yokogawa/GS200.py

@nulinspiratie
Copy link
Contributor

nulinspiratie commented Oct 1, 2017

I'm definitely in favour of a way of grouping together parameters, and the ParameterNode looks like a good implementation. Also when combining this with monitoring tools etc, it will be very useful to have a the parameters structured, instead of a giant list.

The functionality of Channel/MultiChannelParameter/ChannelList seems to have a lot of overlap with the proposed ParameterNode, they both seem to be a container for parameters. In this sense, I like the name ParameterNode better, especially since parameters may want to be grouped in a way unrelated to a channel.
At the moment I can't think of a situation where a ParameterNode could not be used instead. @Dominik-Vogel You mentioned channels being more suitable as homogeneous parameters, could you give an example of it's advantage over a ParameterNode?

@AdriaanRol enhancing the get/set functionality of instruments also sounds good. I'm thinking this could also be a feature of the ParameterNode. In this case, the ParameterNode actually also has a lot of overlap with the CombinedParameter (which is currently in need of improvements). I'm wondering if the ParameterNode would be able to take over its functionality entirely. The asterisk symbol could then act as a flattening of a ParameterNode, returning a flattened ParameterNode. For example, say we have:

ch1 (ParameterNode):
    in1 (ParameterNode):
        trigger_threshold (Parameter)
    in2 (ParameterNode):
        trigger_threshold (Parameter)

By then specifying ch1['in*] (or via .get or some other method), we would get a flattened ParameterNode:

ch1_flattened (ParameterNode):
    in1_trigger_threshold (Parameter)
    in2_trigger_threshold (Parameter)

We could then get/set its values as we would for a CombinedParameter (ch1['in*'].set([1, 1.5]))

I'm not sure if defining these nodes implicitly via add_parameter is the best solution, it might be worthwhile to explicitly create nodes. In this case, it would be possible later on to remove the add_parameter, and instead directly set parameter attributes (e.g. instr.node.param_name = Parameter())

@AdriaanRol
Copy link
Contributor Author

@spauka @jenshnielsen it does indeed appear that the InstrumentChannel already behaves mostly like I would intend a parameter node to behave. Especially the example by @spauka was very helpful. Playing around with that example and looking at the code for channels did raise a whole bunch of other questions though. I'll first show the example on how I would like it to work, then I'll address the changes that would be needed and last I will ask some questions on the way channels work.

Examples of intended behaviour

I have put together 3 examples of code that (should) function idential. The first two already do, the third would contain the two lines of example two merged into the add_parameter.

rewrote example by @spauka to be self contained.

class SourceUnit(InstrumentChannel):
    def __init__(self, parent, name):
        super().__init__(parent, name)
        self.add_parameter("voltage", parameter_class=ManualParameter, unit='V')
        self.add_parameter("range", parameter_class=ManualParameter, unit='V')
        

class MeasureUnit(InstrumentChannel):
    def __init__(self, parent, name):
        super().__init__(parent, name)
        self.add_parameter("voltage", parameter_class=ManualParameter, unit='V')
        self.add_parameter("resistance", parameter_class=ManualParameter, unit='Ohm')
    

class SourceMeasureUnit(Instrument):
     def __init__(self, name, **kwargs):
        super().__init__(name, **kwargs)
        source = SourceUnit(self, "source")
        measure = MeasureUnit(self, "measure")
        self.add_submodule('source', source)
        self.add_submodule('measure', measure)

Same as above but without extra classes

class SourceMeasureUnit_no_extra_classes(Instrument):
    def __init__(self, name, **kwargs):
        super().__init__(name, **kwargs)
        # I propose these two lines be merged into the add_parameter when there is nodes 
        source = InstrumentChannel(self, "source")
        self.add_submodule('source', source)
        source.add_parameter("voltage", parameter_class=ManualParameter, unit='V')
        source.add_parameter("range", parameter_class=ManualParameter, unit='V')

        measure = InstrumentChannel(self, "measure")
        self.add_submodule('measure', measure)
        
        measure.add_parameter("voltage", parameter_class=ManualParameter, unit='V')
        measure.add_parameter("resistance", parameter_class=ManualParameter, unit='Ohm')

Proposed equivalent

class SourceMeasureUnit_intended_nesting(Instrument):
    def __init__(self, name, **kwargs):
        super().__init__(name, **kwargs)
        # here the source-node parameters get added 
        self.add_parameter("source.voltage", parameter_class=ManualParameter, unit='V')
        self.add_parameter("source.range", parameter_class=ManualParameter, unit='V')
        # here the measure-node parameters get added 
        self.add_parameter("measure.voltage", parameter_class=ManualParameter, unit='V')
        self.add_parameter("measure.resistance", parameter_class=ManualParameter, unit='Ohm')

Snippet I use to test the channels

# instantiating the instrument 
mySMU = SourceMeasureUnit('mySMU')

# Setting some random values for the example
mySMU.measure.resistance(50)
mySMU.measure.voltage(1.2)

mySMU.source.voltage(1.03)
mySMU.source.range(2)

# her I would like to also list the Nodes/Submodules/InstrumentChannels
mySMU.parameters                             # currently only returns the IDN parameter
mySMU.print_readable_snapshot()     # shows that the snapshot works but is not optimal yet. 

mySMU.get('source.range')    # should return "2" but not implemented yet 
mySMU.set('source.range', 5) # similar as above but also not implemented yet 

Required changes.

It seems that the InstrumentChannel is almost exactly what a ParameterNode would be so that is good news 👍 .
However there are several things that would need to be changed in the way it behaves.

  • Rename the InstrumentChannel to ParameterNode as I think the name is more general
  • Add submodules to the list of parameters so that Instr.parameters also lists the nodes (in fact I would propose to get rid of the distinction completely)
  • Support fancier get/set methods (as in example above)
  • Update snapshot and readable snapshot
    (mmh while writing this it seems most of this has already been written in my initial post).

Questions on channels

I know understand what an InstrumentChannel is, what is the difference between a submodule and an InstrumentChannel?
What are the intended use cases of all the other classes in the Channels module? (MultiChannelInstrumentParameter and ChannelList)?

@AdriaanRol
Copy link
Contributor Author

@nulinspiratie , I was writing while you posted your last update. The description you give on the fancier get/set is kind of what I'm trying to get at.
In my understanding the ParameterNode is a concept that could indeed, as you describe, describe all the use cases that are now covered with the variety of Channel MultiChannelParameter and ChannelList. Additionally I am of the opinion that it is a good thing if I can kill of 3 concepts and replace them by 1 😉 .

I am a big proponent of the add_parameter method though mostly as this does a bit more than just Instr.parname = par. It also checks for existing definitions and adds them to the list of Instr.parameters which in turn is used in the snapshotting. It also helps a lot with code generated drivers (e.g., for ch in range(10): add_parameter('base_name{}'.format(ch), **kw)).

A reason I am a proponent of hiding the node creation in the add parameter method is twofold. First of all I think of it a bit like creating files in a folder struture. I like my makefile/open command to create the higher level folders if that is required for convenience reasons. Secondly I like to create drivers based on JSON files or manuals. They contain a dictionary of parameter names (which we can create using . separators. It is then very convenient to create the required nodes and only complain if an identical parameter already exists.

@nulinspiratie
Copy link
Contributor

@AdriaanRol all of the extra features can be handled quite easily using the Instrument.__setattr__:

def __setattr__(self, attr, val):
    if isinstance(val, Parameter):
        if hasattr(self, attr):
            raise Exception()
        else:
            self.parameters[attr] = val
    super().__setattr__(attr, val)

I think in this case setting the parameter would be explicit: instr.param_name=Parameter(). I think it makes it clearer, since you don't need to pass the parameter class as a kwarg.
Also, your example could be replaced by for ch in range(10): setattr(instr, base_name{}'.format(ch), Parameter())

As for implicit or explicit node creation, it doesn't matter too much except that implicit node creation doesn't work well with setattr. Also, implicit node creation doesn't allow to use a subclassed node. This would still have to be done explicitly. That being said, I do see the appeal in creating implicit nodes

@Dominik-Vogel
Copy link
Contributor

@nulinspiratie I was basically thinking of the differences in the intended uses between nodes and channels. Where channels are currently typically used through subclassing, nodes were intended to be created by adding parameters with an extended add_parameter method. Adding, what I called "homogeneous" channels/nodes, can of course also be achieved by looping over a group of add_parameter calls and is only a question of personal preference.
There are some drivers that have channels with parameter-getters/setters that rely on channel attributes (e.g. ZNB, Decadac)

@AdriaanRol I was also wondering about the intended use of add_submodule. In the main code base it is exclusively used for adding channels. Possibly this can be added to the list of concepts that can be replaced by a ParameterNode?

@spauka
Copy link
Contributor

spauka commented Oct 2, 2017

@Dominik-Vogel perhaps it would be useful to explain my reasoning behind using add_submodule as opposed to extending add_parameter. Given that multi-threading has been taken out of qcodes for now, the only reason that add_parameter/add_function even needs to be used (as opposed to something like self.param = Parameter("bla", ...)) was to ensure snapshotting works. However the way that objects are accessed from the parameters dictionary meant that it wasn't really logical to store more general objects in this dictionary. The submodules dictionary was defined to store ANY instance of a Metadatable object.

It's used in a couple of places for more than just channels, see the yokogawa driver linked above for a more general usage example. Or, in the Lakeshore.Model_336 driver, add_submodule is used to allow access to the temperature channels either using the channel list OR using the channel letters, i.e. the following two methods of accessing the channel are equivalent:

temp = Model_336("temp", "GPIB_ADDRESS")
temp.channels[0].temperature.get()
temp.A.temperature.get()

@nulinspiratie Renaming InstrumentChannel to ParameterNode makes sense I think? There's nothing in there that makes it uniquely channel-like...

@AdriaanRol Actually, rather interestingly, there seems to be a conflict in the way we both access parameters, which may decide how we move forward. We normally pull parameters out of Instruments and call get/set on these. You seem to call get/set on the instrument with a parameter name as an argument? The ChannelList/InstrumentChannel divide was to support the former method of access, and we can write down a mapping between all your examples, and how I would access them currently:

Parameter Based Access Instrument Based Access
mySMU.source.range.set(5) mySMU.set('source.range', 5)
VSM.in[0].out[0].att.get() VSM.get('in1.out1.att)
VSM.in.out.switch.set('OFF') VSM.set('in*.out*.switch, 'OFF')
VSM.in[0].out[0:2].set([0, 2]) VSM.set('in1.out*.att', [0, 2])
VSM.in[0].out[2:4].set([0, 2]) ?

To answer @AdriaanRol's question then:

  • InstrumentChannel is an instrument-like object that points all ask/write requests to the parent instrument.
  • ChannelList is a list-like object that implements slicing logic for channel lists (i.e. makes dac.channels[0:20] possible)
  • MultiChannelInstrumentParamter is a parameter-like object that contains multiple instrument channels (i.e. the result of dac.channels[0:20].voltage is a MultiChannelInstrumentParamter pointing to the voltage parameter of the first 20 dac channels. It is like a CombinedParameter that points to the first 20 channels of the dac.

My goal with this was to get rid of strings as a method of getting access to channels, and to allow list-like access to channels. In addition, to allow a more structured definition of large instrument drivers by breaking out sections as logical. Code generated parameters are still very much possible (see Decadac Driver), although this may require more work for JSON code generation.

@Dominik-Vogel
Copy link
Contributor

@spauka Thank you for explaining the intention behind the submodules. I didn't want to evoke the impression that we can get rid of it. I only meant to say that it is so far only used in the context that was at discussion, which are Channels and ChannelLists, which includes your examples of the Yokogawa(Channel) and 336 (ChannelList).

@AdriaanRol
Copy link
Contributor Author

@spauka , thanks for explaining that.
I'll just quickly write my thoughts below, a more in depth reply will follow later.

Given that multi-threading has been taken out of qcodes for now, the only reason that add_parameter/add_function even needs to be used (as opposed to something like self.param = Parameter("bla", ...)) was to ensure snapshotting works.

Agree, it also provides a neat hook in if we ever want to reintroduce such functionality. I also think it has minor advantages in readability for code generated parameter names if only because string formatting an attribute name can be annoying.

However the way that objects are accessed from the parameters dictionary meant that it wasn't really logical to store more general objects in this dictionary. The submodules dictionary was defined to store ANY instance of a Metadatable object.

I would like to get rid of the distinction and allow the parameters dictionary to allow for storing general snapshotable object in general. I think getting rid is advantageous because one has less concepts to worry about and the user can quickly get an overview of all the relevant "parameter" he/she can interact with.

either using the channel list OR using the channel letters

This would be kind of what I am going for, what I am thinking is that the different ways of accessing should not be done by using multiple parameter classes but rather by improving the way the get and set commands work, including potential slicing access to nodes. Adding those kind of features would be a second step after implementing the basic nodes.

@nulinspiratie Renaming InstrumentChannel to ParameterNode makes sense I think? There's nothing in there that makes it uniquely channel-like...

This would make me very happy 👍

@AdriaanRol Actually, rather interestingly, there seems to be a conflict in the way we both access parameters, which may decide how we move forward. We normally pull parameters out of Instruments and call get/set on these. You seem to call get/set on the instrument with a parameter name as an argument?

We actually use both. I generally prefer the attribute based access as it has nice autocomplete features and is quite readable. However, when code generating loops over specific parameters (or using some parameter to designate the name of another parameter I want to access) I prefer the instr.get('parname') syntax. I think the second method is very explicit and flexibile (using string formatters).

The only real conflict lies in the following example

VSM.in[0].out[2:4].set([0, 2]) = ?

This would be easily addressed if we allow regular expressions, which I personally detest but are a widespread and powerful standard.

My goal with this was to get rid of strings as a method of getting access to channels, and to allow list-like access to channels. In addition, to allow a more structured definition of large instrument drivers by breaking out sections as logical.

I think then our goals are very much aligned. To these goals I would like to add that I want to have a way providing this structure to more general objects within a driver while simultaneously standardizing the way these are accessed (i.e., getting rid of the different classes that achieve this).

@spauka
Copy link
Contributor

spauka commented Oct 3, 2017

All sounds great 😄 As long as parameter based access is kept in mind, I think it's definitely a feature worth adding.

bors bot added a commit that referenced this issue Sep 19, 2022
4629: Update pyjwt requirement from ~=2.4.0 to ~=2.5.0 r=jenshnielsen a=dependabot[bot]

Updates the requirements on [pyjwt](https://github.com/jpadilla/pyjwt) to permit the latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/jpadilla/pyjwt/releases">pyjwt's releases</a>.</em></p>
<blockquote>
<h2>2.5.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Bump actions/checkout from 2 to 3 by <a href="https://github.com/dependabot"><code>`@​dependabot</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/758">jpadilla/pyjwt#758</a></li>
<li>Bump codecov/codecov-action from 1 to 3 by <a href="https://github.com/dependabot"><code>`@​dependabot</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/757">jpadilla/pyjwt#757</a></li>
<li>Bump actions/setup-python from 2 to 3 by <a href="https://github.com/dependabot"><code>`@​dependabot</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/756">jpadilla/pyjwt#756</a></li>
<li>adding support for compressed payloads by <a href="https://github.com/danieltmiles"><code>`@​danieltmiles</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/753">jpadilla/pyjwt#753</a></li>
<li>Revert &quot;adding support for compressed payloads&quot; by <a href="https://github.com/auvipy"><code>`@​auvipy</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/761">jpadilla/pyjwt#761</a></li>
<li>Add to_jwk static method to ECAlgorithm by <a href="https://github.com/leonsmith"><code>`@​leonsmith</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/732">jpadilla/pyjwt#732</a></li>
<li>Remove redundant wheel dep from pyproject.toml by <a href="https://github.com/mgorny"><code>`@​mgorny</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/765">jpadilla/pyjwt#765</a></li>
<li>Adjust expected exceptions in option merging tests for PyPy3 by <a href="https://github.com/mgorny"><code>`@​mgorny</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/763">jpadilla/pyjwt#763</a></li>
<li>Do not fail when an unusable key occurs by <a href="https://github.com/DaGuich"><code>`@​DaGuich</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/762">jpadilla/pyjwt#762</a></li>
<li>Fixes for pyright on strict mode by <a href="https://github.com/brandon-leapyear"><code>`@​brandon-leapyear</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/747">jpadilla/pyjwt#747</a></li>
<li>Bump actions/setup-python from 3 to 4 by <a href="https://github.com/dependabot"><code>`@​dependabot</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/769">jpadilla/pyjwt#769</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a href="https://github.com/pre-commit-ci"><code>`@​pre-commit-ci</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/770">jpadilla/pyjwt#770</a></li>
<li>docs: fix simple typo, iinstance -&gt; isinstance by <a href="https://github.com/timgates42"><code>`@​timgates42</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/774">jpadilla/pyjwt#774</a></li>
<li>Expose get_algorithm_by_name as new method by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/773">jpadilla/pyjwt#773</a></li>
<li>Remove support for python3.6 by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/777">jpadilla/pyjwt#777</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a href="https://github.com/pre-commit-ci"><code>`@​pre-commit-ci</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/778">jpadilla/pyjwt#778</a></li>
<li>Emit a deprecation warning for unsupported kwargs by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/776">jpadilla/pyjwt#776</a></li>
<li>Fix typo: priot -&gt; prior by <a href="https://github.com/jdufresne"><code>`@​jdufresne</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/780">jpadilla/pyjwt#780</a></li>
<li>Fix for headers disorder issue by <a href="https://github.com/kadabusha"><code>`@​kadabusha</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/721">jpadilla/pyjwt#721</a></li>
<li>Update audience typing by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/782">jpadilla/pyjwt#782</a></li>
<li>Improve PyJWKSet error accuracy by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/786">jpadilla/pyjwt#786</a></li>
<li>Add type hints to jwt/help.py and add missing types dependency by <a href="https://github.com/kkirsche"><code>`@​kkirsche</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/784">jpadilla/pyjwt#784</a></li>
<li>Add cacheing functionality for JWK set by <a href="https://github.com/wuhaoyujerry"><code>`@​wuhaoyujerry</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/781">jpadilla/pyjwt#781</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a href="https://github.com/pre-commit-ci"><code>`@​pre-commit-ci</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/788">jpadilla/pyjwt#788</a></li>
<li>Mypy as pre-commit check + api_jws typing by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/787">jpadilla/pyjwt#787</a></li>
<li>[pre-commit.ci] pre-commit autoupdate by <a href="https://github.com/pre-commit-ci"><code>`@​pre-commit-ci</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/791">jpadilla/pyjwt#791</a></li>
<li>Bump version to 2.5.0 by <a href="https://github.com/jpadilla"><code>`@​jpadilla</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/801">jpadilla/pyjwt#801</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/dependabot"><code>`@​dependabot</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/758">jpadilla/pyjwt#758</a></li>
<li><a href="https://github.com/danieltmiles"><code>`@​danieltmiles</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/753">jpadilla/pyjwt#753</a></li>
<li><a href="https://github.com/leonsmith"><code>`@​leonsmith</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/732">jpadilla/pyjwt#732</a></li>
<li><a href="https://github.com/mgorny"><code>`@​mgorny</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/765">jpadilla/pyjwt#765</a></li>
<li><a href="https://github.com/DaGuich"><code>`@​DaGuich</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/762">jpadilla/pyjwt#762</a></li>
<li><a href="https://github.com/brandon-leapyear"><code>`@​brandon-leapyear</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/747">jpadilla/pyjwt#747</a></li>
<li><a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/773">jpadilla/pyjwt#773</a></li>
<li><a href="https://github.com/kadabusha"><code>`@​kadabusha</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/721">jpadilla/pyjwt#721</a></li>
<li><a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/782">jpadilla/pyjwt#782</a></li>
<li><a href="https://github.com/wuhaoyujerry"><code>`@​wuhaoyujerry</code></a>` made their first contribution in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/781">jpadilla/pyjwt#781</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a href="https://github.com/jpadilla/pyjwt/compare/2.4.0...2.5.0">https://github.com/jpadilla/pyjwt/compare/2.4.0...2.5.0</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst">pyjwt's changelog</a>.</em></p>
<blockquote>
<h2><code>v2.5.0 &lt;https://github.com/jpadilla/pyjwt/compare/2.4.0...2.5.0&gt;</code>__</h2>
<p>Changed</p>
<pre><code>
- Skip keys with incompatible alg when loading JWKSet by `@DaGuich` in `[#762](jpadilla/pyjwt#762) &lt;https://github.com/jpadilla/pyjwt/pull/762&gt;`__
- Remove support for python3.6 by `@sirosen` in `[#777](jpadilla/pyjwt#777) &lt;https://github.com/jpadilla/pyjwt/pull/777&gt;`__
- Emit a deprecation warning for unsupported kwargs by `@sirosen` in `[#776](jpadilla/pyjwt#776) &lt;https://github.com/jpadilla/pyjwt/pull/776&gt;`__
- Remove redundant wheel dep from pyproject.toml by `@mgorny` in `[#765](jpadilla/pyjwt#765) &lt;https://github.com/jpadilla/pyjwt/pull/765&gt;`__
- Do not fail when an unusable key occurs by `@DaGuich` in `[#762](jpadilla/pyjwt#762) &lt;https://github.com/jpadilla/pyjwt/pull/762&gt;`__
- Update audience typing by `@JulianMaurin` in `[#782](jpadilla/pyjwt#782) &lt;https://github.com/jpadilla/pyjwt/pull/782&gt;`__
- Improve PyJWKSet error accuracy by `@JulianMaurin` in `[#786](jpadilla/pyjwt#786) &lt;https://github.com/jpadilla/pyjwt/pull/786&gt;`__
- Mypy as pre-commit check + api_jws typing by `@JulianMaurin` in `[#787](jpadilla/pyjwt#787) &lt;https://github.com/jpadilla/pyjwt/pull/787&gt;`__
<p>Fixed</p>
<pre><code>
- Adjust expected exceptions in option merging tests for PyPy3 by `@mgorny` in `[#763](jpadilla/pyjwt#763) &amp;lt;https://github.com/jpadilla/pyjwt/pull/763&amp;gt;`__
- Fixes for pyright on strict mode by `@brandon-leapyear` in `[#747](jpadilla/pyjwt#747) &amp;lt;https://github.com/jpadilla/pyjwt/pull/747&amp;gt;`__
- docs: fix simple typo, iinstance -&amp;gt; isinstance by `@timgates42` in `[#774](jpadilla/pyjwt#774) &amp;lt;https://github.com/jpadilla/pyjwt/pull/774&amp;gt;`__
- Fix typo: priot -&amp;gt; prior by `@jdufresne` in `[#780](jpadilla/pyjwt#780) &amp;lt;https://github.com/jpadilla/pyjwt/pull/780&amp;gt;`__
- Fix for headers disorder issue by `@kadabusha` in `[#721](jpadilla/pyjwt#721) &amp;lt;https://github.com/jpadilla/pyjwt/pull/721&amp;gt;`__

Added
</code></pre>
<ul>
<li>Add to_jwk static method to ECAlgorithm by <a href="https://github.com/leonsmith"><code>`@​leonsmith</code></a>` in <code>[#732](jpadilla/pyjwt#732) &amp;lt;https://github.com/jpadilla/pyjwt/pull/732&amp;gt;</code>__</li>
<li>Expose get_algorithm_by_name as new method by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <code>[#773](jpadilla/pyjwt#773) &amp;lt;https://github.com/jpadilla/pyjwt/pull/773&amp;gt;</code>__</li>
<li>Add type hints to jwt/help.py and add missing types dependency by <a href="https://github.com/kkirsche"><code>`@​kkirsche</code></a>` in <code>[#784](jpadilla/pyjwt#784) &amp;lt;https://github.com/jpadilla/pyjwt/pull/784&amp;gt;</code>__</li>
<li>Add cacheing functionality for JWK set by <a href="https://github.com/wuhaoyujerry"><code>`@​wuhaoyujerry</code></a>` in <code>[#781](jpadilla/pyjwt#781) &amp;lt;https://github.com/jpadilla/pyjwt/pull/781&amp;gt;</code>__</li>
</ul>
<h2><code>v2.4.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.3.0...2.4.0&amp;gt;</code>__</h2>
<p>Security
</code></pre></p>
<ul>
<li>[CVE-2022-29217] Prevent key confusion through non-blocklisted public key formats. <a href="https://github.com/jpadilla/pyjwt/security/advisories/GHSA-ffqj-6fqr-9h24">https://github.com/jpadilla/pyjwt/security/advisories/GHSA-ffqj-6fqr-9h24</a></li>
</ul>
<p>Changed</p>
<pre><code>
- Explicit check the key for ECAlgorithm by `@estin` in jpadilla/pyjwt#713
- Raise DeprecationWarning for jwt.decode(verify=...) by `@akx` in jpadilla/pyjwt#742
<p>Fixed</p>
<pre><code>
- Don't use implicit optionals by `@rekyungmin` in jpadilla/pyjwt#705
&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;... (truncated)&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;Commits&lt;/summary&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@c9006103b56359b3ad788bb2e380ef17dfe59b05&quot;&gt;&lt;code&gt;c900610&lt;/code&gt;&lt;/a&gt; Bump version to 2.5.0 (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/801&quot;&gt;#801&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@5ecbafc366ebc4940ce4eac81350bc41887a4433&quot;&gt;&lt;code&gt;5ecbafc&lt;/code&gt;&lt;/a&gt; [pre-commit.ci] pre-commit autoupdate (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/791&quot;&gt;#791&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@f827be366cc2560266a412697b5194ee4782b510&quot;&gt;&lt;code&gt;f827be3&lt;/code&gt;&lt;/a&gt; Mypy as pre-commit check + api_jws typing (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/787&quot;&gt;#787&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@e8780abdd561963e3b0ca49ecec8b8519a793f75&quot;&gt;&lt;code&gt;e8780ab&lt;/code&gt;&lt;/a&gt; [pre-commit.ci] pre-commit autoupdate (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/788&quot;&gt;#788&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@fc5b94eb3575254caba599218246616c75fecdc7&quot;&gt;&lt;code&gt;fc5b94e&lt;/code&gt;&lt;/a&gt; Add cacheing functionality for JWK set (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/781&quot;&gt;#781&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@ae3da7469ff8c28b726e082cd671997e09b19d55&quot;&gt;&lt;code&gt;ae3da74&lt;/code&gt;&lt;/a&gt; Add type hints to jwt/help.py and add missing types dependency (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/784&quot;&gt;#784&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@435e826da56a105da51176355a29cdc00420f4c1&quot;&gt;&lt;code&gt;435e826&lt;/code&gt;&lt;/a&gt; Improve PyJWKSet error accuracy (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/786&quot;&gt;#786&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@98a5c1d61ee180f5b3574e142f5938d24146ee99&quot;&gt;&lt;code&gt;98a5c1d&lt;/code&gt;&lt;/a&gt; Update audience typing (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/782&quot;&gt;#782&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@0bef0fbff5c245668578a43774d8620bdba4a6f7&quot;&gt;&lt;code&gt;0bef0fb&lt;/code&gt;&lt;/a&gt; Fix for headers disorder issue (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/721&quot;&gt;#721&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;jpadilla/pyjwt@c8fda69f09bc293960c141288633fbd1399e0b2b&quot;&gt;&lt;code&gt;c8fda69&lt;/code&gt;&lt;/a&gt; Fix typo: priot -&amp;gt; prior (&lt;a href=&quot;https://github-redirect.dependabot.com/jpadilla/pyjwt/issues/780&quot;&gt;#780&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Additional commits viewable in &lt;a href=&quot;jpadilla/pyjwt@2.4.0...2.5.0&quot;&gt;compare view&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/details&gt;

&lt;br /&gt;
</code></pre>


You can trigger a rebase of this PR 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` 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>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
bors bot added a commit that referenced this issue Oct 20, 2022
4745: Update pyjwt requirement from ~=2.5.0 to ~=2.6.0 r=jenshnielsen a=dependabot[bot]

Updates the requirements on [pyjwt](https://github.com/jpadilla/pyjwt) to permit the latest version.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/jpadilla/pyjwt/blob/master/CHANGELOG.rst">pyjwt's changelog</a>.</em></p>
<blockquote>
<h2><code>v2.6.0 &lt;https://github.com/jpadilla/pyjwt/compare/2.5.0...2.6.0&gt;</code>__</h2>
<p>Changed</p>
<pre><code>
- bump up cryptography &gt;= 3.4.0 by `@jpadilla` in `[#807](jpadilla/pyjwt#807) &lt;https://github.com/jpadilla/pyjwt/pull/807&gt;`_
- Remove `types-cryptography` from `crypto` extra by `@lautat` in `[#805](jpadilla/pyjwt#805) &lt;https://github.com/jpadilla/pyjwt/pull/805&gt;`_
<p>Fixed</p>
<pre><code>
- Invalidate token on the exact second the token expires `[#797](jpadilla/pyjwt#797) &amp;lt;https://github.com/jpadilla/pyjwt/pull/797&amp;gt;`_
- fix: version 2.5.0 heading typo by `@c0state` in `[#803](jpadilla/pyjwt#803) &amp;lt;https://github.com/jpadilla/pyjwt/pull/803&amp;gt;`_

Added
</code></pre>
<ul>
<li>Adding validation for <code>issued_at</code> when <code>iat &amp;gt; (now + leeway)</code> as <code>ImmatureSignatureError</code> by <a href="https://github.com/sriharan16"><code>`@​sriharan16</code></a>` in <a href="https://github-redirect.dependabot.com/jpadilla/pyjwt/pull/794">jpadilla/pyjwt#794</a></li>
</ul>
<h2><code>v2.5.0 &amp;lt;https://github.com/jpadilla/pyjwt/compare/2.4.0...2.5.0&amp;gt;</code>__</h2>
<p>Changed
</code></pre></p>
<ul>
<li>Skip keys with incompatible alg when loading JWKSet by <a href="https://github.com/DaGuich"><code>`@​DaGuich</code></a>` in <code>[#762](jpadilla/pyjwt#762) &lt;https://github.com/jpadilla/pyjwt/pull/762&gt;</code>__</li>
<li>Remove support for python3.6 by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <code>[#777](jpadilla/pyjwt#777) &lt;https://github.com/jpadilla/pyjwt/pull/777&gt;</code>__</li>
<li>Emit a deprecation warning for unsupported kwargs by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <code>[#776](jpadilla/pyjwt#776) &lt;https://github.com/jpadilla/pyjwt/pull/776&gt;</code>__</li>
<li>Remove redundant wheel dep from pyproject.toml by <a href="https://github.com/mgorny"><code>`@​mgorny</code></a>` in <code>[#765](jpadilla/pyjwt#765) &lt;https://github.com/jpadilla/pyjwt/pull/765&gt;</code>__</li>
<li>Do not fail when an unusable key occurs by <a href="https://github.com/DaGuich"><code>`@​DaGuich</code></a>` in <code>[#762](jpadilla/pyjwt#762) &lt;https://github.com/jpadilla/pyjwt/pull/762&gt;</code>__</li>
<li>Update audience typing by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <code>[#782](jpadilla/pyjwt#782) &lt;https://github.com/jpadilla/pyjwt/pull/782&gt;</code>__</li>
<li>Improve PyJWKSet error accuracy by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <code>[#786](jpadilla/pyjwt#786) &lt;https://github.com/jpadilla/pyjwt/pull/786&gt;</code>__</li>
<li>Mypy as pre-commit check + api_jws typing by <a href="https://github.com/JulianMaurin"><code>`@​JulianMaurin</code></a>` in <code>[#787](jpadilla/pyjwt#787) &lt;https://github.com/jpadilla/pyjwt/pull/787&gt;</code>__</li>
</ul>
<p>Fixed</p>
<pre><code>
- Adjust expected exceptions in option merging tests for PyPy3 by `@mgorny` in `[#763](jpadilla/pyjwt#763) &lt;https://github.com/jpadilla/pyjwt/pull/763&gt;`__
- Fixes for pyright on strict mode by `@brandon-leapyear` in `[#747](jpadilla/pyjwt#747) &lt;https://github.com/jpadilla/pyjwt/pull/747&gt;`__
- docs: fix simple typo, iinstance -&gt; isinstance by `@timgates42` in `[#774](jpadilla/pyjwt#774) &lt;https://github.com/jpadilla/pyjwt/pull/774&gt;`__
- Fix typo: priot -&gt; prior by `@jdufresne` in `[#780](jpadilla/pyjwt#780) &lt;https://github.com/jpadilla/pyjwt/pull/780&gt;`__
- Fix for headers disorder issue by `@kadabusha` in `[#721](jpadilla/pyjwt#721) &lt;https://github.com/jpadilla/pyjwt/pull/721&gt;`__
<p>Added
</code></pre></p>
<ul>
<li>Add to_jwk static method to ECAlgorithm by <a href="https://github.com/leonsmith"><code>`@​leonsmith</code></a>` in <code>[#732](jpadilla/pyjwt#732) &lt;https://github.com/jpadilla/pyjwt/pull/732&gt;</code>__</li>
<li>Expose get_algorithm_by_name as new method by <a href="https://github.com/sirosen"><code>`@​sirosen</code></a>` in <code>[#773](jpadilla/pyjwt#773) &lt;https://github.com/jpadilla/pyjwt/pull/773&gt;</code>__</li>
<li>Add type hints to jwt/help.py and add missing types dependency by <a href="https://github.com/kkirsche"><code>`@​kkirsche</code></a>` in <code>[#784](jpadilla/pyjwt#784) &lt;https://github.com/jpadilla/pyjwt/pull/784&gt;</code>__</li>
<li>Add cacheing functionality for JWK set by <a href="https://github.com/wuhaoyujerry"><code>`@​wuhaoyujerry</code></a>` in <code>[#781](jpadilla/pyjwt#781) &lt;https://github.com/jpadilla/pyjwt/pull/781&gt;</code>__</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a href="https://github.com/jpadilla/pyjwt/commits">compare view</a></li>
</ul>
</details>
<br />


You can trigger a rebase of this PR 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` 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>

4746: Update pandas requirement from ~=1.5.0 to ~=1.5.1 r=jenshnielsen a=dependabot[bot]

Updates the requirements on [pandas](https://github.com/pandas-dev/pandas) to permit the latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/pandas-dev/pandas/releases">pandas's releases</a>.</em></p>
<blockquote>
<h2>Pandas 1.5.1</h2>
<p>This is a patch release in the 1.5.x series and includes some regression and bug fixes. We recommend that all users upgrade to this version.</p>
<p>See the <a href="https://pandas.pydata.org/pandas-docs/version/1.5.1/whatsnew/v1.5.1.html">full whatsnew</a> for a list of all the changes.</p>
<p>The release will be available on the defaults and conda-forge channels:</p>
<pre><code>conda install pandas
</code></pre>
<p>Or via PyPI:</p>
<pre><code>python3 -m pip install --upgrade pandas
</code></pre>
<p>Please report any issues with the release on the <a href="https://github.com/pandas-dev/pandas/issues">pandas issue tracker</a>.</p>
<p>Thanks to all the contributors who made this release possible.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pandas-dev/pandas/commit/91111fd99898d9dcaa6bf6bedb662db4108da6e6"><code>91111fd</code></a> RLS: 1.5.1</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/72863856504a4e906fc603f9e4624f251b614828"><code>7286385</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49162">#49162</a> on branch 1.5.x (PERF: Fix performance regression for isin...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/8429c50a279ba953514d1ca4d4a2bcef5e23ecc9"><code>8429c50</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49140">#49140</a> on branch 1.5.x (Revert &quot;PERF: faster corrwith method for ...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/5b036c1c35890c44531f796f5dca92796276b2b5"><code>5b036c1</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49137">#49137</a> on branch 1.5.x (WEB/DOC: Fix typo in OVH name) (<a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49138">#49138</a>)</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/ea971acb948d16e284a38292cd615a5eb7c055ab"><code>ea971ac</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/48770">#48770</a> on branch 1.5.x (added sytle in stylesheet for &lt;blockquote...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/27717a20061aaedda0d3e5de8461835e952c49f3"><code>27717a2</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49080">#49080</a> on branch 1.5.x (REGR: midx.values resetting freq of under...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/c58f2057b8c8a7fa79654c45a83c963c013a3aa3"><code>c58f205</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/48457">#48457</a> on branch 1.5.x (TST: Fix unsigned pyarrow types in SIGNED...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/072402b58cbd87c2106413a37213c0b6020e34b1"><code>072402b</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49053">#49053</a> on branch 1.5.x (REVERT caching in find_stack_level) (<a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49079">#49079</a>)</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/f9eebaf9de23aa9c5debdd86524615b22c23025f"><code>f9eebaf</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49072">#49072</a> on branch 1.5.x (BUG: redirect from meeting to community w...</li>
<li><a href="https://github.com/pandas-dev/pandas/commit/b8d2f461767e1e2124a08c17be69bf0f847c882e"><code>b8d2f46</code></a> Backport PR <a href="https://github-redirect.dependabot.com/pandas-dev/pandas/issues/49070">#49070</a> on branch 1.5.x (CI: Fix DeprecationWarning of numpy dev) ...</li>
<li>Additional commits viewable in <a href="https://github.com/pandas-dev/pandas/compare/v1.5.0...v1.5.1">compare view</a></li>
</ul>
</details>
<br />


You can trigger a rebase of this PR 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` 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>

4748: Bump scipy from 1.9.2 to 1.9.3 r=jenshnielsen a=dependabot[bot]

Bumps [scipy](https://github.com/scipy/scipy) from 1.9.2 to 1.9.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/scipy/scipy/releases">scipy's releases</a>.</em></p>
<blockquote>
<h1>SciPy 1.9.3 Release Notes</h1>
<p>SciPy <code>1.9.3</code> is a bug-fix release with no new features
compared to <code>1.9.2</code>.</p>
<h1>Authors</h1>
<ul>
<li>Jelle Aalbers (1)</li>
<li>Peter Bell (1)</li>
<li>Jake Bowhay (3)</li>
<li>Matthew Brett (3)</li>
<li>Evgeni Burovski (5)</li>
<li>drpeteb (1) +</li>
<li>Sebastian Ehlert (1) +</li>
<li>GavinZhang (1) +</li>
<li>Ralf Gommers (2)</li>
<li>Matt Haberland (15)</li>
<li>Lakshaya Inani (1) +</li>
<li>Joseph T. Iosue (1)</li>
<li>Nathan Jacobi (1) +</li>
<li>jmkuebler (1) +</li>
<li>Nikita Karetnikov (1) +</li>
<li>Lechnio (1) +</li>
<li>Nicholas McKibben (1)</li>
<li>Andrew Nelson (1)</li>
<li>o-alexandre-felipe (1) +</li>
<li>Tirth Patel (1)</li>
<li>Tyler Reddy (51)</li>
<li>Martin Reinecke (1)</li>
<li>Marie Roald (1) +</li>
<li>Pamphile Roy (2)</li>
<li>Eli Schwartz (1)</li>
<li>serge-sans-paille (1)</li>
<li>ehsan shirvanian (1) +</li>
<li>Mamoru TASAKA (1) +</li>
<li>Samuel Wallan (1)</li>
<li>Warren Weckesser (7)</li>
<li>Gavin Zhang (1) +</li>
</ul>
<p>A total of 31 people contributed to this release.
People with a &quot;+&quot; by their names contributed a patch for the first time.
This list of names is automatically generated, and may not be fully complete.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/scipy/scipy/commit/de80faf9d3480b9dbb9b888568b64499e0e70c19"><code>de80faf</code></a> REL: set 1.9.3 released [wheel build]</li>
<li><a href="https://github.com/scipy/scipy/commit/25e6b901077646cbdaf0a022ff63d55b2c40b114"><code>25e6b90</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/scipy/scipy/issues/17239">#17239</a> from tylerjereddy/treddy_backport_193</li>
<li><a href="https://github.com/scipy/scipy/commit/ba33e438f948d5e147755aff0e63f6a01f5bc676"><code>ba33e43</code></a> DOC: update 1.9.3 relnotes</li>
<li><a href="https://github.com/scipy/scipy/commit/92d892efaf689c1be970370cd9b33678482fb1fd"><code>92d892e</code></a> MAINT: Handle numpy's deprecation of accepting out-of-bound integers.</li>
<li><a href="https://github.com/scipy/scipy/commit/ba5f6daa1d855f43f9f0d19f51386285b2835ce8"><code>ba5f6da</code></a> MAINT: PR 17239 revisions</li>
<li><a href="https://github.com/scipy/scipy/commit/381089e753b42c26faf3fb689fc82f7a5c34c422"><code>381089e</code></a> DOC: update 1.9.3 relnotes</li>
<li><a href="https://github.com/scipy/scipy/commit/2db3440cfd768009847fb355f3da53fc8c562ea3"><code>2db3440</code></a> BLD: fix invalid shebang for build helper script</li>
<li><a href="https://github.com/scipy/scipy/commit/a9a6582a38e23f178ddaed874d1bc65de3313cb2"><code>a9a6582</code></a> DOC: stats.mode: add versionadded tag and correct order of keepdims descripti...</li>
<li><a href="https://github.com/scipy/scipy/commit/f4738889bd34d294cfcbd4aaed8c914fe961a0fd"><code>f473888</code></a> BLD: fix issue with incomplete threads dependency handling (<a href="https://github-redirect.dependabot.com/scipy/scipy/issues/17200">#17200</a>)</li>
<li><a href="https://github.com/scipy/scipy/commit/5370f15752eef1f62773236704d6339fa4d4e99c"><code>5370f15</code></a> MAINT: update meson.build to make it work on IBM i system (<a href="https://github-redirect.dependabot.com/scipy/scipy/issues/17193">#17193</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/scipy/scipy/compare/v1.9.2...v1.9.3">compare view</a></li>
</ul>
</details>
<br />


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

You can trigger a rebase of this PR 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` 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>

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
None yet
Projects
None yet
Development

No branches or pull requests

5 participants