[Issue]: Bazel building failed with webpack rules

What happened?
I am working on building FE with bazel.
It can building well with ./node_modules/.bin/webpack --progress --mode=production --stats=minimal . But failed with bazel.
(node:148110) [DEP_WEBPACK_COMPILATION_ADDITIONAL_CHUNK_ASSETS] DeprecationWarning: additionalChunkAssets is deprecated (use Compilation.hooks.processAssets instead and use one of Compilation.PROCESS_ASSETS_STAGE_* as stage option)
(Use `node --trace-deprecation ...` to show where the warning was created)
4 assets
2 modules

ERROR in ./app.tsx
Module build failed (from ../../../../node_modules/.aspect_rules_js/babel-loader@8.3.0_idmflsbzmivcz6fnnmcaipezqe/node_modules/babel-loader/lib/index.js):
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@babel/plugin-proposal-decorators' imported from /autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/babel-virtual-resolve-base.js
    at new NodeError (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2240:5)
    at packageResolve (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2776:9)
    at moduleResolve (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2804:18)
    at defaultResolve (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2835:13)
    at /autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2855:14
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:45:103)
    at _next (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:46:194)
    at /autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:46:364
    at new Promise (<anonymous>)
    at /autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:46:97
    at _resolve (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2862:19)
    at resolve (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/vendor/import-meta-resolve.js:2847:19)
    at /autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/config/files/import-meta-resolve.js:27:38
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/node_modules/.aspect_rules_js/@babel+core@7.21.0/node_modules/@babel/core/lib/config/files/import-meta-resolve.js:15:103)

ERROR in bundle_dist
Module not found: Error: Can't resolve './modules/dreamview/frontend/src/app.tsx' in '/autra/.cache/bazel/cb92cb09597ef463226f6e13f5e110cf/execroot/autra/bazel-out/k8-opt/bin/modules/dreamview/frontend/src'

