Added Google Cloud Pubsub support for data records

Description
Adding Google Cloud Pubsub support for data records, currently just a minimal implementation
Motivation and Context
We are using Google Cloud Pubsub and needed something native for data records
How Has This Been Tested?
running make with all tasks, passed all tests and started flagr server
Types of changes

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

Checklist:

[x] My code follows the code style of this project.
[ ] My change requires a change to the documentation.
[ ] I have updated the documentation accordingly.
[ ] I have added tests to cover my changes.
[x] All new and existing tests passed.

I need some help regarding the tests, I added test coverage to pubsub but now the data_recorder_test.go fails, I don't really understand how it passed before because it used the same NewPubsubRecorder() function when calling GetDataRecorder().
I can see that we use in all data recorders with their production functions without mocking, meaning connection should fail on all of them, unless I am missing something that runs as a mock server on CI

Still figuring out the best way to handle this, but I know what is wrong currently:
When the following code is called:
	client, err := pubsub.NewClient(
		context.Background(),
		config.Config.RecorderPubsubProjectID,
		option.WithCredentialsFile(config.Config.RecorderPubsubKeyFile),
	)

the library uses the following rules to create a new client:

GCP client libraries use a strategy called Application Default Credentials (ADC) to find your application's credentials. When your code uses a client library, the strategy checks for your credentials in the following order:

First, ADC checks to see if the environment variable GOOGLE_APPLICATION_CREDENTIALS is set. If the variable is set, ADC uses the service account file that the variable points to. The next section describes how to set the environment variable.

If the environment variable isn't set, ADC uses the default service account that Compute Engine, Kubernetes Engine, App Engine, and Cloud Functions provide, for applications that run on those services.

If ADC can't use either of the above credentials, an error occurs.

On our machines, step 2 is happening, likely because we have run a gcloud auth command in the past. On the CircleCI containers, this has never been run and so we go to step 3 (error).
NewClient signature is as follows:
func NewClient(ctx context.Context, projectID string, opts ...option.ClientOption) (c *Client, err error) {

and the return value in case of an error is this:
return nil, fmt.Errorf("pubsub: %v", err)

so when the rest of the code executes:
	if err != nil {
		// TODO: use Fatal again after fixing the test expecting to not panic.
		// logrus.WithField("pubsub_error", err).Fatal("error getting pubsub client")
		logrus.WithField("pubsub_error", err).Error("error getting pubsub client")
	}

	return &pubsubRecorder{
		producer: client,
		topic:    client.Topic(config.Config.RecorderPubsubTopicName),
		enabled:  config.Config.RecorderEnabled,
	}

client is a null pointer, and you get a null pointer dereference.
So that's the issue.
Having the Fatal call will prevent us from dereferencing a nil pointer which is good. It is also the same way we handle error cases in the kafka client so it would follow the standards there.
So to fix the issue in the test we need to either
a) allow the client to retrieve credentials or
b) mock the client somehow

@vic3lord I've created a PR on your fork which fixes the above issues

This looks good to me pending my question about handling potential marshal errors.

Cool. @zhouzhuojie how are you feeling about everything at this point?

Thank you so much for helping, I fixed the little nits.
Where would it be best to document the pubsub addition and its auth docs?

Thank you so much for helping, I fixed the little nits.
Where would it be best to document the pubsub addition and its auth docs?

I think you can put it after the Kinesis section in https://github.com/checkr/flagr/blob/master/docs/flagr_env.md


How to make API calls with shinylive?

I'm working on a toy application to show how a shinylive app could make API calls. It's turning out to be harder than I thought.
It seems like networking in general does not work very well with pyodide (and thus shinylive). I'm still learning here, but the issue looks to be accessing sockets.
A few posts (e.g., here) suggest that you should be able to do this with javascript. I see the tags reference in support, but I'm a bit lost in how to implement this in practice.
My toy app is calling a published API that was built on the palmerpenguins data set. Here is the code that works as a standalone shiny app but not with shinylive:
from shiny import *
import urllib.request
import json

app_ui = ui.page_fluid(
    ui.layout_sidebar(
    ui.panel_sidebar(
    ui.input_select("species", "Penguin Species",
                    {"Gentoo":"Gentoo", "Chinstrap":"Chinstrap", "Adelie":"Adelie"}),
    ui.input_action_button("go", "Predict", width="100%")),
    ui.panel_main(ui.h2(ui.output_text("txt"))))
)

def server(input, output, session):
    @output
    @render.text
    @reactive.event(input.go)
    def txt():
       url = "http://penguin.eastus.azurecontainer.io:8000/predict"
       payload = [{"species":input. Species(),
                   "bill_length_mm":40.5,
                   "bill_depth_mm":18.9,
                   "flipper_length_mm":180,
                   "body_mass_g":3950}]
       headers = {"Content-Type": "application/json"}
       data = json.dumps(payload).encode("utf-8")
       headers = {k: v.encode("utf-8") for k, v in headers. Items()}
       request = urllib.request.Request(url, data, headers)
       response = urllib.request.urlopen(request)
       data = response. Read()
       response_data = json.loads(data. Decode("utf-8"))
       prediction = response_data[0]
       class_pred = prediction[".pred_class"]
       return f"The {input.species()} 🐧 is predicted to be {class_pred}."

app = App(app_ui, server)

Is there a known workaround with the python route that I'm unable to find? If not, any suggestions on how to insert a javascript component that can take the dynamic inputs from the UI to be used for the prediction?

urllib.request cannot be used inside the shinylive app, you need to use pyodide.http.pyfetch
They have updated documentation, so there is an answer to your question:
https://shinylive.io/py/examples/#fetch-data-from-a-web-api

Very newbie to shiny and shinylive and I am testing it to access other output as an http request.
In my example, I am trying to access this output:
http://www.isa.ulisboa.pt/proj/clipick/climaterequest_fast.php?em=12&sy=2000&tspan=d&fmt=csv&lon=-8.335343513&dts=METO-HC_HadRM3Q0_A1B_HadCM3Q0_DM_25km&ar=4&ey=2003&sm=1&ed=31&lat=39.2816836&mod=hisafe&sd=1
which is a climate (format can be changed in the fmt variable to json or htmltable if needed further testing)
But by replacing line 64 in the example https://shinylive.io/py/examples/#fetch-data-from-a-web-api
with this line:
return f"http://www.isa.ulisboa.pt/proj/clipick/climaterequest_fast.php?em=12&sy=2000&tspan=d&fmt=json&lon=-8.335343513&dts=METO-HC_HadRM3Q0_A1B_HadCM3Q0_DM_25km&ar=4&ey=2003&sm=1&ed=31&lat=39.2816836&mod=hisafe&sd=1"
I would expect some retrieval. but it throws "Failed to fetch". And the debugger isn't very helpful either.
Any idea? Is there a limit on time/volume of data acquisition?

@palmajoao If you open the browser's JavaScript console (right-click, select Inspect, and then click on "Console", you will find some useful information there.

When I try your version of the app, I see this error in the console:
Mixed Content: The page at 'https://shinylive.io/py/shinylive/pyodide-worker.js' was loaded over HTTPS, but requested an insecure resource 'http://www.isa.ulisboa.pt/proj/clipick/climaterequest_fast.php?em=12&sy=2000&tspan=d&fmt=json&lon=-8.335343513&dts=METO-HC_HadRM3Q0_A1B_HadCM3Q0_DM_25km&ar=4&ey=2003&sm=1&ed=31&lat=39.2816836&mod=hisafe&sd=1'. This request has been blocked; the content must be served over HTTPS.

This is because shinylive.io is served over https, but the URL you are fetching is http, and browser security restrictions require a https page to only allow outgoing https requests. (This is mentioned in the comments at the top of app.py in the example.)
After changing the URL to https, I get the following error:
Access to fetch at 'https://www.isa.ulisboa.pt/proj/clipick/climaterequest_fast.php?em=12&sy=2000&tspan=d&fmt=json&lon=-8.335343513&dts=METO-HC_HadRM3Q0_A1B_HadCM3Q0_DM_25km&ar=4&ey=2003&sm=1&ed=31&lat=39.2816836&mod=hisafe&sd=1' from origin 'https://shinylive.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

This is also due to browser security restrictions. If a web page uses fetch() to request a resource from a different origin, the browser will normally only provide an opaque response to the JS code on the page. This means that you can't look at the content of the response. Opaque responses aren't useful for most cases, but see https://stackoverflow.com/a/36303436 for what they can be used for.
In order for the page at https://shinylive.io to be able to download data from your URL, your server must provide a HTTP response with the Access-Control-Allow-Origin header which allows shinylive.io to make a cross-origin request to it. See this for more information: https://stackoverflow.com/questions/10636611/how-does-the-access-control-allow-origin-header-work
I think the example app should be updated to provide more information about cross-origin requests.


[Umbrella] Updating & Fixing Types

☔ Overview
Doing a clean up round on types, using this issue to track the PR's associated to it.Will be editing this post as I progress. Comments/Recommendations are appreciated.
First Round
First Round will be small isolated PR's, that way no conflicting discussions or delays in certain scope effects the initiation of Second Round Changes.

[X] jest-config (getMaxWorkers) #8434

Missing type string when getMaxWorkers allows a string

[X] jest-validate (condition)- multipleValidOptions #8435

should infer the types of its arguments, and return a union type of the types

[ ] jest-config (utils) #8437

Improve/Fix typing's
potentially  merge _replaceRootDirInObject within _replaceRootDirTags

[ ] jest-config(normalize)

Improve typing's of main normalize function and helpers (not changing code eval)

[ ] jest-types

Use interfaces where makes sense in-order to merge/extends easier
Maybe: Add a separate interface for "deprecated options" that are still supported

Second Round
Second Round will begin after key PRs(dependable) from first round are committed.

[ ] jest-config(normalize) - Improve typing's and structure

Current structure of the normalize function is not type-safe and can be optimized.

Thank you so much! ❤

Regarding normalize, it'd be great to pass it through io-ts, runtypes or something similar instead of rolling our own thing.
@jeysal probably has opinions on this 🙂

Thank you so much! ❤

np, cant think of a better way to practice/learn typescript 😃
@SimenB  You mind changing the labels here?

@SimenB  In terms of the validation part? Or looking for a 3rd parties to handle then entire validation and option merging/overriding?
The biggest issue I see in normalize currently is how its creating the final newOption Result. not type checking (Config.InitialOptions[option] === AllOptions[key]) or even( keyof InitialOptions ===  keyof AllOptions) (because they do differ ) ie:'resolver','mapCoverage','scriptPreprocessor','json','preprocessorIgnorePatterns','preset','setupTestFrameworkScriptFile','testPathDirs','testSequencer','updateSnapshot' exists in Initial Options, and either doesn't exists in alloptions, or they are transformed prior to the reducer, but at the end, these still get set within the resulting Option.

Regarding normalize, it'd be great to pass it through io-ts, runtypes or something similar instead of rolling our own thing.
@jeysal probably has opinions on this 🙂

