Support CopyWith method on superclasses

I am using polymorphism as described in the documentation like so:
abstract class Animal with Mappable {
  final String name;
  const Animal(this.name);
}

class Cat extends Animal {
  final String color;
  const Cat(super.name, this.color);
}

class Dog extends Animal {
  final int age;
  const Dog(super.name, this.age);
}

It properly generates the expected copyWith method for both Cat and Dog but does not generate a copyWith method for Animal. While this may initially make sense, it is problematic when using a (made-up) class like this:
class AnimalChanger<T extends Animal> {
  AnimalChanger(this.animal);

  Animal animal;

  void setName(String name) => animal = animal.copyWith(name: name);
}

I am currently trying to work around it by manually providing the copyWith method on the animal class like so:
@MappableClass()
abstract class Animal with Mappable {
  final String name;
  const Animal(this.name);

  Animal copyWith(String? name) {
    if (this is Cat) {
      return Cat(
        name ?? this.name,
        (this as Cat).color,
      );
    } else if (this is Dog) {
      return Dog(
        name ?? this.name,
        (this as Dog).age,
      );
    }
    throw Exception('Could not find a matching subclass to copy');
  }
}

Perhaps there is a better way to solve this? I basically want to be able to create methods and classes that act on any immutable subclass instance of Animal (in this case) and be able to modify fields that all Animal subclasses share (like 'name') without losing the data in the fields that are unique to the specific subclass in use (like 'color' or 'age').

Interesting concept. I see that it could be really useful.
Currently the copyWith implementations are done using extensions, meaning you can't leverage inheritance for those methods and are forced to use explicit casts for each subtype.
As a first step however, you could simplify your implementation to:
@MappableClass()
abstract class Animal with Mappable {
  final String name;
  const Animal(this.name);

