Issues with packaging Node-Red project

I am having some issues using pkg on my node-red project. Here are the steps to replicate the issue:

git clone https://github.com/node-red/node-red.git

cd node-red

npm install

npm run build

After build command I added the following to my package.json file:
      "pkg": {  "assets": [    "./red/**/*"  ],  "scripts": [    "./red/**/*.js"  ] }

pkg .

After running pkg . I get the following errors:
C:\xampp\htdocs\node-red>pkg .
><EMAIL_ADDRESS>> Targets not specified. Assuming:
  node8-linux-x64, node8-macos-x64, node8-win-x64
> Warning Cannot resolve 'path.join(__dirname, '..', '..', 'package.json')'
  C:\xampp\htdocs\node-red\red\runtime\index.js
  Dynamic require may fail at run time, because the requested file
  is unknown at compilation time and not included into executable.
  Use a string literal as an argument for 'require', or leave it
  as is and specify the resolved file name in 'scripts' option.
> Warning Cannot resolve ''./' + aSettings.storageModule'
  C:\xampp\htdocs\node-red\red\runtime\storage\index.js
  Dynamic require may fail at run time, because the requested file
  is unknown at compilation time and not included into executable.
  Use a string literal as an argument for 'require', or leave it
  as is and specify the resolved file name in 'scripts' option.
> Warning Cannot resolve 'relPath'
  C:\xampp\htdocs\node-red\red\runtime\nodes\registry\loader.js
  Dynamic require may fail at run time, because the requested file
  is unknown at compilation time and not included into executable.
  Use a string literal as an argument for 'require', or leave it
  as is and specify the resolved file name in 'scripts' option.

Running the exe after the pkg command gives me this error:
Node-RED has not been built. See README.md for details
Any help would be greatly appreciated. It seems like a simple path issue but I can't seem to get it working.

try adding
"pkg": {
"assets": ["public//*", "editor//", "nodes/**/", "red/api/editor/locales"]
},
to package.json and then run pkg.


Fix: Do not add a newline before prompt when terminal opens

Fixes #977
Hi @denysdovhan, how does this look?
Let me know if this needs any changes.
Thanks

@denysdovhan I have added a reference to the issue in a comment above the code. Is it correct?
Please take a look at it and let me know if this needs any changes.
Thanks

Thanks for contributing!

@denysdovhan  this makes terminal never show newline. Option SPACESHIP_PROMPT_ADD_NEWLINE does not work. I use iTerm on macOS Big Sur. Is this expected?

@Runrioter Nope. I have the same issue.

I have reverted these changes.


[Draft] Add buildFilesAreOrderedRule

This adds the buildFilesAreOrderedRule and some simple tests to validate it.
The buildFilesAreOrderedRule verifies that the items in the PBXBuildFile and PBXFileReference sections of the project file are ordered by their identifiers. In normal use, Xcode tolerates items that are out of order, but writes them out in order. This can create churn on a large project files with several contributors. And this frequently occurs on bad merges or rebases, where the author is not careful to maintain the order when resolving conflicts.
buildFilesAreOrderedRule follows the existing pattern of being a pure function, but this ends up being a bit cumbersome. I added several utility functions to make this code easier to understand. And while these are private, it feels odd having them at the global level. I tried making them nested functions of buildFilesAreOrderedRule(), but that was even harder to read. If these methods were members of specific type, then there would be no risk of collisions with other functions elsewhere in the library. This rule also uses an NSRegularExpression to parse lines in the project file, and this also has to be a global value.
This rule does not operate on the parsed XcodeProj model, instead it operates on the raw text of the project file. Luckily, Environment maintains the URL of the xcodeproj bundle on disk, so it's easy to read this data in. But if there are other rules in the future that also need to operate on the text, then it may be wasteful to read it in multiple times.
I copied the tests in EmbeddedBuildSettingsRuleTests and updated them for this new rule, using a test project file I added. This project includes out of order entries in both the PBXBuildFile and PBXFileReference sections.
You should feel empowered to make any and all edits you deem appropriate, or even reject this PR outright. I'm excited to contribute to this project, but I acknowledge not much is setup yet and you may have a vision for where you want it to go. Thank you!

First, I absolutely love this rule! It's excellent.
I had a feeling the way I did that embeddedBuildSettingsRule was going to be confusing. I was just experimenting, since that particular thing didn't need any state at all. However! Just because XCLinter has a collection of rule-functions does not mean they all have to be that way. What do you think of this?
extension XCLinter {
    public static let defaultRules: [Rule] = [
        embeddedBuildSettingsRule,
        { MyNewRule().doStuff(with: $0) }
    ]
}

final class MyNewRule {
    // state! things! whatever!
    private var value: Int

    init() {
        self.value = 5
    }

    func doStuff(with env: XCLinter.Environment) -> [Violation] {
        return []
    }
}

I was worried that removing the text would be an issue, but I figured since the URL is available, if a Rule actually needed it, it could just grab it. Yeah, it's true this could potentially be a little wasteful. Let's burn that bridge when we come to it!
I'm also kinda surprised that the contents of the XcodeProj structure cannot be used to determine file ordering. It must be encoded in there somewhere, no? Is it that XcodeProject discards some information as part of its parsing process?

Another point you bring up is the mapping of rule identifier to actual code that puts the corresponding Rule function (or whatever) into the list of things XCLinter runs. I believe fundamentally this is always going to require some kind of giant switch statement-y thing. It's also probably possible to save typing by using some NSClassFromString stuff. But I usually find that fragile, and I don't think the typing will be too painful overall. What do you think?

I just began poking around a little, because I was curious. I'm now more confident (but not 100%) that the information you need is available via the XcodeProj structure.
Here's some relevant stuff:
		C965BD2A2AE6E5D700E5836A /* StockMacOSApp */ = {
			isa = PBXGroup;
			children = (
				C965BD2B2AE6E5D700E5836A /* StockMacOSAppApp.swift */,
				C965BD2D2AE6E5D700E5836A /* ContentView.swift */,
				C965BD2F2AE6E5D800E5836A /* Assets.xcassets */,
				C965BD342AE6E5D800E5836A /* StockMacOSApp.entitlements */,
				C965BD312AE6E5D800E5836A /* Preview Content */,
			);
			path = StockMacOSApp;
			sourceTree = "<group>";
		};

(lldb) po project.pbxproj.groups[1].children.map { $0.uuid }
▿ 5 elements
  - 0 : "C965BD2B2AE6E5D700E5836A"
  - 1 : "C965BD2D2AE6E5D700E5836A"
  - 2 : "C965BD2F2AE6E5D800E5836A"
  - 3 : "C965BD342AE6E5D800E5836A"
  - 4 : "C965BD312AE6E5D800E5836A"

(lldb) po project.pbxproj.fileReferences.first(where: { $0.uuid == "C965BD2B2AE6E5D700E5836A" })?.path
▿ Optional<String>
  - some : "StockMacOSAppApp.swift"

I think this proves that, at least in this specific case, the order and name information is available. Not in the most convenient form, mind you, but at least it looks like you may not need to mess around with the text anymore!

I just began poking around a little, because I was curious. I'm now more confident (but not 100%) that the information you need is available via the XcodeProj structure.

Oh interesting. I remember looking in the past and finding that the items were unordered. But I might be thinking of a different API.
The snippets above look like the items in a PBXGroup, which is ordered (since they are in an array). The order of items in a group is preserved by Xcode, and can be manually changed by the user. The issue I'm trying to address is the items in the PBXBuildFile and PBXFileReference sections of the main object collection. This is technically an unordered collection. The identifier is the key and the object is the value. But, Xcode writes these objects out to disk in order. So at the top of the project file There's this:
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 56;
	objects = {

/* Begin PBXBuildFile section */
		C965BD2C2AE6E5D700E5836A /* StockMacOSAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = C965BD2B2AE6E5D700E5836A /* StockMacOSAppApp.swift */; };
		C965BD2E2AE6E5D700E5836A /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C965BD2D2AE6E5D700E5836A /* ContentView.swift */; };
		C965BD332AE6E5D800E5836A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C965BD322AE6E5D800E5836A /* Preview Assets.xcassets */; };
		C965BD302AE6E5D800E5836A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C965BD2F2AE6E5D800E5836A /* Assets.xcassets */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
		C965BD282AE6E5D700E5836A /* StockMacOSApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StockMacOSApp.app; sourceTree = BUILT_PRODUCTS_DIR; };
		C965BD2B2AE6E5D700E5836A /* StockMacOSAppApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StockMacOSAppApp.swift; sourceTree = "<group>"; };
		C965BD2D2AE6E5D700E5836A /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
		C965BD322AE6E5D800E5836A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
		C965BD2F2AE6E5D800E5836A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		C965BD342AE6E5D800E5836A /* StockMacOSApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = StockMacOSApp.entitlements; sourceTree = "<group>"; };
/* End PBXFileReference section */

The goal of this rule is to avoid churn in these sections when bad merges result in items being out of order. Xcode will tolerate these items being out of order, since it's technically an unordered collection. But my enforcing that items must always be ordered, you can avoid this churn.
I'll take another look at XcodeProj to see if it does provide these object in the order they were specified in the file. If it does, then yes this would definitely be cleaner going through that API.

Ok yeah, it looks like the PBXObjects type in XcodeProj stores all the objects in unordered collections when it reads them in: https://github.com/tuist/XcodeProj/blob/main/Sources/XcodeProj/Objects/Project/PBXObjects.swift#L193
And it looks like PBXProj itself is constructed using a PropertyListDecoder, so the ordering on disk would be lost:
https://github.com/tuist/XcodeProj/blob/main/Sources/XcodeProj/Objects/Project/PBXProj.swift#L171

Another point you bring up is the mapping of rule identifier to actual code that puts the corresponding Rule function (or whatever) into the list of things XCLinter runs. I believe fundamentally this is always going to require some kind of giant switch statement-y thing. It's also probably possible to save typing by using some NSClassFromString stuff. But I usually find that fragile, and I don't think the typing will be too painful overall. What do you think?

A big ol' switch is totally fine. In my own project I started that way. I just found it convenient to have the name of the rule defined with the logic. But even in this approach I had a big array of all the rule types. So I'm not sure if there's any real "magic" approach that would be worth it. Certainly nothing using NSClassFromString, I think that only works NSObject subclasses, yeah? And not even String(describing: type(of: foo)) isn't much better. I think a big switch would be way more readable and maintainable.
But there's another point to consider in favor of defining types for rules. As rules get more complex, some of them may allow for customization. Imagine a rule that enforces items in groups being in alphabetic order. Such a rule might have a parameter to specifies how subgroups are handled. Either ordered with the files, ordered separately at the top of the group, or at the bottom. Would it be easier to customize such a rule (with data from a config file) if it had a well defined type?