@JoshRosenstein
My preference would be to validate user-provided config using io-ts. Then, once we've ensured that the objects we're operating on actually match our static types exactly, we should generate the internal config format in a way that typechecks well (e.g. avoiding mutation in favour of a more functional style usually helps with this).
To be clear, I still see the need to treat user config and internal config separately. One reason for this is that internal config usually has goals like not being redundant (e.g. you shouldn't need to both check for undefined and '' on the config unless there's a semantic difference), while user config might not care about this and offer alternatives (e.g. shortening an array containing a single string to just a string) - these are just examples.
Simplifying configuration is scheduled for v25, yes. I expect normalize to be mostly rewritten in the process (kind of scared how this will play with not reworking CLI options at the same time though), so I think the easiest way of going about it would be to just ensure that the new code is TSC-friendly.

@jeysal , that makes sense. and in that case i will hold off on any dramatic changes on normalize. On a related note, was trying of the best way to re-format jest-types Config, and this may also be helpful when when restructuring the way the configs are handled.
With the current state of Config types, i was trying to think of a way to break down the types and reuse them throughout the main exports  InitialOptions,DefaultOptions ,GlobalConfig ProjectConfig Argv. Rather than the current setup of having all properties repeatedly typed. So I began with partitioning the overlaps of GlobalConfig ProjectConfig Argv, and treated the properties as a pipe line from argv. and came up with something like this:
*"Shared" refers to ProjectConfig & GlobalConfig
Looking at ProjectConfig
First, what properties types on Argv, are identical to the required ProjectConfig, (will call this Direct)
/** Argv Options That share same type as Project Options*/
export interface ArgvToProjectDirect {
  automock: boolean;
  browser: boolean;
  cache: boolean;
  cacheDirectory: Path;
  clearMocks: boolean;
  moduleDirectories: Array<string>;
  moduleFileExtensions: Array<string>;
  modulePathIgnorePatterns: Array<string>;
  modulePaths: Array<string>;
  preset: string | Nil;
  prettierPath: string;
  resetMocks: boolean;
  resetModules: boolean;
  resolver: Path | Nil;
  restoreMocks: boolean;
  roots: Array<Path>;
  setupFiles: Array<Path>;
  setupFilesAfterEnv: Array<Path>;
  snapshotSerializers: Array<Path>;
  testEnvironment: string;
  testPathIgnorePatterns: Array<string>;
  testRunner: string;
  testURL: string;
  transformIgnorePatterns: Array<Glob>;
  unmockedModulePathPatterns: Array<string> | Nil;
  watchPathIgnorePatterns: Array<string>;
}
}

⬇ Next what are the properties that share the same key but undlerying types are different. ( will break this down into 2 Raw & derivedfromArgv.
/** Argv Options needed for Project Options that require manipulation*/
export interface ArgvToProjectRaw {
  globals: string;
  haste: string;
  moduleNameMapper: string;
  testRegex: string | Array<string>;
  timers: string;
  transform: string;
}

/** The Project Options Derived from Argv Options */
export interface ProjectOptionsDerivedFromArgv {
  globals: ConfigGlobals;
  haste: HasteConfig;
  moduleNameMapper: Array<[string, string]>;
  testRegex: Array<string>;
  timers: 'real' | 'fake';
  transform: Array<[string, Path]>;
}

⬇ Next the remaining ProjectOptions that are derived elsewhere or in combination of other options, (will call this ProjectOptionsDerived)
export interface ProjectOptionsDerived {
  cwd: Path;
  dependencyExtractor?: string;
  displayName?: DisplayName;
  forceCoverageMatch: Array<Glob>;
  moduleLoader: Path;
  name: string;
  runner: string;
  skipFilter: boolean;
  skipNodeResolution: boolean;
  snapshotResolver: Path | Nil;
  testEnvironmentOptions: Record<string, any>;
  testLocationInResults: boolean;
}

Now do the same for GlobalConfig
/** The Argv Options shared to directly to global */
export interface ArgvToGlobalDirect {
  changedFilesWithAncestor: boolean;
  changedSince: string;
  collectCoverage: boolean;
  coverageDirectory: string;
  findRelatedTests: boolean;
  forceExit: boolean;
  json: boolean;
  lastCommit: boolean;
  logHeapUsage: boolean;
  maxWorkers: number;
  noStackTrace: boolean;
  notify: boolean;
  onlyChanged: boolean;
  projects: Array<Glob>;
  silent: boolean;
  testMatch: Array<Glob>;
  testNamePattern: string;
  testResultsProcessor: string | Nil;
  testSequencer: string;
  useStderr: boolean;
  verbose: boolean | Nil;
  watch: boolean;
  watchAll: boolean;
  watchman: boolean;
}

/** Argv Options needed for Global Options that require manipulation*/
export interface ArgvToGlobalRaw {
  bail: boolean | number;
  collectCoverageFrom: string;
  collectCoverageOnlyFrom: Array<string>;
  coverageReporters: Array<string>;
  coverageThreshold: string;
  outputFile: Path;
  testPathPattern: Array<string>;
  testFailureExitCode: string | Nil;
  notifyMode: string;
  updateSnapshot: boolean;
}

/** The Global Options Derived from Argv Options */
export interface GlobalOptionsDerivedFromArgv {
  bail: number;
  collectCoverageFrom: Array<Glob>;
  collectCoverageOnlyFrom: {[key: string]: boolean} | Nil;
  coverageReporters: Array<ReportOptionKeys>;
  coverageThreshold: CoverageThreshold;
  notifyMode: NotifyMode;
  outputFile: Path | Nil;
  testFailureExitCode: number;
  testPathPattern: string;
  updateSnapshot: SnapshotUpdateState;
}

/** Derived Global Options*/
export interface GlobalOptionsDerived {
  enabledTestsMap: {[key: string]: {[key: string]: boolean}} | Nil;
  expand: boolean;
  forceExit: boolean;
  listTests: boolean;
  maxConcurrency: number;
  noSCM: boolean | Nil;
  nonFlagArgs: Array<string>;
  onlyFailures: boolean;
  passWithNoTests: boolean;
  replname: string | Nil;
  reporters: Array<string | ReporterConfig>;
  runTestsByPath: boolean;
  skipFilter: boolean;
  watchPlugins: Array<{path: string; config: Record<string, any>}> | Nil;
}

Then again for options that are shared b/n global and project
/** Argv Options That share same type as Shared Project & Global Options */
export interface ArgvToSharedDirect {
  coveragePathIgnorePatterns: Array<string>; // Global has optional
  globalSetup: string | Nil;
  globalTeardown: string | Nil;
  rootDir: Path;
}

/** Argv Options needed for Project & Global Options that require manipulation*/
export interface ArgvToSharedRaw {}

/** Shared Project & Global Options Derived from Argv Options */
export interface SharedOptionsDerivedFromArgv {}

/** Derived Options that are shared b/n Global and Project*/
export interface SharedOptionsDerived {
  detectLeaks: boolean;
  detectOpenHandles: boolean;
  errorOnDeprecated: boolean;
  extraGlobals: Array<keyof NodeJS.Global>; /// GlobalConfig has string[]
  filter: Path | Nil;
}

Now defining the remaining argv config that doesnt get passed on
/** Argv Options That dont share same config names*/
export interface ArgvCustom {
  /** This Option Does...*/
  all: boolean;
  ci: boolean;
  clearCache: boolean;
  color: boolean;
  colors: boolean;
  config: string;
  coverage: boolean;
  debug: boolean;
  env: string;
  expand: boolean;
  init: boolean;
  runInBand: boolean;
  showConfig: boolean;
  version: boolean;
}

Then the final resulting types:
export interface ArgVRaw
  extends ArgvCustom,
    ArgvToGlobalRaw,
    ArgvToGlobalDirect,
    ArgvToSharedDirect,
    ArgvToSharedRaw,
    ArgvToProjectDirect,
    ArgvToProjectRaw {}

export type Argv = Arguments<Partial<ArgVRaw>>;
export interface SharedOptions
  extends SharedOptionsDerived,
    SharedOptionsDerivedFromArgv,
    ArgvToSharedDirect {}

export interface SharedOptions
  extends SharedOptionsDerived,
    SharedOptionsDerivedFromArgv,
    ArgvToSharedDirect {}

export interface GlobalOptions
  extends SharedOptions,
    GlobalOptionsDerived,
    GlobalOptionsDerivedFromArgv,
    ArgvToGlobalDirect {}

export interface ProjectOptions
  extends SharedOptions,
    ProjectOptionsDerived,
    ProjectOptionsDerivedFromArgv,
    ArgvToProjectDirect {}

export interface AllOptions extends GlobalOptions, ProjectOptions {}

export type AllOptionsPartial = Partial<AllOptions>;

export type AllOptionsNullable = {[P in keyof AllOptions]: AllOptions[P] | Nil};

// Allow Setting Default to Null ?
export type DefaultOptions = Partial<AllOptionsNullable>;

export type InitialOptions = AllOptionsPartial;

Breaking them down may also be helpful with functional transformers:
const someTransformer= (input:ArgvToProjectRaw):ProjectOptionsDerivedFromArgv=>...

And you will also be able to write option api description once and keep intelli throughout.

lmk your thoughts... i'll tinker around a bit. (btw sorry for the long tangent)

@JoshRosenstein Nice assessment, I think this writeup is very useful already for knowing what kind of options and transformations we actually have.
Deduplicating config definitions is definitely also a goal when cleaning up the typings here. I originally thought we'd likely end up using Pick a lot to avoid duplicating property types, but something like this might actually be cleaner because it also deduplicates the config keys :thinking:

Thanks, after looking over again, its not 100% correct, but you can get the gist of it. The naming convention got me a confused at first  (intialOptions defaultOptions, projectConfig, globalConfig), because I now realize intialOption represents the allowed types from userConfig files and defaultOptions should represent projectConfig & globalConfig which reflect the finalized types modules will consume.
So the pipeline would be more look like Argv=>UserConfigs=>FinalOptions, and each broken down b/n Global & Project with transformation branches.
Also we can then remove DefaultOptions type, and use pick to validate defaultOptions exported from [jest-config]-Defaults.
const defaultOptions: Pick<Config.FinalOptions, DefaultOptionKeys> = {
  automock: false,
  bail: 0,
  browser: false,

Just using FinalOptions to be clear in this post, but do you think we should change the current naming convention ?

I can see how the current naming is confusing, although I think Config is fine - that's where most of it will come from, options sounds more like CLI to me - and DefaultOptions is the weird one. Rewrite should definitely include some bikeshedding on the naming 😅

Yeah especially for those that write app presets in typescript, being able to know which type they need to use lol. Since the file name is jest.config, a simple JestConfig to replace initialOptions would be prob be best ,  And I guess DefaultConfig being the defaults for ProjectConfig & GlobalConfig. 🤢

Closing this. Currently unable to continue contributing.


Extend the schema by a "interactive" flag

Write a script that adds a new flag called "interactive" that is set when the content type is not HTML. After script execution go over the non-interactive datasets to weed out APIs.

https://github.com/okestonia/jkan/issues/21 is blocked by this issue.


Install object_detect_tf post processing stage

With this PR, one can add the meta-neural-network layer to their system, enable tensorflow support in libcamera-apps with e.g.:
PACKAGECONFIG:pn-libcamera-apps:append = " tflite"

and try object detection with the new libcamera-detect app or even libcamera-still --post-process-file /usr/share/libcamera-apps/assets/object_detect_tf.json --lores-width 400 --lores-height 300 for example.
(tested on raspberrypi4-64 with a Camera Module 3)

tensorflow-lite from meta-neural-network currently only builds for 64-bit systems, please let me know the best way to skip the build for 32-bit systems (libcamera-apps will build just fine if tensorflow was requested by the user but not available in sysroot.)

I've documented the upstream issue in the code and commit message and skipped the build on 32-bit systems (libcamera-apps builds fine when tflite isn't available in sysroot.)

This looks abandoned. I would be happy for it to be reopened if there is progress on this PR.


Hide panel without destroy

If I want hide panel - I must destroy all components of my panel
<split-area *ngIf="isVisible">
<my-module></my-module>
</split-area>

How I may just hide panel without destroying my components ?
css display: none   and (size)=0 not working for me because module does not recalculating count of split-area's
Need like that
<split-area [hidden]="isHidden">

Actually, only ngIf works to remove/hide an area.
But you will could do that soon when this pull-request will be merged: https://github.com/bertrandg/angular-split/pull/8
You will have to do like this: <split-area [visible]="false"></split-area>

Ok, thanks ...
Now as temporary solution Im do it:
            self.splitOne.nativeElement.style.flex = '0 0 calc(' + splitOne + '%)'; // splitOne = 0
            self.splitTwo.nativeElement.style.flex = '0 0 calc(' + splitTwo + '%)';

Good news for you :)
Pull request has been merged, you can know toggle area visibility without removing it from the DOM using <split-area [visible]="false"></split-area>.
Install 0.1.17 to get it!
Keep me informed if it works as you expect and close this issue if it's ok.