  Animal copyWith({String? name}) {
    if (this is Cat) {
      return (this as Cat).copyWith(name: name ?? this.name);
    } else if (this is Dog) {
      return (this as Dog).copyWith(name: name ?? this.name);
    }
    throw Exception('Could not find a matching subclass to copy');
  }
}```

Which could also be generated as an extension on the base class.

Thanks for the suggestion. That actually got me digging a bit deeper and I managed to come up with this  implementation as well:
@MappableClass()
abstract class Animal with Mappable {
  final String name;
  const Animal(this.name);

  Function get copyWith {
    if (this is Cat) {
      return CatCopyWith(this as Cat, $identity);
    } else if (this is Dog) {
      return DogCopyWith(this as Dog, $identity);
    } else {
      throw Exception('Could not find a matching subclass to copy');
    }
  }
}

The upside is that you don't need to keep the copyWith method on the abstract class manually in sync with the parameters. Downside is that you lose some typesafety since copyWith on  shows as dynamic. It also requires one to import 'package:dart_mappable/internals.dart'; which is not ideal either.

That's a really great idea. I played around with it and it works like this:
I have an interface like AnimalCopyWith that defines an abstract call({String? name}) method. All subtype-copywiths then implement this interface and override the method. This works especially since overridden methods can add additional optional parameters. Together this looks like this (only important parts shown):
extension AnimalMapperExtension on p0.Animal {
  AnimalCopyWith<p0.Animal> get copyWith => AnimalCopyWith(this, $identity);
}

abstract class AnimalCopyWith<$R> {
  factory AnimalCopyWith(p0.Animal value, Then<p0.Animal, $R> then) {
    if (value is p0.Cat) { return CatCopyWith(value, then); }
    else if (value is p0.Dog) { return DogCopyWith(value, then); }
    else { throw MapperException.unsupportedMethod(MapperMethod.copy, value.runtimeType); }
  }

  $R call({String? name});
}

abstract class CatCopyWith<$R> implements AnimalCopyWith<$R> {
  factory CatCopyWith(p0.Cat value, Then<p0.Cat, $R> then) = _CatCopyWithImpl<$R>;

  @override
  $R call({String? name, String? color});
}

abstract class DogCopyWith<$R> implements AnimalCopyWith<$R> {
  factory DogCopyWith(p0.Dog value, Then<p0.Dog, $R> then) = _DogCopyWithImpl<$R>;

  @override
  $R call({String? name, int? age});
}

But now the problems began!
When writing subclasses, you can change the super params in ways that completely breaks this mechanic. You can change the name, type or add some initialization logic in the constructor calls. When doing this, chances are high that the overridden call({...}) does not work anymore, because you cannot change or remove parameters.
(There might be ways to solve this by just ignoring problematic parameters but then its not great because they are missing in the general copyWith signature)
Also, generics! As soon as generics come into play, things get 1000 times more complicated. It's too much to write here, but there are a lot of cases that just does not work or would behave in weird ways. E.g. with this:
class A<T> {}

class B<T, V> extends A<T> {}

class C extends A<int> {}

Now when you have your general A.copyWith method you would want to get the same runtimeType out as you put in, meaning calling this on an instance of B you would want to end up with a new instance of also B (and same with C). However that's not quite possible, since neither is fully generic under only T.

So generally I think this would be a very cool feature, but it's also a lot of work and would potentially require some restructuring of the package to be better supported.
Specifically going the freezed way with class-specific mixing (_$MyClass) instead of a general Mappable mixin would allow for the copyWith to not be in an extension method and thereby better work with inheritance and generics. But that's stuff for a version 2 if at all.

Well that sure got difficult fast! Thanks for looking into it though. It's definitely complex trying to cover all those cases but you're suggestion to borrow from freezed is an interesting one for sure. I also looked at some of your other packages (namely type_plus and super_annotations) and was about to try to roll my own solution out of those. Still might. Beyond that though, I'd be interested in sponsoring a solution to this issue if that would help narrow down a timeline on it. Thanks!

So it really depends on what you are looking for and how perfectionistic I want to be 😂.
I think there exists a solution that works for 80% of common use-cases that doesn't require huge restructurings, but a generally working solution would obviously be preferable.
Regarding the packages, type_plus might help here, but also just by providing a workaround and not a real solution.
If just metaprogramming would land soon...

What do you think? I'm happy to work on a v2 which also includes #21. And I'm open for sponsoring to prioritize this.

Sorry, for the delay. Yes, I'm interested. I sent you an email via the email you use for commits. Hopefully that's the right one.

@point-source Implemented in prerelease 2.0.0-dev.1.
See the changelog for details: https://pub.dev/packages/dart_mappable/versions/2.0.0-dev.1/changelog
I played around with different ways, but opted for generating additional mixins that you have to use on each super- or subclass. This requires a bit extra setup but was the most stable and best-working way.
Let me know if this works or you have any issues. I made sure this supports generics well, but haven't deeply checked this issues with modifying super-parameters.

When writing subclasses, you can change the super params in ways that completely breaks this mechanic. You can change the name, type or add some initialization logic in the constructor calls. When doing this, chances are high that the overridden call({...}) does not work anymore, because you cannot change or remove parameters.
(There might be ways to solve this by just ignoring problematic parameters but then its not great because they are missing in the general copyWith signature)

It generated okay and all the analysis clears but it doesn't seem to run. Additionally, the naming of the mixins includes a number that maybe was related to debugging? Not sure if that's intentional or not. Here is an example of a generated mixin for a class called Stage:
mixin Stage8Mixin {
  Stage8CopyWith<p8.Stage> get copyWith => _Stage8CopyWithImpl(this as p8.Stage, $identity);
}

and here is the class:
@MappableClass()
class Stage extends StoredObject with Stage8Mixin {
  /// Stage
  const Stage({
    required super.id,
    required super.name,
  });

  /// Creates an empty instance
  static Stage empty() => Stage(id: const Uuid().v4(), name: '');
}

Notice that the mixin has "8" in the name. Each mixin has a different number. Presumably based on the order in which the builder enumerated all mappable classes. This is not mentioned in the docs you linked so I assume it's not intentional.
As for execution, here is the error log output:
MacroDevice4CopyWith<p4.MacroDevice, p4.MacroDevice> get copyWith;
  ^^^^^^^^^^^^^^^^^^^^
: Error: Expected 1 type arguments.
lib/main.mapper.g.dart:587
abstract class Adder13CopyWith<$R> implements MacroDevice4CopyWith<$R, p13.Adder> {
                                                  ^^^^^^^^^^^^^^^^^^^^
: Error: Expected 1 type arguments.
lib/main.mapper.g.dart:629
abstract class Bruno14CopyWith<$R> implements MacroDevice4CopyWith<$R, p14.Bruno> {
                                                 ^^^^^^^^^^^^^^^^^^^^
: Error: Expected 1 type arguments.
lib/main.mapper.g.dart:671
abstract class Emma15CopyWith<$R> implements MacroDevice4CopyWith<$R, p15.Emma> {
                                                    ^^^^^^^^^^^^^^^^^^^^
: Error: Expected 1 type arguments.
lib/main.mapper.g.dart:713
abstract class Ian16CopyWith<$R> implements MacroDevice4CopyWith<$R, p16.Ian> {

                                             ^^^^^^^^^^^^^^^^^^^^
: Error: Expected 1 type arguments.
lib/main.mapper.g.dart:755
abstract class Luke17CopyWith<$R> implements MacroDevice4CopyWith<$R, p17.Luke> {
                                                  ^^^^^^^^^^^^^^^^^^^^
: Error: The method 'MacroLog6CopyWith.call' doesn't have the named parameter 'name' of overridden method 'StoredObject5CopyWith.call'.
lib/main.mapper.g.dart:303
  @override $R call({String? id, DateTime? executedAt, DateTime? completedAt, String? userId, String? username, p7.Macro? macro, p23.IList<p18.StepStatus?>? stepOutput, bool? isSuccessful});
               ^
: Context: This is the overridden method ('call').
lib/main.mapper.g.dart:265
  $R call({String? id, String? name});
     ^

This seems related to the fact that the (abstract) MacroDevice, and (concrete) Adder, Bruno, Emma, and Ian classes extend a class called StoredObject which serves to ensure that the classes can be indexed/serialized by another part of the system. I could potentially remove this with some effort but I suspect that dart_mappable should be able to handle this case.
Here is the StoredObject class:
abstract class StoredObject with Mappable {
  const StoredObject({
    required this.id,
    required this.name,
  });

  final String id;

  final String name;
}

and here is the MacroDevice class from which most classes inherit:
/// Template for macro device specifications
@MappableClass(discriminatorKey: 'macroDeviceType')
abstract class MacroDevice extends StoredObject with MacroDevice4Mixin {
  /// Template for macro device specifications
  const MacroDevice({
    required super.id,
    required super.name,
    required this.paramValues,
  });

  /// Name to display anywhere one or more of these devices is referenced
  String get modelName;

  /// Parameters needed to create an instance of the device
  IMap<String, Parameter> get parameters;

  /// Operations made available to the macro system which can be
  /// executed on the device instance
  IMap<String, Operation> get operations;

  /// Parameter values
  final IMap<String, dynamic> paramValues;

  /// Service to be used for executing operations
  FutureOr get service;
}

and here is an example of a MacroDevice subclass:

@MappableClass()
class Luke extends MacroDevice with Luke17Mixin {
  const Luke({
    required super.id,
    required super.name,
    required super.paramValues,
  });

  /// Creates an empty instance with a unique ID
  static Luke empty() => Luke(
        id: const Uuid().v4(),
        name: '',
        paramValues: const IMapConst({}),
      );

  @override
  String get modelName => 'Luke';

  @override
  IMap<String, Parameter> get parameters => const IMapConst();

  @override
  LukeService get service => LukeService();

  @override
  IMap<String, Operation> get operations => IMapConst();
}

Let me know if any additional information or tests would be helpful. Thanks!

Can you add your classes in a project under examples/ and open a PR, so I can test against this? This way I can check that the package works for your use-case.

The number issue and type argument issue is fixed. For the last error I need to see the MacroLog class.

It finally compiled and ran but I hit another error. This time with the custom mappers:
_ChainedMapperException (MapperException: Failed to encode (AppState).authState(AuthState).user(User).userClaims(UserClaims).stages(IMapImpl<String, List<String>>): Invalid argument(s): Failed to call [encoder] function of IMapMapper: Function expects different amount of type arguments. Provided 2, but expected 0.)
Here is my custom mapper:
/// Enables dart_mappable library to support IMap from fast_immutable_collections
@CustomMapper()
class IMapMapper extends BaseMapper<IMap> {
  @override
  Function decoder =
      <Key, Val>(value) => IMap<Key, Val>(Mapper.fromValue(value));

  @override
  Function encoder = (IMap self) => Mapper.toValue(self.unlock);

  @override
  Function get typeFactory => <Key, Val>(f) => f<IMap<Key, Val>>();
}

Has the syntax for this changed in the new build?

Nevermind, I realized I forgot the generic params on the encoder function. Seems to be working now. Thanks!

Yes this has changed that the encoder now also takes generic params.

I published a next prerelease. This really got quite complex by now since there are so many cases to watch out for.
I will close this for now, feel free to open bug tickets if you have some problems.


Add the ability to update the ownership of a limited stack

Description:
At the moment we are unable to change stack ownership if they are created outside of portainer.
Solution:
Have the possibility to update ownership could be nice, like we can for services for example.
Additional context:
This feature could be interesting for the portainer stack itself, I mean in my case I've got a stack for portainer with portainer itself, its agent and træfik as a main reverse proxy and don't really want to make it accessible by all users.
If you have a workaround I'll be happy to know it.
Thanks

Limited stacks were introduced to avoid UAC conflicts based on stack names amongst other things: https://github.com/portainer/portainer/issues/1347
If we can solve #1347 we would then be able to apply specific ownership policies to any stacks (limited o not).
When using an external CI system, you could then be able to leverage https://github.com/portainer/portainer/issues/1257


CompUnit::PrecompilationStore::File deprecated in favor of CompUnit::PrecompilationStore::FileSystem

While testing the module:
===> Testing: Pod::To::HTML:ver<0.8.1>:auth<github:Raku>
[Pod::To::HTML] Saw 1 occurrence of deprecated code.
[Pod::To::HTML] ================================================================================
[Pod::To::HTML] Use of the 'CompUnit::PrecompilationStore::File' class seen at:
[Pod::To::HTML]   /home/nando/.zef/tmp/84e13919fdc914b9ae9594eb8aa54baceb4d9679.tar.gz/dist/lib/Pod/Load.pm6 (Pod::Load), line 93
[Pod::To::HTML] Please use the 'CompUnit::PrecompilationStore::FileSystem' class instead.
[Pod::To::HTML] --------------------------------------------------------------------------------
[Pod::To::HTML] Please contact the author to have these occurrences of deprecated code
[Pod::To::HTML] adapted, so that this message will disappear!
[Pod::To::HTML] Saw 1 occurrence of deprecated code.
[Pod::To::HTML] ================================================================================
[Pod::To::HTML] Use of the 'CompUnit::PrecompilationStore::File' class seen at:
[Pod::To::HTML]   /home/nando/.zef/tmp/84e13919fdc914b9ae9594eb8aa54baceb4d9679.tar.gz/dist/lib/Pod/Load.pm6 (Pod::Load), line 93
[Pod::To::HTML] Please use the 'CompUnit::PrecompilationStore::FileSystem' class instead.
[Pod::To::HTML] --------------------------------------------------------------------------------
[Pod::To::HTML] Please contact the author to have these occurrences of deprecated code
[Pod::To::HTML] adapted, so that this message will disappear!

It's deprecation in Pod::Load, and the PR is already sent: https://github.com/JJ/p6-pod-load/pull/19
Sorry to close it, but not a lot we can do reasonably.


add webComponent specific attribute to Attribute Order

I think the following should be added to the Attribute Order since webcomponent are more and more used.  (I'm working with angular, but would make sense for any other framework)
    <custom-component
      [type]="myType"
      [ngSwitch]="condition"
      (myEvent)="onMyEvent()"
      *ngIf="enabled"
    ></custom-component>

I would put those after the data-* one ('data-.+', 'ng-.+', '[.+', '(.+', '*ng+',)

Closing as duplicate-ish of #239.

Closing as duplicate-ish of #239.

May have you put the wrong duplicate link '^^

Updated! Sorry :)


Capstone project beta v0.1

I built this website following the requirements provided:
-Interactions
-Links
The home page should have a link in the menu to the about page.
The logo in the header links to the home page.
-Mobile menu
When the user clicks (or taps) the hamburger button on the header, the mobile menu appears over the page.
There are no guidelines for the mobile menu in the docs, but you should implement it so it is consistent with the design (colors, typography, spacings, etc.).
The mobile menu should have a close (X) button that closes the menu.
-Dynamic page
The section "Featured speakers" should be created dynamically in JavaScript.
You should use a JavaScript variable with the data about the speakers and use it when the page loads to create the HTML for this section dynamically.
-i fixed all linter errors

refresh page on different sizes  to see intended output

As requested on the project requirements:

You should add a link to your video presenting the project on the PR 😉.


Improve onboarding UX

for context, I used sg.nvim before when it moved to sourcegraph org and cody was added
At that time I was able to open a file via remote url without logging in
Now it fails opening it without logging in (seems intended but not stated clearly).
Nonetheless, let's go into a log in process.
Before logging in, when checking the status of logging in, checkhealth sg doesn't report the message in a user friendly way but failed to report with the error message like below
- ERROR Failed to run healthcheck for "sg" plugin. Exception:
  function health#check, line 25
  Vim(eval):E5108: Error executing lua /home/user/.local/share/nvim/lazy/sg.nvim/lua/sg/health.lua:76: attempt to call field 'get_info' (a nil value)
  stack traceback:
  /home/user/.local/share/nvim/lazy/sg.nvim/lua/sg/health.lua:76: in function 'report_env'
  /home/user/.local/share/nvim/lazy/sg.nvim/lua/sg/health.lua:158: in function 'check'
  [string "luaeval()"]:1: in main chunk

After logging in via :SourcegraphLogin, checkhealth sg works like below
sg.nvim report ~
- OK Valid nvim version
- OK Found `cargo` is executable (can still use `:SourcegraphDownloadBinaries` to avoid building locally)
- OK Found `sg-nvim-agent`: /Users/user/.local/share/nvim/lazy/sg.nvim/dist/sg-nvim-agent
- OK Found `node` (config.node_executable) is executable
- OK Found `cody-agent`: /Users/user/.local/share/nvim/lazy/sg.nvim/dist/cody-agent.js
- Auth strategy order: { "environment-variables", "nvim", "cody-app" }
- OK   Authentication setup correctly ("nvim")
- OK     endpoint set to: https://sourcegraph.com
- OK   Sourcegraph Connection info: {
  access_token_set = true,
  endpoint = "https://sourcegraph.com",
  sg_nvim_version = "0.2.4",
  sourcegraph_version = {
  build = "245946_2023-10-05_5.2-23290a032166",
  product = "245946_2023-10-05_5.2-23290a032166"
  }
  }
- OK Found correct binary versions: 0.2.4 = 0.2.4
- OK sg.nvim is ready to run

And optionally, it would be great to have a default url, https://sourcegraph.com typed in for :SourcegraphLogin instead of leaving it empty

Hey, thanks for the detailed issue!
I think I've fixed most of the onboarding issues you mentioned (nice suggestions!) in https://github.com/sourcegraph/sg.nvim/pull/142
Just to confirm the first part you mentioned, you're saying before you were using the Sourcegraph aspects (like opening a file and navigating via sg://repo/-/path, but you never logged in? I'm not sure if that should be supported going forward but I can check and see if I can make that work again (it'd be nice to support if possible IMO)

You are very welcome and thanks for looking into it!
To answer the question of what happens when you open via, for example, nvim sg://github.com/tjdevries/sam.py/-/src/sam.py when I'm not logged in yet result with the error like below (same result with :edit sg://...
Error detected while processing BufEnter Autocommands for "*":
Error executing lua callback: ...t/.local/share/nvim/lazy/sg.nvim/lua/sg/cody/context.lua:13: attempt to call field 'get_remote_url' (a nil value)
stack traceback:
        ...t/.local/share/nvim/lazy/sg.nvim/lua/sg/cody/context.lua:13: in function 'get_origin'
        .../test/.local/share/nvim/lazy/sg.nvim/lua/sg/cody/rpc.lua:261: in function 'initialize'
        .../test/.local/share/nvim/lazy/sg.nvim/lua/sg/cody/rpc.lua:143: in function 'start'
        .../test/.local/share/nvim/lazy/sg.nvim/lua/sg/cody/rpc.lua:191: in function 'notify'
        .../.local/share/nvim/lazy/sg.nvim/lua/sg/cody/protocol.lua:110: in function 'did_focus'
        ...ocal/share/nvim/lazy/sg.nvim/after/plugin/cody-agent.lua:24: in function <...ocal/share/nvim/lazy/sg.nvim/after/plugin/cody-agent.lua:24>

I think it should either:

a. be usable without logging in (with limited features) or
b. gives better failure and explantion and the guidance on what to do (signing in)

And thanks for the PR #142 to address this issue, I will try the new version when I have a chance and let you know how it went :)

For now I implemented (at least working for me, in a few different no-auth style items) an error message with instructions on what to do.
If I can dis-entangle some of the server at some point I'll add back viewing Sourcegraph files without logging in if possible, but it will probably be pretty low on the priority list (cause it makes everything more complicated if you're maybe logged in haha).
Thanks again, let me know if anything isn't working and I'll try and fix!

That's perfect and I can see that it works like a charm now with the new version (on macOS)!
Except that it gets stuck with Loading... on Linux on arm machine.
Which I figured out why and created a new issue for that 😄


Update Thermodynamics only

This is a peel off from #2581.

The MSE change is as expected, so you can just increase the ref counter. The allocation increases are still there though.

Superseded


Change SHA256 algorithm to work on FIPS-compliant machines.

#95

It's important to note that your "fix" has a side effect: one won't be able to override the implementation used for SHA-256 using CryptoConfig.AddAlgorithm, since you'll manually instantiate it on .NET Desktop.
Kinda sucks, IMHO.

:up: :date:
This new approach should still enable users to override the crypto algorithm (as long as its fips compliant).

This is a much better approach :+1:
Any particular reason to use CAPI (SHA256CryptoServiceProvider) instead of the newer CNG-based API (SHA256Cng)?

@PinpointTownes Only reason was consistency. We don't use SHA256Cng in our codebases but we do use SHA256CryptoServiceProvider.

:shipit:

@PinpointTownes Only reason was consistency.

Consistency always wins :+1:

:shipit:


How to get those things section

Unfortunately, I cannot merge this PR.
I had already given a vague explanation of how to get the cloudflare cookie in README.md, and I have a better idea for getting the UA.


MINOR: Improve developer docs

Which issue does this PR close?

N/A
Rationale for this change

This is a first pass of the developer docs to make them easier to find and to provide a better introduction to the distributed query planning process.
What changes are included in this PR?

Documentation changes.
Are there any user-facing changes?

No

@thinkharderdev @yahoNanJing I am planning on improving the documentation to try and make it easier for new contributors to get up to speed. This is just a small start but I would appreciate any input you have,

Thanks @thinkharderdev I have incorporated your suggestions


Merge common v4.0.1 release to dev

Merging release/4.0.0 branch back to dev

Codecov Report

Merging #1685 (df6c702) into dev (7f99f80) will decrease coverage by 0.00%.
The diff coverage is 9.09%.

:exclamation: Current head df6c702 differs from pull request most recent head 4204d36. Consider uploading reports for the commit 4204d36 to get more accurate results

@@             Coverage Diff              @@
##                dev    #1685      +/-   ##
============================================
- Coverage     14.53%   14.53%   -0.01%
- Complexity      318      319       +1
============================================
  Files           165      165
  Lines          7435     7446      +11
  Branches        702      703       +1
============================================
+ Hits           1081     1082       +1
- Misses         6183     6193      +10
  Partials        171      171

Impacted Files
Coverage Δ

...tity/common/adal/internal/cache/StorageHelper.java
0.00% <0.00%> (ø)

.../internal/broker/IntuneMAMEnrollmentIdGateway.java
0.00% <0.00%> (ø)

...ommon/internal/result/AdalBrokerResultAdapter.java
0.00% <0.00%> (ø)

...on/internal/result/BrokerResultAdapterFactory.java
0.00% <0.00%> (ø)

...soft/identity/common/internal/util/StringUtil.java
1.88% <33.33%> (+1.88%)
:arrow_up:

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 03b3dea...4204d36. Read the comment docs.


Make get_dispatch_info and weight_to_fee Available via RPC

When constructing XCM Transact calls, it's useful to have an idea of how much weight some call will consume and how much that weight will cost in order to BuyExecution. query_info only takes a fully encoded extrinsic and returns the weight and fee, but requires some hacks, namely:

Users must add some bytes to represent an extrinsic (signature/signed extensions), but an XCM Transact will just have the call.
The return includes the length fee and the ExtrinsicBaseWeight, which are not relevant in Transact.

The addition of these two endpoints would allow submission of a Call and obtaining its weight and a fee estimate (with the user knowing that the weight to fee rate can be variable so they'll want to supply a little extra):

fn get_dispatch_info(call) -> DispatchInfo { weight, ... }; (useful for specifying required weight)
fn weight_to_fee(weight) -> Balance; (useful for buying execution)

Related: https://github.com/polkadot-js/apps/issues/7688

fn get_dispatch_info(call) -> DispatchInfo { weight, ... }; (useful for specifying required weight)

This is already returned by payment_querInfo.

fn weight_to_fee(weight) -> Balance; (useful for buying execution)

And should that not be doable with payment_queryFeeDetails?

This is already returned by payment_querInfo

Ah, I didn't see that. OK :+1:

And should that not be doable with payment_queryFeeDetails?

AFAIK, no, because it expects an extrinsic, not just a call.

But is there any reason why you couldn't turn your call into an extrinsic and then submit it? It shouldn't matter with which key the extrinsic is signed.

It's possible but it's also kind of a hack IMO. @TarikGul wrote this script to do that and that's what I use now.
It also doesn't give you the weight and execution cost of the call, because it includes ExtrinsicBaseWeight and the length fee. Calls made over XCM don't have this overhead. Again, it's OK-ish as it's an overestimate, but IMO we expect an increase in para-to-para interaction with instructions that are not signed by users, so we should expose weight and fee info related to executing the instructions and not on verifying signatures.

One thing I would like to add is that as we want to start using light client more, which doesn't supports custom RPC, we should avoid adding more custom RPC instead. The alternative solution is add new runtime API and use state_call to call the runtime API.

Yes, that's why I linked to the runtime API source in the main body.
https://github.com/paritytech/substrate/blob/ef66142/frame/transaction-payment/rpc/runtime-api/src/lib.rs

Had a chat with @bkontur
Picking up the issue

Please keep in mind what @xlc said: Don't add a new RPC. Having a new runtime API should be enough in order to call it through state_call.


fix config warnings

@ligangty please consider the coverage requirement waived because it is caused by fewer lines and not because of less coverage.

I'm little confused which type of warnings these configurations are bringing?

 - quarkus.resteasy.gzip.enabled is set to 'true' but it is build time fixed to 'false'. Did you change the property quarkus.resteasy.gzip.enabled after building the application?
 - quarkus.log.min-level is set to 'TRACE' but it is build time fixed to 'DEBUG'. Did you change the property quarkus.log.min-level after building the application?
 - quarkus.resteasy.gzip.max-input is set to '64M' but it is build time fixed to '10M'. Did you change the property quarkus.resteasy.gzip.max-input after building the application?```

