[Fix] add_links to only trigger a topology update if it's a new Link

Fixes #21
Release notes
[3.7.3] - 2021-12.21

Changed

Changed add_links to only notify a topology update if a link has been created.
Changed _get_link_or_create to also return whether or not a new link has been created.

Before
Notice the periodic topology update events in the same frequency as .*.interface.is.nni are received:
kytos $> 2021-12-21 12:40:44,246 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_61) Topology graph updated.
2021-12-21 12:40:44,260 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_61) Topology graph updated.
2021-12-21 12:40:44,316 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_228) Topology graph updated.
2021-12-21 12:40:44,323 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_119) Topology graph updated.
2021-12-21 12:40:47,364 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_115) Topology graph updated.
2021-12-21 12:40:47,443 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_16) Topology graph updated.
2021-12-21 12:40:47,444 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_247) Topology graph updated.
2021-12-21 12:40:47,445 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_128) Topology graph updated.
2021-12-21 12:40:50,460 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_253) Topology graph updated.
2021-12-21 12:40:50,472 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_254) Topology graph updated.
2021-12-21 12:40:50,483 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_238) Topology graph updated.
2021-12-21 12:40:50,483 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_113) Topology graph updated.
2021-12-21 12:40:53,534 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_66) Topology graph updated.
2021-12-21 12:40:53,588 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_129) Topology graph updated.
2021-12-21 12:40:53,624 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_31) Topology graph updated.
2021-12-21 12:40:53,642 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_244) Topology graph updated.
2021-12-21 12:40:56,711 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_142) Topology graph updated.
2021-12-21 12:40:56,766 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_143) Topology graph updated.
2021-12-21 12:40:56,804 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_145) Topology graph updated.
2021-12-21 12:40:56,806 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_141) Topology graph updated.
2021-12-21 12:40:59,843 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_75) Topology graph updated.
2021-12-21 12:40:59,876 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_20) Topology graph updated.
2021-12-21 12:40:59,899 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_92) Topology graph updated.
2021-12-21 12:40:59,927 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_136) Topology graph updated.
2021-12-21 12:41:02,971 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_32) Topology graph updated.
2021-12-21 12:41:03,002 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_153) Topology graph updated.
2021-12-21 12:41:03,012 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_243) Topology graph updated.
2021-12-21 12:41:03,015 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_159) Topology graph updated.
2021-12-21 12:41:06,096 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_85) Topology graph updated.
2021-12-21 12:41:06,097 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_9) Topology graph updated.
2021-12-21 12:41:06,098 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_9) Topology graph updated.
2021-12-21 12:41:06,101 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_164) Topology graph updated.
2021-12-21 12:41:09,156 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_161) Topology graph updated.
2021-12-21 12:41:09,196 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_87) Topology graph updated.
2021-12-21 12:41:09,201 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_171) Topology graph updated.
2021-12-21 12:41:09,201 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_86) Topology graph updated.
2021-12-21 12:41:12,256 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_39) Topology graph updated.
2021-12-21 12:41:12,332 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_177) Topology graph updated.
2021-12-21 12:41:12,346 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_178) Topology graph updated.
2021-12-21 12:41:12,362 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_174) Topology graph updated.
kytos $>

After
2021-12-21 12:58:53,647 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_53) Topology graph updated.
2021-12-21 12:58:53,652 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_58) Topology graph updated.
2021-12-21 12:58:53,664 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_63) Topology graph updated.
2021-12-21 12:58:53,685 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_31) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:53,700 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_62) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:53,754 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_60) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:53,767 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_91) Topology graph updated.
2021-12-21 12:58:53,769 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_96) Topology graph updated.
2021-12-21 12:58:53,773 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_47) Topology graph updated.
2021-12-21 12:58:53,775 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_52) Topology graph updated.
2021-12-21 12:58:53,775 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_102) Topology graph updated.
2021-12-21 12:58:53,776 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_28) Topology graph updated.
2021-12-21 12:58:53,778 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_107) Topology graph updated.
2021-12-21 12:58:53,822 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_136) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:53,871 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_58) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:53,923 - INFO [kytos.napps.kytos/flow_manager] (ThreadPoolExecutor-0_137) Flow saved in kytos.flow.persistence.0fbe26be5bfc453882d118ba8315e473
2021-12-21 12:58:55,720 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_144) Topology graph updated.
2021-12-21 12:58:55,746 - INFO [kytos.napps.kytos/pathfinder] (ThreadPoolExecutor-0_19) Topology graph updated.
kytos $>

Looks good to me. Pretty neat and effective solution. It is an important enhancement to get more accuracy on the topology events and also improves the performance (by removing useless events). Thanks for the PR!

Thanks for reviewing, Italo.


Fix alloc in libsodium/test_crypto_generichash_multipart using MaybeUninit

Fixes https://github.com/sodiumoxide/sodiumoxide/issues/338

@RalfJung please review. Is it safe?

let's do it the official way. Pinging @rust-secure-code for a review (hope this works)

Pull Request Test Coverage Report for Build 1070

0 of 0   changed or added relevant lines in 0 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage remained the same at 94.663%

Totals

Change from base Build 1057:
0.0%

Covered Lines:
2909

Relevant Lines:
3073

💛  - Coveralls

This looks reasonable, but I have not checked whether crypto_generichash_init and friends are actually okay when being called with a pointer to uninitialized memory.

crypto_generichash_init is okay when being called with a pointer to uninitialized memory. crypto_generichash_update and crypto_generichash_final are not

crypto_generichash_init is okay when being called with a pointer to uninitialized memory. crypto_generichash_update and crypto_generichash_final are not

I suppose crypto_generichash_init initializes the memory though, and then things are okay?

and then things are okay?

Yes

bors: r+


[test] TLVWriter needs more complete test and more explicit encoding API.

Problem
As shown in #1289 the chip::TLV::TLVWriter tests do not seem to have coverage for many inttypes (uint8_t, int8_t, uint16_t, int16_t) nor the preserveSize option.
Also, the API isn't completely explicit and requires specific casting on some toolchains.
Proposed Solution
Expand the test suite.  Consider making the API explicit: Put32, Put8, etc.

This is still true

@turon is the issue resolved enough to close? If not what's missing?


Overwrites changes to ALLPAIRS need for Gunbot Proxy CE

When using Gunbot Proxy CE it overwrites changes needed to ALLPAIRS to prevent Node from erroring on a self signed certificate.
https://github.com/taniman/gunbotproxycommunity
GBP CE needs
https://github.com/taniman/gunbotproxycommunity
In ALLPAIRS
Example
13|BTC_DGB | ::::: collecting market data...
13|BTC_DGB | *** PLNX CALLBACK | calling EMA *** self signed certificate
13|BTC_DGB | 2017/07/04 03:24:12 Error: Error: self signed certificate
13|BTC_DGB | !!! Cycle 5 failed. Will repeat in 60s

We could add an option to ginit and gadd to tell the generator to setup for the proxy and add process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; to ALLPAIRS.

That is a bit specific and people not using the community proxy dont' need it and we might not use the community proxy after this next gun bot release.
This isn't needed with Guy Fawkes proxy.
I am probably going to tinker with an nginx or haproxy myself to have more control.
I noticed it only happens when you run ginit and doesn't seem to happen with gadd.
I have been adding pairs by gadd.
Maybe all that is necessary is updating the README and the forum letting people know to add any customer settings they want to the ALLPAIRS?
OR maybe wrap custom mods to ALLPAIRS in comments and then your app make sure they stay?
Not sure the best strategy.


Change EditorLineEditFileChooser to use the "Folder" icon

Considering that this is only used in the Autoload section of the Project Settings, I was surprised that it was a class of its own.
But anyways, I think it shows its purpose better having a folder icon, instead of ".." on the button:

Thanks!


RFC: Auto Mask Secrets

Description of the feature request
Automatically mask secret or password values in extra data.
Problem statement

A best practice is to never log secrets or passwords. There are times when I have an object that might have one of these things in it. I'd like to be able to pass in the object without needing to pull out the secrets manually.
Summary of the feature

If turned on, any extra data passed into the logger would be looked at and secrets/passwords would be masked. Consider the following data.
{
  username: "my-username",
  password: "my-password"
}

The code would see a key that contains "password" (this could be a configurable regex with a default) and would replace it with something like "*****", resulting in the following extra data being logged.
{
  username: "mu-username",
  password: "*****"
}

No secrets in logs
Code examples

const logger = new Logger();

const objectWithASecret = {
  username: "my-username",
  password: "my-password"
};

logger.debug('Logging in', { objectWithASecret });

Benefits for you and the wider AWS community

Safer logging.
Describe alternatives you've considered

Creating a function that does this for me. The downside to this is twofold. One, I have to include the function call everywhere, so if I forget it I risk writing something I shouldn't to the logs. Two, the devex is slightly worse because I have to do something like { extraData: cleanExtraData(extraData) } instead of just { extraData }
Additional context