Ok!.Thanks

Great work. Thanks for your module. All working.


commit_version_bump now using Actions.sh

... also snuck in a small improvement to the error message formatting.

Coverage remained the same at 81.46% when pulling 43eb844f6075e38c3373f1beb11611e65f4c53a9 on lmirosevic:commit_version_bump into 875810f2eafac71f4a26e00aff38ff53278e4bca on KrauseFx:master.

Thank you @lmirosevic :+1:


Allow empty string as enum entry

This is a usecase we have in our OpenAPI schema. To allow it, the enum
is allowed to pass in the parsing stage, and the template deals with this
special case by naming the enum the empty string ('').
A new model was added to the tests that triggers the new code paths to
make sure generation is working.
Signed-off-by: Ruben Aguiar<EMAIL_ADDRESS>

Duplicate of https://github.com/lune-climate/openapi-typescript-codegen/pull/34 (although I haven't fixed the tests there actually)

I think this is fine to replace #34 as long as the enum member is something other than an empty string – as it is it can't be accessed through the Enum.X form (where X is the member name)

Duplicate of #34 (although I haven't fixed the tests there actually)

@jstasiak I apologise for stepping on your toes. I'm not sure how I missed the other PR but I did  🙏

Not at all! My fault for not requesting review there and not advertising it. Yours is much better

If everyone's happy with __EMPTY__ (I am not attached to it at all) I'm happy

I think it's a good special case name 👍


PHP 7 Error during VM installation

This is my config.yml
---
# `vagrant_box` can also be set to geerlingguy/centos6, geerlingguy/centos7,
# geerlingguy/ubuntu1404, geerlingguy/ubuntu1204, parallels/ubuntu-14.04, etc.
vagrant_box: geerlingguy/ubuntu1404
vagrant_user: vagrant
vagrant_synced_folder_default_type: nfs

# If you need to run multiple instances of Drupal VM, set a unique hostname,
# machine name, and IP address for each instance.
vagrant_hostname: drupalvm.dev
vagrant_machine_name: drupalvm
vagrant_ip: <IP_ADDRESS>

# Allow Drupal VM to be accessed via a public network interface on your host.
# Vagrant boxes are insecure by default, so be careful. You've been warned!
# See: https://docs.vagrantup.com/v2/networking/public_network.html
vagrant_public_ip: ""

# A list of synced folders, with the keys 'local_path', 'destination', and
# a 'type' of [nfs|rsync|smb] (leave empty for slow native shares). See
# http://docs.drupalvm.com/en/latest/extras/syncing-folders/ for more info.
vagrant_synced_folders:
  # The first synced folder will be used for the default Drupal installation, if
  # build_makefile: is 'true'.
  - local_path: /var/www/html/drupalvm
    destination: /var/www/drupalvm
    type: nfs
    create: true

# Memory and CPU to use for this VM.
vagrant_memory: 1024
vagrant_cpus: 2

# The web server software to use. Can be either 'apache' or 'nginx'.
drupalvm_webserver: nginx

# Set this to false if you are using a different site deployment strategy and
# would like to configure 'vagrant_synced_folders' and 'apache_vhosts' manually.
build_makefile: false
drush_makefile_path: ../../drupal.make.yml

# Set this to false if you don't need to install drupal (using the drupal_*
# settings below), but instead copy down a database (e.g. using drush sql-sync).
install_site: true

# Settings for building a Drupal site from a makefile (if 'build_makefile:'
# is 'true').
drupal_major_version: 8
drupal_core_path: "/var/www/drupalvm/drupal"
drupal_domain: "{{ vagrant_hostname }}"
drupal_site_name: "Drupal"
drupal_install_profile: standard
drupal_enable_modules: [ 'devel' ]
drupal_account_name: admin
drupal_account_pass: admin
drupal_mysql_user: drupal
drupal_mysql_password: drupal
drupal_mysql_database: drupal

# Additional arguments or options to pass to `drush site-install`.
drupal_site_install_extra_args: []

# Cron jobs are added to the vagrant user's crontab. Keys include name
# (required), minute, hour, day, weekday, month, job (required), and state.
drupalvm_cron_jobs: []
  # - {
  #   name: "Drupal Cron",
  #   minute: "*/30",
  #   job: "drush -r {{ drupal_core_path }} core-cron"
  # }

# Drupal VM automatically creates a drush alias file in your ~/.drush folder if
# this variable is 'true'.
configure_local_drush_aliases: true

# Apache VirtualHosts. Add one for each site you are running inside the VM. For
# multisite deployments, you can point multiple servernames at one documentroot.
# View the geerlingguy.apache Ansible Role README for more options.
apache_vhosts:
  - servername: "{{ drupal_domain }}"
    documentroot: "{{ drupal_core_path }}"
    extra_parameters: |
          ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://<IP_ADDRESS>:9000{{ drupal_core_path }}"

  - servername: "adminer.{{ vagrant_hostname }}"
    documentroot: "{{ adminer_install_dir }}"
    extra_parameters: |
          ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://<IP_ADDRESS>:9000{{ adminer_install_dir }}"

  - servername: "xhprof.{{ vagrant_hostname }}"
    documentroot: "{{ php_xhprof_html_dir }}"
    extra_parameters: |
          ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://<IP_ADDRESS>:9000{{ php_xhprof_html_dir }}"

  - servername: "pimpmylog.{{ vagrant_hostname }}"
    documentroot: "{{ pimpmylog_install_dir }}"
    extra_parameters: |
          ProxyPassMatch ^/(.*\.php(/.*)?)$ "fcgi://<IP_ADDRESS>:9000{{ pimpmylog_install_dir }}"

  - servername: "{{ vagrant_ip }}"
    serveralias: "dashboard.{{ vagrant_hostname }}"
    documentroot: "{{ dashboard_install_dir }}"

apache_remove_default_vhost: true
apache_mods_enabled:
  - expires.load
  - ssl.load
  - rewrite.load
  - proxy.load
  - proxy_fcgi.load

# Nginx hosts. Each site will get a server entry using the configuration defined
# here. Set the 'is_php' property for document roots that contain PHP apps like
# Drupal.
nginx_hosts:
  - server_name: "{{ drupal_domain }}"
    root: "{{ drupal_core_path }}"
    is_php: true

  - server_name: "adminer.{{ vagrant_hostname }}"
    root: "{{ adminer_install_dir }}"
    is_php: true

  - server_name: "xhprof.{{ vagrant_hostname }}"
    root: "{{ php_xhprof_html_dir }}"
    is_php: true

  - server_name: "pimpmylog.{{ vagrant_hostname }}"
    root: "{{ pimpmylog_install_dir }}"
    is_php: true

  - server_name: "{{ vagrant_ip }} dashboard.{{ vagrant_hostname }}"
    root: "{{ dashboard_install_dir }}"

nginx_remove_default_vhost: true
nginx_ppa_use: true

# MySQL Databases and users. If build_makefile: is true, first database will
# be used for the makefile-built site.
mysql_databases:
  - name: "{{ drupal_mysql_database }}"
    encoding: utf8
    collation: utf8_general_ci

mysql_users:
  - name: "{{ drupal_mysql_user }}"
    host: "%"
    password: "{{ drupal_mysql_password }}"
    priv: "{{ drupal_mysql_database }}.*:ALL"

# Comment out any extra utilities you don't want to install. If you don't want
# to install *any* extras, make set this value to an empty set, e.g. `[]`.
installed_extras:
  - adminer
  # - blackfire
  # - drupalconsole
  - mailhog
  # - memcached
  # - newrelic
  # - nodejs
  - pimpmylog
  # - redis
  # - ruby
  # - selenium
  - solr
  # - varnish
  - xdebug
  - xhprof

# Add any extra apt or yum packages you would like installed.
extra_packages:
  - sqlite

# `nodejs` must be in installed_extras for this to work. Valid examples: "0.10",
# "0.12", "4.x", "5.x".
nodejs_version: "0.12"
nodejs_npm_global_packages: []
nodejs_install_npm_user: "{{ drupalvm_user }}"

# `ruby` must be in installed_extras for this to work.
ruby_install_gems_user: "{{ drupalvm_user }}"
ruby_install_gems: []

# You can configure almost anything else on the server in the rest of this file.
extra_security_enabled: false

drush_version: "master"
drush_keep_updated: true
drush_composer_cli_options: "--prefer-dist --no-interaction"

firewall_allowed_tcp_ports:
  - "22"
  - "25"
  - "80"
  - "81"
  - "443"
  - "4444"
  - "8025"
  - "8080"
  - "8443"
  - "8983"
firewall_log_dropped_packets: false

# PHP Configuration. Currently-supported versions: 5.6, 7.0.
# To use 5.6, see: http://docs.drupalvm.com/en/latest/other/php-56/
php_version: "5.6"
php_memory_limit: "192M"
php_display_errors: "On"
php_display_startup_errors: "On"
php_realpath_cache_size: "1024K"
php_sendmail_path: "/usr/sbin/ssmtp -t"
php_opcache_enabled_in_ini: true
php_opcache_memory_consumption: "192"
php_opcache_max_accelerated_files: 4096
php_max_input_vars: "4000"

# Drupal VM defaults to using PHP-FPM with either Apache or Nginx. If you wish
# to instead use Apache + mod_php with an Ubuntu base box, make sure you add
# libapache2-mod-php7.0 to `extra_packages` elsewhere in this config file.
php_enable_php_fpm: true
php_fpm_listen: "<IP_ADDRESS>:9000"

composer_path: /usr/bin/composer
composer_home_path: "/home/{{ drupalvm_user }}/.composer"
composer_home_owner: "{{ drupalvm_user }}"
composer_home_group: "{{ drupalvm_user }}"
# composer_global_packages:
#   - { name: phpunit/phpunit, release: '@stable' }

# Run specified scripts before or after VM is provisioned. Path is relative to
# the `provisioning/playbook.yml` file.
pre_provision_scripts: []
post_provision_scripts: []
  # - "../examples/scripts/configure-solr.sh"