I think these 3 logs are not fixed by your configurations changes, as they are using default value in build time.

I'm little confused which type of warnings these configurations are bringing?

 - quarkus.resteasy.gzip.enabled is set to 'true' but it is build time fixed to 'false'. Did you change the property quarkus.resteasy.gzip.enabled after building the application?
 - quarkus.log.min-level is set to 'TRACE' but it is build time fixed to 'DEBUG'. Did you change the property quarkus.log.min-level after building the application?
 - quarkus.resteasy.gzip.max-input is set to '64M' but it is build time fixed to '10M'. Did you change the property quarkus.resteasy.gzip.max-input after building the application?```

I think these 3 logs are not fixed by your configurations changes, as they are using default value in build time.

I think this is where the run time values are coming from and this change will fix it. Also, it'll be nice to keep only the values we need and remove everything extra from here.


Add auth token to SonarQubeClient via IdentityApi

Add Authentication for SonarQube plugin
Use the IdentityApi to get a token and add it to SonarQubeClient requests when the token exists.
address #6718
:heavy_check_mark: Checklist

[✔ ] A changeset describing the change and affected packages. (more info)
[ ] Added or updated documentation
[ ✔] Tests for new functionality and regression tests for bug fixes
[ ] Screenshots attached (for UI changes)
[✔ ] All your commits have a Signed-off-by line in the message. (more info)

Thanks @Rugvip, I have fixed up the test that failed its check

@freben For us this lets us add an auth check on the all our endpoints  (either via https://github.com/backstage/backstage/blob/8b71ba6a90f71874e27e30204f28e7725b8dfa99/contrib/docs/tutorials/authenticate-api-requests.md or our network proxy) to allow the backstage instance to be internet accessible and require authentication always.
We don't have the sonarqube verifying any of the tokens from backstage and rely on the backstage proxy config to remove the Auth header and add the useraccess token header instead.


added esp32-camera

 Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.You have signed the CLA already but the status is still pending? Let us recheck it.

sorry wrong repo :/


⚠ ClamAV has degraded performance

In d6bbf40, ClamAV (https://spamassassin.apache.org/) experienced degraded performance:

HTTP code: 200
Response time: 81 ms

Resolved: ClamAV performance has improved in 26a7443.


Sort plans by display order

Good point @vbusch. Somehow it feels strange to add the displayOrder to this schema, but perhaps instead the API can return the plans in the displayOrder, and the UI would not do any sorting at all?

@vbusch I've modified the PR to do the sorting server side based on displayOrder. I have also added another field that exists already in the plans, displayName, which I think could be useful for the UI (haven't change anything there as it would require keeping track of both name and displayName in the client I think).


fix(requirements): Bump peewee requirement to 3.14.1 or newer

When using a layout.Component instance to look up a layout.Connexion we appear to have been affected by  https://github.com/coleifer/peewee/issues/2304 which was fixed in Peewee 3.14.1.
This was most noticeable when using from_pair(comp1, comp2).
This bug is also the reason we had to make this fix: https://github.com/chime-experiment/ch_util_private/pull/34 (which didn't make any sense to me at the time)
Peewee-2 was not affected by this bug, which is why this code worked when we originally created the layout API.

Nice detective work!


ItemsRepeater inside ScrollViewer, DataContext inconsistencies

Describe the bug
Using the ItemsRepeater inside ScrollViewer causes inconsistencies with DataContext.
When I scroll to the end of the ScrollViewer, or close to, the first few items' DataContext becomes null,
and when going back up, it may get mixed around with other objects.
To Reproduce
Steps to reproduce the behavior:

Have a ItemsRepeater control inside ScrollViewer and populate
Populate the ItemsRepeater
Scroll down the ScrollViewer far enough
Monitor the DataContext of ItemsRepeater

Expected behavior
DataContext is supposed to not become null, or get jumbled around.
Screenshots
https://github.com/AvaloniaUI/Avalonia/assets/3746349/1fd285e2-c529-4ede-b68f-cc01b1cd32a1
Desktop (please complete the following information):

OS: Windows 11
Version 22H2

Additional context
Bug case minimal reproducible example
bug_case.zip

version means Avalonia version, not OS version. Can you please add this? thx.

version means Avalonia version, not OS version. Can you please add this? thx.

Hey, thanks for getting back.
I've fixed the version number.
Sorry for the confusion!

ItemsRepeater uses virtualization. As you scroll items out of view, their containers will be used for items that are about to be shown, thus their Datacontext is set to the new items. The datacontext of each real item in the Source is still preserved, but its position in the Logical tree is not representative of it's visual location.


Add dock to desktop to any window

Add the feature Dock to Desktop found in OneNote 2016 (keyboard shortcut Crtl + Alt + D)
Actually changes the window to a TaskBar allowing you to Maximize a second window to the screen.

@JeffJerousek how would this differ compared to maybe a zone?

The biggest advantage would be that maximize would work next to do the docked window/AppBar.
It might also be an interesting way to keep multiple Windows "on top" by making multiple AppBars.
As someone who is often waiting for a task to be done or wanting to take notes, it's a convenient HUD that doesn't mess with "flow" because it's no longer a "Window" that gets in your way or that you move and forget about.
I honestly don't know if the making the window an AppBar would violate the rule: "don't mess with other app's windows" but as much as FancyZones is great and has only gotten better I still find myself wanting this.

From: Clint Rutkas @.>
Sent: Tuesday, December 7, 2021 12:16 AM
To: microsoft/PowerToys @.>
Cc: Jeff Jerousek @.>; Mention @.>
Subject: Re: [microsoft/PowerToys] Add dock to desktop to any window (#71)
@JeffJerousekhttps://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2FJeffJerousek&data=04|01||338d815c25404269fa8008d9b9492da9|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|637744546210863592|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=6Zgrziec%2B7DyKzEi9c0chQU4J4IoAEaOhL17gTEc3WY%3D&reserved=0 how would this differ compared to maybe a zone?
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHubhttps://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fmicrosoft%2FPowerToys%2Fissues%2F71%23issuecomment-987602177&data=04|01||338d815c25404269fa8008d9b9492da9|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|637744546210863592|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=8qbeLQ9i3C4g20x0ZBZ%2B4JV3doUe8%2BNJAg31Ji5GzCo%3D&reserved=0, or unsubscribehttps://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Fnotifications%2Funsubscribe-auth%2FAJBGJW3SZ2KV735OCCQLJMLUPWRFXANCNFSM4HMEYYNQ&data=04|01||338d815c25404269fa8008d9b9492da9|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|637744546210863592|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=fAO3p9bzIsAECpMTuCcpJCxoN%2BkngBTylVWfYEgQg4E%3D&reserved=0.
Triage notifications on the go with GitHub Mobile for iOShttps://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapps.apple.com%2Fapp%2Fapple-store%2Fid1477376905%3Fct%3Dnotification-email%26mt%3D8%26pt%3D524675&data=04|01||338d815c25404269fa8008d9b9492da9|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|637744546210863592|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=3eqwvuCIqcBmpCntU4u%2Fu0nlgOK0USYENtVYabzr37E%3D&reserved=0 or Androidhttps://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fplay.google.com%2Fstore%2Fapps%2Fdetails%3Fid%3Dcom.github.android%26referrer%3Dutm_campaign%253Dnotification-email%2526utm_medium%253Demail%2526utm_source%253Dgithub&data=04|01||338d815c25404269fa8008d9b9492da9|84df9e7fe9f640afb435aaaaaaaaaaaa|1|0|637744546210863592|Unknown|TWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D|3000&sdata=XZ5kUit4lQecI8nAOM3uFuTDlHRfiwL1ampXqJc%2FioY%3D&reserved=0.

@JeffJerousek would an always on top zone work for you?  To me, you want like, Win8 style snapping style I think almost.  The API to do this I don't think is public so while possible to get it opened up

This is from a bing search for OneNote's dock to desktop. The left window is maximized and the taskbar isn't overlapped.
https://docs.microsoft.com/en-us/windows/win32/shell/application-desktop-toolbars
I understand now that this API is probably requires each app to implement it.
Maybe a proxy type zone that we could designate an app bar but still drag windows in to.
The Win8 style snap would be an interesting alternative.
An always on top zone might work.
When I've experimented with just regular windows and Xbox Gamebar widgets I always run into a situation where part of a windows I need gets lost under the always on top window.
An always on top zone that was exclusive somehow, that didn't allow other windows to overlap it.

@Jeff-Jerousek Do you want "docking" or magnetic edges?

Definitely "docking", the ability to put an app or a window somewhere and have it there all the time and maximize or snap windows next to it.
Magnetic edges would be a a nice compromise.

https://github.com/microsoft/PowerToys/issues/17216#issuecomment-1103453241
Posting for visibility

Looks like this was auto-closed.  Would still love to see a Window dock capability similar to OneNote added to the roadmap.

I just want to point out that the new Windows Copilot App has exactly this feature.

I would love this as well.

Reopening this feature for further exploration. How does this sound? @Jeff-Jerousek, @lucfig, @stevenmaske
New FZ feature that allows app assignment to a panel-like feature (similar to Windows Copilot) which can expand/retract the window via custom hotkey.

Hi Connor. Is that feature already implemented or you are suggesting further discussion? That feature would be great to use apps such as tasks, calendar, tools (calculator, translator, etc.). Thanks and regards, Lucas Figueiró

This feature has not been implemented - I'm just looking to understand if I've understood the ask correctly and if there is still desire for this feature.

@plante-msft
Yes, absolutely. Something like the Windows Copilot panel is exactly what I'm looking for where another window can be maximized next to it.
I understand that we have several ways to manage windows when not maximized, however, the users experience, resizing items within the app, buttons, etc. change when a window is maximized versus when the windows are snapped or set to various sizes and locations. I want the experience of a maximized window with a panel of my choosing next to it.

I think the workflow of having a maximized window being different than sized managed windows is the missing piece.

Thanks @JeffJerousek and @lucfig.
I've added this to our Suggested Ideas to discuss in a future planning session with the team.
cc @ethanfangg FYI.

Thanks, Connor.
Lucas Figueiró
Em seg., 13 de mai. de 2024, 16:53, Connor Plante @.***>
escreveu:

Thanks @JeffJerousek https://github.com/JeffJerousek and @lucfig
https://github.com/lucfig.
I've added this to our Suggested Ideas to discuss in a future planning
session with the team.
cc @ethanfangg https://github.com/ethanfangg FYI.
—
Reply to this email directly, view it on GitHub
https://github.com/microsoft/PowerToys/issues/71#issuecomment-2108682263,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/ACNXSTZOKWHLATRCGNJUMUDZCEK3ZAVCNFSM4HMEYYN2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TEMJQHA3DQMRSGYZQ
.
You are receiving this because you were mentioned.Message ID:
@.***>

I would like to see this feature, for my calendar app, like outlook. So, I could add events quickly by 'docking' the app.
I has a lot of possibilites!

Sorry. Is this Feature Request Closed?

It keeps getting auto closed because it's stale, I think.
From: pandaking @.>
Sent: Monday, June 17, 2024 10:33 AM
To: microsoft/PowerToys @.>
Cc: Jeff Jerousek @.>; Mention @.>
Subject: Re: [microsoft/PowerToys] Add dock to desktop to any window (#71)
Sorry. Is this Feature Request Closed?

Reply to this email directly, view it on GitHubhttps://github.com/microsoft/PowerToys/issues/71#issuecomment-2173726256, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AJBGJWYACZM6D3BJQTVJK3TZH36TTAVCNFSM4HMEYYN2U5DIOJSWCZC7NNSXTN2JONZXKZKDN5WW2ZLOOQ5TEMJXGM3TENRSGU3A.
You are receiving this because you were mentioned.Message ID<EMAIL_ADDRESS>

I've removed the tag so it should stay open now.


关于火狐版下架问题

问题反馈
火狐版因下架而无法安装，或许可以考虑重新上架或者直接在Github提供下载吗
环境信息
Windows10 1809
Firefox Quantum 63.0 (64 位)
N/A
重现步骤/尝试的解决方案
如上
Feedback
Before submitting your issue, please check to make sure of the following:

[ ] You are reporting a bug or making a feature request. If you are looking for general support, please contact us directly or comment at our project homepage.
[ ] Your issue is not a duplicate of an existing issue. If there is an open issue of the same topic, please just comment under it.
[ ] If you are reporting a bug, please make sure it can be reproduced in the latest release or master branch. Also, please specify detailed procedures to reproduce the bug (screenshots would be greatly appreciated).
[ ] You have filled out your system environment info.

Environment Info
Please fill out the following:

Operating System (Windows/macOS/Linux):
Chrome Version (You can check this under [Menu/Help/About]):
Extension Version:

You can see this on extension options page. You can also put the latest commit ID here if you are reporting about the master branch.
Steps to Reproduce / Attempted solution
Please be specific here, thanks :)

目前计划在下一次更新后同步上架 :-)


Form input props wrong typing and expose input ref

Describe the bug
when you want use form input with useForm library for example no work because this library need input ref to handle inputs and if you use formInputProps typescript lint throw errors an we has css problems with label because value prop is not handle with state and no update to dcx-form-input--filled. The placeholder has't tokens to change color anda font-sizes
To Reproduce
Steps to reproduce the behavior:

try use formInput handle ref way or spread React.HTMLAttributes into inputProps

Expected behavior
No linter errros and use input native ref
Screenshots
Desktop (please complete the following information):

OS: [e.g. iOS]
Browser [e.g. chrome, safari]

Version [e.g. 22]

Smartphone (please complete the following information):

Device: [e.g. iPhone6]
OS: [e.g. iOS8.1]
Browser [e.g. stock browser, safari]
Version [e.g. 22]

Additional context
Add any other context about the problem here.

closed by https://github.com/Capgemini/dcx-react-library/pull/627


Debugging / SourceMap Support

Hi,
I would like to debug the steps in VS Code Chrome Debug Plugin. This doesn't work now as there is no sourcemap support in the project at this time. Would you be able to advise what needs to be changed/added to allow debugging with breakpoints within the original typescript code.
Many Thanks

@pete2014 not sure how to do this yet. As I believe these steps are not running in the browser, but in the process instructing the browser.

cleaning up


Allow E2E tests to run with arbitrary k8s cluster

Why are these changes needed?

Currently E2E tests run only with Kind cluster. The goal of this PR is to make these tests more configurable and allow it to run with any Kubernetes cluster. It is now possible to login to arbitrary cluster using kubectl/oc command and run tests with arbitrary cluster. For example:
oc login ...
EXTERNAL_CLUSTER=true RAY_IMAGE=rayproject/ray:2.5.0 OPERATOR_IMAGE=kuberay/operator:nightly python3 tests/compatibility-test.py

Related issue number

Closes #1284
Checks

[] I've made sure the tests are passing.
Testing Strategy

[] Unit tests
[] Manual tests
[*] This PR is not tested :(

@kevin85421
Hello, can you please provide initial feedback?

Thank you @kevin85421 for your review! I tried to address all your comments. Except that I do not use CREvent for deleting Ray custom resources. I rather use clean up method which can be general for all tests. I'm sorry for late reply. It was due to my vacation.

The sample YAML tests seem to fail consistently. Would you mind running the sample YAML tests locally? See https://github.com/ray-project/kuberay/blob/master/ray-operator/DEVELOPMENT.md#running-configuration-tests-locally for more details.

Hello @kevin85421 thank you for the review. The point why I do not want to delete cluster itself in ExternalClusterManager -> cleanup method is that I want to run tests even with clusters which I can not easily provision or tear down. For example to provision and tear down some Openshift cluster may take half an hour or something, which is probably not doable with so many tests. Instead I've decided to implement full cluster wide clean up. This behavior is enabled by EXTERNAL_CLUSTER=true. If you do not enable it then the behavior of tests is the same as before. It creates Kind cluster and delete Kind cluster the same way as before. See cleanup method for KindClusterManager.

cleanup method is that I want to run tests even with clusters which I can not easily provision or tear down. For example to provision and tear down some Openshift cluster may take half an hour or something, which is probably not doable with so many tests.

Thank you for the explanation! It makes sense to me. Some CR YAMLs not only define CR but also other resources, such as ConfigMap. Some tests may have side effects after the cluster-level cleanup, but it is fine to open follow-up PRs to fix that if any.

The RayService e2e tests are known to be flaky. It is not related to this PR.


Upgrade reactjs-components to current version

Reviewer: @orlandohohmeier

conflicts

i think you might've published it publicly. we've been doing beta releases with npm publish ./ --tag -beta.28

damn why there are flicts?

@Poltergeist You can unpublish this https://docs.npmjs.com/cli/unpublish, and publish a beta version in stead

@mlunoe you may only unpublish within the first 24 hours of the release.

mesosphere-ci retest this please


Big O Notation?

I'm thinking of adding Big O notation to the docs based on Big-O Cheat Sheet. Would this be useful?

@moshejs what information exactly do you want to add?

@trekhleb see my PR for more detail


Unable to open tailscale under myQNAPcloud

thank you for your development, but I have a problem during use.
In myQNAPcloud model
Open Tailscale App:
XML syntax error on line 22: element  closed by
tailscale cannot open the configuration page to log in.
use version: 1.48.1

how to work using remote model access, only local network?

The QNAP package works with QTS and QuTS Hero versions of the QNAP platform. It has not been tested with nor developed for myQNAPcloud.

myQNAPcloud is not an independent version, it is an official QTS version for secure remote access to NAS.

First, I'm not associated with Tailscale the company so my comment isn't official.
Tailscale provides secure remote access across the Internet just as myQNAPcloud does, but with a different feature set and implementation. They're alternatives to each other. If you use one you shouldn't need the other at the same time. As such there's no point in Tailscale's developers putting time and effort into making Tailscale work under myQNAPcloud.

First, I'm not associated with Tailscale the company so my comment isn't official.
Tailscale provides secure remote access across the Internet just as myQNAPcloud does, but with a different feature set and implementation. They're alternatives to each other. If you use one you shouldn't need the other at the same time. As such there's no point in Tailscale's developers putting time and effort into making Tailscale work under myQNAPcloud.

Thanks for your thoughts on this issue.
First of all, I agree with you that both Tailscale and myQNAPcloud provide secure remote access over the internet, but they are actually different.
myQNAPcloud can only be used for official APP or web access, but this also lacks the ability to access local services such as SMB, SHH, Docker, etc., which prevents me from accessing the service.
Tailscale can provide me with such a service. And can also be accessed by other smart devices on the network.
Essentially, I'm not saying these two services replace either one, but rather the other service helps me configure the other service to get up and running.

Clearly I misunderstood what you're trying to do.

This happened to me when I tried to open the Tailscale app connecting to the NAS through myqnapcloud.com.


New package: DISTRHO.Cardinal version 23.10

Description

Resolve https://github.com/microsoft/winget-pkgs/issues/123609

Checks

[x] Have you signed the Contributor License Agreement?
[x] Have you checked that there aren't other open pull requests for the same manifest update/change?
[x] This PR only modifies one (1) manifest
[x] Have you validated your manifest locally with winget validate --manifest <path>?

[x] Does your manifest conform to the 1.5 schema?

Note: <path> is the name of the directory containing the manifest you're submitting.

Microsoft Reviewers: Open in CodeFlow

@luzpaz - Excuse me. I can't infer the usage of this package and unable to validate it manually.
Tools/SandboxTest.ps1 can successfully install this package in Windows Sandbox without any warnings or interactive prompts, but there's no icon created in the startup menu.
The FAQ says it's a plugin of some application else. Should I install that app first and launch the plugin there?

There's a package which performs the similar action.

Related https://github.com/microsoft/winget-pkgs/pull/123505#issuecomment-1777124125


⚠ Msite has degraded performance

In c516602, Msite ($MSITE_URL) experienced degraded performance:

HTTP code: 200
Response time: 5877 ms

Resolved: Msite performance has improved in 5a12940.


Remove unused code from Runtime Provisioner

Description
We have to remove stale, unused code related to the ProviderSpecificConfig and ShootProvisioning, e.g., https://github.com/kyma-project/control-plane/blob/main/components/provisioner/internal/provisioning/persistence/dbsession/factory.go#L51-L53
Reasons
We need to maintain code consistency and cut off unused parts.
Acceptance Criteria

[ ] resolve all TODOs in Runtime Provisioner codebase

No longer valid due to the new reconciler implementation.


Add date type support in cache responses

Mongo only supports dates with time (not date alone) because of bson.
So the date python type from date32 pyarrow type couldn't be saved in mongo.
I fixed it by saving the date the same way as string objects.
Fix https://github.com/huggingface/datasets-server/issues/86
e.g. in first-rows for aborruso/pnrr
{
  "dataset": "__DUMMY_DATASETS_SERVER_USER__/pnrr",
  "config": "default",
  "split": "train",
  "features": [
    {
      "feature_idx": 0,
      "name": "Programma",
      "type": {
        "dtype": "string",
        "_type": "Value"
      }
    },
    ...
    {
      "feature_idx": 50,
      "name": "Data di Estrazione",
      "type": {
        "dtype": "date32",
        "_type": "Value"
      }
    }
  ],
  "rows": [
    {
      "row_idx": 0,
      "row": {
        "Programma": "PNRR",
        ...
        "Data di Estrazione": "2023-06-13"
      },
      "truncated_cells": []
    },
    ...
    ]
}

EDIT: also added support for time, timedelta and decimal
I also checked binary but it is already supported, though its format is not ideal (we get a list of integers from mongo)

sure

Also: did you launch some dataset refreshes?

nope not yet

It works well :)
The type si marked as "unknown" though


Better progress API by reporting both done and total values

Current implementation of forcing us to report the progress fraction has a lot of limitations:

Hides the done and total values data from callbacks. This data might be useful in various implementations.
Takes away the ability to handle progress of jobs that don't know about the total value. Some operations just don't know the totalSize, but could still report the progress of how much data has been processed thus far.
Inaccurate progress reporting in PProgress.all(). Without p-progress, or callback consumers knowing the totals, each job is equal no matter how much data it is processing.

I propose not enforcing the passing of fraction, but instead keeping track of both done and total values, reporting them, and letting the user decide how to handle it. This will give us more options and data in our progress implementations.
API:
// current
progress(done / total);
// proposal
progress(done, [total]);

The onProgress callback would than report these values in 1st and 2nd argument. If total is undefined, the end is unknown and user can switch handling:
progressPromise.onProgress((done, total) => {
  if (total === undefined) {
    console.log(`${done} bytes processed thus far`);
  } else {
    console.log(`${(done / total) * 100}% done`);
  }
});

In PProgress.all().onProgress callback, the done and total values in onProgress callback will be the total additions of both of the values of all passes progress promisses. And if any of the promisses is missing the total value, the resulting onProgress callback will also receive undefined as total, since we can no longer tell what the total of all promisses is now.
Huge benefit of knowing about the total total in PProgress.all() callback is a more accurate calculation of the whole progress. For example, if you have 2 jobs, one is processing 1KB, another is processing 99KB, and the 1st ends while the 2nd hasn't even started, you now have an accurate progress of 0.01, instead of 0.5. And if you do want it to report that 0.5, well you just do this in each job progress report:
progress(done / total, 1);

And now each job is equal no matter of the amount of data it's processing.
As you see, this kind of API would give us a lot more power, options, data, and ability to handle jobs with unknown totals in our implementations, while still remaining very simple.

I assume you're talking about PProgress.all since the other two methods allow you to pass the progress directly.
How would p-progress calculate the total? How do you suggest the value of each promise (i.e. 0.01 and 0.99)? I think that's part of your own logic.

I assume you're talking about PProgress.all since the other two methods allow you to pass the progress directly.

No, this would change the progress reporting everywhere. Or maybe I don't understand the comment.

How would p-progress calculate the total?

There is no total calculation in basic PProgress instance. The done and total values received by progress() are simply stored and passed to the callback. These values can be anything, a fraction progress(0.1, 1) or an amount of data processed thus far progress(555, 1024). It is than upon the implementation to decide how to consume them. The simplest way would just be to do done / total and get the progress fraction. This provides more information and thus implementation options to the progress consumer.
The total argument is optional, to allow reporting of a progress even for jobs that don't have the total information available (they don't know how much more data is going to come in). And again, it's upon progress consuming implementation to handle a case where total is undefined.
The code would explain this better I think, so here is a simplified difference between current and proposed solutions:
// CURRENT
const progressFn = progress => {
	this._progress = progress;

	for (const listener of this._listeners) {
		listener(progress);
	}
}

// PROPOSED
const progressFn = (done, total) => {
	this._done = done;
	this._total = total;

	for (const listener of this._listeners) {
		listener(done, total);
	}
}

And here is the Promise.all() consolidation.
Notes:

all, including normal Promise() instances, default to done = 0; total = 1 and are set to done = 1; total = 1 after they have been resolved and their progress hasn't changed
if any of the promises sets total to undefined, the final total in the main consolidated callback is also going to be undefined

// CURRENT
const sum = iterable => {
	let total = 0;
	for (const value of iterable.values()) total += value;
	return total;
};
const progressMap = new Map();
const reportProgress = () => {
	progress(sum(progressMap) / promises.length);
};

for (const promise of promisses) {
	progressMap.set(promise, 0);

	promise.onProgress(percentage => {
		progressMap.set(promise, percentage);
		reportProgress();
	});

	// please ignore await inside for-of loop, this is a pMapping
	// function in the actual implementation
	await promise;
	progressMap.set(promise, 1);
	reportProgress();
}

// PROPOSED
const sum = (iterable, prop) => {
	let total = 0;
	for (const value of iterable.values()) {
		if (value[prop] === undefined) return undefined;
		total += value[prop];
	}
	return total;
};
const progressMap = new Map();
const reportProgress = () => {
	progress(sum(progressMap, 'done'), sum(progressMap, 'total'));
};

for (const promise of promisses) {
	progressMap.set(promise, {done: 0, total: 1});

	promise.onProgress((done, total) => {
		progressMap.set(promise, {done, total});
		reportProgress();
	});

	// please ignore await inside for-of loop, this is a pMapping
	// function in the actual implementation
	await promise;
	const {done, total} = progressMap.get(promise);
	if (done === 0 && total === 1) {
		progressMap.set(promise, {done: 1, total: 1});
	}
	reportProgress();
}

How do you suggest the value of each promise (i.e. 0.01 and 0.99)? I think that's part of your own logic in a PProgress.fn

Yes, my values in PProgress.all() inaccuracy description were implied to be done / total fractions.

I may be a bit slow today but if total is not 1, I still don't know how you're gonna tell p-progress what that number is. What's your suggested API? Show the changes on this code:
const allProgressPromise = PProgress.all([
	delay(103),
	progressPromise(),
	delay(55),
	delay(209)
]);

(async () => {
	allProgressPromise.onProgress(console.log);
	//=> 0.0925
	//=> 0.3425
	//=> 0.5925
	//=> 0.6025
	//=> 0.7325
	//=> 0.9825
	//=> 1

	await allProgressPromise;
})();

First of all, the console.log would always receive 2 arguments, the done and total values. Also, to simplify the examples, lets change it from kb to just numbers.
If thisPromiseIs1() reports 1 total, thisPromiseIs99() reports 99 total, and they report progress after 1, you'd get:
const allProgressPromise = PProgress.all([
	thisPromiseIs1(),  // always calls => progress(done, total)
	thisPromiseIs99(), // always calls => progress(done, total)
]);
allProgressPromise.onProgress(console.log);
//=> 1, 100
//=> 2, 100
//=> ...
//=> 100, 100

In case any of them don't pass the total in each progress(done, total) call, you'd get:
const allProgressPromise = PProgress.all([
	thisPromiseIs1(),  // always calls => progress(done, total)
	thisPromiseIs99(), // always calls => progress(done)
]);
allProgressPromise.onProgress(console.log);
//=> 1, undefined
//=> 2, undefined
//=> ...
//=> 100, undefined

In case they both have totals, and you add a raw Promise() to the mix, it'll default to 0/1 done/total progress and you'll get:
const allProgressPromise = PProgress.all([
	thisPromiseIs1(),  // always calls => progress(done, total)
	thisPromiseIs99(), // always calls => progress(done, total)
	Promise.resolve(), // doesn't call, defaults to 0/1, and goes 1/1 on resolve
]);
allProgressPromise.onProgress(console.log);
//=> 1, 101
//=> 2, 101
//=> ...
//=> 101, 101

In case any of the PProgress promises reports undefined as total (raw promise doesn't report anything):
const allProgressPromise = PProgress.all([
	thisPromiseIs1(),  // always calls => progress(done, total)
	thisPromiseIs99(), // always calls => progress(done)
	Promise.resolve(), // doesn't call, defaults to 0/1, and goes 1/1 on resolve
]);
allProgressPromise.onProgress(console.log);
//=> 1, undefined
//=> 2, undefined
//=> ...
//=> 101, undefined

So the value of total for each PPromise depends on each executor to call the progress() function at least once (which might not happen if it's too fast and totally depends on the executor's discipline)
Also this makes the progress meaningless until all the totals are known. Look at your last example. What does onProgress's callback do with that 1, 2, ..., 101 information? The total is missing. The progress is meaningless.

which might not happen if it's too fast and totally depends on the executor's discipline

I'd argue that if you are creating a PProgress instance, you have to call progress at least once before resolving, otherwise what is the point? But even if not, I see that current implementation is already forcing progress(1) call when there was no progress() call before resolving. The same thing happens in my PProgress.all() consolidation, which will just treat it as a raw Promise and simulate 1/1 progress call. So no real issue here.

Also this makes the progress meaningless until all the totals are known

How so? All promises default to 0/1, and if not updated before resolving update manually to 1/1, which is still a valid and usable progress state in all examples above.

What does onProgress's callback do with that 1, 2, ..., 101 information? The total is missing. The progress is meaningless because it doesn't know when it ends.

It's absolutely not meaningless. That is one of the main points of this whole issue, to also provide a progress handling in cases where total is not known. The 2nd and last examples without total values are behaviors that are going to be expected by the implementation, since you know what kind of promises you are throwing into PProgress.all(). In this case, instead of progress percentage, you might display progress done (size of data processed thus far), or a simple indeterminate progress bar, or both... completely in hands of the implementation. Currently it isn't even possible to handle progress jobs with no known total number. Or know precisely how much data has been processed.
And if you just want to use PProgress with these changes as you were until now, all you have to do is just switch slash / character with comma , in your PProgress resolving implementation, convert it into fraction in the progress callback, and absolutely nothing changes from the current behavior:
// before
progress(done / total);
promise.onProgress(progress => console.log(progress));
// after
progress(done, total);
promise.onProgress((done, total) => console.log(done / total));

All this proposal does is introduce a slight API change which gives move power, features, and options to both the progress implementors as well as the progress consumers.

Sorry I ended up on this issue again 😅

provide a progress handling in cases where total is not known

simple indeterminate progress bar,

It sounds to me that you just need a Promise that calls your callback, some sort of reporter.
The only thing between you and your objective are the limitations that p-progress puts in place:
https://github.com/sindresorhus/p-progress/blob/a24163f30888e2337ddfcd1fc74eb0ed7973167c/index.js#L70-L84
I see two solutions:

add an allowAnyProgress option, which would let you pass anything to the callback
create a p-report module that does this by default.

The whole module is setup in a way that progress:1 means done. Allowing what you're asking requires a rewrite and probably it isn't even possible to achieve while maintaining the current behavior.

All the arguments for my case are already written above. In summary, the current API is inaccurate, limited, and regarding indeterminate progress reporting impossible.
I already forked this 2 years ago, so if you really don't see value in my proposal and are keeping this issue open just for me, feel free to close it.

it isn't even possible to achieve while maintaining the current behavior.

That's what major bumps are for.

I somehow managed to miss this discussion in 2017... @darsain Your arguments makes total sense. I just made p-progress back then for my narrow use-case without considering more flexibility.
If I had done p-progress today, I think I would have done something closer to what you're proposing:
const PProgress = require('p-progress');

const progressPromise = new PProgress((resolve, reject, progress) => {
	const job = new Job();

	// It's optional to set this.
	progress.totalCount = job.getSize();

	job.on('data', data => {
		progress.completedCount += data.length;
	});

	job.on('finish', resolve);
	job.on('error', reject);
});

(async () => {
	progressPromise.onProgress(progress => {
		console.log(progress);
		/*
		{
			completedCount: 20,
			totalCount: 100,
			fractionCompleted: 0.2
		}
		*/
		/*
		If `totalCount` is not set, it and `fractionCompleted` would just be `0`.

		`totalCount` can be set at any time inside `new PProgress`.
		*/
	});

	await progressPromise;
})();

Just a quick braindump. The benefit of properties over methods is that they can also be read by the code inside new PProgress. Happy to hear anyone's thought.

Yes, passing the data on an object is definitely a better idea, but can you please simplify the property names? At least dropping the Count suffix. I'd suffer writing the verbose ones from the example. 😄

Hah, sure. I initially had it as totalUnitCount and completedUnitCount 😝

If totalCount is decremented, would this mean the progress would go backwards?

@Richienb Correct


0.7 UI feedback

[x] 1. Alignment issue. It might be better to align the text Owner with the name above BigQuery. Also the first tag with the text owner.

[ ] 2. Two arrows seem unnecessary:

[x] 3. Inconsistent styles for summary:

Suggestion, maybe change to:
Owner name | Tier or No Tier | Medium usage - 55th percentile | 130 queries past week | — columns | — rows

[x] 4. Tabs in explore page don't seem aligned to anything:

[x] 5. Too many icons: We can remove table icon in the result set. Also remove other icons in the result set

[x] 6. Are there any difference in font weight and choice of grey between these two side panels? If so, can we make them consistent. First one appears to be more readable than the second:

[x] 7. Can we make the font color for BigQuery and the number same? The contrast for number appears to be not that great.

[x] 8. The data I am following is not shown in the front page. Here, I am following some datasets, but this is what I see:

[x] 9. Activity filtering by MyData and Following Data does not work.

[x] 10. Change Following Data to Following in the activity filter

[x] 11. User menu has inconsistent fonts and weird layout:

Do we need a down arrow next to the user icon?

[x] 12. Can we remove "Hi username!" from this screen, as serves no purpose:

[x] 13. Can we remove the light purple background here?

[ ] 14. Can we move the service name and database name to the topline as done table details page here:

[x] 15. Change Please to `please and add a period at the end:

[ ] 16. In table details page and for other assets, we can remove the section header Description:

[x] 17. Different inconsistent ways to show Tags:

[x] 18. Make column headers bold like Frequently Joined:

[x] 19. Loose white and grey in sample data and also make the header bold:

[x] 20. Follower list looks faded out:

[ ] 21. Have maximum width for the central column in the layout. Right now it keeps becoming longer as the width increases. Check examples of twitter and Facebook:

[x] #1722

[x] 23. Some buttons don't have good contrast (example Schema button here):

Maybe use the following style:

[x] 24. Three different styles to show entity hierarchy:

[x] 25. The recently searched terms section doesn’t look right

[x] 26. Only exact match is allowed for advanced search?

@sureshms any attribute search is exact match such column_names
one can do a free-form search that can match client_id

@Sachin-chaurasiya @darth-coder00 latest explore page, tabs are wrapping around

Closing this issue as 24 tasks have been completed. created a separate issue for the remaining 2 tasks.


Github example does not work for oauth2 - An email id is required to login into pgAdmin

I've copied the example for github.  I get this error in the logs after authenticating
2022-03-06 19:03:51,153: ERROR  pgadmin:        An email id is required to login into pgAdmin. Please update your Oauth2 profile.
NoneType: None

I am not 100% sure, since this part was implemented by somebody else - and I've not yet come around playing with oauth2 myself. But I think it is because it misses 'OAUTH2_SCOPE': within the configuration.
Please check pgAdmins documentation on OAUTH, on what is actually required.