ERROR in TypeError: Cannot read properties of undefined (reading 'tap')

  - ExternalModuleFactoryPlugin.js:17 ExternalModuleFactoryPlugin.apply
    [bin]/[webpack<EMAIL_ADDRESS>  yPlugin.js:17:37

  - ExternalsPlugin.js:16
    [bin]/[webpack@4.46.0_webpack-cli@4.10.0]/[webpack]/lib/ExternalsPlugin.js:1    6:63

  - Hook.js:14 Hook.CALL_DELEGATE [as _call]
    [bin]/[tapable@2.2.1]/[tapable]/lib/Hook.js:14:14

  - Compiler.js:1164
    [bin]/[webpack@5.75.0_webpack-cli@5.0.1]/[webpack]/lib/Compiler.js:1164:23

  - Hook.js:18 Hook.CALL_ASYNC_DELEGATE [as _callAsync]
    [bin]/[tapable@2.2.1]/[tapable]/lib/Hook.js:18:14

  - Compiler.js:1161 Compiler.compile
    [bin]/[webpack@5.75.0_webpack-cli@5.0.1]/[webpack]/lib/Compiler.js:1161:28

  - Compiler.js:561 Compiler.runAsChild
    [bin]/[webpack@5.75.0_webpack-cli@5.0.1]/[webpack]/lib/Compiler.js:561:8

  - compiler.js:129
    [bin]/[html-webpack-plugin<EMAIL_ADDRESS>  ompiler.js:129:21

  - new Promise

  - compiler.js:128 HtmlWebpackChildCompiler.compileTemplates
    [bin]/[html-webpack-plugin<EMAIL_ADDRESS>  ompiler.js:128:31

  - compiler.js:260 Object.compileTemplate
    [bin]/[html-webpack-plugin<EMAIL_ADDRESS>  ompiler.js:260:24

  - index.js:153
    [bin]/[html-webpack-plugin<EMAIL_ADDRESS>  .js:153:42

  - Hook.js:18 Hook.CALL_ASYNC_DELEGATE [as _callAsync]
    [bin]/[tapable@2.2.1]/[tapable]/lib/Hook.js:18:14

webpack 5.75.0 compiled with 3 errors in 1142 ms

Version
Development (host) and target OS/architectures:
Output of bazel --version:
bazel 5.1.1
Version of the Aspect rules, or other relevant rules from your
WORKSPACE or MODULE.bazel file:
rules_webpack-0.9.1
Language(s) and/or frameworks involved:
JavaScript
How to reproduce
bazel build //modules/dreamview/frontend:bundle_dist

Any other information?
the BUILD file
load("@aspect_rules_webpack//webpack:defs.bzl", "webpack_binary", "webpack_bundle")
load("@npm//:defs.bzl", "npm_link_all_packages")
load("@aspect_rules_js//js:defs.bzl", "js_library")
load("//buildtools/install:install.bzl", "install_files")

package(default_visibility = ["//visibility:public"])

npm_link_all_packages(name = "node_modules")

filegroup(
    name = "frontend_src",
    srcs = glob([
        "src/**/*",
        "proto_bundle/*.json",
        "assets/**/*",
    ]),
)

filegroup(
    name = "frontend_config",
    srcs = [
        ".babelrc",
        ".eslintrc",
        ".prettierignore",
        ".prettierrc.js",
        "global.d.ts",
        "tsconfig.json",
        "webpack.config.js",
    ],
)

js_library(
    name = "webpack_config",
    deps = [
        ":node_modules/webpack",
    ],
)

webpack_binary(
    name = "webpack",
    node_modules = ":node_modules",
)

webpack_bundle(
    name = "bundle_dist",
    srcs = [
        ":frontend_src",
        ":frontend_config",
    ],
    entry_point = "src/app.tsx",
    args = [
        "--progress",
        "--mode=production",
        "--stats=minimal",
    ],
    webpack = ":webpack",
    webpack_config = "webpack.config.js",
    output_dir = True,
    deps = [
        ":webpack_config",
    ],
)

Webpack.js
'use strict';

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WebpackBar = require('webpackbar');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const ESLintPlugin = require('eslint-webpack-plugin');
const TSLintPlugin = require('tslint-webpack-plugin');
const PermissionsOutputPlugin = require('webpack-permissions-plugin');

module.exports = (env, argv) => {
  const mode = argv.mode || 'development';
  const isDev = mode === 'development';
  const proto_base_directory = (env && env.bazel_out_directory) || __dirname;
  const proto_bundle_path = path.resolve(proto_base_directory, 'proto_bundle');
  const autra_base_directory =
    (env && env.bazel_out_directory) || 'modules/dreamview/frontend/';
  const autra_modules_path = path.resolve(autra_base_directory, 'autra_modules_wasm');
  return {
    mode,
    entry: {
      app: './app.tsx',
      parameters: path.join(__dirname, 'src/store/config/parameters.yml')
    },
    context: path.join(__dirname, 'src'),

    output: {
      path: path.join(__dirname, 'dist'),
      filename: '[name].[chunkhash].bundle.js',
      chunkFilename: '[name].[chunkhash].chunk.js',
      publicPath: '/'
    },

    // Enable it when needed in local dev
    devtool: 'inline-source-map',

    resolve: {
      // Files with the following extensions here can be "import"
      // without the extension.
      //
      // Needs ".json" and ".scss" for Grommet.
      extensions: [
        '.webpack.js',
        '.web.js',
        '.jsx',
        '.js',
        '.ts',
        '.tsx',
        '.json',
        '.scss',
        '.css',
        '.less',
        '.png',
        '.svg',
        '.wasm'
      ],
      alias: {
        store: path.resolve(__dirname, 'src/store'),
        styles: path.resolve(__dirname, 'src/styles'),
        components: path.resolve(__dirname, 'src/components'),
        utils: path.resolve(__dirname, 'src/utils'),
        renderer: path.resolve(__dirname, 'src/renderer'),
        v2: path.resolve(__dirname, 'src/v2'),
        assets: path.resolve(__dirname, 'assets'),
        proto_bundle: path.resolve(proto_bundle_path),
      }
    },

    module: {
      rules: [
        {
          test: /\.[tj]sx?$/,
          exclude: /node_modules/,
          use: [
            {
              loader: 'babel-loader',
              options: {
                presets: [
                  ['@babel/preset-env', { targets: 'defaults' }],
                  '@babel/preset-react',
                  '@babel/preset-typescript'
                ],
                plugins: [
                  ['@babel/plugin-proposal-decorators', { legacy: true }],
                  ['@babel/plugin-proposal-class-properties', { loose: false }],
                  '@babel/plugin-transform-runtime',
                  '@babel/plugin-proposal-object-rest-spread',
                  '@babel/plugin-syntax-export-default-from',
                  '@babel/plugin-proposal-optional-chaining'
                ]
              }
            }
          ]
        },
        {
          test: /\.yml$/,
          exclude: /node_modules/,
          use: [{ loader: 'json-loader' }, { loader: 'yaml-loader' }]
        },
        {
          // Object models and materials.
          test: /\.mtl$|\.obj$/,
          exclude: /node_modules/,
          use: [
            {
              loader: 'file-loader'
            }
          ]
        },
        {
          // Load the images. They goes through image-webpack-loader
          // first, and then file-loader.
          //
          // Now you can import images just like js.
          test: /\.(png|jpe?g|svg|mp4|mov|gif|mp3)$/i,
          use: [
            {
              loader: 'file-loader',
              options: {
                name: 'assets/[hash:base64:55].[ext]'
              }
            },
            {
              loader: 'image-webpack-loader',
              options: {
                pngquant: {
                  quality: [0.65, 0.9],
                  speed: 4
                },
                mozjpeg: {
                  progressive: true
                }
              }
            }
          ]
        },
        {
          // This is to apply the following style loaders in (reverse) order.
          // Grommet scss files needs to be processed this way.
          test: /\.(sa|sc|c)ss$/,
          use: [
            {
              loader: 'style-loader'
            },
            {
              loader: 'css-loader'
            },
            {
              loader: 'fast-sass-loader',
              options: {
                includePaths: ['./node_modules']
              }
            }
          ]
        },
        {
          test: /\.less$/,
          use: [
            {
              loader: 'style-loader'
            },
            {
              loader: 'css-loader'
            },
            {
              loader: 'less-loader',
              options: {
                lessOptions: {
                  javascriptEnabled: true
                }
              }
            }
          ]
        },
        {
          // For font-awesome (woff)
          test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
          use: [
            {
              loader: 'url-loader',
              options: {
                limit: 10000,
                mimetype: 'application/font-woff'
              }
            }
          ]
        },
        {
          // For font-awesome (ttf)
          test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
          loader: 'file-loader'
        },
        {
          test: /\.js$/,
          include: [path.resolve(__dirname, 'src/utils/webworker')],
          use: [
            {
              loader: 'babel-loader',
              options: {
                cacheDirectory: true,
                presets: [['@babel/preset-env', { targets: 'defaults' }]]
              }
            }
          ]
        },
        {
          test: /parameters.yml/,
          use: [
            {
              loader: 'file-loader',
              options: {
                name: '[name].json',
                context: 'src/store/config',
                outputPath: '.' // the "dist" dir
              }
            },
            {
              loader: 'yaml-loader'
            }
          ]
        },
        {
          test: /autra_modules\.wasm$/,
          type: 'javascript/auto',
          use: [
            {
              loader: 'file-loader',
              options: {
                name: '[name].[hash].wasm'
              }
            }
          ]
        }
      ]
    },

    plugins: [
      // Generate the actual html from the hbs.
      new HtmlWebpackPlugin({
        favicon: './favicon.png',
        template: './index.hbs',
        // Include only the app. Do not include the service worker.
        chunks: ['app']
      }),
      new CopyWebpackPlugin([
        {
          from: '../node_modules/three/examples/fonts',
          to: 'fonts'
        }
      ]),

      new webpack.DefinePlugin({
        OFFLINE_PLAYBACK: JSON.stringify(false)
      }),

      new ESLintPlugin({
        cache: true,
        extensions: ['js', 'jsx', 'ts', 'tsx']
      }),

      argv.mode === 'development' ? new TSLintPlugin() : null
    ].filter(Boolean),

    devServer: {
      // hide webpack warning overlay in dev
      client: {
        overlay: false
      },
      server: {
        type: 'http'
      },
      host: '<IP_ADDRESS>',
      port: 8080,
      // open: ['http://localhost:8080'],
      static: {
        directory: path.join(__dirname, 'src'),
        serveIndex: true,
        watch: true
      },
      // Ask react-router instead of the server to handle routes.
      historyApiFallback: true,
      allowedHosts: 'all',
      proxy: {
        context: () => true,
        target: 'http://localhost:8888'
      },
      headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': '*',
        'Access-Control-Allow-Methods': '*',
        'Cross-Origin-Embedder-Policy': 'require-corp',
        'Cross-Origin-Opener-Policy': 'same-origin'
      }
    },
    watchOptions: {
      ignored: /node_modules/
    },

    // Disable the warning of large size bundle files.
    performance: {
      hints: false
    }
  };
};

Fund our work

[x] Sponsor our open source work by donating a bug bounty

Hi, @gregmagolan, This problem has troubled me for a long time, all works well when using /node_modules/.bin/webpack serve --progress, but failed with bazel, any idea? thansk.

Great work, thanks.

Thanks you for your support on Open Collective 💚
Webpack under Bazel can be a little tricky. We've had to spend up to a few days working through pathing issues with some plugins and custom webpack configs at clients. I know that webpack can be sensitive to the CWD when it runs so to start I would try setting chdir = package_name() so the current working directory when you webpack is run under Bazel is the directory of the Bazel package the target is in.
https://github.com/aspect-build/rules_webpack/blob/main/docs/rules.md#webpack_bundle-chdir

@gregmagolan Thanks your nice reply. I fixed this issue with chdir field. but the same issue happened next with this link.
I install all package in my modules package.json. But the bazel still do not find the dependency. I have to repeated install them in root package.json. and then bazel can find them.
is it a bug? why rule_js can not find them in my node_modules?
How to change my config to fix that, thanks.

Thanks you for your support on Open Collective green_heart
Webpack under Bazel can be a tricky in some configurations. We've had to spend up to a few days working through pathing issues with some plugins and custom webpack configs at clients while doing Bazel migrations. I know that webpack can be sensitive to the CWD when it runs so to start I would try setting chdir = package_name() so the current working directory when you webpack is run under Bazel is the directory of the Bazel package the target is in.
https://github.com/aspect-build/rules_webpack/blob/main/docs/rules.md#webpack_bundle-chdir

Thanks your help, I have fixed the issue by adding<EMAIL_ADDRESS>path.resolve(__dirname<EMAIL_ADDRESS>to resolve.alias in webpack_config. Thank you again.


Karate closing the browser even though it didnot invoke the browser in first place

We all know that karate has the capability to interact with already opened chrome browser as long as the chrome is opened with --remote-debugging-port value in the first place. The example driver config in karate is as below.
    * configure driver = {type: 'chrome', start: false, port: 9222}
    * driver{}

However, once the feature file is finished, the browser is getting closed by karate. This is causing us a bit of pain as we are testing a Point Of Sale application built on chromium which needs to be up and running 24/7.
My suggestion would be karate not to close the browser whenever we set start: false parameter. or supply a new parameter stop: false to force karate not to close the browser at the end of the test session.
Note: This issue has already been discussed with @ptrthomas and he kind of agreed for this issue to be raised.

@venkiteelay I decided to introduce a stop driver config, because karate stopping the driver is a convenience that teams rely on currently. please see commit for docs. it would be great if you can test this and see if it works as expected !

1.0 released


fix: now name rules skip index.vue

Summary
Now all name rules skip index.vue and won't report it
Description

Created constant for names we should ignore (app and index for now)
Added condition to ignore filenames inside square brackets like [id].vue
Update condition in singleNameComponent rule
Update condition in componentFilenameCasing rule
Update condition in fullWordComponentName rule
Update each rule tests

Related Issues
Fixes #335
Fixes #336
Type of Change

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

In this PR I cover both issues about name rules @rrd108


NFS connectivity issues when message with "9 volumes" found in logs

Hello,
We are investigating error when trying to connect with NFSv4 server for the volumes, which prefixed with some strange log messages:
19.06.2017 22:05:02time="2017-06-19T19:05:02Z" level=warning msg="9 volumes with name=git-data found in Rancher"
19.06.2017 22:05:02time="2017-06-19T19:05:02Z" level=warning msg="9 volumes with name=git-config found in Rancher"
19.06.2017 22:05:02time="2017-06-19T19:05:02Z" level=warning msg="9 volumes with name=git-log found in Rancher"
This issue affects only some volumes, differentiated by these messages. Any other volumes (on same hosts) mounts fine. We've tried to restart NFS server, but these actions don't change this behavior.
Rancher versions:
rancher/server: 1.6.2
rancher/agent: 1.2.2
Infrastructure Stack versions:
network-services: 0.6.6
Docker version: (docker version,docker info preferred)
17.04.0-ce
Operating system and kernel: (cat /etc/os-release, uname -r preferred)
RancherOS v1.0.1 kernel 4.9.24
Type/provider of hosts: (VirtualBox/Bare-metal/AWS/GCE/DO)
Parallels VM
Setup details: (single node rancher vs. HA rancher, internal DB vs. external DB)
Rancher HA. External DB: galera cluster
Environment Template: (Cattle/Kubernetes/Swarm/Mesos)
cattle
Steps to Reproduce:
Do some service upgrades (with mounted NFS external volumes)
Results:
Container starts and immediately stops, or stays in "Starting" phase.

Please let us know in a comment if you can still reproduce the issue, and we'll reopen it


Add DEPLOYMENT_WAIT_APPROVAL to the list of supporting event

What this PR does / why we need it:
Which issue(s) this PR fixes:
Fixes part of #2342
Does this PR introduce a user-facing change?:

NONE

/lgtm

/approve


Implementing custom directive like ng-class

Any idea on how to implement similar to ng-class using custom directives?

Sure.
Use the Slim.customDirective registration.
Let's assume you are using booleans for the simplicity, and the markup would be something like that:
<li class:class-name="booleanName"></li>
The code should be something like:

const matcher = (attr) => attr.nodeName.startsWith('class:') ? attr.nodeName.slice(6) : false;

const execution = (source, target, attribute, match) => {
  const propertyName = attribute.nodeValue;
  const className = match;
  Slim.bind(source, target, propertyName, () => {
    if (source[propertyName]) {
        target.classList.add(className);
    } else {
        target.classList.remove(className);
    }
  };
}

Slim.customDirective(matcher, execution);

You could implement something similar using objects or any syntax you like.
Please let me know how your code works and will be happy to add it to the directives.

Looks good to me! But what does Slim.bind do? Is there any documentation on Slim class?

Need improvement. Check out the source code for the built-in directives.
Slim.bind creates a binding on a specific expression (only the first property in the chain is bound) and every time the property changes your execute function is invoked. De-Binging is done automatically by the garbage collector, if you keep your bindings as arrow-functions it should not be of a problem.


Add Mac bringToFront with NSApp activateIgnoringOtherApps

Also implement IsFront with NSWindow isMainWindow
Mac equivalent to PR #266, where these two functions work to get "launcher functionality" out of my HumbleUI program. I'm also still using JNativeHook to read Alt+Space from the user's keyboard while the launcher program is in the background & then forcing it to the front via BringToFront()
IsFront() is similarly used to determine whether the launcher is already in the foreground so that the launcher can self-minimize.

Thanks!


⚠ Fortnite has degraded performance

In d35064c, Fortnite (https://fortnite.com) experienced degraded performance:

HTTP code: 200
Response time: 1607 ms

Resolved: Fortnite performance has improved in 83785d9.


Customization over subcommand error message

Looking at the command handler for child commands, I've noticed there's no way to customize the error message should the command go wrong. It'll just say Input command %s was not a valid subcommand!, %s being the input. Its under my preference to be able to customize this error, usually giving it the heading of my plugin's name and a different message that uses more player-friendly terms, or even pass it to throw into a help menu.

Wouldn't the fallback command executer be able to do this?

possible component of #548

being combined into #548


Server crash last week

This week i also realised stuff from my chest was missing. I have looked through them and some scarf items as well as 2 mballs are gone. Not only that i am also missing a full doublechest of megastones thats around 200k pokedollars worth of quicksell value. Could you please help, i don't need all the mega stones back if money is easier.

On this screenshot the 2 mega stones are ones that i have found

Resolved


Alignment of Nodes (Parent and children vertically)

Hi thanks for this awesome package. I have little concern regarding alignment of the Nodes. I am creating a family Tree, I want to align the nodes at center so that two children nodes align accordingly to top node , I tired to show them visually here.
Brackets [ ] represent the nodes, there childres nodes

Please guide me through the right path, it is doable.

Hello.
This package uses grid approach for graph representation, meaning that graph's underlying coordinate space is, basically, a 2d Matrix.
Drawing trees in manner above goes out of current grid algorithm capabilities. If you want to draw tree in symmetrical but non grid manner you may try other packages. For instance this:
https://pub.dev/packages/graphview .
I think, in future releases feature like this would be added by creating a gap in the center of even node children.
|_|_|x|_|_|
|x|x|_|x|x|

But thats is also not 100% perfect solution.


My browser does not allow the self certified SSL for localhost

Problem encountered on https://dotnet.microsoft.com/en-us/learn/aspnet/blazor-tutorial/run
Operating System: windows
Provide details about the problem you're experiencing. Include your operating system version, exact error message, code sample, and anything else that is relevant.

Have you checked the information at the bottom of the page? Sometimes the browser needs to be restarted to pick up the dev certificate. If that still does not work, can you try running?
dotnet dev-certs https --trust

Hi, yes I installed the certificate and trusted the entity, the issue seems to be with Edge browser. When I use Chrome to run it, there is no such issue.

I tried it and there should be an option to ignore the error in Edge, see the link at bottom-left

Yeah, usually that page was what I'd get, but not after I installed
the certificate.
I just tried it again, and it worked without any warnings. I guess
restarting my machine might have reloaded the certificate for Edge? Thanks
for your help!
On Mon, 27 Nov 2023 at 18:58, Radek Zikmund @.***>
wrote:

I tried it and there should be an option to ignore the error in Edge, see
the link at bottom-left
image.png (view on web)
https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcore%2Fassets%2F32671551%2F9fb25574-9c6b-410d-8d60-a1308ccf1600&data=05|01||8a8c35f9f4d74db88c9008dbef37c094|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|638366794969225768|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=FTHWefmlhYnLukDPF8ipK7eN7znboDlXX31orX0uDrg%3D&reserved=0
—
Reply to this email directly, view it on GitHub
https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fdotnet%2Fcore%2Fissues%2F8956%23issuecomment-1827606404&data=05|01||8a8c35f9f4d74db88c9008dbef37c094|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|638366794969225768|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=iVQDbDkQc7hOGmAJGjkKC7hFtekVu7XUmHyl7KLMX2E%3D&reserved=0,
or unsubscribe
https://emea01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FABIAL7BNJSMOS7ANIPO2OXLYGRW4JAVCNFSM6AAAAAA7XOF4NKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMRXGYYDMNBQGQ&data=05|01||8a8c35f9f4d74db88c9008dbef37c094|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|638366794969225768|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000|||&sdata=g3PSqqH6oP7fe9eIP2pt0OYWV%2FSdJ23VubN13caETXw%3D&reserved=0
.
You are receiving this because you authored the thread.Message ID:
@.***>


Add support for providing Resource ID within ManagedIdentityCredential

Other language SDKs (such as Java/.NET/GoLang) have the ability to pass in the ResourceIdentifier parameter to the ManagedIdentityCredential ctor.
https://github.com/Azure/azure-sdk-for-net/blob/790d2faf82ae49e37d829ef53bfa92695037a377/sdk/identity/Azure.Identity/api/Azure.Identity.netstandard2.0.cs#L317
Add a similar capability for C++.

@ahsonkhan Is this OID feature that only python currently supports?

No, that's object ID. This is different, it is about resource ID.
I have added more details to the issue description.


SDK 3.45.0-preview.0: Adds Version bump and updates changelog

Pull Request Template
Description
Public contract changes:

Preview contract changes:

One PR with preview or GA one enough right?
Can you please update the release WIKI accordinlgy.

One PR with preview or GA one enough right? Can you please update the release WIKI accordinlgy.

Closing the other one. And I will make some updates to documentation.


[Draft] Braces in printing

Python printing causes an issue when running https://github.com/andromeda/pash/blob/fix-printing-braces/evaluation/intro/demo-spell.sh because it does not properly add the braces after the && in line 7. Therefore, exit in Line 9 is always executed!
@mgree and @thurstond is there any issue with adding braces around everything in the printer? Could we add as many braces to be safe?

Note: We might have broken this when we (me and @mgree ) replaced ; with \n in printing.

Arbitrary braces should be fine; you need the final brace on its own line (or a ; first). I'd do it for:
! && || ;
There should already be braces logic for other compound commands (e.g., Bg/&).

Thanks! I will to add to all the suggested spots :)

@nvasilakis if it looks fine squash and merge :)


[BUG] VC nni show in virtual clusters list but failed when update VC for user.

VC nni show in virtual clusters list but failed when update VC for user.

It's possibly due to test enviroment


Can't link to a section of another document

Search terms
markdown link section
Expected Behavior
In a markdown document,
[Virtual IO](parsing.md#virtualio-and-xinclude)

should create a link to another document.
Actual Behavior
Got a warning:

[warning] The relative path parsing.md#md:virtualio-and-xinclude is not a file and will not be copied to the output directory

and the link in the html doesn't work
Steps to reproduce the bug

Create two markdown files: parsing.md and validate.md;
Add section

## VirtualIO and XInclude

in parsing.md.

add [Virtual IO](parsing.md#virtualio-and-xinclude) in validate.md.
Add both markdown file to project documents.

If there's no section part, i.e. [Virtual IO](parsing.md) works.
Environment

Typedoc version: 0.26.7
TypeScript version: 5.3.3
Node.js version: 18.19.0
OS: MacOS Sonoma 14.6.1

Duplicate of #2687


MSYS2: Cannot build a simple Hello World with clang64 environment

Hello,
I wanted to give GNUstep on Windows a try after finding this repository that seems to replace the old toolchain still shown on the main website; the cross-platform GUI capability is interesting.
I noticed that the "Latest Build" prerelease seems to ship libs-gui so it's the one I chose.
Here is the sample Hello World code I am trying to build:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSLog(@"Hello, World!");
    }
    return 0;
}

This builds successfully when using the VS2022 + clang-cl steps:
# build test.m to produce an object file test.obj
clang-cl -I C:\GNUstep\x64\Release\include -fobjc-runtime=gnustep-2.0 -Xclang -fexceptions -Xclang -fobjc-exceptions -fblocks -DGNUSTEP -DGNUSTEP_WITH_DLL -DGNUSTEP_RUNTIME=1 -D_NONFRAGILE_ABI=1 -D_NATIVE_OBJC_EXCEPTIONS /MDd /Z7 /c test.m

# link object file into executable using the LLD linker
clang-cl test.obj gnustep-base.lib objc.lib dispatch.lib -fuse-ld=lld /MDd /Z7 -o test.exe /link /LIBPATH:C:\GNUstep\x64\Release\lib

However, I can't seem to get it working using MSYS2's clang (in the CLANG64 environment):
$ clang `gnustep-config --objc-flags` -c test.m
In file included from test.m:1:
In file included from C:/GNUstep/x64/Release/include/Foundation/Foundation.h:200:
In file included from C:/GNUstep/x64/Release/include/dispatch/dispatch.h:30:
C:/GNUstep/x64/Release/include/os/generic_win_base.h:31:13: error: typedef redefinition with
      different types ('int' vs '_mode_t' (aka 'unsigned short'))
typedef int mode_t;
            ^
C:/msys64/clang64/include/sys/types.h:77:17: note: previous definition is here
typedef _mode_t mode_t;
                ^
1 error generated.

If I comment out the typedef from the file, the program compiles successfully.
However, the linking step that follows fails:
$ clang `gnustep-config --base-libs` -ldispatch -o test.exe test.o
lld: error: unable to find library -lvcruntime
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Checking /clang64/lib/ shows that the only library close to that is libvcruntime140_app.a.
After renaming libvcruntime140_app.a to libvcruntime.a, the linking step works and I get a functional program.
Is a specific MSYS2 configuration normally required? Or did I just mess everything up?
Or is there just an issue?

Side note: I tried compiling the Calculator app from the tests-examples repository but the linking step failed:
$ clang `gnustep-config --base-libs` -ldispatch -o Calculator.exe *.o
ld.lld: error: undefined symbol: __declspec(dllimport) NSApp
>>> referenced by CalcFace.o:(_i_CalcFace__applicationDidFinishLaunching_)

ld.lld: error: undefined symbol: $_OBJC_CLASS_NSWindow
>>> referenced by CalcFace.o:(.refptr.$_OBJC_CLASS_NSWindow)

ld.lld: error: undefined symbol: $_OBJC_REF_CLASS_NSButton
>>> referenced by CalcFace.o:(.refptr.$_OBJC_REF_CLASS_NSButton)

ld.lld: error: undefined symbol: $_OBJC_REF_CLASS_NSMenu
>>> referenced by CalcFace.o:(.refptr.$_OBJC_REF_CLASS_NSMenu)

ld.lld: error: undefined symbol: $_OBJC_REF_CLASS_NSTextField
>>> referenced by CalcFace.o:(.refptr.$_OBJC_REF_CLASS_NSTextField)

ld.lld: error: undefined symbol: $_OBJC_REF_CLASS_NSWindow
>>> referenced by CalcFace.o:(.refptr.$_OBJC_REF_CLASS_NSWindow)

ld.lld: error: undefined symbol: $_OBJC_REF_CLASS_NSApplication
>>> referenced by main.o:(.refptr.$_OBJC_REF_CLASS_NSApplication)
clang: error: linker command failed with exit code 1 (use -v to see invocation)

It seems more likely for this to simply be because this toolchain is incomplete yet, though.

You’ll want to use the plain "MSYS" environment from MSYS2, not CLANG64 or any of the other MSYS2 environments.
The toolchain requires using the standard Windows Clang compiler, and will likely not work with any of the Clang releases offered as MSYS packages (as they contain MinGW-specific Clang patches). I recommend downloading the latest official Clang, e.g. LLVM-16.0.6-win64.exe from LLVM releases.

Thank you for bringing this up though. I’ve now added the following to the readme:

You also need a standard Windows release of Clang 16 or later, e.g. installed via Chocolatey (choco install llvm) or the latest official release (download "LLVM-x.y.z-win64.exe"). The explanations below expect that Clang is available in your PATH. Note that using Clang from MSYS2/MinGW packages is not supported as they contain MinGW-specific patches.

Please also note that GUI support is so far limited (see #26 for details).


Boon.toJson / Boon.toPrettyJson ignores getters

Currently it seems like boon just completely ignores possibly available getters for properties.
This prevents lazy loading of information, e.g. initializing an object with an id and loading info like name later when it's required to reduce load.

Yes and no.
Yes it does if you use Boon.toJson and/or Boon.toPrettyJson.
Those are quick and easy. They do use fields. They will use the getters if
they don't find the field.
But it does support getters if you use the JsonBuilder gak to configure
serialization.
I will search doc for instructions and if I can't find it then I will write
it up.
It supports. I am 99.999 percent sure.
On Thu, Feb 19, 2015 at 5:42 AM, Richard Schwab<EMAIL_ADDRESS>wrote:

Currently it seems like boon just completely ignores possibly available
getters for properties.
This prevents lazy loading of information, e.g. initializing an object
with an id and loading info like name later when it's required to reduce
load.
—
Reply to this email directly or view it on GitHub
https://github.com/boonproject/boon/issues/303.

--
Rick Hightower
(415) 968-9037
Profile http://www.google.com/profiles/RichardHightower

Thanks, this works for me:
final JsonSerializer serializer = new JsonSerializerFactory().usePropertiesFirst().create();
response.getWriter().println(serializer.serialize(result));

The important part is .usePropertiesFirst().
Found a reference for the factory here and looked at the methods of the factory.
However, is there any way I could get pretty JSON from this?
Would I have to parseJson this and then toPrettyJson it?

final JsonSerializer serializer = new JsonSerializerFactory().usePropertiesFirst().create();
response.getWriter().println(Boon.toPrettyJson(Boon.fromJson(serializer.serialize(result).toString())));

works, but it'd be nice if I wouldn't have to parse and serialize it twice.

Good work.


Possible Solution for #2

hey,
before submitting a new pull request (sometimes sublime mocks me ), i have elaborated a new solution for #2 this involve the injection of the completions thought the sublime api instead of the .sublime-completions file
check it out 066a1865378c4277779eade637cad984dd9bd1cc
tested in both ST2 and ST2

Just gave it a try and it works like a charm, great work :bow:! The code is much clearer now as well. Please submit a pull request to the develop branch, as I restrict the master to releases only. Thank you!

Closed due to #7


Fix a few more typos

This PR fixes …

a couple of typos in the documentation comments
a typo in InitializedStatemachine<T>, renaming it to InitializedStateMachine<T>

Thanks! Just curious, are you actively using statig? I'm always interested to hear someone's thoughts or feedback.

Just curious, are you actively using statig?

Not yet, but I'm working on a personal experimental Arduino-based Rust project right now where I'd like to try statig.
I'll make sure to open issues (or preferably pull-requests) if I find any short-comings.
What are you using statig for if I may ask?

I'm always interested to hear someone's thoughts or feedback.

I had been working on a statechart crate of my own on and off for a while, eventually hit a barrier where I just couldn't figure out how to do transitions from sub- to super-states while also keeping things modular and composable and then eventually basically abandoned the project. So when I stumbled upon statig (né stateful) I was very happy that somebody else figured how to build a no_std-enabled zero-allocation hierarchical state-machine that's also reasonably light on boilerplate.

What are you using statig for if I may ask?

Mostly for personal embedded projects at the moment, some of which I'd like to publish in the future to serve as examples. At work though it's still mainly C/C++, but hopefully that starts to change and I can use statig there as well.

... do transitions from sub- to super-states while also keeping things modular and composable ...

I also struggled a lot with this. Most approaches just went nowhere or became so bloated with boilerplate that  it would lose all usefulness. I'm pretty happy where statig ended up, though I still wish I could get rid of the macro's. It's possible to use statig without them, but they make the developer experience just so much nicer.

Mostly for personal embedded projects at the moment, some of which I'd like to publish in the future to serve as examples.

Still to early to make a judgement call, but so far statig has been quite nice to work with in this embedded project I'm starting to use it in.

I also struggled a lot with this. Most approaches just went nowhere or became so bloated with boilerplate that it would lose all usefulness.

My statechart project was also drowning in boilerplate and the procedural macro logic also went through the roof.
My project was using a dedicated DSL, which I should have abandoned as it ended up making things so much more complicated:
machine!(
    machine: MyMachine {
        states: [ MyState ],
        events: [
            MyEvent {
                transitions: [
                    MyState -> MyState,
                ],
            },
        ],
    }
);

The reason for going with a high-level DSL was that I ultimately wanted to also allow for generating corresponding TLA+/Alloy models, as well as the corresponding Rust code from the same FSM definition. I was overly focussed on ensuring that the generated FSM API would not allow you to perform any transaction that wasn't explicitly defined in the DSL, which ended up suffocating me by the sheer number of specialized one-off Response enums per (hyper-)edge.

I'm pretty happy where statig ended up, though I still wish I could get rid of the macro's. It's possible to use statig without them, but they make the developer experience just so much nicer.

It's always nice to reduce the need for macros, but I have to say I found the macros in statig to be very reasonable to use so far.


Unable to nullify global values in sub chart

Output of helm version:
version.BuildInfo{Version:"v3.5.0", GitCommit:"32c22239423b3b4ba6706d450bd044baffdcf9e6", GitTreeState:"clean", GoVersion:"go1.15.6"}
Output of kubectl version:
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.5", GitCommit:"6b1d87acf3c8253c123756b9e61dac642678305f", GitTreeState:"clean", BuildDate:"2021-03-18T01:10:43Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.10+IKS", GitCommit:"625e0232c45f878423cb1285322bf54ad8a3993f", GitTreeState:"clean", BuildDate:"2021-04-20T22:44:26Z", GoVersion:"go1.15.10", Compiler:"gc", Platform:"linux/amd64"}
Cloud Provider/Platform (AKS, GKE, Minikube etc.): Any cloud
Description:
I have been trying to nullify values in sub chart that are passed via global section in values.yaml.
values.yaml
global:
  sub1:
    key: value

When I use this in the subchart x as .Values.global.sub1.key, it works perfectly fine. I can also override it using --set global.sub1.key=newValue. However, when I try to nullify the value, it fetches the default value from the actual values.yaml.
i.e --set global.sub1.key=null, it still fetches the default value from the original values.yaml.
Please let me know if you need any additional information.

I am curious about this as well as I've run into this with the https://github.com/hashicorp/consul-helm chart as well. We cannot set the resources limit to null because the default values.yaml sets it to something low.
I have made a minimal repository with two Helm charts showing off exactly how this works. https://github.com/ingshtrom/helm-test-null

Even stranger, even though my manual test in my helm-test-null repo shows something working incorrectly, the tests for this actually pass (https://github.com/helm/helm/blob/main/pkg/chartutil/coalesce_test.go)
I even modified them manually by adding the following test {"{{.pequod.ahab.nested.bar}}", "<no value>"}, and it passed there as well, in addition to some other manual modifications I thought would fail based on my testing. Are you still having the issue @abhinaybyrisetty?

OP raised the issue with Helm 3.5.0. I believe there have been a few fixes in Helm 3.6.0 that could have fixed this issue.
Can you please test again using Helm 3.6.0?

Apologies for the confusion; I meant if the OP can try again with 3.6.0.

@bacongobbler I upgraded to 3.6.2, it doesn't work still.


Drop support for Isolate.resolvePackageUri from dart2js and DDC

The implementation in dart2js is broken by default already. It was broken in https://github.com/dart-lang/sdk/commit/7911fb26832d3116ba6476fbfdc37037a7cd5b62#diff-894e25213751e7522ad6394c40e9378e
Unless the user explicitly assigns to defaultPackagesBase the call will fail. We do have some tests against this behavior:
https://github.com/dart-lang/sdk/blob/b080e7c97a879eb803c725621b3993cbe994d19d/tests/lib_2/isolate/browser/package_resolve_browser_hook2_test.dart#L14
There is at least one known use case which attempts to be cross platform which depends on this. It's currently broken by default with dart2js but works with DDC: https://github.com/dart-lang/resource/blob/f8e37558a1c4f54550aa463b88a6a831e3e33cd6/lib/src/resolve.dart#L11
We need to decide if it is worth supporting this use case and either break support, or migrate the implementation to some other place - perhaps as a utility in dart:html. My preference would be to remove support.
cc @vsmenon @sigmundch

Interesting, while we can't rule out that people are using it via defaultPackagesBase, it does feel less likely.
My inclination is to go ahead and remove the support as well.
We can do a quick search for packages that use either the isolate API or the resolve package to assess potential impact to make sure. Then create a breaking change proposal to remove the support. Especially since we say that dart:isolate itself is not supported on Dart for the web, we can clarify that this is extra clean up.
Another option to consider here is that instead of removing just this API, to go to the full leap and make it invalid to import these libraries entirely. That has the potential of being more breaking (since the presence of an import will break people's builds), so I'd consider that more cautiously.

If dart:isolate is not supported, we should not allow importing it. Then noone can access Isolate.resolvePackageUri anyway.
We have made yet another "kind-of supported" library, and we shouldn't be doing that.
What would break if we simply disallowed importing dart:isolate in web compilers? (Along with dart:io)

we should not allow importing it

The golden path for external users is to compile through build_runner with build_web_compilers which does not allow importing dart:isolate already - although there is a bug if the import is in the same file as main, we should have that fixed soon.
We are working hard on restricting imports internally as well. dart:mirrors is currently on a whitelist, dart:isolate should also be on a whitelist soon, dart:io is disallowed.
Users who run dart2js directly do not have this restriction. I'd be in favor of adding it, but we'd need to figure out if any workflows will be broken and we'd still need an escape hatch internally for some legacy code which can't easily be refactored to avoid the imports.

We have made yet another "kind-of supported" library, and we shouldn't be doing that.

We did that for dart:mirrors, dart:io, and dart:isolate already. We've been working on slowly closing those gaps ever since.


Configuration file

In order to:

be able to run Transformer as a script,
allow users to have a one-time setup of Transformer (in either script of library use case),

we should make Transformer read its configuration from a file.
It was discussed that the configuration file could be either declarative (e.g. YAML, TOML, JSON, ...) or an actual Python file.
:information_source: Issue imported from TIP/docs#391.

Things that could be centralized in a config file:

weights
enabled plugins
blacklist

Config files would also need to be scoped to the directory they belong to.


be_initupvals never returns

A shot in the dark as I'm struggling with a strange issue.
Berry vm "stops" in be_initupvals, at this line:
https://github.com/berry-lang/berry/blob/ecc8a24b81f8beef269aac34edf9b71f7b130f44/src/be_func.c#L44
Dereferencing blocks.
Only on my MCU.
At this point, I am suspecting a memory issue on my end, but I'm not 100% sure.
Any idea what else could that be?

Sorry but I have never seen that issue.

Disabling a bunch of features seems to do the trick for now. Pretty sure I'm hitting the memory limit of my MCU.
Closing.


fix(entities-plugins): fix consumer jwt rsa pub key input field

Summary

Resources

Creating a package docs

Hi @dustinryerson, I feel the right fix for this would be to update this line to
-    if (treatAsCredential.value && props.config.app === 'kongManager' && credentialSchema) {
+    if (treatAsCredential.value && credentialSchema) {

Reason: we take two steps to generate schema:

Fetch schema from the backend.
a. Konnect backend does not provide credentials schema, so we have them hardcoded [here].(https://github.com/Kong/public-ui-components/tree/main/packages/entities/entities-plugins/src/definitions/schemas/credentials)
Merge the backend schema with some frontend overrides. This is done in buildFormSchema.

Step two should apply to both KM and Konnect, so we can remove the props.config.app === 'kongManager' condition.
packages/entities/entities-plugins/src/definitions/schemas/credentials/mockedJwtSchema.json needs to stay the same as what the actual backend schema looks like (if there is one), meaning its "type" will not be "textArea". And then in packages/entities/entities-plugins/src/components/PluginForm.vue we don't have to handle the situation where scheme.type === 'textArea'.
So could you revert your changes and verify if removing props.config.app === 'kongManager' is good enough? Thanks!
Note: after removing props.config.app === 'kongManager' you'll notice that the rsa_public_key field is gone. This is because it needs the algorithm to be ES* or RS* to show as defined here

Hi @dustinryerson, I feel the right fix for this would be to update this line to
-    if (treatAsCredential.value && props.config.app === 'kongManager' && credentialSchema) {
+    if (treatAsCredential.value && credentialSchema) {

Reason: we take two steps to generate schema:

Fetch schema from the backend.
a. Konnect backend does not provide credentials schema, so we have them hardcoded here.
Merge the backend schema with some frontend overrides. This is done in buildFormSchema.

Step two should apply to both KM and Konnect, so we can remove the props.config.app === 'kongManager' condition.
packages/entities/entities-plugins/src/definitions/schemas/credentials/mockedJwtSchema.json needs to stay the same as what the actual backend schema looks like (if there is one), meaning its "type" will not be "textArea". And then in packages/entities/entities-plugins/src/components/PluginForm.vue we don't have to handle the situation where scheme.type === 'textArea'.
So could you revert your changes and verify if removing props.config.app === 'kongManager' is good enough? Thanks!
Note: after removing props.config.app === 'kongManager' you'll notice that the rsa_public_key field is gone. This is because it needs the algorithm to be ES* or RS* to show as defined here.

@Leopoldthecoder this was super helpful information, I tested your suggested fix and it worked perfectly. Thank you!


Create LICENSE

license file would make a sense... just for consideration to credit your work if someone like me is using it. I am open for discussion

thanks


Fix MeshResourceMarker for mesh with color-based embedded material

Issue: Color from embedded color based mesh are overrided and not rendered as expected
It was an known issue on ROS1 that was fixed by
https://github.com/ros-visualization/rviz/pull/1424
Kudos to the original author
Fix #927
Signed-off-by: Xavier BROQUERE<EMAIL_ADDRESS>

In order to test this PR , I used this repo https://github.com/xbroquer/rviz_collada_marker/tree/ros2
ros2 launch rviz_collada_marker mesh_marker_test.launch.py

Humble
PR tested on Humble

Hello @ahcorde,
is it possible to review this PR ?  it will be great if this could be in the coming  humble sync :)
Thanks!

CI:

Linux
Linux-aarch64
Windows

Hi  @clalancette ,
Is it possible to backport this change on humble ? Do I have to do something ?
Thanks

Is it possible to backport this change on humble ?

It looks like it preserves ABI and API, so yes, we can backport it.  I'll ask the bot to do it.

@Mergifyio backport humble


intentionally record video without audio and bypass permission checks

I have a use case where it is necessary to record a video clip without audio streams and wanted to bypass the permissions request and warning messages if audio permissions were not granted already.

I think it would be a great idea to keep using the ManufacturerUtil or create another one like PlatformUtil to address all the SDK_INT ifs, in fact is what Android is doing with all its "compat" util classes.


User Story: Move cards

As a user I want to move cards/tasks in order to change the current status of the task.

[ ] Internal lane data structure
[ ] update internal data structure (via events?)


Proper way to launch something on startup

When I was using i3 there was a facility to do it placing
exec "commands; more commands; even more commands"

and it was executed after wm starts.
Tried same in sway has no effect.
May be there any alternatives to it, may be even outside sway?
Real case one: earlier I've got ~/.xinitrc, and many things were there. (May be exist any alternative for wayland?)
Real case two: I want to launch some applications when system starts.

Just put it on several lines:
exec command
exec command
exec command

Sway does quoting differently from i3. exec "commands; more commands; even more commands" will attempt to run /usr/bin/"commands; more commands; even more commands"


what is the relationship between node，task，scheduler？

I read the source code of node and publish part. but I don't find the code about task，scheduler in this part. but when I run the example talker . it log that it cannot find the conf file, so it use the default conf to manage it.
the scheduler looks like only  manage the task in the process. If I run many example process, it cannot mange them and run the most important process at first. And I also don't know how to give the task and use scheduler in the process. maybe I need create some threads to take some nodes as tasks and give them to scheduler?

I found I can new a thread and give to to cyber rt to manage in a process.
what the defualt priority for the main thread?

Threads have no priority and only two strategies: FIFO and RR

OK. Thank you.


Hotfix on rank assignement for physical properties

Pull Request Test Coverage Report for Build<PHONE_NUMBER>
Details

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

Totals

Change from base Build<PHONE_NUMBER>:
0.0%

Covered Lines:
898

Relevant Lines:
910

💛  - Coveralls


Make install errors

After running  root@user:~/ttyd/build# make   results errors:
root@user:~/ttyd/build# make
[ 16%] Building C object CMakeFiles/ttyd.dir/src/http.c.o
/root/ttyd/src/http.c: In function 'callback_http':
/root/ttyd/src/http.c:155:45: error: 'HTTP_STATUS_FOUND' undeclared (first use in this function)
if (lws_add_http_header_status(wsi, HTTP_STATUS_FOUND, &p, end) ||
^
/root/ttyd/src/http.c:155:45: note: each undeclared identifier is reported only once for each function it appears in
CMakeFiles/ttyd.dir/build.make:86: recipe for target 'CMakeFiles/ttyd.dir/src/http.c.o' failed
make[2]: *** [CMakeFiles/ttyd.dir/src/http.c.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/ttyd.dir/all' failed
make[1]: *** [CMakeFiles/ttyd.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

Check you libwebsockets installation, HTTP_STATUS_FOUND is defined in libwebsockets.

Seems ok
apt-get install -y libwebsockets-devReading package lists... Done
Building dependency tree
Reading state information... Done
libwebsockets-dev is already the newest version (1.7.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Check you libwebsockets installation, HTTP_STATUS_FOUND is defined in libwebsockets.

Check you libwebsockets installation, HTTP_STATUS_FOUND is defined in libwebsockets.

Seems ok
apt-get install -y libwebsockets-devReading package lists... Done
Building dependency tree
Reading state information... Done
libwebsockets-dev is already the newest version (1.7.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Should be fixed on master now, HTTP_STATUS_FOUND was introduced since lws 2.0


Update teachingmaterial.tsv

Adding a Spanish-language R tutorial. The coordinates are probably not placed properly.

Cool! Thanks for the PR.
Unfortunately the validation fails with
Err "There was a problem on row 48, in the `Citation` field (column 17): I couldn't find the `Citation` column."

Probably there is a tab or maybe a newline missing somewhere. Could you check and try to make it valid?

Apologies for all the error notifications. I tried to revise the changes to produce valid tsv but I must be missing something that I can't pinpoint, since I never use this format.

Thanks for trying! There were just a couple of tabs missing in your new row, so that was easy to fix for me. I recommend editing .tsv (and .csv) files with LibreOffice Calc. That works really well and intuitively :+1:


resteamer

What should we do to forward the broadcast from the RTMP server to another RTMP server?

take the rtmp server as publish stream client,then you can forward your stream to another rtmp server
please refer to this example,  example_rtmp_publish_client

How can I send data from rtmp server to ffmpeg?

please  refer to example_rtmp_server
in  sendToClient function , rtmp server send media data to rtmp client.

how to test this example

this example support play/publish stream,so you can test this example with with these two  steps

push stream to rtmp server with ffmpeg
for example: ffmpeg -re -i  test.flv  -c copy  -f flv rtmp://<IP_ADDRESS>/live/test

play stream from rtmp server with ffmpeg.  this step is what you want to do(send data to ffmpeg)
for example: ffmpeg -i rtmp://<IP_ADDRESS>/live/test  -acodec copy -vcodec copy download.flv

please refer to example_rtmp_server in sendToClient function , rtmp server send media data to rtmp client.

how to test this example

this example support play/publish stream,so you can test this example with these two steps
1. push stream to rtmp server with ffmpeg
   for example:` ffmpeg -re -i  test.flv  -c copy  -f flv rtmp://<IP_ADDRESS>/live/test`

2. play stream from rtmp server with ffmpeg.  this step is what you want to do(send data to ffmpeg)
   for example:` ffmpeg -i rtmp://<IP_ADDRESS>/live/test  -acodec copy -vcodec copy download.flv`

There is a bug when multiple play requests are received. It sends data to the last incoming play request.

ffplay rtmp://<IP_ADDRESS>:1936/live/test
ffplay version v1.34-3-g735ba7c-5.0 Copyright (c) 2003-2022 the FFmpeg developers
built with Apple clang version 12.0.5 (clang-1<IP_ADDRESS>)

configuration: --enable-videotoolbox --enable-libdav1d --enable-libsvtav1 --enable-libvpx --enable-libaom --enable-libzimg --enable-lv2 --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libtheora --disable-debug --disable-doc --disable-shared --enable-pthreads --enable-static --enable-small --enable-version3 --extra-cflags='-I/Users/workspace/include -I/Users/workspace/include/lilv-0' --extra-ldexeflags= --extra-ldflags=-L/Users/workspace/lib --extra-libs='-ldl -lpthread -lm -lz' --pkgconfigdir=/Users/workspace/lib/pkgconfig --pkg-config-flags=--static --prefix=/Users/workspace --extra-version=5.0
libavutil      57. 17.100 / 57. 17.100
libavcodec     59. 18.100 / 59. 18.100
libavformat    59. 16.100 / 59. 16.100
libavdevice    59.  4.100 / 59.  4.100
libavfilter     8. 24.100 /  8. 24.100
libswscale      6.  4.100 /  6.  4.100
libswresample   4.  3.100 /  4.  3.100
[h264 @ 0x7fdbac224080] SEI type 250 size 512 truncated at 64=0/0
[h264 @ 0x7fdbac224080] SEI type 250 size 512 truncated at 56
[h264 @ 0x7fdbac224080] illegal POC type 6    0KB sq=    0B f=0/0
Last message repeated 3 times
Input #0, flv, from 'rtmp://<IP_ADDRESS>:1936/live/test':
Duration: N/A, start: 12.016000, bitrate: N/A
Stream #0:0: Video: h264, yuv420p(progressive), 1920x1080, 30 tbr, 1k tbn
Stream #0:1: Audio: aac, 48000 Hz, stereo, fltp
[h264 @ 0x7fdbac355b40] SEI type 250 size 512 truncated at 56=0/0
[h264 @ 0x7fdbac319e40] illegal POC type 6
Last message repeated 2 times
[NULL @ 0x7fdbac224080] log2_max_frame_num_minus4 out of range (0-12): 32
[h264 @ 0x7fdbac3739c0] log2_max_frame_num_minus4 out of range (0-12): 32
Last message repeated 2 times
[NULL @ 0x7fdbac224080] non-existing PPS 2 referenced    0B f=0/0
[NULL @ 0x7fdbac224080] missing picture in access unit with size 9157
[NULL @ 0x7fdbac224080] non-existing SPS 2 referenced in buffering period
[NULL @ 0x7fdbac224080] missing picture in access unit with size 9945
[h264 @ 0x7fdbac34bbc0] A non-intra slice in an IDR NAL unit.
[h264 @ 0x7fdbac34bbc0] decode_slice_header error
[h264 @ 0x7fdbac34bbc0] no frame!
[h264 @ 0x7fdbac355b40] Missing reference picture, default is 0/0
[h264 @ 0x7fdbac355b40] decode_slice_header error
[h264 @ 0x7fdbac37d940] data partitioning is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[h264 @ 0x7fdbac37d940] If you want to help, upload a sample of this file to https://streams.videolan.org/upload/ and contact the ffmpeg-devel mailing list<EMAIL_ADDRESS>[h264 @ 0x7fdbac37d940] no frame!
[h264 @ 0x7fdbac3739c0] non-existing SPS 2 referenced in buffering period
[h264 @ 0x7fdbac3739c0] no frame!
[NULL @ 0x7fdbac224080] missing picture in access unit with size 9153
[h264 @ 0x7fdbac319e40] data partitioning is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[h264 @ 0x7fdbac319e40] If you want to help, upload a sample of this file to https://streams.videolan.org/upload/ and contact the ffmpeg-devel mailing list<EMAIL_ADDRESS>[h264 @ 0x7fdbac319e40] no frame!
[NULL @ 0x7fdbac224080] missing picture in access unit with size 287597
[h264 @ 0x7fdbac34bbc0] data partitioning is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[h264 @ 0x7fdbac34bbc0] If you want to help, upload a sample of this file to https://streams.videolan.org/upload/ and contact the ffmpeg-devel mailing list<EMAIL_ADDRESS>[h264 @ 0x7fdbac34bbc0] no frame!
[NULL @ 0x7fdbac224080] log2_max_frame_num_minus4 out of range (0-12): 32
[h264 @ 0x7fdbac35fac0] log2_max_frame_num_minus4 out of range (0-12): 32
Last message repeated 2 times
[NULL @ 0x7fdbac224080] non-existing PPS 2 referenced    0B f=0/0
[h264 @ 0x7fdbac369a40] slice type 11 too large at 0
[h264 @ 0x7fdbac369a40] decode_slice_header error
[h264 @ 0x7fdbac369a40] no frame!
[NULL @ 0x7fdbac224080] missing picture in access unit with size 9297
[h264 @ 0x7fdbac3739c0] data partitioning is not implemented. Update your FFmpeg version to the newest one from Git. If the problem still occurs, it means that your file has a feature which has not been implemented.
[h264 @ 0x7fdbac3739c0] If you want to help, upload a sample of this file to https://streams.videolan.org/upload/ and contact the ffmpeg-devel mailing list<EMAIL_ADDRESS>[h264 @ 0x7fdbac3739c0] no frame!
[NULL @ 0x7fdbac224080] non-existing SPS 2 referenced in buffering period
[NULL @ 0x7fdbac224080] non-existing SPS 5 referenced in buffering period
[NULL @ 0x7fdbac224080] Picture timing SEI payload too large
[h264 @ 0x7fdbac30fe00] non-existing SPS 2 referenced in buffering period
[h264 @ 0x7fdbac30fe00] non-existing SPS 5 referenced in buffering period
[h264 @ 0x7fdbac30fe00] Picture timing SEI payload too large
[NULL @ 0x7fdbac224080] SEI type 84 size 1368 truncated at 6400/0
[NULL @ 0x7fdbac224080] sps_id 32 out of range
[h264 @ 0x7fdbac319e40] SEI type 84 size 1368 truncated at 639
[h264 @ 0x7fdbac319e40] sps_id 32 out of range
Last message repeated 2 times
47.21 A-V: -0.222 fd=   0 aq=  476KB vq=    0KB sq=    0B f=0/0

fix 7d28a10
please update to the latest version, and test this example again

There is one more problem.
Cannot send to Play or Rtmp Client with video quality coming to Rtmp Server.
It has a low video quality.

Sorry, Could you give me an example to help me to understand it.

I'm using the example_rtmp_server.go example.

push stream to rtmp server with ffmpeg. (test.flv the quality of:1080p)
for example: ffmpeg -re -i  test.flv  -c copy  -f flv rtmp://<IP_ADDRESS>/live/test

play stream from rtmp server with ffmpeg. (quality shown is 360p)
for example: ffplay rtmp://<IP_ADDRESS>/live/test

Another little thing;
I'm trying to save as mp4 using the RTMP Server here, unfortunately there is a problem :(

vtid := muxer.AddVideoTrack(mp4.MP4_CODEC_H264)
atid := muxer.AddAudioTrack(mp4.MP4_CODEC_AAC)
for {
if sess.conn != nil {
pkt, err := sess.conn.ReadPacket()
if err != nil {
break
}
switch pkt.Type {
case av.H264:
muxer.Write(vtid, pkt.VSeqHdr, uint64(pkt.CTime), uint64(pkt.Time))
case av.AAC:
muxer.Write(atid, pkt.ASeqHdr, uint64(pkt.CTime), uint64(pkt.Time))
}
}
}
muxer.WriteTrailer()

could you upload your test.flv file ?

https://getsamplefiles.com/download/flv/4k

Another little thing;
I'm trying to save as mp4 using the RTMP Server here, unfortunately there is a problem :(

there is something wrong with the test code. pkt is flv tag data,not really video/audio frame, pkt.CTime means CompositionTime , pts =  dts + cts . so you should use go-codec to demuxer this pkt. just like below code ,

var h264 []byte
 if pkt.Type == av.H264DecoderConfig {
      spss,ppss := codec.CovertExtradata(pkt.Data)
      h264  = append(h264,spss[0]...)
      h264  = append(h264,ppss [0]...)
 } else if pkt.Type == av.H264 {
      h264 = codec.ConvertAnnexBToAVCC(pkt.Data)
 }
pts := pkt.CTime + pkt.Time
dts := pkt.Time
muxer.Write(vtid, h264, pts, dts)

you can refer to this code, i write this code just  now ,without compile and  test =

https://getsamplefiles.com/download/flv/4k

i have no time now,  i will reply you tomrrow

Another little thing;
I'm trying to save as mp4 using the RTMP Server here, unfortunately there is a problem :(

there is something wrong with the test code. pkt is flv tag data,not really video/audio frame, pkt.CTime means CompositionTime , pts = dts + CompositionTime  . so you should use go-codec to demuxer this pkt. just like below code ,
var h264 []byte
 if pkt.Type == av.H264DecoderConfig {
      spss,ppss := codec.CovertExtradata(pkt.Data)
      h264  = append(h264,spss[0]...)
      h264  = append(h264,ppss[0]...)
 } else if pkt.Type == av.H264 {
      h264 = codec.ConvertAnnexBToAVCC(pkt.Data)
 }
pts := pkt.CTime + pkt.Time
dts := pkt.Time
muxer.Write(vtid, h264, pts, dts)

you can refer to this code, i write this code just now ,without compile and test

sorry ConvertAnnexBToAVCC should replace by CovertAVCCToAnnexB

Another little thing;
I'm trying to save as mp4 using the RTMP Server here, unfortunately there is a problem :(

there is something wrong with the test code. pkt is flv tag data,not really video/audio frame, pkt.CTime means CompositionTime , pts = dts + CompositionTime  . so you should use go-codec to demuxer this pkt. just like below code ,
var h264 []byte
 if pkt.Type == av.H264DecoderConfig {
      spss,ppss := codec.CovertExtradata(pkt.Data)
      h264  = append(h264,spss[0]...)
      h264  = append(h264,ppss[0]...)
 } else if pkt.Type == av.H264 {
      h264 = codec.ConvertAnnexBToAVCC(pkt.Data)
 }
pts := pkt.CTime + pkt.Time
dts := pkt.Time
muxer.Write(vtid, h264, pts, dts)

you can refer to this code, i write this code just now ,without compile and test

sorry, ConvertAnnexBToAVCC should replace by CovertAVCCToAnnexB

muxer.WriteTrailer()

https://getsamplefiles.com/download/flv/4k

I don't see anything problem with it. ffplay works well。

Another little thing;
I'm trying to save as mp4 using the RTMP Server here, unfortunately there is a problem :(

there is something wrong with the test code. pkt is flv tag data,not really video/audio frame, pkt.CTime means CompositionTime , pts = dts + CompositionTime  . so you should use go-codec to demuxer this pkt. just like below code ,
var h264 []byte
 if pkt.Type == av.H264DecoderConfig {
      spss,ppss := codec.CovertExtradata(pkt.Data)
      h264  = append(h264,spss[0]...)
      h264  = append(h264,ppss[0]...)
 } else if pkt.Type == av.H264 {
      h264 = codec.ConvertAnnexBToAVCC(pkt.Data)
 }
pts := pkt.CTime + pkt.Time
dts := pkt.Time
muxer.Write(vtid, h264, pts, dts)

you can refer to this code, i write this code just now ,without compile and test

sorry, ConvertAnnexBToAVCC should replace by CovertAVCCToAnnexB

muxer.WriteTrailer() panic: runtime error: index out of range [1] with length 1

please use below code to test, it works well.
package main

import (
	"encoding/binary"
	"fmt"
	"net"
	"os"
	"time"

	"github.com/notedit/rtmp/av"
	"github.com/notedit/rtmp/format/rtmp"
	"github.com/yapingcat/gomedia/go-codec"
	"github.com/yapingcat/gomedia/go-mp4"
)

type stream struct {
	videoSeq av.Packet
	audioSeq av.Packet
	conn     *rtmp.Conn
}

func startRtmp() {

	lis, err := net.Listen("tcp", ":1935")
	if err != nil {
		panic(err)
	}

	s := rtmp.NewServer()

	s.LogEvent = func(c *rtmp.Conn, nc net.Conn, e int) {
		es := rtmp.EventString[e]
		fmt.Println(nc.LocalAddr(), nc.RemoteAddr(), es)
	}

	s.HandleConn = func(c *rtmp.Conn, nc net.Conn) {

		fmt.Println(c.URL.Path)
		if c.Publishing {
			mp4filename := "test2.mp4"
			mp4file, err := os.OpenFile(mp4filename, os.O_CREATE|os.O_RDWR, 0666)
			if err != nil {
				fmt.Println(err)
				return
			}
			defer mp4file.Close()
			muxer, err := mp4.CreateMp4Muxer(mp4file)
			if err != nil {
				fmt.Println(err)
				return
			}
			hasVideo := false
			hasAudio := false
			var vtid uint32
			var atid uint32
			defer muxer.WriteTrailer()
			var asc []byte
			for {
				nc.SetReadDeadline(time.Now().Add(time.Second))
				pkt, err := c.ReadPacket()
				if err != nil {
					fmt.Println(err)
					return
				}
				pts := pkt.CTime.Milliseconds() + pkt.Time.Milliseconds()
				dts := pkt.Time.Milliseconds()
				switch pkt.Type {
				case av.H264DecoderConfig:
					if !hasVideo {
						vtid = muxer.AddVideoTrack(mp4.MP4_CODEC_H264)
						hasVideo = true
					}
					tmpspss, tmpppss := codec.CovertExtradata(pkt.Data)
					fmt.Println(len(tmpspss), len(tmpppss))
					pts := pkt.CTime + pkt.Time
					frame := make([]byte, 0, len(tmpspss[0])+len(tmpppss[0]))
					frame = append(frame, tmpspss[0]...)
					frame = append(frame, tmpppss[0]...)
					codec.ShowPacketHexdump(tmpspss[0])
					fmt.Println(codec.GetSPSIdWithStartCode(tmpspss[0]))
					muxer.Write(vtid, frame, uint64(pts), uint64(dts))
				case av.H264:
					for len(pkt.Data) > 0 {
						naluSize := binary.BigEndian.Uint32(pkt.Data[:4])
						codec.ShowPacketHexdump(pkt.Data[:6])
						codec.CovertAVCCToAnnexB(pkt.Data)
						muxer.Write(vtid, pkt.Data[:4+naluSize], uint64(pts), uint64(dts))
						pkt.Data = pkt.Data[4+naluSize:]
					}
					//fmt.Println("h264 frame pts ", pts, "dts ", dts)
				case av.AACDecoderConfig:
					if !hasAudio {
						atid = muxer.AddAudioTrack(mp4.MP4_CODEC_AAC)
						hasAudio = true
					}

					asc = make([]byte, len(pkt.Data))
					copy(asc, pkt.Data)
				case av.AAC:
					adts, err := codec.ConvertASCToADTS(asc, len(pkt.Data)+7)
					if err != nil {
						return
					}
					//fmt.Println("aac frame pts ", pts, "dts ", dts)
					adts_frame := append(adts.Encode(), pkt.Data...)
					muxer.Write(atid, adts_frame, uint64(pts), uint64(dts))
				}
			}

		}
	}

	for {
		nc, err := lis.Accept()
		if err != nil {
			time.Sleep(time.Second)
			continue
		}
		go s.HandleNetConn(nc)
	}
}

func main() {

	startRtmp()
}

please use below code to test, it works well.

There is a small problem.
It is necessary to save when requested, not the entire broadcast. When we do as in the example, it is saved as a single file.
It would be healthier if we could use it as PubSub.

package main

import (
	"encoding/binary"
	"fmt"
	"github.com/yapingcat/gomedia/go-codec"
	"github.com/yapingcat/gomedia/go-mp4"
	"net"
	"os"
	"strconv"
	"time"

	"github.com/notedit/rtmp/av"
	"github.com/notedit/rtmp/format/rtmp"
)

type H264DecoderConfig struct {
	Data  []byte
	CTime time.Duration
	Time  time.Duration
}

type Video struct {
	H264Config H264DecoderConfig
	AACConfig  []byte
	pkt        chan av.Packet
}

var VidData map[string]*Video

func startRtmp() {

	lis, err := net.Listen("tcp", ":1935")
	if err != nil {
		panic(err)
	}

	s := rtmp.NewServer()

	s.LogEvent = func(c *rtmp.Conn, nc net.Conn, e int) {
		es := rtmp.EventString[e]
		fmt.Println(nc.LocalAddr(), nc.RemoteAddr(), es)
	}

	s.HandleConn = func(c *rtmp.Conn, nc net.Conn) {

		fmt.Println(c.URL.Path)
		if c.Publishing {
			VidData[c.URL.Path] = &Video{
				pkt: make(chan av.Packet),
			}

			var asc []byte

			for {
				nc.SetReadDeadline(time.Now().Add(time.Second))
				pkt, err := c.ReadPacket()
				if err != nil {
					fmt.Println(err)
					return
				}

				switch pkt.Type {
				case av.H264DecoderConfig:
					VidData[c.URL.Path].H264Config = H264DecoderConfig{Data: pkt.Data, Time: pkt.Time, CTime: pkt.CTime}
				case av.AACDecoderConfig:
					asc = make([]byte, len(pkt.Data))
					copy(asc, pkt.Data)
					VidData[c.URL.Path].AACConfig = asc
				case av.H264:
					VidData[c.URL.Path].pkt <- pkt
				case av.AAC:
					VidData[c.URL.Path].pkt <- pkt
				}
			}

			close(VidData[c.URL.Path].pkt)
		}
	}

	for {
		nc, err := lis.Accept()
		if err != nil {
			time.Sleep(time.Second)
			continue
		}
		go s.HandleNetConn(nc)
	}
}

func record(bcName string, count int) {
	mp4filename := fmt.Sprintf("test-%s.mp4", strconv.Itoa(count))
	mp4file, err := os.OpenFile(mp4filename, os.O_CREATE|os.O_RDWR, 0666)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer mp4file.Close()

	muxer, err := mp4.CreateMp4Muxer(mp4file)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer muxer.WriteTrailer()

	isClose := false
	//Test CMD
	go func() {
		time.Sleep(10 * time.Second)
		isClose = true

		time.Sleep(15 * time.Second)
		count++
		record(bcName, count)
	}()

	var vtid uint32
	var atid uint32
	var asc []byte

	vData := VidData[bcName]

	//Add Video Header
	h264DecoderConfig := vData.H264Config
	vtid = muxer.AddVideoTrack(mp4.MP4_CODEC_H264)
	tmpspss, tmpppss := codec.CovertExtradata(h264DecoderConfig.Data)
	pts := h264DecoderConfig.CTime + h264DecoderConfig.Time
	frame := make([]byte, 0, len(tmpspss[0])+len(tmpppss[0]))
	frame = append(frame, tmpspss[0]...)
	frame = append(frame, tmpppss[0]...)
	muxer.Write(vtid, frame, uint64(pts), uint64(h264DecoderConfig.Time.Milliseconds()))

	//Add Audio Header
	atid = muxer.AddAudioTrack(mp4.MP4_CODEC_AAC)
	asc = vData.AACConfig

	for {
		if isClose {
			break
		}
		pkt := <-vData.pkt

		pts := pkt.CTime.Milliseconds() + pkt.Time.Milliseconds()
		dts := pkt.Time.Milliseconds()
		switch pkt.Type {
		case av.H264:
			for len(pkt.Data) > 0 {
				naluSize := binary.BigEndian.Uint32(pkt.Data[:4])
				muxer.Write(vtid, pkt.Data[:4+naluSize], uint64(pts), uint64(dts))
				pkt.Data = pkt.Data[4+naluSize:]
			}
		case av.AAC:
			adts, err := codec.ConvertASCToADTS(asc, len(pkt.Data)+7)
			if err != nil {
				return
			}
			adts_frame := append(adts.Encode(), pkt.Data...)
			muxer.Write(atid, adts_frame, uint64(pts), uint64(dts))
		}
	}
}

func main() {

	VidData = make(map[string]*Video)

	go func() {
		time.Sleep(10 * time.Second)
		record("/live/test", 1)
	}()

	startRtmp()
}

please use below code to test, it works well.

There is a small problem. It is necessary to save when requested, not the entire broadcast. When we do as in the example, it is saved as a single file.
It would be healthier if we could use it as PubSub.

the problem is out of gomedia's range.

Yes, I got such an error because of the fps problem in the stream.
But right now I am getting the following error every 3-4 records;
OUT OF RANGE

Yes, I got such an error because of the fps problem in the stream. But right now I am getting the following error every 3-4 records;
OUT OF RANGE

could you show me the stack of the panic ?   and please show me your code if you can .

panic: OUT OF RANGE

goroutine 18 [running]:
github.com/yapingcat/gomedia/go-codec.(*BitStream).GetBit(...)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/bitstream.go:90
github.com/yapingcat/gomedia/go-codec.(*BitStream).ReadUE(0xc00005a700, 0x1000000010b8225)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/bitstream.go:152 +0x129
github.com/yapingcat/gomedia/go-codec.(*SliceHeader).Decode(0xc0001216e0, 0xc000121700)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/h264.go:35 +0x2b
github.com/yapingcat/gomedia/go-codec.GetH264FirstMbInSlice(0xc00029e805, 0x5, 0x270c, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/util.go:106 +0x10c
github.com/yapingcat/gomedia/go-mp4.isH264NewAccessUnit(0xc00029e805, 0x5, 0x270c, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4-codec.go:69 +0xbc
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeH264.func1(0xc00029e805, 0x5, 0x270c, 0x4)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:322 +0x5a5
github.com/yapingcat/gomedia/go-codec.SplitFrameWithStartCode(0xc00029e805, 0x5, 0x270c, 0xc00005a918)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/util.go:62 +0x18e
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeH264(0xc00010d790, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:287 +0xc5
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeSample(0xc00010d790, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:271 +0xdf
github.com/yapingcat/gomedia/go-mp4.(*Movmuxer).Write(0xc0000b2000, 0xc000000001, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4muxer.go:166 +0x95
main.(*MediaRecorder).WritePacket(0xc0000aa050, 0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, ...)
        /Users/usr/GolandProjects/test5/main.go:157 +0x1c5
github.com/notedit/rtmp/pubsub.(*PubSub).AddSub.func1(0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, 0x0, ...)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:170 +0x75
github.com/notedit/rtmp/pubsub.(*splitSeqhdr).do(0xc00005ae20, 0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, ...)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:115 +0x35e
github.com/notedit/rtmp/pubsub.(*PubSub).AddSub(0xc000074200, 0xc000026150, 0x11d2ac0, 0xc0000aa050)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:197 +0x3d8
main.startRecord(0xc00001e454, 0x9, 0x11a65ab, 0x1)
        /Users/usr/GolandProjects/test5/main.go:122 +0x3c5
created by main.startStopTester
        /Users/usr/GolandProjects/test5/main.go:190 +0x112
exit status 2

panic: OUT OF RANGE

goroutine 18 [running]:
github.com/yapingcat/gomedia/go-codec.(*BitStream).GetBit(...)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/bitstream.go:90
github.com/yapingcat/gomedia/go-codec.(*BitStream).ReadUE(0xc00005a700, 0x1000000010b8225)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/bitstream.go:152 +0x129
github.com/yapingcat/gomedia/go-codec.(*SliceHeader).Decode(0xc0001216e0, 0xc000121700)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/h264.go:35 +0x2b
github.com/yapingcat/gomedia/go-codec.GetH264FirstMbInSlice(0xc00029e805, 0x5, 0x270c, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/util.go:106 +0x10c
github.com/yapingcat/gomedia/go-mp4.isH264NewAccessUnit(0xc00029e805, 0x5, 0x270c, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4-codec.go:69 +0xbc
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeH264.func1(0xc00029e805, 0x5, 0x270c, 0x4)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:322 +0x5a5
github.com/yapingcat/gomedia/go-codec.SplitFrameWithStartCode(0xc00029e805, 0x5, 0x270c, 0xc00005a918)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-codec/util.go:62 +0x18e
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeH264(0xc00010d790, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:287 +0xc5
github.com/yapingcat/gomedia/go-mp4.(*mp4track).writeSample(0xc00010d790, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4track.go:271 +0xdf
github.com/yapingcat/gomedia/go-mp4.(*Movmuxer).Write(0xc0000b2000, 0xc000000001, 0xc00029e805, 0x5, 0x270c, 0x42a, 0x42a, 0x0, 0x0)
        /Users/usr/go/pkg/mod/github.com/yapingcat/gomedia@v0.0.0-20220913143744-b450185c5d08/go-mp4/mp4muxer.go:166 +0x95
main.(*MediaRecorder).WritePacket(0xc0000aa050, 0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, ...)
        /Users/usr/GolandProjects/test5/main.go:157 +0x1c5
github.com/notedit/rtmp/pubsub.(*PubSub).AddSub.func1(0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, 0x0, ...)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:170 +0x75
github.com/notedit/rtmp/pubsub.(*splitSeqhdr).do(0xc00005ae20, 0x1, 0x0, 0x0, 0x3f89de80, 0xc00029e805, 0x270c, 0x270c, 0x0, 0x0, ...)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:115 +0x35e
github.com/notedit/rtmp/pubsub.(*PubSub).AddSub(0xc000074200, 0xc000026150, 0x11d2ac0, 0xc0000aa050)
        /Users/usr/go/pkg/mod/github.com/notedit/rtmp@v0.0.2/pubsub/pubsub.go:197 +0x3d8
main.startRecord(0xc00001e454, 0x9, 0x11a65ab, 0x1)
        /Users/usr/GolandProjects/test5/main.go:122 +0x3c5
created by main.startStopTester
        /Users/usr/GolandProjects/test5/main.go:190 +0x112
exit status 2

i guess there are two reason will result in this panic

the slice of the h264 frame is not thread safe. more than one goroutine read/write it at the same time
may be there is something special in the h264 stream.

so i need more information to let me debug it.

please  save rtmp stream into raw h264 file.
It would be great if you could provide the code  and the test media source (like rtmp stream or media file)

When the video is h264_nvenc it only records the audio. I get the error OUT OF RANGE for the video.
Can you please help to support this format as well

When the video is h264_nvenc it only records the audio. I get the error OUT OF RANGE for the video. Can you please help to support this format as well

please dump  the stream frame into file

There were some mistakes in the video, thanks.


Add aggregation CLI

Add CLI for iris aggregations sum, mean, median, std_dev, min, max. There are options to either broadcast the result back to the original dimensions (which is what we need for Rainforests) or collapse the aggregated dimensions. The code wraps the existing function utilities.cube_manipulation.collapse, adding the broadcasting functionality and the CLI.
Testing:

[X] Ran tests and they passed OK
[X] Added new tests for the new feature(s)
[X] Added acceptance tests

@benowen-bom Thanks for pointing out that Improver already does broadcasting. This allows us to simplify this change considerably. The code now just slightly extends the existing collapse_realizations method to allow the user to specify the aggregation type. (We currently do not need to aggregate over any other dimensions, so I've left this functionality out.) The option to rename the cube is now handled in the cli.


Release v0.11.0

What this PR does / why we need it:
Which issue(s) this PR fixes:
Fixes #
Does this PR introduce a user-facing change?:

NONE

/lgtm

Finally Plan preview will get available 🎉
/approve


Protobuf support for Spark - from_proto AND to_proto

From<EMAIL_ADDRESS>and Mohan<EMAIL_ADDRESS>Introduction
Protocol buffers are Google's language-neutral, platform-neutral, extensible mechanism for serializing structured data. It is widely used in Kafka-based data pipelines. Unlike Avro, Spark does not have native support for protobuf. This PR provides two new functions from_proto/to_proto to read and write Protobuf data within a data frame.
The implementation is closely modeled after Avro implementation so that it is easy to understand and review the changes.
Following is an example of a typical usage.
// `from_proto` requires absolute path of Protobuf schema file
// and the protobuf message within the file
val userProtoFile = "./examples/src/main/resources/user.desc"
val userProtoMsg = "User"

val df = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("subscribe", "proto-topic-in")
  .load()

// 1. Decode the Protobuf data into a struct;
// 2. Filter by column `favorite_color`;
// 3. Encode the column `name` in Protobuf format.
val output = df
  .select(from_proto('value, userProtoFile, userProtoMsg) as 'user)
  .where("user.favorite_color == \"red\"")
  .select(to_proto($"user.name") as 'value)

val query = output
  .writeStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("topic", "proto-topic-out")
  .start()

The new functions are very similar to Avro

from_proto requires the proto descriptor file and the message type within that file which is similar to from_avro requiring the JSON schema.
to_proto is similar to to_avro and does not require the proto descriptor file as it can build the schema (protobuf descriptor) from the catalyst types. Similarly, to_proto (like to_avro) can also take in the descriptor file for describing the schema

What is supported

Protobuf format proto3 is supported ( Even though proto2 and proto3 is inter-operable, we have explicitly tested only with proto3)
Google protobuf supported types

Scalar value types
Enumerations
Message types as field types
Nested Messages
Maps
Unknown fields are well-formed protocol buffer serialized data representing fields that the parser does not recognize. Original version of proto3 did not include this when there are parsing problems. This feature is needed to detect schemas that does not match the message type and needed to support FAIL_SAFE and PERMISSIVE mode. This feature is available in proto3 with version. 3.5 onwards

What is not supported

Any requires the knowledge of the underlying object type when deserializing the message and generally not considered type safe
OneOf requires the knowledge of the object type that was encoded when deserializing the message
Custom Options is an advanced feature within protobuf where the users can define their own options
Catalyst types that are not natively supported in protobuf. This happens normally during serialization and an exception will be thrown when following types are encountered

DecimalType
DateType
TimestampType

Test cases covered
Tests have been written to test at different levels

from_proto / to_proto (ProtoFunctionSuite)
ProtoToCatalyst / CatalystToProto (ProtoCatalystDataConversionSuite)
ProtoDeserializer / ProtoSerializer (ProtoSerdeSuite)

ProtoFunctionSuite
A bunch of roundtrip tests that go through to_proto(from_proto) or from_proto(to_proto) and compare the results. It also repeats some of the tests where to_proto is called without a descriptor file where the protobuf descriptor is built from the catalyst types.

roundtrip in to_proto and from_proto for struct for protobuf scalar types
roundtrip in to_proto(without descriptor params) and from_proto - struct for protobuf scalar types
roundtrip in from_proto and to_proto - Repeated protobuf types
roundtrip in from_proto and to_proto - Repeated Message Once
roundtrip in from_proto and to_proto(without descriptor params) - Repeated Message Once”
roundtrip in from_proto and to_proto - Repeated Message Twice
roundtrip in from_proto and to_proto(without descriptor params) - Repeated Message Twice
roundtrip in from_proto and to_proto - Map
roundtrip in from_proto and to_proto(without descriptor params) - Map
roundtrip in from_proto and to_proto - Enum
roundtrip in from_proto and to_proto - Multiple Message
roundtrip in from_proto and to_proto(without descriptor params) - Multiple Message
roundtrip in to_proto and from_proto - with null

ProtoSerdeSuite

Test basic conversion - serialize(deserialize(message)) == message
Fail to convert with field type mismatch - Make sure the right exception is thrown for incompatible schema for serializer and deserializer
Fail to convert with missing nested Proto fields
Fail to convert with deeply nested field type mismatch
Fail to convert with missing Catalyst fields

ProtoCatalystDataConversionSuite

ProtoToCatalyst(to_proto(basic_catalyst_types )): Boolean,Integer,Double,Float,Binary,String,Byte,Shost
Handle unsupported input of Message type: Serialize a message first and deserialize using a bad schema. Test with FAILFAST to get an exception and PERMISSIVE to get a null row
filter push-down to proto deserializer: Filtering the rows based on the filter during proto deserialization
Test ProtoDeserializer with binary message type

Build issues that are unrelated to PR

Can one of the admins verify this patch?

@SandishKumarHN & Mohan, great to see this. Great timing as we at Databricks are also thinking on the same lines.
I will comment in-line rather than commenting here as we can have good threading.

@rangadi That would be great. This is just the initial PR. We will make necessary changes based on the review.

@rangadi
Here are the changes in this PR and it addresses the following review comments:

All references to proto has been changed to protobuf
to_proto. requires a protobuf descriptor for serialization
In Deserialization, use the binary directly and avoid calling ByteArrayInputStream
Handle schema evolution and also check for invalid schema. Look at fields in UnknownFieldSet and if they appear in the original schema, raise an exception as this indicates type mismatch. If they don’t appear in the original schema, they indicate schema evolution. We have added two new test cases : oldProducer → newConsumer and newProducer →. OldConsumer for schema evolution. There is also a test case for schema invalidation
Maps is now converted to MapType. Unit tests were already available.
TODO comment about sharing code with Avro support
{DynamicSchema, MessageDefinition}.scala removed as part of toProto not supporting schema-less mode. Hence no doc comment required
Added an exception when building the Catalyst schema from protobuf as a default case
Recusrive schemas are detected now. A unit test has been added
ProtobufDeserializer using datatimeRebaseSpec as an argument has been removed as it was not used

Here are the pending ones

Python. support
Schema registry support
Proto2 support

Let's discuss how we want to approach the pending items.

Let's discuss how we want to approach the pending items.

I think we can add them as follow up PRs. What do you think?

Yes, we can do that.

Thanks for the updates. Looks great! I will go through unit tests later today. Is this tested on real spark cluster? Could you update the PR description with brief details of that?

Original version that was posted has been tested on a real spark cluster. We have to retest the ones that has been updated with the comments in the last few days.

@mposdev21 sounds good. please update the testing section.
Do you plan to remove "[WIP]" prefix in the title :)?
I will start a few next steps threads as code comments (it gives threading).

@mposdev21 sounds good. please update the testing section. Do you plan to remove "[WIP]" prefix in the title :)? I will start a few next steps threads as code comments (it gives threading).

Updated the PR and also removed WIP.

@SandishKumarHN This PR LGTM overall.
Two important follow-ups:

Build documentation (similar to https://spark.apache.org/docs/latest/sql-data-sources-avro.html)
User error classes for all the exceptions

@SandishKumarHN @mposdev21 Thanks for the great work!
@rangadi Thanks for the review.
Merging to master

@SandishKumarHN  I am going to set you as the assignee in https://issues.apache.org/jira/browse/SPARK-40654. Do you have a jira account?

@SandishKumarHN I am going to set you as the assignee in https://issues.apache.org/jira/browse/SPARK-40654. Do you have a jira account?

@gengliangwang yes, SandishKumarHN or<EMAIL_ADDRESS>

Added two tickets to the Epic:

SPARK-40776 for documentation
SPARK-40777 for errors.


Theme component collapse

[YELLOW]
When the component is collapsed smaller in browser size. The stacking of the promos is odd and off balance. The hierarchy in size should always be: top article larger, bottom articles smaller. In the example below this hierarchy is switched

As discussed with @Norvard and @davidpmccormick:
n is the number of promos.

The top row will always have the lesser of n/2
The top row will never have more than three

e.g.

n of promos
top row
bottom row

1
1
0

2
1
1

3
1
2

4
2
2

5
2
3

6
3
3

7
3
4

8
3
5

9
3
6

Superseded by work in #607.


Short Notation behaves weirdly

Hi @ggarek,
I (as many) love this extension you created but I ran into a issue that I can't seem to solve.
Everytime I use short notation on variable declarations the first line (that one that has either var, let or const) seems to behave weirdly, it seems to create a "three space gap" between that line's assignment operator and the next ones.
I attached an image here and I used one of the examples you provided, I also disabled all of the other extensions I have to see if maybe it was a cross-extension issue but to no avail, the problem persists.

Are you aware of this issue?
Thanks again for the great work!
Mário

Ahh, i did not check align-it for long time, the reason being i do not use it.
I am surprised someone still does, though. 😅
But, i am glad to hear that it is still somehow useful.
I do not use it for the reason. Now i understand, that it is better not to align code like "alignit" does.
Actually, i think we should not align our code this way.
Regarding your use case, i have two comments:

If we still consider "alignit" a legit extension, then it is definitely something that one should look into and probably fix
I would strongly recommend against declaring multiple variables in one var/let/const statement.

I can't promise, i will look into it, but if you could post your code example as text, it would definitely help.
Thanks for using "AlignIt" anyway, @mariodmp ! ❤


Boosting of recent names in switch statements is unhelpful

I was trying to write a switch statement for an enum
enum {
A,
B,
C,
D,
} X;
switch(X) {
  case A:break;
  case B:break;
  case ^
}

was expecting at least alphabetical order, but unfortunately B popsup as first element and makes it hard to find next value. Maybe we should even demote values that we've already seen in switch statements/if else blocks?

Or even remove it from completion results. Completing B in that case would produce a compiler error.

This is fixed now, clangd no longer suggests enum values that have already been handled in a switch.


feat(checker): Do not output anything if there are no conflicting rules

Resolves #133.

Yay, awesome thanks! 🎉
Can't wait for the next release now :)

That was so fast! Thanks @ikatyang :)


Update tdr-metadata-validation to 0.0.34 in scala-steward-dependencies

About this PR
📦 Updates uk.gov.nationalarchives:tdr-metadata-validation from 0.0.27 to 0.0.34
📜 GitHub Release Notes - Version Diff
Usage
✅ Please merge!
I'll automatically update this PR to resolve conflicts as long as you don't change it yourself.
If you'd like to skip this version, you can just close this PR. If you have any feedback, just mention me in the comments below.
Configure Scala Steward for your repository with a .scala-steward.conf file.
Have a fantastic day writing Scala!

⚙ Adjust future updates
Add this to your .scala-steward.conf file to ignore future updates of this dependency:
updates.ignore = [ { groupId = "uk.gov.nationalarchives", artifactId = "tdr-metadata-validation" } ]

Or, add this to slow down future updates of this dependency:
dependencyOverrides = [{
  pullRequests = { frequency = "30 days" },
  dependency = { groupId = "uk.gov.nationalarchives", artifactId = "tdr-metadata-validation" }
}]

labels: library-update, early-semver-major, semver-spec-patch, commit-count:1

Superseded by #129.