[Question] Best way to create a documentation about components

Hey,
My team and I decided to create a documentation for the components created inside our app. I'm searching for some way to easily do BlazeComponent.listComponents(), and it would be awesome to have access to variables inside the component and list them.
Any ideas on how to do this?

You have BlazeComponent.components which contains all the components. See here.
Which variables are you thinking about? The ReactiveField you attach in onCreated?

@mitar, it was just an idea, but probably yes. I want to list the atts inside the component. Tnks for the quick response

@mitar, about the BlazeComponent.components, in order to get a component I need to do this:
BlazeComponent.components[""].LoginSteps
Is there any specific reason for [""] ? It works but it feels strange 😄

See explanation here. So you can use that constant instead, so BlazeComponent.components[ComponentsNamespace.COMPONENTS_FIELD].

Feel free to create a pull request with static method on ComponentsNamespace to return all components inside a namespace, and another for all sub-namespaces.
So feel free to organize that code for you to make it work for you.

But are attributes dynamically added after construction of the component?
So, there are multiple things we ca be talking here:

arguments you pass with {{> component args <arguments>}}
data context arguments expected by the component
reactive fields you add to the component in its onCreated

Which one are you using in your project? Which one you care about?

@mitar, Our idea is this:
Okay, let me check if that component already exists. Nice, it exists. What are the arguments that can be passed into it? All of this without checking the code. We are even training our design team to use this type of documentation. With this it would be possible for them to understand if a component is customisable.
I don't know if I'm dreaming too much, listing the components it's already great for us.
About the PR, we are already working on somethings that will probably become a PR.

BTW, do you know of: https://github.com/peerlibrary/meteor-blaze-components-explorer
My attempt at creating a global component list: http://components-explorer.meteorapp.com/
I never had time to really do it, but my idea was to:

have a standard way that you include a screenshot of the component
list all components in a way published on Atmosphere
the ideas of arguments you are mentioning also sound very good

Probably we should first then define the proposed way to document and pass the arguments.
But besides arguments there is also what helpers you can and should use. So what methods exist on the component. Or do you think that this is internal to the component?
I like how https://github.com/coffeedoc/codo can discover all the symbols. So maybe, depending if you have enough resources, we could develop something really beautiful here.

But in this case we are talking about internal components right?
I'm thinking that we can do this in 2 different ways. One is something like codo, a external service that creates documentation based on comments and symbols. We use something similar for our Rails API, as you can check here.
The other direction would be an autodiscover function. Based on BlazeComponet.components function I can look for helpers, arguments, reactive fields and generate a clean array of objects as a result. That array can be used to render an interface. Nothing stops to use this method and also use comments to add screenshots, for example.
someting like BlazeComponents.getComponent(foo).methods() would already brake a leg here. We could filter private method (as onRendered) and use the others to create the documents.
For method one we would probably use commander + gulp (our common stack for CLI) to go over the project, find components and generate an output.
Sounds pretty interesting... what do you think?

As we are going this far, why not list the event binding? (We are defining events on js)

See also: #139

As we are going this far, why not list the event binding? (We are defining events on js)

Isn't this internal to the component? User of a component should not have to know anything about events.

I can look for helpers, arguments, reactive fields and generate a clean array of objects as a result

I am not sure how you can really do that? They are available after component is created only (because mostly they are created in a constructor or onCreated). I am not sure how we could make this automatic. But maybe you know. :-)

That array can be used to render an interface.

Which interface?

Nothing stops to use this method and also use comments to add screenshots, for example.

Of course, we should try to get as much information about the component automatically, if we can.

We could filter private method (as onRendered) and use the others to create the documents.

Yes, those are methods on the component. That is easier to analyze because you can do something like codo does. But for fields/arguments we do not yet have any way to know it, except if we create some extra metadata or some common pattern we are all using and our tool can then parse that pattern. (Like, creating reactive fields inside onCreated and then tool parses code of onCreated and see which fields have been created there.)

Isn't this internal to the component? User of a component should not have to know anything about events.

Yes it is. Was just thinking about clear vision about what's happening inside the component. But it makes sense to keep this private.

I am not sure how you can really do that? They are available after component is created only (because mostly they are created in a constructor or onCreated). I am not sure how we could make this automatic. But maybe you know. :-)

Maybe I'm doing something very ugly, but I can return the methods using this snippet:
blazeComponent = BlazeComponent.getComponent('CreateHistory').prototype
methods = _.keys(blazeComponent)

I'm using David Walsh function to get arguments from functions
function getArgs(func) {
  // First match everything inside the function argument parens.
  var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];

  // Split the arguments string into an array comma delimited.
  return args.split(',').map(function(arg) {
    // Ensure no inline comments are parsed and trim the whitespace.
    return arg.replace(/\/\*.*\*\//, '').trim();
  }).filter(function(arg) {
    // Ensure no undefined values are added.
    return arg;
  });
}

Now I can get a key from my methods var and get the arguments
getArgs(blazeComponent["handleTag"])

I'm pretty sure that extending this functions I can get reactive fields, for example.

Which interface?

The array of objects generated by autodiscover function can be used to generate a public page of documentation. That's what I've meant. In my case, I'm probably going to expose that as a JSON to be used inside our internal admin.
Going to comment on #139, but I can already say that components can then have public methods would also help here I suppose.

I'm pretty sure that extending this functions I can get reactive fields, for example.

Try. :-) As I said, reading the prototype is easy, reading things you attach onto the object during creation is harder.

The array of objects generated by autodiscover function can be used to generate a public page of documentation. That's what I've meant. In my case, I'm probably going to expose that as a JSON to be used inside our internal admin.

Interesting. So this would be part of the app itself?

I've spend some minutes here trying to think in a way to do this. I will describe here a proposal (not the best code, just trying to think out loud).

Interesting. So this would be part of the app itself?
In my case, yes. I've created a Discover() function that can be called and will return the JSON with documentation. That can be used to create the docs. This makes sense for me but I also understand that maybe not for other packages as they just want some documentation generated by blaze-docs generate or something similar. If my internal script works, maybe we can generate a CLI that can start meteor, return the json that I'm creating and render that indo a folder or something like this.

Discover = function () {
    const privateMethods = ['onCreated', 'onRendered', 'onDestroyed', 'events'];
    let components = BlazeComponent.components[""];
    let json = [];
    let keys = _.keys(components);

    keys.forEach(key => {
        keyObject = {name: key};
        blazeComponent = BlazeComponent.getComponent(key).prototype;
        methods = _.keys(blazeComponent);

        describedMethods = [];
        _.difference(methods, privateMethods).forEach( method => {
            describedMethods.push({
                name: method,
                arguments: getArgs(blazeComponent[method])
            });
        });

        if (_.contains(methods, 'onCreated')) {
            keyObject.blazeDoc = getBlazeDoc(blazeComponent['onCreated']);
            keyObject.onCreatedVars = getVars(blazeComponent['onCreated']);
        }

        keyObject.methods = describedMethods;
        json.push(keyObject);
    });

    return json;
}

function getVars(func) {
    var args = func.toString().match(/this.\w+/g);
    return args;
}

function getBlazeDoc(func) {
    let blazeDoc = func.toString().match(/blazeDoc[\w\W]*blazeDoc/g);

    if (!blazeDoc)
        return {};

    let screenshot = blazeDoc[0].match(/@screenshot: https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/);

    return {screenshot: screenshot[0].replace('@screenshot:', '').trim()};
}

function getArgs(func) {
  // First match everything inside the function argument parens.
  var args = func.toString().match(/function\s.*?\(([^)]*)\)/)[1];

  // Split the arguments string into an array comma delimited.
  return args.split(',').map(function(arg) {
    // Ensure no inline comments are parsed and trim the whitespace.
    return arg.replace(/\/\*.*\*\//, '').trim();
  }).filter(function(arg) {
    // Ensure no undefined values are added.
    return arg;
  });
}

An example component that is working with this method is this one
class LoginSteps extends BlazeComponent {

  onCreated() {
     /*blazeDoc
      @screenshot: http://pandalargo.com.br/wp-content/uploads/2015/09/panda-lambendo.jpg
    blazeDoc*/
    super.onCreated();
    this.status = new ReactiveVar(false);
    this.error = new ReactiveVar(false);
    this.schools = new ReactiveVar([]);
    this.selectedSchool = new ReactiveVar(false);
    this.email = new ReactiveVar(false);
  }

  events() {
    return super.events().concat({
      'submit #login-step-email': this.verifyEmail,
      'submit #login-step-schools': this.selectSchool,
      'submit #login-step-password': this.tryAuth
    });
  }

  tryAuth(event) {
    event.preventDefault();
    let password = this.$('#password').val();
    let school = _.find(this.schools.get(), s => Number(s.id) === Number(this.selectedSchool.get()) );

    Edools.authenticate(this.email.get(), password, this.selectedSchool.get(), (response) => {

      if (response.auth) {
        User.login(response.content, school);
        // Edools.redirectAdmin(response.content, school);
      } else {
        this.error.set('wrong-password');
      }
    });
  }