Add explicit object checks before calling method_exists()

I'm sure this doesn't affect many people, but I came across this issue in an older project that uses an autoloader that in some circumstances can call include() without checking for file existence (relying on the class file existing somewhere in a directory defined in include_path).
Boiling it down, if you register a simple autoloader:
spl_autoload_register(function($class) {
	die($class);
});

Then any of the following will trigger the call to die:
$promise = new FulfilledPromise('NotAClassName1');

$promise = new RejectedPromise('NotAClassName2');

$promise = promise_for('NotAClassName3');

$promise = new Promise();
$promise->then(function() {}); // A handler must be defined to get to the relevant code
$promise->resolve('NotAClassName4'); // Or reject()

This happens because method_exists will attempt to load the class if provided with a string that could be a class name. So, this PR adds explicit object checks before calling method_exists, as I can't imagine triggering the autoloader being an intended side effect.

FYI this is also a requirement for PHP 8 compatibility. Ran into this when testing Guzzle.


[CSharp] DirectLine + WebSockets sample

Hi @dandriscoll , we've updated the PR with the latest feedback.
Regards!


gatt handle gets leaked if reconnection is not successful

Describe the bug
if we try to reconnect (say in the disconnect handler), the connect call acquires gatt handle and doesn't release on connection timeout.  eventually we will run into gatt register max client reached 32 if reconnects are attempted periodically (say after every 20 secs).
To Reproduce
Steps to reproduce the behavior:

BleClient.connect(deviceId,OnDisconnect);
Disconnect the device
OnDisconnect() get called after 10 seconds of the disconnect event
In OnDisconnect(),reconnect periodically using BleClient.connect(deviceId,OnDisconnect)
if device doesn't connect then gatt handles are getting leaking

Expected behavior
bluetoothGatt?.close() in case of connection timeout similar to explicit disconnect call
Screenshots
Pls find some snapshot from logcat
2022-04-24 21:42:42.938 12175-12304/io.ionic.starter D/BluetoothGatt: connect() - device: 04:e1:12:04:a7:00, auto: false
2022-04-24 21:42:42.938 12175-12304/io.ionic.starter D/BluetoothGatt: registerApp()
2022-04-24 21:42:42.938 12175-12304/io.ionic.starter D/BluetoothGatt: registerApp() - UUID=2d3eff0b-f568-4fa3-be7c-9fe6f0cbb33e
2022-04-24 21:42:42.940 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(950)] GATT_Register df02127a-b46b-82c9-c517-83d9980d9c22
2022-04-24 21:42:42.940 2273-2358/? V/bt_stack: [VERBOSE1:gatt_api.cc(1080)] GATT_StartIf gatt_if=12
2022-04-24 21:42:42.940 12175-12334/io.ionic.starter D/BluetoothGatt: onClientRegistered() - status=0 clientIf=12
2022-04-24 21:42:42.942 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(1122)] GATT_Connect gatt_if=12, address=04:e1:12:04:a7:00 is_direct 1
2022-04-24 21:42:42.942 2273-2358/? V/bt_stack: [VERBOSE1:gatt_api.cc(1305)] GATT_GetConnIdIfConnected status= 0
2022-04-24 21:42:52.941 12175-12175/io.ionic.starter D/BluetoothGatt: cancelOpen() - device: 04:e1:12:04:a7:00
2022-04-24 21:42:52.943 12175-12175/io.ionic.starter D/Device: reject: connect Connection timeout.
2022-04-24 21:42:52.943 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(1182)] GATT_CancelConnect: gatt_if:12, address: 04:e1:12:04:a7:00, direct:1
2022-04-24 21:42:58.077 12175-12304/io.ionic.starter D/BluetoothGatt: connect() - device: 04:e1:12:04:a7:00, auto: false
2022-04-24 21:42:58.078 12175-12304/io.ionic.starter D/BluetoothGatt: registerApp()
2022-04-24 21:42:58.078 12175-12304/io.ionic.starter D/BluetoothGatt: registerApp() - UUID=4b98f8f4-f79c-4f85-b569-953959d2d3d7
2022-04-24 21:42:58.080 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(950)] GATT_Register 172c12b2-6b52-dad1-5823-41a99ca383a6
2022-04-24 21:42:58.080 2273-2358/? V/bt_stack: [VERBOSE1:gatt_api.cc(1080)] GATT_StartIf gatt_if=13
2022-04-24 21:42:58.081 12175-12334/io.ionic.starter D/BluetoothGatt: onClientRegistered() - status=0 clientIf=13
2022-04-24 21:42:58.082 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(1122)] GATT_Connect gatt_if=13, address=04:e1:12:04:a7:00 is_direct 1
2022-04-24 21:42:58.083 2273-2358/? V/bt_stack: [VERBOSE1:gatt_api.cc(1305)] GATT_GetConnIdIfConnected status= 0
2022-04-24 21:43:08.080 12175-12175/io.ionic.starter D/BluetoothGatt: cancelOpen() - device: 04:e1:12:04:a7:00
2022-04-24 21:43:08.082 12175-12175/io.ionic.starter D/Device: reject: connect Connection timeout.
2022-04-24 21:43:08.082 2273-2358/? I/bt_stack: [INFO:gatt_api.cc(1182)] GATT_CancelConnect: gatt_if:13, address: 04:e1:12:04:a7:00, direct:1
Plugin version:

@capacitor-community/bluetooth-le: [e.g. 0.4.0]

Smartphone (please complete the following information):

Android 10

Thank you for this issue. I wasn't able to reproduce this with my devices, but I still made a change that should hopefully fix this.
Closed by https://github.com/capacitor-community/bluetooth-le/commit/961d8a28b5d59a19706b74b5117c8b107107759a


page parameter seems broken

Hi,
Testing with the latest devel branch shows following:
$  curl -u "user:password" "https://fqdn:8001/hrls/handles?URL=*&limit=10&page=0" |  python -m json.tool | sort
[
]
    "841/00c5a924-9cd4-11e5-8a71-040091643bd0",
    "841/01184526-9cd4-11e5-8fea-040091643bd0",
    "841/017e14b4-9cd4-11e5-8f00-040091643bd0",
    "841/01cf5860-9cd4-11e5-ba16-040091643bd0",
    "841/0230e558-9cd4-11e5-a1c6-040091643bd0",
    "841/0243a886-7c60-11e4-a748-780dd91bf992",
    "841/02617ca8-b250-11e6-acf4-5254000df0ed",
    "841/02b39e64-f3d6-11e4-a518-5254000df0ed",
    "841/04334470-9cd1-11e5-a431-040091643bd0",
    "841/0481380a-f3d1-11e4-a4aa-5254000df0ed"

