[WIP] Setup Danger to check PRs

Hi @mxstbr, I've integrated Danger in the project:

Add Dangerfile with basics rules (see #95)
Add danger command to Travis flow

I've already created a bot and you can use this one if you want, I give you the credentials and then you can add the token in Travis (how to).
Implemented rules

[x] Enforce CHANGELOG.md entries for each PR that touches .js files
[x] A change was made in StyledComponent.js that wasn't made in StyledNativeComponent.js – warn that this might have to be done
[x] Warn that changes to ThemeProvider.js, StyledComponent.js or StyledNativeComponent.js might be semver major changes if they touch the context stuff
[x] Don't let testing shortcuts be merged into master (fit, fdescribe, it.only, describe.only)
[x] Enforce rebases to remove "Merge master into bla" commits?
[x] Enforce that a test must be added for the changes? (not sure if this makes sense for everything, maybe enforce for all .js files in the src/ folder except for src/vendor)
[ ] Enforce a certain commit style? Not sure if this is really necessary.
Anything else you can come up with that might be an issue with PRs more often than not!

for this one

Enforce that a test must be added for the changes? (not sure if this makes sense for everything, maybe enforce for all .js files in the src/ folder except for src/vendor)

Danger print a warning like this:
"There're library changes, but not tests. That's OK as long as you're refactoring existing code."
Because, yeah you could refactoring sometimes :) What do you think?
Extra rules

[x] Warn for big PR (> 500 lines)
[x] Congrats for version bump up :tada:
[x] Warn if an external contributor (a person who is not part of the organization) changes package.json
[x] Fail if PR body is missing (< 5 lines)

What do you think about these rules? Maybe too many messages can add too much noise in the PR's thread...
You can find some experiments in my fork, but pay attention, some of them are out of date with the current rules.
Let me know, bye  😄

This is amazing! I just checked out your fork and this is even better than I thought! (cc @orta)
I'll create a new bot (I want it to have a slightly different username) and get that setup on Travis asap!

Can we kill the rebasing stuff please? I prefer preserving git history over clean commit logs.

Yeah yeah I know @geelen, just pushing a commit to remove that.

Champion.

There ya go

Looking good ❣


Support upper and lower case period

According to TR35, the period "[m]ay be upper or lowercase depending on the locale and other options." Currently, we default to always using upper case.

Fixed in 2.0.0 by doing our own formatting. Periods are either upper case or lower case in the CLDR data, and we use that.


don't die on bad version string

fix #708 @loosebazooka @patflynn In this case we were correctly noticing a bad release that was pulled. I'm not 100% sure we want to fix this. Arguably we did exactly what we should have done when faced with a bad push.

I'm with you that this may not be the fix we want. The tools (IDEs, build) would still want to know about this so they can inform the users (i.e. show a warning in IntelliJ, Eclipse).
@loosebazooka

It would be easy to bubble the CloudSdkVersionFileParseException so clients can message the user if they choose. That said, I'm not sure it's worth the extra work on the IDE side to handle this. This was a one off mistake by the Cloud SDK, not a regular occurrence.

Isn't it already bubbled up to the clients?
The user report that started this discussion came from the IDE calling CloudSdkAppEngineDeployment#deploy which did not catch the CloudSdkVersionFileParseException causing the IDE to blow up.
I guess I'm suggesting that we don't make the fix here, and rather have the clients handle the exception:

Show are error to the user, perhaps with a suggestion to manually install the SDK
Notify us somehow (e.g. via an analytics ping in IntelliJ)

@elharo @patflynn @loosebazooka wdyt?

well there is the mechanism in IntelliJ that provided this user report, but currently its only set up to report when an exception bubbles up to the IDE and the user clicks a button to "report error to google". So in its current form its not ideal when we are trying to prevent the IDE error in the first place.
I'm not sure what Eclipse provides.

I'm not convinced we should throw an exception during a Cloud SDK operation because we can't parse the version string.
Ideally clients would be able to do version validation through some separate API.

As far as I can remember, IJ checks if Managed SDK is installed, and this involves checking the version file, but it does not rely on validate family of methods. If version is incorrect or unexpected, it will attempt to re-install. But this method is not used by Managed SDK installer/updater.

@etanshaul no I'm saying we shouldn't throw an exception for non-critical validation errors such as a bad version string.  Clients that want to do version validation should be able to inquire into the version through some other mechanism.

aha ok makes sense to me. In that case lgtm on this PR which effectively accomplishes that.
As @ivanporty mentioned, we do check the version via other means already in IJ - so we should look into that and make sure we handle these cases properly on the client side.

There is another method that does the check: CloudSdk.getVersion()


Arrow function doesnt work in jquery custom events