  selectSchool(event) {
    event.preventDefault();
    let school = this.$('[name=select-school]:checked').val();
    this.selectedSchool.set(school);
    this.status.set('password');
  }

  verifyEmail(event) {
    event.preventDefault();
    let email = this.$('#email').val();

    Meteor.call('Edools.requestSchools', email, (err, result) => {
      let schoolsList = result.schools;
      this.schools.set(schoolsList);
      this.email.set(email);

      if (schoolsList.length === 0)
        return this.status.set('none');

      if (schoolsList.length > 1)
        return this.status.set('multiple');

      if (schoolsList.length === 1) {
        this.selectedSchool.set(schoolsList[0].id);
        return this.status.set('password');
      }

    });
  }

}

LoginSteps.register('LoginSteps');

This function is returning

All components inside my app

All helpers and functions (not the private ones). Maybe I can check if it's an private method looking for _

All arguments for each method

All variables defined as this.variableName inside onCreated

The screenshot defined inside the block blazeDoc

What do you think about this? It's a way to move foward?

(Creating a package to make this hack more universal and with better coding)

I think getVars is very fragile.
Also, your function works only in development mode, when code is not minimized.
Moreover, you should probably be using inline event handler instead of such event maps. :-)
What I started thinking is that it is probably better to define one method fields, which returns a dict of various fields to attach to this, and then in parent onCreated you attach them to onCreated. It is then easier to get information about those fields. And that method can even be class-level method.

I think getVars is very fragile.
Agreed. I guess the fields method that you describe would be the best here. This can be something very nice. Thinking about your ideas to version 2.0, this dict could have the information about required fields and so on, right?

Also, your function works only in development mode, when code is not minimized.
Yes, that's true. But it was quicker to build this (real company world 😕 ). I'm thinking in someway to attach the creation of the docs into a hook before the build. That would solve my problem. Do you think I should go back and rethink the concept?

Moreover, you should probably be using inline event handler instead of such event maps. :-)
That's something that is messing with my head in the last weeks. My developers were not Classic Meteor developers, so it's not a breaking change to make them use inline events. But for a server side view, the idea to have all events mapped into one place is very nice and easy. I get all the benefits of using inline events, but when you have 10+ people on the same code, event maps help you check the context easier. But again, this is still messing with my head. (btw, I'm the CTO, that's why I keep talking about my team)

Thinking about your ideas to version 2.0, this dict could have the information about required fields and so on, right?

Exactly. So this is something which we can do already now, as part of common practice. And then it would contain only metadata. And it would create reactive fields and stuff like this already now.
I think I will look into this a bit and add it as a feature to common component.

Do you think I should go back and rethink the concept?

No, I think this could be something available only during development anyway. You could even add it to the file/package which is included only during development into a Meteor app.

I think I will look into this a bit and add it as a feature to common component.
It works, but why not into core?

No, I think this could be something available only during development anyway. You could even add it to the file/package which is included only during development into a Meteor app.
Any suggestion on how to handle this? I'm imaging a bundle plugin that generates the json and saves a json file. What do you think?

It works, but why not into core?

Because it is not needed to be in core. :-)

Any suggestion on how to handle this? I'm imaging a bundle plugin that generates the json and saves a json file. What do you think?

You can use debugOnly flag on a package: https://github.com/meteor/meteor/blob/devel/tools/tests/apps/package-tests/packages/debug-only/package.js
So you have a package which is debugOnly and it at runtime adds to your admin the list of all components in the app. In production, this package is not loaded, so it does not add itself to admin/router and so on.

My proposal:

<template name="foo">