$  curl -u "user:password" "https://fqdn:8001/hrls/handles?URL=*&limit=10&page=1" |  python -m json.tool | sort
[
]
    "841/01184526-9cd4-11e5-8fea-040091643bd0",
    "841/017e14b4-9cd4-11e5-8f00-040091643bd0",
    "841/01cf5860-9cd4-11e5-ba16-040091643bd0",
    "841/0230e558-9cd4-11e5-a1c6-040091643bd0",
    "841/0243a886-7c60-11e4-a748-780dd91bf992",
    "841/02617ca8-b250-11e6-acf4-5254000df0ed",
    "841/02b39e64-f3d6-11e4-a518-5254000df0ed",
    "841/04334470-9cd1-11e5-a431-040091643bd0",
    "841/0481380a-f3d1-11e4-a4aa-5254000df0ed",
    "841/0a2b604e-ab42-11e6-8687-04040a6400c1"

The servlet is build on centos7 and run on centos6.
It seems the limit and page do not work as expected. It is shifted 1 (one) instead of 10
And with an output file:
$  curl -u "user:password" "https://fqdn:8001/hrls/handles?URL=*&limit=10&page=0" |  python -m json.tool | sort > /tmp/out0.txt

$  curl -u "user:password" "https://fqdn:8001/hrls/handles?URL=*&limit=10&page=1" |  python -m json.tool | sort > /tmp/out1.txt

$ diff /tmp/out0.txt /tmp/out1.txt --side-by-side
[                                                               [
]                                                               ]
    "841/00c5a924-9cd4-11e5-8a71-040091643bd0",               <
    "841/01184526-9cd4-11e5-8fea-040091643bd0",                     "841/01184526-9cd4-11e5-8fea-040091643bd0",
    "841/017e14b4-9cd4-11e5-8f00-040091643bd0",                     "841/017e14b4-9cd4-11e5-8f00-040091643bd0",
    "841/01cf5860-9cd4-11e5-ba16-040091643bd0",                     "841/01cf5860-9cd4-11e5-ba16-040091643bd0",
    "841/0230e558-9cd4-11e5-a1c6-040091643bd0",                     "841/0230e558-9cd4-11e5-a1c6-040091643bd0",
    "841/0243a886-7c60-11e4-a748-780dd91bf992",                     "841/0243a886-7c60-11e4-a748-780dd91bf992",
    "841/02617ca8-b250-11e6-acf4-5254000df0ed",                     "841/02617ca8-b250-11e6-acf4-5254000df0ed",
    "841/02b39e64-f3d6-11e4-a518-5254000df0ed",                     "841/02b39e64-f3d6-11e4-a518-5254000df0ed",
    "841/04334470-9cd1-11e5-a431-040091643bd0",                     "841/04334470-9cd1-11e5-a431-040091643bd0",
    "841/0481380a-f3d1-11e4-a4aa-5254000df0ed"                |     "841/0481380a-f3d1-11e4-a4aa-5254000df0ed",
                                                              >     "841/0a2b604e-ab42-11e6-8687-04040a6400c1"

So there might be a feature in the code..

Tested with war file build on centos6. Same error. So war seems broken for page function.

Fixed in #15


MARK AS additions/fixes

[x] Add Sprouted option to the AS dropdown when a plant is selected. Order of items should match the order in the plant info panel: Planned, Planted, Sprouted, Harvested
[ ] Capitalize the AS dropdown current selection for planned, planted, and harvested

To be fixed in MARK AS v2


Include demo sources

Hello,
It would be nice if there was a switch to include IMGUI_DEMO_SOURCES (i.e. imgui_demo.cpp) in the build (or to include it in the build). I am not very experienced with ImGui and find ShowDemoWindow very useful.

Agreed. Will add IMGUI_SFML_IMGUI_DEMO option to CMake build

Well, I was very busy, but thankfully @dubgron provided a PR, so now you can set IMGUI_SFML_IMGUI_DEMO to ON to build imgui_demo.cpp.


Please add compile instructions

As per the subject line, it'd be nice if you added a section on how to compile the product (which should be platform specifc).

I can add some details, but basically just clone the repo and run make or go build!

Hi,
Thanks for the response.
You are right, it IS as easy as "go build" but I had to fulfill some dependencies... namely,
git clone git@github.com:abiosoft/ishell.git ~/go/src/github.com/abisoft/ishell
git clone git@github.com:chzyer/readline.git ~/go/src/github.com/chzyer/readline
git clone git@github.com:fatih/color.git ~/go/src/github.com/fatih/color
git clone git@github.com:flynn-archive/go-shlex.git ~/go/src/github.com/flynn-archive/go-shlex
git clone git@github.com:kountable/ssmsh.git ~/go/src/github.com/kountable/ssmsh
git clone git@github.com:mattn/go-shellwords.git ~/go/src/github.com/mattn/go-shellwords
I tried the make command as well.  This needed more directory structure configuration and even after that, I am getting an error:
../../go/src//Users/anonymous/Downloads/ssmsh/commands/put.go:57:12: cannot assign *"github.com/kountable/ssmsh/vendor/github.com/aws/aws-sdk-go/service/ssm".PutParameterOutput to resp (type *"/Users/anonymous/Downloads/ssmsh/vendor/github.com/aws/aws-sdk-go/service/ssm".PutParameterOutput) in multiple assignment
../../go/src//Users/anonymous/Downloads/ssmsh/commands/put.go:57:21: cannot use &putParamInput (type *"/Users/anonymous/Downloads/ssmsh/vendor/github.com/aws/aws-sdk-go/service/ssm".PutParameterInput) as type *"github.com/kountable/ssmsh/vendor/github.com/aws/aws-sdk-go/service/ssm".PutParameterInput in argument to ps.Put
make: *** [_/Users/anonymous/Downloads/ssmsh/commands] Error 2
All I am pointing out here is that, this is an excellent tool and I suspect that it will gain some interest from many people.  If some of the "requirements" and how to go about resolving those requirements are captured in an installation document, it'll save many people many hours.  Especially for those people who are not familiar with golang (myself included).
Anyways, mine compiled using "go build" so I'm going to continue to use that.  If you wish, I can help with the documentation and perhaps even with the feature enhancements (I will have to use this as a Golang learning experience though).

Thanks for the additional info! I haven't done a "fresh" clone of the repo and attempted a build in a while. I'll try to go through some of this pain myself, fix any issues, then document the process in the README.

Hey there, I added a section on compiling, tested with a fresh ubuntu Xenial VM. Thanks for your feedback and let me know if you have any problems with it.


Double tap to zoom not working on Android

Hope it fixed) Thanks for issue, please check version 2.0.3.


Updating karma and fixing tests

Description

Updates Karma and karma plugin versions
Updates Jasmine as well
Motivation and Context

General updating to stay current
How Has This Been Tested?

Ran tests, checked docs
Types of changes

[x] Refactor (changes the way we code something without changing its functionality)
[ ] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

[ ] Latest master code has been merged into this branch
[ ] No commented out code (if required, place // TODO above with explanation)
[ ] No linting issues
[ ] Build is successful
[ ] Code follows the code style guide
[ ] Updated the documentation
[ ] Added tests to cover changes
[ ] All new and existing tests passed

@all-contributors please add @DalerAsrorov for code, doc, ideas, maintenance, review and test


Use event-kit instead of emissary

To stay up to date with the rest of Atom.

Actually, Emitter is now bundled with Atom.

Done with #104. :sparkles:
I still don't think I'm disposing of subscriptions everywhere I should be, though.

Does this mean I have to update atom achievements?