Arrow function doesnt work in jquery custom events.
I write this code using ES6/Babel
See my code:
$('.box').on('re:paint', () => {
// do something
})
When i change to:
$('.box').on('re:paint', function() {
// do something
})
then works fine

Does work: https://jsbin.com/jikitim/edit?html,js,output
I suspect you're getting confused about how the arrow function changes the bound context.


[Feature Request] Refactoring spec organisation

Motivation
Specs are currently organised in a way that does not allow much flexibility for the reward, action and done specifications.
Here I propose a new organisation for the specs that allow these dedicated objects to live in nested structures if necessary.
The main use case for now is MARL where nesting the reward at some level will allow users to directly understand if the reward is shared amongst agents or distributed individually (same for done and actions).
Example:
Shared reward:
>>> batch = 3
>>> time = 20
>>> n_agents = 4
>>> features = 5
>>> actions = 2
>>> td = TensorDict({
...     "agent_features": TensorDict({
...         "observation": torch.zeros(batch, time, n_agents, features),
...         "action": torch.zeros(batch, time, n_agents, actions),
...     }, [batch, time, n_agents]),
...     "reward": torch.zeros(batch, time),
... }, [batch, time])
TensorDict(
    fields={
        agent_features: TensorDict(
            fields={
                action: Tensor(shape=torch.Size([3, 20, 4, 2]), device=cpu, dtype=torch.float32, is_shared=False),
                observation: Tensor(shape=torch.Size([3, 20, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 20, 4]),
            device=None,
            is_shared=False),
        reward: Tensor(shape=torch.Size([3, 20]), device=cpu, dtype=torch.float32, is_shared=False)},
    batch_size=torch.Size([3, 20]),
    device=None,
    is_shared=False)

Distributed reward:
>>> td = TensorDict({
...     "agent_features": TensorDict({
...         "observation": torch.zeros(batch, time, n_agents, features),
...         "action": torch.zeros(batch, time, n_agents, actions),
...         "reward": torch.zeros(batch, time, n_agents),
...     }, [batch, time, n_agents]),
... }, [batch, time])
TensorDict(
    fields={
        agent_features: TensorDict(
            fields={
                action: Tensor(shape=torch.Size([3, 20, 4, 2]), device=cpu, dtype=torch.float32, is_shared=False),
                observation: Tensor(shape=torch.Size([3, 20, 4, 5]), device=cpu, dtype=torch.float32, is_shared=False),
                reward: Tensor(shape=torch.Size([3, 20, 4]), device=cpu, dtype=torch.float32, is_shared=False)},
            batch_size=torch.Size([3, 20, 4]),
            device=None,
            is_shared=False)},
    batch_size=torch.Size([3, 20]),
    device=None,
    is_shared=False)

In this configuration, the level of nesting of the reward (or action, or done state) is indicative of its purpose.
This allows us to consider that whatever the action shape, for instance, we know that the tensordict that contains it is indicative of what should be considered as a "batch" for exploration purposes for instance. Hence, multi-dimensional actions will be allowed without any problem.
Solution
To make this possible, I propose to refactor the specs in the following manner:

input_spec will be renamed _input_spec. It will contain these specs and no other:

an action_spec object which will always be a CompositeSpec. The key(s) will represent where the action key will be found. In general, this will be a simple _input_spec["action_spec"] = CompositeSpec(action=action_tensor_spec, shape=env.shape). The env will have an action_key attribute that will tell users where the action_spec leaf (action_tensor_spec in the example above) can be found inside the action_spec composite spec. Similarly, env.action_spec will return the leaf (and not the composite parent) such that the UX is not negatively impacted. In other words, env.action_spec = OneHotSpec(...) will still work as before.
a state_spec that contains all the input information that is not action.

'output_specwill be renamed_output_spec`. It will contain these specs and no other:

a reward_spec. Again a composite spec. In the MARL example above, we would have _output_spec["reward_spec"] = CompositeSpec(reward=smth, shape=env.shape) for the first code snippet, and _output_spec["reward_spec"] = CompositeSpec(agent_features=CompositeSpec(reward=smth, shape=(*env.shape, n_agents)), shape=env.shape) in the second. As for action_spec, the reward_spec env attribute will point to the leaf and not the root to facilitate the interaction with this spec. For example, env.reward_spec.is_in(tensordict.get(env.reward_key)) will work perfectly, and in most cases (reward at the root) this will be equivalent to env.reward_spec.is_in(tensordict.get("reward")).
Same refactoring for done_spec
observation_spec will contain all output that is not reward and done. There is some discussion about the name observation that I agree is suboptimal as many output that are not reward or done are not observations (eg info, step counts etc). I'm open to a better name and a deprecation of observation_spec in favour of something else later. Candidates are state_spec or output_spec (but it'll be confusing with _output_spec at the root).

Examples
Here are a few examples of what this will look like
# if a regular spec is passed, it is wrapped in a composite spec
env.reward_spec = some_spec
assert env.reward_spec == some_spec
assert env.reward_spec == env._output_spec["reward_spec"][env.reward_key]

# if a composite spec is passed, it is not wrapped
env.reward_spec = CompositeSpec(reward=some_spec)
assert env.reward_spec == some_spec
assert env.reward_spec == env._output_spec["reward_spec"][env.reward_key]

env.action_spec = some_other_spec
assert env.action_spec == some_other_spec
# not sure about 'action_key', there might be more than one aciton entry?
assert env.action_spec == env_input_spec["action_spec"][env.action_key]

td = env.fake_tensordict()
td[env.action_key] # gets the action
td["next", *env.reward_key] # gets the reward
td["next", *env.done_key] # gets the done

td["next", "reward"] # gets the reward (in most cases)
td["next", "done"] # gets the done (in most cases)

As we can see this is minimally dirsuptive for existing users, and it hides "input_spec" and "output_spec" which are more confusing than anything else.
Little add-on: we could introduce a lock on the specs to avoid unwanted modifications of _input_spec and _output_spec.
cc @matteobettini

This is very cool, I think overall a nice change.

I like that reward, done and action keys are becoming parameteric (with simple default). This is good generally as it will allow future flexibility. It will be a little bit painfull to adapt the rest of the library to it but maybe we can find an easy way to do it
I like that the input and output spec are becoming fully hidden and i am pro to locking the user from directly touching those.
i like the forced separation between shared and non shared marl keys

Some questions.

state_spec and observation_spec are still a bit biased imo. Your are saying: every extra input you need is in state_spec (but it might not be a state) and evey extra output you need goes in observation_spec (but it might not be an obs). Plus state_spec is by default not needed but observation_spec is by default needed. It seems a bit ununiform to me.  Maybe state_spec should be called input_spec and observation_spec should be called output_spec? or observation_spec stays and output_spec is introduced and by default empty (like state_spec).
So when a value estimator will get a nested tensordict of this type, it will read done, reward and so on. Will we integrate default utils in the library files to expand the one with the least dimensions? I am saying this because I would like marl to be by default compatible with any loss. So if we carry a reward with less dimensionalty that the done (or vice-versa), we will have to implement some automatic mechanisms for expansion, without the users having to do manual things and mdoifying the tensordict betewen colection and training.
# not sure about 'action_key', there might be more than one aciton entry? couldn't the action_key lead you to a composite spec? as I understand not. This might be a problem. In other words, this method will constrain to leaf specs for all the values, it might be worth considering the implications of this. (I think this might already be a problem in the current library tho)

NIT: MARL actions always have to have the agent dimension IMO. I would argue that without per agent actions it is not MARL
NIT2: In your second snippet there is an error in the reward which should be nested

state_spec and observation_spec are still a bit biased imo. Your are saying: every extra input you need is in state_spec (but it might not be a state) and evey extra output you need goes in observation_spec (but it might not be an obs). Plus state_spec is by default not needed but observation_spec is by default needed. It seems a bit ununiform to me. Maybe state_spec should be called input_spec and observation_spec should be called output_spec? or observation_spec stays and output_spec is introduced and by default empty (like state_spec).

i'm open to rename observation_spec in output_spec (but maybe let's find another name for _output_spec?). Having an empty output_spec is not a great idea IMO. The only advantage I see is that it is good from a naming perspective (as in: this is an observation and this isn't), but for advanced or basic users of the library, it will be unclear if anything goes in output_spec or observation_spec. For instance: are images in Atari states or observations? Probably observations. If I normalize them, the new normalized entry should stay in observation no? What if I have a state? Should I explicitly tell my wrapper "this is an obs, this is an output"? What if keys collide in output and observation? It goes with a lot of extra work, design questions and very little improvement in UX or ease of use of the library IMO.

So when a value estimator will get a nested tensordict of this type, it will read done, reward and so on. Will we integrate default utils in the library files to expand the one with the least dimensions? I am saying this because I would like marl to be by default compatible with any loss. So if we carry a reward with less dimensionalty that the done (or vice-versa), we will have to implement some automatic mechanisms for expansion, without the users having to do manual things and mdoifying the tensordict betewen colection and training.

Now that the time dimension is "marked" it will be easy to remove the constraints we have, at least in the value classes (not in the functionals). Something along the line of
time_dim = find_time_dim(tensordict)
reward = tensordict.get(reward_key)
done = tensordict.get(done_key)
reward, done = expand_given_time_dim(reward, done, time_dim)

def expand_given_time_dim(*tensors, time_dim):
    if tensors0.ndim != tensors1.ndim:
        new_shape = broadcast_shape(tensor0, tensor1)
        ...

It's very sketchy but you get the gist.

couldn't the action_key lead you to a composite spec? as I understand not

Still poundering about that.
We could perfectly do it:
env.action_spec = OneHot(...)
env.action_spec # retrieves the only leaf
env.action_spec = CompositeSpec(action1=OneHot(...), action2=ContinuousSpec(...))
env.action_spec # retrieves the composite spec because there is not a single leaf

NIT2: In your second snippet there is an error in the reward which should be nested

good catch

env.action_spec # retrieves the composite spec because there is not a single leaf
So you would do that it retrives the leaf if there is only one and the composite if not?
Or will it have something to do with the fact that the leaf is named "action"?
I think we have to well justify our policy for these choices:
Case 1:
env.x_spec = CompositeSpec(x=some_spec)
env.x_spec # some_spec

Case 2:
env.x_spec = some_spec
env.x_spec # some_spec

Case 3:
env.x_spec = CompositeSpec(x1=some_spec, x2=some_otehr_spec)
env.x_spec # CompositeSpec(x1=some_spec, x2=some_otehr_spec)

Case 4:
env.x_spec = CompositeSpec(x=some_spec, x2=some_otehr_spec)
env.x_spec # ???

What is our policy for case 4?
Case 5:
env.x_spec = CompositeSpec(agent_features=CompositeSpec(x=some_spec, x2=some_otehr_spec))
env.x_spec # ???

What is our policy for case 5?
there are many other examples I can construct where I do not know what level of nesting to return.
In general, when do we stop and decide if to return a leaf or a composite?
I think that independently of this we should not assume that x is a key in x_spec

Oh no not the name "action". Only the fact that the composite spec content is not unique (there is more than one leaf, hence I don't know which one to give you, thereby you receive both)

ok so x_spec will return something different only when there is only one leaf in the composite tree?

Wouldn't this prevent MARL where agents have more action keys?

why so?

In normal MARL
env.action_spec = CompositeSpec(agent_features=CompositeSpec(action=some_spec))
env.action_spec # some_spec

which abstracts agent_features away
If agents have multiple actions
env.action_spec = CompositeSpec(agent_features=CompositeSpec(action1=some_spec, action2=some_other_spec))
env.action_spec # CompositeSpec(agent_features=CompositeSpec(action1=some_spec, action2=some_other_spec))

which doesn't abstracts agent_features away
Wouldn't this cause problems?

not sure I see why this would cause problems, it would need adaptation of the code base here and there but you'd still do
env.action_spec.rand() # gives you a tensordict with {("agent_feature", "action1"), ("agent_feature", "action2")} keys

What else would you want to see with 2 actions that can't be stored in a single tensor?

Ok so meybe for me to understand things better I need to clarify these 2 things:

Why is

env.action_spec = CompositeSpec(agent_features=CompositeSpec(action=some_spec))
env.action_spec # some_spec

Needed? couldn't it give the composite?

When thinking of how this change fixes the problem with e-greedy, we said that with this change e-greedy can get the batch from the tensordict containing the action. If the action is in td["agent_features"] it will get the batch_size of that. Now, how does e-greedy now what is the tensordict containing the action?
It seems like it would have to traverse the tensordict using the action_key and stop at the first biforcation or as soon as there are no more tds to traverse

Needed? couldn't it give the composite?

I believe this is (1) bc-breaking and (2) a major hustle for the 90% of users that have only one action at the root level. It will seem like an awkward thing for most. Most people will think that env.action_spec.rand() will return a single tensor, not a tensordict with a single "action" key. It is the most intuitive behaviour IMO.

When thinking of how this change fixes the problem with e-greed

If you look at transforms.py we have a util that looks at a method, and if the input is a CompositeSpec, it dispatches the method at its leaves. Here's how it works:
@_apply_to_composite
def fun(self, spec):
    new_spec = spec.foo()
    return new_spec

Now if spec is composite spec, we'll go through that composite spec and re-build it using each spec.foo() at the leaves.
In our case, it will be similar:
@_apply_to_composite
def fun(self, action_spec, tensordict, action_key=("action",)):
    assert isinstance(action_key, tuple) # no str allowed
    if len(action_key)>1:
        tensordict = tensordict.get(action_key[:-1])
        action_key = action_key[-1:]
    batch_shape = tensordict.shape
    rand = torch.zeros(batch_shape).bernoulli_(self.p)
    explorative_action = action_spec.rand()
    action = tensordict.get(action_key)
    action = expand_as_right(rand, action) * action + (1-expand_as_right(rand, action)) * explorative_action
    tensordict.set(action_key, action)

here @_apply_to_composite is different than before: if the action_spec is not composite, it does nothing. If it is, it calls this function with each of the leaves.
Would this work?

Ok that makes sense ty


Charts installs are not using the system-default-registry value to pull images from private registry

Setup

Rancher version: v2.7.0-rc4
Browser type & version: Firefox

Describe the bug
Setting the system-default-registry Leaving UI defaults on RKE2 Custom (downstream) cluster creation (not editing Cluster Registries).
And leaving Container Registry to its default too in the Apps/Chart install UI.
The images are getting pulled from public registries (docker.io)
To Reproduce

Rancher v2.7.0-rc4 (local is RKE1 HA)
Configure system-default-registry to use with a private registry (testing was done in a registry without auth)
Create RKE2 downstream cluster (Custom was used in this case)

Check the Registries section picked up the system-default-registry as private registry value (do not edit)

Once the cluster is up active Navigate to Cluster -> Apps -> Charts and attempt install a Chart  (OPA gatekeeper or monitoring during testing)

Result

Navigate or use kubectl to check the chart namespace workloads/daemonsets/jobs and check the images are pulled from public not the private

The images doesn't have the private registry hostname as prefix tag as seen in the screenshot:

Expected Result
Images are pulled from the private registry
Additional context
Possibly related issues:
https://github.com/rancher/dashboard/issues/6910
Symptoms on Airgap:
https://github.com/rancher/rancher/issues/39364
This blocks Airgap

I added the comment in the rancher/rancher issue, i don't think this is a FE bug

Update - My assumption as wrong and this was a FE issue


Add email claims information to admin dashboard

[x] Fix email table view (separate page) as columns are now encrypted, only show the first x chars.
[x] Update email claims table column headers in admin app.
[x] Add # of email claims to users table overview page.

Fixed in #149


Support high DPI (retina) displays

Mesh nodes look blurry on my Macbook Pro w/ Retina Display.
Please support high DPI (retina) displays by handling window.devicePixelRatio as explained here.

We will definitely work towards this in the near future

@michaelobriena Looking forward to this update. It'd be nice to allow overriding device pixel ratio via API. It'll allow dropping down pixel size for apps that do not require sharp rendering.

@pilwon
I agree about the ability to change the quality. I believe the default, as it stands, is good, however, the ability to change the quality for various devices would be a great feature. We will be working on providing this feature very soon.

@FarhadG
Do you mean that you'll add support for high DPI soon ?
It seems I have the same problem with video as a texture on webgl spheres on my retina displays :-P

@pilwon @gregorybesson
PR in for this request. We'll be adding the ability to change the quality of app with more control, rather than relying on the pixel density. I believe that with this ability, you can target various devices with different qualities, so you don't thrash the GPU for devices that have 2+ pixel density.

@FarhadG
Thx a lot ! I owe you a beer ;)
(And if you can look at the #177 and my associated PR, I'll owe you 2 beers !)

@FarhadG Thanks, looking forward to merging this PR

Landed in https://github.com/Famous/engine/tree/v0.5.1


Sets up game class to run through game

This is the start of our game runner file. The idea is that we will be able to type ruby connect_four.rb and be able to run the game. There should be minimal code in the connect_four file, so I think that the connect_four.rb will reference this game.rb to get all of the game logic necessary to run the game how we want.(Which will indeed be lengthy if i'm being truthy)

I think this looks good. At some point we should probably delete the pry, class, and other runner files we aren't using anymore.


Fix "Public property  not found" exception.

Currently, spatie/data-transfer-object throws an exception if it encounters a field in the data returned by Github that is not explicitly defined in Ozzies DTOs. This is problematic as GitHub periodically adds new fields to their API.
This PR relaxes that behavior as it is good enough that Ozzie defines the fields it needs and ignores anything else.
Note: on 17-JUL-2020, I accessed Ozzie and saw the standard Laravel '500 | Server Error' page. I can't access the production server to see what was happening so I checked my local dev environment. I discovered a new field performed_via_github_app was coming back from Github and caused the above error.
Hopefully, this is what is happening in production :shrug:

Also, with this fix, I think it would be better if all properties currently defined in the DTOs that Ozzie doesn't need are removed. That way the DTOs represent the Ozzie data model more closely.
Thoughts? :thinking:

Thanks! Definitely like the idea of relaxing it and only keeping the fields we care about.
Looks like I may have not set up Bugsnag on Ozzie yet? I'll take a look. Thanks!


Add .env to optionally ignored files

Many twelve-factor apps use environment variables rather than the built in Rails secrets mechanism to store secrets.
The dotenv gem is widely used for this purpose and allows environment variables to be loaded from the .env file. However, this file should not be committed to source control.
This PR just adds the .env file to .gitignore so that these secrets aren't accidentally committed. In some rare instances, it may be required that this file is committed to source control so I've added it to the list of files that can be removed if the developer is ok with secrets being committed.

@maxehmookau could we annotate this rule like we did with the Python PR #1885 so that it's a bit clearer what this is about?

@shiftkey Sure, is that better? :)

@maxehmookau yep, that looks good! Thanks!

Great, thanks!


Feedback yifang

Dear Stephan @sb955
It is a great pleasure to read through your work and find out what we have in common in our method and what are the differences. Your derivation seem thorough and in detail. The code is nicely divided and companied with explanation to help readers understand it better. I had some ideas that can potentially make it better:

I changed iid to iid normal as it is. And A as a matrix not vector. e646ddbbe22a2a087689406bf5b95b4c78fa1d99

I changed small k to \rho as you used it as the lag order, but then I saw you using p in the minnesota prior, you can just choose one for consistency. e5e06cf36f0e9fdb471ac229be7e5572b2070623

Some minor changes for consistency as well. 4f0151abbc79b30ef9ef7130ecad59ce859de3d3

Add subscript to \nu_lambda to differentiate from previous nu. 81a5e54863537252068d320f720d6e4fe76d6fa3

Minor typos 0dc8df0c8da4f1642dc2cd3e4a00e1e276398e0a and delete an extra bracket(my bad) f08443d9e717aa58ababb46a722db1d6761bc6bc

I changed the code for model extension for efficiency (getting rid of  omega). I also delete the code (s_bar*t（s_bar）)/2 as i don't see why it is needed. But if it is your method then ignore this.  2b00a622772db481f7157202c44e1aa07c2f1bf7

Small notation changes. 6583a63b4be41ac00294baa79bb2ee5ec195917e

I am looking forward to see your presentation and work with you on the remaining part.
Best regards,
Yifang

Hi dear Yifang,
the changes you have proposed are extremely helpful.
I indeed have to admit, that I had a few typos and false index in my extension derivations.
Thank you very much for precisely going through them!
Also, I didn't know before, that quarto enables these nice latex formula representations. This looks so much better!
Regarding the extension, building up on your changes 2b00a62, I have also merged the contributions by @donotdespair to the code in  ce739c7. The major change in here is to also sample for the errors terms.
It seems to work now - YAY!
We can now work on implementing a metropolis hastings sampling step for \nu to further extend the model.
Best and thanks,
Stephan


upgrade go module

Coverage increased (+2.6%) to 41.817% when pulling 42b8c663c35c91f2c10384a8e54db88181e63361 on upgrade-go-mod into 0b6923a949303e4579bed5dc68fb3051b59e7274 on master.


Feature: Referencing external xflow operators by uri

When delivering assets (e.g. as a webservice), these assets can include data flows, which are referenced by uri. Thus, the same webservice can deliver the respective data flows.
These dataflows internally rely on xflow operators, which are referenced by name. Those names are predefined and must be known by the client application.
Hence, it is not possible for a webservice to deliver assets using arbitrary data-flow processing (e.g. domain specific). As workaround it is required that the client application imports a script file with the operator definitions first before using the actual webservice. Moreover, this script file might be implementation-specific rather than API-specific.

This feature is now on the develop branch with commit 86820b914d821145352b746f418f216cb02a694a and will be included in the 4.9 release. You can find the documentation here.


Both getAmPm() and getAmPm(false)return uppercase

Like the title says, not adding false as argument, doesn't turn the text in lowercase.

Try getAmPm(true)

Working with getAmPm(true), thanks. You should correct the readme. Regards.


VarStore extensions

Hello,
This PR is a first attempt of implementation of the ideas discussed in https://github.com/LaurentMazare/tch-rs/issues/415.
I implemented:

VarStore-level casting between the different precision levels for Float types
VarStore-level migration between devices
Path-level casting between the different precision levels for Float types.

Please let me know what you think

Thanks for the PR!


[BUG] First training batch for retrieval models is slow

Bug description
The first batch of a retrieval model is slow (more than 3 minutes), then for next steps it is pretty fast.
Steps/Code to reproduce bug

Download this preprocessed H&M dataset
Run this retrieval training script with the following arguments. It will train for a single epoch and only 10 steps

python scripts/retrieval_train_eval.py --data_path /mnt/nvme0n1/datasets/handm_fashion/data_preproc_v03 --output_path ./ --model_type two_tower --two_tower_mlp_layers 256,128,64 --two_tower_activation relu --two_tower_dropout 0.1 --logits_temperature 0.1 --l2_reg 1e-4 --loss categorical_crossentropy --train_batch_size 4096 --eval_batch_size 128 --epochs 1 --train_steps_per_epoch 10 --lr 1e-4 --lr_decay_rate 0.90 --lr_decay_steps 1000 --optimizer adam --train_metrics_steps 100 --two_tower_embedding_sizes_multiplier 2.0 --neg_sampling inbatch --log_to_tensorboard --log_to_wandb

Include a breakpoint within ExamplesPerSecondCallback.on_train_begin() and on_train_batch_end() and you will notice the first batch takes about 3 min.

Fixed by #352


Blog App: Create Data Model

In this milestone, I completed the following requirements;

Build your project schema.

Create and run the necessary migration files.

Table and column names should match the ERD diagram

Foreign keys should be included.

All columns that are foreign keys should have a corresponding index.

Thank you for the review, @DeliceLydia 👍


Manage milestones on issues & PRs

Really excited for this PR. Will help me manage work here and on IGListKit a lot more efficiently. What this does:

Consolidate milestone models into Milestone
New milestone action in management dropdown
VC that fetches list of milestones for a repo
Mutate milestone according to V3 API
Optimistic updating of UI using FlatCache

Fixes #369
Action shot:

Added milestone to this PR via GitHawk 🤘
Sent with GitHawk

Awesome!

Gonna go ahead and land so we can test it out. Pretty much all I wanted to get into 1.13
Sent with GitHawk


Share data between workflows without privileged mode

We start from this example workflow composed of two pipelines, the second one depending on the first one.
---
kind: pipeline
name: simulate build

steps:
- name: build
  image: alpine
  commands:
  - echo "Line 1" > file.txt
  - cat file.txt

---
kind: pipeline
name: simulate package

steps:
- name: deploy
  image: alpine
  commands:
  - echo "Line 2" >> file.txt
  - cat file.txt

depends_on:
- simulate build

If we run it as is in the first cat file.txt it will show Line 1 and in the second cat file.txt it will show Line 2. That is, the pipelines are independent and data is not shared between them.
Right now if I wanted to share data between both pipelines I would have to do something like the following.
---
kind: pipeline
name: simulate build

steps:
- name: build
  image: alpine
  volumes:
  - name: data
    path: /data
  commands:
  - echo "Line 1" > /data/file.txt
  - cat /data/file.txt

volumes:
- name: data
  host:
    path: /tmp

---
kind: pipeline
name: simulate package

steps:
- name: deploy
  image: alpine
  volumes:
  - name: data
    path: /data
  commands:
  - echo "Line 2" >> /data/file.txt
  - cat /data/file.txt

volumes:
- name: data
  host:
    path: /tmp

depends_on:
- simulate build

While this works correctly it has the problem that it requires the repository to be trusted in Drone in order to mount a host volume for use as temporary volume. Also, since it is a standard host mount and not a temporary mount, the volume is not deleted when the workflow is finished running.
It would be very interesting to have some way to share files between different pipelines without the need for the repository to be marked as trusted, without the need to use a volume on the host and using only temporary volumes.

The recommended approach to sharing data between workflows would be to use one of our caching plugins.  There are a number of different plugins, but this one is probably the most comprehensive:
https://underthehood.meltwater.com/blog/2019/04/10/making-drone-builds-10-times-faster/

Hi @bradrydzewski, first of all, my apologies for not being able to respond sooner, too much work and too little time.
Yes, the idea you mention is the one I currently use. Either that or directly make the repository trusted to be able to use local volumes, but as I initially commented using a plugin doesn't solve the problem since you either rely on a third party (an S3 volume or similar) or you make the repository trusted and allow local volumes.
My idea in this particular case is to enable some kind of flag that allows a temporary volume (which does not require any privilege) to be used throughout all the stages of a pipeline. This would give a lot of flexibility to the system without making it dependent on permissions or third parties. What do you think?

@ogarcia Have you found a solution? Or is it possible to mount host volume to those containers?

@sever-sever no. The only solution if you want it to work with a local volume is to mark the repository as trusted to allow mounting. With plugins you could do something but you depend on having a third party like an S3 volume or similar.


rustup; better comment in storage_dead_dangling test

@bors r+

:pushpin: Commit b4b048cc86efbb6c64b038fc8c943565aca76c4e has been approved by RalfJung

:hourglass: Testing commit b4b048cc86efbb6c64b038fc8c943565aca76c4e with merge f409454156032b94222faa85690f05c40d6b9fb7...

:sunny: Test successful - checks-actions
Approved by: RalfJung
Pushing f409454156032b94222faa85690f05c40d6b9fb7 to master...


fix: simplify framework implementation

Bit of a refactor to make the logic for the framework DOM cache less convoluted.

Tachometer seems convinced that this is actually slower for first and second page load, and it doesn't actually simplify the code much, so let's just skip it.


fix(ci): fix and reenable CI

GitHub Actions were ignore temporarily to speed up development/refactoring. Fix tests and prevent merging if unsuccessful.

GitHub Actions are enabled again.


Tests for beets fail

Describe the bug
The tests are failing.
To Reproduce
Steps to reproduce the behavior:

nix-build -A beet

Expected behavior
A clear and concise description of what you expected to happen.
Screenshots
If applicable, add screenshots to help explain your problem.
Additional context
Add any other context about the problem here.
======================================================================
ERROR: test_config_include_paths_false (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 45, in test_config_include_paths_false
    response = self.client.get('/item/1')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/item/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_config_include_paths_true (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 37, in test_config_include_paths_true
    response = self.client.get('/item/1')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/item/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_get_multiple_albums_by_id (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 129, in test_get_multiple_albums_by_id
    response = self.client.get('/album/1,2')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/album/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_get_multiple_items_by_id (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 67, in test_get_multiple_items_by_id
    response = self.client.get('/item/1,2')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/item/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_get_single_album_by_id (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 121, in test_get_single_album_by_id
    response = self.client.get('/album/2')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/album/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_get_single_item_by_id (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 59, in test_get_single_item_by_id
    response = self.client.get('/item/1')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/item/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

======================================================================
ERROR: test_get_single_item_not_found (test.test_web.WebPluginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/build/source/test/test_web.py", line 76, in test_get_single_item_not_found
    response = self.client.get('/item/3')
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1006, in get
    return self.open(*args, **kw)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/testing.py", line 222, in open
    return Client.open(
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 970, in open
    response = self.run_wsgi_app(environ.copy(), buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 861, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/test.py", line 1096, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/app.py", line 2446, in wsgi_app
    ctx.push()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 396, in push
    self.match_request()
  File "/nix/store/rcync2hhpzaw3zjg9lzx3pymhgxsrfbk-python3.8-Flask-1.1.2/lib/python3.8/site-packages/flask/ctx.py", line 350, in match_request
    result = self.url_adapter.match(return_rule=True)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1873, in match
    rv = rule.match(path, method)
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 902, in match
    new_path = "|".join(self.build(result, False))
  File "/nix/store/2yp5874nib71k55984nsac0hdpbbfh7d-python3.8-Werkzeug-1.0.1/lib/python3.8/site-packages/werkzeug/routing.py", line 1040, in build
    return self._build(**values)
  File "<werkzeug routing>", line 1, in <builder:'/item/<idlist:ids>'>
  File "/build/source/beetsplug/web/__init__.py", line 172, in to_url
    return ','.join(value)
TypeError: sequence item 0: expected str instance, int found
-------------------- >> begin captured logging << --------------------
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: item_removed
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
beets: DEBUG: Sending event: database_change
--------------------- >> end captured logging << ---------------------

----------------------------------------------------------------------
Ran 1901 tests in 71.021s

FAILED (SKIP=29, errors=7)
builder for '/nix/store/pqzxdk256178prmnzzj5hfvrihbzm7fi-beets-1.4.9.drv' failed with exit code 1

Notify maintainers

@aszlig @domenkozar @pjones
Metadata
Please run nix-shell -p nix-info --run "nix-info -m" and paste the result.
5460cc93c4e98091c4a24b915a64e8433a3efefe
Maintainer information:
# a list of nixpkgs attributes affected by the problem
attribute: beet
# a list of nixos modules affected by the problem
module:

potential patch https://github.com/beetbox/beets/commit/d43d54e21cde97f57f19486925ab56b419254cc8

Indeed that resolves the broken tests. Unfortunately they didn't release since May 2019, so I guess we're gonna ship that patch.


Add support for surface layers exclusive zones in rootston

In rootston, exclusive zones are ignored. These are used when:

A window is maximized: the maximized window shouldn't overlap an exclusive zone
One surface layer requests an exclusive zone, another one is already using this zone (but not exclusively): one surface layer may be resized (e.g. a bar and a background)
Two surface layers request exclusive zones that overlap: one surface layer may be moved (e.g. two bars)

rip


Expose Read(StreamReader) in FixedLengthFileMultiEngine

I noticed the existence of a method Read(StreamReader streamReader) in the class FixedLengthFileMultiEngine but it is not in the corresponding interface: FixedLengthFileMultiEngine

I've done two Pull Requests

#63 fixes this issue in master branch;
#64 fixes this issue in dev branch;

For #64, the build is failing but I think it's not my fault.


ecp5: Remove lib_whitebox from distributed RAM

This is a workaround for #2667 to at least unbreak ECP5 builds while we think about possible better ways of dealing with this case.

Just to be clear, removing these attributes will mean that ABC9 will not look inside this module to extract a bypass box that captures its async read behaviour.

Closing in favour of the solution of blackboxing whiteboxes before hitting the JSON backend