Related issues, RFCs

I agree that credentials should not be logged as per ASVS 7.1.1. There are other types of data that should not be logged as well based on who owns the data or where it is stored.
My question would how would you automate this?
a) Have a list of keys that should be hidden? English speaking developers might use password or token, but what about in other languages?
b) Detect secret like patterns? Secrets could look like other data?
c) Mix of both?
What are the performance implications need to be considered compared to other approaches?
In @middy/input-output-logger we opted for allowing a developer to list what paths to omit using omitPaths. In my experience secrets/PII is well known during development and not overwhelming to manually list per handler.
I believe GitHub Actions has this functionality built in, they might have a package that could be used. Git secrets scanner may also be a source of ideas for this (https://github.com/awslabs/git-secrets).

Hi @jasonwadsworth thanks a lot for the feature request.
We have had a similar feature on the radar for all the runtimes, although it seems this one has a more reduced scope. You can find more details in this other issue https://github.com/awslabs/aws-lambda-powertools-roadmap/issues/12
I'm 100% on board and in favor of the concept of not logging secrets and leaving the responsibility to the developer seems like a sensible choice.
At the moment though, we want to make sure to make the base feature set of the core utilities as stable and mature as possible before considering new features. After going GA and having collected enough feedback from customers we'll definitely consider this type of request.

I searched for something like this and didn't find it. Thanks for the link to the roadmap. Also completely understand on timing. This was just something that came up today so I thought I'd add it.
This is one case where I'd like to make it easier for devs to not make mistakes, so it would be nice to not leave it to the devs. Having it at the configuration point of creating the logger would be great, since that can be done in a single place.

Any update about this issue ?

I like this feature. I suggest that the user can define which keys to be filtered instead of having defaults.

+1

Hey guys, I'm interested in contributing.  I was thinking about allowing for a maskedValues array on logger creation and then under createAndPopulateLogItem add a function that cross checks key value pairs with the array and masks the values that correspond.  Would that work? Should be non-intrusive and self contained.

@sthulb

Hi @wehnerjp, thank you for the offering to contribute to the feature and project and sorry for the slight delay.
I saw your message yesterday and I wanted to have the time to formulate a proper response.
Adding a Data Masking utility is something that we are strongly considering doing, however we'd like to do so with a bigger scope than just obfuscating, which is what is currently being implemented in the Python version of Powertools.
Obfuscation in itself is not necessarily complex, however after talking with other customers and security experts we have found that the next natural step after obfuscation would be to allow for recover the sensitive data that was masked. To do this however we can't simply find & replace all the sensitive values with ***, but we must use a deterministic approach that can be reversed (aka encryption) - see more details in aws-powertools/powertools-lambda-python#1173.
Since this issue was created, work on the Python side of Powertools has continued and the feature has gone through a RFC (aws-powertools/powertools-lambda-python#1858), which eventually coalesced around an implementation that uses KMS and an Encryption SDK, to encrypt the sensitive values.
Later, the team has worked on an initial implementation (aws-powertools/powertools-lambda-python#2197) using the specification agreed in the RFC, which was merged 3 weeks ago.
As stated in our public roadmap, one of our main focuses as a project is to eventually reach feature parity with Powertools for AWS Lambda (Python), so an eventual implementation of a Data Masking utility in this project will look more or less the same to the one they just merged in terms of feature set and overall scope.
At the moment we are focusing on getting version 2 out (#1714) and two new utilities: Parser (#1334) & Validation (#508), however I'm more than open to start discussing and refining this RFC if you or anyone else in the thread/community would like to start working. The goal would be to study the RFC and implementation in Python and come up with a similar RFC here that incorporates the same scope & features, but follows idioms and conventions from this project and the wider ecosystem (Node.js / TS).
If instead you're only interested in obfuscating values and are not interested in encrypting them and/or being able to retrieve them, then you'll be able to do this with the existing feature set of Logger real soon.
As mentioned, we are currently working on our next major version which will make the Logger and its LogFormatter more customizable by allowing you to fully customize the log output.
At the moment the LogFormatter in v1 only gives you access to the standard keys managed by the Logger (i.e. level, message, timestamp, etc.), however this is going to change soon.
With the new version, you'll be able to create a custom LogFormatter like the one below, and obfuscate any value you want:
import { Logger, LogFormatter, LogItem } from "@aws-lambda-powertools/logger";
import type {
  LogAttributes,
  UnformattedAttributes,
} from "@aws-lambda-powertools/logger/types";

class MyFormatter extends LogFormatter {
  #keysToObfuscate: string[];

  public constructor({ keysToObfuscate }: { keysToObfuscate: string[] }) {
    super();
    this.#keysToObfuscate =
      keysToObfuscate && keysToObfuscate.length > 0 ? keysToObfuscate : [];
  }

  public formatAttributes(
    attributes: UnformattedAttributes,
    additionalLogAttributes: LogAttributes
  ): LogItem {
    return new LogItem({
      attributes: {
        ...this.obfuscate(attributes),
        ...this.obfuscate(additionalLogAttributes),
        timestamp: this.formatTimestamp(attributes.timestamp),
      },
    });
  }

  /**
   * Obfuscate the keys in the object that match the keysToObfuscate array.
   * If the object is nested, recursively obfuscate the keys.
   *
   * @note this is a sample & naïve implementation - it can probably be optimized
   */
  obfuscate(object: Record<string, unknown>) {
    const obfuscatedObject: Record<string, unknown> = {};
    Object.keys(object).forEach((key) => {
      if (this.#keysToObfuscate.includes(key)) {
        obfuscatedObject[key] = "****";
      } else if (typeof object[key] === "object") {
        obfuscatedObject[key] = this.obfuscate(
          object[key] as Record<string, unknown>
        );
      } else {
        obfuscatedObject[key] = object[key];
      }
    });
    return obfuscatedObject;
  }
}

Which you can then use in your Logger like this:
const logger = new Logger({
  logLevel: "DEBUG",
  logFormatter: new MyFormatter({
    keysToObfuscate: ["my_secret_field", "my_other_secret_field"],
  }),
});

I have tested the above on a build made from the code currently in the feat/v2 branch and the log output generated looks like this:
{
    "logLevel": "DEBUG",
    "timestamp": "2023-10-19T21:13:04.584Z",
    "message": "this log might contain secrets",
    "serviceName": "service_undefined",
    "my_secret_field": "****",
    "some_other_field": "some other value",
    "a_nested_object": {
        "nested_field": "nested value",
        "my_secret_field": "****",
        "another_nested_object": {
            "my_other_secret_field": "****"
        }
    }
}

We are planning on releasing the first alpha version (which will have this feature) early next week.

Wow, that's fantastic.  Really excited about the v2 updates.  Thank you so much for your thoughtful response.  Great info and very helpful.  I ended up just creating a wrapper class around Logger that overrode the methods with a little search and replace subroutine similar to the one you illustrated above before passing it down to the super class invocation.  I'll look into the python power tools functionality you're talking about.  If it seems in my wheelhouse I'd be happy to contribute.

Hi @wehnerjp, yes this is the right place.
Ideally yes, we want to match the implementation and features in the Python version so it'd be a separate utility. This way customers can use it regardless of logging.
With that said, I don't think a deeper integration between the two is out of the question after we have released the first version of the new utility. In the meantime, customers can create a custom log formatter and apply the masking.

Cool, I'll plan on just using this RFC then

Hi guys,
I've been chatting with Andrea and I wanted to take the next step to move forward on implementing this RFC in Typescript
Design proposal (Request for comments)
1. Summary
The goal of this document is to propose the scope and design of a Data Masking utility for Powertools for TypeScript. The basis for the implementation of this utility stems from the Python Powertools repo. We will use the current Python implementation as a starting point, and focus mainly on the differences in Typescript implementation.
As this is a step towards parity with the Python utility it is necessary to familiarize yourself with their implementation of Data Masking. The RFC for the Python Data Masking utility and the most substantative feature commit can provide helpful context if you lack prior knowledge.
2. Motivation
We want to create a utility, that offers developers a straightforward way to enhance security within their serverless applications.
Data Masking is an important capability that will ease the out of the box adoption of powertools for customers hoping to leverage our provided utilities in a comprehensive and secure way.
Prior to this, a wrapper class was necessary for consumers who wanted to scrub sensitive data. While this is a viable solution, it is not ideal as it requires additional code and is not as intuitive as a native utility (and potentially as a decorator for other native utilities like logger).
3. Utility interface
With this utility, customers only need to initialize a data masking instance and invoke it providing 3 parameters:

A value or object,
A list of fields to act on
Action to take (ex. encrypt, decrypt, mask)

Initially, there is only two instances of the data masking utility we'll aim to support:

Data masking via decorator (at handler or function level).  Can mask incoming event data and outgoing return data.

I want to note here that we will be using stage 2 decorators because stage 3 aren't supported by esbuild yet.  You can find more information on this here.  Stage 2 Documentation can be found here.

Data masking via direct method invocation. (at any point within the handler function)

3.0.1. Mock Implementation of the Data Masking Class dataMaskFilter method:
export class DataMasking {

/**
 * Decorator function for applying data masking to a class or method.
 * It wraps the original method with data masking logic based on the provided options.
 *
 * @param options - Configuration options for data masking.
 * @returns A decorator function to be applied to a class or method.
 */
public dataMaskFilter = function (
  options: DataMaskingFunctionOptions<Parameters<AnyFunction>>
): (
  target: unknown,
  propertyKey: string,
  descriptor: PropertyDescriptor
) => PropertyDescriptor {
  return function (
    _target: unknown,
    _propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    // Preserve the original method implementation
    const original = descriptor.value;

    // Wrap the original method with data masking logic
    descriptor.value = function (options, ...args: any[]) {
      // Apply data masking to the arguments
      args = original.filterData(...args);

      // Call the original method with masked arguments
      const result = original.call(this, ...args);
      return result;
    };

    return descriptor;
  };
};

public mask(){
  /*...Masking Logic Here...*/
}
}

3.1.1. Data Masking handler (via Decorator)
In this section, we demonstrate the integration of the Data Masking utility into an AWS Lambda function handler using a decorator. Using decorators offers several benefits to end users, primarily enhancing code modularity, maintainability, and reducing boilerplate.  The decorator encapsulates the cross-cutting concern of data masking, by abstracting away implementation details. This allows end users to focus on core functionality and maintain standardized approach to data masking.
class Lambda implements LambdaInterface {
  /**
   * Handler method for AWS Lambda functions, decorated with data masking.
   * It demonstrates the usage of the @masker.dataMaskFilter decorator to apply data masking to specific fields in the input data.
   *
   * @param _event - The input event object.
   * @param _context - The execution context.
   * @returns A Promise<void> representing the completion of the function.
   */
  @masker.dataMaskFilter({
    fieldsToMask: ['password', 'ssn'],
    defaultAction: 'mask',
  })
  public async handler(_event: any, _context: any): Promise<void> {
    // Original function logic here...
  }
}

3.2.1. Data Masking Direct Invocation
Here end users can reference our instance and manipulate the data within the handler directly.  This approach offers flexibility for runtime customization and is particularly useful when the exact point of data masking application needs to be determined dynamically within the handler function.  Users can easily store the output to other variables (like environment variables), or use some part of the output in a further AWS resource invocation.  This allows end users to tailor their utilization of the package at any point in the runtime to a specific usecase.
// Create an instance of the DataMasking utility
const masker = new DataMasking();

class Lambda implements LambdaInterface {
  /**
   * Handler method for AWS Lambda functions with direct data masking invocation.
   *
   * @param _event - The input event object.
   * @param _context - The execution context.
   * @returns A Promise<void> representing the completion of the function.
   */
  public async handler(_event: any, _context: any): Promise<void> {
    // Original function logic here...

    // Sample data containing sensitive information
    const data = {
      project: 'powertools',
      sensitive: 'xxxxxxxxxx',
    };

    // Apply data masking to specific fields
    const masked = masker.mask(data, ['sensitive']);

    // Return the masked data or perform additional logic as needed
    return masked;
  }
}

4. Additional Features
These features may not be released as part of the first release, but should be considered for implementation soon thereafter.
1. Integration with other utilities
In the future, it's worth considering using the decorators implementation to allow one instantiated class instance (with a list of masked fields) to activate masking via an optional passed parameter in method props across different powertools utilities. For example:
import { LambdaInterface } from '@aws-lambda-powertools/interfaces';
import { Logger } from '@aws-lambda-powertools/logger';
import { DataMasking } from '@aws-lambda-powertools/data-masking';

class MyLambda implements LambdaInterface {
  public async handler(event: any, context: any) {
    /*...Function logic here...*/
    const log = new Logger({
    logFormatter: new MyLogFormatter(),
    serviceName: "mx-docs",
    // Anything passed into the info, warn, error methods would be parsed for fields and masked
    dataMasking: {
      fieldsToMask: ['password', 'ssn'],
      defaultAction: 'mask',
    },
  });
  }
}

This integration would streamline end users ability to leverage data masking in a variety of contexts within our powertools suite.  Rather than a mandatory two step process for native powertools classes (either a wrapper class solution or executing a masking operation inline before passing data to another powertools utility), we could allow for a single step process where masking could be activated via one additonal param in the method invocation.  This would mirror our users ability to leverage the decorator functionality in their own class methods.
2. Alternate ways to set fields to mask
We could potentially pull from a set process.env variable for a list of data masking fields too.
3. Add middy implementation
Similar to Logger
4. Design time Data Masking Decorator
Similar to 'idempotent' Decorator this will allow users to leverage the decorator to mask data in their own class methods. It won't require external instantiation
export const masked = function (
  options: DataMaskingFunctionOptions<Parameters<AnyFunction>>
): (
  target: unknown,
  propertyKey: string,
  descriptor: PropertyDescriptor
) => PropertyDescriptor {

  return function (
    _target: unknown,
    _propertyKey: string,
    descriptor: PropertyDescriptor
  ) {
    const childFunction = descriptor.value;
    descriptor.value = maskData(childFunction, options);

    return descriptor;
  };
};

5. Opened discussions and decisions
This is a list of important decision points from maintainer discussion. Subject to changes from comments from community.
Just a note, this data masking utility can be leveraged for logging in tandem with Cloudwatch Logs sensitive data protection.  End users may find a combination more suitable than either individually and may not have awareness of one or both options.
1. References
Orignal RFC from from Python version
https://github.com/aws-powertools/powertools-lambda-python/issues/1858

When we can expect data masking utility (similar to the one created in Python #2197) in typescript?

Hi, for the time being we are focused on shipping the Event Handler utility as per our roadmap, which is our most requested feature by far.
This one is in the top 3 so we should be able to start working on it after that unless customer demand changes.
At the moment I don't have a concrete date to share, but I wouldn't expect work on this feature to start before end of the year / beginning of 2025.

Thanks for the quick response. Where I can track/check the status/progress of this feature?

This issue is the best place as of now - once we have updates I'll post them here.
For added context: the resolution of this issue (Request for comments) is the pre-requisite for implementation work to start.
The next step here, besides prioritizing the feature and allocating resources, will be to complete the specification & DX and ideally have a discussion. Then, once we settle on a spec, we'll start the actual implementation.

Just wanted to provide an update.
First of all, I want to thank @wehnerjp for all the work put in refining the RFC. Second, I want to acknowledge that due to resource constraints we haven't been able to follow up on this new feature, nor give the RFC the attention needed.
Currently we are focused on delivering on other features as described in our roadmap.
This is however a feature that we are keeping in mind for next year. My ask to everyone in this thread, or who might find the issue after I wrote this comment would be to engage with the original post with a 👍 and consider leaving a comment with your use case. Having customer names attached to a feature helps us prioritize future backlog.

Hey! No problem, happy to help.  I actually wrote a bunch of code for it, but the topic cooled so I have been focussing on some other personal projects in my free time.  If this picks up traction again or you have anything other tickets in the roadmap you think I can help with feel free to ping me or tag me in the thread again.


half open range syntax updated.Because “..” not a binary operator

This directory hasn't been maintained for a long time, so it has been removed in 6155a79.


E2E: Use run! where applicable

Make the e2e specs use the raising run! method where applicable and remove the trailing expect(k.code).to be_zero.

And get rid of the .ruby-version and .ruby-gemset in the e2e directory

Yeah I don't know how that linking thing works.

Looks like there's more fallout from the leaked service, the service stop stop_signal set sets StopSignal for container is also missing run! for the kontena stack install --deploy
  3) service stop stop_signal set sets StopSignal for container
     Failure/Error: k.out.match("^(.+\/#{name})")[1]
     NoMethodError:
       undefined method `[]' for nil:NilClass
     # ./spec/support/container_helper.rb:26:in `container_id'
     # ./spec/features/service/stop_spec.rb:53:in `block (3 levels) in <top (required)>'

Why do the e2e specs keep failing with random IO errors?
(15/21) Installing ruby-libs (2.4.3-r0)
ERROR: ruby-libs-2.4.3-r0: IO ERROR
...
Service 'agent' failed to build: The command '/bin/sh -c apk update && apk --update add tzdata ruby ruby-irb ruby-bigdecimal     ruby-io-console ruby-json ca-certificates libssl1.0 openssl libstdc++' returned a non-zero code: 1
rake aborted!
Command failed with status (1): [docker-compose up -d agent...]

Needs merge.

Looks like it's passing now


[Story] Implement multiple views for Self-Staking and Community Staking

Closed by https://github.com/moonshotcollective/id-staking/commit/9243bddaecffc729d162ddf2805877b6adae5ca8


Create a top level Size for a Work

When I view a work I should see the total size of the files in a work

FileSet count & a count of Bytes in the Original File  content.

Service in CC that calculates Collection Size, so we can repurpose that for Work Size.


pip install deps error

I tried installing pymapd using pip and getting the following error:
ERROR: Could not find a version that satisfies the requirement pyarrow==0.15.0 (from pymapd) (from versions: 0.9.0, 0.10.0, 0.11.0, 0.11.1, 0.12.0, 0.12.1, 0.13.0, 0.14.0, 0.15.1, 0.16.0, 0.17.0, 0.17.1, 1.0.0)
ERROR: No matching distribution found for pyarrow==0.15.0 (from pymapd)

pip --version output:
pip 20.2.2 from c:\users\ytitov\appdata\local\programs\python\python38\lib\site-packages\pip (python 3.8)

What should I do in order to rectify the error?

After sifting through the issues I downgraded to python 3.7.9 which fixed the issue for me.


added serializer options

eg: \Redis::SERIALIZER_IGBINARY -> 2

Closing as conflicting and #199 seems like a better approach


test: update tests in the template modules

Description
Update tests in module template to use setupOptions
Types of changes in this PR
https://github.ibm.com/GoldenEye/issues/issues/4082
No release required

[x] Examples or tests (addition or updates of examples or tests)
[ ] Documentation update
[ ] CI-related update (pipeline, etc.)
[ ] Other changes that don't affect Terraform code

Release required

[ ] Bug fix (patch release (x.x.X): Change that fixes an issue and is compatible with earlier versions)
[ ] New feature (minor release (x.X.x): Change that adds functionality and is compatible with earlier versions)
[ ] Breaking change (major release (X.x.x): Change that is likely incompatible with previous versions)

Release notes content
Replace this text with information that users need to know about the bug fixes, features, and breaking changes. This information helps the merger write the commit message that is published in the release notes for the module.

Checklist for reviewers

[ ] If relevant, a test for the change is included or updated with this PR.
[ ] If relevant, documentation for the change is included or updated with this PR.

Merge actions for mergers

Merge by using "Squash and merge".

Use a relevant conventional commit message that is based on the PR contents and any release notes provided by the PR author.
The commit message determines whether a new version of the module is needed, and if so, which semver increment to use (major, minor, or patch).

Thanks for the PR - could you make same change to internal module template too please @iamar7 ?


[BUG] Bone is not applied correctly in the initial display of MilkShape 3D models

Is there an existing issue for this?

[X] I have searched the existing issues and none matched.

Operating System
Windows10 Pro
CPU
i5-7500 3.4GHz
GPU
GeForce GTX 1060 6GB
Storage
SSD
Game Version
4.12.0
Game Mode
dance
Theme
Inheriting the default theme and displaying Def.Model in ScreenTitleMenu
-- ScreenTitleMenu overlay.lua
SCREENMAN:SystemMessage('override theme')
local file = 'ball_anime.txt'
return Def.ActorFrame({
    FOV = 60,
    Def.Quad({InitCommand = function(self) self:Center():zoomto(400, 400):diffuse(0, 0, 0, 0.5) end}),
    Def.Model({
        Meshes = file,
        Materials = file,
        Bones = file,
        InitCommand = function(self)
            self:Center():zoom(100)
            self:rate(0)
        end,
    }),
})

Describe the problem
When I used OutFox to display the model that was output in "MilkShape 3D ASCII" format, the display was momentarily distorted, so I checked and found that Bone was not applied at the 0th frame (initial display)
The attached image shows the display of each version when the animation was not moved at rate(0)
Also, when the animation is looped, Bone is not applied at the moment of the loop

The model file is here https://firestorage.com/download/c92026c29a49c5e231510ad8e7bfb109ce86f4d5
Supplement:
This model file was output using the Export function of MilkShape3D 1.8.4
My guess is that the frame count for Bone starts at 1.000000, so Bone is not being applied at a timing less than 1
To test this, I rewrote the text file directly and changed the frame count to 0.000000, which eliminated the display collapse at the moment of looping
However, the initial display at rate(0) is still broken
Describe what should happen
Bone is applied even when the animation has not started at rate(0)
Also, Bone should always be applied during loop playback
Relevant Log output
No response

Could you reupload the model file? Firestorage has removed the file.

It seems that the uploader has expired.
I tried to attach the file directly.
ball_anime.txt

just fixed this, will be in next release.


Voucher offer is only applied to one single product in the basket

Issue Summary
When creating a voucher offer without "max affected items" set, it is still only applied to one single item in the basket.
Steps to Reproduce
I used the sandbox (https://latest.oscarcommerce.com/en-gb/dashboard) to create a new Voucher Offer that applied to all items, gives a $2 discount, and doesn't set a max affected items value.

I then created a voucher set with some vouchers. I added some items to my cart, and applied one of the vouchers.
The problem is that the total discount is only $2, whereas I would expect it to be $2 per item? After all, I didn't set "max affected items" to 1.

Technical details

Python version: 3.10.
Django version: 3.2.20.
Oscar version: 3.2.

This benefit's description was a bit misleading, I have updated the description here https://github.com/django-oscar/django-oscar/pull/3954. The discount is applied on the basket's total instead of applying on each product price.


Refs #20 add new prop flag to stop rebuild of dropdown when options c…

This isn't exactly elegant but it is probably the least of all the evils.
New prop added to stop reload of dropdown on option changes
Usage:
<semantic-form-dropdown :auto-update-options="false" \>

This is available in v1.2.2

Many thanks Brock


[BUG] Enabling watchdog in systemd makes maestral crash

Describe the bug
With version 0.4.1, everything works fine as long as I don't enable the watchdog.
I added this, as an override file in /run/user/1000/system/user/maestral.service.d/override.conf:
[Service]
WatchdogSec = 30s

And now maestral refuses to start:
Oct 22 21:59:54 dolores systemd[1126]: Starting Maestral - a Dropbox clone...
Oct 22 21:59:55 dolores systemd[1126]: Started Maestral - a Dropbox clone.
Oct 22 21:59:55 dolores maestral[5770]: Traceback (most recent call last):
Oct 22 21:59:55 dolores maestral[5770]:   File "/nix/store/vrllbj5ial3g70b2wd2bxmx01rxv32yw-maestral-0.4.1/lib/python3.7/site-packages/maestral/sync/daemon.py", line 119, in start_maestral_daemon
Oct 22 21:59:55 dolores maestral[5770]:     m = ExposedMaestral(run=run)
Oct 22 21:59:55 dolores maestral[5770]:   File "/nix/store/vrllbj5ial3g70b2wd2bxmx01rxv32yw-maestral-0.4.1/lib/python3.7/site-packages/maestral/sync/main.py", line 255, in __init__
Oct 22 21:59:55 dolores maestral[5770]:     self.update_thread.start()
Oct 22 21:59:55 dolores maestral[5770]:   File "/nix/store/8lhmyjarm73453f2mdz0xli9w8sy0wvh-python3-3.7.4/lib/python3.7/threading.py", line 848, in start
Oct 22 21:59:55 dolores maestral[5770]:     raise RuntimeError("threads can only be started once")
Oct 22 21:59:55 dolores maestral[5770]: RuntimeError: threads can only be started once

To Reproduce
Add watchdogsec to service.
Expected behaviour
For it to not blow up.
A clear and concise description of what you expected to happen.
System (please complete the following information):

Maestral version: 0.4.1
OS:
system: "x86_64-linux"
host os: Linux 5.3.7, NixOS, 20.03.git.c02c4775b40M (Markhor)
multi-user?: yes
sandbox: yes
version: nix-env (Nix) 2.3.1
channels(root): ""
channels(peter): "home-manager"
nixpkgs: /home/peter/src/active/nixpkgs_unstable
Desktop environment: KDE Plasma 5.16
Qt version: 5.12.3

For it to not blow up.

That is a fair expectation. I will have to look into that.

A conversion error from usec to sec when calculating the interval for notifications.

Both are fixed in the development branch.

fixed in v0.4.2


'f' keyboard shortcut for full screen

It would be great if 'f' was a keyboard shortcut for toggling full screen, just like on youtube etc.

Similarly related to #220.

Most browsers have a built-in full-screen mode, which get activated when you hit F11. What's the difference between that OP's feature request?

Probably nothing, but browsers have not standardised on F11, and due to the popularity of sites like YouTube, plenty of people (even if not the majority) would expect F to work.

I'm gonna rule that this was now excellently implemented by #712 and this can be closed as a duplicate.
Note that #712 implemented the PowerPoint-standard F5 instead of f.


Design: onyo get --match should be able to do >/<

This is split out from #361.
onyo get should be able to do the following comparisons:

<
>
<=
>=

It should use natsort's sorting (which uses the locales COLLATE). This also matches the behavior added to the 2024 POSIX spec.
The question is the CLI syntax itself:
onyo get --match cpu.cores<4

Shell interprets 3/4 of the above symbols as redirection, so they have to be quoted:
onyo get --match 'cpu.cores<4'

The above syntax no longer always has = as a delimiter. Which makes determining what we're telling onyo to do more complicated.  = is already implicitly disallowed in the keyname (see #718), so the weirdest we can get is:

weird<key=weird>=value

I propose extending the protected characters list in the keyname to include < and > (for a total of ., =, <, and >.)
At that point, the weirdest onyo will see is:

key><weird>=<value

I propose the following logic:

find the first >, <, or =

if =, check if the preceding character is < or >

this determines the comparison mode

split and/or trim accordingly

Note:
I strongly prefer suffixing the equals sign (e.g. <= and >=) rather than prefixing.

everyone does it this way
it matches how one says it in english "greater than or equal"
I am generally against reducing characters in the value, but am ok with reducing characters in the key to reduce complexity.
reduce ambiguity in the situation key=<unset>

Barely related, if onyo is passed a tag (such as <nope>) that is not an onyo-reserved tag (such as <unset>, <list>, etc), should onyo warn? This would only be the case if the entire value is a tag, not just a substring. If so, an issue should probably be opened for that.

Barely related, if onyo is passed a tag (such as ) that is not an onyo-reserved tag (such as , , etc), should onyo warn? This would only be the case if the entire value is a tag, not just a substring. If so, an issue should probably be opened for that.

I already proposed to reserve anything enclosed in < and > to be special (labels and variables). So, I think while no characters should be strictly forbidden in values, they must not start with < and end with >.
So, that wouldn't pass validation and we error when we encounter such a thing that is unknown.

I already proposed to reserve anything enclosed in < and > to be special (labels and variables). So, I think while no characters should be strictly forbidden in values, they must not start with < and end with >.

I am generally ok with this, but it means that values cannot contain XML/HTML.
The following would run afoul of the proposed rule:
html:
Some HTML content.

I think what we're actually imagining is a more explicit regex: ^<[^<>]+>$

starts with < and ends with >
does not contain < or > anywhere else


undefined method `blog' #Middleman::CoreExtensions::Data::DataStore

I was wondering if middleman-blog is supposed to work with middleman 3.0.
After a quick look, it doesn't seem to register properly. I wanted to ask before diving into the code.
(I'm using repositories directly, not gems).
Thanks!

In that case, I'll wait patiently. Thanks for the info.

Any progress on that?

I would love to use it and even fix it. I might need some help to do that.
Master does not work for me and raises same error. Oddly enough middleman server and middleman build behave differently. middleman server works most of the time.

There is some basic work on this repo's master branch in addition good test coverage. That will be very important for making things rock solid in the 3.0 release.
I'd love to help out, but I'm totally busy for the next 2 weeks. Then I'll come back and get things moving again.

+1
@tdreyno, I'm curious to know what commit you have middleman and middleman-blog checked out to.

Not sure, haven't posted a blog entry in a couple months.
3.0 is nearing the end of the beta, so hopefully we'll get blog synced up and released in April.


feat: Allow integration team to delete snapshots

Users are increasingly running into issues with their snapshot quota and the integration team is currently best suited too recognize these issues as they occur.  Giving the integration team permission to delete snapshots across all namespaces will decrease customer complaints and prevent them from having to recognize and resolve the issue themselves. Once Snapshot GC has been implemented this permmission can be revoked.

/lgtm

/lgtm
/approve

This change is failing to deploy on staging and production, the reason is one comment was not addressed: #3035 (review)

Looks like there was a push issue.  I've fixed it in #3038


Nutstore install is not detected

Create issues related to the winget.exe client here

Brief description of your issue

Installed Nutstore is not detected.
Steps to reproduce

winget install Nutstore.Nutstore
winget list

Expected behavior

Nutstore                                          Nutstore.Nutstore            5.2.4

Actual behavior

Nutstore                                          {DD8D8D7A-337E-4577-8B20-46AAB38CAED4}            5.2.4

Environment
Windows Package Manager v1.0.11451

Windows: Windows.Desktop v10.0.19043.1023
Package: Microsoft.DesktopAppInstaller v1.11.11451.0

#16410 Should fix this, do you speak Chinese? Would you mind creating a Chinese Locale for it?
Chinese - Taiwan / zh-TW
Chinese - People's Republic of China / zh-CN
Chinese - Hong Kong SAR / zh-HK
Chinese - Singapore / zh-SG
Chinese - Macao SAR / zh-MO

Nutstore.Nutstore.locale.zh-CN.yaml
# yaml-language-server: $schema=https://aka.ms/winget-manifest.locale.1.0.0.schema.json
PackageIdentifier: Nutstore.Nutstore
PackageVersion: 5.2.4
PackageLocale: zh-CN
Publisher: Shanghai YiCun Network Tech Co., Ltd.
PublisherUrl: https://www.jianguoyun.com
PublisherSupportUrl: http://help.jianguoyun.com
PrivacyUrl: http://help.jianguoyun.com/?page_id=3961
Author: Shanghai YiCun Network Tech Co., Ltd.
PackageName: Nutstore
PackageUrl: https://www.jianguoyun.com
License: Proprietary
LicenseUrl: https://help.jianguoyun.com/?page_id=490
Copyright: © 2020 Shanghai YiCun Network Tech Co., Ltd.
CopyrightUrl: https://help.jianguoyun.com/?page_id=490
ShortDescription: Share your files anytime, anywhere, with any device
#Description:
Tags:
  - cloud
  - storage
  - cloudstorage
  - jianguoyun
  - jgy
ManifestType: locale
ManifestVersion: 1.0.0

These most stay the same
PackageIdentifier
PackageVersion
Publisher
PackageName

Yes I'm glad to help. But I'm not sure what I need to change. Could you point me somewhere, like documentation on this?
Do I just update update the name to Chinese and the link to point to a Chinese download?

How does this look?
# yaml-language-server: $schema=https://aka.ms/winget-manifest.locale.1.0.0.schema.json
PackageIdentifier: Nutstore.Nutstore
PackageVersion: 5.2.4
PackageLocale: zh-CN
Publisher: 上海亦存网络科技有限公司
PublisherUrl: https://www.jianguoyun.com
PublisherSupportUrl: http://help.jianguoyun.com
PrivacyUrl: http://help.jianguoyun.com/?page_id=3961
Author: 上海亦存网络科技有限公司
PackageName: 坚果云
PackageUrl: https://www.jianguoyun.com
License: Proprietary
LicenseUrl: https://help.jianguoyun.com/?page_id=490
Copyright: © 2020 上海亦存网络科技有限公司
CopyrightUrl: https://help.jianguoyun.com/?page_id=490
ShortDescription: Share your files anytime, anywhere, with any device
#Description:
Tags:
  - cloud
  - storage
  - cloudstorage
  - jianguoyun
  - jgy
ManifestType: locale
ManifestVersion: 1.0.0

Yes I'm glad to help. But I'm not sure what I need to change. Could you point me somewhere, like documentation on this?
Do I just update update the name to Chinese and the link to point to a Chinese download?

Hmm, as far as i know there is no straight documentation on locales, https://aka.ms/winget-manifest.locale.1.0.0.schema.json this is the schema link to the metadata that can be in the language locale.
If there is a specific link to the Chinese Installer it can be added in the installer manifest like this:
Installers:
  - InstallerLocale: zh-CN
    Architecture: x64
    InstallerType: exe
    InstallerUrl: https://www.jianguoyun.com/static/exe/installer/NutstoreWindowsWPFInstaller.exe
    InstallerSha256: 1D47A0F46A9B48E5CE595C392DAD2DAA0D41FF195F07E1EC5A14C8D55CA3F46A
    InstallerSwitches:
      Custom: /exenoui
      Silent: " "
      SilentWithProgress: " "
    ProductCode: "{DD8D8D7A-337E-4577-8B20-46AAB38CAED4}"
    Scope: machine
    UpgradeBehavior: install

The Nutstore.Nutstore.locale.zh-CN.yaml metadata will be used in WinGet if the user have selected zh-CN as their preferred locale.
So if the Chinese Installer have a different Publisher in Windows that will help to match the program to WinGet, or if the site have a version of the website that is only in Chinese then the PublisherUrl, PublisherSupportUrl, PrivacyUrl, PackageUrl, LicenseUrl and CopyrightUrl should point to the Chinese version of the Website.
The Author, License, ShortDescription and Description can be written in Chinese so only Chinese speaking people can search and understand what it means/does.
Tags can be in Chinese so its easier to find for Chinese people or if they have other words for it.


Attempts to fix update_change_reason for nullable JSONField fields (issue #1181)

Description
As reported in issue #1181, the implementation of the utility update_change_reason() method does not work for models with a nullable JSONField. This is caused by the slightly more convoluted querying mechanisms that has to be applied for JSONFields, please cf. here: django dev documentation
This attempts to fix this by checking

if a field is a JSONField
is nullable
and then using different query language, depending on the null status of the field in question.

The strategy assumes that

a nullable JSONField with a value of None is not set at all
a non-nullable JSONField with a value of None is actually a "NULL" dictionary

Note: I am aware that this is not the only way to handle this. But it is the convention I am using in my project and this fixed the issue for me. It may be worthwhile to implement a policy switch to decide how to interpret None in this specific case.
Related Issue

This attempts to fix issue #1181

Motivation and Context
I did run into the same issue as the original reporter of the bug report and was stuck. The fix, while admittedly maybe not yet fully universal, depending on the interpretation of a "nullable" JSONField, did solve the issue for me
How Has This Been Tested?
Tested using my local installation. No unit test implemented but this can be done, if required
Types of changes

[x ] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

[] I have run the pre-commit run command to format and lint.
[ ] My change requires a change to the documentation.
[ ] I have updated the documentation accordingly.
[x] I have read the CONTRIBUTING document.
[ ] I have added tests to cover my changes.
[ ] I have added my name and/or github handle to AUTHORS.rst
[ ] I have added my change to CHANGES.rst
[ ] All new and existing tests passed.

Sorry, I had some issues with running the pre-commit hooks on my development machine as I do not have a python 3.8 environment available.
[INFO] Installing environment for https://github.com/psf/black.
[INFO] Once installed this environment will be reused.
[INFO] This may take a few minutes...
An unexpected error has occurred: CalledProcessError: command: ('/home/martin/.virtualenvs/ps_sps_users/bin/python', '-mvirtualenv', '/home/martin/.cache/pre-commit/repo5rnoh46q/py_env-python3.8', '-p', 'python3.8')
return code: 1
stdout:
    RuntimeError: failed to find interpreter for Builtin discover of python_spec='python3.8'
stderr: (none)
Check the log at /home/martin/.cache/pre-commit/pre-commit.log

I did locally modify the commit hooks to use python 3.11 and everything seemed to work but now my local branch contains this change to the pre-commit hooks and everything is a bit of a mess.
I am in a hurry but may have time to run again later next week on an older machine with python 3.8, any suggestions or pointers on how to handle this in a less awkward fashion would be highly appreciated!


Starts training from specific checkpoint

Hello and happy Friday,
I couldn't find these topics in the documentation so some clarification would be appreciated.
When adding new videos to an existing project,

Is it possible to label novel videos using the current model or do we still need to label frames?
Is it possible to continue training from an existing checkpoint?

Thank you very much for your work!

Hi @NgD-Huy, thanks for the questions.

can you clarify what you mean by "label novel videos" - you mean as a human, or if the model can label novel videos? If you're asking about the model, yes absolutely once you have a trained model you can run inference on any new video you wish; see docs here: https://lightning-pose.readthedocs.io/en/latest/source/user_guide/inference.html

yes! in the config file, under the "model" section, add a new parameter named "checkpoint", and set the parameter to the absolute path of whatever checkpoint file you want

config.yaml:
model:
  checkpoint: /path/to/model.ckpt

I will make sure to update the documentation to include this info!

That answered all of my questions! Thank you very much!

closed by #147


Routing use case 2 for OD pairs (more OD pairs, routed less often)

- Every Tuesday: 08.30, 13.00, 17.00 (=3 queries)
- Every Saturday: 13.00 (=1 query)
-This will only run in selected months. One option would be to pre-program which months it will run in. Alternatively I can do some mass disabling, as long as use case 1 and 2 are distinguished in the data structure so I can target use case 2 only
- Always route by mode = driving.  **Also route by mode = walking and mode = cycling if day of month** <=7 (i.e. do walking and cycling just the first Tuesday+Saturday of the month).
-
- These will be different sets of OD pairs to those in use case 1.  It would be nice if the two use cases could EITHER be kept completely distinct, with separate runs and journeys tables for each ; OR for you to add in a field that specifies usecase , and can take values 1 and 2.

I've altered the Tue infrequent running to be at 08:30 and 17:30 (as it is easier if they run at the same minuet) instead of 08:30 and 17:00.  08:15 and 17:15 would be fine, let me know if that is a problem

I've also added mode to runs so you can differentiate between the driving, cycling and walking routing.

I've altered the Tue infrequent running to be at 08:30 and 17:30 (as it is easier if they run at the same minuet) instead of 08:30 and 17:00. 08:15 and 17:15 would be fine, let me know if that is a problem

Is this a typo? I asked for 08.30, 13.00, 17,30.... sp 08.30 and 17.30 not an alternation but perfect :) but if you are running other times could it be these, it makes it neater methodswise as one is at the exact midpoint time

I've kept 13:00 unchanged but the others (8 & 17) are easier if they have they run at the same minute, e.g 15 or 30 (or 00)
-------- Original Message --------
On 15 May 2021, 14:57, AnnaGoodman1 < @.***> wrote:

I've altered the Tue infrequent running to be at 08:30 and 17:30 (as it is easier if they run at the same minuet) instead of 08:30 and 17:00. 08:15 and 17:15 would be fine, let me know if that is a problem

Is this a typo? I asked for 08.30, 13.00, 17,30.... sp 08.30 and 17.30 not an alternation but perfect :) but if you are running other times could it be these, it makes it neater methodswise as one is at the exact midpoint time
—
You are receiving this because you modified the open/close state.
Reply to this email directly, view it on GitHub, or unsubscribe.

Right so as you mentioned we are already storing  the cycling and walking distances in the distances table.  This will happen for any journey that doesn't have a cycling and walking distance BUT it only happens once, not once per month.

Are you wanting it to happen 4 times (Tue * 3 and Sat * 1) per month? I'm not sure the distances will change but I guess they might.
Do you want me to edit the code to only get the cycling and walking distances for infrequently_routed journeys or are you happy with frequently_routed journeys also having distances?

ok great. Though I need some help writing the SQL code to save for the distances file as a csv, for some reason I wasn't able to.

Hmm.  we don't expect them to change usually except I guess they might 1) if a new footpath or bridge is built, or 2) because Google changes its algoritm, or 3) Google routes bicycles differently during rush hour, e.g. to avoid busy sections – I'm not sure if it does this or not.  So I think ideally it would happen 4 times per month  (Tue * 3 and Sat * 1) , along with date and timestamp. Though NB only in the months where infrequently_routed journeys are happening.

It is not a big problem for all journeys to have the distances in there, but possibly a little better if only infrequently_routed . So change if easy, leave if not


request: flex align-items icon

appreciate for previous work #46 it's help me a lot ,but now now some new probelm appear. icon pack can't find a suitable icon to express flex 'align-items'.could implement it in spare time

https://css-tricks.com/snippets/css/a-guide-to-flexbox/  this link may help to invention

https://css-tricks.com/snippets/css/a-guide-to-flexbox/  this link may help to invention

Have you looked into using the new align left, center, right, etc. icons for flex properties like align-items and justify-content?
They pretty much match previous align-items icons graphically.

Have you looked into using the new align left, center, right, etc. icons for flex properties like align-items and justify-content?
They pretty much match previous align-items icons graphically.

Have you looked into using the new align left, center, right, etc. icons for flex properties like align-items and justify-content?
They pretty much match previous align-items icons graphically.

yes,i'm worried about user may confused same icon display but different behavior will action, these icon maks some different may better.
here is a gif the 1st buttons control justify-contents(control each item how to order each other),2st buttons control align-items(control all item how to align parent container)

Have you looked into using the new align left, center, right, etc. icons for flex properties like align-items and justify-content?
They pretty much match previous align-items icons graphically.

yes,i'm worried about user may confused same icon display but different behavior will action, these icon maks some different may better.
here is a gif the 1st buttons control justify-contents(control each item how to order each other),2st buttons control align-items(control all item how to align parent container)

@joebnb justify-content can be done with align top icon and align bottom icon in your case. There's also two sets of align center, stretch, space-between, etc. icons for different orientations, so what you are doing should be possible with existing designs.

@joebnb justify-content can be done with align top icon and align bottom icon in your case. There's also two sets of align center, stretch, space-between, etc. icons for different orientations, so what you are doing should be possible with existing designs.

align bottom and top used in vertical mode.
i found on your site https://modulz.app/ we are doing pretty much same thing in different country😀

align bottom and top used in vertical mode.
i found on your site https://modulz.app/ we are doing pretty much same thing in different country😀


Create AS-StealthDefend.yaml

Change(s):

New parser

Reason for Change(s):

New parser

Hi @AcceleryntSecurityDev,
Yaml file validation failures please check below error.

It is not possible for me to make changes to this forked branch until I become a contributor. Please send me an invitation link for contribution by going to Settings and looking for contributor.

@v-atulyadav I removed the whitespace at the end of the file. Waiting to see if the new checks pass... It looks like you are already a contributor:

If this is not the case, am I looking in the right place, in the repository settings? https://github.com/Accelerynt-Security/Azure-Sentinel/settings/access
I cannot find anything about adding contributors. Which endpoint should I be looking under? i.e.: /settings/[endpoint]

Hi @AcceleryntSecurityDev, I will check this. Thanks

Hi @AcceleryntSecurityDev, I will check this. Thanks

Hi @AcceleryntSecurityDev,
I am still facing issues with pushing this branch. I have modified the file to pass validations. Please extract the zip file below and push the attached file to the PR.
AS-StealthDefend.zip

@v-atulyadav changes have been made, thank you


ldap-contacts-suggestions: Allow anonymous ldap_bind()

RainLoop version, browser, OS: 1.12.1, Firefox 60, Debian 9
Expected behavior and actual behavior: If access_dn parameter is left blank, the plugin does not try to connect to LDAP using anonymous bind and many universities have allowed that with a limited set of attributes, including mail, login, telephphoneNumber.
Steps to reproduce the problem: Left  access_dn empty, configure all the rest, try to have auto-complete, nothing happens.
Logs or screenshots: There is no particular log output during autocomplete because in index.php, MainFabrica, case suggestions, all code is skipped if access_dn if empty.
Pull request will be attached. Works for me, but further testing should be done.
Regards,

See PR #1804


Updated copyright, licenses

First two PRs made only by using IDEA's inbuilt functions "Optimize imports" and "Update copyright" applied to project scope, third one made manually.

Hooray Jenkins reported success with all tests good!

Optional fourth commit may follow if wanted, that might contain IDEA's inbuilt "Reformat code" output.

Lets get this merged before any conflicts pop up - amazed they haven't already with this many files affected, but cool! Thanks :-)


command 'test' not found

I posted this issue before as well, someone has closed this before I provide more details.
One more time -- My issue is when I tried to copy paste something it gives me an error at bottom right side called "command 'test' not found".
I uninstalled VSCODE 2-3 times no luck.
I also don't have anything under my user's extension folder -- C:\Users\Hardik-pc.vscode\extensions.
Here is how you can reproduce this issue.
Step 1:
Create sample file called sample.php
Step 2:
Put this line -- echo "Sample file"
Step 3:
try to copy line by pressing CTRL+c
Step 4:
try to paste in next line -- under the notification window, It's saying "command 'test' not found.
FYI -- I am using Windows 8.
Hope I explained it very well.

It sounds like you might have a keybinding set up for a command named 'test' that doesn't exist. Can you check your keybindings?

It was keybinding, I don't how it gets there, I removed it and working just fine now.
Thank you, you can close this now.


Cutover from old to new UI repos

Background
Deploy the new frontend repos and configure our current domains to point to the new deployments.
Definition Of Done
We need to check feature parity between the deployments since the new repos have been migrated to Typescript.
Tasks

[ ] QA feature parity: https://www.notion.so/connext/Connext-UIs-Feature-Parity-QA-52bbb3ce18e042d78e029e1d565c4fc7?pvs=4
[ ] CI to vercel (feat/ branches create staging links, main deploys different environments automatically)
[ ] Replay all new commits from old repo to new repo
[ ] Configure domains in new deployments

QA doc ready. Enlisting Kate's help with running through test cases in preparation for the cutover.

Changes to new UI

Latest env along with messages
Blast changes
https://github.com/CoinHippo-Labs/connext-bridge/commit/22f473b5218a76dd8414038336a357964b0030e8 (WETH as default asset)
New time estimates
Remove tokens grouping
https://github.com/CoinHippo-Labs/connext-bridge/commit/a7654dce3e1aff8b2099120e206ada8d73a88e8d (New messaging)
Latest SDK version migration
New twitter link https://github.com/CoinHippo-Labs/connext-bridge/commit/82dbf0aadf87262e45ff70947928c2c3a4643c92
Unhide scroll bar https://github.com/CoinHippo-Labs/connext-bridge/commit/21a598216e6e2f9b5d140be34dedb0c59c7a39bb
Latest RPCs
Adding faucets: https://github.com/CoinHippo-Labs/connext-bridge/commit/74dbc6487029b834931b62a2959aaef4afc14b74
Add lower staticPaths https://github.com/CoinHippo-Labs/connext-bridge/commit/949b8ad301bae5b589adb2e26eb340581de5b00e

https://github.com/connext/frontend/pull/7


Fixes + lint

use proper shebang for portability
tempfile is deprecated, use mktemp
compare output of command directly
read with -r to prevent mangling
concatenate properly with * instead of @
escape quote the eval line (this tool didn't work for me without this)
double quote all variables where appropriate

merged #11 since idk if this will ever get merged to origin


Don't delete the i3 config version hint

The line
# i3 config file (v4)

gets deleted by i3bang because it's a comment. However, this is a hint that is actually used by i3 and should not be removed.

Should be fixed in latest commit.


Get rid of watchman

Having a dependency on Watchman requires the user to install two things. It's a hurdle, and it slows down adoption. We would be better off if we could find a suitable alternative that can be installed with NPM.
Describe alternatives you've considered
There is the popular https://github.com/paulmillr/chokidar project. However, I'm not sure if it is efficient across all platforms. It must use native bindings on Linux and Mac in order to be suitable. That is, inotify on Linux, and fswatch on Mac. Also there's Windows... Needs to be investigated.

Hey, @Seke1412 @AnatoliyZhurilo, would any of you be interested in taking a swing at this?

I think i can help on Mac with fswatch, meanwhile i have very little knowledge on Linux distro about inotify, and so far have no idea about native solution for Window @_@

Well, I can check it

Let me try on Mac.
@mikabytes , i found that watchman come along with hotserve, i will start from hotserve, how do you feel?

Ah, yes, Tiden offloads its serving stuff onto hotserve (one of my personal projects) which takes care of all those things. So this fix needs to be done there. True, true.
Hotserve is also open-source, so feel free to submit a PR there. Then @AnatoliyZhurilo and @Seke1412 can both take a stab at testing it on the various platforms!

This was fixed by mikabytes/hotserve#2


Do not delete patch folder below target

Removing the patch folder below target at every run makes patch fail as the replace source does not exist anymore

Should be fixed with fed8b7c8ec576e5c248e40e3fc6439515fc18d2a


Problem with re-display of boolean form components

After a boolean UI component (checkbox or toggle switch) is changed, the value is not correctly displayed the next time the page is shown.
Sample scenario:

view Connector advanced properties, 'Drop slot on stop' - is initially false
Set 'Drop slot on stop' = true and validate
Proceed to Review page - the property is 'true' (correct)
Click back to see the connector advanced properties - now the display shows 'Drop slot on stop' as 'false'
Go back to Review page - the underlying value is actually 'true'

After being changed, the boolean component display is out-of-sync

Realized this issue is a duplicate of #175 - closing this one


Implementation of shot adaptative optimizers

Implementation of the CANS and iCANS optimizers, introduced in https://arxiv.org/abs/1909.09083v3. These adapt the number of shots required to compute the gradient at each step of the classical optimizer.
TO DO

[x] Shot Adaptive optimization methods:

[x] CANS optimizer
[x] iCANS optimizer

[x] Check if they are working properly
[x] Derivative functions: gradient with variance

[x] finite_difference
[x] grad_spsa
[x] param_shift
[x] stoch_param_shift

[x] Check the gradient functions are working correctly
[x] Allow in all simulators .get_counts(n_shots=n_shots):

[x] 'qiskit.qasm_simulator'
[x] 'qiskit.shot_simulator'
[x] 'qiskit.statevector_simulator'
[x] 'vectorized'
[x] 'pyquil.statevector_simulator'

[x] Allow in all shot-based simulators .expectation(n_shots=n_shots) and .expectation_w_uncertainty(n_shots=n_shots):

[x] 'qiskit.qasm_simulator'
[x] 'qiskit.shot_simulator'

[x] Allow all QPUs to change the number of shots from the optimizer

[x] braket
[x] pyquil
[x] qiskit

[x] n_shots_budged should also take into account the shots used for the cost evaluation
[x] Add tests for the optimizers
[x] Add tests for the optimizers with a budged n_shots
[x] Add tests for the plot function qaoa.results.plot_n_shots()
[x] Add test for the derivative_functions; they allow computing the variance
[x] Add test for all the .get_counts, .expectation functions to allow n_shots (local)
[x] Add test for all the .get_counts, .expectation functions to allow n_shots (QPUs)
[x] Documentation
[x] Check if the test for QPUs is working and make them not fail in GitHub.
[ ] Run the test for AWS

Questions

[x] for QAOABaseBackendStatevector, should we be able to change n_shots for .expectation method?
[x] 'qiskit.shot_simulator' and 'qiskit.qasm_simulator' are exactly the same?
[ ] add a n_shots_budged for all optimizers?
[ ] add the possibility to use different n_shots when computing gradient or the cost function in all optimizers?
[ ] Explain somewhere about the shot adaptive optimizers? In some Notebook?

[ ] @shaohenc will run .get_counts(n_shots = x) in a QPU for PyQuil, to check that the number of shots changes as expected in Rigetti's QPUs.


build issue with Python 3.5.1

Hello!
When I try to do a "pip install --user gippy" in Python 3.5.1, I receive the following error:

python3.5m -c gippy/gippy_wrap.cpp -o build/temp.linux-x86_64-3.5/gippy/gippy_wrap.o -fPIC -O3 -std=c++11 -D GDAL2 -Wno-maybe-uninitialized
gippy/gippy_wrap.cpp:5040:34: fatal error: python2.7/Python.h: No such file or directory
#include <python2.7/Python.h>

Can you provide any assistance into why the pip package is looking for python2.7/Python.h instead of python3.5/Python.h?

A workaround is to install the python to development package which includes that header file.

A workaround is to install the python2 development package which includes that header file.

Thank you for your reply! I was able to get it installed using the following syntax:
pip3 install --user --global-option=build_ext --global-option="-I/path/to/python/2.7.15/include" gippy

A workaround is to install the python2 development package which includes that header file.

Thank you for your reply! I was able to get it installed using the following syntax:
pip3 install --user --global-option=build_ext --global-option="-I/path/to/python/2.7.x/include" gippy


Fix bootstrapping on windows

resolves #391

bootstrap on windows was broken as a working symlinking was assumed
rebars git module had several incompabilities

calling wc
calling fgrep
quotes that did not work

this now builds on my Win 7 machine

Great, these changes look good to me, +1. @ferd ?

Looks good from the source aspect, but Travis dies.

just to keep track of it: common tests on windows still fail (a lot), this just enables basic bootstrapping, but a follow up pr cleaning up the test errors is necessary before windows compatibility can be claimed again

I made a fix (removing use of rebar_dir function in bootstrap) and made a PR to see if it passes travis, https://github.com/rebar/rebar3/pull/400

closing in favor of #400


Error: error parsing BPF object: error parsing ELF data

I written an aya program (https://github.com/cppcoffee/rust-memleak) , after compiling with cargo build it generates ./target/debug/rust-memleak. When running it independently, an error occurs:
# ./target/debug/rust-memleak -p 1
Error: error parsing BPF object: error parsing ELF data

Caused by:
    error parsing ELF data

An error returned by aya::Ebpf::load:
https://github.com/cppcoffee/rust-memleak/blob/main/rust-memleak/src/main.rs#L71-L74
How to fix it?

Print path:
println!("{}", concat!(env!("OUT_DIR"), "/rust-memleak"));

got empty file:
# cargo build
   Compiling rust-memleak v0.1.0 (/root/rust-memleak/rust-memleak)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.18s

# ./target/debug/rust-memleak -p 1
/root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak

# ll /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak
-rw-r--r-- 1 root root 0 Oct 29 12:28 /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak

If run cargo xtask run -- -p 1, output path /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak.
# file /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak
/root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak: ELF 64-bit LSB relocatable, eBPF, version 1 (SYSV), not stripped

# ll /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak
-rw-r--r-- 1 root root 4304 Oct 29 12:51 /root/rust-memleak/target/debug/build/rust-memleak-8e9cd2b9f1bb3c75/out/rust-memleak

Why does cargo build not generate the ebpf included in the application?

I see, first cargo xtask run to generate the ebpf object, then cargo build to generate the correct application!

cargo xtask run --release

How to compile an application that contains an ebpf object？

cd rust-memleak-ebpf
cargo build
cd ..
cargo build

or alternatively
AYA_BUILD_EBPF=true cargo build

Thank you.


Added an integration test for plugin Installation

Hey! Great job with the plugin!
I have recently added integration tests to the standard repository that ensure that the plugins install as expected. I have created a PR for your repository with the similar integration test. As I am not an admin here I can't trigger the workflow but it works like - https://github.com/h4ck3rk3y/Auto-GPT-Crypto-Plugin/actions/runs/4959559330/jobs/8873833979?pr=1
if you(author) create a PR or someone else creates a PR it will try running that branch against Auto-GPT to ensure that the plugin works as expected
Disclaimer - I am working on a tool called Kurtosis! The same tool that is used in the ci.yml I added. With Kurtosis running AutoGPT is as simple as -
kurtosis run github.com/kurtosis-tech/autogpt-package --enclave autogpt '{"OPENAI_API_KEY": "YOUR_API_KEY_HERE", "ALLOWLISTED_PLUGINS": "AutoGPT_YouTube"}'
kurtosis service shell autogpt autogpt --exec "python -m autogpt"
Kurtosis takes care of downloading the plugin for you & setting up the backend (you could have passed in"MEMORY_BACKEND": "weaviate" and we would have spun it up for you)
Here is our AutoGPT-Package
Adding support for a new plugin to Kurtosis is as simple as adding a line here

I never used this before, is there anything else to do now? And how to exactly use it?


Remove version: OpenJS.NodeJS.LTS version 20.9.0

Replaced by another Pull Request
Microsoft Reviewers: Open in CodeFlow

https://www.github.com/microsoft/winget-pkgs/pull/143386#issuecomment-1986949152 [Policy] Needs-Author-Feedback

Close with reason: See discussion in above linked issue;


mol V3000: multicenter dative bond

Is your feature request related to a problem? Please describe.
I try to read and use molecular complexes where the ligand have hapticity higher than 1 (ferrocene), and keep track of the bonds
I write the structures as multi-center dative bonds, but the information is ignored by RDKIT that interprets the complex as a two-fragment molecule, with dative bond from a dummy atom to the metal
Describe the solution you'd like
I would like to have the the bonds between metal and donors in the bond list, and the neighbor list of all atoms correctly accounted for.
I would also have a molecular or atomic property to know which atom is part of which multicenter group, and to which atom they bond.
Iwould like to create this with molraw if necessary,
and write back a molfile, and extract a bound smiles (how?)
Describe alternatives you've considered
explicitating in the drawing a dative bond for each donating atom: chemist would not do it in the long term.
Additional context
an example:
Mrv2115<PHONE_NUMBER>2D
0  0  0     0  0            999 V3000
M  V30 BEGIN CTAB
M  V30 COUNTS 4 2 0 0 0
M  V30 BEGIN ATOM
M  V30 1 C -15.3748 8.1666 0 0
M  V30 2 C -14.0411 7.3966 0 0
M  V30 3 Pd -16.5831 5.2082 0 0
M  V30 4 * -14.708 7.7816 0 0
M  V30 END ATOM
M  V30 BEGIN BOND
M  V30 1 2 1 2
M  V30 2 9 4 3 ENDPTS=(2 1 2) ATTACH=ALL
M  V30 END BOND
M  V30 END CTAB
M  END

Closed in #6139


DBZ-5772 Add jetstream sink implementation

This PR adds a sink implementation for jetstream: https://docs.nats.io/nats-concepts/jetstream
Users are able to control if the sink should create a basic stream or not. If not a stream has to be configured with nats-cli.
Jetstream Documentation: https://docs.nats.io/nats-concepts/jetstream

@Skezzowski Applied, thanks a lot!


Actively maintained

The last update was in 2022, and the last reply by the dev was on Jan 31st of this year. This gives me the impression this extension is not actively maintained anymore, or it could be abandonware.
Could you please tell me what the status is?

hi, it achieves intended functionality for the original needs it was designed to meet, maintenance is mostly done on a bugfix basis or addressing version incompatibilities, thanks!


URLs get emoticon encoded

So, I stumbled over a bug in the nclst-emoticon-modifier.
https://example.org?dl=0
When fed an url like this, the =0 becomes an emoji like this https://www.example.org?dl😮. I was trying to repro on the emoticon-modifier repo and realized that this only happens when the plugin is added with .useFirst instead of .use (and the tests are using use). I really don't know much about the difference of these two in the parser and so it's hard for me to find the right fix.
with .useFirst  I get
{"type":"EmoticonNode","value":"=0" }
and .use I get
{"type":"SymbolNode","value":"="},{"type":"TextNode","value":"0"}
Should I try fixing it for the useFirst use case, or should we change retext-emoji to not use useFirst for the emoticon ones?

@wooorm let me know what you would prefer :) as I'd like to fix it. I just want to make sure it'll be inline the rest, since you are the owner of these!

@dozoisch Hey hey, sorry for the late reply!
I think there was a reason for .useFirst instead of .use, I believe other emoji/tests will fail if .use is used. Did you try that?
If it works perfectly, I guess we can do it, otherwise we should look for an alternative.

Perfect, I'll look into it :)!