Updated with a commit to construct a type to contain the logic, as you suggested. And it's pretty nice!

Ah I totally didn't understand what this rule did, but I think I do now. Sorry about the wild goose chase!

Would it be easier to customize such a rule (with data from a config file) if it had a well defined type?

I don't know! I've typically found this kind of general-purpose parameters tough to handle with Codable. But, I think it's doable. I'm absolutely not opposed to a type. I was just playing around. Either way, I think what you have here is really useful. And I also really appreciate you putting this time in. Do you think there's more you want to do? It feels pretty ready to me.

@mattmassicotte Feels ready to merge to me! Go for it!


Fix retry-after handling

This commit implements the changes suggested in issue
Azure/azure-documentdb-python#31 by @machinbenjamin
In case of an HTTP exception, the headers are
converted into a dict, and the retry-after timeout
is extracted from the RetryAfterInMilliseconds header.
In addition,

Execute now re-raises the original
error (including the original stacktrace)
The default retry-after timeout is converted to
milliseconds

Hi @xou, I'm your friendly neighborhood Azure Pull Request Bot (You can call me AZPRBOT). Thanks for your contribution!

In order for us to evaluate and accept your PR, we ask that you sign a contribution license agreement. It's all electronic and will take just minutes. I promise there's no faxing. https://cla.azure.com.

TTYL, AZPRBOT;

@xou, Thanks for signing the contribution license agreement so quickly! Actual humans will now validate the agreement and then evaluate the PR.
Thanks, AZPRBOT;

Could you please add unit tests to the test project that tests this.

Awesome, thanks!


rate_limit: Restrict tornado backend to explicitly specified domains.

This addresses the 2nd point from https://github.com/zulip/zulip/pull/14091#issuecomment-614202868
This will protect in case of some kinds of bugs that could allow making
requests such as password authentication attempts to tornado. Without
restricting the domains to which the in-memory backend can be applied,
such bugs would lead to attackers having multiple times larger rate
limits for these sensitive requests.

Looks great, merged, thanks @mateuszmandera!


Mail receiving issue : No message content and attachement download error