# MySQL Configuration.
mysql_root_password: root
mysql_slow_query_log_enabled: true
mysql_slow_query_time: 2
mysql_wait_timeout: 300
adminer_install_filename: index.php

# Varnish Configuration.
varnish_listen_port: "81"
varnish_default_vcl_template_path: templates/drupalvm.vcl.j2
varnish_default_backend_host: "<IP_ADDRESS>"
varnish_default_backend_port: "80"

# Pimp my Log settings.
pimpmylog_install_dir: /usr/share/php/pimpmylog
pimpmylog_grant_all_privs: true

# XDebug configuration. XDebug is disabled by default for better performance.
php_xdebug_default_enable: 0
php_xdebug_coverage_enable: 0
php_xdebug_cli_enable: 1
php_xdebug_remote_enable: 1
php_xdebug_remote_connect_back: 1
# Use PHPSTORM for PHPStorm, sublime.xdebug for Sublime Text.
# php_xdebug_idekey: PHPSTORM
php_xdebug_max_nesting_level: 256

# Solr Configuration (if enabled above).
solr_version: "4.10.4"
solr_xms: "64M"
solr_xmx: "128M"

# Selenium configuration.
selenium_version: 2.46.0

# Other configuration.
dashboard_install_dir: /var/www/dashboard
known_hosts_path: ~/.ssh/known_hosts

I am getting this error during installation:
TASK [geerlingguy.php : Ensure PHP packages are installed.] ********************
failed: [drupalvm] => (item=[u'php7.0-common', u'php7.0-cli', u'php7.0-dev', u'php7.0-fpm', u'libpcre3-dev', u'php7.0-gd', u'php7.0-curl', u'php7.0-imap', u'php7.0-json', u'php7.0-opcache', u'php7.0-xml', u'php7.0-mbstring', u'php-sqlite3', u'php-apcu']) => {"failed": true, "item": ["php7.0-common", "php7.0-cli", "php7.0-dev", "php7.0-fpm", "libpcre3-dev", "php7.0-gd", "php7.0-curl", "php7.0-imap", "php7.0-json", "php7.0-opcache", "php7.0-xml", "php7.0-mbstring", "php-sqlite3", "php-apcu"], "msg": "No package matching 'php7.0-common' is available"}

RUNNING HANDLER [geerlingguy.firewall : restart firewall] **********************

RUNNING HANDLER [geerlingguy.nginx : reload nginx] *****************************

RUNNING HANDLER [geerlingguy.mysql : restart mysql] ****************************

PLAY RECAP *********************************************************************
drupalvm                   : ok=69   changed=27   unreachable=0    failed=1

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

I have specified Ubuntu 14.04 with PHP 5.6. Still it is trying to install PHP 7.

Sorry I haven't checked the existing issue #632. Closing this for now.

Anybody else having this problem - please read my comment here https://github.com/geerlingguy/drupal-vm/issues/632#issuecomment-220233870

subhojit777: Your linked suggestion doesn't work for me. It generates new errors related to arknoll.selenium
Anyone else know how to get a drupal vm install with PHP 5.6? I can't create a new VM with 5.6 due to PHP 7 errors like the ones above.

I've tested these settings for php 5.6 in DrupalVM 3.0.0 - http://docs.drupalvm.com/en/latest/other/php-56/
Also DrupalVM 2.5.1 defaults to php 5.6 as used in the previous link.

Can you please try to rebuild the VM. Make sure you use this release https://github.com/geerlingguy/drupal-vm/releases/tag/2.5.1

I've rebuild VM on 2.5.1 release for geerlingguy/ubuntu1604, geerlingguy/ubuntu1404 and geerlingguy/ubuntu1204. For all of cases error regarding PHP packages still appears. I've followed all of the advices from scratch with ansible-galaxy install -r provisioning/requirements.yml --force command before vagrant up and at the end with vagrant provision. All of those didn't solve this bug.

Have you followed the instructions at http://docs.drupalvm.com/en/latest/other/php-56 (i.e. adding php_packages etc to config.yml)?

I've included php_packages and the problem is solved. @opdavies big thanks for a hint. I think that it should be included in 2.5.1 release notes.

@netlooker - The 2.5.1 release includes those packages by default using all the correct PHP role versions (which are hardcoded in the requirements.yml file). Though if you first download a 3.0.0 release, then downgrade to 2.5.1 after having installed roles once, then that could trip you up.

@subhojit777 The link to tag 2.5.1 was very helpful. For some reason cloning from there worked when using that tag from elsewhere did not.

@tschet Great!!


rpm build broken: undefined: iopodman.Create

Rawhide builds are broken. [log]:
_build/src/github.com/containers/libpod/cmd/podman/shared/intermediate_varlink.go:70:42: undefined: iopodman.Create
_build/src/github.com/containers/libpod/cmd/podman/shared/intermediate_varlink.go:71:7: undefined: iopodman.Create
_build/src/github.com/containers/libpod/cmd/podman/shared/intermediate_varlink.go:317:34: undefined: iopodman.Create

Most recent build

Fixed in specfile by @baude; subsequent build completed with no error


Help using it in templates

I got django-webassets correctly working using the assets.py approach this is my working code there:
from django_assets import Bundle, register
index = Bundle('styles/index.sass', filters='sass', output='styles/index.css')
register('all_sass', index)
And in my template this
{% assets 'all_sass'  %}
<link rel='stylesheet' href='{{ASSET_URL}}' type='text/css' charset='utf-8' />
{% endassets %}
And correctly getting this output:
<link rel='stylesheet' href='/static/styles/index.css?1326831254' type='text/css' charset='utf-8'/>
And reading the docs i think im supposed to do this on templates
{% assets filters='sass', output='styles/index.sass'  %}
<link rel='stylesheet' href='{{ASSET_URL}}' type='text/css' charset='utf-8' />
{% endassets %}
But is not working, im getting this output
<link rel='stylesheet' href='/static/styles/index.sass?1326766448' type='text/css' charset='utf-8'/>
Any help appreciated.

To use Sass, look at this:
http://elsdoerfer.name/docs/webassets/css_compilers.html
Short version, you need to set debug=False on the bundle to make sure it compiles even when in development mode.


Wont Launch Valid Android Emulator AVD

Description
The detox test command fails with the error message "Error: Emulator with name  has a corrupt config.ini file (/path/to/config.ini), try fixing it by recreating an emulator.
This happens for a perfectly valid emulator avd that starts up without problem. In my particular case the avd was created from the command line using the avdmanager.bat create avd command.
Looking through the source code, this error is thrown from EmulatorDriver.js _fixEmulatorConfigIniSkinName(..) when the config.ini file for the emulator does not have a 'skin.name' value and does not have hw.lc.width and hw.lcd.height values.
It is unclear why the emulator driver is trying to fix the config.ini in this way. Ideally the command should work for such an emulator avd since the avdmanager does not create it with those values and the avd works without them.
If there is a specific scenario where this behavior is required or it is a requirement specific to detox then, at a minimum, the error message should be made more descriptive to provide a clear solution. Such as instructing the user that skin and/or height + width specification is required in the config.ini.
Steps to Reproduce
Run the detox test -c <config> command. Use a configuration of type android.emulator and select an avd name with a config.ini file that has neither the skin.name property nor the hw.lcd.width / hw.lcd.height properties.
Detox, Node, Device, Xcode and macOS Versions

Detox: 10.0.7
React Native: 0.57.8
Node: 11.6.0
Device: Android Emulator
Xcode: N/A
macOS: N/A
Windows: Windows 10 Pro v1703

Device and verbose Detox logs
detox[716] INFO:  [DetoxServer.js] server listening on localhost:50369...
detox[716] DEBUG: [AsyncWebSocket.js/WEBSOCKET_OPEN] opened web socket to: ws://localhost:50369
detox[716] TRACE: [AsyncWebSocket.js/WEBSOCKET_SEND] {"type":"login","params":{"sessionId":"3a17d4e8-c480-0900-5910-4068d33e6274","role":"tester"},"messageId":0}
detox[716] DEBUG: [DetoxServer.js/LOGIN] role=tester, sessionId=3a17d4e8-c480-0900-5910-4068d33e6274
detox[716] DEBUG: [DetoxServer.js/LOGIN_SUCCESS] role=tester, sessionId=3a17d4e8-c480-0900-5910-4068d33e6274
detox[716] TRACE: [AsyncWebSocket.js/WEBSOCKET_MESSAGE] {"type":"loginSuccess","params":{"sessionId":"3a17d4e8-c480-0900-5910-4068d33e6274","role":"tester"},"messageId":0}