Foo Header

    {{sayHello}}
    {{someReactiveVariable}}
    {{#autoForm collection=fooCollection id="fooForm" type="insert" class=styles.form}}
      {{> afQuickField name="name"}}
      <button type="submit" class="btn btn-primary">Submit</button>
    {{/autoForm}}

</template>

Which would be compiled into something like:
import { Meteor } from 'meteor/meteor'
import { FlowRouter } from 'meteor/kadira:flow-router'
import { hookFormSuccess } from '/imports/client/ui/helpers/autoform'
import { ReactiveField } from 'meteor/peerlibrary:reactive-field'
import { styles } from './foo.scss'
import { fooCollection } from '/imports/collections/fooCollection'

async function doSomething(template) {
  const data = await Meteor.callPromise('getData')
  template.someReactiveVariable(data)
}

class foo extends Blaze.Template {
  renderFunction() {
    // Render the foo template.
  }

  someReactiveVariable = new ReactiveField()

  onCreated() {
    hookFormSuccess('fooForm', () => FlowRouter.go('over-the-rainbow'))
    doSomething(this)
  }

  sayHello() {
    return "hello"
  }

  styles = styles
}

Please observe that this is the easiest possible to implement. I literary just combine strings together into this template:

class <templateName> extends Blaze.Template {
  renderFunction() {

  }

}

Personally, I think this also gives good balance between what you allow inside a template script tag (not complete JavaScript, but everything inside ES6 class body).

After some thought, I think this can be in the core, yes. A nice upgrade path based on ideas in the other ticket.
But I am realizing I will not have time to look into this anytime soon.


Fixes #328 and #317

Rewritten to use gradle properties and removes the need for GRADLE_MULTI_PROJECT_MODE variable.

see https://github.com/CycloneDX/cdxgen/issues/328#issuecomment-1565498931


Connection pool is not closed properly when deploying.

Hi,
I really like your mongodb node-red implementation. However when I use it and do multiple deployments, I reach my 500 connection max fairly quick. When I realaized that I switched to https://flows.nodered.org/node/node-red-contrib-mongodb-aleph without any issues for weeks. But the aleph implementation is a little short on the possible operations, so decided to give this one another shot as I had a fresh install of node-red as well. I immedatly see the connections piling up again with every deploy. Below is a screenshot from the atlas console after I triggered some deployments in node-red. No other client is connected to the cluster.

It would be awesome if you could look into this, I would really like to use your implementation going forward.
Similar to issue #14

Hi,
thank you for your feedback. This issue should be fixed since v1.8.1 but I will try to reproduce your problem and solve it. It would be great if you could name the versions of your installation: NodeJS, Node-RED and the version of this package you are using.
I do also use MongoDB Atlas but after redeploying my flows several times my connection count is still low. Are you sure that this issue is related to flow redeployment? How do you redeploy: Full or only modified?
The expected behaviour is that the node will close and reopen connections only on full deployment. The node is initializing a MongoClient instance per connection config. A default MongoClient instance can handle a connection pool of up to 100 connections. You can overwrite the connection options with this node for optimization, but I don't think that this solves your issue.

Hello and thank you for your quick response!
I always used full deployment just because I left the setting as default. To your question if I am sure that this is related to deployment, I think there is a correlation with full deployments at least (see tests below). There seems to be a difference somewhre as I never had so many connections with the aleph mongodb implementation. Thank you very much for looking into this, I will do my best gathering insights that might help.
Versions
Node-RED version: v3.0.2
Node.js  version: v16.16.0
node-red-contrib-mongodb4 version: 1.10.0
Test
Just did a new test, see below.
Steps I have taken to prep:

disable aleph mongodb config
reboot node-red to remove old hanging connections

Test 1 with light deploy:

Trigger an update on the db with a mongodb4 node
Change a mongodb4 node position in node red
Deploy only changed node
Check connections metrics in Atlas
Repeat 1-4
==> Result: Only deplyoing the changed node does not affect the connections count

Test 2 with full deploy:

Trigger an update on the db with a mongodb4 node
Change a mongodb4 node position in node red
Full Deploy
Check connections metrics in Atlas
Repeat 1-4
==> Result: Over the course of 10 min. the connection count grew significantly

Connections Graph

Hi,
I released v2.0.0 on npm. Please try this release. I hope this solves this issue.
What's new?

I upgrade to mongodb driver v5.2.0
I added more connection options to have more control over the connection pool. Check out the configuration node. All options are explained in the readme and node documentation.
I added a log entry to node-reds runtime log on client instance init and after client instance closed.
The node supports now appName. The node generates an automatic appName in combination with a connection pool session key. All connections to the db server are tagged with this app name. MongoDB 3.4 and newer will print this value in the server log upon establishing each connection. It is also recorded in the slow query log and profile collections. In your case you can check if there is more than one connection pool connected with your database and if old connections from old pools have terminated. The appName is printed to the nodered runtime log.

Testing
I tested the connection pooling with a local single host Mongodb server and with an Atlas ReplicaSet. I did multiple full deployments and nodered runtime restarts. The connection count has never exploded like in your example.
On my own Mongodb server i can run to show all current connected connection pools:
db.currentOp(true).inprog.reduce((accumulator, connection) => {
    const appName = connection.appName || "unknown";
    accumulator[appName] = (accumulator[appName] || 0) + 1;
    accumulator.totalCount ++;
    return accumulator;
  }, {totalCount: 0})

The node is closing all previous connections on full deployment or nodered runtime shutdown.
The difference between node-red-contrib-mongodb-aleph and my implementation is that aleph is creating a connection pool for each mongodb flow node. My implementation creates only one connection pool for each connection config node. I think that this is much more efficient. Because multiple flow nodes can use a single connection pool and also reuse connections.
Please let me know if the latest release solves your issue.

You are awesome! Just redid my test scenario and the connection count is steady now. Thank you so much!


Ixia-c operator upgrade

Operator fix for flakiness in deployment.

@jasdeep-hundal here's the operator upgrade with fix for flakiness issue.

/gcbrun


Added Player Info Button

Felt bored, decided to fix the merge conflict.

We will be refactoring these buttons


Add uploading of datasets.

Description
Trello card :https://trello.com/c/tb08vrGi
We need to upload the datasets generated by our data sources, to make them easily accesible to other teams.
To do we need to:

Create a set of default parameters for each datasource, which may be empty.
Create a function that given a data_source, runs it with the defined parameters, store the result as a csv and packs it in a folder with a copy of the audit and metapackage.json files.
Make a function, using this notebook as a template that takes the path to a data package and uploads to kaggle.
Create a function that take no arguments, and iterate through the data sources, generating the datapackages and uploading them to kaggle.
Create a github action that runs the function of step 4 each 24 hours.

Comments/Suggestions

While we may only need CSV inputs for this repository at this point, but it's highly likely that a reusable solution would be robust enough to consume and produce additional formats (JSON, JSONLD, RDF, XML, YAML, etc).  Understanding this, it would be wise to implement some extensibility here by parameterizing the formats to whatever function processes the data sources.
The source for the library referenced by the sample notebook is at kaggle-storage-client.  Please raise any issues on that project if this implementation identifies obstacles to its use.  It was built with the intention of making this kind of thing easier.
Step 4 doesn't need to run if neither the code nor the data sources have changed since the last execution.  To simplify this comparison, store the hash for source files.
Step 4 could become reusable to other teams' datasets if we parameterize either (1) the set of data sources; or, (2) a configuration file containing the set of data sources
W3C DCAT describes recommended semantics for describing aggregations of datasets.  This is not necessary to consider yet, but may be helpful down the line as these processes become more complex.
dataflows  and datapackage-pipelines may provide useful examples for what a mature, generic implementation of this kind of process might look like.

HI @smartcaveman, and thanks for your comments, let me answer along your quotes:

Comments/Suggestions

While we may only need CSV inputs for this repository at this point, but it's highly likely that a reusable solution would be robust enough to consume and produce additional formats (JSON, JSONLD, RDF, XML, YAML, etc).  Understanding this, it would be wise to implement some extensibility here by parametrizing the formats to whatever function processes the data sources.

Indeed, that's why the data source specification demands the output to be a pandas.DataFrame, this way, changing format is one line, making it work with different parameters, a couple more.

The source for the library referenced by the sample notebook is at kaggle-storage-client.  Please raise any issues on that project if this implementation identifies obstacles to its use.  It was built with the intention of making this kind of thing easier.

Will do. Thanks.

Step 4 doesn't need to run if neither the code nor the data sources have changed since the last execution.  To simplify this comparison, store the hash for source files.

Some of our datasets, like census, won't be changing, so it was already considered, although not written on the issue, that some data sources, shouldn't be running at every execution.
Also, some other data sources, like meteo or covid cases, may have new data everyday, so it make sense to run them, even if the code hasn't changed.
However, I will make sure that when,  let's call them "static" data_sources, they have their code updated will be executed too.

Step 4 could become reusable to other teams' datasets if we parameterize either (1) the set of data sources; or, (2) a configuration file containing the set of data sources

This is an interesting remark. Yesterday I had a call with Anton, regarding this issue, and have had that in mind while thinking in the design of the solution.

W3C DCAT describes recommended semantics for describing aggregations of datasets.  This is not necessary to consider yet, but may be helpful down the line as these processes become more complex.
dataflows  and datapackage-pipelines may provide useful examples for what a mature, generic implementation of this kind of process might look like.

I will check them in more detail during the weekend if I have time. Definitely they look really interesting.

@ManuelAlvarezC sorry, my comment was ambiguous.  Re: "To simplify this comparison, store the hash for source files.", I was referring to source code and data source files.  So, if you download a large dataset that's expensive to process, and the hash of the dataset is the same as it was last time it was processed, then it doesn't need to be reprocessed.

 Locate and create code to extract  Granular COVID data for South Korea


Unable to use https with docker

Q
A

Bug report?
[ ]

Feature request?
[ ]

Support request?
[ x ]

Hello.
We've installed the Cocorico platform with docker. Everything is working, unless we need to install the ssl certificates for https and we are unable to do that. As we've used docker we cannot set the VirtualHosts, and we don't know how to do it.
Could anybody help us? Thanks.

Hello there!
Have you tried using one docker-compose with Nginx to do that? See if this tutorial help you: https://medium.com/faun/setting-up-ssl-certificates-for-nginx-in-docker-environ-e7eec5ebb418


chore: fix cypress issues that occurred after new year 2022/2023

Relates to DHIS2-14379 / #285

Would it be possible to simplify the calculation of the yearly periods by using the dateLimit that is already being passed to usePeriods hook?

@tomzemp Thanks for the suggestion! I change the usePeriods hook so that it uses the already provided dateLimit (and also made sure that it's used for non-yearly period types as these can span into the next year as well (weekly period types). I've updated/added jest tests to ensure that it's working as intended

Ok, so everything changed.. This now uses @dhis2/multi-calendar-dates instead of an internal fixed-periods.js, which is now gone.
There are some @TODO(calendar) comments, for which I'll create a Jira issue, it'd take too much time before the soft freeze and to mimic what the app currently does, it suffices to just provide a static gregory as calendar for now.

@tomzemp thanks for the detailed review!

However, I'm a bit confused because when I look at this in the app, it seems as though the period selector shows until all periods until the end of the year in which the last open future period is. For example, if I set openFuturePeriods: 14 on Child Health, the dataset should be open through April 2024, but in the period selector, I see up until December 2024 (this issue is for any period type):

:heavy_check_mark:

translations
We've moved the translations for periods out of this app, so now if we use data entry app in French, for example, we will now get monthly periods of ["January 2022", "February 2022", "March 2022"...] as opposed to what we previously got ["Janvier 2022", "Février 2022", "Mars 2022"...]. Not sure if we can specify a locale when getting the periods so they'll be translated?

:heavy_check_mark:

formatting
I noted that some of the formatting and displays of the dates change (beyond the translation issue). Like the old version of the app will display days like 2022-01-01 whereas the new logic will return January 1, 2020. I don't know if that choice is deliberate or if anyone wants to consider that? Also noted that previously we included periods that overlapped years more often, e.g. for Six-Monthly April in 2021, the old version would be ["October 2020 - March 2021", "April 2021 - September 2021", "October 2021 - March 2022"] whereas now we will get ["April 2021 - September 2021", "October 2021 - March 2022"]. I don't have a preference, but maybe again maybe a UX question?

:heavy_check_mark: Very interesting.. This was my fault and has been fixed. I was 100% sure that the app used "January 01, 2023", not "2023-01-01".. My bad..

This PR needs the following update: https://github.com/dhis2/multi-calendar-dates/pull/21
Otherwise daily periods are not displayed when there's an open future period count defined..


Variable norm_1_2/moving_mean/biased already exists

anaconda python=3.6 ，tf=1.4.
Training times error：
ValueError: Variable norm_1_2/moving_mean/biased already exists, disallowed. Did you mean to set reuse=True in VarScope?
File "d:\Users\Wayne\Anaconda3\envs\tensorflow-gpu\lib\site-packages\tensorflow\python\framework\ops.py", line 1228, in init
self._traceback = _extract_stack()
File "d:\Users\Wayne\Anaconda3\envs\tensorflow-gpu\lib\site-packages\tensorflow\python\framework\ops.py", line 2336, in create_op
original_op=self._default_original_op, op_def=op_def)
File "d:\Users\Wayne\Anaconda3\envs\tensorflow-gpu\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 768, in apply_op
op_def=op_def)
return self.feature_extractor(input_image)

I added the following procedure before the error reporting procedure.
tf.get_variable_scope().reuse_variables()

@l403091644 Sorry I have no clue.

@l403091644 I meet the same question like you.It is a bug because you use the unmatched Keras and Tensorflow. I finally solve it by upgrade the tensorflow to 1.4(or 1.5,but tensorflow1.5 need cuda 9 and cudnn 7 )and Keras to  2.14


api.crc.testing is hardcoded in snc-library.sh

api.crc.testing is hardcoded in snc-library.sh
Instead, it's should be based on the variable BASE_DOMAIN. For instance, api.crc.$BASE_DOMAIN

Yup, that's an oversight. Most of the code even use  api.${CRC_VM_NAME}.${BASE_DOMAIN} to avoid hardcoding crc.
Are you planning to provide a PR to fix this? I'll fix this next week otherwise :)

@cfergeau PR #427 created.


Is the null provider still required?

I'm only starting to use this module, but I noticed the latest release and #80 and so thought to remove the null provider from versions.tf and it looks like it still works?
edit:
Specifically, the change at https://github.com/fressets/terraform-null-label/pull/1. So far have only been using it for simple labels (as well as the context feature) for labeling DigitalOcean instances and volumes and not much else (but I think that covers most of this module?). And if it isn't needed, then there's the question about the module name not being apt anymore (for 0.12 at least), I guess?

@maartenvanderhoef  @aknysh @osterman
I'm getting failures due to the removal of this resource right now.
Error: Provider configuration not present

To work with
module.service_account.module.label.data.null_data_source.tags_as_list_of_maps[0]
its original provider configuration at
provider["registry.terraform.io/-/null"] is required, but it has been removed.
This occurs when a provider configuration is removed while objects created by
that provider still exist in the state. Re-add the provider configuration to
destroy
module.service_account.module.label.data.null_data_source.tags_as_list_of_maps[0],
after which you can remove the provider configuration again.

Any tips on resolving this migration issue? I'm in the middle of 0.13upgrade on a few modules and this is blocking the plan from running right now. Not sure if I can leverage the replace-provider command like the docs show, but hoping you might have a fix already if you ran into this.
https://www.terraform.io/upgrade-guides/0-13.html#explicit-provider-source-locations

We haven't yet tackled 0.13 - so don't know the answer. Will accept PRs that fix it.

@osterman I'm referring to 0.17 release, this was supposed to support 0.13 terraform version.
I think it's actually the removal of the tags_as_list_of_maps from 0.16 release, just not sure how to properly migrate this.

this looks like the same class of problem that's here: https://github.com/cloudposse/terraform-aws-eks-cluster/issues/58
It's due to terraform not handling certain kinds of deprecations of resources and module upgrades at the same time.
The fix is probably to terraform rm module.service_account.module.label.data.null_data_source.tags_as_list_of_maps[0] and try again.
See the discussion in the other issue.


Generate DBClusterSnapshot resource

Brings a new resource DBClusterSnapshot to the rds-controller

Adds generator.yaml and necessary hooks
Adds e2e tests

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

/retest


Error in sciensa/weblogic-osb unexpected EOF

Expected behavior
OK
Actual behavior
NOK
Information about the Issue
unexpected EOF
Steps to reproduce the behavior

Only install

unexpected EOF is an error generated by the image itself.
Please open an issue with sciensa/weblogic-osb


City and Guilds Art School

@sebing First stage of verification passed, official domain is cityandguildsartschool.ac.uk as far as I verified. This is just an informational note. Pull request is still in the review. I appreciate your patience while waiting for the final decision. Proof of domain ownership: https://www.cityandguildsartschool.ac.uk/art-material-histories-ma-student-reflects-on-how-survivors-of-domestic-abuse-can-benefit-from-working-with-glass/

Hello @sebing, Please provide us with the URL of a page on the official website where the school offers an IT-related long-term (>1 year) course. Thank you.

@sebing You might miss my previous comment. Please react.

@philipto and @tenthreee
City and Guilds Art School doesn't offer any long-term IT courses. I thought that was not a constraint.

@sebing Regrettably, it is a constraint. Please read the repository rules at https://github.com/JetBrains/swot#which-educational-institutions-can-be-added-to-the-repository
I am sorry, this domain seems to represent an institution, that is not eligible for adding to this repository. Please apply for free educational license with an official document which proves that you are a student. You can do it using "OFFICIAL DOCUMENT" tab at https://www.jetbrains.com/shop/eform/students.
I have to close the request without merging.
Thank you for your understanding!


tests: drivers: audio: dmic_api: Enable test execution on nrf54l15

Enable execution of dmic_api test on nrf54l15:

add 'dmic' to the list of supported peripherals;
add overlay for nrf54l15;
align Nordic's implementation of PDM driver to pass the test.

FYI: @mstasiaknordic , @nordic-piks


Remove failFast from default-detekt-config.yml

failFast is now deprecated.

Hey, thanks to getting to this. We are generating our config and documentation stuff, so just changing this in the config does not help. The right place to change this would be detekt-generator/src/main/kotlin/io/gitlab/arturbosch/detekt/generator/printer/rulesetpage/ConfigPrinter.kt#defaultGenericConfiguration:67

Fixed.

Codecov Report

Merging #1479 into master will not change coverage.
The diff coverage is n/a.

@@            Coverage Diff            @@
##             master    #1479   +/-   ##
=========================================
  Coverage     74.74%   74.74%
  Complexity     1732     1732
=========================================
  Files           328      328
  Lines          5270     5270
  Branches        957      957
=========================================
  Hits           3939     3939
  Misses          805      805
  Partials        526      526

Impacted Files
Coverage Δ
Complexity Δ

...ekt/generator/printer/rulesetpage/ConfigPrinter.kt
85.71% <ø> (ø)
9 <0> (ø)
:arrow_down:

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 367a369...f5d11fd. Read the comment docs.


Update references envoyproxy/protoc-gen-validate -> bufbuild/protoc-gen-validate

As the repo has moved we should use the canonical repo reference

to find:
$ git grep envoyproxy/protoc


Owned Entities

Q - Are Owned Entity Types loaded eagerly by default? Can you not implement lazy loading for an OwnedType?  I am seeing this behavior working with SqlLite In-Memory provider just doing some unit tests to validate my understandings with EF core 3.1.
If so that behavior is great for OwnsOne, but OwnsMany could be quite massive.
This is not explained on the docs pages for Loading Related Entities or the Owned Entity Types.
Thanks for spelling this out. Here's what I'm trying to do:
public class Product {
       // EF Backing Field for Entity Object
        private int _productId;
        private string _name;
        private string _description;
        private decimal _price;

        private ILazyLoader LazyLoader;

        private IList<Review> _reviews;

        public virtual IList<Review> Reviews
        {
            get
            {
                LazyLoader.Load(this, ref _reviews);
                return _reviews.ToArray();
            }
        }

        /// <summary>
        /// Private Constructor for EF Core
        /// </summary>
        private Product(ILazyLoader lazyLoader)
        {
            LazyLoader = lazyLoader;
        }

        public int ProductId
        {
            get { return _productId; }
        }

        public virtual string Name
        {
            get { return _name; }
        }

        public string Description
        {
            get { return _description; }
        }

        public decimal Price
        {
            get { return _price; }
        }
}

 public class ProductConfiguration : IEntityTypeConfiguration<Product>
    {
        public void Configure(EntityTypeBuilder<Product> builder)
        {

            builder.ToTable("Details", "Product");
            builder.HasKey(p => p.ProductId);
            builder.Property(p => p.ProductId).UseIdentityColumn();
            builder.Property(p => p.Name);
            builder.Property(p => p.Description);
            builder.Property(p => p.Price);

            // Owned Properties
            builder.OwnsMany(p => p.Reviews, pr =>
            {
                pr.ToTable("Review", "Product");
                pr.WithOwner().HasForeignKey("ProductId");
                pr.HasKey(r => r.ReviewId);
                pr.Property(r => r.ReviewId).UseIdentityColumn();
                pr.Property(r => r.Reviewer);
                pr.Property(r => r.ReviewDate);
                pr.Property(r => r.ReviewText);
            });
        }
    }

public class Review
    {
        // EF Core Backing Fields
        private int _reviewId;
        private string _reviewer;
        private string _reviewText;
        private DateTime _reviewDate;
        private int _rating;

        /// <summary>
        /// Private Constructor for EF Core Materialization
        /// </summary>
        private Review()
        {

        }

        internal Review(string reviewer, string reviewText, int rating)
        {
            _reviewer = reviewer;
            _reviewText = reviewText;
            _reviewDate = DateTime.UtcNow;
            _rating = rating;
        }

        public int ReviewId
        {
            get { return _reviewId; }
        }

        public string Reviewer
        {
            get { return _reviewer; }
        }

        public string ReviewText
        {
            get { return _reviewText; }
        }

        public DateTime ReviewDate
        {
            get { return _reviewDate; }
        }

        public int Rating
        {
            get { return _rating; }
        }
}

See https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#querying-owned-types

When querying the owner the owned types will be included by default. It is not necessary to use the Include method, even if the owned types are stored in a separate table.

Owned types are conceptually part of the owner and we don't support partial loading, see https://github.com/aspnet/EntityFrameworkCore/issues/1387


chore: update Node engine and TypeScript Support

What's New?
Analog of this passage-node PR: https://github.com/passageidentity/passage-node/pull/172
This package is a newer so not as much needs to be updated.
Screenshots (if appropriate):

Type of change

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

Checklist:

[x] My code follows the style guidelines of this project
[x] I have performed a self-review of my own code
[x] I have manually tested my code thoroughly
[x] My changes generate no new warnings

Additional context

skipping the deploy workflow change since it's being deprecated soon?

Yeah exactly, the new release workflow is loading the .nvmrc file (that now exists) already


webworkers for runZ3WebJS never gets killed

The SMTLIB executions have no such a problem.

@NikolajBjorner Is my understanding of this line correct that Z3.Context in the high-level API deletes the context itself, so that we don't have to call Z3.del_context(ctx) externally?

I asked because we always called Z3.del_context(ctx) when handling web-based executions for the SMITLIB format (see this line in runZ3Web.ts), but not in runZ3JSWeb.ts, where we call evalZ3JS() from eval-z3.ts that @bakkot provided. The evalZ3JS() call does not delete the context after calling eval(), so I doubt whether this is causing the dangling webworkers for JS examples.

To replicate in Chrome (which lets you see the number of dedicated workers in Task Manager):

Go to Playground, where a SMTLIB example is hosted. Click "Run" twice (to get the web-computed output instead of the pre-computed output). You see one webworker.
Go to some other SMTLIB code snippet and click "Run" twice to get the web-computed output, you still see one webworker, no matter how many more times you click.
Now go to some JS example in the "Programming Z3" section. Click "Run" twice to get the web-computed output, you see TWO webworkers, where the new one was added for the JS example.
Go to another JS example, click "Run" twice, and you see THREE webworkers, where the last two dedicated for executions of the two JS snippets, respectively.

I would expect for one or maybe two webworkers at most for the web-based executions, one handling the SMTLIB examples and the other handling the JS examples. It looks like we are creating a new webworker every time we run one new JS snippet, which is problematic.

Thanks for the quick response. It is indeed capped at 3 for JS examples. In that case I think we should be fine...? I mean people can always refresh the page to clear out the queue of webworkers.


[UpdatePlugin]  matteyeux seprom-loader 1.0.2

Please update my plugin:
Author: Me
Repo name: seprom-loader
Release: https://github.com/matteyeux/seprom-loader/releases/tag/1.0.2

Should I not add it? Is another PR coming soon?

Should I not add it? Is another PR coming soon?

Noticed that I forgot to remove some code (useless elif statement and a comment) . And I was going to open a new issue.
Here is the release in case opening a new issue is not needed : https://github.com/matteyeux/seprom-loader/releases/tag/1.0.3.

Noticed that I forgot to remove some code (useless elif statement and a comment) . And I was going to open a new issue.
Here is the release in case opening a new issue is not needed : https://github.com/matteyeux/seprom-loader/releases/tag/1.0.3.

New issue not needed, i'll add it now, thanks.

New issue not needed, i'll add it now, thanks.


cmd/update-report: do not fail when tap has no origin

[x] Have you followed the guidelines in our Contributing document?
[x] Have you checked to ensure there aren't other open Pull Requests for the same change?
[x] Have you added an explanation of what your changes do and why you'd like us to include them?
[ ] Have you written new tests for your changes? Here's an example.

[x] Have you successfully run brew typecheck with your changes locally?
[x] Have you successfully run brew tests with your changes locally?

This fixes the following error:
$ brew update
Warning: No remote 'origin' in /usr/local/Homebrew/Library/Taps/foo/homebrew-bar, skipping update!
Error: HOMEBREW_UPDATE_BEFORE_FOO_HOMEBREW_BAR is unset!
/usr/local/Homebrew/Library/Homebrew/cmd/update-report.rb:361:in `initialize'
/usr/local/Homebrew/Library/Homebrew/cmd/update-report.rb:187:in `new'
/usr/local/Homebrew/Library/Homebrew/cmd/update-report.rb:187:in `block in output_update_report'
/usr/local/Homebrew/Library/Homebrew/tap.rb:748:in `block (2 levels) in each'
/usr/local/Homebrew/Library/Homebrew/tap.rb:747:in `each'
/usr/local/Homebrew/Library/Homebrew/tap.rb:747:in `block in each'
/usr/local/Homebrew/Library/Homebrew/tap.rb:746:in `each'
/usr/local/Homebrew/Library/Homebrew/tap.rb:746:in `each'
/usr/local/Homebrew/Library/Homebrew/cmd/update-report.rb:160:in `output_update_report'
/usr/local/Homebrew/Library/Homebrew/cmd/update-report.rb:40:in `update_report'
/usr/local/Homebrew/Library/Homebrew/brew.rb:94:in `<main>'
Already up-to-date.

When/why would a tap have an Git repository but no origin remote set?

When/why would a tap have an Git repository but no origin remote set?

When it is created by brew tap-new but not uploaded to anywhere.


Updated Doctrine depedencies.

Replaced removed Common namespace for ObjectManager, and ClassMetadata classes.

Codecov Report

Merging #1881 into master will increase coverage by 0.06%.
The diff coverage is n/a.

@@             Coverage Diff              @@
##             master    #1881      +/-   ##
============================================
+ Coverage     56.58%   56.64%   +0.06%
  Complexity     2068     2068
============================================
  Files           306      306
  Lines          4851     4851
============================================
+ Hits           2745     2748       +3
+ Misses         2106     2103       -3

Impacted Files
Coverage Δ
Complexity Δ

src/Faker/ORM/Doctrine/ColumnTypeGuesser.php
0% <ø> (ø)
28 <0> (ø)
:arrow_down:

src/Faker/ORM/Doctrine/EntityPopulator.php
0% <ø> (ø)
50 <0> (ø)
:arrow_down:

src/Faker/ORM/Doctrine/Populator.php
0% <ø> (ø)
11 <0> (ø)
:arrow_down:

src/Faker/Provider/de_AT/Person.php
0% <0%> (-100%)
1% <0%> (ø)

src/Faker/Provider/ne_NP/Person.php
0% <0%> (-50%)
2% <0%> (ø)

src/Faker/Provider/fi_FI/Address.php
33.33% <0%> (-33.34%)
3% <0%> (ø)

src/Faker/Provider/pt_PT/Address.php
66.66% <0%> (-33.34%)
3% <0%> (ø)

src/Faker/Provider/cs_CZ/Address.php
66.66% <0%> (-33.34%)
3% <0%> (ø)

src/Faker/Provider/es_ES/Person.php
75% <0%> (-25%)
3% <0%> (ø)

src/Faker/Provider/es_PE/Address.php
75% <0%> (-25%)
4% <0%> (ø)

... and 41 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 04c47e3...d1b3aad. Read the comment docs.


bug: When trying to use Persisted queries I get exception

Please read our contributor guide before
creating an issue.
Expected behavior
To be able to query for data while using persisted queries on the apollo client.
Actual behavior
Any requests with the extension (e.g. {"operationName":"getMarketForecasts","variables":{"effectiveDate":"2022-02-17"},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"81edfa7234a38d8dee7b60971cae1c44d1b001b81376bdd66530552a64d5a0d8"}}})  for persisted queries and a hash give the error:
2022-03-04 14:20:57,627 ERROR [http-nio-8090-exec-6] org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String] with root cause java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String 	at com.netflix.graphql.dgs.mvc.DgsRestController$graphql$executionResult$1.invoke(DgsRestController.kt:161) 	at com.netflix.graphql.dgs.mvc.DgsRestController$graphql$executionResult$1.invoke(DgsRestController.kt:158) 	at com.netflix.graphql.dgs.internal.utils.TimeTracer.logTime(TimeTracer.kt:24) 	at com.netflix.graphql.dgs.mvc.DgsRestController.graphql(DgsRestController.kt:158) 	at jdk.internal.reflect.GeneratedMethodAccessor94.invoke(Unknown Source) 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 	at java.base/java.lang.reflect.Method.invoke(Method.java:566) 	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) 	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) 	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) 	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879) 	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) 	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) 	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) 	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) 	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) 	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:92) 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at io.opentelemetry.javaagent.instrumentation.springwebmvc.HandlerMappingResourceNameFilter.doFilter(HandlerMappingResourceNameFilter.java:59) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) 	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) 	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) 	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) 	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) 	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) 	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 	at java.base/java.lang.Thread.run(Thread.java:834)
Steps to reproduce
While using the package in the frontend:
"apollo-link-persisted-queries": "0.2.5", (https://www.npmjs.com/package/apollo-link-persisted-queries)
try and query a dgs graphql service and it should give a 500 response.
Note: A test case would be highly appreciated, but we understand that's not always possible

What DGS Framework version are you using

Hey, your question prompted me to double check that I had run a maven clean install (which it appears as though I hadn't, I had just rebuild using my IDE). I am using version 4.9.21, apologies. Now I don't get that error message anymore, however I do get the following error when making the request:

The response is:
{"errors":[{"message":"The query is null or empty.","locations":[],"extensions":{"errorType":"BAD_REQUEST"}}]}
Also here is my config for DGS:
dgs:
  graphql:
    path: /api2/graphql
    apq:
      enabled: true

And here is the code I am using to create my apollo client:
import { createPersistedQueryLink } from 'apollo-link-persisted-queries';
import { createHttpLink } from 'apollo-link-http';
import { ApolloClient } from 'apollo-client';
import { InMemoryCache } from 'apollo-cache-inmemory';

// Http endpoint
const httpEndpoint = process.env.VUE_APP_JAVA_GRAPHQL_HTTP || `${process.env.VUE_APP_BACKEND_API_URL}/graphql`;

  const httpLink = createPersistedQueryLink({ useGETForHashedQueries: false }).concat(createHttpLink({
    uri: httpEndpoint,
  }));

  const link = httpLink;

  const client = new ApolloClient({
    link,
    cache: new InMemoryCache({
      addTypename: false,
    }),
    ssrMode: false,
    connectToDevTools: true,
  });

I think you are missing the required sha256 function in createPersistedQueryLink:
https://www.apollographql.com/docs/react/api/link/persisted-queries/
If that does not work, can you provide a repurposable example?

According to the documentation here: https://www.npmjs.com/package/apollo-link-persisted-queries it suggests that there is a default implementation for generateHash. Is there a specific hashing algorithm that dgs uses that I need to use in my frontend?

You should try using the apollo client implementation instead

https://www.apollographql.com/docs/react/api/link/persisted-queries/

@Ancient-Dragon could you please follow whah @jord1e suggests and let us know.
PS @jord1e thanks for all your help! as always.

I don't think we can upgrade, from what I can tell though the request seems to be pretty standard, If I get some time over the next couple of days I will try to get a separate repo built to demonstrate our issue. If you already have a working example that would also be helpful.

If you have a repo, including the UI client, I could use to debug this behavior it will rely help.

 I always add it to my projects by default, but you probably didn't have it installed.
Is it OK if I document this somewhere this week (and maybe add some WARN logging lines when dgs.graphql.apq.enabled=true and no PersistedQueryCache bean is present) @berngp
Source of the 'problem': https://github.com/Netflix/dgs-framework/commit/649ff9f8aafc4d8bb55149227b3969c178fbd50d#diff-8f2b29047325383296ff35d1f083c9d57e42752409708293ab889881b1475755R113

I just tested with the latest version of apollo and it wasn't working.

I see everyone is awake from the Americas to Europe 😄

I think it would be good if there was some documentation on how to implement the required cache bean as well if the library is not providing one

Also sorry for the poor response times and getting examples, its not strictly something I'm working on at work so I have to do it in free time etc, and doing examples needs to be on personal PC

You do not need the bean (the dependency version is also not required because of spring version management)
Do you have dgs.graphql.apq.enabled=true
And are you on version 4.9.21 ?

 I always add it to my projects by default, but you probably didn't have it installed.
Is it OK if I document this somewhere this week (and maybe add some WARN logging lines when dgs.graphql.apq.enabled=true and no PersistedQueryCache bean is present) @berngp
Source of the 'problem':
https://github.com/Netflix/dgs-framework/blob/649ff9f8aafc4d8bb55149227b3969c178fbd50d/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/apq/DgsAPQSupportAutoConfiguration.kt#L68

@jord1e thank you! Although it is ok to document I am now wondering why I decided to make the transitive to com.github.ben-manes.caffeine:caffeine as compileOnly. I think it would probably be better to express an implementation dependency and have it working by default. What do you think?

 I always add it to my projects by default, but you probably didn't have it installed.
Is it OK if I document this somewhere this week (and maybe add some WARN logging lines when dgs.graphql.apq.enabled=true and no PersistedQueryCache bean is present) @berngp
Source of the 'problem':
https://github.com/Netflix/dgs-framework/blob/649ff9f8aafc4d8bb55149227b3969c178fbd50d/graphql-dgs-spring-boot-oss-autoconfigure/src/main/kotlin/com/netflix/graphql/dgs/apq/DgsAPQSupportAutoConfiguration.kt#L68

@jord1e thank you! Although it is ok to document I am now wondering why I decided to make the transitive to com.github.ben-manes.caffeine:caffeine as compileOnly. I think it would probably be better to express an implementation dependency and have it working by default. What do you think?

I think not to be honest, it would require all users to pull in Caffeine, even when not using APQ.
In my opinion a WARN message (or even a FATAL when no impl/bean+the config option is true) + docs under the advanced section would be better.

I don't want to maintain a simple implementation that folks then use in prod by mistake. I like the idea of  FATAL and have a Failure Analyzer that describes how to fix it. Note that the module is optional, so folks need to explicitly depend on it. This probably makes it a bit better if we decide to also now have an implementation dependency in Caffeine.

You are right in the points above! So, I think I have it clear (sorry a bit slow)

If dgs.graphql.apq.enabled=true and there is no implementation of PersistedQueryCache, exit explaining the user what to do. Probably throw a specific error and have a failure analyzer capture it.
Optionally offer a starter module for APQ that has Caffeine added as an implementation dependency. You should be able to just import the starter, along with either graphql-dgs-spring-boot-starter or graphql-dgs-webflux-starter, and use APQ out of the box.

PS/ Full disclosure, for some reason I thought I had expressed the APQ Feature as an optional module and therefore I thought it was not a bad idea to consider an implementation dependency on Caffeine. This is not the case and therefore the suggestion of the starter above.

Ok, so narrowing it down a little bit. I was able to setup a demo which worked fine. I've copied all my dependencies from our project into this demo application and now its failing so I must have a conflict somewhere. I will post back when I find out what the conflict is.

This was the dependency that has caused this whole issue:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>

Once I removed this (and added caffeine dependency) it works as described.

Closing this particular issue since you were able to work through it. @jord1e has a separate PR out to add the starter module with Caffeine dependency.


Idea: Trait for structs in order to support Bulk Inserts

Add a Trait, perhaps BulkInsertable that will return index, id and type information needed so that bulk objects can be added to a Vec and have the client automatically "package" the data for simplified bulk inserts.

Hmm this is an interesting idea. I spent a little time thinking about bulk in #208 but haven't gotten too far.
I wondering how we would go with other kinds of bulk operations, like creates, upserts, updates, and deletes. We could have a general BulkOperation trait that uses the same signature you proposed, and then have a wrapper type that has the action, whether it's insert, create, update etc.
But I think there's definitely a common case where you want to just insert a bunch of docs, so we could have a client method like:
client.bulk().insert(vec![
    doc 1,
    doc2,
   ...
]).send();

Where .insert accepts any T: BulkOperation and wraps them up in the wrapper type using the right action.
This might actually be exactly what you were proposing. What do you think?

I like the BulkOperation idea, and the proposed interface <- yup, pretty much what I was thinking, just better :-) The contract could be pretty simple, id(), type(), and index() returning the appropriate values, should be generalisable for the other operations you mentioned.
We could also implement Deserialize (on the trait? not sure if that would work, or wherever appropriate), to make it nice and snappy. My test code is littered with format! macros, definitely not optimal.


ManagedBalancedConsumer broker failure handling

Related to #517

[Current coverage][cc-pull] is 75.24%

Merging [#568][cc-pull] into [master][cc-base-branch] will decrease coverage by 11.57%

@@             master       #568   diff @@
==========================================
  Files            27         27
  Lines          3141       3151    +10
  Methods           0          0
  Messages          0          0
  Branches        496        462    -34
==========================================
- Hits           2727       2371   -356
- Misses          287        645   +358
- Partials        127        135     +8

Powered by Codecov. Last updated by [2c35e7c...d381600][cc-compare]
[cc-base-branch]: https://codecov.io/gh/Parsely/pykafka/branch/master?src=pr
[cc-compare]: https://codecov.io/gh/Parsely/pykafka/compare/2c35e7c8d872be2865cdefd16e855d0340ba5950...d381600987455d621c49e9248892da57011069c3
[cc-pull]: https://codecov.io/gh/Parsely/pykafka/pull/568?src=pr

Any update on this?


How does the workspace example work?

Could you show a better example on how the workspace code works? With the default taglist that animation shouldn't be possible

Gladly! You're right that it's not possible with the default taglist--I initially did it in a super hacky way by putting the tag widgets side by side with an align layout and having the tag indicator widget span the entire width of the align layout and update its draw method to change its position (because I didn't know manual layouts existed when I wrote it the first time). Rubato in general doesn't jive too well with awesome's default widgets seeing as none of them are animated.
Probably the most idiomatic way to replicate this would be using a manual layout where you place a tag widget for every tag you have and you have a rubato.timed object whose subscribed function updates the position of the indicator widget whenever you switch tags. I should still have the code in one of my dotfiles somewhere (here I think) and I have a similar widget in my current config that you might be able to use as a reference (it's not really up to date and adds it to the "homepage" manual layout instead of its own, which is what I have locally, but this is the new widget. It's still much cleaner and better written).

Gladly! You're right that it's not possible with the default taglist--I initially did it in a super hacky way by putting the tag widgets side by side with an align layout and having the tag indicator widget span the entire width of the align layout and update its draw method to change its position (because I didn't know manual layouts existed when I wrote it the first time). Rubato in general doesn't jive too well with awesome's default widgets seeing as none of them are animated.
Probably the most idiomatic way to replicate this would be using a manual layout where you place a tag widget for every tag you have and you have a rubato.timed object whose subscribed function updates the position of the indicator widget whenever you switch tags. I should still have the code in one of my dotfiles somewhere (here I think) and I have a similar widget in my current config that you might be able to use as a reference (it's not really up to date and adds it to the "homepage" manual layout instead of its own, which is what I have locally, but this is the new widget. It's still much cleaner and better written).

What do you mean by the homepage manual layout? I'm still new to AWM in general

"homepage" is the name of the manual layout the widgets are added to in this code. Layouts are a type of widget which you put other widgets in to position them in some way or another, I'd suggest checking out the awm docs for the different layout types. Manual layouts specifically are unique because you arrange your widgets with coordinates. This is what allows you to have the moving widget you see in the gifs--I basically call layout:move_to(widget, {x=pos, y=whatever}) in the rubato.timed subscribed function and it moves it around with an animation.

"homepage" is the name of the manual layout the widgets are added to in this code. Layouts are a type of widget which you put other widgets in to position them in some way or another, I'd suggest checking out the awm docs for the different layout types. Manual layouts specifically are unique because you arrange your widgets with coordinates. This is what allows you to have the moving widget you see in the gifs--I basically call layout:move_to(widget, {x=pos, y=whatever}) in the rubato.timed subscribed function and it moves it around with an animation.

Maybe I could nest a manual layout in my bar and then update the pos based on that. Would that work?

Maybe I could nest a manual layout in my bar and then update the pos based on that. Would that work?

yeah, that should work! all you basically have to do is update the position of whatever indicator widget you have inside the manual layout and you're set. that being said it might be a little involved for someone relatively new to awm, but it would totally be a pretty cool project. If you ever get stuck, I would suggest hopping into the awm discord and asking the people there or just asking me about it, we'd all be happy to help!

Maybe I could nest a manual layout in my bar and then update the pos based on that. Would that work?

yeah, that should work! all you basically have to do is update the position of whatever indicator widget you have inside the manual layout and you're set. that being said it might be a little involved for someone relatively new to awm, but it would totally be a pretty cool project. If you ever get stuck, I would suggest hopping into the awm discord and asking the people there or just asking me about it, we'd all be happy to help!

I'm already in the discord, I'll close this issue now. Thanks!


cleanup: use same clang-tidy in all repositories

Use the clang-tidy distributed with Fedora (currently clang-tidy-9) in
this repository. I am planning to make similar changes in the other
repositories and bring all our clang-tidy builds to use the same
versions of clang-format, clang-tidy, doxygen, buildifier,
shellcheck, and cmake_format.
I also updated the clang-tidy configuration to match the newer repos
(-pubsub and -spanner), and cleaned up any errors found in the
files.
Finally, fixed a number of Doxygen comments that used <U> (for a
template parameter) which Doxygen thought was an unordered list or
something.
Part of the work for #204

This change is

I fixed the inconsistent auto constexpr vs. constexpr int and also went all east const with the constexprs.
PTAL.


fix: Test

close #15
close #3
close #1
close #6

Rebased after merging dependabot updates

Rebased after merging dependabot updates

done


Openlane_ubuntuOS_ img

1- swift:5.3.2-bionic is used as the base OS to support FAULT at a later stage.
2- Perl 5.16.3 is installed to support perl files. Perls files. i.e. libtrim, cts_simple  and analyze should be updated to be supported by the latest version of Perl.
3- K-layout is excluded for now and will be added at later stage.
4- Successfully Tested with rc6 branch.
5- Please exclude dependencies related to K-layout for a clear run on develop branch.

Please rebase this on the develop branch (start applying your fixes on top of the latest commit on develop), and set develop as the target merge branch.

Please rebase this on the develop branch (start applying your fixes on top of the latest commit on develop), and set develop as the target merge branch.

Please rebase this on the develop branch (start applying your fixes on top of the latest commit on develop), and set develop as the target merge branch.
I have tested this on rc6 branch and the basic test was successfull. The problem which I think is with the k-layout which is not included in it and by observing the log generated by Travis-Cl , basic test failed while trying to run k-layout. Should I fix this bug by according to the guidelines mentioned above or is there any possibility to run this with rc6?

Please rebase this on the develop branch (start applying your fixes on top of the latest commit on develop), and set develop as the target merge branch.
I have tested this on rc6 branch and the basic test was successfull. The problem which I think is with the k-layout which is not included in it and by observing the log generated by Travis-Cl , basic test failed while trying to run k-layout. Should I fix this bug by according to the guidelines mentioned above or is there any possibility to run this with rc6?

@mahmoodulhassan-lm: Thanks for your PR!
In general, when a version is out, it's out. We don't make changes to old versions; instead, we release new ones (as an extension of these older versions). So, since rc6 is on the master branch, all changes should be done to rc7, which is develop. With that said, the Klayout version in the repo is centos7 specific. Still, you'll need the ubuntu deb for it to work in an ubuntu docker, i.e., https://www.klayout.org/downloads/Ubuntu-20/klayout_0.26.9-1_amd64.deb, and note that converting the top-level docker to Ubuntu 20 and leaving the tools in centos7 won't be good, so all the tools should be migrated as well, which brings me to the next point: #161. Also, no need to have swift at the moment since Fault is not yet integrated + when it's integrated it will be treated as one of the tools and has its own docker unless we decide to go with #161, which won't happen before rc8.
Thanks again!

@mahmoodulhassan-lm: Thanks for your PR!
In general, when a version is out, it's out. We don't make changes to old versions; instead, we release new ones (as an extension of these older versions). So, since rc6 is on the master branch, all changes should be done to rc7, which is develop. With that said, the Klayout version in the repo is centos7 specific. Still, you'll need the ubuntu deb for it to work in an ubuntu docker, i.e., https://www.klayout.org/downloads/Ubuntu-20/klayout_0.26.9-1_amd64.deb, and note that converting the top-level docker to Ubuntu 20 and leaving the tools in centos7 won't be good, so all the tools should be migrated as well, which brings me to the next point: #161. Also, no need to have swift at the moment since Fault is not yet integrated + when it's integrated it will be treated as one of the tools and has its own docker unless we decide to go with #161, which won't happen before rc8.
Thanks again!

@mahmoodulhassan-lm: Thanks for your PR!
In general, when a version is out, it's out. We don't make changes to old versions; instead, we release new ones (as an extension of these older versions). So, since rc6 is on the master branch, all changes should be done to rc7, which is develop. With that said, the Klayout version in the repo is centos7 specific. Still, you'll need the ubuntu deb for it to work in an ubuntu docker, i.e., https://www.klayout.org/downloads/Ubuntu-20/klayout_0.26.9-1_amd64.deb, and note that converting the top-level docker to Ubuntu 20 and leaving the tools in centos7 won't be good, so all the tools should be migrated as well, which brings me to the next point: #161. Also, no need to have swift at the moment since Fault is not yet integrated + when it's integrated it will be treated as one of the tools and has its own docker unless we decide to go with #161, which won't happen before rc8.
Thanks again!

@agorararmard : I am thankful for the input regarding PR. Sure, I have already started migrating tools to UbuntuOS and will be working on it from now on according to the provided guidelines.

@mahmoodulhassan-lm: Thanks for your PR!
In general, when a version is out, it's out. We don't make changes to old versions; instead, we release new ones (as an extension of these older versions). So, since rc6 is on the master branch, all changes should be done to rc7, which is develop. With that said, the Klayout version in the repo is centos7 specific. Still, you'll need the ubuntu deb for it to work in an ubuntu docker, i.e., https://www.klayout.org/downloads/Ubuntu-20/klayout_0.26.9-1_amd64.deb, and note that converting the top-level docker to Ubuntu 20 and leaving the tools in centos7 won't be good, so all the tools should be migrated as well, which brings me to the next point: #161. Also, no need to have swift at the moment since Fault is not yet integrated + when it's integrated it will be treated as one of the tools and has its own docker unless we decide to go with #161, which won't happen before rc8.
Thanks again!

@agorararmard : I am thankful for the input regarding PR. Sure, I have already started migrating tools to UbuntuOS and will be working on it from now on according to the provided guidelines.

Stale/Swift supports Centos. Closing this.


Windows: Game crashes with "Can't create an OpenGL window"

Hello. After updating to v0.2.0e, upon launching the game via play_abstreet.bat, the game will not launch with error "Can't create an OpenGL window". Below is a copy of my output.txt file, with RUST_BACKTRACE set to full.
thread 'main' panicked at 'Can't create an OpenGL window. Please file an issue at https://github.com/dabreegster/abstreet/issues/ and include output.txt. First attempt Couldn't find any pixel format that matches the criteria., second attempt Couldn't find any pixel format that matches the criteria.', ezgui\src\backend_glium.rs:32:26
stack backtrace:
   0:     0x7ff7658602df - <unknown>
   1:     0x7ff76587f49b - <unknown>
   2:     0x7ff765857a6c - <unknown>
   3:     0x7ff7658635ec - <unknown>
   4:     0x7ff76586323f - <unknown>
   5:     0x7ff765863dc7 - <unknown>
   6:     0x7ff76586394f - <unknown>
   7:     0x7ff7658638bc - <unknown>
   8:     0x7ff7656796cd - <unknown>
   9:     0x7ff76507e58b - <unknown>
  10:     0x7ff764fd3646 - <unknown>
  11:     0x7ff76513bd26 - <unknown>
  12:     0x7ff7658637e7 - <unknown>
  13:     0x7ff76586ee12 - <unknown>
  14:     0x7ff765864118 - <unknown>
  15:     0x7ff764fd4507 - <unknown>
  16:     0x7ff7658f2e14 - <unknown>
  17:     0x7ff89ee86fd4 - BaseThreadInitThunk
  18:     0x7ff8a02bcec1 - RtlUserThreadStart

Oh no, declared victory too soon. Could you please run http://realtech-vr.com/home/glview and send the .xml file it produces? We can see what pixel formats your videocard supports, and make a third fallback option that'll work.

https://github.com/dabreegster/abstreet/releases/download/v0.2.0a/abstreet_windows_v0_2_0f.zip
6 attempts at a working Windows build later... :P

Hmmm. Still getting the same issue: output.txt

I'm kind of stumped. The only other idea I have is to change how glutin picks the pixel format to use, adding a mode to just accept anything offered. I don't think I'll be able to prioritize this anytime soon, though -- really sorry. :\

Hmm. As I said before, this might be a hardware issue. Considering how old my system is, I wouldn't be suprized. You could maybe consider adding minimum and recommended requirements so that people know if the game can run on their system or not :P
Feel free to close this issue if you want to.

I'll keep the bug open to

try out the glutin "take anything we can get" idea
figure out and document the system requirements

Ah, okay. Sounds good to me.

https://github.com/a-b-street/abstreet/blob/5f3c914e28f7e51eeacd4edc5119cf0ad1366d14/widgetry/src/backend_glow_native.rs#L22
We have some more fallback cases here. Please reopen if you're still having problems with the latest release.

Unfortunately, I no longer regularly use the PC with which I was able to reproduce this bug. While I do still have access to it, I do not use it for anything. Since then, I have upgraded to a newer PC, to which I later on added a discrete GPU to, and the last time I tried to play the game on the newer iGPU, it worked fine. While in theory I could test it, I find it unlikely that the fallbacks won't work and that anyone else who will attempt to run the game will have such an old GPU that doesn't support what are essentially modern technologies.


remove old cruft that has been rewritten

Codecov Report

:exclamation: No coverage uploaded for pull request base (experimental@67a9804).

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 67a9804...8483f87. Read the comment docs.


Practice

Do you mean I have to implement the connection on the concrete builders?

Correct.

Ready to merge!


Question: Filtering/Rendering enum fields

Hi,
Did you plan to implement or implemented the possibility to pick from enum field values for column filters?
At the moment the component displays name of the value when enum field is used.
Couldn't find the docs/example on how to enable filtering with values/labels defined in the enum type.
One thing that would be great to see is having pick list of values/labels from enum type definition.
Second thing is displaying the [Description()] annotation instead of simple value label.

@MerkavaPL I added initial enum filtering implementation in develop branch.
If I won't have time to release/write docs until May you can use that .

Thank you for the message and effort.
I'll try the develop branch this week on our test project and will let you know the results.

If you find any bugs or edge cases feel free to use the source repository to report them.


wordlist vs _wordlist

There's a _wordlist.py in the repository and no wordlist.py afaict.
Importing wormhole.codes fails:
>>> import wormhole.codes
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../magic-wormhole/src/wormhole/codes.py", line 3, in <module>
    from .wordlist import (byte_to_even_word, byte_to_odd_word,
ImportError: No module named wordlist
>>>

oops, wormhole.codes should be removed entirely.. that functionality moved into _wordlist (and more specifically into the completion helper API). I'll land a patch to do that now (and WONTFIX #147).
Do you need something exposed to generate codes? There's nothing in the new implementation to expose the wordlist directly, but maybe we could add something. Take a look in docs/api.md and see if the existing stuff does what you want, or if we should add something new.


Fails to generate docs

Hi @tfiwm, first of all thank you for the such a great plugin, it's very helpful tool. I've recently started using it and run into an issue:
I'm using this plugin with webpack
I've installed latest version of the plugin : 0.0.2
Setup:
created jsdoc.conf file
included plugin into webpack.config
in webpack config pointed plugin to jsdoc.conf file
when i run webpack it fails with following error:
Taking sources from config file

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: spawn ENOENT
    at errnoException (child_process.js:980:11)
    at Process.ChildProcess._handle.onexit (child_process.js:771:34)

Running jsdoc from terminal does not throw any error.
Tested with plugin v.0.0.1, and it works well, no error either.

I will try to take a look as soon as possible ;)

I'm working on macOS. I had a similar error. Rolling back to the previous commit made it run. Still not working quite right, but it eliminated that error for me.

I managed to fix it on my setup but don't have time to figure out which step fixed it. This is what I did in addition to the above:

Installed jsdocs-babel plugin (probably this fixed it?)
created jsdoc.conf file
{ "plugins": ["node_modules/jsdoc-babel"], "babel": {    "extensions": ["js", "es6", "jsx"] } }
in my package.json I added a script for it and added it to my start config (Note, I am using concurently):
"scripts": { "docs": "jsdoc ./src", "start": "concurrently --kill-others  \"npm run docs && startASCII\" \"npm run \" \"node server.js --env=dev\"", ... }

Closing because of inactivity and newer versions


Unchecked checkboxes not exported in output

Hi,
Is there a way to keep checkboxes in output event if they are not checked ?
with thefollowing code my 2 checkboxes are shown and checked :
rendered_pdf = template_pdf({
    'ck1': 'Yes',
    'ck2': 'Yes'})

but using
rendered_pdf = template_pdf({
    'ck2': 'Yes'})

i thought the first checkbox would stay unchecked in te result, but it is not shown at all.
Thanks

The checkbox in the example is now working as expected.


Game logic

Describe Your Changes
New schemas for Player and Game creation, editing API posts.  To do: game logic.
Non-Obvious Technical Information
Game logic is still pending.
Checklist Before Requesting a Review

[x] The code runs successfully.

Could you take a look and let me know what you think before I move further? @michplunkett


Python Project - pyproject.toml

Would like to redo the Python Project details to read in and output pyproject.toml project files instead.
This will support project with pyproject.toml and those without.
For additional details, see
https://peps.python.org/pep-0621/
https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata

May need some "toml" support as well, but believe this may already be included in more recent Netbeans so this may be unnecessary.

This may overlap or replace some of the following:
https://github.com/ebresie/python4nb/issues/35 Licenses
https://github.com/ebresie/python4nb/issues/34 Library
Not sure if these are fully addressed in pyproject.toml - need to confirm this.
https://github.com/ebresie/python4nb/issues/33 - Configuration - Virtual Environments https://github.com/ebresie/python4nb/issues/32 - Platform

From Example pyproject.toml
[project]
name = "spam"
version = "2020.0.0"
description = "Lovely Spam! Wonderful Spam!"
readme = "README.rst"
requires-python = ">=3.8"
license = {file = "LICENSE.txt"}
keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"]
authors = [
{email =<EMAIL_ADDRESS>{name = "Tzu-Ping Chung"}
]
maintainers = [
{name = "Brett Cannon", email =<EMAIL_ADDRESS>]
classifiers = [
"Development Status :: 4 - Beta",
"Programming Language :: Python"
]
dependencies = [
"httpx",
"gidgethub[httpx]>4.0.0",
"django>2.1; os_name != 'nt'",
"django>2.0; os_name == 'nt'"
]
[project.optional-dependencies]
test = [
"pytest < 5.0.0",
"pytest-cov[all]"
]
[project.urls]
homepage = "https://example.com"
documentation = "https://readthedocs.org"
repository = "https://github.com"
changelog = "https://github.com/me/spam/blob/master/CHANGELOG.md"
[project.scripts]
spam-cli = "spam:main_cli"
[project.gui-scripts]
spam-gui = "spam:main_gui"
[project.entry-points."spam.magical"]
tomatoes = "spam:main_tomatoes"

Will also want to add a "New File...pyproject.toml" with maybe the example as a template.

Need a toml library to work with in Java.
See the following

https://medium.com/swlh/configure-your-java-program-with-toml-file-9f779a6a3de6
https://stackoverflow.com/questions/70033062/how-to-parse-toml-document-with-java

Some additional references

https://godatadriven.com/blog/minimal-pyproject-toml-example/
https://github.com/pypa/sampleproject

Will leverage jackson

https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-toml
https://github.com/FasterXML/jackson-dataformats-text

For Toml spec see https://toml.io/en/

May switch over to Tomlj which may support the sections which does seem to be fully supported in jackson
For more info see:

https://github.com/tomlj/tomlj
https://tomlj.org/


Sell this puppy on the market!

Request
Start charging money for this so we can host this for external companies. There are several competing retro web apps that charge money and have less features or about the same as us, yet we dont have an external offering!

This certainly raises the question to "Ford being a software company"  - why can't this be marketed and sold? Do you need help finding the people in legal to start this conversation? I'm happy to help introduce/help find them.

At this time we don't have any plans to sell this as a SAAS offering. I'd like to see efforts in the meantime focused on making it easier to self-host and get more community contributions for a more compelling product. Open to revisiting this idea at a later date.