Hi,
I use your library for logging and I don't have any issue with mail sending, it works well (big file in attachement and HTML message). I use an Gmail account.
My issue is regarding the mail receiving by IMAP server. In all cases, I have nothing in the message content (Text or HTML) but no issue with the rest (sender email, subject... all are OK)
If there is an attachement, I can see the description of the file but as soon as I want to download it in the MicroSD card, I have the following message and the ESP32 rebooting :
**[DEBUG] - INFO: connecting to IMAP server...
[DEBUG] - imap.gmail.com
[DEBUG] - 993
[DEBUG] - INFO: starting socket
[DEBUG] - INFO: connecting to Server...
[DEBUG] - INFO: server connected
[DEBUG] - INFO: seeding the random number generator
[DEBUG] - INFO: setting up the SSL/TLS structure...
[DEBUG] - INFO: setting hostname for TLS session...
[DEBUG] - INFO: performing the SSL/TLS handshake...
[DEBUG] - INFO: verifying peer X.509 certificate...
[DEBUG] - INFO: certificate verified
[DEBUG] - INFO: server connected
[DEBUG] - INFO: send imap command LOGIN
[DEBUG] - * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- SPECIAL-USE APPENDLIMIT=35651584
[DEBUG] - INFO: send imap command EXAMINE
[DEBUG] - * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing)
[DEBUG] - INFO: fetch message
[DEBUG] - * 5 FETCH (UID 8 BODY[HEADER.FIELDS (SUBJECT FROM TO DATE Message-ID Accept-Language Content-Language)] {324}
[DEBUG] - * 5 FETCH (UID 8 BODY[1.MIME] {115}
[DEBUG] - * 5 FETCH (UID 8 BODY[1.1.MIME] {95}
[DEBUG] - * 5 FETCH (UID 8 BODY[1.2.MIME] {94}
[DEBUG] - $ NO Some messages could not be FETCHed (Failure)
[DEBUG] - * 5 FETCH (UID 8 BODY[2.MIME] {293}
[DEBUG] - $ NO Some messages could not be FETCHed (Failure)
[DEBUG] - * 5 FETCH (UID 8 BODY[1.1] {2}
[DEBUG] - * 5 FETCH (UID 8 BODY[2] {4620}
Guru Meditation Error: Core  1 panic'ed (Unhandled debug exception)
Debug exception reason: Stack canary watchpoint triggered (loopTask)
Core 1 register dump:
PC      : 0x400850dc  PS      : 0x00060036  A0      : 0x3ffb0120  A1      : 0x3ffb0060
A2      : 0x3ffb8fdc  A3      : 0x3ffda22a  A4      : 0x00000001  A5      : 0x00000001
A6      : 0x3ffda228  A7      : 0x3ffb0254  A8      : 0x00000000  A9      : 0x00000002
A10     : 0x3ffda22a  A11     : 0x3ffb96fb  A12     : 0x3ffda22c  A13     : 0x00000001
A14     : 0x00060e23  A15     : 0x00000000  SAR     : 0x00000010  EXCCAUSE: 0x00000001
EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff
Backtrace: 0x400850dc:0x3ffb0060 0x3ffb011d:0x3ffb0140 0x4012a578:0x3ffb0160 0x4012c7b9:0x3ffb01a0 0x4012d981:0x3ffb0410 0x40147871:0x3ffb0580 0x4000bcc5:0x3ffb05a0 0x4014a1bd:0x3ffb05c0 0x400e3097:0x3ffb05e0 0x400e3123:0x3ffb0610 0x4018a1be:0x3ffb0690 0x400ed731:0x3ffb06b0 0x400f0d8a:0x3ffb1020 0x400d4bb6:0x3ffb1d10 0x400e0c27:0x3ffb1f00 0x400f6999:0x3ffb1fb0 0x4008956d:0x3ffb1fd0
Rebooting...**
Can you help me to solve this issue ?

The stack is overflow.  If you're using the old version which stack size is only 4 kB in loop task , try to update your ESP32 Core SDK (esp32 board package via Board Manager)  https://github.com/espressif/arduino-esp32/releases.
Or you can search the internet for  "esp32 increase stack size"

If the download attachment option is disabled, there are no stack error and no rebooting but the message content stay empty and we can read in the debug lines :
[DEBUG] - * 5 FETCH (UID 8 BODY[1.MIME] {115}
[DEBUG] - * 5 FETCH (UID 8 BODY[1.1.MIME] {95}
[DEBUG] - * 5 FETCH (UID 8 BODY[1.2.MIME] {94}
[DEBUG] - $ NO Some messages could not be FETCHed (Failure)
[DEBUG] - * 5 FETCH (UID 8 BODY[2.MIME] {293}
[DEBUG] - $ NO Some messages could not be FETCHed (Failure)
[DEBUG] - * 5 FETCH (UID 8 BODY[1.1] {2}
[DEBUG] - * 5 FETCH (UID 8 BODY[2] {4620}
Do you think that it could be relative to the stack size too ?

Yes, the library loop to fech the message header by ID from the server until it returns error (no parts of message with that ID existed). If message contains large multi-part content, it may require more stack memory.

Thanks you, I have created a new task with 32Ko stack in order to replace the "loop()" and I can download the attachment without any rebooting.
Have you a way to save the file directly on the MicroSD and not in a folder with the UID of the corresponding mail ?
But the issue about the message content is not solved. Nothing appears both for HTML or Text message option. My message is quite short : "Test message" written in raw text.
[DEBUG] - INFO: connecting to IMAP server...
[DEBUG] - imap.gmail.com
[DEBUG] - 993
[DEBUG] - INFO: starting socket
[DEBUG] - INFO: connecting to Server...
[DEBUG] - INFO: server connected
[DEBUG] - INFO: seeding the random number generator
[DEBUG] - INFO: setting up the SSL/TLS structure...
[DEBUG] - INFO: setting hostname for TLS session...
[DEBUG] - INFO: performing the SSL/TLS handshake...
[DEBUG] - INFO: verifying peer X.509 certificate...
[DEBUG] - INFO: certificate verified
[DEBUG] - INFO: server connected
[DEBUG] - INFO: send imap command LOGIN
[DEBUG] - * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 UIDPLUS COMPRESS=DEFLATE ENABLE MOVE CONDSTORE ESEARCH UTF8=ACCEPT LIST-EXTENDED LIST-STATUS LITERAL- SPECIAL-USE APPENDLIMIT=35651584
[DEBUG] - INFO: send imap command LIST
[DEBUG] - * LIST (\HasNoChildren) "/" "INBOX"
[DEBUG] - INFO: send imap command EXAMINE
[DEBUG] - * FLAGS (\Answered \Flagged \Draft \Deleted \Seen $NotPhishing $Phishing)
[DEBUG] - INFO: search message
[DEBUG] -
[DEBUG] - INFO: fetch message
[DEBUG] - * 2 FETCH (UID 10 BODY[HEADER.FIELDS (SUBJECT FROM TO DATE Message-ID Accept-Language Content-Language)] {324}
[DEBUG] - INFO: send imap command LOGOUT
[DEBUG] - * BYE LOGOUT Requested
Messsage Number: 11
Messsage UID: 10
Messsage ID<EMAIL_ADDRESS>Accept Language: fr-FR, en-US
Content Language: fr-FR
From: central watts<EMAIL_ADDRESS>From Charset:
To<EMAIL_ADDRESS><EMAIL_ADDRESS>To Charset:
CC:
CC Charset:
Date: Mon, 16 Mar 2020 09:03:50 +0000
Subject: UPDATE
Subject Charset:
=================
Messsage Number: 10
Messsage UID:
Messsage ID<EMAIL_ADDRESS>Accept Language: fr-FR, en-US
Content Language: fr-FR
From: central watts<EMAIL_ADDRESS>From Charset:
To<EMAIL_ADDRESS><EMAIL_ADDRESS>To Charset:
CC:
CC Charset:
Date: Mon, 16 Mar 2020 09:03:50 +0000
Subject: UPDATE
Subject Charset:
Text Message:
Text Message Charset: iso-8859-1
HTML Message:
HTML Message Charset:

Attachment: 1 file(s)
File Index: 1
Filename: update.bin
Name: update.bin
Size: 0
Type: application/octet-stream
Creation Date: Mon, 16 Mar 2020 08:55:37 GMT

Have you a way to save the file directly on the MicroSD and not in a folder with the UID of the corresponding mail ?

No such an option allows you need to check the message and attached files yourself. You can move, rename, delete upon your needs.
This library is not intend to work as in automated system as notification and messaging. Email reading and checking consumed more memory and not suitable in an embedded device.

But the issue about the message content is not solved. Nothing appears both for HTML or Text message option. My message is quite short : "Test message" written in raw text.

Please try the examples first, read the doc for the options and how to use it.

If you get the sending and receiving attachment error or even save the message header and message body to SD error. The most possible cause is your SD adapter module or wrong wiring, not initialize or locked in write access.
For SD the wiring and initialization, see https://github.com/mobizt/ESP32-Mail-Client/issues/23


create example code snippets for various API Documentation entries

Actions:

[x] environment setup:

[x] atmosphere (only exponential, exponential_predefined, wind, etc...)
[x] aerodynamic_coefficients (only custom, tabulated, tabulated_force_only, scaled)
[x] ephemeris
[x] gravity field
[x] radiation pressure
[x] rotation model
[x] shape

[ ] propagation setup:

[ ] acceleration (only thrust_and_isp_from_custom_function missing)
[ ] dependent variables
[ ] integrator
[ ] propagator (only propagator creation - translational, rotational, etc...)
[x] torque
[ ] thrust

@jo11he @gaffarelj for the environment part, most modules are done, but I think for some examples it would be better to provide actual values of input arguments rather than showing, e.g., initial_state = .... Better to put an array with random number rather than only dots. This way, the user realizes how it can be done. For some other, instead, leaving something like  initial_state = ... is okay, I think it is a case-by-case choice

I finished adding code snippets (and making other improvements) to all of the environment_setup modules for the API documentation.
While at it, I also added the AerodynamicCoefficientsIndependentVariables class to the environment API documentation.

Very good! Is there any roadblock or point of discussion here, or are you good to go for the next parts? Nice to see this being extended :)

I do not expect any struggle to add code snippets to the propagation and propagation_setup modules :)
I am however first working on exposing the time conversions, for which I only need to finish the documentation (the exposing is now done, though not pushed).

Added links to propagaor setup in this commit:
https://github.com/tudat-team/tudat-multidoc/commits/feature/consistent_propagation_settings


Simplify logic to always test for the presence of item

time_variance/processor.py should test for the presence of item. Currently, all checks do this test. However, there is no known case where it would make sense for a check to not check for the presence of item.

Actually - the SQL query prevents item from ever being missing, so this test never needs to be performed


pb of fence while disabling imu calib in emulation

cyril wanted to write some scripts to start the drone and run a small experiment several times to get statistics.
We found that we had to disable the imu start calibration,
https://github.com/lis-epfl/MAVRIC_Library/blob/master/sensing/imu.cpp#L68
But then the drone was getting into critical each time we were arming it.
I figured out that it was coming from the set_fence flag.
by commenting out that line, we can operate normally
I guess it is due to some problem between the timing where the origin is initialized

@mdouglas90 Could you have a look please ?

There are 6 methods that can cause the drone to enter critical state:

The battery is low
The connection with the ground control station is lost
The drone leaves fence 1
The drone leaves fence 2
The position estimation is unhealthy. Which means that either the barometers has not been initialized, the gps has not been initialized, or the gps is unhealthy.
The connection has been lost with the remote

The issue appears to be related to the position estimation for the z direction. Without calibrating the imu, my z position estimation tended to increase by 300-400 m about ground (which surpasses the 75 m fence_1_z and the 100 m fence_2_z).
I don't know why the imu startup calibration would affect that as I don't believe that the simulated gyroscope uses any of the calibration values.

is the imu healthy ?

I can only find the function Imu::is_ready() which returns if the calibration is ongoing at the moment, not if the imu had a healthy read.
The issue is related to the barometer calibration which occurs during the first barometer read here. For some reason that I don't know why, when I run it, the drone believes that it has an altitude of ~35 m belows the ground (so at 365 m above sea level). This function calls this to set the altitude_bias_gf_.
During the barometer update function, this variable is then subtracted from the measured value (altitude_filtered) in the barometer_sim::update() function.
When not calibrating the imu on startup, the first cycle of altitude filter is 0, so the bias is set to an addition 365 m off, which gives an altitude much higher than correct. After a cycle or so, the altitude filter would be correctly at 400 m. If the barometer were calibrated then, it would give a better altitude_bias_gf_.
I assume that the issue does not appear when calibrating the IMU because the barometer already had several cycles to update its altitude_filter before we calibrate the barometer in position estimation. Position estimation will not call its position_correction function (which is where we first calibrate the barometer) until all calibrations are done. See here.
I suppose a possible solution to this would be to ensure that the barometer has had at least one altitude_filtered before allowing calibration.


Int64 encoded as string

I can see the #16 was closed like this:
@MangelMaxime wrote:

I don't see any problem with using string to represent int64 in JSON.

Our data provider requires us to send:
{
    "command": "getTickPrices",
    "arguments": {
        "timestamp":<PHONE_NUMBER>796
    }
}

1637589093796 is out of range for int, so how am I to create a valid JSON request? They won't accept "1637589093796". This default behavior is a trouble, how to work it around?

I was hoping for float to the rescue, but well:
> let x =<PHONE_NUMBER>796.;;
val x : float = 1.637589094e+12
> Encode.float x |> Encode.toString 0;;
val it : string = "1637589093796.0"

The data provider is not happy with this .0 as well. It must be an integer, not a string or decimal or float.

Thanks, this is better than what I've came up with:
Encode.object [  "timestamp", JsonValue.FromObject (ts - 10_000L) ]

Would the JsonValue.FromObject work in Thoth.Net too?
For Auto API, one should introduce some tag like type MyInt64 of int64 and decode it instead.
The only thing missing right now is to mention it in docs, so there are no surprises.

Would the JsonValue.FromObject work in Thoth.Net too?

Are you speaking about Thoth.Json or Thoth.Json.Net here?
For Thoth.Json, you will probably be able to just do box value as it is done for int
Just make sure to test the maximal and minimal values to be sure that it works for all of them as expected.

I think it might be better to actually name things, so I would rather introduce some auxiliary type like TimestampMillis and make encoder for that very type.

You can add them by yourself, Thoth.Json is extensible for this reason. Or create a package which extends Thoth.Json if you need to have them in several of your project.
I don't want to saturate the core library with them right now. Perhaps, I will revisit my position in the future but for me right now Thoth.Json works as expected. I can't add all the types that everyone need because it will increase the bundle size and the maintenace cost of the library.
I already regret having said yes to some of the features added to Thoth.Json so I am really careful now :)

Sure, but the docs should mention the issue and describe solution. I can prepare something, maybe together with https://github.com/thoth-org/Thoth.Json/issues/124 to make this great lib a better experience for newcomers.

The documentation has been completely rewritten and now explain how the numbers are represented and why.
https://thoth-org.github.io/Thoth.Json/documentation/manual/json-representation.html#numbers

For Auto API, one should introduce some tag like type MyInt64 of int64 and decode it instead.

This is not true, you can override the default for primitives to in the auto API.
https://thoth-org.github.io/Thoth.Json/documentation/auto/json-representation.html#primitives
I am closing this issue because for me this is normal and there are work around if needed.


[Base] - everything upgraded for 0.26

That we know of :)
tested with Android and iOS
@ryanlntn  - please review and merge.

aha!   I forgot template
fixing now.

I love our CI, it's saved me from making this mistake countless times.   Yes I know I should run firedrill everytime.

😄 Yeah! Love the CI. Keeping us all on our best behavior.


mcon-1624

Contacts API: adding notes for "Create a Custom Field [POST]"

Description of the change:
Reason for the change:
Link to original source:

Closes #
@ksigler7

 Thank you for your submission, we really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.Ashwath Singh seems not to be a GitHub user. You need a GitHub account to be able to sign the CLA. If you have already a GitHub account, please add the email address used for this commit to your account.You have signed the CLA already but the status is still pending? Let us recheck it.

hi @giba457! thanks for this update! are you a Gridder? If so, shoot me a hipchat, otherwise, please go ahead and sign the CLA!

Hello @giba457,Thanks again for the PR! We want to show our appreciation by sending                                              you some swag. Could you please fill out                                              this form so we can send it to you? Thanks!                                             Team SendGrid DX


turn the list into a google form

Where is the link to the form?

https://docs.google.com/forms/d/1z6DXAc1aH5L1hIkRlEJF8qJZRGNhFmYZBgqPvwc0dQ0/edit


Protocol and storage format under active development

While still under active development, we may make changes that break the protocol and storage format at any time. It's strongly recommended that if you're experimenting with TigerBeetle you:

Use a freshly formatted data file for the commit you've built or installed.
Only run replicas of the same version in a cluster.
Use the identical matching client version.

We have storage stability and upgrade story implemented.


Remove double negation in BoundConditionalGotoStatement usage

Ok, this is a suggestion, but BoundConditionalGotoStatement uses a double negation to convey its meaning, which I find unnatural when reading such code:

This replaces JumpIfFalse with JumpIfTrue which removes the double negation.
NB: I targeted this PR to your episode branch, since it's not merged yet.

Totally agree. Thanks!


Remove stale docs content from Github wiki

What would you like to be removed:
Back in May we  officially moved the falco docs to falco.org/docs. As part of this we put notices on the existing GH wiki docs that the wiki was deprecated and replaced with the docs site. We also linked each wiki page to the new corresponding docs site page.
It's time to remove all the content from the wiki, leaving only links to the docs site and the new page for the respective topic.
Why is this needed:
Google still indexes these pages, and currently the top 3 results for a search of falco install sends users to the wiki. Removing the content should hopefully reduce the page rank for the wiki docs, get our current documentation ranking higher, and eventually we can delete the wiki.
I prefer the slow approach rather than "just delete the wiki now", as we don't know where on the internet people are linking to the wiki.

Content has been removed, with redirect notices. When the stale bot tries to close this again, we should check page rank of the wiki docs and then disable the wiki. Hopefully the falco.org/docs will be ranked higher over the next 30 days.

We can close this

30 days have passed, remove the wiki pages definitely
/assign @kris-nova


Add new fuzzing test for Tarantool

PR with added test - https://github.com/tarantool/tarantool/pull/7708

We should wait for tarantool/tarantool#8473 in order to build new fuzz targets with UBSAN.


added images for Mike to test for edex skin

@MichaelConnell
Added some images for you to play around with. Most importantly added the ETOD logo and the Marker backdrop that we use on the current ETOD site. Added instructor images and some OOP images that maybe can be added when we figure out how to customize the edex page.

Sorry graphic designer attempting git hub.


Sourcecode?

Are there any plans to provide the Pivot sourcecode on GitHub?

Hi, there are no plans to provide the Pivot source code on GitHub.
Pivot is available as a proprietary package as part of the Imply distribution.


Add pipeline for pre-release testing of projects

Scenario: Someone has merged a new feature into rules_foo and thus wants to a) cut a new release and b) add it to the federation. Currently the process looks like this:

Bump rules_foo version number
Build rules_foo release artifacts
Create a new rules_foo release on GitHub
Sent a PR to the federation repo to update repositories.bzl with the new version

Unfortunately we had several cases where the release distribution was buggy (e.g. missing files), which was only discovered in step 3 when the federation presubmit pipeline failed. As a result, the created and published rules_foo release was basically worthless since a patch release had to be cut.
Ideally we'd have an additional presubmit pipeline that could vet potential rule releases before they're actually being cut.

Note: Ideally we'd later have another presubmit pipeline that offers a similar service independent of the federation.

https://buildkite.com/bazel/bazel-federation-distro-pre-release-testing/builds/29
-> It found a bug in the rules_cc distro


Handle null body on 204 no content response

Based on
https://github.com/square/retrofit/blob/eb441ed140a124a9f152f82ad05993d502848d9a/retrofit/src/main/java/retrofit2/OkHttpCall.java#L218
this will fail with a NPE:
https://github.com/JakeWharton/retrofit2-kotlin-coroutines-adapter/blob/5c51f4b1021906c108c7a13099d13203be2bd6f6/src/main/java/com/jakewharton/retrofit2/adapter/kotlin/coroutines/CoroutineCallAdapterFactory.kt#L102
@JakeWharton

Dupe of #5. This case isn't supported yet.


bug: The input method cursor position is not updated.

Did you check docs and existing issues?

[X] I have read all the noice.nvim docs
[X] I have searched the existing issues of noice.nvim
[X] I have searched the existing issues of plugins related to this issue

Neovim version (nvim -v)
0.9.0
Operating system/version
win10
Describe the bug
When entering Chinese in the search input box, the input method does not follow the input box position.

Steps To Reproduce

type / to search
change to chinese input method
input worlds

Expected Behavior
The cursor should be at the input box position.
Repro
-- DO NOT change the paths and don't remove the colorscheme
local root = vim.fn.fnamemodify("./.repro", ":p")

-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "cache" }) do
  vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
  vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath, })
end
vim.opt.runtimepath:prepend(lazypath)

-- install plugins
local plugins = {
  "folke/tokyonight.nvim",
  {
          "folke/noice.nvim",
          event = "VeryLazy",
          opts = {
                  -- add any options here
          },
          dependencies = {
                  -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries
                  "MunifTanjim/nui.nvim",
                  -- OPTIONAL:
                  -- `nvim-notify` is only needed, if you want to use the notification view.
                  -- If not available, we use `mini` as the fallback
                  "rcarriga/nvim-notify",
          }
  }

  -- add any other plugins here
}
require("lazy").setup(plugins, {
  root = root .. "/plugins",
})

vim.cmd.colorscheme("tokyonight")
-- add anything else here

Can you clarify what is wrong here? Does it have to do with LTR? Can you show me what is wrong and what it should look like?

Like telescope, input method candidate box is below the input box.

I try nui input, it's run ok.
https://github.com/MunifTanjim/nui.nvim/blob/main/lua/nui/input

ok, I understand now. That;s not something I can fix, since the noice cmdline that you see is just a representation.
That's not the actual input field.
As far as noice is concerned, there is no input field.
Neovim simply tells noice, to render the cmdline with a certain input string.
Noice doesn't handle the input.
Closing as can't fix.


[backport] Use CUDA_VISIBLE_DEVICES in ChainerX tests

Backport of #7290

[automatic post] Jenkins, test this please.

Jenkins CI test (for commit 1b6d660a6ec5702f220e6d4ba374496ebc684e76, target branch v6) failed with status FAILURE.

LGTM! Test failures are not related to this PR.


Listening for messages

How can I listen to incoming messages? The listener property on consumer doesn't seem to do anything.

@mhaagens In order to receive messages, you will want to use the subscribe method as shown in the following example:  https://github.com/apache/pulsar-client-node/blob/master/examples/consumer.js

Thanks for the quick reply! I am using subscribe, but as far I can see from the example you have to manually call receive on the subscriber in a loop to get messages?

@mhaagens You are correct. The subscribe command is used to register your consumer on the Pulsar broker, so it will know that you want to receive the messages. After you had subscribed, you have to make a call as shown on line 39 of the example code; const msg = await consumer.receive(); to get the message.  It is a blocking call that will deliver one message (if and when it is available).
HTH

Okay, so am I understanding it correctly that there’s no way to set up a listener that processes messages as they come in? Similar to this in kafka-Node;
consumer.on('message', function (message) {     console.log(message); });

@mhaagens  Not yet, but there appears to be a PR in process now to add this capability.  https://github.com/apache/pulsar-client-node/pull/56

Awesome, thanks!

Would this be a solution in the meantime?
while (true) {
   const msg = await consumer.receive();
   console.log(msg.getData().toString());
   consumer.acknowledge(msg);
}

@mhaagens Yes.

Hi!
I tried the listener implementation with the following code, that listens forever to messages and once any key received we close the consumer and client (in real-life: instead of listening to any key, we will listen to shutdown signals) -
const Pulsar = require('pulsar-client');

const readline = require('readline');

const rl = new readline.createInterface({
  input: process.stdin,
  output: process.stdout
})

function prompt() {
  return new Promise((resolve) => {
    rl.question(`press any key to stop consuming`, () => resolve());
  })
}

(async () => {
  // Create a client
  const client = new Pulsar.Client({
    serviceUrl: 'pulsar://localhost:6650'
    //operationTimeoutSeconds: 30,
  });

  // Create a consumer
  const consumer = await client.subscribe({
    topic: 'persistent://public/default/my-topic',
    subscription: 'sub1',
    subscriptionType: 'Shared',
    ackTimeoutMs: 10000,
    listener: function(msg, consumer) {
      console.log(msg.getData().toString());
      consumer.acknowledge(msg);
    }
  });

  await prompt();
  await consumer.close();
  await client.close();

})();

I have producer which emits at regular intervals (after some time, fails on this - https://github.com/apache/pulsar-client-node/issues/78 and I restart it).
The consumer after some random time, just closes the connection. I added std::cout to the code and I see Consumer deconstructor is called for every message (which makes sense, since we create for every message a consumer) and the Client deconstructor is called after a while.
I did some changes in order to solve this and it works now, except the listener don't get the consumer instance.
Changes are here - https://github.com/apache/pulsar-client-node/compare/master...yosiat:consumer-listener-bug

@yosiat yes. this approach looks good to me. Can you create a pull request for your proposed change?

@sijie created a PR, here: https://github.com/apache/pulsar-client-node/pull/83

@yosiat I'm seeing a crash if a client with listener is closed twice after your pull request:
const Pulsar = require('./index.js');

const delay = (time) => new Promise(resolve => setTimeout(resolve, time));

(async () => {
  // Create a client
  const client = new Pulsar.Client({
    serviceUrl: 'pulsar://localhost:6650'
  });

  let count = 0;

  // Create a consumer
  const consumer = await client.subscribe({
    topic: 'persistent://public/default/my-topic',
    subscription: 'sub1',
    subscriptionType: 'Shared',
    ackTimeoutMs: 10000,
    listener: function(msg, consumerArg) {
      console.log(new Date().toLocaleString(), msg.getData().toString());
      delay(1000).then(() => {
        consumerArg.acknowledge(msg);
        consumerArg.close();
      })
    }
  });
})();

Crashes with the following output:
FATAL ERROR: Error::New napi_get_last_error_info
 1: 0x555d20446711 node::Abort() [node]
2020-04-13 13:04:10.834 INFO  ConsumerImpl:894 | [persistent://public/default/my-topic, sub1, 0] Closed consumer 0
 2: 0x555d20386273 node::FatalError(char const*, char const*) [node]
 3: 0x555d2038627c  [node]
 4: 0x555d20416d11 napi_fatal_error [node]
 5: 0x7f7ab97e6f1a  [/home/guilherme/Projects/pulsar-client-node/build/Release/Pulsar.node]
 6: 0x7f7ab982af2a Consumer::Close(Napi::CallbackInfo const&) [/home/guilherme/Projects/pulsar-client-node/build/Release/Pulsar.node]
 7: 0x7f7ab98313c6 Napi::ObjectWrap<Consumer>::InstanceMethodCallbackWrapper(napi_env__*, napi_callback_info__*) [/home/guilherme/Projects/pulsar-client-node/build/Release/Pulsar.node]
 8: 0x555d203fbf05  [node]
 9: 0x555d2062b657 v8::internal::FunctionCallbackArguments::Call(v8::internal::CallHandlerInfo) [node]
10: 0x555d2062ba21  [node]
11: 0x555d2062c2da  [node]
12: 0x555d2062cbf6 v8::internal::Builtin_HandleApiCall(int, unsigned long*, v8::internal::Isolate*) [node]
13: 0x555d20db6e99  [node]
Aborted (core dumped)

Before the PR, the second call to Close would fail with an Already Closed error, but without crashing Node.
I wrote the original listener implementation, thanks for cleaning it up! Most of the reason it was messy was that I couldn't find a better way to not crash and not leak any memory. It's really annoying due to how the pulsar C interface was made.
The problem is that the C interface creates a pulsar_consumer_t on the stack and passes it to the message listener (here). The consumer it receives is a shared pointer, but the one that is passed to the message listener can't be used after the original message listener function has returned due to this. I think the golang client wrapper workaround for this leaks memory, but I'm not sure. It saves a pointer to the consumer and channel to be used by the listener but I can't find where it deletes the pointer.
Maybe we could add a function to the C interface that clones a pulsar_consumer_t, creating a new shared pointer to the same C++ consumer, and that has to be freed manually? This would allow libraries like this to clone the consumer received by the message listener callback to use it later to ack the message. That would simplify wrapper libraries a lot.

The listener works for consumer. But it does not work for reader:
const reader = await client.createReader({
    topic: 'persistent://public/default/my-topic',
    startMessageId: Pulsar.MessageId.earliest(),
    listener: function (msg, consumer) {
      console.log(msg.getData().toString());
    }
  });

Do you want to implement it?

@alphara looks like the c/c++ which we rely upon don't support listener for reader interface.

I think it is supported on version 2.4.0. Here's the relevant function.

listener has already been supported, so I closed this issue.


Launch Buttons

The launch buttons are disabled in this Cookbook but there is a bug in Jupyter Book that shows an empty launch icon on Jupyter Notebook pages. This may get fixed in the future, see here: https://github.com/executablebooks/jupyter-book/issues/1756

This appears to have been fixed by PR #4.


Data library page migration

Migration of data library page.
To be able to see this page, change data_library:username entry in configuration to reflect your username.
URL: http://ivan.localhost.lan:3000/data-library
Entry point: data_library/entry.js

Blocked until we merge the auth api UI


Fix bug in user authentication season

Duck season

231 tests were run on 4a22cb54. ⚠ 3 Flaked. View Full Report ↗

⚠ 3 Flakes

Test Name
Failure Summary
Logs

[chromium] should return list of users correctly.

Logs ↗

[chromium] should display error message for invalid login correctly.
The expected status code 401 was not received, instead a function was returned.
Logs ↗

[chromium] should login with credentials correctly correctly.

Logs ↗

settings

231 tests were run on 4a22cb54. ⚠ 3 Flaked. View Full Report ↗

⚠ 3 Flakes

Test Name
Failure Summary
Logs

[chromium] should return list of users correctly.

Logs ↗

[chromium] should display error message for invalid login correctly.
The expected status code 401 was not received, instead a function was returned.
Logs ↗

[chromium] should login with credentials correctly correctly.

Logs ↗

settings


Various grammar corrections.

Before submitting a pull request make sure you have:

[x] At least skimmed through adding new extractor tutorial and youtube-dl coding conventions sections
[x] Searched the bugtracker for similar pull requests

In order to be accepted and merged into youtube-dl each piece of code must be in public domain or released under Unlicense. Check one of the following options:

[x] I am the original author of this code and I am willing to release it under Unlicense
[ ] I am not the original author of this code but it is in public domain or released under Unlicense (provide reliable evidence)

What is the purpose of your pull request?

[ ] Bug fix
[x] Improvement
[ ] New extractor
[ ] New feature

This should hopefully aid readability a little bit.

LGTM..
Fun fact: You can infer the native language of the author(s) by the omission of articles 😉


bug: some icons are displayed despite opts.icons.rules = false

Did you check docs and existing issues?

[X] I have read all the which-key.nvim docs
[X] I have updated the plugin to the latest version before submitting this issue
[X] I have searched the existing issues of which-key.nvim
[X] I have searched the existing issues of plugins related to this issue

Neovim version (nvim -v)
NVIM v0.10.0
Operating system/version
Windows 11 Pro N Build 22631
Describe the bug
ui & diagnostics groups with children are rendered with icons

Steps To Reproduce

Add whickey specs where icons are disabled. My config is the following:

return {
  "folke/which-key.nvim",
  opts = {
    preset = "helix",
    delay = 20,
    win = {
      width = { min = 45 },
      height = { max = 0.99 },
      border = "single",
      padding = { 0, 1 },
    },
    layout = {
      width = { min = 45 },
    },
    icons = {
      rules = false,
    },
    spec = {
      {
        { "<leader>d", group = "+directory" },
        { "<leader>h", name = "+hunks" },
        { "<leader>j", name = "+jobs" },
        { "<leader>l", name = "+lazy" },
        { "<leader>r", name = "+replace/refactor" },
        { "<leader>gd", name = "+diff" },
        { "<leader>L", hidden = true },
      },
    },
  },
}

Ensure that it's the latest version of the plugin: 21f3465
Press leader in normal mode

Expected Behavior
Icons aren't displayed in which-key
Health
==============================================================================
which-key: require("which-key.health").check()

- OK Most of these checks are for informational purposes only.
  WARNINGS should be treated as a warning, and don't necessarily indicate a problem with your config.
  Please |DON't| report these warnings as an issue.

Checking your config ~
- WARNING |mini.icons| is not installed
- OK |nvim-web-devicons| is installed

Checking for issues with your mappings ~
- OK No issues reported

checking for overlapping keymaps ~
- WARNING In mode `n`, <gc> overlaps with <gco>, <gcc>, <gcO>, <gcA>:
  - <gc>: Comment toggle linewise
  - <gco>: Comment insert below
  - <gcc>: Comment toggle current line
  - <gcO>: Comment insert above
  - <gcA>: Comment insert end of line
- WARNING In mode `n`, <gb> overlaps with <gbc>:
  - <gb>: Comment toggle blockwise
  - <gbc>: Comment toggle current block
- WARNING In mode `x`, <i> overlaps with <iS>, <ii>, <in>, <il>:
  - <i>: inside
  - <iS>: Inner subword
  - <ii>: indent
  - <in>: next
  - <il>: last
- WARNING In mode `x`, <a> overlaps with <an>, <aS>, <ai>, <al>, <a%>:
  - <a>: around
  - <an>: next
  - <aS>: Outer subword
  - <ai>: indent
  - <al>: last
- WARNING In mode `o`, <i> overlaps with <iS>, <ii>, <in>, <il>:
  - <i>: inside
  - <iS>: Inner subword
  - <ii>: indent
  - <in>: next
  - <il>: last
- WARNING In mode `o`, <a> overlaps with <aS>, <ai>, <an>, <al>:
  - <a>: around
  - <aS>: Outer subword
  - <ai>: indent
  - <an>: next
  - <al>: last
- OK Overlapping keymaps are only reported for informational purposes.
  This doesn't necessarily mean there is a problem with your config.

Checking for duplicate mappings ~
- WARNING Duplicates for < l> in mode `n`:
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * lazy: `{ group = true }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " l", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
- WARNING Duplicates for < L> in mode `n`:
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ hidden = true }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
  * `{ abbr = 0, buffer = 0, expr = 0, lhsraw = " L", lnum = 0, mode_bits = 1, noremap = 1, nowait = 0, rhs = "", script = 0, scriptversion = 1, sid = -8, silent = 0 }`
- OK Duplicate mappings are only reported for informational purposes.
  This doesn't necessarily mean there is a problem with your config.

Log
Debug Started for v3.5.0
on_key: s
BufNew
BufReadPost
BufEnter
BufNew
on_key: j
on_key: j
on_key: k
on_key: k
on_key: <Space>
State(start): { "Mode(n)", "Node(<Space>)", { keys = "<Space>", update = true, waited = 0 } }
  continue: { "<Space>", "Mode(n)" }
  loop
  getchar
  on_key: <Esc>
  got: <Esc>
on_key: <Space>
State(start): { "Mode(n)", "Node(<Space>)", { keys = "<Space>", update = true, waited = 0 } }
  continue: { "<Space>", "Mode(n)" }
  loop
  getchar
  on_key: g
  got: g
  continue: { "<Space>g", "Mode(n)" }
  loop
  getchar
  on_key: g
  got: g
  reattach: { "<Space>gg", "n" }
  detach: <Space>
  plugin: { [2] = "g" }
  feedkeys: { "Mode(n)", "<Space>gg" }
on_key: <Space>gg
BufNew
BufNew
BufEnter
ModeChanged(n:nt)
Safe(true)
ModeChanged(nt:t)
Safe(true)
attach: { "<Space>", "n" }
on_key: j
on_key: j
on_key: j
on_key: j
on_key: j
on_key: q
BufEnter
ModeChanged(t:n)
Safe(true)
on_key: <Space>
State(start): { "Mode(n)", "Node(<Space>)", { keys = "<Space>", update = true, waited = 0 } }
  continue: { "<Space>", "Mode(n)" }
  loop
  getchar
  on_key: <Space>
  got: <Space>
  reattach: { "<Space><Space>", "n" }
  detach: <Space>
  plugin: { [2] = "<Space>" }
  feedkeys: { "Mode(n)", "<Space><Space>" }
on_key: <Space><Space>
BufNew
BufNew
BufNew
BufNew
BufNew
BufNew
BufEnter
ModeChanged(n:i)
Safe(false):pending "<80>"
attach: { "<Space>", "n" }
on_key: w
BufNew
BufEnter
on_key: k
BufNew
on_key: .
on_key: l
on_key: <CR>
BufEnter
BufNew

Repro
vim.env.LAZY_STDPATH = ".repro"
load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()

require("lazy.minit").repro({
  spec = {
    {
      "folke/which-key.nvim", opts = {
    preset = "helix",
    delay = 20,
    win = {
      width = { min = 45 },
      height = { max = 0.99 },
      border = "single",
      padding = { 0, 1 },
    },
    layout = {
      width = { min = 45 },
    },
    icons = {
      rules = false,
    },
    spec = {
      {
        { "<leader>d", group = "+directory" },
        { "<leader>h", name = "+hunks" },
        { "<leader>j", name = "+jobs" },
        { "<leader>l", name = "+lazy" },
        { "<leader>r", name = "+replace/refactor" },
        { "<leader>gd", name = "+diff" },
        { "<leader>L", hidden = true },
      },
    },
       }
    },
    -- add any other plugins here
  },
})

Those icons are not coming from icon rules. They were added explicitely in LAzyVim for certain mappings.
However, I'll add an option to disable icons...


Scheduling fails jupyter running on container if a container restart

I saw scheduling failed when container restarts by any reasons.
I think many companies  are running jupyter on container system(Kubernetes, AWS ECS and etc), in this system, we already know application restarts anytime. If application is restarting, changing runtime environment like environment variable and IPs .
In 0.1.5, that situations not covers. Because adds environment variables when add job, jupyter is restarted, container environment changed, so saved environments variable is invalid. This make trouble on some container system like AWS ECS.
I suggest the flag to choose save environment variable to cron config or not.  The flag is environment variable like JUPYTER_LAB_SCHEDULER_SAVE_SYSTEM_ENV_VARS.
Or needs sync environment variables when jupyter starts up.

Hi @loustler , i am also running jupyterhub on EKS cluster. Using same scipy docker file as mentioned in readme. However, getting error" There was an error submitting job".

I have also tried 2 solutions mentioned for this error, but it's working.
Please help!

@shubhamkanwal
I just migrated to EKS from ECS.
I'm found same problem with you.
I just solved this problem.
I'm set securityContext property into pod spec.
spec:
  securityContext:
    fsGroup: 100 # this is group id in jupyter official docker. Check your GID
  containers:
  - securityContext:
      allowPrivilegeEscalation: false
      runAsUser: 0

The jupyter pod log said like permission denied: /var/spool/cron/crontabs, i guess.
so I was find out file permission, and change pod configuration, fixed it.
For further information, see k8s docs
Hope this helps!

@loustler thanks for sharing your fix, I'll get it added to the docs


Fix return bug in EiffelCorp gui

Try to return a car after rent.. it's doesn't work! the car is still "NOT AVALAIBLE" in the rent combobox

Solved this bug


refactor: system tests should use await

fixes https://github.com/googleapis/nodejs-storage/issues/2019

Thanks for taking this on. Looks much cleaner now!


ZWATCH.VIDEOS Oviya Leaked Video On Social Media X Twitter[HUJ20K]

ZWATCH.VIDEOS Oviya Leaked Video On Social Media X Twitter[HUJ20K]

Oviya's latest video has taken social media by storm, captivating viewers and sparking widespread discussions. This young digital creator has garnered significant attention for her engaging content, particularly with her recent Spiderman-themed video that has gone viral. Fans are eagerly searching for where to watch the full video, turning to platforms like Instagram, X (formerly Twitter), and Discord for access.
As the buzz around Oviya grows, fans are actively sharing their reactions online. The viral success of her video highlights the powerful role of social media in propelling creators into the spotlight.
Thank You

fff

FG

vf

FG

vf

gfdgfd


Can I use milliseconds as dates instead of years/months?

Hello,
I want to build a profiler for my app - can I use this library will milliseconds instead of years/months?
Thanks

I thought about milliseconds and profiler application right away as well. :)
By "add it" do you mean that it is customization possible on top of your code or it would have to be forked for that?


Add "repo" install_method.

Allows grafana to be installed out of the repos configured on your OS.

+1
I can't use this module at the moment because the RPM in our internal repo won't be used.

Are there any plans to merge this? Grafana has repos for both .deb and .rpm based systems, so its a bit non-standard to fetch it and install it manually...

Improved repo enhancement as a pull request here: https://github.com/bfraser/puppet-grafana/pull/34

Closing as this functionality was implemented in #34


JSDoc type annotation fixes

@addyosmani @skarEE
Fixes a variety of type annotation problems with MDL - removes bad ! on !string (redundant), for example.
Additionally, adds Component and ComponentConfig, so that the registered (classes?) and created components (instances?) are more type-safe, rather than just all being Object.
(One unsolved problem is that the "minified" version generated inside dist/ now exports these vars, which may or may not be an issue).

(One unsolved problem is that the "minified" version generated inside dist/ now exports these vars, which may or may not be an issue).

I'll investigate the impact this has (if any) on the built version of the library.

@addyosmani I've hidden the types under componentHandler. PTAL

Changes LGTM to land. Thanks @samthor.
@surma @sgomes This is a set of changes that help us work more cleanly with JSDoc, Closure and the on-going work to make MDL more friendly with Google's internal code infrastructure (so that those teams can use MDL). Sam has graciously offered to help us in the interim to improve this now that it's landed there.
So that you're familiar with these changes, can you also take a look? Where modifications to our upstream source are minimal and don't vastly affect maintainability or the end-build files, I'm happy for us to work with Sam and others to make this less painful.

Whoop, go @samthor! I have actually never heard of JSDoc. I’ll be ashamed of myself and catch up on that.

LGTM, thanks @samthor!

@surma @sgomes I think one of you needs to merge this: I'm not implicitly an owner. Thanks!

LGTM to merge. Doing that now :) Thanks!

@samthor at the point when I was going to merge this in, I noticed we had some merge conflicts (see below for fixed up version) so went in to address them. This is when I noticed that there are comments in this patch that fail our JSCS validation. I've dropped the output from JSCS lower down. @sgomes could you look at the changes we would need to make to our .jscsrc file today in order to get this passing?
/**
 * @license
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * A component handler interface using the revealing module design pattern.
 * More details on this design pattern here:
 * https://github.com/jasonmayes/mdl-component-design-pattern
 * @author Jason Mayes.
 */
/* exported componentHandler */
var componentHandler = (function() {
  'use strict';

  /** @type {!Array<componentHandler.ComponentConfig>} */
  var registeredComponents_ = [];

  /** @type {!Array<componentHandler.Component>} */
  var createdComponents_ = [];

  var downgradeMethod_ = 'mdlDowngrade_';
  var componentConfigProperty_ = 'mdlComponentConfigInternal_';

  /**
   * Searches registered components for a class we are interested in using.
   * Optionally replaces a match with passed object if specified.
   * @param {string} name The name of a class we want to use.
   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
   * @return {!Object|boolean}
   * @private
   */
  function findRegisteredClass_(name, optReplace) {
    for (var i = 0; i < registeredComponents_.length; i++) {
      if (registeredComponents_[i].className === name) {
        if (optReplace !== undefined) {
          registeredComponents_[i] = optReplace;
        }
        return registeredComponents_[i];
      }
    }
    return false;
  }

  /**
   * Returns an array of the classNames of the upgraded classes on the element.
   * @param {!HTMLElement} element The element to fetch data from.
   * @return {!Array<string>}
   * @private
   */
  function getUpgradedListOfElement_(element) {
    var dataUpgraded = element.getAttribute('data-upgraded');
    // Use `['']` as default value to conform the `,name,name...` style.
    return dataUpgraded === null ? [''] : dataUpgraded.split(',');
  }

  /**
   * Returns true if the given element has already been upgraded for the given
   * class.
   * @param {!HTMLElement} element The element we want to check.
   * @param {string} jsClass The class to check for.
   * @return boolean
   * @private
   */
  function isElementUpgraded_(element, jsClass) {
    var upgradedList = getUpgradedListOfElement_(element);
    return upgradedList.indexOf(jsClass) !== -1;
  }

  /**
   * Searches existing DOM for elements of our component type and upgrades them
   * if they have not already been upgraded.
   * @param {string=} optJsClass the programatic name of the element class we
   * need to create a new instance of.
   * @param {string=} optCssClass the name of the CSS class elements of this
   * type will have.
   */
  function upgradeDomInternal(optJsClass, optCssClass) {
    if (optJsClass === undefined && optCssClass === undefined) {
      for (var i = 0; i < registeredComponents_.length; i++) {
        upgradeDomInternal(registeredComponents_[i].className,
            registeredComponents_[i].cssClass);
      }
    } else {
      var jsClass = /** @type {string} */ (optJsClass);
      if (optCssClass === undefined) {
        var registeredClass = findRegisteredClass_(jsClass);
        if (registeredClass) {
          optCssClass = registeredClass.cssClass;
        }
      }

      var elements = document.querySelectorAll('.' + optCssClass);
      for (var n = 0; n < elements.length; n++) {
        upgradeElementInternal(elements[n], jsClass);
      }
    }
  }

  /**
   * Upgrades a specific element rather than all in the DOM.
   * @param {!HTMLElement} element The element we wish to upgrade.
   * @param {string=} optJsClass Optional name of the class we want to upgrade
   * the element to.
   */
  function upgradeElementInternal(element, optJsClass) {
    // Verify argument type.
    if (!(typeof element === 'object' && element instanceof Element)) {
      throw new Error('Invalid argument provided to upgrade MDL element.');
    }
    var upgradedList = getUpgradedListOfElement_(element);
    var classesToUpgrade = [];
    // If jsClass is not provided scan the registered components to find the
    // ones matching the element's CSS classList.
    if (!optJsClass) {
      var classList = element.classList;
      registeredComponents_.forEach(function(component) {
        // Match CSS & Not to be upgraded & Not upgraded.
        if (classList.contains(component.cssClass) &&
            classesToUpgrade.indexOf(component) === -1 &&
            !isElementUpgraded_(element, component.className)) {
          classesToUpgrade.push(component);
        }
      });
    } else if (!isElementUpgraded_(element, optJsClass)) {
      classesToUpgrade.push(findRegisteredClass_(optJsClass));
    }

    // Upgrade the element for each classes.
    for (var i = 0, n = classesToUpgrade.length, registeredClass; i < n; i++) {
      registeredClass = classesToUpgrade[i];
      if (registeredClass) {
        // Mark element as upgraded.
        upgradedList.push(registeredClass.className);
        element.setAttribute('data-upgraded', upgradedList.join(','));
        var instance = new registeredClass.classConstructor(element);
        instance[componentConfigProperty_] = registeredClass;
        createdComponents_.push(instance);
        // Call any callbacks the user has registered with this component type.
        for (var j = 0, m = registeredClass.callbacks.length; j < m; j++) {
          registeredClass.callbacks[j](element);
        }

        if (registeredClass.widget) {
          // Assign per element instance for control over API
          element[registeredClass.className] = instance;
        }
      } else {
        throw new Error(
          'Unable to find a registered component for the given class.');
      }

      var ev = document.createEvent('Events');
      ev.initEvent('mdl-componentupgraded', true, true);
      element.dispatchEvent(ev);
    }
  }

  /**
   * Upgrades a specific list of elements rather than all in the DOM.
   * @param {!HTMLElement|!Array<!HTMLElement>|!NodeList|!HTMLCollection} elements
   * The elements we wish to upgrade.
   */
  function upgradeElementsInternal(elements) {
    if (!Array.isArray(elements)) {
      if (typeof elements.item === 'function') {
        elements = Array.prototype.slice.call(/** @type {Array} */ (elements));
      } else {
        elements = [elements];
      }
    }
    for (var i = 0, n = elements.length, element; i < n; i++) {
      element = elements[i];
      if (element instanceof HTMLElement) {
        if (element.children.length > 0) {
          upgradeElementsInternal(element.children);
        }
        upgradeElementInternal(element);
      }
    }
  }

  /**
   * Registers a class for future use and attempts to upgrade existing DOM.
   * @param {{constructor: !Function, classAsString: string, cssClass: string, widget: string}} config
   */
  function registerInternal(config) {
    var newConfig = /** @type {componentHandler.ComponentConfig} */ ({
      'classConstructor': config.constructor,
      'className': config.classAsString,
      'cssClass': config.cssClass,
      'widget': config.widget === undefined ? true : config.widget,
      'callbacks': []
    });

    registeredComponents_.forEach(function(item) {
      if (item.cssClass === newConfig.cssClass) {
        throw new Error('The provided cssClass has already been registered.');
      }
      if (item.className === newConfig.className) {
        throw new Error('The provided className has already been registered');
      }
    });

    if (config.constructor.prototype
        .hasOwnProperty(componentConfigProperty_)) {
      throw new Error(
          'MDL component classes must not have ' + componentConfigProperty_ +
          ' defined as a property.');
    }

    var found = findRegisteredClass_(config.classAsString, newConfig);

    if (!found) {
      registeredComponents_.push(newConfig);
    }
  }

  /**
   * Allows user to be alerted to any upgrades that are performed for a given
   * component type
   * @param {string} jsClass The class name of the MDL component we wish
   * to hook into for any upgrades performed.
   * @param {function(!HTMLElement)} callback The function to call upon an
   * upgrade. This function should expect 1 parameter - the HTMLElement which
   * got upgraded.
   */
  function registerUpgradedCallbackInternal(jsClass, callback) {
    var regClass = findRegisteredClass_(jsClass);
    if (regClass) {
      regClass.callbacks.push(callback);
    }
  }

  /**
   * Upgrades all registered components found in the current DOM. This is
   * automatically called on window load.
   */
  function upgradeAllRegisteredInternal() {
    for (var n = 0; n < registeredComponents_.length; n++) {
      upgradeDomInternal(registeredComponents_[n].className);
    }
  }

  /**
   * Finds a created component by a given DOM node.
   *
   * @param {!Node} node
   * @return {*}
   */
  function findCreatedComponentByNodeInternal(node) {
    for (var n = 0; n < createdComponents_.length; n++) {
      var component = createdComponents_[n];
      if (component.element_ === node) {
        return component;
      }
    }
  }

  /**
   * Check the component for the downgrade method.
   * Execute if found.
   * Remove component from createdComponents list.
   *
   * @param {*} component
   */
  function deconstructComponentInternal(component) {
    if (component &&
        component[componentConfigProperty_]
          .classConstructor.prototype
          .hasOwnProperty(downgradeMethod_)) {
      component[downgradeMethod_]();
      var componentIndex = createdComponents_.indexOf(component);
      createdComponents_.splice(componentIndex, 1);

      var upgrades = component.element_.getAttribute('data-upgraded').split(',');
      var componentPlace = upgrades.indexOf(
          component[componentConfigProperty_].classAsString);
      upgrades.splice(componentPlace, 1);
      component.element_.setAttribute('data-upgraded', upgrades.join(','));

      var ev = document.createEvent('Events');
      ev.initEvent('mdl-componentdowngraded', true, true);
      component.element_.dispatchEvent(ev);
    }
  }

  /**
   * Downgrade either a given node, an array of nodes, or a NodeList.
   *
   * @param {!Node|!Array<!Node>|!NodeList} nodes
   */
  function downgradeNodesInternal(nodes) {
    var downgradeNode = function(node) {
      deconstructComponentInternal(findCreatedComponentByNodeInternal(node));
    };
    if (nodes instanceof Array || nodes instanceof NodeList) {
      for (var n = 0; n < nodes.length; n++) {
        downgradeNode(nodes[n]);
      }
    } else if (nodes instanceof Node) {
      downgradeNode(nodes);
    } else {
      throw new Error('Invalid argument provided to downgrade MDL nodes.');
    }
  }

  // Now return the functions that should be made public with their publicly
  // facing names...
  return {
    upgradeDom: upgradeDomInternal,
    upgradeElement: upgradeElementInternal,
    upgradeElements: upgradeElementsInternal,
    upgradeAllRegistered: upgradeAllRegisteredInternal,
    registerUpgradedCallback: registerUpgradedCallbackInternal,
    register: registerInternal,
    downgradeElements: downgradeNodesInternal
  };
})();

window.addEventListener('load', function() {
  'use strict';

  /**
   * Performs a "Cutting the mustard" test. If the browser supports the features
   * tested, adds a mdl-js class to the <html> element. It then upgrades all MDL
   * components requiring JavaScript.
   */
  if ('classList' in document.createElement('div') &&
      'querySelector' in document &&
      'addEventListener' in window && Array.prototype.forEach) {
    document.documentElement.classList.add('mdl-js');
    componentHandler.upgradeAllRegistered();
  } else {
    componentHandler.upgradeElement =
        componentHandler.register = function() {};
  }
});

/**
 * Describes the type of a registered component type managed by
 * componentHandler. Provided for benefit of the Closure compiler.
 * @typedef {{
 *   constructor: !Function,
 *   className: string,
 *   cssClass: string,
 *   widget: string,
 *   callbacks: !Array<function(!HTMLElement)>
 * }}
 */
componentHandler.ComponentConfig;  // jshint ignore:line

/**
 * Created component (i.e., upgraded element) type as managed by
 * componentHandler. Provided for benefit of the Closure compiler.
 * @typedef {{
 *   element_: !HTMLElement,
 *   className: string,
 *   classAsString: string,
 *   cssClass: string,
 *   widget: string
 * }}
 */
componentHandler.Component;  // jshint ignore:line

JSCS output:
$ jscs src/mdlComponentHandler.js
Newline required after description at src/mdlComponentHandler.js :
    37 |  /**
    38 |   * Searches registered components for a class we are interested in using.
    39 |   * Optionally replaces a match with passed object if specified.
-------------------------------------------------------------------------^
    40 |   * @param {string} name The name of a class we want to use.
    41 |   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.

invalid case of type `string` at src/mdlComponentHandler.js :
    38 |   * Searches registered components for a class we are interested in using.
    39 |   * Optionally replaces a match with passed object if specified.
    40 |   * @param {string} name The name of a class we want to use.
---------------------^
    41 |   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
    42 |   * @return {!Object|boolean}

invalid case of type `boolean` at src/mdlComponentHandler.js :
    40 |   * @param {string} name The name of a class we want to use.
    41 |   * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
    42 |   * @return {!Object|boolean}
----------------------^
    43 |   * @private
    44 |   */

Newline required after description at src/mdlComponentHandler.js :
    56 |
    57 |  /**
    58 |   * Returns an array of the classNames of the upgraded classes on the element.
---------------------------------------------------------------------------------------^
    59 |   * @param {!HTMLElement} element The element to fetch data from.
    60 |   * @return {!Array<string>}

invalid case of type `string` at src/mdlComponentHandler.js :
    58 |   * Returns an array of the classNames of the upgraded classes on the element.
    59 |   * @param {!HTMLElement} element The element to fetch data from.
    60 |   * @return {!Array<string>}
----------------------^
    61 |   * @private
    62 |   */

Newline required after description at src/mdlComponentHandler.js :
    69 |  /**
    70 |   * Returns true if the given element has already been upgraded for the given
    71 |   * class.
-------------------^
    72 |   * @param {!HTMLElement} element The element we want to check.
    73 |   * @param {string} jsClass The class to check for.

invalid case of type `string` at src/mdlComponentHandler.js :
    71 |   * class.
    72 |   * @param {!HTMLElement} element The element we want to check.
    73 |   * @param {string} jsClass The class to check for.
---------------------^
    74 |   * @return boolean
    75 |   * @private

Missing type in @returns statement at src/mdlComponentHandler.js :
    74 |   * @return boolean
    75 |   * @private
    76 |   */
-------------^
    77 |  function isElementUpgraded_(element, jsClass) {
    78 |    var upgradedList = getUpgradedListOfElement_(element);

Newline required after description at src/mdlComponentHandler.js :
    82 |  /**
    83 |   * Searches existing DOM for elements of our component type and upgrades them
    84 |   * if they have not already been upgraded.
----------------------------------------------------^
    85 |   * @param {string=} optJsClass the programatic name of the element class we
    86 |   * need to create a new instance of.

invalid case of type `string` at src/mdlComponentHandler.js :
    83 |   * Searches existing DOM for elements of our component type and upgrades them
    84 |   * if they have not already been upgraded.
    85 |   * @param {string=} optJsClass the programatic name of the element class we
---------------------^
    86 |   * need to create a new instance of.
    87 |   * @param {string=} optCssClass the name of the CSS class elements of this

invalid case of type `string` at src/mdlComponentHandler.js :
    85 |   * @param {string=} optJsClass the programatic name of the element class we
    86 |   * need to create a new instance of.
    87 |   * @param {string=} optCssClass the name of the CSS class elements of this
---------------------^
    88 |   * type will have.
    89 |   */

invalid case of type `string` at src/mdlComponentHandler.js :
    95 |      }
    96 |    } else {
    97 |      var jsClass = /** @type {string} */ (optJsClass);
--------------------------------------^
    98 |      if (optCssClass === undefined) {
    99 |        var registeredClass = findRegisteredClass_(jsClass);

Newline required after description at src/mdlComponentHandler.js :
   111 |
   112 |  /**
   113 |   * Upgrades a specific element rather than all in the DOM.
--------------------------------------------------------------------^
   114 |   * @param {!HTMLElement} element The element we wish to upgrade.
   115 |   * @param {string=} optJsClass Optional name of the class we want to upgrade

invalid case of type `string` at src/mdlComponentHandler.js :
   113 |   * Upgrades a specific element rather than all in the DOM.
   114 |   * @param {!HTMLElement} element The element we wish to upgrade.
   115 |   * @param {string=} optJsClass Optional name of the class we want to upgrade
---------------------^
   116 |   * the element to.
   117 |   */

Newline required after description at src/mdlComponentHandler.js :
   170 |
   171 |  /**
   172 |   * Upgrades a specific list of elements rather than all in the DOM.
-----------------------------------------------------------------------------^
   173 |   * @param {!HTMLElement|!Array<!HTMLElement>|!NodeList|!HTMLCollection} elements
   174 |   * The elements we wish to upgrade.

Newline required after description at src/mdlComponentHandler.js :
   194 |
   195 |  /**
   196 |   * Registers a class for future use and attempts to upgrade existing DOM.
-----------------------------------------------------------------------------------^
   197 |   * @param {{constructor: !Function, classAsString: string, cssClass: string, widget: string}} config
   198 |   */

invalid case of type `string` at src/mdlComponentHandler.js :
   195 |  /**
   196 |   * Registers a class for future use and attempts to upgrade existing DOM.
   197 |   * @param {{constructor: !Function, classAsString: string, cssClass: string, widget: string}} config
---------------------^
   198 |   */
   199 |  function registerInternal(config) {

invalid case of type `string` at src/mdlComponentHandler.js :
   195 |  /**
   196 |   * Registers a class for future use and attempts to upgrade existing DOM.
   197 |   * @param {{constructor: !Function, classAsString: string, cssClass: string, widget: string}} config
---------------------^
   198 |   */
   199 |  function registerInternal(config) {

invalid case of type `string` at src/mdlComponentHandler.js :
   195 |  /**
   196 |   * Registers a class for future use and attempts to upgrade existing DOM.
   197 |   * @param {{constructor: !Function, classAsString: string, cssClass: string, widget: string}} config
---------------------^
   198 |   */
   199 |  function registerInternal(config) {

Newline required after description at src/mdlComponentHandler.js :
   231 |  /**
   232 |   * Allows user to be alerted to any upgrades that are performed for a given
   233 |   * component type
---------------------------^
   234 |   * @param {string} jsClass The class name of the MDL component we wish
   235 |   * to hook into for any upgrades performed.

invalid case of type `string` at src/mdlComponentHandler.js :
   232 |   * Allows user to be alerted to any upgrades that are performed for a given
   233 |   * component type
   234 |   * @param {string} jsClass The class name of the MDL component we wish
---------------------^
   235 |   * to hook into for any upgrades performed.
   236 |   * @param {function(!HTMLElement)} callback The function to call upon an

invalid case of type `string` at src/mdlComponentHandler.js :
   353 | * Describes the type of a registered component type managed by
   354 | * componentHandler. Provided for benefit of the Closure compiler.
   355 | * @typedef {{
---------------------^
   356 | *   constructor: !Function,
   357 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   353 | * Describes the type of a registered component type managed by
   354 | * componentHandler. Provided for benefit of the Closure compiler.
   355 | * @typedef {{
---------------------^
   356 | *   constructor: !Function,
   357 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   353 | * Describes the type of a registered component type managed by
   354 | * componentHandler. Provided for benefit of the Closure compiler.
   355 | * @typedef {{
---------------------^
   356 | *   constructor: !Function,
   357 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   366 | * Created component (i.e., upgraded element) type as managed by
   367 | * componentHandler. Provided for benefit of the Closure compiler.
   368 | * @typedef {{
---------------------^
   369 | *   element_: !HTMLElement,
   370 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   366 | * Created component (i.e., upgraded element) type as managed by
   367 | * componentHandler. Provided for benefit of the Closure compiler.
   368 | * @typedef {{
---------------------^
   369 | *   element_: !HTMLElement,
   370 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   366 | * Created component (i.e., upgraded element) type as managed by
   367 | * componentHandler. Provided for benefit of the Closure compiler.
   368 | * @typedef {{
---------------------^
   369 | *   element_: !HTMLElement,
   370 | *   className: string,

invalid case of type `string` at src/mdlComponentHandler.js :
   366 | * Created component (i.e., upgraded element) type as managed by
   367 | * componentHandler. Provided for benefit of the Closure compiler.
   368 | * @typedef {{
---------------------^
   369 | *   element_: !HTMLElement,
   370 | *   className: string,

28 code style errors found.

Ignore previous comments. All is good here now :)

Ah, okay. I ran gulp, I didn't have any errors, and your CI was green. If
there's another step for next time, please let me know.
On 31 July 2015 at 18:29, Addy Osmani<EMAIL_ADDRESS>wrote:

Ignore previous comments. All is good here now :)
—
Reply to this email directly or view it on GitHub
https://github.com/google/material-design-lite/pull/1226#issuecomment-126607483
.


chore: dedupe jest and bump babel/jest related deps

dedupes jest so we have only 1 instance
bumps jest/babel and related packages to mitigate dupes
draggable-dialog test started failing after this dep cleanup/version bump - so I applied my suggestions from https://github.com/microsoft/fluentui-contrib/pull/129 which makes the test pass

Depends on:

[x] https://github.com/microsoft/fluentui-contrib/pull/164
Closes https://github.com/microsoft/fluentui-contrib/pull/129

I tried applying what was mentioned in the #129 but it wasn't working. Glad you found the culprit (jest and its deps)! 👍🏼


Error is printed to browser console when adding definition blocks in composer diagram

Description:
Error is printed to browser console when adding a definition blocks in composer using diagram
Invalid value for package org:  undefined
  .
  .
  setOrg @ package.js:134

Steps to reproduce:

Add a main function using diagram view.

This issue is not reproducible in ballerina 0.981.2-SNAPSHOT so closing this issue.


[CORS-2666] Add Nutanix support for CPMSO

This adds basic support for Nutanix control plane machines for the purpose of self-healing control plane nodes. We would enhance this at a later point to add failure domain support.
How was this tested?

Create a CPMSO image with the changes in  this PR and use the installer built from installer#7119
Create a new release image based on a recent 4.14 release image using oc adm release new --from-release registry.ci.openshift.org/ocp/release:4.14.0-0.nightly-2023-04-19-125337 cluster-control-plane-machine-set-operator=image-registry:cluster-control-plane-machine-set-operator --to-image image-registry:release and set the release image override environment variable to the newly created release image using export OPENSHIFT_INSTALL_RELEASE_IMAGE_OVERRIDE=image-registry:release
Create a install-config using openshift-installer create install-config
Run openshift-installer create manifests and verify ControlPlaneMachineSet manifest generated is as expected

apiVersion: machine.openshift.io/v1
kind: ControlPlaneMachineSet
metadata:
  creationTimestamp: null
  labels:
    machine.openshift.io/cluster-api-cluster: openshiftsid-wvs7z
  name: cluster
  namespace: openshift-machine-api
spec:
  replicas: 3
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: openshiftsid-wvs7z
      machine.openshift.io/cluster-api-machine-role: master
      machine.openshift.io/cluster-api-machine-type: master
  strategy: {}
  template:
    machineType: machines_v1beta1_machine_openshift_io
    machines_v1beta1_machine_openshift_io:
      failureDomains:
        platform: ""
      metadata:
        labels:
          machine.openshift.io/cluster-api-cluster: openshiftsid-wvs7z
          machine.openshift.io/cluster-api-machine-role: master
          machine.openshift.io/cluster-api-machine-type: master
      spec:
        lifecycleHooks: {}
        metadata: {}
        providerSpec:
          value:
            apiVersion: machine.openshift.io/v1
            bootType: ""
            categories: null
            cluster:
              type: uuid
              uuid: 0005b0f1-8f43-a0f2-02b7-3cecef193712
            credentialsSecret:
              name: nutanix-credentials
            image:
              name: openshiftsid-wvs7z-rhcos
              type: name
            kind: NutanixMachineProviderConfig
            memorySize: 16Gi
            metadata:
              creationTimestamp: null
            project:
              type: ""
            subnets:
            - type: uuid
              uuid: c7938dc6-7659-453e-a688-e26020c68e43
            systemDiskSize: 120Gi
            userDataSecret:
              name: master-user-data
            vcpuSockets: 8
            vcpusPerSocket: 1
status: {}

Create a cluster successfully using openshift-install create cluster

$ oc get machines -A
NAMESPACE               NAME                              PHASE         TYPE   REGION    ZONE    AGE
openshift-machine-api   openshiftsid-v2tv8-master-0       Running       AHV    Unnamed   ganon   22m
openshift-machine-api   openshiftsid-v2tv8-master-1       Running       AHV    Unnamed   ganon   22m
openshift-machine-api   openshiftsid-v2tv8-master-2       Running       AHV    Unnamed   ganon   22m
openshift-machine-api   openshiftsid-v2tv8-worker-6xc8s   Running       AHV    Unnamed   ganon   12m
openshift-machine-api   openshiftsid-v2tv8-worker-c57mc   Running       AHV    Unnamed   ganon   12m
openshift-machine-api   openshiftsid-v2tv8-worker-pnc5c   Running   AHV    Unnamed   ganon   12m

Verify that the ControlPlaneMachineSet is Active and deleting ControlPlane and Worker machines leads to creation of new ones

$ oc -n openshift-machine-api get controlplanemachineset
NAME      DESIRED   CURRENT   READY   UPDATED   UNAVAILABLE   STATE    AGE
cluster   3         3         3       3                       Active   75m

$ oc -n openshift-machine-api delete machine openshiftsid-v2tv8-master-0
machine.machine.openshift.io "openshiftsid-v2tv8-master-0" deleted

$ oc -n openshift-machine-api delete machine openshiftsid-v2tv8-worker-pnc5c
machine.machine.openshift.io "openshiftsid-v2tv8-worker-pnc5c" deleted

$ oc -n openshift-machine-api get machines
NAME                                PHASE     TYPE   REGION    ZONE    AGE
openshiftsid-v2tv8-master-1         Running   AHV    Unnamed   ganon   75m
openshiftsid-v2tv8-master-2         Running   AHV    Unnamed   ganon   75m
openshiftsid-v2tv8-master-4rpfd-0   Running   AHV    Unnamed   ganon   24m
openshiftsid-v2tv8-worker-6xc8s     Running   AHV    Unnamed   ganon   65m
openshiftsid-v2tv8-worker-c57mc     Running   AHV    Unnamed   ganon   65m
openshiftsid-v2tv8-worker-ps5tn     Running   AHV    Unnamed   ganon   21m

@damdo @JoelSpeed Any suggestions regarding the linting error?
pkg/controllers/controlplanemachinesetgenerator/utils.go:63:40: `genericControlPlaneMachineSetSpec` - `replicas` always receives `replicas` (`3`) (unparam)
[18](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_cluster-control-plane-machine-set-operator/200/pull-ci-openshift-cluster-control-plane-machine-set-operator-main-lint/1649391925758791680#1:build-log.txt%3A18)
func genericControlPlaneMachineSetSpec(replicas int32, clusterID string) machinev1builder.ControlPlaneMachineSetSpecApplyConfiguration {

Should we just refactor that method to remove replicas as a parameter?

@damdo @JoelSpeed Any suggestions regarding the linting error?
pkg/controllers/controlplanemachinesetgenerator/utils.go:63:40: `genericControlPlaneMachineSetSpec` - `replicas` always receives `replicas` (`3`) (unparam)
[18](https://prow.ci.openshift.org/view/gs/origin-ci-test/pr-logs/pull/openshift_cluster-control-plane-machine-set-operator/200/pull-ci-openshift-cluster-control-plane-machine-set-operator-main-lint/1649391925758791680#1:build-log.txt%3A18)
func genericControlPlaneMachineSetSpec(replicas int32, clusterID string) machinev1builder.ControlPlaneMachineSetSpecApplyConfiguration {

Should we just refactor that function to remove replicas as a parameter?

Lets add a nolint for now, in the future we may expand to support 5 replicas so we will want the parameter there

Can we please make sure tests are added for Nutanix, similar to the tests for the other platforms

/retest-required

/retest-required

There's a linter unparam complaint, you can add a nolint:unparam to that line to fix that, otherwise I think this is good to go

Thanks for the suggestion. The lint check is now passing. Waiting on the e2e now.

/retest-required

/approve
/lgtm

/retest-required

@thunderboltsid I think we should add an e2e-nutanix-operator job to this repo, WDYT?

@JoelSpeed @damdo yeah, e2e sounds like a good idea.

Adding the e2e https://github.com/openshift/release/pull/39933

Thanks @thunderboltsid that's a great starting point. I left a couple of comments there.

/test e2e-nutanix-ovn

/test e2e-nutanix-ovn

/test e2e-nutanix-ovn

/test e2e-nutanix-ovn

@JoelSpeed @damdo Added NutanixProviderConfig type in order to make the e2e tests pass. PTAL

/retest-required

/retest-required

/retest-required

/retest-required

/test e2e-azure-operator

/test e2e-azure-ovn-etcd-scaling

/test e2e-azure-ovn-etcd-scaling

This doesn't seem to be marked as required and looking at the job history, it barely ever passes. Any reason we're retesting this?

The E2E job name should be e2e-nutanix-operator not e2e-nutanix-ovn, but that can be fixed separately, tests are green, no additional feedback on the code from me
/approve
/assign @damdo for final LGTM