detox[716] DEBUG: [exec.js/EXEC_CMD, #0] C:\path\to\emulator -list-avds --verbose
detox[716] TRACE: [exec.js/EXEC_SUCCESS, #0] <avd name>

detox[716] ERROR: [index.js/DETOX_INIT_ERROR] Error: Emulator with name <emulator name> has a corrupt config.ini file (C:\path\to/<avd name>.avd/config.ini), try fixing it by recreating an emulator.
    at EmulatorDriver._fixEmulatorConfigIniSkinName (C:\path\to\EmulatorDriver.js:30:15)
    at EmulatorDriver.acquireFreeDevice (C:\path\to\EmulatorDriver.js:91:16)
    at process.internalTickCallback (internal/process/next_tick.js:77:7)

I do have same problem. Is there any solution for this?
(OR)
Just provide the info how to deal with android emulator on CI

@ravi-ts As a workaround you can manually browser to where your emulator config.ini is and put in explicit values for hw.lc.width and hw.lcd.height. This should solve the emulator startup problem.

You mean emulator -avd Nexus_6_API_26 -skin 768x1280 -no-window -no-audio -debug-init > /dev/null 2>&1 & like this on bitrise?

I'm not sure that will solve the problem. I believe -skin just tells the emulator command to ignore the value (if any) in the config.ini and use the value you specify instead. The detox code is actually inspecting the config.ini and looking for the 'skin.name' value.
https://github.com/wix/Detox/blob/e7cbb696d7f8a1beff3ac50e319dbcca1aa2b60e/detox/src/devices/drivers/EmulatorDriver.js#L21
If bitrise gives you access to setup / customize your emulator configs then you need to add the values I provide into the config ini:
/root/.android/avd/Nexus_6_API_26.avd/config.ini
If bitrise doesn't provide that option then I can't think of any way to work around the problem, you'll most likely have to patch the detox behavior yourself or wait until a fix is available.

Thanks Ryan,
I will check any possibilities.

@ravi-ts I am also experiencing this problem on bitrise. Any update on a possible solution?

Short answer is Not yet,
I tried many ways to install emulator with Appropriate hardware configurations and I didn't succeed yet.
If I try in my Mac machine I can see .android/XXXX.avd/config.ini with all necessary parameters but on linux machine I didn't find it.

On the linux machine see if there is an ANDRDOID_AVD_HOME environment variable set (different than the ANDROID_HOME variable). The avd manager and emulator commands should put the AVD files in the directory for that variable. If not, then see if there is an ANDROID_SDK_HOME env variable with a .android/ folder in it.
If neither are defined and you can't find the location, you can try setting the ANDROID_AVD_HOME environment variable yourself to control the directory (either setting the env variable persistently or on a session by session basis)

The original issue was with emulators created with avdmanager create avd and launched through CLI, not Android Studio (issue described here https://stackoverflow.com/a/47265664/930391).
I am not sure Google has solved the issue, last time I tried this, about 6 months ago, the issue was still present on macOS. Either if its solved or not in newer version, I'd rather keep this piece of code to support older SDK versions. Let's find a better solution together, but I need to understand:
How your emulators were created (cli, Android Studio?)
How the config.ini looks like (paste it if you can please)
How are you launching the emulator? (With Detox? from Android Studio?)

I tried out your setup from https://github.com/wix/Detox/pull/1504#issuecomment-508450261 and the emulator launched was actually usable (low res, but nothing looked broken).
This is great! Though I wouldn't want to remove this piece of code just yet, it needs some transition time because it solves an issue on some emulators.
Ideally, I would like to understand when (on what avdmanager/emulator version) this was fixed, so we can add a condition in code to only fix that for the older binary versions.

I'm also having this issue locally when i try to first download, create, and run.
 $ANDROID_HOME/tools/bin/sdkmanager "system-images;android-28;google_apis_playstore;x86"
echo yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses
echo no | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name Nexus_5X_API_28 --abi google_apis_playstore/x86 --package 'system-images;android-28;google_apis_playstore;x86'

i'll first get Emulator with name Nexus_5X_API_28 has a corrupt config.ini file
to which i append:
echo 'hw.lcd.height = 1920' >> $HOME/.android/avd/Nexus_5X_API_28.avd/config.ini
echo 'hw.lc.width = 1080' >> $HOME/.android/avd/Nexus_5X_API_28.avd/config.
echo 'hw.lcd.density = 161' >> $HOME/.android/avd/Nexus_5X_API_28.avd/config.ini

.. same complaint, so i add skin:
echo 'skin.name=Nexus_5X_API_28' >> $HOME/.android/avd/Nexus_5X_API_28.avd/config.ini
and now i get
emulator: ERROR: unknown skin name 'Nexus_5X_API_28'

appending this got rid of that error:
echo 'skin.path = $ANDROID_HOME/skins/nexus_5'

now off to other android e2e issues...
lots of idling:
10-08 15:29:19.519  3515  3515 W UiControllerImpl: Waiting for: ASYNC_TASKS_HAVE_IDLED for 6300 iterations.
10-08 15:29:20.157  1876  3489 I GnssLocationProvider: WakeLock acquired by sendMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@ca7c0c4)
10-08 15:29:20.157  1876  1890 I GnssLocationProvider: WakeLock released by handleMessage(REPORT_SV_STATUS, 0, com.android.server.location.GnssLocationProvider$SvStatusInfo@ca7c0c4)

hi @jeremyeaton89 could you provide the full script? because i still got the same error. does the sequence matter? is it before or after create avd?

I added
script:
  - printf "\nhw.lcd.height=1920\nhw.lcd.width=1080\nhw.lcd.density=161\nskin.name=240x426" >> /home/travis/.android/avd/Pixel_API_28_AOSP.avd/config.ini

to my travis config and I think it did the trick

All, please retry using Detox 16.0.2 - we've restricted the skin patching to older emu's.


Linux fonts

Added linux font directories in the style of the existing mac osx font directories.

It would be really great if this was added :) It would be usefull for everyone using a linux server to generate Powerpoint files

@hoopes why is this not merged yet?

I'll see if I can get this in the next release.

This bug appears in version 0.6.23


Add .justify-align css rule

Hello there.
Just a small contribution: add a css rule that align texts justify. This is really helpful when dealing with texts in paragraphs, cards, etc.

@Dogfalo Could you please analyze this PR? :innocent:

We're holding off on most PR until after 1.0


breakpoints with better logging

Stream logs and check for panics in running container instances (i.e failed starts). stream to normal ictest logs and panic

“It would have been nice to like a debug REPL where you could set up "breakpoints" in the lifecycle of ic and query the containers (exec, docker stuff, etc.) Maybe something where you could easily access all the logs etc” - Gjermund Garaba

interchaintest.Breakpoint()

pause conainers
Open an API to continue to the next steps (i.e. pass the breakpoint)
Show chains & their host RPCs in logs print
stdin? (hacky, but removes the need for another API)

I think this is a nice to have, but other ways to currently do it if really needed vs a proper solution.


Better Debugging

It should be possible to run the simulation where you have access to gdb in one of the processes. This can be accomplished ad-hoc by removing the entry of interest from the helics runner JSON and then running it yourself.

Fixed in #20


[NFR] Support for Choosy?

I was wondering if it's possible to get this working with Choosy?
This might be useful if testing in lots of different browsers.
Choosy has an API which supports AppleScript as well.

I think you could just open the browser you want and the extension will do the rest. For some deeper integration with that you'll need a dedicated extension for it.


About Inboud_shipment

I called the list_inbound_shipments method in inboud_shipment.py. The two parameters, shipment_statuses and shipment_ids, require only one request, and this method requires two parameters to exist at the same time.

Should be added
shipment_statuses = shipment_statuses or []
shipment_ids = shipment_ids or []

Are you meaning that the arguments should be a list?  as per the request parameters here =>
http://docs.developer.amazonservices.com/en_UK/fba_inbound/FBAInbound_ListInboundShipments.html

This is simple to fix, but can you confirm the call fails if shipment_statuses is None as the docs @ mws show that you only need either shipment_statuses or shipment_ids
In theory defaulting to an empty list if they are None should not cause any issues, but as I've not got any inbound shipments to amazon on our account to test with some extra info would be great.

I mean that if I only fill in one parameter when I call, NoneType Eroor will appear. If I fill in two parameters, it will return normally, and only one of the two parameters is required to request it.When I add these two lines It achieves the effect I expected.
eroor code before i modify
fulfilment_api = mws.InboundShipments(account_id='xxxxx', access_key='Axxxxx',
secret_key='xxxxx', region='UK')
res = fulfilment_api.list_inbound_shipments(shipment_statuses='SHIPPED', last_updated_after='2020-08-04T00:00',
last_updated_before='2020-08-05T00:00')

Yes, I guess it should be a pythonlist instead of pythonNone

Yes, I guess it should be a list instead of None

This method uses enumerate_params to handle both arguments at the same time. Seems like a bug in the case where one param is provided and the other is None.
Will investigate when I have some time, later today or tomorrow. Certainly shouldn't be breaking down like that.

Finally got around to investigating (power outages from Isaias), and I'm not seeing any errors from that method from current develop branch code. Some updates have been made to enumerate_param on that version, so that might be a fix for your issue (the same fix may not have been applied to master branch and the version currently available on PyPI, however).
As mentioned before, enumerate_params is used to handle those arguments as a shorthand method. I've tested a few different scenarios and found the results are appropriate:
from mws.utils import enumerate_params

enumerate_params({
    "A": None,
    "B": ["Foo", "Bar"]
})
# result: {'B.1': 'Foo', 'B.2': 'Bar'}

"A" is excluded entirely, whether its value is None (the method's default) or an empty list.
enumerate_params({
    "A": ["Foo", "Bar"],
    "B": "OneEntry",
})
# result: {'A.1': 'Foo', 'A.2': 'Bar', 'B.1': 'OneEntry'}

The single entry for "B" is wrapped in a list before being processed, so it outputs as a "B.1" enumerated entry, as expected.

If you can, please check latest version from develop to see if that alleviates your issue. Thank you.

I tried the latest call, but it still had the same problem. I was wondering whether its type must be a list. I saw this method
shipment_statuses = shipment_statuses or []
shipment_ids = shipment_ids or []

was also used in your api_order call, so I took That method modified it
https://github.com/python-amazon-mws/python-amazon-mws/blob/develop/mws/apis/orders.py#L49-L55

It reported an error
fulfilment_api = mws.InboundShipments(account_id='A20J3ITGSOMSJG', access_key='AKIAIGFXIDYSFVGBYMIQ',
                                      secret_key='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')
res = fulfilment_api.list_inbound_shipments(shipment_statuses='SHIPPED', shipment_ids=None, last_updated_after='2020-08-05T00:00',
                                            last_updated_before='2020-08-06T00:00')

TypeError: 'NoneType' object is not iterable
It executed successfully
fulfilment_api = mws.InboundShipments(account_id='xxxxxx', access_key='xxxxxx',
                                      secret_key='xxxxx')
res = fulfilment_api.list_inbound_shipments(shipment_statuses='SHIPPED', shipment_ids=[], last_updated_after='2020-08-05T00:00',last_updated_before='2020-08-06T00:00')

It reported an error
fulfilment_api = mws.InboundShipments(account_id='xxxxxxx', access_key='xxxxxxx',
                                      secret_key='xxxxxxx')
res = fulfilment_api.list_inbound_shipments(shipment_statuses='SHIPPED', shipment_ids=None, last_updated_after='2020-08-05T00:00',last_updated_before='2020-08-06T00:00')

TypeError: 'NoneType' object is not iterable
It executed successfully
fulfilment_api = mws.InboundShipments(account_id='xxxxxxx', access_key='xxxxxxx',
                                      secret_key='xxxxxxx')
res = fulfilment_api.list_inbound_shipments(shipment_statuses='SHIPPED', shipment_ids=None, last_updated_after='2020-08-05T00:00',last_updated_before='2020-08-06T00:00')

Can you show the traceback for the error you received? I wrote a test locally for your inputs:
 def test_list_inbound_shipments_mixed_ids_and_status(self):
        response = self.api.list_inbound_shipments(
            shipment_statuses="SHIPPED",
            shipment_ids=None,
            last_updated_after="2020-08-05T00:00",
            last_updated_before="2020-08-06T00:00",
        )

And I don't see an exception raised from this. If the error occurs deeper into the request logic, I personally cannot run that (don't have a seller account), but I would be able to debug from a full traceback (not just the "TypeError" line, please).

Alright, so I had some confusion myself in what I was testing.
On latest develop, this bug does exist, and persisted through at least one PR that was meant to correct it. enumerate_param is checking if not any(values) too early, when the code that wraps it in a list (if not a list, tuple, or set) should be running first.
I have a sizable update coming down the pipe soon which should include a fix for this issue.
Thank you!

I am also very grateful for your code. By the way, when I request a report with report type _GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA_, he always returns the error Request for report type 1202 is not allowed at this time

That particular report type does not appear to be in the MWS report type
enumeration:
http://docs.developer.amazonservices.com/en_US/reports/Reports_ReportType.html
The reason appears to be that that report cannot be scheduled by the API:
you will need to use the SellerCentral interface to do so:
https://stackoverflow.com/a/27745884
On Mon, Aug 17, 2020, 3:36 AM 854350999<EMAIL_ADDRESS>wrote:

I am also very grateful for your code. By the way, when I request a report
with report type GET_DATE_RANGE_FINANCIAL_TRANSACTION_DATA, he always
returns the error Request for report type 1202 is not allowed at this time
—
You are receiving this because you were assigned.
Reply to this email directly, view it on GitHub
https://github.com/python-amazon-mws/python-amazon-mws/issues/199#issuecomment-674715822,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACMAYPLGHT3HCAZ4WZ2QYGLSBDMXVANCNFSM4PVA2I4A
.

Received, thanks for the answer, I am looking forward to the update of the enumerate_param method, please reply me after the update

#207 open, includes the fix for this issue.

tks for your reply, I have been so busy building a material data model recently (so that I didn’t see this news), and I’m still sorting out the goods in and out of the warehouse, as well as warehouse damage, etc. I have not seen that Amazon has any obvious aspects of this Integration, if you know, please let us know

Finally found time to test the new development version. What is good is that this bug seems to have been fixed successfully. I like this new version.


Fourth Deliverable Product

Fourth Deliverable Product
Objective
This deliverable implements features that allow the viewing of game data and management. That is, leaderboards, user history, admin account management page. The periodic table page has also been updated to work.
This deliverable also includes some basic testing methodologies to prepare for the next deliverable.
Features

Periodic Table

[x] Updated to work with latest database and routing methods.

User

[x] Create a user page that shows the history of games played.

Leaderboard

[x] Create a leaderboard page that shows the top performance for each game.

Admin

[x] Creates an admin user that can modify the database directly through a manage page.

CSS Improvements

[x] All new pages are appropriately stylised.

Completion Criteria
This deliverable is considered complete if all features are tested and implemented.

Dynamic leaderboard fetchs and demonstrates data in real time (tested)
Matched CSS styling added to pages
Periodic Table updated with question and a simple rating system added

Almost complete in #39. Some CSS adjustments still need to be made as there were conflicting stylesheet changes made by three people. I've divided the css into different sheets to make following the styles easier.

Marking as complete as #39 finished this. Minor improvements can be shipped with last deliverable.


bug: state export decypt password prompt

test: state export from Error: Mutiny is already running page
setup steps: Error: Mutiny is already running` page

setup password encryption
get to the Error: Mutiny is already running page.
click 'Save State As File' button
actual behaviour:
prompted with all caps message "do you want to replace your state with" followed by an input box and 'Decrypt Wallet' button.
unsure whether this is actually going to export the state or attempt to restore a empty state so I stopped

expected behaviour:

not prompted for decryption password again (I don't need this reveal my 12 words)
state saved to file and notified to tell me

How I got here:
I tried to move from web version to APK. I restored from the backup using 12 words but my activity only showed the on-chain transition to create the channel. My lightning balance was correct though. I thought I could compare the state and attempt to import the web state into the APK as all I have done is open it and check the activity and I only have 1 channel open with the default LSP. Do you think this is safe or does the App make changes to the state of a single lightning channel in the background without prompting me when not using NWC features?
I successfully exported the state from the APK version. I attempted to export the state from the web and I encountered this bug.
I love what you are doing with this wallet! Thanks for your hard work.

If you wait two minutes this error will go away

ah ok. I got the same issue when I access it from the Emergency Key page. I recklessly so entered my password and it presented me the json file. I think the prompt text is a bug.
The APK version didn't have the lightning state until I imported it for some reason.
The clicking the 'delete everything'  button on the web version was pretty scary after validating the APK version had the data. Perhaps you could outline 'scenarios where this is appropriate' before a conformation prompt?


Store is not showing up at all

The lategame store will not pull up whenever I put in "lategame store" or "lgu"
I created a video reference here

I am just gonna guess FixPluginTypeSerialization is throwing an error so redirect to this issue's last comment

Unfortunately, I've tried using the config in the issue you have linked. Still doesn't work.

I will need your logs to figure out the actual issue then

any specific parts or the entire thing? would i need to blur/black out some parts due to steam privacy?

Entire thing. Only thing that can show up is steamid so up to you.

Here is the logs
please note that this is me starting the game all the way to typing "lgu" into the terminal
[Message:   BepInEx] BepInEx <IP_ADDRESS> - Lethal Company (11/15/2024 2:56:11 PM)
[Info   :   BepInEx] Running under Unity v2<IP_ADDRESS>51836
[Info   :   BepInEx] CLR runtime version: 4.0.30319.42000
[Info   :   BepInEx] Supports SRE: True
[Info   :   BepInEx] System platform: Bits64, Windows
[Message:   BepInEx] Preloader started
[Info   :   BepInEx] Loaded 1 patcher method from [BepInEx.Preloader <IP_ADDRESS>]
[Info   :   BepInEx] Loaded 1 patcher method from [FixPluginTypesSerialization <IP_ADDRESS>]
[Info   :   BepInEx] Loaded 1 patcher method from [BepInEx.MonoMod.HookGenPatcher <IP_ADDRESS>]
[Info   :   BepInEx] 3 patcher plugins loaded
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Info   :HookGenPatcher] Previous MMHOOK location found. Using that location to save instead.
[Info   :HookGenPatcher] Already ran for this version, reusing that file.
[Message:FixPluginTypesSerialization] Using the config cache
[Info   :FixPluginTypesSerialization] Running under Unity v2022.3.9
[Info   :   BepInEx] Patching [UnityEngine.CoreModule] with [BepInEx.Chainloader]
[Message:   BepInEx] Preloader finished
[Message:   BepInEx] Chainloader ready
[Message:   BepInEx] Chainloader started
[Info   :   BepInEx] 5 plugins to load
[Info   :   BepInEx] Loading [LethalLib 0.16.1]
[Info   : LethalLib] LethalLib loaded!!
[Info   :   BepInEx] Loading [CSync 5.0.1]
[Info   :     CSync] CSync successfully applied patches.
[Info   :   BepInEx] Loading [Lethal Company Input Utils 0.7.7]
[Info   :Lethal Company Input Utils] Registered InputUtilsExtendedMouse Layout Override!
[Info   :Lethal Company Input Utils] InputUtils 0.7.7 has finished loading!
[Info   :   BepInEx] Loading [Interactive Terminal API 1.2.0]
[Info   :Interactive Terminal API] Game managers have been patched
[Info   :Interactive Terminal API] Interactive Terminal API 1.2.0 has been loaded successfully.
[Info   :   BepInEx] Loading [More Ship Upgrades 3.10.11]
[Info   :More Ship Upgrades] Registed sample for the enemy "centipede"...
[Info   :More Ship Upgrades] Registed sample for the enemy "bunker spider"...
[Info   :More Ship Upgrades] Registed sample for the enemy "hoarding bug"...
[Info   :More Ship Upgrades] Registed sample for the enemy "flowerman"...
[Info   :More Ship Upgrades] Registed sample for the enemy "mouthdog"...
[Info   :More Ship Upgrades] Registed sample for the enemy "baboon hawk"...
[Info   :More Ship Upgrades] Registed sample for the enemy "crawler"...
[Info   :More Ship Upgrades] Registed sample for the enemy "forestgiant"...
[Info   :More Ship Upgrades] Registed sample for the enemy "manticoil"...
[Info   :More Ship Upgrades] Registed sample for the enemy "tulip snake"...
[Info   :More Ship Upgrades] Registed sample for the enemy "bush wolf"...
[Info   :More Ship Upgrades] Registed sample for the enemy "puffer"...
[Info   :More Ship Upgrades] Registed sample for the enemy "maneater"...
[Info   :More Ship Upgrades] Items have been setup
[Info   :More Ship Upgrades] Commands have been setup
[Info   :More Ship Upgrades] Upgrades have been setup
[Info   :More Ship Upgrades] Enemies have been patched
[Info   :More Ship Upgrades] HUD has been patched
[Info   :More Ship Upgrades] Interactables have been patched
[Info   :More Ship Upgrades] Items have been patched
[Error  :More Ship Upgrades] [Tools] Couldn't find second negative value representing no sales
[Error  :More Ship Upgrades] [Tools] Couldn't find second maximum amount of items to go on sale
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Not found
[Error  :More Ship Upgrades] [Tools] Couldn't find minimum sale percentage
[Error  :  HarmonyX] Failed to patch void Terminal::SetItemSales(): System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentOutOfRangeException: Index must be within the bounds of the List.
Parameter name: index
  at System.Collections.Generic.List`1[T].Insert (System.Int32 index, T item) [0x00009] in <787acc3c9a4c471ba7d971300105af24>:IL_0009
  at MoreShipUpgrades.Patches.TerminalComponents.TerminalPatcher.SetItemSalesTranspiler (System.Collections.Generic.IEnumerable`1[T] instructions) [0x00174] in <de7b1a1aae914eeb971ea7e6e6371b1e>:IL_0174
  at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in <787acc3c9a4c471ba7d971300105af24>:IL_006A
   --- End of inner exception stack trace ---
  at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00083] in <787acc3c9a4c471ba7d971300105af24>:IL_0083
  at System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) [0x00000] in <787acc3c9a4c471ba7d971300105af24>:IL_0000
  at HarmonyLib.Internal.Patching.ILManipulator.ApplyTranspilers (System.Reflection.Emit.ILGenerator il, System.Reflection.MethodBase original, System.Func`2[T,TResult] getLocal, System.Func`1[TResult] defineLabel) [0x00093] in <474744d65d8e460fa08cd5fd82b5d65f>:IL_0093
  at HarmonyLib.Internal.Patching.ILManipulator.WriteTo (Mono.Cecil.Cil.MethodBody body, System.Reflection.MethodBase original) [0x00066] in <474744d65d8e460fa08cd5fd82b5d65f>:IL_0066
  at HarmonyLib.Public.Patching.HarmonyManipulator.WriteTranspilers () [0x00084] in <474744d65d8e460fa08cd5fd82b5d65f>:IL_0084
  at HarmonyLib.Public.Patching.HarmonyManipulator.WriteImpl () [0x0002b] in <474744d65d8e460fa08cd5fd82b5d65f>:IL_002B
[Error  : Unity Log] ArgumentOutOfRangeException: Index must be within the bounds of the List.
Parameter name: index
Stack trace:
System.Collections.Generic.List`1[T].Insert (System.Int32 index, T item) (at <787acc3c9a4c471ba7d971300105af24>:IL_0009)
MoreShipUpgrades.Patches.TerminalComponents.TerminalPatcher.SetItemSalesTranspiler (System.Collections.Generic.IEnumerable`1[T] instructions) (at <de7b1a1aae914eeb971ea7e6e6371b1e>:IL_0174)
System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <787acc3c9a4c471ba7d971300105af24>:IL_006A)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <787acc3c9a4c471ba7d971300105af24>:IL_0083)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <787acc3c9a4c471ba7d971300105af24>:IL_0000)
HarmonyLib.Internal.Patching.ILManipulator.ApplyTranspilers (System.Reflection.Emit.ILGenerator il, System.Reflection.MethodBase original, System.Func`2[T,TResult] getLocal, System.Func`1[TResult] defineLabel) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0093)
HarmonyLib.Internal.Patching.ILManipulator.WriteTo (Mono.Cecil.Cil.MethodBody body, System.Reflection.MethodBase original) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0066)
HarmonyLib.Public.Patching.HarmonyManipulator.WriteTranspilers () (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0084)
HarmonyLib.Public.Patching.HarmonyManipulator.WriteImpl () (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_002B)
Rethrow as HarmonyException: IL Compile Error (unknown location)
HarmonyLib.Public.Patching.HarmonyManipulator.WriteImpl () (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0378)
HarmonyLib.Public.Patching.HarmonyManipulator.Process (MonoMod.Cil.ILContext ilContext, System.Reflection.MethodBase originalMethod) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0042)
HarmonyLib.Public.Patching.HarmonyManipulator.Manipulate (System.Reflection.MethodBase original, HarmonyLib.PatchInfo patchInfo, MonoMod.Cil.ILContext ctx) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0006)
HarmonyLib.Public.Patching.HarmonyManipulator.Manipulate (System.Reflection.MethodBase original, MonoMod.Cil.ILContext ctx) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0007)
HarmonyLib.Public.Patching.ManagedMethodPatcher.Manipulator (MonoMod.Cil.ILContext ctx) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0012)
MonoMod.Cil.ILContext.Invoke (MonoMod.Cil.ILContext+Manipulator manip) (at <6733e342b5b549bba815373898724469>:IL_0087)
MonoMod.RuntimeDetour.ILHook+Context.InvokeManipulator (Mono.Cecil.MethodDefinition def, MonoMod.Cil.ILContext+Manipulator cb) (at <4e2760c7517c4ea79c633d67e84b319f>:IL_0012)
(wrapper dynamic-method) MonoMod.RuntimeDetour.ILHook+Context.DMD<MonoMod.RuntimeDetour.ILHook+Context::Refresh>(MonoMod.RuntimeDetour.ILHook/Context)
(wrapper dynamic-method) MonoMod.Utils.DynamicMethodDefinition.Trampoline<MonoMod.RuntimeDetour.ILHook+Context::Refresh>?-431858834(object)
HarmonyLib.Internal.RuntimeFixes.StackTraceFixes.OnILChainRefresh (System.Object self) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0000)
MonoMod.RuntimeDetour.ILHook.Apply () (at <4e2760c7517c4ea79c633d67e84b319f>:IL_0059)
HarmonyLib.Public.Patching.ManagedMethodPatcher.DetourTo (System.Reflection.MethodBase replacement) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0047)
Rethrow as HarmonyException: IL Compile Error (unknown location)
HarmonyLib.Public.Patching.ManagedMethodPatcher.DetourTo (System.Reflection.MethodBase replacement) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_005F)
HarmonyLib.PatchFunctions.UpdateWrapper (System.Reflection.MethodBase original, HarmonyLib.PatchInfo patchInfo) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0033)
Rethrow as HarmonyException: IL Compile Error (unknown location)
HarmonyLib.PatchClassProcessor.ReportException (System.Exception exception, System.Reflection.MethodBase original) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0045)
HarmonyLib.PatchClassProcessor.Patch () (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0095)
HarmonyLib.Harmony.PatchAll (System.Type type) (at <474744d65d8e460fa08cd5fd82b5d65f>:IL_0008)
MoreShipUpgrades.Managers.PatchManager.PatchVitalComponents () (at <de7b1a1aae914eeb971ea7e6e6371b1e>:IL_0094)
MoreShipUpgrades.Managers.PatchManager.PatchMainVersion () (at <de7b1a1aae914eeb971ea7e6e6371b1e>:IL_0019)
MoreShipUpgrades.Plugin.Awake () (at <de7b1a1aae914eeb971ea7e6e6371b1e>:IL_0176)
UnityEngine.GameObject:AddComponent(Type)
BepInEx.Bootstrap.Chainloader:Start()
UnityEngine.Rendering.HighDefinition.HDRenderPipelineAsset:OnEnable()

[Message:   BepInEx] Chainloader startup complete
[Info   : Unity Log] Saving changed settings
[Info   : Unity Log] subcribing to steam callbacks
Setting breakpad minidump AppID = 1966720
SteamInternal_SetMinidumpSteamID:  Caching Steam ID:<PHONE_NUMBER>2950019 [API loaded no]
[Info   : Unity Log] Returning week num: 49
[Info   : Unity Log] week num: 49
[Info   : Unity Log] host button pressed
[Info   : Unity Log] Returning week num: 49
[Info   : Unity Log] Displaying menu message
[Info   : Unity Log] Connection approval callback! Game version of client request:
[Info   : Unity Log] Joining client id: 0; Local/host client id: 0
[Info   : Unity Log] Stopped connection approval callback, as the client in question was the host!
[Warning: Unity Log] [Netcode] You cannot decline the host connection. The connection was automatically approved.
[Info   : Unity Log] started host!
[Info   : Unity Log] are we in a server?: True
[Info   : Unity Log] Lobby has been created
[Info   :More Ship Upgrades] [LguStore] No save file found for slot 1. Creating new.
[Info   :More Ship Upgrades] Random upgrades seed wasn't set, calculating a new seed..
[Info   :More Ship Upgrades] [LguStore] SteamID is not available yet, waiting...
[Info   :More Ship Upgrades] Registering key item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering flashlight item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering walkie-talkie item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering shovel item under level 1 of Fusion Matter
[Info   :More Ship Upgrades] Registering pro-flashlight item under level 1 of Fusion Matter
[Info   :More Ship Upgrades] Registering belt bag item under level 2 of Fusion Matter
[Info   :More Ship Upgrades] Registering radar-booster item under level 2 of Fusion Matter
[Info   :More Ship Upgrades] [Hunter] Hoarding Bug set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Snare Flea set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Spore Lizard set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Bunker Spider set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Baboon Hawk set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Tulip Snake set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Kidnapper Fox set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Bracken set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Eyeless Dog set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Half/Thumper set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Manticoil set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Maneater set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Forest Giant set to be harvestable at level 4
[Info   :More Ship Upgrades] [UpgradeBus] Successfully reconstructed with hosts config.
[Info   :More Ship Upgrades] [LguStore] Successfully spawned 54 upgrade objects.
[Info   : Unity Log] Enabling connection callbacks in StartOfRound
[Info   : Unity Log] Began listening to SceneManager_OnLoadComplete1 on this client
[Info   : LethalLib] Adding 0 unlockables to unlockables list
[Info   : LethalLib] Adding 2 items to terminal
[Warning: Unity Log] damageTrigger is disabled! Netcode for GameObjects does not support spawning disabled NetworkBehaviours! The InteractTrigger component was skipped during spawn!
[Info   : LethalLib] Found 13 prefabs to fix
[Info   : Unity Log]<PHONE_NUMBER>
[Info   : Unity Log]<PHONE_NUMBER>
[Info   : Unity Log] level id: 0
[Info   : Unity Log] Changing level
[Info   : Unity Log] Loading from data: for 41 Experimentation: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 220 Assurance: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 56 Vow: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 71 Gordion: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 61 March: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 20 Adamance: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 85 Rend: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 7 Dine: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 21 Offense: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 8 Titan: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 68 Artifice: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 44 Liquidation: iterations at 0, starting at node #-1
[Info   : Unity Log] Loading from data: for 5 Embrion: iterations at 0, starting at node #-1
[Info   : Unity Log] Weather chance: 0.7886578; 1
[Info   : Unity Log] Item sales percentages #0: 0
[Info   : Unity Log] Item sales percentages #1: 0
[Info   : Unity Log] Item sales percentages #2: 0
[Info   : Unity Log] Item sales percentages #3: 0
[Info   : Unity Log] Item sales percentages #4: 0
[Info   : Unity Log] Item sales percentages #5: 0
[Info   : Unity Log] Item sales percentages #6: 0
[Info   : Unity Log] Item sales percentages #7: 0
[Info   : Unity Log] Item sales percentages #8: 0
[Info   : Unity Log] Item sales percentages #9: 0
[Info   : Unity Log] Item sales percentages #10: 0
[Info   : Unity Log] Item sales percentages #11: 0
[Info   : Unity Log] Item sales percentages #12: 0
[Info   : Unity Log] Item sales percentages #13: 0
[Info   : Unity Log] Item sales percentages #14: 0
[Info   : Unity Log] Item sales percentages #15: 0
[Info   : Unity Log] Item sales percentages #16: 0
[Info   : Unity Log] Item sales percentages #17: 0
[Warning: Unity Log] NetworkVariable is written to, but doesn't know its NetworkBehaviour yet. Are you modifying a NetworkVariable before the NetworkObject is spawned?
[Info   : Unity Log] Suits: 1
[Info   : Unity Log] Suit #0: 0
[Info   : Unity Log] pos: (-2.45, 2.75, -8.41); rot: (0.00, 90.00, 0.00)
[Info   : Unity Log] Key 'shipGrabbableItems' does not exist
[Info   : Unity Log] Loaded vehicle ID: -1
[Info   :More Ship Upgrades] Registering key item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering flashlight item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering walkie-talkie item under level 0 of Fusion Matter
[Info   :More Ship Upgrades] Registering shovel item under level 1 of Fusion Matter
[Info   :More Ship Upgrades] Registering pro-flashlight item under level 1 of Fusion Matter
[Info   :More Ship Upgrades] Registering belt bag item under level 2 of Fusion Matter
[Info   :More Ship Upgrades] Registering radar-booster item under level 2 of Fusion Matter
[Info   :More Ship Upgrades] [Hunter] Hoarding Bug set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Snare Flea set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Spore Lizard set to be harvestable at level 1
[Info   :More Ship Upgrades] [Hunter] Bunker Spider set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Baboon Hawk set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Tulip Snake set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Kidnapper Fox set to be harvestable at level 2
[Info   :More Ship Upgrades] [Hunter] Bracken set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Eyeless Dog set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Half/Thumper set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Manticoil set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Maneater set to be harvestable at level 3
[Info   :More Ship Upgrades] [Hunter] Forest Giant set to be harvestable at level 4
[Info   :More Ship Upgrades] [UpgradeBus] Successfully reconstructed with hosts config.
[Info   : Unity Log] Group credits: 60
[Info   : Unity Log] planet mold states length: $13
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/LightSwitchContainer/PlacementCollider"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/Cube"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/AnimatedShipDoor/HangarDoorLeft (1)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (1)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ControlDesk.001"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (3)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (7)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/StorageCloset/Cube.000/Cube"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (6)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (8)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (5)"
[Warning: Unity Log] BoxColliders does not support negative scale or size.
The effective box size has been forced positive and is likely to give unexpected collision geometry.
If you absolutely need to use negative scaling you can use the convex MeshCollider. Scene hierarchy path "Environment/HangarShip/ShipBottomColliders/Cube (4)"
[Info   : Unity Log] Called teleport function on Player
[Info   : Unity Log] Taking control of player Player and enabling camera!
[Info   : Unity Log] Called teleport function on Player (1)
[Info   : Unity Log] Called teleport function on Player (2)
[Info   : Unity Log] Called teleport function on Player (3)
[Info   : Unity Log] Starting voice tracking for player: LM0
[Info   : Unity Log] !!!! ENABLING CAMERA FOR PLAYER: Player
[Info   : Unity Log] !!!! connectedPlayersAmount: 0
[Info   : Unity Log] Has beta?: {hasBeta}
[Info   : Unity Log] Has beta save data: True
[Warning: Unity Log] [Dissonance:Recording] (00:35:31.433) CapturePipelineManager: Detected a frame skip, forcing capture pipeline reset (Delta Time:0.5833381)
[Info   :More Ship Upgrades] [LguStore] Loading SteamID:<PHONE_NUMBER>2950019
[Info   :More Ship Upgrades] [LguStore]<PHONE_NUMBER>2950019 Was not found in save dictionary! Creating new save for ID.
[Info   : Unity Log] Set interminalmenu to true: True
[Info   :More Ship Upgrades] [LguStore] Applying loaded upgrades...
[Error  : Unity Log] Trying to add Caret (TMPro.TMP_SelectionCaret) for graphic rebuild while we are already inside a graphic rebuild loop. This is not supported.
[Info   : Unity Log] Could not parse word: lgu

It seems you're using an older version of the game. Either use older version of mod that is compatible with that version or update the game.

is v64 not the newest version?

ok so i was in the v64 public beta. Thanks for realizing my mistake, and I'm sorry for wasting your time :/


[WIP] Update parent image when parent image's version changes

The comment in _deduplicate_images_to_rebuild says:
# 1) "handle_parent_change" - During this phase, we find out if update
#    to latest image changes also the parent images.
#    For example, foo-1-1 can be built against x-1-1, but foo-1-2 can
#    be built against y-1-1. If we simply replace "foo-1-1" by "foo-1-2"
#    while keeping the original parent image, the "foo-1-2" will be built
#    against x-1-1 instead of y-1-1. This would be wrong.

the current implementation is updating the parent when parent is
changed from x-1-1 to y-1-1, where the name is changed, so why not
also update parent when only version changes?
With this change, if we have a case of:
- foo-1-1 was built against x-1-1
- foo-1-2 was built against x-2-1

then in additional to replace "foo-1-1" by "foo-1-2", we update parent
image to "x-2-1" as well.

Look reasonable to me.

Looks good now

Looks good to me +1

@qixiang feel free to merge this and deploy it tomorrow morning.


<EMAIL_ADDRESS>panicked at 'recursive block_on(): BorrowMutError'

I think this problem might be smol related, since it happens when upgrading to smol 0.1.5 this morning. When using 0.1.4 it doesn't happen.
But since I'm using async-std, I can't rule out that the problem lies in the usage of smol in async-std. But I will ping @stjepang non the less.
When calling task::block_on()  I get the following panic:
thread '<unnamed>' panicked at 'recursive `block_on()`: BorrowMutError', C:\Users\almetica\.cargo\registry\src\github.com-1ecc6299db9ec823\smol-0.1.5\src\block_on.rs:60:37

Since everything was working fine with smol 0.1.4, I think this might be a regression in 0.1.5.
Edit:
Some more context: This happens in the ECS loop which isn't async yet and is spawned using task::spawn_blocking(). A ECS system then later uses task::block_on() to later execute async database code on that thread, which results in the above mentioned panic.

@stjepang This problem has been fixed with smol 0.1.8. It seems that the reverting to the old blocking code has fixed this issue.


15 Aug 2024 - A11y Theme Builder Meeting Minutes

Date
2024-08-15 - 09:15am EDT
Zoom info

Meeting link: https://zoom.us/j/91013899295?pwd=Qnh5UVN1aUZ4ak9tODgvMVNLNUg5Zz09
Meeting id: 910 1389 9295
Password: 123225
Call-in: +1<PHONE_NUMBER> US (New York) (Check calendar for more options)

Untracked attendees

Fullname, Affiliation, (optional) GitHub username
...

Meeting notices

FINOS Project leads are responsible for observing the FINOS guidelines for running project meetings. Project maintainers can find additional resources in the FINOS Maintainers Cheatsheet.

All participants in FINOS project meetings are subject to the LF Antitrust Policy, the FINOS Community Code of Conduct and all other FINOS policies.

FINOS meetings involve participation by industry competitors, and it is the intention of FINOS and the Linux Foundation to conduct all of its activities in accordance with applicable antitrust and competition laws. It is therefore extremely important that attendees adhere to meeting agendas, and be aware of, and not participate in, any activities that are prohibited under applicable US state, federal or foreign antitrust and competition laws. Please contact<EMAIL_ADDRESS>with any questions.

FINOS project meetings may be recorded for use solely by the FINOS team for administration purposes. In very limited instances, and with explicit approval, recordings may be made more widely available.

Agenda

[x] Convene & roll call (5mins)
[x] Display FINOS Antitrust Policy summary slide
[x] Review Meeting Notices (see above)
[x] Approve past meeting minutes
[x] Community WG update (@PaulaPaul)
[x] Upcoming release (@aaronreed708)

dependencies updated
chroma-js issue fixed
updates to SDK on NPM and image on DockerHub

[x] Mentorship project update (@omesh-omg
[ ] ...
[ ] AOB, Q&A & Adjourn (5mins)

Minutes

Decisions Made

[ ] Decision 1
[ ] Decision 2
[ ] ...

Action Items

[ ] (from last week) Lise to get Omesh and Aaron CSS and responsive breakpoints and behaviors for #820 design

will provide CSS for framework only for now

[ ] (from last week)Aaron and Evan need to break the Epic that will be worked on by the mentee into detailed and digestable issues
[ ] (from last week) Lise to work with Aaron to update video in mkdocs documentation
[ ] (from last week) Aaron to share Lise's documentation
[ ] we need to find a location to keep Keith's recording
[ ] Aaron to track down Netlify possibility for Omesh

Evan K - DFS

Aaron Reed - DFS
Kathleen Burkhardt - BlackRock


Test failure on RISC-V platform

What happened?
I am a Fedora packager
When I run pytest on the RISC-V platform, I got four failures
What did you expect to happen?
No response
Minimal Complete Verifiable Example
pytest xarray/tests/test_backends.py::TestNetCDF4ViaDaskData::test_roundtrip_mask_and_scale
pytest xarray/tests/test_backends.py::TestNetCDF4Data::test_roundtrip_mask_and_scale

MVCE confirmation

[x] Minimal example — the example is as focused as reasonably possible to demonstrate the underlying issue in xarray.
[ ] Complete example — the example is self-contained, including all data and the text of any traceback.
[x] Verifiable example — the example copy & pastes into an IPython prompt or Binder notebook, returning the result.
[ ] New issue — a search of GitHub Issues suggests this is not a duplicate.
[X] Recent environment — the issue occurs with the latest version of xarray and its dependencies.

Relevant log output
XFAIL tests/test_units.py::TestDataArray::test_searchsorted[int64-function_searchsorted-identical_unit] - xarray does not implement __array_function__
XFAIL tests/test_units.py::TestDataArray::test_missing_value_filling[int64-method_bfill] - ffill and bfill lose units in data
XFAIL tests/test_units.py::TestPlots::test_units_in_slice_line_plot_labels_isel[coord_unit1-coord_attrs1] - pint.errors.UnitStrippedWarning
XFAIL tests/test_units.py::TestPlots::test_units_in_line_plot_labels[coord_unit1-coord_attrs1] - indexes don't support units
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg2-np_arg2-median] - median is not implemented by Dask
XFAIL tests/test_units.py::TestDataset::test_missing_value_filling[int64-method_bfill] - ffill and bfill lose the unit
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg0-np_arg0-median] - median is not implemented by Dask
XFAIL tests/test_units.py::TestDataArray::test_interp_reindex_like[int64-method_interp_like-data] - uses scipy
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg2-np_arg2-reflect] - dask.array.pad bug
XFAIL tests/test_units.py::TestDataset::test_interp_reindex_like[float64-method_interp_like-coords] - uses scipy
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg3-np_arg3-median] - median is not implemented by Dask
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg4-np_arg4-median] - median is not implemented by Dask
XFAIL tests/test_units.py::TestDataArray::test_numpy_methods_with_args[float64-no_unit-function_clip] - xarray does not implement __array_function__
XFAIL tests/test_units.py::TestDataset::test_interp_reindex[int64-method_interp-data] - uses scipy
XFAIL tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg3-np_arg3-reflect] - dask.array.pad bug
XFAIL tests/test_units.py::TestDataArray::test_interp_reindex_like[int64-method_interp_like-coords] - uses scipy
XFAIL tests/test_units.py::TestDataset::test_interp_reindex_like[int64-method_interp_like-data] - uses scipy
XFAIL tests/test_units.py::TestDataset::test_interp_reindex[int64-method_interp-coords] - uses scipy
XFAIL tests/test_units.py::TestDataset::test_interp_reindex_like[int64-method_interp_like-coords] - uses scipy
XPASS tests/test_computation.py::test_cross[a6-b6-ae6-be6-cartesian--1-False]
XPASS tests/test_dataarray.py::TestDataArray::test_copy_coords[True-expected_orig0]
XPASS tests/test_dataarray.py::TestDataArray::test_to_dask_dataframe - dask-expr is broken
XPASS tests/test_dataset.py::TestDataset::test_copy_coords[True-expected_orig0]
XPASS tests/test_computation.py::test_cross[a5-b5-ae5-be5-cartesian--1-False]
XPASS tests/test_plot.py::TestImshow::test_dates_are_concise - Failing inside matplotlib. Should probably be fixed upstream because other plot functions can handle it. Remove this test when it works, already in Common2dMixin
XPASS tests/test_units.py::TestVariable::test_computation[int64-method_rolling_window-numbagg] - converts to ndarray
XPASS tests/test_units.py::TestVariable::test_computation[int64-method_rolling_window-None] - converts to ndarray
XPASS tests/test_units.py::TestVariable::test_computation[float64-method_rolling_window-numbagg] - converts to ndarray
XPASS tests/test_units.py::TestVariable::test_computation[float64-method_rolling_window-None] - converts to ndarray
XPASS tests/test_units.py::TestDataset::test_computation_objects[float64-coords-method_rolling] - strips units
XPASS tests/test_units.py::TestDataset::test_computation_objects[int64-coords-method_rolling] - strips units
XPASS tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg0-np_arg0-reflect] - dask.array.pad bug
XPASS tests/test_variable.py::TestVariableWithDask::test_pad[xr_arg1-np_arg1-reflect] - dask.array.pad bug
FAILED tests/test_backends.py::TestNetCDF4ViaDaskData::test_roundtrip_mask_and_scale[dtype0-create_unsigned_false_masked_scaled_data-create_encoded_unsigned_false_masked_scaled_data]
FAILED tests/test_backends.py::TestNetCDF4Data::test_roundtrip_mask_and_scale[dtype0-create_unsigned_false_masked_scaled_data-create_encoded_unsigned_false_masked_scaled_data]
FAILED tests/test_backends.py::TestNetCDF4ViaDaskData::test_roundtrip_mask_and_scale[dtype1-create_unsigned_false_masked_scaled_data-create_encoded_unsigned_false_masked_scaled_data]
FAILED tests/test_backends.py::TestNetCDF4Data::test_roundtrip_mask_and_scale[dtype1-create_unsigned_false_masked_scaled_data-create_encoded_unsigned_false_masked_scaled_data]

Anything else we need to know?

I suspect this is an issue with the underlying dependency, given it only occurs in netcdf tests. We could skip the tests when running under that arch?

Thanks.
I suspect this is an issue with the underlying dependency, given it only occurs in netcdf tests. We could skip the tests when running under that arch?

I'm not sure what test this is, but xarray passes all other tests in riscv64.
if it is related to other modules, I think it can be skipped.

if it is related to other modules, I think it can be skipped.

Yes great, we would take a PR to skip them (doesn't have to be from you tbc, I know you're already being generous by packaging this...)


Add support for arbitrary expressions within curly-bracket target evaluators

Example
regular/simple target: test-{param}-123
string that matches it: test-hello-123 ({"param": "hello"})
example expression: prologue-{param * 2}-epilogue
another example: my.thing.{idx}.x
matching strings: ["my.thing.0.x", "my.thing.1.x", "my.thing.2.x"]
example target for processing: your.thing.{int(idx) + 100}.y

I think we can shim in the new behavior by checking if the content within the braces is a valid Python identifier, otherwise treat it as an expression.

Implemented on https://github.com/vkottler/vcorelib/pull/69